From 375d8777722dd816ab9cc95283f8b3f025295c6d Mon Sep 17 00:00:00 2001 From: Dancovich Date: Mon, 23 Sep 2013 15:09:34 -0300 Subject: [PATCH] Implementando escopo selecionável no Entity Manager --- impl/extension/jpa/src/main/java/br/gov/frameworkdemoiselle/internal/proxy/EntityManagerProxy.java | 62 ++++++++++++++++++++++++++++++++++++++++++++++---------------- impl/extension/jpa/src/main/resources/demoiselle-jpa-bundle.properties | 2 +- impl/extension/jpa/src/test/java/producer/ProducerTest.java | 11 +---------- 3 files changed, 48 insertions(+), 27 deletions(-) diff --git a/impl/extension/jpa/src/main/java/br/gov/frameworkdemoiselle/internal/proxy/EntityManagerProxy.java b/impl/extension/jpa/src/main/java/br/gov/frameworkdemoiselle/internal/proxy/EntityManagerProxy.java index e6ae130..4ef1155 100644 --- a/impl/extension/jpa/src/main/java/br/gov/frameworkdemoiselle/internal/proxy/EntityManagerProxy.java +++ b/impl/extension/jpa/src/main/java/br/gov/frameworkdemoiselle/internal/proxy/EntityManagerProxy.java @@ -74,6 +74,11 @@ public class EntityManagerProxy implements EntityManager, Serializable { * Persistence unit of the delegated EntityManager. */ private String persistenceUnit; + + /** + * demoiselle-jpa configuration options + */ + private EntityManagerConfig configuration; /** * Constructor based on persistence unit name. @@ -113,7 +118,8 @@ public class EntityManagerProxy implements EntityManager, Serializable { @Override public T merge(T entity) { joinTransactionIfNecessary(); - checkEntityManagerScopePassivable(entity); + T managedEntity = getEntityManagerDelegate().merge(entity); + checkEntityManagerScopePassivable(managedEntity); return getEntityManagerDelegate().merge(entity); } @@ -155,6 +161,7 @@ public class EntityManagerProxy implements EntityManager, Serializable { @Override public T find(Class entityClass, Object primaryKey, LockModeType lockMode) { joinTransactionIfNecessary(); + checkEntityManagerScopePassivable(lockMode); return getEntityManagerDelegate().find(entityClass, primaryKey, lockMode); } @@ -166,6 +173,7 @@ public class EntityManagerProxy implements EntityManager, Serializable { @Override public T find(Class entityClass, Object primaryKey, LockModeType lockMode, Map properties) { joinTransactionIfNecessary(); + checkEntityManagerScopePassivable(lockMode); return getEntityManagerDelegate().find(entityClass, primaryKey, lockMode, properties); } @@ -213,6 +221,7 @@ public class EntityManagerProxy implements EntityManager, Serializable { @Override public void lock(Object entity, LockModeType lockMode) { joinTransactionIfNecessary(); + checkEntityManagerScopePassivable(lockMode); getEntityManagerDelegate().lock(entity, lockMode); } @@ -223,6 +232,7 @@ public class EntityManagerProxy implements EntityManager, Serializable { @Override public void lock(Object entity, LockModeType lockMode, Map properties) { joinTransactionIfNecessary(); + checkEntityManagerScopePassivable(lockMode); getEntityManagerDelegate().lock(entity, lockMode, properties); } @@ -363,7 +373,7 @@ public class EntityManagerProxy implements EntityManager, Serializable { */ @Override public TypedQuery createNamedQuery(String name, Class resultClass) { - return getEntityManagerDelegate().createNamedQuery(name, resultClass); + return new TypedQueryProxy(getEntityManagerDelegate().createNamedQuery(name, resultClass),this); } /* @@ -521,29 +531,49 @@ public class EntityManagerProxy implements EntityManager, Serializable { return getEntityManagerDelegate().toString(); } - public EntityManagerConfig getConfiguration() { - return Beans.getReference(EntityManagerConfig.class); - } - - public Logger getLogger() { - return Beans.getReference(Logger.class); - } - - public ResourceBundle getBundle(){ - return Beans.getReference(ResourceBundle.class,new NameQualifier("demoiselle-jpa-bundle")); + private void checkEntityManagerScopePassivable(Object entity) { + EntityManagerConfig configuration = getConfiguration(); + if (configuration.getEntityManagerScope()==EntityManagerScope.CONVERSATION + || configuration.getEntityManagerScope()==EntityManagerScope.SESSION + || configuration.getEntityManagerScope()==EntityManagerScope.VIEW){ + + LockModeType lockMode = null; + if (getEntityManagerDelegate().contains(entity)){ + lockMode = getEntityManagerDelegate().getLockMode(entity); + } + checkEntityManagerScopePassivable(lockMode); + } } - private void checkEntityManagerScopePassivable(Object entity) { + private void checkEntityManagerScopePassivable(LockModeType lockMode) { EntityManagerConfig configuration = getConfiguration(); if (configuration.getEntityManagerScope()==EntityManagerScope.CONVERSATION || configuration.getEntityManagerScope()==EntityManagerScope.SESSION || configuration.getEntityManagerScope()==EntityManagerScope.VIEW){ - LockModeType lockMode = getEntityManagerDelegate().getLockMode(entity); - if (lockMode != LockModeType.OPTIMISTIC_FORCE_INCREMENT && lockMode != LockModeType.WRITE){ - String message = getBundle().getString("passivable-scope-with-pessimistic-lock" , configuration.getEntityManagerScope().toString()); + + if (lockMode!=null + && lockMode!=LockModeType.NONE + && lockMode!=LockModeType.OPTIMISTIC_FORCE_INCREMENT){ + String message = getBundle().getString("passivable-scope-without-optimistic-lock" , configuration.getEntityManagerScope().toString()); getLogger().error(message); throw new DemoiselleException(message); } } } + + private EntityManagerConfig getConfiguration(){ + if (configuration==null){ + configuration = Beans.getReference(EntityManagerConfig.class); + } + + return configuration; + } + + private Logger getLogger() { + return Beans.getReference(Logger.class); + } + + private ResourceBundle getBundle(){ + return Beans.getReference(ResourceBundle.class,new NameQualifier("demoiselle-jpa-bundle")); + } } diff --git a/impl/extension/jpa/src/main/resources/demoiselle-jpa-bundle.properties b/impl/extension/jpa/src/main/resources/demoiselle-jpa-bundle.properties index 1efa832..1d5cce2 100644 --- a/impl/extension/jpa/src/main/resources/demoiselle-jpa-bundle.properties +++ b/impl/extension/jpa/src/main/resources/demoiselle-jpa-bundle.properties @@ -46,5 +46,5 @@ no-transaction-active=Nenhuma transa\u00E7\u00E3o est\u00E1 ativa, verifique a c malformed-jpql=Consulta JPQL mal formada para pagina\u00E7\u00E3o de dados. invalid-scope-for-entity-manager=O escopo especificado para o Entity Manager \u00E9 inv\u00E1lido. Por favor informe um dos escopos v\u00E1lidos para a propriedade frameworkdemoiselle.persistence.entitymanager.scope\: request, session, view, conversation, application entity-manager-scope-not-defined=N\u00E3o foi poss\u00EDvel ler o escopo configurado para o Entity Manager, usando o escopo padr\u00E3o [{0}] -passivable-scope-with-pessimistic-lock=Entity Manager armazenado no escopo [{0}] requer o uso de trava otimista com vers\u00E3o (veja [LockModeType.OPTIMISTIC_FORCE_INCREMENT]) +passivable-scope-without-optimistic-lock=Um Entity Manager armazenado no escopo [{0}] suporta apenas trava otimista com vers\u00E3o. Use o tipo adequado ou remova a trava. (veja [LockModeType.OPTIMISTIC_FORCE_INCREMENT]) defining-entity-manager-scope=Definindo escopo [{0}] para produtor de Entity Manager \ No newline at end of file diff --git a/impl/extension/jpa/src/test/java/producer/ProducerTest.java b/impl/extension/jpa/src/test/java/producer/ProducerTest.java index ef45f70..2ffe3cf 100644 --- a/impl/extension/jpa/src/test/java/producer/ProducerTest.java +++ b/impl/extension/jpa/src/test/java/producer/ProducerTest.java @@ -22,7 +22,7 @@ public class ProducerTest { private static final String PATH = "src/test/resources/producer"; - @Deployment//(name="request_scoped_producer") + @Deployment public static WebArchive createDeployment() { WebArchive deployment = Tests.createDeployment(ProducerTest.class); deployment.addAsResource(Tests.createFileAsset(PATH + "/persistence.xml"), "META-INF/persistence.xml"); @@ -31,15 +31,6 @@ public class ProducerTest { return deployment; } - /*@Deployment(name="no_scoped_producer") - public static WebArchive createNoScopedDeployment() { - WebArchive deployment = Tests.createDeployment(ProducerTest.class); - deployment.addAsResource(Tests.createFileAsset(PATH + "/persistence.xml"), "META-INF/persistence.xml"); - deployment.addAsResource(Tests.createFileAsset(PATH + "/demoiselle_noscoped.properties"), "demoiselle.properties"); - - return deployment; - }*/ - @Test public void produceEntityManager() { EntityManager manager = Beans.getReference(EntityManager.class); -- libgit2 0.21.2