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

package edu.umd.cs.findbugs.detect;

import java.util.Map;

import org.apache.bcel.classfile.ElementValue;
import org.apache.bcel.classfile.JavaClass;

import edu.umd.cs.findbugs.BugReporter;
import edu.umd.cs.findbugs.Detector;
import edu.umd.cs.findbugs.NonReportingDetector;
import edu.umd.cs.findbugs.ba.AnalysisContext;
import edu.umd.cs.findbugs.ba.ClassContext;
import edu.umd.cs.findbugs.ba.ClassMember;
import edu.umd.cs.findbugs.ba.XFactory;
import edu.umd.cs.findbugs.bcel.BCELUtil;
import edu.umd.cs.findbugs.visitclass.AnnotationVisitor;

public class NoteJCIPAnnotation extends AnnotationVisitor implements Detector, NonReportingDetector {

    private static final String NET_JCIP_ANNOTATIONS = "net.jcip.annotations.";

    public NoteJCIPAnnotation(BugReporter bugReporter) {
    }

    @Override
    public void visitAnnotation(String annotationClass, Map<String, ElementValue> map, boolean runtimeVisible) {

        if (!annotationClass.startsWith(NET_JCIP_ANNOTATIONS)) {
            return;
        }
        annotationClass = annotationClass.substring(NET_JCIP_ANNOTATIONS.length());
        ElementValue value = map.get("value");
        ClassMember member;
        if (visitingField()) {
            member = XFactory.createXField(this);
        } else if (visitingMethod()) {
            member = XFactory.createXMethod(this);
        } else {
            AnalysisContext.currentAnalysisContext()
                    .getJCIPAnnotationDatabase().addEntryForClass(getDottedClassName(), annotationClass, value);
            return;
        }
        AnalysisContext.currentAnalysisContext().getJCIPAnnotationDatabase()
                .addEntryForClassMember(member, annotationClass, value);
    }

    public void visitClassContext(ClassContext classContext) {
        JavaClass javaClass = classContext.getJavaClass();
        if (!BCELUtil.preTiger(javaClass))
            javaClass.accept(this);

    }

    public void report() {
        // noop
    }

}

@@ -1239,24 +1239,78 @@
 lassMember;%0A
+import edu.umd.cs.findbugs.ba.JCIPAnnotationDatabase;%0A
 import edu.u
@@ -1619,16 +1619,112 @@
 tions.%22;
+%0A    private static final String JSR305_CONCURRENT_ANNOTATIONS = %22javax.annotation.concurrent.%22;
 %0A%0A    pu
@@ -1770,24 +1770,41 @@
 Reporter) %7B%0A
+        super();%0A
     %7D%0A%0A    @
@@ -1925,17 +1925,16 @@
 ible) %7B%0A
-%0A
         
@@ -1937,17 +1937,16 @@
     if (
-!
 annotati
@@ -2001,34 +2001,176 @@
         
-return;%0A        %7D%0A
+annotationClass = annotationClass.substring(NET_JCIP_ANNOTATIONS.length());%0A        %7D else if (annotationClass.startsWith(JSR305_CONCURRENT_ANNOTATIONS)) %7B%0A    
         
@@ -2209,32 +2209,41 @@
 s.substring(
-NET_JCIP
+JSR305_CONCURRENT
 _ANNOTATIONS
@@ -2246,32 +2246,214 @@
 IONS.length());%0A
+        %7D else %7B%0A            return;%0A        %7D%0A        JCIPAnnotationDatabase annotationDatabase = AnalysisContext.currentAnalysisContext()%0A            .getJCIPAnnotationDatabase();%0A
         ElementV
@@ -2715,78 +2715,9 @@
     
-AnalysisContext.currentAnalysisContext()%0A                    .getJCIPA
+a
 nnot
@@ -2729,18 +2729,16 @@
 Database
-()
 .addEntr
@@ -2836,93 +2836,26 @@
     
-AnalysisContext.currentAnalysisContext().getJCIPAnnotationDatabase()%0A                
+annotationDatabase
 .add
@@ -3078,16 +3078,18 @@
 aClass))
+ %7B
 %0A       
@@ -3116,16 +3116,26 @@
 t(this);
+%0A        %7D
 %0A%0A    %7D%0A

Patch 2888792 from Andrey Pavlenko: Support of the javax.annotation.concurrent.* annotations