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.lang3; 018 019 import java.util.Collection; 020 import java.util.Iterator; 021 import java.util.Map; 022 import java.util.regex.Pattern; 023 024 /** 025 * <p>This class assists in validating arguments. The validation methods are 026 * based along the following principles: 027 * <ul> 028 * <li>An invalid {@code null} argument causes a {@link NullPointerException}.</li> 029 * <li>A non-{@code null} argument causes an {@link IllegalArgumentException}.</li> 030 * <li>An invalid index into an array/collection/map/string causes an {@link IndexOutOfBoundsException}.</li> 031 * </ul> 032 * 033 * <p>All exceptions messages are 034 * <a href="http://java.sun.com/j2se/1.5.0/docs/api/java/util/Formatter.html#syntax">format strings</a> 035 * as defined by the Java platform. For example:</p> 036 * 037 * <pre> 038 * Validate.isTrue(i > 0, "The value must be greater than zero: %d", i); 039 * Validate.notNull(surname, "The surname must not be %s", null); 040 * </pre> 041 * 042 * <p>#ThreadSafe#</p> 043 * @version $Id: Validate.java 1153490 2011-08-03 13:53:35Z ggregory $ 044 * @see java.lang.String#format(String, Object...) 045 * @since 2.0 046 */ 047 public class Validate { 048 049 private static final String DEFAULT_EXCLUSIVE_BETWEEN_EX_MESSAGE = 050 "The value %s is not in the specified exclusive range of %s to %s"; 051 private static final String DEFAULT_INCLUSIVE_BETWEEN_EX_MESSAGE = 052 "The value %s is not in the specified inclusive range of %s to %s"; 053 private static final String DEFAULT_MATCHES_PATTERN_EX = "The string %s does not match the pattern %s"; 054 private static final String DEFAULT_IS_NULL_EX_MESSAGE = "The validated object is null"; 055 private static final String DEFAULT_IS_TRUE_EX_MESSAGE = "The validated expression is false"; 056 private static final String DEFAULT_NO_NULL_ELEMENTS_ARRAY_EX_MESSAGE = 057 "The validated array contains null element at index: %d"; 058 private static final String DEFAULT_NO_NULL_ELEMENTS_COLLECTION_EX_MESSAGE = 059 "The validated collection contains null element at index: %d"; 060 private static final String DEFAULT_NOT_BLANK_EX_MESSAGE = "The validated character sequence is blank"; 061 private static final String DEFAULT_NOT_EMPTY_ARRAY_EX_MESSAGE = "The validated array is empty"; 062 private static final String DEFAULT_NOT_EMPTY_CHAR_SEQUENCE_EX_MESSAGE = 063 "The validated character sequence is empty"; 064 private static final String DEFAULT_NOT_EMPTY_COLLECTION_EX_MESSAGE = "The validated collection is empty"; 065 private static final String DEFAULT_NOT_EMPTY_MAP_EX_MESSAGE = "The validated map is empty"; 066 private static final String DEFAULT_VALID_INDEX_ARRAY_EX_MESSAGE = "The validated array index is invalid: %d"; 067 private static final String DEFAULT_VALID_INDEX_CHAR_SEQUENCE_EX_MESSAGE = 068 "The validated character sequence index is invalid: %d"; 069 private static final String DEFAULT_VALID_INDEX_COLLECTION_EX_MESSAGE = 070 "The validated collection index is invalid: %d"; 071 private static final String DEFAULT_VALID_STATE_EX_MESSAGE = "The validated state is false"; 072 private static final String DEFAULT_IS_ASSIGNABLE_EX_MESSAGE = 073 "The validated class can not be converted to the %s class"; 074 private static final String DEFAULT_IS_INSTANCE_OF_EX_MESSAGE = "The validated object is not an instance of %s"; 075 076 /** 077 * Constructor. This class should not normally be instantiated. 078 */ 079 public Validate() { 080 super(); 081 } 082 083 // isTrue 084 //--------------------------------------------------------------------------------- 085 086 /** 087 * <p>Validate that the argument condition is {@code true}; otherwise 088 * throwing an exception with the specified message. This method is useful when 089 * validating according to an arbitrary boolean expression, such as validating a 090 * primitive number or using your own custom validation expression.</p> 091 * 092 * <pre>Validate.isTrue(i > 0.0, "The value must be greater than zero: %d", i);</pre> 093 * 094 * <p>For performance reasons, the long value is passed as a separate parameter and 095 * appended to the exception message only in the case of an error.</p> 096 * 097 * @param expression the boolean expression to check 098 * @param message the {@link String#format(String, Object...)} exception message if invalid, not null 099 * @param value the value to append to the message when invalid 100 * @throws IllegalArgumentException if expression is {@code false} 101 * @see #isTrue(boolean) 102 * @see #isTrue(boolean, String, double) 103 * @see #isTrue(boolean, String, Object...) 104 */ 105 public static void isTrue(boolean expression, String message, long value) { 106 if (expression == false) { 107 throw new IllegalArgumentException(String.format(message, Long.valueOf(value))); 108 } 109 } 110 111 /** 112 * <p>Validate that the argument condition is {@code true}; otherwise 113 * throwing an exception with the specified message. This method is useful when 114 * validating according to an arbitrary boolean expression, such as validating a 115 * primitive number or using your own custom validation expression.</p> 116 * 117 * <pre>Validate.isTrue(d > 0.0, "The value must be greater than zero: %s", d);</pre> 118 * 119 * <p>For performance reasons, the double value is passed as a separate parameter and 120 * appended to the exception message only in the case of an error.</p> 121 * 122 * @param expression the boolean expression to check 123 * @param message the {@link String#format(String, Object...)} exception message if invalid, not null 124 * @param value the value to append to the message when invalid 125 * @throws IllegalArgumentException if expression is {@code false} 126 * @see #isTrue(boolean) 127 * @see #isTrue(boolean, String, long) 128 * @see #isTrue(boolean, String, Object...) 129 */ 130 public static void isTrue(boolean expression, String message, double value) { 131 if (expression == false) { 132 throw new IllegalArgumentException(String.format(message, Double.valueOf(value))); 133 } 134 } 135 136 /** 137 * <p>Validate that the argument condition is {@code true}; otherwise 138 * throwing an exception with the specified message. This method is useful when 139 * validating according to an arbitrary boolean expression, such as validating a 140 * primitive number or using your own custom validation expression.</p> 141 * 142 * <pre> 143 * Validate.isTrue(i >= min && i <= max, "The value must be between %d and %d", min, max); 144 * Validate.isTrue(myObject.isOk(), "The object is not okay");</pre> 145 * 146 * @param expression the boolean expression to check 147 * @param message the {@link String#format(String, Object...)} exception message if invalid, not null 148 * @param values the optional values for the formatted exception message, null array not recommended 149 * @throws IllegalArgumentException if expression is {@code false} 150 * @see #isTrue(boolean) 151 * @see #isTrue(boolean, String, long) 152 * @see #isTrue(boolean, String, double) 153 */ 154 public static void isTrue(boolean expression, String message, Object... values) { 155 if (expression == false) { 156 throw new IllegalArgumentException(String.format(message, values)); 157 } 158 } 159 160 /** 161 * <p>Validate that the argument condition is {@code true}; otherwise 162 * throwing an exception. This method is useful when validating according 163 * to an arbitrary boolean expression, such as validating a 164 * primitive number or using your own custom validation expression.</p> 165 * 166 * <pre> 167 * Validate.isTrue(i > 0); 168 * Validate.isTrue(myObject.isOk());</pre> 169 * 170 * <p>The message of the exception is "The validated expression is 171 * false".</p> 172 * 173 * @param expression the boolean expression to check 174 * @throws IllegalArgumentException if expression is {@code false} 175 * @see #isTrue(boolean, String, long) 176 * @see #isTrue(boolean, String, double) 177 * @see #isTrue(boolean, String, Object...) 178 */ 179 public static void isTrue(boolean expression) { 180 if (expression == false) { 181 throw new IllegalArgumentException(DEFAULT_IS_TRUE_EX_MESSAGE); 182 } 183 } 184 185 // notNull 186 //--------------------------------------------------------------------------------- 187 188 /** 189 * <p>Validate that the specified argument is not {@code null}; 190 * otherwise throwing an exception. 191 * 192 * <pre>Validate.notNull(myObject, "The object must not be null");</pre> 193 * 194 * <p>The message of the exception is "The validated object is 195 * null".</p> 196 * 197 * @param <T> the object type 198 * @param object the object to check 199 * @return the validated object (never {@code null} for method chaining) 200 * @throws NullPointerException if the object is {@code null} 201 * @see #notNull(Object, String, Object...) 202 */ 203 public static <T> T notNull(T object) { 204 return notNull(object, DEFAULT_IS_NULL_EX_MESSAGE); 205 } 206 207 /** 208 * <p>Validate that the specified argument is not {@code null}; 209 * otherwise throwing an exception with the specified message. 210 * 211 * <pre>Validate.notNull(myObject, "The object must not be null");</pre> 212 * 213 * @param <T> the object type 214 * @param object the object to check 215 * @param message the {@link String#format(String, Object...)} exception message if invalid, not null 216 * @param values the optional values for the formatted exception message 217 * @return the validated object (never {@code null} for method chaining) 218 * @throws NullPointerException if the object is {@code null} 219 * @see #notNull(Object) 220 */ 221 public static <T> T notNull(T object, String message, Object... values) { 222 if (object == null) { 223 throw new NullPointerException(String.format(message, values)); 224 } 225 return object; 226 } 227 228 // notEmpty array 229 //--------------------------------------------------------------------------------- 230 231 /** 232 * <p>Validate that the specified argument array is neither {@code null} 233 * nor a length of zero (no elements); otherwise throwing an exception 234 * with the specified message. 235 * 236 * <pre>Validate.notEmpty(myArray, "The array must not be empty");</pre> 237 * 238 * @param <T> the array type 239 * @param array the array to check, validated not null by this method 240 * @param message the {@link String#format(String, Object...)} exception message if invalid, not null 241 * @param values the optional values for the formatted exception message, null array not recommended 242 * @return the validated array (never {@code null} method for chaining) 243 * @throws NullPointerException if the array is {@code null} 244 * @throws IllegalArgumentException if the array is empty 245 * @see #notEmpty(Object[]) 246 */ 247 public static <T> T[] notEmpty(T[] array, String message, Object... values) { 248 if (array == null) { 249 throw new NullPointerException(String.format(message, values)); 250 } 251 if (array.length == 0) { 252 throw new IllegalArgumentException(String.format(message, values)); 253 } 254 return array; 255 } 256 257 /** 258 * <p>Validate that the specified argument array is neither {@code null} 259 * nor a length of zero (no elements); otherwise throwing an exception. 260 * 261 * <pre>Validate.notEmpty(myArray);</pre> 262 * 263 * <p>The message in the exception is "The validated array is 264 * empty". 265 * 266 * @param <T> the array type 267 * @param array the array to check, validated not null by this method 268 * @return the validated array (never {@code null} method for chaining) 269 * @throws NullPointerException if the array is {@code null} 270 * @throws IllegalArgumentException if the array is empty 271 * @see #notEmpty(Object[], String, Object...) 272 */ 273 public static <T> T[] notEmpty(T[] array) { 274 return notEmpty(array, DEFAULT_NOT_EMPTY_ARRAY_EX_MESSAGE); 275 } 276 277 // notEmpty collection 278 //--------------------------------------------------------------------------------- 279 280 /** 281 * <p>Validate that the specified argument collection is neither {@code null} 282 * nor a size of zero (no elements); otherwise throwing an exception 283 * with the specified message. 284 * 285 * <pre>Validate.notEmpty(myCollection, "The collection must not be empty");</pre> 286 * 287 * @param <T> the collection type 288 * @param collection the collection to check, validated not null by this method 289 * @param message the {@link String#format(String, Object...)} exception message if invalid, not null 290 * @param values the optional values for the formatted exception message, null array not recommended 291 * @return the validated collection (never {@code null} method for chaining) 292 * @throws NullPointerException if the collection is {@code null} 293 * @throws IllegalArgumentException if the collection is empty 294 * @see #notEmpty(Object[]) 295 */ 296 public static <T extends Collection<?>> T notEmpty(T collection, String message, Object... values) { 297 if (collection == null) { 298 throw new NullPointerException(String.format(message, values)); 299 } 300 if (collection.size() == 0) { 301 throw new IllegalArgumentException(String.format(message, values)); 302 } 303 return collection; 304 } 305 306 /** 307 * <p>Validate that the specified argument collection is neither {@code null} 308 * nor a size of zero (no elements); otherwise throwing an exception. 309 * 310 * <pre>Validate.notEmpty(myCollection);</pre> 311 * 312 * <p>The message in the exception is "The validated collection is 313 * empty".</p> 314 * 315 * @param <T> the collection type 316 * @param collection the collection to check, validated not null by this method 317 * @return the validated collection (never {@code null} method for chaining) 318 * @throws NullPointerException if the collection is {@code null} 319 * @throws IllegalArgumentException if the collection is empty 320 * @see #notEmpty(Collection, String, Object...) 321 */ 322 public static <T extends Collection<?>> T notEmpty(T collection) { 323 return notEmpty(collection, DEFAULT_NOT_EMPTY_COLLECTION_EX_MESSAGE); 324 } 325 326 // notEmpty map 327 //--------------------------------------------------------------------------------- 328 329 /** 330 * <p>Validate that the specified argument map is neither {@code null} 331 * nor a size of zero (no elements); otherwise throwing an exception 332 * with the specified message. 333 * 334 * <pre>Validate.notEmpty(myMap, "The map must not be empty");</pre> 335 * 336 * @param <T> the map type 337 * @param map the map to check, validated not null by this method 338 * @param message the {@link String#format(String, Object...)} exception message if invalid, not null 339 * @param values the optional values for the formatted exception message, null array not recommended 340 * @return the validated map (never {@code null} method for chaining) 341 * @throws NullPointerException if the map is {@code null} 342 * @throws IllegalArgumentException if the map is empty 343 * @see #notEmpty(Object[]) 344 */ 345 public static <T extends Map<?, ?>> T notEmpty(T map, String message, Object... values) { 346 if (map == null) { 347 throw new NullPointerException(String.format(message, values)); 348 } 349 if (map.size() == 0) { 350 throw new IllegalArgumentException(String.format(message, values)); 351 } 352 return map; 353 } 354 355 /** 356 * <p>Validate that the specified argument map is neither {@code null} 357 * nor a size of zero (no elements); otherwise throwing an exception. 358 * 359 * <pre>Validate.notEmpty(myMap);</pre> 360 * 361 * <p>The message in the exception is "The validated map is 362 * empty".</p> 363 * 364 * @param <T> the map type 365 * @param map the map to check, validated not null by this method 366 * @return the validated map (never {@code null} method for chaining) 367 * @throws NullPointerException if the map is {@code null} 368 * @throws IllegalArgumentException if the map is empty 369 * @see #notEmpty(Map, String, Object...) 370 */ 371 public static <T extends Map<?, ?>> T notEmpty(T map) { 372 return notEmpty(map, DEFAULT_NOT_EMPTY_MAP_EX_MESSAGE); 373 } 374 375 // notEmpty string 376 //--------------------------------------------------------------------------------- 377 378 /** 379 * <p>Validate that the specified argument character sequence is 380 * neither {@code null} nor a length of zero (no characters); 381 * otherwise throwing an exception with the specified message. 382 * 383 * <pre>Validate.notEmpty(myString, "The string must not be empty");</pre> 384 * 385 * @param <T> the character sequence type 386 * @param chars the character sequence to check, validated not null by this method 387 * @param message the {@link String#format(String, Object...)} exception message if invalid, not null 388 * @param values the optional values for the formatted exception message, null array not recommended 389 * @return the validated character sequence (never {@code null} method for chaining) 390 * @throws NullPointerException if the character sequence is {@code null} 391 * @throws IllegalArgumentException if the character sequence is empty 392 * @see #notEmpty(CharSequence) 393 */ 394 public static <T extends CharSequence> T notEmpty(T chars, String message, Object... values) { 395 if (chars == null) { 396 throw new NullPointerException(String.format(message, values)); 397 } 398 if (chars.length() == 0) { 399 throw new IllegalArgumentException(String.format(message, values)); 400 } 401 return chars; 402 } 403 404 /** 405 * <p>Validate that the specified argument character sequence is 406 * neither {@code null} nor a length of zero (no characters); 407 * otherwise throwing an exception with the specified message. 408 * 409 * <pre>Validate.notEmpty(myString);</pre> 410 * 411 * <p>The message in the exception is "The validated 412 * character sequence is empty".</p> 413 * 414 * @param <T> the character sequence type 415 * @param chars the character sequence to check, validated not null by this method 416 * @return the validated character sequence (never {@code null} method for chaining) 417 * @throws NullPointerException if the character sequence is {@code null} 418 * @throws IllegalArgumentException if the character sequence is empty 419 * @see #notEmpty(CharSequence, String, Object...) 420 */ 421 public static <T extends CharSequence> T notEmpty(T chars) { 422 return notEmpty(chars, DEFAULT_NOT_EMPTY_CHAR_SEQUENCE_EX_MESSAGE); 423 } 424 425 // notBlank string 426 //--------------------------------------------------------------------------------- 427 428 /** 429 * <p>Validate that the specified argument character sequence is 430 * neither {@code null}, a length of zero (no characters), empty 431 * nor whitespace; otherwise throwing an exception with the specified 432 * message. 433 * 434 * <pre>Validate.notBlank(myString, "The string must not be blank");</pre> 435 * 436 * @param <T> the character sequence type 437 * @param chars the character sequence to check, validated not null by this method 438 * @param message the {@link String#format(String, Object...)} exception message if invalid, not null 439 * @param values the optional values for the formatted exception message, null array not recommended 440 * @return the validated character sequence (never {@code null} method for chaining) 441 * @throws NullPointerException if the character sequence is {@code null} 442 * @throws IllegalArgumentException if the character sequence is blank 443 * @see #notBlank(CharSequence) 444 * 445 * @since 3.0 446 */ 447 public static <T extends CharSequence> T notBlank(T chars, String message, Object... values) { 448 if (chars == null) { 449 throw new NullPointerException(String.format(message, values)); 450 } 451 if (StringUtils.isBlank(chars)) { 452 throw new IllegalArgumentException(String.format(message, values)); 453 } 454 return chars; 455 } 456 457 /** 458 * <p>Validate that the specified argument character sequence is 459 * neither {@code null}, a length of zero (no characters), empty 460 * nor whitespace; otherwise throwing an exception. 461 * 462 * <pre>Validate.notBlank(myString);</pre> 463 * 464 * <p>The message in the exception is "The validated character 465 * sequence is blank".</p> 466 * 467 * @param <T> the character sequence type 468 * @param chars the character sequence to check, validated not null by this method 469 * @return the validated character sequence (never {@code null} method for chaining) 470 * @throws NullPointerException if the character sequence is {@code null} 471 * @throws IllegalArgumentException if the character sequence is blank 472 * @see #notBlank(CharSequence, String, Object...) 473 * 474 * @since 3.0 475 */ 476 public static <T extends CharSequence> T notBlank(T chars) { 477 return notBlank(chars, DEFAULT_NOT_BLANK_EX_MESSAGE); 478 } 479 480 // noNullElements array 481 //--------------------------------------------------------------------------------- 482 483 /** 484 * <p>Validate that the specified argument array is neither 485 * {@code null} nor contains any elements that are {@code null}; 486 * otherwise throwing an exception with the specified message. 487 * 488 * <pre>Validate.noNullElements(myArray, "The array contain null at position %d");</pre> 489 * 490 * <p>If the array is {@code null}, then the message in the exception 491 * is "The validated object is null".</p> 492 * 493 * <p>If the array has a {@code null} element, then the iteration 494 * index of the invalid element is appended to the {@code values} 495 * argument.</p> 496 * 497 * @param <T> the array type 498 * @param array the array to check, validated not null by this method 499 * @param message the {@link String#format(String, Object...)} exception message if invalid, not null 500 * @param values the optional values for the formatted exception message, null array not recommended 501 * @return the validated array (never {@code null} method for chaining) 502 * @throws NullPointerException if the array is {@code null} 503 * @throws IllegalArgumentException if an element is {@code null} 504 * @see #noNullElements(Object[]) 505 */ 506 public static <T> T[] noNullElements(T[] array, String message, Object... values) { 507 Validate.notNull(array); 508 for (int i = 0; i < array.length; i++) { 509 if (array[i] == null) { 510 Object[] values2 = ArrayUtils.add(values, Integer.valueOf(i)); 511 throw new IllegalArgumentException(String.format(message, values2)); 512 } 513 } 514 return array; 515 } 516 517 /** 518 * <p>Validate that the specified argument array is neither 519 * {@code null} nor contains any elements that are {@code null}; 520 * otherwise throwing an exception. 521 * 522 * <pre>Validate.noNullElements(myArray);</pre> 523 * 524 * <p>If the array is {@code null}, then the message in the exception 525 * is "The validated object is null".</p> 526 * 527 * <p>If the array has a {@code null} element, then the message in the 528 * exception is "The validated array contains null element at index: 529 * " followed by the index.</p> 530 * 531 * @param <T> the array type 532 * @param array the array to check, validated not null by this method 533 * @return the validated array (never {@code null} method for chaining) 534 * @throws NullPointerException if the array is {@code null} 535 * @throws IllegalArgumentException if an element is {@code null} 536 * @see #noNullElements(Object[], String, Object...) 537 */ 538 public static <T> T[] noNullElements(T[] array) { 539 return noNullElements(array, DEFAULT_NO_NULL_ELEMENTS_ARRAY_EX_MESSAGE); 540 } 541 542 // noNullElements iterable 543 //--------------------------------------------------------------------------------- 544 545 /** 546 * <p>Validate that the specified argument iterable is neither 547 * {@code null} nor contains any elements that are {@code null}; 548 * otherwise throwing an exception with the specified message. 549 * 550 * <pre>Validate.noNullElements(myCollection, "The collection contains null at position %d");</pre> 551 * 552 * <p>If the iterable is {@code null}, then the message in the exception 553 * is "The validated object is null".</p> 554 * 555 * <p>If the iterable has a {@code null} element, then the iteration 556 * index of the invalid element is appended to the {@code values} 557 * argument.</p> 558 * 559 * @param <T> the iterable type 560 * @param iterable the iterable to check, validated not null by this method 561 * @param message the {@link String#format(String, Object...)} exception message if invalid, not null 562 * @param values the optional values for the formatted exception message, null array not recommended 563 * @return the validated iterable (never {@code null} method for chaining) 564 * @throws NullPointerException if the array is {@code null} 565 * @throws IllegalArgumentException if an element is {@code null} 566 * @see #noNullElements(Iterable) 567 */ 568 public static <T extends Iterable<?>> T noNullElements(T iterable, String message, Object... values) { 569 Validate.notNull(iterable); 570 int i = 0; 571 for (Iterator<?> it = iterable.iterator(); it.hasNext(); i++) { 572 if (it.next() == null) { 573 Object[] values2 = ArrayUtils.addAll(values, Integer.valueOf(i)); 574 throw new IllegalArgumentException(String.format(message, values2)); 575 } 576 } 577 return iterable; 578 } 579 580 /** 581 * <p>Validate that the specified argument iterable is neither 582 * {@code null} nor contains any elements that are {@code null}; 583 * otherwise throwing an exception. 584 * 585 * <pre>Validate.noNullElements(myCollection);</pre> 586 * 587 * <p>If the iterable is {@code null}, then the message in the exception 588 * is "The validated object is null".</p> 589 * 590 * <p>If the array has a {@code null} element, then the message in the 591 * exception is "The validated iterable contains null element at index: 592 * " followed by the index.</p> 593 * 594 * @param <T> the iterable type 595 * @param iterable the iterable to check, validated not null by this method 596 * @return the validated iterable (never {@code null} method for chaining) 597 * @throws NullPointerException if the array is {@code null} 598 * @throws IllegalArgumentException if an element is {@code null} 599 * @see #noNullElements(Iterable, String, Object...) 600 */ 601 public static <T extends Iterable<?>> T noNullElements(T iterable) { 602 return noNullElements(iterable, DEFAULT_NO_NULL_ELEMENTS_COLLECTION_EX_MESSAGE); 603 } 604 605 // validIndex array 606 //--------------------------------------------------------------------------------- 607 608 /** 609 * <p>Validates that the index is within the bounds of the argument 610 * array; otherwise throwing an exception with the specified message.</p> 611 * 612 * <pre>Validate.validIndex(myArray, 2, "The array index is invalid: ");</pre> 613 * 614 * <p>If the array is {@code null}, then the message of the exception 615 * is "The validated object is null".</p> 616 * 617 * @param <T> the array type 618 * @param array the array to check, validated not null by this method 619 * @param index the index to check 620 * @param message the {@link String#format(String, Object...)} exception message if invalid, not null 621 * @param values the optional values for the formatted exception message, null array not recommended 622 * @return the validated array (never {@code null} for method chaining) 623 * @throws NullPointerException if the array is {@code null} 624 * @throws IndexOutOfBoundsException if the index is invalid 625 * @see #validIndex(Object[], int) 626 * 627 * @since 3.0 628 */ 629 public static <T> T[] validIndex(T[] array, int index, String message, Object... values) { 630 Validate.notNull(array); 631 if (index < 0 || index >= array.length) { 632 throw new IndexOutOfBoundsException(String.format(message, values)); 633 } 634 return array; 635 } 636 637 /** 638 * <p>Validates that the index is within the bounds of the argument 639 * array; otherwise throwing an exception.</p> 640 * 641 * <pre>Validate.validIndex(myArray, 2);</pre> 642 * 643 * <p>If the array is {@code null}, then the message of the exception 644 * is "The validated object is null".</p> 645 * 646 * <p>If the index is invalid, then the message of the exception is 647 * "The validated array index is invalid: " followed by the 648 * index.</p> 649 * 650 * @param <T> the array type 651 * @param array the array to check, validated not null by this method 652 * @param index the index to check 653 * @return the validated array (never {@code null} for method chaining) 654 * @throws NullPointerException if the array is {@code null} 655 * @throws IndexOutOfBoundsException if the index is invalid 656 * @see #validIndex(Object[], int, String, Object...) 657 * 658 * @since 3.0 659 */ 660 public static <T> T[] validIndex(T[] array, int index) { 661 return validIndex(array, index, DEFAULT_VALID_INDEX_ARRAY_EX_MESSAGE, Integer.valueOf(index)); 662 } 663 664 // validIndex collection 665 //--------------------------------------------------------------------------------- 666 667 /** 668 * <p>Validates that the index is within the bounds of the argument 669 * collection; otherwise throwing an exception with the specified message.</p> 670 * 671 * <pre>Validate.validIndex(myCollection, 2, "The collection index is invalid: ");</pre> 672 * 673 * <p>If the collection is {@code null}, then the message of the 674 * exception is "The validated object is null".</p> 675 * 676 * @param <T> the collection type 677 * @param collection the collection to check, validated not null by this method 678 * @param index the index to check 679 * @param message the {@link String#format(String, Object...)} exception message if invalid, not null 680 * @param values the optional values for the formatted exception message, null array not recommended 681 * @return the validated collection (never {@code null} for chaining) 682 * @throws NullPointerException if the collection is {@code null} 683 * @throws IndexOutOfBoundsException if the index is invalid 684 * @see #validIndex(Collection, int) 685 * 686 * @since 3.0 687 */ 688 public static <T extends Collection<?>> T validIndex(T collection, int index, String message, Object... values) { 689 Validate.notNull(collection); 690 if (index < 0 || index >= collection.size()) { 691 throw new IndexOutOfBoundsException(String.format(message, values)); 692 } 693 return collection; 694 } 695 696 /** 697 * <p>Validates that the index is within the bounds of the argument 698 * collection; otherwise throwing an exception.</p> 699 * 700 * <pre>Validate.validIndex(myCollection, 2);</pre> 701 * 702 * <p>If the index is invalid, then the message of the exception 703 * is "The validated collection index is invalid: " 704 * followed by the index.</p> 705 * 706 * @param <T> the collection type 707 * @param collection the collection to check, validated not null by this method 708 * @param index the index to check 709 * @return the validated collection (never {@code null} for method chaining) 710 * @throws NullPointerException if the collection is {@code null} 711 * @throws IndexOutOfBoundsException if the index is invalid 712 * @see #validIndex(Collection, int, String, Object...) 713 * 714 * @since 3.0 715 */ 716 public static <T extends Collection<?>> T validIndex(T collection, int index) { 717 return validIndex(collection, index, DEFAULT_VALID_INDEX_COLLECTION_EX_MESSAGE, Integer.valueOf(index)); 718 } 719 720 // validIndex string 721 //--------------------------------------------------------------------------------- 722 723 /** 724 * <p>Validates that the index is within the bounds of the argument 725 * character sequence; otherwise throwing an exception with the 726 * specified message.</p> 727 * 728 * <pre>Validate.validIndex(myStr, 2, "The string index is invalid: ");</pre> 729 * 730 * <p>If the character sequence is {@code null}, then the message 731 * of the exception is "The validated object is null".</p> 732 * 733 * @param <T> the character sequence type 734 * @param chars the character sequence to check, validated not null by this method 735 * @param index the index to check 736 * @param message the {@link String#format(String, Object...)} exception message if invalid, not null 737 * @param values the optional values for the formatted exception message, null array not recommended 738 * @return the validated character sequence (never {@code null} for method chaining) 739 * @throws NullPointerException if the character sequence is {@code null} 740 * @throws IndexOutOfBoundsException if the index is invalid 741 * @see #validIndex(CharSequence, int) 742 * 743 * @since 3.0 744 */ 745 public static <T extends CharSequence> T validIndex(T chars, int index, String message, Object... values) { 746 Validate.notNull(chars); 747 if (index < 0 || index >= chars.length()) { 748 throw new IndexOutOfBoundsException(String.format(message, values)); 749 } 750 return chars; 751 } 752 753 /** 754 * <p>Validates that the index is within the bounds of the argument 755 * character sequence; otherwise throwing an exception.</p> 756 * 757 * <pre>Validate.validIndex(myStr, 2);</pre> 758 * 759 * <p>If the character sequence is {@code null}, then the message 760 * of the exception is "The validated object is 761 * null".</p> 762 * 763 * <p>If the index is invalid, then the message of the exception 764 * is "The validated character sequence index is invalid: " 765 * followed by the index.</p> 766 * 767 * @param <T> the character sequence type 768 * @param chars the character sequence to check, validated not null by this method 769 * @param index the index to check 770 * @return the validated character sequence (never {@code null} for method chaining) 771 * @throws NullPointerException if the character sequence is {@code null} 772 * @throws IndexOutOfBoundsException if the index is invalid 773 * @see #validIndex(CharSequence, int, String, Object...) 774 * 775 * @since 3.0 776 */ 777 public static <T extends CharSequence> T validIndex(T chars, int index) { 778 return validIndex(chars, index, DEFAULT_VALID_INDEX_CHAR_SEQUENCE_EX_MESSAGE, Integer.valueOf(index)); 779 } 780 781 // validState 782 //--------------------------------------------------------------------------------- 783 784 /** 785 * <p>Validate that the stateful condition is {@code true}; otherwise 786 * throwing an exception. This method is useful when validating according 787 * to an arbitrary boolean expression, such as validating a 788 * primitive number or using your own custom validation expression.</p> 789 * 790 * <pre> 791 * Validate.validState(field > 0); 792 * Validate.validState(this.isOk());</pre> 793 * 794 * <p>The message of the exception is "The validated state is 795 * false".</p> 796 * 797 * @param expression the boolean expression to check 798 * @throws IllegalStateException if expression is {@code false} 799 * @see #validState(boolean, String, Object...) 800 * 801 * @since 3.0 802 */ 803 public static void validState(boolean expression) { 804 if (expression == false) { 805 throw new IllegalStateException(DEFAULT_VALID_STATE_EX_MESSAGE); 806 } 807 } 808 809 /** 810 * <p>Validate that the stateful condition is {@code true}; otherwise 811 * throwing an exception with the specified message. This method is useful when 812 * validating according to an arbitrary boolean expression, such as validating a 813 * primitive number or using your own custom validation expression.</p> 814 * 815 * <pre>Validate.validState(this.isOk(), "The state is not OK: %s", myObject);</pre> 816 * 817 * @param expression the boolean expression to check 818 * @param message the {@link String#format(String, Object...)} exception message if invalid, not null 819 * @param values the optional values for the formatted exception message, null array not recommended 820 * @throws IllegalStateException if expression is {@code false} 821 * @see #validState(boolean) 822 * 823 * @since 3.0 824 */ 825 public static void validState(boolean expression, String message, Object... values) { 826 if (expression == false) { 827 throw new IllegalStateException(String.format(message, values)); 828 } 829 } 830 831 // matchesPattern 832 //--------------------------------------------------------------------------------- 833 834 /** 835 * <p>Validate that the specified argument character sequence matches the specified regular 836 * expression pattern; otherwise throwing an exception.</p> 837 * 838 * <pre>Validate.matchesPattern("hi", "[a-z]*");</pre> 839 * 840 * <p>The syntax of the pattern is the one used in the {@link Pattern} class.</p> 841 * 842 * @param input the character sequence to validate, not null 843 * @param pattern the regular expression pattern, not null 844 * @throws IllegalArgumentException if the character sequence does not match the pattern 845 * @see #matchesPattern(CharSequence, String, String, Object...) 846 * 847 * @since 3.0 848 */ 849 public static void matchesPattern(CharSequence input, String pattern) { 850 if (Pattern.matches(pattern, input) == false) { 851 throw new IllegalArgumentException(String.format(DEFAULT_MATCHES_PATTERN_EX, input, pattern)); 852 } 853 } 854 855 /** 856 * <p>Validate that the specified argument character sequence matches the specified regular 857 * expression pattern; otherwise throwing an exception with the specified message.</p> 858 * 859 * <pre>Validate.matchesPattern("hi", "[a-z]*", "%s does not match %s", "hi" "[a-z]*");</pre> 860 * 861 * <p>The syntax of the pattern is the one used in the {@link Pattern} class.</p> 862 * 863 * @param input the character sequence to validate, not null 864 * @param pattern the regular expression pattern, not null 865 * @param message the {@link String#format(String, Object...)} exception message if invalid, not null 866 * @param values the optional values for the formatted exception message, null array not recommended 867 * @throws IllegalArgumentException if the character sequence does not match the pattern 868 * @see #matchesPattern(CharSequence, String) 869 * 870 * @since 3.0 871 */ 872 public static void matchesPattern(CharSequence input, String pattern, String message, Object... values) { 873 if (Pattern.matches(pattern, input) == false) { 874 throw new IllegalArgumentException(String.format(message, values)); 875 } 876 } 877 878 // inclusiveBetween 879 //--------------------------------------------------------------------------------- 880 881 /** 882 * <p>Validate that the specified argument object fall between the two 883 * inclusive values specified; otherwise, throws an exception.</p> 884 * 885 * <pre>Validate.inclusiveBetween(0, 2, 1);</pre> 886 * 887 * @param <T> the type of the argument object 888 * @param start the inclusive start value, not null 889 * @param end the inclusive end value, not null 890 * @param value the object to validate, not null 891 * @throws IllegalArgumentException if the value falls out of the boundaries 892 * @see #inclusiveBetween(Object, Object, Comparable, String, Object...) 893 * 894 * @since 3.0 895 */ 896 public static <T> void inclusiveBetween(T start, T end, Comparable<T> value) { 897 if (value.compareTo(start) < 0 || value.compareTo(end) > 0) { 898 throw new IllegalArgumentException(String.format(DEFAULT_INCLUSIVE_BETWEEN_EX_MESSAGE, value, start, end)); 899 } 900 } 901 902 /** 903 * <p>Validate that the specified argument object fall between the two 904 * inclusive values specified; otherwise, throws an exception with the 905 * specified message.</p> 906 * 907 * <pre>Validate.inclusiveBetween(0, 2, 1, "Not in boundaries");</pre> 908 * 909 * @param <T> the type of the argument object 910 * @param start the inclusive start value, not null 911 * @param end the inclusive end value, not null 912 * @param value the object to validate, not null 913 * @param message the {@link String#format(String, Object...)} exception message if invalid, not null 914 * @param values the optional values for the formatted exception message, null array not recommended 915 * @throws IllegalArgumentException if the value falls out of the boundaries 916 * @see #inclusiveBetween(Object, Object, Comparable) 917 * 918 * @since 3.0 919 */ 920 public static <T> void inclusiveBetween(T start, T end, Comparable<T> value, String message, Object... values) { 921 if (value.compareTo(start) < 0 || value.compareTo(end) > 0) { 922 throw new IllegalArgumentException(String.format(message, values)); 923 } 924 } 925 926 // exclusiveBetween 927 //--------------------------------------------------------------------------------- 928 929 /** 930 * <p>Validate that the specified argument object fall between the two 931 * exclusive values specified; otherwise, throws an exception.</p> 932 * 933 * <pre>Validate.inclusiveBetween(0, 2, 1);</pre> 934 * 935 * @param <T> the type of the argument object 936 * @param start the exclusive start value, not null 937 * @param end the exclusive end value, not null 938 * @param value the object to validate, not null 939 * @throws IllegalArgumentException if the value falls out of the boundaries 940 * @see #exclusiveBetween(Object, Object, Comparable, String, Object...) 941 * 942 * @since 3.0 943 */ 944 public static <T> void exclusiveBetween(T start, T end, Comparable<T> value) { 945 if (value.compareTo(start) <= 0 || value.compareTo(end) >= 0) { 946 throw new IllegalArgumentException(String.format(DEFAULT_EXCLUSIVE_BETWEEN_EX_MESSAGE, value, start, end)); 947 } 948 } 949 950 /** 951 * <p>Validate that the specified argument object fall between the two 952 * exclusive values specified; otherwise, throws an exception with the 953 * specified message.</p> 954 * 955 * <pre>Validate.inclusiveBetween(0, 2, 1, "Not in boundaries");</pre> 956 * 957 * @param <T> the type of the argument object 958 * @param start the exclusive start value, not null 959 * @param end the exclusive end value, not null 960 * @param value the object to validate, not null 961 * @param message the {@link String#format(String, Object...)} exception message if invalid, not null 962 * @param values the optional values for the formatted exception message, null array not recommended 963 * @throws IllegalArgumentException if the value falls out of the boundaries 964 * @see #exclusiveBetween(Object, Object, Comparable) 965 * 966 * @since 3.0 967 */ 968 public static <T> void exclusiveBetween(T start, T end, Comparable<T> value, String message, Object... values) { 969 if (value.compareTo(start) <= 0 || value.compareTo(end) >= 0) { 970 throw new IllegalArgumentException(String.format(message, values)); 971 } 972 } 973 974 // isInstanceOf 975 //--------------------------------------------------------------------------------- 976 977 /** 978 * <p>Validate that the argument is an instance of the specified class; otherwise 979 * throwing an exception. This method is useful when validating according to an arbitrary 980 * class</p> 981 * 982 * <pre>Validate.isInstanceOf(OkClass.class, object);</pre> 983 * 984 * <p>The message of the exception is "The validated object is not an instance of" 985 * followed by the name of the class</p> 986 * 987 * @param type the class the object must be validated against, not null 988 * @param obj the object to check, null throws an exception 989 * @throws IllegalArgumentException if argument is not of specified class 990 * @see #isInstanceOf(Class, Object, String, Object...) 991 * 992 * @since 3.0 993 */ 994 public static void isInstanceOf(Class<?> type, Object obj) { 995 if (type.isInstance(obj) == false) { 996 throw new IllegalArgumentException(String.format(DEFAULT_IS_INSTANCE_OF_EX_MESSAGE, type.getName())); 997 } 998 } 999 1000 /** 1001 * <p>Validate that the argument is an instance of the specified class; otherwise 1002 * throwing an exception with the specified message. This method is useful when 1003 * validating according to an arbitrary class</p> 1004 * 1005 * <pre>Validate.isInstanceOf(OkClass.classs, object, "Wrong class, object is of class %s", 1006 * object.getClass().getName());</pre> 1007 * 1008 * @param type the class the object must be validated against, not null 1009 * @param obj the object to check, null throws an exception 1010 * @param message the {@link String#format(String, Object...)} exception message if invalid, not null 1011 * @param values the optional values for the formatted exception message, null array not recommended 1012 * @throws IllegalArgumentException if argument is not of specified class 1013 * @see #isInstanceOf(Class, Object) 1014 * 1015 * @since 3.0 1016 */ 1017 public static void isInstanceOf(Class<?> type, Object obj, String message, Object... values) { 1018 if (type.isInstance(obj) == false) { 1019 throw new IllegalArgumentException(String.format(message, values)); 1020 } 1021 } 1022 1023 // isAssignableFrom 1024 //--------------------------------------------------------------------------------- 1025 1026 /** 1027 * <p>Validate that the argument can be converted to the specified class; otherwise 1028 * throwing an exception with the specified message. This method is useful when 1029 * validating if there will be no casting errors.</p> 1030 * 1031 * <pre>Validate.isAssignableFrom(SuperClass.class, object.getClass());</pre> 1032 * 1033 * <p>The message of the exception is "The validated object can not be converted to the" 1034 * followed by the name of the class and "class"</p> 1035 * 1036 * @param superType the class the class must be validated against, not null 1037 * @param type the class to check, not null 1038 * @throws IllegalArgumentException if argument can not be converted to the specified class 1039 * @see #isAssignableFrom(Class, Class, String, Object...) 1040 * 1041 * @since 3.0 1042 */ 1043 public static void isAssignableFrom(Class<?> superType, Class<?> type) { 1044 if (superType.isAssignableFrom(type) == false) { 1045 throw new IllegalArgumentException(String.format(DEFAULT_IS_ASSIGNABLE_EX_MESSAGE, superType.getName())); 1046 } 1047 } 1048 1049 /** 1050 * <p>Validate that the argument can be converted to the specified class; otherwise 1051 * throwing an exception. This method is useful when validating if there will be no 1052 * casting errors.</p> 1053 * 1054 * <pre>Validate.isAssignableFrom(SuperClass.class, object.getClass());</pre> 1055 * 1056 * <p>The message of the exception is "The validated object can not be converted to the" 1057 * followed by the name of the class and "class"</p> 1058 * 1059 * @param superType the class the class must be validated against, not null 1060 * @param type the class to check, not null 1061 * @param message the {@link String#format(String, Object...)} exception message if invalid, not null 1062 * @param values the optional values for the formatted exception message, null array not recommended 1063 * @throws IllegalArgumentException if argument can not be converted to the specified class 1064 * @see #isAssignableFrom(Class, Class) 1065 */ 1066 public static void isAssignableFrom(Class<?> superType, Class<?> type, String message, Object... values) { 1067 if (superType.isAssignableFrom(type) == false) { 1068 throw new IllegalArgumentException(String.format(message, values)); 1069 } 1070 } 1071 }