KickJava   Java API By Example, From Geeks To Geeks.

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


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.SystemProperties;
31 import edu.umd.cs.findbugs.ba.AnalysisContext;
32 import edu.umd.cs.findbugs.ba.AnnotationDatabase;
33 import edu.umd.cs.findbugs.ba.NullnessAnnotation;
34 import edu.umd.cs.findbugs.ba.XFactory;
35 import edu.umd.cs.findbugs.ba.XMethod;
36 import edu.umd.cs.findbugs.ba.XMethodParameter;
37 import edu.umd.cs.findbugs.visitclass.AnnotationVisitor;
38
39 /**
40  * Scan application classes for
41  * NonNull annotations.
42  *
43  * @author David Hovemeyer
44  * @author William Pugh
45  */

46 public class BuildNonNullAnnotationDatabase extends AnnotationVisitor {
47     private static final boolean DEBUG = SystemProperties.getBoolean("fnd.debug.annotation");
48
49     private static final String JavaDoc DEFAULT_ANNOTATION_ANNOTATION_CLASS = "DefaultAnnotation";
50
51     private static final Map JavaDoc<String JavaDoc, String JavaDoc> defaultKind = new HashMap JavaDoc<String JavaDoc, String JavaDoc>();
52     static {
53         defaultKind.put("", AnnotationDatabase.ANY);
54         defaultKind.put("ForParameters", AnnotationDatabase.PARAMETER);
55         defaultKind.put("ForMethods", AnnotationDatabase.METHOD);
56         defaultKind.put("ForFields", AnnotationDatabase.FIELD);
57
58     }
59
60     public BuildNonNullAnnotationDatabase() {
61
62     }
63
64     static String JavaDoc lastPortion(String JavaDoc className) {
65         int i = className.lastIndexOf(".");
66         if (i < 0)
67             return className;
68         return className.substring(i + 1);
69     }
70
71     @Override JavaDoc public void visit(Synthetic a) {
72         if (visitingMethod()) {
73             AnalysisContext.currentAnalysisContext()
74             .getNullnessAnnotationDatabase().addSyntheticElement(
75                     XFactory.createXMethod(this));
76         } else if (visitingField()) {
77             AnalysisContext.currentAnalysisContext()
78             .getNullnessAnnotationDatabase().addSyntheticElement(
79                     XFactory.createXField(this));
80         } else {
81             AnalysisContext.currentAnalysisContext()
82             .getNullnessAnnotationDatabase().addSyntheticElement(
83                     getDottedClassName());
84         }
85     }
86     @Override JavaDoc public void visit(JavaClass obj) {
87         if (obj.isSynthetic())
88             AnalysisContext.currentAnalysisContext()
89             .getNullnessAnnotationDatabase().addSyntheticElement(
90                     getDottedClassName());
91     }
92     @Override JavaDoc public void visit(Field f) {
93         if (f.isSynthetic())
94             AnalysisContext.currentAnalysisContext()
95             .getNullnessAnnotationDatabase().addSyntheticElement(
96                     XFactory.createXField(this));
97     }
98
99     @Override JavaDoc public void visit(Method m) {
100         if (m.isSynthetic())
101             AnalysisContext.currentAnalysisContext()
102             .getNullnessAnnotationDatabase().addSyntheticElement(
103                     XFactory.createXMethod(this));
104     }
105     
106     @Override JavaDoc
107     public void visitAnnotation(String JavaDoc annotationClass,
108             Map JavaDoc<String JavaDoc, Object JavaDoc> map, boolean runtimeVisible) {
109
110     
111
112         NullnessAnnotation n = NullnessAnnotation.Parser.parse(annotationClass);
113         annotationClass = lastPortion(annotationClass);
114         if (n == null) {
115             if (annotationClass.startsWith("DefaultAnnotation")) {
116
117                 Object JavaDoc v = map.get("value");
118                 if (v == null || !(v instanceof Object JavaDoc[]))
119                     return;
120                 annotationClass = annotationClass.substring("DefaultAnnotation"
121                         .length());
122
123                 String JavaDoc annotationTarget = defaultKind.get(annotationClass);
124
125                 if (annotationTarget != null)
126                     for (Object JavaDoc aClass : (Object JavaDoc[]) v) {
127                         n = NullnessAnnotation.Parser.parse((String JavaDoc) aClass);
128                         if (n != null)
129                             AnalysisContext.currentAnalysisContext()
130                                     .getNullnessAnnotationDatabase()
131                                     .addDefaultAnnotation(annotationTarget,
132                                             getDottedClassName(), n);
133                     }
134
135             }
136         }
137         else if (visitingMethod())
138             AnalysisContext.currentAnalysisContext()
139                     .getNullnessAnnotationDatabase().addDirectAnnotation(
140                             XFactory.createXMethod(this), n);
141         else if (visitingField())
142             AnalysisContext.currentAnalysisContext()
143                     .getNullnessAnnotationDatabase().addDirectAnnotation(
144                             XFactory.createXField(this), n);
145
146     }
147     @Override JavaDoc
148     public void visitSyntheticParameterAnnotation(int p, boolean runtimeVisible) {
149
150         XMethod xmethod = XFactory.createXMethod(this);
151
152         XMethodParameter xparameter = new XMethodParameter(xmethod, p);
153
154         AnalysisContext.currentAnalysisContext()
155                 .getNullnessAnnotationDatabase().addDirectAnnotation(
156                         xparameter, NullnessAnnotation.UNKNOWN_NULLNESS);
157
158     }
159
160     
161     @Override JavaDoc
162     public void visitParameterAnnotation(int p, String JavaDoc annotationClass,
163             Map JavaDoc<String JavaDoc, Object JavaDoc> map, boolean runtimeVisible) {
164         annotationClass = lastPortion(annotationClass);
165         NullnessAnnotation n = NullnessAnnotation.Parser.parse(annotationClass);
166
167         if (n == null)
168             return;
169
170         XMethod xmethod = XFactory.createXMethod(this);
171         if (DEBUG) {
172             System.out.println("Parameter "
173                     + p
174                     + " @"
175                     + annotationClass.substring(annotationClass
176                             .lastIndexOf('/') + 1) + " in "
177                     + xmethod.toString());
178         }
179         XMethodParameter xparameter = new XMethodParameter(xmethod, p);
180
181         AnalysisContext.currentAnalysisContext()
182                 .getNullnessAnnotationDatabase().addDirectAnnotation(
183                         xparameter, n);
184
185     }
186
187 }
188
Popular Tags