KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > edu > umd > cs > findbugs > ba > AnalysisCacheToAnalysisContextAdapter


1 /*
2  * FindBugs - Find Bugs in Java programs
3  * Copyright (C) 2006, 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.ba;
21
22 import java.io.IOException JavaDoc;
23 import java.util.HashSet JavaDoc;
24 import java.util.List JavaDoc;
25 import java.util.Set JavaDoc;
26
27 import org.apache.bcel.Repository;
28 import org.apache.bcel.classfile.ClassFormatException;
29 import org.apache.bcel.classfile.JavaClass;
30
31 import edu.umd.cs.findbugs.AnalysisCacheToRepositoryAdapter;
32 import edu.umd.cs.findbugs.BugReporter;
33 import edu.umd.cs.findbugs.ba.ch.Subtypes;
34 import edu.umd.cs.findbugs.ba.npe.ParameterNullnessPropertyDatabase;
35 import edu.umd.cs.findbugs.ba.type.FieldStoreTypeDatabase;
36 import edu.umd.cs.findbugs.classfile.CheckedAnalysisException;
37 import edu.umd.cs.findbugs.classfile.ClassDescriptor;
38 import edu.umd.cs.findbugs.classfile.Global;
39 import edu.umd.cs.findbugs.classfile.MethodDescriptor;
40 import edu.umd.cs.findbugs.util.ClassName;
41
42 /**
43  * An AnalysisContext implementation that uses the
44  * IAnalysisCache. This class must only be used by
45  * FindBugs2, not the original FindBugs driver.
46  *
47  * @author David Hovemeyer
48  */

