From 00cb3ec04590da2d5151a9742d6ad3f805ae2e23 Mon Sep 17 00:00:00 2001
From: Dancovich
Date: Thu, 26 Sep 2013 20:17:56 -0300
Subject: [PATCH] Reativando solução após refactoring que corrige os testes.
---
impl/extension/jpa/src/main/java/br/gov/frameworkdemoiselle/internal/producer/AbstractEntityManagerStore.java | 30 +++++++++---------------------
impl/extension/jpa/src/main/java/br/gov/frameworkdemoiselle/internal/producer/EntityManagerProducer.java | 93 +++++++++++++--------------------------------------------------------------------------------
impl/extension/jpa/src/main/java/br/gov/frameworkdemoiselle/internal/producer/EntityManagerStore.java | 30 ++++++++++++++++++++++++++++++
impl/extension/jpa/src/test/java/producer/NoScopedProducerTest.java | 3 ---
impl/extension/jpa/src/test/java/producer/RequestScopedProducerTest.java | 39 +++++++++++++++++++++++++++++++++++++++
impl/extension/jpa/src/test/java/producer/ViewScopedProducerTest.java | 3 ---
6 files changed, 91 insertions(+), 107 deletions(-)
create mode 100644 impl/extension/jpa/src/main/java/br/gov/frameworkdemoiselle/internal/producer/EntityManagerStore.java
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