1 57 58 package com.sun.org.apache.xerces.internal.parsers; 59 60 import java.io.IOException ; 61 import java.util.Locale ; 62 63 import com.sun.org.apache.xerces.internal.impl.Constants; 64 import com.sun.org.apache.xerces.internal.impl.XMLDTDScannerImpl; 65 import com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl; 66 import com.sun.org.apache.xerces.internal.impl.XMLEntityManager; 67 import com.sun.org.apache.xerces.internal.impl.XMLErrorReporter; 68 import com.sun.org.apache.xerces.internal.impl.XMLNamespaceBinder; 69 import com.sun.org.apache.xerces.internal.impl.dtd.XMLDTDProcessor; 70 import com.sun.org.apache.xerces.internal.impl.dtd.XMLDTDValidator; 71 import com.sun.org.apache.xerces.internal.impl.dv.DTDDVFactory; 72 import com.sun.org.apache.xerces.internal.impl.msg.XMLMessageFormatter; 73 import com.sun.org.apache.xerces.internal.impl.validation.ValidationManager; 74 import com.sun.org.apache.xerces.internal.util.SymbolTable; 75 import com.sun.org.apache.xerces.internal.xni.XMLLocator; 76 import com.sun.org.apache.xerces.internal.xni.XNIException; 77 import com.sun.org.apache.xerces.internal.xni.grammars.XMLGrammarPool; 78 import com.sun.org.apache.xerces.internal.xni.parser.XMLComponent; 79 import com.sun.org.apache.xerces.internal.xni.parser.XMLComponentManager; 80 import com.sun.org.apache.xerces.internal.xni.parser.XMLConfigurationException; 81 import com.sun.org.apache.xerces.internal.xni.parser.XMLDTDScanner; 82 import com.sun.org.apache.xerces.internal.xni.parser.XMLDocumentScanner; 83 import com.sun.org.apache.xerces.internal.xni.parser.XMLInputSource; 84 import com.sun.org.apache.xerces.internal.xni.parser.XMLPullParserConfiguration; 85 86 125 public class DTDConfiguration 126 extends BasicParserConfiguration 127 implements XMLPullParserConfiguration { 128 129 133 135 136 protected static final String WARN_ON_DUPLICATE_ATTDEF = 137 Constants.XERCES_FEATURE_PREFIX + Constants.WARN_ON_DUPLICATE_ATTDEF_FEATURE; 138 139 140 protected static final String WARN_ON_DUPLICATE_ENTITYDEF = 141 Constants.XERCES_FEATURE_PREFIX + Constants.WARN_ON_DUPLICATE_ENTITYDEF_FEATURE; 142 143 144 protected static final String WARN_ON_UNDECLARED_ELEMDEF = 145 Constants.XERCES_FEATURE_PREFIX + Constants.WARN_ON_UNDECLARED_ELEMDEF_FEATURE; 146 147 148 protected static final String ALLOW_JAVA_ENCODINGS = 149 Constants.XERCES_FEATURE_PREFIX + Constants.ALLOW_JAVA_ENCODINGS_FEATURE; 150 151 152 protected static final String CONTINUE_AFTER_FATAL_ERROR = 153 Constants.XERCES_FEATURE_PREFIX + Constants.CONTINUE_AFTER_FATAL_ERROR_FEATURE; 154 155 156 protected static final String LOAD_EXTERNAL_DTD = 157 Constants.XERCES_FEATURE_PREFIX + Constants.LOAD_EXTERNAL_DTD_FEATURE; 158 159 160 protected static final String NOTIFY_BUILTIN_REFS = 161 Constants.XERCES_FEATURE_PREFIX + Constants.NOTIFY_BUILTIN_REFS_FEATURE; 162 163 164 protected static final String NOTIFY_CHAR_REFS = 165 Constants.XERCES_FEATURE_PREFIX + Constants.NOTIFY_CHAR_REFS_FEATURE; 166 167 168 170 171 protected static final String ERROR_REPORTER = 172 Constants.XERCES_PROPERTY_PREFIX + Constants.ERROR_REPORTER_PROPERTY; 173 174 175 protected static final String ENTITY_MANAGER = 176 Constants.XERCES_PROPERTY_PREFIX + Constants.ENTITY_MANAGER_PROPERTY; 177 178 179 protected static final String DOCUMENT_SCANNER = 180 Constants.XERCES_PROPERTY_PREFIX + Constants.DOCUMENT_SCANNER_PROPERTY; 181 182 183 protected static final String DTD_SCANNER = 184 Constants.XERCES_PROPERTY_PREFIX + Constants.DTD_SCANNER_PROPERTY; 185 186 187 protected static final String XMLGRAMMAR_POOL = 188 Constants.XERCES_PROPERTY_PREFIX + Constants.XMLGRAMMAR_POOL_PROPERTY; 189 190 191 protected static final String DTD_PROCESSOR = 192 Constants.XERCES_PROPERTY_PREFIX + Constants.DTD_PROCESSOR_PROPERTY; 193 194 195 protected static final String DTD_VALIDATOR = 196 Constants.XERCES_PROPERTY_PREFIX + Constants.DTD_VALIDATOR_PROPERTY; 197 198 199 protected static final String NAMESPACE_BINDER = 200 Constants.XERCES_PROPERTY_PREFIX + Constants.NAMESPACE_BINDER_PROPERTY; 201 202 203 protected static final String DATATYPE_VALIDATOR_FACTORY = 204 Constants.XERCES_PROPERTY_PREFIX + Constants.DATATYPE_VALIDATOR_FACTORY_PROPERTY; 205 206 protected static final String VALIDATION_MANAGER = 207 Constants.XERCES_PROPERTY_PREFIX + Constants.VALIDATION_MANAGER_PROPERTY; 208 209 210 protected static final String JAXP_SCHEMA_LANGUAGE = 211 Constants.JAXP_PROPERTY_PREFIX + Constants.SCHEMA_LANGUAGE; 212 213 214 protected static final String JAXP_SCHEMA_SOURCE = 215 Constants.JAXP_PROPERTY_PREFIX + Constants.SCHEMA_SOURCE; 216 217 218 220 221 protected static final boolean PRINT_EXCEPTION_STACK_TRACE = false; 222 223 227 229 230 protected XMLGrammarPool fGrammarPool; 231 232 233 protected DTDDVFactory fDatatypeValidatorFactory; 234 235 237 238 protected XMLErrorReporter fErrorReporter; 239 240 241 protected XMLEntityManager fEntityManager; 242 243 244 protected XMLDocumentScanner fScanner; 245 246 247 protected XMLInputSource fInputSource; 248 249 250 protected XMLDTDScanner fDTDScanner; 251 252 253 protected XMLDTDProcessor fDTDProcessor; 254 255 256 protected XMLDTDValidator fDTDValidator; 257 258 259 protected XMLNamespaceBinder fNamespaceBinder; 260 261 protected ValidationManager fValidationManager; 262 264 265 protected XMLLocator fLocator; 266 267 272 protected boolean fParseInProgress = false; 273 274 278 279 public DTDConfiguration() { 280 this(null, null, null); 281 } 283 288 public DTDConfiguration(SymbolTable symbolTable) { 289 this(symbolTable, null, null); 290 } 292 303 public DTDConfiguration(SymbolTable symbolTable, 304 XMLGrammarPool grammarPool) { 305 this(symbolTable, grammarPool, null); 306 } 308 320 public DTDConfiguration(SymbolTable symbolTable, 321 XMLGrammarPool grammarPool, 322 XMLComponentManager parentSettings) { 323 super(symbolTable, parentSettings); 324 325 final String [] recognizedFeatures = { 327 CONTINUE_AFTER_FATAL_ERROR, 331 LOAD_EXTERNAL_DTD, }; 336 addRecognizedFeatures(recognizedFeatures); 337 338 setFeature(CONTINUE_AFTER_FATAL_ERROR, false); 343 setFeature(LOAD_EXTERNAL_DTD, true); 348 final String [] recognizedProperties = { 350 ERROR_REPORTER, 351 ENTITY_MANAGER, 352 DOCUMENT_SCANNER, 353 DTD_SCANNER, 354 DTD_PROCESSOR, 355 DTD_VALIDATOR, 356 NAMESPACE_BINDER, 357 XMLGRAMMAR_POOL, 358 DATATYPE_VALIDATOR_FACTORY, 359 VALIDATION_MANAGER, 360 JAXP_SCHEMA_SOURCE, 361 JAXP_SCHEMA_LANGUAGE 362 }; 363 addRecognizedProperties(recognizedProperties); 364 365 fGrammarPool = grammarPool; 366 if(fGrammarPool != null){ 367 setProperty(XMLGRAMMAR_POOL, fGrammarPool); 368 } 369 370 fEntityManager = createEntityManager(); 371 setProperty(ENTITY_MANAGER, fEntityManager); 372 addComponent(fEntityManager); 373 374 fErrorReporter = createErrorReporter(); 375 fErrorReporter.setDocumentLocator(fEntityManager.getEntityScanner()); 376 setProperty(ERROR_REPORTER, fErrorReporter); 377 addComponent(fErrorReporter); 378 379 fScanner = createDocumentScanner(); 380 setProperty(DOCUMENT_SCANNER, fScanner); 381 if (fScanner instanceof XMLComponent) { 382 addComponent((XMLComponent)fScanner); 383 } 384 385 fDTDScanner = createDTDScanner(); 386 if (fDTDScanner != null) { 387 setProperty(DTD_SCANNER, fDTDScanner); 388 if (fDTDScanner instanceof XMLComponent) { 389 addComponent((XMLComponent)fDTDScanner); 390 } 391 } 392 393 fDTDProcessor = createDTDProcessor(); 394 if (fDTDProcessor != null) { 395 setProperty(DTD_PROCESSOR, fDTDProcessor); 396 if (fDTDProcessor instanceof XMLComponent) { 397 addComponent((XMLComponent)fDTDProcessor); 398 } 399 } 400 401 fDTDValidator = createDTDValidator(); 402 if (fDTDValidator != null) { 403 setProperty(DTD_VALIDATOR, fDTDValidator); 404 addComponent(fDTDValidator); 405 } 406 407 fNamespaceBinder = createNamespaceBinder(); 408 if (fNamespaceBinder != null) { 409 setProperty(NAMESPACE_BINDER, fNamespaceBinder); 410 addComponent(fNamespaceBinder); 411 } 412 413 fDatatypeValidatorFactory = createDatatypeValidatorFactory(); 414 if (fDatatypeValidatorFactory != null) { 415 setProperty(DATATYPE_VALIDATOR_FACTORY, 416 fDatatypeValidatorFactory); 417 } 418 fValidationManager = createValidationManager(); 419 420 if (fValidationManager != null) { 421 setProperty (VALIDATION_MANAGER, fValidationManager); 422 } 423 if (fErrorReporter.getMessageFormatter(XMLMessageFormatter.XML_DOMAIN) == null) { 425 XMLMessageFormatter xmft = new XMLMessageFormatter(); 426 fErrorReporter.putMessageFormatter(XMLMessageFormatter.XML_DOMAIN, xmft); 427 fErrorReporter.putMessageFormatter(XMLMessageFormatter.XMLNS_DOMAIN, xmft); 428 } 429 430 try { 432 setLocale(Locale.getDefault()); 433 } 434 catch (XNIException e) { 435 } 438 439 } 441 445 453 public void setLocale(Locale locale) throws XNIException { 454 super.setLocale(locale); 455 fErrorReporter.setLocale(locale); 456 } 458 462 464 476 public void setInputSource(XMLInputSource inputSource) 477 throws XMLConfigurationException, IOException { 478 479 484 fInputSource = inputSource; 485 486 } 488 504 public boolean parse(boolean complete) throws XNIException, IOException { 505 if (fInputSource !=null) { 508 try { 509 reset(); 511 fScanner.setInputSource(fInputSource); 512 fInputSource = null; 513 } 514 catch (XNIException ex) { 515 if (PRINT_EXCEPTION_STACK_TRACE) 516 ex.printStackTrace(); 517 throw ex; 518 } 519 catch (IOException ex) { 520 if (PRINT_EXCEPTION_STACK_TRACE) 521 ex.printStackTrace(); 522 throw ex; 523 } 524 catch (RuntimeException ex) { 525 if (PRINT_EXCEPTION_STACK_TRACE) 526 ex.printStackTrace(); 527 throw ex; 528 } 529 catch (Exception ex) { 530 if (PRINT_EXCEPTION_STACK_TRACE) 531 ex.printStackTrace(); 532 throw new XNIException(ex); 533 } 534 } 535 536 try { 537 return fScanner.scanDocument(complete); 538 } 539 catch (XNIException ex) { 540 if (PRINT_EXCEPTION_STACK_TRACE) 541 ex.printStackTrace(); 542 throw ex; 543 } 544 catch (IOException ex) { 545 if (PRINT_EXCEPTION_STACK_TRACE) 546 ex.printStackTrace(); 547 throw ex; 548 } 549 catch (RuntimeException ex) { 550 if (PRINT_EXCEPTION_STACK_TRACE) 551 ex.printStackTrace(); 552 throw ex; 553 } 554 catch (Exception ex) { 555 if (PRINT_EXCEPTION_STACK_TRACE) 556 ex.printStackTrace(); 557 throw new XNIException(ex); 558 } 559 560 } 562 567 public void cleanup() { 568 fEntityManager.closeReaders(); 569 } 570 571 575 583 public void parse(XMLInputSource source) throws XNIException, IOException { 584 585 if (fParseInProgress) { 586 throw new XNIException("FWK005 parse may not be called while parsing."); 588 } 589 fParseInProgress = true; 590 591 try { 592 setInputSource(source); 593 parse(true); 594 } 595 catch (XNIException ex) { 596 if (PRINT_EXCEPTION_STACK_TRACE) 597 ex.printStackTrace(); 598 throw ex; 599 } 600 catch (IOException ex) { 601 if (PRINT_EXCEPTION_STACK_TRACE) 602 ex.printStackTrace(); 603 throw ex; 604 } 605 catch (RuntimeException ex) { 606 if (PRINT_EXCEPTION_STACK_TRACE) 607 ex.printStackTrace(); 608 throw ex; 609 } 610 catch (Exception ex) { 611 if (PRINT_EXCEPTION_STACK_TRACE) 612 ex.printStackTrace(); 613 throw new XNIException(ex); 614 } 615 finally { 616 fParseInProgress = false; 617 this.cleanup(); 619 } 620 621 } 623 627 632 protected void reset() throws XNIException { 633 634 if (fValidationManager != null) 635 fValidationManager.reset(); 636 configurePipeline(); 638 super.reset(); 639 } 641 642 protected void configurePipeline() { 643 644 651 if (fDTDValidator != null) { 653 fScanner.setDocumentHandler(fDTDValidator); 654 if (fFeatures.get(NAMESPACES) == Boolean.TRUE) { 655 656 fDTDValidator.setDocumentHandler(fNamespaceBinder); 658 fDTDValidator.setDocumentSource(fScanner); 659 fNamespaceBinder.setDocumentHandler(fDocumentHandler); 660 fNamespaceBinder.setDocumentSource(fDTDValidator); 661 fLastComponent = fNamespaceBinder; 662 } 663 else { 664 fDTDValidator.setDocumentHandler(fDocumentHandler); 665 fDTDValidator.setDocumentSource(fScanner); 666 fLastComponent = fDTDValidator; 667 } 668 } 669 else { 670 if (fFeatures.get(NAMESPACES) == Boolean.TRUE) { 671 fScanner.setDocumentHandler(fNamespaceBinder); 672 fNamespaceBinder.setDocumentHandler(fDocumentHandler); 673 fNamespaceBinder.setDocumentSource(fScanner); 674 fLastComponent = fNamespaceBinder; 675 } 676 else { 677 fScanner.setDocumentHandler(fDocumentHandler); 678 fLastComponent = fScanner; 679 } 680 } 681 682 configureDTDPipeline(); 683 } 685 protected void configureDTDPipeline (){ 686 687 if (fDTDScanner != null) { 689 fProperties.put(DTD_SCANNER, fDTDScanner); 690 if (fDTDProcessor != null) { 691 fProperties.put(DTD_PROCESSOR, fDTDProcessor); 692 fDTDScanner.setDTDHandler(fDTDProcessor); 693 fDTDProcessor.setDTDSource(fDTDScanner); 694 fDTDProcessor.setDTDHandler(fDTDHandler); 695 if (fDTDHandler != null) { 696 fDTDHandler.setDTDSource(fDTDProcessor); 697 } 698 699 fDTDScanner.setDTDContentModelHandler(fDTDProcessor); 700 fDTDProcessor.setDTDContentModelSource(fDTDScanner); 701 fDTDProcessor.setDTDContentModelHandler(fDTDContentModelHandler); 702 if (fDTDContentModelHandler != null) { 703 fDTDContentModelHandler.setDTDContentModelSource(fDTDProcessor); 704 } 705 } 706 else { 707 fDTDScanner.setDTDHandler(fDTDHandler); 708 if (fDTDHandler != null) { 709 fDTDHandler.setDTDSource(fDTDScanner); 710 } 711 fDTDScanner.setDTDContentModelHandler(fDTDContentModelHandler); 712 if (fDTDContentModelHandler != null) { 713 fDTDContentModelHandler.setDTDContentModelSource(fDTDScanner); 714 } 715 } 716 } 717 718 719 } 720 721 723 735 protected void checkFeature(String featureId) 736 throws XMLConfigurationException { 737 738 742 if (featureId.startsWith(Constants.XERCES_FEATURE_PREFIX)) { 743 final int suffixLength = featureId.length() - Constants.XERCES_FEATURE_PREFIX.length(); 744 745 if (suffixLength == Constants.DYNAMIC_VALIDATION_FEATURE.length() && 752 featureId.endsWith(Constants.DYNAMIC_VALIDATION_FEATURE)) { 753 return; 754 } 755 756 if (suffixLength == Constants.DEFAULT_ATTRIBUTE_VALUES_FEATURE.length() && 760 featureId.endsWith(Constants.DEFAULT_ATTRIBUTE_VALUES_FEATURE)) { 761 short type = XMLConfigurationException.NOT_SUPPORTED; 763 throw new XMLConfigurationException(type, featureId); 764 } 765 if (suffixLength == Constants.VALIDATE_CONTENT_MODELS_FEATURE.length() && 769 featureId.endsWith(Constants.VALIDATE_CONTENT_MODELS_FEATURE)) { 770 short type = XMLConfigurationException.NOT_SUPPORTED; 772 throw new XMLConfigurationException(type, featureId); 773 } 774 if (suffixLength == Constants.LOAD_DTD_GRAMMAR_FEATURE.length() && 778 featureId.endsWith(Constants.LOAD_DTD_GRAMMAR_FEATURE)) { 779 return; 780 } 781 if (suffixLength == Constants.LOAD_EXTERNAL_DTD_FEATURE.length() && 785 featureId.endsWith(Constants.LOAD_EXTERNAL_DTD_FEATURE)) { 786 return; 787 } 788 789 if (suffixLength == Constants.VALIDATE_DATATYPES_FEATURE.length() && 793 featureId.endsWith(Constants.VALIDATE_DATATYPES_FEATURE)) { 794 short type = XMLConfigurationException.NOT_SUPPORTED; 795 throw new XMLConfigurationException(type, featureId); 796 } 797 } 798 799 803 super.checkFeature(featureId); 804 805 } 807 820 protected void checkProperty(String propertyId) 821 throws XMLConfigurationException { 822 823 827 if (propertyId.startsWith(Constants.XERCES_PROPERTY_PREFIX)) { 828 final int suffixLength = propertyId.length() - Constants.XERCES_PROPERTY_PREFIX.length(); 829 830 if (suffixLength == Constants.DTD_SCANNER_PROPERTY.length() && 831 propertyId.endsWith(Constants.DTD_SCANNER_PROPERTY)) { 832 return; 833 } 834 } 835 836 840 super.checkProperty(propertyId); 841 842 } 844 846 847 protected XMLEntityManager createEntityManager() { 848 return new XMLEntityManager(); 849 } 851 852 protected XMLErrorReporter createErrorReporter() { 853 return new XMLErrorReporter(); 854 } 856 857 protected XMLDocumentScanner createDocumentScanner() { 858 return new XMLDocumentScannerImpl(); 859 } 861 862 protected XMLDTDScanner createDTDScanner() { 863 return new XMLDTDScannerImpl(); 864 } 866 867 protected XMLDTDProcessor createDTDProcessor() { 868 return new XMLDTDProcessor(); 869 } 871 872 protected XMLDTDValidator createDTDValidator() { 873 return new XMLDTDValidator(); 874 } 876 877 protected XMLNamespaceBinder createNamespaceBinder() { 878 return new XMLNamespaceBinder(); 879 } 881 882 protected DTDDVFactory createDatatypeValidatorFactory() { 883 return DTDDVFactory.getInstance(); 884 } protected ValidationManager createValidationManager(){ 886 return new ValidationManager(); 887 } 888 889 } | Popular Tags |