/*
 * 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;

import edu.umd.cs.findbugs.annotations.CheckForNull;
import edu.umd.cs.findbugs.internalAnnotations.DottedClassName;

/**
 * Interface for querying nullness annotations on methods, fields,
 * and parameters.
 * 
 * @author David Hovemeyer
 */
public interface INullnessAnnotationDatabase {

	/**
	 * Determine whether given parameter must be non-null.
	 * 
	 * @param m      a method
	 * @param param  parameter (0 == first parameter)
	 * @return true if the parameter must be non-null, false otherwise
	 */
	public abstract boolean parameterMustBeNonNull(XMethod m, int param);

	/**
	 * Get a resolved NullnessAnnotation on given XMethod, XField, or XMethodParameter.
	 * 
	 * @param o          an XMethod, XField, or XMethodParameter
	 * @param getMinimal TODO: what does this mean?
	 * @return resolved NullnessAnnotation
	 */
	@CheckForNull
	public abstract NullnessAnnotation getResolvedAnnotation(final Object o, boolean getMinimal);

	/**
	 * Load "built-in" annotations that might not be evident from the
	 * analyzed/referenced code.
	 */
	public void loadAuxiliaryAnnotations();
	
//	/**
//	 * Add a default nullness annotation to the database.
//	 * 
//	 * @param cName      class name (FIXME: is this right?)
//	 * @param annotation the default NullnessAnnotation
//	 */
//	public void addDefaultMethodAnnotation(String cName, NullnessAnnotation annotation);
	
	/**
	 * Add a field annotation to the database.
	 * 
	 * @param cName        dotted class name
	 * @param mName        field name
	 * @param mSig         field signature
	 * @param isStatic     true if field is static, false otherwise
	 * @param annotation   NullnessAnnotation to add
	 */
	public void addFieldAnnotation(@DottedClassName String cName, String mName, String mSig, boolean isStatic, NullnessAnnotation annotation);
	
	/**
	 * Add a method annotation to the database.
	 * 
	 * @param cName        dotted class name
	 * @param mName        method name
	 * @param mSig         method signature
	 * @param isStatic     true if method is static, false otherwise
	 * @param annotation   NullnessAnnotation to add
	 */
	public void addMethodAnnotation(@DottedClassName  String cName, String mName, String mSig, boolean isStatic, NullnessAnnotation annotation);

	/**
	 * Add a method parameter annotation to the database.
	 * 
	 * @param cName       dotted class name
	 * @param mName       method name
	 * @param mSig        method signature
	 * @param isStatic    true if method is static, false otherwise
	 * @param param       parameter (0 == first parameter)
	 * @param annotation  the NullnessAnnotation to add
	 */
	public void addMethodParameterAnnotation(@DottedClassName String cName, String mName, String mSig, boolean isStatic, int param, NullnessAnnotation annotation);
	
	/**
	 * Add a default annotation to the database.
	 * 
	 * @param target one of AnnotationDatabase.METHOD, AnnotationDatabase.FIELD, AnnotationDatabase.PARAMETER, or AnnotationDatabase.ANY
	 * @param c      dotted class name of class default annotation pertains to
	 * @param n      the default NullnessAnnotation
	 */
	public void addDefaultAnnotation(AnnotationDatabase.Target target, @DottedClassName String c, NullnessAnnotation n);
}
