KickJava   Java API By Example, From Geeks To Geeks.

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


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.ba;
21
22 import org.apache.bcel.Repository;
23 import org.apache.bcel.classfile.JavaClass;
24
25 /**
26  * @author pugh
27  */

28 public class CheckReturnAnnotationDatabase extends AnnotationDatabase<CheckReturnValueAnnotation> {
29     
30     private JavaClass throwableClass, threadClass;
31     public CheckReturnAnnotationDatabase() {
32         setAddClassOnly(true);
33         loadAuxiliaryAnnotations();
34         setAddClassOnly(false);
35         }
36
37     @Override JavaDoc
38     public void loadAuxiliaryAnnotations() {
39         boolean missingClassWarningsSuppressed = AnalysisContext.currentAnalysisContext().setMissingClassWarningsSuppressed(true);
40         
41         addMethodAnnotation("java.util.Iterator","hasNext", "()Z", false, CheckReturnValueAnnotation.CHECK_RETURN_VALUE_MEDIUM);
42         addMethodAnnotation("java.io.File","createNewFile", "()Z", false, CheckReturnValueAnnotation.CHECK_RETURN_VALUE_LOW);
43         addMethodAnnotation("java.io.DataInputStream","skipBytes", "(I)I", false, CheckReturnValueAnnotation.CHECK_RETURN_VALUE_MEDIUM);
44         addMethodAnnotation("java.util.Enumeration","hasMoreElements", "()Z", false, CheckReturnValueAnnotation.CHECK_RETURN_VALUE_MEDIUM);
45         addMethodAnnotation("java.security.MessageDigest","digest", "([B)[B", false, CheckReturnValueAnnotation.CHECK_RETURN_VALUE_MEDIUM);
46         
47         addMethodAnnotation("java.util.concurrent.locks.ReadWriteLock","readLock", "()Ljava/util/concurrent/locks/Lock;", false, CheckReturnValueAnnotation.CHECK_RETURN_VALUE_HIGH);
48         addMethodAnnotation("java.util.concurrent.locks.ReadWriteLock","writeLock", "()Ljava/util/concurrent/locks/Lock;", false, CheckReturnValueAnnotation.CHECK_RETURN_VALUE_HIGH);
49         addMethodAnnotation("java.util.concurrent.locks.Condition", "await", "(JLjava/util/concurrent/TimeUnit;)Z", false, CheckReturnValueAnnotation.CHECK_RETURN_VALUE_MEDIUM);
50         addMethodAnnotation("java.util.concurrent.locks.Condition", "awaitUtil", "(Ljava/util/Date;)Z", false, CheckReturnValueAnnotation.CHECK_RETURN_VALUE_MEDIUM);
51         addMethodAnnotation("java.util.concurrent.locks.Condition", "awaitNanos", "(J)Z", false, CheckReturnValueAnnotation.CHECK_RETURN_VALUE_MEDIUM);
52         addMethodAnnotation("java.util.concurrent.Semaphore", "tryAcquire", "(JLjava/util/concurrent/TimeUnit;)Z", false, CheckReturnValueAnnotation.CHECK_RETURN_VALUE_HIGH);
53         addMethodAnnotation("java.util.concurrent.Semaphore", "tryAcquire", "()Z", false, CheckReturnValueAnnotation.CHECK_RETURN_VALUE_HIGH);
54         addMethodAnnotation("java.util.concurrent.locks.Lock", "tryLock", "(JLjava/util/concurrent/TimeUnit;)Z", false, CheckReturnValueAnnotation.CHECK_RETURN_VALUE_HIGH);
55         addMethodAnnotation("java.util.concurrent.locks.Lock", "newCondition","()Ljava/util/concurrent/locks/Condition;", false, CheckReturnValueAnnotation.CHECK_RETURN_VALUE_HIGH);
56         addMethodAnnotation("java.util.concurrent.locks.Lock", "tryLock", "()Z", false, CheckReturnValueAnnotation.CHECK_RETURN_VALUE_HIGH);
57         addMethodAnnotation("java.util.concurrent.BlockingQueue", "offer", "(Ljava/lang/Object;JLjava/util/concurrent/TimeUnit;)Z", false, CheckReturnValueAnnotation.CHECK_RETURN_VALUE_MEDIUM);
58         
59         addMethodAnnotation("java.util.ConcurrentLinkedQueue", "offer", "(Ljava/lang/Object;)Z", false, CheckReturnValueAnnotation.CHECK_RETURN_VALUE_IGNORE);
60         addMethodAnnotation("java.util.DelayQueue", "offer", "(Ljava/lang/Object;)Z", false, CheckReturnValueAnnotation.CHECK_RETURN_VALUE_IGNORE);
61         addMethodAnnotation("java.util.LinkedBlockingQueue", "offer", "(Ljava/lang/Object;)Z", false, CheckReturnValueAnnotation.CHECK_RETURN_VALUE_LOW);
62         addMethodAnnotation("java.util.LinkedList", "offer", "(Ljava/lang/Object;)Z", false, CheckReturnValueAnnotation.CHECK_RETURN_VALUE_IGNORE);
63         addMethodAnnotation("java.util.Queue", "offer", "(Ljava/lang/Object;)Z", false, CheckReturnValueAnnotation.CHECK_RETURN_VALUE_LOW);
64         addMethodAnnotation("java.util.ArrayBlockingQueue", "offer", "(Ljava/lang/Object;)Z", false, CheckReturnValueAnnotation.CHECK_RETURN_VALUE_MEDIUM);
65         addMethodAnnotation("java.util.SynchronousQueue", "offer", "(Ljava/lang/Object;)Z", false, CheckReturnValueAnnotation.CHECK_RETURN_VALUE_MEDIUM);
66         addMethodAnnotation("java.util.PriorityQueue", "offer", "(Ljava/lang/Object;)Z", false, CheckReturnValueAnnotation.CHECK_RETURN_VALUE_IGNORE);
67         addMethodAnnotation("java.util.PriorityBlockingQueue", "offer", "(Ljava/lang/Object;)Z", false, CheckReturnValueAnnotation.CHECK_RETURN_VALUE_IGNORE);
68         
69         
70         addMethodAnnotation("java.util.concurrent.BlockingQueue", "poll", "(JLjava/util/concurrent/TimeUnit;)Ljava/lang/Object;", false, CheckReturnValueAnnotation.CHECK_RETURN_VALUE_MEDIUM);
71         addMethodAnnotation("java.util.Queue", "poll", "()Ljava/lang/Object;", false, CheckReturnValueAnnotation.CHECK_RETURN_VALUE_MEDIUM);
72             
73         addDefaultMethodAnnotation("java.lang.String", CheckReturnValueAnnotation.CHECK_RETURN_VALUE_HIGH);
74         addMethodAnnotation("java.lang.String", "getBytes", "(Ljava/lang/String;)[B", false, CheckReturnValueAnnotation.CHECK_RETURN_VALUE_IGNORE);
75         addMethodAnnotation("java.lang.String", "<init>", "([BLjava/lang/String;)V", false, CheckReturnValueAnnotation.CHECK_RETURN_VALUE_IGNORE);
76         addDefaultMethodAnnotation("java.math.BigDecimal", CheckReturnValueAnnotation.CHECK_RETURN_VALUE_HIGH);
77         addMethodAnnotation("java.math.BigDecimal", "inflate", "()Ljava/math/BigDecimal;", false, CheckReturnValueAnnotation.CHECK_RETURN_VALUE_IGNORE);
78         addDefaultMethodAnnotation("java.math.BigInteger", CheckReturnValueAnnotation.CHECK_RETURN_VALUE_HIGH);
79         addMethodAnnotation("java.math.BigInteger", "addOne", "([IIII)I", true, CheckReturnValueAnnotation.CHECK_RETURN_VALUE_IGNORE);
80         addMethodAnnotation("java.math.BigInteger", "subN", "([I[II)I", true, CheckReturnValueAnnotation.CHECK_RETURN_VALUE_IGNORE);
81         addDefaultMethodAnnotation("java.sql.Connection", CheckReturnValueAnnotation.CHECK_RETURN_VALUE_HIGH);
82         addDefaultMethodAnnotation("java.net.InetAddress", CheckReturnValueAnnotation.CHECK_RETURN_VALUE_MEDIUM);
83         AnalysisContext.currentAnalysisContext().setMissingClassWarningsSuppressed(missingClassWarningsSuppressed);
84         
85         try {
86             throwableClass = Repository.lookupClass("java.lang.Throwable");
87         } catch (ClassNotFoundException JavaDoc e) {
88             AnalysisContext.reportMissingClass(e);
89         }
90         try {
91             threadClass = Repository.lookupClass("java.lang.Thread");
92         } catch (ClassNotFoundException JavaDoc e) {
93             AnalysisContext.reportMissingClass(e);
94         }
95     }
96     
97      @Override JavaDoc
98     public CheckReturnValueAnnotation getResolvedAnnotation(Object JavaDoc o, boolean getMinimal) {
99         if (!(o instanceof XMethod))
100             return null;
101         XMethod m = (XMethod) o;
102         if (m.getName().startsWith("access$")) return null;
103         else if (m.getName().equals("<init>")) {
104             try {
105                 if (throwableClass != null && Repository.instanceOf(m.getClassName(), throwableClass))
106                     return CheckReturnValueAnnotation.CHECK_RETURN_VALUE_VERY_HIGH;
107             } catch (ClassNotFoundException JavaDoc e) {
108                 AnalysisContext.reportMissingClass(e);
109             }
110             if (m.getClassName().equals("java.lang.Thread"))
111                 return CheckReturnValueAnnotation.CHECK_RETURN_VALUE_VERY_HIGH;
112             try {
113             
114                 if (threadClass != null && Repository.instanceOf(m.getClassName(), threadClass))
115                     return CheckReturnValueAnnotation.CHECK_RETURN_VALUE_HIGH;
116             } catch (ClassNotFoundException JavaDoc e) {
117                 AnalysisContext.reportMissingClass(e);
118             }
119         } else if (m.getName().equals("equals") && m.getSignature().equals("(Ljava/lang/Object;)Z")
120                 && !m.isStatic())
121             return CheckReturnValueAnnotation.CHECK_RETURN_VALUE_MEDIUM;
122         else if (m.getSignature().endsWith(")Ljava/lang/String;")
123                 && (m.getClassName().equals("java.lang.StringBuffer") || m.getClassName().equals(
124                         "java.lang.StringBuilder")))
125             return CheckReturnValueAnnotation.CHECK_RETURN_VALUE_MEDIUM;
126         return super.getResolvedAnnotation(o, getMinimal);
127     }
128
129 }
130
Popular Tags