in java-persistence-api-1.1.1/src/main/java/javax/persistence/Persistence.java [78:140]
public static EntityManagerFactory createEntityManagerFactory(
String persistenceUnitName,
Map properties) {
if (properties == null) {
properties = Collections.EMPTY_MAP;
}
// start by loading a provider explicitly specified in properties. The spec
// doesn't seem to forbid providers that are not deployed as a service
Object providerName = properties.get(PERSISTENCE_PROVIDER_PROPERTY);
if (providerName instanceof String) {
EntityManagerFactory factory = createFactory(
providerName.toString(),
persistenceUnitName,
properties);
if (factory != null) {
return factory;
}
}
//If we are deployed into an OSGi environment, leverage it
Class<? extends PersistenceProvider> providerClass = org.apache.servicemix.specs.locator.OsgiLocator.locate(PersistenceProvider.class);
if (providerClass != null) {
try {
PersistenceProvider provider = providerClass.newInstance();
return provider.createEntityManagerFactory(persistenceUnitName,
properties);
}
catch (Exception e) {
throw new PersistenceException("Provider error. Provider: "
+ providerName, e);
}
}
// load correctly deployed providers
ClassLoader loader = Thread.currentThread().getContextClassLoader();
try {
Enumeration<URL> providers = loader
.getResources(PERSISTENCE_PROVIDER_SERVICE);
while (providers.hasMoreElements()) {
String name = getProviderName(providers.nextElement());
if (name != null) {
EntityManagerFactory factory = createFactory(
name,
persistenceUnitName,
properties);
if (factory != null) {
return factory;
}
}
}
}
catch (IOException e) {
// spec doesn't mention any exceptions thrown by this method
}
return null;
}