KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > spoon > examples > distcalc > processing > ServiceProcessor


1 package spoon.examples.distcalc.processing;
2
3 import java.util.ArrayList JavaDoc;
4
5 import spoon.examples.distcalc.annotation.Service;
6 import spoon.examples.distcalc.template.ServicesImplTemplate;
7 import spoon.examples.distcalc.template._MemoryCellType_;
8 import spoon.processing.AbstractAnnotationProcessor;
9 import spoon.reflect.Factory;
10 import spoon.reflect.declaration.CtClass;
11 import spoon.reflect.declaration.CtInterface;
12 import spoon.reflect.declaration.CtMethod;
13 import spoon.reflect.declaration.CtPackage;
14 import spoon.reflect.declaration.CtParameter;
15 import spoon.reflect.declaration.CtSimpleType;
16 import spoon.reflect.declaration.ModifierKind;
17 import spoon.reflect.reference.CtTypeReference;
18 import spoon.template.Substitution;
19
20 public class ServiceProcessor extends
21         AbstractAnnotationProcessor<Service, CtMethod<?>> {
22
23     public static String JavaDoc getMemoryCellTypeName(String JavaDoc funName) {
24         return "Node_" + funName + "_mem";
25     }
26
27     public static CtClass<?> getFunsImpl(Factory f, CtInterface<?> services) {
28         CtTypeReference<?> i = f.Interface().createReference(services);
29         for (CtSimpleType<?> t : f.Type().getAll()) {
30             if ((t instanceof CtClass)
31                     && !t.getModifiers().contains(ModifierKind.ABSTRACT)
32                     && ((CtClass<?>) t).getSuperInterfaces().contains(i)) {
33                 return (CtClass<?>) t;
34             }
35         }
36         CtClass<?> c = f.Class().create(services.getQualifiedName() + "Impl");
37         c.getSuperInterfaces().add(i);
38         c.getModifiers().add(ModifierKind.PUBLIC);
39         return c;
40     }
41
42     public void process(Service service, CtMethod<?> method) {
43         Factory f = method.getFactory();
44         CtPackage p = method.getParent(CtPackage.class);
45         CtInterface<?> i = method.getParent(CtInterface.class);
46         CtClass<?> c = getFunsImpl(f, i);
47         ServicesImplTemplate t = new ServicesImplTemplate(f.Type()
48                 .createReference(
49                         p.getQualifiedName() + "." + "Node_"
50                                 + method.getSimpleName()), null,
51                 f.Type()
52                         .createReference(
53                                 p.getQualifiedName()
54                                         + "."
55                                         + getMemoryCellTypeName(method
56                                                 .getSimpleName())), method
57                         .getType().getActualClass(), method.getSimpleName(),
58                 new ArrayList JavaDoc<CtParameter>(method.getParameters()));
59         Substitution.insertAll(c, t);
60         _MemoryCellType_ memType = new _MemoryCellType_(f, f.Type()
61                 .createReference(
62                         p.getQualifiedName() + "." + "Node_"
63                                 + method.getSimpleName()), method.getType()
64                 .getActualClass(), method.getSimpleName(),
65                 new ArrayList JavaDoc<CtParameter<?>>(method.getParameters()));
66         CtClass memClass = Substitution.substitute(memType, f.Template().get(
67                 _MemoryCellType_.class));
68         p.getTypes().add(memClass);
69         memClass.setParent(p);
70     }
71
72 }
73
Popular Tags