KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > spoon > examples > factory > processing > FactoryProcessor


1 package spoon.examples.factory.processing;
2
3 import java.util.ArrayList JavaDoc;
4 import java.util.List JavaDoc;
5
6 import spoon.examples.factory.src.Factory;
7 import spoon.processing.AbstractProcessor;
8 import spoon.processing.Severity;
9 import spoon.reflect.code.CtNewClass;
10 import spoon.reflect.declaration.CtMethod;
11 import spoon.reflect.declaration.CtSimpleType;
12 import spoon.reflect.declaration.CtType;
13 import spoon.reflect.reference.CtTypeReference;
14
15 public class FactoryProcessor extends AbstractProcessor<CtNewClass<?>> {
16
17     public void process(CtNewClass<?> newClass) {
18         // skip factory creation
19
if (getFactoryType().isAssignableFrom(
20                 newClass.getExecutable().getDeclaringType()))
21             return;
22         // skip creations in factories
23
if (getFactoryType().isAssignableFrom(
24                 ((CtSimpleType<?>) newClass.getParent(CtSimpleType.class))
25                         .getReference()))
26             return;
27         // only report for types created by the factory
28
for (CtTypeReference<?> t : getCreatedTypes()) {
29             if (t.isAssignableFrom(newClass.getType())) {
30                 getFactory().getEnvironment().report(this, Severity.WARNING,
31                         newClass, "wrong use of factory pattern");
32             }
33         }
34
35     }
36
37     CtTypeReference<?> factoryType = null;
38
39     protected CtTypeReference<?> getFactoryType() {
40         if (factoryType == null) {
41             factoryType = getFactory().Type().createReference(Factory.class);
42         }
43         return factoryType;
44     }
45
46     List JavaDoc<CtTypeReference<?>> createdTypes;
47
48     private List JavaDoc<CtTypeReference<?>> getCreatedTypes() {
49         if (createdTypes == null) {
50             createdTypes = new ArrayList JavaDoc<CtTypeReference<?>>();
51             for (CtMethod<?> m : ((CtType<?>) getFactoryType().getDeclaration())
52                     .getMethods()) {
53                 createdTypes.add(m.getType());
54             }
55         }
56         return createdTypes;
57     }
58
59 }
60
Popular Tags