Author: timothyjward
Date: Wed Aug 17 11:09:04 2016
New Revision: 1756612

URL: http://svn.apache.org/viewvc?rev=1756612&view=rev
Log:
[tx-control] Ensure that the same ThreadLocal is used for all resources created 
by an XA JPAEntityManagerProvider

Modified:
    aries/trunk/tx-control/tx-control-jpa-itests/pom.xml
    
aries/trunk/tx-control/tx-control-jpa-itests/src/test/java/org/apache/aries/tx/control/itests/XAJPATransactionTest.java
    
aries/trunk/tx-control/tx-control-provider-jpa-xa/src/main/java/org/apache/aries/tx/control/jpa/xa/impl/JPAEntityManagerProviderFactoryImpl.java
    
aries/trunk/tx-control/tx-control-provider-jpa-xa/src/main/java/org/apache/aries/tx/control/jpa/xa/impl/ManagedJPAEMFLocator.java

Modified: aries/trunk/tx-control/tx-control-jpa-itests/pom.xml
URL: 
http://svn.apache.org/viewvc/aries/trunk/tx-control/tx-control-jpa-itests/pom.xml?rev=1756612&r1=1756611&r2=1756612&view=diff
==============================================================================
--- aries/trunk/tx-control/tx-control-jpa-itests/pom.xml (original)
+++ aries/trunk/tx-control/tx-control-jpa-itests/pom.xml Wed Aug 17 11:09:04 
2016
@@ -106,6 +106,18 @@
             <version>1.0.0</version>
             <scope>test</scope>
         </dependency>
+        <dependency>
+            <groupId>org.osgi</groupId>
+            <artifactId>org.osgi.util.function</artifactId>
+            <version>1.0.0</version>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.osgi</groupId>
+            <artifactId>org.osgi.util.promise</artifactId>
+            <version>1.0.0</version>
+            <scope>test</scope>
+        </dependency>
                <dependency>
                        <groupId>com.h2database</groupId>
                        <artifactId>h2</artifactId>

Modified: 
aries/trunk/tx-control/tx-control-jpa-itests/src/test/java/org/apache/aries/tx/control/itests/XAJPATransactionTest.java
URL: 
http://svn.apache.org/viewvc/aries/trunk/tx-control/tx-control-jpa-itests/src/test/java/org/apache/aries/tx/control/itests/XAJPATransactionTest.java?rev=1756612&r1=1756611&r2=1756612&view=diff
==============================================================================
--- 
aries/trunk/tx-control/tx-control-jpa-itests/src/test/java/org/apache/aries/tx/control/itests/XAJPATransactionTest.java
 (original)
+++ 
aries/trunk/tx-control/tx-control-jpa-itests/src/test/java/org/apache/aries/tx/control/itests/XAJPATransactionTest.java
 Wed Aug 17 11:09:04 2016
@@ -71,6 +71,7 @@ import org.osgi.service.jpa.EntityManage
 import org.osgi.service.transaction.control.TransactionControl;
 import org.osgi.service.transaction.control.TransactionRolledBackException;
 import org.osgi.service.transaction.control.jpa.JPAEntityManagerProvider;
+import org.osgi.util.promise.Deferred;
 import org.osgi.util.tracker.ServiceTracker;
 
 @RunWith(PaxExam.class)
@@ -243,6 +244,8 @@ public abstract class XAJPATransactionTe
                                
.useOptions(CoreOptions.vmOption("-Dorg.ops4j.pax.url.mvn.localRepository=" + 
localRepo)),
                                mavenBundle("org.apache.aries.tx-control", 
"tx-control-service-xa").versionAsInProject(),
                                mavenBundle("com.h2database", 
"h2").versionAsInProject(),
+                               mavenBundle("org.osgi", 
"org.osgi.util.function").versionAsInProject(),
+                               mavenBundle("org.osgi", 
"org.osgi.util.promise").versionAsInProject(),
                                mavenBundle("org.apache.aries.tx-control", 
"tx-control-provider-jpa-xa").versionAsInProject(),
                                jpaProvider(),
                                ariesJPAVersion(),
@@ -351,6 +354,50 @@ public abstract class XAJPATransactionTe
                }));
        }
        
