/************************************************************************************** * Copyright (c) Jonas Bon?r, Alexandre Vasseur. All rights reserved. * * http://aspectwerkz.codehaus.org * * ---------------------------------------------------------------------------------- * * The software in this package is published under the terms of the LGPL license * * a copy of which has been included with this distribution in the license.txt file. * **************************************************************************************/ package test.aopc; import junit.framework.TestCase; import java.net.URL; import java.net.URLClassLoader; /** * * TODO rewrite test.aopc.* with ASM or using an already builded jar with the small appp deployed * several time in difft CL to test system defs and namespaces. * * Note: does not work behing WeavingCL. Use a real online mode <p/> * java -Xrunaspectwerkz -Xdebug -Xbootclasspath/a:lib\aspectwerkz-core-1.0.jar ... * <p/> * The CallablePrototype class is renamed and defined as a deployed application class in a child classloader * with its own META-INF/aop.xml file. * * @author <a href="mailto:alex@gnilux.com">Alexandre Vasseur </a> */ public class AspectSystemTest extends TestCase { public void testDoubleHierarchyMethodExecution() { // VM system classpath level classes Callable cvm = new CallablePrototype(); cvm.methodAround(); cvm.debug(); assertEquals("methodAround ", cvm.getLogString()); // appserver like classloader, with its own aop.xml file // the aop.xml file contains one aspect in the VM system classpath ClassLoader myCL = new URLClassLoader( new URL[]{ClassCreator.getPathFor(Callable.class.getResource("META-INF/aop.xml"))}, ClassLoader.getSystemClassLoader() ); Callable cas = (Callable) ClassCreator.createInstance( "test.aopc.CallableAppServer", CallablePrototype.class, myCL ); cas.methodAround(); cas.debug(); assertEquals( "system/asCL/test.aopc.BaseAspect.beforeAround " + "methodAround " + "system/asCL/test.aopc.BaseAspect.afterAround ", cas.getLogString() ); // deployed app A // the aop.xml file is REusing VM system classpath aspect and is defining one of its own as well, with 2 systems // we are defining the aspect on the fly in an intermediate CL without aop.xml ClassLoader mySubCLAAspect = new URLClassLoader(new URL[]{}, myCL); ClassCreator.createClass("test.aopc.a.Aspect", BaseAspect.class, mySubCLAAspect); ClassLoader mySubCLA = new URLClassLoader( new URL[]{ClassCreator.getPathFor(Callable.class.getResource("a/META-INF/aop.xml"))}, mySubCLAAspect ); //ClassCreator.createClass("test.aopc.a.Aspect", BaseAspect.class, mySubCLA); Callable ca = (Callable) ClassCreator.createInstance("test.aopc.a.Callee", CallablePrototype.class, mySubCLA); ca.methodAround(); ca.debug(); assertEquals( "system/asCL/test.aopc.BaseAspect.beforeAround " + "system/subCL/a1/subCLAspect.beforeAround " + "system/subCL/a2/subCLAspect.beforeAround " + "methodAround " + "system/subCL/a2/subCLAspect.afterAround " + "system/subCL/a1/subCLAspect.afterAround " + "system/asCL/test.aopc.BaseAspect.afterAround ", ca.getLogString() ); // deployed app B // no aop.xml ClassLoader mySubCLB = new URLClassLoader(new URL[]{}, myCL); Callable cb = (Callable) ClassCreator.createInstance("test.aopc.b.Callee", CallablePrototype.class, mySubCLB); cb.methodAround(); cb.debug(); assertEquals( "system/asCL/test.aopc.BaseAspect.beforeAround " + "methodAround " + "system/asCL/test.aopc.BaseAspect.afterAround ", cb.getLogString() ); } // ------------------------------------------------ public static void main(String[] args) { junit.textui.TestRunner.run(suite()); } public static junit.framework.Test suite() { return new junit.framework.TestSuite(AspectSystemTest.class); } }