From c73cbad5652a438910eb5ddb92a429a2c1eb37ef Mon Sep 17 00:00:00 2001 From: Ednara Oliveira Date: Mon, 17 Sep 2012 16:04:12 -0300 Subject: [PATCH] X:load --- impl/core/src/main/java/br/gov/frameworkdemoiselle/internal/bootstrap/ConfigurationBootstrap.java | 25 +++++++++++++++++-------- impl/core/src/main/java/br/gov/frameworkdemoiselle/internal/implementation/X.java | 40 ++++++++++++++++++++++++++++++++++++++++ 2 files changed, 57 insertions(+), 8 deletions(-) create mode 100644 impl/core/src/main/java/br/gov/frameworkdemoiselle/internal/implementation/X.java diff --git a/impl/core/src/main/java/br/gov/frameworkdemoiselle/internal/bootstrap/ConfigurationBootstrap.java b/impl/core/src/main/java/br/gov/frameworkdemoiselle/internal/bootstrap/ConfigurationBootstrap.java index fe5f0b5..81649a5 100644 --- a/impl/core/src/main/java/br/gov/frameworkdemoiselle/internal/bootstrap/ConfigurationBootstrap.java +++ b/impl/core/src/main/java/br/gov/frameworkdemoiselle/internal/bootstrap/ConfigurationBootstrap.java @@ -42,6 +42,7 @@ import java.util.List; import javassist.ClassPool; import javassist.CtClass; +import javassist.CtField; import javassist.CtMethod; import javassist.CtNewMethod; import javassist.LoaderClassPath; @@ -54,7 +55,6 @@ import javax.enterprise.inject.spi.Extension; import javax.enterprise.inject.spi.ProcessAnnotatedType; import br.gov.frameworkdemoiselle.configuration.Configuration; -import br.gov.frameworkdemoiselle.internal.configuration.ConfigurationLoader; public class ConfigurationBootstrap implements Extension { @@ -86,27 +86,36 @@ public class ConfigurationBootstrap implements Extension { ClassPool pool = ClassPool.getDefault(); CtClass ctChieldClass = pool.getOrNull(chieldClassName); + ClassLoader classLoader = type.getClassLoader(); if (ctChieldClass == null) { - ClassLoader classLoader = ConfigurationLoader.getClassLoaderForClass(superClassName); + pool.appendClassPath(new LoaderClassPath(classLoader)); + // classLoader = Thread.currentThread().getContextClassLoader(); + // pool.appendClassPath(new LoaderClassPath(classLoader)); + // classLoader = ConfigurationLoader.getClassLoaderForClass(superClassName); + // pool.appendClassPath(new LoaderClassPath(classLoader)); + CtClass ctSuperClass = pool.get(superClassName); ctChieldClass = pool.makeClass(chieldClassName, ctSuperClass); - StringBuffer buffer = new StringBuffer(); - buffer.append("new "); - buffer.append(ConfigurationLoader.class.getCanonicalName()); - buffer.append("().load(this);"); + CtClass ctClassX = pool.get("br.gov.frameworkdemoiselle.internal.implementation.X"); + + CtField ctFieldX = ctClassX.getField("cache"); + ctChieldClass.addField(new CtField(ctFieldX, ctChieldClass)); + + CtMethod ctMethodX = ctClassX.getDeclaredMethod("loadProxyConfigurarion"); + ctChieldClass.addMethod(new CtMethod(ctMethodX, ctChieldClass, null)); CtMethod ctChieldMethod; for (CtMethod ctSuperMethod : ctSuperClass.getDeclaredMethods()) { ctChieldMethod = CtNewMethod.delegator(ctSuperMethod, ctChieldClass); - ctChieldMethod.insertBefore(buffer.toString()); + ctChieldMethod.insertBefore("loadProxyConfigurarion();"); ctChieldClass.addMethod(ctChieldMethod); } } - return ctChieldClass.toClass(); + return ctChieldClass.toClass(classLoader, type.getProtectionDomain()); } } diff --git a/impl/core/src/main/java/br/gov/frameworkdemoiselle/internal/implementation/X.java b/impl/core/src/main/java/br/gov/frameworkdemoiselle/internal/implementation/X.java new file mode 100644 index 0000000..86bed8b --- /dev/null +++ b/impl/core/src/main/java/br/gov/frameworkdemoiselle/internal/implementation/X.java @@ -0,0 +1,40 @@ +package br.gov.frameworkdemoiselle.internal.implementation; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import br.gov.frameworkdemoiselle.internal.configuration.ConfigurationLoader; + +public class X { + + private final Map>> cache = Collections + .synchronizedMap(new HashMap>>()); + + private void loadProxyConfigurarion() { + Class clazz = this.getClass(); + ClassLoader classLoader = Thread.currentThread().getContextClassLoader(); + + boolean loaded = true; + + if (cache.containsKey(classLoader)) { + if (!cache.get(classLoader).contains(clazz)) { + loaded = false; + } + + } else { + List> classes = Collections.synchronizedList(new ArrayList>()); + cache.put(classLoader, classes); + loaded = false; + } + + if (!loaded) { + new ConfigurationLoader().load(this); + cache.get(classLoader).add(clazz); + } + + new ConfigurationLoader().load(this); + } +} -- libgit2 0.21.2