/*
* Bytecode Analysis Framework
* Copyright (C) 2003-2005 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 org.apache.bcel.generic.ConstantPoolGen;
import org.apache.bcel.generic.InstructionHandle;
/**
* A ResourceTracker is used with ResourceValueAnalysis to determine where in a
* method a certain kind of resource is created, and to model the effect of
* instructions on the state of that resource.
*
* @author David Hovemeyer
* @see ResourceValueAnalysis
*/
public interface ResourceTracker<Resource> {
/**
* Determine if the given instruction is the site where a resource is
* created.
*
* @param basicBlock
* basic block containing the instruction
* @param handle
* the instruction
* @param cpg
* the ConstantPoolGen for the method
* @return an opaque Resource object if it is a creation site, or null if it
* is not a creation site
*/
public Resource isResourceCreation(BasicBlock basicBlock, InstructionHandle handle, ConstantPoolGen cpg)
throws DataflowAnalysisException;
/**
* Determine if the given instruction is the site where a resource is
* closed.
*
* @param basicBlock
* basic block containing the instruction
* @param handle
* the instruction
* @param cpg
* the ConstantPoolGen for the method
* @param resource
* the resource, as returned by isResourceCreation()
* @param frame
* the ResourceValueFrame representing the stack prior to
* executing the instruction
* @return true if the resource is closed here, false otherwise
*/
public boolean isResourceClose(BasicBlock basicBlock, InstructionHandle handle, ConstantPoolGen cpg, Resource resource,
ResourceValueFrame frame) throws DataflowAnalysisException;
/**
* Determine if the given instruction is the site where a resource is
* closed.
*
* @param basicBlock
* basic block containing the instruction
* @param handle
* the instruction
* @param cpg
* the ConstantPoolGen for the method
* @param resource
* the resource, as returned by isResourceCreation()
* @param frame
* the ResourceValueFrame representing the stack prior to
* executing the instruction
* @return true if the resource is closed here, false otherwise
*/
public boolean mightCloseResource(BasicBlock basicBlock, InstructionHandle handle, ConstantPoolGen cpg)
throws DataflowAnalysisException;
/**
* Create a ResourceValueFrameModelingVisitor to model the effect of
* instructions on the state of the resource.
*
* @param resource
* the resource we are tracking
* @param cpg
* the ConstantPoolGen of the method
* @return a ResourceValueFrameModelingVisitor
*/
public ResourceValueFrameModelingVisitor createVisitor(Resource resource, ConstantPoolGen cpg);
/**
* Determine whether the analysis should ignore exception edges on which
* only implicit exceptions are propagated. This allows different resource
* types to be tracked with varying precision. For example, we might want to
* ignore implicit exceptions for stream objects, but treat them as
* significant for database resources.
*
* @param resource
* the resource being tracked
* @return true if implicit exceptions are significant, false if they should
* be ignore
*/
public boolean ignoreImplicitExceptions(Resource resource);
/**
* Determine whether the analysis should ignore given exception edge. This
* allows the analysis to customize which kinds of exceptions are
* significant.
*
* @param edge
* the exception edge
* @param resource
* the resource
* @param cpg
* the ConstantPoolGen
* @return true if exception edge should be ignored, false if it should be
* considered
*/
public boolean ignoreExceptionEdge(Edge edge, Resource resource, ConstantPoolGen cpg);
/**
* Return if the given parameter slot contains the resource instance upon
* entry to the method. This is for resources passed as parameters.
*
* @param resource
* the resource
* @param slot
* the local variable slot
* @return true if the slot contains the resource instance, false otherwise
*/
public boolean isParamInstance(Resource resource, int slot);
}
// vim:ts=4