Commit 3ef1b92b173e142c166c5e99e4f16928ec993ec9
1 parent
dc6f4fb1
Exists in
master
Implementando EntityManagerProducer com escopo configurável.
Showing
10 changed files
with
338 additions
and
63 deletions
Show diff stats
impl/core/src/main/java/br/gov/frameworkdemoiselle/internal/context/CustomContextProducer.java
... | ... | @@ -52,10 +52,10 @@ import java.util.ArrayList; |
52 | 52 | import java.util.List; |
53 | 53 | import java.util.Locale; |
54 | 54 | |
55 | -import javax.annotation.PostConstruct; | |
56 | 55 | import javax.annotation.PreDestroy; |
57 | 56 | import javax.enterprise.context.ApplicationScoped; |
58 | 57 | import javax.enterprise.inject.Produces; |
58 | +import javax.enterprise.inject.spi.AfterBeanDiscovery; | |
59 | 59 | import javax.enterprise.inject.spi.InjectionPoint; |
60 | 60 | |
61 | 61 | import org.slf4j.Logger; |
... | ... | @@ -86,20 +86,20 @@ public class CustomContextProducer { |
86 | 86 | |
87 | 87 | private transient ResourceBundle bundle; |
88 | 88 | |
89 | - private List<CustomContext> contexts = new ArrayList<CustomContext>(); | |
90 | - | |
91 | - | |
92 | 89 | /** |
93 | - * Store a context into this producer. The context must have | |
94 | - * been registered into CDI by a portable extension, this method will not do this. | |
90 | + * <p>Store a context into this producer. The context must have | |
91 | + * been registered into CDI (unsing {@link AfterBeanDiscovery#addContext(javax.enterprise.context.spi.Context context)}) by a portable extension, | |
92 | + * this method will not do this.</p> | |
93 | + * | |
94 | + * <p>This producer can only produce contexts registered through this method.</p> | |
95 | 95 | * |
96 | 96 | */ |
97 | 97 | public void addRegisteredContext(CustomContext context){ |
98 | 98 | Logger logger = getLogger(); |
99 | 99 | ResourceBundle bundle = getBundle(); |
100 | 100 | |
101 | - if (!contexts.contains(context)){ | |
102 | - contexts.add(context); | |
101 | + if (!getContexts().contains(context)){ | |
102 | + getContexts().add(context); | |
103 | 103 | logger.debug( bundle.getString("bootstrap-context-added", context.getClass().getCanonicalName() , context.getScope().getSimpleName() ) ); |
104 | 104 | } |
105 | 105 | else{ |
... | ... | @@ -108,65 +108,59 @@ public class CustomContextProducer { |
108 | 108 | } |
109 | 109 | |
110 | 110 | /** |
111 | - * Store a list of contexts into this producer. The contexts must have | |
112 | - * been registered into CDI by a portable extension, this method will not do this. | |
113 | - * | |
114 | - */ | |
115 | - @PostConstruct | |
116 | - public void addRegisteredContexts(){ | |
117 | - CustomContextBootstrap contextBootstrap = Beans.getReference(CustomContextBootstrap.class); | |
118 | - | |
119 | - List<CustomContext> contexts = contextBootstrap.getCustomContexts(); | |
120 | - | |
121 | - for (CustomContext context : contexts){ | |
122 | - addRegisteredContext(context); | |
123 | - } | |
124 | - } | |
125 | - | |
126 | - /** | |
127 | 111 | * Deactivates all registered contexts and clear the context collection |
128 | 112 | */ |
129 | 113 | @PreDestroy |
130 | 114 | public void closeContexts(){ |
131 | 115 | //Desativa todos os contextos registrados. |
132 | - for (CustomContext context : contexts){ | |
116 | + for (CustomContext context : getContexts()){ | |
133 | 117 | context.deactivate(); |
134 | 118 | } |
135 | 119 | |
136 | - contexts.clear(); | |
120 | + getContexts().clear(); | |
121 | + } | |
122 | + | |
123 | + private List<CustomContext> getContexts(){ | |
124 | + /* The demoiselle-core CustomContextBootstrap class creates default contexts for the main | |
125 | + * scopes of an application (request, session and conversation) and some custom contexts | |
126 | + * (view and static). This method injects a reference to the CustomContextBootstrap to obtain those | |
127 | + * contexts. Also any context registered after application start-up will be obtained by this method. */ | |
128 | + | |
129 | + CustomContextBootstrap contextBootstrap = Beans.getReference(CustomContextBootstrap.class); | |
130 | + return contextBootstrap.getCustomContexts(); | |
137 | 131 | } |
138 | 132 | |
139 | 133 | /////////////PRODUCERS/////////////////// |
140 | 134 | |
141 | 135 | @Produces |
142 | - public RequestContext getRequestContext(InjectionPoint ip , CustomContextBootstrap extension){ | |
143 | - return getContext(ip, extension); | |
136 | + public RequestContext getRequestContext(InjectionPoint ip){ | |
137 | + return getContext(ip); | |
144 | 138 | } |
145 | 139 | |
146 | 140 | @Produces |
147 | - public SessionContext getSessionContext(InjectionPoint ip , CustomContextBootstrap extension){ | |
148 | - return getContext(ip, extension); | |
141 | + public SessionContext getSessionContext(InjectionPoint ip){ | |
142 | + return getContext(ip); | |
149 | 143 | } |
150 | 144 | |
151 | 145 | @Produces |
152 | - public ViewContext getViewContext(InjectionPoint ip , CustomContextBootstrap extension){ | |
153 | - return getContext(ip, extension); | |
146 | + public ViewContext getViewContext(InjectionPoint ip){ | |
147 | + return getContext(ip); | |
154 | 148 | } |
155 | 149 | |
156 | 150 | @Produces |
157 | - public StaticContext getStaticContext(InjectionPoint ip , CustomContextBootstrap extension){ | |
158 | - return getContext(ip, extension); | |
151 | + public StaticContext getStaticContext(InjectionPoint ip){ | |
152 | + return getContext(ip); | |
159 | 153 | } |
160 | 154 | |
161 | 155 | @Produces |
162 | - public ConversationContext getConversationContext(InjectionPoint ip , CustomContextBootstrap extension){ | |
163 | - return getContext(ip, extension); | |
156 | + public ConversationContext getConversationContext(InjectionPoint ip){ | |
157 | + return getContext(ip); | |
164 | 158 | } |
165 | 159 | |
166 | 160 | /////////////END OF PRODUCERS/////////////////// |
167 | 161 | |
168 | 162 | @SuppressWarnings("unchecked") |
169 | - private <T extends CustomContext> T getContext(InjectionPoint ip , CustomContextBootstrap extension){ | |
163 | + private <T extends CustomContext> T getContext(InjectionPoint ip){ | |
170 | 164 | T producedContext = null; |
171 | 165 | |
172 | 166 | if (ip!=null){ |
... | ... | @@ -186,7 +180,7 @@ public class CustomContextProducer { |
186 | 180 | |
187 | 181 | ArrayList<CustomContext> selectableContexts = new ArrayList<CustomContext>(); |
188 | 182 | |
189 | - for (CustomContext context : contexts){ | |
183 | + for (CustomContext context : getContexts()){ | |
190 | 184 | if ( contextClass.isAssignableFrom( context.getClass() ) ){ |
191 | 185 | if (context.isActive()){ |
192 | 186 | producedContext = context; | ... | ... |
impl/core/src/main/java/br/gov/frameworkdemoiselle/internal/implementation/ConfigurationEnumValueExtractor.java
0 → 100644
... | ... | @@ -0,0 +1,82 @@ |
1 | +/* | |
2 | + * Demoiselle Framework | |
3 | + * Copyright (C) 2010 SERPRO | |
4 | + * ---------------------------------------------------------------------------- | |
5 | + * This file is part of Demoiselle Framework. | |
6 | + * | |
7 | + * Demoiselle Framework is free software; you can redistribute it and/or | |
8 | + * modify it under the terms of the GNU Lesser General Public License version 3 | |
9 | + * as published by the Free Software Foundation. | |
10 | + * | |
11 | + * This program is distributed in the hope that it will be useful, | |
12 | + * but WITHOUT ANY WARRANTY; without even the implied warranty of | |
13 | + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
14 | + * GNU General Public License for more details. | |
15 | + * | |
16 | + * You should have received a copy of the GNU Lesser General Public License version 3 | |
17 | + * along with this program; if not, see <http://www.gnu.org/licenses/> | |
18 | + * or write to the Free Software Foundation, Inc., 51 Franklin Street, | |
19 | + * Fifth Floor, Boston, MA 02110-1301, USA. | |
20 | + * ---------------------------------------------------------------------------- | |
21 | + * Este arquivo é parte do Framework Demoiselle. | |
22 | + * | |
23 | + * O Framework Demoiselle é um software livre; você pode redistribuí-lo e/ou | |
24 | + * modificá-lo dentro dos termos da GNU LGPL versão 3 como publicada pela Fundação | |
25 | + * do Software Livre (FSF). | |
26 | + * | |
27 | + * Este programa é distribuído na esperança que possa ser útil, mas SEM NENHUMA | |
28 | + * GARANTIA; sem uma garantia implícita de ADEQUAÇÃO a qualquer MERCADO ou | |
29 | + * APLICAÇÃO EM PARTICULAR. Veja a Licença Pública Geral GNU/LGPL em português | |
30 | + * para maiores detalhes. | |
31 | + * | |
32 | + * Você deve ter recebido uma cópia da GNU LGPL versão 3, sob o título | |
33 | + * "LICENCA.txt", junto com esse programa. Se não, acesse <http://www.gnu.org/licenses/> | |
34 | + * ou escreva para a Fundação do Software Livre (FSF) Inc., | |
35 | + * 51 Franklin St, Fifth Floor, Boston, MA 02111-1301, USA. | |
36 | + */ | |
37 | +package br.gov.frameworkdemoiselle.internal.implementation; | |
38 | + | |
39 | +import java.lang.reflect.Field; | |
40 | +import java.util.Locale; | |
41 | + | |
42 | +import org.apache.commons.configuration.Configuration; | |
43 | +import org.apache.commons.configuration.ConversionException; | |
44 | + | |
45 | +import br.gov.frameworkdemoiselle.annotation.Priority; | |
46 | +import br.gov.frameworkdemoiselle.configuration.ConfigurationValueExtractor; | |
47 | +import br.gov.frameworkdemoiselle.util.ResourceBundle; | |
48 | + | |
49 | +@Priority(Priority.L2_PRIORITY) | |
50 | +public class ConfigurationEnumValueExtractor implements ConfigurationValueExtractor{ | |
51 | + | |
52 | + private transient ResourceBundle bundle; | |
53 | + | |
54 | + @Override | |
55 | + public Object getValue(String prefix, String key, Field field, Configuration configuration) throws Exception { | |
56 | + String value = configuration.getString(prefix + key); | |
57 | + | |
58 | + Object enums[] = field.getDeclaringClass().getEnumConstants(); | |
59 | + | |
60 | + for (int i=0; i<enums.length; i++){ | |
61 | + if (enums[i].getClass().getSimpleName().equalsIgnoreCase(value)){ | |
62 | + return enums[i]; | |
63 | + } | |
64 | + } | |
65 | + | |
66 | + throw new ConversionException(getBundle().getString("configuration-not-conversion",value,field.getDeclaringClass().getCanonicalName())); | |
67 | + } | |
68 | + | |
69 | + @Override | |
70 | + public boolean isSupported(Field field) { | |
71 | + return field.getDeclaringClass().isEnum(); | |
72 | + } | |
73 | + | |
74 | + private ResourceBundle getBundle(){ | |
75 | + if (bundle==null){ | |
76 | + bundle = new ResourceBundle("demoiselle-core-bundle", Locale.getDefault()); | |
77 | + } | |
78 | + | |
79 | + return bundle; | |
80 | + } | |
81 | + | |
82 | +} | ... | ... |
impl/core/src/main/java/br/gov/frameworkdemoiselle/internal/implementation/ConfigurationLoader.java
... | ... | @@ -100,7 +100,13 @@ public class ConfigurationLoader implements Serializable { |
100 | 100 | private Collection<Field> fields; |
101 | 101 | |
102 | 102 | public void load(Object object) throws ConfigurationException { |
103 | - getLogger().debug(getBundle().getString("loading-configuration-class", object.getClass().getName())); | |
103 | + load(object,true); | |
104 | + } | |
105 | + | |
106 | + public void load(Object object,boolean logLoadingProcess) throws ConfigurationException { | |
107 | + if (logLoadingProcess){ | |
108 | + getLogger().debug(getBundle().getString("loading-configuration-class", object.getClass().getName())); | |
109 | + } | |
104 | 110 | |
105 | 111 | this.object = object; |
106 | 112 | ... | ... |
impl/core/src/main/java/br/gov/frameworkdemoiselle/internal/implementation/Management.java
... | ... | @@ -55,6 +55,7 @@ import org.slf4j.Logger; |
55 | 55 | |
56 | 56 | import br.gov.frameworkdemoiselle.annotation.ManagedProperty; |
57 | 57 | import br.gov.frameworkdemoiselle.annotation.Name; |
58 | +import br.gov.frameworkdemoiselle.context.ConversationContext; | |
58 | 59 | import br.gov.frameworkdemoiselle.context.RequestContext; |
59 | 60 | import br.gov.frameworkdemoiselle.context.SessionContext; |
60 | 61 | import br.gov.frameworkdemoiselle.context.ViewContext; |
... | ... | @@ -306,6 +307,7 @@ public class Management implements Serializable { |
306 | 307 | RequestContext requestContext = Beans.getReference(RequestContext.class); |
307 | 308 | ViewContext viewContext = Beans.getReference(ViewContext.class); |
308 | 309 | SessionContext sessionContext = Beans.getReference(SessionContext.class); |
310 | + ConversationContext conversationContext = Beans.getReference(ConversationContext.class); | |
309 | 311 | |
310 | 312 | if (!requestContext.isActive()){ |
311 | 313 | logger.debug(bundle.getString("management-debug-starting-custom-context", |
... | ... | @@ -327,12 +329,20 @@ public class Management implements Serializable { |
327 | 329 | |
328 | 330 | sessionContext.activate(); |
329 | 331 | } |
332 | + | |
333 | + if (!conversationContext.isActive()){ | |
334 | + logger.debug(bundle.getString("management-debug-starting-custom-context", | |
335 | + conversationContext.getClass().getCanonicalName(), managedType.getCanonicalName())); | |
336 | + | |
337 | + conversationContext.activate(); | |
338 | + } | |
330 | 339 | } |
331 | 340 | |
332 | 341 | private void deactivateContexts(Class<?> managedType) { |
333 | 342 | RequestContext requestContext = Beans.getReference(RequestContext.class); |
334 | 343 | ViewContext viewContext = Beans.getReference(ViewContext.class); |
335 | 344 | SessionContext sessionContext = Beans.getReference(SessionContext.class); |
345 | + ConversationContext conversationContext = Beans.getReference(ConversationContext.class); | |
336 | 346 | |
337 | 347 | if (requestContext.isActive()){ |
338 | 348 | logger.debug(bundle.getString("management-debug-stoping-custom-context", |
... | ... | @@ -354,6 +364,13 @@ public class Management implements Serializable { |
354 | 364 | |
355 | 365 | sessionContext.deactivate(); |
356 | 366 | } |
367 | + | |
368 | + if (!conversationContext.isActive()){ | |
369 | + logger.debug(bundle.getString("management-debug-starting-custom-context", | |
370 | + conversationContext.getClass().getCanonicalName(), managedType.getCanonicalName())); | |
371 | + | |
372 | + conversationContext.activate(); | |
373 | + } | |
357 | 374 | } |
358 | 375 | |
359 | 376 | public void shutdown(Collection<Class<? extends ManagementExtension>> monitoringExtensions) { | ... | ... |
impl/extension/jpa/src/main/java/br/gov/frameworkdemoiselle/internal/bootstrap/EntityManagerBootstrap.java
0 → 100644
... | ... | @@ -0,0 +1,168 @@ |
1 | +package br.gov.frameworkdemoiselle.internal.bootstrap; | |
2 | + | |
3 | +import java.lang.annotation.Annotation; | |
4 | +import java.lang.reflect.Type; | |
5 | +import java.util.Set; | |
6 | + | |
7 | +import javax.enterprise.context.ApplicationScoped; | |
8 | +import javax.enterprise.context.ConversationScoped; | |
9 | +import javax.enterprise.context.RequestScoped; | |
10 | +import javax.enterprise.context.SessionScoped; | |
11 | +import javax.enterprise.event.Observes; | |
12 | +import javax.enterprise.inject.spi.AnnotatedConstructor; | |
13 | +import javax.enterprise.inject.spi.AnnotatedField; | |
14 | +import javax.enterprise.inject.spi.AnnotatedMethod; | |
15 | +import javax.enterprise.inject.spi.AnnotatedType; | |
16 | +import javax.enterprise.inject.spi.BeanManager; | |
17 | +import javax.enterprise.inject.spi.Extension; | |
18 | +import javax.enterprise.inject.spi.ProcessAnnotatedType; | |
19 | +import javax.enterprise.util.AnnotationLiteral; | |
20 | + | |
21 | +import br.gov.frameworkdemoiselle.annotation.ViewScoped; | |
22 | +import br.gov.frameworkdemoiselle.internal.configuration.EntityManagerConfig; | |
23 | +import br.gov.frameworkdemoiselle.internal.configuration.EntityManagerConfig.EntityManagerScope; | |
24 | +import br.gov.frameworkdemoiselle.internal.implementation.ConfigurationLoader; | |
25 | +import br.gov.frameworkdemoiselle.internal.producer.EntityManagerProducer; | |
26 | + | |
27 | + | |
28 | +public class EntityManagerBootstrap implements Extension { | |
29 | + | |
30 | + public void selectScopeForEntityManager(@Observes final ProcessAnnotatedType<EntityManagerProducer> event, BeanManager beanManager) { | |
31 | + EntityManagerConfig config = new EntityManagerConfig(); | |
32 | + new ConfigurationLoader().load(config,false); | |
33 | + final EntityManagerScope entityManagerScope = config.getEntityManagerScope(); | |
34 | + | |
35 | + if (entityManagerScope != EntityManagerScope.NOSCOPE){ | |
36 | + AnnotatedType<EntityManagerProducer> annotatedType = new AnnotatedType<EntityManagerProducer>() { | |
37 | + | |
38 | + private AnnotatedType<EntityManagerProducer> delegate = event.getAnnotatedType(); | |
39 | + | |
40 | + public Class<EntityManagerProducer> getJavaClass() { | |
41 | + return delegate.getJavaClass(); | |
42 | + } | |
43 | + | |
44 | + public Type getBaseType() { | |
45 | + return delegate.getBaseType(); | |
46 | + } | |
47 | + | |
48 | + public Set<AnnotatedConstructor<EntityManagerProducer>> getConstructors() { | |
49 | + return delegate.getConstructors(); | |
50 | + } | |
51 | + | |
52 | + public Set<Type> getTypeClosure() { | |
53 | + return delegate.getTypeClosure(); | |
54 | + } | |
55 | + | |
56 | + public Set<AnnotatedMethod<? super EntityManagerProducer>> getMethods() { | |
57 | + return delegate.getMethods(); | |
58 | + } | |
59 | + | |
60 | + @SuppressWarnings("unchecked") | |
61 | + public <T extends Annotation> T getAnnotation(Class<T> annotationType) { | |
62 | + T returnedAnnotation = null; | |
63 | + Class<?> expectedScope; | |
64 | + | |
65 | + switch(entityManagerScope){ | |
66 | + case APPLICATION: | |
67 | + expectedScope = ApplicationScoped.class; | |
68 | + break; | |
69 | + case CONVERSATION: | |
70 | + expectedScope = ConversationScoped.class; | |
71 | + break; | |
72 | + case REQUEST: | |
73 | + expectedScope = RequestScoped.class; | |
74 | + break; | |
75 | + case SESSION: | |
76 | + expectedScope = SessionScoped.class; | |
77 | + break; | |
78 | + case VIEW: | |
79 | + expectedScope = ViewScoped.class; | |
80 | + break; | |
81 | + default: | |
82 | + expectedScope = null; | |
83 | + break; | |
84 | + } | |
85 | + | |
86 | + if (annotationType.equals(expectedScope)){ | |
87 | + switch(entityManagerScope){ | |
88 | + case APPLICATION: | |
89 | + returnedAnnotation = (T) new ApplicationScopedLiteral(); | |
90 | + break; | |
91 | + case CONVERSATION: | |
92 | + returnedAnnotation = (T) new ConversationScopedLiteral(); | |
93 | + break; | |
94 | + case REQUEST: | |
95 | + returnedAnnotation = (T) new ApplicationScopedLiteral(); | |
96 | + break; | |
97 | + case SESSION: | |
98 | + returnedAnnotation = (T) new SessionScopedLiteral(); | |
99 | + break; | |
100 | + case VIEW: | |
101 | + returnedAnnotation = (T) new ViewScopedLiteral(); | |
102 | + break; | |
103 | + default: | |
104 | + returnedAnnotation = delegate.getAnnotation(annotationType); | |
105 | + break; | |
106 | + } | |
107 | + } | |
108 | + else{ | |
109 | + returnedAnnotation = delegate.getAnnotation(annotationType); | |
110 | + } | |
111 | + | |
112 | + return returnedAnnotation; | |
113 | + } | |
114 | + | |
115 | + public Set<AnnotatedField<? super EntityManagerProducer>> getFields() { | |
116 | + return delegate.getFields(); | |
117 | + } | |
118 | + | |
119 | + public Set<Annotation> getAnnotations() { | |
120 | + return delegate.getAnnotations(); | |
121 | + } | |
122 | + | |
123 | + public boolean isAnnotationPresent(Class<? extends Annotation> annotationType) { | |
124 | + return delegate.isAnnotationPresent(annotationType); | |
125 | + } | |
126 | + | |
127 | + | |
128 | + }; | |
129 | + | |
130 | + event.setAnnotatedType(annotatedType); | |
131 | + } | |
132 | + } | |
133 | + | |
134 | + @SuppressWarnings("all") | |
135 | + class ApplicationScopedLiteral extends AnnotationLiteral<ApplicationScoped> implements ApplicationScoped { | |
136 | + private static final long serialVersionUID = 1L; | |
137 | + | |
138 | + private ApplicationScopedLiteral() {} | |
139 | + } | |
140 | + | |
141 | + @SuppressWarnings("all") | |
142 | + class RequestScopedLiteral extends AnnotationLiteral<RequestScoped> implements RequestScoped { | |
143 | + private static final long serialVersionUID = 1L; | |
144 | + | |
145 | + private RequestScopedLiteral(){} | |
146 | + } | |
147 | + | |
148 | + @SuppressWarnings("all") | |
149 | + class SessionScopedLiteral extends AnnotationLiteral<SessionScoped> implements SessionScoped { | |
150 | + private static final long serialVersionUID = 1L; | |
151 | + | |
152 | + private SessionScopedLiteral(){} | |
153 | + } | |
154 | + | |
155 | + @SuppressWarnings("all") | |
156 | + class ViewScopedLiteral extends AnnotationLiteral<ViewScoped> implements ViewScoped { | |
157 | + private static final long serialVersionUID = 1L; | |
158 | + | |
159 | + private ViewScopedLiteral(){} | |
160 | + } | |
161 | + | |
162 | + @SuppressWarnings("all") | |
163 | + class ConversationScopedLiteral extends AnnotationLiteral<ConversationScoped> implements ConversationScoped { | |
164 | + private static final long serialVersionUID = 1L; | |
165 | + | |
166 | + private ConversationScopedLiteral(){} | |
167 | + } | |
168 | +} | ... | ... |
impl/extension/jpa/src/main/java/br/gov/frameworkdemoiselle/internal/configuration/EntityManagerConfig.java
... | ... | @@ -38,6 +38,8 @@ package br.gov.frameworkdemoiselle.internal.configuration; |
38 | 38 | |
39 | 39 | import java.io.Serializable; |
40 | 40 | |
41 | +import javax.persistence.EntityManager; | |
42 | + | |
41 | 43 | import org.slf4j.Logger; |
42 | 44 | |
43 | 45 | import br.gov.frameworkdemoiselle.annotation.Name; |
... | ... | @@ -58,14 +60,15 @@ public class EntityManagerConfig implements Serializable { |
58 | 60 | */ |
59 | 61 | // TODO Implementação apenas para manter a compatibilidade entre a versão 2.3 com a 2.4. |
60 | 62 | @Name("unit.name") |
63 | + @Deprecated | |
61 | 64 | private String persistenceUnitName; |
62 | 65 | |
63 | 66 | @Name("default.unit.name") |
64 | 67 | private String defaultPersistenceUnitName; |
65 | 68 | |
66 | 69 | @Name("entitymanager.scope") |
67 | - private String entityManagerScope = "request"; | |
68 | - | |
70 | + private EntityManagerScope entityManagerScope = EntityManagerScope.REQUEST; | |
71 | + | |
69 | 72 | /** |
70 | 73 | * Getter for persistence unit name. |
71 | 74 | */ |
... | ... | @@ -74,6 +77,7 @@ public class EntityManagerConfig implements Serializable { |
74 | 77 | * @deprecated |
75 | 78 | * @return |
76 | 79 | */ |
80 | + @Deprecated | |
77 | 81 | public String getPersistenceUnitName() { |
78 | 82 | return persistenceUnitName; |
79 | 83 | } |
... | ... | @@ -96,15 +100,32 @@ public class EntityManagerConfig implements Serializable { |
96 | 100 | return defaultPersistenceUnitName; |
97 | 101 | } |
98 | 102 | |
99 | - | |
100 | - public String getEntityManagerScope() { | |
103 | + /** | |
104 | + * <p>Defines the scope of {@link EntityManager}'s produced by the internal producer.</p> | |
105 | + * | |
106 | + * <p>Valid values are NOSCOPE,REQUEST,SESSION,VIEW,CONVERSATION and APPLICATION.</p> | |
107 | + * | |
108 | + * <p>NOSCOPE means every injected entity manager will be a different instance.</p> | |
109 | + * | |
110 | + * <p>The default value is REQUEST, meaning the producer will create the same | |
111 | + * entity manager for the duration of the request.</p> | |
112 | + * | |
113 | + */ | |
114 | + public EntityManagerScope getEntityManagerScope() { | |
101 | 115 | return entityManagerScope; |
102 | 116 | } |
103 | 117 | |
104 | - | |
105 | - public void setEntityManagerScope(String entityManagerScope) { | |
118 | + public void setEntityManagerScope(EntityManagerScope entityManagerScope) { | |
106 | 119 | this.entityManagerScope = entityManagerScope; |
107 | 120 | } |
108 | - | |
109 | - | |
121 | + | |
122 | + /** | |
123 | + * Supported scopes for the entity manager | |
124 | + * | |
125 | + * @author serpro | |
126 | + * | |
127 | + */ | |
128 | + public enum EntityManagerScope{ | |
129 | + NOSCOPE,REQUEST,SESSION,VIEW,CONVERSATION,APPLICATION; | |
130 | + } | |
110 | 131 | } | ... | ... |
impl/extension/jpa/src/main/java/br/gov/frameworkdemoiselle/internal/context/PersistenceContext.java
... | ... | @@ -1,12 +0,0 @@ |
1 | -package br.gov.frameworkdemoiselle.internal.context; | |
2 | - | |
3 | -import java.lang.annotation.Annotation; | |
4 | - | |
5 | - | |
6 | -public class PersistenceContext extends AbstractThreadLocalContext { | |
7 | - | |
8 | - public PersistenceContext(Class<? extends Annotation> scope) { | |
9 | - super(scope); | |
10 | - } | |
11 | - | |
12 | -} |
impl/extension/jpa/src/main/java/br/gov/frameworkdemoiselle/internal/producer/EntityManagerProducer.java
... | ... | @@ -44,7 +44,6 @@ import java.util.Set; |
44 | 44 | |
45 | 45 | import javax.annotation.PostConstruct; |
46 | 46 | import javax.annotation.PreDestroy; |
47 | -import javax.enterprise.context.RequestScoped; | |
48 | 47 | import javax.enterprise.inject.Default; |
49 | 48 | import javax.enterprise.inject.Produces; |
50 | 49 | import javax.enterprise.inject.spi.InjectionPoint; |
... | ... | @@ -66,9 +65,7 @@ import br.gov.frameworkdemoiselle.util.ResourceBundle; |
66 | 65 | * Factory class responsible to produces instances of EntityManager. Produces instances based on informations defined in |
67 | 66 | * persistence.xml, demoiselle.properties or @PersistenceUnit annotation. |
68 | 67 | * </p> |
69 | - * TODO allow users to define EntityManager's scope using demoiselle.properties | |
70 | 68 | */ |
71 | -@RequestScoped | |
72 | 69 | public class EntityManagerProducer implements Serializable { |
73 | 70 | |
74 | 71 | private static final long serialVersionUID = 1L; | ... | ... |
impl/extension/jpa/src/main/resources/META-INF/services/javax.enterprise.inject.spi.Extension
0 → 100644
impl/extension/jpa/src/main/resources/demoiselle-jpa-bundle.properties
... | ... | @@ -43,4 +43,5 @@ more-than-one-persistence-unit-defined=Existe mais de uma unidade de persist\u00 |
43 | 43 | persistence-unit-name-found=Unidade de persist\u00EAncia "{0}" encontrada. |
44 | 44 | entity-manager-closed=O gerenciador de entidades foi fechado. |
45 | 45 | no-transaction-active=Nenhuma transa\u00E7\u00E3o est\u00E1 ativa, verifique a configura\u00E7\u00E3o "{0}" no arquivo "{1}" e defina a sua estrat\u00E9gia de transa\u00E7\u00E3o. |
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 | ... | ... |