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