+       @Test
+       public void testSeparateThreadActivation() throws Exception {
+               Object m1 = getMessageEntityFrom(XA_TEST_UNIT_1);
+               Object m2 = getMessageEntityFrom(XA_TEST_UNIT_2);
+
+               txControl.required(() -> {
+                       setMessage(m1, "Hello World!");
+                       
+                       em1.persist(m1);
+
+                       setMessage(m2, "Hello 1!");
+                       
+                       em2.persist(m2);
+                       
+                       return null;
+               });
+               
+               Deferred<String> d = new Deferred<>();
+               
+               new Thread(() -> {
+                               try {
+                                       d.resolve(txControl.notSupported(() -> 
+                                               
getMessage(em1.find(m1.getClass(), getId(m1)))));
+                               } catch (Exception e) {
+                                       d.fail(e);
+                               }
+                       }).start();
+               
+               assertEquals("Hello World!", d.getPromise().getValue());
+
+               Deferred<String> d2 = new Deferred<>();
+               
+               new Thread(() -> {
+                               try {
+                                       d2.resolve(txControl.notSupported(() -> 
+                                               
getMessage(em2.find(m2.getClass(), getId(m2)))));
+                               } catch (Exception e) {
+                                       d2.fail(e);
+                               }
+                       }).start();
+               
+               assertEquals("Hello 1!", d2.getPromise().getValue());
+       }
+       
        Object getMessageEntityFrom(String unit) throws Exception {
                Class<?> clz = Arrays.stream(context.getBundles())
                                        .filter(b -> 
unit.equals(b.getSymbolicName()))

Modified: 
aries/trunk/tx-control/tx-control-provider-jpa-xa/src/main/java/org/apache/aries/tx/control/jpa/xa/impl/JPAEntityManagerProviderFactoryImpl.java
URL: 
http://svn.apache.org/viewvc/aries/trunk/tx-control/tx-control-provider-jpa-xa/src/main/java/org/apache/aries/tx/control/jpa/xa/impl/JPAEntityManagerProviderFactoryImpl.java?rev=1756612&r1=1756611&r2=1756612&view=diff
==============================================================================
--- 
aries/trunk/tx-control/tx-control-provider-jpa-xa/src/main/java/org/apache/aries/tx/control/jpa/xa/impl/JPAEntityManagerProviderFactoryImpl.java
 (original)
+++ 
aries/trunk/tx-control/tx-control-provider-jpa-xa/src/main/java/org/apache/aries/tx/control/jpa/xa/impl/JPAEntityManagerProviderFactoryImpl.java
 Wed Aug 17 11:09:04 2016
@@ -52,15 +52,18 @@ public class JPAEntityManagerProviderFac
        @Override
        public JPAEntityManagerProvider 
getProviderFor(EntityManagerFactoryBuilder emfb, Map<String, Object> 
jpaProperties,
                        Map<String, Object> resourceProviderProperties) {
-               return new DelayedJPAEntityManagerProvider(tx -> {
-                               Map<String, Object> toUse;
-                               if(checkEnlistment(resourceProviderProperties)) 
{
-                                       toUse = enlistDataSource(tx, 
jpaProperties);
-                               } else {
-                                       toUse = jpaProperties;
-                               }
-                               return tx.get().notSupported(() -> 
internalBuilderCreate(emfb, toUse, tx));
-                       });
+               return new DelayedJPAEntityManagerProvider(tx -> 
getProviderFor(emfb, jpaProperties, resourceProviderProperties, tx));
+       }
+
+       public JPAEntityManagerProvider 
getProviderFor(EntityManagerFactoryBuilder emfb, Map<String, Object> 
jpaProperties,
+               Map<String, Object> resourceProviderProperties, 
ThreadLocal<TransactionControl> localStore) {
+               Map<String, Object> toUse;
+               if(checkEnlistment(resourceProviderProperties)) {
+                       toUse = enlistDataSource(localStore, jpaProperties);
+               } else {
+                       toUse = jpaProperties;
+               }
+               return localStore.get().notSupported(() -> 
internalBuilderCreate(emfb, toUse, localStore));
        }
 
        private Map<String, Object> 
enlistDataSource(ThreadLocal<TransactionControl> tx, Map<String, Object> 
jpaProperties) {

Modified: 
aries/trunk/tx-control/tx-control-provider-jpa-xa/src/main/java/org/apache/aries/tx/control/jpa/xa/impl/ManagedJPAEMFLocator.java
URL: 
http://svn.apache.org/viewvc/aries/trunk/tx-control/tx-control-provider-jpa-xa/src/main/java/org/apache/aries/tx/control/jpa/xa/impl/ManagedJPAEMFLocator.java?rev=1756612&r1=1756611&r2=1756612&view=diff
==============================================================================
--- 
aries/trunk/tx-control/tx-control-provider-jpa-xa/src/main/java/org/apache/aries/tx/control/jpa/xa/impl/ManagedJPAEMFLocator.java
 (original)
+++ 
aries/trunk/tx-control/tx-control-provider-jpa-xa/src/main/java/org/apache/aries/tx/control/jpa/xa/impl/ManagedJPAEMFLocator.java
 Wed Aug 17 11:09:04 2016
@@ -119,7 +119,7 @@ public class ManagedJPAEMFLocator implem
                                        setupTransactionManager(jpaProps, 
providerProps, t, reference);
                                        
                                        return new 
JPAEntityManagerProviderFactoryImpl().getProviderFor(service,
-                                                       jpaProps, 
providerProps);
+                                                       jpaProps, 
providerProps, t);
                                });
                                ServiceRegistration<JPAEntityManagerProvider> 
reg = context
                                                
.registerService(JPAEntityManagerProvider.class, jpaEM, getServiceProperties());


Reply via email to