diff options
author | aclement <aclement> | 2009-03-28 16:36:44 +0000 |
---|---|---|
committer | aclement <aclement> | 2009-03-28 16:36:44 +0000 |
commit | 0693366e874cc40f78a0057f5d7a13e88c49e318 (patch) | |
tree | f3ed3ff860b48a435a8d005bddacb2a12d483304 | |
parent | b00ca75db832164f0eec0451723edab041ff3584 (diff) | |
download | aspectj-0693366e874cc40f78a0057f5d7a13e88c49e318.tar.gz aspectj-0693366e874cc40f78a0057f5d7a13e88c49e318.zip |
advice handle counters
19 files changed, 269 insertions, 7 deletions
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 @@ +<?xml version="1.0" encoding="UTF-8"?> +<classpath> + <classpathentry excluding="com/kronos/aspects/AnnotatedProcessAspect.java" kind="src" path="src"/> + <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/> + <classpathentry kind="con" path="org.eclipse.ajdt.core.ASPECTJRT_CONTAINER"/> + <classpathentry kind="output" path="bin"/> +</classpath> 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 @@ +<?xml version="1.0" encoding="UTF-8"?> +<projectDescription> + <name>EnforceProcess</name> + <comment></comment> + <projects> + </projects> + <buildSpec> + <buildCommand> + <name>org.eclipse.ajdt.core.ajbuilder</name> + <arguments> + </arguments> + </buildCommand> + </buildSpec> + <natures> + <nature>org.eclipse.ajdt.ui.ajnature</nature> + <nature>org.eclipse.jdt.core.javanature</nature> + </natures> +</projectDescription> 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 Binary files differnew file mode 100644 index 000000000..4d88b5443 --- /dev/null +++ b/tests/multiIncremental/prx/EnforceProcess/bin/com/kronos/aspects/ProcessAspect$ajcMightHaveAspect.class diff --git a/tests/multiIncremental/prx/EnforceProcess/bin/com/kronos/aspects/ProcessAspect.class b/tests/multiIncremental/prx/EnforceProcess/bin/com/kronos/aspects/ProcessAspect.class Binary files differnew file mode 100644 index 000000000..1c11f16cd --- /dev/null +++ b/tests/multiIncremental/prx/EnforceProcess/bin/com/kronos/aspects/ProcessAspect.class diff --git a/tests/multiIncremental/prx/EnforceProcess/bin/com/kronos/code/Main.class b/tests/multiIncremental/prx/EnforceProcess/bin/com/kronos/code/Main.class Binary files differnew file mode 100644 index 000000000..0333b7d04 --- /dev/null +++ b/tests/multiIncremental/prx/EnforceProcess/bin/com/kronos/code/Main.class diff --git a/tests/multiIncremental/prx/EnforceProcess/bin/com/kronos/code/MyProcessor.class b/tests/multiIncremental/prx/EnforceProcess/bin/com/kronos/code/MyProcessor.class Binary files differnew file mode 100644 index 000000000..6d8e06739 --- /dev/null +++ b/tests/multiIncremental/prx/EnforceProcess/bin/com/kronos/code/MyProcessor.class diff --git a/tests/multiIncremental/prx/EnforceProcess/bin/com/kronos/code/OkToIgnore.class b/tests/multiIncremental/prx/EnforceProcess/bin/com/kronos/code/OkToIgnore.class Binary files differnew file mode 100644 index 000000000..a9f7c0904 --- /dev/null +++ b/tests/multiIncremental/prx/EnforceProcess/bin/com/kronos/code/OkToIgnore.class diff --git a/tests/multiIncremental/prx/EnforceProcess/bin/com/kronos/code/Processor1.class b/tests/multiIncremental/prx/EnforceProcess/bin/com/kronos/code/Processor1.class Binary files differnew file mode 100644 index 000000000..5f7a3b93e --- /dev/null +++ b/tests/multiIncremental/prx/EnforceProcess/bin/com/kronos/code/Processor1.class diff --git a/tests/multiIncremental/prx/EnforceProcess/bin/com/kronos/code/Processor2.class b/tests/multiIncremental/prx/EnforceProcess/bin/com/kronos/code/Processor2.class Binary files differnew file mode 100644 index 000000000..f0c2fe830 --- /dev/null +++ b/tests/multiIncremental/prx/EnforceProcess/bin/com/kronos/code/Processor2.class diff --git a/tests/multiIncremental/prx/EnforceProcess/bin/com/kronos/code/Processor3.class b/tests/multiIncremental/prx/EnforceProcess/bin/com/kronos/code/Processor3.class Binary files differnew file mode 100644 index 000000000..2a2e12778 --- /dev/null +++ b/tests/multiIncremental/prx/EnforceProcess/bin/com/kronos/code/Processor3.class 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<String, Field> fieldList = new HashMap<String, Field>(); + + @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<String, Field> fieldList = new HashMap<String, Field>(); + + 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<com.kronos.aspects*ProcessAspect.aj}ProcessAspect&after&QMyProcessor;", findElementAtLine(root, 22).getHandleIdentifier()); assertEquals("=prx<com.kronos.aspects*ProcessAspect.aj}ProcessAspect&after&QMyProcessor;!2", findElementAtLine(root, 68).getHandleIdentifier()); } |