aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authoraclement <aclement>2009-03-28 16:36:44 +0000
committeraclement <aclement>2009-03-28 16:36:44 +0000
commit0693366e874cc40f78a0057f5d7a13e88c49e318 (patch)
treef3ed3ff860b48a435a8d005bddacb2a12d483304
parentb00ca75db832164f0eec0451723edab041ff3584 (diff)
downloadaspectj-0693366e874cc40f78a0057f5d7a13e88c49e318.tar.gz
aspectj-0693366e874cc40f78a0057f5d7a13e88c49e318.zip
advice handle counters
-rw-r--r--tests/multiIncremental/prx/EnforceProcess/.classpath7
-rw-r--r--tests/multiIncremental/prx/EnforceProcess/.project18
-rw-r--r--tests/multiIncremental/prx/EnforceProcess/bin/com/kronos/aspects/ProcessAspect$ajcMightHaveAspect.classbin0 -> 537 bytes
-rw-r--r--tests/multiIncremental/prx/EnforceProcess/bin/com/kronos/aspects/ProcessAspect.classbin0 -> 12515 bytes
-rw-r--r--tests/multiIncremental/prx/EnforceProcess/bin/com/kronos/code/Main.classbin0 -> 789 bytes
-rw-r--r--tests/multiIncremental/prx/EnforceProcess/bin/com/kronos/code/MyProcessor.classbin0 -> 391 bytes
-rw-r--r--tests/multiIncremental/prx/EnforceProcess/bin/com/kronos/code/OkToIgnore.classbin0 -> 388 bytes
-rw-r--r--tests/multiIncremental/prx/EnforceProcess/bin/com/kronos/code/Processor1.classbin0 -> 4245 bytes
-rw-r--r--tests/multiIncremental/prx/EnforceProcess/bin/com/kronos/code/Processor2.classbin0 -> 2152 bytes
-rw-r--r--tests/multiIncremental/prx/EnforceProcess/bin/com/kronos/code/Processor3.classbin0 -> 4894 bytes
-rw-r--r--tests/multiIncremental/prx/base/src/com/kronos/aspects/APA.java83
-rw-r--r--tests/multiIncremental/prx/base/src/com/kronos/aspects/ProcessAspect.aj75
-rw-r--r--tests/multiIncremental/prx/base/src/com/kronos/code/Main.java17
-rw-r--r--tests/multiIncremental/prx/base/src/com/kronos/code/MyProcessor.java5
-rw-r--r--tests/multiIncremental/prx/base/src/com/kronos/code/OkToIgnore.java12
-rw-r--r--tests/multiIncremental/prx/base/src/com/kronos/code/Processor1.java15
-rw-r--r--tests/multiIncremental/prx/base/src/com/kronos/code/Processor2.java5
-rw-r--r--tests/multiIncremental/prx/base/src/com/kronos/code/Processor3.java26
-rw-r--r--tests/src/org/aspectj/systemtest/incremental/tools/MultiProjectIncrementalTests.java13
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
new file mode 100644
index 000000000..4d88b5443
--- /dev/null
+++ b/tests/multiIncremental/prx/EnforceProcess/bin/com/kronos/aspects/ProcessAspect$ajcMightHaveAspect.class
Binary files 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
--- /dev/null
+++ b/tests/multiIncremental/prx/EnforceProcess/bin/com/kronos/aspects/ProcessAspect.class
Binary files 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
--- /dev/null
+++ b/tests/multiIncremental/prx/EnforceProcess/bin/com/kronos/code/Main.class
Binary files 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
--- /dev/null
+++ b/tests/multiIncremental/prx/EnforceProcess/bin/com/kronos/code/MyProcessor.class
Binary files 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
--- /dev/null
+++ b/tests/multiIncremental/prx/EnforceProcess/bin/com/kronos/code/OkToIgnore.class
Binary files 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
--- /dev/null
+++ b/tests/multiIncremental/prx/EnforceProcess/bin/com/kronos/code/Processor1.class
Binary files 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
--- /dev/null
+++ b/tests/multiIncremental/prx/EnforceProcess/bin/com/kronos/code/Processor2.class
Binary files 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
--- /dev/null
+++ b/tests/multiIncremental/prx/EnforceProcess/bin/com/kronos/code/Processor3.class
Binary files 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<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());
}