--- /dev/null
+
+import org.aspectj.lang.annotation.Around;
+import org.aspectj.lang.annotation.Aspect;
+
+@Aspect
+public abstract class AbstractAspect {
+ @Around("execution(* ClassWithJoinPoint.getValue(..))")
+ public Object ClassWithJoinPoint_getValue() {
+ return getValueReplacement();
+ }
+
+ protected abstract Boolean getValueReplacement();
+}
\ No newline at end of file
--- /dev/null
+
+public class ClassWithJoinPoint {
+ public Boolean getValue() {
+ return Boolean.FALSE;
+ }
+
+ public static void main(String[] arguments) {
+/*
+ System.out.println("Testing aspect style (should print \"true\"):");
+ System.out.println(new aspect_style.ClassWithJoinPoint().getValue());
+
+ System.out.println();
+*/
+ System.out.println("Testing annotation style (should print \"true\"):");
+ System.out.println(new ClassWithJoinPoint().getValue());
+ }
+}
--- /dev/null
+
+import org.aspectj.lang.annotation.Aspect;
+
+@Aspect
+public class ConcreteAspect extends AbstractAspect {
+ @Override
+ protected Boolean getValueReplacement() {
+ return Boolean.TRUE;
+ }
+}
--- /dev/null
+package com.j4fe.aspects;
+
+import javax.persistence.EntityManager;
+import javax.persistence.PersistenceContext;
+import javax.persistence.Entity;
+import org.springframework.beans.factory.annotation.Configurable;
+import org.springframework.beans.factory.annotation.Autowired;
+
+public aspect SpringConfigurableMixin {
+
+ public static interface EntityManagerAware {
+ EntityManager getEntityManager();
+ }
+
+
+ // not working
+ // declare @type : (@Entity *) : @Configurable(autowire = Autowire.BY_TYPE, preConstruction = true);
+
+ // also not working
+ // declare @type : (@Entity *) : @Configurable
+
+ declare parents : (@Entity *) implements EntityManagerAware;
+
+ @PersistenceContext
+ transient private EntityManager EntityManagerAware.entityManager;
+
+ public EntityManager EntityManagerAware.getEntityManager() {
+ return entityManager;
+ }
+}
--- /dev/null
+import org.aspectj.lang.annotation.Aspect;
+import org.aspectj.lang.annotation.DeclareMixin;
+
+@Aspect
+public class PR298388 {
+
+ @DeclareMixin("Thing2")
+ public static <T> Thing<T> createThingImplementation() {
+ return new ThingImpl<T>();
+ }
+
+ public static void main(String[] args) {
+ Thing<String> ts = (Thing<String>) new Thing2<String>();
+ ts.wibble();
+ ts.wibble("abc");
+ String s = ts.wibbleBack("wobble");
+ System.out.println("done");
+ }
+
+}
+
+class Thing2<X> {
+}
+
+interface Thing<X> {
+ void wibble();
+ void wibble(X x);
+ X wibbleBack(X x);
+}
+
+class ThingImpl<X> implements Thing<X> {
+ ThingImpl() {
+ }
+
+ public void wibble() {
+ }
+
+ public void wibble(X x) {}
+
+ public X wibbleBack(X x) { return x;}
+
+}
public class Ajc169Tests extends org.aspectj.testing.XMLBasedAjcTestCase {
+ public void testPr298388() {
+ runTest("declare mixin and generics");
+ }
+
+ public void testPr292584() {
+ runTest("annotation around advice verifyerror");
+ }
+
// ---
public static Test suite() {
@Override
protected File getSpecFile() {
- return new File("../tests/src/org/aspectj/systemtest/ajc167/ajc167.xml");
+ return new File("../tests/src/org/aspectj/systemtest/ajc169/ajc169.xml");
}
}
\ No newline at end of file
<suite>
+ <ajc-test dir="bugs169/pr298388" title="declare mixin and generics">
+ <compile files="PR298388.java" options="-1.5"/>
+ <run class="PR298388">
+ <stdout>
+ <line text="done"/>
+ </stdout>
+ </run>
+ </ajc-test>
+
+ <ajc-test dir="bugs169/pr295491" title="model annotation npe">
+ <compile files="SpringConfigurableMixin.java" options="-1.5 -emacssym"/>
+ </ajc-test>
+
+ <ajc-test dir="bugs169/pr292584" title="annotation around advice verifyerror">
+ <compile files="AbstractAspect.java,ClassWithJoinPoint.java,ConcreteAspect.java" options="-1.5"/>
+ <run class="ClassWithJoinPoint">
+ <stdout>
+ <line text="Testing annotation style (should print "true"):"/>
+ <line text="true"/>
+ </stdout>
+ </run>
+ </ajc-test>
+
</suite>
\ No newline at end of file