X-Git-Url: http://wamblee.org/gitweb/?a=blobdiff_plain;f=support%2Fgeneral%2Fsrc%2Fmain%2Fjava%2Forg%2Fwamblee%2Fgeneral%2FBeanKernel.java;fp=support%2Fgeneral%2Fsrc%2Fmain%2Fjava%2Forg%2Fwamblee%2Fgeneral%2FBeanKernel.java;h=d05eef3dd6b507c8706a5d2dd865b3de4edc06c6;hb=32a62ca2c752e33a7873ac868a7a1f289caedcd4;hp=0000000000000000000000000000000000000000;hpb=d2bdf4e813c6a3964958c87b2ce56eaadf8a1f0a;p=utils diff --git a/support/general/src/main/java/org/wamblee/general/BeanKernel.java b/support/general/src/main/java/org/wamblee/general/BeanKernel.java new file mode 100644 index 00000000..d05eef3d --- /dev/null +++ b/support/general/src/main/java/org/wamblee/general/BeanKernel.java @@ -0,0 +1,119 @@ +/* + * Copyright 2005 the original author or authors. + * + * 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.wamblee.general; + +import java.io.IOException; +import java.io.InputStream; +import java.util.Properties; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.wamblee.io.ClassPathResource; +import org.wamblee.io.InputResource; + +/** + * The standard means to obtain the bean factory. This works by reading a + * property {@value #BEAN_FACTORY_CLASS} from a property file named + * {@value #BEAN_KERNEL_PROP_FILE} from the class path. This property identifies + * the bean factory implementation to use. The configured bean factory must have + * a no-arg constructor. + */ +public final class BeanKernel { + + private static final Log LOG = LogFactory.getLog(BeanKernel.class); + + /** + * Bean factory kernel properties file. + */ + private static final String BEAN_KERNEL_PROP_FILE = "org.wamblee.beanfactory.properties"; + + /** + * Name of the property to define the name of the bean factory class to use. + * THis class must have a public default constructor. + */ + private static final String BEAN_FACTORY_CLASS = "org.wamblee.beanfactory.class"; + + /** + * Cached bean factory. + */ + private static BeanFactory BEAN_FACTORY; + + /** + * Disabled constructor. + * + */ + private BeanKernel() { + // Empty + } + + /** + * Overrides the default mechanism for looking up the bean factory by + * specifying it yourself. + * + * @param aOverride + * Override bean factory. + */ + public static void overrideBeanFactory(BeanFactory aOverride) { + BEAN_FACTORY = aOverride; + } + + /** + * Gets the bean factory. + * + * @return Bean factory. + */ + public static BeanFactory getBeanFactory() { + synchronized (BeanFactory.class) { + if (BEAN_FACTORY == null) { + BEAN_FACTORY = lookupBeanFactory(BEAN_KERNEL_PROP_FILE); + } + } + return BEAN_FACTORY; + } + + /** + * Lookup the bean factory based on the properties file. + * + * @return Bean factory. + */ + static BeanFactory lookupBeanFactory(String aPropertyFilename) { + InputResource resource = new ClassPathResource(aPropertyFilename); + InputStream is; + try { + is = resource.getInputStream(); + } catch (IOException e) { + throw new BeanFactoryException("Cannot open resource " + resource, + e); + } + try { + Properties props = new Properties(); + props.load(is); + String className = props.getProperty(BEAN_FACTORY_CLASS); + Class beanFactory = Class.forName(className); + return (BeanFactory) beanFactory.newInstance(); + } catch (Exception e) { + throw new BeanFactoryException("Cannot read from resource " + + resource, e); + } finally { + try { + is.close(); + } catch (IOException e) { + // last resort cannot do much now. + LOG.error("Error closing resource " + resource); + } + } + } +}