1 package org.objectweb.celtix.configuration; 2 3 import java.io.BufferedReader ; 4 import java.io.InputStream ; 5 import java.io.InputStreamReader ; 6 7 8 public final class ConfigurationBuilderFactory { 9 private static final String DEFAULT_CONFIGURATION_BUILDER_CLASSNAME = 10 "org.objectweb.celtix.bus.configuration.CeltixConfigurationBuilder"; 11 private static ConfigurationBuilder theBuilder; 12 13 private ConfigurationBuilderFactory() { 14 } 15 16 public static ConfigurationBuilder getBuilder() { 17 return getBuilder(null); 18 } 19 public static void clearBuilder() { 20 theBuilder = null; 21 } 22 23 public static ConfigurationBuilder getBuilder(ClassLoader classLoader) { 24 25 if (null == theBuilder) { 26 String builderClass = getBuilderClass(classLoader); 27 28 30 theBuilder = createBuilder(builderClass, selectClassLoader(classLoader)); 31 } 32 return theBuilder; 33 } 34 35 private static ConfigurationBuilder createBuilder(String className, ClassLoader classLoader) { 36 37 Class <? extends ConfigurationBuilder> builderClass; 38 try { 39 builderClass = Class.forName(className, true, classLoader) 40 .asSubclass(ConfigurationBuilder.class); 41 return builderClass.newInstance(); 42 } catch (Exception ex) { 43 throw new ConfigurationException(ex); 44 } 45 } 46 47 private static ClassLoader selectClassLoader(ClassLoader classLoader) { 48 ClassLoader ret = classLoader; 49 if (null == classLoader) { 50 ret = ConfigurationBuilderFactory.class.getClassLoader(); 51 } 52 return ret; 53 } 54 55 private static String getBuilderClass(ClassLoader classLoader) throws ConfigurationException { 56 57 String builderClass = null; 58 59 builderClass = System.getProperty(ConfigurationBuilder.CONFIGURATION_BUILDER_CLASS_PROPERTY); 61 if (isValidBuilderClass(builderClass)) { 62 return builderClass; 63 } 64 65 try { 66 String serviceId = "META-INF/services/" 68 + ConfigurationBuilder.CONFIGURATION_BUILDER_CLASS_PROPERTY; 69 InputStream is = null; 70 71 if (classLoader == null) { 72 classLoader = Thread.currentThread().getContextClassLoader(); 73 } 74 75 if (classLoader == null) { 76 is = ClassLoader.getSystemResourceAsStream(serviceId); 77 } else { 78 is = classLoader.getResourceAsStream(serviceId); 79 } 80 if (is != null) { 81 BufferedReader rd = new BufferedReader (new InputStreamReader (is, "UTF-8")); 82 builderClass = rd.readLine(); 83 rd.close(); 84 } 85 if (isValidBuilderClass(builderClass)) { 86 return builderClass; 87 } 88 89 builderClass = DEFAULT_CONFIGURATION_BUILDER_CLASSNAME; 91 return builderClass; 92 } catch (Exception ex) { 93 throw new ConfigurationException(ex); 94 } 95 } 96 97 private static boolean isValidBuilderClass(String builderClassName) { 98 return builderClassName != null && !"".equals(builderClassName); 99 } 100 101 } 102 | Popular Tags |