1 57 58 package org.enhydra.apache.xerces.validators.datatype; 59 import java.lang.reflect.Constructor ; 60 import java.lang.reflect.InvocationTargetException ; 61 import java.util.Hashtable ; 62 import java.util.Vector ; 63 64 import org.enhydra.apache.xerces.validators.schema.SchemaSymbols; 65 66 67 95 public class DatatypeValidatorFactoryImpl implements DatatypeValidatorFactory { 96 97 private static final boolean fDebug = false; 98 private Hashtable fRegistry; 99 private Hashtable fDTDDatatypeRegistry; 100 private Hashtable fSchemaDatatypeRegistry; 101 102 private byte fRegistryExpanded = 0; 104 105 106 private byte fSchemaValidation = 0; 110 111 public DatatypeValidatorFactoryImpl() { 112 fRegistry = new Hashtable (30); 114 115 fSchemaDatatypeRegistry = new Hashtable (40); 118 fDTDDatatypeRegistry = new Hashtable (10); 120 } 121 122 125 public void initializeDTDRegistry() { 126 127 129 if ( fRegistryExpanded == 0 ) { try { 131 fDTDDatatypeRegistry.put("string", new StringDatatypeValidator() ); 132 fDTDDatatypeRegistry.put("ID", new IDDatatypeValidator()); 133 fDTDDatatypeRegistry.put("IDREF", new IDREFDatatypeValidator()); 134 fDTDDatatypeRegistry.put("ENTITY", new ENTITYDatatypeValidator()); 135 fDTDDatatypeRegistry.put("NOTATION", new NOTATIONDatatypeValidator()); 136 137 createDTDDatatypeValidator( "IDREFS", new IDREFDatatypeValidator(), null , true ); 138 139 createDTDDatatypeValidator( "ENTITIES", new ENTITYDatatypeValidator(), null, true ); 140 141 Hashtable facets = new Hashtable (2); 142 facets.put(AbstractStringValidator.FACET_SPECIAL_TOKEN, 143 AbstractStringValidator.SPECIAL_TOKEN_NMTOKEN); 144 facets.put(SchemaSymbols.ELT_WHITESPACE, SchemaSymbols.ATT_COLLAPSE); 145 createDTDDatatypeValidator("NMTOKEN", new StringDatatypeValidator(), facets, false ); 146 147 createDTDDatatypeValidator("NMTOKENS", getDatatypeValidator( "NMTOKEN" ), null, true ); 148 fRegistryExpanded = 1; 149 } 150 catch ( InvalidDatatypeFacetException ex ) { 151 ex.printStackTrace(); 152 } 153 } 154 } 155 156 157 162 public void expandRegistryToFullSchemaSet() { 163 fSchemaValidation = 1; 164 if ( fRegistryExpanded != 2 ) { 166 DatatypeValidator v; 167 try { 168 fSchemaDatatypeRegistry.put("anySimpleType", new AnySimpleType()); 172 fSchemaDatatypeRegistry.put("boolean", new BooleanDatatypeValidator()); 173 fSchemaDatatypeRegistry.put("float", new FloatDatatypeValidator()); 174 fSchemaDatatypeRegistry.put("double", new DoubleDatatypeValidator()); 175 fSchemaDatatypeRegistry.put("decimal", new DecimalDatatypeValidator()); 176 fSchemaDatatypeRegistry.put("hexBinary", new HexBinaryDatatypeValidator()); 177 fSchemaDatatypeRegistry.put("base64Binary", new Base64BinaryDatatypeValidator()); 178 fSchemaDatatypeRegistry.put("anyURI", new AnyURIDatatypeValidator()); 179 fSchemaDatatypeRegistry.put("QName", new QNameDatatypeValidator()); 180 fSchemaDatatypeRegistry.put("duration", new DurationDatatypeValidator()); 181 fSchemaDatatypeRegistry.put("gDay", new DayDatatypeValidator()); 182 fSchemaDatatypeRegistry.put("time", new TimeDatatypeValidator()); 183 fSchemaDatatypeRegistry.put("dateTime", new DateTimeDatatypeValidator()); 184 fSchemaDatatypeRegistry.put("date", new DateDatatypeValidator()); 185 fSchemaDatatypeRegistry.put("gMonthDay", new MonthDayDatatypeValidator()); 186 fSchemaDatatypeRegistry.put("gYearMonth", new YearMonthDatatypeValidator()); 187 fSchemaDatatypeRegistry.put("gYear", new YearDatatypeValidator()); 188 fSchemaDatatypeRegistry.put("gMonth", new MonthDatatypeValidator()); 189 190 if ( fRegistryExpanded == 0 ) { 191 initializeDTDRegistry(); } 193 194 Hashtable facets = new Hashtable (2); 195 facets.put(SchemaSymbols.ELT_WHITESPACE, SchemaSymbols.ATT_REPLACE); 196 createSchemaDatatypeValidator("normalizedString", getDatatypeValidator("string"), facets, false); 197 198 199 facets.clear(); 200 facets.put(SchemaSymbols.ELT_WHITESPACE, SchemaSymbols.ATT_COLLAPSE); 201 createSchemaDatatypeValidator("token", getDatatypeValidator("string"), facets, false); 202 203 facets.clear(); 204 facets.put(SchemaSymbols.ELT_WHITESPACE, SchemaSymbols.ATT_COLLAPSE); 205 facets.put(SchemaSymbols.ELT_PATTERN , "([a-zA-Z]{2}|[iI]-[a-zA-Z]+|[xX]-[a-zA-Z]+)(-[a-zA-Z]+)*" ); 206 createSchemaDatatypeValidator("language", getDatatypeValidator("string") , facets, false ); 207 208 facets.clear(); 209 facets.put(SchemaSymbols.ELT_WHITESPACE, SchemaSymbols.ATT_COLLAPSE); 210 facets.put(AbstractStringValidator.FACET_SPECIAL_TOKEN, 211 AbstractStringValidator.SPECIAL_TOKEN_NAME); 212 createSchemaDatatypeValidator("Name", getDatatypeValidator("string"), facets, false ); 213 214 facets.clear(); 215 facets.put(SchemaSymbols.ELT_WHITESPACE, SchemaSymbols.ATT_COLLAPSE); 216 facets.put(AbstractStringValidator.FACET_SPECIAL_TOKEN, 217 AbstractStringValidator.SPECIAL_TOKEN_NCNAME); 218 createSchemaDatatypeValidator("NCName", getDatatypeValidator("string"), facets, false ); 219 220 facets.clear(); 221 facets.put(SchemaSymbols.ELT_FRACTIONDIGITS, "0"); 222 createSchemaDatatypeValidator("integer", getDatatypeValidator("decimal"), facets, false); 223 224 225 facets.clear(); 226 facets.put(SchemaSymbols.ELT_MAXINCLUSIVE , "0" ); 227 createSchemaDatatypeValidator("nonPositiveInteger", 228 getDatatypeValidator("integer"), facets, false ); 229 230 231 facets.clear(); 232 facets.put(SchemaSymbols.ELT_MAXINCLUSIVE , "-1" ); 233 createSchemaDatatypeValidator("negativeInteger", 234 getDatatypeValidator( "nonPositiveInteger"), facets, false ); 235 236 facets.clear(); 237 facets.put(SchemaSymbols.ELT_MAXINCLUSIVE , "9223372036854775807"); 238 facets.put(SchemaSymbols.ELT_MININCLUSIVE, "-9223372036854775808"); 239 createSchemaDatatypeValidator("long", getDatatypeValidator( "integer"), facets, false ); 240 241 facets.clear(); 242 facets.put(SchemaSymbols.ELT_MAXINCLUSIVE , "2147483647"); 243 facets.put(SchemaSymbols.ELT_MININCLUSIVE, "-2147483648"); 244 createSchemaDatatypeValidator("int", getDatatypeValidator( "long"), facets,false ); 245 246 facets.clear(); 247 facets.put(SchemaSymbols.ELT_MAXINCLUSIVE , "32767"); 248 facets.put(SchemaSymbols.ELT_MININCLUSIVE, "-32768"); 249 createSchemaDatatypeValidator("short", getDatatypeValidator( "int"), facets, false ); 250 251 facets.clear(); 252 facets.put(SchemaSymbols.ELT_MAXINCLUSIVE , "127"); 253 facets.put(SchemaSymbols.ELT_MININCLUSIVE, "-128"); 254 createSchemaDatatypeValidator("byte", 255 getDatatypeValidator( "short"), facets, false ); 256 257 facets.clear(); 258 facets.put(SchemaSymbols.ELT_MININCLUSIVE, "0" ); 259 createSchemaDatatypeValidator("nonNegativeInteger", 260 getDatatypeValidator( "integer"), facets, false ); 261 262 facets.clear(); 263 facets.put(SchemaSymbols.ELT_MAXINCLUSIVE, "18446744073709551615" ); 264 createSchemaDatatypeValidator("unsignedLong", 265 getDatatypeValidator( "nonNegativeInteger"), facets, false ); 266 267 268 facets.clear(); 269 facets.put(SchemaSymbols.ELT_MAXINCLUSIVE, "4294967295" ); 270 createSchemaDatatypeValidator("unsignedInt", 271 getDatatypeValidator( "unsignedLong"), facets, false ); 272 273 274 facets.clear(); 275 facets.put(SchemaSymbols.ELT_MAXINCLUSIVE, "65535" ); 276 createSchemaDatatypeValidator("unsignedShort", 277 getDatatypeValidator( "unsignedInt"), facets, false ); 278 279 280 facets.clear(); 281 facets.put(SchemaSymbols.ELT_MAXINCLUSIVE, "255" ); 282 createSchemaDatatypeValidator("unsignedByte", 283 getDatatypeValidator( "unsignedShort"), facets, false ); 284 285 facets.clear(); 286 facets.put(SchemaSymbols.ELT_MININCLUSIVE, "1" ); 287 createSchemaDatatypeValidator("positiveInteger", 288 getDatatypeValidator( "nonNegativeInteger"), facets, false ); 289 290 ((IDDatatypeValidator)getDatatypeValidator("ID")).setTokenType(AbstractStringValidator.SPECIAL_TOKEN_IDNCNAME); 292 ((IDREFDatatypeValidator)getDatatypeValidator("IDREF")).setTokenType(AbstractStringValidator.SPECIAL_TOKEN_IDREFNCNAME); 293 QNameDatatypeValidator.setNCNameValidator(getDatatypeValidator("NCName")); 295 296 fRegistryExpanded = 2; 297 } 298 catch ( InvalidDatatypeFacetException ex ) { 299 ex.printStackTrace(); 300 } 301 } 302 } 303 304 311 public void resetRegistry() { 312 fRegistry.clear(); 313 fSchemaValidation = 0; 314 } 315 316 public DatatypeValidator createDatatypeValidator(String typeName, 317 DatatypeValidator base, Hashtable facets, boolean list ) throws InvalidDatatypeFacetException { 318 if ( base == null ) { 319 return null; 320 } 321 DatatypeValidator simpleType = createSchemaValidator(typeName, base, facets, list); 322 registerUserDefinedValidator(typeName, simpleType); 323 return simpleType; 324 } 325 326 327 public DatatypeValidator createDatatypeValidator(String typeName, Vector validators) { 328 DatatypeValidator simpleType = null; 329 if ( validators!=null ) { 330 simpleType = new UnionDatatypeValidator(validators); 331 } 332 if ( simpleType !=null ) { 333 registerUserDefinedValidator(typeName, simpleType); 334 } 335 return simpleType; 336 } 337 338 339 345 public DatatypeValidator getDatatypeValidator(String type) { 346 AbstractDatatypeValidator simpleType = null; 347 if ( type == null ) { 348 return null; 349 } 350 simpleType = (AbstractDatatypeValidator) fDTDDatatypeRegistry.get(type); 351 if ( simpleType == null && fSchemaValidation == 1 ) { 352 simpleType = (AbstractDatatypeValidator) fSchemaDatatypeRegistry.get(type); 353 if ( simpleType == null ) { 354 return(DatatypeValidator) fRegistry.get(type); 355 } 356 357 } 358 359 return(DatatypeValidator)simpleType; 360 361 } 362 363 364 private DatatypeValidator createSchemaDatatypeValidator(String typeName, 365 DatatypeValidator base, Hashtable facets, boolean list ) throws InvalidDatatypeFacetException { 366 DatatypeValidator primitive = createSchemaValidator(typeName, base, facets, list); 367 registerSchemaValidator(typeName, primitive); 368 return primitive; 369 } 370 371 private DatatypeValidator createDTDDatatypeValidator(String typeName, 372 DatatypeValidator base, Hashtable facets, boolean list ) throws InvalidDatatypeFacetException { 373 DatatypeValidator primitive = createSchemaValidator(typeName, base, facets, list); 374 registerDTDValidator(typeName, primitive); 375 return primitive; 376 } 377 378 private DatatypeValidator createSchemaValidator (String typeName, 379 DatatypeValidator base, Hashtable facets, boolean list ) throws InvalidDatatypeFacetException{ 380 381 DatatypeValidator simpleType = null; 382 if ( list ) { 383 simpleType = new ListDatatypeValidator(base, facets, list); 384 } 385 else { 386 try { 387 String value = (String )facets.get(SchemaSymbols.ELT_WHITESPACE); 388 391 if ( value != null && !(base instanceof StringDatatypeValidator) ) { 392 if ( !value.equals(SchemaSymbols.ATT_COLLAPSE) ) 393 throw new InvalidDatatypeFacetException( "whiteSpace value '" + value + 394 "' for this type must be 'collapse'."); 395 facets.remove(SchemaSymbols.ELT_WHITESPACE); 396 } 397 398 Class validatorDef = base.getClass(); 399 400 Class [] validatorArgsClass = new Class [] { 401 org.enhydra.apache.xerces.validators.datatype.DatatypeValidator.class, 402 java.util.Hashtable .class, 403 boolean.class}; 404 405 Object [] validatorArgs = new Object [] { base, facets, Boolean.FALSE}; 406 Constructor validatorConstructor = validatorDef.getConstructor( validatorArgsClass ); 407 simpleType = ( DatatypeValidator ) createDatatypeValidator ( validatorConstructor, validatorArgs ); 408 } 409 catch ( NoSuchMethodException e ) { 410 e.printStackTrace(); 411 } 412 413 } 414 return simpleType; 415 } 416 417 private void registerUserDefinedValidator (String typeName, DatatypeValidator simpleType) { 418 if ( simpleType != null ) { 419 fRegistry.put(typeName, simpleType); 420 } 421 } 422 private void registerSchemaValidator (String typeName, DatatypeValidator simpleType) { 423 if ( simpleType != null ) { 424 fSchemaDatatypeRegistry.put(typeName, simpleType); 425 } 426 } 427 private void registerDTDValidator (String typeName, DatatypeValidator simpleType) { 428 if ( simpleType != null ) { 429 fDTDDatatypeRegistry.put(typeName, simpleType); 430 } 431 } 432 433 434 435 private static Object createDatatypeValidator(Constructor validatorConstructor, 436 Object [] arguments) throws InvalidDatatypeFacetException { 437 Object validator = null; 438 try { 439 validator = validatorConstructor.newInstance(arguments); 440 } 441 catch ( InstantiationException e ) { 442 if ( fDebug ) { 443 e.printStackTrace(); 444 } 445 } 446 catch ( IllegalAccessException e ) { 447 if ( fDebug ) { 448 e.printStackTrace(); 449 } 450 } 451 catch ( IllegalArgumentException e ) { 452 if ( fDebug ) { 453 e.printStackTrace(); 454 } 455 } 456 catch ( InvocationTargetException e ) { 457 if ( fDebug ) { 458 System.out.println("!! The original error message is: " + e.getTargetException().getMessage() ); 459 e.getTargetException().printStackTrace(); 460 } 461 else { 462 throw new InvalidDatatypeFacetException( e.getTargetException().getMessage() ); 463 } 464 } 465 466 return validator; 467 } 468 469 } 470 471 | Popular Tags |