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 | 74 | * Persistence unit of the delegated EntityManager. |
75 | 75 | */ |
76 | 76 | private String persistenceUnit; |
77 | + | |
78 | + /** | |
79 | + * demoiselle-jpa configuration options | |
80 | + */ | |
81 | + private EntityManagerConfig configuration; | |
77 | 82 | |
78 | 83 | /** |
79 | 84 | * Constructor based on persistence unit name. |
... | ... | @@ -113,7 +118,8 @@ public class EntityManagerProxy implements EntityManager, Serializable { |
113 | 118 | @Override |
114 | 119 | public <T> T merge(T entity) { |
115 | 120 | joinTransactionIfNecessary(); |
116 | - checkEntityManagerScopePassivable(entity); | |
121 | + T managedEntity = getEntityManagerDelegate().merge(entity); | |
122 | + checkEntityManagerScopePassivable(managedEntity); | |
117 | 123 | return getEntityManagerDelegate().merge(entity); |
118 | 124 | } |
119 | 125 | |
... | ... | @@ -155,6 +161,7 @@ public class EntityManagerProxy implements EntityManager, Serializable { |
155 | 161 | @Override |
156 | 162 | public <T> T find(Class<T> entityClass, Object primaryKey, LockModeType lockMode) { |
157 | 163 | joinTransactionIfNecessary(); |
164 | + checkEntityManagerScopePassivable(lockMode); | |
158 | 165 | return getEntityManagerDelegate().find(entityClass, primaryKey, lockMode); |
159 | 166 | } |
160 | 167 | |
... | ... | @@ -166,6 +173,7 @@ public class EntityManagerProxy implements EntityManager, Serializable { |
166 | 173 | @Override |
167 | 174 | public <T> T find(Class<T> entityClass, Object primaryKey, LockModeType lockMode, Map<String, Object> properties) { |
168 | 175 | joinTransactionIfNecessary(); |
176 | + checkEntityManagerScopePassivable(lockMode); | |
169 | 177 | return getEntityManagerDelegate().find(entityClass, primaryKey, lockMode, properties); |
170 | 178 | } |
171 | 179 | |
... | ... | @@ -213,6 +221,7 @@ public class EntityManagerProxy implements EntityManager, Serializable { |
213 | 221 | @Override |
214 | 222 | public void lock(Object entity, LockModeType lockMode) { |
215 | 223 | joinTransactionIfNecessary(); |
224 | + checkEntityManagerScopePassivable(lockMode); | |
216 | 225 | getEntityManagerDelegate().lock(entity, lockMode); |
217 | 226 | } |
218 | 227 | |
... | ... | @@ -223,6 +232,7 @@ public class EntityManagerProxy implements EntityManager, Serializable { |
223 | 232 | @Override |
224 | 233 | public void lock(Object entity, LockModeType lockMode, Map<String, Object> properties) { |
225 | 234 | joinTransactionIfNecessary(); |
235 | + checkEntityManagerScopePassivable(lockMode); | |
226 | 236 | getEntityManagerDelegate().lock(entity, lockMode, properties); |
227 | 237 | } |
228 | 238 | |
... | ... | @@ -363,7 +373,7 @@ public class EntityManagerProxy implements EntityManager, Serializable { |
363 | 373 | */ |
364 | 374 | @Override |
365 | 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 | 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 | 549 | EntityManagerConfig configuration = getConfiguration(); |
538 | 550 | if (configuration.getEntityManagerScope()==EntityManagerScope.CONVERSATION |
539 | 551 | || configuration.getEntityManagerScope()==EntityManagerScope.SESSION |
540 | 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 | 558 | getLogger().error(message); |
545 | 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 | 46 | malformed-jpql=Consulta JPQL mal formada para pagina\u00E7\u00E3o de dados. |
47 | 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 | 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 | 50 | defining-entity-manager-scope=Definindo escopo [{0}] para produtor de Entity Manager |
51 | 51 | \ No newline at end of file | ... | ... |
impl/extension/jpa/src/test/java/producer/ProducerTest.java
... | ... | @@ -22,7 +22,7 @@ public class ProducerTest { |
22 | 22 | |
23 | 23 | private static final String PATH = "src/test/resources/producer"; |
24 | 24 | |
25 | - @Deployment//(name="request_scoped_producer") | |
25 | + @Deployment | |
26 | 26 | public static WebArchive createDeployment() { |
27 | 27 | WebArchive deployment = Tests.createDeployment(ProducerTest.class); |
28 | 28 | deployment.addAsResource(Tests.createFileAsset(PATH + "/persistence.xml"), "META-INF/persistence.xml"); |
... | ... | @@ -31,15 +31,6 @@ public class ProducerTest { |
31 | 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 | 34 | @Test |
44 | 35 | public void produceEntityManager() { |
45 | 36 | EntityManager manager = Beans.getReference(EntityManager.class); | ... | ... |