[jboss-cvs] JBossAS SVN: r87799 - in projects/aop/trunk: aop/src/main/java/org/jboss/aop/classpool and 4 other directories.
jboss-cvs-commits at lists.jboss.org
jboss-cvs-commits at lists.jboss.org
Fri Apr 24 09:53:02 EDT 2009
Author: kabir.khan at jboss.com
Date: 2009-04-24 09:53:02 -0400 (Fri, 24 Apr 2009)
New Revision: 87799
Added:
projects/aop/trunk/asintegration-mc/src/test/java/org/jboss/test/aop/classpool/jbosscl/weaving/support/excluded/target/POJOForContainerProxy.java
Modified:
projects/aop/trunk/aop/src/main/java/org/jboss/aop/Advisor.java
projects/aop/trunk/aop/src/main/java/org/jboss/aop/AspectManager.java
projects/aop/trunk/aop/src/main/java/org/jboss/aop/ClassContainer.java
projects/aop/trunk/aop/src/main/java/org/jboss/aop/classpool/AOPClassPoolRepository.java
projects/aop/trunk/aop/src/main/java/org/jboss/aop/proxy/container/ClassProxyContainer.java
projects/aop/trunk/aop/src/main/java/org/jboss/aop/proxy/container/ContainerProxyFactory.java
projects/aop/trunk/aop/src/main/java/org/jboss/aop/proxy/container/ProxyAdvisorDomain.java
projects/aop/trunk/asintegration-mc/src/test/java/org/jboss/test/aop/classpool/jbosscl/weaving/support/excluded/target/FoundInvoker.java
projects/aop/trunk/asintegration-mc/src/test/java/org/jboss/test/aop/classpool/jbosscl/weaving/support/excluded/target/NotFoundInvoker.java
projects/aop/trunk/asintegration-mc/src/test/java/org/jboss/test/aop/classpool/jbosscl/weaving/test/WeavingTest.java
projects/aop/trunk/asintegration-mc/src/test/resources/org/jboss/test/aop/classpool/jbosscl/weaving/test/WeavingTestCase-aop.xml
Log:
[JBAOP-707] Test ContainerProxies and fix how the ProxyAdvisorDomains are cleaned up on undeploy of the classloader
Modified: projects/aop/trunk/aop/src/main/java/org/jboss/aop/Advisor.java
===================================================================
--- projects/aop/trunk/aop/src/main/java/org/jboss/aop/Advisor.java 2009-04-24 13:46:38 UTC (rev 87798)
+++ projects/aop/trunk/aop/src/main/java/org/jboss/aop/Advisor.java 2009-04-24 13:53:02 UTC (rev 87799)
@@ -220,7 +220,7 @@
*/
protected static Object NULL_ASPECT = new Object();
- private static final AOPLogger logger = AOPLogger.getLogger(Advisor.class);
+ protected final AOPLogger logger = AOPLogger.getLogger(this.getClass());
//When resolving annotations from the annotation repository we don't want to hit the annotation repository with the metadata from base-aspects.xml (@security, @transaction etc.)
//EJB 3 uses a custom metadata loader that tries to load up all these classes by name, and that will cause errors when loading up the annotations
Modified: projects/aop/trunk/aop/src/main/java/org/jboss/aop/AspectManager.java
===================================================================
--- projects/aop/trunk/aop/src/main/java/org/jboss/aop/AspectManager.java 2009-04-24 13:46:38 UTC (rev 87798)
+++ projects/aop/trunk/aop/src/main/java/org/jboss/aop/AspectManager.java 2009-04-24 13:53:02 UTC (rev 87799)
@@ -128,6 +128,10 @@
/** A queue for adding new subscribed subdomains to */
protected volatile WeakHashMap<Domain, Object> subscribedSubDomainsQueue = UnmodifiableEmptyCollections.EMPTY_WEAK_HASHMAP;
+
+ /** The proxy advisor domains in subscribedSubDomains(Queue) */
+ protected volatile WeakHashMap<ClassLoader, Set<Domain>> proxyAdvisorDomains = UnmodifiableEmptyCollections.EMPTY_WEAK_HASHMAP;
+
protected int subscribedDomainQueueRef;
protected volatile LinkedHashMap<String, InterfaceIntroduction> interfaceIntroductions = UnmodifiableEmptyCollections.EMPTY_LINKED_HASHMAP;
@@ -576,20 +580,41 @@
}
}
}
+ Domain subDomain = null;
synchronized (subDomainsPerClass)
{
WeakReference<Domain> subDomainRef = subDomainsPerClass.remove(clazz);
if (subDomainRef != null)
{
- Domain subDomain = subDomainRef.get();
+ subDomain = subDomainRef.get();
if (subDomain != null)
{
subDomain.cleanAdvisor(clazz);
- unsubscribeSubDomain(subDomain);
}
}
}
+
+ if (subDomain != null)
+ {
+ unsubscribeSubDomain(subDomain);
+ }
}
+
+ public void cleanProxyAdvisorDomains(ClassLoader loader)
+ {
+ Set<Domain> domains = null;
+ synchronized (proxyAdvisorDomains)
+ {
+ domains = proxyAdvisorDomains.remove(loader);
+ }
+ if (domains != null)
+ {
+ for (Domain domain : domains)
+ {
+ unsubscribeSubDomain(domain);
+ }
+ }
+ }
/**
* Returns the binding map.
@@ -2315,6 +2340,21 @@
return subscribedSubDomains;
}
+ public void subscribeProxyAdvisorDomain(ClassLoader loader, Domain domain)
+ {
+ initProxyAdvisorDomainsMap();
+ synchronized (proxyAdvisorDomains)
+ {
+ Set<Domain> domains = proxyAdvisorDomains.get(loader);
+ if (domains == null)
+ {
+ domains = new HashSet<Domain>();
+ proxyAdvisorDomains.put(loader, domains);
+ }
+ domains.add(domain);
+ }
+ }
+
private Advisor getAdvisorFromAdvisorsKeySetIterator(Iterator<Class<?>> it)
{
Class<?> clazz = it.next();
@@ -2473,6 +2513,20 @@
}
}
+ protected void initProxyAdvisorDomainsMap()
+ {
+ if (proxyAdvisorDomains == UnmodifiableEmptyCollections.EMPTY_WEAK_HASHMAP)
+ {
+ synchronized(lazyCollectionLock)
+ {
+ if (proxyAdvisorDomains == UnmodifiableEmptyCollections.EMPTY_WEAK_HASHMAP)
+ {
+ proxyAdvisorDomains = new WeakHashMap<ClassLoader, Set<Domain>>();
+ }
+ }
+ }
+ }
+
protected void initInterfaceIntroductionsMap()
{
if (interfaceIntroductions == UnmodifiableEmptyCollections.EMPTY_LINKED_HASHMAP)
Modified: projects/aop/trunk/aop/src/main/java/org/jboss/aop/ClassContainer.java
===================================================================
--- projects/aop/trunk/aop/src/main/java/org/jboss/aop/ClassContainer.java 2009-04-24 13:46:38 UTC (rev 87798)
+++ projects/aop/trunk/aop/src/main/java/org/jboss/aop/ClassContainer.java 2009-04-24 13:53:02 UTC (rev 87799)
@@ -42,7 +42,6 @@
import org.jboss.aop.util.ConstructorComparator;
import org.jboss.aop.util.FieldComparator;
import org.jboss.aop.util.MethodHashing;
-import org.jboss.aop.util.logging.AOPLogger;
/**
* Comment
@@ -52,7 +51,7 @@
*/
public class ClassContainer extends Advisor
{
- private static final AOPLogger logger = AOPLogger.getLogger(ClassContainer.class);
+ //private static final AOPLogger logger = AOPLogger.getLogger(ClassContainer.class);
private boolean chainOverridingForInheritedMethods;
Modified: projects/aop/trunk/aop/src/main/java/org/jboss/aop/classpool/AOPClassPoolRepository.java
===================================================================
--- projects/aop/trunk/aop/src/main/java/org/jboss/aop/classpool/AOPClassPoolRepository.java 2009-04-24 13:46:38 UTC (rev 87798)
+++ projects/aop/trunk/aop/src/main/java/org/jboss/aop/classpool/AOPClassPoolRepository.java 2009-04-24 13:53:02 UTC (rev 87799)
@@ -216,6 +216,8 @@
}
}
}
+
+ manager.cleanProxyAdvisorDomains(cl);
}
}
Modified: projects/aop/trunk/aop/src/main/java/org/jboss/aop/proxy/container/ClassProxyContainer.java
===================================================================
--- projects/aop/trunk/aop/src/main/java/org/jboss/aop/proxy/container/ClassProxyContainer.java 2009-04-24 13:46:38 UTC (rev 87798)
+++ projects/aop/trunk/aop/src/main/java/org/jboss/aop/proxy/container/ClassProxyContainer.java 2009-04-24 13:53:02 UTC (rev 87799)
@@ -21,19 +21,19 @@
*/
package org.jboss.aop.proxy.container;
+import java.lang.reflect.Constructor;
+import java.lang.reflect.Method;
import java.security.AccessController;
import java.security.PrivilegedAction;
import java.util.ArrayList;
import java.util.Arrays;
-import java.lang.reflect.Constructor;
-import java.lang.reflect.Method;
import javassist.runtime.Inner;
import org.jboss.aop.Advisor;
-import org.jboss.aop.ClassContainer;
import org.jboss.aop.AspectManager;
import org.jboss.aop.ClassAdvisor;
+import org.jboss.aop.ClassContainer;
import org.jboss.aop.MethodInfo;
import org.jboss.aop.advice.AspectDefinition;
import org.jboss.aop.introduction.InterfaceIntroduction;
@@ -161,7 +161,16 @@
}
for (int j = 0; intf != null && j < intf.length; ++j)
{
- Class<?> iface = cl.loadClass(intf[j]);
+ Class<?> iface = null;
+ try
+ {
+ iface = cl.loadClass(intf[j]);
+ }
+ catch(ClassNotFoundException e)
+ {
+ logger.warn("Could not load interface " + intf[j] + " for proxy " + clazz.getName() + " for class " + clazz.getSuperclass().getName() + " using loader " + getClassLoader() + " - not adding interface methods");
+ continue;
+ }
Method[] ifaceMethods = iface.getMethods();
for (int k = 0; k < ifaceMethods.length; k++)
{
Modified: projects/aop/trunk/aop/src/main/java/org/jboss/aop/proxy/container/ContainerProxyFactory.java
===================================================================
--- projects/aop/trunk/aop/src/main/java/org/jboss/aop/proxy/container/ContainerProxyFactory.java 2009-04-24 13:46:38 UTC (rev 87798)
+++ projects/aop/trunk/aop/src/main/java/org/jboss/aop/proxy/container/ContainerProxyFactory.java 2009-04-24 13:53:02 UTC (rev 87799)
@@ -62,6 +62,7 @@
import org.jboss.aop.introduction.InterfaceIntroduction;
import org.jboss.aop.proxy.ClassProxyFactory;
import org.jboss.aop.util.JavassistMethodHashing;
+import org.jboss.aop.util.logging.AOPLogger;
/**
@@ -70,6 +71,8 @@
*/
public class ContainerProxyFactory
{
+ final static AOPLogger logger = AOPLogger.getLogger(ContainerProxyFactory.class);
+
final static String DELEGATE = Delegate.class.getName();
final static String ASPECT_MANAGED = AspectManaged.class.getName();
@@ -1021,11 +1024,11 @@
*
* @param intro The InterfaceIntroduction
* @param intfs receives the interfaces from plain interface introductions
- * @param mixinInterfaces receives the interfaces from mixins
+ * @param mi xinInterfaces receives the interfaces from mixins
* @param mixes receives the actual InterfaceIntroduction.Mixin objects
* @@param the index interface introduction this data comes from
*/
- private void getIntroductionInterfaces(InterfaceIntroduction intro,
+ private boolean getIntroductionInterfaces(InterfaceIntroduction intro,
HashMap<String, Integer> intfs,
HashMap<String, Integer> mixinInterfaces,
ArrayList<MixinInfo> mixes,
@@ -1033,9 +1036,18 @@
{
for (InterfaceIntroduction.Mixin mixin : intro.getMixins())
{
- mixes.add(new MixinInfo(mixin));
+ if (canLoadCtClass(mixin.getClassName()) == false)
+ {
+ logger.warn("Could not load mixin class " + mixin.getClassName() + " for proxy " + clazz.getName() + " for class " + clazz.getSuperclass().getName() + " using classpool " + pool + " - not adding mixin");
+ continue;
+ }
for (int i = 0; i < mixin.getInterfaces().length; i++)
{
+ if (canLoadCtClass(mixin.getInterfaces()[i]) == false)
+ {
+ logger.warn("Could not load interface " + mixin.getInterfaces()[i] + " for mixin " + mixin.getClassName() + " for proxy " + clazz.getName() + " for class " + clazz.getSuperclass().getName() + " using classpool " + pool + " - not adding mixin");
+ break;
+ }
if (intfs.containsKey(mixin.getInterfaces()[i]))
{
intfs.remove(mixin.getInterfaces()[i]);
@@ -1047,11 +1059,17 @@
}
mixinInterfaces.put(mixin.getInterfaces()[i], new Integer(idx));
}
+ mixes.add(new MixinInfo(mixin));
}
if (intro.getInterfaces() != null)
{
for (int i = 0; i < intro.getInterfaces().length; i++)
{
+ if (canLoadCtClass(intro.getInterfaces()[i]) == false)
+ {
+ logger.warn("Could not load introduced interface " + intro.getInterfaces()[i] + " for proxy " + clazz.getName() + " for class " + clazz.getSuperclass().getName() + " using classpool " + pool + " - not adding mixin");
+ continue;
+ }
if (intfs.containsKey(intro.getInterfaces()[i]) || mixinInterfaces.containsKey(intro.getInterfaces()[i]))
{
//Do nothing
@@ -1062,9 +1080,23 @@
}
}
}
+ return true;
}
}
+ private boolean canLoadCtClass(String name)
+ {
+ try
+ {
+ pool.get(name);
+ return true;
+ }
+ catch(NotFoundException e)
+ {
+ return false;
+ }
+ }
+
private class UnmarshalledInRemoteJVMProxyStrategy implements ProxyStrategy
{
MarshalledContainerProxy outOfVmProxy;
Modified: projects/aop/trunk/aop/src/main/java/org/jboss/aop/proxy/container/ProxyAdvisorDomain.java
===================================================================
--- projects/aop/trunk/aop/src/main/java/org/jboss/aop/proxy/container/ProxyAdvisorDomain.java 2009-04-24 13:46:38 UTC (rev 87798)
+++ projects/aop/trunk/aop/src/main/java/org/jboss/aop/proxy/container/ProxyAdvisorDomain.java 2009-04-24 13:53:02 UTC (rev 87799)
@@ -47,7 +47,7 @@
super(manager, name, clazz, instanceDomain);
super.setInheritsBindings(true);
super.setInheritsDeclarations(true);
-
+ manager.subscribeProxyAdvisorDomain(SecurityActions.getClassLoader(clazz), this);
}
public Advisor getAdvisor()
@@ -70,5 +70,4 @@
{
advisors.remove(advisor.getClazz());
}
-
}
Modified: projects/aop/trunk/asintegration-mc/src/test/java/org/jboss/test/aop/classpool/jbosscl/weaving/support/excluded/target/FoundInvoker.java
===================================================================
--- projects/aop/trunk/asintegration-mc/src/test/java/org/jboss/test/aop/classpool/jbosscl/weaving/support/excluded/target/FoundInvoker.java 2009-04-24 13:46:38 UTC (rev 87798)
+++ projects/aop/trunk/asintegration-mc/src/test/java/org/jboss/test/aop/classpool/jbosscl/weaving/support/excluded/target/FoundInvoker.java 2009-04-24 13:53:02 UTC (rev 87799)
@@ -29,6 +29,9 @@
import org.jboss.aop.Advised;
import org.jboss.aop.Advisor;
import org.jboss.aop.annotation.AnnotationRepository;
+import org.jboss.aop.proxy.container.AOPProxyFactory;
+import org.jboss.aop.proxy.container.AOPProxyFactoryParameters;
+import org.jboss.aop.proxy.container.GeneratedAOPProxyFactory;
import org.jboss.test.aop.classpool.jbosscl.weaving.support.excluded.aspects.IntroducedAnnotation;
import org.jboss.test.aop.classpool.jbosscl.weaving.support.excluded.aspects.MarkerInterface;
import org.jboss.test.aop.classpool.jbosscl.weaving.support.excluded.aspects.MixinImpl;
@@ -192,4 +195,31 @@
"{ilbcj}{ilbc}{elav}{elaj}{elai}{elacj}{elac}{ilav}{ilaj}{ilai}" +
"{ilacj}{ilac}{elfv}{elfj}{elfi}{elfcj}{elfc}{ilfv}{ilfj}{ilfi}{ilfcj}{ilfc}");
}
+
+ public static void invokeContainerProxy()
+ {
+ POJOForContainerProxy pojo = new POJOForContainerProxy();
+ Assert.assertFalse(pojo instanceof Advised);
+
+ AOPProxyFactory factory = new GeneratedAOPProxyFactory();
+ AOPProxyFactoryParameters params = new AOPProxyFactoryParameters();
+ params.setTarget(pojo);
+ POJOForContainerProxy proxy = (POJOForContainerProxy)factory.createAdvisedProxy(params);
+
+ Assert.assertTrue(proxy instanceof MarkerInterface);
+ Assert.assertTrue(proxy instanceof MixinInterface);
+ Assert.assertFalse(MixinImpl.invoked);
+ ((MixinInterface)proxy).method();
+ Assert.assertTrue(MixinImpl.invoked);
+
+ Interceptions.clear();
+ proxy.method("XXX");
+
+ Interceptions.assertEquals("(eiv)(eij)(eii)(eicj)(eic)(iiv)(iij)(iii)(iicj)(iic)" +
+ "(eav)(eaj)(eai)(eacj)(eac)(iav)(iaj)(iai)(iacj)(iac)" +
+ "(efav)(efacj)(efai)(efaj)(efac)(ifav)(ifacj)(ifai)(ifaj)(ifac)" +
+ "XXX{ifac}{ifaj}{ifai}{ifacj}{ifav}{efac}{efaj}{efai}{efacj}{efav}" +
+ "{iac}{iacj}{iai}{iaj}{iav}{eac}{eacj}{eai}{eaj}{eav}" +
+ "{iic}{iicj}{iii}{iij}{iiv}{eic}{eicj}{eii}{eij}{eiv}");
+ }
}
Modified: projects/aop/trunk/asintegration-mc/src/test/java/org/jboss/test/aop/classpool/jbosscl/weaving/support/excluded/target/NotFoundInvoker.java
===================================================================
--- projects/aop/trunk/asintegration-mc/src/test/java/org/jboss/test/aop/classpool/jbosscl/weaving/support/excluded/target/NotFoundInvoker.java 2009-04-24 13:46:38 UTC (rev 87798)
+++ projects/aop/trunk/asintegration-mc/src/test/java/org/jboss/test/aop/classpool/jbosscl/weaving/support/excluded/target/NotFoundInvoker.java 2009-04-24 13:53:02 UTC (rev 87799)
@@ -29,6 +29,12 @@
import org.jboss.aop.Advised;
import org.jboss.aop.Advisor;
import org.jboss.aop.annotation.AnnotationRepository;
+import org.jboss.aop.proxy.container.AOPProxyFactory;
+import org.jboss.aop.proxy.container.AOPProxyFactoryParameters;
+import org.jboss.aop.proxy.container.GeneratedAOPProxyFactory;
+import org.jboss.test.aop.classpool.jbosscl.weaving.support.excluded.aspects.MarkerInterface;
+import org.jboss.test.aop.classpool.jbosscl.weaving.support.excluded.aspects.MixinImpl;
+import org.jboss.test.aop.classpool.jbosscl.weaving.support.excluded.aspects.MixinInterface;
import org.jboss.test.aop.classpool.jbosscl.weaving.support.excluded.interceptions.Interceptions;
@@ -215,4 +221,38 @@
"{ilbcj}{ilbc}{ilav}{ilaj}{ilai}" +
"{ilacj}{ilac}{ilfv}{ilfj}{ilfi}{ilfcj}{ilfc}");
}
+
+ public static void invokeContainerProxy()
+ {
+ POJOForContainerProxy pojo = new POJOForContainerProxy();
+ Assert.assertFalse(pojo instanceof Advised);
+
+ AOPProxyFactory factory = new GeneratedAOPProxyFactory();
+ AOPProxyFactoryParameters params = new AOPProxyFactoryParameters();
+ params.setTarget(pojo);
+ POJOForContainerProxy proxy = (POJOForContainerProxy)factory.createAdvisedProxy(params);
+
+ for (Class<?> iface : pojo.getClass().getInterfaces())
+ {
+ if (iface.getName().contains("MarkerInterface"))
+ {
+ Assert.fail("Should not have found MarkerInterface");
+ }
+ else if (iface.getName().contains("MixinInterface"))
+ {
+ Assert.fail("Should not have found MixinInterface");
+ }
+ }
+
+ Interceptions.clear();
+ proxy.method("XXX");
+
+ Interceptions.assertEquals("(iiv)(iij)(iii)(iicj)(iic)" +
+ "(iav)(iaj)(iai)(iacj)(iac)" +
+ "(ifav)(ifacj)(ifai)(ifaj)(ifac)" +
+ "XXX{ifac}{ifaj}{ifai}{ifacj}{ifav}" +
+ "{iac}{iacj}{iai}{iaj}{iav}" +
+ "{iic}{iicj}{iii}{iij}{iiv}");
+ }
+
}
Added: projects/aop/trunk/asintegration-mc/src/test/java/org/jboss/test/aop/classpool/jbosscl/weaving/support/excluded/target/POJOForContainerProxy.java
===================================================================
--- projects/aop/trunk/asintegration-mc/src/test/java/org/jboss/test/aop/classpool/jbosscl/weaving/support/excluded/target/POJOForContainerProxy.java (rev 0)
+++ projects/aop/trunk/asintegration-mc/src/test/java/org/jboss/test/aop/classpool/jbosscl/weaving/support/excluded/target/POJOForContainerProxy.java 2009-04-24 13:53:02 UTC (rev 87799)
@@ -0,0 +1,37 @@
+/*
+* JBoss, Home of Professional Open Source.
+* Copyright 2006, Red Hat Middleware LLC, and individual contributors
+* as indicated by the @author tags. See the copyright.txt file in the
+* distribution for a full listing of individual contributors.
+*
+* This is free software; you can redistribute it and/or modify it
+* under the terms of the GNU Lesser General Public License as
+* published by the Free Software Foundation; either version 2.1 of
+* the License, or (at your option) any later version.
+*
+* This software is distributed in the hope that it will be useful,
+* but WITHOUT ANY WARRANTY; without even the implied warranty of
+* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+* Lesser General Public License for more details.
+*
+* You should have received a copy of the GNU Lesser General Public
+* License along with this software; if not, write to the Free
+* Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+* 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+*/
+package org.jboss.test.aop.classpool.jbosscl.weaving.support.excluded.target;
+
+import org.jboss.test.aop.classpool.jbosscl.weaving.support.excluded.interceptions.Interceptions;
+
+/**
+ *
+ * @author <a href="kabir.khan at jboss.com">Kabir Khan</a>
+ * @version $Revision: 1.1 $
+ */
+public class POJOForContainerProxy
+{
+ public void method(String arg)
+ {
+ Interceptions.append(arg);
+ }
+}
Modified: projects/aop/trunk/asintegration-mc/src/test/java/org/jboss/test/aop/classpool/jbosscl/weaving/test/WeavingTest.java
===================================================================
--- projects/aop/trunk/asintegration-mc/src/test/java/org/jboss/test/aop/classpool/jbosscl/weaving/test/WeavingTest.java 2009-04-24 13:46:38 UTC (rev 87798)
+++ projects/aop/trunk/asintegration-mc/src/test/java/org/jboss/test/aop/classpool/jbosscl/weaving/test/WeavingTest.java 2009-04-24 13:53:02 UTC (rev 87799)
@@ -55,7 +55,6 @@
public final static String AOP_XML = "org/jboss/test/aop/classpool/jbosscl/weaving/test/WeavingTestCase-aop.xml";
-
public WeavingTest(String name)
{
super(name);
@@ -63,129 +62,46 @@
protected abstract boolean invokeLightWeightAspects();
- public void testImportAllAspects() throws Exception
+ public void testImportAllWovenAspects() throws Exception
{
- runTest(
- CLASS_FOUND_INVOKER,
- new ClassLoaderSetup()
- {
-
- public ClassPool setupTargetPool() throws Exception
- {
- return createChildDomainParentLastClassPool("TARGET", DOMAIN, true, JAR_TARGET);
- }
-
- public ClassPool setupAspectsPool() throws Exception
- {
- return createChildDomainParentLastClassPool("ASPECTS", DOMAIN, true, JAR_ASPECTS);
- }
-
- public ClassPool setupInterceptionsPool() throws Exception
- {
- return createChildDomainParentLastClassPool("INTERCEPTIONS", DOMAIN, true, JAR_INTERCEPTIONS);
- }
- });
+ runTest(CLASS_FOUND_INVOKER, new ImportAllSetup(), new WovenInvokerSetup());
}
public void testNotImportAllAspectsNotIncluded() throws Exception
{
- runTest(
- CLASS_NOT_FOUND_INVOKER,
- new ClassLoaderSetup()
- {
-
- public ClassPool setupTargetPool() throws Exception
- {
- BundleInfoBuilder builder = BundleInfoBuilder.getBuilder().createModule("Target").createRequireModule("INTERCEPTIONS");
- return createChildDomainParentLastClassPool("TARGET", DOMAIN, builder, JAR_TARGET);
- }
-
- public ClassPool setupAspectsPool() throws Exception
- {
- BundleInfoBuilder builder = BundleInfoBuilder.getBuilder().createModule("Aspects").createRequireModule("INTERCEPTIONS");
- return createChildDomainParentLastClassPool("ASPECTS", DOMAIN, builder, JAR_ASPECTS);
- }
-
- public ClassPool setupInterceptionsPool() throws Exception
- {
- BundleInfoBuilder builder = BundleInfoBuilder.getBuilder().
- createModule("INTERCEPTIONS").
- createPackage(PACKAGE_INTERCEPTIONS);
- return createChildDomainParentLastClassPool("INTERCEPTIONS", DOMAIN, builder, JAR_INTERCEPTIONS);
- }
- });
+ runTest(CLASS_NOT_FOUND_INVOKER, new NotImportAllSetup(), new WovenInvokerSetup());
}
public void testNotImportAllAspectsIncludedByPackage() throws Exception
{
- runTest(
- CLASS_FOUND_INVOKER,
- new ClassLoaderSetup()
- {
- public ClassPool setupTargetPool() throws Exception
- {
- BundleInfoBuilder builder = BundleInfoBuilder.getBuilder().
- createModule("TARGET").
- createRequirePackage(PACKAGE_ASPECTS).
- createRequirePackage(PACKAGE_INTERCEPTIONS);
- return createChildDomainParentLastClassPool("TARGET", DOMAIN, builder, JAR_TARGET);
- }
-
- public ClassPool setupAspectsPool() throws Exception
- {
- BundleInfoBuilder builder = BundleInfoBuilder.getBuilder().
- createModule("ASPECTS").
- createPackage(PACKAGE_ASPECTS).
- createRequirePackage(PACKAGE_INTERCEPTIONS);
- return createChildDomainParentLastClassPool("ASPECTS", DOMAIN, builder, JAR_ASPECTS);
- }
-
-
- public ClassPool setupInterceptionsPool() throws Exception
- {
- BundleInfoBuilder builder = BundleInfoBuilder.getBuilder().
- createModule("INTERCEPTIONS").
- createPackage(PACKAGE_INTERCEPTIONS);
- return createChildDomainParentLastClassPool("INTERCEPTIONS", DOMAIN, builder, JAR_INTERCEPTIONS);
- }
- });
+ runTest(CLASS_FOUND_INVOKER, new ImportPackageSetup(), new WovenInvokerSetup());
}
public void testNotImportAllAspectsIncludedByModule() throws Exception
{
- runTest(
- CLASS_FOUND_INVOKER,
- new ClassLoaderSetup()
- {
- public ClassPool setupTargetPool() throws Exception
- {
- BundleInfoBuilder builder = BundleInfoBuilder.getBuilder().
- createModule("TARGET").
- createRequireModule("ASPECTS").
- createRequireModule("INTERCEPTIONS");
- return createChildDomainParentLastClassPool("TARGET", DOMAIN, builder, JAR_TARGET);
- }
-
- public ClassPool setupAspectsPool() throws Exception
- {
- BundleInfoBuilder builder = BundleInfoBuilder.getBuilder().
- createModule("ASPECTS").
- createPackage(PACKAGE_ASPECTS).
- createRequireModule("INTERCEPTIONS");
- return createChildDomainParentLastClassPool("ASPECTS", DOMAIN, builder, JAR_ASPECTS);
- }
-
-
- public ClassPool setupInterceptionsPool() throws Exception
- {
- BundleInfoBuilder builder = BundleInfoBuilder.getBuilder().
- createModule("INTERCEPTIONS").
- createPackage(PACKAGE_INTERCEPTIONS);
- return createChildDomainParentLastClassPool("INTERCEPTIONS", DOMAIN, builder, JAR_INTERCEPTIONS);
- }
- });
+ runTest(CLASS_FOUND_INVOKER, new ImportModuleSetup(), new WovenInvokerSetup());
}
+ public void testImportAllContainerProxy() throws Exception
+ {
+ runTest(CLASS_FOUND_INVOKER, new ImportAllSetup(), new ContainerProxyInvokerSetup());
+ }
+
+ public void testNotImportAllContainerProxy() throws Exception
+ {
+ runTest(CLASS_NOT_FOUND_INVOKER, new NotImportAllSetup(), new ContainerProxyInvokerSetup());
+ }
+
+ public void testNotImportAllContainerProxyIncludedByPackage() throws Exception
+ {
+ runTest(CLASS_FOUND_INVOKER, new ImportPackageSetup(), new ContainerProxyInvokerSetup());
+ }
+
+ public void testNotImportAllContainerProxyIncludedByModule() throws Exception
+ {
+ runTest(CLASS_FOUND_INVOKER, new ImportModuleSetup(), new ContainerProxyInvokerSetup());
+ }
+
private void deployAopXml(ClassLoader cl) throws Exception
{
URL aopUrl = this.getClass().getClassLoader().getResource(AOP_XML);
@@ -198,17 +114,20 @@
AspectXmlLoader.undeployXML(aopUrl, AspectManager.instance());
}
- public void runTest(String invokerName, ClassLoaderSetup setup) throws Exception
+ public void runTest(String invokerName, ClassLoaderSetup classLoaderSetup, InvokerSetup invokerSetup) throws Exception
{
- getSystem().setTranslator(new TestTranslator());
+ if (invokerSetup.useWeaving())
+ {
+ getSystem().setTranslator(new TestTranslator());
+ }
ClassPool interceptionsPool = null;
ClassPool targetPool = null;
ClassPool aspectsPool = null;
try
{
- interceptionsPool = setup.setupInterceptionsPool();
- aspectsPool = setup.setupAspectsPool();
- targetPool = setup.setupTargetPool();
+ interceptionsPool = classLoaderSetup.setupInterceptionsPool();
+ aspectsPool = classLoaderSetup.setupAspectsPool();
+ targetPool = classLoaderSetup.setupTargetPool();
System.out.println("Target loader: " + targetPool.getClassLoader() + "; Aspect loader: " + aspectsPool.getClassLoader());
@@ -217,9 +136,7 @@
try
{
Thread.currentThread().setContextClassLoader(targetPool.getClassLoader());
- Class<?> invoker = targetPool.getClassLoader().loadClass(invokerName);
- Method m = invoker.getMethod("invoke", Boolean.TYPE);
- m.invoke(null, invokeLightWeightAspects());
+ invokerSetup.invoke(targetPool, invokerName);
}
finally
{
@@ -229,7 +146,10 @@
}
finally
{
- getSystem().setTranslator(null);
+ if (invokerSetup.useWeaving())
+ {
+ getSystem().setTranslator(null);
+ }
unregisterClassPool(targetPool);
unregisterClassPool(aspectsPool);
unregisterClassPool(interceptionsPool);
@@ -237,10 +157,149 @@
}
}
- private interface ClassLoaderSetup
+ interface ClassLoaderSetup
{
ClassPool setupInterceptionsPool() throws Exception;
ClassPool setupTargetPool() throws Exception;
ClassPool setupAspectsPool() throws Exception;
}
+
+ class ImportAllSetup implements ClassLoaderSetup
+ {
+
+ public ClassPool setupTargetPool() throws Exception
+ {
+ return createChildDomainParentLastClassPool("TARGET", DOMAIN, true, JAR_TARGET);
+ }
+
+ public ClassPool setupAspectsPool() throws Exception
+ {
+ return createChildDomainParentLastClassPool("ASPECTS", DOMAIN, true, JAR_ASPECTS);
+ }
+
+ public ClassPool setupInterceptionsPool() throws Exception
+ {
+ return createChildDomainParentLastClassPool("INTERCEPTIONS", DOMAIN, true, JAR_INTERCEPTIONS);
+ }
+ }
+
+ class NotImportAllSetup implements ClassLoaderSetup
+ {
+
+ public ClassPool setupTargetPool() throws Exception
+ {
+ BundleInfoBuilder builder = BundleInfoBuilder.getBuilder().createModule("Target").createRequireModule("INTERCEPTIONS");
+ return createChildDomainParentLastClassPool("TARGET", DOMAIN, builder, JAR_TARGET);
+ }
+
+ public ClassPool setupAspectsPool() throws Exception
+ {
+ BundleInfoBuilder builder = BundleInfoBuilder.getBuilder().createModule("Aspects").createRequireModule("INTERCEPTIONS");
+ return createChildDomainParentLastClassPool("ASPECTS", DOMAIN, builder, JAR_ASPECTS);
+ }
+
+ public ClassPool setupInterceptionsPool() throws Exception
+ {
+ BundleInfoBuilder builder = BundleInfoBuilder.getBuilder().
+ createModule("INTERCEPTIONS").
+ createPackage(PACKAGE_INTERCEPTIONS);
+ return createChildDomainParentLastClassPool("INTERCEPTIONS", DOMAIN, builder, JAR_INTERCEPTIONS);
+ }
+ }
+
+ class ImportPackageSetup implements ClassLoaderSetup
+ {
+ public ClassPool setupTargetPool() throws Exception
+ {
+ BundleInfoBuilder builder = BundleInfoBuilder.getBuilder().
+ createModule("TARGET").
+ createRequirePackage(PACKAGE_ASPECTS).
+ createRequirePackage(PACKAGE_INTERCEPTIONS);
+ return createChildDomainParentLastClassPool("TARGET", DOMAIN, builder, JAR_TARGET);
+ }
+
+ public ClassPool setupAspectsPool() throws Exception
+ {
+ BundleInfoBuilder builder = BundleInfoBuilder.getBuilder().
+ createModule("ASPECTS").
+ createPackage(PACKAGE_ASPECTS).
+ createRequirePackage(PACKAGE_INTERCEPTIONS);
+ return createChildDomainParentLastClassPool("ASPECTS", DOMAIN, builder, JAR_ASPECTS);
+ }
+
+
+ public ClassPool setupInterceptionsPool() throws Exception
+ {
+ BundleInfoBuilder builder = BundleInfoBuilder.getBuilder().
+ createModule("INTERCEPTIONS").
+ createPackage(PACKAGE_INTERCEPTIONS);
+ return createChildDomainParentLastClassPool("INTERCEPTIONS", DOMAIN, builder, JAR_INTERCEPTIONS);
+ }
+ }
+
+ class ImportModuleSetup implements ClassLoaderSetup
+ {
+ public ClassPool setupTargetPool() throws Exception
+ {
+ BundleInfoBuilder builder = BundleInfoBuilder.getBuilder().
+ createModule("TARGET").
+ createRequireModule("ASPECTS").
+ createRequireModule("INTERCEPTIONS");
+ return createChildDomainParentLastClassPool("TARGET", DOMAIN, builder, JAR_TARGET);
+ }
+
+ public ClassPool setupAspectsPool() throws Exception
+ {
+ BundleInfoBuilder builder = BundleInfoBuilder.getBuilder().
+ createModule("ASPECTS").
+ createPackage(PACKAGE_ASPECTS).
+ createRequireModule("INTERCEPTIONS");
+ return createChildDomainParentLastClassPool("ASPECTS", DOMAIN, builder, JAR_ASPECTS);
+ }
+
+
+ public ClassPool setupInterceptionsPool() throws Exception
+ {
+ BundleInfoBuilder builder = BundleInfoBuilder.getBuilder().
+ createModule("INTERCEPTIONS").
+ createPackage(PACKAGE_INTERCEPTIONS);
+ return createChildDomainParentLastClassPool("INTERCEPTIONS", DOMAIN, builder, JAR_INTERCEPTIONS);
+ }
+ }
+
+ interface InvokerSetup
+ {
+ boolean useWeaving();
+ void invoke(ClassPool targetPool, String invokerName) throws Exception;
+ }
+
+ class WovenInvokerSetup implements InvokerSetup
+ {
+ public boolean useWeaving()
+ {
+ return true;
+ }
+
+ public void invoke(ClassPool targetPool, String invokerName) throws Exception
+ {
+ Class<?> invoker = targetPool.getClassLoader().loadClass(invokerName);
+ Method m = invoker.getMethod("invoke", Boolean.TYPE);
+ m.invoke(null, invokeLightWeightAspects());
+ }
+ }
+
+ class ContainerProxyInvokerSetup implements InvokerSetup
+ {
+ public boolean useWeaving()
+ {
+ return false;
+ }
+
+ public void invoke(ClassPool targetPool, String invokerName) throws Exception
+ {
+ Class<?> invoker = targetPool.getClassLoader().loadClass(invokerName);
+ Method m = invoker.getMethod("invokeContainerProxy");
+ m.invoke(null);
+ }
+ }
}
Modified: projects/aop/trunk/asintegration-mc/src/test/resources/org/jboss/test/aop/classpool/jbosscl/weaving/test/WeavingTestCase-aop.xml
===================================================================
--- projects/aop/trunk/asintegration-mc/src/test/resources/org/jboss/test/aop/classpool/jbosscl/weaving/test/WeavingTestCase-aop.xml 2009-04-24 13:46:38 UTC (rev 87798)
+++ projects/aop/trunk/asintegration-mc/src/test/resources/org/jboss/test/aop/classpool/jbosscl/weaving/test/WeavingTestCase-aop.xml 2009-04-24 13:53:02 UTC (rev 87799)
@@ -114,7 +114,6 @@
<advice name="advice" aspect="internalFactoryPerClass"/>
</bind>
-
<bind pointcut="execution(* org.jboss.test.aop.classpool.jbosscl.weaving.support.excluded.target.POJOWithLightweightAspect->method(java.lang.String)) OR execution(org.jboss.test.aop.classpool.jbosscl.weaving.support.excluded.target.POJOWithLightweightAspect->new()) OR field(* org.jboss.test.aop.classpool.jbosscl.weaving.support.excluded.target.POJOWithLightweightAspect->field)">
<before name="before" aspect="org.jboss.test.aop.classpool.jbosscl.weaving.support.excluded.aspects.ExternalLightweightAspectPerVm"/>
<after name="after" aspect="org.jboss.test.aop.classpool.jbosscl.weaving.support.excluded.aspects.ExternalLightweightAspectPerVm"/>
@@ -158,4 +157,52 @@
</bind>
+ <bind pointcut="execution(* $instanceof{org.jboss.test.aop.classpool.jbosscl.weaving.support.excluded.target.POJOForContainerProxy}->method(java.lang.String))">
+ <interceptor-ref name="org.jboss.test.aop.classpool.jbosscl.weaving.support.excluded.aspects.ExternalInterceptorPerVm"/>
+ <interceptor-ref name="org.jboss.test.aop.classpool.jbosscl.weaving.support.excluded.aspects.ExternalInterceptorPerJoinpoint"/>
+ <interceptor-ref name="org.jboss.test.aop.classpool.jbosscl.weaving.support.excluded.aspects.ExternalInterceptorPerInstance"/>
+ <interceptor-ref name="org.jboss.test.aop.classpool.jbosscl.weaving.support.excluded.aspects.ExternalInterceptorPerClassJoinpoint"/>
+ <interceptor-ref name="org.jboss.test.aop.classpool.jbosscl.weaving.support.excluded.aspects.ExternalInterceptorPerClass"/>
+ <interceptor-ref name="org.jboss.test.aop.classpool.jbosscl.weaving.support.excluded.target.InternalInterceptorPerVm"/>
+ <interceptor-ref name="org.jboss.test.aop.classpool.jbosscl.weaving.support.excluded.target.InternalInterceptorPerJoinpoint"/>
+ <interceptor-ref name="org.jboss.test.aop.classpool.jbosscl.weaving.support.excluded.target.InternalInterceptorPerInstance"/>
+ <interceptor-ref name="org.jboss.test.aop.classpool.jbosscl.weaving.support.excluded.target.InternalInterceptorPerClassJoinpoint"/>
+ <interceptor-ref name="org.jboss.test.aop.classpool.jbosscl.weaving.support.excluded.target.InternalInterceptorPerClass"/>
+ <advice name="invoke" aspect="org.jboss.test.aop.classpool.jbosscl.weaving.support.excluded.aspects.ExternalAspectPerVm"/>
+ <advice name="invoke" aspect="org.jboss.test.aop.classpool.jbosscl.weaving.support.excluded.aspects.ExternalAspectPerJoinpoint"/>
+ <advice name="invoke" aspect="org.jboss.test.aop.classpool.jbosscl.weaving.support.excluded.aspects.ExternalAspectPerInstance"/>
+ <advice name="invoke" aspect="org.jboss.test.aop.classpool.jbosscl.weaving.support.excluded.aspects.ExternalAspectPerClassJoinpoint"/>
+ <advice name="invoke" aspect="org.jboss.test.aop.classpool.jbosscl.weaving.support.excluded.aspects.ExternalAspectPerClass"/>
+ <advice name="invoke" aspect="org.jboss.test.aop.classpool.jbosscl.weaving.support.excluded.target.InternalAspectPerVm"/>
+ <advice name="invoke" aspect="org.jboss.test.aop.classpool.jbosscl.weaving.support.excluded.target.InternalAspectPerJoinpoint"/>
+ <advice name="invoke" aspect="org.jboss.test.aop.classpool.jbosscl.weaving.support.excluded.target.InternalAspectPerInstance"/>
+ <advice name="invoke" aspect="org.jboss.test.aop.classpool.jbosscl.weaving.support.excluded.target.InternalAspectPerClassJoinpoint"/>
+ <advice name="invoke" aspect="org.jboss.test.aop.classpool.jbosscl.weaving.support.excluded.target.InternalAspectPerClass"/>
+ <advice name="advice" aspect="externalFactoryPerVm"/>
+ <advice name="advice" aspect="externalFactoryPerJoinpoint"/>
+ <advice name="advice" aspect="externalFactoryPerInstance"/>
+ <advice name="advice" aspect="externalFactoryPerClassJoinpoint"/>
+ <advice name="advice" aspect="externalFactoryPerClass"/>
+ <advice name="advice" aspect="internalFactoryPerVm"/>
+ <advice name="advice" aspect="internalFactoryPerJoinpoint"/>
+ <advice name="advice" aspect="internalFactoryPerInstance"/>
+ <advice name="advice" aspect="internalFactoryPerClassJoinpoint"/>
+ <advice name="advice" aspect="internalFactoryPerClass"/>
+ </bind>
+
+ <introduction class="org.jboss.test.aop.classpool.jbosscl.weaving.support.excluded.target.POJOForContainerProxy">
+ <interfaces>
+ org.jboss.test.aop.classpool.jbosscl.weaving.support.excluded.aspects.MarkerInterface
+ </interfaces>
+ </introduction>
+
+ <introduction class="org.jboss.test.aop.classpool.jbosscl.weaving.support.excluded.target.POJOForContainerProxy">
+ <mixin>
+ <interfaces>
+ org.jboss.test.aop.classpool.jbosscl.weaving.support.excluded.aspects.MixinInterface
+ </interfaces>
+ <class>org.jboss.test.aop.classpool.jbosscl.weaving.support.excluded.aspects.MixinImpl</class>
+ </mixin>
+ </introduction>
+
</aop>
\ No newline at end of file
More information about the jboss-cvs-commits
mailing list