sascha@5: package de.intevation.artifactdatabase; sascha@5: sascha@70: import de.intevation.artifacts.ArtifactContextFactory; sascha@70: import de.intevation.artifacts.ArtifactFactory; sascha@70: import de.intevation.artifacts.ServiceFactory; sascha@70: sascha@70: import java.util.ArrayList; sascha@70: sascha@70: import org.apache.log4j.Logger; sascha@70: sascha@5: import org.w3c.dom.Document; sascha@5: import org.w3c.dom.NodeList; sascha@5: /** sascha@5: * Bootstrap facility for the global context and the artifact factories. sascha@5: * sascha@5: * @author Sascha L. Teichmann (sascha.teichmann@intevation.de) sascha@5: */ sascha@5: public class FactoryBootstrap sascha@5: { sascha@17: private static Logger logger = Logger.getLogger(FactoryBootstrap.class); sascha@17: sascha@5: public static final String CONTEXT_FACTORY = sascha@5: "/artifact-database/factories/context-factory/text()"; sascha@5: sascha@5: public static final String DEFAULT_CONTEXT_FACTORY = sascha@5: "de.intevation.artifactdatabase.DefaultArtifactContextFactory"; sascha@5: sascha@5: public static final String ARTIFACT_FACTORIES = tim@16: "/artifact-database/factories/artifact-factories/artifact-factory"; sascha@5: sascha@5: protected Object context; sascha@5: sascha@5: protected ArtifactFactory [] artifactFactories; sascha@5: sascha@5: public FactoryBootstrap() { sascha@5: } sascha@5: sascha@5: void buildContext() { sascha@5: String className = Config.getStringXPath( sascha@5: CONTEXT_FACTORY, DEFAULT_CONTEXT_FACTORY); sascha@5: sascha@5: ArtifactContextFactory factory = null; sascha@5: sascha@5: try { sascha@5: Class clazz = Class.forName(className); sascha@5: factory = (ArtifactContextFactory)clazz.newInstance(); sascha@5: } sascha@5: catch (ClassNotFoundException cnfe) { sascha@17: logger.error(cnfe.getLocalizedMessage(), cnfe); sascha@5: } sascha@5: catch (InstantiationException ie) { sascha@17: logger.error(ie.getLocalizedMessage(), ie); sascha@5: } sascha@5: catch (ClassCastException cce) { sascha@17: logger.error(cce.getLocalizedMessage(), cce); sascha@5: } sascha@5: catch (IllegalAccessException iae) { sascha@17: logger.error(iae.getLocalizedMessage(), iae); sascha@5: } sascha@5: sascha@5: if (factory == null) { sascha@5: factory = new DefaultArtifactContextFactory(); sascha@5: } sascha@5: sascha@19: logger.info("Using class '" + factory.getClass().getName() sascha@19: + "' for context creation."); sascha@19: sascha@5: context = factory.createArtifactContext(Config.getConfig()); sascha@5: } sascha@5: sascha@5: protected void loadArtifactFactories() { sascha@5: ArrayList loadedFactories = new ArrayList(); sascha@5: sascha@5: NodeList nodes = Config.getNodeSetXPath(ARTIFACT_FACTORIES); sascha@5: sascha@10: if (nodes == null) { sascha@17: logger.warn("No factories found"); sascha@10: } sascha@10: sascha@5: Document config = Config.getConfig(); sascha@5: sascha@19: for (int i = 0, N = nodes != null ? nodes.getLength() : 0; i < N; ++i) { sascha@5: String className = nodes.item(i).getTextContent(); sascha@5: sascha@5: ArtifactFactory factory = null; sascha@5: sascha@5: try { sascha@5: Class clazz = Class.forName(className); sascha@5: factory = (ArtifactFactory)clazz.newInstance(); sascha@5: } sascha@5: catch (ClassNotFoundException cnfe) { sascha@17: logger.error(cnfe.getLocalizedMessage(), cnfe); sascha@5: } sascha@5: catch (InstantiationException ie) { sascha@17: logger.error(ie.getLocalizedMessage(), ie); sascha@5: } sascha@5: catch (ClassCastException cce) { sascha@17: logger.error(cce.getLocalizedMessage(), cce); sascha@5: } sascha@5: catch (IllegalAccessException iae) { sascha@17: logger.error(iae.getLocalizedMessage(), iae); sascha@5: } sascha@5: sascha@5: if (factory != null) { sascha@19: factory.setup(config, nodes.item(i)); sascha@5: loadedFactories.add(factory); sascha@19: logger.info("Registering '" + factory.getName() + "' as artifact factory."); sascha@5: } sascha@5: } sascha@5: sascha@5: artifactFactories = (ArtifactFactory [])loadedFactories.toArray( sascha@5: new ArtifactFactory[loadedFactories.size()]); sascha@5: } sascha@5: sascha@5: public void boot() { sascha@5: buildContext(); sascha@5: loadArtifactFactories(); sascha@5: } sascha@5: sascha@5: public ArtifactFactory [] getArtifactFactories() { sascha@5: return artifactFactories; sascha@5: } sascha@5: sascha@70: public ServiceFactory [] getServiceFactories() { sascha@70: logger.warn("Service factories are not supported yet"); sascha@70: return new ServiceFactory[0]; sascha@70: } sascha@70: sascha@5: public Object getContext() { sascha@5: return context; sascha@5: } sascha@5: } sascha@5: // vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8: