From 43b46f233ab2e1c0ef188dd0de6f037851792823 Mon Sep 17 00:00:00 2001 From: Dancovich Date: Thu, 26 Sep 2013 19:06:59 -0300 Subject: [PATCH] Revertendo alterações por necessitar de mais testes --- impl/extension/jpa/src/main/java/br/gov/frameworkdemoiselle/internal/producer/AbstractEntityManagerStore.java | 44 +++++++++++++++++++++++++++++++++++++++----- impl/extension/jpa/src/main/java/br/gov/frameworkdemoiselle/internal/producer/ApplicationEntityManagerStore.java | 14 ++++++++++++++ impl/extension/jpa/src/main/java/br/gov/frameworkdemoiselle/internal/producer/ConversationEntityManagerStore.java | 14 ++++++++++++++ impl/extension/jpa/src/main/java/br/gov/frameworkdemoiselle/internal/producer/DependentEntityManagerStore.java | 14 ++++++++++++++ impl/extension/jpa/src/main/java/br/gov/frameworkdemoiselle/internal/producer/EntityManagerProducer.java | 124 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++-------------------------------- impl/extension/jpa/src/main/java/br/gov/frameworkdemoiselle/internal/producer/RequestEntityManagerStore.java | 13 +++++++++++++ impl/extension/jpa/src/main/java/br/gov/frameworkdemoiselle/internal/producer/SessionEntityManagerStore.java | 14 ++++++++++++++ impl/extension/jpa/src/main/java/br/gov/frameworkdemoiselle/internal/producer/ViewEntityManagerStore.java | 15 +++++++++++++++ impl/extension/jpa/src/main/java/br/gov/frameworkdemoiselle/internal/proxy/EntityManagerProxy.java | 3 ++- impl/extension/jpa/src/test/java/producer/NoScopedProducerTest.java | 3 +++ impl/extension/jpa/src/test/java/producer/ViewScopedProducerTest.java | 3 +++ impl/extension/jpa/src/test/java/transaction/interceptor/JPATransactionTest.java | 2 -- 12 files changed, 223 insertions(+), 40 deletions(-) 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 305e732..941df30 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 @@ -53,6 +53,8 @@ import org.slf4j.Logger; import br.gov.frameworkdemoiselle.annotation.Name; import br.gov.frameworkdemoiselle.internal.configuration.EntityManagerConfig; import br.gov.frameworkdemoiselle.internal.configuration.EntityManagerConfig.EntityManagerScope; +import br.gov.frameworkdemoiselle.util.Beans; +import br.gov.frameworkdemoiselle.util.NameQualifier; import br.gov.frameworkdemoiselle.util.ResourceBundle; /** @@ -95,24 +97,35 @@ public abstract class AbstractEntityManagerStore implements Serializable { entityManager = cache.get(persistenceUnit); } else { - entityManager = factory.create(persistenceUnit).createEntityManager(); + entityManager = getFactory().create(persistenceUnit).createEntityManager(); entityManager.setFlushMode(FlushModeType.AUTO); cache.put(persistenceUnit, entityManager); - this.logger.info(bundle.getString("entity-manager-was-created", persistenceUnit)); + this.getLogger().info(getBundle().getString("entity-manager-was-created", persistenceUnit)); } return entityManager; } - @PostConstruct + /** + * 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 : factory.getCache().keySet()) { + 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 @@ -128,4 +141,25 @@ public abstract class AbstractEntityManagerStore implements Serializable { Map getCache() { return cache; } + + private EntityManagerFactoryProducer getFactory(){ + if (factory==null){ + factory = Beans.getReference(EntityManagerFactoryProducer.class); + } + return factory; + } + + 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; + } } diff --git a/impl/extension/jpa/src/main/java/br/gov/frameworkdemoiselle/internal/producer/ApplicationEntityManagerStore.java b/impl/extension/jpa/src/main/java/br/gov/frameworkdemoiselle/internal/producer/ApplicationEntityManagerStore.java index 894d2b4..fee7073 100644 --- a/impl/extension/jpa/src/main/java/br/gov/frameworkdemoiselle/internal/producer/ApplicationEntityManagerStore.java +++ b/impl/extension/jpa/src/main/java/br/gov/frameworkdemoiselle/internal/producer/ApplicationEntityManagerStore.java @@ -36,6 +36,8 @@ */ package br.gov.frameworkdemoiselle.internal.producer; +import javax.annotation.PostConstruct; +import javax.annotation.PreDestroy; import javax.enterprise.context.ApplicationScoped; /** @@ -50,4 +52,16 @@ public class ApplicationEntityManagerStore extends AbstractEntityManagerStore { private static final long serialVersionUID = 1L; + @Override + @PostConstruct + public void initialize() { + super.init(); + } + + @Override + @PreDestroy + public void terminate() { + super.close(); + } + } diff --git a/impl/extension/jpa/src/main/java/br/gov/frameworkdemoiselle/internal/producer/ConversationEntityManagerStore.java b/impl/extension/jpa/src/main/java/br/gov/frameworkdemoiselle/internal/producer/ConversationEntityManagerStore.java index 30c9b39..03e8e81 100644 --- a/impl/extension/jpa/src/main/java/br/gov/frameworkdemoiselle/internal/producer/ConversationEntityManagerStore.java +++ b/impl/extension/jpa/src/main/java/br/gov/frameworkdemoiselle/internal/producer/ConversationEntityManagerStore.java @@ -36,6 +36,8 @@ */ package br.gov.frameworkdemoiselle.internal.producer; +import javax.annotation.PostConstruct; +import javax.annotation.PreDestroy; import javax.enterprise.context.Conversation; import javax.enterprise.context.ConversationScoped; import javax.inject.Inject; @@ -62,4 +64,16 @@ public class ConversationEntityManagerStore extends AbstractEntityManagerStore { return conversation; } + @Override + @PostConstruct + public void initialize() { + super.init(); + } + + @Override + @PreDestroy + public void terminate() { + super.close(); + } + } diff --git a/impl/extension/jpa/src/main/java/br/gov/frameworkdemoiselle/internal/producer/DependentEntityManagerStore.java b/impl/extension/jpa/src/main/java/br/gov/frameworkdemoiselle/internal/producer/DependentEntityManagerStore.java index bc5f771..ce81d5d 100644 --- a/impl/extension/jpa/src/main/java/br/gov/frameworkdemoiselle/internal/producer/DependentEntityManagerStore.java +++ b/impl/extension/jpa/src/main/java/br/gov/frameworkdemoiselle/internal/producer/DependentEntityManagerStore.java @@ -36,6 +36,8 @@ */ package br.gov.frameworkdemoiselle.internal.producer; +import javax.annotation.PostConstruct; +import javax.annotation.PreDestroy; import javax.enterprise.context.Dependent; /** @@ -50,5 +52,17 @@ import javax.enterprise.context.Dependent; public class DependentEntityManagerStore extends AbstractEntityManagerStore { private static final long serialVersionUID = 1L; + + @Override + @PostConstruct + public void initialize() { + super.init(); + } + + @Override + @PreDestroy + public void terminate() { + super.close(); + } } 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 8e31100..93c0646 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,14 +37,20 @@ 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.inject.Default; 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; @@ -54,6 +60,7 @@ 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; /** @@ -62,6 +69,8 @@ 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 public class EntityManagerProducer implements Serializable{ private static final long serialVersionUID = 1L; @@ -76,10 +85,13 @@ public class EntityManagerProducer implements Serializable{ @Inject private EntityManagerFactoryProducer factory; - private AbstractEntityManagerStore entityManagerStore; + /*@Inject + private Instance storeInstance;*/ + + private final Map cache = Collections.synchronizedMap(new HashMap()); - @Inject - private EntityManagerConfig configuration; + /*@Inject + private EntityManagerConfig configuration;*/ /** *

@@ -124,8 +136,45 @@ public class EntityManagerProducer implements Serializable{ return new EntityManagerProxy(persistenceUnit); } - public EntityManager getEntityManager(String 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; } /** @@ -164,36 +213,47 @@ public class EntityManagerProducer implements Serializable{ } public Map getCache() { - return getStore().getCache(); + //return getStore().getCache(); + return this.cache; } - private AbstractEntityManagerStore getStore(){ - if (entityManagerStore==null){ - switch(configuration.getEntityManagerScope()){ - case APPLICATION: - entityManagerStore = Beans.getReference(ApplicationEntityManagerStore.class); - break; - case CONVERSATION: - entityManagerStore = Beans.getReference(ConversationEntityManagerStore.class); - break; - case NOSCOPE: - entityManagerStore = Beans.getReference(DependentEntityManagerStore.class); - break; - case REQUEST: - entityManagerStore = Beans.getReference(RequestEntityManagerStore.class); - break; - case SESSION: - entityManagerStore = Beans.getReference(SessionEntityManagerStore.class); - break; - case VIEW: - entityManagerStore = Beans.getReference(ViewEntityManagerStore.class); - break; - default: - entityManagerStore = Beans.getReference(RequestEntityManagerStore.class); - break; - } + /*private AbstractEntityManagerStore getStore(){ + switch(configuration.getEntityManagerScope()){ + case REQUEST: + return storeInstance.select(RequestEntityManagerStore.class).get(); + case APPLICATION: + return storeInstance.select(ApplicationEntityManagerStore.class).get(); + case CONVERSATION: + return storeInstance.select(ConversationEntityManagerStore.class).get(); + case NOSCOPE: + return storeInstance.select(DependentEntityManagerStore.class).get(); + case SESSION: + return storeInstance.select(SessionEntityManagerStore.class).get(); + case VIEW: + return storeInstance.select(ViewEntityManagerStore.class).get(); + 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 entityManagerStore; + return factory; } } diff --git a/impl/extension/jpa/src/main/java/br/gov/frameworkdemoiselle/internal/producer/RequestEntityManagerStore.java b/impl/extension/jpa/src/main/java/br/gov/frameworkdemoiselle/internal/producer/RequestEntityManagerStore.java index 0b70aca..466cf77 100644 --- a/impl/extension/jpa/src/main/java/br/gov/frameworkdemoiselle/internal/producer/RequestEntityManagerStore.java +++ b/impl/extension/jpa/src/main/java/br/gov/frameworkdemoiselle/internal/producer/RequestEntityManagerStore.java @@ -36,6 +36,8 @@ */ package br.gov.frameworkdemoiselle.internal.producer; +import javax.annotation.PostConstruct; +import javax.annotation.PreDestroy; import javax.enterprise.context.RequestScoped; /** @@ -49,5 +51,16 @@ import javax.enterprise.context.RequestScoped; public class RequestEntityManagerStore extends AbstractEntityManagerStore { private static final long serialVersionUID = 1L; + + @Override + @PostConstruct + public void initialize() { + super.init(); + } + @Override + @PreDestroy + public void terminate() { + super.close(); + } } diff --git a/impl/extension/jpa/src/main/java/br/gov/frameworkdemoiselle/internal/producer/SessionEntityManagerStore.java b/impl/extension/jpa/src/main/java/br/gov/frameworkdemoiselle/internal/producer/SessionEntityManagerStore.java index d1f71fe..521c40a 100644 --- a/impl/extension/jpa/src/main/java/br/gov/frameworkdemoiselle/internal/producer/SessionEntityManagerStore.java +++ b/impl/extension/jpa/src/main/java/br/gov/frameworkdemoiselle/internal/producer/SessionEntityManagerStore.java @@ -36,6 +36,8 @@ */ package br.gov.frameworkdemoiselle.internal.producer; +import javax.annotation.PostConstruct; +import javax.annotation.PreDestroy; import javax.enterprise.context.SessionScoped; /** @@ -49,5 +51,17 @@ import javax.enterprise.context.SessionScoped; public class SessionEntityManagerStore extends AbstractEntityManagerStore { private static final long serialVersionUID = 1L; + + @Override + @PostConstruct + public void initialize() { + super.init(); + } + + @Override + @PreDestroy + public void terminate() { + super.close(); + } } diff --git a/impl/extension/jpa/src/main/java/br/gov/frameworkdemoiselle/internal/producer/ViewEntityManagerStore.java b/impl/extension/jpa/src/main/java/br/gov/frameworkdemoiselle/internal/producer/ViewEntityManagerStore.java index bf0a603..7c81ba6 100644 --- a/impl/extension/jpa/src/main/java/br/gov/frameworkdemoiselle/internal/producer/ViewEntityManagerStore.java +++ b/impl/extension/jpa/src/main/java/br/gov/frameworkdemoiselle/internal/producer/ViewEntityManagerStore.java @@ -36,6 +36,9 @@ */ package br.gov.frameworkdemoiselle.internal.producer; +import javax.annotation.PostConstruct; +import javax.annotation.PreDestroy; + import br.gov.frameworkdemoiselle.annotation.ViewScoped; /** @@ -49,5 +52,17 @@ import br.gov.frameworkdemoiselle.annotation.ViewScoped; public class ViewEntityManagerStore extends AbstractEntityManagerStore { private static final long serialVersionUID = 1L; + + @Override + @PostConstruct + public void initialize() { + super.init(); + } + + @Override + @PreDestroy + public void terminate() { + super.close(); + } } diff --git a/impl/extension/jpa/src/main/java/br/gov/frameworkdemoiselle/internal/proxy/EntityManagerProxy.java b/impl/extension/jpa/src/main/java/br/gov/frameworkdemoiselle/internal/proxy/EntityManagerProxy.java index bf6bb82..ab8c70c 100644 --- a/impl/extension/jpa/src/main/java/br/gov/frameworkdemoiselle/internal/proxy/EntityManagerProxy.java +++ b/impl/extension/jpa/src/main/java/br/gov/frameworkdemoiselle/internal/proxy/EntityManagerProxy.java @@ -427,7 +427,7 @@ public class EntityManagerProxy implements EntityManager, Serializable { */ protected final void joinTransactionIfNecessary() { try { - getEntityManagerDelegate().getTransaction(); + /*EntityTransaction transaction = */getEntityManagerDelegate().getTransaction(); } catch (IllegalStateException cause) { //IllegalStateException is launched if we are on a JTA entity manager, so //we assume we need to join transaction instead of creating one. @@ -586,4 +586,5 @@ public class EntityManagerProxy implements EntityManager, Serializable { private ResourceBundle getBundle(){ return Beans.getReference(ResourceBundle.class,new NameQualifier("demoiselle-jpa-bundle")); } + } diff --git a/impl/extension/jpa/src/test/java/producer/NoScopedProducerTest.java b/impl/extension/jpa/src/test/java/producer/NoScopedProducerTest.java index 82734d6..7c318a4 100644 --- a/impl/extension/jpa/src/test/java/producer/NoScopedProducerTest.java +++ b/impl/extension/jpa/src/test/java/producer/NoScopedProducerTest.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.junit.Ignore; import org.junit.Test; import org.junit.runner.RunWith; @@ -17,6 +18,8 @@ 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/ViewScopedProducerTest.java b/impl/extension/jpa/src/test/java/producer/ViewScopedProducerTest.java index 95e9fef..208e0cb 100644 --- a/impl/extension/jpa/src/test/java/producer/ViewScopedProducerTest.java +++ b/impl/extension/jpa/src/test/java/producer/ViewScopedProducerTest.java @@ -10,6 +10,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.junit.Ignore; import org.junit.Test; import org.junit.runner.RunWith; @@ -19,6 +20,8 @@ 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 { diff --git a/impl/extension/jpa/src/test/java/transaction/interceptor/JPATransactionTest.java b/impl/extension/jpa/src/test/java/transaction/interceptor/JPATransactionTest.java index e1b70be..f03e131 100644 --- a/impl/extension/jpa/src/test/java/transaction/interceptor/JPATransactionTest.java +++ b/impl/extension/jpa/src/test/java/transaction/interceptor/JPATransactionTest.java @@ -66,7 +66,6 @@ public class JPATransactionTest { @Test public void commitWithSuccess() { - tb.commitWithSuccess(); MyEntity1 entity1 = em1.find(MyEntity1.class, tb.createId("id-1")); @@ -78,7 +77,6 @@ public class JPATransactionTest { @Test public void rollbackWithSuccess() { - try { tb.rollbackWithSuccess(); } catch (Exception e) { -- libgit2 0.21.2