KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > spoon > examples > fieldaccess > processing > ReadAccessProcessor


1 package spoon.examples.fieldaccess.processing;
2
3 import spoon.examples.fieldaccess.annotation.Getter;
4 import spoon.examples.fieldaccess.annotation.Setter;
5 import spoon.examples.fieldaccess.template.FieldAccessTemplate;
6 import spoon.processing.AbstractProcessor;
7 import spoon.reflect.code.CtBlock;
8 import spoon.reflect.code.CtFieldAccess;
9 import spoon.reflect.declaration.CtClass;
10 import spoon.reflect.declaration.CtMethod;
11 import spoon.reflect.reference.CtFieldReference;
12 import spoon.template.Substitution;
13 import spoon.template.Template;
14 import spoon.template.TemplateMatcher;
15
16 /**
17  * This processor replaces all the read accesses of the form <code>field</code>
18  * or <code>expr.field</code> by calls to the getters (<code>getField()</code>
19  * or <code>expr.getField()</code>). It uses the template matching facility ({@link spoon.template.TemplateMatcher})
20  * to avoid doing this transformation when the field access is done within a
21  * getter or a setter implementation (to avoid infinite runtime recursions).
22  */

23 public class ReadAccessProcessor<_FieldType_> extends
24         AbstractProcessor<CtFieldAccess<_FieldType_>> {
25
26     public boolean isToBeProcessed(CtFieldAccess<_FieldType_> candidate) {
27         return true;
28     }
29
30     public void process(CtFieldAccess<_FieldType_> access) {
31         CtFieldReference<_FieldType_> field = access.getVariable();
32         if (ServerAccessProcessor.fields.contains(field)) {
33             CtClass<FieldAccessTemplate> templateType = getFactory().Template()
34                     .get(FieldAccessTemplate.class);
35             TemplateMatcher matcher = new TemplateMatcher(templateType);
36             CtMethod setter = (CtMethod) templateType.getAnnotatedChildren(
37                     Setter.class).get(0);
38             CtMethod getter = (CtMethod) templateType.getAnnotatedChildren(
39                     Getter.class).get(0);
40             if (!matcher.match(access.getParent(CtMethod.class), setter)
41                     && !matcher.match(access.getParent(CtMethod.class), getter)) {
42                 Template t = new FieldAccessTemplate<_FieldType_>(field
43                         .getType(), field.getSimpleName(), access, null);
44                 CtBlock<?> b = Substitution.substituteMethodBody(access
45                         .getParent(CtClass.class), t, "getterInvocation");
46                 access.replace(b.getStatements().get(0));
47             }
48         }
49     }
50 }
51
Popular Tags