in saaj-api-1.4/src/main/java/javax/xml/soap/FactoryFinder.java [93:175]
static <T> T find(Class<T> factoryClass,
String defaultClassName,
boolean tryFallback, String deprecatedFactoryId) throws SOAPException {
ClassLoader tccl = ServiceLoaderUtil.contextClassLoader(EXCEPTION_HANDLER);
String factoryId = factoryClass.getName();
try {
// If we are deployed into an OSGi environment, leverage it
if (factoryClass == null) {
String factoryClassName = factoryClass.getName();
if (factoryClassName.equals("javax.xml.soap.MetaFactory")) {
//this is an exception that the factoryPropertyName isn't
//the actual factory class name, there is no class
//javax.xml.soap.MetaFactory at all
factoryClassName = "javax.xml.soap.SAAJMetaFactory";
}
ClassLoader cl = FactoryFinder.class.getClassLoader();
if (cl == null) {
cl = Thread.currentThread().getContextClassLoader();
}
factoryClass = (Class<T>)cl.loadClass(factoryClassName);
}
Class spiClass = org.apache.servicemix.specs.locator.OsgiLocator.locate(factoryClass, factoryClass.getName());
if (spiClass != null) {
return (T)spiClass.newInstance();
}
} catch (Throwable e) {
}
// Use the system property first
String className = fromSystemProperty(factoryId, deprecatedFactoryId);
if (className != null) {
Object result = newInstance(className, defaultClassName, tccl);
if (result != null) {
return (T) result;
}
}
// try to read from $java.home/lib/jaxm.properties
className = fromJDKProperties(factoryId, deprecatedFactoryId);
if (className != null) {
Object result = newInstance(className, defaultClassName, tccl);
if (result != null) {
return (T) result;
}
}
// standard services: java.util.ServiceLoader
T factory = ServiceLoaderUtil.firstByServiceLoader(
factoryClass,
logger,
EXCEPTION_HANDLER);
if (factory != null) {
return factory;
}
// try to find services in CLASSPATH
className = fromMetaInfServices(deprecatedFactoryId, tccl);
if (className != null) {
logger.log(Level.WARNING,
"Using deprecated META-INF/services mechanism with non-standard property: {0}. " +
"Property {1} should be used instead.",
new Object[]{deprecatedFactoryId, factoryId});
Object result = newInstance(className, defaultClassName, tccl);
if (result != null) {
return (T) result;
}
}
// If not found and fallback should not be tried, return a null result.
if (!tryFallback)
return null;
// We didn't find the class through the usual means so try the default
// (built in) factory if specified.
if (defaultClassName == null) {
throw new SOAPException(
"Provider for " + factoryId + " cannot be found", null);
}
return (T) newInstance(defaultClassName, defaultClassName, tccl);
}