Commit ca57f3e4753e17bba76035f409c34f579bfd71c0

Authored by Dancovich
1 parent 187a6500
Exists in master

Alterada forma como cache de entity manager factory é gerada, evitando

recarregar o cache a cada chamada do producer.
impl/extension/jpa/src/main/java/br/gov/frameworkdemoiselle/internal/producer/EntityManagerFactoryProducer.java
1 package br.gov.frameworkdemoiselle.internal.producer; 1 package br.gov.frameworkdemoiselle.internal.producer;
2 2
3 import java.io.Serializable; 3 import java.io.Serializable;
  4 +import java.util.ArrayList;
4 import java.util.Collections; 5 import java.util.Collections;
5 import java.util.HashMap; 6 import java.util.HashMap;
6 import java.util.Map; 7 import java.util.Map;
7 8
  9 +import javax.annotation.PostConstruct;
8 import javax.annotation.PreDestroy; 10 import javax.annotation.PreDestroy;
9 import javax.enterprise.context.ApplicationScoped; 11 import javax.enterprise.context.ApplicationScoped;
10 import javax.inject.Inject; 12 import javax.inject.Inject;
@@ -40,32 +42,42 @@ public class EntityManagerFactoryProducer implements Serializable { @@ -40,32 +42,42 @@ public class EntityManagerFactoryProducer implements Serializable {
40 // private final Map<String, EntityManagerFactory> cache = Collections 42 // private final Map<String, EntityManagerFactory> cache = Collections
41 // .synchronizedMap(new HashMap<String, EntityManagerFactory>()); 43 // .synchronizedMap(new HashMap<String, EntityManagerFactory>());
42 44
43 - private final Map<Key, EntityManagerFactory> cache = Collections  
44 - .synchronizedMap(new HashMap<Key, EntityManagerFactory>()); 45 + /*
  46 + * private final Map<Key, EntityManagerFactory> cache = Collections .synchronizedMap(new HashMap<Key,
  47 + * EntityManagerFactory>());
  48 + */
  49 +
  50 + private final Map<ClassLoader, Map<String, EntityManagerFactory>> factoryCache = Collections
  51 + .synchronizedMap(new HashMap<ClassLoader, Map<String, EntityManagerFactory>>());
45 52
46 public EntityManagerFactory create(String persistenceUnit) { 53 public EntityManagerFactory create(String persistenceUnit) {
47 EntityManagerFactory factory; 54 EntityManagerFactory factory;
48 55
49 - //String[] key = new String [] { persistenceUnit, Thread.currentThread().getContextClassLoader().toString()};  
50 - Key key = new Key(persistenceUnit, Thread.currentThread().getContextClassLoader());  
51 -  
52 - if (cache.containsKey(key)) {  
53 - factory = cache.get(key); 56 + ClassLoader c = Thread.currentThread().getContextClassLoader();
  57 +
  58 + if (factoryCache.containsKey(c)) {
  59 + Map<String, EntityManagerFactory> localCache = factoryCache.get(c);
  60 + if (localCache.containsKey(persistenceUnit)) {
  61 + factory = localCache.get(persistenceUnit);
  62 + } else {
  63 + factory = Persistence.createEntityManagerFactory(persistenceUnit);
  64 + localCache.put(persistenceUnit, factory);
  65 + }
54 } else { 66 } else {
  67 + Map<String, EntityManagerFactory> localCache = new HashMap<String, EntityManagerFactory>();
55 factory = Persistence.createEntityManagerFactory(persistenceUnit); 68 factory = Persistence.createEntityManagerFactory(persistenceUnit);
56 - cache.put(key, factory); 69 + localCache.put(persistenceUnit, factory);
  70 + factoryCache.put(c, localCache);
57 } 71 }
58 72
59 return factory; 73 return factory;
60 } 74 }
61 75
62 - // @PostConstruct  
63 - public void init() {  
64 - ClassLoader contextClassLoader = Thread.currentThread().getContextClassLoader();  
65 - 76 + private String[] loadPersistenceUnitFromClassloader(ClassLoader classLoader) {
66 try { 77 try {
  78 + ArrayList<String> persistenceUnits = new ArrayList<String>();
67 DocumentBuilder documentBuilder = DocumentBuilderFactory.newInstance().newDocumentBuilder(); 79 DocumentBuilder documentBuilder = DocumentBuilderFactory.newInstance().newDocumentBuilder();
68 - Document document = documentBuilder.parse(contextClassLoader.getResourceAsStream(ENTITY_MANAGER_RESOURCE)); 80 + Document document = documentBuilder.parse(classLoader.getResourceAsStream(ENTITY_MANAGER_RESOURCE));
69 NodeList nodes = document.getElementsByTagName("persistence-unit"); 81 NodeList nodes = document.getElementsByTagName("persistence-unit");
70 82
71 String persistenceUnit = ""; 83 String persistenceUnit = "";
@@ -75,88 +87,57 @@ public class EntityManagerFactoryProducer implements Serializable { @@ -75,88 +87,57 @@ public class EntityManagerFactoryProducer implements Serializable {
75 87
76 if ("".equals(persistenceUnit)) { 88 if ("".equals(persistenceUnit)) {
77 throw new DemoiselleException(bundle.getString("can-not-get-persistence-unit-from-persistence")); 89 throw new DemoiselleException(bundle.getString("can-not-get-persistence-unit-from-persistence"));
  90 + } else {
  91 + persistenceUnits.add(persistenceUnit);
78 } 92 }
  93 + // logger.debug(bundle.getString("persistence-unit-name-found",
  94 + // persistenceUnit));
79 95
80 - create(persistenceUnit);  
81 - logger.debug(bundle.getString("persistence-unit-name-found", persistenceUnit));  
82 } 96 }
83 97
  98 + return persistenceUnits.toArray(new String[0]);
  99 +
84 } catch (Exception cause) { 100 } catch (Exception cause) {
85 String message = bundle.getString("can-not-get-persistence-unit-from-persistence"); 101 String message = bundle.getString("can-not-get-persistence-unit-from-persistence");
86 logger.error(message, cause); 102 logger.error(message, cause);
87 103
88 throw new DemoiselleException(message, cause); 104 throw new DemoiselleException(message, cause);
89 } 105 }
  106 +
  107 + }
  108 +
  109 + @PostConstruct
  110 + public void loadPersistenceUnits() {
  111 + ClassLoader contextClassLoader = Thread.currentThread().getContextClassLoader();
  112 + for (String persistenceUnit : loadPersistenceUnitFromClassloader(contextClassLoader)) {
  113 + create(persistenceUnit);
  114 + logger.debug(bundle.getString("persistence-unit-name-found", persistenceUnit));
  115 + }
90 } 116 }
91 117
92 @PreDestroy 118 @PreDestroy
93 public void close() { 119 public void close() {
94 - for (EntityManagerFactory factory : cache.values()) {  
95 - factory.close(); 120 + for (Map<String, EntityManagerFactory> factories : factoryCache.values()) {
  121 + for (EntityManagerFactory factory : factories.values()) {
  122 + factory.close();
  123 + }
96 } 124 }
97 -  
98 - cache.clear(); 125 + factoryCache.clear();
99 } 126 }
100 127
101 public Map<String, EntityManagerFactory> getCache() { 128 public Map<String, EntityManagerFactory> getCache() {
102 - init();  
103 - Map<String, EntityManagerFactory> result = new HashMap<String, EntityManagerFactory>();  
104 ClassLoader classLoader = Thread.currentThread().getContextClassLoader(); 129 ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
105 -  
106 - for (Key key : cache.keySet()) {  
107 - if(key.classLoader.equals(classLoader)) {  
108 - result.put(key.persistenceUnit, cache.get(key));  
109 - }  
110 - }  
111 -  
112 - return result;  
113 - }  
114 -  
115 -  
116 - class Key{  
117 -  
118 - private String persistenceUnit;  
119 - private ClassLoader classLoader;  
120 -  
121 -  
122 - public Key(String persistenceUnit, ClassLoader classLoader) {  
123 - this.persistenceUnit = persistenceUnit;  
124 - this.classLoader = classLoader;  
125 - }  
126 -  
127 - @Override  
128 - public int hashCode() {  
129 - final int prime = 31;  
130 - int result = 1;  
131 - result = prime * result + ((classLoader == null) ? 0 : classLoader.hashCode());  
132 - result = prime * result + ((persistenceUnit == null) ? 0 : persistenceUnit.hashCode());  
133 - return result;  
134 - } 130 + Map<String, EntityManagerFactory> result = factoryCache.get(classLoader);
135 131
136 - @Override  
137 - public boolean equals(Object obj) {  
138 - if (this == obj)  
139 - return true;  
140 - if (obj == null)  
141 - return false;  
142 - if (getClass() != obj.getClass())  
143 - return false;  
144 - Key other = (Key) obj;  
145 - if (classLoader == null) {  
146 - if (other.classLoader != null)  
147 - return false;  
148 - } else if (!classLoader.equals(other.classLoader))  
149 - return false;  
150 - if (persistenceUnit == null) {  
151 - if (other.persistenceUnit != null)  
152 - return false;  
153 - } else if (!persistenceUnit.equals(other.persistenceUnit))  
154 - return false;  
155 - return true; 132 + if (result == null || result.isEmpty()) {
  133 + logger.debug(bundle.getString("entity-manager-factory-not-found-in-cache"));
  134 + for (String persistenceUnit : loadPersistenceUnitFromClassloader(classLoader)) {
  135 + create(persistenceUnit);
  136 + result = factoryCache.get(classLoader);
  137 + }
156 } 138 }
157 139
  140 + return result;
158 } 141 }
159 142
160 } 143 }
161 -  
162 -  
impl/extension/jpa/src/main/resources/demoiselle-jpa-bundle.properties
@@ -34,6 +34,7 @@ @@ -34,6 +34,7 @@
34 # 51 Franklin St, Fifth Floor, Boston, MA 02111-1301, USA. 34 # 51 Franklin St, Fifth Floor, Boston, MA 02111-1301, USA.
35 35
36 entity-manager-was-created=Gerenciador de entidades criado a partir da unidade de persist\u00EAncia "{0}". 36 entity-manager-was-created=Gerenciador de entidades criado a partir da unidade de persist\u00EAncia "{0}".
  37 +entity-manager-factory-not-found-in-cache=Entity Manager Factory n\u00E3o encontrado para contexto atual, criando um agora.
