Commit 375d8777722dd816ab9cc95283f8b3f025295c6d
1 parent
5a4268c1
Exists in
master
Implementando escopo selecionável no Entity Manager
Showing
3 changed files
with
48 additions
and
27 deletions
Show diff stats
impl/extension/jpa/src/main/java/br/gov/frameworkdemoiselle/internal/proxy/EntityManagerProxy.java
| @@ -74,6 +74,11 @@ public class EntityManagerProxy implements EntityManager, Serializable { | @@ -74,6 +74,11 @@ public class EntityManagerProxy implements EntityManager, Serializable { | ||
| 74 | * Persistence unit of the delegated EntityManager. | 74 | * Persistence unit of the delegated EntityManager. |
| 75 | */ | 75 | */ |
| 76 | private String persistenceUnit; | 76 | private String persistenceUnit; |
| 77 | + | ||
| 78 | + /** | ||
| 79 | + * demoiselle-jpa configuration options | ||
| 80 | + */ | ||
| 81 | + private EntityManagerConfig configuration; | ||
| 77 | 82 | ||
| 78 | /** | 83 | /** |
| 79 | * Constructor based on persistence unit name. | 84 | * Constructor based on persistence unit name. |
| @@ -113,7 +118,8 @@ public class EntityManagerProxy implements EntityManager, Serializable { | @@ -113,7 +118,8 @@ public class EntityManagerProxy implements EntityManager, Serializable { | ||
| 113 | @Override | 118 | @Override |
| 114 | public <T> T merge(T entity) { | 119 | public <T> T merge(T entity) { |
| 115 | joinTransactionIfNecessary(); | 120 | joinTransactionIfNecessary(); |
| 116 | - checkEntityManagerScopePassivable(entity); | 121 | + T managedEntity = getEntityManagerDelegate().merge(entity); |
| 122 | + checkEntityManagerScopePassivable(managedEntity); | ||
| 117 | return getEntityManagerDelegate().merge(entity); | 123 | return getEntityManagerDelegate().merge(entity); |
| 118 | } | 124 | } |
| 119 | 125 | ||
| @@ -155,6 +161,7 @@ public class EntityManagerProxy implements EntityManager, Serializable { | @@ -155,6 +161,7 @@ public class EntityManagerProxy implements EntityManager, Serializable { | ||
| 155 | @Override | 161 | @Override |
| 156 | public <T> T find(Class<T> entityClass, Object primaryKey, LockModeType lockMode) { | 162 | public <T> T find(Class<T> entityClass, Object primaryKey, LockModeType lockMode) { |
| 157 | joinTransactionIfNecessary(); | 163 | joinTransactionIfNecessary(); |
| 164 | + checkEntityManagerScopePassivable(lockMode); | ||
| 158 | return getEntityManagerDelegate().find(entityClass, primaryKey, lockMode); | 165 | return getEntityManagerDelegate().find(entityClass, primaryKey, lockMode); |
| 159 | } | 166 | } |
| 160 | 167 | ||
| @@ -166,6 +173,7 @@ public class EntityManagerProxy implements EntityManager, Serializable { | @@ -166,6 +173,7 @@ public class EntityManagerProxy implements EntityManager, Serializable { | ||
| 166 | @Override | 173 | @Override |
| 167 | public <T> T find(Class<T> entityClass, Object primaryKey, LockModeType lockMode, Map<String, Object> properties) { | 174 | public <T> T find(Class<T> entityClass, Object primaryKey, LockModeType lockMode, Map<String, Object> properties) { |
| 168 | joinTransactionIfNecessary(); | 175 | joinTransactionIfNecessary(); |
| 176 | + checkEntityManagerScopePassivable(lockMode); | ||
| 169 | return getEntityManagerDelegate().find(entityClass, primaryKey, lockMode, properties); | 177 | return getEntityManagerDelegate().find(entityClass, primaryKey, lockMode, properties); |
| 170 | } | 178 | } |
| 171 | 179 | ||
| @@ -213,6 +221,7 @@ public class EntityManagerProxy implements EntityManager, Serializable { | @@ -213,6 +221,7 @@ public class EntityManagerProxy implements EntityManager, Serializable { | ||
| 213 | @Override | 221 | @Override |
| 214 | public void lock(Object entity, LockModeType lockMode) { | 222 | public void lock(Object entity, LockModeType lockMode) { |
| 215 | joinTransactionIfNecessary(); | 223 | joinTransactionIfNecessary(); |
| 224 | + checkEntityManagerScopePassivable(lockMode); | ||
| 216 | getEntityManagerDelegate().lock(entity, lockMode); | 225 | getEntityManagerDelegate().lock(entity, lockMode); |
| 217 | } | 226 | } |
| 218 | 227 | ||
| @@ -223,6 +232,7 @@ public class EntityManagerProxy implements EntityManager, Serializable { | @@ -223,6 +232,7 @@ public class EntityManagerProxy implements EntityManager, Serializable { | ||
| 223 | @Override | 232 | @Override |
| 224 | public void lock(Object entity, LockModeType lockMode, Map<String, Object> properties) { | 233 | public void lock(Object entity, LockModeType lockMode, Map<String, Object> properties) { |
| 225 | joinTransactionIfNecessary(); | 234 | joinTransactionIfNecessary(); |
| 235 | + checkEntityManagerScopePassivable(lockMode); | ||
| 226 | getEntityManagerDelegate().lock(entity, lockMode, properties); | 236 | getEntityManagerDelegate().lock(entity, lockMode, properties); |
| 227 | } | 237 | } |
| 228 | 238 | ||
| @@ -363,7 +373,7 @@ public class EntityManagerProxy implements EntityManager, Serializable { | @@ -363,7 +373,7 @@ public class EntityManagerProxy implements EntityManager, Serializable { | ||
| 363 | */ | 373 | */ |
| 364 | @Override | 374 | @Override |
| 365 | public <T> TypedQuery<T> createNamedQuery(String name, Class<T> resultClass) { | 375 | public <T> TypedQuery<T> createNamedQuery(String name, Class<T> resultClass) { |
| 366 | - return getEntityManagerDelegate().createNamedQuery(name, resultClass); | 376 | + return new TypedQueryProxy<T>(getEntityManagerDelegate().createNamedQuery(name, resultClass),this); |
| 367 | } | 377 | } |
| 368 | 378 | ||
| 369 | /* | 379 | /* |
| @@ -521,29 +531,49 @@ public class EntityManagerProxy implements EntityManager, Serializable { | @@ -521,29 +531,49 @@ public class EntityManagerProxy implements EntityManager, Serializable { | ||
| 521 | return getEntityManagerDelegate().toString(); | 531 | return getEntityManagerDelegate().toString(); |
| 522 | } | 532 | } |
| 523 | 533 | ||
| 524 | - public EntityManagerConfig getConfiguration() { | ||
| 525 | - return Beans.getReference(EntityManagerConfig.class); | ||
| 526 | - } | ||
| 527 | - | ||
| 528 | - public Logger getLogger() { | ||
| 529 | - return Beans.getReference(Logger.class); | ||
| 530 | - } | ||
| 531 | - | ||
| 532 | - public ResourceBundle getBundle(){ | ||
| 533 | - return Beans.getReference(ResourceBundle.class,new NameQualifier("demoiselle-jpa-bundle")); | 534 | + private void checkEntityManagerScopePassivable(Object entity) { |
| 535 | + EntityManagerConfig configuration = getConfiguration(); | ||
| 536 | + if (configuration.getEntityManagerScope()==EntityManagerScope.CONVERSATION | ||
| 537 | + || configuration.getEntityManagerScope()==EntityManagerScope.SESSION | ||
| 538 | + || configuration.getEntityManagerScope()==EntityManagerScope.VIEW){ | ||
| 539 | + | ||
| 540 | + LockModeType lockMode = null; | ||
| 541 | + if (getEntityManagerDelegate().contains(entity)){ | ||
| 542 | + lockMode = getEntityManagerDelegate().getLockMode(entity); | ||
| 543 | + } | ||
| 544 | + checkEntityManagerScopePassivable(lockMode); | ||
| 545 | + } | ||
| 534 | } | 546 | } |
| 535 | 547 | ||
| 536 | - private void checkEntityManagerScopePassivable(Object entity) { | 548 | + private void checkEntityManagerScopePassivable(LockModeType lockMode) { |
| 537 | EntityManagerConfig configuration = getConfiguration(); | 549 | EntityManagerConfig configuration = getConfiguration(); |
| 538 | if (configuration.getEntityManagerScope()==EntityManagerScope.CONVERSATION | 550 | if (configuration.getEntityManagerScope()==EntityManagerScope.CONVERSATION |
| 539 | || configuration.getEntityManagerScope()==EntityManagerScope.SESSION | 551 | || configuration.getEntityManagerScope()==EntityManagerScope.SESSION |
| 540 | || configuration.getEntityManagerScope()==EntityManagerScope.VIEW){ | 552 | || configuration.getEntityManagerScope()==EntityManagerScope.VIEW){ |
| 541 | - LockModeType lockMode = getEntityManagerDelegate().getLockMode(entity); | ||
| 542 | - if (lockMode != LockModeType.OPTIMISTIC_FORCE_INCREMENT && lockMode != LockModeType.WRITE){ | ||
| 543 | - String message = getBundle().getString("passivable-scope-with-pessimistic-lock" , configuration.getEntityManagerScope().toString()); | 553 | + |
| 554 | + if (lockMode!=null | ||
| 555 | + && lockMode!=LockModeType.NONE | ||
| 556 | + && lockMode!=LockModeType.OPTIMISTIC_FORCE_INCREMENT){ | ||
| 557 | + String message = getBundle().getString("passivable-scope-without-optimistic-lock" , configuration.getEntityManagerScope().toString()); | ||
| 544 | getLogger().error(message); | 558 | getLogger().error(message); |
| 545 | throw new DemoiselleException(message); | 559 | throw new DemoiselleException(message); |
| 546 | } | 560 | } |
| 547 | } | 561 | } |
| 548 | } | 562 | } |
| 563 | + | ||
| 564 | + private EntityManagerConfig getConfiguration(){ | ||
| 565 | + if (configuration==null){ | ||
| 566 | + configuration = Beans.getReference(EntityManagerConfig.class); | ||
| 567 | + } | ||
| 568 | + | ||
| 569 | + return configuration; | ||
| 570 | + } | ||
| 571 | + | ||
| 572 | + private Logger getLogger() { | ||
| 573 | + return Beans.getReference(Logger.class); | ||
| 574 | + } | ||
| 575 | + | ||
| 576 | + private ResourceBundle getBundle(){ | ||
| 577 | + return Beans.getReference(ResourceBundle.class,new NameQualifier("demoiselle-jpa-bundle")); | ||
| 578 | + } | ||
| 549 | } | 579 | } |
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 | @@ -46,5 +46,5 @@ no-transaction-active=Nenhuma transa\u00E7\u00E3o est\u00E1 ativa, verifique a c | ||
| 46 | malformed-jpql=Consulta JPQL mal formada para pagina\u00E7\u00E3o de dados. | 46 | malformed-jpql=Consulta JPQL mal formada para pagina\u00E7\u00E3o de dados. |
| 47 | 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 | 47 | 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 |
| 48 | entity-manager-scope-not-defined=N\u00E3o foi poss\u00EDvel ler o escopo configurado para o Entity Manager, usando o escopo padr\u00E3o [{0}] | 48 | entity-manager-scope-not-defined=N\u00E3o foi poss\u00EDvel ler o escopo configurado para o Entity Manager, usando o escopo padr\u00E3o [{0}] |
| 49 | -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]) | 49 | +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]) |
| 50 | defining-entity-manager-scope=Definindo escopo [{0}] para produtor de Entity Manager | 50 | defining-entity-manager-scope=Definindo escopo [{0}] para produtor de Entity Manager |
| 51 | \ No newline at end of file | 51 | \ No newline at end of file |
impl/extension/jpa/src/test/java/producer/ProducerTest.java
| @@ -22,7 +22,7 @@ public class ProducerTest { | @@ -22,7 +22,7 @@ public class ProducerTest { | ||
| 22 | 22 | ||
| 23 | private static final String PATH = "src/test/resources/producer"; | 23 | private static final String PATH = "src/test/resources/producer"; |
| 24 | 24 | ||
| 25 | - @Deployment//(name="request_scoped_producer") | 25 | + @Deployment |
| 26 | public static WebArchive createDeployment() { | 26 | public static WebArchive createDeployment() { |
| 27 | WebArchive deployment = Tests.createDeployment(ProducerTest.class); | 27 | WebArchive deployment = Tests.createDeployment(ProducerTest.class); |
| 28 | deployment.addAsResource(Tests.createFileAsset(PATH + "/persistence.xml"), "META-INF/persistence.xml"); | 28 | deployment.addAsResource(Tests.createFileAsset(PATH + "/persistence.xml"), "META-INF/persistence.xml"); |
| @@ -31,15 +31,6 @@ public class ProducerTest { | @@ -31,15 +31,6 @@ public class ProducerTest { | ||
| 31 | return deployment; | 31 | return deployment; |
| 32 | } | 32 | } |
| 33 | 33 | ||
| 34 | - /*@Deployment(name="no_scoped_producer") | ||
| 35 | - public static WebArchive createNoScopedDeployment() { | ||
| 36 | - WebArchive deployment = Tests.createDeployment(ProducerTest.class); | ||
| 37 | - deployment.addAsResource(Tests.createFileAsset(PATH + "/persistence.xml"), "META-INF/persistence.xml"); | ||
| 38 | - deployment.addAsResource(Tests.createFileAsset(PATH + "/demoiselle_noscoped.properties"), "demoiselle.properties"); | ||
| 39 | - | ||
| 40 | - return deployment; | ||
| 41 | - }*/ | ||
| 42 | - | ||
| 43 | @Test | 34 | @Test |
| 44 | public void produceEntityManager() { | 35 | public void produceEntityManager() { |
| 45 | EntityManager manager = Beans.getReference(EntityManager.class); | 36 | EntityManager manager = Beans.getReference(EntityManager.class); |