/** * BSD-style license; for more info see http://pmd.sourceforge.net/license.html */ package net.sourceforge.pmd.lang.rule.properties; import java.lang.reflect.Method; import java.util.Map; import net.sourceforge.pmd.PropertyDescriptorFactory; import net.sourceforge.pmd.lang.rule.properties.factories.BasicPropertyDescriptorFactory; import net.sourceforge.pmd.util.StringUtil; /** * Defines a property type that can specify multiple methods to use as part of a * rule. * * Rule developers can limit the rules to those within designated packages per * the 'legalPackages' argument in the constructor which can be an array of * partial package names, i.e., ["java.lang", "com.mycompany" ]. * * @author Brian Remedios */ public class MethodMultiProperty extends AbstractMultiPackagedProperty<Method[]> { public static final PropertyDescriptorFactory FACTORY = new BasicPropertyDescriptorFactory<MethodMultiProperty>( Method[].class, PACKAGED_FIELD_TYPES_BY_KEY) { @Override public MethodMultiProperty createWith(Map<String, String> valuesById) { char delimiter = delimiterIn(valuesById); return new MethodMultiProperty(nameIn(valuesById), descriptionIn(valuesById), defaultValueIn(valuesById), legalPackageNamesIn(valuesById, delimiter), 0f); } }; /** * Constructor for MethodProperty. * * @param theName * String * @param theDescription * String * @param theDefaults * Method[] * @param legalPackageNames * String[] * @param theUIOrder * float * @throws IllegalArgumentException */ public MethodMultiProperty(String theName, String theDescription, Method[] theDefaults, String[] legalPackageNames, float theUIOrder) { super(theName, theDescription, theDefaults, legalPackageNames, theUIOrder); } /** * Constructor for MethodProperty. * * @param theName * String * @param theDescription * String * @param methodDefaults * String * @param legalPackageNames * String[] * @param theUIOrder * float * @throws IllegalArgumentException */ public MethodMultiProperty(String theName, String theDescription, String methodDefaults, String[] legalPackageNames, float theUIOrder) { super(theName, theDescription, methodsFrom(methodDefaults), legalPackageNames, theUIOrder); } public MethodMultiProperty(String theName, String theDescription, String methodDefaults, Map<String, String> otherParams, float theUIOrder) { this(theName, theDescription, methodsFrom(methodDefaults), packageNamesIn(otherParams), theUIOrder); } /** * @param methodsStr * String * @return Method[] */ public static Method[] methodsFrom(String methodsStr) { String[] values = StringUtil.substringsOf(methodsStr, DELIMITER); Method[] methods = new Method[values.length]; for (int i = 0; i < methods.length; i++) { methods[i] = MethodProperty.methodFrom(values[i], MethodProperty.CLASS_METHOD_DELIMITER, MethodProperty.METHOD_ARG_DELIMITER); } return methods; } /** * Return the value as a string that can be easily recognized and parsed * when we see it again. * * @param value * Object * @return String */ @Override protected String asString(Object value) { return value == null ? "" : MethodProperty.asStringFor((Method) value); } /** * @param item * Object * @return String */ @Override protected String packageNameOf(Object item) { final Method method = (Method) item; return method.getDeclaringClass().getName() + '.' + method.getName(); } /** * @return String */ @Override protected String itemTypeName() { return "method"; } /** * * @return Class * @see net.sourceforge.pmd.PropertyDescriptor#type() */ @Override public Class<Method[]> type() { return Method[].class; } /** * @param valueString * String * @return Object * @throws IllegalArgumentException * @see net.sourceforge.pmd.PropertyDescriptor#valueFrom(String) */ @Override public Method[] valueFrom(String valueString) throws IllegalArgumentException { return methodsFrom(valueString); } }