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