Repository: tomee
Updated Branches:
  refs/heads/master f3f3c7b9f -> 3bf595f3c


persistence synchronization parameter


Project: http://git-wip-us.apache.org/repos/asf/tomee/repo
Commit: http://git-wip-us.apache.org/repos/asf/tomee/commit/dc66eb50
Tree: http://git-wip-us.apache.org/repos/asf/tomee/tree/dc66eb50
Diff: http://git-wip-us.apache.org/repos/asf/tomee/diff/dc66eb50

Branch: refs/heads/master
Commit: dc66eb500fc72e6c245fa4888cff8b4572a018ad
Parents: f3f3c7b
Author: Romain Manni-Bucau <[email protected]>
Authored: Wed Apr 8 00:05:53 2015 +0200
Committer: Romain Manni-Bucau <[email protected]>
Committed: Wed Apr 8 00:05:53 2015 +0200

----------------------------------------------------------------------
 .../assembler/classic/JndiEncBuilder.java       |  3 ++-
 .../PersistenceContextReferenceInfo.java        |  1 +
 .../openejb/config/JndiEncInfoBuilder.java      |  1 +
 .../openejb/persistence/JtaEntityManager.java   | 14 ++++++++---
 .../persistence/JtaEntityManagerRegistry.java   | 17 ++++++++++---
 .../openejb/jee/PersistenceContextRef$JAXB.java | 17 +++++++++++++
 .../openejb/jee/PersistenceContextRef.java      | 10 ++++++++
 .../jee/PersistenceContextSynchronization.java  | 26 ++++++++++++++++++++
 .../tomee/catalina/TomcatJndiBuilder.java       |  2 +-
 9 files changed, 82 insertions(+), 9 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/tomee/blob/dc66eb50/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/JndiEncBuilder.java
----------------------------------------------------------------------
diff --git 
a/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/JndiEncBuilder.java
 
b/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/JndiEncBuilder.java
index ab1142c..ac37574 100644
--- 
a/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/JndiEncBuilder.java
+++ 
b/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/JndiEncBuilder.java
@@ -429,7 +429,8 @@ public class JndiEncBuilder {
                 throw new OpenEJBException("PersistenceUnit '" + 
contextInfo.unitId + "' not found for EXTENDED ref '" + 
contextInfo.referenceName + "'");
             }
 
-            final JtaEntityManager jtaEntityManager = new 
JtaEntityManager(contextInfo.persistenceUnitName, jtaEntityManagerRegistry, 
factory, contextInfo.properties, contextInfo.extended);
+            final JtaEntityManager jtaEntityManager = new JtaEntityManager(
+                    contextInfo.persistenceUnitName, jtaEntityManagerRegistry, 
factory, contextInfo.properties, contextInfo.extended, 
contextInfo.synchronizationType);
             final Reference reference = new 
PersistenceContextReference(jtaEntityManager);
             bindings.put(normalize(contextInfo.referenceName), reference);
         }

http://git-wip-us.apache.org/repos/asf/tomee/blob/dc66eb50/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/PersistenceContextReferenceInfo.java
----------------------------------------------------------------------
diff --git 
a/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/PersistenceContextReferenceInfo.java
 
b/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/PersistenceContextReferenceInfo.java
index 00b98dd..2a68748 100644
--- 
a/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/PersistenceContextReferenceInfo.java
+++ 
b/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/PersistenceContextReferenceInfo.java
@@ -26,6 +26,7 @@ public class PersistenceContextReferenceInfo extends 
InjectableInfo {
     public String persistenceUnitName;
     public String unitId;
     public boolean extended;
+    public String synchronizationType;
     public final Properties properties = new Properties();
 
 }

http://git-wip-us.apache.org/repos/asf/tomee/blob/dc66eb50/container/openejb-core/src/main/java/org/apache/openejb/config/JndiEncInfoBuilder.java
----------------------------------------------------------------------
diff --git 
a/container/openejb-core/src/main/java/org/apache/openejb/config/JndiEncInfoBuilder.java
 
