1 package net.sourceforge.pmd;
2
3
4 /***
5 * Property value descriptor that defines the use & requirements for setting
6 * property values for use within PMD and any associated GUIs.
7 *
8 * @author Brian Remedios
9 * @version $Revision$
10 */
11 public interface PropertyDescriptor extends Comparable {
12
13 PropertyDescriptor[] emptyPropertySet = new PropertyDescriptor[0];
14
15 /***
16 * The name of the property without spaces as it serves
17 * as the key into the property map.
18 *
19 * @return String
20 */
21 String name();
22 /***
23 * Describes the property and the role it plays within the
24 * rule it is specified for. Could be used in a tooltip.
25 *
26 * @return String
27 */
28 String description();
29 /***
30 * Denotes the value datatype.
31 * @return Class
32 */
33 Class type();
34 /***
35 * If the property is multi-valued, i.e. an array of strings, then this
36 * returns the maximum number permitted. Unary property rule properties
37 * normally return a value of one.
38 *
39 * @return int
40 */
41 int maxValueCount();
42 /***
43 * Default value to use when the user hasn't specified one or when they wish
44 * to revert to a known-good state.
45 *
46 * @return Object
47 */
48 Object defaultValue();
49 /***
50 * Denotes whether the value is required before the rule can be executed.
51 * Has no meaning for primitive types such as booleans, ints, etc.
52 *
53 * @return boolean
54 */
55 boolean isRequired();
56 /***
57 * Validation function that returns a diagnostic error message for a sample
58 * property value. Returns null if the value is acceptable.
59 *
60 * @param value Object
61 * @return String
62 */
63 String errorFor(Object value);
64 /***
65 * Denotes the relative order the property field should occupy if we are using
66 * an auto-generated UI to display and edit values. If the value returned has
67 * a non-zero fractional part then this is can be used to place adjacent fields
68 * on the same row. Example:
69 *
70 * name -> 0.0
71 * description 1.0
72 * minValue -> 2.0
73 * maxValue -> 2.1
74 *
75 * ..would have their fields placed like:
76 *
77 * name: [ ]
78 * description: [ ]
79 * minimum: [ ] maximum: [ ]
80 *
81 * @return float
82 */
83 float uiOrder();
84 /***
85 * If the property is multi-valued then return the separate values after
86 * parsing the propertyString provided. If it isn't a multi-valued
87 * property then the value will be returned within an array of size[1].
88 *
89 * @param propertyString String
90 * @return Object
91 * @throws IllegalArgumentException
92 */
93 Object valueFrom(String propertyString) throws IllegalArgumentException;
94 /***
95 * Formats the object onto a string suitable for storage within the property map.
96 * @param value Object
97 * @return String
98 */
99 String asDelimitedString(Object value);
100
101 /***
102 * Returns a set of choice tuples of available, returns null if none present.
103 * @return Object[]
104 */
105 Object[][] choices();
106
107 /***
108 * A convenience method that returns an error string if the rule holds onto a
109 * property value that has a problem. Returns null otherwise.
110 *
111 * @param rule Rule
112 * @return String
113 */
114 String propertyErrorFor(Rule rule);
115
116 /***
117 * Return the character being used to delimit multiple property values within
118 * a single string. You must ensure that this character does not appear within
119 * any rule property values to avoid deserialization errors.
120 *
121 * @return char
122 */
123 char multiValueDelimiter();
124
125 /***
126 * If the datatype is a String then return the preferred number of rows to
127 * allocate in the text widget, returns a value of one for all other types.
128 * Useful for multi-line XPATH editors.
129 *
130 * @return int
131 */
132 int preferredRowCount();
133 }