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