diff --git a/impl/extension/jpa/src/main/java/br/gov/frameworkdemoiselle/internal/producer/AbstractEntityManagerStore.java b/impl/extension/jpa/src/main/java/br/gov/frameworkdemoiselle/internal/producer/AbstractEntityManagerStore.java index 941df30..266ef59 100644 --- a/impl/extension/jpa/src/main/java/br/gov/frameworkdemoiselle/internal/producer/AbstractEntityManagerStore.java +++ b/impl/extension/jpa/src/main/java/br/gov/frameworkdemoiselle/internal/producer/AbstractEntityManagerStore.java @@ -36,13 +36,10 @@ */ package br.gov.frameworkdemoiselle.internal.producer; -import java.io.Serializable; import java.util.Collections; import java.util.HashMap; import java.util.Map; -import javax.annotation.PostConstruct; -import javax.annotation.PreDestroy; import javax.enterprise.context.RequestScoped; import javax.inject.Inject; import javax.persistence.EntityManager; @@ -71,7 +68,7 @@ import br.gov.frameworkdemoiselle.util.ResourceBundle; * @author serpro * */ -public abstract class AbstractEntityManagerStore implements Serializable { +public abstract class AbstractEntityManagerStore implements EntityManagerStore { private static final long serialVersionUID = 1L; @@ -90,7 +87,7 @@ public abstract class AbstractEntityManagerStore implements Serializable { @Inject private EntityManagerConfig configuration; - EntityManager getEntityManager(String persistenceUnit) { + public EntityManager getEntityManager(String persistenceUnit) { EntityManager entityManager = null; if (cache.containsKey(persistenceUnit)) { @@ -107,19 +104,6 @@ public abstract class AbstractEntityManagerStore implements Serializable { return entityManager; } - /** - * Run this to initialize all persistence units. It's recomended this method - * be annotated with {@link PostConstruct}, so it runs as soon as an EntityManager gets injected. - */ - public abstract void initialize(); - - /** - * Run this to close all persistence units. It's recomended this method - * be annotated with {@link PreDestroy}, so it runs as soon as the scope the EntityManager is - * attached to ends. - */ - public abstract void terminate(); - void init() { for (String persistenceUnit : getFactory().getCache().keySet()) { getEntityManager(persistenceUnit); @@ -138,7 +122,11 @@ public abstract class AbstractEntityManagerStore implements Serializable { cache.clear(); } - Map getCache() { + public Map getCache() { + if (cache==null || cache.isEmpty()){ + init(); + } + return cache; } @@ -149,14 +137,14 @@ public abstract class AbstractEntityManagerStore implements Serializable { return factory; } - protected Logger getLogger(){ + private Logger getLogger(){ if (logger==null){ logger = Beans.getReference(Logger.class); } return logger; } - protected ResourceBundle getBundle(){ + private ResourceBundle getBundle(){ if (bundle==null){ bundle = Beans.getReference(ResourceBundle.class , new NameQualifier("demoiselle-jpa-bundle")); } diff --git a/impl/extension/jpa/src/main/java/br/gov/frameworkdemoiselle/internal/producer/EntityManagerProducer.java b/impl/extension/jpa/src/main/java/br/gov/frameworkdemoiselle/internal/producer/EntityManagerProducer.java index 93c0646..fa05d7a 100644 --- a/impl/extension/jpa/src/main/java/br/gov/frameworkdemoiselle/internal/producer/EntityManagerProducer.java +++ b/impl/extension/jpa/src/main/java/br/gov/frameworkdemoiselle/internal/producer/EntityManagerProducer.java @@ -37,20 +37,16 @@ package br.gov.frameworkdemoiselle.internal.producer; import java.io.Serializable; -import java.util.Collections; -import java.util.HashMap; import java.util.Map; import java.util.Set; -import javax.annotation.PostConstruct; -import javax.annotation.PreDestroy; -import javax.enterprise.context.RequestScoped; +import javax.enterprise.context.ApplicationScoped; import javax.enterprise.inject.Default; +import javax.enterprise.inject.Instance; import javax.enterprise.inject.Produces; import javax.enterprise.inject.spi.InjectionPoint; import javax.inject.Inject; import javax.persistence.EntityManager; -import javax.persistence.FlushModeType; import org.slf4j.Logger; @@ -59,8 +55,6 @@ import br.gov.frameworkdemoiselle.annotation.Name; import br.gov.frameworkdemoiselle.configuration.Configuration; import br.gov.frameworkdemoiselle.internal.configuration.EntityManagerConfig; import br.gov.frameworkdemoiselle.internal.proxy.EntityManagerProxy; -import br.gov.frameworkdemoiselle.util.Beans; -import br.gov.frameworkdemoiselle.util.NameQualifier; import br.gov.frameworkdemoiselle.util.ResourceBundle; /** @@ -69,8 +63,7 @@ import br.gov.frameworkdemoiselle.util.ResourceBundle; * persistence.xml, demoiselle.properties or @PersistenceUnit annotation. *

*/ -//TODO Concluir implementação de escopo selecionável, testes revelaram problemas na solução atual. -@RequestScoped +@ApplicationScoped public class EntityManagerProducer implements Serializable{ private static final long serialVersionUID = 1L; @@ -85,13 +78,11 @@ public class EntityManagerProducer implements Serializable{ @Inject private EntityManagerFactoryProducer factory; - /*@Inject - private Instance storeInstance;*/ + @Inject + private Instance storeInstance; - private final Map cache = Collections.synchronizedMap(new HashMap()); - - /*@Inject - private EntityManagerConfig configuration;*/ + @Inject + private EntityManagerConfig configuration; /** *

@@ -136,47 +127,6 @@ public class EntityManagerProducer implements Serializable{ return new EntityManagerProxy(persistenceUnit); } - /*public EntityManager getEntityManager(String persistenceUnit) { - return getStore().getEntityManager(persistenceUnit); - }*/ - - @PostConstruct - void init() { - for (String persistenceUnit : getFactory().getCache().keySet()) { - getEntityManager(persistenceUnit); - } - } - - @PreDestroy - void close() { - //Se o produtor não possui escopo, então o ciclo de vida - //de EntityManager produzidos é responsabilidade do desenvolvedor. Não - //fechamos os EntityManagers aqui. - //if (configuration.getEntityManagerScope() != EntityManagerScope.NOSCOPE){ - for (EntityManager entityManager : cache.values()) { - entityManager.close(); - } - //} - cache.clear(); - } - - public EntityManager getEntityManager(String persistenceUnit) { - EntityManager entityManager = null; - - if (cache.containsKey(persistenceUnit)) { - entityManager = cache.get(persistenceUnit); - - } else { - entityManager = getFactory().create(persistenceUnit).createEntityManager(); - entityManager.setFlushMode(FlushModeType.AUTO); - - cache.put(persistenceUnit, entityManager); - this.getLogger().info(getBundle().getString("entity-manager-was-created", persistenceUnit)); - } - - return entityManager; - } - /** * Tries to get persistence unit name from demoiselle.properties. * @@ -212,12 +162,15 @@ public class EntityManagerProducer implements Serializable{ } } + public EntityManager getEntityManager(String persistenceUnit) { + return getStore().getEntityManager(persistenceUnit); + } + public Map getCache() { - //return getStore().getCache(); - return this.cache; + return getStore().getCache(); } - /*private AbstractEntityManagerStore getStore(){ + private EntityManagerStore getStore(){ switch(configuration.getEntityManagerScope()){ case REQUEST: return storeInstance.select(RequestEntityManagerStore.class).get(); @@ -234,26 +187,6 @@ public class EntityManagerProducer implements Serializable{ default: return storeInstance.select(RequestEntityManagerStore.class).get(); } - }*/ - - protected Logger getLogger(){ - if (logger==null){ - logger = Beans.getReference(Logger.class); - } - return logger; } - protected ResourceBundle getBundle(){ - if (bundle==null){ - bundle = Beans.getReference(ResourceBundle.class , new NameQualifier("demoiselle-jpa-bundle")); - } - return bundle; - } - - private EntityManagerFactoryProducer getFactory(){ - if (factory==null){ - factory = Beans.getReference(EntityManagerFactoryProducer.class); - } - return factory; - } } diff --git a/impl/extension/jpa/src/main/java/br/gov/frameworkdemoiselle/internal/producer/EntityManagerStore.java b/impl/extension/jpa/src/main/java/br/gov/frameworkdemoiselle/internal/producer/EntityManagerStore.java new file mode 100644 index 0000000..7fc79cd --- /dev/null +++ b/impl/extension/jpa/src/main/java/br/gov/frameworkdemoiselle/internal/producer/EntityManagerStore.java @@ -0,0 +1,30 @@ +package br.gov.frameworkdemoiselle.internal.producer; + +import java.io.Serializable; +import java.util.Map; + +import javax.annotation.PostConstruct; +import javax.annotation.PreDestroy; +import javax.persistence.EntityManager; + + +public interface EntityManagerStore extends Serializable { + + /** + * Run this to initialize all persistence units. It's recomended this method + * be annotated with {@link PostConstruct}, so it runs as soon as an EntityManager gets injected. + */ + public abstract void initialize(); + + /** + * Run this to close all persistence units. It's recomended this method + * be annotated with {@link PreDestroy}, so it runs as soon as the scope the EntityManager is + * attached to ends. + */ + public abstract void terminate(); + + Map getCache(); + + public EntityManager getEntityManager(String persistenceUnit); + +} diff --git a/impl/extension/jpa/src/test/java/producer/NoScopedProducerTest.java b/impl/extension/jpa/src/test/java/producer/NoScopedProducerTest.java index 7c318a4..82734d6 100644 --- a/impl/extension/jpa/src/test/java/producer/NoScopedProducerTest.java +++ b/impl/extension/jpa/src/test/java/producer/NoScopedProducerTest.java @@ -9,7 +9,6 @@ import javax.persistence.EntityManager; import org.jboss.arquillian.container.test.api.Deployment; import org.jboss.arquillian.junit.Arquillian; import org.jboss.shrinkwrap.api.spec.WebArchive; -import org.junit.Ignore; import org.junit.Test; import org.junit.runner.RunWith; @@ -18,8 +17,6 @@ import br.gov.frameworkdemoiselle.internal.proxy.EntityManagerProxy; import br.gov.frameworkdemoiselle.util.Beans; import br.gov.frameworkdemoiselle.util.NameQualifier; -//TODO Implementação de escopo selecionável tem que concluir antes de ativar esse teste -@Ignore @RunWith(Arquillian.class) public class NoScopedProducerTest { diff --git a/impl/extension/jpa/src/test/java/producer/RequestScopedProducerTest.java b/impl/extension/jpa/src/test/java/producer/RequestScopedProducerTest.java index b2beb7c..308f1a3 100644 --- a/impl/extension/jpa/src/test/java/producer/RequestScopedProducerTest.java +++ b/impl/extension/jpa/src/test/java/producer/RequestScopedProducerTest.java @@ -9,6 +9,7 @@ import javax.persistence.EntityManager; import org.jboss.arquillian.container.test.api.Deployment; import org.jboss.arquillian.junit.Arquillian; import org.jboss.shrinkwrap.api.spec.WebArchive; +import org.jboss.weld.context.http.HttpRequestContext; import org.junit.Test; import org.junit.runner.RunWith; @@ -72,6 +73,44 @@ public class RequestScopedProducerTest { assertTrue(m2.contains(entity)); } + @Test + public void produceDifferentEntityManagerPerRequest() { + HttpRequestContext weldContext = Beans.getReference(HttpRequestContext.class); + + boolean wasNotActive = false; + if (!weldContext.isActive()){ + wasNotActive = true; + weldContext.activate(); + } + + EntityManager m1 = Beans.getReference(EntityManager.class, new NameQualifier("pu")); + assertNotNull(m1); + assertEquals(EntityManagerProxy.class, m1.getClass()); + + MyEntity entity = new MyEntity(); + entity.setId(createId("testID")); + + m1.persist(entity); + assertTrue(m1.contains(entity)); + + weldContext.invalidate(); + weldContext.deactivate(); + + if (!weldContext.isActive()){ + weldContext.activate(); + } + + EntityManager m2 = Beans.getReference(EntityManager.class, new NameQualifier("pu")); + + assertTrue( m2.isOpen() ); + assertTrue( !m2.contains(entity)); + + if (wasNotActive && weldContext.isActive()){ + weldContext.invalidate(); + weldContext.deactivate(); + } + } + private String createId(String id) { return this.getClass().getName() + "_" + id; } diff --git a/impl/extension/jpa/src/test/java/producer/ViewScopedProducerTest.java b/impl/extension/jpa/src/test/java/producer/ViewScopedProducerTest.java index 208e0cb..95e9fef 100644 --- a/impl/extension/jpa/src/test/java/producer/ViewScopedProducerTest.java +++ b/impl/extension/jpa/src/test/java/producer/ViewScopedProducerTest.java @@ -10,7 +10,6 @@ import javax.persistence.EntityManager; import org.jboss.arquillian.container.test.api.Deployment; import org.jboss.arquillian.junit.Arquillian; import org.jboss.shrinkwrap.api.spec.WebArchive; -import org.junit.Ignore; import org.junit.Test; import org.junit.runner.RunWith; @@ -20,8 +19,6 @@ import br.gov.frameworkdemoiselle.internal.proxy.EntityManagerProxy; import br.gov.frameworkdemoiselle.util.Beans; import br.gov.frameworkdemoiselle.util.NameQualifier; -//TODO Implementação de escopo selecionável tem que concluir antes de ativar esse teste -@Ignore @RunWith(Arquillian.class) public class ViewScopedProducerTest { -- libgit2 0.21.2