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$ 44 * Date Author Changes 45 * 12/06/2000 Arnaud Blandin Created 46 */ 47 package org.exolab.castor.xml.validators; 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 Double Validation class. This class handles validation for the primitive 55 * <code>double</code> and <code>java.lang.Double</code> types. 56 * 57 * @author <a href="mailto:blandin@intalio.com">Arnaud Blandin</a> 58 * @version $Revision$ $Date: 2003-03-03 02:57:21 -0700 (Mon, 03 Mar 2003) $ 59 */ 60 public class DoubleValidator extends PatternValidator implements TypeValidator { 61 62 /** If true, we perform "minimum inclusive value" validation. */ 63 private boolean _useMinInclusive = false; 64 /** If true, we perform "minimum exclusive value" validation. */ 65 private boolean _useMinExclusive = false; 66 /** If true, we perform "maximum inclusive value" validation. */ 67 private boolean _useMaxInclusive = false; 68 /** If true, we perform "maximum exclusive value" validation. */ 69 private boolean _useMaxExclusive = false; 70 71 private boolean _usePositiveInfinity = false; 72 private boolean _useNegativeInfinity = false; 73 74 /** If true, we perform "fixed" validation. */ 75 private boolean _useFixed = false; 76 /** Minimum value (inclusive) for this double. (Not used unless _useMinInclusive == true.) */ 77 private double _minInclusive = 0; 78 /** Minimum value (exclusive) for this double. (Not used unless _useMinExclusive == true.) */ 79 private double _minExclusive = 0; 80 /** Maximum value (inclusive) for this double. (Not used unless _useMaxInclusive == true.) */ 81 private double _maxInclusive = 0; 82 /** Maximum value (exclusive) for this double. (Not used unless _useMaxExclusive == true.) */ 83 private double _maxExclusive = 0; 84 /** Fixed value of this double. (Not used unless _isFixed == true.) */ 85 private double _fixed = 0; 86 87 private double _positiveInfinity = 0; 88 private double _negativeInfinity = 0; 89 90 /** 91 * Creates a new DoubleValidator with no restrictions. 92 */ 93 public DoubleValidator() { 94 super(); 95 } 96 97 /** 98 * Clears the fixed value for this DoubleValidator. 99 */ 100 public void clearFixed() { 101 _useFixed = false; 102 } 103 104 /** 105 * Clears the maximum value for this DoubleValidator. 106 */ 107 public void clearMax() { 108 _useMaxExclusive = false; 109 _useMaxInclusive = false; 110 } 111 112 /** 113 * Clears the minimum value for this DoubleValidator. 114 */ 115 public void clearMin() { 116 _useMinExclusive = false; 117 _useMinInclusive = false; 118 } 119 120 public void clearPositiveInfinity() { 121 _usePositiveInfinity = false; 122 } 123 124 public void clearNegativeInfinity() { 125 _useNegativeInfinity = false; 126 } 127 128 /** 129 * Returns the configured fixed value for double validation. Returns null if 130 * no fixed value has been configured. 131 * 132 * @return the fixed value to validate against. 133 */ 134 public Double getFixed() { 135 if (_useFixed) { 136 return new Double(_fixed); 137 } 138 return null; 139 } 140 141 /** 142 * Returns the configured inclusive maximum value for double validation. 143 * Returns null if no inclusive maximum has been configured. 144 * 145 * @return the inclusive maximum value to validate against. 146 */ 147 public Double getMaxInclusive() { 148 if (_useMaxInclusive) { 149 return new Double(_maxInclusive); 150 } 151 return null; 152 } 153 154 /** 155 * Returns the configured exclusive maximum value for double validation. 156 * Returns null if no exclusive maximum has been configured. 157 * 158 * @return the exclusive maximum value to validate against. 159 */ 160 public Double getMaxExclusive() { 161 if (_useMaxExclusive) { 162 return new Double(_maxExclusive); 163 } 164 return null; 165 } 166 167 /** 168 * Returns the configured inclusive minimum value for double validation. 169 * Returns null if no inclusive minimum has been configured. 170 * 171 * @return the inclusive minimum value to validate against. 172 */ 173 public Double getMinInclusive() { 174 if (_useMinInclusive) { 175 return new Double(_minInclusive); 176 } 177 return null; 178 } 179 180 /** 181 * Returns the configured exclusive minimum value for double validation. 182 * Returns null if no exclusive minimum has been configured. 183 * 184 * @return the exclusive minimum value to validate against. 185 */ 186 public Double getMinExclusive() { 187 if (_useMinExclusive) { 188 return new Double(_minExclusive); 189 } 190 return null; 191 } 192 193 public Double getPositiveInfinity() { 194 return new Double(_positiveInfinity); 195 } 196 197 public Double getNegativeInfinity() { 198 return new Double(_negativeInfinity); 199 } 200 201 /** 202 * Returns true if a fixed value to validate against has been set. 203 * 204 * @return true if a fixed value has been set. 205 */ 206 public boolean hasFixed() { 207 return _useFixed; 208 } 209 210 /** 211 * Sets the fixed value for double validation. 212 * <p> 213 * NOTE: If maximum and/or minimum values have been set and the fixed value 214 * is not within that max/min range, then no double will pass validation. 215 * This is as according to the XML Schema spec. 216 * 217 * @param fixedValue 218 * the fixed value that a double validated with this validator 219 * must be equal to. 220 */ 221 public void setFixed(final double fixedValue) { 222 _fixed = fixedValue; 223 _useFixed = true; 224 } 225 226 /** 227 * Sets the minimum (exclusive) value for double validation. To pass 228 * validation, a double must be greater than this value. 229 * 230 * @param minValue 231 * the minimum (exclusive) value for double validation. 232 */ 233 public void setMinExclusive(final double minValue) { 234 _minExclusive = minValue; 235 _useMinExclusive = true; 236 } 237 238 /** 239 * Sets the minimum (inclusive) value for double validation. To pass 240 * validation, a double must be greater than or equal to this value. 241 * 242 * @param minValue 243 * the minimum (inclusive) value for double validation. 244 */ 245 public void setMinInclusive(final double minValue) { 246 _minInclusive = minValue; 247 _useMinInclusive = true; 248 } 249 250 /** 251 * Sets the maximum (exclusive) value for double validation. To pass 252 * validation, a double must be less than this value. 253 * 254 * @param maxValue 255 * the maximum (exclusive) value for double validation. 256 */ 257 public void setMaxExclusive(final double maxValue) { 258 _maxExclusive = maxValue; 259 _useMaxExclusive = true; 260 } 261 262 /** 263 * Sets the maximum (inclusive) value for double validation. To pass 264 * validation, a double must be less than or equal to this value. 265 * 266 * @param maxValue 267 * the maximum (inclusive) value for double validation. 268 */ 269 public void setMaxInclusive(final double maxValue) { 270 _maxInclusive = maxValue; 271 _useMaxInclusive = true; 272 } 273 274 public void setPositiveInfinity(final double positiveInfinity) { 275 _positiveInfinity = positiveInfinity; 276 _usePositiveInfinity = true; 277 } 278 279 public void setNegativeInfinity(final double negativeInfinity) { 280 _negativeInfinity = negativeInfinity; 281 _useNegativeInfinity = true; 282 } 283 284 /** 285 * Validates the given Object. 286 * 287 * @param d 288 * the double to validate 289 * @param context 290 * the ValidationContext 291 * @throws ValidationException if the object fails validation. 292 */ 293 public void validate(final double d, final ValidationContext context) 294 throws ValidationException { 295 if (_useFixed && d != _fixed) { 296 String err = "double " + d + " is not equal to the fixed value: " + _fixed; 297 throw new ValidationException(err); 298 } 299 300 if (_useMinInclusive && d < _minInclusive && d != _negativeInfinity) { 301 String err = "double " + d + " is less than the minimum allowed value: " 302 + _minInclusive; 303 throw new ValidationException(err); 304 } 305 306 if (_useMinExclusive && d <= _minExclusive) { 307 String err = "double " + d 308 + " is less than or equal to the maximum exclusive value: " + _minExclusive; 309 throw new ValidationException(err); 310 } 311 312 if (_useMaxInclusive && d > _maxInclusive && d != _positiveInfinity) { 313 String err = "double " + d + " is greater than the maximum allowed value: " 314 + _maxInclusive; 315 throw new ValidationException(err); 316 } 317 318 if (_useMaxExclusive && d >= _maxExclusive) { 319 String err = "double " + d 320 + " is greater than or equal to the maximum exclusive value: " + _maxExclusive; 321 throw new ValidationException(err); 322 } 323 324 if (hasPattern()) { 325 super.validate(Double.toString(d), context); 326 } 327 } // -- validate 328 329 /** 330 * Validates the given Object. 331 * 332 * @param object 333 * the Object to validate 334 * @throws ValidationException if the object fails validation. 335 */ 336 public void validate(final Object object) throws ValidationException { 337 validate(object, (ValidationContext) null); 338 } // -- validate 339 340 /** 341 * Validates the given Object. 342 * 343 * @param object 344 * the Object to validate 345 * @param context 346 * the ValidationContext 347 * @throws ValidationException if the object fails validation. 348 */ 349 public void validate(final Object object, final ValidationContext context) 350 throws ValidationException { 351 if (object == null) { 352 String err = "doubleValidator cannot validate a null object."; 353 throw new ValidationException(err); 354 } 355 356 double value = 0; 357 try { 358 value = new java.lang.Double(object.toString()).doubleValue(); 359 } catch (Exception ex) { 360 String err = "Expecting a double, received instead: "; 361 err += object.getClass().getName(); 362 throw new ValidationException(err); 363 } 364 validate(value, context); 365 } //-- validate 366 367 } //-- doubleValidator