Commit 43b46f233ab2e1c0ef188dd0de6f037851792823
1 parent
b8efd70f
Exists in
master
Revertendo alterações por necessitar de mais testes
Showing
12 changed files
with
223 additions
and
40 deletions
Show diff stats
impl/extension/jpa/src/main/java/br/gov/frameworkdemoiselle/internal/producer/AbstractEntityManagerStore.java
... | ... | @@ -53,6 +53,8 @@ import org.slf4j.Logger; |
53 | 53 | import br.gov.frameworkdemoiselle.annotation.Name; |
54 | 54 | import br.gov.frameworkdemoiselle.internal.configuration.EntityManagerConfig; |
55 | 55 | import br.gov.frameworkdemoiselle.internal.configuration.EntityManagerConfig.EntityManagerScope; |
56 | +import br.gov.frameworkdemoiselle.util.Beans; | |
57 | +import br.gov.frameworkdemoiselle.util.NameQualifier; | |
56 | 58 | import br.gov.frameworkdemoiselle.util.ResourceBundle; |
57 | 59 | |
58 | 60 | /** |
... | ... | @@ -95,24 +97,35 @@ public abstract class AbstractEntityManagerStore implements Serializable { |
95 | 97 | entityManager = cache.get(persistenceUnit); |
96 | 98 | |
97 | 99 | } else { |
98 | - entityManager = factory.create(persistenceUnit).createEntityManager(); | |
100 | + entityManager = getFactory().create(persistenceUnit).createEntityManager(); | |
99 | 101 | entityManager.setFlushMode(FlushModeType.AUTO); |
100 | 102 | |
101 | 103 | cache.put(persistenceUnit, entityManager); |
102 | - this.logger.info(bundle.getString("entity-manager-was-created", persistenceUnit)); | |
104 | + this.getLogger().info(getBundle().getString("entity-manager-was-created", persistenceUnit)); | |
103 | 105 | } |
104 | 106 | |
105 | 107 | return entityManager; |
106 | 108 | } |
107 | 109 | |
108 | - @PostConstruct | |
110 | + /** | |
111 | + * Run this to initialize all persistence units. It's recomended this method | |
112 | + * be annotated with {@link PostConstruct}, so it runs as soon as an EntityManager gets injected. | |
113 | + */ | |
114 | + public abstract void initialize(); | |
115 | + | |
116 | + /** | |
117 | + * Run this to close all persistence units. It's recomended this method | |
118 | + * be annotated with {@link PreDestroy}, so it runs as soon as the scope the EntityManager is | |
119 | + * attached to ends. | |
120 | + */ | |
121 | + public abstract void terminate(); | |
122 | + | |
109 | 123 | void init() { |
110 | - for (String persistenceUnit : factory.getCache().keySet()) { | |
124 | + for (String persistenceUnit : getFactory().getCache().keySet()) { | |
111 | 125 | getEntityManager(persistenceUnit); |
112 | 126 | } |
113 | 127 | } |
114 | 128 | |
115 | - @PreDestroy | |
116 | 129 | void close() { |
117 | 130 | //Se o produtor não possui escopo, então o ciclo de vida |
118 | 131 | //de EntityManager produzidos é responsabilidade do desenvolvedor. Não |
... | ... | @@ -128,4 +141,25 @@ public abstract class AbstractEntityManagerStore implements Serializable { |
128 | 141 | Map<String, EntityManager> getCache() { |
129 | 142 | return cache; |
130 | 143 | } |
144 | + | |
145 | + private EntityManagerFactoryProducer getFactory(){ | |
146 | + if (factory==null){ | |
147 | + factory = Beans.getReference(EntityManagerFactoryProducer.class); | |
148 | + } | |
149 | + return factory; | |
150 | + } | |
151 | + | |
152 | + protected Logger getLogger(){ | |
153 | + if (logger==null){ | |
154 | + logger = Beans.getReference(Logger.class); | |
155 | + } | |
156 | + return logger; | |
157 | + } | |
158 | + | |
159 | + protected ResourceBundle getBundle(){ | |
160 | + if (bundle==null){ | |
161 | + bundle = Beans.getReference(ResourceBundle.class , new NameQualifier("demoiselle-jpa-bundle")); | |
162 | + } | |
163 | + return bundle; | |
164 | + } | |
131 | 165 | } | ... | ... |
impl/extension/jpa/src/main/java/br/gov/frameworkdemoiselle/internal/producer/ApplicationEntityManagerStore.java
... | ... | @@ -36,6 +36,8 @@ |
36 | 36 | */ |
37 | 37 | package br.gov.frameworkdemoiselle.internal.producer; |
38 | 38 | |
39 | +import javax.annotation.PostConstruct; | |
40 | +import javax.annotation.PreDestroy; | |
39 | 41 | import javax.enterprise.context.ApplicationScoped; |
40 | 42 | |
41 | 43 | /** |
... | ... | @@ -50,4 +52,16 @@ public class ApplicationEntityManagerStore extends AbstractEntityManagerStore { |
50 | 52 | |
51 | 53 | private static final long serialVersionUID = 1L; |
52 | 54 | |
55 | + @Override | |
56 | + @PostConstruct | |
57 | + public void initialize() { | |
58 | + super.init(); | |
59 | + } | |
60 | + | |
61 | + @Override | |
62 | + @PreDestroy | |
63 | + public void terminate() { | |
64 | + super.close(); | |
65 | + } | |
66 | + | |
53 | 67 | } | ... | ... |
impl/extension/jpa/src/main/java/br/gov/frameworkdemoiselle/internal/producer/ConversationEntityManagerStore.java
... | ... | @@ -36,6 +36,8 @@ |
36 | 36 | */ |
37 | 37 | package br.gov.frameworkdemoiselle.internal.producer; |
38 | 38 | |
39 | +import javax.annotation.PostConstruct; | |
40 | +import javax.annotation.PreDestroy; | |
39 | 41 | import javax.enterprise.context.Conversation; |
40 | 42 | import javax.enterprise.context.ConversationScoped; |
41 | 43 | import javax.inject.Inject; |
... | ... | @@ -62,4 +64,16 @@ public class ConversationEntityManagerStore extends AbstractEntityManagerStore { |
62 | 64 | return conversation; |
63 | 65 | } |
64 | 66 | |
67 | + @Override | |
68 | + @PostConstruct | |
69 | + public void initialize() { | |
70 | + super.init(); | |
71 | + } | |
72 | + | |
73 | + @Override | |
74 | + @PreDestroy | |
75 | + public void terminate() { | |
76 | + super.close(); | |
77 | + } | |
78 | + | |
65 | 79 | } | ... | ... |
impl/extension/jpa/src/main/java/br/gov/frameworkdemoiselle/internal/producer/DependentEntityManagerStore.java
... | ... | @@ -36,6 +36,8 @@ |
36 | 36 | */ |
37 | 37 | package br.gov.frameworkdemoiselle.internal.producer; |
38 | 38 | |
39 | +import javax.annotation.PostConstruct; | |
40 | +import javax.annotation.PreDestroy; | |
39 | 41 | import javax.enterprise.context.Dependent; |
40 | 42 | |
41 | 43 | /** |
... | ... | @@ -50,5 +52,17 @@ import javax.enterprise.context.Dependent; |
50 | 52 | public class DependentEntityManagerStore extends AbstractEntityManagerStore { |
51 | 53 | |
52 | 54 | private static final long serialVersionUID = 1L; |
55 | + | |
56 | + @Override | |
57 | + @PostConstruct | |
58 | + public void initialize() { | |
59 | + super.init(); | |
60 | + } | |
61 | + | |
62 | + @Override | |
63 | + @PreDestroy | |
64 | + public void terminate() { | |
65 | + super.close(); | |
66 | + } | |
53 | 67 | |
54 | 68 | } | ... | ... |
impl/extension/jpa/src/main/java/br/gov/frameworkdemoiselle/internal/producer/EntityManagerProducer.java
... | ... | @@ -37,14 +37,20 @@ |
37 | 37 | package br.gov.frameworkdemoiselle.internal.producer; |
38 | 38 | |
39 | 39 | import java.io.Serializable; |
40 | +import java.util.Collections; | |
41 | +import java.util.HashMap; | |
40 | 42 | import java.util.Map; |
41 | 43 | import java.util.Set; |
42 | 44 | |
45 | +import javax.annotation.PostConstruct; | |
46 | +import javax.annotation.PreDestroy; | |
47 | +import javax.enterprise.context.RequestScoped; | |
43 | 48 | import javax.enterprise.inject.Default; |
44 | 49 | import javax.enterprise.inject.Produces; |
45 | 50 | import javax.enterprise.inject.spi.InjectionPoint; |
46 | 51 | import javax.inject.Inject; |
47 | 52 | import javax.persistence.EntityManager; |
53 | +import javax.persistence.FlushModeType; | |
48 | 54 | |
49 | 55 | import org.slf4j.Logger; |
50 | 56 | |
... | ... | @@ -54,6 +60,7 @@ import br.gov.frameworkdemoiselle.configuration.Configuration; |
54 | 60 | import br.gov.frameworkdemoiselle.internal.configuration.EntityManagerConfig; |
55 | 61 | import br.gov.frameworkdemoiselle.internal.proxy.EntityManagerProxy; |
56 | 62 | import br.gov.frameworkdemoiselle.util.Beans; |
63 | +import br.gov.frameworkdemoiselle.util.NameQualifier; | |
57 | 64 | import br.gov.frameworkdemoiselle.util.ResourceBundle; |
58 | 65 | |
59 | 66 | /** |
... | ... | @@ -62,6 +69,8 @@ import br.gov.frameworkdemoiselle.util.ResourceBundle; |
62 | 69 | * persistence.xml, demoiselle.properties or @PersistenceUnit annotation. |
63 | 70 | * </p> |
64 | 71 | */ |
72 | +//TODO Concluir implementação de escopo selecionável, testes revelaram problemas na solução atual. | |
73 | +@RequestScoped | |
65 | 74 | public class EntityManagerProducer implements Serializable{ |
66 | 75 | |
67 | 76 | private static final long serialVersionUID = 1L; |
... | ... | @@ -76,10 +85,13 @@ public class EntityManagerProducer implements Serializable{ |
76 | 85 | @Inject |
77 | 86 | private EntityManagerFactoryProducer factory; |
78 | 87 | |
79 | - private AbstractEntityManagerStore entityManagerStore; | |
88 | + /*@Inject | |
89 | + private Instance<AbstractEntityManagerStore> storeInstance;*/ | |
90 | + | |
91 | + private final Map<String, EntityManager> cache = Collections.synchronizedMap(new HashMap<String, EntityManager>()); | |
80 | 92 | |
81 | - @Inject | |
82 | - private EntityManagerConfig configuration; | |
93 | + /*@Inject | |
94 | + private EntityManagerConfig configuration;*/ | |
83 | 95 | |
84 | 96 | /** |
85 | 97 | * <p> |
... | ... | @@ -124,8 +136,45 @@ public class EntityManagerProducer implements Serializable{ |
124 | 136 | return new EntityManagerProxy(persistenceUnit); |
125 | 137 | } |
126 | 138 | |
127 | - public EntityManager getEntityManager(String persistenceUnit) { | |
139 | + /*public EntityManager getEntityManager(String persistenceUnit) { | |
128 | 140 | return getStore().getEntityManager(persistenceUnit); |
141 | + }*/ | |
142 | + | |
143 | + @PostConstruct | |
144 | + void init() { | |
145 | + for (String persistenceUnit : getFactory().getCache().keySet()) { | |
146 | + getEntityManager(persistenceUnit); | |
147 | + } | |
148 | + } | |
149 | + | |
150 | + @PreDestroy | |
151 | + void close() { | |
152 | + //Se o produtor não possui escopo, então o ciclo de vida | |
153 | + //de EntityManager produzidos é responsabilidade do desenvolvedor. Não | |
154 | + //fechamos os EntityManagers aqui. | |
155 | + //if (configuration.getEntityManagerScope() != EntityManagerScope.NOSCOPE){ | |
156 | + for (EntityManager entityManager : cache.values()) { | |
157 | + entityManager.close(); | |
158 | + } | |
159 | + //} | |
160 | + cache.clear(); | |
161 | + } | |
162 | + | |
163 | + public EntityManager getEntityManager(String persistenceUnit) { | |
164 | + EntityManager entityManager = null; | |
165 | + | |
166 | + if (cache.containsKey(persistenceUnit)) { | |
167 | + entityManager = cache.get(persistenceUnit); | |
168 | + | |
169 | + } else { | |
170 | + entityManager = getFactory().create(persistenceUnit).createEntityManager(); | |
171 | + entityManager.setFlushMode(FlushModeType.AUTO); | |
172 | + | |
173 | + cache.put(persistenceUnit, entityManager); | |
174 | + this.getLogger().info(getBundle().getString("entity-manager-was-created", persistenceUnit)); | |
175 | + } | |
176 | + | |
177 | + return entityManager; | |
129 | 178 | } |
130 | 179 | |
131 | 180 | /** |
... | ... | @@ -164,36 +213,47 @@ public class EntityManagerProducer implements Serializable{ |
164 | 213 | } |
165 | 214 | |
166 | 215 | public Map<String, EntityManager> getCache() { |
167 | - return getStore().getCache(); | |
216 | + //return getStore().getCache(); | |
217 | + return this.cache; | |
168 | 218 | } |
169 | 219 | |
170 | - private AbstractEntityManagerStore getStore(){ | |
171 | - if (entityManagerStore==null){ | |
172 | - switch(configuration.getEntityManagerScope()){ | |
173 | - case APPLICATION: | |
174 | - entityManagerStore = Beans.getReference(ApplicationEntityManagerStore.class); | |
175 | - break; | |
176 | - case CONVERSATION: | |
177 | - entityManagerStore = Beans.getReference(ConversationEntityManagerStore.class); | |
178 | - break; | |
179 | - case NOSCOPE: | |
180 | - entityManagerStore = Beans.getReference(DependentEntityManagerStore.class); | |
181 | - break; | |
182 | - case REQUEST: | |
183 | - entityManagerStore = Beans.getReference(RequestEntityManagerStore.class); | |
184 | - break; | |
185 | - case SESSION: | |
186 | - entityManagerStore = Beans.getReference(SessionEntityManagerStore.class); | |
187 | - break; | |
188 | - case VIEW: | |
189 | - entityManagerStore = Beans.getReference(ViewEntityManagerStore.class); | |
190 | - break; | |
191 | - default: | |
192 | - entityManagerStore = Beans.getReference(RequestEntityManagerStore.class); | |
193 | - break; | |
194 | - } | |
220 | + /*private AbstractEntityManagerStore getStore(){ | |
221 | + switch(configuration.getEntityManagerScope()){ | |
222 | + case REQUEST: | |
223 | + return storeInstance.select(RequestEntityManagerStore.class).get(); | |
224 | + case APPLICATION: | |
225 | + return storeInstance.select(ApplicationEntityManagerStore.class).get(); | |
226 | + case CONVERSATION: | |
227 | + return storeInstance.select(ConversationEntityManagerStore.class).get(); | |
228 | + case NOSCOPE: | |
229 | + return storeInstance.select(DependentEntityManagerStore.class).get(); | |
230 | + case SESSION: | |
231 | + return storeInstance.select(SessionEntityManagerStore.class).get(); | |
232 | + case VIEW: | |
233 | + return storeInstance.select(ViewEntityManagerStore.class).get(); | |
234 | + default: | |
235 | + return storeInstance.select(RequestEntityManagerStore.class).get(); | |
236 | + } | |
237 | + }*/ | |
238 | + | |
239 | + protected Logger getLogger(){ | |
240 | + if (logger==null){ | |
241 | + logger = Beans.getReference(Logger.class); | |
242 | + } | |
243 | + return logger; | |
244 | + } | |
245 | + | |
246 | + protected ResourceBundle getBundle(){ | |
247 | + if (bundle==null){ | |
248 | + bundle = Beans.getReference(ResourceBundle.class , new NameQualifier("demoiselle-jpa-bundle")); | |
249 | + } | |
250 | + return bundle; | |
251 | + } | |
252 | + | |
253 | + private EntityManagerFactoryProducer getFactory(){ | |
254 | + if (factory==null){ | |
255 | + factory = Beans.getReference(EntityManagerFactoryProducer.class); | |
195 | 256 | } |
196 | - | |
197 | - return entityManagerStore; | |
257 | + return factory; | |
198 | 258 | } |
199 | 259 | } | ... | ... |
impl/extension/jpa/src/main/java/br/gov/frameworkdemoiselle/internal/producer/RequestEntityManagerStore.java
... | ... | @@ -36,6 +36,8 @@ |
36 | 36 | */ |
37 | 37 | package br.gov.frameworkdemoiselle.internal.producer; |
38 | 38 | |
39 | +import javax.annotation.PostConstruct; | |
40 | +import javax.annotation.PreDestroy; | |
39 | 41 | import javax.enterprise.context.RequestScoped; |
40 | 42 | |
41 | 43 | /** |
... | ... | @@ -49,5 +51,16 @@ import javax.enterprise.context.RequestScoped; |
49 | 51 | public class RequestEntityManagerStore extends AbstractEntityManagerStore { |
50 | 52 | |
51 | 53 | private static final long serialVersionUID = 1L; |
54 | + | |
55 | + @Override | |
56 | + @PostConstruct | |
57 | + public void initialize() { | |
58 | + super.init(); | |
59 | + } | |
52 | 60 | |
61 | + @Override | |
62 | + @PreDestroy | |
63 | + public void terminate() { | |
64 | + super.close(); | |
65 | + } | |
53 | 66 | } | ... | ... |
impl/extension/jpa/src/main/java/br/gov/frameworkdemoiselle/internal/producer/SessionEntityManagerStore.java
... | ... | @@ -36,6 +36,8 @@ |
36 | 36 | */ |
37 | 37 | package br.gov.frameworkdemoiselle.internal.producer; |
38 | 38 | |
39 | +import javax.annotation.PostConstruct; | |
40 | +import javax.annotation.PreDestroy; | |
39 | 41 | import javax.enterprise.context.SessionScoped; |
40 | 42 | |
41 | 43 | /** |
... | ... | @@ -49,5 +51,17 @@ import javax.enterprise.context.SessionScoped; |
49 | 51 | public class SessionEntityManagerStore extends AbstractEntityManagerStore { |
50 | 52 | |
51 | 53 | private static final long serialVersionUID = 1L; |
54 | + | |
55 | + @Override | |
56 | + @PostConstruct | |
57 | + public void initialize() { | |
58 | + super.init(); | |
59 | + } | |
60 | + | |
61 | + @Override | |
62 | + @PreDestroy | |
63 | + public void terminate() { | |
64 | + super.close(); | |
65 | + } | |
52 | 66 | |
53 | 67 | } | ... | ... |
impl/extension/jpa/src/main/java/br/gov/frameworkdemoiselle/internal/producer/ViewEntityManagerStore.java
... | ... | @@ -36,6 +36,9 @@ |
36 | 36 | */ |
37 | 37 | package br.gov.frameworkdemoiselle.internal.producer; |
38 | 38 | |
39 | +import javax.annotation.PostConstruct; | |
40 | +import javax.annotation.PreDestroy; | |
41 | + | |
39 | 42 | import br.gov.frameworkdemoiselle.annotation.ViewScoped; |
40 | 43 | |
41 | 44 | /** |
... | ... | @@ -49,5 +52,17 @@ import br.gov.frameworkdemoiselle.annotation.ViewScoped; |
49 | 52 | public class ViewEntityManagerStore extends AbstractEntityManagerStore { |
50 | 53 | |
51 | 54 | private static final long serialVersionUID = 1L; |
55 | + | |
56 | + @Override | |
57 | + @PostConstruct | |
58 | + public void initialize() { | |
59 | + super.init(); | |
60 | + } | |
61 | + | |
62 | + @Override | |
63 | + @PreDestroy | |
64 | + public void terminate() { | |
65 | + super.close(); | |
66 | + } | |
52 | 67 | |
53 | 68 | } | ... | ... |
impl/extension/jpa/src/main/java/br/gov/frameworkdemoiselle/internal/proxy/EntityManagerProxy.java
... | ... | @@ -427,7 +427,7 @@ public class EntityManagerProxy implements EntityManager, Serializable { |
427 | 427 | */ |
428 | 428 | protected final void joinTransactionIfNecessary() { |
429 | 429 | try { |
430 | - getEntityManagerDelegate().getTransaction(); | |
430 | + /*EntityTransaction transaction = */getEntityManagerDelegate().getTransaction(); | |
431 | 431 | } catch (IllegalStateException cause) { |
432 | 432 | //IllegalStateException is launched if we are on a JTA entity manager, so |
433 | 433 | //we assume we need to join transaction instead of creating one. |
... | ... | @@ -586,4 +586,5 @@ public class EntityManagerProxy implements EntityManager, Serializable { |
586 | 586 | private ResourceBundle getBundle(){ |
587 | 587 | return Beans.getReference(ResourceBundle.class,new NameQualifier("demoiselle-jpa-bundle")); |
588 | 588 | } |
589 | + | |
589 | 590 | } | ... | ... |
impl/extension/jpa/src/test/java/producer/NoScopedProducerTest.java
... | ... | @@ -9,6 +9,7 @@ import javax.persistence.EntityManager; |
9 | 9 | import org.jboss.arquillian.container.test.api.Deployment; |
10 | 10 | import org.jboss.arquillian.junit.Arquillian; |
11 | 11 | import org.jboss.shrinkwrap.api.spec.WebArchive; |
12 | +import org.junit.Ignore; | |
12 | 13 | import org.junit.Test; |
13 | 14 | import org.junit.runner.RunWith; |
14 | 15 | |
... | ... | @@ -17,6 +18,8 @@ import br.gov.frameworkdemoiselle.internal.proxy.EntityManagerProxy; |
17 | 18 | import br.gov.frameworkdemoiselle.util.Beans; |
18 | 19 | import br.gov.frameworkdemoiselle.util.NameQualifier; |
19 | 20 | |
21 | +//TODO Implementação de escopo selecionável tem que concluir antes de ativar esse teste | |
22 | +@Ignore | |
20 | 23 | @RunWith(Arquillian.class) |
21 | 24 | public class NoScopedProducerTest { |
22 | 25 | ... | ... |
impl/extension/jpa/src/test/java/producer/ViewScopedProducerTest.java
... | ... | @@ -10,6 +10,7 @@ import javax.persistence.EntityManager; |
10 | 10 | import org.jboss.arquillian.container.test.api.Deployment; |
11 | 11 | import org.jboss.arquillian.junit.Arquillian; |
12 | 12 | import org.jboss.shrinkwrap.api.spec.WebArchive; |
13 | +import org.junit.Ignore; | |
13 | 14 | import org.junit.Test; |
14 | 15 | import org.junit.runner.RunWith; |
15 | 16 | |
... | ... | @@ -19,6 +20,8 @@ import br.gov.frameworkdemoiselle.internal.proxy.EntityManagerProxy; |
19 | 20 | import br.gov.frameworkdemoiselle.util.Beans; |
20 | 21 | import br.gov.frameworkdemoiselle.util.NameQualifier; |
21 | 22 | |
23 | +//TODO Implementação de escopo selecionável tem que concluir antes de ativar esse teste | |
24 | +@Ignore | |
22 | 25 | @RunWith(Arquillian.class) |
23 | 26 | public class ViewScopedProducerTest { |
24 | 27 | ... | ... |
impl/extension/jpa/src/test/java/transaction/interceptor/JPATransactionTest.java
... | ... | @@ -66,7 +66,6 @@ public class JPATransactionTest { |
66 | 66 | |
67 | 67 | @Test |
68 | 68 | public void commitWithSuccess() { |
69 | - | |
70 | 69 | tb.commitWithSuccess(); |
71 | 70 | |
72 | 71 | MyEntity1 entity1 = em1.find(MyEntity1.class, tb.createId("id-1")); |
... | ... | @@ -78,7 +77,6 @@ public class JPATransactionTest { |
78 | 77 | |
79 | 78 | @Test |
80 | 79 | public void rollbackWithSuccess() { |
81 | - | |
82 | 80 | try { |
83 | 81 | tb.rollbackWithSuccess(); |
84 | 82 | } catch (Exception e) { | ... | ... |