Here are 3 more which they are more or less connected with JPA failing / disabled tests
Order of applying is important Example if the 0001-fix-tomcat-runner-patch is not applied first then JPA JNDI test suite will fail On Sat, Dec 1, 2018 at 3:40 AM Dimitris Zenios <dimitris.zen...@gmail.com> wrote: > One more > > Correct test for TAP5-2582 > > On Sat, Dec 1, 2018 at 1:56 AM Dimitris Zenios <dimitris.zen...@gmail.com> > wrote: > >> Another one small fix >> >> On Sat, Dec 1, 2018 at 1:51 AM Dimitris Zenios <dimitris.zen...@gmail.com> >> wrote: >> >>> Sure but lets get 5.5 out the door first. >>> >>> I have been going over the changes and i have some patches available. >>> >>> First attached is the already mentioned issue with static interface >>> methods >>> >>> >>> >>> On Sat, Dec 1, 2018 at 1:26 AM Thiago H. de Paula Figueiredo < >>> thiag...@gmail.com> wrote: >>> >>>> On Fri, Nov 30, 2018 at 7:36 PM Dimitris Zenios < >>>> dimitris.zen...@gmail.com> >>>> wrote: >>>> >>>> > I have some ideas on that subject but lest get 5.5 out first and >>>> continue >>>> > on that afterwards >>>> > >>>> >>>> Nice! Could you please start a new thread with your ideas? I'm curious >>>> about them. :) >>>> >>>> >>>> > >>>> > On Fri, Nov 30, 2018 at 11:33 PM Thiago H. de Paula Figueiredo < >>>> > thiag...@gmail.com> wrote: >>>> > >>>> > > Yeah, it would break webapps styled with Bootstrap 4 due to the >>>> different >>>> > > tagging. Maybe we (the Tapestry team or the community) could come up >>>> > with a >>>> > > separate library to do this. >>>> > > >>>> > > On Fri, Nov 30, 2018 at 7:30 PM Dimitris Zenios < >>>> > dimitris.zen...@gmail.com >>>> > > > >>>> > > wrote: >>>> > > >>>> > > > Its not so huge my main concern is the backwards compatibility >>>> > > > >>>> > > > On Fri, Nov 30, 2018 at 11:27 PM Thiago H. de Paula Figueiredo < >>>> > > > thiag...@gmail.com> wrote: >>>> > > > >>>> > > > > On Fri, Nov 30, 2018 at 6:45 PM Dimitris Zenios < >>>> > > > dimitris.zen...@gmail.com >>>> > > > > > >>>> > > > > wrote: >>>> > > > > >>>> > > > > > Even though it might be irrelevant i was also thinking of >>>> bootstrap >>>> > > 4. >>>> > > > > > >>>> > > > > >>>> > > > > Hmm, it would be nice, but I don't think it would be a trivial, >>>> quick >>>> > > > thing >>>> > > > > to do. Any takers? :) >>>> > > > > >>>> > > > > >>>> > > > > > >>>> > > > > > On Fri, Nov 30, 2018 at 10:31 PM Dimitris Zenios < >>>> > > > > > dimitris.zen...@gmail.com> >>>> > > > > > wrote: >>>> > > > > > >>>> > > > > > > +1 >>>> > > > > > > >>>> > > > > > > On Fri, 30 Nov 2018, 22:28 Thiago H. de Paula Figueiredo < >>>> > > > > > > thi...@arsmachina.com.br wrote: >>>> > > > > > > >>>> > > > > > >> Hello! >>>> > > > > > >> >>>> > > > > > >> Since we now have a working build and ASM 7 supporting >>>> Java 11, >>>> > I >>>> > > > was >>>> > > > > > >> thinking of release a beta version so people could test it >>>> on >>>> > > their >>>> > > > > > >> own projects. What do you think? >>>> > > > > > >> >>>> > > > > > >> Cheers! >>>> > > > > > >> -- >>>> > > > > > >> Thiago H. de Paula Figueiredo >>>> > > > > > >> >>>> > > > > > >> >>>> > > > >>>> --------------------------------------------------------------------- >>>> > > > > > >> To unsubscribe, e-mail: >>>> dev-unsubscr...@tapestry.apache.org >>>> > > > > > >> For additional commands, e-mail: >>>> dev-h...@tapestry.apache.org >>>> > > > > > >> >>>> > > > > > >> >>>> > > > > > >>>> > > > > >>>> > > > > >>>> > > > > -- >>>> > > > > Thiago >>>> > > > > >>>> > > > >>>> > > >>>> > > >>>> > > -- >>>> > > Thiago >>>> > > >>>> > >>>> >>>> >>>> -- >>>> Thiago >>>> >>>
From cc6f151fb74c44a43f38841aebeee89cce8f127f Mon Sep 17 00:00:00 2001 From: Dimitris Zenios <dimitris.zen...@gmail.com> Date: Sun, 2 Dec 2018 02:41:14 +0200 Subject: [PATCH 2/3] AnnotationAccess documentation specifies that both methods should return annotations on the implementation method, plus annotations on the corresponding service interface method (if such a method exists), with precedence on the implementation class method annotations, but AnnotationAccessImpl included annotations only of the implementation since there was no way to supply the service interface This affected AspectDecorator.createBuilder(Class<T> serviceInterface, final T delegate, String description). --- .../ioc/internal/AnnotationAccessImpl.java | 27 +++++++++++++------ .../services/AspectDecoratorImpl.java | 2 +- 2 files changed, 20 insertions(+), 9 deletions(-) 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 b088cb956..f8c615526 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,34 +14,45 @@ 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 a specific type. + * Standard AnnotationAccess for an array of classes * * @since 5.3 */ public class AnnotationAccessImpl implements AnnotationAccess { - private final Class type; + private final Class[] classes; - public AnnotationAccessImpl(Class type) + public AnnotationAccessImpl(Class ...types) { - this.type = type; + this.classes = types; } @Override public AnnotationProvider getClassAnnotationProvider() { - return InternalUtils.toAnnotationProvider(type); + return AnnotationProviderChain.create(F.flow(classes).removeNulls().map(InternalUtils.CLASS_TO_AP_MAPPER).toList()); } @Override - public AnnotationProvider getMethodAnnotationProvider(String methodName, Class... parameterTypes) - { - return InternalUtils.toAnnotationProvider(InternalUtils.findMethod(type, methodName, parameterTypes)); + 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()); } } 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 18aa88864..f37770e4c 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()), description); + return createBuilder(serviceInterface, delegate, new AnnotationAccessImpl(delegate.getClass(),serviceInterface), description); } @Override -- 2.19.2
From 684bb95e3040df8472373b6415d42c1b16c3cdc4 Mon Sep 17 00:00:00 2001 From: Dimitris Zenios <dimitris.zen...@gmail.com> Date: Sun, 2 Dec 2018 02:37:57 +0200 Subject: [PATCH 1/3] Fix tomcat runner -Set port correctly -Enable jndi lookups -Added a missing dependency --- tapestry-runner/build.gradle | 1 + .../apache/tapestry5/test/TomcatRunner.java | 23 +++++++++++++++++-- 2 files changed, 22 insertions(+), 2 deletions(-) diff --git a/tapestry-runner/build.gradle b/tapestry-runner/build.gradle index f905c703e..3f7a6ffd7 100644 --- a/tapestry-runner/build.gradle +++ b/tapestry-runner/build.gradle @@ -10,6 +10,7 @@ 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" 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 f382330b0..a37b58070 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,7 +15,6 @@ 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; @@ -50,9 +49,12 @@ 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.getConnector().setAllowTrace(true); // SSL support @@ -68,6 +70,7 @@ public class TomcatRunner implements ServletContainerRunner } tomcatServer.start(); + startDaemonAwaitThread(); } /** @@ -82,6 +85,7 @@ public class TomcatRunner implements ServletContainerRunner { // Stop immediately and not gracefully. tomcatServer.stop(); + tomcatServer.destroy(); } catch (Exception ex) { @@ -117,4 +121,19 @@ 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(); + } } -- 2.19.2
From c5641027093f617c30c5ac344d78cdfe0f1ad88f Mon Sep 17 00:00:00 2001 From: Dimitris Zenios <dimitris.zen...@gmail.com> Date: Sun, 2 Dec 2018 02:48:46 +0200 Subject: [PATCH 3/3] Refactor JPA transaction advisor and enable all the tests that broke after TAP5-2553: Support pseudo nested JPA transactions --- .../internal/jpa/CommitAfterWorker.java | 21 +-- .../jpa/EntityTransactionManagerImpl.java | 26 +-- .../internal/jpa/JpaAdvisorProvider.java | 9 + .../internal/jpa/JpaAdvisorProviderImpl.java | 20 +++ .../internal/jpa/JpaInternalUtils.java | 9 +- .../jpa/JpaTransactionAdvisorImpl.java | 25 +-- ...ntextSpecificEntityTransactionManager.java | 14 +- .../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 + 11 files changed, 202 insertions(+), 169 deletions(-) create mode 100644 tapestry-jpa/src/main/java/org/apache/tapestry5/internal/jpa/JpaAdvisorProvider.java create mode 100644 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/CommitAfterWorker.java b/tapestry-jpa/src/main/java/org/apache/tapestry5/internal/jpa/CommitAfterWorker.java index 30046e811..7c1d63c2c 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,17 +14,11 @@ 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; @@ -32,27 +26,22 @@ import org.apache.tapestry5.services.transform.TransformationSupport; public class CommitAfterWorker implements ComponentClassTransformWorker2 { - private final Map<String, MethodAdvice> methodAdvices; + private final JpaAdvisorProvider jpaAdvisorProvider; - public CommitAfterWorker(EntityManagerManager manager, - EntityTransactionManager transactionManager) + public CommitAfterWorker(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)); + this.jpaAdvisorProvider = jpaAdvisorProvider; } @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(methodAdvices.get(annotation == null ? null : annotation.unitName())); + method.addAdvice(jpaAdvisorProvider.getAdvice(annotation)); } } } 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 c0c639d94..28500c49a 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,8 +16,6 @@ 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; @@ -38,28 +36,8 @@ public class EntityTransactionManagerImpl implements EntityTransactionManager { this.logger = logger; this.entityManagerManager = entityManagerManager; - 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."); - } + this.transactionManagerMap = new HashMap<>(entityManagerManager.getEntityManagers().size()); } - /* * (non-Javadoc) * @see net.satago.tapestry5.jpa.EntityTransactionManager#runInTransaction(java.lang.String, @@ -91,7 +69,7 @@ public class EntityTransactionManagerImpl implements EntityTransactionManager if (!transactionManagerMap.containsKey(unitName)) { PersistenceContextSpecificEntityTransactionManager transactionManager = new PersistenceContextSpecificEntityTransactionManager( - logger, getEntityManager(unitName)); + logger, JpaInternalUtils.getEntityManager(entityManagerManager,unitName)); transactionManagerMap.put(unitName, transactionManager); return transactionManager; } 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 new file mode 100644 index 000000000..108d55fab --- /dev/null +++ b/tapestry-jpa/src/main/java/org/apache/tapestry5/internal/jpa/JpaAdvisorProvider.java @@ -0,0 +1,9 @@ +package org.apache.tapestry5.internal.jpa; + +import org.apache.tapestry5.plastic.MethodAdvice; + +import javax.persistence.PersistenceContext; + +public interface JpaAdvisorProvider { + MethodAdvice getAdvice(PersistenceContext context); +} 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 new file mode 100644 index 000000000..51b50b4c2 --- /dev/null +++ b/tapestry-jpa/src/main/java/org/apache/tapestry5/internal/jpa/JpaAdvisorProviderImpl.java @@ -0,0 +1,20 @@ +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()); + } +} 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 d612e74dc..aff8e21a0 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,10 +78,15 @@ 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); 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 1803722d5..7d7437c3f 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,31 +15,21 @@ 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 Map<String, MethodAdvice> methodAdvices; + private final JpaAdvisorProvider jpaAdvisorProvider; - public JpaTransactionAdvisorImpl(EntityManagerManager manager, - EntityTransactionManager transactionManager) + public JpaTransactionAdvisorImpl(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)); + this.jpaAdvisorProvider = jpaAdvisorProvider; } @Override @@ -49,11 +39,8 @@ public class JpaTransactionAdvisorImpl implements JpaTransactionAdvisor { if (m.getAnnotation(CommitAfter.class) != null) { - PersistenceContext annotation = receiver.getMethodAnnotation(m, - PersistenceContext.class); - - receiver.adviseMethod(m, - methodAdvices.get(annotation == null ? null : annotation.unitName())); + PersistenceContext annotation = receiver.getMethodAnnotation(m, PersistenceContext.class); + receiver.adviseMethod(m, jpaAdvisorProvider.getAdvice(annotation)); } } } 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 ed53f2b1b..43405f266 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,6 +67,7 @@ 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 @@ -79,7 +80,7 @@ public class PersistenceContextSpecificEntityTransactionManager } else { - rollbackTransaction(getTransaction()); + rollbackTransaction(transaction); throw new RuntimeException( "Current transaction is already being committed. Transactions started @PostCommit are not allowed to return a value"); } @@ -95,7 +96,6 @@ public class PersistenceContextSpecificEntityTransactionManager } } - final EntityTransaction transaction = getTransaction(); try { T result = invokable.invoke(); @@ -104,15 +104,11 @@ public class PersistenceContextSpecificEntityTransactionManager { // Success or checked exception: - if (transaction.isActive()) + boolean isActive = transaction.isActive(); + if (isActive) { invokeBeforeCommit(transaction); - } - - // FIXME check if we are still on top - - if (transaction.isActive()) - { + // FIXME check if we are still on top transactionBeingCommitted = true; transaction.commit(); transactionBeingCommitted = false; 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 723b38a91..f78b71c3b 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,17 +23,7 @@ import javax.persistence.spi.PersistenceUnitInfo; import org.apache.tapestry5.ValueEncoder; import org.apache.tapestry5.internal.InternalConstants; -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.jpa.*; import org.apache.tapestry5.internal.services.PersistentFieldManager; import org.apache.tapestry5.ioc.Configuration; import org.apache.tapestry5.ioc.LoggerSource; @@ -84,6 +74,7 @@ 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); } diff --git a/tapestry-jpa/src/test/conf/testng.xml b/tapestry-jpa/src/test/conf/testng.xml index 025f946dd..926761597 100644 --- a/tapestry-jpa/src/test/conf/testng.xml +++ b/tapestry-jpa/src/test/conf/testng.xml @@ -8,47 +8,49 @@ 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> --> - -<!-- <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> --> + 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="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="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="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="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="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> 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 6d3eb40c0..92ffd3344 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,6 +32,7 @@ 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; @@ -66,10 +67,9 @@ 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 JpaTransactionAdvisor advisor = newJpaTransactionAdvisor(manager, transactionManager); - + final JpaAdvisorProvider provider = new JpaAdvisorProviderImpl(transactionManager); + final JpaTransactionAdvisor advisor = newJpaTransactionAdvisor(provider); final AspectInterceptorBuilder<VoidService> builder = aspectDecorator.createBuilder( VoidService.class, delegate, "foo.Bar"); @@ -87,14 +87,20 @@ 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"); @@ -121,15 +127,24 @@ public class JpaTransactionAdvisorImplTest extends IOCTestCase @Test public void persistence_unit_name_missing_single_unit_configured() { - final VoidService delegate = newMock(VoidService.class); - final EntityManagerManager manager = newMock(EntityManagerManager.class); - 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 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 EntityTransaction transaction = newMock(EntityTransaction.class); + + final AspectInterceptorBuilder<VoidService> builder = aspectDecorator.createBuilder( VoidService.class, delegate, "foo.Bar"); @@ -150,14 +165,23 @@ 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"); @@ -184,14 +208,20 @@ public class JpaTransactionAdvisorImplTest extends IOCTestCase @Test public void persistence_unit_missing_single_unit_configured() { - final VoidService delegate = newMock(VoidService.class); - final EntityManagerManager manager = newMock(EntityManagerManager.class); - 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 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 EntityTransaction transaction = newMock(EntityTransaction.class); final AspectInterceptorBuilder<VoidService> builder = aspectDecorator.createBuilder( VoidService.class, delegate, "foo.Bar"); @@ -215,8 +245,14 @@ public class JpaTransactionAdvisorImplTest extends IOCTestCase { final VoidService delegate = newMock(VoidService.class); final EntityManagerManager manager = newMock(EntityManagerManager.class); - final EntityTransactionManager transactionManager = newMock(EntityTransactionManager.class); - final JpaTransactionAdvisor advisor = newJpaTransactionAdvisor(manager, transactionManager); + 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 EntityManager entityManager = newMock(EntityManager.class); final EntityTransaction transaction = newMock(EntityTransaction.class); @@ -243,8 +279,14 @@ public class JpaTransactionAdvisorImplTest extends IOCTestCase { final VoidService delegate = newMock(VoidService.class); final EntityManagerManager manager = newMock(EntityManagerManager.class); - final EntityTransactionManager transactionManager = newMock(EntityTransactionManager.class); - final JpaTransactionAdvisor advisor = newJpaTransactionAdvisor(manager, transactionManager); + 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 EntityManager entityManager = newMock(EntityManager.class); final EntityTransaction transaction = newMock(EntityTransaction.class); @@ -271,8 +313,14 @@ public class JpaTransactionAdvisorImplTest extends IOCTestCase { final VoidService delegate = newMock(VoidService.class); final EntityManagerManager manager = newMock(EntityManagerManager.class); - final EntityTransactionManager transactionManager = newMock(EntityTransactionManager.class); - final JpaTransactionAdvisor advisor = newJpaTransactionAdvisor(manager, transactionManager); + 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 EntityManager entityManager = newMock(EntityManager.class); final EntityTransaction transaction = newMock(EntityTransaction.class); @@ -297,8 +345,14 @@ public class JpaTransactionAdvisorImplTest extends IOCTestCase { final Performer delegate = newMock(Performer.class); final EntityManagerManager manager = newMock(EntityManagerManager.class); - final EntityTransactionManager transactionManager = newMock(EntityTransactionManager.class); - final JpaTransactionAdvisor advisor = newJpaTransactionAdvisor(manager, transactionManager); + 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 EntityManager entityManager = newMock(EntityManager.class); final EntityTransaction transaction = newMock(EntityTransaction.class); final RuntimeException re = new RuntimeException("Unexpected."); @@ -333,8 +387,14 @@ public class JpaTransactionAdvisorImplTest extends IOCTestCase { final Performer delegate = newMock(Performer.class); final EntityManagerManager manager = newMock(EntityManagerManager.class); - final EntityTransactionManager transactionManager = newMock(EntityTransactionManager.class); - final JpaTransactionAdvisor advisor = newJpaTransactionAdvisor(manager, transactionManager); + 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 EntityManager entityManager = newMock(EntityManager.class); final EntityTransaction transaction = newMock(EntityTransaction.class); final SQLException se = new SQLException("Checked."); @@ -374,8 +434,14 @@ public class JpaTransactionAdvisorImplTest extends IOCTestCase { final ReturnTypeService delegate = newTestService(); final EntityManagerManager manager = newMock(EntityManagerManager.class); - final EntityTransactionManager transactionManager = newMock(EntityTransactionManager.class); - final JpaTransactionAdvisor advisor = newJpaTransactionAdvisor(manager, transactionManager); + 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 EntityManager entityManager = newMock(EntityManager.class); final EntityTransaction transaction = newMock(EntityTransaction.class); @@ -400,8 +466,14 @@ public class JpaTransactionAdvisorImplTest extends IOCTestCase { final ReturnTypeService delegate = newTestService(); final EntityManagerManager manager = newMock(EntityManagerManager.class); - final EntityTransactionManager transactionManager = newMock(EntityTransactionManager.class); - final JpaTransactionAdvisor advisor = newJpaTransactionAdvisor(manager, transactionManager); + 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 EntityManager entityManager = newMock(EntityManager.class); final EntityTransaction transaction = newMock(EntityTransaction.class); @@ -462,10 +534,9 @@ public class JpaTransactionAdvisorImplTest extends IOCTestCase transaction.rollback(); } - private JpaTransactionAdvisor newJpaTransactionAdvisor(final EntityManagerManager manager, - EntityTransactionManager transactionManager) + private JpaTransactionAdvisor newJpaTransactionAdvisor(final JpaAdvisorProvider provider) { - return new JpaTransactionAdvisorImpl(manager, transactionManager); + return new JpaTransactionAdvisorImpl(provider); } private ReturnTypeService newTestService() @@ -533,20 +604,4 @@ 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() - { - - } - } - } 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 05d248881..e3f380a7b 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,6 +34,7 @@ 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() { -- 2.19.2
--------------------------------------------------------------------- To unsubscribe, e-mail: dev-unsubscr...@tapestry.apache.org For additional commands, e-mail: dev-h...@tapestry.apache.org