An if() pointcut inside a perthis() clause causes an ABORT - null pointer exception in ajc
<message kind="error" line="25" file="DisjunctVarBinding_2.java" text="Ambiguous binding of type A"/>
</compile>
</ajc-test>
+
+ <ajc-test dir="bugs/IfPerThis"
+ pr="62458" title="An if() pointcut inside a perthis() clauses an ABORT - null pointer exception in ajc">
+ <compile files="Testcase1.java">
+ <message kind="error" line="15" text="if() pointcut designator cannot be used directly in a per clause"/>
+ <message kind="error" line="23" text="if() pointcut designator cannot be used directly in a per clause"/>
+ <message kind="error" line="25" text="if() pointcut designator cannot be used directly in a per clause"/>
+ <message kind="error" line="27" text="if() pointcut designator cannot be used directly in a per clause"/>
+ </compile>
+ </ajc-test>
+
+ <ajc-test dir="bugs/IfPerThis"
+ pr="62458" title="An if() pointcut inside a perthis() clauses an ABORT - null pointer exception in ajc">
+ <compile files="Testcase2.java"/>
+ <run class="Testcase2"/>
+ </ajc-test>
+
+ <ajc-test dir="bugs/IfPerThis"
+ pr="62458" title="An if() pointcut inside a perthis() clauses an ABORT - null pointer exception in ajc">
+ <compile files="Testcase3.java">
+ <message kind="error" line="2" text="if() pointcut designator cannot be used directly in a per clause"/>
+ </compile>
+ </ajc-test>
</suite>
--- /dev/null
+public class Testcase1 {
+
+ public static void main(String [] args) {
+ new Testcase1().sayhi();
+ }
+
+ public void sayhi() {
+ System.out.println("Hello World");
+ }
+
+}
+
+// Note the use of an if inside a perthis, causes the ajc compiler to
+// throw an exception
+aspect Aspect perthis(if(4==3)) {
+
+ before () : call(* println(..)) && !within(Aspect*) {
+ System.out.println("Advice 1");
+ }
+
+}
+
+aspect Aspect2 pertarget(if(3==4)) {}
+
+aspect Aspect3 percflow(if(3==4)) {}
+
+aspect Aspect4 percflowbelow(if(3==4)) {}
\ No newline at end of file
--- /dev/null
+ aspect Testcase2 perthis(pc1()) {
+
+ pointcut pc1(): execution(* doCommand(..)) && if(commandInterceptionEnabled);
+ private static boolean commandInterceptionEnabled = true;
+
+ public Testcase2() {
+ System.out.println("Created a PerThis aspect : " + this.toString());
+ }
+
+ before(ICommand command) : execution(* doCommand(..)) && this(command) {
+ System.out.println("Invoking command bean: "+ command);
+ }
+
+ before(): if(4==3) {
+
+ }
+
+ public static void main(String[] args) {
+ ICommand c1 = new Command("hello");
+ ICommand c2 = new Command("hello again");
+ c1.doCommand();
+ c2.doCommand();
+ }
+
+}
+
+interface ICommand {
+ void doCommand();
+}
+
+class Command implements ICommand {
+
+ private String output = "";
+
+ public Command(String s) { this.output = s; }
+
+ public void doCommand() {
+ System.out.println(output + "(" + this + ")");
+ }
+
+}
\ No newline at end of file
--- /dev/null
+// Compiler limitation, can't put if() directly in per clause
+aspect Testcase3 perthis(execution(* doCommand(..)) && if(commandInterceptionEnabled)) {
+
+ private static boolean commandInterceptionEnabled = true;
+
+ public Testcase3() {
+ System.out.println("Created a PerThis aspect : " + this.toString());
+ }
+
+ before(ICommand command) : execution(* doCommand(..)) && this(command) {
+ System.out.println("Invoking command bean: "+ command);
+ }
+
+ public static void main(String[] args) {
+ ICommand c1 = new Command("hello");
+ ICommand c2 = new Command("hello again");
+ c1.doCommand();
+ c2.doCommand();
+ }
+
+}
+
+interface ICommand {
+ void doCommand();
+}
+
+class Command implements ICommand {
+
+ private String output = "";
+
+ public Command(String s) { this.output = s; }
+
+ public void doCommand() {
+ System.out.println(output + "(" + this + ")");
+ }
+
+}
\ No newline at end of file