| 1 57 58 package org.enhydra.apache.xerces.validators.datatype; 59 60 import java.util.Enumeration ; 61 import java.util.Hashtable ; 62 import java.util.NoSuchElementException ; 63 import java.util.StringTokenizer ; 64 import java.util.Vector ; 65 66 import org.enhydra.apache.xerces.utils.regex.RegularExpression; 67 import org.enhydra.apache.xerces.validators.schema.SchemaSymbols; 68 69 76 public class ListDatatypeValidator extends AbstractDatatypeValidator{ 77 78 private int fLength = 0; 79 private int fMaxLength = Integer.MAX_VALUE; 80 private int fMinLength = 0; 81 private Vector fEnumeration = null; 82 83 public ListDatatypeValidator () throws InvalidDatatypeFacetException{ 84 this( null, null, false ); 86 } 87 88 public ListDatatypeValidator ( DatatypeValidator base, Hashtable facets, 89 boolean derivedByList ) throws InvalidDatatypeFacetException { 90 91 fBaseValidator = base; 93 if ( facets != null ){ 94 for (Enumeration e = facets.keys(); e.hasMoreElements();) { 95 String key = (String ) e.nextElement(); 96 if ( key.equals(SchemaSymbols.ELT_LENGTH) ) { 97 fFacetsDefined |= DatatypeValidator.FACET_LENGTH; 98 String lengthValue = (String )facets.get(key); 99 try { 100 fLength = Integer.parseInt( lengthValue ); 101 } catch (NumberFormatException nfe) { 102 throw new InvalidDatatypeFacetException("Length value '"+lengthValue+"' is invalid."); 103 } 104 if ( fLength < 0 ) 105 throw new InvalidDatatypeFacetException("Length value '"+lengthValue+"' must be a nonNegativeInteger."); 106 107 } 108 else if (key.equals(SchemaSymbols.ELT_MINLENGTH) ) { 109 fFacetsDefined |= DatatypeValidator.FACET_MINLENGTH; 110 String minLengthValue = (String )facets.get(key); 111 try { 112 fMinLength = Integer.parseInt( minLengthValue ); 113 } catch (NumberFormatException nfe) { 114 throw new InvalidDatatypeFacetException("maxLength value '"+minLengthValue+"' is invalid."); 115 } 116 } 117 else if (key.equals(SchemaSymbols.ELT_MAXLENGTH) ) { 118 fFacetsDefined |= DatatypeValidator.FACET_MAXLENGTH; 119 String maxLengthValue = (String )facets.get(key); 120 try { 121 fMaxLength = Integer.parseInt( maxLengthValue ); 122 } catch (NumberFormatException nfe) { 123 throw new InvalidDatatypeFacetException("maxLength value '"+maxLengthValue+"' is invalid."); 124 } 125 } 126 else if (key.equals(SchemaSymbols.ELT_ENUMERATION)) { 127 fFacetsDefined |= DatatypeValidator.FACET_ENUMERATION; 128 fEnumeration = (Vector )facets.get(key); 129 } 130 else if ( key.equals(SchemaSymbols.ELT_PATTERN) ) { 131 fFacetsDefined |= DatatypeValidator.FACET_PATTERN; 132 fPattern = (String )facets.get(key); 133 if ( fPattern != null ) 134 fRegex = new RegularExpression(fPattern, "X"); 135 } 136 else { 137 throw new InvalidDatatypeFacetException( getErrorString(DatatypeMessageProvider.ILLEGAL_LIST_FACET, 138 DatatypeMessageProvider.MSG_NONE, new Object [] { key })); 139 } 140 } 141 if (((fFacetsDefined & DatatypeValidator.FACET_LENGTH ) != 0 ) ) { 142 if (((fFacetsDefined & DatatypeValidator.FACET_MAXLENGTH ) != 0 ) ) { 143 throw new InvalidDatatypeFacetException( 144 "It is an error for both length and maxLength to be members of facets." ); 145 } else if (((fFacetsDefined & DatatypeValidator.FACET_MINLENGTH ) != 0 ) ) { 146 throw new InvalidDatatypeFacetException( 147 "It is an error for both length and minLength to be members of facets." ); 148 } 149 } 150 151 if ( ( (fFacetsDefined & ( DatatypeValidator.FACET_MINLENGTH | 152 DatatypeValidator.FACET_MAXLENGTH) ) != 0 ) ) { 153 if ( fMinLength > fMaxLength ) { 154 throw new InvalidDatatypeFacetException( "Value of minLength = " + fMinLength + 155 "must be greater that the value of maxLength" + fMaxLength ); 156 } 157 } 158 159 if ( base != null && 164 (fFacetsDefined & DatatypeValidator.FACET_ENUMERATION) != 0 && 165 (fEnumeration != null) ) { 166 int i = 0; 167 try { 168 for (; i < fEnumeration.size(); i++) { 169 base.validate ((String )fEnumeration.elementAt(i), null); 170 } 171 } catch ( Exception idve ){ 172 throw new InvalidDatatypeFacetException( "Value of enumeration = '" + fEnumeration.elementAt(i) + 173 "' must be from the value space of base."); 174 } 175 } 176 } } 178 179 180 181 182 191 public Object validate(String content, Object state) throws InvalidDatatypeValueException 192 { 193 if ( content == null && state != null ) { 194 this.fBaseValidator.validate( content, state ); } else { 197 checkContentEnum( content, state , null); 198 } 199 return null; 200 } 201 202 203 208 public Hashtable getFacets(){ 209 return null; 210 } 211 212 public int compare( String value1, String value2 ){ 213 if (fBaseValidator instanceof ListDatatypeValidator) { return ((ListDatatypeValidator)this.fBaseValidator).compare( value1, value2 ); 215 } 216 StringTokenizer pList1 = new StringTokenizer ( value1 ); 218 StringTokenizer pList2 = new StringTokenizer ( value2 ); 219 int numberOfTokens = pList1.countTokens(); 220 if (numberOfTokens < pList2.countTokens()) { 221 return -1; 222 } 223 else if (numberOfTokens > pList2.countTokens()) { 224 return 1; 225 } 226 else { int i=0; 228 while(i++<numberOfTokens) { 229 if ( this.fBaseValidator != null ) { 230 int returnValue = this.fBaseValidator.compare( pList1.nextToken(), pList2.nextToken()); 231 if (returnValue!=0) { 232 return returnValue; } 234 } 235 236 } 237 return 0; 238 } 239 } 240 241 244 public Object clone() throws CloneNotSupportedException { 245 ListDatatypeValidator newObj = null; 246 try { 247 newObj = new ListDatatypeValidator(); 248 249 newObj.fLocale = this.fLocale; 250 newObj.fBaseValidator = this.fBaseValidator; 251 newObj.fLength = this.fLength; 252 newObj.fMaxLength = this.fMaxLength; 253 newObj.fMinLength = this.fMinLength; 254 newObj.fPattern = this.fPattern; 255 newObj.fEnumeration = this.fEnumeration; 256 newObj.fFacetsDefined = this.fFacetsDefined; 257 } catch ( InvalidDatatypeFacetException ex) { 258 ex.printStackTrace(); 259 } 260 return newObj; 261 } 262 263 272 protected void checkContentEnum( String content, Object state, Vector enumeration ) 273 throws InvalidDatatypeValueException { 274 275 278 StringTokenizer parsedList = new StringTokenizer ( content ); 279 int numberOfTokens = parsedList.countTokens(); 280 if (fBaseValidator instanceof ListDatatypeValidator) { 281 try { 283 if ( (fFacetsDefined & DatatypeValidator.FACET_MAXLENGTH) != 0 ) { 284 if ( numberOfTokens > fMaxLength ) { 285 throw new InvalidDatatypeValueException("Value '"+content+ 286 "' with length ='"+ numberOfTokens + "' tokens"+ 287 "' exceeds maximum length facet of '"+fMaxLength+"' tokens."); 288 } 289 } 290 if ( (fFacetsDefined & DatatypeValidator.FACET_MINLENGTH) != 0 ) { 291 if ( numberOfTokens < fMinLength ) { 292 throw new InvalidDatatypeValueException("Value '"+content+ 293 "' with length ='"+ numberOfTokens+ "' tokens" + 294 "' is less than minimum length facet of '"+fMinLength+"' tokens." ); 295 } 296 } 297 298 if ( (fFacetsDefined & DatatypeValidator.FACET_LENGTH) != 0 ) { 299 if ( numberOfTokens != fLength ) { 300 throw new InvalidDatatypeValueException("Value '"+content+ 301 "' with length ='"+ numberOfTokens+ "' tokens" + 302 "' is not equal to length facet of '"+fLength+"' tokens."); 303 } 304 } 305 if (enumeration!=null) { 306 if (!verifyEnum(enumeration)) { 307 throw new InvalidDatatypeValueException( 308 getErrorString(DatatypeMessageProvider.NOT_ENUM_VALUE, 309 DatatypeMessageProvider.MSG_NONE, 310 new Object [] { enumeration})); 311 } 312 }else { 313 enumeration = (fEnumeration!=null) ? fEnumeration : null; 314 } 315 316 ((ListDatatypeValidator)this.fBaseValidator).checkContentEnum( content, state, enumeration ); 319 } catch ( NoSuchElementException e ) { 320 e.printStackTrace(); 321 } 322 } 323 else { 324 327 if (enumeration !=null) { 328 StringTokenizer eTokens = null; StringTokenizer cTokens = null; String token= null; String eToken= null; boolean valid = true; 333 334 int eSize = enumeration.size(); 335 Vector enumTemp = new Vector (); enumTemp.setSize(1); 337 String currentEnumeration = null; 339 for (int i=0;i<eSize;i++) { currentEnumeration = (String )enumeration.elementAt(i); 341 eTokens = new StringTokenizer (currentEnumeration); 342 valid = true; 343 344 cTokens = (i==0)?parsedList:new StringTokenizer ( content ); 345 346 if (numberOfTokens == eTokens.countTokens()) { 347 try { 348 if (currentEnumeration.equals(content)) { 350 for (int k=0; k<numberOfTokens;k++) { if ( this.fBaseValidator != null ) { 352 this.fBaseValidator.validate( cTokens.nextToken(), state ); 353 } 354 } 355 } else { for (int j=0;j<numberOfTokens;j++) { 357 token = cTokens.nextToken(); 358 eToken = eTokens.nextToken(); 359 enumTemp.setElementAt(eToken,0); 360 if (fBaseValidator instanceof AbstractNumericValidator) { 362 ((AbstractNumericValidator)fBaseValidator).checkContentEnum(token, state, enumTemp); 363 } else { 364 if (!token.equals(eToken)) { throw new InvalidDatatypeValueException("Value '"+content+ "' must be one of "+enumeration); 366 } 367 this.fBaseValidator.validate( token, state ); 368 } 369 } 370 } 371 } catch (InvalidDatatypeValueException e) { 372 valid = false; 373 } 374 } else valid = false; 376 if (valid) break; 377 } if (!valid) { 379 throw new InvalidDatatypeValueException("Value '"+content+ "' does not match list type"); 380 } 381 } else { for (int k=0; k<numberOfTokens;k++) { 384 if ( this.fBaseValidator != null ) { this.fBaseValidator.validate( parsedList.nextToken(), state ); 386 } 387 } 388 } 389 390 } 392 } 394 395 396 406 private boolean verifyEnum (Vector enumer){ 407 408 409 if ((fFacetsDefined & DatatypeValidator.FACET_ENUMERATION ) != 0) { 410 for (Enumeration e = enumer.elements() ; e.hasMoreElements() ;) { 411 if (fEnumeration.contains(e.nextElement()) == false) { 412 return false; 413 } 414 } 415 } 416 return true; 417 } 418 419 420 } 421 422 | Popular Tags |