in jaxb-api-2.2/src/main/java/javax/xml/bind/ContextFinder.java [242:311]
static JAXBContext find(String factoryId, String contextPath, ClassLoader classLoader, Map properties ) throws JAXBException {
// TODO: do we want/need another layer of searching in $java.home/lib/jaxb.properties like JAXP?
final String jaxbContextFQCN = JAXBContext.class.getName();
// search context path for jaxb.properties first
StringBuilder propFileName;
StringTokenizer packages = new StringTokenizer( contextPath, ":" );
String factoryClassName;
if(!packages.hasMoreTokens())
// no context is specified
throw new JAXBException(Messages.format(Messages.NO_PACKAGE_IN_CONTEXTPATH));
logger.fine("Searching jaxb.properties");
while( packages.hasMoreTokens() ) {
String packageName = packages.nextToken(":").replace('.','/');
// com.acme.foo - > com/acme/foo/jaxb.properties
propFileName = new StringBuilder().append(packageName).append("/jaxb.properties");
Properties props = loadJAXBProperties( classLoader, propFileName.toString() );
if (props != null) {
if (props.containsKey(factoryId)) {
factoryClassName = props.getProperty(factoryId);
return newInstance( contextPath, factoryClassName, classLoader, properties );
} else {
throw new JAXBException(Messages.format(Messages.MISSING_PROPERTY, packageName, factoryId));
}
}
}
logger.fine("Searching the system property");
// search for a system property second (javax.xml.bind.JAXBContext)
factoryClassName = AccessController.doPrivileged(new GetPropertyAction(jaxbContextFQCN));
if( factoryClassName != null ) {
return newInstance( contextPath, factoryClassName, classLoader, properties );
}
logger.fine("Searching META-INF/services");
// search META-INF services next
BufferedReader r;
try {
final StringBuilder resource = new StringBuilder().append("META-INF/services/").append(jaxbContextFQCN);
final InputStream resourceStream =
classLoader.getResourceAsStream(resource.toString());
if (resourceStream != null) {
r = new BufferedReader(new InputStreamReader(resourceStream, "UTF-8"));
factoryClassName = r.readLine().trim();
r.close();
return newInstance(contextPath, factoryClassName, classLoader, properties);
} else {
logger.fine("Unable to load:" + resource.toString());
}
} catch (UnsupportedEncodingException e) {
// should never happen
throw new JAXBException(e);
} catch (IOException e) {
throw new JAXBException(e);
}
// else no provider found
logger.fine("Trying to create the platform default provider");
return newInstance(contextPath, PLATFORM_DEFAULT_FACTORY_CLASS, classLoader, properties);
}