1 package net.sourceforge.pmd.properties; 2 3 import net.sourceforge.pmd.util.StringUtil; 4 5 /** 6 * Defines a datatype that supports String values. 7 * When capturing multiple values, all strings must be filtered by the delimiter character. 8 * 9 * @author Brian Remedios 10 * @version $Revision$ 11 */ 12 public class StringProperty extends AbstractPMDProperty { 13 14 private int preferredRowCount; 15 16 public static final char defaultDelimiter = '|'; 17 18 /** 19 * Constructor for StringProperty. 20 * @param theName String 21 * @param theDescription String 22 * @param theDefaultValue String 23 * @param theUIOrder float 24 */ 25 public StringProperty(String theName, String theDescription, String theDefaultValue, float theUIOrder) { 26 this(theName, theDescription, theDefaultValue, theUIOrder, defaultDelimiter); 27 28 maxValueCount(1); 29 } 30 31 /** 32 * Constructor for StringProperty. 33 * @param theName String 34 * @param theDescription String 35 * @param theValues String[] 36 * @param theUIOrder float 37 * @param aMultiValueDelimiter String 38 */ 39 public StringProperty(String theName, String theDescription, String[] theValues, float theUIOrder, char aMultiValueDelimiter) { 40 super(theName, theDescription, theValues, theUIOrder); 41 42 maxValueCount(Integer.MAX_VALUE); 43 multiValueDelimiter(aMultiValueDelimiter); 44 } 45 46 /** 47 * Constructor for StringProperty. 48 * @param theName String 49 * @param theDescription String 50 * @param theDefaultValue Object 51 * @param theUIOrder float 52 * @param aMultiValueDelimiter String 53 */ 54 protected StringProperty(String theName, String theDescription, Object theDefaultValue, float theUIOrder, char aMultiValueDelimiter) { 55 super(theName, theDescription, theDefaultValue, theUIOrder); 56 57 maxValueCount(Integer.MAX_VALUE); 58 multiValueDelimiter(aMultiValueDelimiter); 59 } 60 61 /** 62 * Method type. 63 * @return Class 64 * @see net.sourceforge.pmd.PropertyDescriptor#type() 65 */ 66 public Class<?> type() { 67 return String.class; 68 } 69 70 /** 71 * Method valueFrom. 72 * @param valueString String 73 * @return Object 74 * @see net.sourceforge.pmd.PropertyDescriptor#valueFrom(String) 75 */ 76 public Object valueFrom(String valueString) { 77 78 if (maxValueCount() == 1) return valueString; 79 80 return StringUtil.substringsOf(valueString, multiValueDelimiter); 81 } 82 83 /** 84 * Method containsDelimiter. 85 * @param value String 86 * @return boolean 87 */ 88 private boolean containsDelimiter(String value) { 89 return value.indexOf(multiValueDelimiter) >= 0; 90 } 91 92 private final String illegalCharMsg() { 93 return "Value cannot contain the \"" + multiValueDelimiter + "\" character"; 94 } 95 96 /** 97 * 98 * @param value Object 99 * @return String 100 */ 101 protected String valueErrorFor(Object value) { 102 103 if (maxValueCount() == 1) { 104 String testValue = (String)value; 105 if (!containsDelimiter(testValue)) return null; 106 return illegalCharMsg(); 107 } 108 109 String[] values = (String[])value; 110 for (int i=0; i<values.length; i++) { 111 if (!containsDelimiter(values[i])) continue; 112 return illegalCharMsg(); 113 } 114 115 return null; 116 } 117 118 public int preferredRowCount() { 119 return preferredRowCount; 120 } 121 }