KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > edu > umd > cs > findbugs > detect > BuildCheckReturnAnnotationDatabase


1 /*
2  * FindBugs - Find Bugs in Java programs
3  * Copyright (C) 2005, University of Maryland
4  *
5  * This library is free software; you can redistribute it and/or
6  * modify it under the terms of the GNU Lesser General Public
7  * License as published by the Free Software Foundation; either
8  * version 2.1 of the License, or (at your option) any later version.
9  *
10  * This library is distributed in the hope that it will be useful,
11  * but WITHOUT ANY WARRANTY; without even the implied warranty of
12  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13  * Lesser General Public License for more details.
14  *
15  * You should have received a copy of the GNU Lesser General Public
16  * License along with this library; if not, write to the Free Software
17  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
18  */

19
20 package edu.umd.cs.findbugs.detect;
21
22 import java.util.HashMap JavaDoc;
23 import java.util.Map JavaDoc;
24
25 import org.apache.bcel.classfile.Field;
26 import org.apache.bcel.classfile.JavaClass;
27 import org.apache.bcel.classfile.Method;
28 import org.apache.bcel.classfile.Synthetic;
29
30 import edu.umd.cs.findbugs.ba.AnalysisContext;
31 import edu.umd.cs.findbugs.ba.AnnotationDatabase;
32 import edu.umd.cs.findbugs.ba.CheckReturnValueAnnotation;
33 import edu.umd.cs.findbugs.ba.XFactory;
34 import edu.umd.cs.findbugs.visitclass.AnnotationVisitor;
35
36 /**
37  * Scan application classes for
38  * CheckReturnValue annotations.
39  *
40  * @author David Hovemeyer
41  * @author William Pugh
42  */

43
44 public class BuildCheckReturnAnnotationDatabase extends AnnotationVisitor {
45
46     private static final String JavaDoc DEFAULT_ANNOTATION_ANNOTATION_CLASS = "DefaultAnnotation";
47
48     private static final Map JavaDoc<String JavaDoc, String JavaDoc> defaultKind = new HashMap JavaDoc<String JavaDoc, String JavaDoc>();
49     static {
50         defaultKind.put("", AnnotationDatabase.ANY);
51         defaultKind.put("ForParameters", AnnotationDatabase.PARAMETER);
52         defaultKind.put("ForMethods", AnnotationDatabase.METHOD);
53         defaultKind.put("ForFields", AnnotationDatabase.FIELD);
54
55     }
56
57     public BuildCheckReturnAnnotationDatabase() {
58
59     }
60
61     static String JavaDoc lastPortion(String JavaDoc className) {
62         int i = className.lastIndexOf(".");
63         if (i < 0)
64             return className;
65         return className.substring(i + 1);
66     }
67
68     @Override JavaDoc public void visit(JavaClass obj) {
69         if (obj.isSynthetic())
70             AnalysisContext.currentAnalysisContext()
71             .getCheckReturnAnnotationDatabase().addSyntheticElement(
72                     getDottedClassName());
73     }
74     @Override JavaDoc public void visit(Field f) {
75         if (f.isSynthetic())
76             AnalysisContext.currentAnalysisContext()
77             .getCheckReturnAnnotationDatabase().addSyntheticElement(
78                     XFactory.createXField(this));
79     }
80     @Override JavaDoc public void visit(Method m) {
81         if (m.isSynthetic())
82             AnalysisContext.currentAnalysisContext()
83             .getCheckReturnAnnotationDatabase().addSyntheticElement(
84                     XFactory.createXMethod(this));
85     }
86         
87     @Override JavaDoc public void visit(Synthetic a) {
88         if (visitingMethod()) {
89             AnalysisContext.currentAnalysisContext()
90             .getCheckReturnAnnotationDatabase().addSyntheticElement(
91                     XFactory.createXMethod(this));
92         } else if (visitingField()) {
93             AnalysisContext.currentAnalysisContext()
94             .getCheckReturnAnnotationDatabase().addSyntheticElement(
95                     XFactory.createXField(this));
96         } else {
97             AnalysisContext.currentAnalysisContext()
98             .getCheckReturnAnnotationDatabase().addSyntheticElement(
99                     getDottedClassName());
100         }
101     }
102     @Override JavaDoc
103     public void visitAnnotation(String JavaDoc annotationClass,
104             Map JavaDoc<String JavaDoc, Object JavaDoc> map, boolean runtimeVisible) {
105
106         annotationClass = lastPortion(annotationClass);
107
108         CheckReturnValueAnnotation n = CheckReturnValueAnnotation.parse(annotationClass, (String JavaDoc) map.get("priority"));
109         if (n == null) {
110             if (annotationClass.startsWith("DefaultAnnotation")) {
111
112                 Object JavaDoc v = map.get("value");
113                 if (v == null || !(v instanceof Object JavaDoc[]))
114                     return;
115                 annotationClass = annotationClass.substring("DefaultAnnotation"
116                         .length());
117
118                 String JavaDoc annotationTarget = defaultKind.get(annotationClass);
119                 
120                 if (annotationTarget != null)
121                     for (Object JavaDoc aClass : (Object JavaDoc[]) v) {
122                         n = CheckReturnValueAnnotation.parse((String JavaDoc) aClass, (String JavaDoc) map.get("priority"));
123                         if (n != null)
124                             AnalysisContext.currentAnalysisContext()
125                                     .getCheckReturnAnnotationDatabase()
126                                     .addDefaultAnnotation(annotationTarget,
127                                             getDottedClassName(), n);
128                     }
129
130             }
131         }
132         else if (visitingMethod())
133             AnalysisContext.currentAnalysisContext()
134                     .getCheckReturnAnnotationDatabase().addDirectAnnotation(
135                             XFactory.createXMethod(this), n);
136         
137
138     }
139
140     
141
142 }
143
Popular Tags