001/*
002 * Licensed to the Apache Software Foundation (ASF) under one or more
003 * contributor license agreements.  See the NOTICE file distributed with
004 * this work for additional information regarding copyright ownership.
005 * The ASF licenses this file to You under the Apache License, Version 2.0
006 * (the "License"); you may not use this file except in compliance with
007 * the License.  You may obtain a copy of the License at
008 *
009 *      http://www.apache.org/licenses/LICENSE-2.0
010 *
011 * Unless required by applicable law or agreed to in writing, software
012 * distributed under the License is distributed on an "AS IS" BASIS,
013 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
014 * See the License for the specific language governing permissions and
015 * limitations under the License.
016 */
017package org.apache.commons.validator.routines;
018
019import java.math.BigInteger;
020import java.text.Format;
021import java.util.Locale;
022
023/**
024 * <p><b>BigInteger Validation</b> and Conversion routines (<code>java.math.BigInteger</code>).</p>
025 *
026 * <p>This validator provides a number of methods for
027 *    validating/converting a <code>String</code> value to
028 *    a <code>BigInteger</code> using <code>java.text.NumberFormat</code>
029 *    to parse either:</p>
030 *    <ul>
031 *       <li>using the default format for the default <code>Locale</code></li>
032 *       <li>using a specified pattern with the default <code>Locale</code></li>
033 *       <li>using the default format for a specified <code>Locale</code></li>
034 *       <li>using a specified pattern with a specified <code>Locale</code></li>
035 *    </ul>
036 *
037 * <p>Use one of the <code>isValid()</code> methods to just validate or
038 *    one of the <code>validate()</code> methods to validate and receive a
039 *    <i>converted</i> <code>BigInteger</code> value.</p>
040 *
041 * <p>Once a value has been successfully converted the following
042 *    methods can be used to perform minimum, maximum and range checks:</p>
043 *    <ul>
044 *       <li><code>minValue()</code> checks whether the value is greater
045 *           than or equal to a specified minimum.</li>
046 *       <li><code>maxValue()</code> checks whether the value is less
047 *           than or equal to a specified maximum.</li>
048 *       <li><code>isInRange()</code> checks whether the value is within
049 *           a specified range of values.</li>
050 *    </ul>
051 *
052 * <p>So that the same mechanism used for parsing an <i>input</i> value
053 *    for validation can be used to format <i>output</i>, corresponding
054 *    <code>format()</code> methods are also provided. That is you can
055 *    format either:</p>
056 *    <ul>
057 *       <li>using the default format for the default <code>Locale</code></li>
058 *       <li>using a specified pattern with the default <code>Locale</code></li>
059 *       <li>using the default format for a specified <code>Locale</code></li>
060 *       <li>using a specified pattern with a specified <code>Locale</code></li>
061 *    </ul>
062 *
063 * @since 1.3.0
064 */
065public class BigIntegerValidator extends AbstractNumberValidator {
066
067    private static final long serialVersionUID = 6713144356347139988L;
068
069    private static final BigIntegerValidator VALIDATOR = new BigIntegerValidator();
070
071    /**
072     * Gets the singleton instance of this validator.
073     * @return A singleton instance of the BigIntegerValidator.
074     */
075    public static BigIntegerValidator getInstance() {
076        return VALIDATOR;
077    }
078
079    /**
080     * Constructs a <i>strict</i> instance.
081     */
082    public BigIntegerValidator() {
083        this(true, STANDARD_FORMAT);
084    }
085
086    /**
087     * <p>Construct an instance with the specified strict setting
088     *    and format type.</p>
089     *
090     * <p>The <code>formatType</code> specified what type of
091     *    <code>NumberFormat</code> is created - valid types
092     *    are:</p>
093     *    <ul>
094     *       <li>AbstractNumberValidator.STANDARD_FORMAT -to create
095     *           <i>standard</i> number formats (the default).</li>
096     *       <li>AbstractNumberValidator.CURRENCY_FORMAT -to create
097     *           <i>currency</i> number formats.</li>
098     *       <li>AbstractNumberValidator.PERCENT_FORMAT -to create
099     *           <i>percent</i> number formats (the default).</li>
100     *    </ul>
101     *
102     * @param strict {@code true} if strict
103     *        <code>Format</code> parsing should be used.
104     * @param formatType The <code>NumberFormat</code> type to
105     *        create for validation, default is STANDARD_FORMAT.
106     */
107    public BigIntegerValidator(final boolean strict, final int formatType) {
108        super(strict, formatType, false);
109    }
110
111    /**
112     * Check if the value is within a specified range.
113     *
114     * @param value The <code>Number</code> value to check.
115     * @param min The minimum value of the range.
116     * @param max The maximum value of the range.
117     * @return {@code true} if the value is within the
118     *         specified range.
119     */
120    public boolean isInRange(final BigInteger value, final long min, final long max) {
121        return value.longValue() >= min && value.longValue() <= max;
122    }
123
124    /**
125     * Check if the value is less than or equal to a maximum.
126     *
127     * @param value The value validation is being performed on.
128     * @param max The maximum value.
129     * @return {@code true} if the value is less than
130     *         or equal to the maximum.
131     */
132    public boolean maxValue(final BigInteger value, final long max) {
133        return value.longValue() <= max;
134    }
135
136    /**
137     * Check if the value is greater than or equal to a minimum.
138     *
139     * @param value The value validation is being performed on.
140     * @param min The minimum value.
141     * @return {@code true} if the value is greater than
142     *         or equal to the minimum.
143     */
144    public boolean minValue(final BigInteger value, final long min) {
145        return value.longValue() >= min;
146    }
147
148    /**
149     * Convert the parsed value to a <code>BigInteger</code>.
150     *
151     * @param value The parsed <code>Number</code> object created.
152     * @param formatter The Format used to parse the value with.
153     * @return The parsed <code>Number</code> converted to a
154     *         <code>BigInteger</code>.
155     */
156    @Override
157    protected Object processParsedValue(final Object value, final Format formatter) {
158        return BigInteger.valueOf(((Number) value).longValue());
159    }
160
161    /**
162     * <p>Validate/convert a <code>BigInteger</code> using the default
163     *    <code>Locale</code>.
164     *
165     * @param value The value validation is being performed on.
166     * @return The parsed <code>BigInteger</code> if valid or {@code null}
167     *  if invalid.
168     */
169    public BigInteger validate(final String value) {
170        return (BigInteger) parse(value, (String) null, (Locale) null);
171    }
172
173    /**
174     * <p>Validate/convert a <code>BigInteger</code> using the
175     *    specified <code>Locale</code>.
176     *
177     * @param value The value validation is being performed on.
178     * @param locale The locale to use for the number format, system default if null.
179     * @return The parsed <code>BigInteger</code> if valid or {@code null} if invalid.
180     */
181    public BigInteger validate(final String value, final Locale locale) {
182        return (BigInteger) parse(value, (String) null, locale);
183    }
184
185    /**
186     * <p>Validate/convert a <code>BigInteger</code> using the
187     *    specified <i>pattern</i>.
188     *
189     * @param value The value validation is being performed on.
190     * @param pattern The pattern used to validate the value against.
191     * @return The parsed <code>BigInteger</code> if valid or {@code null} if invalid.
192     */
193    public BigInteger validate(final String value, final String pattern) {
194        return (BigInteger) parse(value, pattern, (Locale) null);
195    }
196
197    /**
198     * <p>Validate/convert a <code>BigInteger</code> using the
199     *    specified pattern and/ or <code>Locale</code>.
200     *
201     * @param value The value validation is being performed on.
202     * @param pattern The pattern used to validate the value against, or the
203     *        default for the <code>Locale</code> if {@code null}.
204     * @param locale The locale to use for the date format, system default if null.
205     * @return The parsed <code>BigInteger</code> if valid or {@code null} if invalid.
206     */
207    public BigInteger validate(final String value, final String pattern, final Locale locale) {
208        return (BigInteger) parse(value, pattern, locale);
209    }
210}