Author: drobiazko Date: Sun Mar 13 23:32:58 2011 New Revision: 1081237 URL: http://svn.apache.org/viewvc?rev=1081237&view=rev Log: TAP5-1472: Providing a persistence unit name is optional if only a single unit exists.
Modified: tapestry/tapestry5/trunk/tapestry-jpa/src/main/java/org/apache/tapestry5/internal/jpa/CommitAfterMethodAdvice.java tapestry/tapestry5/trunk/tapestry-jpa/src/main/java/org/apache/tapestry5/internal/jpa/EntityManagerManagerImpl.java tapestry/tapestry5/trunk/tapestry-jpa/src/main/java/org/apache/tapestry5/internal/jpa/JpaInternalUtils.java tapestry/tapestry5/trunk/tapestry-jpa/src/main/java/org/apache/tapestry5/internal/jpa/PersistenceUnitWorker.java tapestry/tapestry5/trunk/tapestry-jpa/src/main/java/org/apache/tapestry5/jpa/JpaModule.java tapestry/tapestry5/trunk/tapestry-jpa/src/test/java/org/apache/tapestry5/internal/jpa/JpaTransactionAdvisorImplTest.java tapestry/tapestry5/trunk/tapestry-jpa/src/test/java/org/example/app2/pages/PersistItem.java Modified: tapestry/tapestry5/trunk/tapestry-jpa/src/main/java/org/apache/tapestry5/internal/jpa/CommitAfterMethodAdvice.java URL: http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-jpa/src/main/java/org/apache/tapestry5/internal/jpa/CommitAfterMethodAdvice.java?rev=1081237&r1=1081236&r2=1081237&view=diff ============================================================================== --- tapestry/tapestry5/trunk/tapestry-jpa/src/main/java/org/apache/tapestry5/internal/jpa/CommitAfterMethodAdvice.java (original) +++ tapestry/tapestry5/trunk/tapestry-jpa/src/main/java/org/apache/tapestry5/internal/jpa/CommitAfterMethodAdvice.java Sun Mar 13 23:32:58 2011 @@ -20,7 +20,6 @@ import javax.persistence.PersistenceUnit import org.apache.tapestry5.ioc.Invocation; import org.apache.tapestry5.ioc.MethodAdvice; -import org.apache.tapestry5.ioc.internal.util.InternalUtils; import org.apache.tapestry5.jpa.EntityManagerManager; public class CommitAfterMethodAdvice implements MethodAdvice @@ -68,20 +67,14 @@ public class CommitAfterMethodAdvice imp private EntityTransaction getTransaction(final Invocation invocation) { - final PersistenceUnit persistenceUnit = invocation .getMethodAnnotation(PersistenceUnit.class); - if (persistenceUnit == null) - return null; - - final String unitName = persistenceUnit.unitName(); + EntityManager em = JpaInternalUtils.getEntityManager(manager, persistenceUnit); - if (InternalUtils.isBlank(unitName)) + if (em == null) return null; - final EntityManager em = manager.getEntityManager(unitName); - return em.getTransaction(); } Modified: tapestry/tapestry5/trunk/tapestry-jpa/src/main/java/org/apache/tapestry5/internal/jpa/EntityManagerManagerImpl.java URL: http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-jpa/src/main/java/org/apache/tapestry5/internal/jpa/EntityManagerManagerImpl.java?rev=1081237&r1=1081236&r2=1081237&view=diff ============================================================================== --- tapestry/tapestry5/trunk/tapestry-jpa/src/main/java/org/apache/tapestry5/internal/jpa/EntityManagerManagerImpl.java (original) +++ tapestry/tapestry5/trunk/tapestry-jpa/src/main/java/org/apache/tapestry5/internal/jpa/EntityManagerManagerImpl.java Sun Mar 13 23:32:58 2011 @@ -19,6 +19,7 @@ import java.util.Map; import java.util.Map.Entry; import javax.persistence.EntityManager; +import javax.persistence.spi.PersistenceUnitInfo; import org.apache.tapestry5.ioc.internal.util.CollectionFactory; import org.apache.tapestry5.ioc.services.ThreadCleanupListener; @@ -55,9 +56,19 @@ public class EntityManagerManagerImpl im */ public Map<String, EntityManager> getEntityManagers() { + createAllEntityManagers(); + return Collections.unmodifiableMap(entityManagers); } + private void createAllEntityManagers() + { + for (final PersistenceUnitInfo info : entityManagerSource.getPersistenceUnitInfos()) + { + getOrCreateEntityManager(info.getPersistenceUnitName()); + } + } + private EntityManager getOrCreateEntityManager(final String persistenceUnitName) { EntityManager em = entityManagers.get(persistenceUnitName); Modified: tapestry/tapestry5/trunk/tapestry-jpa/src/main/java/org/apache/tapestry5/internal/jpa/JpaInternalUtils.java URL: http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-jpa/src/main/java/org/apache/tapestry5/internal/jpa/JpaInternalUtils.java?rev=1081237&r1=1081236&r2=1081237&view=diff ============================================================================== --- tapestry/tapestry5/trunk/tapestry-jpa/src/main/java/org/apache/tapestry5/internal/jpa/JpaInternalUtils.java (original) +++ tapestry/tapestry5/trunk/tapestry-jpa/src/main/java/org/apache/tapestry5/internal/jpa/JpaInternalUtils.java Sun Mar 13 23:32:58 2011 @@ -19,9 +19,11 @@ import java.util.Set; import javax.persistence.EntityManager; import javax.persistence.EntityManagerFactory; +import javax.persistence.PersistenceUnit; import javax.persistence.metamodel.EntityType; import javax.persistence.metamodel.Metamodel; +import org.apache.tapestry5.ioc.internal.util.InternalUtils; import org.apache.tapestry5.jpa.EntityManagerManager; import org.apache.tapestry5.jpa.JpaConstants; @@ -71,4 +73,20 @@ public class JpaInternalUtils "Failed persisting an entity in the session. The entity '%s' does not belong to any of the existing persistence contexts.", entity)); } + + public static EntityManager getEntityManager(EntityManagerManager entityManagerManager, + PersistenceUnit annotation) + { + String unitName = annotation == null? null: annotation.unitName(); + + if (InternalUtils.isNonBlank(unitName)) + return entityManagerManager.getEntityManager(unitName); + + Map<String, EntityManager> entityManagers = entityManagerManager.getEntityManagers(); + + if (entityManagers.size() == 1) + return entityManagers.values().iterator().next(); + + return null; + } } Modified: tapestry/tapestry5/trunk/tapestry-jpa/src/main/java/org/apache/tapestry5/internal/jpa/PersistenceUnitWorker.java URL: http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-jpa/src/main/java/org/apache/tapestry5/internal/jpa/PersistenceUnitWorker.java?rev=1081237&r1=1081236&r2=1081237&view=diff ============================================================================== --- tapestry/tapestry5/trunk/tapestry-jpa/src/main/java/org/apache/tapestry5/internal/jpa/PersistenceUnitWorker.java (original) +++ tapestry/tapestry5/trunk/tapestry-jpa/src/main/java/org/apache/tapestry5/internal/jpa/PersistenceUnitWorker.java Sun Mar 13 23:32:58 2011 @@ -52,13 +52,7 @@ public class PersistenceUnitWorker imple public Object get() { - - final String unitName = annotation.unitName(); - - if (unitName != null) - return entityManagerManager.getEntityManager(unitName); - - return null; + return JpaInternalUtils.getEntityManager(entityManagerManager, annotation); } public void set(final Object newValue) Modified: tapestry/tapestry5/trunk/tapestry-jpa/src/main/java/org/apache/tapestry5/jpa/JpaModule.java URL: http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-jpa/src/main/java/org/apache/tapestry5/jpa/JpaModule.java?rev=1081237&r1=1081236&r2=1081237&view=diff ============================================================================== --- tapestry/tapestry5/trunk/tapestry-jpa/src/main/java/org/apache/tapestry5/jpa/JpaModule.java (original) +++ tapestry/tapestry5/trunk/tapestry-jpa/src/main/java/org/apache/tapestry5/jpa/JpaModule.java Sun Mar 13 23:32:58 2011 @@ -70,21 +70,21 @@ public class JpaModule public static void bind(final ServiceBinder binder) { binder.bind(JpaTransactionAdvisor.class, JpaTransactionAdvisorImpl.class); - binder.bind(PersistenceUnitConfigurer.class, PackageNamePersistenceUnitConfigurer.class).withId("PackageNamePersistenceUnitConfigurer"); + binder.bind(PersistenceUnitConfigurer.class, PackageNamePersistenceUnitConfigurer.class) + .withId("PackageNamePersistenceUnitConfigurer"); } - public static EntityManagerSource buildEntityManagerSource( - final Logger logger, - - @Symbol(JpaSymbols.PERSISTENCE_DESCRIPTOR) - Resource persistenceDescriptor, - - @Local - PersistenceUnitConfigurer persistenceUnitConfigurer, - - final Map<String, PersistenceUnitConfigurer> configuration, - - final RegistryShutdownHub hub) + public static EntityManagerSource buildEntityManagerSource(final Logger logger, + + @Symbol(JpaSymbols.PERSISTENCE_DESCRIPTOR) + Resource persistenceDescriptor, + + @Local + PersistenceUnitConfigurer persistenceUnitConfigurer, + + final Map<String, PersistenceUnitConfigurer> configuration, + + final RegistryShutdownHub hub) { final EntityManagerSourceImpl ems = new EntityManagerSourceImpl(logger, persistenceDescriptor, persistenceUnitConfigurer, configuration); @@ -242,17 +242,14 @@ public class JpaModule } @Startup - public static void startupEarly(final EntityManagerSource entityManagerSource, + public static void startupEarly(final EntityManagerManager entityManagerManager, @Symbol(JpaSymbols.EARLY_START_UP) final boolean earlyStartup) { if (!earlyStartup) return; - for (final PersistenceUnitInfo info : entityManagerSource.getPersistenceUnitInfos()) - { - entityManagerSource.create(info.getPersistenceUnitName()); - } + entityManagerManager.getEntityManagers(); } Modified: tapestry/tapestry5/trunk/tapestry-jpa/src/test/java/org/apache/tapestry5/internal/jpa/JpaTransactionAdvisorImplTest.java URL: http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-jpa/src/test/java/org/apache/tapestry5/internal/jpa/JpaTransactionAdvisorImplTest.java?rev=1081237&r1=1081236&r2=1081237&view=diff ============================================================================== --- tapestry/tapestry5/trunk/tapestry-jpa/src/test/java/org/apache/tapestry5/internal/jpa/JpaTransactionAdvisorImplTest.java (original) +++ tapestry/tapestry5/trunk/tapestry-jpa/src/test/java/org/apache/tapestry5/internal/jpa/JpaTransactionAdvisorImplTest.java Sun Mar 13 23:32:58 2011 @@ -15,6 +15,7 @@ package org.apache.tapestry5.internal.jpa; import java.sql.SQLException; +import java.util.Map; import javax.persistence.EntityManager; import javax.persistence.EntityTransaction; @@ -22,6 +23,7 @@ import javax.persistence.PersistenceUnit import org.apache.tapestry5.ioc.IOCUtilities; import org.apache.tapestry5.ioc.Registry; +import org.apache.tapestry5.ioc.internal.util.CollectionFactory; import org.apache.tapestry5.ioc.services.AspectDecorator; import org.apache.tapestry5.ioc.services.AspectInterceptorBuilder; import org.apache.tapestry5.ioc.test.IOCTestCase; @@ -81,11 +83,68 @@ public class JpaTransactionAdvisorImplTe } @Test + public void persistence_unit_name_missing() + { + final VoidService delegate = newMock(VoidService.class); + final EntityManagerManager manager = newMock(EntityManagerManager.class); + final JpaTransactionAdvisor advisor = newJpaTransactionAdvisor(manager); + Map<String, EntityManager> managers = CollectionFactory.newMap(); + managers.put("A", newMock(EntityManager.class)); + managers.put("B", newMock(EntityManager.class)); + + final AspectInterceptorBuilder<VoidService> builder = aspectDecorator.createBuilder( + VoidService.class, delegate, "foo.Bar"); + + advisor.addTransactionCommitAdvice(builder); + + final VoidService interceptor = builder.build(); + + expect(manager.getEntityManagers()).andReturn(managers); + + delegate.persistenceUnitNameMissing(); + + replay(); + interceptor.persistenceUnitNameMissing(); + verify(); + } + + @Test + public void persistence_unit_name_missing_single_unit_configured() + { + final VoidService delegate = newMock(VoidService.class); + final EntityManagerManager manager = newMock(EntityManagerManager.class); + final JpaTransactionAdvisor advisor = newJpaTransactionAdvisor(manager); + 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"); + + advisor.addTransactionCommitAdvice(builder); + + final VoidService interceptor = builder.build(); + + expect(manager.getEntityManagers()).andReturn(managers); + train_getTransaction(em, transaction, true); + delegate.persistenceUnitNameMissing(); + train_commitActiveTransaction(transaction); + + replay(); + interceptor.persistenceUnitNameMissing(); + verify(); + } + + @Test public void persistence_unit_missing() { final VoidService delegate = newMock(VoidService.class); final EntityManagerManager manager = newMock(EntityManagerManager.class); final JpaTransactionAdvisor advisor = newJpaTransactionAdvisor(manager); + Map<String, EntityManager> managers = CollectionFactory.newMap(); + managers.put("A", newMock(EntityManager.class)); + managers.put("B", newMock(EntityManager.class)); final AspectInterceptorBuilder<VoidService> builder = aspectDecorator.createBuilder( VoidService.class, delegate, "foo.Bar"); @@ -94,19 +153,24 @@ public class JpaTransactionAdvisorImplTe final VoidService interceptor = builder.build(); + expect(manager.getEntityManagers()).andReturn(managers); delegate.persistenceUnitMissing(); replay(); interceptor.persistenceUnitMissing(); verify(); } - + @Test - public void persistence_unit_name_missing() + public void persistence_unit_missing_single_unit_configured() { final VoidService delegate = newMock(VoidService.class); final EntityManagerManager manager = newMock(EntityManagerManager.class); - final JpaTransactionAdvisor advisor = newJpaTransactionAdvisor(manager); + final JpaTransactionAdvisor advisor = newJpaTransactionAdvisor(manager); + 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"); @@ -115,10 +179,13 @@ public class JpaTransactionAdvisorImplTe final VoidService interceptor = builder.build(); - delegate.persistenceUnitNameMissing(); + expect(manager.getEntityManagers()).andReturn(managers); + train_getTransaction(em, transaction, true); + delegate.persistenceUnitMissing(); + train_commitActiveTransaction(transaction); replay(); - interceptor.persistenceUnitNameMissing(); + interceptor.persistenceUnitMissing(); verify(); } @@ -341,6 +408,13 @@ public class JpaTransactionAdvisorImplTe final boolean isActive) { expect(manager.getEntityManager(UNIT_NAME)).andReturn(entityManager); + train_getTransaction(entityManager, transaction, isActive); + } + + private void train_getTransaction( + final EntityManager entityManager, final EntityTransaction transaction, + final boolean isActive) + { expect(entityManager.getTransaction()).andReturn(transaction); expect(transaction.isActive()).andReturn(isActive); } @@ -404,10 +478,10 @@ public class JpaTransactionAdvisorImplTe @CommitAfter @PersistenceUnit - void persistenceUnitMissing(); + void persistenceUnitNameMissing(); @CommitAfter - void persistenceUnitNameMissing(); + void persistenceUnitMissing(); @CommitAfter @PersistenceUnit(unitName = UNIT_NAME) Modified: tapestry/tapestry5/trunk/tapestry-jpa/src/test/java/org/example/app2/pages/PersistItem.java URL: http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-jpa/src/test/java/org/example/app2/pages/PersistItem.java?rev=1081237&r1=1081236&r2=1081237&view=diff ============================================================================== --- tapestry/tapestry5/trunk/tapestry-jpa/src/test/java/org/example/app2/pages/PersistItem.java (original) +++ tapestry/tapestry5/trunk/tapestry-jpa/src/test/java/org/example/app2/pages/PersistItem.java Sun Mar 13 23:32:58 2011 @@ -24,7 +24,7 @@ import org.example.app2.entities.Item; public class PersistItem { - @PersistenceUnit(unitName = "App2PersistenceUnit") + @PersistenceUnit private EntityManager entityManager; @Persist("entity") @@ -32,7 +32,6 @@ public class PersistItem private Item item; @CommitAfter - @PersistenceUnit(unitName = "App2PersistenceUnit") void onCreateEntity() { final Item item = new Item();