You are viewing a plain text version of this content. The canonical link for it is here.
Posted to scm@geronimo.apache.org by dw...@apache.org on 2009/07/23 15:55:08 UTC
svn commit: r797072 -
/geronimo/specs/trunk/geronimo-jpa_2.0_spec/src/main/java/javax/persistence/Persistence.java
Author: dwoods
Date: Thu Jul 23 13:55:08 2009
New Revision: 797072
URL: http://svn.apache.org/viewvc?rev=797072&view=rev
Log:
GERONIMO-4410 - OPENJPA-1076 Update createEntityManagerFactory() to use PersistenceProviderResolver and PersistenceProviderResolverHolder
Modified:
geronimo/specs/trunk/geronimo-jpa_2.0_spec/src/main/java/javax/persistence/Persistence.java
Modified: geronimo/specs/trunk/geronimo-jpa_2.0_spec/src/main/java/javax/persistence/Persistence.java
URL: http://svn.apache.org/viewvc/geronimo/specs/trunk/geronimo-jpa_2.0_spec/src/main/java/javax/persistence/Persistence.java?rev=797072&r1=797071&r2=797072&view=diff
==============================================================================
--- geronimo/specs/trunk/geronimo-jpa_2.0_spec/src/main/java/javax/persistence/Persistence.java (original)
+++ geronimo/specs/trunk/geronimo-jpa_2.0_spec/src/main/java/javax/persistence/Persistence.java Thu Jul 23 13:55:08 2009
@@ -24,17 +24,15 @@
//
package javax.persistence;
-import java.io.BufferedReader;
-import java.io.IOException;
-import java.io.InputStreamReader;
-import java.net.URL;
import java.util.Collections;
-import java.util.Enumeration;
import java.util.HashSet;
+import java.util.List;
import java.util.Map;
import java.util.Set;
import javax.persistence.spi.PersistenceProvider;
+import javax.persistence.spi.PersistenceProviderResolver;
+import javax.persistence.spi.PersistenceProviderResolverHolder;
/**
* @version $Rev$ $Date$
@@ -43,6 +41,8 @@
/**
* Bootstrap class that is used to obtain {@link javax.persistence.EntityManagerFactory}
* references.
+ *
+ * Contains Geronimo implemented code as required by the JPA spec.
*/
public class Persistence {
@@ -78,113 +78,83 @@
* specified persistence unit.
*/
public static EntityManagerFactory createEntityManagerFactory(
- String persistenceUnitName,
- Map properties) {
-
+ String persistenceUnitName, Map properties) {
+ EntityManagerFactory factory = null;
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
+ /*
+ * Geronimo/OpenJPA unique behavior - 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(
+ factory = createFactory(
providerName.toString(),
persistenceUnitName,
properties);
- if (factory != null) {
- return factory;
- }
}
- // 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;
- }
+ if (factory == null) {
+ /*
+ * Now, the default behavior of loading a provider from our resolver
+ */
+ PersistenceProviderResolver resolver =
+ PersistenceProviderResolverHolder.getPersistenceProviderResolver();
+ List<PersistenceProvider> providers = resolver.getPersistenceProviders();
+ for (PersistenceProvider provider : providers) {
+ factory = provider.createEntityManagerFactory(
+ persistenceUnitName, properties);
+ if (factory != null) {
+ break;
}
}
}
- catch (IOException e) {
- // spec doesn't mention any exceptions thrown by this method
- }
- return null;
+ // spec doesn't mention any exceptions thrown by this method if no emf
+ return factory;
}
- static String getProviderName(URL url) throws IOException {
-
- BufferedReader in = new BufferedReader(new InputStreamReader(
- url.openStream(),
- "UTF-8"));
-
- String providerName;
-
- try {
- providerName = in.readLine();
- }
- finally {
- in.close();
- }
-
- if (providerName != null) {
- providerName = providerName.trim();
- }
-
- return providerName;
- }
-
- static EntityManagerFactory createFactory(
+ /*
+ * Geronimo/OpenJPA private helper code for PERSISTENCE_PROVIDER_PROPERTY
+ */
+ private static EntityManagerFactory createFactory(
String providerName,
String persistenceUnitName,
Map properties)
throws PersistenceException {
- Class providerClass;
+ Class<?> providerClass;
+ ClassLoader cl = Thread.currentThread().getContextClassLoader();
+ if (cl == null)
+ cl = Persistence.class.getClassLoader();
try {
- providerClass = Class.forName(providerName, true, Thread
- .currentThread().getContextClassLoader());
+ providerClass = Class.forName(providerName, true, cl);
+ } catch (Exception e) {
+ throw new PersistenceException("Invalid or inaccessible provider class: " + providerName, e);
}
- catch (Exception e) {
- throw new PersistenceException(
- "Invalid or inaccessible provider class: " + providerName,
- e);
- }
-
try {
- PersistenceProvider provider = (PersistenceProvider) providerClass
- .newInstance();
- return provider.createEntityManagerFactory(persistenceUnitName,
- properties);
- }
- catch (Exception e) {
- throw new PersistenceException("Provider error. Provider: "
- + providerName, e);
+ PersistenceProvider provider = (PersistenceProvider) providerClass.newInstance();
+ return provider.createEntityManagerFactory(persistenceUnitName, properties);
+ } catch (Exception e) {
+ throw new PersistenceException("Provider error. Provider: " + providerName, e);
}
}
/*
* @return PersistenceUtil instance
+ * @since 2.0
*/
public static PersistenceUtil getPersistenceUtil() {
- // TODO: OPENJPA-1076 - Required by JSR-317.
- // Dummy impl for Bean Validation testing.
- return new PersistenceUtil() {
+ return new PersistenceUtilImpl();
+ }
+
+ /*
+ * Geronimo implementation specific code
+ */
+ private static class PersistenceUtilImpl implements PersistenceUtil {
public boolean isLoaded(Object entity, String attributeName) {
// TODO Auto-generated dummy method stub
@@ -195,6 +165,6 @@
// TODO Auto-generated dummy method stub
return true;
}
- };
}
+
}