/*
 * 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;

/**
 * This class handles the creation for various databse generators.
 * 
 * @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 GeneratorFactory {
    //--------------------------------------------------------------------------

    /**
     * Create DDL Generator for specified database engine with given global and specific
     * configurations.
     * 
     * @param engine Database engine.
     * @param globalConf Global configuration file.
     * @param specificConf Specific configuration file for database engine.
     * @return DDL generator for database engine.
     * @throws GeneratorException If database engine has not been specified or no
     *         generator is available for the database engine.
     */
    public static Generator createDDLGenerator(final String engine,
            final String globalConf, final String specificConf)
    throws GeneratorException {
        DDLGenConfiguration config = new DDLGenConfiguration();

        // load default global configuration
        config.addProperties(Generator.GLOBAL_CONFIG_PATH + Generator.GLOBAL_CONFIG_NAME);
        // overload with global configuration given on commandline
        if (globalConf != null) { config.addProperties(globalConf); }
        
        GeneratorRegistry registry = new GeneratorRegistry(config);
        
        String eng = config.getStringValue(DDLGenConfiguration.DEFAULT_ENGINE_KEY, "");
        if (engine != null) { eng = engine; }
        Generator gen = registry.getGenerator(eng.toLowerCase());
        
        // load default configuration for specific database engine
        config.addProperties(gen.getEngineConfigPath() + gen.getEngineConfigName());
        // overload with specific configuration given on commandline
        if (specificConf != null) { config.addProperties(specificConf); }
        
        // create key generator registry  to be used by the generator
        gen.setKeyGenRegistry(new KeyGeneratorRegistry(config));
        
        // initialize generator
        gen.initialize();
        
        return gen;
    }

    //--------------------------------------------------------------------------

    /**
     * Hide constructor of utility class. 
     */
    private GeneratorFactory() { }

    //--------------------------------------------------------------------------
}
