Commit 961def6952393ddbc5921dbea7e8c7d9467cd424
1 parent
f78fcc1d
Exists in
master
Verificando antes de carregar a classe se ela já foi carregada
previamente
Showing
1 changed file
with
22 additions
and
22 deletions
Show diff stats
impl/core/src/main/java/br/gov/frameworkdemoiselle/internal/bootstrap/ConfigurationBootstrap.java
| @@ -44,6 +44,7 @@ import javassist.ClassPool; | @@ -44,6 +44,7 @@ import javassist.ClassPool; | ||
| 44 | import javassist.CtClass; | 44 | import javassist.CtClass; |
| 45 | import javassist.CtMethod; | 45 | import javassist.CtMethod; |
| 46 | import javassist.CtNewMethod; | 46 | import javassist.CtNewMethod; |
| 47 | +import javassist.LoaderClassPath; | ||
| 47 | 48 | ||
| 48 | import javax.enterprise.event.Observes; | 49 | import javax.enterprise.event.Observes; |
| 49 | import javax.enterprise.inject.spi.AfterBeanDiscovery; | 50 | import javax.enterprise.inject.spi.AfterBeanDiscovery; |
| @@ -68,44 +69,43 @@ public class ConfigurationBootstrap implements Extension { | @@ -68,44 +69,43 @@ public class ConfigurationBootstrap implements Extension { | ||
| 68 | } | 69 | } |
| 69 | } | 70 | } |
| 70 | 71 | ||
| 71 | - public void afterBeanDiscovery(@Observes AfterBeanDiscovery abd, BeanManager beanManager) throws Exception { | 72 | + public void afterBeanDiscovery(@Observes AfterBeanDiscovery event, BeanManager beanManager) throws Exception { |
| 72 | Class<Object> proxy; | 73 | Class<Object> proxy; |
| 73 | 74 | ||
| 74 | for (Class<Object> config : cache) { | 75 | for (Class<Object> config : cache) { |
| 75 | proxy = createProxy(config); | 76 | proxy = createProxy(config); |
| 76 | - abd.addBean(new ProxyBean(proxy, beanManager)); | 77 | + event.addBean(new ProxyBean(proxy, beanManager)); |
| 77 | } | 78 | } |
| 78 | } | 79 | } |
| 79 | 80 | ||
| 80 | @SuppressWarnings("unchecked") | 81 | @SuppressWarnings("unchecked") |
| 81 | - private Class<Object> createProxy(Class<?> type) throws Exception { | 82 | + private Class<Object> createProxy(Class<Object> type) throws Exception { |
| 82 | String superClassName = type.getCanonicalName(); | 83 | String superClassName = type.getCanonicalName(); |
| 83 | String chieldClassName = superClassName + "__DemoiselleProxy"; | 84 | String chieldClassName = superClassName + "__DemoiselleProxy"; |
| 85 | + | ||
| 84 | ClassPool pool = ClassPool.getDefault(); | 86 | ClassPool pool = ClassPool.getDefault(); |
| 87 | + CtClass ctChieldClass = pool.getOrNull(chieldClassName); | ||
| 85 | 88 | ||
| 86 | - CtClass ctChieldClass = pool.makeClass(chieldClassName); | ||
| 87 | - CtClass ctSuperClass = pool.get(superClassName); | ||
| 88 | - ctChieldClass.setSuperclass(ctSuperClass); | 89 | + if (ctChieldClass == null) { |
| 90 | + ClassLoader classLoader = ConfigurationLoader.getClassLoaderForClass(superClassName); | ||
| 91 | + pool.appendClassPath(new LoaderClassPath(classLoader)); | ||
| 92 | + CtClass ctSuperClass = pool.get(superClassName); | ||
| 89 | 93 | ||
| 90 | - StringBuffer buffer = new StringBuffer(); | ||
| 91 | - buffer.append("new "); | ||
| 92 | - buffer.append(ConfigurationLoader.class.getCanonicalName()); | ||
| 93 | - buffer.append("().load(this);"); | 94 | + ctChieldClass = pool.makeClass(chieldClassName, ctSuperClass); |
| 94 | 95 | ||
| 95 | - CtMethod ctChieldMethod; | ||
| 96 | - for (CtMethod ctSuperMethod : ctSuperClass.getDeclaredMethods()) { | ||
| 97 | - ctChieldMethod = CtNewMethod.delegator(ctSuperMethod, ctChieldClass); | ||
| 98 | - ctChieldMethod.insertBefore(buffer.toString()); | 96 | + StringBuffer buffer = new StringBuffer(); |
| 97 | + buffer.append("new "); | ||
| 98 | + buffer.append(ConfigurationLoader.class.getCanonicalName()); | ||
| 99 | + buffer.append("().load(this);"); | ||
| 99 | 100 | ||
| 100 | - ctChieldClass.addMethod(ctChieldMethod); | ||
| 101 | - } | 101 | + CtMethod ctChieldMethod; |
| 102 | + for (CtMethod ctSuperMethod : ctSuperClass.getDeclaredMethods()) { | ||
| 103 | + ctChieldMethod = CtNewMethod.delegator(ctSuperMethod, ctChieldClass); | ||
| 104 | + ctChieldMethod.insertBefore(buffer.toString()); | ||
| 102 | 105 | ||
| 103 | - // CtConstructor ctChieldDefaultConstructor = CtNewConstructor.defaultConstructor(ctChieldClass); | ||
| 104 | - // ctChieldClass.addConstructor(ctChieldDefaultConstructor); | ||
| 105 | - // | ||
| 106 | - // for (CtConstructor ctConstructor : ctChieldClass.getConstructors()) { | ||
| 107 | - // ctConstructor.insertBefore(buffer.toString()); | ||
| 108 | - // } | 106 | + ctChieldClass.addMethod(ctChieldMethod); |
| 107 | + } | ||
| 108 | + } | ||
| 109 | 109 | ||
| 110 | return ctChieldClass.toClass(); | 110 | return ctChieldClass.toClass(); |
| 111 | } | 111 | } |