/* * FindBugs - Find Bugs in Java programs * Copyright (C) 2003-2007 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.ba.jsr305; import java.util.LinkedList; import java.util.List; import javax.annotation.CheckForNull; import edu.umd.cs.findbugs.classfile.analysis.AnnotatedObject; /** * The result of looking up a TypeQualifierAnnotation. * Because type qualifiers are inherited, a full result of * looking resolving a TypeQualifierAnnotation * may include annotations on one or more supertypes. * Potentially, the supertype annotations may conflict with * each other, and/or conflict with the annotation on the annotated * entity. This object makes it possible to report * such conflicts, while still providing a convenient * interface for getting the "effective" TypeQualifierAnnotation. * * @author David Hovemeyer */ public class TypeQualifierAnnotationLookupResult { /** * Partial result of looking up a TypeQualifierAnnotation. */ public static class PartialResult { private AnnotatedObject annotatedObject; private TypeQualifierAnnotation typeQualifierAnnotation; PartialResult(AnnotatedObject annotatedObject, TypeQualifierAnnotation typeQualifierAnnotation) { this.annotatedObject = annotatedObject; this.typeQualifierAnnotation = typeQualifierAnnotation; } /** * @return Returns the annotatedObject. */ public AnnotatedObject getAnnotatedObject() { return annotatedObject; } /** * @return Returns the typeQualifierAnnotation. */ public TypeQualifierAnnotation getTypeQualifierAnnotation() { return typeQualifierAnnotation; } /* (non-Javadoc) * @see java.lang.Object#toString() */ @Override public String toString() { return annotatedObject + ":" + typeQualifierAnnotation; } } private List<PartialResult> partialResultList; TypeQualifierAnnotationLookupResult() { this.partialResultList = new LinkedList<PartialResult>(); } void addPartialResult(PartialResult partialResult) { partialResultList.add(partialResult); } /** * Get the effective TypeQualifierAnnotation. * * @return the effective TypeQualifierAnnotation, * or null if no effective TypeQualifierAnnotation * can be found */ public @CheckForNull TypeQualifierAnnotation getEffectiveTypeQualifierAnnotation() { boolean firstPartialResult = true; TypeQualifierAnnotation effective = null; for (PartialResult partialResult : partialResultList) { if (firstPartialResult) { effective = partialResult.getTypeQualifierAnnotation(); firstPartialResult = false; } else { effective = combine(effective, partialResult.getTypeQualifierAnnotation()); } } return effective; } /** * Subclasses must override this method to combine TypeQualifierAnnotations * found in multiple superclasses. * * @param a a TypeQualifierAnnotation * @param b another TypeQualifierAnnotation * @return combined TypeQualifierAnnotation compatible with both input TypeQualifierAnnotations, * or null if no such TypeQualifierAnnotation exists */ protected TypeQualifierAnnotation combine(TypeQualifierAnnotation a, TypeQualifierAnnotation b) { return null; } /* (non-Javadoc) * @see java.lang.Object#toString() */ @Override public String toString() { return partialResultList.toString(); } }