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 | 44 | import javassist.CtClass; |
| 45 | 45 | import javassist.CtMethod; |
| 46 | 46 | import javassist.CtNewMethod; |
| 47 | +import javassist.LoaderClassPath; | |
| 47 | 48 | |
| 48 | 49 | import javax.enterprise.event.Observes; |
| 49 | 50 | import javax.enterprise.inject.spi.AfterBeanDiscovery; |
| ... | ... | @@ -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 | 73 | Class<Object> proxy; |
| 73 | 74 | |
| 74 | 75 | for (Class<Object> config : cache) { |
| 75 | 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 | 81 | @SuppressWarnings("unchecked") |
| 81 | - private Class<Object> createProxy(Class<?> type) throws Exception { | |
| 82 | + private Class<Object> createProxy(Class<Object> type) throws Exception { | |
| 82 | 83 | String superClassName = type.getCanonicalName(); |
| 83 | 84 | String chieldClassName = superClassName + "__DemoiselleProxy"; |
| 85 | + | |
| 84 | 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 | 110 | return ctChieldClass.toClass(); |
| 111 | 111 | } | ... | ... |