/*
 * 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 javax.annotation.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);
}
