1 57 58 package org.enhydra.apache.xerces.validators.datatype; 59 60 61 import java.util.Enumeration ; 62 import java.util.Hashtable ; 63 import java.util.Vector ; 64 65 import org.enhydra.apache.xerces.utils.regex.RegularExpression; 66 import org.enhydra.apache.xerces.validators.schema.SchemaSymbols; 67 68 76 77 public abstract class AbstractNumericFacetValidator extends AbstractDatatypeValidator { 78 79 protected Object [] fEnumeration = null; 80 protected Object fMaxInclusive = null; 81 protected Object fMaxExclusive = null; 82 protected Object fMinInclusive = null; 83 protected Object fMinExclusive = null; 84 85 protected static final short INDETERMINATE=2; 86 87 public AbstractNumericFacetValidator () throws InvalidDatatypeFacetException { 88 this( null, null, false ); } 90 91 public AbstractNumericFacetValidator ( DatatypeValidator base, 92 Hashtable facets, 93 boolean derivedByList) throws InvalidDatatypeFacetException { 94 fBaseValidator = base; 95 96 if ( derivedByList ) 98 return; 99 initializeValues(); 100 if ( facets != null ) { 102 int result; Vector enumeration = null; 104 for ( Enumeration e = facets.keys(); e.hasMoreElements(); ) { 105 String key = (String ) e.nextElement(); 106 String value = null; 107 try { 108 if ( key.equals(SchemaSymbols.ELT_PATTERN) ) { 109 fFacetsDefined |= DatatypeValidator.FACET_PATTERN; 110 fPattern = (String ) facets.get(key); 111 if ( fPattern != null ) 112 fRegex = new RegularExpression(fPattern, "X" ); 113 } 114 else if ( key.equals(SchemaSymbols.ELT_ENUMERATION) ) { 115 enumeration = (Vector )facets.get(key); 116 fFacetsDefined |= DatatypeValidator.FACET_ENUMERATION; 117 } 118 else if ( key.equals(SchemaSymbols.ELT_MAXINCLUSIVE) ) { 119 value = ((String ) facets.get(key )); 120 fFacetsDefined |= DatatypeValidator.FACET_MAXINCLUSIVE; 121 setMaxInclusive(value); 122 } 123 else if ( key.equals(SchemaSymbols.ELT_MAXEXCLUSIVE) ) { 124 value = ((String ) facets.get(key )); 125 fFacetsDefined |= DatatypeValidator.FACET_MAXEXCLUSIVE; 126 setMaxExclusive(value); 127 } 128 else if ( key.equals(SchemaSymbols.ELT_MININCLUSIVE) ) { 129 value = ((String ) facets.get(key )); 130 fFacetsDefined |= DatatypeValidator.FACET_MININCLUSIVE; 131 setMinInclusive(value); 132 } 133 else if ( key.equals(SchemaSymbols.ELT_MINEXCLUSIVE) ) { 134 value = ((String ) facets.get(key )); 135 fFacetsDefined |= DatatypeValidator.FACET_MINEXCLUSIVE; 136 setMinExclusive(value); 137 } 138 else if (key.equals(DatatypeValidator.FACET_FIXED)) { fFlags = ((Short )facets.get(key)).shortValue(); 140 } 141 else { 142 assignAdditionalFacets(key, facets); 143 } 144 } 145 catch ( Exception ex ) { 146 if (value == null) { 147 throw new InvalidDatatypeFacetException( ex.getMessage()); 149 } 150 else{ 151 throw new InvalidDatatypeFacetException( (getErrorString (DatatypeMessageProvider.ILLEGAL_FACET_VALUE, 152 DatatypeMessageProvider.MSG_NONE, new Object [] { value, key}))); 153 } 154 } 155 } 156 157 if ( fFacetsDefined != 0 ) { 158 if ( ((fFacetsDefined & DatatypeValidator.FACET_MAXEXCLUSIVE) != 0) && 160 ((fFacetsDefined & DatatypeValidator.FACET_MAXINCLUSIVE) != 0) ) { 161 throw new InvalidDatatypeFacetException( "It is an error for both maxInclusive and maxExclusive to be specified for the same datatype." ); 162 } 163 if ( ((fFacetsDefined & DatatypeValidator.FACET_MINEXCLUSIVE) != 0) && 165 ((fFacetsDefined & DatatypeValidator.FACET_MININCLUSIVE) != 0) ) { 166 throw new InvalidDatatypeFacetException( "It is an error for both minInclusive and minExclusive to be specified for the same datatype." ); 167 } 168 169 if ( ((fFacetsDefined & DatatypeValidator.FACET_MAXINCLUSIVE) != 0) && 171 ((fFacetsDefined & DatatypeValidator.FACET_MININCLUSIVE) != 0) ) { 172 result = compareValues(fMinInclusive, fMaxInclusive); 173 if ( result == 1 || result == INDETERMINATE) 174 throw new InvalidDatatypeFacetException( "minInclusive value ='" + getMinInclusive(false) + "'must be <= maxInclusive value ='" + 175 getMaxInclusive(false) + "'. " ); 176 } 177 if ( ((fFacetsDefined & DatatypeValidator.FACET_MAXEXCLUSIVE) != 0) && ((fFacetsDefined & DatatypeValidator.FACET_MINEXCLUSIVE) != 0) ) { 179 result =compareValues(fMinExclusive, fMaxExclusive); 180 if ( result == 1 || result == INDETERMINATE) 181 throw new InvalidDatatypeFacetException( "minExclusive value ='" + getMinExclusive(false) + "'must be <= maxExclusive value ='" + 182 getMaxExclusive(false) + "'. " ); 183 } 184 if ( ((fFacetsDefined & DatatypeValidator.FACET_MAXINCLUSIVE) != 0) && ((fFacetsDefined & DatatypeValidator.FACET_MINEXCLUSIVE) != 0) ) { 186 if ( compareValues(fMinExclusive, fMaxInclusive) != -1 ) 187 throw new InvalidDatatypeFacetException( "minExclusive value ='" + getMinExclusive(false) + "'must be > maxInclusive value ='" + 188 getMaxInclusive(false) + "'. " ); 189 } 190 if ( ((fFacetsDefined & DatatypeValidator.FACET_MAXEXCLUSIVE) != 0) && ((fFacetsDefined & DatatypeValidator.FACET_MININCLUSIVE) != 0) ) { 192 if ( compareValues(fMinInclusive, fMaxExclusive) != -1 ) 193 throw new InvalidDatatypeFacetException( "minInclusive value ='" + getMinInclusive(false) + "'must be < maxExclusive value ='" + 194 getMaxExclusive(false) + "'. " ); 195 } 196 checkFacetConstraints(); 197 198 } 199 200 if ( base != null ) { 201 AbstractNumericFacetValidator numBase = (AbstractNumericFacetValidator)base; 202 if ( fFacetsDefined != 0 ) { 203 204 210 if ( ((fFacetsDefined & DatatypeValidator.FACET_MAXINCLUSIVE) != 0) ) { 211 if ( ((numBase.fFacetsDefined & DatatypeValidator.FACET_MAXINCLUSIVE) != 0)){ 212 result = compareValues(fMaxInclusive, numBase.fMaxInclusive); 213 if ((numBase.fFlags & DatatypeValidator.FACET_MAXINCLUSIVE) != 0 && 214 result != 0) { 215 throw new InvalidDatatypeFacetException( "maxInclusive value = '" + getMaxInclusive(false) + 216 "' must be equal to base.maxInclusive value = '" + 217 getMaxInclusive(true) + "' with attribute {fixed} = true" ); 218 } 219 if ( result == 1 || result == INDETERMINATE){ 220 throw new InvalidDatatypeFacetException( "maxInclusive value ='" + getMaxInclusive(false) + "' must be <= base.maxInclusive value ='" + 221 getMaxInclusive(true) + "'." ); 222 } 223 } 224 if ( ((numBase.fFacetsDefined & DatatypeValidator.FACET_MAXEXCLUSIVE) != 0) && 225 compareValues(fMaxInclusive, numBase.fMaxExclusive) != -1 ) 226 throw new InvalidDatatypeFacetException( 227 "maxInclusive value ='" + getMaxInclusive(false) + "' must be < base.maxExclusive value ='" + 228 getMaxExclusive(true) + "'." ); 229 if ( (( numBase.fFacetsDefined & DatatypeValidator.FACET_MININCLUSIVE) != 0)){ 230 result = compareValues(fMaxInclusive, numBase.fMinInclusive); 231 if (result == -1 || result == INDETERMINATE) { 232 throw new InvalidDatatypeFacetException( "maxInclusive value ='" + getMaxInclusive(false) + "' must be >= base.minInclusive value ='" + 233 getMinInclusive(true) + "'." ); 234 } 235 } 236 if ( (( numBase.fFacetsDefined & DatatypeValidator.FACET_MINEXCLUSIVE) != 0) && 237 compareValues(fMaxInclusive, numBase.fMinExclusive ) != 1 ) 238 throw new InvalidDatatypeFacetException( 239 "maxInclusive value ='" + getMaxInclusive(false) + "' must be > base.minExclusive value ='" + 240 getMinExclusive(true) + "'." ); 241 } 242 243 if ( ((fFacetsDefined & DatatypeValidator.FACET_MAXEXCLUSIVE) != 0) ) { 249 if ( (( numBase.fFacetsDefined & DatatypeValidator.FACET_MAXEXCLUSIVE) != 0)){ 250 result= compareValues(fMaxExclusive, numBase.fMaxExclusive); 251 if ((numBase.fFlags & DatatypeValidator.FACET_MAXEXCLUSIVE) != 0 && 252 result != 0) { 253 throw new InvalidDatatypeFacetException( "maxExclusive value = '" + getMaxExclusive(false) + 254 "' must be equal to base.maxExclusive value = '" + 255 getMaxExclusive(true) + "' with attribute {fixed} = true" ); 256 } 257 if (result == 1 || result == INDETERMINATE) { 258 throw new InvalidDatatypeFacetException( "maxExclusive value ='" + getMaxExclusive(false) + "' must be < base.maxExclusive value ='" + 259 getMaxExclusive(true) + "'." ); 260 } 261 } 262 if ( (( numBase.fFacetsDefined & DatatypeValidator.FACET_MAXINCLUSIVE) != 0)){ 263 result= compareValues(fMaxExclusive, numBase.fMaxInclusive); 264 if (result == 1 || result == INDETERMINATE) { 265 throw new InvalidDatatypeFacetException( "maxExclusive value ='" + getMaxExclusive(false) + "' must be <= base.maxInclusive value ='" + 266 getMaxInclusive(true) + "'." ); 267 } 268 } 269 if ( (( numBase.fFacetsDefined & DatatypeValidator.FACET_MINEXCLUSIVE) != 0) && 270 compareValues(fMaxExclusive, numBase.fMinExclusive ) != 1 ) 271 throw new InvalidDatatypeFacetException( "maxExclusive value ='" + getMaxExclusive(false) + "' must be > base.minExclusive value ='" + 272 getMinExclusive(true) + "'." ); 273 if ( (( numBase.fFacetsDefined & DatatypeValidator.FACET_MININCLUSIVE) != 0) && 274 compareValues(fMaxExclusive, numBase.fMinInclusive) != 1 ) 275 throw new InvalidDatatypeFacetException( "maxExclusive value ='" + getMaxExclusive(false) + "' must be > base.minInclusive value ='" + 276 getMinInclusive(true) + "'." ); 277 } 278 279 if ( ((fFacetsDefined & DatatypeValidator.FACET_MINEXCLUSIVE) != 0) ) { 285 if ( (( numBase.fFacetsDefined & DatatypeValidator.FACET_MINEXCLUSIVE) != 0)){ 286 result= compareValues(fMinExclusive, numBase.fMinExclusive); 287 if ((numBase.fFlags & DatatypeValidator.FACET_MINEXCLUSIVE) != 0 && 288 result != 0) { 289 throw new InvalidDatatypeFacetException( "minExclusive value = '" + getMinExclusive(false) + 290 "' must be equal to base.minExclusive value = '" + 291 getMinExclusive(true) + "' with attribute {fixed} = true" ); 292 } 293 if (result == -1 || result == INDETERMINATE) { 294 throw new InvalidDatatypeFacetException( "minExclusive value ='" + getMinExclusive(false) + "' must be >= base.minExclusive value ='" + 295 getMinExclusive(true) + "'." ); 296 } 297 } 298 if ( (( numBase.fFacetsDefined & DatatypeValidator.FACET_MAXINCLUSIVE) != 0)){ 299 result=compareValues(fMinExclusive, numBase.fMaxInclusive); 300 if (result == 1 || result == INDETERMINATE) { 301 throw new InvalidDatatypeFacetException( 302 "minExclusive value ='" + getMinExclusive(false) + "' must be <= base.maxInclusive value ='" + 303 getMaxInclusive(true) + "'." ); 304 } 305 } 306 if ( (( numBase.fFacetsDefined & DatatypeValidator.FACET_MININCLUSIVE) != 0)){ 307 result = compareValues(fMinExclusive, numBase.fMinInclusive); 308 if (result == -1 || result == INDETERMINATE) { 309 throw new InvalidDatatypeFacetException( 310 "minExclusive value ='" + getMinExclusive(false) + "' must be >= base.minInclusive value ='" + 311 getMinInclusive(true) + "'." ); 312 } 313 } 314 if ( (( numBase.fFacetsDefined & DatatypeValidator.FACET_MAXEXCLUSIVE) != 0) && 315 compareValues(fMinExclusive, numBase.fMaxExclusive) != -1 ) 316 throw new InvalidDatatypeFacetException( "minExclusive value ='" + getMinExclusive(false) + "' must be < base.maxExclusive value ='" + 317 getMaxExclusive(true) + "'." ); 318 } 319 320 if ( ((fFacetsDefined & DatatypeValidator.FACET_MININCLUSIVE) != 0) ) { 326 if ( ((numBase.fFacetsDefined & DatatypeValidator.FACET_MININCLUSIVE) != 0)){ 327 result = compareValues(fMinInclusive, numBase.fMinInclusive); 328 if ((numBase.fFlags & DatatypeValidator.FACET_MININCLUSIVE) != 0 && 329 result != 0) { 330 throw new InvalidDatatypeFacetException( "minInclusive value = '" + getMinInclusive(false) + 331 "' must be equal to base.minInclusive value = '" + 332 getMinInclusive(true) + "' with attribute {fixed} = true" ); 333 } 334 if (result == -1 || result == INDETERMINATE){ 335 throw new InvalidDatatypeFacetException( "minInclusive value ='" + getMinInclusive(false) + "' must be >= base.minInclusive value ='" + 336 getMinInclusive(true) + "'." ); 337 } 338 } 339 if ( (( numBase.fFacetsDefined & DatatypeValidator.FACET_MAXINCLUSIVE) != 0)){ 340 result=compareValues(fMinInclusive, numBase.fMaxInclusive); 341 if (result == 1 || result == INDETERMINATE) { 342 throw new InvalidDatatypeFacetException( "minInclusive value ='" + getMinInclusive(false) + "' must be <= base.maxInclusive value ='" + 343 getMaxInclusive(true) + "'." ); 344 } 345 } 346 if ( (( numBase.fFacetsDefined & DatatypeValidator.FACET_MINEXCLUSIVE) != 0) && 347 compareValues(fMinInclusive, numBase.fMinExclusive ) != 1 ) 348 throw new InvalidDatatypeFacetException( "minInclusive value ='" + getMinInclusive(false) + "' must be > base.minExclusive value ='" + 349 getMinExclusive(true) + "'." ); 350 if ( (( numBase.fFacetsDefined & DatatypeValidator.FACET_MAXEXCLUSIVE) != 0) && 351 compareValues(fMinInclusive, numBase.fMaxExclusive) != -1 ) 352 throw new InvalidDatatypeFacetException( "minInclusive value ='" + getMinInclusive(false) + "' must be < base.maxExclusive value ='" + 353 getMaxExclusive(true) + "'." ); 354 } 355 checkBaseFacetConstraints(); 356 357 } 358 362 if ( (fFacetsDefined & DatatypeValidator.FACET_ENUMERATION) == 0 && 364 (numBase.fFacetsDefined & DatatypeValidator.FACET_ENUMERATION) != 0 ) { 365 fFacetsDefined |= DatatypeValidator.FACET_ENUMERATION; 366 fEnumeration = numBase.fEnumeration; 367 } 368 if ( (( numBase.fFacetsDefined & DatatypeValidator.FACET_MAXEXCLUSIVE) != 0) && 370 !((fFacetsDefined & DatatypeValidator.FACET_MAXEXCLUSIVE) != 0) && !((fFacetsDefined & DatatypeValidator.FACET_MAXINCLUSIVE) != 0) ) { 371 fFacetsDefined |= FACET_MAXEXCLUSIVE; 372 fMaxExclusive = numBase.fMaxExclusive; 373 } 374 if ( (( numBase.fFacetsDefined & DatatypeValidator.FACET_MAXINCLUSIVE) != 0) && 376 !((fFacetsDefined & DatatypeValidator.FACET_MAXEXCLUSIVE) != 0) && !((fFacetsDefined & DatatypeValidator.FACET_MAXINCLUSIVE) != 0) ) { 377 fFacetsDefined |= FACET_MAXINCLUSIVE; 378 fMaxInclusive = numBase.fMaxInclusive; 379 } 380 if ( (( numBase.fFacetsDefined & DatatypeValidator.FACET_MINEXCLUSIVE) != 0) && 382 !((fFacetsDefined & DatatypeValidator.FACET_MINEXCLUSIVE) != 0) && !((fFacetsDefined & DatatypeValidator.FACET_MININCLUSIVE) != 0) ) { 383 fFacetsDefined |= FACET_MINEXCLUSIVE; 384 fMinExclusive = numBase.fMinExclusive; 385 } 386 if ( (( numBase.fFacetsDefined & DatatypeValidator.FACET_MININCLUSIVE) != 0) && 388 !((fFacetsDefined & DatatypeValidator.FACET_MINEXCLUSIVE) != 0) && !((fFacetsDefined & DatatypeValidator.FACET_MININCLUSIVE) != 0) ) { 389 fFacetsDefined |= FACET_MININCLUSIVE; 390 fMinInclusive = numBase.fMinInclusive; 391 } 392 393 inheritAdditionalFacets(); 394 395 fFlags |= numBase.fFlags; 397 398 if ( (fFacetsDefined & DatatypeValidator.FACET_ENUMERATION) != 0 ) { 400 if ( enumeration != null ) { 401 try { 402 setEnumeration(enumeration); 403 } 404 catch ( Exception idve ) { 405 throw new InvalidDatatypeFacetException( idve.getMessage()); 406 } 407 } 408 409 } 410 } 411 } } 413 414 415 abstract protected int compareValues (Object value1, Object value2); 419 420 abstract protected void setMaxInclusive (String value); 424 abstract protected void setMinInclusive (String value); 425 abstract protected void setMaxExclusive (String value); 426 abstract protected void setMinExclusive (String value); 427 abstract protected void setEnumeration (Vector enumeration) 428 throws InvalidDatatypeValueException; 429 430 abstract protected String getMaxInclusive (boolean isBase); 434 abstract protected String getMinInclusive (boolean isBase); 435 abstract protected String getMaxExclusive (boolean isBase); 436 abstract protected String getMinExclusive (boolean isBase); 437 438 protected void initializeValues() {} 442 443 abstract protected void assignAdditionalFacets(String key, Hashtable facets) 448 throws InvalidDatatypeFacetException; 449 450 protected void inheritAdditionalFacets() {} 454 455 protected void checkBaseFacetConstraints() throws InvalidDatatypeFacetException {} 460 461 protected void checkFacetConstraints() throws InvalidDatatypeFacetException {} 465 466 } 467 | Popular Tags |