/*
* 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;
import java.lang.reflect.Constructor;
import java.util.Collection;
import java.util.Collections;
import java.util.Hashtable;
import java.util.Map;
import java.util.StringTokenizer;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
/**
* Registry for Generator implementations obtained from the configuration.
*
* @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 GeneratorRegistry {
//--------------------------------------------------------------------------
/** The <a href="http://jakarta.apache.org/commons/logging/">Jakarta Commons
* Logging </a> instance used for all logging. */
private static final Log LOG = LogFactory.getLog(GeneratorRegistry.class);
/** Association between name of database engine and generator implementation. */
private Map<String, Generator> _generators = new Hashtable<String, Generator>();
//--------------------------------------------------------------------------
/**
* Construct an instance of each generator specified in given configuration.
*
* @param config The configuration.
*/
public GeneratorRegistry(final DDLGenConfiguration config) {
String prop = config.getStringValue(DDLGenConfiguration.GENERATORS_KEY, "");
StringTokenizer tokenizer = new StringTokenizer(prop, ",");
ClassLoader loader = GeneratorRegistry.class.getClassLoader();
while (tokenizer.hasMoreTokens()) {
String classname = tokenizer.nextToken().trim();
try {
Class<?> cls = loader.loadClass(classname);
Class<?>[] types = new Class<?>[] {DDLGenConfiguration.class};
Object[] params = new Object[] {config};
Constructor<?> cst = cls.getConstructor(types);
Generator generator = (Generator) cst.newInstance(params);
_generators.put(generator.getEngineName(), generator);
} catch (Exception ex) {
String msg = "Problem instantiating generator: ";
LOG.error(msg + classname, ex);
}
}
}
//--------------------------------------------------------------------------
/**
* Returns generator with given engine name or null if there is no such generator.
*
* @param engine Name of database engine.
* @return Generator with given engine name.
* @throws GeneratorException If no generator for engine can be found.
*/
public Generator getGenerator(final String engine) throws GeneratorException {
if (engine == null) {
throw new GeneratorException("No database engine specified");
}
Generator generator = _generators.get(engine);
if (generator == null) {
throw new GeneratorException("Unknown DDL generator: " + engine);
}
return generator;
}
/**
* Returns a collection of the current configured generators.
*
* @return Collection of the current configured generators.
*/
public Collection<Generator> getGenerators() {
return Collections.unmodifiableCollection(_generators.values());
}
/**
* Returns a collection of the names of current configured database engines.
*
* @return Names of the configured database engines.
*/
public Collection<String> getEngineNames() {
return Collections.unmodifiableCollection(_generators.keySet());
}
//--------------------------------------------------------------------------
}