/**
* BSD-style license; for more info see http://pmd.sourceforge.net/license.html
*/
package net.sourceforge.pmd.lang.rule.properties;
import net.sourceforge.pmd.util.StringUtil;
/**
* No, subclasses are not necessarily scalar per se, they're just easy to parse
* without error. If you can come up with a better name...
*
* @author Brian Remedios
* @param <T>
*/
public abstract class AbstractScalarProperty<T> extends AbstractProperty<T> {
/**
* Constructor for AbstractScalarProperty.
*
* @param theName
* String
* @param theDescription
* String
* @param theDefault
* Object
* @param theUIOrder
* float
*/
protected AbstractScalarProperty(String theName, String theDescription, T theDefault, float theUIOrder) {
super(theName, theDescription, theDefault, theUIOrder);
}
/**
* @param value
* String
* @return Object
*/
protected abstract Object createFrom(String value);
/**
* @param size
* int
* @return Object[]
*/
protected Object[] arrayFor(int size) {
if (isMultiValue()) {
throw new IllegalStateException(
"Subclass '" + this.getClass().getSimpleName() + "' must implement the arrayFor(int) method.");
}
throw new UnsupportedOperationException("Arrays not supported on single valued property descriptors.");
}
/**
* @param valueString
* String
* @return Object[]
* @throws IllegalArgumentException
* @see net.sourceforge.pmd.PropertyDescriptor#valueFrom(String)
*/
@Override
@SuppressWarnings("unchecked")
public T valueFrom(String valueString) throws IllegalArgumentException {
if (!isMultiValue()) {
return (T) createFrom(valueString);
}
String[] strValues = StringUtil.substringsOf(valueString, multiValueDelimiter());
Object[] values = arrayFor(strValues.length);
for (int i = 0; i < strValues.length; i++) {
values[i] = createFrom(strValues[i]);
}
return (T) values;
}
}