/* * 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 + ")"; } }