You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@tomee.apache.org by an...@apache.org on 2015/11/02 18:15:09 UTC
[15/24] tomee git commit: TOMEE-1644 handling synchronization type
for extended emf
TOMEE-1644 handling synchronization type for extended emf
Project: http://git-wip-us.apache.org/repos/asf/tomee/repo
Commit: http://git-wip-us.apache.org/repos/asf/tomee/commit/d1a17c6a
Tree: http://git-wip-us.apache.org/repos/asf/tomee/tree/d1a17c6a
Diff: http://git-wip-us.apache.org/repos/asf/tomee/diff/d1a17c6a
Branch: refs/heads/tomee-7.0.0-M1
Commit: d1a17c6a24aabbcda6504bbd0a39a52df375216b
Parents: dc45934
Author: Romain Manni-Bucau <rm...@gmail.com>
Authored: Fri Oct 23 12:33:18 2015 +0200
Committer: Romain Manni-Bucau <rm...@gmail.com>
Committed: Fri Oct 23 12:33:18 2015 +0200
----------------------------------------------------------------------
.../java/org/apache/openejb/BeanContext.java | 25 +++++++++++++++++---
.../classic/EnterpriseBeanBuilder.java | 23 +++++++++++-------
.../apache/openejb/core/managed/Instance.java | 5 ++--
.../openejb/core/managed/ManagedContainer.java | 18 ++++++++++----
.../apache/openejb/core/stateful/Instance.java | 5 ++--
.../core/stateful/StatefulContainer.java | 22 +++++++++++------
.../openejb/persistence/JtaEntityManager.java | 2 +-
.../openejb/cdi/ProducedExtendedEmTest.java | 4 +++-
8 files changed, 75 insertions(+), 29 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/tomee/blob/d1a17c6a/container/openejb-core/src/main/java/org/apache/openejb/BeanContext.java
----------------------------------------------------------------------
diff --git a/container/openejb-core/src/main/java/org/apache/openejb/BeanContext.java b/container/openejb-core/src/main/java/org/apache/openejb/BeanContext.java
index 45582e3..a33fb5f 100644
--- a/container/openejb-core/src/main/java/org/apache/openejb/BeanContext.java
+++ b/container/openejb-core/src/main/java/org/apache/openejb/BeanContext.java
@@ -79,6 +79,7 @@ import javax.enterprise.inject.spi.InterceptionType;
import javax.enterprise.inject.spi.Interceptor;
import javax.naming.Context;
import javax.persistence.EntityManagerFactory;
+import javax.persistence.SynchronizationType;
import java.lang.annotation.Annotation;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationHandler;
@@ -757,11 +758,11 @@ public class BeanContext extends DeploymentContext {
return injections;
}
- public Index<EntityManagerFactory, Map> getExtendedEntityManagerFactories() {
+ public Index<EntityManagerFactory, EntityManagerConfiguration> getExtendedEntityManagerFactories() {
return getStateful().extendedEntityManagerFactories;
}
- public void setExtendedEntityManagerFactories(final Index<EntityManagerFactory, Map> extendedEntityManagerFactories) {
+ public void setExtendedEntityManagerFactories(final Index<EntityManagerFactory, EntityManagerConfiguration> extendedEntityManagerFactories) {
this.getStateful().extendedEntityManagerFactories = extendedEntityManagerFactories;
}
@@ -1934,7 +1935,7 @@ public class BeanContext extends DeploymentContext {
private static class Stateful {
- private Index<EntityManagerFactory, Map> extendedEntityManagerFactories;
+ private Index<EntityManagerFactory, EntityManagerConfiguration> extendedEntityManagerFactories;
private Duration statefulTimeout;
private final List<Method> removeMethods = new ArrayList<Method>();
}
@@ -1972,4 +1973,22 @@ public class BeanContext extends DeploymentContext {
return proxy; // let it generate a NPE if null, shouldn't occur (tested elsewhere) excepted for test where we don't use it
}
}
+
+ public static class EntityManagerConfiguration {
+ private final Map properties;
+ private final SynchronizationType synchronizationType;
+
+ public EntityManagerConfiguration(final Map properties, final SynchronizationType synchronizationType) {
+ this.properties = properties;
+ this.synchronizationType = synchronizationType;
+ }
+
+ public Map getProperties() {
+ return properties;
+ }
+
+ public SynchronizationType getSynchronizationType() {
+ return synchronizationType;
+ }
+ }
}
http://git-wip-us.apache.org/repos/asf/tomee/blob/d1a17c6a/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/EnterpriseBeanBuilder.java
----------------------------------------------------------------------
diff --git a/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/EnterpriseBeanBuilder.java b/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/EnterpriseBeanBuilder.java
index 721a73f..2b819ba 100644
--- a/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/EnterpriseBeanBuilder.java
+++ b/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/EnterpriseBeanBuilder.java
@@ -25,11 +25,18 @@ import org.apache.openejb.OpenEJBException;
import org.apache.openejb.core.cmp.CmpUtil;
import org.apache.openejb.dyni.DynamicSubclass;
import org.apache.openejb.loader.SystemInstance;
+import org.apache.openejb.persistence.JtaEntityManager;
import org.apache.openejb.spi.ContainerSystem;
import org.apache.openejb.util.Duration;
import org.apache.openejb.util.Index;
import org.apache.openejb.util.Messages;
+import javax.ejb.TimedObject;
+import javax.ejb.Timer;
+import javax.naming.Context;
+import javax.naming.NamingException;
+import javax.persistence.EntityManagerFactory;
+import javax.persistence.SynchronizationType;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.Arrays;
@@ -39,11 +46,6 @@ import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.concurrent.TimeUnit;
-import javax.ejb.TimedObject;
-import javax.ejb.Timer;
-import javax.naming.Context;
-import javax.naming.NamingException;
-import javax.persistence.EntityManagerFactory;
class EnterpriseBeanBuilder {
private final EnterpriseBeanInfo bean;
@@ -231,20 +233,25 @@ class EnterpriseBeanBuilder {
}
- final Map<EntityManagerFactory, Map> extendedEntityManagerFactories = new HashMap<EntityManagerFactory, Map>();
+ final Map<EntityManagerFactory, BeanContext.EntityManagerConfiguration> extendedEntityManagerFactories = new HashMap<>();
for (final PersistenceContextReferenceInfo info : statefulBeanInfo.jndiEnc.persistenceContextRefs) {
if (info.extended) {
try {
final ContainerSystem containerSystem = SystemInstance.get().getComponent(ContainerSystem.class);
final Object o = containerSystem.getJNDIContext().lookup(PersistenceBuilder.getOpenEJBJndiName(info.unitId));
- extendedEntityManagerFactories.put((EntityManagerFactory) o, info.properties);
+ final EntityManagerFactory emf = EntityManagerFactory.class.cast(o);
+ extendedEntityManagerFactories.put(
+ emf,
+ new BeanContext.EntityManagerConfiguration(
+ info.properties,
+ JtaEntityManager.isJPA21(emf) && info.synchronizationType != null ? SynchronizationType.valueOf(info.synchronizationType) : null));
} catch (final NamingException e) {
throw new OpenEJBException("PersistenceUnit '" + info.unitId + "' not found for EXTENDED ref '" + info.referenceName + "'");
}
}
}
- deployment.setExtendedEntityManagerFactories(new Index<EntityManagerFactory, Map>(extendedEntityManagerFactories));
+ deployment.setExtendedEntityManagerFactories(new Index<>(extendedEntityManagerFactories));
}
if (ejbType.isSession() || ejbType.isMessageDriven()) {
http://git-wip-us.apache.org/repos/asf/tomee/blob/d1a17c6a/container/openejb-core/src/main/java/org/apache/openejb/core/managed/Instance.java
----------------------------------------------------------------------
diff --git a/container/openejb-core/src/main/java/org/apache/openejb/core/managed/Instance.java b/container/openejb-core/src/main/java/org/apache/openejb/core/managed/Instance.java
index ff4ac41..e02456b 100644
--- a/container/openejb-core/src/main/java/org/apache/openejb/core/managed/Instance.java
+++ b/container/openejb-core/src/main/java/org/apache/openejb/core/managed/Instance.java
@@ -124,9 +124,10 @@ public class Instance implements Serializable {
}
}
- public synchronized Map<EntityManagerFactory, JtaEntityManagerRegistry.EntityManagerTracker> getEntityManagers(final Index<EntityManagerFactory, Map> factories) {
+ public synchronized Map<EntityManagerFactory, JtaEntityManagerRegistry.EntityManagerTracker> getEntityManagers(
+ final Index<EntityManagerFactory, BeanContext.EntityManagerConfiguration> factories) {
if (entityManagers == null && entityManagerArray != null) {
- entityManagers = new HashMap<EntityManagerFactory, JtaEntityManagerRegistry.EntityManagerTracker>();
+ entityManagers = new HashMap<>();
for (int i = 0; i < entityManagerArray.length; i++) {
final EntityManagerFactory entityManagerFactory = factories.getKey(i);
final JtaEntityManagerRegistry.EntityManagerTracker entityManager = entityManagerArray[i];
http://git-wip-us.apache.org/repos/asf/tomee/blob/d1a17c6a/container/openejb-core/src/main/java/org/apache/openejb/core/managed/ManagedContainer.java
----------------------------------------------------------------------
diff --git a/container/openejb-core/src/main/java/org/apache/openejb/core/managed/ManagedContainer.java b/container/openejb-core/src/main/java/org/apache/openejb/core/managed/ManagedContainer.java
index 9bc1c99..b0bbfc6 100644
--- a/container/openejb-core/src/main/java/org/apache/openejb/core/managed/ManagedContainer.java
+++ b/container/openejb-core/src/main/java/org/apache/openejb/core/managed/ManagedContainer.java
@@ -69,6 +69,7 @@ import javax.naming.Context;
import javax.naming.NamingException;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
+import javax.persistence.SynchronizationType;
import javax.transaction.Transaction;
import java.lang.reflect.Method;
import java.rmi.NoSuchObjectException;
@@ -776,18 +777,25 @@ public class ManagedContainer implements RpcContainer {
private Index<EntityManagerFactory, JtaEntityManagerRegistry.EntityManagerTracker> createEntityManagers(final BeanContext beanContext) {
// create the extended entity managers
- final Index<EntityManagerFactory, Map> factories = beanContext.getExtendedEntityManagerFactories();
+ final Index<EntityManagerFactory, BeanContext.EntityManagerConfiguration> factories = beanContext.getExtendedEntityManagerFactories();
Index<EntityManagerFactory, JtaEntityManagerRegistry.EntityManagerTracker> entityManagers = null;
if (factories != null && factories.size() > 0) {
entityManagers = new Index<EntityManagerFactory, JtaEntityManagerRegistry.EntityManagerTracker>(new ArrayList<EntityManagerFactory>(factories.keySet()));
- for (final Map.Entry<EntityManagerFactory, Map> entry : factories.entrySet()) {
+ for (final Map.Entry<EntityManagerFactory, BeanContext.EntityManagerConfiguration> entry : factories.entrySet()) {
final EntityManagerFactory entityManagerFactory = entry.getKey();
- final Map properties = entry.getValue();
JtaEntityManagerRegistry.EntityManagerTracker entityManagerTracker = entityManagerRegistry.getInheritedEntityManager(entityManagerFactory);
final EntityManager entityManager;
if (entityManagerTracker == null) {
- if (properties != null) {
+ final SynchronizationType synchronizationType = entry.getValue().getSynchronizationType();
+ final Map properties = entry.getValue().getProperties();
+ if (synchronizationType != null) {
+ if (properties != null) {
+ entityManager = entityManagerFactory.createEntityManager(synchronizationType, properties);
+ } else {
+ entityManager = entityManagerFactory.createEntityManager(synchronizationType);
+ }
+ } else if (properties != null) {
entityManager = entityManagerFactory.createEntityManager(properties);
} else {
entityManager = entityManagerFactory.createEntityManager();
@@ -810,7 +818,7 @@ public class ManagedContainer implements RpcContainer {
final BeanContext beanContext = callContext.getBeanContext();
// get the factories
- final Index<EntityManagerFactory, Map> factories = beanContext.getExtendedEntityManagerFactories();
+ final Index<EntityManagerFactory, BeanContext.EntityManagerConfiguration> factories = beanContext.getExtendedEntityManagerFactories();
if (factories == null) {
return;
}
http://git-wip-us.apache.org/repos/asf/tomee/blob/d1a17c6a/container/openejb-core/src/main/java/org/apache/openejb/core/stateful/Instance.java
----------------------------------------------------------------------
diff --git a/container/openejb-core/src/main/java/org/apache/openejb/core/stateful/Instance.java b/container/openejb-core/src/main/java/org/apache/openejb/core/stateful/Instance.java
index 815922d..0e6b6f1 100644
--- a/container/openejb-core/src/main/java/org/apache/openejb/core/stateful/Instance.java
+++ b/container/openejb-core/src/main/java/org/apache/openejb/core/stateful/Instance.java
@@ -133,9 +133,10 @@ public class Instance implements Serializable, Cache.TimeOut {
}
}
- public synchronized Map<EntityManagerFactory, JtaEntityManagerRegistry.EntityManagerTracker> getEntityManagers(final Index<EntityManagerFactory, Map> factories) {
+ public synchronized Map<EntityManagerFactory, JtaEntityManagerRegistry.EntityManagerTracker> getEntityManagers(
+ final Index<EntityManagerFactory, BeanContext.EntityManagerConfiguration> factories) {
if (entityManagers == null && entityManagerArray != null) {
- entityManagers = new HashMap<EntityManagerFactory, JtaEntityManagerRegistry.EntityManagerTracker>();
+ entityManagers = new HashMap<>();
for (int i = 0; i < entityManagerArray.length; i++) {
final EntityManagerFactory entityManagerFactory = factories.getKey(i);
final JtaEntityManagerRegistry.EntityManagerTracker entityManager = entityManagerArray[i];
http://git-wip-us.apache.org/repos/asf/tomee/blob/d1a17c6a/container/openejb-core/src/main/java/org/apache/openejb/core/stateful/StatefulContainer.java
----------------------------------------------------------------------
diff --git a/container/openejb-core/src/main/java/org/apache/openejb/core/stateful/StatefulContainer.java b/container/openejb-core/src/main/java/org/apache/openejb/core/stateful/StatefulContainer.java
index 4df52fd..7a5f6ee 100644
--- a/container/openejb-core/src/main/java/org/apache/openejb/core/stateful/StatefulContainer.java
+++ b/container/openejb-core/src/main/java/org/apache/openejb/core/stateful/StatefulContainer.java
@@ -73,6 +73,7 @@ import javax.naming.Context;
import javax.naming.NamingException;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
+import javax.persistence.SynchronizationType;
import javax.transaction.Transaction;
import java.io.Serializable;
import java.lang.reflect.Method;
@@ -381,7 +382,7 @@ public class StatefulContainer implements RpcContainer {
if (preventExtendedEntityManagerSerialization) {
return true;
}
- final Index<EntityManagerFactory, Map> factories = beanContext.getExtendedEntityManagerFactories();
+ final Index<EntityManagerFactory, BeanContext.EntityManagerConfiguration> factories = beanContext.getExtendedEntityManagerFactories();
return !(factories != null && factories.size() > 0) && beanContext.isPassivable();
}
@@ -889,18 +890,25 @@ public class StatefulContainer implements RpcContainer {
private Index<EntityManagerFactory, JtaEntityManagerRegistry.EntityManagerTracker> createEntityManagers(final BeanContext beanContext) {
// create the extended entity managers
- final Index<EntityManagerFactory, Map> factories = beanContext.getExtendedEntityManagerFactories();
+ final Index<EntityManagerFactory, BeanContext.EntityManagerConfiguration> factories = beanContext.getExtendedEntityManagerFactories();
Index<EntityManagerFactory, JtaEntityManagerRegistry.EntityManagerTracker> entityManagers = null;
if (factories != null && factories.size() > 0) {
- entityManagers = new Index<EntityManagerFactory, JtaEntityManagerRegistry.EntityManagerTracker>(new ArrayList<EntityManagerFactory>(factories.keySet()));
- for (final Map.Entry<EntityManagerFactory, Map> entry : factories.entrySet()) {
+ entityManagers = new Index<>(new ArrayList<>(factories.keySet()));
+ for (final Map.Entry<EntityManagerFactory, BeanContext.EntityManagerConfiguration> entry : factories.entrySet()) {
final EntityManagerFactory entityManagerFactory = entry.getKey();
- final Map properties = entry.getValue();
JtaEntityManagerRegistry.EntityManagerTracker entityManagerTracker = entityManagerRegistry.getInheritedEntityManager(entityManagerFactory);
final EntityManager entityManager;
if (entityManagerTracker == null) {
- if (properties != null) {
+ final Map properties = entry.getValue().getProperties();
+ final SynchronizationType synchronizationType = entry.getValue().getSynchronizationType();
+ if (synchronizationType != null) {
+ if (properties != null) {
+ entityManager = entityManagerFactory.createEntityManager(synchronizationType, properties);
+ } else {
+ entityManager = entityManagerFactory.createEntityManager(synchronizationType);
+ }
+ } else if (properties != null) {
entityManager = entityManagerFactory.createEntityManager(properties);
} else {
entityManager = entityManagerFactory.createEntityManager();
@@ -923,7 +931,7 @@ public class StatefulContainer implements RpcContainer {
final BeanContext beanContext = callContext.getBeanContext();
// get the factories
- final Index<EntityManagerFactory, Map> factories = beanContext.getExtendedEntityManagerFactories();
+ final Index<EntityManagerFactory, BeanContext.EntityManagerConfiguration> factories = beanContext.getExtendedEntityManagerFactories();
if (factories == null) {
return;
}
http://git-wip-us.apache.org/repos/asf/tomee/blob/d1a17c6a/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 918331b..208f6d5 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
@@ -118,7 +118,7 @@ public class JtaEntityManager implements EntityManager, Serializable {
this.wrapNoTxQueries = wrapConfig == null || "true".equalsIgnoreCase(wrapConfig);
}
- private static boolean isJPA21(final EntityManagerFactory entityManagerFactory) {
+ public static boolean isJPA21(final EntityManagerFactory entityManagerFactory) {
return ReloadableEntityManagerFactory.class.isInstance(entityManagerFactory) ?
isJPA21(ReloadableEntityManagerFactory.class.cast(entityManagerFactory).getDelegate())
: hasMethod(entityManagerFactory, "createEntityManager", SynchronizationType.class);
http://git-wip-us.apache.org/repos/asf/tomee/blob/d1a17c6a/container/openejb-core/src/test/java/org/apache/openejb/cdi/ProducedExtendedEmTest.java
----------------------------------------------------------------------
diff --git a/container/openejb-core/src/test/java/org/apache/openejb/cdi/ProducedExtendedEmTest.java b/container/openejb-core/src/test/java/org/apache/openejb/cdi/ProducedExtendedEmTest.java
index 2533625..d1c35d5 100644
--- a/container/openejb-core/src/test/java/org/apache/openejb/cdi/ProducedExtendedEmTest.java
+++ b/container/openejb-core/src/test/java/org/apache/openejb/cdi/ProducedExtendedEmTest.java
@@ -96,11 +96,13 @@ public class ProducedExtendedEmTest {
private A a;
@Test
- @Ignore("will be done thanks to OWB new impl")
public void checkEm() {
try {
a.getDelegateClassName();
} catch (final EJBException ee) {
+ // an entity manager should already be registered for this extended persistence unit
+ // valid since we dont call it in the context of the stateful
+ // note: we could enhance it later if needed
assertNotNull(ee);
assertThat(ee.getCause(), instanceOf(IllegalStateException.class));
}