Relates to #128. Signed-off-by: Alexander Kriegisch <Alexander@Kriegisch.name>tags/V1_9_9
@@ -0,0 +1,14 @@ | |||
public class Application { | |||
@MarkerA | |||
@MarkerB | |||
public void doSomething() { | |||
System.out.println(" Doing something"); | |||
} | |||
public static void main(String[] args) throws InterruptedException { | |||
MarkerAAspect.proceedTimes = Integer.parseInt(args[0]); | |||
MarkerBAspect.proceedTimes = Integer.parseInt(args[1]); | |||
new Application().doSomething(); | |||
Thread.sleep(500); | |||
} | |||
} |
@@ -0,0 +1,9 @@ | |||
import static java.lang.annotation.ElementType.METHOD; | |||
import static java.lang.annotation.RetentionPolicy.RUNTIME; | |||
import java.lang.annotation.Retention; | |||
import java.lang.annotation.Target; | |||
@Retention(RUNTIME) | |||
@Target(METHOD) | |||
public @interface MarkerA {} |
@@ -0,0 +1,23 @@ | |||
import org.aspectj.lang.ProceedingJoinPoint; | |||
import org.aspectj.lang.annotation.Around; | |||
import org.aspectj.lang.annotation.Aspect; | |||
import org.aspectj.lang.annotation.DeclarePrecedence; | |||
@Aspect | |||
@DeclarePrecedence("MarkerAAspect, MarkerBAspect") | |||
public class MarkerAAspect { | |||
public static int proceedTimes = 1; | |||
@Around("@annotation(MarkerA) && execution(* *(..))") | |||
public Object intercept(ProceedingJoinPoint thisJoinPoint) throws Throwable { | |||
System.out.println(">> Outer intercept"); | |||
Object result = null; | |||
for (int i = 0; i < proceedTimes; i++) { | |||
System.out.println(" >> Outer proceed"); | |||
result = thisJoinPoint.proceed(); | |||
System.out.println(" << Outer proceed"); | |||
} | |||
System.out.println("<< Outer intercept"); | |||
return result; | |||
} | |||
} |
@@ -0,0 +1,9 @@ | |||
import static java.lang.annotation.ElementType.METHOD; | |||
import static java.lang.annotation.RetentionPolicy.RUNTIME; | |||
import java.lang.annotation.Retention; | |||
import java.lang.annotation.Target; | |||
@Retention(RUNTIME) | |||
@Target(METHOD) | |||
public @interface MarkerB {} |
@@ -0,0 +1,30 @@ | |||
import org.aspectj.lang.ProceedingJoinPoint; | |||
import org.aspectj.lang.annotation.Around; | |||
import org.aspectj.lang.annotation.Aspect; | |||
@Aspect | |||
public class MarkerBAspect { | |||
public static int proceedTimes = 1; | |||
@Around("@annotation(MarkerB) && execution(* *(..))") | |||
public Object intercept(ProceedingJoinPoint thisJoinPoint) throws Throwable { | |||
System.out.println(" >> Inner intercept"); | |||
new Thread(new Runnable() { | |||
@Override | |||
public void run() { | |||
try { | |||
for (int i = 0; i < proceedTimes; i++) { | |||
System.out.println(" >> Inner proceed"); | |||
thisJoinPoint.proceed(); | |||
System.out.println(" << Inner proceed"); | |||
} | |||
} | |||
catch (Throwable throwable) { | |||
throwable.printStackTrace(System.out); | |||
} | |||
} | |||
}).start(); | |||
System.out.println(" << Inner intercept"); | |||
return null; | |||
} | |||
} |
@@ -48,6 +48,10 @@ public class Bugs198Tests extends XMLBasedAjcTestCase { | |||
} | |||
} | |||
public void testAsyncProceedNestedAroundAdvice_gh128() { | |||
runTest("asynchronous proceed for nested around-advice chain"); | |||
} | |||
public static Test suite() { | |||
return XMLBasedAjcTestCase.loadSuite(Bugs198Tests.class); | |||
} |
@@ -167,4 +167,83 @@ | |||
</run> | |||
</ajc-test> | |||
<ajc-test dir="bugs198/github_128" title="asynchronous proceed for nested around-advice chain"> | |||
<compile files="Application.java MarkerA.java MarkerAAspect.aj MarkerB.java MarkerBAspect.aj" options="-1.8" /> | |||
<run class="Application" options="1,1"> | |||
<stdout ordered="no"> | |||
<line text=">> Outer intercept"/> | |||
<line text=" >> Outer proceed"/> | |||
<line text=" >> Inner intercept"/> | |||
<line text=" << Inner intercept"/> | |||
<line text=" << Outer proceed"/> | |||
<line text="<< Outer intercept"/> | |||
<line text=" >> Inner proceed"/> | |||
<line text=" Doing something"/> | |||
<line text=" << Inner proceed"/> | |||
</stdout> | |||
</run> | |||
<run class="Application" options="2,1"> | |||
<stdout ordered="no"> | |||
<line text=">> Outer intercept"/> | |||
<line text=" >> Outer proceed"/> | |||
<line text=" >> Inner intercept"/> | |||
<line text=" << Inner intercept"/> | |||
<line text=" << Outer proceed"/> | |||
<line text=" >> Outer proceed"/> | |||
<line text=" >> Inner intercept"/> | |||
<line text=" >> Inner proceed"/> | |||
<line text=" Doing something"/> | |||
<line text=" << Inner proceed"/> | |||
<line text=" << Inner intercept"/> | |||
<line text=" << Outer proceed"/> | |||
<line text=" >> Inner proceed"/> | |||
<line text=" Doing something"/> | |||
<line text=" << Inner proceed"/> | |||
<line text="<< Outer intercept"/> | |||
</stdout> | |||
</run> | |||
<run class="Application" options="1,2"> | |||
<stdout ordered="no"> | |||
<line text=">> Outer intercept"/> | |||
<line text=" >> Outer proceed"/> | |||
<line text=" >> Inner intercept"/> | |||
<line text=" << Inner intercept"/> | |||
<line text=" << Outer proceed"/> | |||
<line text="<< Outer intercept"/> | |||
<line text=" >> Inner proceed"/> | |||
<line text=" Doing something"/> | |||
<line text=" << Inner proceed"/> | |||
<line text=" >> Inner proceed"/> | |||
<line text=" Doing something"/> | |||
<line text=" << Inner proceed"/> | |||
</stdout> | |||
</run> | |||
<run class="Application" options="2,2"> | |||
<stdout ordered="no"> | |||
<line text=">> Outer intercept"/> | |||
<line text=" >> Outer proceed"/> | |||
<line text=" >> Inner intercept"/> | |||
<line text=" << Inner intercept"/> | |||
<line text=" << Outer proceed"/> | |||
<line text=" >> Outer proceed"/> | |||
<line text=" >> Inner intercept"/> | |||
<line text=" >> Inner proceed"/> | |||
<line text=" << Inner intercept"/> | |||
<line text=" Doing something"/> | |||
<line text=" << Inner proceed"/> | |||
<line text=" << Outer proceed"/> | |||
<line text=" >> Inner proceed"/> | |||
<line text=" >> Inner proceed"/> | |||
<line text=" Doing something"/> | |||
<line text=" << Inner proceed"/> | |||
<line text=" >> Inner proceed"/> | |||
<line text=" Doing something"/> | |||
<line text=" << Inner proceed"/> | |||
<line text=" Doing something"/> | |||
<line text=" << Inner proceed"/> | |||
<line text="<< Outer intercept"/> | |||
</stdout> | |||
</run> | |||
</ajc-test> | |||
</suite> |