/************************************************************************************** * 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.thistarget; import junit.framework.TestCase; import org.codehaus.aspectwerkz.definition.Pointcut; /** * @author <a href="mailto:alex@gnilux.com">Alexandre Vasseur</a> */ public class TargetReferencedAndRuntimeCheckTest extends TestCase { private static String s_log = ""; //--- Target implements 2 interface and a complex rutime check will thus be done public static interface I0Target { public void call(); } public static interface I1Target { } public static interface I2Target { } public static class ImplementsTwoTarget implements I0Target, I1Target, I2Target { public void call() { log("ImplementsTwoTarget"); } } public static class ImplementsOneTarget implements I0Target, I1Target { public void call() { log("ImplementsOneTarget"); } } public static class ImplementsZeroTarget implements I0Target { public void call() { log("ImplementsZeroTarget"); } } //--- Aspect public static class Aspect { /** * @Expression target(myTarget) && call(* test.thistarget.*.call()) && within(test.thistarget.TargetReferencedAndRuntimeCheckTest) */ Pointcut referenceI1Target(I1Target myTarget) { return null; } /** * @Expression target(myTarget) && call(* test.thistarget.*.call()) && within(test.thistarget.TargetReferencedAndRuntimeCheckTest) */ Pointcut referenceI2Target(I2Target myTarget) { return null; } /** * @Before referenceI1Target(t) && referenceI2Target(t) */ void before(Object t) {// if we don't use Object here but f.e. I1Target, the validation visitor will complain log("before_I1TargetAndI2Target"); ThisTargetAspect.validate(t, I1Target.class); ThisTargetAspect.validate(t, I2Target.class); } /** * @Before referenceI1Target(t) */ void before2(I1Target t) { log("before_I1Target"); ThisTargetAspect.validate(t, I1Target.class); } } public void testRuntimeChecks() { I0Target i1 = new ImplementsTwoTarget(); s_log = ""; i1.call(); assertEquals("before_I1TargetAndI2Target before_I1Target ImplementsTwoTarget ", s_log); I0Target i2 = new ImplementsOneTarget(); s_log = ""; i2.call(); assertEquals("before_I1Target ImplementsOneTarget ", s_log); I0Target i3 = new ImplementsZeroTarget(); s_log = ""; i3.call(); assertEquals("ImplementsZeroTarget ", s_log); } //--- JUnit public static void main(String[] args) { junit.textui.TestRunner.run(suite()); } public static junit.framework.Test suite() { return new junit.framework.TestSuite(TargetReferencedAndRuntimeCheckTest.class); } static void log(String s) { s_log += s + " "; } }