1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22 package org.apache.commons.validator;
23
24 import java.io.Serializable;
25 import java.util.Locale;
26
27 import org.apache.oro.text.perl.Perl5Util;
28
29 /***
30 * This class contains basic methods for performing validations.
31 */
32 public class GenericValidator implements Serializable {
33
34 /***
35 * UrlValidator used in wrapper method.
36 */
37 private static final UrlValidator URL_VALIDATOR = new UrlValidator();
38
39 /***
40 * CreditCardValidator used in wrapper method.
41 */
42 private static final CreditCardValidator CREDIT_CARD_VALIDATOR =
43 new CreditCardValidator();
44
45 /***
46 * <p>Checks if the field isn't null and length of the field is greater
47 * than zero not including whitespace.</p>
48 *
49 * @param value The value validation is being performed on.
50 * @return true if blank or null.
51 */
52 public static boolean isBlankOrNull(String value) {
53 return ((value == null) || (value.trim().length() == 0));
54 }
55
56 /***
57 * <p>Checks if the value matches the regular expression.</p>
58 *
59 * @param value The value validation is being performed on.
60 * @param regexp The regular expression.
61 * @return true if matches the regular expression.
62 */
63 public static boolean matchRegexp(String value, String regexp) {
64 if (regexp == null || regexp.length() <= 0) {
65 return false;
66 }
67
68 Perl5Util matcher = new Perl5Util();
69 return matcher.match("/" + regexp + "/", value);
70 }
71
72 /***
73 * <p>Checks if the value can safely be converted to a byte primitive.</p>
74 *
75 * @param value The value validation is being performed on.
76 * @return true if the value can be converted to a Byte.
77 */
78 public static boolean isByte(String value) {
79 return (GenericTypeValidator.formatByte(value) != null);
80 }
81
82 /***
83 * <p>Checks if the value can safely be converted to a short primitive.</p>
84 *
85 * @param value The value validation is being performed on.
86 * @return true if the value can be converted to a Short.
87 */
88 public static boolean isShort(String value) {
89 return (GenericTypeValidator.formatShort(value) != null);
90 }
91
92 /***
93 * <p>Checks if the value can safely be converted to a int primitive.</p>
94 *
95 * @param value The value validation is being performed on.
96 * @return true if the value can be converted to an Integer.
97 */
98 public static boolean isInt(String value) {
99 return (GenericTypeValidator.formatInt(value) != null);
100 }
101
102 /***
103 * <p>Checks if the value can safely be converted to a long primitive.</p>
104 *
105 * @param value The value validation is being performed on.
106 * @return true if the value can be converted to a Long.
107 */
108 public static boolean isLong(String value) {
109 return (GenericTypeValidator.formatLong(value) != null);
110 }
111
112 /***
113 * <p>Checks if the value can safely be converted to a float primitive.</p>
114 *
115 * @param value The value validation is being performed on.
116 * @return true if the value can be converted to a Float.
117 */
118 public static boolean isFloat(String value) {
119 return (GenericTypeValidator.formatFloat(value) != null);
120 }
121
122 /***
123 * <p>Checks if the value can safely be converted to a double primitive.</p>
124 *
125 * @param value The value validation is being performed on.
126 * @return true if the value can be converted to a Double.
127 */
128 public static boolean isDouble(String value) {
129 return (GenericTypeValidator.formatDouble(value) != null);
130 }
131
132 /***
133 * <p>Checks if the field is a valid date. The <code>Locale</code> is
134 * used with <code>java.text.DateFormat</code>. The setLenient method
135 * is set to <code>false</code> for all.</p>
136 *
137 * @param value The value validation is being performed on.
138 * @param locale The locale to use for the date format, defaults to the
139 * system default if null.
140 * @return true if the value can be converted to a Date.
141 */
142 public static boolean isDate(String value, Locale locale) {
143 return DateValidator.getInstance().isValid(value, locale);
144 }
145
146 /***
147 * <p>Checks if the field is a valid date. The pattern is used with
148 * <code>java.text.SimpleDateFormat</code>. If strict is true, then the
149 * length will be checked so '2/12/1999' will not pass validation with
150 * the format 'MM/dd/yyyy' because the month isn't two digits.
151 * The setLenient method is set to <code>false</code> for all.</p>
152 *
153 * @param value The value validation is being performed on.
154 * @param datePattern The pattern passed to <code>SimpleDateFormat</code>.
155 * @param strict Whether or not to have an exact match of the datePattern.
156 * @return true if the value can be converted to a Date.
157 */
158 public static boolean isDate(String value, String datePattern, boolean strict) {
159 return DateValidator.getInstance().isValid(value, datePattern, strict);
160 }
161
162 /***
163 * <p>Checks if a value is within a range (min & max specified
164 * in the vars attribute).</p>
165 *
166 * @param value The value validation is being performed on.
167 * @param min The minimum value of the range.
168 * @param max The maximum value of the range.
169 * @return true if the value is in the specified range.
170 */
171 public static boolean isInRange(byte value, byte min, byte max) {
172 return ((value >= min) && (value <= max));
173 }
174
175 /***
176 * <p>Checks if a value is within a range (min & max specified
177 * in the vars attribute).</p>
178 *
179 * @param value The value validation is being performed on.
180 * @param min The minimum value of the range.
181 * @param max The maximum value of the range.
182 * @return true if the value is in the specified range.
183 */
184 public static boolean isInRange(int value, int min, int max) {
185 return ((value >= min) && (value <= max));
186 }
187
188 /***
189 * <p>Checks if a value is within a range (min & max specified
190 * in the vars attribute).</p>
191 *
192 * @param value The value validation is being performed on.
193 * @param min The minimum value of the range.
194 * @param max The maximum value of the range.
195 * @return true if the value is in the specified range.
196 */
197 public static boolean isInRange(float value, float min, float max) {
198 return ((value >= min) && (value <= max));
199 }
200
201 /***
202 * <p>Checks if a value is within a range (min & max specified
203 * in the vars attribute).</p>
204 *
205 * @param value The value validation is being performed on.
206 * @param min The minimum value of the range.
207 * @param max The maximum value of the range.
208 * @return true if the value is in the specified range.
209 */
210 public static boolean isInRange(short value, short min, short max) {
211 return ((value >= min) && (value <= max));
212 }
213
214 /***
215 * <p>Checks if a value is within a range (min & max specified
216 * in the vars attribute).</p>
217 *
218 * @param value The value validation is being performed on.
219 * @param min The minimum value of the range.
220 * @param max The maximum value of the range.
221 * @return true if the value is in the specified range.
222 */
223 public static boolean isInRange(long value, long min, long max) {
224 return ((value >= min) && (value <= max));
225 }
226
227 /***
228 * <p>Checks if a value is within a range (min & max specified
229 * in the vars attribute).</p>
230 *
231 * @param value The value validation is being performed on.
232 * @param min The minimum value of the range.
233 * @param max The maximum value of the range.
234 * @return true if the value is in the specified range.
235 */
236 public static boolean isInRange(double value, double min, double max) {
237 return ((value >= min) && (value <= max));
238 }
239
240 /***
241 * Checks if the field is a valid credit card number.
242 * @param value The value validation is being performed on.
243 * @return true if the value is valid Credit Card Number.
244 */
245 public static boolean isCreditCard(String value) {
246 return CREDIT_CARD_VALIDATOR.isValid(value);
247 }
248
249 /***
250 * <p>Checks if a field has a valid e-mail address.</p>
251 *
252 * @param value The value validation is being performed on.
253 * @return true if the value is valid Email Address.
254 */
255 public static boolean isEmail(String value) {
256 return EmailValidator.getInstance().isValid(value);
257 }
258
259 /***
260 * <p>Checks if a field is a valid url address.</p>
261 * If you need to modify what is considered valid then
262 * consider using the UrlValidator directly.
263 *
264 * @param value The value validation is being performed on.
265 * @return true if the value is valid Url.
266 */
267 public static boolean isUrl(String value) {
268 return URL_VALIDATOR.isValid(value);
269 }
270
271 /***
272 * <p>Checks if the value's length is less than or equal to the max.</p>
273 *
274 * @param value The value validation is being performed on.
275 * @param max The maximum length.
276 * @return true if the value's length is less than the specified maximum.
277 */
278 public static boolean maxLength(String value, int max) {
279 return (value.length() <= max);
280 }
281
282 /***
283 * <p>Checks if the value's adjusted length is less than or equal to the max.</p>
284 *
285 * @param value The value validation is being performed on.
286 * @param max The maximum length.
287 * @param lineEndLength The length to use for line endings.
288 * @return true if the value's length is less than the specified maximum.
289 */
290 public static boolean maxLength(String value, int max, int lineEndLength) {
291 int adjustAmount = adjustForLineEnding(value, lineEndLength);
292 return ((value.length() + adjustAmount) <= max);
293 }
294
295 /***
296 * <p>Checks if the value's length is greater than or equal to the min.</p>
297 *
298 * @param value The value validation is being performed on.
299 * @param min The minimum length.
300 * @return true if the value's length is more than the specified minimum.
301 */
302 public static boolean minLength(String value, int min) {
303 return (value.length() >= min);
304 }
305
306 /***
307 * <p>Checks if the value's adjusted length is greater than or equal to the min.</p>
308 *
309 * @param value The value validation is being performed on.
310 * @param min The minimum length.
311 * @param lineEndLength The length to use for line endings.
312 * @return true if the value's length is more than the specified minimum.
313 */
314 public static boolean minLength(String value, int min, int lineEndLength) {
315 int adjustAmount = adjustForLineEnding(value, lineEndLength);
316 return ((value.length() + adjustAmount) >= min);
317 }
318
319 /***
320 * Calculate an adjustment amount for line endings.
321 *
322 * See Bug 37962 for the rational behind this.
323 *
324 * @param value The value validation is being performed on.
325 * @param lineEndLength The length to use for line endings.
326 * @return the adjustment amount.
327 */
328 private static int adjustForLineEnding(String value, int lineEndLength) {
329 int nCount = 0;
330 int rCount = 0;
331 for (int i = 0; i < value.length(); i++) {
332 if (value.charAt(i) == '\n') {
333 nCount++;
334 }
335 if (value.charAt(i) == '\r') {
336 rCount++;
337 }
338 }
339 return ((nCount * lineEndLength) - (rCount + nCount));
340 }
341
342
343
344 /***
345 * <p>Checks if the value is greater than or equal to the min.</p>
346 *
347 * @param value The value validation is being performed on.
348 * @param min The minimum numeric value.
349 * @return true if the value is >= the specified minimum.
350 */
351 public static boolean minValue(int value, int min) {
352 return (value >= min);
353 }
354
355 /***
356 * <p>Checks if the value is greater than or equal to the min.</p>
357 *
358 * @param value The value validation is being performed on.
359 * @param min The minimum numeric value.
360 * @return true if the value is >= the specified minimum.
361 */
362 public static boolean minValue(long value, long min) {
363 return (value >= min);
364 }
365
366 /***
367 * <p>Checks if the value is greater than or equal to the min.</p>
368 *
369 * @param value The value validation is being performed on.
370 * @param min The minimum numeric value.
371 * @return true if the value is >= the specified minimum.
372 */
373 public static boolean minValue(double value, double min) {
374 return (value >= min);
375 }
376
377 /***
378 * <p>Checks if the value is greater than or equal to the min.</p>
379 *
380 * @param value The value validation is being performed on.
381 * @param min The minimum numeric value.
382 * @return true if the value is >= the specified minimum.
383 */
384 public static boolean minValue(float value, float min) {
385 return (value >= min);
386 }
387
388 /***
389 * <p>Checks if the value is less than or equal to the max.</p>
390 *
391 * @param value The value validation is being performed on.
392 * @param max The maximum numeric value.
393 * @return true if the value is <= the specified maximum.
394 */
395 public static boolean maxValue(int value, int max) {
396 return (value <= max);
397 }
398
399 /***
400 * <p>Checks if the value is less than or equal to the max.</p>
401 *
402 * @param value The value validation is being performed on.
403 * @param max The maximum numeric value.
404 * @return true if the value is <= the specified maximum.
405 */
406 public static boolean maxValue(long value, long max) {
407 return (value <= max);
408 }
409
410 /***
411 * <p>Checks if the value is less than or equal to the max.</p>
412 *
413 * @param value The value validation is being performed on.
414 * @param max The maximum numeric value.
415 * @return true if the value is <= the specified maximum.
416 */
417 public static boolean maxValue(double value, double max) {
418 return (value <= max);
419 }
420
421 /***
422 * <p>Checks if the value is less than or equal to the max.</p>
423 *
424 * @param value The value validation is being performed on.
425 * @param max The maximum numeric value.
426 * @return true if the value is <= the specified maximum.
427 */
428 public static boolean maxValue(float value, float max) {
429 return (value <= max);
430 }
431
432 }