b/container/openejb-core/src/main/java/org/apache/openejb/config/JndiEncInfoBuilder.java
index 2b57c46..223a2d3 100644
--- 
a/container/openejb-core/src/main/java/org/apache/openejb/config/JndiEncInfoBuilder.java
+++ 
b/container/openejb-core/src/main/java/org/apache/openejb/config/JndiEncInfoBuilder.java
@@ -269,6 +269,7 @@ public class JndiEncInfoBuilder {
             final PersistenceContextReferenceInfo info = new 
PersistenceContextReferenceInfo();
             info.referenceName = contextRef.getPersistenceContextRefName();
             info.persistenceUnitName = contextRef.getPersistenceUnitName();
+            info.synchronizationType = 
contextRef.getPersistenceContextSynchronization() != null ? 
contextRef.getPersistenceContextSynchronization().name() : null;
             info.unitId = contextRef.getMappedName();
             info.location = buildLocationInfo(contextRef);
             info.extended = contextRef.getPersistenceContextType() == 
PersistenceContextType.EXTENDED;

http://git-wip-us.apache.org/repos/asf/tomee/blob/dc66eb50/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 e5bfced..deac5a0 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
@@ -32,6 +32,7 @@ import javax.persistence.FlushModeType;
 import javax.persistence.LockModeType;
 import javax.persistence.Query;
 import javax.persistence.StoredProcedureQuery;
+import javax.persistence.SynchronizationType;
 import javax.persistence.TransactionRequiredException;
 import javax.persistence.TypedQuery;
 import javax.persistence.criteria.CriteriaBuilder;
@@ -44,6 +45,7 @@ import java.io.Serializable;
 import java.lang.reflect.InvocationTargetException;
 import java.lang.reflect.Method;
 import java.util.List;
+import java.util.Locale;
 import java.util.Map;
 import java.util.concurrent.TimeUnit;
 
@@ -76,15 +78,18 @@ public class JtaEntityManager implements EntityManager, 
Serializable {
     private final EntityManagerFactory entityManagerFactory;
     private final Map properties;
     private final boolean extended;
+    private final SynchronizationType synchronizationType;
     private final String unitName;
     private final Logger logger;
     private final boolean wrapNoTxQueries;
 
-    public JtaEntityManager(final JtaEntityManagerRegistry registry, final 
EntityManagerFactory entityManagerFactory, final Map properties, final String 
unitName) {
-        this(unitName, registry, entityManagerFactory, properties, false);
+    public JtaEntityManager(final JtaEntityManagerRegistry registry, final 
EntityManagerFactory entityManagerFactory,
+                            final Map properties, final String unitName, final 
String synchronizationType) {
+        this(unitName, registry, entityManagerFactory, properties, false, 
synchronizationType);
     }
 
-    public JtaEntityManager(final String unitName, final 
JtaEntityManagerRegistry registry, final EntityManagerFactory 
entityManagerFactory, final Map properties, final boolean extended) {
+    public JtaEntityManager(final String unitName, final 
JtaEntityManagerRegistry registry, final EntityManagerFactory 
entityManagerFactory,
+                            final Map properties, final boolean extended, 
final String synchronizationType) {
         if (registry == null) {
             throw new NullPointerException("registry is null");
         }
@@ -96,6 +101,7 @@ 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));
         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";
@@ -103,7 +109,7 @@ public class JtaEntityManager implements EntityManager, 
Serializable {
     }
 
     EntityManager getEntityManager() {
-        return registry.getEntityManager(entityManagerFactory, properties, 
extended, unitName);
+        return registry.getEntityManager(entityManagerFactory, properties, 
extended, unitName, synchronizationType);
     }
 
     boolean isTransactionActive() {

http://git-wip-us.apache.org/repos/asf/tomee/blob/dc66eb50/container/openejb-core/src/main/java/org/apache/openejb/persistence/JtaEntityManagerRegistry.java
----------------------------------------------------------------------
diff --git 
a/container/openejb-core/src/main/java/org/apache/openejb/persistence/JtaEntityManagerRegistry.java
 
b/container/openejb-core/src/main/java/org/apache/openejb/persistence/JtaEntityManagerRegistry.java
index c87c00e..082303b 100644
--- 
a/container/openejb-core/src/main/java/org/apache/openejb/persistence/JtaEntityManagerRegistry.java
+++ 
b/container/openejb-core/src/main/java/org/apache/openejb/persistence/JtaEntityManagerRegistry.java
@@ -24,6 +24,7 @@ import org.apache.openejb.util.Logger;
 
 import javax.persistence.EntityManager;
 import javax.persistence.EntityManagerFactory;
+import javax.persistence.SynchronizationType;
 import javax.persistence.TransactionRequiredException;
 import javax.transaction.Status;
 import javax.transaction.Synchronization;
@@ -81,7 +82,9 @@ public class JtaEntityManagerRegistry {
      *                               instance already registered
      */
     @Geronimo
-    public EntityManager getEntityManager(final EntityManagerFactory 
entityManagerFactory, final Map properties, final boolean extended, final 
String unitName) throws IllegalStateException {
+    public EntityManager getEntityManager(final EntityManagerFactory 
entityManagerFactory,
+                                          final Map properties, final boolean 
extended, final String unitName,
+                                          final SynchronizationType 
synchronizationType) throws IllegalStateException {
         if (entityManagerFactory == null) {
             throw new NullPointerException("entityManagerFactory is null");
         }
@@ -106,7 +109,9 @@ public class JtaEntityManagerRegistry {
 
             // if transaction is active, we need to register the entity 
manager with the transaction manager
             if (transactionActive) {
-                entityManager.joinTransaction();
+                if (synchronizationType != SynchronizationType.UNSYNCHRONIZED) 
{
+                    entityManager.joinTransaction();
+                }
                 transactionRegistry.putResource(txKey, entityManager);
             }
 
@@ -115,7 +120,13 @@ public class JtaEntityManagerRegistry {
 
             // create a new entity manager
             final EntityManager entityManager;
-            if (properties != null) {
+            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();

http://git-wip-us.apache.org/repos/asf/tomee/blob/dc66eb50/container/openejb-jee-accessors/src/main/java/org/apache/openejb/jee/PersistenceContextRef$JAXB.java
----------------------------------------------------------------------
diff --git 
a/container/openejb-jee-accessors/src/main/java/org/apache/openejb/jee/PersistenceContextRef$JAXB.java
 
b/container/openejb-jee-accessors/src/main/java/org/apache/openejb/jee/PersistenceContextRef$JAXB.java
index a636776..8850bf3 100644
--- 
a/container/openejb-jee-accessors/src/main/java/org/apache/openejb/jee/PersistenceContextRef$JAXB.java
+++ 
b/container/openejb-jee-accessors/src/main/java/org/apache/openejb/jee/PersistenceContextRef$JAXB.java
@@ -146,6 +146,12 @@ public class PersistenceContextRef$JAXB
                 if (persistenceContextType != null) {
                     persistenceContextRef.persistenceContextType = 
persistenceContextType;
                 }
+            } else if (("persistence-context-synchronization" == 
elementReader.getLocalName()) && ("http://java.sun.com/xml/ns/javaee"; == 
elementReader.getNamespaceURI())) {
+                // ELEMENT: persistenceContextType
+                final PersistenceContextSynchronization synchronization = 
parsePersistenceContextSynchronization(elementReader, context, 
elementReader.getElementAsString());
+                if (synchronization != null) {
+                    persistenceContextRef.persistenceContextSynchronization = 
synchronization;
+                }
             } else if (("persistence-property" == 
elementReader.getLocalName()) && ("http://java.sun.com/xml/ns/javaee"; == 
elementReader.getNamespaceURI())) {
                 // ELEMENT: persistenceProperty
                 final Property persistencePropertyItem = 
readProperty(elementReader, context);
@@ -372,4 +378,15 @@ public class PersistenceContextRef$JAXB
         context.afterMarshal(persistenceContextRef, LifecycleCallback.NONE);
     }
 
+    // should be in PersistenceContextSynchronization$JAXB but no need to 
generate the full sxc bean since we only need it here for now
+    public static PersistenceContextSynchronization 
parsePersistenceContextSynchronization(final XoXMLStreamReader reader, final 
RuntimeContext context, final String value)
+            throws Exception {
+        if ("Synchronized".equals(value)) {
+            return PersistenceContextSynchronization.SYNCHRONIZED;
+        } else if ("Unsynchronized".equals(value)) {
+            return PersistenceContextSynchronization.UNSYNCHRONIZED;
+        }
+        context.unexpectedEnumValue(reader, PersistenceContextType.class, 
value, "Synchronized", "Unsynchronized");
+        return null;
+    }
 }

http://git-wip-us.apache.org/repos/asf/tomee/blob/dc66eb50/container/openejb-jee/src/main/java/org/apache/openejb/jee/PersistenceContextRef.java
----------------------------------------------------------------------
diff --git 
a/container/openejb-jee/src/main/java/org/apache/openejb/jee/PersistenceContextRef.java
 
b/container/openejb-jee/src/main/java/org/apache/openejb/jee/PersistenceContextRef.java
index 5912fe2..b664fa4 100644
--- 
a/container/openejb-jee/src/main/java/org/apache/openejb/jee/PersistenceContextRef.java
+++ 
b/container/openejb-jee/src/main/java/org/apache/openejb/jee/PersistenceContextRef.java
@@ -80,6 +80,8 @@ public class PersistenceContextRef implements JndiReference, 
PersistenceRef {
     protected String persistenceUnitName;
     @XmlElement(name = "persistence-context-type")
     protected PersistenceContextType persistenceContextType;
+    @XmlElement(name = "persistence-context-synchronization")
+    protected PersistenceContextSynchronization 
persistenceContextSynchronization;
     @XmlElement(name = "persistence-property", required = true)
     protected List<Property> persistenceProperty;
     @XmlElement(name = "mapped-name")
@@ -212,6 +214,14 @@ public class PersistenceContextRef implements 
JndiReference, PersistenceRef {
         this.persistenceContextType = value;
     }
 
+    public PersistenceContextSynchronization 
getPersistenceContextSynchronization() {
+        return persistenceContextSynchronization;
+    }
+
+    public void 
setPersistenceContextSynchronization(PersistenceContextSynchronization 
persistenceContextSynchronization) {
+        this.persistenceContextSynchronization = 
persistenceContextSynchronization;
+    }
+
     public List<Property> getPersistenceProperty() {
         if (persistenceProperty == null) {
             persistenceProperty = new ArrayList<Property>();

http://git-wip-us.apache.org/repos/asf/tomee/blob/dc66eb50/container/openejb-jee/src/main/java/org/apache/openejb/jee/PersistenceContextSynchronization.java
----------------------------------------------------------------------
diff --git 
a/container/openejb-jee/src/main/java/org/apache/openejb/jee/PersistenceContextSynchronization.java
 
b/container/openejb-jee/src/main/java/org/apache/openejb/jee/PersistenceContextSynchronization.java
new file mode 100644
index 0000000..b90cf70
--- /dev/null
+++ 
b/container/openejb-jee/src/main/java/org/apache/openejb/jee/PersistenceContextSynchronization.java
@@ -0,0 +1,26 @@
+/**
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
+ */
+
+package org.apache.openejb.jee;
+
+import javax.xml.bind.annotation.XmlEnumValue;
+
+public enum PersistenceContextSynchronization {
+    @XmlEnumValue("Synchronized")SYNCHRONIZED,
+    @XmlEnumValue("Unsynchronized")UNSYNCHRONIZED;
+}

http://git-wip-us.apache.org/repos/asf/tomee/blob/dc66eb50/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/TomcatJndiBuilder.java
----------------------------------------------------------------------
diff --git 
a/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/TomcatJndiBuilder.java
 
b/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/TomcatJndiBuilder.java
index 8baa4e4..cb8c774 100644
--- 
a/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/TomcatJndiBuilder.java
+++ 
b/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/TomcatJndiBuilder.java
@@ -557,7 +557,7 @@ public class TomcatJndiBuilder {
             }
 
             final JtaEntityManagerRegistry jtaEntityManagerRegistry = 
SystemInstance.get().getComponent(JtaEntityManagerRegistry.class);
-            setResource(resource, new 
JtaEntityManager(ref.persistenceUnitName, jtaEntityManagerRegistry, factory, 
ref.properties, ref.extended));
+            setResource(resource, new 
JtaEntityManager(ref.persistenceUnitName, jtaEntityManagerRegistry, factory, 
ref.properties, ref.extended, ref.synchronizationType));
         }
 
         if (addEntry) {

Reply via email to