001: /*
002: * Copyright 2006 Le Duc Bao, Ralf Joachim
003: *
004: * Licensed under the Apache License, Version 2.0 (the "License"); you may not
005: * use this file except in compliance with the License. You may obtain a copy of
006: * the License at
007: *
008: * http://www.apache.org/licenses/LICENSE-2.0
009: *
010: * Unless required by applicable law or agreed to in writing, software
011: * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
012: * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
013: * License for the specific language governing permissions and limitations under
014: * the License.
015: */
016: package org.castor.ddlgen;
017:
018: import java.lang.reflect.Constructor;
019: import java.util.Collection;
020: import java.util.Collections;
021: import java.util.Hashtable;
022: import java.util.Map;
023: import java.util.StringTokenizer;
024:
025: import org.apache.commons.logging.Log;
026: import org.apache.commons.logging.LogFactory;
027:
028: /**
029: * Registry for Generator implementations obtained from the configuration.
030: *
031: * @author <a href="mailto:leducbao AT gmail DOT com">Le Duc Bao</a>
032: * @author <a href="mailto:ralf DOT joachim AT syscon DOT eu">Ralf Joachim</a>
033: * @version $Revision: 5951 $ $Date: 2006-04-25 16:09:10 -0600 (Tue, 25 Apr 2006) $
034: * @since 1.1
035: */
036: public final class GeneratorRegistry {
037: //--------------------------------------------------------------------------
038:
039: /** The <a href="http://jakarta.apache.org/commons/logging/">Jakarta Commons
040: * Logging </a> instance used for all logging. */
041: private static final Log LOG = LogFactory
042: .getLog(GeneratorRegistry.class);
043:
044: /** Association between name of database engine and generator implementation. */
045: private Map _generators = new Hashtable();
046:
047: //--------------------------------------------------------------------------
048:
049: /**
050: * Construct an instance of each generator specified in given configuration.
051: *
052: * @param config The configuration.
053: */
054: public GeneratorRegistry(final DDLGenConfiguration config) {
055: String prop = config.getStringValue(
056: DDLGenConfiguration.GENERATORS_KEY, "");
057: StringTokenizer tokenizer = new StringTokenizer(prop, ",");
058: ClassLoader loader = GeneratorRegistry.class.getClassLoader();
059: while (tokenizer.hasMoreTokens()) {
060: String classname = tokenizer.nextToken().trim();
061: try {
062: Class cls = loader.loadClass(classname);
063: Class[] types = new Class[] { DDLGenConfiguration.class };
064: Object[] params = new Object[] { config };
065: Constructor cst = cls.getConstructor(types);
066: Generator generator = (Generator) cst
067: .newInstance(params);
068: _generators.put(generator.getEngineName(), generator);
069: } catch (Exception ex) {
070: String msg = "Problem instantiating generator: ";
071: LOG.error(msg + classname, ex);
072: }
073: }
074: }
075:
076: //--------------------------------------------------------------------------
077:
078: /**
079: * Returns generator with given engine name or null if there is no such generator.
080: *
081: * @param engine Name of database engine.
082: * @return Generator with given engine name.
083: * @throws GeneratorException If no generator for engine can be found.
084: */
085: public Generator getGenerator(final String engine)
086: throws GeneratorException {
087: if (engine == null) {
088: throw new GeneratorException("No database engine specified");
089: }
090: Generator generator = (Generator) _generators.get(engine);
091: if (generator == null) {
092: throw new GeneratorException("Unknown DDL generator: "
093: + engine);
094: }
095: return generator;
096: }
097:
098: /**
099: * Returns a collection of the current configured generators.
100: *
101: * @return Collection of the current configured generators.
102: */
103: public Collection getGenerators() {
104: return Collections.unmodifiableCollection(_generators.values());
105: }
106:
107: /**
108: * Returns a collection of the names of current configured database engines.
109: *
110: * @return Names of the configured database engines.
111: */
112: public Collection getEngineNames() {
113: return Collections.unmodifiableCollection(_generators.keySet());
114: }
115:
116: //--------------------------------------------------------------------------
117: }
|