Commit c73cbad5652a438910eb5ddb92a429a2c1eb37ef

Authored by Ednara Oliveira
1 parent b4660f01
Exists in master

X:load

impl/core/src/main/java/br/gov/frameworkdemoiselle/internal/bootstrap/ConfigurationBootstrap.java
@@ -42,6 +42,7 @@ import java.util.List; @@ -42,6 +42,7 @@ import java.util.List;
42 42
43 import javassist.ClassPool; 43 import javassist.ClassPool;
44 import javassist.CtClass; 44 import javassist.CtClass;
  45 +import javassist.CtField;
45 import javassist.CtMethod; 46 import javassist.CtMethod;
46 import javassist.CtNewMethod; 47 import javassist.CtNewMethod;
47 import javassist.LoaderClassPath; 48 import javassist.LoaderClassPath;
@@ -54,7 +55,6 @@ import javax.enterprise.inject.spi.Extension; @@ -54,7 +55,6 @@ import javax.enterprise.inject.spi.Extension;
54 import javax.enterprise.inject.spi.ProcessAnnotatedType; 55 import javax.enterprise.inject.spi.ProcessAnnotatedType;
55 56
56 import br.gov.frameworkdemoiselle.configuration.Configuration; 57 import br.gov.frameworkdemoiselle.configuration.Configuration;
57 -import br.gov.frameworkdemoiselle.internal.configuration.ConfigurationLoader;  
58 58
59 public class ConfigurationBootstrap implements Extension { 59 public class ConfigurationBootstrap implements Extension {
60 60
@@ -86,27 +86,36 @@ public class ConfigurationBootstrap implements Extension { @@ -86,27 +86,36 @@ public class ConfigurationBootstrap implements Extension {
86 ClassPool pool = ClassPool.getDefault(); 86 ClassPool pool = ClassPool.getDefault();
87 CtClass ctChieldClass = pool.getOrNull(chieldClassName); 87 CtClass ctChieldClass = pool.getOrNull(chieldClassName);
88 88
  89 + ClassLoader classLoader = type.getClassLoader();
89 if (ctChieldClass == null) { 90 if (ctChieldClass == null) {
90 - ClassLoader classLoader = ConfigurationLoader.getClassLoaderForClass(superClassName); 91 +
91 pool.appendClassPath(new LoaderClassPath(classLoader)); 92 pool.appendClassPath(new LoaderClassPath(classLoader));
  93 + // classLoader = Thread.currentThread().getContextClassLoader();
  94 + // pool.appendClassPath(new LoaderClassPath(classLoader));
  95 + // classLoader = ConfigurationLoader.getClassLoaderForClass(superClassName);
  96 + // pool.appendClassPath(new LoaderClassPath(classLoader));
  97 +
92 CtClass ctSuperClass = pool.get(superClassName); 98 CtClass ctSuperClass = pool.get(superClassName);
93 99
94 ctChieldClass = pool.makeClass(chieldClassName, ctSuperClass); 100 ctChieldClass = pool.makeClass(chieldClassName, ctSuperClass);
95 101
96 - StringBuffer buffer = new StringBuffer();  
97 - buffer.append("new ");  
98 - buffer.append(ConfigurationLoader.class.getCanonicalName());  
99 - buffer.append("().load(this);"); 102 + CtClass ctClassX = pool.get("br.gov.frameworkdemoiselle.internal.implementation.X");
  103 +
  104 + CtField ctFieldX = ctClassX.getField("cache");
  105 + ctChieldClass.addField(new CtField(ctFieldX, ctChieldClass));
  106 +
  107 + CtMethod ctMethodX = ctClassX.getDeclaredMethod("loadProxyConfigurarion");
  108 + ctChieldClass.addMethod(new CtMethod(ctMethodX, ctChieldClass, null));
100 109
101 CtMethod ctChieldMethod; 110 CtMethod ctChieldMethod;
102 for (CtMethod ctSuperMethod : ctSuperClass.getDeclaredMethods()) { 111 for (CtMethod ctSuperMethod : ctSuperClass.getDeclaredMethods()) {
103 ctChieldMethod = CtNewMethod.delegator(ctSuperMethod, ctChieldClass); 112 ctChieldMethod = CtNewMethod.delegator(ctSuperMethod, ctChieldClass);
104 - ctChieldMethod.insertBefore(buffer.toString()); 113 + ctChieldMethod.insertBefore("loadProxyConfigurarion();");
105 114
106 ctChieldClass.addMethod(ctChieldMethod); 115 ctChieldClass.addMethod(ctChieldMethod);
107 } 116 }
108 } 117 }
109 118
110 - return ctChieldClass.toClass(); 119 + return ctChieldClass.toClass(classLoader, type.getProtectionDomain());
111 } 120 }
112 } 121 }
impl/core/src/main/java/br/gov/frameworkdemoiselle/internal/implementation/X.java 0 → 100644
@@ -0,0 +1,40 @@ @@ -0,0 +1,40 @@
  1 +package br.gov.frameworkdemoiselle.internal.implementation;
  2 +
  3 +import java.util.ArrayList;
  4 +import java.util.Collections;
  5 +import java.util.HashMap;
  6 +import java.util.List;
  7 +import java.util.Map;
  8 +
  9 +import br.gov.frameworkdemoiselle.internal.configuration.ConfigurationLoader;
  10 +
  11 +public class X {
  12 +
  13 + private final Map<ClassLoader, List<Class<?>>> cache = Collections
  14 + .synchronizedMap(new HashMap<ClassLoader, List<Class<?>>>());
  15 +
  16 + private void loadProxyConfigurarion() {
  17 + Class<?> clazz = this.getClass();
  18 + ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
  19 +
  20 + boolean loaded = true;
  21 +
  22 + if (cache.containsKey(classLoader)) {
  23 + if (!cache.get(classLoader).contains(clazz)) {
  24 + loaded = false;
  25 + }
  26 +
  27 + } else {
  28 + List<Class<?>> classes = Collections.synchronizedList(new ArrayList<Class<?>>());
  29 + cache.put(classLoader, classes);
  30 + loaded = false;
  31 + }
  32 +
  33 + if (!loaded) {
  34 + new ConfigurationLoader().load(this);
  35 + cache.get(classLoader).add(clazz);
  36 + }
  37 +
  38 + new ConfigurationLoader().load(this);
  39 + }
  40 +}