37 operation-not-supported=Esta operação não é suportada. 38 operation-not-supported=Esta operação não é suportada.
38 getting-persistence-unit-from-properties=Obtendo a unidade de persist\u00EAncia a partir do arquivo de configura\u00E7\u00E3o "{0}". 39 getting-persistence-unit-from-properties=Obtendo a unidade de persist\u00EAncia a partir do arquivo de configura\u00E7\u00E3o "{0}".
39 getting-persistence-unit-from-persistence=Obtendo a unidade de persist\u00EAncia a partir do arquivo "persistence.xml". 40 getting-persistence-unit-from-persistence=Obtendo a unidade de persist\u00EAncia a partir do arquivo "persistence.xml".
impl/extension/jpa/src/test/java/br/gov/frameworkdemoiselle/internal/producer/EntityManagerFactoryProducerTest.java
@@ -72,14 +72,14 @@ public class EntityManagerFactoryProducerTest { @@ -72,14 +72,14 @@ public class EntityManagerFactoryProducerTest {
72 expect(Persistence.createEntityManagerFactory("pu1")).andReturn(emFactory); 72 expect(Persistence.createEntityManagerFactory("pu1")).andReturn(emFactory);
73 replay(Persistence.class); 73 replay(Persistence.class);
74 74
75 - producer.init(); 75 + producer.loadPersistenceUnits();
76 Assert.assertEquals(emFactory, cache.get("pu1")); 76 Assert.assertEquals(emFactory, cache.get("pu1"));
77 } 77 }
78 78
79 @Test 79 @Test
80 public void testInitWithError() { 80 public void testInitWithError() {
81 try { 81 try {
82 - producer.init(); 82 + producer.loadPersistenceUnits();
83 Assert.fail(); 83 Assert.fail();
84 }catch(DemoiselleException cause) { 84 }catch(DemoiselleException cause) {
85 Assert.assertTrue(true); 85 Assert.assertTrue(true);
impl/extension/jpa/src/test/resources/demoiselle-jpa-bundle.properties
@@ -34,6 +34,7 @@ @@ -34,6 +34,7 @@
34 # 51 Franklin St, Fifth Floor, Boston, MA 02111-1301, USA. 34 # 51 Franklin St, Fifth Floor, Boston, MA 02111-1301, USA.
35 35
36 entity-manager-was-created=Gerenciador de entidades criado a partir da unidade de persist\u00EAncia "{0}". 36 entity-manager-was-created=Gerenciador de entidades criado a partir da unidade de persist\u00EAncia "{0}".
  37 +entity-manager-factory-not-found-in-cache=Entity Manager Factory n\u00E3o encontrado para contexto atual, criando um agora.
37 operation-not-supported=Esta operação não é suportada. 38 operation-not-supported=Esta operação não é suportada.
38 getting-persistence-unit-from-properties=Obtendo a unidade de persist\u00EAncia a partir do arquivo de configura\u00E7\u00E3o "{0}". 39 getting-persistence-unit-from-properties=Obtendo a unidade de persist\u00EAncia a partir do arquivo de configura\u00E7\u00E3o "{0}".
39 getting-persistence-unit-from-persistence=Obtendo a unidade de persist\u00EAncia a partir do arquivo "persistence.xml". 40 getting-persistence-unit-from-persistence=Obtendo a unidade de persist\u00EAncia a partir do arquivo "persistence.xml".