You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@tapestry.apache.org by th...@apache.org on 2018/12/06 01:45:19 UTC

tapestry-5 git commit: Revert "TAP5-2588: JPA patches provided by Dmitris Zenios"

Repository: tapestry-5
Updated Branches:
  refs/heads/master 3c28f94a4 -> 246e67709


Revert "TAP5-2588: JPA patches provided by Dmitris Zenios"

It caused test failures, so reverting these changes for now.
This reverts commit 3c28f94a4814f3294ff4e8179109c72ffa7f0722.


Project: http://git-wip-us.apache.org/repos/asf/tapestry-5/repo
Commit: http://git-wip-us.apache.org/repos/asf/tapestry-5/commit/246e6770
Tree: http://git-wip-us.apache.org/repos/asf/tapestry-5/tree/246e6770
Diff: http://git-wip-us.apache.org/repos/asf/tapestry-5/diff/246e6770

Branch: refs/heads/master
Commit: 246e677097f249ad2352ddc595ef43cc257f8e27
Parents: 3c28f94
Author: Thiago H. de Paula Figueiredo <th...@arsmachina.com.br>
Authored: Wed Dec 5 23:43:22 2018 -0200
Committer: Thiago H. de Paula Figueiredo <th...@arsmachina.com.br>
Committed: Wed Dec 5 23:43:22 2018 -0200

----------------------------------------------------------------------
 .../ioc/internal/AnnotationAccessImpl.java      |  27 +--
 .../internal/services/AspectDecoratorImpl.java  |   2 +-
 .../internal/jpa/CommitAfterWorker.java         |  21 ++-
 .../jpa/EntityTransactionManagerImpl.java       |  26 ++-
 .../internal/jpa/JpaAdvisorProvider.java        |   9 -
 .../internal/jpa/JpaAdvisorProviderImpl.java    |  20 ---
 .../internal/jpa/JpaInternalUtils.java          |   9 +-
 .../internal/jpa/JpaTransactionAdvisorImpl.java |  25 ++-
 ...ContextSpecificEntityTransactionManager.java |  14 +-
 .../apache/tapestry5/jpa/modules/JpaModule.java |  13 +-
 tapestry-jpa/src/test/conf/testng.xml           |  70 ++++----
 .../jpa/JpaTransactionAdvisorImplTest.java      | 163 ++++++-------------
 .../org/example/app5/services/AppModule.java    |   1 -
 tapestry-runner/build.gradle                    |   1 -
 .../org/apache/tapestry5/test/TomcatRunner.java |  23 +--
 15 files changed, 180 insertions(+), 244 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/tapestry-5/blob/246e6770/tapestry-ioc/src/main/java/org/apache/tapestry5/ioc/internal/AnnotationAccessImpl.java
----------------------------------------------------------------------
diff --git a/tapestry-ioc/src/main/java/org/apache/tapestry5/ioc/internal/AnnotationAccessImpl.java b/tapestry-ioc/src/main/java/org/apache/tapestry5/ioc/internal/AnnotationAccessImpl.java
index f8c6155..b088cb9 100644
--- a/tapestry-ioc/src/main/java/org/apache/tapestry5/ioc/internal/AnnotationAccessImpl.java
+++ b/tapestry-ioc/src/main/java/org/apache/tapestry5/ioc/internal/AnnotationAccessImpl.java
@@ -14,45 +14,34 @@
 
 package org.apache.tapestry5.ioc.internal;
 
-import org.apache.tapestry5.func.F;
-import org.apache.tapestry5.func.Flow;
-import org.apache.tapestry5.func.Mapper;
 import org.apache.tapestry5.ioc.AnnotationAccess;
 import org.apache.tapestry5.ioc.AnnotationProvider;
-import org.apache.tapestry5.ioc.internal.services.AnnotationProviderChain;
 import org.apache.tapestry5.ioc.internal.util.InternalUtils;
 
