package org.drools.compiler; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.net.URL; import java.util.Enumeration; import org.drools.CheckedDroolsException; import org.drools.util.ServiceRegistryImpl; public class BusinessRuleProviderFactory { private static BusinessRuleProviderFactory instance = new BusinessRuleProviderFactory(); private BusinessRuleProvider provider; private BusinessRuleProviderFactory() { } public static BusinessRuleProviderFactory getInstance() { return instance; } public BusinessRuleProvider getProvider() throws CheckedDroolsException { if (null == provider) provider = loadProvider(); return provider; } private BusinessRuleProvider loadProvider() throws CheckedDroolsException { String interfaceName = BusinessRuleProvider.class.getName(); try { URL systemResource = null; for (Enumeration<URL> systemResources = ClassLoader .getSystemResources("META-INF/services/" + interfaceName); systemResources .hasMoreElements();) { if (null != systemResource) throwMultipleImplementationsDetected(); systemResource = systemResources.nextElement(); } if (systemResource == null) { throwNoImplementationFound(); } BufferedReader reader = new BufferedReader(new InputStreamReader(systemResource.openStream())); String className = null; for (String currentName; (currentName = reader.readLine()) != null;) { if (className != null) { throwMultipleImplementationsDetected(); } className = currentName; } if (null == className) { throwNoImplementationFound(); } ServiceRegistryImpl.getInstance().addDefault(BusinessRuleProvider.class, className); return ServiceRegistryImpl.getInstance().get(BusinessRuleProvider.class); } catch (IOException e) { throw new CheckedDroolsException("Error obtaining " + interfaceName, e); } } private void throwNoImplementationFound() throws CheckedDroolsException { throw new CheckedDroolsException("Unable to find implementation for BusinessRuleProvider"); } private void throwMultipleImplementationsDetected() { throw new IllegalStateException("multiple BusinessRuleProvider implementations detected"); } }