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 42  
43 43 import javassist.ClassPool;
44 44 import javassist.CtClass;
  45 +import javassist.CtField;
45 46 import javassist.CtMethod;
46 47 import javassist.CtNewMethod;
47 48 import javassist.LoaderClassPath;
... ... @@ -54,7 +55,6 @@ import javax.enterprise.inject.spi.Extension;
54 55 import javax.enterprise.inject.spi.ProcessAnnotatedType;
55 56  
56 57 import br.gov.frameworkdemoiselle.configuration.Configuration;
57   -import br.gov.frameworkdemoiselle.internal.configuration.ConfigurationLoader;
58 58  
59 59 public class ConfigurationBootstrap implements Extension {
60 60  
... ... @@ -86,27 +86,36 @@ public class ConfigurationBootstrap implements Extension {
86 86 ClassPool pool = ClassPool.getDefault();
87 87 CtClass ctChieldClass = pool.getOrNull(chieldClassName);
88 88  
  89 + ClassLoader classLoader = type.getClassLoader();
89 90 if (ctChieldClass == null) {
90   - ClassLoader classLoader = ConfigurationLoader.getClassLoaderForClass(superClassName);
  91 +
91 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 98 CtClass ctSuperClass = pool.get(superClassName);
93 99  
94 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 110 CtMethod ctChieldMethod;
102 111 for (CtMethod ctSuperMethod : ctSuperClass.getDeclaredMethods()) {
103 112 ctChieldMethod = CtNewMethod.delegator(ctSuperMethod, ctChieldClass);
104   - ctChieldMethod.insertBefore(buffer.toString());
  113 + ctChieldMethod.insertBefore("loadProxyConfigurarion();");
105 114  
106 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 @@
  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 +}
... ...