/*
* FindBugs - Find bugs in Java programs
* Copyright (C) 2008, 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.obl;
import java.util.Arrays;
import java.util.Collection;
import org.apache.bcel.generic.ReferenceType;
import edu.umd.cs.findbugs.ba.XMethod;
import edu.umd.cs.findbugs.classfile.MethodDescriptor;
import edu.umd.cs.findbugs.util.ExactStringMatcher;
import edu.umd.cs.findbugs.util.StringMatcher;
import edu.umd.cs.findbugs.util.SubtypeTypeMatcher;
import edu.umd.cs.findbugs.util.TypeMatcher;
/**
* An ObligationPolicyDatabaseEntry which creates or deletes
* an obligation based on a call to a specified method.
*
* @author David Hovemeyer
*/
public class MatchMethodEntry implements ObligationPolicyDatabaseEntry {
private final TypeMatcher receiverType;
private final StringMatcher methodName;
private final StringMatcher signature;
private final boolean isStatic;
private final ObligationPolicyDatabaseActionType action;
private final Obligation [] obligations;
private final ObligationPolicyDatabaseEntryType entryType;
/**
* Constructor.
* Creates an entry which matches the given XMethod.
*
* @param xmethod an XMethod
* @param action ActionType (ADD or DEL, depending on whether obligation is added or deleted)
* @param entryType entry type
* @param obligations Obligation to be added or deleted
*/
public MatchMethodEntry(
XMethod xmethod,
ObligationPolicyDatabaseActionType action,
ObligationPolicyDatabaseEntryType entryType,
Obligation... obligations) {
this(
new SubtypeTypeMatcher(xmethod.getClassDescriptor()),
new ExactStringMatcher(xmethod.getName()),
new ExactStringMatcher(xmethod.getSignature()),
xmethod.isStatic(),
action, entryType, obligations);
}
public MatchMethodEntry(
MethodDescriptor method,
ObligationPolicyDatabaseActionType action,
ObligationPolicyDatabaseEntryType entryType,
Obligation... obligations) {
this(
new SubtypeTypeMatcher(method.getClassDescriptor()),
new ExactStringMatcher(method.getName()),
new ExactStringMatcher(method.getSignature()),
method.isStatic(),
action, entryType, obligations);
}
/**
* Constructor.
*
* @param receiverType TypeMatcher to match the receiver type (or class containing static method)
* @param methodName StringMatcher to match name of called method
* @param signature StringMatcher to match signature of called method
* @param isStatic true if matched method must be static, false otherwise
* @param action ActionType (ADD or DEL, depending on whether obligation is added or deleted)
* @param entryType entry type
* @param obligations Obligation to be added or deleted
*/
public MatchMethodEntry(
TypeMatcher receiverType,
StringMatcher methodName, StringMatcher signature,
boolean isStatic,
ObligationPolicyDatabaseActionType action,
ObligationPolicyDatabaseEntryType entryType,
Obligation... obligations) {
this.receiverType = receiverType;
this.methodName = methodName;
this.signature = signature;
this.isStatic = isStatic;
this.action = action;
this.obligations = obligations;
this.entryType = entryType;
}
public ObligationPolicyDatabaseEntryType getEntryType() {
return entryType;
}
public boolean getActions(
ReferenceType receiverType,
String methodName,
String signature,
boolean isStatic,
Collection<ObligationPolicyDatabaseAction> actionList) {
if (this.methodName.matches(methodName)
&& this.signature.matches(signature)
&& this.isStatic == isStatic
&& this.receiverType.matches(receiverType)
) {
for(Obligation o : obligations)
actionList.add(new ObligationPolicyDatabaseAction(action, o));
return true;
}
return false;
}
@Override
public String toString() {
return "(" + receiverType + "," + methodName + "," + signature + "," + isStatic + "," + action + "," + Arrays.asList(obligations) + "," + entryType + ")";
}
}