001/*
002 * Licensed to the Apache Software Foundation (ASF) under one or more
003 * contributor license agreements.  See the NOTICE file distributed with
004 * this work for additional information regarding copyright ownership.
005 * The ASF licenses this file to You under the Apache License, Version 2.0
006 * (the "License"); you may not use this file except in compliance with
007 * the License.  You may obtain a copy of the License at
008 *
009 *      http://www.apache.org/licenses/LICENSE-2.0
010 *
011 * Unless required by applicable law or agreed to in writing, software
012 * distributed under the License is distributed on an "AS IS" BASIS,
013 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
014 * See the License for the specific language governing permissions and
015 * limitations under the License.
016 */
017package org.apache.commons.validator;
018
019import java.io.Serializable;
020import java.util.Locale;
021import java.util.regex.Pattern;
022
023import org.apache.commons.validator.routines.UrlValidator;
024import org.apache.commons.validator.routines.CreditCardValidator;
025import org.apache.commons.validator.routines.DateValidator;
026import org.apache.commons.validator.routines.EmailValidator;
027
028/**
029 * This class contains basic methods for performing validations.
030 *
031 * @version $Revision: 1227719 $ $Date: 2012-01-05 18:45:51 +0100 (Do, 05 Jan 2012) $
032 */
033public class GenericValidator implements Serializable {
034
035    private static final long serialVersionUID = -7212095066891517618L;
036
037    /**
038     * UrlValidator used in wrapper method.
039     */
040    private static final UrlValidator URL_VALIDATOR = new UrlValidator();
041
042    /**
043     * CreditCardValidator used in wrapper method.
044     */
045    private static final CreditCardValidator CREDIT_CARD_VALIDATOR =
046        new CreditCardValidator();
047
048    /**
049     * <p>Checks if the field isn't null and length of the field is greater
050     * than zero not including whitespace.</p>
051     *
052     * @param value The value validation is being performed on.
053     * @return true if blank or null.
054     */
055    public static boolean isBlankOrNull(String value) {
056        return ((value == null) || (value.trim().length() == 0));
057    }
058
059    /**
060     * <p>Checks if the value matches the regular expression.</p>
061     *
062     * @param value The value validation is being performed on.
063     * @param regexp The regular expression.
064     * @return true if matches the regular expression.
065     */
066    public static boolean matchRegexp(String value, String regexp) {
067        if (regexp == null || regexp.length() <= 0) {
068            return false;
069        }
070
071        return Pattern.matches(regexp, value);
072    }
073
074    /**
075     * <p>Checks if the value can safely be converted to a byte primitive.</p>
076     *
077     * @param value The value validation is being performed on.
078     * @return true if the value can be converted to a Byte.
079     */
080    public static boolean isByte(String value) {
081        return (GenericTypeValidator.formatByte(value) != null);
082    }
083
084    /**
085     * <p>Checks if the value can safely be converted to a short primitive.</p>
086     *
087     * @param value The value validation is being performed on.
088     * @return true if the value can be converted to a Short.
089     */
090    public static boolean isShort(String value) {
091        return (GenericTypeValidator.formatShort(value) != null);
092    }
093
094    /**
095     * <p>Checks if the value can safely be converted to a int primitive.</p>
096     *
097     * @param value The value validation is being performed on.
098     * @return true if the value can be converted to an Integer.
099     */
100    public static boolean isInt(String value) {
101        return (GenericTypeValidator.formatInt(value) != null);
102    }
103
104    /**
105     * <p>Checks if the value can safely be converted to a long primitive.</p>
106     *
107     * @param value The value validation is being performed on.
108     * @return true if the value can be converted to a Long.
109     */
110    public static boolean isLong(String value) {
111        return (GenericTypeValidator.formatLong(value) != null);
112    }
113
114    /**
115     * <p>Checks if the value can safely be converted to a float primitive.</p>
116     *
117     * @param value The value validation is being performed on.
118     * @return true if the value can be converted to a Float.
119     */
120    public static boolean isFloat(String value) {
121        return (GenericTypeValidator.formatFloat(value) != null);
122    }
123
124    /**
125     * <p>Checks if the value can safely be converted to a double primitive.</p>
126     *
127     * @param value The value validation is being performed on.
128     * @return true if the value can be converted to a Double.
129     */
130    public static boolean isDouble(String value) {
131        return (GenericTypeValidator.formatDouble(value) != null);
132    }
133
134    /**
135     * <p>Checks if the field is a valid date.  The <code>Locale</code> is
136     * used with <code>java.text.DateFormat</code>.  The setLenient method
137     * is set to <code>false</code> for all.</p>
138     *
139     * @param value The value validation is being performed on.
140     * @param locale The locale to use for the date format, defaults to the
141     * system default if null.
142     * @return true if the value can be converted to a Date.
143     */
144    public static boolean isDate(String value, Locale locale) {
145        return DateValidator.getInstance().isValid(value, locale);
146    }
147
148    /**
149     * <p>Checks if the field is a valid date.  The pattern is used with
150     * <code>java.text.SimpleDateFormat</code>.  If strict is true, then the
151     * length will be checked so '2/12/1999' will not pass validation with
152     * the format 'MM/dd/yyyy' because the month isn't two digits.
153     * The setLenient method is set to <code>false</code> for all.</p>
154     *
155     * @param value The value validation is being performed on.
156     * @param datePattern The pattern passed to <code>SimpleDateFormat</code>.
157     * @param strict Whether or not to have an exact match of the datePattern.
158     * @return true if the value can be converted to a Date.
159     */
160    public static boolean isDate(String value, String datePattern, boolean strict) {
161        // TODO not yet supported in routines version
162        return org.apache.commons.validator.DateValidator.getInstance().isValid(value, datePattern, strict);
163    }
164
165    /**
166    * <p>Checks if a value is within a range (min &amp; max specified
167    * in the vars attribute).</p>
168    *
169    * @param value The value validation is being performed on.
170    * @param min The minimum value of the range.
171    * @param max The maximum value of the range.
172     * @return true if the value is in the specified range.
173    */
174    public static boolean isInRange(byte value, byte min, byte max) {
175        return ((value >= min) && (value <= max));
176    }
177
178    /**
179     * <p>Checks if a value is within a range (min &amp; max specified
180     * in the vars attribute).</p>
181     *
182     * @param value The value validation is being performed on.
183     * @param min The minimum value of the range.
184     * @param max The maximum value of the range.
185     * @return true if the value is in the specified range.
186     */
187    public static boolean isInRange(int value, int min, int max) {
188        return ((value >= min) && (value <= max));
189    }
190
191    /**
192     * <p>Checks if a value is within a range (min &amp; max specified
193     * in the vars attribute).</p>
194     *
195     * @param value The value validation is being performed on.
196     * @param min The minimum value of the range.
197     * @param max The maximum value of the range.
198     * @return true if the value is in the specified range.
199     */
200    public static boolean isInRange(float value, float min, float max) {
201        return ((value >= min) && (value <= max));
202    }
203
204    /**
205     * <p>Checks if a value is within a range (min &amp; max specified
206     * in the vars attribute).</p>
207     *
208     * @param value The value validation is being performed on.
209     * @param min The minimum value of the range.
210     * @param max The maximum value of the range.
211     * @return true if the value is in the specified range.
212     */
213    public static boolean isInRange(short value, short min, short max) {
214        return ((value >= min) && (value <= max));
215    }
216
217    /**
218     * <p>Checks if a value is within a range (min &amp; max specified
219     * in the vars attribute).</p>
220     *
221     * @param value The value validation is being performed on.
222     * @param min The minimum value of the range.
223     * @param max The maximum value of the range.
224     * @return true if the value is in the specified range.
225     */
226    public static boolean isInRange(long value, long min, long max) {
227        return ((value >= min) && (value <= max));
228    }
229
230    /**
231     * <p>Checks if a value is within a range (min &amp; max specified
232     * in the vars attribute).</p>
233     *
234     * @param value The value validation is being performed on.
235     * @param min The minimum value of the range.
236     * @param max The maximum value of the range.
237     * @return true if the value is in the specified range.
238     */
239    public static boolean isInRange(double value, double min, double max) {
240        return ((value >= min) && (value <= max));
241    }
242
243    /**
244     * Checks if the field is a valid credit card number.
245     * @param value The value validation is being performed on.
246     * @return true if the value is valid Credit Card Number.
247     */
248    public static boolean isCreditCard(String value) {
249        return CREDIT_CARD_VALIDATOR.isValid(value);
250    }
251
252    /**
253     * <p>Checks if a field has a valid e-mail address.</p>
254     *
255     * @param value The value validation is being performed on.
256     * @return true if the value is valid Email Address.
257     */
258    public static boolean isEmail(String value) {
259        return EmailValidator.getInstance().isValid(value);
260    }
261
262    /**
263     * <p>Checks if a field is a valid url address.</p>
264     * If you need to modify what is considered valid then
265     * consider using the UrlValidator directly.
266     *
267     * @param value The value validation is being performed on.
268     * @return true if the value is valid Url.
269     */
270    public static boolean isUrl(String value) {
271        return URL_VALIDATOR.isValid(value);
272    }
273
274    /**
275     * <p>Checks if the value's length is less than or equal to the max.</p>
276     *
277     * @param value The value validation is being performed on.
278     * @param max The maximum length.
279     * @return true if the value's length is less than the specified maximum.
280     */
281    public static boolean maxLength(String value, int max) {
282        return (value.length() <= max);
283    }
284
285    /**
286     * <p>Checks if the value's adjusted length is less than or equal to the max.</p>
287     *
288     * @param value The value validation is being performed on.
289     * @param max The maximum length.
290     * @param lineEndLength The length to use for line endings.
291     * @return true if the value's length is less than the specified maximum.
292     */
293    public static boolean maxLength(String value, int max, int lineEndLength) {
294        int adjustAmount = adjustForLineEnding(value, lineEndLength);
295        return ((value.length() + adjustAmount) <= max);
296    }
297
298    /**
299     * <p>Checks if the value's length is greater than or equal to the min.</p>
300     *
301     * @param value The value validation is being performed on.
302     * @param min The minimum length.
303     * @return true if the value's length is more than the specified minimum.
304     */
305    public static boolean minLength(String value, int min) {
306        return (value.length() >= min);
307    }
308
309    /**
310     * <p>Checks if the value's adjusted length is greater than or equal to the min.</p>
311     *
312     * @param value The value validation is being performed on.
313     * @param min The minimum length.
314     * @param lineEndLength The length to use for line endings.
315     * @return true if the value's length is more than the specified minimum.
316     */
317    public static boolean minLength(String value, int min, int lineEndLength) {
318        int adjustAmount = adjustForLineEnding(value, lineEndLength);
319        return ((value.length() + adjustAmount) >= min);
320    }
321
322    /**
323     * Calculate an adjustment amount for line endings.
324     *
325     * See Bug 37962 for the rational behind this.
326     *
327     * @param value The value validation is being performed on.
328     * @param lineEndLength The length to use for line endings.
329     * @return the adjustment amount.
330     */
331    private static int adjustForLineEnding(String value, int lineEndLength) {
332        int nCount = 0;
333        int rCount = 0;
334        for (int i = 0; i < value.length(); i++) {
335            if (value.charAt(i) == '\n') {
336                nCount++;
337            }
338            if (value.charAt(i) == '\r') {
339                rCount++;
340            }
341        }
342        return ((nCount * lineEndLength) - (rCount + nCount));
343    }
344
345    // See http://issues.apache.org/bugzilla/show_bug.cgi?id=29015 WRT the "value" methods
346
347    /**
348     * <p>Checks if the value is greater than or equal to the min.</p>
349     *
350     * @param value The value validation is being performed on.
351     * @param min The minimum numeric value.
352     * @return true if the value is &gt;= the specified minimum.
353     */
354    public static boolean minValue(int value, int min) {
355        return (value >= min);
356    }
357
358    /**
359     * <p>Checks if the value is greater than or equal to the min.</p>
360     *
361     * @param value The value validation is being performed on.
362     * @param min The minimum numeric value.
363     * @return true if the value is &gt;= the specified minimum.
364     */
365    public static boolean minValue(long value, long min) {
366        return (value >= min);
367    }
368
369    /**
370     * <p>Checks if the value is greater than or equal to the min.</p>
371     *
372     * @param value The value validation is being performed on.
373     * @param min The minimum numeric value.
374     * @return true if the value is &gt;= the specified minimum.
375     */
376    public static boolean minValue(double value, double min) {
377        return (value >= min);
378    }
379
380    /**
381     * <p>Checks if the value is greater than or equal to the min.</p>
382     *
383     * @param value The value validation is being performed on.
384     * @param min The minimum numeric value.
385     * @return true if the value is &gt;= the specified minimum.
386     */
387    public static boolean minValue(float value, float min) {
388        return (value >= min);
389    }
390
391    /**
392     * <p>Checks if the value is less than or equal to the max.</p>
393     *
394     * @param value The value validation is being performed on.
395     * @param max The maximum numeric value.
396     * @return true if the value is &lt;= the specified maximum.
397     */
398    public static boolean maxValue(int value, int max) {
399        return (value <= max);
400    }
401
402    /**
403     * <p>Checks if the value is less than or equal to the max.</p>
404     *
405     * @param value The value validation is being performed on.
406     * @param max The maximum numeric value.
407     * @return true if the value is &lt;= the specified maximum.
408     */
409    public static boolean maxValue(long value, long max) {
410        return (value <= max);
411    }
412
413    /**
414     * <p>Checks if the value is less than or equal to the max.</p>
415     *
416     * @param value The value validation is being performed on.
417     * @param max The maximum numeric value.
418     * @return true if the value is &lt;= the specified maximum.
419     */
420    public static boolean maxValue(double value, double max) {
421        return (value <= max);
422    }
423
424    /**
425     * <p>Checks if the value is less than or equal to the max.</p>
426     *
427     * @param value The value validation is being performed on.
428     * @param max The maximum numeric value.
429     * @return true if the value is &lt;= the specified maximum.
430     */
431    public static boolean maxValue(float value, float max) {
432        return (value <= max);
433    }
434
435}