You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@tomee.apache.org by rm...@apache.org on 2015/04/08 00:25:24 UTC
tomee git commit: if jpa < 2.1 then ignore synchronization type
Repository: tomee
Updated Branches:
refs/heads/master 3bf595f3c -> f9495336b
if jpa < 2.1 then ignore synchronization type
Project: http://git-wip-us.apache.org/repos/asf/tomee/repo
Commit: http://git-wip-us.apache.org/repos/asf/tomee/commit/f9495336
Tree: http://git-wip-us.apache.org/repos/asf/tomee/tree/f9495336
Diff: http://git-wip-us.apache.org/repos/asf/tomee/diff/f9495336
Branch: refs/heads/master
Commit: f9495336b78c8a81606c804a04cdc2bec430dd35
Parents: 3bf595f
Author: Romain Manni-Bucau <rm...@apache.org>
Authored: Wed Apr 8 00:25:16 2015 +0200
Committer: Romain Manni-Bucau <rm...@apache.org>
Committed: Wed Apr 8 00:25:16 2015 +0200
----------------------------------------------------------------------
.../openejb/persistence/JtaEntityManager.java | 28 +++++++++++++++++++-
1 file changed, 27 insertions(+), 1 deletion(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/tomee/blob/f9495336/container/openejb-core/src/main/java/org/apache/openejb/persistence/JtaEntityManager.java
----------------------------------------------------------------------
diff --git a/container/openejb-core/src/main/java/org/apache/openejb/persistence/JtaEntityManager.java b/container/openejb-core/src/main/java/org/apache/openejb/persistence/JtaEntityManager.java
index deac5a0..12c5cbc 100644
--- a/container/openejb-core/src/main/java/org/apache/openejb/persistence/JtaEntityManager.java
+++ b/container/openejb-core/src/main/java/org/apache/openejb/persistence/JtaEntityManager.java
@@ -44,9 +44,12 @@ import java.io.ObjectStreamException;
import java.io.Serializable;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
+import java.lang.reflect.Modifier;
import java.util.List;
import java.util.Locale;
import java.util.Map;
+import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.ConcurrentMap;
import java.util.concurrent.TimeUnit;
/**
@@ -73,6 +76,7 @@ public class JtaEntityManager implements EntityManager, Serializable {
private static final Method CREATE_QUERY_FROM_CRITERIA = Reflections.findMethod("createQuery", EntityManager.class, CriteriaQuery.class);
private static final Method CREATE_NATIVE_FROM_NAME_CLASS = Reflections.findMethod("createNativeQuery", EntityManager.class, String.class, Class.class);
private static final Method CREATE_NATIVE_FROM_NAME_MAPPING = Reflections.findMethod("createNativeQuery", EntityManager.class, String.class, String.class);
+ private static final ConcurrentMap<Class<?>, Boolean> IS_JPA21 = new ConcurrentHashMap<>();
private final JtaEntityManagerRegistry registry;
private final EntityManagerFactory entityManagerFactory;
@@ -101,13 +105,35 @@ public class JtaEntityManager implements EntityManager, Serializable {
this.entityManagerFactory = entityManagerFactory;
this.properties = properties;
this.extended = extended;
- this.synchronizationType = synchronizationType == null ? null : SynchronizationType.valueOf(synchronizationType.toUpperCase(Locale.ENGLISH));
+ this.synchronizationType = !isJPA21(entityManagerFactory) || synchronizationType == null ? null : SynchronizationType.valueOf(synchronizationType.toUpperCase(Locale.ENGLISH));
logger = unitName == null ? baseLogger : baseLogger.getChildLogger(unitName);
final String wrapConfig = ReloadableEntityManagerFactory.class.isInstance(entityManagerFactory) ?
ReloadableEntityManagerFactory.class.cast(entityManagerFactory).getUnitProperties().getProperty("openejb.jpa.query.wrap-no-tx", "true") : "true";
this.wrapNoTxQueries = wrapConfig == null || "true".equalsIgnoreCase(wrapConfig);
}
+ private static boolean isJPA21(final EntityManagerFactory entityManagerFactory) {
+ return ReloadableEntityManagerFactory.class.isInstance(entityManagerFactory) ?
+ isJPA21(ReloadableEntityManagerFactory.class.cast(entityManagerFactory).getDelegate())
+ : hasMethod(entityManagerFactory, "createEntityManager", SynchronizationType.class);
+ }
+
+ private static boolean hasMethod(final Object object, final String name, final Class<?>... params) {
+ try {
+ final Class<?> objectClass = object.getClass();
+ Boolean result = IS_JPA21.get(objectClass);
+ if (result == null) {
+ result = !Modifier.isAbstract(objectClass.getMethod(name, params).getModifiers());
+ if (objectClass.getClassLoader() == JtaEntityManager.class.getClassLoader()) {
+ IS_JPA21.putIfAbsent(objectClass, result);
+ } // else don't cache to not leak
+ }
+ return result;
+ } catch (final Throwable e) {
+ return false;
+ }
+ }
+
EntityManager getEntityManager() {
return registry.getEntityManager(entityManagerFactory, properties, extended, unitName, synchronizationType);
}