/************************************************************************************** * 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; import junit.framework.TestCase; import org.codehaus.aspectwerkz.AspectContext; import org.codehaus.aspectwerkz.aspect.management.Aspects; import org.codehaus.aspectwerkz.aspect.management.NoAspectBoundException; import org.codehaus.aspectwerkz.annotation.Before; import org.codehaus.aspectwerkz.annotation.Aspect; import java.io.PrintStream; /** * @author <a href="mailto:alex AT gnilux DOT com">Alexandre Vasseur</a> */ public class QNameTest extends TestCase { static StringBuffer s_log = new StringBuffer(); static void log(String s) { s_log.append(s).append(" "); } void doStuff() { log("doStuff"); } void doGC1() { log("doGC1"); System.gc(); System.gc(); doGC2(); } void doGC2() { log("doGC2"); } void doPerJVM() { log("doPerJVM"); PrintStream fieldGet = System.out; } void doPerClass() { log("doPerClass"); PrintStream fieldGet = System.out; } void doPerInstance() { log("doPerInstance"); PrintStream fieldGet = System.out; } public void testQNames() { s_log = new StringBuffer(); doStuff(); // note: aspect instantiation happens first due to perJVM and JP clinit assertEquals("1 jdk5test/Aspect_1 2 jdk5test/Aspect_2 before-1 before-2 doStuff ", s_log.toString()); TestAspect a = (TestAspect)Aspects.aspectOf("jdk5test/Aspect_1"); assertEquals("1", a.p); TestAspect b = (TestAspect)Aspects.aspectOf("jdk5test/Aspect_2"); assertEquals("2", b.p); // in that case there is several aspects for Aspect.class // so fails try { TestAspect c = (TestAspect)Aspects.aspectOf(TestAspect.class); fail("should fail"); } catch (NoAspectBoundException t) { ; } } public void testPerX() { s_log = new StringBuffer(); doPerJVM(); assertEquals("doPerJVM before ", s_log.toString()); s_log = new StringBuffer(); doPerClass(); assertEquals("doPerClass before ", s_log.toString()); s_log = new StringBuffer(); doPerInstance(); assertEquals("doPerInstance before ", s_log.toString()); } public void testPerJVMAndGC() { s_log = new StringBuffer(); doGC1(); assertEquals("AspectGC before1 doGC1 before2 doGC2 ", s_log.toString()); } public static void main(String[] args) { junit.textui.TestRunner.run(suite()); } public static junit.framework.Test suite() { return new junit.framework.TestSuite(QNameTest.class); } public static class TestAspect { String p; public TestAspect(AspectContext ctx) { p = ctx.getParameter("p"); log(p); log(ctx.getAspectDefinition().getQualifiedName()); } @Before("execution(* test.QNameTest.doStuff())") public void before() { log("before-"+p); } } public static class AspectJVM { @Before("withincode(* test.QNameTest.doPerJVM()) && get(* java.lang.System.out)") public void before() { log("before"); } } @Aspect("perClass") public static class AspectClass { @Before("withincode(* test.QNameTest.doPerClass()) && get(* java.lang.System.out)") public void before() { log("before"); } } @Aspect("perInstance") public static class AspectInstance { @Before("withincode(* test.QNameTest.doPerInstance()) && get(* java.lang.System.out)") public void before() { log("before"); } } public static class AspectGC { public AspectGC() { log("AspectGC"); } @Before("execution(* test.QNameTest.doGC1())") public void before1() { log("before1"); } @Before("execution(* test.QNameTest.doGC2())") public void before2() { log("before2"); } } }