View Javadoc

    1   package net.sourceforge.pmd.properties;
    2
    3   import net.sourceforge.pmd.PropertyDescriptor;
    4   import net.sourceforge.pmd.Rule;
    5
    6
    7   /***
    8    *
    9    * @author Brian Remedios
    10   * @version $Revision$
    11   */
    12  public abstract class AbstractPMDProperty implements PropertyDescriptor {
    13
    14  	private String	name;
    15  	private String	description;
    16  	private Object 	defaultValue;
    17  	private boolean isRequired = false;
    18  	private int		maxValueCount = 1;
    19  	private float	uiOrder;
    20
    21  	protected char	multiValueDelimiter = '|';
    22
    23  	/***
    24  	 * Constructor for AbstractPMDProperty.
    25  	 * @param theName String
    26  	 * @param theDescription String
    27  	 * @param theDefault Object
    28  	 * @param theUIOrder float
    29  	 */
    30  	protected AbstractPMDProperty(String theName, String theDescription, Object theDefault, float theUIOrder) {
    31  		name = theName;
    32  		description = theDescription;
    33  		defaultValue = theDefault;
    34  		uiOrder = theUIOrder;
    35  	}
    36
    37  	/***
    38  	 * Method multiValueDelimiter.
    39  	 * @param aDelimiter char
    40  	 */
    41  	protected void multiValueDelimiter(char aDelimiter) {
    42  		multiValueDelimiter = aDelimiter;
    43  	}
    44
    45  	/***
    46  	 * Method multiValueDelimiter.
    47  	 * @return char
    48  	 * @see net.sourceforge.pmd.PropertyDescriptor#multiValueDelimiter()
    49  	 */
    50  	public char multiValueDelimiter() {
    51  		return multiValueDelimiter;
    52  	}
    53
    54  	/***
    55  	 * Method name.
    56  	 * @return String
    57  	 * @see net.sourceforge.pmd.PropertyDescriptor#name()
    58  	 */
    59  	public String name() {
    60  		return name;
    61  	}
    62
    63  	/***
    64  	 * Method description.
    65  	 * @return String
    66  	 * @see net.sourceforge.pmd.PropertyDescriptor#description()
    67  	 */
    68  	public String description() {
    69  		return description;
    70  	}
    71
    72  	/***
    73  	 *
    74  	 * @return Object
    75  	 * @see net.sourceforge.pmd.PropertyDescriptor#defaultValue()
    76  	 */
    77  	public Object defaultValue() {
    78  		return defaultValue;
    79  	}
    80
    81  	/***
    82  	 * Method maxValueCount.
    83  	 * @return int
    84  	 * @see net.sourceforge.pmd.PropertyDescriptor#maxValueCount()
    85  	 */
    86  	public int maxValueCount() {
    87  		return maxValueCount;
    88  	}
    89
    90  	/***
    91  	 * Method maxValueCount.
    92  	 * @param theCount int
    93  	 * @see net.sourceforge.pmd.PropertyDescriptor#maxValueCount()
    94  	 */
    95  	protected void maxValueCount(int theCount) {
    96  		maxValueCount = theCount;
    97  	}
    98
    99  	/***
    100 	 * Method isRequired.
    101 	 * @return boolean
    102 	 * @see net.sourceforge.pmd.PropertyDescriptor#isRequired()
    103 	 */
    104 	public boolean isRequired() {
    105 		return isRequired;
    106 	}
    107
    108 	/***
    109 	 * Method uiOrder.
    110 	 * @return float
    111 	 * @see net.sourceforge.pmd.PropertyDescriptor#uiOrder()
    112 	 */
    113 	public float uiOrder() {
    114 		return uiOrder;
    115 	}
    116
    117 	/***
    118 	 * Return the value as a string that can be easily recognized and parsed
    119 	 * when we see it again.
    120 	 *
    121 	 * @param value Object
    122 	 * @return String
    123 	 */
    124 	protected String asString(Object value) {
    125 		return value == null ? "" : value.toString();
    126 	}
    127
    128
    129 	/***
    130 	 * Method asDelimitedString.
    131 	 * @param values Object
    132 	 * @return String
    133 	 * @see net.sourceforge.pmd.PropertyDescriptor#asDelimitedString(Object)
    134 	 */
    135 	public String asDelimitedString(Object values) {
    136
    137 		if (values == null) return "";
    138
    139 		if (values instanceof Object[]) {
    140 			Object[] valueSet = (Object[])values;
    141 			if (valueSet.length == 0) return "";
    142 			if (valueSet.length == 1) return asString(valueSet[0]);
    143
    144 			StringBuffer sb = new StringBuffer();
    145 			sb.append(asString(valueSet[0]));
    146 			for (int i=1; i<valueSet.length; i++) {
    147 				sb.append(multiValueDelimiter);
    148 				sb.append(asString(valueSet[i]));
    149 			}
    150 			return sb.toString();
    151 			}
    152
    153 		return asString(values);
    154 	}
    155
    156 	/***
    157 	 * Method compareTo.
    158 	 * @param otherProperty Object
    159 	 * @return int
    160 	 * @see java.lang.Comparable#compareTo(Object)
    161 	 */
    162 	public int compareTo(Object otherProperty) {
    163 		float otherOrder = ((PropertyDescriptor)otherProperty).uiOrder();
    164 		return (int) (otherOrder - uiOrder);
    165 	}
    166
    167 	/***
    168 	 * Method errorFor.
    169 	 * @param value Object
    170 	 * @return String
    171 	 * @see net.sourceforge.pmd.PropertyDescriptor#errorFor(Object)
    172 	 */
    173 	public String errorFor(Object value) {
    174
    175 		String typeError = typeErrorFor(value);
    176 		if (typeError != null) return typeError;
    177 		return valueErrorFor(value);
    178 	}
    179
    180 	/***
    181 	 * Method valueErrorFor.
    182 	 * @param value Object
    183 	 * @return String
    184 	 */
    185 	protected String valueErrorFor(Object value) {
    186 		// override as required
    187 		return null;
    188 	}
    189
    190 	/***
    191 	 * Method isArray.
    192 	 * @param value Object
    193 	 * @return boolean
    194 	 */
    195 	protected boolean isArray(Object value) {
    196 		return value != null && value.getClass().getComponentType() != null;
    197 	}
    198
    199 	/***
    200 	 * Method typeErrorFor.
    201 	 * @param value Object
    202 	 * @return String
    203 	 */
    204 	protected String typeErrorFor(Object value) {
    205
    206 		if (value == null && !isRequired) return null;
    207
    208 		if (maxValueCount > 1) {
    209 			if (!isArray(value)) {
    210 				return "Value is not an array of type: " + type();
    211 			}
    212
    213 			Class arrayType = value.getClass().getComponentType();
    214 			if (arrayType == null || !arrayType.isAssignableFrom(type())) {
    215 				return "Value is not an array of type: " + type();
    216 			}
    217 			return null;
    218 		}
    219
    220 		if (!type().isAssignableFrom(value.getClass())) {
    221 			return "" + value + " is not an instance of " + type();
    222 		}
    223
    224 		return null;
    225 	}
    226
    227 	/***
    228 	 * Method propertyErrorFor.
    229 	 * @param rule Rule
    230 	 * @return String
    231 	 * @see net.sourceforge.pmd.PropertyDescriptor#propertyErrorFor(Rule)
    232 	 */
    233 	public String propertyErrorFor(Rule rule) {
    234 		String strValue = rule.getStringProperty(name());
    235 		if (strValue == null && !isRequired()) return null;
    236 		Object realValue = valueFrom(strValue);
    237 		return errorFor(realValue);
    238 	}
    239
    240 	/***
    241 	 * Method choices.
    242 	 * @return Object[][]
    243 	 * @see net.sourceforge.pmd.PropertyDescriptor#choices()
    244 	 */
    245 	public Object[][] choices() {
    246 		return null;
    247 	}
    248
    249 	/***
    250 	 * Method preferredRowCount.
    251 	 * @return int
    252 	 * @see net.sourceforge.pmd.PropertyDescriptor#preferredRowCount()
    253 	 */
    254 	public int preferredRowCount() {
    255 		return 1;
    256 	}
    257
    258 	/***
    259 	 * Method areEqual.
    260 	 * @param value Object
    261 	 * @param otherValue Object
    262 	 * @return boolean
    263 	 */
    264 	public static final boolean areEqual(Object value, Object otherValue) {
    265 		if (value == otherValue) return true;
    266 		if (value == null) return false;
    267 		if (otherValue == null) return false;
    268
    269 		return value.equals(otherValue);
    270 	}
    271 }