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