/* * Copyright 2006 Le Duc Bao, Ralf Joachim * * Licensed under the Apache License, Version 2.0 (the "License"); you may not * use this file except in compliance with the License. You may obtain a copy of * the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the * License for the specific language governing permissions and limitations under * the License. */ package org.castor.ddlgen.test.framework; import java.net.URL; import java.util.ArrayList; import org.castor.ddlgen.DDLGenConfiguration; import org.exolab.castor.mapping.Mapping; import org.exolab.castor.xml.Unmarshaller; import org.xml.sax.InputSource; /** * This class represent the expected result for various database * * @author <a href="mailto:leducbao AT gmail DOT com">Le Duc Bao</a> * @author <a href="mailto:ralf DOT joachim AT syscon DOT eu">Ralf Joachim</a> * @version $Revision: 5951 $ $Date: 2006-04-25 16:09:10 -0600 (Tue, 25 Apr 2006) $ * @since 1.1 */ public final class Expected { //-------------------------------------------------------------------------- /** Mapping to unmarshal expected result patterns. */ private static final String MAPPING = "mapping.xml"; /** Generic database engine. */ public static final String ENGINE_GENERIC = null; /** MySQL database engine. */ public static final String ENGINE_MYSQL = "mysql"; /** PostgreSQL database engine. */ public static final String ENGINE_POSTGRESQL = "postgresql"; /** HSQL database engine. */ public static final String ENGINE_HSQL = "hsql"; /** DB2 database engine. */ public static final String ENGINE_DB2 = "db2"; /** Oracle database engine. */ public static final String ENGINE_ORACLE = "oracle"; /** SAPDB database engine. */ public static final String ENGINE_SAPDB = "sapdb"; /** Derby database engine. */ public static final String ENGINE_DERBY = "derby"; /** MSSQL database engine. */ public static final String ENGINE_MSSQL = "mssql"; /** PointBase database engine. */ public static final String ENGINE_POINTBASE = "pointbase"; /** Sybase database engine. */ public static final String ENGINE_SYBASE = "sybase"; //-------------------------------------------------------------------------- /** Configuration of DDL generator. */ private DDLGenConfiguration _conf; /** Expected result patterns to match. */ private ArrayList<Match> _patterns; /** Last match pattern used. */ private transient Match _match; //-------------------------------------------------------------------------- /** * Unmarshal expected result patterns from given file with given name. * * @param expected Name of the file with the expected result patterns. * @return Expected result patterns. * @throws Exception If any exception occured during unmarshalling of expected result * patterns. */ public static Expected getExpectedResult(final URL expected) throws Exception { // 1. Load the mapping information from the file Mapping mapping = new Mapping(); mapping.loadMapping(Expected.class.getResource(MAPPING)); // 2. Unmarshal the data Unmarshaller unmar = new Unmarshaller(mapping); InputSource source = new InputSource(expected.toExternalForm()); return (Expected) unmar.unmarshal(source); } //-------------------------------------------------------------------------- /** * Get configuration of DDL generator. * * @return Configuration of DDL generator. */ public DDLGenConfiguration getConf() { return _conf; } /** * Set configuration of DDL generator. * * @param conf Configuration of DDL generator. */ public void setConf(final DDLGenConfiguration conf) { _conf = conf; for (int i = 0; i < _patterns.size(); i++) { Match match = _patterns.get(i); match.setConf(conf); } } /** * Get expected result patterns to match. * * @return Expected result patterns to match. */ public ArrayList<Match> getPatterns() { return _patterns; } /** * Set expected result patterns to match. * * @param patterns Expected result patterns to match. */ public void setPatterns(final ArrayList<Match> patterns) { _patterns = patterns; } //-------------------------------------------------------------------------- /** * Match generated DDL given with expected result pattern of given database engine. * * @param engine Database engine the expected result is defined for. * @param ddl Generated DDL. * @return <code>true</code> if generated DDL matches expected result. */ public boolean match(final String engine, final String ddl) { return match(engine, ddl, null); } /** * Match generated DDL given with expected result pattern of given database engine. * Replace any parameters of expected result pattern with given parameter values * before comparing with generated DDL. * * @param engine Database engine the expected result is defined for. * @param ddl Generated DDL. * @param params Values for parameters in expected result. * @return <code>true</code> if generated DDL matches expected result. */ public boolean match(final String engine, final String ddl, final Object[] params) { _match = getPatternByEngine(engine); try { return _match.match(ddl, params); } catch (IllegalStateException e) { return false; } } /** * Match generated DDL given with expected result pattern of given database engine * at given index. Replace any parameters of expected result pattern with given * parameter values before comparing with generated DDL. * * @param engine Database engine the expected result is defined for. * @param index Index of generated DDL and expected result to compare. * @param ddl Generated DDL. * @param params Values for parameters in expected result. * @return <code>true</code> if generated DDL matches expected result. */ public boolean match(final String engine, final int index, final String ddl, final Object[] params) { _match = getPatternByEngineAndIndex(engine, index); try { return _match.match(ddl, params); } catch (IllegalStateException e) { return false; } } /** * Get string describing the last used match pattern. * * @return String describing the last used match pattern. */ public String getLastMatchString() { return (_match != null) ? _match.toString() : null; } //-------------------------------------------------------------------------- /** * Get expected result pattern of given database engine. * * @param engine Database engine the expected result is searched for. * @return Expected result pattern. */ private Match getPatternByEngine(final String engine) { for (int i = 0; i < _patterns.size(); i++) { Match match = _patterns.get(i); if (match.getEngine() == null) { if (engine == null) { return match; } } else if (match.getEngine().equals(engine)) { return match; } } return null; } /** * Get expected result pattern with index of given database engine. * * @param engine Database engine the expected result is searched for. * @param index Index of the expected result pattern to search for. * @return Expected result pattern. */ private Match getPatternByEngineAndIndex(final String engine, final int index) { for (int i = 0; i < _patterns.size(); i++) { Match match = _patterns.get(i); if (match.getEngine() == null) { if ((engine == null) && (index == match.getIndex())) { return match; } } else if (match.getEngine().equals(engine) && (match.getIndex() == index)) { return match; } } return null; } //-------------------------------------------------------------------------- }