You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@tapestry.apache.org by dr...@apache.org on 2011/03/14 00:32:58 UTC

svn commit: r1081237 - in /tapestry/tapestry5/trunk/tapestry-jpa/src: main/java/org/apache/tapestry5/internal/jpa/ main/java/org/apache/tapestry5/jpa/ test/java/org/apache/tapestry5/internal/jpa/ test/java/org/example/app2/pages/

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();