KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > spoon > examples > resource > processing > ResourceChecker


1 package spoon.examples.resource.processing;
2
3 import java.util.ArrayList JavaDoc;
4 import java.util.HashMap JavaDoc;
5 import java.util.List JavaDoc;
6 import java.util.Map JavaDoc;
7 import java.util.Map.Entry;
8
9 import spoon.examples.resource.src.Resource;
10 import spoon.processing.AbstractManualProcessor;
11 import spoon.processing.Severity;
12 import spoon.reflect.code.CtAbstractInvocation;
13 import spoon.reflect.eval.StepKind;
14 import spoon.reflect.eval.SymbolicEvaluationPath;
15 import spoon.reflect.eval.SymbolicEvaluationStep;
16 import spoon.reflect.reference.CtExecutableReference;
17 import spoon.reflect.reference.CtTypeReference;
18
19 public class ResourceChecker extends AbstractManualProcessor {
20
21     List JavaDoc<CtAbstractInvocation> reported = new ArrayList JavaDoc<CtAbstractInvocation>();
22
23     void reportWarning(String JavaDoc msg, CtAbstractInvocation invocation) {
24         if (invocation != null && !reported.contains(invocation)) {
25             reported.add(invocation);
26             getFactory().getEnvironment().report(this, Severity.WARNING,
27                     invocation, msg);
28         }
29     }
30
31     public void process() {
32         CtTypeReference<Resource> resourceRef = getFactory().Class()
33                 .createReference(Resource.class);
34         CtTypeReference<Void JavaDoc> voidType = getFactory().Type().createReference(
35                 void.class);
36         CtExecutableReference open = getFactory().Method().createReference(
37                 resourceRef, voidType, "open");
38         CtExecutableReference close = getFactory().Method().createReference(
39                 resourceRef, voidType, "close");
40         CtExecutableReference read = getFactory().Method().createReference(
41                 resourceRef, voidType, "read");
42         for (List JavaDoc<SymbolicEvaluationPath> paths : getFactory().Eval()
43                 .createEvaluationPaths(getFactory().Method().getMainMethods())
44                 .values()) {
45             for (SymbolicEvaluationPath path : paths) {
46                 // path.dump();
47
Map JavaDoc<String JavaDoc, CtAbstractInvocation> opened = new HashMap JavaDoc<String JavaDoc, CtAbstractInvocation>();
48                 for (SymbolicEvaluationStep step : path.getSteps()) {
49                     // System.out.println("analysing "+step);
50
if (step.getKind() == StepKind.EXIT)
51                         continue;
52                     String JavaDoc target = step.getFrame().getThis().getId();
53                     if (open.equals(step.getFrame().getExecutable())) {
54                         if (opened.containsKey(target)) {
55                             reportWarning(
56                                     "Resource may already have been opened",
57                                     step.getFrame().getInvocation());
58                         }
59                         opened.put(target, step.getFrame().getInvocation());
60                     }
61                     if (close.equals(step.getFrame().getExecutable())) {
62                         if (!opened.containsKey(target)) {
63                             reportWarning(
64                                     "Resource may not have been opened or may be already closed",
65                                     step.getFrame().getInvocation());
66                         }
67                         opened.remove(target);
68                     }
69                     if (read.equals(step.getFrame().getExecutable())) {
70                         if (!opened.containsKey(target)) {
71                             reportWarning(
72                                     "Resource may not have been opened or may be already closed",
73                                     step.getFrame().getInvocation());
74                         }
75                     }
76                 }
77                 for (Entry<String JavaDoc, CtAbstractInvocation> e : opened.entrySet()) {
78                     reportWarning("Resource may not have been closed", e
79                             .getValue());
80
81                 }
82             }
83         }
84     }
85 }
86
Popular Tags