1 /* 2 * Redistribution and use of this software and associated documentation 3 * ("Software"), with or without modification, are permitted provided 4 * that the following conditions are met: 5 * 6 * 1. Redistributions of source code must retain copyright 7 * statements and notices. Redistributions must also contain a 8 * copy of this document. 9 * 10 * 2. Redistributions in binary form must reproduce the 11 * above copyright notice, this list of conditions and the 12 * following disclaimer in the documentation and/or other 13 * materials provided with the distribution. 14 * 15 * 3. The name "Exolab" must not be used to endorse or promote 16 * products derived from this Software without prior written 17 * permission of Intalio, Inc. For written permission, 18 * please contact info@exolab.org. 19 * 20 * 4. Products derived from this Software may not be called "Exolab" 21 * nor may "Exolab" appear in their names without prior written 22 * permission of Intalio, Inc. Exolab is a registered 23 * trademark of Intalio, Inc. 24 * 25 * 5. Due credit should be given to the Exolab Project 26 * (http://www.exolab.org/). 27 * 28 * THIS SOFTWARE IS PROVIDED BY INTALIO, INC. AND CONTRIBUTORS 29 * ``AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT 30 * NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND 31 * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL 32 * INTALIO, INC. OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, 33 * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES 34 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR 35 * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 36 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, 37 * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 38 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED 39 * OF THE POSSIBILITY OF SUCH DAMAGE. 40 * 41 * Copyright 2000-2003 (C) Intalio, Inc. All Rights Reserved. 42 * 43 * $Id: LongValidator.java 5951 2006-05-30 22:18:48Z bsnyder $ 44 */ 45 package org.exolab.castor.xml.validators; 46 47 import java.math.BigInteger; 48 49 import org.exolab.castor.xml.TypeValidator; 50 import org.exolab.castor.xml.ValidationContext; 51 import org.exolab.castor.xml.ValidationException; 52 53 /** 54 * The BigInteger Validation class. Handles validation for the 55 * <code>java.math.BigInteger</code> type. 56 * 57 * @author <a href="mailto:werner DOT guttmann AT gmx DOT net">Werner Guttmann</a> 58 * @version $Revision: 5951 $ $Date: 2003-03-03 02:57:21 -0700 (Mon, 03 Mar 59 * 2003) $ 60 */ 61 public class BigIntegerValidator extends PatternValidator implements TypeValidator { 62 63 /** If true, we perform "minimum value" validation. */ 64 private boolean _useMin = false; 65 /** If true, we perform "maximum value" validation. */ 66 private boolean _useMax = false; 67 /** If true, we perform "fixed" validation. */ 68 private boolean _useFixed = false; 69 /** Minimum value (inclusive) for this BigInteger. (Not used unless _useMin == true.) */ 70 private BigInteger _min = BigInteger.valueOf(0); 71 /** Maximum value (inclusive) for this BigInteger. (Not used unless _useMax == true.) */ 72 private BigInteger _max = BigInteger.valueOf(0); 73 /** Maximum number of digits in this BigInteger. (Not applied if < 0.) */ 74 private int _totalDigits = -1; 75 /** Fixed value of this BigInteger. (Not used unless _useFixed == true.) */ 76 private BigInteger _fixed = BigInteger.valueOf(0); 77 78 /** 79 * Creates a new BigIntegerValidator with no restrictions. 80 */ 81 public BigIntegerValidator() { 82 super(); 83 } // -- BigIntegerValidator 84 85 /** 86 * Clears the fixed value for this BigIntegerValidator. 87 */ 88 public void clearFixed() { 89 _useFixed = false; 90 } // -- clearFixed 91 92 /** 93 * Clears the maximum value for this BigIntegerValidator. 94 */ 95 public void clearMax() { 96 _useMax = false; 97 } // -- clearMax 98 99 /** 100 * Clears the minimum value for this BigIntegerValidator. 101 */ 102 public void clearMin() { 103 _useMin = false; 104 } // -- clearMin 105 106 /** 107 * Returns the configured fixed value for BigInteger validation. Returns 108 * null if no fixed value has been configured. 109 * 110 * @return the fixed value to validate against. 111 */ 112 public BigInteger getFixed() { 113 if (_useFixed) { 114 return _fixed; 115 } 116 return null; 117 } // -- getFixed 118 119 /** 120 * Returns the configured maximum value for BigInteger validation. Returns 121 * null if no maximum has been configured. 122 * 123 * @return the maximum (inclusive) value to validate against. 124 */ 125 public BigInteger getMaxInclusive() { 126 if (_useMax) { 127 return _max; 128 } 129 return null; 130 } // -- getMaxInclusive 131 132 /** 133 * Returns the configured minimum value for BigInteger validation. Returns 134 * null if no minimum has been configured. 135 * 136 * @return the minimum (inclusive) value to validate against. 137 */ 138 public BigInteger getMinInclusive() { 139 if (_useMin) { 140 return _min; 141 } 142 return null; 143 } // -- getMinInclusive 144 145 /** 146 * Returns the configured maximum number of digits (inclusive) for 147 * BigInteger validation. Returns null if no maximum number of digits has 148 * been configured. 149 * 150 * @return the maximum number of digits to validate against. 151 */ 152 public Integer getTotalDigits() { 153 if (_totalDigits >= 0) { 154 return new Integer(_totalDigits); 155 } 156 return null; 157 } // -- getTotalDigits 158 159 /** 160 * Returns true if a fixed value to validate against has been set. 161 * 162 * @return true if a fixed value has been set. 163 */ 164 public boolean hasFixed() { 165 return _useFixed; 166 } // -- hasFixed 167 168 /** 169 * Sets the fixed value for BigInteger validation. 170 * <p> 171 * NOTE: If maximum and/or minimum values have been set and the fixed value 172 * is not within that max/min range, then no BigInteger will pass 173 * validation. This is as according to the XML Schema spec. 174 * 175 * @param fixedValue 176 * the fixed value that a BigInteger validated with this 177 * validator must be equal to. 178 */ 179 public void setFixed(final BigInteger fixedValue) { 180 _useFixed = true; 181 this._fixed = fixedValue; 182 } // -- setFixed 183 184 /** 185 * Sets the minimum (exclusive) value for BigInteger validation. To pass 186 * validation, a BigInteger must be greater than this value. 187 * 188 * @param minValue 189 * the minimum (exclusive) value for BigInteger validation. 190 */ 191 public void setMinExclusive(final BigInteger minValue) { 192 _useMin = true; 193 _min = minValue.add(BigInteger.valueOf(1)); 194 } // -- setMinExclusive 195 196 /** 197 * Sets the minimum (inclusive) value for BigInteger validation. To pass 198 * validation, a BigInteger must be greater than or equal to this value. 199 * 200 * @param minValue 201 * the minimum (inclusive) value for BigInteger validation. 202 */ 203 public void setMinInclusive(final BigInteger minValue) { 204 _useMin = true; 205 _min = minValue; 206 } // -- setMinInclusive 207 208 /** 209 * Sets the maximum (exclusive) value for BigInteger validation. To pass 210 * validation, a BigInteger must be less than this value. 211 * 212 * @param maxValue 213 * the maximum (exclusive) value for BigInteger validation. 214 */ 215 public void setMaxExclusive(final BigInteger maxValue) { 216 _useMax = true; 217 _max = maxValue.subtract(BigInteger.valueOf(-1)); 218 } // -- setMaxExclusive 219 220 /** 221 * Sets the maximum (inclusive) value for BigInteger validation. To pass 222 * validation, a BigInteger must be less than or equal to this value. 223 * 224 * @param maxValue 225 * the maximum (inclusive) value for BigInteger validation. 226 */ 227 public void setMaxInclusive(final BigInteger maxValue) { 228 _useMax = true; 229 _max = maxValue; 230 } // -- setMaxInclusive 231 232 /** 233 * Sets the maximum number of digits for BigInteger validation. To pass 234 * validation, a BigInteger must have this many digits or fewer. Leading 235 * zeros are not counted. 236 * 237 * @param totalDig 238 * the maximum (inclusive) number of digits for BigInteger 239 * validation. (must be > 0) 240 */ 241 public void setTotalDigits(final int totalDig) { 242 if (totalDig <= 0) { 243 throw new IllegalArgumentException( 244 "IntegerValidator: the totalDigits facet must be positive"); 245 } 246 _totalDigits = totalDig; 247 } 248 249 /** 250 * Validates the given Object. 251 * 252 * @param value 253 * the BigInteger to validate 254 * @param context 255 * the ValidationContext 256 * @throws ValidationException if the object fails validation. 257 */ 258 public void validate(final BigInteger value, final ValidationContext context) 259 throws ValidationException { 260 if (_useFixed && value != _fixed) { 261 String err = "BigInteger " + value + " is not equal to the fixed value: " + _fixed; 262 throw new ValidationException(err); 263 } 264 265 if (_useMin && value.compareTo(_min) == -1) { 266 String err = "BigInteger " + value + " is less than the minimum allowed value: " + _min; 267 throw new ValidationException(err); 268 } 269 270 if (_useMax && value.compareTo(_max) == 1) { 271 String err = "BigInteger " + value + " is greater than the maximum allowed value: " 272 + _max; 273 throw new ValidationException(err); 274 } 275 276 if (_totalDigits != -1) { 277 int length = value.toString().length(); 278 if (value.compareTo(new BigInteger("0")) == -1) { 279 length--; 280 } 281 if (length > _totalDigits) { 282 String err = "BigInteger " + value + " has too many digits -- must have " 283 + _totalDigits + " digits or fewer."; 284 throw new ValidationException(err); 285 } 286 } 287 288 if (hasPattern()) { 289 super.validate(value.toString(), context); 290 } 291 } // -- validate 292 293 /** 294 * Validates the given Object. 295 * 296 * @param object 297 * the Object to validate 298 * @throws ValidationException 299 * if the object fails validation. 300 */ 301 public void validate(final Object object) throws ValidationException { 302 validate(object, (ValidationContext) null); 303 } // -- validate 304 305 /** 306 * Validates the given Object. 307 * 308 * @param object 309 * the Object to validate 310 * @param context 311 * the ValidationContext 312 * @throws ValidationException 313 * if the object fails validation. 314 */ 315 public void validate(final Object object, final ValidationContext context) 316 throws ValidationException { 317 if (object == null) { 318 String err = "BigIntegerValidator cannot validate a null object."; 319 throw new ValidationException(err); 320 } 321 322 BigInteger value = BigInteger.valueOf(0); 323 try { 324 value = (BigInteger) object; 325 } catch (Exception ex) { 326 String err = "Expecting a BigInteger, received instead: "; 327 err += object.getClass().getName(); 328 throw new ValidationException(err); 329 } 330 validate(value, context); 331 } // -- validate 332 333 } // -- BigIntegerValidator