/**
* BSD-style license; for more info see http://pmd.sourceforge.net/license.html
*/
package net.sourceforge.pmd.lang.rule.properties;
import java.util.Map;
import net.sourceforge.pmd.PropertyDescriptor;
import net.sourceforge.pmd.PropertyDescriptorFactory;
import net.sourceforge.pmd.lang.rule.properties.factories.BasicPropertyDescriptorFactory;
import net.sourceforge.pmd.util.StringUtil;
/**
* Defines a property that supports multiple class types, even for primitive
* values!
*
* TODO - untested for array types
*
* @author Brian Remedios
*/
public class TypeMultiProperty extends AbstractMultiPackagedProperty<Class[]> {
public static final PropertyDescriptorFactory FACTORY = new BasicPropertyDescriptorFactory<TypeMultiProperty>(
Class[].class, PACKAGED_FIELD_TYPES_BY_KEY) {
@Override
public TypeMultiProperty createWith(Map<String, String> valuesById) {
char delimiter = delimiterIn(valuesById);
return new TypeMultiProperty(nameIn(valuesById), descriptionIn(valuesById), defaultValueIn(valuesById),
legalPackageNamesIn(valuesById, delimiter), 0f);
}
};
/**
* Constructor for TypeProperty.
*
* @param theName
* String
* @param theDescription
* String
* @param theDefaults
* Class[]
* @param legalPackageNames
* String[]
* @param theUIOrder
* float
* @throws IllegalArgumentException
*/
public TypeMultiProperty(String theName, String theDescription, Class<?>[] theDefaults, String[] legalPackageNames,
float theUIOrder) {
super(theName, theDescription, theDefaults, legalPackageNames, theUIOrder);
}
/**
* Constructor for TypeProperty.
*
* @param theName
* String
* @param theDescription
* String
* @param theTypeDefaults
* String
* @param legalPackageNames
* String[]
* @param theUIOrder
* float
* @throws IllegalArgumentException
*/
public TypeMultiProperty(String theName, String theDescription, String theTypeDefaults, String[] legalPackageNames,
float theUIOrder) {
this(theName, theDescription, typesFrom(theTypeDefaults), legalPackageNames, theUIOrder);
}
public TypeMultiProperty(String theName, String theDescription, String theTypeDefaults,
Map<String, String> otherParams, float theUIOrder) {
this(theName, theDescription, typesFrom(theTypeDefaults), packageNamesIn(otherParams), theUIOrder);
}
/**
* @param classesStr
* String
* @return Class[]
*/
public static Class<?>[] typesFrom(String classesStr) {
String[] values = StringUtil.substringsOf(classesStr, DELIMITER);
Class<?>[] classes = new Class<?>[values.length];
for (int i = 0; i < values.length; i++) {
classes[i] = TypeProperty.classFrom(values[i]);
}
return classes;
}
/**
* @param item
* Object
* @return String
*/
@Override
protected String packageNameOf(Object item) {
return ((Class<?>) item).getName();
}
/**
* @return Class
* @see PropertyDescriptor#type()
*/
@Override
public Class<Class[]> type() {
return Class[].class;
}
/**
* @return String
*/
@Override
protected String itemTypeName() {
return "type";
}
/**
* @param value
* Object
* @return String
*/
@Override
protected String asString(Object value) {
return value == null ? "" : ((Class<?>) value).getName();
}
/**
* @param valueString
* String
* @return Object
* @see PropertyDescriptor#valueFrom(String)
*/
@Override
public Class<?>[] valueFrom(String valueString) {
return typesFrom(valueString);
}
}