Commit 3ef1b92b173e142c166c5e99e4f16928ec993ec9

Authored by Dancovich
1 parent dc6f4fb1
Exists in master

Implementando EntityManagerProducer com escopo configurável.

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
... ... @@ -0,0 +1 @@
  1 +br.gov.frameworkdemoiselle.internal.bootstrap.EntityManagerBootstrap
0 2 \ No newline at end of file
... ...
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
... ...