-import java.lang.reflect.Method;
-
 /**
- * Standard AnnotationAccess for an array of classes
+ * Standard AnnotationAccess for a specific type.
  * 
  * @since 5.3
  */
 public class AnnotationAccessImpl implements AnnotationAccess
 {
-    private final Class[] classes;
+    private final Class type;
 
-    public AnnotationAccessImpl(Class ...types)
+    public AnnotationAccessImpl(Class type)
     {
-        this.classes = types;
+        this.type = type;
     }
 
     @Override
     public AnnotationProvider getClassAnnotationProvider()
     {
-        return AnnotationProviderChain.create(F.flow(classes).removeNulls().map(InternalUtils.CLASS_TO_AP_MAPPER).toList());
+        return InternalUtils.toAnnotationProvider(type);
     }
 
     @Override
-    public AnnotationProvider getMethodAnnotationProvider(String methodName, Class... parameterTypes) {
-        Flow<Class> searchClasses = F.flow(classes).removeNulls();
-        return AnnotationProviderChain.create(searchClasses.map(new Mapper<Class, Method>() {
-            @Override
-            public Method map(Class element) {
-                return InternalUtils.findMethod(element, methodName, parameterTypes);
-            }
-        }).map(InternalUtils.METHOD_TO_AP_MAPPER).toList());
+    public AnnotationProvider getMethodAnnotationProvider(String methodName, Class... parameterTypes)
+    {
+        return InternalUtils.toAnnotationProvider(InternalUtils.findMethod(type, methodName, parameterTypes));
     }
 
 }

http://git-wip-us.apache.org/repos/asf/tapestry-5/blob/246e6770/tapestry-ioc/src/main/java/org/apache/tapestry5/ioc/internal/services/AspectDecoratorImpl.java
----------------------------------------------------------------------
diff --git a/tapestry-ioc/src/main/java/org/apache/tapestry5/ioc/internal/services/AspectDecoratorImpl.java b/tapestry-ioc/src/main/java/org/apache/tapestry5/ioc/internal/services/AspectDecoratorImpl.java
index f37770e..18aa888 100644
--- a/tapestry-ioc/src/main/java/org/apache/tapestry5/ioc/internal/services/AspectDecoratorImpl.java
+++ b/tapestry-ioc/src/main/java/org/apache/tapestry5/ioc/internal/services/AspectDecoratorImpl.java
@@ -39,7 +39,7 @@ public class AspectDecoratorImpl implements AspectDecorator
     @Override
     public <T> AspectInterceptorBuilder<T> createBuilder(Class<T> serviceInterface, final T delegate, String description)
     {
-        return createBuilder(serviceInterface, delegate, new AnnotationAccessImpl(delegate.getClass(),serviceInterface), description);
+        return createBuilder(serviceInterface, delegate, new AnnotationAccessImpl(delegate.getClass()), description);
     }
 
     @Override

http://git-wip-us.apache.org/repos/asf/tapestry-5/blob/246e6770/tapestry-jpa/src/main/java/org/apache/tapestry5/internal/jpa/CommitAfterWorker.java
----------------------------------------------------------------------
diff --git a/tapestry-jpa/src/main/java/org/apache/tapestry5/internal/jpa/CommitAfterWorker.java b/tapestry-jpa/src/main/java/org/apache/tapestry5/internal/jpa/CommitAfterWorker.java
index 7c1d63c..30046e8 100644
--- a/tapestry-jpa/src/main/java/org/apache/tapestry5/internal/jpa/CommitAfterWorker.java
+++ b/tapestry-jpa/src/main/java/org/apache/tapestry5/internal/jpa/CommitAfterWorker.java
@@ -14,11 +14,17 @@
 
 package org.apache.tapestry5.internal.jpa;
 
+import java.util.HashMap;
+import java.util.Map;
 
+import javax.persistence.EntityManager;
 import javax.persistence.PersistenceContext;
 
+import org.apache.tapestry5.jpa.EntityManagerManager;
+import org.apache.tapestry5.jpa.EntityTransactionManager;
 import org.apache.tapestry5.jpa.annotations.CommitAfter;
 import org.apache.tapestry5.model.MutableComponentModel;
+import org.apache.tapestry5.plastic.MethodAdvice;
 import org.apache.tapestry5.plastic.PlasticClass;
 import org.apache.tapestry5.plastic.PlasticMethod;
 import org.apache.tapestry5.services.transform.ComponentClassTransformWorker2;
@@ -26,22 +32,27 @@ import org.apache.tapestry5.services.transform.TransformationSupport;
 
 public class CommitAfterWorker implements ComponentClassTransformWorker2
 {
-    private final JpaAdvisorProvider jpaAdvisorProvider;
+    private final Map<String, MethodAdvice> methodAdvices;
 
-    public CommitAfterWorker(JpaAdvisorProvider jpaAdvisorProvider)
+    public CommitAfterWorker(EntityManagerManager manager,
+            EntityTransactionManager transactionManager)
     {
-        this.jpaAdvisorProvider = jpaAdvisorProvider;
+        methodAdvices = new HashMap<>(manager.getEntityManagers().size());
+        for (Map.Entry<String, EntityManager> entry : manager.getEntityManagers().entrySet())
+            methodAdvices.put(entry.getKey(),
+                    new CommitAfterMethodAdvice(transactionManager, entry.getKey()));
+        methodAdvices.put(null, new CommitAfterMethodAdvice(transactionManager, null));
     }
 
     @Override
     public void transform(PlasticClass plasticClass, TransformationSupport support,
-                          MutableComponentModel model)
+            MutableComponentModel model)
     {
         for (final PlasticMethod method : plasticClass.getMethodsWithAnnotation(CommitAfter.class))
         {
             PersistenceContext annotation = method.getAnnotation(PersistenceContext.class);
 
-            method.addAdvice(jpaAdvisorProvider.getAdvice(annotation));
+            method.addAdvice(methodAdvices.get(annotation == null ? null : annotation.unitName()));
         }
     }
 }

http://git-wip-us.apache.org/repos/asf/tapestry-5/blob/246e6770/tapestry-jpa/src/main/java/org/apache/tapestry5/internal/jpa/EntityTransactionManagerImpl.java
----------------------------------------------------------------------
diff --git a/tapestry-jpa/src/main/java/org/apache/tapestry5/internal/jpa/EntityTransactionManagerImpl.java b/tapestry-jpa/src/main/java/org/apache/tapestry5/internal/jpa/EntityTransactionManagerImpl.java
index 28500c4..c0c639d 100644
--- a/tapestry-jpa/src/main/java/org/apache/tapestry5/internal/jpa/EntityTransactionManagerImpl.java
+++ b/tapestry-jpa/src/main/java/org/apache/tapestry5/internal/jpa/EntityTransactionManagerImpl.java
@@ -16,6 +16,8 @@ package org.apache.tapestry5.internal.jpa;
 import java.util.HashMap;
 import java.util.Map;
 
+import javax.persistence.EntityManager;
+
 import org.apache.tapestry5.ioc.Invokable;
 import org.apache.tapestry5.ioc.ScopeConstants;
 import org.apache.tapestry5.ioc.annotations.Scope;
@@ -36,8 +38,28 @@ public class EntityTransactionManagerImpl implements EntityTransactionManager
     {
         this.logger = logger;
         this.entityManagerManager = entityManagerManager;
-        this.transactionManagerMap = new HashMap<>(entityManagerManager.getEntityManagers().size());
+        transactionManagerMap = new HashMap<>(entityManagerManager.getEntityManagers().size());
+    }
+
+    private EntityManager getEntityManager(String unitName)
+    {
+        // EntityManager em = JpaInternalUtils.getEntityManager(entityManagerManager, unitName);
+        // FIXME we should simply incorporate the logic in JpaInternalUtils.getEntityManager to
+        // EntityManagerManager.getEntityManager(unitName)
+        if (unitName != null)
+            return entityManagerManager.getEntityManager(unitName);
+        else
+        {
+            Map<String, EntityManager> entityManagers = entityManagerManager.getEntityManagers();
+            if (entityManagers.size() == 1)
+                return entityManagers.values().iterator().next();
+            else
+                throw new RuntimeException(
+                        "Unable to locate a single EntityManager. "
+                                + "You must provide the persistence unit name as defined in the persistence.xml using the @PersistenceContext annotation.");
+        }
     }