49 public class AnalysisCacheToAnalysisContextAdapter extends AnalysisContext {
50     
51     static class DelegatingRepositoryLookupFailureCallback implements RepositoryLookupFailureCallback {
52
53         /* (non-Javadoc)
54          * @see edu.umd.cs.findbugs.classfile.IErrorLogger#logError(java.lang.String)
55          */

56         public void logError(String JavaDoc message) {
57             Global.getAnalysisCache().getErrorLogger().logError(message);
58         }
59
60         /* (non-Javadoc)
61          * @see edu.umd.cs.findbugs.classfile.IErrorLogger#logError(java.lang.String, java.lang.Throwable)
62          */

63         public void logError(String JavaDoc message, Throwable JavaDoc e) {
64             Global.getAnalysisCache().getErrorLogger().logError(message, e);
65         }
66
67         /* (non-Javadoc)
68          * @see edu.umd.cs.findbugs.classfile.IErrorLogger#reportMissingClass(java.lang.ClassNotFoundException)
69          */

70         public void reportMissingClass(ClassNotFoundException JavaDoc ex) {
71             Global.getAnalysisCache().getErrorLogger().reportMissingClass(ex);
72         }
73         
74         /* (non-Javadoc)
75          * @see edu.umd.cs.findbugs.classfile.IErrorLogger#reportMissingClass(edu.umd.cs.findbugs.classfile.ClassDescriptor)
76          */

77         public void reportMissingClass(ClassDescriptor classDescriptor) {
78             Global.getAnalysisCache().getErrorLogger().reportMissingClass(classDescriptor);
79         }
80
81         /* (non-Javadoc)
82          * @see edu.umd.cs.findbugs.classfile.IErrorLogger#reportSkippedAnalysis(edu.umd.cs.findbugs.classfile.MethodDescriptor)
83          */

84         public void reportSkippedAnalysis(MethodDescriptor method) {
85             Global.getAnalysisCache().getErrorLogger().reportSkippedAnalysis(method);
86         }
87         
88     }
89     
90     private RepositoryLookupFailureCallback lookupFailureCallback;
91     
92     /**
93      * Constructor.
94      */

95     public AnalysisCacheToAnalysisContextAdapter() {
96         this.lookupFailureCallback = new DelegatingRepositoryLookupFailureCallback();
97     }
98
99     /* (non-Javadoc)
100      * @see edu.umd.cs.findbugs.ba.AnalysisContext#addApplicationClassToRepository(org.apache.bcel.classfile.JavaClass)
101      */

102     @Override JavaDoc
103     public void addApplicationClassToRepository(JavaClass appClass) {
104         throw new UnsupportedOperationException JavaDoc();
105     }
106
107     /* (non-Javadoc)
108      * @see edu.umd.cs.findbugs.ba.AnalysisContext#addClasspathEntry(java.lang.String)
109      */

110     @Override JavaDoc
111     public void addClasspathEntry(String JavaDoc url) throws IOException JavaDoc {
112         throw new UnsupportedOperationException JavaDoc();
113     }
114
115     /* (non-Javadoc)
116      * @see edu.umd.cs.findbugs.ba.AnalysisContext#clearClassContextCache()
117      */

118     @Override JavaDoc
119     public void clearClassContextCache() {
120         throw new UnsupportedOperationException JavaDoc();
121     }
122
123     /* (non-Javadoc)
124      * @see edu.umd.cs.findbugs.ba.AnalysisContext#clearRepository()
125      */

126     @Override JavaDoc
127     public void clearRepository() {
128         // Set the backing store for the BCEL Repository to
129
// be the AnalysisCache.
130
Repository.setRepository(new AnalysisCacheToRepositoryAdapter());
131     }
132
133     /* (non-Javadoc)
134      * @see edu.umd.cs.findbugs.ba.AnalysisContext#getAnnotationRetentionDatabase()
135      */

136     @Override JavaDoc
137     public AnnotationRetentionDatabase getAnnotationRetentionDatabase() {
138         return getDatabase(AnnotationRetentionDatabase.class);
139     }
140
141     /* (non-Javadoc)
142      * @see edu.umd.cs.findbugs.ba.AnalysisContext#getCheckReturnAnnotationDatabase()
143      */

144     @Override JavaDoc
145     public CheckReturnAnnotationDatabase getCheckReturnAnnotationDatabase() {
146         return getDatabase(CheckReturnAnnotationDatabase.class);
147     }
148
149     /* (non-Javadoc)
150      * @see edu.umd.cs.findbugs.ba.AnalysisContext#getClassContext(org.apache.bcel.classfile.JavaClass)
151      */

152     @Override JavaDoc
153     public ClassContext getClassContext(JavaClass javaClass) {
154         // This is a bit silly since we're doing an unnecessary ClassDescriptor->JavaClass lookup.
155
// However, we can be assured that it will succeed.
156

157         ClassDescriptor classDescriptor =
158             new ClassDescriptor(ClassName.toSlashedClassName(javaClass.getClassName()));
159         
160         try {
161             return Global.getAnalysisCache().getClassAnalysis(ClassContext.class, classDescriptor);
162         } catch (CheckedAnalysisException e) {
163             IllegalStateException JavaDoc ise = new IllegalStateException JavaDoc("Could not get ClassContext for JavaClass");
164             ise.initCause(e);
165             throw ise;
166         }
167     }
168
169     /* (non-Javadoc)
170      * @see edu.umd.cs.findbugs.ba.AnalysisContext#getClassContextStats()
171      */

172     @Override JavaDoc
173     public String JavaDoc getClassContextStats() {
174         return "<unknown ClassContext stats>";
175     }
176
177     /* (non-Javadoc)
178      * @see edu.umd.cs.findbugs.ba.AnalysisContext#getFieldStoreTypeDatabase()
179      */

180     @Override JavaDoc
181     public FieldStoreTypeDatabase getFieldStoreTypeDatabase() {
182         return getDatabase(FieldStoreTypeDatabase.class);
183     }
184
185     /* (non-Javadoc)
186      * @see edu.umd.cs.findbugs.ba.AnalysisContext#getJCIPAnnotationDatabase()
187      */

188     @Override JavaDoc
189     public JCIPAnnotationDatabase getJCIPAnnotationDatabase() {
190         return getDatabase(JCIPAnnotationDatabase.class);
191     }
192
193     /* (non-Javadoc)
194      * @see edu.umd.cs.findbugs.ba.AnalysisContext#getLookupFailureCallback()
195      */

196     @Override JavaDoc
197     public RepositoryLookupFailureCallback getLookupFailureCallback() {
198         return lookupFailureCallback;
199     }
200
201     /* (non-Javadoc)
202      * @see edu.umd.cs.findbugs.ba.AnalysisContext#getNullnessAnnotationDatabase()
203      */

204     @Override JavaDoc
205     public NullnessAnnotationDatabase getNullnessAnnotationDatabase() {
206         return getDatabase(NullnessAnnotationDatabase.class);
207     }
208
209     /* (non-Javadoc)
210      * @see edu.umd.cs.findbugs.ba.AnalysisContext#getSourceFinder()
211      */

212     @Override JavaDoc
213     public SourceFinder getSourceFinder() {
214         return getDatabase(SourceFinder.class);
215     }
216
217     /* (non-Javadoc)
218      * @see edu.umd.cs.findbugs.ba.AnalysisContext#getSourceInfoMap()
219      */

220     @Override JavaDoc
221     public SourceInfoMap getSourceInfoMap() {
222         return getDatabase(SourceInfoMap.class);
223     }
224
225     /* (non-Javadoc)
226      * @see edu.umd.cs.findbugs.ba.AnalysisContext#getSubtypes()
227      */

228     @Override JavaDoc
229     public Subtypes getSubtypes() {
230         return getDatabase(Subtypes.class);
231     }
232
233     /* (non-Javadoc)
234      * @see edu.umd.cs.findbugs.ba.AnalysisContext#getUnconditionalDerefParamDatabase()
235      */

236     @Override JavaDoc
237     public ParameterNullnessPropertyDatabase getUnconditionalDerefParamDatabase() {
238         return getDatabase(ParameterNullnessPropertyDatabase.class);
239     }
240
241     /* (non-Javadoc)
242      * @see edu.umd.cs.findbugs.ba.AnalysisContext#initDatabases()
243      */

244     @Override JavaDoc
245     public void initDatabases() {
246         // Databases are created on-demand - don't need to explicitly create them
247
}
248
249     /* (non-Javadoc)
250      * @see edu.umd.cs.findbugs.ba.AnalysisContext#lookupClass(java.lang.String)
251      */

252     @Override JavaDoc
253     public JavaClass lookupClass(String JavaDoc className)
254             throws ClassNotFoundException JavaDoc {
255         try {
256             if (!ClassName.isValidClassName(className)) {
257                 throw new ClassNotFoundException JavaDoc("Invalid class name: " + className);
258             }
259             return Global.getAnalysisCache().getClassAnalysis(
260                     JavaClass.class, new ClassDescriptor(ClassName.toSlashedClassName(className)));
261         } catch (CheckedAnalysisException e) {
262             throw new ClassNotFoundException JavaDoc("Class not found: " + className, e);
263         }
264     }
265
266     /* (non-Javadoc)
267      * @see edu.umd.cs.findbugs.ba.AnalysisContext#getInnerClassAccessMap()
268      */

269     @Override JavaDoc
270     public InnerClassAccessMap getInnerClassAccessMap() {
271         return getDatabase(InnerClassAccessMap.class);
272     }
273
274     /**
275      * Helper method to get a database
276      * without having to worry about a
277      * CheckedAnalysisException.
278      *
279      * @param cls Class of the database to get
280      * @return the database
281      */

282     private<E> E getDatabase(Class JavaDoc<E> cls) {
283         try {
284             return Global.getAnalysisCache().getDatabase(cls);
285         } catch (CheckedAnalysisException e) {
286             throw new IllegalStateException JavaDoc("Could not get database " + cls.getName(), e);
287         }
288     }
289
290     /**
291      * Set the collection of class descriptors identifying all
292      * application classes.
293      *
294      * @param appClassCollection List of ClassDescriptors identifying application classes
295      */

296     public void setAppClassList(List JavaDoc<ClassDescriptor> appClassCollection) throws CheckedAnalysisException {
297         
298         // FIXME: we really should drive the progress callback here
299

300         Subtypes subtypes = getSubtypes();
301         
302         for (ClassDescriptor appClass : appClassCollection) {
303             try {
304                 JavaClass jclass =
305                     Global.getAnalysisCache().getClassAnalysis(JavaClass.class, appClass);
306                 subtypes.addApplicationClass(jclass);
307             } catch (ClassFormatException e) {
308                 Global.getAnalysisCache().getErrorLogger().logError(
309                         "Error parsing application class " + appClass, e);
310             }
311         }
312         
313     }
314
315     /* (non-Javadoc)
316      * @see edu.umd.cs.findbugs.ba.AnalysisContext#updateDatabases(int)
317      */

318     @Override JavaDoc
319     public void updateDatabases(int pass) {
320         if (pass == 0) {
321             getCheckReturnAnnotationDatabase().loadAuxiliaryAnnotations();
322             getNullnessAnnotationDatabase().loadAuxiliaryAnnotations();
323         }
324         
325     }
326
327     
328
329 }
330
Popular Tags