From: aclement Date: Sat, 28 Mar 2009 16:36:44 +0000 (+0000) Subject: advice handle counters X-Git-Tag: V1_6_4~5 X-Git-Url: https://source.dussan.org/?a=commitdiff_plain;h=0693366e874cc40f78a0057f5d7a13e88c49e318;p=aspectj.git advice handle counters --- diff --git a/tests/multiIncremental/prx/EnforceProcess/.classpath b/tests/multiIncremental/prx/EnforceProcess/.classpath new file mode 100644 index 000000000..bd8e80729 --- /dev/null +++ b/tests/multiIncremental/prx/EnforceProcess/.classpath @@ -0,0 +1,7 @@ + + + + + + + diff --git a/tests/multiIncremental/prx/EnforceProcess/.project b/tests/multiIncremental/prx/EnforceProcess/.project new file mode 100644 index 000000000..c2d47685a --- /dev/null +++ b/tests/multiIncremental/prx/EnforceProcess/.project @@ -0,0 +1,18 @@ + + + EnforceProcess + + + + + + org.eclipse.ajdt.core.ajbuilder + + + + + + org.eclipse.ajdt.ui.ajnature + org.eclipse.jdt.core.javanature + + diff --git a/tests/multiIncremental/prx/EnforceProcess/bin/com/kronos/aspects/ProcessAspect$ajcMightHaveAspect.class b/tests/multiIncremental/prx/EnforceProcess/bin/com/kronos/aspects/ProcessAspect$ajcMightHaveAspect.class new file mode 100644 index 000000000..4d88b5443 Binary files /dev/null and b/tests/multiIncremental/prx/EnforceProcess/bin/com/kronos/aspects/ProcessAspect$ajcMightHaveAspect.class differ diff --git a/tests/multiIncremental/prx/EnforceProcess/bin/com/kronos/aspects/ProcessAspect.class b/tests/multiIncremental/prx/EnforceProcess/bin/com/kronos/aspects/ProcessAspect.class new file mode 100644 index 000000000..1c11f16cd Binary files /dev/null and b/tests/multiIncremental/prx/EnforceProcess/bin/com/kronos/aspects/ProcessAspect.class differ diff --git a/tests/multiIncremental/prx/EnforceProcess/bin/com/kronos/code/Main.class b/tests/multiIncremental/prx/EnforceProcess/bin/com/kronos/code/Main.class new file mode 100644 index 000000000..0333b7d04 Binary files /dev/null and b/tests/multiIncremental/prx/EnforceProcess/bin/com/kronos/code/Main.class differ diff --git a/tests/multiIncremental/prx/EnforceProcess/bin/com/kronos/code/MyProcessor.class b/tests/multiIncremental/prx/EnforceProcess/bin/com/kronos/code/MyProcessor.class new file mode 100644 index 000000000..6d8e06739 Binary files /dev/null and b/tests/multiIncremental/prx/EnforceProcess/bin/com/kronos/code/MyProcessor.class differ diff --git a/tests/multiIncremental/prx/EnforceProcess/bin/com/kronos/code/OkToIgnore.class b/tests/multiIncremental/prx/EnforceProcess/bin/com/kronos/code/OkToIgnore.class new file mode 100644 index 000000000..a9f7c0904 Binary files /dev/null and b/tests/multiIncremental/prx/EnforceProcess/bin/com/kronos/code/OkToIgnore.class differ diff --git a/tests/multiIncremental/prx/EnforceProcess/bin/com/kronos/code/Processor1.class b/tests/multiIncremental/prx/EnforceProcess/bin/com/kronos/code/Processor1.class new file mode 100644 index 000000000..5f7a3b93e Binary files /dev/null and b/tests/multiIncremental/prx/EnforceProcess/bin/com/kronos/code/Processor1.class differ diff --git a/tests/multiIncremental/prx/EnforceProcess/bin/com/kronos/code/Processor2.class b/tests/multiIncremental/prx/EnforceProcess/bin/com/kronos/code/Processor2.class new file mode 100644 index 000000000..f0c2fe830 Binary files /dev/null and b/tests/multiIncremental/prx/EnforceProcess/bin/com/kronos/code/Processor2.class differ diff --git a/tests/multiIncremental/prx/EnforceProcess/bin/com/kronos/code/Processor3.class b/tests/multiIncremental/prx/EnforceProcess/bin/com/kronos/code/Processor3.class new file mode 100644 index 000000000..2a2e12778 Binary files /dev/null and b/tests/multiIncremental/prx/EnforceProcess/bin/com/kronos/code/Processor3.class differ diff --git a/tests/multiIncremental/prx/base/src/com/kronos/aspects/APA.java b/tests/multiIncremental/prx/base/src/com/kronos/aspects/APA.java new file mode 100644 index 000000000..cacc25d3c --- /dev/null +++ b/tests/multiIncremental/prx/base/src/com/kronos/aspects/APA.java @@ -0,0 +1,83 @@ +package com.kronos.aspects; + +import com.kronos.code.MyProcessor; +import java.lang.reflect.Field; +import java.lang.reflect.Method; +import java.util.HashMap; +import com.kronos.code.OkToIgnore; +import java.lang.reflect.Modifier; + +import org.aspectj.lang.JoinPoint; +import org.aspectj.lang.annotation.*; + +@Aspect("perthis(initMyProcessor(com.kronos.code.MyProcessor))") +class AnnotatedProcessAspect { + + HashMap fieldList = new HashMap(); + + @Pointcut("initialization(com.kronos.code.MyProcessor+.new(..)) && this(myProcessor)") + public void initMyProcessor(MyProcessor myProcessor){} + + + + @Pointcut("execution(* com.kronos.code.MyProcessor+.process()) && this(myProcessor)") + public void executesProcess(MyProcessor myProcessor){} + + @Pointcut("get(* com.kronos.code.MyProcessor+.*) && cflow(executesProcess(myProcessor))") + public void fieldAccessor(MyProcessor myProcessor){} + + // find all of the public fields or fields with public accessors + @After("initMyProcessor(myProcessor)") + public void adterInitMyProcessor(MyProcessor myProcessor){ + Field[] fields = myProcessor.getClass().getDeclaredFields(); + for (Field field : fields) { + // make sure it should not be ignored + if(field.getAnnotation(OkToIgnore.class) == null){ + boolean addField = false; + // if public + if(field.getModifiers() == Modifier.PUBLIC){ + addField = true; + }else { + // find a public accessor if it exists - assumes convention of getFieldName + Method[] methods = myProcessor.getClass().getMethods(); + for (Method method : methods) { + String methodName = method.getName(); + if(methodName.equalsIgnoreCase("get" + field.getName()) && method.getModifiers() == Modifier.PUBLIC){ + addField = true; + } + } + } + + if(addField){ + fieldList.put(field.getName().toString(), field); + } + } + } + } + + // check where the process method is defined + @Before("executesProcess(myProcessor)") + public void beforeExecutesProcess(MyProcessor myProcessor, JoinPoint thisJoinPoint){ + Class declaringType = thisJoinPoint.getSignature().getDeclaringType(); + System.out.println(myProcessor.getClass().toString() + " execution OK: " + myProcessor.getClass().equals(declaringType)); + } + + // check access of the fields + @Before("fieldAccessor(myProcessor)") + public void beforeFieldAccessor(MyProcessor myProcessor, JoinPoint thisJoinPoint){ + String fieldName = thisJoinPoint.getSignature().getName().toString(); + // remove the fields from the field list as they are accessed + if(fieldList.containsKey(fieldName)){ + fieldList.remove(fieldName); + } + } + + @After("executesProcess(myProcessor)") + public void afterExecutesProcess(MyProcessor myProcessor){ + // report the missing field accessors + for(String fieldName : fieldList.keySet()){ + System.out.println("Failed to process " + fieldName + " in " + myProcessor.getClass().toString()); + } + } + +} diff --git a/tests/multiIncremental/prx/base/src/com/kronos/aspects/ProcessAspect.aj b/tests/multiIncremental/prx/base/src/com/kronos/aspects/ProcessAspect.aj new file mode 100644 index 000000000..aa2ed389a --- /dev/null +++ b/tests/multiIncremental/prx/base/src/com/kronos/aspects/ProcessAspect.aj @@ -0,0 +1,75 @@ +package com.kronos.aspects; + +import com.kronos.code.MyProcessor; +import java.lang.reflect.Field; +import java.lang.reflect.Method; +import java.util.HashMap; +import com.kronos.code.OkToIgnore; +import java.lang.reflect.Modifier; +import java.util.ArrayList; + +public aspect ProcessAspect perthis(initMyProcessor(MyProcessor)) { + + HashMap fieldList = new HashMap(); + + pointcut initMyProcessor(MyProcessor myProcessor) : initialization(MyProcessor+.new(..)) && this(myProcessor); + + pointcut executesProcess(MyProcessor myProcessor) : execution(* MyProcessor+.process()) && this(myProcessor); + + pointcut fieldAccessor(MyProcessor myProcessor) : get(* MyProcessor+.*) && cflow(executesProcess(myProcessor)); + + // find all of the public fields or fields with public accessors + after(MyProcessor myProcessor): initMyProcessor(myProcessor) { + // this advice is executed for each type in the hierarchy, including the interface + // so you will get all of the fields and methods for each type in the hierarchy + System.out.println(thisJoinPoint.getArgs()); Class currentType = thisJoinPointStaticPart.getSourceLocation().getWithinType(); +System.out.println(thisEnclosingJoinPointStaticPart); Field[] fields = currentType.getDeclaredFields(); + for (Field field : fields) { + // make sure it should not be ignored + if(field.getAnnotation(OkToIgnore.class) == null){ + boolean addField = false; + // if public + if(field.getModifiers() == Modifier.PUBLIC){ + addField = true; + }else { + // find a public accessor if it exists - assumes convention of getFieldName + Method[] methods = currentType.getMethods(); + for (Method method : methods) { + String methodName = method.getName(); + if(methodName.equalsIgnoreCase("get" + field.getName()) && method.getModifiers() == Modifier.PUBLIC){ + addField = true; + } + } + } + + if(addField){ + fieldList.put(field.getName().toString(), field); + } + } + } + } + + + // check where the process method is defined + before(MyProcessor myProcessor): executesProcess(myProcessor) && !cflowbelow(executesProcess(MyProcessor)){ + Class declaringType = thisJoinPointStaticPart.getSignature().getDeclaringType(); + System.out.println(myProcessor.getClass().toString() + " execution OK: " + myProcessor.getClass().equals(declaringType)); + } + + // check access of the fields + before(MyProcessor myProcessor): fieldAccessor(myProcessor){ + String fieldName = thisJoinPointStaticPart.getSignature().getName().toString(); + // remove the fields from the field list as they are accessed + if(fieldList.containsKey(fieldName)){ + fieldList.remove(fieldName); + } + } + + after(MyProcessor myProcessor): executesProcess(myProcessor) && !cflowbelow(executesProcess(MyProcessor)){ + // report the missing field accessors + for(String fieldName : fieldList.keySet()){ + System.out.println("Failed to process " + fieldName + " in " + myProcessor.getClass().toString()); + } + } + +} diff --git a/tests/multiIncremental/prx/base/src/com/kronos/code/Main.java b/tests/multiIncremental/prx/base/src/com/kronos/code/Main.java new file mode 100644 index 000000000..fe6af8ced --- /dev/null +++ b/tests/multiIncremental/prx/base/src/com/kronos/code/Main.java @@ -0,0 +1,17 @@ +package com.kronos.code; + +public class Main { + + /** + * @param args + */ + public static void main(String[] args) { + Processor1 p1 = new Processor1(); + p1.process(); + Processor2 p2 = new Processor2(); + p2.process(); + Processor3 p3 = new Processor3(); + p3.process(); + } + +} diff --git a/tests/multiIncremental/prx/base/src/com/kronos/code/MyProcessor.java b/tests/multiIncremental/prx/base/src/com/kronos/code/MyProcessor.java new file mode 100644 index 000000000..512b89a73 --- /dev/null +++ b/tests/multiIncremental/prx/base/src/com/kronos/code/MyProcessor.java @@ -0,0 +1,5 @@ +package com.kronos.code; + +public interface MyProcessor { + public void process(); +} diff --git a/tests/multiIncremental/prx/base/src/com/kronos/code/OkToIgnore.java b/tests/multiIncremental/prx/base/src/com/kronos/code/OkToIgnore.java new file mode 100644 index 000000000..3c658d3fb --- /dev/null +++ b/tests/multiIncremental/prx/base/src/com/kronos/code/OkToIgnore.java @@ -0,0 +1,12 @@ +package com.kronos.code; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +@Retention(RetentionPolicy.RUNTIME) +@Target(ElementType.FIELD) +public @interface OkToIgnore { + +} diff --git a/tests/multiIncremental/prx/base/src/com/kronos/code/Processor1.java b/tests/multiIncremental/prx/base/src/com/kronos/code/Processor1.java new file mode 100644 index 000000000..7b21d1335 --- /dev/null +++ b/tests/multiIncremental/prx/base/src/com/kronos/code/Processor1.java @@ -0,0 +1,15 @@ +package com.kronos.code; +public class Processor1 implements MyProcessor { + + private int p1; + + public int getP1() { + return p1; + } + + public void process() { + // TODO Auto-generated method stub + int x = p1; + } + +} diff --git a/tests/multiIncremental/prx/base/src/com/kronos/code/Processor2.java b/tests/multiIncremental/prx/base/src/com/kronos/code/Processor2.java new file mode 100644 index 000000000..063308807 --- /dev/null +++ b/tests/multiIncremental/prx/base/src/com/kronos/code/Processor2.java @@ -0,0 +1,5 @@ +package com.kronos.code; + +public class Processor2 extends Processor1 { + +} diff --git a/tests/multiIncremental/prx/base/src/com/kronos/code/Processor3.java b/tests/multiIncremental/prx/base/src/com/kronos/code/Processor3.java new file mode 100644 index 000000000..eef5a43c1 --- /dev/null +++ b/tests/multiIncremental/prx/base/src/com/kronos/code/Processor3.java @@ -0,0 +1,26 @@ +package com.kronos.code; + +public class Processor3 extends Processor1 { + + @OkToIgnore + public int u = 0; // should pass it is marked as ok to ignore + private int v = 0; // should fail it has public accessor but is not processed + private int w = 0; // should pass it has public accessor and is processed + public int x = 0; // should pass it is public and is processed + public int y = 0; // should fail it is public and is not processed + private int z = 0; // should pass it is private and does not have a public accessor + + public void process() { + int a = x; + int b = w; + super.process(); + } + + public int getW(){ + return w; + } + + public int getV(){ + return v; + } +} diff --git a/tests/src/org/aspectj/systemtest/incremental/tools/MultiProjectIncrementalTests.java b/tests/src/org/aspectj/systemtest/incremental/tools/MultiProjectIncrementalTests.java index bc9f40009..31225aa3b 100644 --- a/tests/src/org/aspectj/systemtest/incremental/tools/MultiProjectIncrementalTests.java +++ b/tests/src/org/aspectj/systemtest/incremental/tools/MultiProjectIncrementalTests.java @@ -1092,18 +1092,17 @@ public class MultiProjectIncrementalTests extends AbstractMultiProjectIncrementa } - public void testX() throws IOException { + public void testHandleCountersForAdvice() throws IOException { String p = "prx"; initialiseProject(p); build(p); +// System.out.println("Handle Counters For Advice Output"); IProgramElement root = getModelFor(p).getHierarchy().getRoot(); - dumptree(getModelFor(p).getHierarchy().getRoot(), 0); - PrintWriter pw = new PrintWriter(System.out); - getModelFor(p).dumprels(pw); - pw.flush(); - +// dumptree(getModelFor(p).getHierarchy().getRoot(), 0); +// PrintWriter pw = new PrintWriter(System.out); +// getModelFor(p).dumprels(pw); +// pw.flush(); IProgramElement ff = findFile(root,"ProcessAspect.aj"); - assertEquals("=prx