+
     /*
      * (non-Javadoc)
      * @see net.satago.tapestry5.jpa.EntityTransactionManager#runInTransaction(java.lang.String,
@@ -69,7 +91,7 @@ public class EntityTransactionManagerImpl implements EntityTransactionManager
         if (!transactionManagerMap.containsKey(unitName))
         {
             PersistenceContextSpecificEntityTransactionManager transactionManager = new PersistenceContextSpecificEntityTransactionManager(
-                    logger, JpaInternalUtils.getEntityManager(entityManagerManager,unitName));
+                    logger, getEntityManager(unitName));
             transactionManagerMap.put(unitName, transactionManager);
             return transactionManager;
         }

http://git-wip-us.apache.org/repos/asf/tapestry-5/blob/246e6770/tapestry-jpa/src/main/java/org/apache/tapestry5/internal/jpa/JpaAdvisorProvider.java
----------------------------------------------------------------------
diff --git a/tapestry-jpa/src/main/java/org/apache/tapestry5/internal/jpa/JpaAdvisorProvider.java b/tapestry-jpa/src/main/java/org/apache/tapestry5/internal/jpa/JpaAdvisorProvider.java
deleted file mode 100644
index 108d55f..0000000
--- a/tapestry-jpa/src/main/java/org/apache/tapestry5/internal/jpa/JpaAdvisorProvider.java
+++ /dev/null
@@ -1,9 +0,0 @@
-package org.apache.tapestry5.internal.jpa;
-
-import org.apache.tapestry5.plastic.MethodAdvice;
-
-import javax.persistence.PersistenceContext;
-
-public interface JpaAdvisorProvider {
-    MethodAdvice getAdvice(PersistenceContext context);
-}

http://git-wip-us.apache.org/repos/asf/tapestry-5/blob/246e6770/tapestry-jpa/src/main/java/org/apache/tapestry5/internal/jpa/JpaAdvisorProviderImpl.java
----------------------------------------------------------------------
diff --git a/tapestry-jpa/src/main/java/org/apache/tapestry5/internal/jpa/JpaAdvisorProviderImpl.java b/tapestry-jpa/src/main/java/org/apache/tapestry5/internal/jpa/JpaAdvisorProviderImpl.java
deleted file mode 100644
index 51b50b4..0000000
--- a/tapestry-jpa/src/main/java/org/apache/tapestry5/internal/jpa/JpaAdvisorProviderImpl.java
+++ /dev/null
@@ -1,20 +0,0 @@
-package org.apache.tapestry5.internal.jpa;
-
-import org.apache.tapestry5.jpa.EntityTransactionManager;
-import org.apache.tapestry5.plastic.MethodAdvice;
-
-import javax.persistence.PersistenceContext;
-
-public class JpaAdvisorProviderImpl implements JpaAdvisorProvider {
-    private final MethodAdvice shared;
-    private final EntityTransactionManager transactionManager;
-
-    public JpaAdvisorProviderImpl(EntityTransactionManager transactionManager) {
-        this.shared = new CommitAfterMethodAdvice(transactionManager, null);
-        this.transactionManager = transactionManager;
-    }
-    @Override
-    public MethodAdvice getAdvice(PersistenceContext context) {
-        return context == null ? shared : new CommitAfterMethodAdvice(transactionManager,context.unitName());
-    }
-}

http://git-wip-us.apache.org/repos/asf/tapestry-5/blob/246e6770/tapestry-jpa/src/main/java/org/apache/tapestry5/internal/jpa/JpaInternalUtils.java
----------------------------------------------------------------------
diff --git a/tapestry-jpa/src/main/java/org/apache/tapestry5/internal/jpa/JpaInternalUtils.java b/tapestry-jpa/src/main/java/org/apache/tapestry5/internal/jpa/JpaInternalUtils.java
index aff8e21..d612e74 100644
--- a/tapestry-jpa/src/main/java/org/apache/tapestry5/internal/jpa/JpaInternalUtils.java
+++ b/tapestry-jpa/src/main/java/org/apache/tapestry5/internal/jpa/JpaInternalUtils.java
@@ -78,15 +78,10 @@ public class JpaInternalUtils
     }
 
     public static EntityManager getEntityManager(EntityManagerManager entityManagerManager,
-                                                 PersistenceContext annotation) {
+                                                 PersistenceContext annotation)
+    {
         String unitName = annotation == null ? null : annotation.unitName();
-        return getEntityManager(entityManagerManager, unitName);
-    }
-
 
-    public static EntityManager getEntityManager(EntityManagerManager entityManagerManager,
-                                                 String unitName)
-    {
         if (InternalUtils.isNonBlank(unitName))
             return entityManagerManager.getEntityManager(unitName);
 

http://git-wip-us.apache.org/repos/asf/tapestry-5/blob/246e6770/tapestry-jpa/src/main/java/org/apache/tapestry5/internal/jpa/JpaTransactionAdvisorImpl.java
----------------------------------------------------------------------
diff --git a/tapestry-jpa/src/main/java/org/apache/tapestry5/internal/jpa/JpaTransactionAdvisorImpl.java b/tapestry-jpa/src/main/java/org/apache/tapestry5/internal/jpa/JpaTransactionAdvisorImpl.java
index 7d7437c..1803722 100644
--- a/tapestry-jpa/src/main/java/org/apache/tapestry5/internal/jpa/JpaTransactionAdvisorImpl.java
+++ b/tapestry-jpa/src/main/java/org/apache/tapestry5/internal/jpa/JpaTransactionAdvisorImpl.java
@@ -15,21 +15,31 @@
 package org.apache.tapestry5.internal.jpa;
 
 import java.lang.reflect.Method;
+import java.util.HashMap;
+import java.util.Map;
 
+import javax.persistence.EntityManager;
 import javax.persistence.PersistenceContext;
 
 import org.apache.tapestry5.ioc.MethodAdviceReceiver;
-
+import org.apache.tapestry5.jpa.EntityManagerManager;
+import org.apache.tapestry5.jpa.EntityTransactionManager;
 import org.apache.tapestry5.jpa.JpaTransactionAdvisor;
 import org.apache.tapestry5.jpa.annotations.CommitAfter;
+import org.apache.tapestry5.plastic.MethodAdvice;
 
 public class JpaTransactionAdvisorImpl implements JpaTransactionAdvisor
 {
-    private final JpaAdvisorProvider jpaAdvisorProvider;
+    private final Map<String, MethodAdvice> methodAdvices;
 
-    public JpaTransactionAdvisorImpl(JpaAdvisorProvider jpaAdvisorProvider)
+    public JpaTransactionAdvisorImpl(EntityManagerManager manager,
+            EntityTransactionManager transactionManager)
     {
-        this.jpaAdvisorProvider = jpaAdvisorProvider;
+        methodAdvices = new HashMap<>(manager.getEntityManagers().size());
+        for (Map.Entry<String, EntityManager> entry : manager.getEntityManagers().entrySet())
+            methodAdvices.put(entry.getKey(),
+                    new CommitAfterMethodAdvice(transactionManager, entry.getKey()));
+        methodAdvices.put(null, new CommitAfterMethodAdvice(transactionManager, null));
     }
 
     @Override
@@ -39,8 +49,11 @@ public class JpaTransactionAdvisorImpl implements JpaTransactionAdvisor
         {
             if (m.getAnnotation(CommitAfter.class) != null)
             {
-                PersistenceContext annotation = receiver.getMethodAnnotation(m, PersistenceContext.class);
-                receiver.adviseMethod(m, jpaAdvisorProvider.getAdvice(annotation));
+                PersistenceContext annotation = receiver.getMethodAnnotation(m,
+                        PersistenceContext.class);
+
+                receiver.adviseMethod(m,
+                        methodAdvices.get(annotation == null ? null : annotation.unitName()));
             }
         }
     }

http://git-wip-us.apache.org/repos/asf/tapestry-5/blob/246e6770/tapestry-jpa/src/main/java/org/apache/tapestry5/internal/jpa/PersistenceContextSpecificEntityTransactionManager.java
----------------------------------------------------------------------
diff --git a/tapestry-jpa/src/main/java/org/apache/tapestry5/internal/jpa/PersistenceContextSpecificEntityTransactionManager.java b/tapestry-jpa/src/main/java/org/apache/tapestry5/internal/jpa/PersistenceContextSpecificEntityTransactionManager.java
index 43405f2..ed53f2b 100644
--- a/tapestry-jpa/src/main/java/org/apache/tapestry5/internal/jpa/PersistenceContextSpecificEntityTransactionManager.java
+++ b/tapestry-jpa/src/main/java/org/apache/tapestry5/internal/jpa/PersistenceContextSpecificEntityTransactionManager.java
@@ -67,7 +67,6 @@ public class PersistenceContextSpecificEntityTransactionManager
 
     public <T> T invokeInTransaction(Invokable<T> invokable)
     {
-        final EntityTransaction transaction = getTransaction();
         if (transactionBeingCommitted)
         {
             // happens for example if you try to run a transaction in @PostCommit hook. We can only
@@ -80,7 +79,7 @@ public class PersistenceContextSpecificEntityTransactionManager
             }
             else
             {
-                rollbackTransaction(transaction);
+                rollbackTransaction(getTransaction());
                 throw new RuntimeException(
                         "Current transaction is already being committed. Transactions started @PostCommit are not allowed to return a value");
             }
@@ -96,6 +95,7 @@ public class PersistenceContextSpecificEntityTransactionManager
             }
         }
 
+        final EntityTransaction transaction = getTransaction();
         try
         {
             T result = invokable.invoke();
@@ -104,11 +104,15 @@ public class PersistenceContextSpecificEntityTransactionManager
             {
                 // Success or checked exception:
 
-                boolean isActive = transaction.isActive();
-                if (isActive)
+                if (transaction.isActive())
                 {
                     invokeBeforeCommit(transaction);
-                    // FIXME check if we are still on top
+                }
+
+                // FIXME check if we are still on top
+
+                if (transaction.isActive())
+                {
                     transactionBeingCommitted = true;
                     transaction.commit();
                     transactionBeingCommitted = false;

http://git-wip-us.apache.org/repos/asf/tapestry-5/blob/246e6770/tapestry-jpa/src/main/java/org/apache/tapestry5/jpa/modules/JpaModule.java
----------------------------------------------------------------------
diff --git a/tapestry-jpa/src/main/java/org/apache/tapestry5/jpa/modules/JpaModule.java b/tapestry-jpa/src/main/java/org/apache/tapestry5/jpa/modules/JpaModule.java
index f78b71c..723b38a 100644
--- a/tapestry-jpa/src/main/java/org/apache/tapestry5/jpa/modules/JpaModule.java
+++ b/tapestry-jpa/src/main/java/org/apache/tapestry5/jpa/modules/JpaModule.java
@@ -23,7 +23,17 @@ import javax.persistence.spi.PersistenceUnitInfo;
 
 import org.apache.tapestry5.ValueEncoder;
 import org.apache.tapestry5.internal.InternalConstants;
-import org.apache.tapestry5.internal.jpa.*;
+import org.apache.tapestry5.internal.jpa.CommitAfterWorker;
+import org.apache.tapestry5.internal.jpa.EntityApplicationStatePersistenceStrategy;
+import org.apache.tapestry5.internal.jpa.EntityManagerManagerImpl;
+import org.apache.tapestry5.internal.jpa.EntityManagerObjectProvider;
+import org.apache.tapestry5.internal.jpa.EntityManagerSourceImpl;
+import org.apache.tapestry5.internal.jpa.EntityPersistentFieldStrategy;
+import org.apache.tapestry5.internal.jpa.EntityTransactionManagerImpl;
+import org.apache.tapestry5.internal.jpa.JpaTransactionAdvisorImpl;
+import org.apache.tapestry5.internal.jpa.JpaValueEncoder;
+import org.apache.tapestry5.internal.jpa.PackageNamePersistenceUnitConfigurer;
+import org.apache.tapestry5.internal.jpa.PersistenceContextWorker;
 import org.apache.tapestry5.internal.services.PersistentFieldManager;
 import org.apache.tapestry5.ioc.Configuration;
 import org.apache.tapestry5.ioc.LoggerSource;
@@ -74,7 +84,6 @@ public class JpaModule
         binder.bind(PersistenceUnitConfigurer.class, PackageNamePersistenceUnitConfigurer.class).withSimpleId();
         binder.bind(EntityManagerSource.class, EntityManagerSourceImpl.class);
         binder.bind(EntityTransactionManager.class, EntityTransactionManagerImpl.class);
-        binder.bind(JpaAdvisorProvider.class,JpaAdvisorProviderImpl.class);
 
     }
 

http://git-wip-us.apache.org/repos/asf/tapestry-5/blob/246e6770/tapestry-jpa/src/test/conf/testng.xml
----------------------------------------------------------------------
diff --git a/tapestry-jpa/src/test/conf/testng.xml b/tapestry-jpa/src/test/conf/testng.xml
index 9267615..025f946 100644
--- a/tapestry-jpa/src/test/conf/testng.xml
+++ b/tapestry-jpa/src/test/conf/testng.xml
@@ -8,49 +8,47 @@
 	the specific language governing permissions and limitations under the License. -->
 
 <suite name="Tapestry JPA" parallel="false" thread-count="10"
-	   annotations="1.5" verbose="2">
-	<test name="Tapestry JPA Integration Tests" enabled="true">
-		<parameter name="tapestry.web-app-folder" value="src/test/app1" />
-		<packages>
-			<package name="org.apache.tapestry5.jpa.integration.app1" />
-		</packages>
-	</test>
+	annotations="1.5" verbose="2">
+<!-- 	<test name="Tapestry JPA Integration Tests" enabled="true"> -->
+<!-- 		<parameter name="tapestry.web-app-folder" value="src/test/app1" /> -->
+<!-- 		<packages> -->
+<!-- 			<package name="org.apache.tapestry5.jpa.integration.app1" /> -->
+<!-- 		</packages> -->
+<!-- 	</test> -->
 
-	<test name="Single Persistence Unit Integration Tests" enabled="true">
-		<parameter name="tapestry.web-app-folder" value="src/test/app2" />
-		<packages>
-			<package name="org.apache.tapestry5.jpa.integration.app2" />
-		</packages>
-	</test>
+<!-- 	<test name="Single Persistence Unit Integration Tests" enabled="true"> -->
+<!-- 		<parameter name="tapestry.web-app-folder" value="src/test/app2" /> -->
+<!-- 		<packages> -->
+<!-- 			<package name="org.apache.tapestry5.jpa.integration.app2" /> -->
+<!-- 		</packages> -->
+<!-- 	</test> -->
 
-	<test name="JNDI DataSource Integration Tests" enabled="true">
-		<parameter name="tapestry.web-app-folder" value="src/test/app3" />
-		<parameter name="tapestry.servlet-container" value="tomcat6" />
-		<packages>
-			<package name="org.apache.tapestry5.jpa.integration.app3" />
-		</packages>
-	</test>
+<!-- 	<test name="JNDI DataSource Integration Tests" enabled="true"> -->
+<!-- 		<parameter name="tapestry.web-app-folder" value="src/test/app3" /> -->
+<!-- 		<parameter name="tapestry.servlet-container" value="tomcat6" /> -->
+<!-- 		<packages> -->
+<!-- 			<package name="org.apache.tapestry5.jpa.integration.app3" /> -->
+<!-- 		</packages> -->
+<!-- 	</test> -->
 
+<!-- 	<test name="Explicit Provider Class Name In Persistence Unit Integration Tests" enabled="true"> -->
+<!-- 		<parameter name="tapestry.web-app-folder" value="src/test/app5" /> -->
+<!-- 		<packages> -->
+<!-- 			<package name="org.apache.tapestry5.jpa.integration.app5" /> -->
+<!-- 		</packages> -->
+<!-- 	</test> -->
+
+<!-- 	<test name="Tapestry JPA Unit Tests" enabled="false"> -->
+<!-- 		<packages> -->
+<!-- 			<package name="org.apache.tapestry5.internal.jpa" /> -->
+<!-- 		</packages> -->
+<!-- 	</test> -->
+	
 	<test name="Tapestry JPA Integration Tests with Annotations in Service Implementation" enabled="true">
 		<parameter name="tapestry.web-app-folder" value="src/test/app6" />
 		<packages>
 			<package name="org.apache.tapestry5.jpa.integration.app6" />
 		</packages>
 	</test>
-
-	<test name="Tapestry JPA Unit Tests" enabled="true">
-		<packages>
-			<package name="org.apache.tapestry5.internal.jpa" />
-		</packages>
-	</test>
-
-	<!-- Put this last since it modifies
-    PersistenceProviderResolverHolder.setPersistenceProviderResolver
-    which affects other test suites -->
-	<test name="Explicit Provider Class Name In Persistence Unit Integration Tests" enabled="true">
-		<parameter name="tapestry.web-app-folder" value="src/test/app5" />
-		<packages>
-			<package name="org.apache.tapestry5.jpa.integration.app5" />
-		</packages>
-	</test>
+	
 </suite>

http://git-wip-us.apache.org/repos/asf/tapestry-5/blob/246e6770/tapestry-jpa/src/test/java/org/apache/tapestry5/internal/jpa/JpaTransactionAdvisorImplTest.java
----------------------------------------------------------------------
diff --git a/tapestry-jpa/src/test/java/org/apache/tapestry5/internal/jpa/JpaTransactionAdvisorImplTest.java b/tapestry-jpa/src/test/java/org/apache/tapestry5/internal/jpa/JpaTransactionAdvisorImplTest.java
index 92ffd33..6d3eb40 100644
--- a/tapestry-jpa/src/test/java/org/apache/tapestry5/internal/jpa/JpaTransactionAdvisorImplTest.java
+++ b/tapestry-jpa/src/test/java/org/apache/tapestry5/internal/jpa/JpaTransactionAdvisorImplTest.java
@@ -32,7 +32,6 @@ import org.apache.tapestry5.jpa.EntityManagerManager;
 import org.apache.tapestry5.jpa.EntityTransactionManager;
 import org.apache.tapestry5.jpa.JpaTransactionAdvisor;
 import org.apache.tapestry5.jpa.annotations.CommitAfter;
-import org.slf4j.LoggerFactory;
 import org.testng.Assert;
 import org.testng.annotations.AfterClass;
 import org.testng.annotations.BeforeClass;
@@ -67,9 +66,10 @@ public class JpaTransactionAdvisorImplTest extends IOCTestCase
     public void undecorated()
     {
         final VoidService delegate = newMock(VoidService.class);
+        final EntityManagerManager manager = newMock(EntityManagerManager.class);
         final EntityTransactionManager transactionManager = newMock(EntityTransactionManager.class);
-        final JpaAdvisorProvider provider = new JpaAdvisorProviderImpl(transactionManager);
-        final JpaTransactionAdvisor advisor = newJpaTransactionAdvisor(provider);
+        final JpaTransactionAdvisor advisor = newJpaTransactionAdvisor(manager, transactionManager);
+
         final AspectInterceptorBuilder<VoidService> builder = aspectDecorator.createBuilder(
                 VoidService.class, delegate, "foo.Bar");
 
@@ -87,20 +87,14 @@ public class JpaTransactionAdvisorImplTest extends IOCTestCase
     @Test
     public void persistence_unit_name_missing()
     {
+        final VoidService delegate = newMock(VoidService.class);
+        final EntityManagerManager manager = newMock(EntityManagerManager.class);
+        final EntityTransactionManager transactionManager = newMock(EntityTransactionManager.class);
+        final JpaTransactionAdvisor advisor = newJpaTransactionAdvisor(manager, transactionManager);
         Map<String, EntityManager> managers = CollectionFactory.newMap();
         managers.put("A", newMock(EntityManager.class));
         managers.put("B", newMock(EntityManager.class));
 
-        final VoidService delegate = newMock(VoidService.class);
-        final EntityManagerManager manager = newMock(EntityManagerManager.class);
-        expect(manager.getEntityManagers()).andReturn(managers);
-
-        replay();
-        final EntityTransactionManager transactionManager = new EntityTransactionManagerImpl(
-                LoggerFactory.getLogger(EntityTransactionManagerImpl.class),manager);
-        verify();
-        final JpaAdvisorProvider provider = new JpaAdvisorProviderImpl(transactionManager);
-        final JpaTransactionAdvisor advisor = newJpaTransactionAdvisor(provider);
         final AspectInterceptorBuilder<VoidService> builder = aspectDecorator.createBuilder(
                 VoidService.class, delegate, "foo.Bar");
 
@@ -127,23 +121,14 @@ public class JpaTransactionAdvisorImplTest extends IOCTestCase
     @Test
     public void persistence_unit_name_missing_single_unit_configured()
     {
-        EntityManager em = newMock(EntityManager.class);
-        Map<String, EntityManager> managers = CollectionFactory.newMap();
-        managers.put("A", em);
-
         final VoidService delegate = newMock(VoidService.class);
         final EntityManagerManager manager = newMock(EntityManagerManager.class);
-        expect(manager.getEntityManagers()).andReturn(managers);
-
-        replay();
-        final EntityTransactionManager transactionManager = new EntityTransactionManagerImpl(
-                LoggerFactory.getLogger(EntityTransactionManagerImpl.class),manager);
-        verify();
-        final JpaAdvisorProvider provider = new JpaAdvisorProviderImpl(transactionManager);
-        final JpaTransactionAdvisor advisor = newJpaTransactionAdvisor(provider);
-
+        final EntityTransactionManager transactionManager = newMock(EntityTransactionManager.class);
+        final JpaTransactionAdvisor advisor = newJpaTransactionAdvisor(manager, transactionManager);
         final EntityTransaction transaction = newMock(EntityTransaction.class);
-
+        EntityManager em = newMock(EntityManager.class);
+        Map<String, EntityManager> managers = CollectionFactory.newMap();
+        managers.put("A", em);
 
         final AspectInterceptorBuilder<VoidService> builder = aspectDecorator.createBuilder(
                 VoidService.class, delegate, "foo.Bar");
@@ -165,23 +150,14 @@ public class JpaTransactionAdvisorImplTest extends IOCTestCase
     @Test
     public void persistence_unit_missing()
     {
+        final VoidService delegate = newMock(VoidService.class);
+        final EntityManagerManager manager = newMock(EntityManagerManager.class);
+        final EntityTransactionManager transactionManager = newMock(EntityTransactionManager.class);
+        final JpaTransactionAdvisor advisor = newJpaTransactionAdvisor(manager, transactionManager);
         Map<String, EntityManager> managers = CollectionFactory.newMap();
         managers.put("A", newMock(EntityManager.class));
         managers.put("B", newMock(EntityManager.class));
 
-        final VoidService delegate = newMock(VoidService.class);
-        final EntityManagerManager manager = newMock(EntityManagerManager.class);
-        expect(manager.getEntityManagers()).andReturn(managers);
-
-        replay();
-        final EntityTransactionManager transactionManager = new EntityTransactionManagerImpl(
-                LoggerFactory.getLogger(EntityTransactionManagerImpl.class),manager);
-        verify();
-
-        final JpaAdvisorProvider provider = new JpaAdvisorProviderImpl(transactionManager);
-        final JpaTransactionAdvisor advisor = newJpaTransactionAdvisor(provider);
-
-
         final AspectInterceptorBuilder<VoidService> builder = aspectDecorator.createBuilder(
                 VoidService.class, delegate, "foo.Bar");
 
@@ -208,20 +184,14 @@ public class JpaTransactionAdvisorImplTest extends IOCTestCase
     @Test
     public void persistence_unit_missing_single_unit_configured()
     {
-        EntityManager em = newMock(EntityManager.class);
-        Map<String, EntityManager> managers = CollectionFactory.newMap();
-        managers.put("A", em);
         final VoidService delegate = newMock(VoidService.class);
         final EntityManagerManager manager = newMock(EntityManagerManager.class);
-        expect(manager.getEntityManagers()).andReturn(managers);
-
-        replay();
-        final EntityTransactionManager transactionManager = new EntityTransactionManagerImpl(
-                LoggerFactory.getLogger(EntityTransactionManagerImpl.class),manager);
-        verify();
-        final JpaAdvisorProvider provider = new JpaAdvisorProviderImpl(transactionManager);
-        final JpaTransactionAdvisor advisor = newJpaTransactionAdvisor(provider);
+        final EntityTransactionManager transactionManager = newMock(EntityTransactionManager.class);
+        final JpaTransactionAdvisor advisor = newJpaTransactionAdvisor(manager, transactionManager);
         final EntityTransaction transaction = newMock(EntityTransaction.class);
+        EntityManager em = newMock(EntityManager.class);
+        Map<String, EntityManager> managers = CollectionFactory.newMap();
+        managers.put("A", em);
 
         final AspectInterceptorBuilder<VoidService> builder = aspectDecorator.createBuilder(
                 VoidService.class, delegate, "foo.Bar");
@@ -245,14 +215,8 @@ public class JpaTransactionAdvisorImplTest extends IOCTestCase
     {
         final VoidService delegate = newMock(VoidService.class);
         final EntityManagerManager manager = newMock(EntityManagerManager.class);
-        expect(manager.getEntityManagers()).andReturn(CollectionFactory.newMap());
-
-        replay();
-        final EntityTransactionManager transactionManager = new EntityTransactionManagerImpl(
-                LoggerFactory.getLogger(EntityTransactionManagerImpl.class),manager);
-        verify();
-        final JpaAdvisorProvider provider = new JpaAdvisorProviderImpl(transactionManager);
-        final JpaTransactionAdvisor advisor = newJpaTransactionAdvisor(provider);
+        final EntityTransactionManager transactionManager = newMock(EntityTransactionManager.class);
+        final JpaTransactionAdvisor advisor = newJpaTransactionAdvisor(manager, transactionManager);
         final EntityManager entityManager = newMock(EntityManager.class);
         final EntityTransaction transaction = newMock(EntityTransaction.class);
 
@@ -279,14 +243,8 @@ public class JpaTransactionAdvisorImplTest extends IOCTestCase
     {
         final VoidService delegate = newMock(VoidService.class);
         final EntityManagerManager manager = newMock(EntityManagerManager.class);
-        expect(manager.getEntityManagers()).andReturn(CollectionFactory.newMap());
-
-        replay();
-        final EntityTransactionManager transactionManager = new EntityTransactionManagerImpl(
-                LoggerFactory.getLogger(EntityTransactionManagerImpl.class),manager);
-        verify();
-        final JpaAdvisorProvider provider = new JpaAdvisorProviderImpl(transactionManager);
-        final JpaTransactionAdvisor advisor = newJpaTransactionAdvisor(provider);
+        final EntityTransactionManager transactionManager = newMock(EntityTransactionManager.class);
+        final JpaTransactionAdvisor advisor = newJpaTransactionAdvisor(manager, transactionManager);
         final EntityManager entityManager = newMock(EntityManager.class);
         final EntityTransaction transaction = newMock(EntityTransaction.class);
 
@@ -313,14 +271,8 @@ public class JpaTransactionAdvisorImplTest extends IOCTestCase
     {
         final VoidService delegate = newMock(VoidService.class);
         final EntityManagerManager manager = newMock(EntityManagerManager.class);
-        expect(manager.getEntityManagers()).andReturn(CollectionFactory.newMap());
-
-        replay();
-        final EntityTransactionManager transactionManager = new EntityTransactionManagerImpl(
-                LoggerFactory.getLogger(EntityTransactionManagerImpl.class),manager);
-        verify();
-        final JpaAdvisorProvider provider = new JpaAdvisorProviderImpl(transactionManager);
-        final JpaTransactionAdvisor advisor = newJpaTransactionAdvisor(provider);
+        final EntityTransactionManager transactionManager = newMock(EntityTransactionManager.class);
+        final JpaTransactionAdvisor advisor = newJpaTransactionAdvisor(manager, transactionManager);
         final EntityManager entityManager = newMock(EntityManager.class);
         final EntityTransaction transaction = newMock(EntityTransaction.class);
 
@@ -345,14 +297,8 @@ public class JpaTransactionAdvisorImplTest extends IOCTestCase
     {
         final Performer delegate = newMock(Performer.class);
         final EntityManagerManager manager = newMock(EntityManagerManager.class);
-        expect(manager.getEntityManagers()).andReturn(CollectionFactory.newMap());
-
-        replay();
-        final EntityTransactionManager transactionManager = new EntityTransactionManagerImpl(
-                LoggerFactory.getLogger(EntityTransactionManagerImpl.class),manager);
-        verify();
-        final JpaAdvisorProvider provider = new JpaAdvisorProviderImpl(transactionManager);
-        final JpaTransactionAdvisor advisor = newJpaTransactionAdvisor(provider);
+        final EntityTransactionManager transactionManager = newMock(EntityTransactionManager.class);
+        final JpaTransactionAdvisor advisor = newJpaTransactionAdvisor(manager, transactionManager);
         final EntityManager entityManager = newMock(EntityManager.class);
         final EntityTransaction transaction = newMock(EntityTransaction.class);
         final RuntimeException re = new RuntimeException("Unexpected.");
@@ -387,14 +333,8 @@ public class JpaTransactionAdvisorImplTest extends IOCTestCase
     {
         final Performer delegate = newMock(Performer.class);
         final EntityManagerManager manager = newMock(EntityManagerManager.class);
-        expect(manager.getEntityManagers()).andReturn(CollectionFactory.newMap());
-
-        replay();
-        final EntityTransactionManager transactionManager = new EntityTransactionManagerImpl(
-                LoggerFactory.getLogger(EntityTransactionManagerImpl.class),manager);
-        verify();
-        final JpaAdvisorProvider provider = new JpaAdvisorProviderImpl(transactionManager);
-        final JpaTransactionAdvisor advisor = newJpaTransactionAdvisor(provider);
+        final EntityTransactionManager transactionManager = newMock(EntityTransactionManager.class);
+        final JpaTransactionAdvisor advisor = newJpaTransactionAdvisor(manager, transactionManager);
         final EntityManager entityManager = newMock(EntityManager.class);
         final EntityTransaction transaction = newMock(EntityTransaction.class);
         final SQLException se = new SQLException("Checked.");
@@ -434,14 +374,8 @@ public class JpaTransactionAdvisorImplTest extends IOCTestCase
     {
         final ReturnTypeService delegate = newTestService();
         final EntityManagerManager manager = newMock(EntityManagerManager.class);
-        expect(manager.getEntityManagers()).andReturn(CollectionFactory.newMap());
-
-        replay();
-        final EntityTransactionManager transactionManager = new EntityTransactionManagerImpl(
-                LoggerFactory.getLogger(EntityTransactionManagerImpl.class),manager);
-        verify();
-        final JpaAdvisorProvider provider = new JpaAdvisorProviderImpl(transactionManager);
-        final JpaTransactionAdvisor advisor = newJpaTransactionAdvisor(provider);
+        final EntityTransactionManager transactionManager = newMock(EntityTransactionManager.class);
+        final JpaTransactionAdvisor advisor = newJpaTransactionAdvisor(manager, transactionManager);
         final EntityManager entityManager = newMock(EntityManager.class);
         final EntityTransaction transaction = newMock(EntityTransaction.class);
 
@@ -466,14 +400,8 @@ public class JpaTransactionAdvisorImplTest extends IOCTestCase
     {
         final ReturnTypeService delegate = newTestService();
         final EntityManagerManager manager = newMock(EntityManagerManager.class);
-        expect(manager.getEntityManagers()).andReturn(CollectionFactory.newMap());
-
-        replay();
-        final EntityTransactionManager transactionManager = new EntityTransactionManagerImpl(
-                LoggerFactory.getLogger(EntityTransactionManagerImpl.class),manager);
-        verify();
-        final JpaAdvisorProvider provider = new JpaAdvisorProviderImpl(transactionManager);
-        final JpaTransactionAdvisor advisor = newJpaTransactionAdvisor(provider);
+        final EntityTransactionManager transactionManager = newMock(EntityTransactionManager.class);
+        final JpaTransactionAdvisor advisor = newJpaTransactionAdvisor(manager, transactionManager);
         final EntityManager entityManager = newMock(EntityManager.class);
         final EntityTransaction transaction = newMock(EntityTransaction.class);
 
@@ -534,9 +462,10 @@ public class JpaTransactionAdvisorImplTest extends IOCTestCase
         transaction.rollback();
     }
 
-    private JpaTransactionAdvisor newJpaTransactionAdvisor(final JpaAdvisorProvider provider)
+    private JpaTransactionAdvisor newJpaTransactionAdvisor(final EntityManagerManager manager,
+            EntityTransactionManager transactionManager)
     {
-        return new JpaTransactionAdvisorImpl(provider);
+        return new JpaTransactionAdvisorImpl(manager, transactionManager);
     }
 
     private ReturnTypeService newTestService()
@@ -604,4 +533,20 @@ public class JpaTransactionAdvisorImplTest extends IOCTestCase
         @PersistenceContext(unitName = UNIT_NAME)
         void perform() throws SQLException;
     }
+
+    public interface Service
+    {
+    	void perform();
+    }
+
+    public class ServiceImpl implements Service {
+    	@Override
+    	@CommitAfter
+    	@PersistenceContext(unitName = UNIT_NAME)
+        public void perform()
+    	{
+
+    	}
+    }
+
 }

http://git-wip-us.apache.org/repos/asf/tapestry-5/blob/246e6770/tapestry-jpa/src/test/java/org/example/app5/services/AppModule.java
----------------------------------------------------------------------
diff --git a/tapestry-jpa/src/test/java/org/example/app5/services/AppModule.java b/tapestry-jpa/src/test/java/org/example/app5/services/AppModule.java
index e3f380a..05d2488 100644
--- a/tapestry-jpa/src/test/java/org/example/app5/services/AppModule.java
+++ b/tapestry-jpa/src/test/java/org/example/app5/services/AppModule.java
@@ -34,7 +34,6 @@ public class AppModule
     static
     {
 
-        //This will also affect test suites run after this one.Its better to run this suite last
         PersistenceProviderResolverHolder.setPersistenceProviderResolver(
                 new PersistenceProviderResolver()
                 {

http://git-wip-us.apache.org/repos/asf/tapestry-5/blob/246e6770/tapestry-runner/build.gradle
----------------------------------------------------------------------
diff --git a/tapestry-runner/build.gradle b/tapestry-runner/build.gradle
index 3f7a6ff..f905c70 100644
--- a/tapestry-runner/build.gradle
+++ b/tapestry-runner/build.gradle
@@ -10,7 +10,6 @@ dependencies {
 
     compile "org.apache.tomcat:tomcat-catalina:${versions.tomcat}"
     compile "org.apache.tomcat:tomcat-coyote:${versions.tomcat}"
-    compile "org.apache.tomcat:tomcat-jasper:${versions.tomcat}"
 
     compile "org.apache.tomcat:tomcat-dbcp:${versions.tomcat}"
     compile "commons-cli:commons-cli:1.2"

http://git-wip-us.apache.org/repos/asf/tapestry-5/blob/246e6770/tapestry-runner/src/main/java/org/apache/tapestry5/test/TomcatRunner.java
----------------------------------------------------------------------
diff --git a/tapestry-runner/src/main/java/org/apache/tapestry5/test/TomcatRunner.java b/tapestry-runner/src/main/java/org/apache/tapestry5/test/TomcatRunner.java
index a37b580..f382330 100644
--- a/tapestry-runner/src/main/java/org/apache/tapestry5/test/TomcatRunner.java
+++ b/tapestry-runner/src/main/java/org/apache/tapestry5/test/TomcatRunner.java
@@ -15,6 +15,7 @@
 package org.apache.tapestry5.test;
 
 import org.apache.catalina.connector.Connector;
+import org.apache.catalina.core.StandardContext;
 import org.apache.catalina.startup.Tomcat;
 
 import java.io.File;
@@ -49,11 +50,8 @@ public class TomcatRunner implements ServletContainerRunner
         if (!tmpDir.endsWith(fileSeparator))
             tmpDir = tmpDir + fileSeparator;
         tomcatServer.setBaseDir(tmpDir + "tomcat");
-        tomcatServer.setPort(port);
-        tomcatServer.addWebapp("/", expandedPath);
 
-        //Enable jndi lookups
-        tomcatServer.enableNaming();
+        tomcatServer.addWebapp("/", expandedPath);
 
         tomcatServer.getConnector().setAllowTrace(true);
 
@@ -70,7 +68,6 @@ public class TomcatRunner implements ServletContainerRunner
         }
 
         tomcatServer.start();
-        startDaemonAwaitThread();
     }
 
     /**
@@ -85,7 +82,6 @@ public class TomcatRunner implements ServletContainerRunner
         {
             // Stop immediately and not gracefully.
             tomcatServer.stop();
-            tomcatServer.destroy();
         }
         catch (Exception ex)
         {
@@ -121,19 +117,4 @@ public class TomcatRunner implements ServletContainerRunner
         return new File(TapestryRunnerConstants.MODULE_BASE_DIR, moduleLocalPath).getPath();
     }
 
-    // Unlike Jetty, all Tomcat threads are daemon threads. We create a
-    // blocking non-daemon to stop immediate shutdown
-    private void startDaemonAwaitThread() {
-        Thread awaitThread = new Thread() {
-
-            @Override
-            public void run() {
-                TomcatRunner.this.tomcatServer.getServer().await();
-            }
-
-        };
-        awaitThread.setContextClassLoader(getClass().getClassLoader());
-        awaitThread.setDaemon(false);
-        awaitThread.start();
-    }
 }