1 package org.apache.turbine.services.intake.validator;
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 import java.util.Map;
20
21 import org.apache.commons.lang.StringUtils;
22 import org.apache.commons.logging.Log;
23 import org.apache.commons.logging.LogFactory;
24
25 /***
26 * DefaultValidator that will compare a testValue against the following
27 * constraints:
28 *
29 * <table>
30 * <tr><th>Name</th><th>Valid Values</th><th>Default Value</th></tr>
31 * <tr><td>required</td><td>true|false</td><td>false</td></tr>
32 * <tr><td>mask</td><td>regexp</td><td> </td></tr>
33 * <tr><td>minLength</td><td>integer</td><td>0</td></tr>
34 * <tr><td>maxLength</td><td>integer</td><td> </td></tr>
35 * </table>
36 *
37 * This validator can serve as the base class for more specific validators
38 *
39 * @author <a href="mailto:jmcnally@collab.net">John McNally</a>
40 * @author <a href="mailto:quintonm@bellsouth.net">Quinton McCombs</a>
41 * @author <a href="mailto:Colin.Chalmers@maxware.nl">Colin Chalmers</a>
42 * @version $Id: DefaultValidator.java 264148 2005-08-29 14:21:04Z henning $
43 */
44 abstract public class DefaultValidator
45 implements Validator, InitableByConstraintMap
46 {
47 /*** A boolean value to signify if the field is definately required or not */
48 protected boolean required = false;
49
50 /*** The message to show if field fails required test */
51 protected String requiredMessage = null;
52
53 /*** The minimum length of the field */
54 protected int minLength = 0;
55
56 /*** The message to show if field fails min-length test */
57 protected String minLengthMessage = null;
58
59 /*** The maximum length of the field */
60 protected int maxLength = 0;
61
62 /*** The message to show if field fails max-length test */
63 protected String maxLengthMessage = null;
64
65 /*** Error message pertaining to Rule that was broken */
66 protected String errorMessage = null;
67
68 /*** Logging */
69 protected Log log = LogFactory.getLog(this.getClass());
70
71 /***
72 * Constructor
73 *
74 * @param paramMap a <code>Map</code> of <code>Rule</code>'s
75 * containing constraints on the input.
76 * @exception InvalidMaskException An invalid mask was specified for one of the rules
77
78 */
79 public DefaultValidator(Map paramMap)
80 throws InvalidMaskException
81 {
82 init(paramMap);
83 }
84
85 /***
86 * Default constructor
87 */
88 public DefaultValidator()
89 {
90 }
91
92 /***
93 * Extract the relevant parameters from the constraints listed
94 * in <rule> tags within the intake.xml file.
95 *
96 * @param paramMap a <code>Map</code> of <code>Rule</code>'s
97 * containing constraints on the input.
98 * @exception InvalidMaskException An invalid mask was specified for one of the rules
99 */
100 public void init(Map paramMap)
101 throws InvalidMaskException
102 {
103 Constraint constraint = (Constraint) paramMap.get(REQUIRED_RULE_NAME);
104 if (constraint != null)
105 {
106 String param = constraint.getValue();
107 required = Boolean.valueOf(param).booleanValue();
108 requiredMessage = constraint.getMessage();
109 }
110
111 constraint = (Constraint) paramMap.get(MIN_LENGTH_RULE_NAME);
112 if (constraint != null)
113 {
114 String param = constraint.getValue();
115 minLength = Integer.parseInt(param);
116 minLengthMessage = constraint.getMessage();
117 }
118
119 constraint = (Constraint) paramMap.get(MAX_LENGTH_RULE_NAME);
120 if (constraint != null)
121 {
122 String param = constraint.getValue();
123 maxLength = Integer.parseInt(param);
124 maxLengthMessage = constraint.getMessage();
125 }
126 }
127
128 /***
129 * Determine whether a testValue meets the criteria specified
130 * in the constraints defined for this validator
131 *
132 * @param testValue a <code>String</code> to be tested
133 * @return true if valid, false otherwise
134 */
135 public boolean isValid(String testValue)
136 {
137 boolean valid = false;
138 try
139 {
140 assertValidity(testValue);
141 valid = true;
142 }
143 catch (ValidationException ve)
144 {
145 valid = false;
146 }
147 return valid;
148 }
149
150 /***
151 * Determine whether a testValue meets the criteria specified
152 * in the constraints defined for this validator
153 *
154 * @param testValue a <code>String</code> to be tested
155 * @exception ValidationException containing an error message if the
156 * testValue did not pass the validation tests.
157 */
158 public void assertValidity(String testValue)
159 throws ValidationException
160 {
161 if (!required && StringUtils.isEmpty(testValue))
162 {
163 return;
164 }
165 if (required && StringUtils.isEmpty(testValue))
166 {
167 errorMessage = requiredMessage;
168 throw new ValidationException(requiredMessage);
169 }
170
171 if (minLength > 0 && testValue.length() < minLength)
172 {
173 errorMessage = minLengthMessage;
174 throw new ValidationException(minLengthMessage);
175 }
176 if (maxLength > 0 && testValue.length() > maxLength)
177 {
178 errorMessage = maxLengthMessage;
179 throw new ValidationException(maxLengthMessage);
180 }
181 }
182
183
184 /***
185 * Get the error message resulting from invalid input.
186 *
187 * @return a <code>String</code> message, or the empty String "".
188 */
189 public String getMessage()
190 {
191 String retValue = "";
192
193 if(errorMessage != null)
194 {
195 retValue = errorMessage;
196 }
197
198 return retValue;
199 }
200
201
202
203
204
205 /***
206 * Get the value of required.
207 *
208 * @return value of required.
209 */
210 public boolean isRequired()
211 {
212 return required;
213 }
214
215 /***
216 * Set the value of required.
217 *
218 * @param required Value to assign to required.
219 */
220 public void setRequired(boolean required)
221 {
222 this.required = required;
223 }
224
225 /***
226 * Get the value of requiredMessage.
227 *
228 * @return value of requiredMessage.
229 */
230 public String getRequiredMessage()
231 {
232 return requiredMessage;
233 }
234
235 /***
236 * Set the value of requiredMessage.
237 *
238 * @param requiredMessage Value to assign to requiredMessage.
239 */
240 public void setRequiredMessage(String requiredMessage)
241 {
242 this.requiredMessage = requiredMessage;
243 }
244
245 /***
246 * Get the value of minLength.
247 *
248 * @return value of minLength.
249 */
250 public int getMinLength()
251 {
252 return minLength;
253 }
254
255 /***
256 * Set the value of minLength.
257 *
258 * @param minLength Value to assign to minLength.
259 */
260 public void setMinLength(int minLength)
261 {
262 this.minLength = minLength;
263 }
264
265 /***
266 * Get the value of minLengthMessage.
267 *
268 * @return value of minLengthMessage.
269 */
270 public String getMinLengthMessage()
271 {
272 return minLengthMessage;
273 }
274
275 /***
276 * Set the value of minLengthMessage.
277 *
278 * @param minLengthMessage Value to assign to minLengthMessage.
279 */
280 public void setMinLengthMessage(String minLengthMessage)
281 {
282 this.minLengthMessage = minLengthMessage;
283 }
284
285 /***
286 * Get the value of maxLength.
287 *
288 * @return value of maxLength.
289 */
290 public int getMaxLength()
291 {
292 return maxLength;
293 }
294
295 /***
296 * Set the value of maxLength.
297 *
298 * @param maxLength Value to assign to maxLength.
299 */
300 public void setMaxLength(int maxLength)
301 {
302 this.maxLength = maxLength;
303 }
304
305 /***
306 * Get the value of maxLengthMessage.
307 *
308 * @return value of maxLengthMessage.
309 */
310 public String getMaxLengthMessage()
311 {
312 return maxLengthMessage;
313 }
314
315 /***
316 * Set the value of maxLengthMessage.
317 *
318 * @param maxLengthMessage Value to assign to maxLengthMessage.
319 */
320 public void setMaxLengthMessage(String maxLengthMessage)
321 {
322 this.maxLengthMessage = maxLengthMessage;
323 }
324 }