/**
* 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.PropertyDescriptorFactory;
import net.sourceforge.pmd.lang.rule.properties.factories.BasicPropertyDescriptorFactory;
import net.sourceforge.pmd.util.StringUtil;
/**
* Defines a datatype that supports multiple String values. Note that all
* strings must be filtered by the delimiter character.
*
* @author Brian Remedios
*/
public class StringMultiProperty extends AbstractProperty<String[]> {
public static final PropertyDescriptorFactory FACTORY = new BasicPropertyDescriptorFactory<StringMultiProperty>(
String[].class) {
@Override
public StringMultiProperty createWith(Map<String, String> valuesById) {
char delimiter = delimiterIn(valuesById);
return new StringMultiProperty(nameIn(valuesById), descriptionIn(valuesById),
StringUtil.substringsOf(defaultValueIn(valuesById), delimiter), 0.0f, delimiter);
}
};
/**
* Constructor for StringProperty.
*
* @param theName
* String
* @param theDescription
* String
* @param theDefaults
* String[]
* @param theUIOrder
* float
* @param delimiter
* String
* @throws IllegalArgumentException
*/
public StringMultiProperty(String theName, String theDescription, String[] theDefaults, float theUIOrder,
char delimiter) {
super(theName, theDescription, theDefaults, theUIOrder, delimiter);
checkDefaults(theDefaults, delimiter);
}
/**
* @param defaultValue
* @param delim
* @throws IllegalArgumentException
*/
private static void checkDefaults(String[] defaultValue, char delim) {
if (defaultValue == null) {
return;
}
for (int i = 0; i < defaultValue.length; i++) {
if (defaultValue[i].indexOf(delim) >= 0) {
throw new IllegalArgumentException("Cannot include the delimiter in the set of defaults");
}
}
}
/**
* @return Class
* @see net.sourceforge.pmd.PropertyDescriptor#type()
*/
@Override
public Class<String[]> type() {
return String[].class;
}
/**
* @param valueString
* String
* @return Object
* @see net.sourceforge.pmd.PropertyDescriptor#valueFrom(String)
*/
@Override
public String[] valueFrom(String valueString) {
return StringUtil.substringsOf(valueString, multiValueDelimiter());
}
/**
* @param value
* String
* @return boolean
*/
private boolean containsDelimiter(String value) {
return value.indexOf(multiValueDelimiter()) >= 0;
}
/**
* @return String
*/
private String illegalCharMsg() {
return "Value cannot contain the '" + multiValueDelimiter() + "' character";
}
/**
*
* @param value
* Object
* @return String
*/
@Override
protected String valueErrorFor(Object value) {
if (value == null) {
return "missing value";
}
String testValue = (String) value;
if (containsDelimiter(testValue)) {
return illegalCharMsg();
}
// TODO - eval against regex checkers
return null;
}
/**
* @return boolean
* @see net.sourceforge.pmd.PropertyDescriptor#isMultiValue()
*/
@Override
public boolean isMultiValue() {
return true;
}
}