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/28 21:10:27 UTC
svn commit: r798659 -
/geronimo/specs/branches/geronimo-jpa_2.0_spec-1.0-EA5/src/main/java/javax/persistence/Persistence.java
Author: dwoods
Date: Tue Jul 28 19:10:27 2009
New Revision: 798659
URL: http://svn.apache.org/viewvc?rev=798659&view=rev
Log:
GERONIMO-4410 - Maintain 1.0 behavior while allowing 2.0 required behavior of trying each discovered provider.
Modified:
geronimo/specs/branches/geronimo-jpa_2.0_spec-1.0-EA5/src/main/java/javax/persistence/Persistence.java
Modified: geronimo/specs/branches/geronimo-jpa_2.0_spec-1.0-EA5/src/main/java/javax/persistence/Persistence.java
URL: http://svn.apache.org/viewvc/geronimo/specs/branches/geronimo-jpa_2.0_spec-1.0-EA5/src/main/java/javax/persistence/Persistence.java?rev=798659&r1=798658&r2=798659&view=diff
==============================================================================
--- geronimo/specs/branches/geronimo-jpa_2.0_spec-1.0-EA5/src/main/java/javax/persistence/Persistence.java (original)
+++ geronimo/specs/branches/geronimo-jpa_2.0_spec-1.0-EA5/src/main/java/javax/persistence/Persistence.java Tue Jul 28 19:10:27 2009
@@ -25,6 +25,7 @@
package javax.persistence;
import java.util.Collections;
+import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
@@ -83,11 +84,11 @@
String persistenceUnitName, Map properties) {
EntityManagerFactory factory = null;
-
- if (properties == null) {
- properties = Collections.EMPTY_MAP;
+ Map props = properties;
+ if (props == null) {
+ props = Collections.EMPTY_MAP;
}
-
+
// get the discovered set of providers
PersistenceProviderResolver resolver =
PersistenceProviderResolverHolder.getPersistenceProviderResolver();
@@ -96,9 +97,9 @@
/*
* Geronimo/OpenJPA 1.0 unique behavior - Start by loading a provider
- * explicitly specified in properties and return any exceptions. The
- * spec doesn't forbid providers that aren't a service - it only states
- * that they "should" be implemented as one in Sect. 9.2.
+ * explicitly specified in the properties and return any exceptions.
+ * The spec doesn't forbid providers that aren't a service - it only
+ * states that they "should" be implemented as services in Sect. 9.2.
*
* For 2.0 - We only perform the above behavior if the specified
* provider is not in the discovered list.
@@ -106,7 +107,7 @@
* Note: This special non-spec defined case will rethrow any encountered
* Exceptions as a PersistenceException.
*/
- Object providerName = properties.get(PERSISTENCE_PROVIDER_PROPERTY);
+ Object providerName = props.get(PERSISTENCE_PROVIDER_PROPERTY);
if ((providerName != null) && (providerName instanceof String)) {
boolean isLoaded = false;
// search the discovered providers for this explicit provider
@@ -118,47 +119,54 @@
}
/*
* Only try to explicitly create this provider if we didn't
- * find it as a service, while rethrowing any Exceptions to
+ * find it as a service, while rethrowing any exceptions to
* match the old 1.0 behavior
*/
if (!isLoaded) {
factory = createFactory(
providerName.toString(),
persistenceUnitName,
- properties);
+ props);
if (factory != null) {
return factory;
}
}
}
- // Now, the default behavior of loading a provider from our resolver
- for (PersistenceProvider provider : providers) {
- try {
- factory = provider.createEntityManagerFactory(
- persistenceUnitName, properties);
- } catch (Exception e) {
- /*
- * Note: Change in behavior from 1.0 -
- * Spec states that a provider "must" return null if it
- * cannot fulfill an EMF request, so ignore any exceptions
- * that are thrown if we have more than one provider,
- * so the other providers have a chance to return an EMF.
- */
- if (providers.size() == 1)
- {
- // this is the only provider, so rethrow exception
- throw new PersistenceException(e);
+ /*
+ * Now, the default behavior of loading a provider from our resolver
+ * Note: Change in behavior from 1.0, which always returned exceptions:
+ * Spec states that a provider "must" return null if it
+ * cannot fulfill an EMF request, so ignore any exceptions
+ * that are thrown if we have more than one provider,
+ * so the other providers have a chance to return an EMF.
+ * Otherwise, return any exceptions and rethrow/wrapper as a
+ * PersistenceException if needed to match 1.0 behavior.
+ */
+ if (providers.size() == 1) {
+ // allow any exceptions to pass thru to caller
+ return providers.get(0).createEntityManagerFactory(
+ persistenceUnitName, props);
+ } else {
+ for (PersistenceProvider provider : providers) {
+ try {
+ factory = provider.createEntityManagerFactory(
+ persistenceUnitName, props);
+ } catch (Exception e) {
+ // ignore and give other providers a chance
+ }
+ if (factory != null) {
+ return factory;
}
- }
- if (factory != null) {
- return factory;
}
}
- // spec doesn't mention any exceptions thrown by this method if no emf
- // returned, but old 1.0 behavior always generated an EMF or exception
- throw new PersistenceException("No Persistence providers found for PU=" + persistenceUnitName);
+ /*
+ * Spec doesn't mention any exceptions thrown by this method if no emf
+ * returned, but old 1.0 behavior always generated an EMF or exception.
+ */
+ throw new PersistenceException("No Persistence providers found for PU="
+ + persistenceUnitName);
}
/*