001 /**
002 * BSD-style license; for more info see http://pmd.sourceforge.net/license.html
003 */
004 package net.sourceforge.pmd.lang.rule.properties;
005
006 import java.util.Map;
007
008 import net.sourceforge.pmd.util.StringUtil;
009
010 /**
011 * Defines a datatype that supports multiple String values.
012 * Note that all strings must be filtered by the delimiter character.
013 *
014 * @author Brian Remedios
015 */
016 public class StringMultiProperty extends AbstractDelimitedProperty<String[]> {
017
018 public static final char DEFAULT_DELIMITER = '|';
019
020 /**
021 * Constructor for StringProperty.
022 * @param theName String
023 * @param theDescription String
024 * @param theDefaults String[]
025 * @param theUIOrder float
026 * @param delimiter String
027 * @throws IllegalArgumentException
028 */
029 public StringMultiProperty(String theName, String theDescription, String[] theDefaults, float theUIOrder, char delimiter) {
030 super(theName, theDescription, theDefaults, delimiter, theUIOrder);
031
032 checkDefaults(theDefaults, delimiter);
033 }
034
035 /**
036 * Constructor for CharacterProperty that accepts additional params from a map.
037 *
038 * @param theName
039 * @param theDescription
040 * @param theDefaults
041 * @param otherParams
042 */
043 public StringMultiProperty(String theName, String theDescription, String theDefaults, Map<String, String> otherParams) {
044 this(theName, theDescription, StringUtil.substringsOf(theDefaults, delimiterIn(otherParams)), 0.0f, delimiterIn(otherParams));
045 }
046
047 /**
048 * @param defaultValue
049 * @param delim
050 * @throws IllegalArgumentException
051 */
052 private static void checkDefaults(String[] defaultValue, char delim) {
053
054 if (defaultValue == null) { return; }
055
056 for (int i=0; i<defaultValue.length; i++) {
057 if (defaultValue[i].indexOf(delim) >= 0) {
058 throw new IllegalArgumentException("Cannot include the delimiter in the set of defaults");
059 }
060 }
061 }
062
063 /**
064 * @return Class
065 * @see net.sourceforge.pmd.PropertyDescriptor#type()
066 */
067 public Class<String[]> type() {
068 return String[].class;
069 }
070
071 /**
072 * @param valueString String
073 * @return Object
074 * @see net.sourceforge.pmd.PropertyDescriptor#valueFrom(String)
075 */
076 public String[] valueFrom(String valueString) {
077 return StringUtil.substringsOf(valueString, multiValueDelimiter());
078 }
079
080 /**
081 * @param value String
082 * @return boolean
083 */
084 private boolean containsDelimiter(String value) {
085 return value.indexOf(multiValueDelimiter()) >= 0;
086 }
087
088 /**
089 * @return String
090 */
091 private final String illegalCharMsg() {
092 return "Value cannot contain the '" + multiValueDelimiter() + "' character";
093 }
094
095 /**
096 *
097 * @param value Object
098 * @return String
099 */
100 protected String valueErrorFor(Object value) {
101
102 if (value==null) { return "missing value"; }
103
104 String testValue = (String)value;
105 if (containsDelimiter(testValue)) {
106 return illegalCharMsg();
107 }
108
109 // TODO - eval against regex checkers
110
111 return null;
112 }
113 }
|