diff options
16 files changed, 465 insertions, 0 deletions
diff --git a/tests/java5/annotations/ajdkExamples/DeclareAnnotation.aj b/tests/java5/annotations/ajdkExamples/DeclareAnnotation.aj new file mode 100644 index 000000000..9ad605226 --- /dev/null +++ b/tests/java5/annotations/ajdkExamples/DeclareAnnotation.aj @@ -0,0 +1,62 @@ +import java.lang.annotation.*; + +public aspect DeclareAnnotation { + + declare @type : org.xyz.model..* : @BusinessDomain; + + declare @method : public * BankAccount+.*(..) : @Secured(role="supervisor"); + + declare @field : * DAO+.* : @Persisted; + + declare warning : staticinitialization(@BusinessDomain *) + : "@BusinessDomain"; + + declare warning : execution(@Secured * *(..)) : "@Secured"; + + declare warning : set(@Persisted * *) : "@Persisted"; + + public static void main(String[] args) throws Exception { + Class bAcc = BankAccount.class; + java.lang.reflect.Method credit = bAcc.getDeclaredMethod("credit"); + Secured secured = credit.getAnnotation(Secured.class); + if (!secured.role().equals("supervisor")) { + throw new RuntimeException("BankAccount.credit should have @Secured(role=supervisor) annotation"); + } + } +} + +@interface BusinessDomain {} + +@Retention(RetentionPolicy.RUNTIME) +@interface Secured { + String role() default ""; +} + +@interface Persisted {} + +class BankAccount { + + public void credit() {} + public void debit() {} + protected void transfer() {} + +} + +class ExecutiveBankAccount extends BankAccount { + + public void interest() {} + protected void commission() {} + +} + +class DAO { + + int x = 5; + +} + +class SubDAO extends DAO { + + int y = 6; + +}
\ No newline at end of file diff --git a/tests/java5/annotations/ajdkExamples/DeclaresWithAnnotations.aj b/tests/java5/annotations/ajdkExamples/DeclaresWithAnnotations.aj new file mode 100644 index 000000000..029ebafa1 --- /dev/null +++ b/tests/java5/annotations/ajdkExamples/DeclaresWithAnnotations.aj @@ -0,0 +1,48 @@ +import org.xyz.model.Model; + +public aspect DeclaresWithAnnotations { + + declare warning : withincode(@PerformanceCritical * *(..)) && + call(@ExpensiveOperation * *(..)) + : "Expensive operation called from within performance critical section"; + + declare error : call(* org.xyz.model.*.*(..)) && + !@within(Trusted) + : "Untrusted code should not call the model classes directly"; + +} + +@interface PerformanceCritical {} + +@interface ExpensiveOperation {} + +@interface Trusted {} + + +class Foo { + + @PerformanceCritical Foo getFoo() { + Model m = new Model(); + m.foo(); // DE + Foo foo = makeFoo(); // DW + return foo; + } + + Foo getFoo2() { + Foo foo = makeFoo(); + return foo; + } + + @ExpensiveOperation Foo makeFoo() { + return new Foo(); + } +} + +@Trusted class Goo { + + public void goo() { + Model m = new Model(); + m.foo(); + } + +}
\ No newline at end of file diff --git a/tests/java5/annotations/ajdkExamples/DecpAnnotations.aj b/tests/java5/annotations/ajdkExamples/DecpAnnotations.aj new file mode 100644 index 000000000..d3cd3fd42 --- /dev/null +++ b/tests/java5/annotations/ajdkExamples/DecpAnnotations.aj @@ -0,0 +1,48 @@ +public aspect DecpAnnotations { + + public String SecuredObject.getSecurityCredentials() { + return "none"; + } + + declare parents : (@Secured *) implements SecuredObject; + + declare parents : (@Secured BankAccount+) implements SecuredObject; + + public static void main(String[] args) { + Foo foo = new Foo(); + Goo goo = new Goo(); + BankAccount acc = new BankAccount(); + PrivateBankAccount pacc = new PrivateBankAccount(); + BusinessBankAccount bacc = new BusinessBankAccount(); + + System.out.println("Test Foo is not secured: " + + ((foo instanceof SecuredObject) ? "FAIL" : "PASS") + ); + System.out.println("Test Goo is secured: " + + ((goo instanceof SecuredObject) ? "PASS" : "FAIL") + ); + System.out.println("goo credentials: " + goo.getSecurityCredentials()); + System.out.println("Test BankAccount is not secured: " + + ((acc instanceof SecuredObject) ? "FAIL" : "PASS") + ); + System.out.println("Test PrivateBankAccount is not secured: " + + ((pacc instanceof SecuredObject) ? "FAIL" : "PASS") + ); + System.out.println("Test BusinessBankAccount is secured: " + + ((bacc instanceof SecuredObject) ? "PASS" : "FAIL") + ); + } +} + + +interface SecuredObject {} +@interface Secured {} + +class Foo {} +@Secured class Goo{} + +class BankAccount {} + +class PrivateBankAccount extends BankAccount {} + +@Secured class BusinessBankAccount extends BankAccount {}
\ No newline at end of file diff --git a/tests/java5/annotations/ajdkExamples/PrecedenceAnnotations.aj b/tests/java5/annotations/ajdkExamples/PrecedenceAnnotations.aj new file mode 100644 index 000000000..63218f7df --- /dev/null +++ b/tests/java5/annotations/ajdkExamples/PrecedenceAnnotations.aj @@ -0,0 +1,45 @@ +public aspect PrecedenceAnnotations { + + declare precedence : (@Security *), *; + + declare precedence : *, (@Performance *); + + public static void main(String[] args) { + A a = new A(); + a.foo(); + } +} + +@interface Security {} +@interface Performance{} + +class A { + pointcut foo() : execution(* foo()); + void foo() {} +} + +aspect S1 { + before() : A.foo() { + System.out.println("S1"); + } +} + +@Security aspect S2 { + + before() : A.foo() { + System.out.println("@Security S2"); + } + +} + +aspect P1 { + after() returning : A.foo() { + System.out.println("P1"); + } +} + +@Performance aspect P2 { + after() returning : A.foo() { + System.out.println("@Performance P2"); + } +}
\ No newline at end of file diff --git a/tests/java5/annotations/ajdkExamples/org/xyz/model/Model.java b/tests/java5/annotations/ajdkExamples/org/xyz/model/Model.java new file mode 100644 index 000000000..2829ccd61 --- /dev/null +++ b/tests/java5/annotations/ajdkExamples/org/xyz/model/Model.java @@ -0,0 +1,7 @@ +package org.xyz.model; + +public class Model { + + public void foo() {} + +}
\ No newline at end of file diff --git a/tests/java5/covariance/ajdk/AJDKExamples.aj b/tests/java5/covariance/ajdk/AJDKExamples.aj new file mode 100644 index 000000000..e7cb02383 --- /dev/null +++ b/tests/java5/covariance/ajdk/AJDKExamples.aj @@ -0,0 +1,47 @@ +public aspect AJDKExamples { + + declare warning : call(* whoAreYou()) + : "call(* whoAreYou())"; + + declare warning : call(* A.whoAreYou()) + : "call(* A.whoAreYou())"; + + declare warning : call(A whoAreYou()) + : "call(A whoAreYou())"; + + declare warning : call(A B.whoAreYou()) + : "call(A B.whoAreYou())"; + + declare warning : call(A+ B.whoAreYou()) + : "call(A+ B.whoAreYou())"; + + declare warning : call(B A.whoAreYou()) + : "call(B A.whoAreYou())"; + + declare warning : call(B whoAreYou()) + : "call(B whoAreYou())"; + + declare warning : call(B B.whoAreYou()) + : "call(B B.whoAreYou())"; + +} + +class A { + public A whoAreYou() { return this; } +} + +class B extends A { + // override A.whoAreYou *and* narrow the return type. + public B whoAreYou() { return this; } +} + +class C { + + public C() { + A a = new A(); + B b = new B(); + a.whoAreYou(); + b.whoAreYou(); + } + +}
\ No newline at end of file diff --git a/tests/java5/pertypewithin/ajdk/AJDKExamples.aj b/tests/java5/pertypewithin/ajdk/AJDKExamples.aj new file mode 100644 index 000000000..433270cf4 --- /dev/null +++ b/tests/java5/pertypewithin/ajdk/AJDKExamples.aj @@ -0,0 +1,34 @@ +import java.util.*; +public aspect AJDKExamples pertypewithin(org.xyz..*) { + + // use WeakHashMap for auto-garbage collection of keys + private Map<Object,Boolean> instances = new WeakHashMap<Object,Boolean>(); + + after(Object o) returning() : execution(new(..)) && this(o) { + instances.put(o,true); + } + + public Set<?> getInstances() { + return instances.keySet(); + } + + + public static void main(String[] args) { + A a = new A(); + A a2 = new A(); + B b = new B(); + B b2 = new B(); + B b3 = new B(); + + System.out.println(AJDKExamples.hasAspect(A.class)); + System.out.println(AJDKExamples.hasAspect(B.class)); + Set<?> as = AJDKExamples.aspectOf(A.class).getInstances(); + Set<?> bs = AJDKExamples.aspectOf(B.class).getInstances(); + System.out.println("There are " + as.size() + " As"); + System.out.println("There are " + bs.size() + " Bs"); + } +} + +class A {} + +class B {}
\ No newline at end of file diff --git a/tests/java5/varargs/ajdk/AJDKExamples.aj b/tests/java5/varargs/ajdk/AJDKExamples.aj new file mode 100644 index 000000000..422b10ede --- /dev/null +++ b/tests/java5/varargs/ajdk/AJDKExamples.aj @@ -0,0 +1,31 @@ +public aspect AJDKExamples { + + declare warning : call(* org.xyz.*.*(int, String...)) : "call vararg match"; + + declare warning : execution(* org.xyz.*.*(Integer...)) : "execution vararg match"; + + declare warning : initialization(org.xyz.*.new((Foo || Goo)...)) : "init vararg match"; + + declare warning : execution(* *.*(String...)) : "single vararg"; + + declare warning : execution(* *.*(String[])) : "single String[]"; + + before(int i, String[] ss) : call(* foo(int,String...)) && args(i,ss) { + System.out.println("Matched at " + thisJoinPoint); + } + + public static void main(String[] args) { + X foo = new X(); + foo.foo(5,"hello"); + foo.bar(5,new String[]{"hello"}); + } + +} + +class X { + public void foo(String... ss) {} + public void bar(String[] ss) {} + public void foo(int i,String... ss) {} + public void bar(int i,String[] ss) {} +} + diff --git a/tests/java5/varargs/ajdk/org/xyz/Foo.java b/tests/java5/varargs/ajdk/org/xyz/Foo.java new file mode 100644 index 000000000..4b10d0af8 --- /dev/null +++ b/tests/java5/varargs/ajdk/org/xyz/Foo.java @@ -0,0 +1,5 @@ +package org.xyz; + +public class Foo { + +} diff --git a/tests/java5/varargs/ajdk/org/xyz/Goo.java b/tests/java5/varargs/ajdk/org/xyz/Goo.java new file mode 100644 index 000000000..0c615ebf8 --- /dev/null +++ b/tests/java5/varargs/ajdk/org/xyz/Goo.java @@ -0,0 +1,5 @@ +package org.xyz; + +public class Goo { + +} diff --git a/tests/java5/varargs/ajdk/org/xyz/Hoo.java b/tests/java5/varargs/ajdk/org/xyz/Hoo.java new file mode 100644 index 000000000..7ce1c1d73 --- /dev/null +++ b/tests/java5/varargs/ajdk/org/xyz/Hoo.java @@ -0,0 +1,16 @@ +package org.xyz; + +public class Hoo { + + public Hoo(Foo... foos) {} + public Hoo(Goo... goos) {} + public Hoo(String... ss) { + intStringVar(5,ss); + intString(5,ss[0]); + } + + void intStringVar(int i, String... ss) {} + void intString(int i, String s) {} + void integerVar(Integer... is) {} + +}
\ No newline at end of file diff --git a/tests/src/org/aspectj/systemtest/ajc150/Annotations.java b/tests/src/org/aspectj/systemtest/ajc150/Annotations.java index 5480d50a6..4e0a16d45 100644 --- a/tests/src/org/aspectj/systemtest/ajc150/Annotations.java +++ b/tests/src/org/aspectj/systemtest/ajc150/Annotations.java @@ -153,6 +153,22 @@ public class Annotations extends XMLBasedAjcTestCase { runTest("ajdk: @inherited"); } + public void testAnnotationDEOW() { + runTest("ajdk: deow-ann"); + } + + public void testAnnotationDecp() { + runTest("ajdk: decp-ann"); + } + + public void testAnnotationDecPrecedence() { + runTest("ajdk: dec precedence"); + } + + public void testAnnotationDecAnnotation() { + runTest("ajdk: dec annotation"); + } + // helper methods..... public SyntheticRepository createRepos(File cpentry) { diff --git a/tests/src/org/aspectj/systemtest/ajc150/CovarianceTests.java b/tests/src/org/aspectj/systemtest/ajc150/CovarianceTests.java index 07050501e..b1d0e853f 100644 --- a/tests/src/org/aspectj/systemtest/ajc150/CovarianceTests.java +++ b/tests/src/org/aspectj/systemtest/ajc150/CovarianceTests.java @@ -160,4 +160,7 @@ public class CovarianceTests extends XMLBasedAjcTestCase { runTest("covariance 10"); } + public void testAJDKExamples() { + runTest("ajdk: covariance"); + } } diff --git a/tests/src/org/aspectj/systemtest/ajc150/PerTypeWithinTests.java b/tests/src/org/aspectj/systemtest/ajc150/PerTypeWithinTests.java index c8e81c317..9abfebe14 100644 --- a/tests/src/org/aspectj/systemtest/ajc150/PerTypeWithinTests.java +++ b/tests/src/org/aspectj/systemtest/ajc150/PerTypeWithinTests.java @@ -85,6 +85,10 @@ public class PerTypeWithinTests extends XMLBasedAjcTestCase { public void testBinaryWeaving_AspectsAreBinary() { runTest("ptw binary aspect"); } + + public void testAJDKExamples() { + runTest("ajdk: ptw"); + } // // Compile the aspect H.java into classes3 // CompilationResult cR = ajc(new File("../tests/java5/pertypewithin"),new String[]{"H.java","-outjar","aspects.jar"}); // setShouldEmptySandbox(false); diff --git a/tests/src/org/aspectj/systemtest/ajc150/VarargsTests.java b/tests/src/org/aspectj/systemtest/ajc150/VarargsTests.java index e4175fee7..a5eadb3af 100644 --- a/tests/src/org/aspectj/systemtest/ajc150/VarargsTests.java +++ b/tests/src/org/aspectj/systemtest/ajc150/VarargsTests.java @@ -64,5 +64,9 @@ public class VarargsTests extends XMLBasedAjcTestCase { public void test_usingVarargsInPointcuts2() { runTest("call with varargs multi-signature"); } + + public void testAJDKExamples() { + runTest("ajdk: varargs"); + } }
\ No newline at end of file diff --git a/tests/src/org/aspectj/systemtest/ajc150/ajc150.xml b/tests/src/org/aspectj/systemtest/ajc150/ajc150.xml index 6b7fad53e..258145e5c 100644 --- a/tests/src/org/aspectj/systemtest/ajc150/ajc150.xml +++ b/tests/src/org/aspectj/systemtest/ajc150/ajc150.xml @@ -1151,5 +1151,95 @@ <message kind="warning" line="17" text="c1MethodCall()"/> </compile> </ajc-test> + + <ajc-test dir="java5/annotations/ajdkExamples" title="ajdk: deow-ann"> + <compile files="DeclaresWithAnnotations.aj,org/xyz/model/Model.java" options="-1.5"> + <message kind="warning" line="27" text="Expensive operation called from within performance critical section"/> + <message kind="error" line="26" text="Untrusted code should not call the model classes directly"/> + </compile> + </ajc-test> + + <ajc-test dir="java5/annotations/ajdkExamples" title="ajdk: decp-ann"> + <compile files="DecpAnnotations.aj" options="-1.5"> + </compile> + <run class="DecpAnnotations"> + <stdout> + <line text="Test Foo is not secured: PASS"/> + <line text="Test Goo is secured: PASS"/> + <line text="goo credentials: none"/> + <line text="Test BankAccount is not secured: PASS"/> + <line text="Test PrivateBankAccount is not secured: PASS"/> + <line text="Test BusinessBankAccount is secured: PASS"/> + </stdout> + </run> + </ajc-test> + + <ajc-test dir="java5/annotations/ajdkExamples" title="ajdk: dec precedence"> + <compile files="PrecedenceAnnotations.aj" options="-1.5"> + </compile> + <run class="PrecedenceAnnotations"> + <stdout> + <line text="@Security S2"/> + <line text="S1"/> + <line text="@Performance P2"/> + <line text="P1"/> + </stdout> + </run> + </ajc-test> + + <ajc-test dir="java5/annotations/ajdkExamples" title="ajdk: dec annotation"> + <compile files="DeclareAnnotation.aj,org/xyz/model/Model.java" options="-1.5"> + <message kind="warning" line="3" text="@BusinessDomain"/> + <message kind="warning" line="39" text="@Secured"/> + <message kind="warning" line="40" text="@Secured"/> + <message kind="warning" line="47" text="@Secured"/> + <message kind="warning" line="54" text="@Persisted"/> + <message kind="warning" line="60" text="@Persisted"/> + </compile> + <run class="PrecedenceAnnotations"/> + </ajc-test> + + <ajc-test dir="java5/covariance/ajdk" title="ajdk: covariance"> + <compile files="AJDKExamples.aj" options="-1.5"> + <message kind="warning" line="43" text="call(* whoAreYou())"/> + <message kind="warning" line="44" text="call(* whoAreYou())"/> + <message kind="warning" line="43" text="call(* A.whoAreYou())"/> + <message kind="warning" line="44" text="call(* A.whoAreYou())"/> + <message kind="warning" line="43" text="call(A whoAreYou())"/> + <message kind="warning" line="44" text="call(A whoAreYou())"/> + <message kind="warning" line="44" text="call(A+ B.whoAreYou())"/> + <message kind="warning" line="44" text="call(B whoAreYou())"/> + <message kind="warning" line="44" text="call(B B.whoAreYou())"/> + </compile> + </ajc-test> + + <ajc-test dir="java5/varargs/ajdk" title="ajdk: varargs"> + <compile files="AJDKExamples.aj,org/xyz/Foo.java,org/xyz/Goo.java,org/xyz/Hoo.java" options="-1.5"> + <message kind="warning" line="8" text="call vararg match"/> + <message kind="warning" line="14" text="execution vararg match"/> + <message kind="warning" line="5" text="init vararg match"/> + <message kind="warning" line="6" text="init vararg match"/> + <message kind="warning" line="26" text="single vararg"/> + <message kind="warning" line="27" text="single String[]"/> + <message kind="warning" line="17" text="single String[]"/> + </compile> + <run class="AJDKExamples"> + <stdout> + <line text="Matched at xxx"/> + </stdout> + </run> + </ajc-test> + + <ajc-test dir="java5/pertypewithin/ajdk" title="ajdk: ptw"> + <compile files="AJDKExamples.aj" options="-1.5"/> + <run class="AJDKExamples"> + <stdout> + <line text="true"/> + <line text="true"/> + <line text="There are 3 As"/> + <line text="There are 2 Bs"/> + </stdout> + </run> + </ajc-test> </suite> |