summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBrian Jones <cbj@gnu.org>2003-02-01 02:10:07 +0000
committerBrian Jones <cbj@gnu.org>2003-02-01 02:10:07 +0000
commita286d8e992bbc0a6180638df2bfb55e433642b78 (patch)
tree6c7ff3ab361b5543e219d49f537b2ecb38de6eb7
parenta1314139baa4e9cd89051573d3bb5a5b556f3b32 (diff)
downloadclasspath-a286d8e992bbc0a6180638df2bfb55e433642b78.tar.gz
Initial revision
-rw-r--r--external/jaxp/.cvsignore11
-rw-r--r--external/jaxp/AUTHORS9
-rw-r--r--external/jaxp/COPYING340
-rw-r--r--external/jaxp/COPYRIGHT.html100
-rw-r--r--external/jaxp/HACKING30
-rw-r--r--external/jaxp/LICENSE25
-rw-r--r--external/jaxp/Makefile.aj435
-rw-r--r--external/jaxp/Makefile.in466
-rw-r--r--external/jaxp/README122
-rw-r--r--external/jaxp/aclocal.m434
-rwxr-xr-xexternal/jaxp/automakejar133
-rw-r--r--external/jaxp/configure.in16
-rw-r--r--external/jaxp/manifest.mf28
-rw-r--r--external/jaxp/source/gnu/xml/aelfred2/JAXPFactory.java183
-rw-r--r--external/jaxp/source/gnu/xml/aelfred2/SAXDriver.java1271
-rw-r--r--external/jaxp/source/gnu/xml/aelfred2/XmlParser.java4755
-rw-r--r--external/jaxp/source/gnu/xml/aelfred2/XmlReader.java308
-rw-r--r--external/jaxp/source/gnu/xml/aelfred2/package.html477
-rw-r--r--external/jaxp/source/gnu/xml/dom/Consumer.java331
-rw-r--r--external/jaxp/source/gnu/xml/dom/DomAttr.java267
-rw-r--r--external/jaxp/source/gnu/xml/dom/DomCDATA.java88
-rw-r--r--external/jaxp/source/gnu/xml/dom/DomCharacterData.java267
-rw-r--r--external/jaxp/source/gnu/xml/dom/DomComment.java77
-rw-r--r--external/jaxp/source/gnu/xml/dom/DomDoctype.java361
-rw-r--r--external/jaxp/source/gnu/xml/dom/DomDocument.java793
-rw-r--r--external/jaxp/source/gnu/xml/dom/DomElement.java343
-rw-r--r--external/jaxp/source/gnu/xml/dom/DomEntity.java115
-rw-r--r--external/jaxp/source/gnu/xml/dom/DomEntityReference.java106
-rw-r--r--external/jaxp/source/gnu/xml/dom/DomEvent.java275
-rw-r--r--external/jaxp/source/gnu/xml/dom/DomEx.java150
-rw-r--r--external/jaxp/source/gnu/xml/dom/DomExtern.java108
-rw-r--r--external/jaxp/source/gnu/xml/dom/DomFragment.java72
-rw-r--r--external/jaxp/source/gnu/xml/dom/DomImpl.java176
-rw-r--r--external/jaxp/source/gnu/xml/dom/DomIterator.java324
-rw-r--r--external/jaxp/source/gnu/xml/dom/DomNamedNodeMap.java346
-rw-r--r--external/jaxp/source/gnu/xml/dom/DomNode.java1571
-rw-r--r--external/jaxp/source/gnu/xml/dom/DomNotation.java89
-rw-r--r--external/jaxp/source/gnu/xml/dom/DomNsNode.java165
-rw-r--r--external/jaxp/source/gnu/xml/dom/DomPI.java146
-rw-r--r--external/jaxp/source/gnu/xml/dom/DomText.java111
-rw-r--r--external/jaxp/source/gnu/xml/dom/JAXPFactory.java233
-rw-r--r--external/jaxp/source/gnu/xml/dom/package.html270
-rw-r--r--external/jaxp/source/gnu/xml/pipeline/CallFilter.java243
-rwxr-xr-xexternal/jaxp/source/gnu/xml/pipeline/DomConsumer.java945
-rwxr-xr-xexternal/jaxp/source/gnu/xml/pipeline/EventConsumer.java86
-rwxr-xr-xexternal/jaxp/source/gnu/xml/pipeline/EventFilter.java788
-rw-r--r--external/jaxp/source/gnu/xml/pipeline/LinkFilter.java236
-rw-r--r--external/jaxp/source/gnu/xml/pipeline/NSFilter.java331
-rw-r--r--external/jaxp/source/gnu/xml/pipeline/PipelineFactory.java716
-rw-r--r--external/jaxp/source/gnu/xml/pipeline/TeeConsumer.java404
-rw-r--r--external/jaxp/source/gnu/xml/pipeline/TextConsumer.java108
-rw-r--r--external/jaxp/source/gnu/xml/pipeline/ValidationConsumer.java1915
-rw-r--r--external/jaxp/source/gnu/xml/pipeline/WellFormednessFilter.java352
-rw-r--r--external/jaxp/source/gnu/xml/pipeline/XIncludeFilter.java573
-rw-r--r--external/jaxp/source/gnu/xml/pipeline/XsltFilter.java122
-rw-r--r--external/jaxp/source/gnu/xml/pipeline/package.html257
-rw-r--r--external/jaxp/source/gnu/xml/util/DoParse.java299
-rw-r--r--external/jaxp/source/gnu/xml/util/DomParser.java795
-rw-r--r--external/jaxp/source/gnu/xml/util/Resolver.java257
-rw-r--r--external/jaxp/source/gnu/xml/util/SAXNullTransformerFactory.java541
-rw-r--r--external/jaxp/source/gnu/xml/util/XCat.java1599
-rw-r--r--external/jaxp/source/gnu/xml/util/XHTMLWriter.java103
-rw-r--r--external/jaxp/source/gnu/xml/util/XMLWriter.java1918
-rw-r--r--external/jaxp/source/gnu/xml/util/package.html22
-rw-r--r--external/jaxp/source/javax/xml/parsers/ClassStuff.java158
-rw-r--r--external/jaxp/source/javax/xml/parsers/DocumentBuilder.java146
-rw-r--r--external/jaxp/source/javax/xml/parsers/DocumentBuilderFactory.java145
-rw-r--r--external/jaxp/source/javax/xml/parsers/FactoryConfigurationError.java81
-rw-r--r--external/jaxp/source/javax/xml/parsers/ParserConfigurationException.java51
-rw-r--r--external/jaxp/source/javax/xml/parsers/SAXParser.java226
-rw-r--r--external/jaxp/source/javax/xml/parsers/SAXParserFactory.java160
-rw-r--r--external/jaxp/source/javax/xml/parsers/package.html16
-rw-r--r--external/jaxp/source/javax/xml/transform/ClassStuff.java155
-rw-r--r--external/jaxp/source/javax/xml/transform/ErrorListener.java52
-rw-r--r--external/jaxp/source/javax/xml/transform/OutputKeys.java61
-rw-r--r--external/jaxp/source/javax/xml/transform/Result.java57
-rw-r--r--external/jaxp/source/javax/xml/transform/Source.java60
-rw-r--r--external/jaxp/source/javax/xml/transform/SourceLocator.java52
-rw-r--r--external/jaxp/source/javax/xml/transform/Templates.java50
-rw-r--r--external/jaxp/source/javax/xml/transform/Transformer.java142
-rw-r--r--external/jaxp/source/javax/xml/transform/TransformerConfigurationException.java59
-rw-r--r--external/jaxp/source/javax/xml/transform/TransformerException.java183
-rw-r--r--external/jaxp/source/javax/xml/transform/TransformerFactory.java140
-rw-r--r--external/jaxp/source/javax/xml/transform/TransformerFactoryConfigurationError.java73
-rw-r--r--external/jaxp/source/javax/xml/transform/URIResolver.java45
-rw-r--r--external/jaxp/source/javax/xml/transform/dom/DOMLocator.java49
-rw-r--r--external/jaxp/source/javax/xml/transform/dom/DOMResult.java90
-rw-r--r--external/jaxp/source/javax/xml/transform/dom/DOMSource.java90
-rw-r--r--external/jaxp/source/javax/xml/transform/dom/package.html5
-rw-r--r--external/jaxp/source/javax/xml/transform/package.html38
-rw-r--r--external/jaxp/source/javax/xml/transform/sax/SAXResult.java94
-rw-r--r--external/jaxp/source/javax/xml/transform/sax/SAXSource.java148
-rw-r--r--external/jaxp/source/javax/xml/transform/sax/SAXTransformerFactory.java142
-rw-r--r--external/jaxp/source/javax/xml/transform/sax/TemplatesHandler.java52
-rw-r--r--external/jaxp/source/javax/xml/transform/sax/TransformerHandler.java63
-rw-r--r--external/jaxp/source/javax/xml/transform/sax/package.html9
-rw-r--r--external/jaxp/source/javax/xml/transform/stream/StreamResult.java116
-rw-r--r--external/jaxp/source/javax/xml/transform/stream/StreamSource.java163
-rw-r--r--external/jaxp/source/javax/xml/transform/stream/package.html6
-rwxr-xr-xexternal/jaxp/source/org/w3c/dom/Attr.java124
-rwxr-xr-xexternal/jaxp/source/org/w3c/dom/CDATASection.java48
-rwxr-xr-xexternal/jaxp/source/org/w3c/dom/CharacterData.java159
-rwxr-xr-xexternal/jaxp/source/org/w3c/dom/Comment.java24
-rwxr-xr-xexternal/jaxp/source/org/w3c/dom/DOMException.java116
-rwxr-xr-xexternal/jaxp/source/org/w3c/dom/DOMImplementation.java110
-rwxr-xr-xexternal/jaxp/source/org/w3c/dom/Document.java428
-rwxr-xr-xexternal/jaxp/source/org/w3c/dom/DocumentFragment.java52
-rwxr-xr-xexternal/jaxp/source/org/w3c/dom/DocumentType.java80
-rwxr-xr-xexternal/jaxp/source/org/w3c/dom/Element.java322
-rwxr-xr-xexternal/jaxp/source/org/w3c/dom/Entity.java68
-rwxr-xr-xexternal/jaxp/source/org/w3c/dom/EntityReference.java39
-rwxr-xr-xexternal/jaxp/source/org/w3c/dom/NamedNodeMap.java174
-rwxr-xr-xexternal/jaxp/source/org/w3c/dom/Node.java526
-rwxr-xr-xexternal/jaxp/source/org/w3c/dom/NodeList.java41
-rwxr-xr-xexternal/jaxp/source/org/w3c/dom/Notation.java40
-rwxr-xr-xexternal/jaxp/source/org/w3c/dom/ProcessingInstruction.java47
-rwxr-xr-xexternal/jaxp/source/org/w3c/dom/Text.java56
-rwxr-xr-xexternal/jaxp/source/org/w3c/dom/css/CSS2Azimuth.java94
-rwxr-xr-xexternal/jaxp/source/org/w3c/dom/css/CSS2BackgroundPosition.java144
-rwxr-xr-xexternal/jaxp/source/org/w3c/dom/css/CSS2BorderSpacing.java106
-rwxr-xr-xexternal/jaxp/source/org/w3c/dom/css/CSS2CounterIncrement.java49
-rwxr-xr-xexternal/jaxp/source/org/w3c/dom/css/CSS2CounterReset.java49
-rwxr-xr-xexternal/jaxp/source/org/w3c/dom/css/CSS2Cursor.java46
-rwxr-xr-xexternal/jaxp/source/org/w3c/dom/css/CSS2FontFaceSrc.java57
-rwxr-xr-xexternal/jaxp/source/org/w3c/dom/css/CSS2FontFaceWidths.java45
-rwxr-xr-xexternal/jaxp/source/org/w3c/dom/css/CSS2PageSize.java126
-rwxr-xr-xexternal/jaxp/source/org/w3c/dom/css/CSS2PlayDuring.java84
-rwxr-xr-xexternal/jaxp/source/org/w3c/dom/css/CSS2Properties.java2265
-rwxr-xr-xexternal/jaxp/source/org/w3c/dom/css/CSS2TextShadow.java50
-rwxr-xr-xexternal/jaxp/source/org/w3c/dom/css/CSSCharsetRule.java56
-rwxr-xr-xexternal/jaxp/source/org/w3c/dom/css/CSSFontFaceRule.java28
-rwxr-xr-xexternal/jaxp/source/org/w3c/dom/css/CSSImportRule.java44
-rwxr-xr-xexternal/jaxp/source/org/w3c/dom/css/CSSMediaRule.java76
-rwxr-xr-xexternal/jaxp/source/org/w3c/dom/css/CSSPageRule.java48
-rwxr-xr-xexternal/jaxp/source/org/w3c/dom/css/CSSPrimitiveValue.java296
-rwxr-xr-xexternal/jaxp/source/org/w3c/dom/css/CSSRule.java105
-rwxr-xr-xexternal/jaxp/source/org/w3c/dom/css/CSSRuleList.java43
-rwxr-xr-xexternal/jaxp/source/org/w3c/dom/css/CSSStyleDeclaration.java164
-rwxr-xr-xexternal/jaxp/source/org/w3c/dom/css/CSSStyleRule.java51
-rwxr-xr-xexternal/jaxp/source/org/w3c/dom/css/CSSStyleSheet.java85
-rwxr-xr-xexternal/jaxp/source/org/w3c/dom/css/CSSUnknownRule.java22
-rwxr-xr-xexternal/jaxp/source/org/w3c/dom/css/CSSValue.java78
-rwxr-xr-xexternal/jaxp/source/org/w3c/dom/css/CSSValueList.java46
-rwxr-xr-xexternal/jaxp/source/org/w3c/dom/css/Counter.java38
-rwxr-xr-xexternal/jaxp/source/org/w3c/dom/css/DOMImplementationCSS.java40
-rwxr-xr-xexternal/jaxp/source/org/w3c/dom/css/DocumentCSS.java50
-rwxr-xr-xexternal/jaxp/source/org/w3c/dom/css/ElementCSSInlineStyle.java32
-rwxr-xr-xexternal/jaxp/source/org/w3c/dom/css/RGBColor.java47
-rwxr-xr-xexternal/jaxp/source/org/w3c/dom/css/Rect.java44
-rwxr-xr-xexternal/jaxp/source/org/w3c/dom/css/ViewCSS.java43
-rwxr-xr-xexternal/jaxp/source/org/w3c/dom/css/package.html11
-rwxr-xr-xexternal/jaxp/source/org/w3c/dom/events/DocumentEvent.java56
-rwxr-xr-xexternal/jaxp/source/org/w3c/dom/events/Event.java141
-rwxr-xr-xexternal/jaxp/source/org/w3c/dom/events/EventException.java36
-rwxr-xr-xexternal/jaxp/source/org/w3c/dom/events/EventListener.java41
-rwxr-xr-xexternal/jaxp/source/org/w3c/dom/events/EventTarget.java102
-rwxr-xr-xexternal/jaxp/source/org/w3c/dom/events/MouseEvent.java156
-rwxr-xr-xexternal/jaxp/source/org/w3c/dom/events/MutationEvent.java108
-rwxr-xr-xexternal/jaxp/source/org/w3c/dom/events/UIEvent.java58
-rwxr-xr-xexternal/jaxp/source/org/w3c/dom/events/package.html18
-rwxr-xr-xexternal/jaxp/source/org/w3c/dom/html/HTMLAnchorElement.java112
-rwxr-xr-xexternal/jaxp/source/org/w3c/dom/html/HTMLAppletElement.java103
-rwxr-xr-xexternal/jaxp/source/org/w3c/dom/html/HTMLAreaElement.java79
-rwxr-xr-xexternal/jaxp/source/org/w3c/dom/html/HTMLBRElement.java28
-rwxr-xr-xexternal/jaxp/source/org/w3c/dom/html/HTMLBaseElement.java34
-rwxr-xr-xexternal/jaxp/source/org/w3c/dom/html/HTMLBaseFontElement.java43
-rwxr-xr-xexternal/jaxp/source/org/w3c/dom/html/HTMLBodyElement.java69
-rwxr-xr-xexternal/jaxp/source/org/w3c/dom/html/HTMLButtonElement.java67
-rwxr-xr-xexternal/jaxp/source/org/w3c/dom/html/HTMLCollection.java57
-rwxr-xr-xexternal/jaxp/source/org/w3c/dom/html/HTMLDListElement.java28
-rwxr-xr-xexternal/jaxp/source/org/w3c/dom/html/HTMLDOMImplementation.java36
-rwxr-xr-xexternal/jaxp/source/org/w3c/dom/html/HTMLDirectoryElement.java29
-rwxr-xr-xexternal/jaxp/source/org/w3c/dom/html/HTMLDivElement.java28
-rwxr-xr-xexternal/jaxp/source/org/w3c/dom/html/HTMLDocument.java155
-rwxr-xr-xexternal/jaxp/source/org/w3c/dom/html/HTMLElement.java66
-rwxr-xr-xexternal/jaxp/source/org/w3c/dom/html/HTMLFieldSetElement.java28
-rwxr-xr-xexternal/jaxp/source/org/w3c/dom/html/HTMLFontElement.java43
-rwxr-xr-xexternal/jaxp/source/org/w3c/dom/html/HTMLFormElement.java87
-rwxr-xr-xexternal/jaxp/source/org/w3c/dom/html/HTMLFrameElement.java86
-rwxr-xr-xexternal/jaxp/source/org/w3c/dom/html/HTMLFrameSetElement.java35
-rwxr-xr-xexternal/jaxp/source/org/w3c/dom/html/HTMLHRElement.java50
-rwxr-xr-xexternal/jaxp/source/org/w3c/dom/html/HTMLHeadElement.java28
-rwxr-xr-xexternal/jaxp/source/org/w3c/dom/html/HTMLHeadingElement.java29
-rwxr-xr-xexternal/jaxp/source/org/w3c/dom/html/HTMLHtmlElement.java29
-rwxr-xr-xexternal/jaxp/source/org/w3c/dom/html/HTMLIFrameElement.java99
-rwxr-xr-xexternal/jaxp/source/org/w3c/dom/html/HTMLImageElement.java110
-rwxr-xr-xexternal/jaxp/source/org/w3c/dom/html/HTMLInputElement.java197
-rwxr-xr-xexternal/jaxp/source/org/w3c/dom/html/HTMLIsIndexElement.java35
-rwxr-xr-xexternal/jaxp/source/org/w3c/dom/html/HTMLLIElement.java36
-rwxr-xr-xexternal/jaxp/source/org/w3c/dom/html/HTMLLabelElement.java42
-rwxr-xr-xexternal/jaxp/source/org/w3c/dom/html/HTMLLegendElement.java43
-rwxr-xr-xexternal/jaxp/source/org/w3c/dom/html/HTMLLinkElement.java84
-rwxr-xr-xexternal/jaxp/source/org/w3c/dom/html/HTMLMapElement.java33
-rwxr-xr-xexternal/jaxp/source/org/w3c/dom/html/HTMLMenuElement.java29
-rwxr-xr-xexternal/jaxp/source/org/w3c/dom/html/HTMLMetaElement.java49
-rwxr-xr-xexternal/jaxp/source/org/w3c/dom/html/HTMLModElement.java36
-rwxr-xr-xexternal/jaxp/source/org/w3c/dom/html/HTMLOListElement.java42
-rwxr-xr-xexternal/jaxp/source/org/w3c/dom/html/HTMLObjectElement.java160
-rwxr-xr-xexternal/jaxp/source/org/w3c/dom/html/HTMLOptGroupElement.java36
-rwxr-xr-xexternal/jaxp/source/org/w3c/dom/html/HTMLOptionElement.java78
-rwxr-xr-xexternal/jaxp/source/org/w3c/dom/html/HTMLParagraphElement.java28
-rwxr-xr-xexternal/jaxp/source/org/w3c/dom/html/HTMLParamElement.java51
-rwxr-xr-xexternal/jaxp/source/org/w3c/dom/html/HTMLPreElement.java28
-rwxr-xr-xexternal/jaxp/source/org/w3c/dom/html/HTMLQuoteElement.java29
-rwxr-xr-xexternal/jaxp/source/org/w3c/dom/html/HTMLScriptElement.java67
-rwxr-xr-xexternal/jaxp/source/org/w3c/dom/html/HTMLSelectElement.java134
-rwxr-xr-xexternal/jaxp/source/org/w3c/dom/html/HTMLStyleElement.java42
-rwxr-xr-xexternal/jaxp/source/org/w3c/dom/html/HTMLTableCaptionElement.java28
-rwxr-xr-xexternal/jaxp/source/org/w3c/dom/html/HTMLTableCellElement.java126
-rwxr-xr-xexternal/jaxp/source/org/w3c/dom/html/HTMLTableColElement.java63
-rwxr-xr-xexternal/jaxp/source/org/w3c/dom/html/HTMLTableElement.java189
-rwxr-xr-xexternal/jaxp/source/org/w3c/dom/html/HTMLTableRowElement.java103
-rwxr-xr-xexternal/jaxp/source/org/w3c/dom/html/HTMLTableSectionElement.java85
-rwxr-xr-xexternal/jaxp/source/org/w3c/dom/html/HTMLTextAreaElement.java114
-rwxr-xr-xexternal/jaxp/source/org/w3c/dom/html/HTMLTitleElement.java27
-rwxr-xr-xexternal/jaxp/source/org/w3c/dom/html/HTMLUListElement.java35
-rwxr-xr-xexternal/jaxp/source/org/w3c/dom/html/package.html8
-rwxr-xr-xexternal/jaxp/source/org/w3c/dom/package.html9
-rw-r--r--external/jaxp/source/org/w3c/dom/ranges/DocumentRange.java33
-rw-r--r--external/jaxp/source/org/w3c/dom/ranges/Range.java416
-rw-r--r--external/jaxp/source/org/w3c/dom/ranges/RangeException.java39
-rwxr-xr-xexternal/jaxp/source/org/w3c/dom/ranges/package.html10
-rwxr-xr-xexternal/jaxp/source/org/w3c/dom/stylesheets/DocumentStyle.java34
-rwxr-xr-xexternal/jaxp/source/org/w3c/dom/stylesheets/LinkStyle.java31
-rwxr-xr-xexternal/jaxp/source/org/w3c/dom/stylesheets/MediaList.java90
-rwxr-xr-xexternal/jaxp/source/org/w3c/dom/stylesheets/StyleSheet.java103
-rwxr-xr-xexternal/jaxp/source/org/w3c/dom/stylesheets/StyleSheetList.java42
-rwxr-xr-xexternal/jaxp/source/org/w3c/dom/stylesheets/package.html10
-rwxr-xr-xexternal/jaxp/source/org/w3c/dom/traversal/DocumentTraversal.java92
-rwxr-xr-xexternal/jaxp/source/org/w3c/dom/traversal/NodeFilter.java144
-rwxr-xr-xexternal/jaxp/source/org/w3c/dom/traversal/NodeIterator.java109
-rwxr-xr-xexternal/jaxp/source/org/w3c/dom/traversal/TreeWalker.java182
-rwxr-xr-xexternal/jaxp/source/org/w3c/dom/traversal/package.html10
-rwxr-xr-xexternal/jaxp/source/org/w3c/dom/views/AbstractView.java27
-rwxr-xr-xexternal/jaxp/source/org/w3c/dom/views/DocumentView.java30
-rwxr-xr-xexternal/jaxp/source/org/w3c/dom/views/package.html10
-rwxr-xr-xexternal/jaxp/source/org/xml/sax/AttributeList.java193
-rwxr-xr-xexternal/jaxp/source/org/xml/sax/Attributes.java250
-rwxr-xr-xexternal/jaxp/source/org/xml/sax/ContentHandler.java407
-rwxr-xr-xexternal/jaxp/source/org/xml/sax/DTDHandler.java117
-rwxr-xr-xexternal/jaxp/source/org/xml/sax/DocumentHandler.java232
-rwxr-xr-xexternal/jaxp/source/org/xml/sax/EntityResolver.java119
-rwxr-xr-xexternal/jaxp/source/org/xml/sax/ErrorHandler.java125
-rwxr-xr-xexternal/jaxp/source/org/xml/sax/HandlerBase.java370
-rwxr-xr-xexternal/jaxp/source/org/xml/sax/InputSource.java336
-rwxr-xr-xexternal/jaxp/source/org/xml/sax/Locator.java136
-rwxr-xr-xexternal/jaxp/source/org/xml/sax/Parser.java209
-rwxr-xr-xexternal/jaxp/source/org/xml/sax/SAXException.java153
-rwxr-xr-xexternal/jaxp/source/org/xml/sax/SAXNotRecognizedException.java53
-rwxr-xr-xexternal/jaxp/source/org/xml/sax/SAXNotSupportedException.java53
-rwxr-xr-xexternal/jaxp/source/org/xml/sax/SAXParseException.java270
-rwxr-xr-xexternal/jaxp/source/org/xml/sax/XMLFilter.java65
-rwxr-xr-xexternal/jaxp/source/org/xml/sax/XMLReader.java397
-rw-r--r--external/jaxp/source/org/xml/sax/ext/Attributes2.java92
-rw-r--r--external/jaxp/source/org/xml/sax/ext/Attributes2Impl.java280
-rwxr-xr-xexternal/jaxp/source/org/xml/sax/ext/DeclHandler.java143
-rw-r--r--external/jaxp/source/org/xml/sax/ext/DefaultHandler2.java130
-rw-r--r--external/jaxp/source/org/xml/sax/ext/EntityResolver2.java197
-rwxr-xr-xexternal/jaxp/source/org/xml/sax/ext/LexicalHandler.java212
-rw-r--r--external/jaxp/source/org/xml/sax/ext/Locator2.java77
-rw-r--r--external/jaxp/source/org/xml/sax/ext/Locator2Impl.java101
-rwxr-xr-xexternal/jaxp/source/org/xml/sax/ext/package.html46
-rwxr-xr-xexternal/jaxp/source/org/xml/sax/helpers/AttributeListImpl.java312
-rwxr-xr-xexternal/jaxp/source/org/xml/sax/helpers/AttributesImpl.java618
-rwxr-xr-xexternal/jaxp/source/org/xml/sax/helpers/DefaultHandler.java467
-rwxr-xr-xexternal/jaxp/source/org/xml/sax/helpers/LocatorImpl.java214
-rwxr-xr-xexternal/jaxp/source/org/xml/sax/helpers/NamespaceSupport.java769
-rw-r--r--external/jaxp/source/org/xml/sax/helpers/NewInstance.java79
-rwxr-xr-xexternal/jaxp/source/org/xml/sax/helpers/ParserAdapter.java1025
-rwxr-xr-xexternal/jaxp/source/org/xml/sax/helpers/ParserFactory.java129
-rwxr-xr-xexternal/jaxp/source/org/xml/sax/helpers/XMLFilterImpl.java713
-rwxr-xr-xexternal/jaxp/source/org/xml/sax/helpers/XMLReaderAdapter.java538
-rwxr-xr-xexternal/jaxp/source/org/xml/sax/helpers/XMLReaderFactory.java201
-rwxr-xr-xexternal/jaxp/source/org/xml/sax/helpers/package.html11
-rwxr-xr-xexternal/jaxp/source/org/xml/sax/package.html229
-rw-r--r--external/jaxp/tests/dom/NodeType.java73
-rw-r--r--external/jaxp/tests/dom/nodetype.xml26
277 files changed, 54249 insertions, 0 deletions
diff --git a/external/jaxp/.cvsignore b/external/jaxp/.cvsignore
new file mode 100644
index 000000000..ec2d0aa69
--- /dev/null
+++ b/external/jaxp/.cvsignore
@@ -0,0 +1,11 @@
+config.cache
+config.log
+config.status
+configure
+Log
+gnujaxp.jar
+Makefile
+Diff
+bin
+apidoc
+apidoc.zip
diff --git a/external/jaxp/AUTHORS b/external/jaxp/AUTHORS
new file mode 100644
index 000000000..739873a50
--- /dev/null
+++ b/external/jaxp/AUTHORS
@@ -0,0 +1,9 @@
+David Brownell: dbrownell@users.sourceforge.net
+ (AElfred v2, DOM implementation, SAX and XML utilities)
+
+David Megginson: david@megginson.com
+ (original author: SAX1, SAX2 interface files; AElfred v1)
+
+Andrew Selkirk: aselkirk@mailandnews.com
+ (original author: JAXP interface files)
+
diff --git a/external/jaxp/COPYING b/external/jaxp/COPYING
new file mode 100644
index 000000000..60549be51
--- /dev/null
+++ b/external/jaxp/COPYING
@@ -0,0 +1,340 @@
+ GNU GENERAL PUBLIC LICENSE
+ Version 2, June 1991
+
+ Copyright (C) 1989, 1991 Free Software Foundation, Inc.
+ 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+ Preamble
+
+ The licenses for most software are designed to take away your
+freedom to share and change it. By contrast, the GNU General Public
+License is intended to guarantee your freedom to share and change free
+software--to make sure the software is free for all its users. This
+General Public License applies to most of the Free Software
+Foundation's software and to any other program whose authors commit to
+using it. (Some other Free Software Foundation software is covered by
+the GNU Library General Public License instead.) You can apply it to
+your programs, too.
+
+ When we speak of free software, we are referring to freedom, not
+price. Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+this service if you wish), that you receive source code or can get it
+if you want it, that you can change the software or use pieces of it
+in new free programs; and that you know you can do these things.
+
+ To protect your rights, we need to make restrictions that forbid
+anyone to deny you these rights or to ask you to surrender the rights.
+These restrictions translate to certain responsibilities for you if you
+distribute copies of the software, or if you modify it.
+
+ For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must give the recipients all the rights that
+you have. You must make sure that they, too, receive or can get the
+source code. And you must show them these terms so they know their
+rights.
+
+ We protect your rights with two steps: (1) copyright the software, and
+(2) offer you this license which gives you legal permission to copy,
+distribute and/or modify the software.
+
+ Also, for each author's protection and ours, we want to make certain
+that everyone understands that there is no warranty for this free
+software. If the software is modified by someone else and passed on, we
+want its recipients to know that what they have is not the original, so
+that any problems introduced by others will not reflect on the original
+authors' reputations.
+
+ Finally, any free program is threatened constantly by software
+patents. We wish to avoid the danger that redistributors of a free
+program will individually obtain patent licenses, in effect making the
+program proprietary. To prevent this, we have made it clear that any
+patent must be licensed for everyone's free use or not licensed at all.
+
+ The precise terms and conditions for copying, distribution and
+modification follow.
+
+ GNU GENERAL PUBLIC LICENSE
+ TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+
+ 0. This License applies to any program or other work which contains
+a notice placed by the copyright holder saying it may be distributed
+under the terms of this General Public License. The "Program", below,
+refers to any such program or work, and a "work based on the Program"
+means either the Program or any derivative work under copyright law:
+that is to say, a work containing the Program or a portion of it,
+either verbatim or with modifications and/or translated into another
+language. (Hereinafter, translation is included without limitation in
+the term "modification".) Each licensee is addressed as "you".
+
+Activities other than copying, distribution and modification are not
+covered by this License; they are outside its scope. The act of
+running the Program is not restricted, and the output from the Program
+is covered only if its contents constitute a work based on the
+Program (independent of having been made by running the Program).
+Whether that is true depends on what the Program does.
+
+ 1. You may copy and distribute verbatim copies of the Program's
+source code as you receive it, in any medium, provided that you
+conspicuously and appropriately publish on each copy an appropriate
+copyright notice and disclaimer of warranty; keep intact all the
+notices that refer to this License and to the absence of any warranty;
+and give any other recipients of the Program a copy of this License
+along with the Program.
+
+You may charge a fee for the physical act of transferring a copy, and
+you may at your option offer warranty protection in exchange for a fee.
+
+ 2. You may modify your copy or copies of the Program or any portion
+of it, thus forming a work based on the Program, and copy and
+distribute such modifications or work under the terms of Section 1
+above, provided that you also meet all of these conditions:
+
+ a) You must cause the modified files to carry prominent notices
+ stating that you changed the files and the date of any change.
+
+ b) You must cause any work that you distribute or publish, that in
+ whole or in part contains or is derived from the Program or any
+ part thereof, to be licensed as a whole at no charge to all third
+ parties under the terms of this License.
+
+ c) If the modified program normally reads commands interactively
+ when run, you must cause it, when started running for such
+ interactive use in the most ordinary way, to print or display an
+ announcement including an appropriate copyright notice and a
+ notice that there is no warranty (or else, saying that you provide
+ a warranty) and that users may redistribute the program under
+ these conditions, and telling the user how to view a copy of this
+ License. (Exception: if the Program itself is interactive but
+ does not normally print such an announcement, your work based on
+ the Program is not required to print an announcement.)
+
+These requirements apply to the modified work as a whole. If
+identifiable sections of that work are not derived from the Program,
+and can be reasonably considered independent and separate works in
+themselves, then this License, and its terms, do not apply to those
+sections when you distribute them as separate works. But when you
+distribute the same sections as part of a whole which is a work based
+on the Program, the distribution of the whole must be on the terms of
+this License, whose permissions for other licensees extend to the
+entire whole, and thus to each and every part regardless of who wrote it.
+
+Thus, it is not the intent of this section to claim rights or contest
+your rights to work written entirely by you; rather, the intent is to
+exercise the right to control the distribution of derivative or
+collective works based on the Program.
+
+In addition, mere aggregation of another work not based on the Program
+with the Program (or with a work based on the Program) on a volume of
+a storage or distribution medium does not bring the other work under
+the scope of this License.
+
+ 3. You may copy and distribute the Program (or a work based on it,
+under Section 2) in object code or executable form under the terms of
+Sections 1 and 2 above provided that you also do one of the following:
+
+ a) Accompany it with the complete corresponding machine-readable
+ source code, which must be distributed under the terms of Sections
+ 1 and 2 above on a medium customarily used for software interchange; or,
+
+ b) Accompany it with a written offer, valid for at least three
+ years, to give any third party, for a charge no more than your
+ cost of physically performing source distribution, a complete
+ machine-readable copy of the corresponding source code, to be
+ distributed under the terms of Sections 1 and 2 above on a medium
+ customarily used for software interchange; or,
+
+ c) Accompany it with the information you received as to the offer
+ to distribute corresponding source code. (This alternative is
+ allowed only for noncommercial distribution and only if you
+ received the program in object code or executable form with such
+ an offer, in accord with Subsection b above.)
+
+The source code for a work means the preferred form of the work for
+making modifications to it. For an executable work, complete source
+code means all the source code for all modules it contains, plus any
+associated interface definition files, plus the scripts used to
+control compilation and installation of the executable. However, as a
+special exception, the source code distributed need not include
+anything that is normally distributed (in either source or binary
+form) with the major components (compiler, kernel, and so on) of the
+operating system on which the executable runs, unless that component
+itself accompanies the executable.
+
+If distribution of executable or object code is made by offering
+access to copy from a designated place, then offering equivalent
+access to copy the source code from the same place counts as
+distribution of the source code, even though third parties are not
+compelled to copy the source along with the object code.
+
+ 4. You may not copy, modify, sublicense, or distribute the Program
+except as expressly provided under this License. Any attempt
+otherwise to copy, modify, sublicense or distribute the Program is
+void, and will automatically terminate your rights under this License.
+However, parties who have received copies, or rights, from you under
+this License will not have their licenses terminated so long as such
+parties remain in full compliance.
+
+ 5. You are not required to accept this License, since you have not
+signed it. However, nothing else grants you permission to modify or
+distribute the Program or its derivative works. These actions are
+prohibited by law if you do not accept this License. Therefore, by
+modifying or distributing the Program (or any work based on the
+Program), you indicate your acceptance of this License to do so, and
+all its terms and conditions for copying, distributing or modifying
+the Program or works based on it.
+
+ 6. Each time you redistribute the Program (or any work based on the
+Program), the recipient automatically receives a license from the
+original licensor to copy, distribute or modify the Program subject to
+these terms and conditions. You may not impose any further
+restrictions on the recipients' exercise of the rights granted herein.
+You are not responsible for enforcing compliance by third parties to
+this License.
+
+ 7. If, as a consequence of a court judgment or allegation of patent
+infringement or for any other reason (not limited to patent issues),
+conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License. If you cannot
+distribute so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you
+may not distribute the Program at all. For example, if a patent
+license would not permit royalty-free redistribution of the Program by
+all those who receive copies directly or indirectly through you, then
+the only way you could satisfy both it and this License would be to
+refrain entirely from distribution of the Program.
+
+If any portion of this section is held invalid or unenforceable under
+any particular circumstance, the balance of the section is intended to
+apply and the section as a whole is intended to apply in other
+circumstances.
+
+It is not the purpose of this section to induce you to infringe any
+patents or other property right claims or to contest validity of any
+such claims; this section has the sole purpose of protecting the
+integrity of the free software distribution system, which is
+implemented by public license practices. Many people have made
+generous contributions to the wide range of software distributed
+through that system in reliance on consistent application of that
+system; it is up to the author/donor to decide if he or she is willing
+to distribute software through any other system and a licensee cannot
+impose that choice.
+
+This section is intended to make thoroughly clear what is believed to
+be a consequence of the rest of this License.
+
+ 8. If the distribution and/or use of the Program is restricted in
+certain countries either by patents or by copyrighted interfaces, the
+original copyright holder who places the Program under this License
+may add an explicit geographical distribution limitation excluding
+those countries, so that distribution is permitted only in or among
+countries not thus excluded. In such case, this License incorporates
+the limitation as if written in the body of this License.
+
+ 9. The Free Software Foundation may publish revised and/or new versions
+of the General Public License from time to time. Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+Each version is given a distinguishing version number. If the Program
+specifies a version number of this License which applies to it and "any
+later version", you have the option of following the terms and conditions
+either of that version or of any later version published by the Free
+Software Foundation. If the Program does not specify a version number of
+this License, you may choose any version ever published by the Free Software
+Foundation.
+
+ 10. If you wish to incorporate parts of the Program into other free
+programs whose distribution conditions are different, write to the author
+to ask for permission. For software which is copyrighted by the Free
+Software Foundation, write to the Free Software Foundation; we sometimes
+make exceptions for this. Our decision will be guided by the two goals
+of preserving the free status of all derivatives of our free software and
+of promoting the sharing and reuse of software generally.
+
+ NO WARRANTY
+
+ 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
+FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN
+OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
+PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
+OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS
+TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE
+PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
+REPAIR OR CORRECTION.
+
+ 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
+REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
+INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
+OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
+TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
+YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
+PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
+POSSIBILITY OF SUCH DAMAGES.
+
+ END OF TERMS AND CONDITIONS
+
+ How to Apply These Terms to Your New Programs
+
+ If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+ To do so, attach the following notices to the program. It is safest
+to attach them to the start of each source file to most effectively
+convey the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+ <one line to give the program's name and a brief idea of what it does.>
+ Copyright (C) 19yy <name of author>
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+
+
+Also add information on how to contact you by electronic and paper mail.
+
+If the program is interactive, make it output a short notice like this
+when it starts in an interactive mode:
+
+ Gnomovision version 69, Copyright (C) 19yy name of author
+ Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+ This is free software, and you are welcome to redistribute it
+ under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the appropriate
+parts of the General Public License. Of course, the commands you use may
+be called something other than `show w' and `show c'; they could even be
+mouse-clicks or menu items--whatever suits your program.
+
+You should also get your employer (if you work as a programmer) or your
+school, if any, to sign a "copyright disclaimer" for the program, if
+necessary. Here is a sample; alter the names:
+
+ Yoyodyne, Inc., hereby disclaims all copyright interest in the program
+ `Gnomovision' (which makes passes at compilers) written by James Hacker.
+
+ <signature of Ty Coon>, 1 April 1989
+ Ty Coon, President of Vice
+
+This General Public License does not permit incorporating your program into
+proprietary programs. If your program is a subroutine library, you may
+consider it more useful to permit linking proprietary applications with the
+library. If this is what you want to do, use the GNU Library General
+Public License instead of this License.
diff --git a/external/jaxp/COPYRIGHT.html b/external/jaxp/COPYRIGHT.html
new file mode 100644
index 000000000..26049b750
--- /dev/null
+++ b/external/jaxp/COPYRIGHT.html
@@ -0,0 +1,100 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"
+ "http://www.w3.org/TR/REC-html40/loose.dtd">
+<html>
+ <head>
+ <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
+ <title>W3C IPR SOFTWARE NOTICE</title>
+ </head>
+ <body bgcolor="#FFFFFF" text="#000000">
+ <h1>
+ W3C IPR SOFTWARE NOTICE
+ </h1>
+ <h3>
+ Copyright &copy; 2000 <loc href="http://www.w3.org/">World Wide Web
+ Consortium</loc>, (<loc href="http://www.lcs.mit.edu/">Massachusetts
+ Institute of Technology</loc>, <loc href="http://www.inria.fr/">Institut
+ National de Recherche en Informatique et en Automatique</loc>, <loc
+ href="http://www.keio.ac.jp/">Keio University</loc>). All Rights
+ Reserved.
+ </h3>
+ <p>
+ The DOM bindings are published under the W3C Software Copyright Notice
+ and License. The software license requires "Notice of any changes or
+ modifications to the W3C files, including the date changes were made."
+ Consequently, modified versions of the DOM bindings must document that
+ they do not conform to the W3C standard; in the case of the IDL binding,
+ the pragma prefix can no longer be 'w3c.org'; in the case of the Java
+ binding, the package names can no longer be in the 'org.w3c' package.
+ </p>
+ <p>
+ <b>Note:</b> The original version of the W3C Software Copyright Notice
+ and License could be found at <a
+ href='http://www.w3.org/Consortium/Legal/copyright-software-19980720'>http://www.w3.org/Consortium/Legal/copyright-software-19980720</a>
+ </p>
+ <h3>
+ Copyright &copy; 1994-2000 <a href="http://www.w3.org/">World Wide Web
+ Consortium</a>, (<a href="http://www.lcs.mit.edu/">Massachusetts
+ Institute of Technology</a>, <a href="http://www.inria.fr/">Institut
+ National de Recherche en Informatique et en Automatique</a>, <a
+ href="http://www.keio.ac.jp/">Keio University</a>). All Rights
+ Reserved. http://www.w3.org/Consortium/Legal/
+ </h3>
+ <p>
+ This W3C work (including software, documents, or other related items) is
+ being provided by the copyright holders under the following license. By
+ obtaining, using and/or copying this work, you (the licensee) agree that
+ you have read, understood, and will comply with the following terms and
+ conditions:
+ </p>
+ <p>
+ Permission to use, copy, and modify this software and its documentation,
+ with or without modification,&nbsp; for any purpose and without fee or
+ royalty is hereby granted, provided that you include the following on ALL
+ copies of the software and documentation or portions thereof, including
+ modifications, that you make:
+ </p>
+ <ol>
+ <li>
+ The full text of this NOTICE in a location viewable to users of the
+ redistributed or derivative work.
+ </li>
+ <li>
+ Any pre-existing intellectual property disclaimers, notices, or terms
+ and conditions. If none exist, a short notice of the following form
+ (hypertext is preferred, text is permitted) should be used within the
+ body of any redistributed or derivative code: "Copyright &copy;
+ [$date-of-software] <a href="http://www.w3.org/">World Wide Web
+ Consortium</a>, (<a href="http://www.lcs.mit.edu/">Massachusetts
+ Institute of Technology</a>, <a href="http://www.inria.fr/">Institut
+ National de Recherche en Informatique et en Automatique</a>, <a
+ href="http://www.keio.ac.jp/">Keio University</a>). All Rights
+ Reserved. http://www.w3.org/Consortium/Legal/"
+ </li>
+ <li>
+ Notice of any changes or modifications to the W3C files, including the
+ date changes were made. (We recommend you provide URIs to the location
+ from which the code is derived.)
+ </li>
+ </ol>
+ <p>
+ THIS SOFTWARE AND DOCUMENTATION IS PROVIDED "AS IS," AND COPYRIGHT
+ HOLDERS MAKE NO REPRESENTATIONS OR WARRANTIES, EXPRESS OR IMPLIED,
+ INCLUDING BUT NOT LIMITED TO, WARRANTIES OF MERCHANTABILITY OR FITNESS
+ FOR ANY PARTICULAR PURPOSE OR THAT THE USE OF THE SOFTWARE OR
+ DOCUMENTATION WILL NOT INFRINGE ANY THIRD PARTY PATENTS, COPYRIGHTS,
+ TRADEMARKS OR OTHER RIGHTS.
+ </p>
+ <p>
+ COPYRIGHT HOLDERS WILL NOT BE LIABLE FOR ANY DIRECT, INDIRECT, SPECIAL OR
+ CONSEQUENTIAL DAMAGES ARISING OUT OF ANY USE OF THE SOFTWARE OR
+ DOCUMENTATION.
+ </p>
+ <p>
+ The name and trademarks of copyright holders may NOT be used in
+ advertising or publicity pertaining to the software without specific,
+ written prior permission. Title to copyright in this software and any
+ associated documentation will at all times remain with copyright
+ holders.
+ </p>
+ </body>
+</html>
diff --git a/external/jaxp/HACKING b/external/jaxp/HACKING
new file mode 100644
index 000000000..2c0253f3a
--- /dev/null
+++ b/external/jaxp/HACKING
@@ -0,0 +1,30 @@
+HACKING GNUJAXP
+---------------
+
+
+Building GNUJAXP from the CVS module
+------------------------------------
+To build GNUJAXP from the source in CVS you can simply run configure
+to generate the Makefile. The Makefile knows how to rebuild itself
+using the auto tools.
+
+To create new build files you should do:
+
+ $ make mrproper
+
+Followed by the following:
+
+ $ autoconf
+ $ ./automakejar Makefile.in
+ $ ./configure
+ $ make all
+
+You will need the GNU autotools for this. Autoconf versions 2.13
+upward are supported.
+
+
+
+
+Nic Ferrier
+ClasspathX Maintainer
+nferrier@gnu.org
diff --git a/external/jaxp/LICENSE b/external/jaxp/LICENSE
new file mode 100644
index 000000000..2c19112cf
--- /dev/null
+++ b/external/jaxp/LICENSE
@@ -0,0 +1,25 @@
+The software in this package is distributed under the GNU General Public
+License (with "Library Exception" described below), with the exceptions
+of the DOM interface sources (which are subject instead to the W3C license)
+and the SAX2 r2pre2 files (which are in the public domain).
+
+A copy of GNU General Public License (GPL) is included in this distribution,
+in the file COPYING. If you do not have the source code, it is available at:
+
+ http://www.gnu.org/software/classpathx/jaxp
+
+Source distributions include a copy of the W3C copyright as "COPYRIGHT.html".
+
+In addition, the files distributed under GPL include the following
+special exception.
+
+ As a special exception, if you link this library with
+ other files to produce an executable, this library does
+ not by itself cause the resulting executable to be covered
+ by the GNU General Public License. This exception does
+ not however invalidate any other reasons why the executable
+ file might be covered by the GNU General Public License.
+
+As such, this software can be used to run Free as well as proprietary
+applications and applets: static linking is permitted, so this can
+even be used in embedded configurations.
diff --git a/external/jaxp/Makefile.aj b/external/jaxp/Makefile.aj
new file mode 100644
index 000000000..a9909b136
--- /dev/null
+++ b/external/jaxp/Makefile.aj
@@ -0,0 +1,435 @@
+# Makefile for GNU classpathx "GNUJAXP" project
+#
+# You are free to redistribute this file. NO WARRANTY or fitness
+# for purpose is implied by this notice.
+#
+# !!! !!!
+# !!! MAKE EDITS TO "Makefile.in", not "Makefile" !!!
+# !!! !!!
+#
+# Use the "configure" command to generate the project Makefile
+# from its "Makefile.in" template.
+#
+
+##set by configure
+
+PROJECTROOT = @srcdir@
+
+JAVAC = @JAVA_CC@
+JAVAC_OPTS = -g @JAVA_CC_OPTS@
+JAR = @JAR_TOOL@
+
+SOURCEDIR = $(PROJECTROOT)/source
+SOURCEFILES = $(SOURCEDIR)/gnu/xml/aelfred2/JAXPFactory.java \
+ $(SOURCEDIR)/gnu/xml/aelfred2/SAXDriver.java \
+ $(SOURCEDIR)/gnu/xml/aelfred2/XmlParser.java \
+ $(SOURCEDIR)/gnu/xml/aelfred2/XmlReader.java \
+ $(SOURCEDIR)/gnu/xml/dom/Consumer.java \
+ $(SOURCEDIR)/gnu/xml/dom/DomAttr.java \
+ $(SOURCEDIR)/gnu/xml/dom/DomCDATA.java \
+ $(SOURCEDIR)/gnu/xml/dom/DomCharacterData.java \
+ $(SOURCEDIR)/gnu/xml/dom/DomComment.java \
+ $(SOURCEDIR)/gnu/xml/dom/DomDoctype.java \
+ $(SOURCEDIR)/gnu/xml/dom/DomDocument.java \
+ $(SOURCEDIR)/gnu/xml/dom/DomElement.java \
+ $(SOURCEDIR)/gnu/xml/dom/DomEntity.java \
+ $(SOURCEDIR)/gnu/xml/dom/DomEntityReference.java \
+ $(SOURCEDIR)/gnu/xml/dom/DomEvent.java \
+ $(SOURCEDIR)/gnu/xml/dom/DomEx.java \
+ $(SOURCEDIR)/gnu/xml/dom/DomExtern.java \
+ $(SOURCEDIR)/gnu/xml/dom/DomFragment.java \
+ $(SOURCEDIR)/gnu/xml/dom/DomImpl.java \
+ $(SOURCEDIR)/gnu/xml/dom/DomIterator.java \
+ $(SOURCEDIR)/gnu/xml/dom/DomNamedNodeMap.java \
+ $(SOURCEDIR)/gnu/xml/dom/DomNode.java \
+ $(SOURCEDIR)/gnu/xml/dom/DomNotation.java \
+ $(SOURCEDIR)/gnu/xml/dom/DomNsNode.java \
+ $(SOURCEDIR)/gnu/xml/dom/DomPI.java \
+ $(SOURCEDIR)/gnu/xml/dom/DomText.java \
+ $(SOURCEDIR)/gnu/xml/dom/JAXPFactory.java \
+ $(SOURCEDIR)/gnu/xml/pipeline/CallFilter.java \
+ $(SOURCEDIR)/gnu/xml/pipeline/DomConsumer.java \
+ $(SOURCEDIR)/gnu/xml/pipeline/EventConsumer.java \
+ $(SOURCEDIR)/gnu/xml/pipeline/EventFilter.java \
+ $(SOURCEDIR)/gnu/xml/pipeline/LinkFilter.java \
+ $(SOURCEDIR)/gnu/xml/pipeline/NSFilter.java \
+ $(SOURCEDIR)/gnu/xml/pipeline/PipelineFactory.java \
+ $(SOURCEDIR)/gnu/xml/pipeline/TeeConsumer.java \
+ $(SOURCEDIR)/gnu/xml/pipeline/TextConsumer.java \
+ $(SOURCEDIR)/gnu/xml/pipeline/ValidationConsumer.java \
+ $(SOURCEDIR)/gnu/xml/pipeline/WellFormednessFilter.java \
+ $(SOURCEDIR)/gnu/xml/pipeline/XIncludeFilter.java \
+ $(SOURCEDIR)/gnu/xml/pipeline/XsltFilter.java \
+ $(SOURCEDIR)/gnu/xml/util/DoParse.java \
+ $(SOURCEDIR)/gnu/xml/util/DomParser.java \
+ $(SOURCEDIR)/gnu/xml/util/Resolver.java \
+ $(SOURCEDIR)/gnu/xml/util/SAXNullTransformerFactory.java \
+ $(SOURCEDIR)/gnu/xml/util/XCat.java \
+ $(SOURCEDIR)/gnu/xml/util/XHTMLWriter.java \
+ $(SOURCEDIR)/gnu/xml/util/XMLWriter.java \
+ $(SOURCEDIR)/javax/xml/parsers/ClassStuff.java \
+ $(SOURCEDIR)/javax/xml/parsers/DocumentBuilder.java \
+ $(SOURCEDIR)/javax/xml/parsers/DocumentBuilderFactory.java \
+ $(SOURCEDIR)/javax/xml/parsers/FactoryConfigurationError.java \
+ $(SOURCEDIR)/javax/xml/parsers/ParserConfigurationException.java \
+ $(SOURCEDIR)/javax/xml/parsers/SAXParser.java \
+ $(SOURCEDIR)/javax/xml/parsers/SAXParserFactory.java \
+ $(SOURCEDIR)/javax/xml/transform/ClassStuff.java \
+ $(SOURCEDIR)/javax/xml/transform/ErrorListener.java \
+ $(SOURCEDIR)/javax/xml/transform/OutputKeys.java \
+ $(SOURCEDIR)/javax/xml/transform/Result.java \
+ $(SOURCEDIR)/javax/xml/transform/Source.java \
+ $(SOURCEDIR)/javax/xml/transform/SourceLocator.java \
+ $(SOURCEDIR)/javax/xml/transform/Templates.java \
+ $(SOURCEDIR)/javax/xml/transform/Transformer.java \
+ $(SOURCEDIR)/javax/xml/transform/TransformerConfigurationException.java \
+ $(SOURCEDIR)/javax/xml/transform/TransformerException.java \
+ $(SOURCEDIR)/javax/xml/transform/TransformerFactory.java \
+ $(SOURCEDIR)/javax/xml/transform/TransformerFactoryConfigurationError.java \
+ $(SOURCEDIR)/javax/xml/transform/URIResolver.java \
+ $(SOURCEDIR)/javax/xml/transform/dom/DOMLocator.java \
+ $(SOURCEDIR)/javax/xml/transform/dom/DOMResult.java \
+ $(SOURCEDIR)/javax/xml/transform/dom/DOMSource.java \
+ $(SOURCEDIR)/javax/xml/transform/sax/SAXResult.java \
+ $(SOURCEDIR)/javax/xml/transform/sax/SAXSource.java \
+ $(SOURCEDIR)/javax/xml/transform/sax/SAXTransformerFactory.java \
+ $(SOURCEDIR)/javax/xml/transform/sax/TemplatesHandler.java \
+ $(SOURCEDIR)/javax/xml/transform/sax/TransformerHandler.java \
+ $(SOURCEDIR)/javax/xml/transform/stream/StreamResult.java \
+ $(SOURCEDIR)/javax/xml/transform/stream/StreamSource.java \
+ $(SOURCEDIR)/org/w3c/dom/Attr.java \
+ $(SOURCEDIR)/org/w3c/dom/CDATASection.java \
+ $(SOURCEDIR)/org/w3c/dom/CharacterData.java \
+ $(SOURCEDIR)/org/w3c/dom/Comment.java \
+ $(SOURCEDIR)/org/w3c/dom/DOMException.java \
+ $(SOURCEDIR)/org/w3c/dom/DOMImplementation.java \
+ $(SOURCEDIR)/org/w3c/dom/Document.java \
+ $(SOURCEDIR)/org/w3c/dom/DocumentFragment.java \
+ $(SOURCEDIR)/org/w3c/dom/DocumentType.java \
+ $(SOURCEDIR)/org/w3c/dom/Element.java \
+ $(SOURCEDIR)/org/w3c/dom/Entity.java \
+ $(SOURCEDIR)/org/w3c/dom/EntityReference.java \
+ $(SOURCEDIR)/org/w3c/dom/NamedNodeMap.java \
+ $(SOURCEDIR)/org/w3c/dom/Node.java \
+ $(SOURCEDIR)/org/w3c/dom/NodeList.java \
+ $(SOURCEDIR)/org/w3c/dom/Notation.java \
+ $(SOURCEDIR)/org/w3c/dom/ProcessingInstruction.java \
+ $(SOURCEDIR)/org/w3c/dom/Text.java \
+ $(SOURCEDIR)/org/w3c/dom/css/CSS2Azimuth.java \
+ $(SOURCEDIR)/org/w3c/dom/css/CSS2BackgroundPosition.java \
+ $(SOURCEDIR)/org/w3c/dom/css/CSS2BorderSpacing.java \
+ $(SOURCEDIR)/org/w3c/dom/css/CSS2CounterIncrement.java \
+ $(SOURCEDIR)/org/w3c/dom/css/CSS2CounterReset.java \
+ $(SOURCEDIR)/org/w3c/dom/css/CSS2Cursor.java \
+ $(SOURCEDIR)/org/w3c/dom/css/CSS2FontFaceSrc.java \
+ $(SOURCEDIR)/org/w3c/dom/css/CSS2FontFaceWidths.java \
+ $(SOURCEDIR)/org/w3c/dom/css/CSS2PageSize.java \
+ $(SOURCEDIR)/org/w3c/dom/css/CSS2PlayDuring.java \
+ $(SOURCEDIR)/org/w3c/dom/css/CSS2Properties.java \
+ $(SOURCEDIR)/org/w3c/dom/css/CSS2TextShadow.java \
+ $(SOURCEDIR)/org/w3c/dom/css/CSSCharsetRule.java \
+ $(SOURCEDIR)/org/w3c/dom/css/CSSFontFaceRule.java \
+ $(SOURCEDIR)/org/w3c/dom/css/CSSImportRule.java \
+ $(SOURCEDIR)/org/w3c/dom/css/CSSMediaRule.java \
+ $(SOURCEDIR)/org/w3c/dom/css/CSSPageRule.java \
+ $(SOURCEDIR)/org/w3c/dom/css/CSSPrimitiveValue.java \
+ $(SOURCEDIR)/org/w3c/dom/css/CSSRule.java \
+ $(SOURCEDIR)/org/w3c/dom/css/CSSRuleList.java \
+ $(SOURCEDIR)/org/w3c/dom/css/CSSStyleDeclaration.java \
+ $(SOURCEDIR)/org/w3c/dom/css/CSSStyleRule.java \
+ $(SOURCEDIR)/org/w3c/dom/css/CSSStyleSheet.java \
+ $(SOURCEDIR)/org/w3c/dom/css/CSSUnknownRule.java \
+ $(SOURCEDIR)/org/w3c/dom/css/CSSValue.java \
+ $(SOURCEDIR)/org/w3c/dom/css/CSSValueList.java \
+ $(SOURCEDIR)/org/w3c/dom/css/Counter.java \
+ $(SOURCEDIR)/org/w3c/dom/css/DOMImplementationCSS.java \
+ $(SOURCEDIR)/org/w3c/dom/css/DocumentCSS.java \
+ $(SOURCEDIR)/org/w3c/dom/css/ElementCSSInlineStyle.java \
+ $(SOURCEDIR)/org/w3c/dom/css/RGBColor.java \
+ $(SOURCEDIR)/org/w3c/dom/css/Rect.java \
+ $(SOURCEDIR)/org/w3c/dom/css/ViewCSS.java \
+ $(SOURCEDIR)/org/w3c/dom/events/DocumentEvent.java \
+ $(SOURCEDIR)/org/w3c/dom/events/Event.java \
+ $(SOURCEDIR)/org/w3c/dom/events/EventException.java \
+ $(SOURCEDIR)/org/w3c/dom/events/EventListener.java \
+ $(SOURCEDIR)/org/w3c/dom/events/EventTarget.java \
+ $(SOURCEDIR)/org/w3c/dom/events/MouseEvent.java \
+ $(SOURCEDIR)/org/w3c/dom/events/MutationEvent.java \
+ $(SOURCEDIR)/org/w3c/dom/events/UIEvent.java \
+ $(SOURCEDIR)/org/w3c/dom/html/HTMLAnchorElement.java \
+ $(SOURCEDIR)/org/w3c/dom/html/HTMLAppletElement.java \
+ $(SOURCEDIR)/org/w3c/dom/html/HTMLAreaElement.java \
+ $(SOURCEDIR)/org/w3c/dom/html/HTMLBRElement.java \
+ $(SOURCEDIR)/org/w3c/dom/html/HTMLBaseElement.java \
+ $(SOURCEDIR)/org/w3c/dom/html/HTMLBaseFontElement.java \
+ $(SOURCEDIR)/org/w3c/dom/html/HTMLBodyElement.java \
+ $(SOURCEDIR)/org/w3c/dom/html/HTMLButtonElement.java \
+ $(SOURCEDIR)/org/w3c/dom/html/HTMLCollection.java \
+ $(SOURCEDIR)/org/w3c/dom/html/HTMLDListElement.java \
+ $(SOURCEDIR)/org/w3c/dom/html/HTMLDOMImplementation.java \
+ $(SOURCEDIR)/org/w3c/dom/html/HTMLDirectoryElement.java \
+ $(SOURCEDIR)/org/w3c/dom/html/HTMLDivElement.java \
+ $(SOURCEDIR)/org/w3c/dom/html/HTMLDocument.java \
+ $(SOURCEDIR)/org/w3c/dom/html/HTMLElement.java \
+ $(SOURCEDIR)/org/w3c/dom/html/HTMLFieldSetElement.java \
+ $(SOURCEDIR)/org/w3c/dom/html/HTMLFontElement.java \
+ $(SOURCEDIR)/org/w3c/dom/html/HTMLFormElement.java \
+ $(SOURCEDIR)/org/w3c/dom/html/HTMLFrameElement.java \
+ $(SOURCEDIR)/org/w3c/dom/html/HTMLFrameSetElement.java \
+ $(SOURCEDIR)/org/w3c/dom/html/HTMLHRElement.java \
+ $(SOURCEDIR)/org/w3c/dom/html/HTMLHeadElement.java \
+ $(SOURCEDIR)/org/w3c/dom/html/HTMLHeadingElement.java \
+ $(SOURCEDIR)/org/w3c/dom/html/HTMLHtmlElement.java \
+ $(SOURCEDIR)/org/w3c/dom/html/HTMLIFrameElement.java \
+ $(SOURCEDIR)/org/w3c/dom/html/HTMLImageElement.java \
+ $(SOURCEDIR)/org/w3c/dom/html/HTMLInputElement.java \
+ $(SOURCEDIR)/org/w3c/dom/html/HTMLIsIndexElement.java \
+ $(SOURCEDIR)/org/w3c/dom/html/HTMLLIElement.java \
+ $(SOURCEDIR)/org/w3c/dom/html/HTMLLabelElement.java \
+ $(SOURCEDIR)/org/w3c/dom/html/HTMLLegendElement.java \
+ $(SOURCEDIR)/org/w3c/dom/html/HTMLLinkElement.java \
+ $(SOURCEDIR)/org/w3c/dom/html/HTMLMapElement.java \
+ $(SOURCEDIR)/org/w3c/dom/html/HTMLMenuElement.java \
+ $(SOURCEDIR)/org/w3c/dom/html/HTMLMetaElement.java \
+ $(SOURCEDIR)/org/w3c/dom/html/HTMLModElement.java \
+ $(SOURCEDIR)/org/w3c/dom/html/HTMLOListElement.java \
+ $(SOURCEDIR)/org/w3c/dom/html/HTMLObjectElement.java \
+ $(SOURCEDIR)/org/w3c/dom/html/HTMLOptGroupElement.java \
+ $(SOURCEDIR)/org/w3c/dom/html/HTMLOptionElement.java \
+ $(SOURCEDIR)/org/w3c/dom/html/HTMLParagraphElement.java \
+ $(SOURCEDIR)/org/w3c/dom/html/HTMLParamElement.java \
+ $(SOURCEDIR)/org/w3c/dom/html/HTMLPreElement.java \
+ $(SOURCEDIR)/org/w3c/dom/html/HTMLQuoteElement.java \
+ $(SOURCEDIR)/org/w3c/dom/html/HTMLScriptElement.java \
+ $(SOURCEDIR)/org/w3c/dom/html/HTMLSelectElement.java \
+ $(SOURCEDIR)/org/w3c/dom/html/HTMLStyleElement.java \
+ $(SOURCEDIR)/org/w3c/dom/html/HTMLTableCaptionElement.java \
+ $(SOURCEDIR)/org/w3c/dom/html/HTMLTableCellElement.java \
+ $(SOURCEDIR)/org/w3c/dom/html/HTMLTableColElement.java \
+ $(SOURCEDIR)/org/w3c/dom/html/HTMLTableElement.java \
+ $(SOURCEDIR)/org/w3c/dom/html/HTMLTableRowElement.java \
+ $(SOURCEDIR)/org/w3c/dom/html/HTMLTableSectionElement.java \
+ $(SOURCEDIR)/org/w3c/dom/html/HTMLTextAreaElement.java \
+ $(SOURCEDIR)/org/w3c/dom/html/HTMLTitleElement.java \
+ $(SOURCEDIR)/org/w3c/dom/html/HTMLUListElement.java \
+ $(SOURCEDIR)/org/w3c/dom/ranges/DocumentRange.java \
+ $(SOURCEDIR)/org/w3c/dom/ranges/Range.java \
+ $(SOURCEDIR)/org/w3c/dom/ranges/RangeException.java \
+ $(SOURCEDIR)/org/w3c/dom/stylesheets/DocumentStyle.java \
+ $(SOURCEDIR)/org/w3c/dom/stylesheets/LinkStyle.java \
+ $(SOURCEDIR)/org/w3c/dom/stylesheets/MediaList.java \
+ $(SOURCEDIR)/org/w3c/dom/stylesheets/StyleSheet.java \
+ $(SOURCEDIR)/org/w3c/dom/stylesheets/StyleSheetList.java \
+ $(SOURCEDIR)/org/w3c/dom/traversal/DocumentTraversal.java \
+ $(SOURCEDIR)/org/w3c/dom/traversal/NodeFilter.java \
+ $(SOURCEDIR)/org/w3c/dom/traversal/NodeIterator.java \
+ $(SOURCEDIR)/org/w3c/dom/traversal/TreeWalker.java \
+ $(SOURCEDIR)/org/w3c/dom/views/AbstractView.java \
+ $(SOURCEDIR)/org/w3c/dom/views/DocumentView.java \
+ $(SOURCEDIR)/org/xml/sax/AttributeList.java \
+ $(SOURCEDIR)/org/xml/sax/Attributes.java \
+ $(SOURCEDIR)/org/xml/sax/ContentHandler.java \
+ $(SOURCEDIR)/org/xml/sax/DTDHandler.java \
+ $(SOURCEDIR)/org/xml/sax/DocumentHandler.java \
+ $(SOURCEDIR)/org/xml/sax/EntityResolver.java \
+ $(SOURCEDIR)/org/xml/sax/ErrorHandler.java \
+ $(SOURCEDIR)/org/xml/sax/HandlerBase.java \
+ $(SOURCEDIR)/org/xml/sax/InputSource.java \
+ $(SOURCEDIR)/org/xml/sax/Locator.java \
+ $(SOURCEDIR)/org/xml/sax/Parser.java \
+ $(SOURCEDIR)/org/xml/sax/SAXException.java \
+ $(SOURCEDIR)/org/xml/sax/SAXNotRecognizedException.java \
+ $(SOURCEDIR)/org/xml/sax/SAXNotSupportedException.java \
+ $(SOURCEDIR)/org/xml/sax/SAXParseException.java \
+ $(SOURCEDIR)/org/xml/sax/XMLFilter.java \
+ $(SOURCEDIR)/org/xml/sax/XMLReader.java \
+ $(SOURCEDIR)/org/xml/sax/ext/Attributes2.java \
+ $(SOURCEDIR)/org/xml/sax/ext/Attributes2Impl.java \
+ $(SOURCEDIR)/org/xml/sax/ext/DeclHandler.java \
+ $(SOURCEDIR)/org/xml/sax/ext/DefaultHandler2.java \
+ $(SOURCEDIR)/org/xml/sax/ext/EntityResolver2.java \
+ $(SOURCEDIR)/org/xml/sax/ext/LexicalHandler.java \
+ $(SOURCEDIR)/org/xml/sax/ext/Locator2.java \
+ $(SOURCEDIR)/org/xml/sax/ext/Locator2Impl.java \
+ $(SOURCEDIR)/org/xml/sax/helpers/AttributeListImpl.java \
+ $(SOURCEDIR)/org/xml/sax/helpers/AttributesImpl.java \
+ $(SOURCEDIR)/org/xml/sax/helpers/DefaultHandler.java \
+ $(SOURCEDIR)/org/xml/sax/helpers/LocatorImpl.java \
+ $(SOURCEDIR)/org/xml/sax/helpers/NamespaceSupport.java \
+ $(SOURCEDIR)/org/xml/sax/helpers/NewInstance.java \
+ $(SOURCEDIR)/org/xml/sax/helpers/ParserAdapter.java \
+ $(SOURCEDIR)/org/xml/sax/helpers/ParserFactory.java \
+ $(SOURCEDIR)/org/xml/sax/helpers/XMLFilterImpl.java \
+ $(SOURCEDIR)/org/xml/sax/helpers/XMLReaderAdapter.java \
+ $(SOURCEDIR)/org/xml/sax/helpers/XMLReaderFactory.java
+
+PKGFILES = \
+ $(SOURCEDIR)/gnu/xml/aelfred2/package.html \
+ $(SOURCEDIR)/gnu/xml/dom/package.html \
+ $(SOURCEDIR)/gnu/xml/pipeline/package.html \
+ $(SOURCEDIR)/gnu/xml/util/package.html \
+ $(SOURCEDIR)/javax/xml/parsers/package.html \
+ $(SOURCEDIR)/javax/xml/transform/package.html \
+ $(SOURCEDIR)/javax/xml/transform/dom/package.html \
+ $(SOURCEDIR)/javax/xml/transform/sax/package.html \
+ $(SOURCEDIR)/javax/xml/transform/stream/package.html \
+ $(SOURCEDIR)/org/w3c/dom/package.html \
+ $(SOURCEDIR)/org/w3c/dom/events/package.html \
+ $(SOURCEDIR)/org/w3c/dom/traversal/package.html \
+ $(SOURCEDIR)/org/w3c/dom/views/package.html \
+ $(SOURCEDIR)/org/xml/sax/package.html \
+ $(SOURCEDIR)/org/xml/sax/ext/package.html \
+ $(SOURCEDIR)/org/xml/sax/helpers/package.html \
+
+
+#GCJ options.
+GCJ_OPTS = --encoding=8859_1 -fsyntax-only -femit-class-files
+GCJ_COMPILE = $(GCJ) $(GCJ_OPTS) -Isource -foutput-class-dir=$(CC-DESTDIR)
+
+# Variables which define some useful constants
+newline:=\\n
+empty:=
+space:=$(empty) $(empty)
+
+
+default: gnujaxp.jar
+
+all: gnujaxp.jar javadoc
+
+
+# Ensure the makefile can update itself.
+Makefile: Makefile.in configure.in
+ $(SHELL) ./config.status
+
+Makefile.in: Makefile.aj
+ $(SHELL) $(PROJECTROOT)/automakejar ./Makefile.in
+
+
+# Build the META-INF directory.
+META-INF META-INF/services:
+ mkdir $@
+
+# Admin file targets.
+META-INF/COPYING: META-INF $(PROJECTROOT)/COPYING
+ cp $(PROJECTROOT)/COPYING $@
+
+META-INF/LICENSE: META-INF $(PROJECTROOT)/LICENSE
+ cp $(PROJECTROOT)/LICENSE $@
+
+# Support file targets.
+META-INF/services/org.xml.sax.driver: META-INF/services
+ echo -n gnu.xml.aelfred2.XmlReader > $@
+
+META-INF/services/javax.xml.parsers.SAXParserFactory: META-INF/services
+ echo -n gnu.xml.aelfred2.JAXPFactory > $@
+
+META-INF/services/javax.xml.parsers.DocumentBuilderFactory: META-INF/services
+ echo -n gnu.xml.dom.JAXPFactory > $@
+
+SUPPORTFILES = \
+ META-INF/COPYING \
+ META-INF/LICENSE \
+ META-INF/services/org.xml.sax.driver \
+ META-INF/services/javax.xml.parsers.SAXParserFactory \
+ META-INF/services/javax.xml.parsers.DocumentBuilderFactory
+
+
+# This is an automakejar target.
+# You must run the automakejar script on this Make file to
+# cause the target to be legal Make syntax.
+gnujaxp.jar:
+ sourcedir=$(SOURCEDIR)
+ sourcefiles=$(SOURCEFILES)
+ classpath=$(wildcard lib/*.jar)
+ classesdest=classes
+ otherfiles=$(SUPPORTFILES)
+ manifest=$(PROJECTROOT)/manifest.mf
+# End of automakejar target.
+
+
+
+# for normal development
+# must rerun "make" after this
+clean:
+ -rm -rf gnujaxp.jar classes META-INF Log apidoc apidoc.zip
+ -rm -rf gnujaxp-*.zip
+
+# Nust rerun automakejar and configure after this
+distclean: clean
+ -rm -f Makefile Makefile.in config.cache config.log config.status
+
+# Nust rerun aclocal, autoconf, automakejar and configure after this
+mrproper: distclean
+ -rm -f configure
+
+javadoc: apidoc.zip
+apidoc.zip:
+ -rm -rf apidoc
+ mkdir -p apidoc
+ javadoc -d apidoc \
+ -windowtitle "GNU JAXP Library" \
+ -nodeprecatedlist \
+ -version -author -use \
+ -bottom "<p>Source code is under GPL \
+ (with library exception) in the JAXP project at \
+ <a href='http://www.gnu.org/software/classpathx/jaxp'> \
+ http://www.gnu.org/software/classpathx/jaxp</a> \
+ <br>This documentation was derived from that\
+ source code on `date -I`.\
+ </p>" \
+ -classpath "$(SOURCEDIR)" \
+ \
+ -group "AElfred2 and SAX2 Utilities" \
+ "gnu.xml.aelfred2:gnu.xml.pipeline:gnu.xml.util" \
+ -group "DOM2, implementing DOM Level 2" \
+ "gnu.xml.dom" \
+ \
+ -group "SAX and SAX2" \
+ "org.xml.sax:org.xml.sax.ext:org.xml.sax.helpers" \
+ -group "DOM Level 2 (W3C)" \
+ "org.w3c.*" \
+ -group "Java API for XML (v1.1) (Sun)" \
+ "javax.xml.*" \
+ \
+ gnu.xml.aelfred2 gnu.xml.pipeline gnu.xml.util \
+ gnu.xml.dom \
+ org.xml.sax org.xml.sax.ext org.xml.sax.helpers \
+ org.w3c.dom org.w3c.dom.events \
+ javax.xml.parsers \
+ javax.xml.transform javax.xml.transform.dom \
+ javax.xml.transform.sax javax.xml.transform.stream
+ jar cMf apidoc.zip apidoc
+
+#
+# RELEASE ENGINEERING:
+# "full" release has source, jarfile, javadoc, and extras
+#
+# override VERSION in environment, like:
+# $ VERSION=1.0beta1 make -e release
+#
+VERSION = dev
+
+release: gnujaxp-$(VERSION).zip
+
+
+DIST_DIR = gnujaxp-$(VERSION)
+
+# XXX ChangeLog
+FILES := \
+ LICENSE COPYING COPYRIGHT.html README \
+ gnujaxp.jar \
+ configure Makefile.in manifest.mf
+
+gnujaxp-$(VERSION).zip: $(FILES) apidoc.zip $(SOURCEFILES) $(PKGFILES)
+ for F in $(FILES) $(SOURCEFILES) $(PKGFILES) ;\
+ do \
+ mkdir -p `dirname $(DIST_DIR)/$$F` ;\
+ cp $$F $(DIST_DIR)/$$F ;\
+ done
+ cd $(DIST_DIR); jar xf ../apidoc.zip
+ chmod +x $(DIST_DIR)/configure
+ cp gnujaxp.jar $(DIST_DIR)
+ # jar cMf gnujaxp-$(VERSION).zip $(DIST_DIR)
+ zip -qr9 gnujaxp-$(VERSION).zip $(DIST_DIR)
+ rm -rf $(DIST_DIR)
+
diff --git a/external/jaxp/Makefile.in b/external/jaxp/Makefile.in
new file mode 100644
index 000000000..3bef3f131
--- /dev/null
+++ b/external/jaxp/Makefile.in
@@ -0,0 +1,466 @@
+# Makefile for GNU classpathx "GNUJAXP" project
+#
+# You are free to redistribute this file. NO WARRANTY or fitness
+# for purpose is implied by this notice.
+#
+# !!! !!!
+# !!! MAKE EDITS TO "Makefile.in", not "Makefile" !!!
+# !!! !!!
+#
+# Use the "configure" command to generate the project Makefile
+# from its "Makefile.in" template.
+#
+
+##set by configure
+
+PROJECTROOT = @srcdir@
+
+JAVAC = @JAVA_CC@
+JAVAC_OPTS = -g @JAVA_CC_OPTS@
+JAR = @JAR_TOOL@
+
+SOURCEDIR = $(PROJECTROOT)/source
+SOURCEFILES = $(SOURCEDIR)/gnu/xml/aelfred2/JAXPFactory.java \
+ $(SOURCEDIR)/gnu/xml/aelfred2/SAXDriver.java \
+ $(SOURCEDIR)/gnu/xml/aelfred2/XmlParser.java \
+ $(SOURCEDIR)/gnu/xml/aelfred2/XmlReader.java \
+ $(SOURCEDIR)/gnu/xml/dom/Consumer.java \
+ $(SOURCEDIR)/gnu/xml/dom/DomAttr.java \
+ $(SOURCEDIR)/gnu/xml/dom/DomCDATA.java \
+ $(SOURCEDIR)/gnu/xml/dom/DomCharacterData.java \
+ $(SOURCEDIR)/gnu/xml/dom/DomComment.java \
+ $(SOURCEDIR)/gnu/xml/dom/DomDoctype.java \
+ $(SOURCEDIR)/gnu/xml/dom/DomDocument.java \
+ $(SOURCEDIR)/gnu/xml/dom/DomElement.java \
+ $(SOURCEDIR)/gnu/xml/dom/DomEntity.java \
+ $(SOURCEDIR)/gnu/xml/dom/DomEntityReference.java \
+ $(SOURCEDIR)/gnu/xml/dom/DomEvent.java \
+ $(SOURCEDIR)/gnu/xml/dom/DomEx.java \
+ $(SOURCEDIR)/gnu/xml/dom/DomExtern.java \
+ $(SOURCEDIR)/gnu/xml/dom/DomFragment.java \
+ $(SOURCEDIR)/gnu/xml/dom/DomImpl.java \
+ $(SOURCEDIR)/gnu/xml/dom/DomIterator.java \
+ $(SOURCEDIR)/gnu/xml/dom/DomNamedNodeMap.java \
+ $(SOURCEDIR)/gnu/xml/dom/DomNode.java \
+ $(SOURCEDIR)/gnu/xml/dom/DomNotation.java \
+ $(SOURCEDIR)/gnu/xml/dom/DomNsNode.java \
+ $(SOURCEDIR)/gnu/xml/dom/DomPI.java \
+ $(SOURCEDIR)/gnu/xml/dom/DomText.java \
+ $(SOURCEDIR)/gnu/xml/dom/JAXPFactory.java \
+ $(SOURCEDIR)/gnu/xml/pipeline/CallFilter.java \
+ $(SOURCEDIR)/gnu/xml/pipeline/DomConsumer.java \
+ $(SOURCEDIR)/gnu/xml/pipeline/EventConsumer.java \
+ $(SOURCEDIR)/gnu/xml/pipeline/EventFilter.java \
+ $(SOURCEDIR)/gnu/xml/pipeline/LinkFilter.java \
+ $(SOURCEDIR)/gnu/xml/pipeline/NSFilter.java \
+ $(SOURCEDIR)/gnu/xml/pipeline/PipelineFactory.java \
+ $(SOURCEDIR)/gnu/xml/pipeline/TeeConsumer.java \
+ $(SOURCEDIR)/gnu/xml/pipeline/TextConsumer.java \
+ $(SOURCEDIR)/gnu/xml/pipeline/ValidationConsumer.java \
+ $(SOURCEDIR)/gnu/xml/pipeline/WellFormednessFilter.java \
+ $(SOURCEDIR)/gnu/xml/pipeline/XIncludeFilter.java \
+ $(SOURCEDIR)/gnu/xml/pipeline/XsltFilter.java \
+ $(SOURCEDIR)/gnu/xml/util/DoParse.java \
+ $(SOURCEDIR)/gnu/xml/util/DomParser.java \
+ $(SOURCEDIR)/gnu/xml/util/Resolver.java \
+ $(SOURCEDIR)/gnu/xml/util/SAXNullTransformerFactory.java \
+ $(SOURCEDIR)/gnu/xml/util/XCat.java \
+ $(SOURCEDIR)/gnu/xml/util/XHTMLWriter.java \
+ $(SOURCEDIR)/gnu/xml/util/XMLWriter.java \
+ $(SOURCEDIR)/javax/xml/parsers/ClassStuff.java \
+ $(SOURCEDIR)/javax/xml/parsers/DocumentBuilder.java \
+ $(SOURCEDIR)/javax/xml/parsers/DocumentBuilderFactory.java \
+ $(SOURCEDIR)/javax/xml/parsers/FactoryConfigurationError.java \
+ $(SOURCEDIR)/javax/xml/parsers/ParserConfigurationException.java \
+ $(SOURCEDIR)/javax/xml/parsers/SAXParser.java \
+ $(SOURCEDIR)/javax/xml/parsers/SAXParserFactory.java \
+ $(SOURCEDIR)/javax/xml/transform/ClassStuff.java \
+ $(SOURCEDIR)/javax/xml/transform/ErrorListener.java \
+ $(SOURCEDIR)/javax/xml/transform/OutputKeys.java \
+ $(SOURCEDIR)/javax/xml/transform/Result.java \
+ $(SOURCEDIR)/javax/xml/transform/Source.java \
+ $(SOURCEDIR)/javax/xml/transform/SourceLocator.java \
+ $(SOURCEDIR)/javax/xml/transform/Templates.java \
+ $(SOURCEDIR)/javax/xml/transform/Transformer.java \
+ $(SOURCEDIR)/javax/xml/transform/TransformerConfigurationException.java \
+ $(SOURCEDIR)/javax/xml/transform/TransformerException.java \
+ $(SOURCEDIR)/javax/xml/transform/TransformerFactory.java \
+ $(SOURCEDIR)/javax/xml/transform/TransformerFactoryConfigurationError.java \
+ $(SOURCEDIR)/javax/xml/transform/URIResolver.java \
+ $(SOURCEDIR)/javax/xml/transform/dom/DOMLocator.java \
+ $(SOURCEDIR)/javax/xml/transform/dom/DOMResult.java \
+ $(SOURCEDIR)/javax/xml/transform/dom/DOMSource.java \
+ $(SOURCEDIR)/javax/xml/transform/sax/SAXResult.java \
+ $(SOURCEDIR)/javax/xml/transform/sax/SAXSource.java \
+ $(SOURCEDIR)/javax/xml/transform/sax/SAXTransformerFactory.java \
+ $(SOURCEDIR)/javax/xml/transform/sax/TemplatesHandler.java \
+ $(SOURCEDIR)/javax/xml/transform/sax/TransformerHandler.java \
+ $(SOURCEDIR)/javax/xml/transform/stream/StreamResult.java \
+ $(SOURCEDIR)/javax/xml/transform/stream/StreamSource.java \
+ $(SOURCEDIR)/org/w3c/dom/Attr.java \
+ $(SOURCEDIR)/org/w3c/dom/CDATASection.java \
+ $(SOURCEDIR)/org/w3c/dom/CharacterData.java \
+ $(SOURCEDIR)/org/w3c/dom/Comment.java \
+ $(SOURCEDIR)/org/w3c/dom/DOMException.java \
+ $(SOURCEDIR)/org/w3c/dom/DOMImplementation.java \
+ $(SOURCEDIR)/org/w3c/dom/Document.java \
+ $(SOURCEDIR)/org/w3c/dom/DocumentFragment.java \
+ $(SOURCEDIR)/org/w3c/dom/DocumentType.java \
+ $(SOURCEDIR)/org/w3c/dom/Element.java \
+ $(SOURCEDIR)/org/w3c/dom/Entity.java \
+ $(SOURCEDIR)/org/w3c/dom/EntityReference.java \
+ $(SOURCEDIR)/org/w3c/dom/NamedNodeMap.java \
+ $(SOURCEDIR)/org/w3c/dom/Node.java \
+ $(SOURCEDIR)/org/w3c/dom/NodeList.java \
+ $(SOURCEDIR)/org/w3c/dom/Notation.java \
+ $(SOURCEDIR)/org/w3c/dom/ProcessingInstruction.java \
+ $(SOURCEDIR)/org/w3c/dom/Text.java \
+ $(SOURCEDIR)/org/w3c/dom/css/CSS2Azimuth.java \
+ $(SOURCEDIR)/org/w3c/dom/css/CSS2BackgroundPosition.java \
+ $(SOURCEDIR)/org/w3c/dom/css/CSS2BorderSpacing.java \
+ $(SOURCEDIR)/org/w3c/dom/css/CSS2CounterIncrement.java \
+ $(SOURCEDIR)/org/w3c/dom/css/CSS2CounterReset.java \
+ $(SOURCEDIR)/org/w3c/dom/css/CSS2Cursor.java \
+ $(SOURCEDIR)/org/w3c/dom/css/CSS2FontFaceSrc.java \
+ $(SOURCEDIR)/org/w3c/dom/css/CSS2FontFaceWidths.java \
+ $(SOURCEDIR)/org/w3c/dom/css/CSS2PageSize.java \
+ $(SOURCEDIR)/org/w3c/dom/css/CSS2PlayDuring.java \
+ $(SOURCEDIR)/org/w3c/dom/css/CSS2Properties.java \
+ $(SOURCEDIR)/org/w3c/dom/css/CSS2TextShadow.java \
+ $(SOURCEDIR)/org/w3c/dom/css/CSSCharsetRule.java \
+ $(SOURCEDIR)/org/w3c/dom/css/CSSFontFaceRule.java \
+ $(SOURCEDIR)/org/w3c/dom/css/CSSImportRule.java \
+ $(SOURCEDIR)/org/w3c/dom/css/CSSMediaRule.java \
+ $(SOURCEDIR)/org/w3c/dom/css/CSSPageRule.java \
+ $(SOURCEDIR)/org/w3c/dom/css/CSSPrimitiveValue.java \
+ $(SOURCEDIR)/org/w3c/dom/css/CSSRule.java \
+ $(SOURCEDIR)/org/w3c/dom/css/CSSRuleList.java \
+ $(SOURCEDIR)/org/w3c/dom/css/CSSStyleDeclaration.java \
+ $(SOURCEDIR)/org/w3c/dom/css/CSSStyleRule.java \
+ $(SOURCEDIR)/org/w3c/dom/css/CSSStyleSheet.java \
+ $(SOURCEDIR)/org/w3c/dom/css/CSSUnknownRule.java \
+ $(SOURCEDIR)/org/w3c/dom/css/CSSValue.java \
+ $(SOURCEDIR)/org/w3c/dom/css/CSSValueList.java \
+ $(SOURCEDIR)/org/w3c/dom/css/Counter.java \
+ $(SOURCEDIR)/org/w3c/dom/css/DOMImplementationCSS.java \
+ $(SOURCEDIR)/org/w3c/dom/css/DocumentCSS.java \
+ $(SOURCEDIR)/org/w3c/dom/css/ElementCSSInlineStyle.java \
+ $(SOURCEDIR)/org/w3c/dom/css/RGBColor.java \
+ $(SOURCEDIR)/org/w3c/dom/css/Rect.java \
+ $(SOURCEDIR)/org/w3c/dom/css/ViewCSS.java \
+ $(SOURCEDIR)/org/w3c/dom/events/DocumentEvent.java \
+ $(SOURCEDIR)/org/w3c/dom/events/Event.java \
+ $(SOURCEDIR)/org/w3c/dom/events/EventException.java \
+ $(SOURCEDIR)/org/w3c/dom/events/EventListener.java \
+ $(SOURCEDIR)/org/w3c/dom/events/EventTarget.java \
+ $(SOURCEDIR)/org/w3c/dom/events/MouseEvent.java \
+ $(SOURCEDIR)/org/w3c/dom/events/MutationEvent.java \
+ $(SOURCEDIR)/org/w3c/dom/events/UIEvent.java \
+ $(SOURCEDIR)/org/w3c/dom/html/HTMLAnchorElement.java \
+ $(SOURCEDIR)/org/w3c/dom/html/HTMLAppletElement.java \
+ $(SOURCEDIR)/org/w3c/dom/html/HTMLAreaElement.java \
+ $(SOURCEDIR)/org/w3c/dom/html/HTMLBRElement.java \
+ $(SOURCEDIR)/org/w3c/dom/html/HTMLBaseElement.java \
+ $(SOURCEDIR)/org/w3c/dom/html/HTMLBaseFontElement.java \
+ $(SOURCEDIR)/org/w3c/dom/html/HTMLBodyElement.java \
+ $(SOURCEDIR)/org/w3c/dom/html/HTMLButtonElement.java \
+ $(SOURCEDIR)/org/w3c/dom/html/HTMLCollection.java \
+ $(SOURCEDIR)/org/w3c/dom/html/HTMLDListElement.java \
+ $(SOURCEDIR)/org/w3c/dom/html/HTMLDOMImplementation.java \
+ $(SOURCEDIR)/org/w3c/dom/html/HTMLDirectoryElement.java \
+ $(SOURCEDIR)/org/w3c/dom/html/HTMLDivElement.java \
+ $(SOURCEDIR)/org/w3c/dom/html/HTMLDocument.java \
+ $(SOURCEDIR)/org/w3c/dom/html/HTMLElement.java \
+ $(SOURCEDIR)/org/w3c/dom/html/HTMLFieldSetElement.java \
+ $(SOURCEDIR)/org/w3c/dom/html/HTMLFontElement.java \
+ $(SOURCEDIR)/org/w3c/dom/html/HTMLFormElement.java \
+ $(SOURCEDIR)/org/w3c/dom/html/HTMLFrameElement.java \
+ $(SOURCEDIR)/org/w3c/dom/html/HTMLFrameSetElement.java \
+ $(SOURCEDIR)/org/w3c/dom/html/HTMLHRElement.java \
+ $(SOURCEDIR)/org/w3c/dom/html/HTMLHeadElement.java \
+ $(SOURCEDIR)/org/w3c/dom/html/HTMLHeadingElement.java \
+ $(SOURCEDIR)/org/w3c/dom/html/HTMLHtmlElement.java \
+ $(SOURCEDIR)/org/w3c/dom/html/HTMLIFrameElement.java \
+ $(SOURCEDIR)/org/w3c/dom/html/HTMLImageElement.java \
+ $(SOURCEDIR)/org/w3c/dom/html/HTMLInputElement.java \
+ $(SOURCEDIR)/org/w3c/dom/html/HTMLIsIndexElement.java \
+ $(SOURCEDIR)/org/w3c/dom/html/HTMLLIElement.java \
+ $(SOURCEDIR)/org/w3c/dom/html/HTMLLabelElement.java \
+ $(SOURCEDIR)/org/w3c/dom/html/HTMLLegendElement.java \
+ $(SOURCEDIR)/org/w3c/dom/html/HTMLLinkElement.java \
+ $(SOURCEDIR)/org/w3c/dom/html/HTMLMapElement.java \
+ $(SOURCEDIR)/org/w3c/dom/html/HTMLMenuElement.java \
+ $(SOURCEDIR)/org/w3c/dom/html/HTMLMetaElement.java \
+ $(SOURCEDIR)/org/w3c/dom/html/HTMLModElement.java \
+ $(SOURCEDIR)/org/w3c/dom/html/HTMLOListElement.java \
+ $(SOURCEDIR)/org/w3c/dom/html/HTMLObjectElement.java \
+ $(SOURCEDIR)/org/w3c/dom/html/HTMLOptGroupElement.java \
+ $(SOURCEDIR)/org/w3c/dom/html/HTMLOptionElement.java \
+ $(SOURCEDIR)/org/w3c/dom/html/HTMLParagraphElement.java \
+ $(SOURCEDIR)/org/w3c/dom/html/HTMLParamElement.java \
+ $(SOURCEDIR)/org/w3c/dom/html/HTMLPreElement.java \
+ $(SOURCEDIR)/org/w3c/dom/html/HTMLQuoteElement.java \
+ $(SOURCEDIR)/org/w3c/dom/html/HTMLScriptElement.java \
+ $(SOURCEDIR)/org/w3c/dom/html/HTMLSelectElement.java \
+ $(SOURCEDIR)/org/w3c/dom/html/HTMLStyleElement.java \
+ $(SOURCEDIR)/org/w3c/dom/html/HTMLTableCaptionElement.java \
+ $(SOURCEDIR)/org/w3c/dom/html/HTMLTableCellElement.java \
+ $(SOURCEDIR)/org/w3c/dom/html/HTMLTableColElement.java \
+ $(SOURCEDIR)/org/w3c/dom/html/HTMLTableElement.java \
+ $(SOURCEDIR)/org/w3c/dom/html/HTMLTableRowElement.java \
+ $(SOURCEDIR)/org/w3c/dom/html/HTMLTableSectionElement.java \
+ $(SOURCEDIR)/org/w3c/dom/html/HTMLTextAreaElement.java \
+ $(SOURCEDIR)/org/w3c/dom/html/HTMLTitleElement.java \
+ $(SOURCEDIR)/org/w3c/dom/html/HTMLUListElement.java \
+ $(SOURCEDIR)/org/w3c/dom/ranges/DocumentRange.java \
+ $(SOURCEDIR)/org/w3c/dom/ranges/Range.java \
+ $(SOURCEDIR)/org/w3c/dom/ranges/RangeException.java \
+ $(SOURCEDIR)/org/w3c/dom/stylesheets/DocumentStyle.java \
+ $(SOURCEDIR)/org/w3c/dom/stylesheets/LinkStyle.java \
+ $(SOURCEDIR)/org/w3c/dom/stylesheets/MediaList.java \
+ $(SOURCEDIR)/org/w3c/dom/stylesheets/StyleSheet.java \
+ $(SOURCEDIR)/org/w3c/dom/stylesheets/StyleSheetList.java \
+ $(SOURCEDIR)/org/w3c/dom/traversal/DocumentTraversal.java \
+ $(SOURCEDIR)/org/w3c/dom/traversal/NodeFilter.java \
+ $(SOURCEDIR)/org/w3c/dom/traversal/NodeIterator.java \
+ $(SOURCEDIR)/org/w3c/dom/traversal/TreeWalker.java \
+ $(SOURCEDIR)/org/w3c/dom/views/AbstractView.java \
+ $(SOURCEDIR)/org/w3c/dom/views/DocumentView.java \
+ $(SOURCEDIR)/org/xml/sax/AttributeList.java \
+ $(SOURCEDIR)/org/xml/sax/Attributes.java \
+ $(SOURCEDIR)/org/xml/sax/ContentHandler.java \
+ $(SOURCEDIR)/org/xml/sax/DTDHandler.java \
+ $(SOURCEDIR)/org/xml/sax/DocumentHandler.java \
+ $(SOURCEDIR)/org/xml/sax/EntityResolver.java \
+ $(SOURCEDIR)/org/xml/sax/ErrorHandler.java \
+ $(SOURCEDIR)/org/xml/sax/HandlerBase.java \
+ $(SOURCEDIR)/org/xml/sax/InputSource.java \
+ $(SOURCEDIR)/org/xml/sax/Locator.java \
+ $(SOURCEDIR)/org/xml/sax/Parser.java \
+ $(SOURCEDIR)/org/xml/sax/SAXException.java \
+ $(SOURCEDIR)/org/xml/sax/SAXNotRecognizedException.java \
+ $(SOURCEDIR)/org/xml/sax/SAXNotSupportedException.java \
+ $(SOURCEDIR)/org/xml/sax/SAXParseException.java \
+ $(SOURCEDIR)/org/xml/sax/XMLFilter.java \
+ $(SOURCEDIR)/org/xml/sax/XMLReader.java \
+ $(SOURCEDIR)/org/xml/sax/ext/Attributes2.java \
+ $(SOURCEDIR)/org/xml/sax/ext/Attributes2Impl.java \
+ $(SOURCEDIR)/org/xml/sax/ext/DeclHandler.java \
+ $(SOURCEDIR)/org/xml/sax/ext/DefaultHandler2.java \
+ $(SOURCEDIR)/org/xml/sax/ext/EntityResolver2.java \
+ $(SOURCEDIR)/org/xml/sax/ext/LexicalHandler.java \
+ $(SOURCEDIR)/org/xml/sax/ext/Locator2.java \
+ $(SOURCEDIR)/org/xml/sax/ext/Locator2Impl.java \
+ $(SOURCEDIR)/org/xml/sax/helpers/AttributeListImpl.java \
+ $(SOURCEDIR)/org/xml/sax/helpers/AttributesImpl.java \
+ $(SOURCEDIR)/org/xml/sax/helpers/DefaultHandler.java \
+ $(SOURCEDIR)/org/xml/sax/helpers/LocatorImpl.java \
+ $(SOURCEDIR)/org/xml/sax/helpers/NamespaceSupport.java \
+ $(SOURCEDIR)/org/xml/sax/helpers/NewInstance.java \
+ $(SOURCEDIR)/org/xml/sax/helpers/ParserAdapter.java \
+ $(SOURCEDIR)/org/xml/sax/helpers/ParserFactory.java \
+ $(SOURCEDIR)/org/xml/sax/helpers/XMLFilterImpl.java \
+ $(SOURCEDIR)/org/xml/sax/helpers/XMLReaderAdapter.java \
+ $(SOURCEDIR)/org/xml/sax/helpers/XMLReaderFactory.java
+
+PKGFILES = \
+ $(SOURCEDIR)/gnu/xml/aelfred2/package.html \
+ $(SOURCEDIR)/gnu/xml/dom/package.html \
+ $(SOURCEDIR)/gnu/xml/pipeline/package.html \
+ $(SOURCEDIR)/gnu/xml/util/package.html \
+ $(SOURCEDIR)/javax/xml/parsers/package.html \
+ $(SOURCEDIR)/javax/xml/transform/package.html \
+ $(SOURCEDIR)/javax/xml/transform/dom/package.html \
+ $(SOURCEDIR)/javax/xml/transform/sax/package.html \
+ $(SOURCEDIR)/javax/xml/transform/stream/package.html \
+ $(SOURCEDIR)/org/w3c/dom/package.html \
+ $(SOURCEDIR)/org/w3c/dom/events/package.html \
+ $(SOURCEDIR)/org/w3c/dom/traversal/package.html \
+ $(SOURCEDIR)/org/w3c/dom/views/package.html \
+ $(SOURCEDIR)/org/xml/sax/package.html \
+ $(SOURCEDIR)/org/xml/sax/ext/package.html \
+ $(SOURCEDIR)/org/xml/sax/helpers/package.html \
+
+
+#GCJ options.
+GCJ_OPTS = --encoding=8859_1 -fsyntax-only -femit-class-files
+GCJ_COMPILE = $(GCJ) $(GCJ_OPTS) -Isource -foutput-class-dir=$(CC-DESTDIR)
+
+# Variables which define some useful constants
+newline:=\\n
+empty:=
+space:=$(empty) $(empty)
+
+
+default: gnujaxp.jar
+
+all: gnujaxp.jar javadoc
+
+
+# Ensure the makefile can update itself.
+Makefile: Makefile.in configure.in
+ $(SHELL) ./config.status
+
+Makefile.in: Makefile.aj
+ $(SHELL) $(PROJECTROOT)/automakejar ./Makefile.in
+
+
+# Build the META-INF directory.
+META-INF META-INF/services:
+ mkdir $@
+
+# Admin file targets.
+META-INF/COPYING: META-INF $(PROJECTROOT)/COPYING
+ cp $(PROJECTROOT)/COPYING $@
+
+META-INF/LICENSE: META-INF $(PROJECTROOT)/LICENSE
+ cp $(PROJECTROOT)/LICENSE $@
+
+# Support file targets.
+META-INF/services/org.xml.sax.driver: META-INF/services
+ echo -n gnu.xml.aelfred2.XmlReader > $@
+
+META-INF/services/javax.xml.parsers.SAXParserFactory: META-INF/services
+ echo -n gnu.xml.aelfred2.JAXPFactory > $@
+
+META-INF/services/javax.xml.parsers.DocumentBuilderFactory: META-INF/services
+ echo -n gnu.xml.dom.JAXPFactory > $@
+
+SUPPORTFILES = \
+ META-INF/COPYING \
+ META-INF/LICENSE \
+ META-INF/services/org.xml.sax.driver \
+ META-INF/services/javax.xml.parsers.SAXParserFactory \
+ META-INF/services/javax.xml.parsers.DocumentBuilderFactory
+
+
+# This is an automakejar target.
+# You must run the automakejar script on this Make file to
+# cause the target to be legal Make syntax.
+gnujaxp_jar_sourcedir=$(SOURCEDIR)
+gnujaxp_jar_sourcefiles=$(SOURCEFILES)
+gnujaxp_jar_classpath=$(wildcard lib/*.jar)
+gnujaxp_jar_classesdest=classes
+gnujaxp_jar_otherfiles=$(SUPPORTFILES)
+gnujaxp_jar_manifest=$(PROJECTROOT)/manifest.mf
+# End of automakejar target.
+gnujaxp_jar_debugclasses=$(gnujaxp_jar_sourcefiles:.java=.class)
+gnujaxp_jar_classfiles=$(gnujaxp_jar_debugclasses:$(gnujaxp_jar_sourcedir)%=$(gnujaxp_jar_classesdest)%)
+
+gnujaxp.jar:
+gnujaxp.jar: gnujaxp-init $(gnujaxp_jar_classfiles) gnujaxp-compilation $(gnujaxp_jar_otherfiles) $(gnujaxp_jar_manifest)
+ $(JAR) cf$(if $(gnujaxp_jar_manifest),m) gnujaxp.jar $(gnujaxp_jar_manifest) $(gnujaxp_jar_otherfiles) -C $(gnujaxp_jar_classesdest) .
+
+.PHONY: gnujaxp-init gnujaxp-compilation
+
+gnujaxp-init:
+ echo > filelist
+
+gnujaxp-compilation: $(gnujaxp_jar_classesdest)
+ $(if $(shell cat filelist),$(JAVAC) $(JAVAC_OPTS) -d $(gnujaxp_jar_classesdest) -classpath $(call PATHMK,$(gnujaxp_jar_classesdest) $(call PATHMK,$(gnujaxp_jar_classpath))) @filelist)
+
+$(gnujaxp_jar_classesdest):
+ mkdir $@
+
+$(gnujaxp_jar_classesdest)/%.class: $(gnujaxp_jar_sourcedir)/%.java
+ @echo $? >> filelist
+
+echo_gnujaxp_jar:
+ @echo sourcedir = $(gnujaxp_jar_sourcedir)
+ @echo sourcefiles = $(gnujaxp_jar_sourcefiles)
+ @echo classpath = $(call PATHMK,$(gnujaxp_jar_classpath))
+ @echo classesdest = $(gnujaxp_jar_classesdest)
+ @echo classfiles = $(gnujaxp_jar_classfiles)
+
+ifeq (${OS},Windows_NT)
+PATHMK = $(subst $(space),;,$(1))
+else
+PATHMK = $(subst $(space),:,$(1))
+endif
+
+
+# for normal development
+# must rerun "make" after this
+clean:
+ -rm -rf gnujaxp.jar classes META-INF Log apidoc apidoc.zip
+ -rm -rf gnujaxp-*.zip
+
+# Nust rerun automakejar and configure after this
+distclean: clean
+ -rm -f Makefile Makefile.in config.cache config.log config.status
+
+# Nust rerun aclocal, autoconf, automakejar and configure after this
+mrproper: distclean
+ -rm -f configure
+
+javadoc: apidoc.zip
+apidoc.zip:
+ -rm -rf apidoc
+ mkdir -p apidoc
+ javadoc -d apidoc \
+ -windowtitle "GNU JAXP Library" \
+ -nodeprecatedlist \
+ -version -author -use \
+ -bottom "<p>Source code is under GPL \
+ (with library exception) in the JAXP project at \
+ <a href='http://www.gnu.org/software/classpathx/jaxp'> \
+ http://www.gnu.org/software/classpathx/jaxp</a> \
+ <br>This documentation was derived from that\
+ source code on `date -I`.\
+ </p>" \
+ -classpath "$(SOURCEDIR)" \
+ \
+ -group "AElfred2 and SAX2 Utilities" \
+ "gnu.xml.aelfred2:gnu.xml.pipeline:gnu.xml.util" \
+ -group "DOM2, implementing DOM Level 2" \
+ "gnu.xml.dom" \
+ \
+ -group "SAX and SAX2" \
+ "org.xml.sax:org.xml.sax.ext:org.xml.sax.helpers" \
+ -group "DOM Level 2 (W3C)" \
+ "org.w3c.*" \
+ -group "Java API for XML (v1.1) (Sun)" \
+ "javax.xml.*" \
+ \
+ gnu.xml.aelfred2 gnu.xml.pipeline gnu.xml.util \
+ gnu.xml.dom \
+ org.xml.sax org.xml.sax.ext org.xml.sax.helpers \
+ org.w3c.dom org.w3c.dom.events \
+ javax.xml.parsers \
+ javax.xml.transform javax.xml.transform.dom \
+ javax.xml.transform.sax javax.xml.transform.stream
+ jar cMf apidoc.zip apidoc
+
+#
+# RELEASE ENGINEERING:
+# "full" release has source, jarfile, javadoc, and extras
+#
+# override VERSION in environment, like:
+# $ VERSION=1.0beta1 make -e release
+#
+VERSION = dev
+
+release: gnujaxp-$(VERSION).zip
+
+
+DIST_DIR = gnujaxp-$(VERSION)
+
+# XXX ChangeLog
+FILES := \
+ LICENSE COPYING COPYRIGHT.html README \
+ gnujaxp.jar \
+ configure Makefile.in manifest.mf
+
+gnujaxp-$(VERSION).zip: $(FILES) apidoc.zip $(SOURCEFILES) $(PKGFILES)
+ for F in $(FILES) $(SOURCEFILES) $(PKGFILES) ;\
+ do \
+ mkdir -p `dirname $(DIST_DIR)/$$F` ;\
+ cp $$F $(DIST_DIR)/$$F ;\
+ done
+ cd $(DIST_DIR); jar xf ../apidoc.zip
+ chmod +x $(DIST_DIR)/configure
+ cp gnujaxp.jar $(DIST_DIR)
+ # jar cMf gnujaxp-$(VERSION).zip $(DIST_DIR)
+ zip -qr9 gnujaxp-$(VERSION).zip $(DIST_DIR)
+ rm -rf $(DIST_DIR)
+
diff --git a/external/jaxp/README b/external/jaxp/README
new file mode 100644
index 000000000..17e81f136
--- /dev/null
+++ b/external/jaxp/README
@@ -0,0 +1,122 @@
+WHAT IS THIS
+ GNUJAXP includes interfaces and implementations for basic XML
+ processing in Java, and some general purpose SAX2 utilities.
+
+ The standard distribution includes "gnujaxp.jar", javadoc, and full
+ source code. The current software is available at:
+
+ http://www.gnu.org/software/classpathx/jaxp
+
+ This is intended only to require JDK 1.1 support to compile or run;
+ that may change at some point, but for now portability to PJava and
+ other widely used Java configurations/profiles is important.
+
+ GCJ 3.0 has some bugs compiling this code, either to class files or
+ to native code. Newer snapshots (GCJ 3.1) are currently needed to
+ compile this code.
+
+JAVA PACKAGES
+
+ javax.xml.* ... JAXP 1.1 interfaces
+ org.xml.sax.* ... SAX2 (r2pre3, extensions 1.1beta) interfaces
+ org.w3c.dom.* ... DOM Level 2 interfaces
+
+ gnu.xml.aelfred2.* ... SAX2 parsers (+ optional validator, and JAXP glue)
+ gnu.xml.dom.* ... DOM level 2 (XML) implementation (and JAXP glue)
+ gnu.xml.pipeline.* ... SAX2 event pipeline support
+ gnu.xml.util.* ... various XML utility classes
+
+LICENSING
+ Briefly, most software in this package is distributed under the
+ GNU General Public License with the "library exception" that
+ permits its usage even in statically linked environments. That
+ licensing is more permissive than the "LGPL".
+
+ See the LICENSE file for more information.
+
+BUILDING
+ The default build tools use autoconf and GNU make.
+
+ $ ./configure
+ ...
+ $ make all
+ ...
+ $
+
+ You will need a java compiler on the PATH to build GNUJAXP. You
+ can specify one at configuration time like this:
+
+ $ JAVA_CC=javac ./configure
+ $ make all
+
+ See the file HACKING for how to build from CVS.
+
+INSTALLATION AND CONFIGURATION
+ The simplest way to use this software is to put the "gnujaxp.jar"
+ file into $JAVA_HOME/jre/lib/ext so that it's automatically part
+ of the classpath for every application. That works for JDK 1.2
+ and later.
+
+ Otherwise, you'll need some other way to put it into $CLASSPATH,
+ such as an environment variable.
+
+ If you have multiple XML tools implementations in your environment,
+ you may need to configure software to use the implementations in
+ the GNUJAXP distribution rather than some other one. See the project
+ website (http://www.gnu.org/software/classpathx/jaxp) for information.
+
+CONFORMANCE TESTING
+ The primary test resources are at http://xmlconf.sourceforge.net
+ and include:
+
+ SAX2/XML conformance tests
+ That the "xml.testing.Driver" addresses the core XML 1.0
+ specification requirements, which closely correspond to the
+ functionality SAX1 provides. The driver uses SAX2 APIs to
+ test that functionality It is used with a bugfixed version of
+ the NIST/OASIS XML conformance test cases.
+
+ The AElfred2 parser is highly conformant, though it still takes
+ a few implementation shortcuts. See its package documentation
+ for information about known XML conformance issues in AElfred2.
+
+ The primary issue is using Unicode character tables, rather than
+ those in the XML specification, for determining what names are
+ valid. Most applications won't notice the difference, and this
+ solution is smaller and faster than the alternative.
+
+ For validation, a secondary issue is that issues relating to
+ entity modularity are not validated; they can't all be cleanly
+ layered. For example, validity constraints related to standalone
+ declarations and PE nesting are not checked.
+
+ SAX2
+ SAX2 API conformance currently has a minimal JUNIT (0.2) test suite,
+ which can be accessed at the xmlconf site listed above. It does
+ not cover namespaces or LexicalHandler and Declhandler extensions
+ anywhere as exhaustively as the SAX1 level functionality is
+ tested by the "xml.testing.Driver". However:
+
+ - Applying the DOM unit tests to this implementation gives
+ the LexicalHandler (comments, and boundaries of DTDs,
+ CDATA sections, and general entities) a workout, and
+ does the same for DeclHandler entity declarations.
+
+ - The pipeline package's layered validator demands that
+ element and attribute declarations are reported correctly.
+
+ By those metrics, SAX2 conformance for AElfred2 is also strong.
+
+ DOM Level 1 (and Level 2 Events) Tests
+ The "domunit 0.0.6" tests use the JAXP API to hook up a DOM
+ implementation to a parser (out of scope for DOM Level 2).
+ Those DOM unit tests are mostly related to Level 1, except
+ for a few relating to the Level 2 events module.
+
+ All of these tests pass.
+
+ However, you may want to be aware that Entity nodes, and all
+ EntityReference nodes not created by parsing a document, will
+ have no children. Since you should as a rule avoid both these
+ node types, you probably won't run into related problems.
+
diff --git a/external/jaxp/aclocal.m4 b/external/jaxp/aclocal.m4
new file mode 100644
index 000000000..033a8e586
--- /dev/null
+++ b/external/jaxp/aclocal.m4
@@ -0,0 +1,34 @@
+
+AC_DEFUN([IFVAL],
+[ifelse([$1], [], [$3], [$2])])
+
+
+# AC_PROG_JAVA_CC([COMPILER ...])
+# --------------------------
+# COMPILER ... is a space separated list of java compilers to search for.
+# This just gives the user an opportunity to specify an alternative
+# search list for the java compiler.
+# The compiler is set in the variable JAVA_CC and the compiler options
+# are set in the variable JAVA_CC_OPTS
+AC_DEFUN([AC_PROG_JAVA_CC],
+[IFVAL([$1],
+ [AC_CHECK_PROGS(JAVA_CC, [$1], , $PATH)],
+[AC_CHECK_PROG(JAVA_CC, gcj, gcj, , $PATH)
+if test -z "$JAVA_CC"; then
+ AC_CHECK_PROG(JAVA_CC, javac, javac, , $PATH)
+fi
+if test -z "$JAVA_CC"; then
+ AC_CHECK_PROG(JAVA_CC, jikes, jikes, , $PATH)
+fi
+])
+
+if test "$JAVA_CC" = "gcj"; then
+ if test "$GCJ_OPTS" = ""; then
+ AC_SUBST(GCJ_OPTS,-C)
+ echo > /dev/null
+ fi
+ AC_SUBST(JAVA_CC_OPTS, @GCJ_OPTS@,
+ [Define the compilation options for GCJ])
+fi
+test -z "$JAVA_CC" && AC_MSG_ERROR([no acceptable java compiler found in \$PATH])
+])# AC_PROG_JAVA_CC
diff --git a/external/jaxp/automakejar b/external/jaxp/automakejar
new file mode 100755
index 000000000..6f29fd347
--- /dev/null
+++ b/external/jaxp/automakejar
@@ -0,0 +1,133 @@
+#!/bin/sh
+# Automagically generate make rules to compile jar files
+# specified in the Makefile.aj
+#
+# (C) Tapsell-Ferrier Limited 2002 <nferrier@tapsellferrier.co.uk>
+#
+# This results in a file called:
+# Makefile
+# unless there is an argument specified in which case
+# it results in a file specified in the argument.
+#
+# Therefore to produce a Makefile.in you could do this:
+#
+# automakejar Makefile.in
+#
+
+TMP=${TEMP:-/tmp/}
+
+# Create the generic editor script.
+SEDSCRIPT=$TMP/automakejar.$$
+cat > ${SEDSCRIPT} <<\EOF
+#-n
+# A first stage sed script to produce a Makefile from a template.
+# (C) Tapsell-Ferrier Limited 2002 <nferrier@tapsellferrier.co.uk>
+#
+# This script would be much easier if GNU Make's target specific variables
+# cascaded into sub-targets. But they don't as of 3.79.1.
+/^__JARFILENAME__.jar:.*$/,/^$/{
+ # Store the dummy target.
+ /^__JARFILENAME__.jar:.*/ {
+ h
+ d
+ }
+ # Make sure the variable definitions appear at the start of lines.
+ s/^ sourcedir=/sourcedir=/
+ s/^ sourcefiles=/sourcefiles=/
+ s/^ classpath=/classpath=/
+ s/^ classesdest=/classesdest=/
+ s/^ otherfiles=/otherfiles=/
+ s/^ manifest=/manifest=/
+ # Mangle the names of the target variables
+ s/sourcedir/__JARFILENAME___jar_sourcedir/
+ s/sourcefiles/__JARFILENAME___jar_sourcefiles/
+ s/classpath/__JARFILENAME___jar_classpath/
+ s/classesdest/__JARFILENAME___jar_classesdest/
+ s/otherfiles/__JARFILENAME___jar_otherfiles/
+ s/manifest/__JARFILENAME___jar_manifest/
+ # Ensure $variables are referenced properly
+ s/\$\([A-Za-z_][A-Za-z_]*\)/$(\1)/g
+ # Change quoted sh syntax to make syntax
+ s/`\(.*\)`/$(shell \1)/
+ # At the end of the automakejar decleration put the real Make decl.
+ /^$/ {
+ i\
+__JARFILENAME___jar_debugclasses=$(__JARFILENAME___jar_sourcefiles:.java=.class)\
+__JARFILENAME___jar_classfiles=$(__JARFILENAME___jar_debugclasses:$(__JARFILENAME___jar_sourcedir)%=$(__JARFILENAME___jar_classesdest)%)\
+
+ # This ensures that the target that the user put in is inserted.
+ {
+ g
+ p
+ i\
+__JARFILENAME__.jar: __JARFILENAME__-init $(__JARFILENAME___jar_classfiles) __JARFILENAME__-compilation $(__JARFILENAME___jar_otherfiles) $(__JARFILENAME___jar_manifest)\
+ $(JAR) cf$(if $(__JARFILENAME___jar_manifest),m) __JARFILENAME__.jar $(__JARFILENAME___jar_manifest) $(__JARFILENAME___jar_otherfiles) -C $(__JARFILENAME___jar_classesdest) .\
+\
+.PHONY: __JARFILENAME__-init __JARFILENAME__-compilation\
+\
+__JARFILENAME__-init:\
+ echo > filelist\
+\
+__JARFILENAME__-compilation: $(__JARFILENAME___jar_classesdest)\
+ $(if $(shell cat filelist),$(JAVAC) $(JAVAC_OPTS) -d $(__JARFILENAME___jar_classesdest) -classpath $(call PATHMK,$(__JARFILENAME___jar_classesdest) $(call PATHMK,$(__JARFILENAME___jar_classpath))) @filelist)\
+\
+$(__JARFILENAME___jar_classesdest):\
+ mkdir $@\
+\
+$(__JARFILENAME___jar_classesdest)/%.class: $(__JARFILENAME___jar_sourcedir)/%.java\
+ @echo $? >> filelist\
+\
+echo___JARFILENAME___jar:\
+ @echo sourcedir = $(__JARFILENAME___jar_sourcedir)\
+ @echo sourcefiles = $(__JARFILENAME___jar_sourcefiles)\
+ @echo classpath = $(call PATHMK,$(__JARFILENAME___jar_classpath))\
+ @echo classesdest = $(__JARFILENAME___jar_classesdest)\
+ @echo classfiles = $(__JARFILENAME___jar_classfiles)\
+\
+ifeq (${OS},Windows_NT)\
+PATHMK = $(subst $(space),;,$(1))\
+else\
+PATHMK = $(subst $(space),:,$(1))\
+endif
+ }
+ # Ensure we branch to end of script once template is done.
+ b end
+ }
+}
+# Output all other lines as they are.
+p
+:end
+EOF
+
+# The file to produce.
+Makefile=${1:-Makefile}
+
+# The name of the template file.
+MakeTemplate=`dirname $0`/Makefile.aj
+
+echo Making $Makefile from $MakeTemplate
+
+
+# The Makefile to be mangled, changes every iteration.
+MakeSource=${MakeTemplate}
+# Make a bespoke sed script and then edit the source Makefile.
+for something in `sed -n 's/^\([A-Za-z0-9_-]*\)\.jar:.*$/\1/p' ${MakeTemplate}`
+do
+ MakeOutput=${Makefile}.${RANDOM}
+ echo creating the target: $something
+ EDITSCRIPT=${SEDSCRIPT}.edit.$$
+ sed -n "s/__JARFILENAME__/${something}/g ; p" ${SEDSCRIPT} > ${EDITSCRIPT}
+ sed -n -f ${EDITSCRIPT} ${MakeSource} > ${MakeOutput}
+ if [ "${MakeSource}" != "${MakeTemplate}" ] ;
+ then
+ rm ${MakeSource}
+ fi
+ MakeSource=${MakeOutput}
+ rm $EDITSCRIPT
+done
+
+mv ${MakeOutput} ${Makefile}
+
+rm $SEDSCRIPT
+
+# end. \ No newline at end of file
diff --git a/external/jaxp/configure.in b/external/jaxp/configure.in
new file mode 100644
index 000000000..89bf01b92
--- /dev/null
+++ b/external/jaxp/configure.in
@@ -0,0 +1,16 @@
+AC_INIT(source/javax/xml/parsers/SAXParserFactory.java)
+
+
+dnl Tool discovery
+
+AC_PATH_PROG(JAR_TOOL, jar,)
+
+AC_PROG_JAVA_CC()
+
+
+dnl Setup the output files
+
+AC_OUTPUT(Makefile)
+
+
+dnl End.
diff --git a/external/jaxp/manifest.mf b/external/jaxp/manifest.mf
new file mode 100644
index 000000000..cc6bbd391
--- /dev/null
+++ b/external/jaxp/manifest.mf
@@ -0,0 +1,28 @@
+Extension-Name: GNUJAXP
+Implementation-Title: GNU JAXP
+Implementation-URL: http://www.gnu.org/software/classpathx/jaxp
+Implementation-Vendor: Free Software Foundation
+Main-Class: gnu.xml.util.DoParse
+
+Name: gnu/xml/aelfred2/
+Implementation-Title: AElfred2
+
+Name: gnu/xml/dom/
+Implementation-Title: DOM2
+
+Name: org/w3c/dom
+Specification-Title: Document Object Model (DOM)
+Specification-Vendor: www.w3c.org
+Specification-Version: Level 2
+
+Name: org/xml/sax/
+Implementation-URL: http://sax.sourceforge.net
+Specification-Title: Simple API for XML (SAX) core
+Specification-Vendor: sax.sourceforge.net
+Specification-Version: 2.0
+
+Name: javax/xml/
+Specification-Title: Java API for XML Parsing (JAXP)
+Specification-Vendor: Sun Microsystems
+Specification-Version: 1.1
+
diff --git a/external/jaxp/source/gnu/xml/aelfred2/JAXPFactory.java b/external/jaxp/source/gnu/xml/aelfred2/JAXPFactory.java
new file mode 100644
index 000000000..0fedf9bc4
--- /dev/null
+++ b/external/jaxp/source/gnu/xml/aelfred2/JAXPFactory.java
@@ -0,0 +1,183 @@
+/*
+ * $Id: JAXPFactory.java,v 1.1 2003-02-01 02:10:09 cbj Exp $
+ * Copyright (C) 2001 David Brownell
+ *
+ * This file is part of GNU JAXP, a library.
+ *
+ * GNU JAXP is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * GNU JAXP is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ * As a special exception, if you link this library with other files to
+ * produce an executable, this library does not by itself cause the
+ * resulting executable to be covered by the GNU General Public License.
+ * This exception does not however invalidate any other reasons why the
+ * executable file might be covered by the GNU General Public License.
+ */
+
+package gnu.xml.aelfred2;
+
+import java.util.Enumeration;
+import java.util.Hashtable;
+
+import org.xml.sax.Parser;
+import org.xml.sax.XMLReader;
+import org.xml.sax.SAXException;
+import org.xml.sax.SAXNotRecognizedException;
+import org.xml.sax.SAXNotSupportedException;
+import org.xml.sax.helpers.XMLReaderAdapter;
+
+import javax.xml.parsers.ParserConfigurationException;
+import javax.xml.parsers.SAXParser;
+import javax.xml.parsers.SAXParserFactory;
+
+
+/**
+ * Configurable factory to create an &AElig;lfred2 JAXP parser; required
+ * to bootstrap using JAXP. You should use SAX2 directly where possible,
+ * rather than through JAXP, since that gives you better control.
+ * This class would normally be configured as a platform default factory.
+ *
+ * @author David Brownell
+ */
+public final class JAXPFactory extends SAXParserFactory
+{
+ private Hashtable flags = new Hashtable ();
+
+ /**
+ * Constructs a factory which normally returns a non-validating
+ * parser.
+ */
+ public JAXPFactory () { }
+
+ public SAXParser newSAXParser ()
+ throws ParserConfigurationException, SAXException
+ {
+ JaxpParser jaxp = new JaxpParser ();
+ Enumeration e = flags.keys ();
+ XMLReader parser = jaxp.getXMLReader ();
+
+ parser.setFeature (
+ SAXDriver.FEATURE + "namespaces",
+ isNamespaceAware ());
+ parser.setFeature (
+ SAXDriver.FEATURE + "validation",
+ isValidating ());
+ // that makes SAX2 feature flags trump JAXP
+
+ while (e.hasMoreElements ()) {
+ String uri = (String) e.nextElement ();
+ Boolean value = (Boolean) flags.get (uri);
+ parser.setFeature (uri, value.booleanValue ());
+ }
+
+ return jaxp;
+ }
+
+ // yes, this "feature transfer" mechanism doesn't play well
+
+ public void setFeature (String name, boolean value)
+ throws
+ ParserConfigurationException,
+ SAXNotRecognizedException,
+ SAXNotSupportedException
+ {
+ try {
+ // force "early" detection of errors where possible
+ // (flags can't necessarily be set before parsing)
+ new JaxpParser ().getXMLReader ().setFeature (name, value);
+
+ flags.put (name, new Boolean (value));
+ } catch (SAXNotRecognizedException e) {
+ throw new SAXNotRecognizedException (name);
+ } catch (SAXNotSupportedException e) {
+ throw new SAXNotSupportedException (name);
+ } catch (Exception e) {
+ throw new ParserConfigurationException (
+ e.getClass ().getName ()
+ + ": "
+ + e.getMessage ());
+ }
+ }
+
+ public boolean getFeature (String name)
+ throws
+ ParserConfigurationException,
+ SAXNotRecognizedException,
+ SAXNotSupportedException
+ {
+ Boolean value = (Boolean) flags.get (name);
+
+ if (value == null)
+ return value.booleanValue ();
+ else
+ try {
+ return new JaxpParser ().getXMLReader ().getFeature (name);
+ } catch (SAXNotRecognizedException e) {
+ throw new SAXNotRecognizedException (name);
+ } catch (SAXNotSupportedException e) {
+ throw new SAXNotSupportedException (name);
+ } catch (SAXException e) {
+ throw new ParserConfigurationException (
+ e.getClass ().getName ()
+ + ": "
+ + e.getMessage ());
+ }
+ }
+
+ private static class JaxpParser extends SAXParser
+ {
+ private XmlReader ae2 = new XmlReader ();
+ private XMLReaderAdapter parser = null;
+
+ JaxpParser () { }
+
+ public void setProperty (String id, Object value)
+ throws SAXNotRecognizedException, SAXNotSupportedException
+ { ae2.setProperty (id, value); }
+
+ public Object getProperty (String id)
+ throws SAXNotRecognizedException, SAXNotSupportedException
+ { return ae2.getProperty (id); }
+
+ public Parser getParser ()
+ throws SAXException
+ {
+ if (parser == null)
+ parser = new XMLReaderAdapter (ae2);
+ return parser;
+ }
+
+ public XMLReader getXMLReader ()
+ throws SAXException
+ { return ae2; }
+
+ public boolean isNamespaceAware ()
+ {
+ try {
+ return ae2.getFeature (SAXDriver.FEATURE + "namespaces");
+ } catch (Exception e) {
+ throw new Error ();
+ }
+ }
+
+ public boolean isValidating ()
+ {
+ try {
+ return ae2.getFeature (SAXDriver.FEATURE + "validation");
+ } catch (Exception e) {
+ throw new Error ();
+ }
+ }
+ }
+}
diff --git a/external/jaxp/source/gnu/xml/aelfred2/SAXDriver.java b/external/jaxp/source/gnu/xml/aelfred2/SAXDriver.java
new file mode 100644
index 000000000..fc6d48a89
--- /dev/null
+++ b/external/jaxp/source/gnu/xml/aelfred2/SAXDriver.java
@@ -0,0 +1,1271 @@
+/*
+ * $Id: SAXDriver.java,v 1.1 2003-02-01 02:10:10 cbj Exp $
+ * Copyright (C) 1999-2001 David Brownell
+ *
+ * This file is part of GNU JAXP, a library.
+ *
+ * GNU JAXP is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * GNU JAXP is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ * As a special exception, if you link this library with other files to
+ * produce an executable, this library does not by itself cause the
+ * resulting executable to be covered by the GNU General Public License.
+ * This exception does not however invalidate any other reasons why the
+ * executable file might be covered by the GNU General Public License.
+ */
+
+//
+// Copyright (c) 1998 by Microstar Software Ltd.
+// From Microstar's README (the entire original license):
+//
+// Separate statements also said it's in the public domain.
+// All modifications are distributed under the license
+// above (GPL with library exception).
+//
+// AElfred is free for both commercial and non-commercial use and
+// redistribution, provided that Microstar's copyright and disclaimer are
+// retained intact. You are free to modify AElfred for your own use and
+// to redistribute AElfred with your modifications, provided that the
+// modifications are clearly documented.
+//
+// This program is distributed in the hope that it will be useful, but
+// WITHOUT ANY WARRANTY; without even the implied warranty of
+// merchantability or fitness for a particular purpose. Please use it AT
+// YOUR OWN RISK.
+//
+
+
+package gnu.xml.aelfred2;
+
+import java.io.*;
+
+import java.net.MalformedURLException;
+import java.net.URL;
+import java.util.Locale;
+import java.util.Stack;
+
+// maintaining 1.1 compatibility for now ... more portable, PJava, etc
+// Iterator, Hashmap and ArrayList ought to be faster
+import java.util.Enumeration;
+import java.util.Hashtable;
+import java.util.Vector;
+
+import org.xml.sax.*;
+import org.xml.sax.ext.*;
+import org.xml.sax.helpers.NamespaceSupport;
+
+
+// $Id: SAXDriver.java,v 1.1 2003-02-01 02:10:10 cbj Exp $
+
+/**
+ * An enhanced SAX2 version of Microstar's &AElig;lfred XML parser.
+ * The enhancements primarily relate to significant improvements in
+ * conformance to the XML specification, and SAX2 support. Performance
+ * has been improved. See the package level documentation for more
+ * information.
+ *
+ * <table border="1" width='100%' cellpadding='3' cellspacing='0'>
+ * <tr bgcolor='#ccccff'>
+ * <th><font size='+1'>Name</font></th>
+ * <th><font size='+1'>Notes</font></th></tr>
+ *
+ * <tr><td colspan=2><center><em>Features ... URL prefix is
+ * <b>http://xml.org/sax/features/</b></em></center></td></tr>
+ *
+ * <tr><td>(URL)/external-general-entities</td>
+ * <td>Value defaults to <em>true</em></td></tr>
+ * <tr><td>(URL)/external-parameter-entities</td>
+ * <td>Value defaults to <em>true</em></td></tr>
+ * <tr><td>(URL)/is-standalone</td>
+ * <td>(PRELIMINARY) Returns true iff the document's parsing
+ * has started (some non-error event after <em>startDocument()</em>
+ * was reported) and the document's standalone flag is set.</td></tr>
+ * <tr><td>(URL)/namespace-prefixes</td>
+ * <td>Value defaults to <em>false</em> (but XML 1.0 names are
+ * always reported)</td></tr>
+ * <tr><td>(URL)/lexical-handler/parameter-entities</td>
+ * <td>Value is fixed at <em>true</em></td></tr>
+ * <tr><td>(URL)/namespaces</td>
+ * <td>Value defaults to <em>true</em></td></tr>
+ * <tr><td>(URL)/resolve-dtd-uris</td>
+ * <td>(PRELIMINARY) Value defaults to <em>true</em></td></tr>
+ * <tr><td>(URL)/string-interning</td>
+ * <td>Value is fixed at <em>true</em></td></tr>
+ * <tr><td>(URL)/use-attributes2</td>
+ * <td>(PRELIMINARY) Value is fixed at <em>true</em></td></tr>
+ * <tr><td>(URL)/use-entity-resolver2</td>
+ * <td>(PRELIMINARY) Value defaults to <em>true</em></td></tr>
+ * <tr><td>(URL)/validation</td>
+ * <td>Value is fixed at <em>false</em></td></tr>
+ *
+ * <tr><td colspan=2><center><em>Handler Properties ... URL prefix is
+ * <b>http://xml.org/sax/properties/</b></em></center></td></tr>
+ *
+ * <tr><td>(URL)/declaration-handler</td>
+ * <td>A declaration handler may be provided. </td></tr>
+ * <tr><td>(URL)/lexical-handler</td>
+ * <td>A lexical handler may be provided. </td></tr>
+ * </table>
+ *
+ * <p>This parser currently implements the SAX1 Parser API, but
+ * it may not continue to do so in the future.
+ *
+ * @author Written by David Megginson (version 1.2a from Microstar)
+ * @author Updated by David Brownell &lt;dbrownell@users.sourceforge.net&gt;
+ * @version $Date: 2003-02-01 02:10:10 $
+ * @see org.xml.sax.Parser
+ */
+final public class SAXDriver
+ implements Locator, Attributes2, XMLReader, Parser, AttributeList
+{
+ private final DefaultHandler2 base = new DefaultHandler2 ();
+ private XmlParser parser;
+
+ private EntityResolver entityResolver = base;
+ private EntityResolver2 resolver2 = null;
+ private ContentHandler contentHandler = base;
+ private DTDHandler dtdHandler = base;
+ private ErrorHandler errorHandler = base;
+ private DeclHandler declHandler = base;
+ private LexicalHandler lexicalHandler = base;
+
+ private String elementName = null;
+ private Stack entityStack = new Stack ();
+
+ // could use just one vector (of object/struct): faster, smaller
+ private Vector attributeNames = new Vector ();
+ private Vector attributeNamespaces = new Vector ();
+ private Vector attributeLocalNames = new Vector ();
+ private Vector attributeValues = new Vector ();
+ private boolean attributeSpecified [] = new boolean[10];
+ private boolean attributeDeclared [] = new boolean[10];
+
+ private boolean namespaces = true;
+ private boolean xmlNames = false;
+ private boolean extGE = true;
+ private boolean extPE = true;
+ private boolean resolveAll = true;
+ private boolean useResolver2 = true;
+
+ private int attributeCount = 0;
+ private boolean attributes;
+ private String nsTemp [] = new String [3];
+ private NamespaceSupport prefixStack;
+
+ //
+ // Constructor.
+ //
+
+ /** Constructs a SAX Parser. */
+ public SAXDriver () {}
+
+
+ //
+ // Implementation of org.xml.sax.Parser.
+ //
+
+ /**
+ * <b>SAX1</b>: Sets the locale used for diagnostics; currently,
+ * only locales using the English language are supported.
+ * @param locale The locale for which diagnostics will be generated
+ */
+ public void setLocale (Locale locale)
+ throws SAXException
+ {
+ if ("en".equals (locale.getLanguage ()))
+ return ;
+
+ throw new SAXException ("AElfred2 only supports English locales.");
+ }
+
+
+ /**
+ * <b>SAX2</b>: Returns the object used when resolving external
+ * entities during parsing (both general and parameter entities).
+ */
+ public EntityResolver getEntityResolver ()
+ {
+ return (entityResolver == base) ? null : entityResolver;
+ }
+
+ /**
+ * <b>SAX1, SAX2</b>: Set the entity resolver for this parser.
+ * @param handler The object to receive entity events.
+ */
+ public void setEntityResolver (EntityResolver resolver)
+ {
+ if (resolver instanceof EntityResolver2)
+ resolver2 = (EntityResolver2) resolver;
+ else
+ resolver2 = null;
+ if (resolver == null)
+ resolver = base;
+ entityResolver = resolver;
+ }
+
+
+ /**
+ * <b>SAX2</b>: Returns the object used to process declarations related
+ * to notations and unparsed entities.
+ */
+ public DTDHandler getDTDHandler ()
+ {
+ return (dtdHandler == base) ? null : dtdHandler;
+ }
+
+ /**
+ * <b>SAX1, SAX2</b>: Set the DTD handler for this parser.
+ * @param handler The object to receive DTD events.
+ */
+ public void setDTDHandler (DTDHandler handler)
+ {
+ if (handler == null)
+ handler = base;
+ this.dtdHandler = handler;
+ }
+
+
+ /**
+ * <b>SAX1</b>: Set the document handler for this parser. If a
+ * content handler was set, this document handler will supplant it.
+ * The parser is set to report all XML 1.0 names rather than to
+ * filter out "xmlns" attributes (the "namespace-prefixes" feature
+ * is set to true).
+ *
+ * @deprecated SAX2 programs should use the XMLReader interface
+ * and a ContentHandler.
+ *
+ * @param handler The object to receive document events.
+ */
+ public void setDocumentHandler (DocumentHandler handler)
+ {
+ contentHandler = new Adapter (handler);
+ xmlNames = true;
+ }
+
+ /**
+ * <b>SAX2</b>: Returns the object used to report the logical
+ * content of an XML document.
+ */
+ public ContentHandler getContentHandler ()
+ {
+ return contentHandler == base ? null : contentHandler;
+ }
+
+ /**
+ * <b>SAX2</b>: Assigns the object used to report the logical
+ * content of an XML document. If a document handler was set,
+ * this content handler will supplant it (but XML 1.0 style name
+ * reporting may remain enabled).
+ */
+ public void setContentHandler (ContentHandler handler)
+ {
+ if (handler == null)
+ handler = base;
+ contentHandler = handler;
+ }
+
+ /**
+ * <b>SAX1, SAX2</b>: Set the error handler for this parser.
+ * @param handler The object to receive error events.
+ */
+ public void setErrorHandler (ErrorHandler handler)
+ {
+ if (handler == null)
+ handler = base;
+ this.errorHandler = handler;
+ }
+
+ /**
+ * <b>SAX2</b>: Returns the object used to receive callbacks for XML
+ * errors of all levels (fatal, nonfatal, warning); this is never null;
+ */
+ public ErrorHandler getErrorHandler ()
+ { return errorHandler == base ? null : errorHandler; }
+
+
+ /**
+ * <b>SAX1, SAX2</b>: Auxiliary API to parse an XML document, used mostly
+ * when no URI is available.
+ * If you want anything useful to happen, you should set
+ * at least one type of handler.
+ * @param source The XML input source. Don't set 'encoding' unless
+ * you know for a fact that it's correct.
+ * @see #setEntityResolver
+ * @see #setDTDHandler
+ * @see #setContentHandler
+ * @see #setErrorHandler
+ * @exception SAXException The handlers may throw any SAXException,
+ * and the parser normally throws SAXParseException objects.
+ * @exception IOException IOExceptions are normally through through
+ * the parser if there are problems reading the source document.
+ */
+ public void parse (InputSource source)
+ throws SAXException, IOException
+ {
+ synchronized (base) {
+ parser = new XmlParser ();
+ if (namespaces)
+ prefixStack = new NamespaceSupport ();
+ else if (!xmlNames)
+ throw new IllegalStateException ();
+ parser.setHandler (this);
+
+ try {
+
+ Reader r = source.getCharacterStream();
+ InputStream in = source.getByteStream();
+
+
+ parser.doParse (source.getSystemId (),
+ source.getPublicId (),
+ r,
+ in,
+ source.getEncoding ());
+ } catch (SAXException e) {
+ throw e;
+ } catch (IOException e) {
+ throw e;
+ } catch (RuntimeException e) {
+ throw e;
+ } catch (Exception e) {
+ throw new SAXParseException (e.getMessage (), this, e);
+ } finally {
+ contentHandler.endDocument ();
+ entityStack.removeAllElements ();
+ parser = null;
+ prefixStack = null;
+ }
+ }
+ }
+
+
+ /**
+ * <b>SAX1, SAX2</b>: Preferred API to parse an XML document, using a
+ * system identifier (URI).
+ */
+ public void parse (String systemId)
+ throws SAXException, IOException
+ {
+ parse (new InputSource (systemId));
+ }
+
+ //
+ // Implementation of SAX2 "XMLReader" interface
+ //
+ static final String FEATURE = "http://xml.org/sax/features/";
+ static final String PROPERTY = "http://xml.org/sax/properties/";
+
+ /**
+ * <b>SAX2</b>: Tells the value of the specified feature flag.
+ *
+ * @exception SAXNotRecognizedException thrown if the feature flag
+ * is neither built in, nor yet assigned.
+ */
+ public boolean getFeature (String featureId)
+ throws SAXNotRecognizedException, SAXNotSupportedException
+ {
+ if ((FEATURE + "validation").equals (featureId))
+ return false;
+
+ // external entities (both types) are optionally included
+ if ((FEATURE + "external-general-entities").equals (featureId))
+ return extGE;
+ if ((FEATURE + "external-parameter-entities") .equals (featureId))
+ return extPE;
+
+ // element/attribute names are as written in document; no mangling
+ if ((FEATURE + "namespace-prefixes").equals (featureId))
+ return xmlNames;
+
+ // report element/attribute namespaces?
+ if ((FEATURE + "namespaces").equals (featureId))
+ return namespaces;
+
+ // all PEs and GEs are reported
+ if ((FEATURE + "lexical-handler/parameter-entities").equals (featureId))
+ return true;
+
+ // always interns
+ if ((FEATURE + "string-interning").equals (featureId))
+ return true;
+
+ // EXTENSIONS 1.1
+
+ // always returns isSpecified info
+ if ((FEATURE + "use-attributes2").equals (featureId))
+ return true;
+
+ // meaningful between startDocument/endDocument
+ if ((FEATURE + "is-standalone").equals (featureId)) {
+ if (parser == null)
+ throw new SAXNotSupportedException (featureId);
+ return parser.isStandalone ();
+ }
+
+ // optionally don't absolutize URIs in declarations
+ if ((FEATURE + "resolve-dtd-uris").equals (featureId))
+ return resolveAll;
+
+ // optionally use resolver2 interface methods, if possible
+ if ((FEATURE + "use-entity-resolver2").equals (featureId))
+ return useResolver2;
+
+ throw new SAXNotRecognizedException (featureId);
+ }
+
+ // package private
+ DeclHandler getDeclHandler () { return declHandler; }
+
+ // package private
+ boolean resolveURIs () { return resolveAll; }
+
+ /**
+ * <b>SAX2</b>: Returns the specified property.
+ *
+ * @exception SAXNotRecognizedException thrown if the property value
+ * is neither built in, nor yet stored.
+ */
+ public Object getProperty (String propertyId)
+ throws SAXNotRecognizedException
+ {
+ if ((PROPERTY + "declaration-handler").equals (propertyId))
+ return declHandler == base ? null : declHandler;
+
+ if ((PROPERTY + "lexical-handler").equals (propertyId))
+ return lexicalHandler == base ? null : lexicalHandler;
+
+ // unknown properties
+ throw new SAXNotRecognizedException (propertyId);
+ }
+
+ /**
+ * <b>SAX2</b>: Sets the state of feature flags in this parser. Some
+ * built-in feature flags are mutable.
+ */
+ public void setFeature (String featureId, boolean value)
+ throws SAXNotRecognizedException, SAXNotSupportedException
+ {
+ boolean state;
+
+ // Features with a defined value, we just change it if we can.
+ state = getFeature (featureId);
+
+ if (state == value)
+ return;
+ if (parser != null)
+ throw new SAXNotSupportedException ("not while parsing");
+
+ if ((FEATURE + "namespace-prefixes").equals (featureId)) {
+ // in this implementation, this only affects xmlns reporting
+ xmlNames = value;
+ // forcibly prevent illegal parser state
+ if (!xmlNames)
+ namespaces = true;
+ return;
+ }
+
+ if ((FEATURE + "namespaces").equals (featureId)) {
+ namespaces = value;
+ // forcibly prevent illegal parser state
+ if (!namespaces)
+ xmlNames = true;
+ return;
+ }
+
+ if ((FEATURE + "external-general-entities").equals (featureId)) {
+ extGE = value;
+ return;
+ }
+ if ((FEATURE + "external-parameter-entities") .equals (featureId)) {
+ extPE = value;
+ return;
+ }
+ if ((FEATURE + "resolve-dtd-uris").equals (featureId)) {
+ resolveAll = value;
+ return;
+ }
+
+ if ((FEATURE + "use-entity-resolver2").equals (featureId)) {
+ useResolver2 = value;
+ return;
+ }
+
+ throw new SAXNotRecognizedException (featureId);
+ }
+
+ /**
+ * <b>SAX2</b>: Assigns the specified property. Like SAX1 handlers,
+ * these may be changed at any time.
+ */
+ public void setProperty (String propertyId, Object value)
+ throws SAXNotRecognizedException, SAXNotSupportedException
+ {
+ // see if the property is recognized
+ getProperty (propertyId);
+
+ // Properties with a defined value, we just change it if we can.
+
+ if ((PROPERTY + "declaration-handler").equals (propertyId)) {
+ if (value == null)
+ declHandler = base;
+ else if (! (value instanceof DeclHandler))
+ throw new SAXNotSupportedException (propertyId);
+ else
+ declHandler = (DeclHandler) value;
+ return ;
+ }
+
+ if ((PROPERTY + "lexical-handler").equals (propertyId)) {
+ if (value == null)
+ lexicalHandler = base;
+ else if (! (value instanceof LexicalHandler))
+ throw new SAXNotSupportedException (propertyId);
+ else
+ lexicalHandler = (LexicalHandler) value;
+ return ;
+ }
+
+ throw new SAXNotSupportedException (propertyId);
+ }
+
+
+ //
+ // This is where the driver receives XmlParser callbacks and translates
+ // them into SAX callbacks. Some more callbacks have been added for
+ // SAX2 support.
+ //
+
+ void startDocument ()
+ throws SAXException
+ {
+ contentHandler.setDocumentLocator (this);
+ contentHandler.startDocument ();
+ attributeNames.removeAllElements ();
+ attributeValues.removeAllElements ();
+ }
+
+ void skippedEntity (String name)
+ throws SAXException
+ { contentHandler.skippedEntity (name); }
+
+ InputSource getExternalSubset (String name, String baseURI)
+ throws SAXException, IOException
+ {
+ if (resolver2 == null || !useResolver2 || !extPE)
+ return null;
+ return resolver2.getExternalSubset (name, baseURI);
+ }
+
+ InputSource resolveEntity (boolean isPE, String name,
+ InputSource in, String baseURI)
+ throws SAXException, IOException
+ {
+ InputSource source;
+
+ // external entities might be skipped
+ if (isPE && !extPE)
+ return null;
+ if (!isPE && !extGE)
+ return null;
+
+ // ... or not
+ lexicalHandler.startEntity (name);
+ if (resolver2 != null && useResolver2) {
+ source = resolver2.resolveEntity (name, in.getPublicId (),
+ baseURI, in.getSystemId ());
+ if (source == null) {
+ in.setSystemId (absolutize (baseURI,
+ in.getSystemId (), false));
+ source = in;
+ }
+ } else {
+ in.setSystemId (absolutize (baseURI, in.getSystemId (), false));
+ source = entityResolver.resolveEntity (in.getPublicId (),
+ in.getSystemId ());
+ if (source == null)
+ source = in;
+ }
+ startExternalEntity (name, source.getSystemId (), true);
+ return source;
+ }
+
+ // absolutize a system ID relative to the specified base URI
+ // (temporarily) package-visible for external entity decls
+ String absolutize (String baseURI, String systemId, boolean nice)
+ throws MalformedURLException, SAXException
+ {
+ // FIXME normalize system IDs -- when?
+ // - Convert to UTF-8
+ // - Map reserved and non-ASCII characters to %HH
+
+ try {
+ if (baseURI == null) {
+ warn ("No base URI; hope this SYSTEM id is absolute: "
+ + systemId);
+ return new URL (systemId).toString ();
+ } else
+ return new URL (new URL (baseURI), systemId).toString ();
+
+ } catch (MalformedURLException e) {
+
+ // Let unknown URI schemes pass through unless we need
+ // the JVM to map them to i/o streams for us...
+ if (!nice)
+ throw e;
+
+ // sometimes sysids for notations or unparsed entities
+ // aren't really URIs...
+ warn ("Can't absolutize SYSTEM id: " + e.getMessage ());
+ return systemId;
+ }
+ }
+
+ void startExternalEntity (String name, String systemId,
+ boolean stackOnly)
+ throws SAXException
+ {
+ if (systemId == null)
+ warn ("URI was not reported to parser for entity " + name);
+ if (!stackOnly) // spliced [dtd] needs startEntity
+ lexicalHandler.startEntity (name);
+ entityStack.push (systemId);
+ }
+
+ void endExternalEntity (String name)
+ throws SAXException
+ {
+ if (!"[document]".equals (name))
+ lexicalHandler.endEntity (name);
+ entityStack.pop ();
+ }
+
+ void startInternalEntity (String name)
+ throws SAXException
+ {
+ lexicalHandler.startEntity (name);
+ }
+
+ void endInternalEntity (String name)
+ throws SAXException
+ {
+ lexicalHandler.endEntity (name);
+ }
+
+ void doctypeDecl (String name, String publicId, String systemId)
+ throws SAXException
+ {
+ lexicalHandler.startDTD (name, publicId, systemId);
+
+ // ... the "name" is a declaration and should be given
+ // to the DeclHandler (but sax2 doesn't).
+
+ // the IDs for the external subset are lexical details,
+ // as are the contents of the internal subset; but sax2
+ // doesn't provide the internal subset "pre-parse"
+ }
+
+ void notationDecl (String name, String ids [])
+ throws SAXException
+ {
+ try {
+ dtdHandler.notationDecl (name, ids [0],
+ (resolveAll && ids [1] != null)
+ ? absolutize (ids [2], ids [1], true)
+ : ids [1]);
+ } catch (IOException e) {
+ // "can't happen"
+ throw new SAXParseException (e.getMessage (), this, e);
+ }
+ }
+
+ void unparsedEntityDecl (String name, String ids [], String notation)
+ throws SAXException
+ {
+ try {
+ dtdHandler.unparsedEntityDecl (name, ids [0],
+ resolveAll
+ ? absolutize (ids [2], ids [1], true)
+ : ids [1],
+ notation);
+ } catch (IOException e) {
+ // "can't happen"
+ throw new SAXParseException (e.getMessage (), this, e);
+ }
+ }
+
+ void endDoctype ()
+ throws SAXException
+ {
+ lexicalHandler.endDTD ();
+ }
+
+ private void declarePrefix (String prefix, String uri)
+ throws SAXException
+ {
+ int index = uri.indexOf (':');
+
+ // many versions of nwalsh docbook stylesheets
+ // have bogus URLs; so this can't be an error...
+ if (index < 1 && uri.length () != 0)
+ warn ("relative URI for namespace: " + uri);
+
+ // FIXME: char [0] must be ascii alpha; chars [1..index]
+ // must be ascii alphanumeric or in "+-." [RFC 2396]
+
+ uri = uri.intern ();
+ prefixStack.declarePrefix (prefix, uri);
+ contentHandler.startPrefixMapping (prefix, uri);
+ }
+
+ void attribute (String qname, String value, boolean isSpecified)
+ throws SAXException
+ {
+ if (!attributes) {
+ attributes = true;
+ if (namespaces)
+ prefixStack.pushContext ();
+ }
+
+ // process namespace decls immediately;
+ // then maybe forget this as an attribute
+ if (namespaces) {
+ int index;
+
+ // default NS declaration?
+ if ("xmlns" == qname) {
+ declarePrefix ("", value);
+ if (!xmlNames)
+ return;
+ }
+
+ // NS prefix declaration?
+ else if ((index = qname.indexOf (':')) == 5
+ && qname.startsWith ("xmlns")) {
+ String prefix = qname.substring (6);
+
+ if (value.length () == 0) {
+ verror ("missing URI in namespace decl attribute: "
+ + qname);
+ } else
+ declarePrefix (prefix, value);
+ if (!xmlNames)
+ return;
+ }
+ }
+
+ // remember this attribute ...
+
+ if (attributeCount == attributeSpecified.length) { // grow array?
+ boolean temp [] = new boolean [attributeSpecified.length + 5];
+ System.arraycopy (attributeSpecified, 0, temp, 0, attributeCount);
+ attributeSpecified = temp;
+ }
+ attributeSpecified [attributeCount] = isSpecified;
+
+ attributeCount++;
+ attributeNames.addElement (qname);
+ // attribute type comes from querying parser's DTD records
+ attributeValues.addElement (value);
+
+ // ... patching {lname, uri} later, if needed
+ attributeNamespaces.addElement ("");
+ attributeLocalNames.addElement ("");
+ }
+
+ void startElement (String elname)
+ throws SAXException
+ {
+ ContentHandler handler = contentHandler;
+
+ //
+ // NOTE: this implementation of namespace support adds something
+ // like six percent to parsing CPU time, in a large (~50 MB)
+ // document that doesn't use namespaces at all. (Measured by PC
+ // sampling, with a bug where endElement processing was omitted.)
+ // [Measurement referred to older implementation, older JVM ...]
+ //
+ // It ought to become notably faster in such cases. Most
+ // costs are the prefix stack calling Hashtable.get() (2%),
+ // String.hashCode() (1.5%) and about 1.3% each for pushing
+ // the context, and two chunks of name processing.
+ //
+
+ if (!attributes) {
+ if (namespaces)
+ prefixStack.pushContext ();
+ } else if (namespaces) {
+
+ // now we can patch up namespace refs; we saw all the
+ // declarations, so now we'll do the Right Thing
+ for (int i = 0; i < attributeCount; i++) {
+ String qname = (String) attributeNames.elementAt (i);
+ int index;
+
+ // default NS declaration?
+ if ("xmlns" == qname)
+ continue;
+
+ index = qname.indexOf (':');
+
+ // NS prefix declaration?
+ if (index == 5 && qname.startsWith ("xmlns"))
+ continue;
+
+ // it's not a NS decl; patch namespace info items
+ if (prefixStack.processName (qname, nsTemp, true) == null)
+ verror ("undeclared attribute prefix in: " + qname);
+ else {
+ attributeNamespaces.setElementAt (nsTemp [0], i);
+ attributeLocalNames.setElementAt (nsTemp [1], i);
+ }
+ }
+ }
+
+ // save element name so attribute callbacks work
+ elementName = elname;
+ if (namespaces) {
+ if (prefixStack.processName (elname, nsTemp, false) == null) {
+ verror ("undeclared element prefix in: " + elname);
+ nsTemp [0] = nsTemp [1] = "";
+ }
+ handler.startElement (nsTemp [0], nsTemp [1], elname, this);
+ } else
+ handler.startElement ("", "", elname, this);
+ // elementName = null;
+
+ // elements with no attributes are pretty common!
+ if (attributes) {
+ attributeNames.removeAllElements ();
+ attributeNamespaces.removeAllElements ();
+ attributeLocalNames.removeAllElements ();
+ attributeValues.removeAllElements ();
+ attributeCount = 0;
+ attributes = false;
+ }
+ }
+
+ void endElement (String elname)
+ throws SAXException
+ {
+ ContentHandler handler = contentHandler;
+
+ if (!namespaces) {
+ handler.endElement ("", "", elname);
+ return;
+ }
+ prefixStack.processName (elname, nsTemp, false);
+ handler.endElement (nsTemp [0], nsTemp [1], elname);
+
+ Enumeration prefixes = prefixStack.getDeclaredPrefixes ();
+
+ while (prefixes.hasMoreElements ())
+ handler.endPrefixMapping ((String) prefixes.nextElement ());
+ prefixStack.popContext ();
+ }
+
+ void startCDATA ()
+ throws SAXException
+ {
+ lexicalHandler.startCDATA ();
+ }
+
+ void charData (char ch[], int start, int length)
+ throws SAXException
+ {
+ contentHandler.characters (ch, start, length);
+ }
+
+ void endCDATA ()
+ throws SAXException
+ {
+ lexicalHandler.endCDATA ();
+ }
+
+ void ignorableWhitespace (char ch[], int start, int length)
+ throws SAXException
+ {
+ contentHandler.ignorableWhitespace (ch, start, length);
+ }
+
+ void processingInstruction (String target, String data)
+ throws SAXException
+ {
+ contentHandler.processingInstruction (target, data);
+ }
+
+ void comment (char ch[], int start, int length)
+ throws SAXException
+ {
+ if (lexicalHandler != base)
+ lexicalHandler.comment (ch, start, length);
+ }
+
+ void fatal (String message)
+ throws SAXException
+ {
+ SAXParseException fatal;
+
+ fatal = new SAXParseException (message, this);
+ errorHandler.fatalError (fatal);
+
+ // Even if the application can continue ... we can't!
+ throw fatal;
+ }
+
+ // We can safely report a few validity errors that
+ // make layered SAX2 DTD validation more conformant
+ void verror (String message)
+ throws SAXException
+ {
+ SAXParseException err;
+
+ err = new SAXParseException (message, this);
+ errorHandler.error (err);
+ }
+
+ void warn (String message)
+ throws SAXException
+ {
+ SAXParseException err;
+
+ err = new SAXParseException (message, this);
+ errorHandler.warning (err);
+ }
+
+
+ //
+ // Implementation of org.xml.sax.Attributes.
+ //
+
+ /**
+ * <b>SAX1 AttributeList, SAX2 Attributes</b> method
+ * (don't invoke on parser);
+ */
+ public int getLength ()
+ {
+ return attributeNames.size ();
+ }
+
+ /**
+ * <b>SAX2 Attributes</b> method (don't invoke on parser);
+ */
+ public String getURI (int index)
+ {
+ return (String) (attributeNamespaces.elementAt (index));
+ }
+
+ /**
+ * <b>SAX2 Attributes</b> method (don't invoke on parser);
+ */
+ public String getLocalName (int index)
+ {
+ return (String) (attributeLocalNames.elementAt (index));
+ }
+
+ /**
+ * <b>SAX2 Attributes</b> method (don't invoke on parser);
+ */
+ public String getQName (int i)
+ {
+ return (String) (attributeNames.elementAt (i));
+ }
+
+ /**
+ * <b>SAX1 AttributeList</b> method (don't invoke on parser);
+ */
+ public String getName (int i)
+ {
+ return (String) (attributeNames.elementAt (i));
+ }
+
+ /**
+ * <b>SAX1 AttributeList, SAX2 Attributes</b> method
+ * (don't invoke on parser);
+ */
+ public String getType (int i)
+ {
+ String type = parser.getAttributeType (elementName, getQName (i));
+ if (type == null)
+ return "CDATA";
+ // ... use DeclHandler.attributeDecl to see enumerations
+ if (type == "ENUMERATION")
+ return "NMTOKEN";
+ return type;
+ }
+
+
+ /**
+ * <b>SAX1 AttributeList, SAX2 Attributes</b> method
+ * (don't invoke on parser);
+ */
+ public String getValue (int i)
+ {
+ return (String) (attributeValues.elementAt (i));
+ }
+
+
+ /**
+ * <b>SAX2 Attributes</b> method (don't invoke on parser);
+ */
+ public int getIndex (String uri, String local)
+ {
+ int length = getLength ();
+
+ for (int i = 0; i < length; i++) {
+ if (!getURI (i).equals (uri))
+ continue;
+ if (getLocalName (i).equals (local))
+ return i;
+ }
+ return -1;
+ }
+
+
+ /**
+ * <b>SAX2 Attributes</b> method (don't invoke on parser);
+ */
+ public int getIndex (String xmlName)
+ {
+ int length = getLength ();
+
+ for (int i = 0; i < length; i++) {
+ if (getQName (i).equals (xmlName))
+ return i;
+ }
+ return -1;
+ }
+
+
+ /**
+ * <b>SAX2 Attributes</b> method (don't invoke on parser);
+ */
+ public String getType (String uri, String local)
+ {
+ int index = getIndex (uri, local);
+
+ if (index < 0)
+ return null;
+ return getType (index);
+ }
+
+
+ /**
+ * <b>SAX1 AttributeList, SAX2 Attributes</b> method
+ * (don't invoke on parser);
+ */
+ public String getType (String xmlName)
+ {
+ int index = getIndex (xmlName);
+
+ if (index < 0)
+ return null;
+ return getType (index);
+ }
+
+
+ /**
+ * <b>SAX Attributes</b> method (don't invoke on parser);
+ */
+ public String getValue (String uri, String local)
+ {
+ int index = getIndex (uri, local);
+
+ if (index < 0)
+ return null;
+ return getValue (index);
+ }
+
+
+ /**
+ * <b>SAX1 AttributeList, SAX2 Attributes</b> method
+ * (don't invoke on parser);
+ */
+ public String getValue (String xmlName)
+ {
+ int index = getIndex (xmlName);
+
+ if (index < 0)
+ return null;
+ return getValue (index);
+ }
+
+
+ //
+ // Implementation of org.xml.sax.ext.Attributes2
+ //
+
+
+ /** @return false unless the attribute was declared in the DTD.
+ * @throws java.lang.ArrayIndexOutOfBoundsException
+ * When the supplied index does not identify an attribute.
+ */
+ public boolean isDeclared (int index)
+ {
+ if (index < 0 || index >= attributeCount)
+ throw new ArrayIndexOutOfBoundsException ();
+ return attributeDeclared [index];
+ }
+
+ /** @return false unless the attribute was declared in the DTD.
+ * @throws java.lang.IllegalArgumentException
+ * When the supplied names do not identify an attribute.
+ */
+ public boolean isDeclared (java.lang.String qName)
+ {
+ int index = getIndex (qName);
+ if (index < 0)
+ throw new IllegalArgumentException ();
+ return attributeDeclared [index];
+ }
+
+ /** @return false unless the attribute was declared in the DTD.
+ * @throws java.lang.IllegalArgumentException
+ * When the supplied names do not identify an attribute.
+ */
+ public boolean isDeclared (java.lang.String uri, java.lang.String localName)
+ {
+ int index = getIndex (uri, localName);
+ if (index < 0)
+ throw new IllegalArgumentException ();
+ return attributeDeclared [index];
+ }
+
+
+ /**
+ * <b>SAX-ext Attributes2</b> method (don't invoke on parser);
+ */
+ public boolean isSpecified (int index)
+ {
+ if (index < 0 || index >= attributeCount)
+ throw new ArrayIndexOutOfBoundsException ();
+ return attributeSpecified [index];
+ }
+
+ /**
+ * <b>SAX-ext Attributes2</b> method (don't invoke on parser);
+ */
+ public boolean isSpecified (String uri, String local)
+ {
+ int index = getIndex (uri, local);
+
+ if (index < 0)
+ throw new IllegalArgumentException ();
+ return attributeSpecified [index];
+ }
+
+ /**
+ * <b>SAX-ext Attributes2</b> method (don't invoke on parser);
+ */
+ public boolean isSpecified (String xmlName)
+ {
+ int index = getIndex (xmlName);
+
+ if (index < 0)
+ throw new IllegalArgumentException ();
+ return attributeSpecified [index];
+ }
+
+
+ //
+ // Implementation of org.xml.sax.Locator.
+ //
+
+ /**
+ * <b>SAX Locator</b> method (don't invoke on parser);
+ */
+ public String getPublicId ()
+ {
+ return null; // FIXME track public IDs too
+ }
+
+ /**
+ * <b>SAX Locator</b> method (don't invoke on parser);
+ */
+ public String getSystemId ()
+ {
+ if (entityStack.empty ())
+ return null;
+ else
+ return (String) entityStack.peek ();
+ }
+
+ /**
+ * <b>SAX Locator</b> method (don't invoke on parser);
+ */
+ public int getLineNumber ()
+ {
+ return parser.getLineNumber ();
+ }
+
+ /**
+ * <b>SAX Locator</b> method (don't invoke on parser);
+ */
+ public int getColumnNumber ()
+ {
+ return parser.getColumnNumber ();
+ }
+
+ // adapter between SAX2 content handler and SAX1 document handler callbacks
+ private static class Adapter implements ContentHandler
+ {
+ private DocumentHandler docHandler;
+
+ Adapter (DocumentHandler dh)
+ { docHandler = dh; }
+
+
+ public void setDocumentLocator (Locator l)
+ { docHandler.setDocumentLocator (l); }
+
+ public void startDocument () throws SAXException
+ { docHandler.startDocument (); }
+
+ public void processingInstruction (String target, String data)
+ throws SAXException
+ { docHandler.processingInstruction (target, data); }
+
+ public void startPrefixMapping (String prefix, String uri)
+ { /* ignored */ }
+
+ public void startElement (
+ String namespace,
+ String local,
+ String name,
+ Attributes attrs
+ ) throws SAXException
+ { docHandler.startElement (name, (AttributeList) attrs); }
+
+ public void characters (char buf [], int offset, int len)
+ throws SAXException
+ { docHandler.characters (buf, offset, len); }
+
+ public void ignorableWhitespace (char buf [], int offset, int len)
+ throws SAXException
+ { docHandler.ignorableWhitespace (buf, offset, len); }
+
+ public void skippedEntity (String name)
+ { /* ignored */ }
+
+ public void endElement (String u, String l, String name)
+ throws SAXException
+ { docHandler.endElement (name); }
+
+ public void endPrefixMapping (String prefix)
+ { /* ignored */ }
+
+ public void endDocument () throws SAXException
+ { docHandler.endDocument (); }
+ }
+}
diff --git a/external/jaxp/source/gnu/xml/aelfred2/XmlParser.java b/external/jaxp/source/gnu/xml/aelfred2/XmlParser.java
new file mode 100644
index 000000000..cda5849b8
--- /dev/null
+++ b/external/jaxp/source/gnu/xml/aelfred2/XmlParser.java
@@ -0,0 +1,4755 @@
+/*
+ * $Id: XmlParser.java,v 1.1 2003-02-01 02:10:12 cbj Exp $
+ * Copyright (C) 1999-2001 David Brownell
+ *
+ * This file is part of GNU JAXP, a library.
+ *
+ * GNU JAXP is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * GNU JAXP is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ * As a special exception, if you link this library with other files to
+ * produce an executable, this library does not by itself cause the
+ * resulting executable to be covered by the GNU General Public License.
+ * This exception does not however invalidate any other reasons why the
+ * executable file might be covered by the GNU General Public License.
+ */
+
+//
+// Copyright (c) 1997, 1998 by Microstar Software Ltd.
+// From Microstar's README (the entire original license):
+//
+// Separate statements also said it's in the public domain.
+// All modifications are distributed under the license
+// above (GPL with library exception).
+//
+// AElfred is free for both commercial and non-commercial use and
+// redistribution, provided that Microstar's copyright and disclaimer are
+// retained intact. You are free to modify AElfred for your own use and
+// to redistribute AElfred with your modifications, provided that the
+// modifications are clearly documented.
+//
+// This program is distributed in the hope that it will be useful, but
+// WITHOUT ANY WARRANTY; without even the implied warranty of
+// merchantability or fitness for a particular purpose. Please use it AT
+// YOUR OWN RISK.
+//
+
+
+package gnu.xml.aelfred2;
+
+import java.io.BufferedInputStream;
+import java.io.CharConversionException;
+import java.io.EOFException;
+import java.io.InputStream;
+import java.io.InputStreamReader;
+import java.io.IOException;
+import java.io.Reader;
+import java.io.UnsupportedEncodingException;
+import java.net.URL;
+import java.net.URLConnection;
+
+// maintaining 1.1 compatibility for now ...
+// Iterator and Hashmap ought to be faster
+import java.util.Enumeration;
+import java.util.Hashtable;
+import java.util.Stack;
+
+import org.xml.sax.InputSource;
+import org.xml.sax.SAXException;
+
+
+// $Id: XmlParser.java,v 1.1 2003-02-01 02:10:12 cbj Exp $
+
+/**
+ * Parse XML documents and return parse events through call-backs.
+ * Use the <code>SAXDriver</code> class as your entry point, as all
+ * internal parser interfaces are subject to change.
+ *
+ * @author Written by David Megginson &lt;dmeggins@microstar.com&gt;
+ * (version 1.2a with bugfixes)
+ * @author Updated by David Brownell &lt;dbrownell@users.sourceforge.net&gt;
+ * @version $Date: 2003-02-01 02:10:12 $
+ * @see SAXDriver
+ */
+final class XmlParser
+{
+ // avoid slow per-character readCh()
+ private final static boolean USE_CHEATS = true;
+
+
+ //////////////////////////////////////////////////////////////////////
+ // Constructors.
+ ////////////////////////////////////////////////////////////////////////
+
+
+ /**
+ * Construct a new parser with no associated handler.
+ * @see #setHandler
+ * @see #parse
+ */
+ // package private
+ XmlParser ()
+ {
+ }
+
+
+ /**
+ * Set the handler that will receive parsing events.
+ * @param handler The handler to receive callback events.
+ * @see #parse
+ */
+ // package private
+ void setHandler (SAXDriver handler)
+ {
+ this.handler = handler;
+ }
+
+
+ /**
+ * Parse an XML document from the character stream, byte stream, or URI
+ * that you provide (in that order of preference). Any URI that you
+ * supply will become the base URI for resolving relative URI, and may
+ * be used to acquire a reader or byte stream.
+ *
+ * <p> Only one thread at a time may use this parser; since it is
+ * private to this package, post-parse cleanup is done by the caller,
+ * which MUST NOT REUSE the parser (just null it).
+ *
+ * @param systemId Absolute URI of the document; should never be null,
+ * but may be so iff a reader <em>or</em> a stream is provided.
+ * @param publicId The public identifier of the document, or null.
+ * @param reader A character stream; must be null if stream isn't.
+ * @param stream A byte input stream; must be null if reader isn't.
+ * @param encoding The suggested encoding, or null if unknown.
+ * @exception java.lang.Exception Basically SAXException or IOException
+ */
+ // package private
+ void doParse (
+ String systemId,
+ String publicId,
+ Reader reader,
+ InputStream stream,
+ String encoding
+ ) throws Exception
+ {
+ if (handler == null)
+ throw new IllegalStateException ("no callback handler");
+
+ initializeVariables ();
+
+ // predeclare the built-in entities here (replacement texts)
+ // we don't need to intern(), since we're guaranteed literals
+ // are always (globally) interned.
+ setInternalEntity ("amp", "&#38;");
+ setInternalEntity ("lt", "&#60;");
+ setInternalEntity ("gt", "&#62;");
+ setInternalEntity ("apos", "&#39;");
+ setInternalEntity ("quot", "&#34;");
+
+ try {
+ // pushURL first to ensure locator is correct in startDocument
+ // ... it might report an IO or encoding exception.
+ // FIXME that could call endDocument without startDocument!
+ pushURL (false, "[document]",
+ // default baseURI: null
+ new String [] { publicId, systemId, null},
+ reader, stream, encoding, false);
+
+ handler.startDocument ();
+ parseDocument ();
+ } finally {
+ if (reader != null)
+ try { reader.close ();
+ } catch (IOException e) { /* ignore */ }
+ if (stream != null)
+ try { stream.close ();
+ } catch (IOException e) { /* ignore */ }
+ if (is != null)
+ try { is.close ();
+ } catch (IOException e) { /* ignore */ }
+ if (reader != null)
+ try {
+ reader.close ();
+ } catch (IOException e) { /* ignore */
+ }
+ scratch = null;
+ }
+ }
+
+
+ ////////////////////////////////////////////////////////////////////////
+ // Constants.
+ ////////////////////////////////////////////////////////////////////////
+
+ //
+ // Constants for element content type.
+ //
+
+ /**
+ * Constant: an element has not been declared.
+ * @see #getElementContentType
+ */
+ public final static int CONTENT_UNDECLARED = 0;
+
+ /**
+ * Constant: the element has a content model of ANY.
+ * @see #getElementContentType
+ */
+ public final static int CONTENT_ANY = 1;
+
+ /**
+ * Constant: the element has declared content of EMPTY.
+ * @see #getElementContentType
+ */
+ public final static int CONTENT_EMPTY = 2;
+
+ /**
+ * Constant: the element has mixed content.
+ * @see #getElementContentType
+ */
+ public final static int CONTENT_MIXED = 3;
+
+ /**
+ * Constant: the element has element content.
+ * @see #getElementContentType
+ */
+ public final static int CONTENT_ELEMENTS = 4;
+
+
+ //
+ // Constants for the entity type.
+ //
+
+ /**
+ * Constant: the entity has not been declared.
+ * @see #getEntityType
+ */
+ public final static int ENTITY_UNDECLARED = 0;
+
+ /**
+ * Constant: the entity is internal.
+ * @see #getEntityType
+ */
+ public final static int ENTITY_INTERNAL = 1;
+
+ /**
+ * Constant: the entity is external, non-parsable data.
+ * @see #getEntityType
+ */
+ public final static int ENTITY_NDATA = 2;
+
+ /**
+ * Constant: the entity is external XML data.
+ * @see #getEntityType
+ */
+ public final static int ENTITY_TEXT = 3;
+
+
+ //
+ // Attribute type constants are interned literal strings.
+ //
+
+ //
+ // Constants for supported encodings. "external" is just a flag.
+ //
+ private final static int ENCODING_EXTERNAL = 0;
+ private final static int ENCODING_UTF_8 = 1;
+ private final static int ENCODING_ISO_8859_1 = 2;
+ private final static int ENCODING_UCS_2_12 = 3;
+ private final static int ENCODING_UCS_2_21 = 4;
+ private final static int ENCODING_UCS_4_1234 = 5;
+ private final static int ENCODING_UCS_4_4321 = 6;
+ private final static int ENCODING_UCS_4_2143 = 7;
+ private final static int ENCODING_UCS_4_3412 = 8;
+ private final static int ENCODING_ASCII = 9;
+
+
+ //
+ // Constants for attribute default value.
+ //
+
+ /**
+ * Constant: the attribute is not declared.
+ * @see #getAttributeDefaultValueType
+ */
+ public final static int ATTRIBUTE_DEFAULT_UNDECLARED = 30;
+
+ /**
+ * Constant: the attribute has a literal default value specified.
+ * @see #getAttributeDefaultValueType
+ * @see #getAttributeDefaultValue
+ */
+ public final static int ATTRIBUTE_DEFAULT_SPECIFIED = 31;
+
+ /**
+ * Constant: the attribute was declared #IMPLIED.
+ * @see #getAttributeDefaultValueType
+ */
+ public final static int ATTRIBUTE_DEFAULT_IMPLIED = 32;
+
+ /**
+ * Constant: the attribute was declared #REQUIRED.
+ * @see #getAttributeDefaultValueType
+ */
+ public final static int ATTRIBUTE_DEFAULT_REQUIRED = 33;
+
+ /**
+ * Constant: the attribute was declared #FIXED.
+ * @see #getAttributeDefaultValueType
+ * @see #getAttributeDefaultValue
+ */
+ public final static int ATTRIBUTE_DEFAULT_FIXED = 34;
+
+
+ //
+ // Constants for input.
+ //
+ private final static int INPUT_NONE = 0;
+ private final static int INPUT_INTERNAL = 1;
+ private final static int INPUT_STREAM = 3;
+ private final static int INPUT_READER = 5;
+
+
+ //
+ // Flags for reading literals.
+ //
+ // expand general entity refs (attribute values in dtd and content)
+ private final static int LIT_ENTITY_REF = 2;
+ // normalize this value (space chars) (attributes, public ids)
+ private final static int LIT_NORMALIZE = 4;
+ // literal is an attribute value
+ private final static int LIT_ATTRIBUTE = 8;
+ // don't expand parameter entities
+ private final static int LIT_DISABLE_PE = 16;
+ // don't expand [or parse] character refs
+ private final static int LIT_DISABLE_CREF = 32;
+ // don't parse general entity refs
+ private final static int LIT_DISABLE_EREF = 64;
+ // literal is a public ID value
+ private final static int LIT_PUBID = 256;
+
+
+ //
+ // Flags affecting PE handling in DTDs (if expandPE is true).
+ // PEs expand with space padding, except inside literals.
+ //
+ private final static int CONTEXT_NORMAL = 0;
+ private final static int CONTEXT_LITERAL = 1;
+
+
+ //////////////////////////////////////////////////////////////////////
+ // Error reporting.
+ //////////////////////////////////////////////////////////////////////
+
+
+ /**
+ * Report an error.
+ * @param message The error message.
+ * @param textFound The text that caused the error (or null).
+ * @see SAXDriver#error
+ * @see #line
+ */
+ private void error (String message, String textFound, String textExpected)
+ throws SAXException
+ {
+ if (textFound != null) {
+ message = message + " (found \"" + textFound + "\")";
+ }
+ if (textExpected != null) {
+ message = message + " (expected \"" + textExpected + "\")";
+ }
+ handler.fatal (message);
+
+ // "can't happen"
+ throw new SAXException (message);
+ }
+
+
+ /**
+ * Report a serious error.
+ * @param message The error message.
+ * @param textFound The text that caused the error (or null).
+ */
+ private void error (String message, char textFound, String textExpected)
+ throws SAXException
+ {
+ error (message, new Character (textFound).toString (), textExpected);
+ }
+
+ /** Report typical case fatal errors. */
+ private void error (String message)
+ throws SAXException
+ {
+ handler.fatal (message);
+ }
+
+
+ //////////////////////////////////////////////////////////////////////
+ // Major syntactic productions.
+ //////////////////////////////////////////////////////////////////////
+
+
+ /**
+ * Parse an XML document.
+ * <pre>
+ * [1] document ::= prolog element Misc*
+ * </pre>
+ * <p>This is the top-level parsing function for a single XML
+ * document. As a minimum, a well-formed document must have
+ * a document element, and a valid document must have a prolog
+ * (one with doctype) as well.
+ */
+ private void parseDocument ()
+ throws Exception
+ {
+ try { // added by MHK
+ boolean sawDTD = parseProlog ();
+ require ('<');
+ parseElement (!sawDTD);
+ } catch (EOFException ee) { // added by MHK
+ error("premature end of file", "[EOF]", null);
+ }
+
+ try {
+ parseMisc (); //skip all white, PIs, and comments
+ char c = readCh (); //if this doesn't throw an exception...
+ error ("unexpected characters after document end", c, null);
+ } catch (EOFException e) {
+ return;
+ }
+ }
+
+ static final char startDelimComment [] = { '<', '!', '-', '-' };
+ static final char endDelimComment [] = { '-', '-' };
+
+ /**
+ * Skip a comment.
+ * <pre>
+ * [15] Comment ::= '&lt;!--' ((Char - '-') | ('-' (Char - '-')))* "-->"
+ * </pre>
+ * <p> (The <code>&lt;!--</code> has already been read.)
+ */
+ private void parseComment ()
+ throws Exception
+ {
+ char c;
+ boolean saved = expandPE;
+
+ expandPE = false;
+ parseUntil (endDelimComment);
+ require ('>');
+ expandPE = saved;
+ handler.comment (dataBuffer, 0, dataBufferPos);
+ dataBufferPos = 0;
+ }
+
+ static final char startDelimPI [] = { '<', '?' };
+ static final char endDelimPI [] = { '?', '>' };
+
+ /**
+ * Parse a processing instruction and do a call-back.
+ * <pre>
+ * [16] PI ::= '&lt;?' PITarget
+ * (S (Char* - (Char* '?&gt;' Char*)))?
+ * '?&gt;'
+ * [17] PITarget ::= Name - ( ('X'|'x') ('M'|m') ('L'|l') )
+ * </pre>
+ * <p> (The <code>&lt;?</code> has already been read.)
+ */
+ private void parsePI ()
+ throws SAXException, IOException
+ {
+ String name;
+ boolean saved = expandPE;
+
+ expandPE = false;
+ name = readNmtoken (true);
+ if ("xml".equalsIgnoreCase (name))
+ error ("Illegal processing instruction target", name, null);
+ if (!tryRead (endDelimPI)) {
+ requireWhitespace ();
+ parseUntil (endDelimPI);
+ }
+ expandPE = saved;
+ handler.processingInstruction (name, dataBufferToString ());
+ }
+
+
+ static final char endDelimCDATA [] = { ']', ']', '>' };
+
+ /**
+ * Parse a CDATA section.
+ * <pre>
+ * [18] CDSect ::= CDStart CData CDEnd
+ * [19] CDStart ::= '&lt;![CDATA['
+ * [20] CData ::= (Char* - (Char* ']]&gt;' Char*))
+ * [21] CDEnd ::= ']]&gt;'
+ * </pre>
+ * <p> (The '&lt;![CDATA[' has already been read.)
+ */
+ private void parseCDSect ()
+ throws Exception
+ {
+ parseUntil (endDelimCDATA);
+ dataBufferFlush ();
+ }
+
+
+ /**
+ * Parse the prolog of an XML document.
+ * <pre>
+ * [22] prolog ::= XMLDecl? Misc* (Doctypedecl Misc*)?
+ * </pre>
+ * <p>We do not look for the XML declaration here, because it was
+ * handled by pushURL ().
+ * @see pushURL
+ * @return true if a DTD was read.
+ */
+ private boolean parseProlog ()
+ throws Exception
+ {
+ parseMisc ();
+
+ if (tryRead ("<!DOCTYPE")) {
+ parseDoctypedecl ();
+ parseMisc ();
+ return true;
+ }
+ return false;
+ }
+
+ private void checkLegalVersion (String version)
+ throws SAXException
+ {
+ int len = version.length ();
+ for (int i = 0; i < len; i++) {
+ char c = version.charAt (i);
+ if ('0' <= c && c <= '9')
+ continue;
+ if (c == '_' || c == '.' || c == ':' || c == '-')
+ continue;
+ if ('a' <= c && c <= 'z')
+ continue;
+ if ('A' <= c && c <= 'Z')
+ continue;
+ error ("illegal character in version", version, "1.0");
+ }
+ }
+
+
+ /**
+ * Parse the XML declaration.
+ * <pre>
+ * [23] XMLDecl ::= '&lt;?xml' VersionInfo EncodingDecl? SDDecl? S? '?&gt;'
+ * [24] VersionInfo ::= S 'version' Eq
+ * ("'" VersionNum "'" | '"' VersionNum '"' )
+ * [26] VersionNum ::= ([a-zA-Z0-9_.:] | '-')*
+ * [32] SDDecl ::= S 'standalone' Eq
+ * ( "'"" ('yes' | 'no') "'"" | '"' ("yes" | "no") '"' )
+ * [80] EncodingDecl ::= S 'encoding' Eq
+ * ( "'" EncName "'" | "'" EncName "'" )
+ * [81] EncName ::= [A-Za-z] ([A-Za-z0-9._] | '-')*
+ * </pre>
+ * <p> (The <code>&lt;?xml</code> and whitespace have already been read.)
+ * @return the encoding in the declaration, uppercased; or null
+ * @see #parseTextDecl
+ * @see #setupDecoding
+ */
+ private String parseXMLDecl (boolean ignoreEncoding)
+ throws SAXException, IOException
+ {
+ String version;
+ String encodingName = null;
+ String standalone = null;
+ int flags = LIT_DISABLE_CREF | LIT_DISABLE_PE | LIT_DISABLE_EREF;
+
+ // Read the version.
+ require ("version");
+ parseEq ();
+ checkLegalVersion (version = readLiteral (flags));
+ if (!version.equals ("1.0"))
+ handler.warn ("expected XML version 1.0, not: " + version);
+
+ // Try reading an encoding declaration.
+ boolean white = tryWhitespace ();
+
+ if (tryRead ("encoding")) {
+ if (!white)
+ error ("whitespace required before 'encoding='");
+ parseEq ();
+ encodingName = readLiteral (flags);
+ if (!ignoreEncoding)
+ setupDecoding (encodingName);
+ }
+
+ // Try reading a standalone declaration
+ if (encodingName != null)
+ white = tryWhitespace ();
+ if (tryRead ("standalone")) {
+ if (!white)
+ error ("whitespace required before 'standalone='");
+ parseEq ();
+ standalone = readLiteral (flags);
+ if ("yes".equals (standalone))
+ docIsStandalone = true;
+ else if (!"no".equals (standalone))
+ error ("standalone flag must be 'yes' or 'no'");
+ }
+
+ skipWhitespace ();
+ require ("?>");
+
+ return encodingName;
+ }
+
+
+ /**
+ * Parse a text declaration.
+ * <pre>
+ * [79] TextDecl ::= '&lt;?xml' VersionInfo? EncodingDecl S? '?&gt;'
+ * [80] EncodingDecl ::= S 'encoding' Eq
+ * ( '"' EncName '"' | "'" EncName "'" )
+ * [81] EncName ::= [A-Za-z] ([A-Za-z0-9._] | '-')*
+ * </pre>
+ * <p> (The <code>&lt;?xml</code>' and whitespace have already been read.)
+ * @return the encoding in the declaration, uppercased; or null
+ * @see #parseXMLDecl
+ * @see #setupDecoding
+ */
+ private String parseTextDecl (boolean ignoreEncoding)
+ throws SAXException, IOException
+ {
+ String encodingName = null;
+ int flags = LIT_DISABLE_CREF | LIT_DISABLE_PE | LIT_DISABLE_EREF;
+
+ // Read an optional version.
+ if (tryRead ("version")) {
+ String version;
+ parseEq ();
+ checkLegalVersion (version = readLiteral (flags));
+ if (!version.equals ("1.0"))
+ handler.warn ("expected XML version 1.0, not: " + version);
+ requireWhitespace ();
+ }
+
+
+ // Read the encoding.
+ require ("encoding");
+ parseEq ();
+ encodingName = readLiteral (flags);
+ if (!ignoreEncoding)
+ setupDecoding (encodingName);
+
+ skipWhitespace ();
+ require ("?>");
+
+ return encodingName;
+ }
+
+
+ /**
+ * Sets up internal state so that we can decode an entity using the
+ * specified encoding. This is used when we start to read an entity
+ * and we have been given knowledge of its encoding before we start to
+ * read any data (e.g. from a SAX input source or from a MIME type).
+ *
+ * <p> It is also used after autodetection, at which point only very
+ * limited adjustments to the encoding may be used (switching between
+ * related builtin decoders).
+ *
+ * @param encodingName The name of the encoding specified by the user.
+ * @exception IOException if the encoding isn't supported either
+ * internally to this parser, or by the hosting JVM.
+ * @see #parseXMLDecl
+ * @see #parseTextDecl
+ */
+ private void setupDecoding (String encodingName)
+ throws SAXException, IOException
+ {
+ encodingName = encodingName.toUpperCase ();
+
+ // ENCODING_EXTERNAL indicates an encoding that wasn't
+ // autodetected ... we can use builtin decoders, or
+ // ones from the JVM (InputStreamReader).
+
+ // Otherwise we can only tweak what was autodetected, and
+ // only for single byte (ASCII derived) builtin encodings.
+
+ // ASCII-derived encodings
+ if (encoding == ENCODING_UTF_8 || encoding == ENCODING_EXTERNAL) {
+ if (encodingName.equals ("ISO-8859-1")
+ || encodingName.equals ("8859_1")
+ || encodingName.equals ("ISO8859_1")
+ ) {
+ encoding = ENCODING_ISO_8859_1;
+ return;
+ } else if (encodingName.equals ("US-ASCII")
+ || encodingName.equals ("ASCII")) {
+ encoding = ENCODING_ASCII;
+ return;
+ } else if (encodingName.equals ("UTF-8")
+ || encodingName.equals ("UTF8")) {
+ encoding = ENCODING_UTF_8;
+ return;
+ } else if (encoding != ENCODING_EXTERNAL) {
+ // used to start with a new reader ...
+ throw new UnsupportedEncodingException (encodingName);
+ }
+ // else fallthrough ...
+ // it's ASCII-ish and something other than a builtin
+ }
+
+ // Unicode and such
+ if (encoding == ENCODING_UCS_2_12 || encoding == ENCODING_UCS_2_21) {
+ if (!(encodingName.equals ("ISO-10646-UCS-2")
+ || encodingName.equals ("UTF-16")
+ || encodingName.equals ("UTF-16BE")
+ || encodingName.equals ("UTF-16LE")))
+ error ("unsupported Unicode encoding",
+ encodingName,
+ "UTF-16");
+ return;
+ }
+
+ // four byte encodings
+ if (encoding == ENCODING_UCS_4_1234
+ || encoding == ENCODING_UCS_4_4321
+ || encoding == ENCODING_UCS_4_2143
+ || encoding == ENCODING_UCS_4_3412) {
+ // Strictly: "UCS-4" == "UTF-32BE"; also, "UTF-32LE" exists
+ if (!encodingName.equals ("ISO-10646-UCS-4"))
+ error ("unsupported 32-bit encoding",
+ encodingName,
+ "ISO-10646-UCS-4");
+ return;
+ }
+
+ // assert encoding == ENCODING_EXTERNAL
+ // if (encoding != ENCODING_EXTERNAL)
+ // throw new RuntimeException ("encoding = " + encoding);
+
+ if (encodingName.equals ("UTF-16BE")) {
+ encoding = ENCODING_UCS_2_12;
+ return;
+ }
+ if (encodingName.equals ("UTF-16LE")) {
+ encoding = ENCODING_UCS_2_21;
+ return;
+ }
+
+ // We couldn't use the builtin decoders at all. But we can try to
+ // create a reader, since we haven't messed up buffering. Tweak
+ // the encoding name if necessary.
+
+ if (encodingName.equals ("UTF-16")
+ || encodingName.equals ("ISO-10646-UCS-2"))
+ encodingName = "Unicode";
+ // Ignoring all the EBCDIC aliases here
+
+ reader = new InputStreamReader (is, encodingName);
+ sourceType = INPUT_READER;
+ }
+
+
+ /**
+ * Parse miscellaneous markup outside the document element and DOCTYPE
+ * declaration.
+ * <pre>
+ * [27] Misc ::= Comment | PI | S
+ * </pre>
+ */
+ private void parseMisc ()
+ throws Exception
+ {
+ while (true) {
+ skipWhitespace ();
+ if (tryRead (startDelimPI)) {
+ parsePI ();
+ } else if (tryRead (startDelimComment)) {
+ parseComment ();
+ } else {
+ return;
+ }
+ }
+ }
+
+
+ /**
+ * Parse a document type declaration.
+ * <pre>
+ * [28] doctypedecl ::= '&lt;!DOCTYPE' S Name (S ExternalID)? S?
+ * ('[' (markupdecl | PEReference | S)* ']' S?)? '&gt;'
+ * </pre>
+ * <p> (The <code>&lt;!DOCTYPE</code> has already been read.)
+ */
+ private void parseDoctypedecl ()
+ throws Exception
+ {
+ String rootName, ids[];
+
+ // Read the document type name.
+ requireWhitespace ();
+ rootName = readNmtoken (true);
+
+ // Read the External subset's IDs
+ skipWhitespace ();
+ ids = readExternalIds (false, true);
+
+ // report (a) declaration of name, (b) lexical info (ids)
+ handler.doctypeDecl (rootName, ids [0], ids [1]);
+
+ // Internal subset is parsed first, if present
+ skipWhitespace ();
+ if (tryRead ('[')) {
+
+ // loop until the subset ends
+ while (true) {
+ doReport = expandPE = true;
+ skipWhitespace ();
+ doReport = expandPE = false;
+ if (tryRead (']')) {
+ break; // end of subset
+ } else {
+ // WFC, PEs in internal subset (only between decls)
+ peIsError = expandPE = true;
+ parseMarkupdecl ();
+ peIsError = expandPE = false;
+ }
+ }
+ }
+ skipWhitespace ();
+ require ('>');
+
+ // Read the external subset, if any
+ InputSource subset;
+
+ if (ids [1] == null)
+ subset = handler.getExternalSubset (rootName,
+ handler.getSystemId ());
+ else
+ subset = null;
+ if (ids [1] != null || subset != null) {
+ pushString (null, ">");
+
+ // NOTE: [dtd] is so we say what SAX2 expects,
+ // though it's misleading (subset, not entire dtd)
+ if (ids [1] != null)
+ pushURL (true, "[dtd]", ids, null, null, null, true);
+ else {
+ handler.warn ("modifying document by adding external subset");
+ pushURL (true, "[dtd]",
+ new String [] { subset.getPublicId (),
+ subset.getSystemId (), null },
+ subset.getCharacterStream (),
+ subset.getByteStream (),
+ subset.getEncoding (),
+ false);
+ }
+
+ // Loop until we end up back at '>'
+ while (true) {
+ doReport = expandPE = true;
+ skipWhitespace ();
+ doReport = expandPE = false;
+ if (tryRead ('>')) {
+ break;
+ } else {
+ expandPE = true;
+ parseMarkupdecl ();
+ expandPE = false;
+ }
+ }
+
+ // the ">" string isn't popped yet
+ if (inputStack.size () != 1)
+ error ("external subset has unmatched '>'");
+ }
+
+ // done dtd
+ handler.endDoctype ();
+ expandPE = false;
+ doReport = true;
+ }
+
+
+ /**
+ * Parse a markup declaration in the internal or external DTD subset.
+ * <pre>
+ * [29] markupdecl ::= elementdecl | Attlistdecl | EntityDecl
+ * | NotationDecl | PI | Comment
+ * [30] extSubsetDecl ::= (markupdecl | conditionalSect
+ * | PEReference | S) *
+ * </pre>
+ * <p> Reading toplevel PE references is handled as a lexical issue
+ * by the caller, as is whitespace.
+ */
+ private void parseMarkupdecl ()
+ throws Exception
+ {
+ char saved [] = null;
+ boolean savedPE = expandPE;
+
+ // prevent "<%foo;" and ensures saved entity is right
+ require ('<');
+ unread ('<');
+ expandPE = false;
+
+ if (tryRead ("<!ELEMENT")) {
+ saved = readBuffer;
+ expandPE = savedPE;
+ parseElementDecl ();
+ } else if (tryRead ("<!ATTLIST")) {
+ saved = readBuffer;
+ expandPE = savedPE;
+ parseAttlistDecl ();
+ } else if (tryRead ("<!ENTITY")) {
+ saved = readBuffer;
+ expandPE = savedPE;
+ parseEntityDecl ();
+ } else if (tryRead ("<!NOTATION")) {
+ saved = readBuffer;
+ expandPE = savedPE;
+ parseNotationDecl ();
+ } else if (tryRead (startDelimPI)) {
+ saved = readBuffer;
+ expandPE = savedPE;
+ parsePI ();
+ } else if (tryRead (startDelimComment)) {
+ saved = readBuffer;
+ expandPE = savedPE;
+ parseComment ();
+ } else if (tryRead ("<![")) {
+ saved = readBuffer;
+ expandPE = savedPE;
+ if (inputStack.size () > 0)
+ parseConditionalSect (saved);
+ else
+ error ("conditional sections illegal in internal subset");
+ } else {
+ error ("expected markup declaration");
+ }
+
+ // VC: Proper Decl/PE Nesting
+ if (readBuffer != saved)
+ handler.verror ("Illegal Declaration/PE nesting");
+ }
+
+
+ /**
+ * Parse an element, with its tags.
+ * <pre>
+ * [39] element ::= EmptyElementTag | STag content ETag
+ * [40] STag ::= '&lt;' Name (S Attribute)* S? '&gt;'
+ * [44] EmptyElementTag ::= '&lt;' Name (S Attribute)* S? '/&gt;'
+ * </pre>
+ * <p> (The '&lt;' has already been read.)
+ * <p>NOTE: this method actually chains onto parseContent (), if necessary,
+ * and parseContent () will take care of calling parseETag ().
+ */
+ private void parseElement (boolean maybeGetSubset)
+ throws Exception
+ {
+ String gi;
+ char c;
+ int oldElementContent = currentElementContent;
+ String oldElement = currentElement;
+ Object element [];
+
+ // This is the (global) counter for the
+ // array of specified attributes.
+ tagAttributePos = 0;
+
+ // Read the element type name.
+ gi = readNmtoken (true);
+
+ // If we saw no DTD, and this is the document root element,
+ // let the application modify the input stream by providing one.
+ if (maybeGetSubset) {
+ InputSource subset = handler.getExternalSubset (gi,
+ handler.getSystemId ());
+ if (subset != null) {
+ String publicId = subset.getPublicId ();
+ String systemId = subset.getSystemId ();
+
+ handler.warn ("modifying document by adding DTD");
+ handler.doctypeDecl (gi, publicId, systemId);
+ pushString (null, ">");
+
+ // NOTE: [dtd] is so we say what SAX2 expects,
+ // though it's misleading (subset, not entire dtd)
+ pushURL (true, "[dtd]",
+ new String [] { publicId, systemId, null },
+ subset.getCharacterStream (),
+ subset.getByteStream (),
+ subset.getEncoding (),
+ false);
+
+ // Loop until we end up back at '>'
+ while (true) {
+ doReport = expandPE = true;
+ skipWhitespace ();
+ doReport = expandPE = false;
+ if (tryRead ('>')) {
+ break;
+ } else {
+ expandPE = true;
+ parseMarkupdecl ();
+ expandPE = false;
+ }
+ }
+
+ // the ">" string isn't popped yet
+ if (inputStack.size () != 1)
+ error ("external subset has unmatched '>'");
+
+ handler.endDoctype ();
+ }
+ }
+
+ // Determine the current content type.
+ currentElement = gi;
+ element = (Object []) elementInfo.get (gi);
+ currentElementContent = getContentType (element, CONTENT_ANY);
+
+ // Read the attributes, if any.
+ // After this loop, "c" is the closing delimiter.
+ boolean white = tryWhitespace ();
+ c = readCh ();
+ while (c != '/' && c != '>') {
+ unread (c);
+ if (!white)
+ error ("need whitespace between attributes");
+ parseAttribute (gi);
+ white = tryWhitespace ();
+ c = readCh ();
+ }
+
+ // Supply any defaulted attributes.
+ Enumeration atts = declaredAttributes (element);
+ if (atts != null) {
+ String aname;
+loop:
+ while (atts.hasMoreElements ()) {
+ aname = (String) atts.nextElement ();
+ // See if it was specified.
+ for (int i = 0; i < tagAttributePos; i++) {
+ if (tagAttributes [i] == aname) {
+ continue loop;
+ }
+ }
+ // ... or has a default
+ String value = getAttributeDefaultValue (gi, aname);
+
+ if (value == null)
+ continue;
+ handler.attribute (aname, value, false);
+ }
+ }
+
+ // Figure out if this is a start tag
+ // or an empty element, and dispatch an
+ // event accordingly.
+ switch (c) {
+ case '>':
+ handler.startElement (gi);
+ parseContent ();
+ break;
+ case '/':
+ require ('>');
+ handler.startElement (gi);
+ handler.endElement (gi);
+ break;
+ }
+
+ // Restore the previous state.
+ currentElement = oldElement;
+ currentElementContent = oldElementContent;
+ }
+
+
+ /**
+ * Parse an attribute assignment.
+ * <pre>
+ * [41] Attribute ::= Name Eq AttValue
+ * </pre>
+ * @param name The name of the attribute's element.
+ * @see SAXDriver#attribute
+ */
+ private void parseAttribute (String name)
+ throws Exception
+ {
+ String aname;
+ String type;
+ String value;
+ int flags = LIT_ATTRIBUTE | LIT_ENTITY_REF;
+
+ // Read the attribute name.
+ aname = readNmtoken (true);
+ type = getAttributeType (name, aname);
+
+ // Parse '='
+ parseEq ();
+
+ // Read the value, normalizing whitespace
+ // unless it is CDATA.
+ if (type == "CDATA" || type == null) {
+ value = readLiteral (flags);
+ } else {
+ value = readLiteral (flags | LIT_NORMALIZE);
+ }
+
+ // WFC: no duplicate attributes
+ for (int i = 0; i < tagAttributePos; i++)
+ if (aname.equals (tagAttributes [i]))
+ error ("duplicate attribute", aname, null);
+
+ // Inform the handler about the
+ // attribute.
+ handler.attribute (aname, value, true);
+ dataBufferPos = 0;
+
+ // Note that the attribute has been
+ // specified.
+ if (tagAttributePos == tagAttributes.length) {
+ String newAttrib[] = new String [tagAttributes.length * 2];
+ System.arraycopy (tagAttributes, 0, newAttrib, 0, tagAttributePos);
+ tagAttributes = newAttrib;
+ }
+ tagAttributes [tagAttributePos++] = aname;
+ }
+
+
+ /**
+ * Parse an equals sign surrounded by optional whitespace.
+ * <pre>
+ * [25] Eq ::= S? '=' S?
+ * </pre>
+ */
+ private void parseEq ()
+ throws SAXException, IOException
+ {
+ skipWhitespace ();
+ require ('=');
+ skipWhitespace ();
+ }
+
+
+ /**
+ * Parse an end tag.
+ * <pre>
+ * [42] ETag ::= '</' Name S? '>'
+ * </pre>
+ * <p>NOTE: parseContent () chains to here, we already read the
+ * "&lt;/".
+ */
+ private void parseETag ()
+ throws Exception
+ {
+ require (currentElement);
+ skipWhitespace ();
+ require ('>');
+ handler.endElement (currentElement);
+ // not re-reporting any SAXException re bogus end tags,
+ // even though that diagnostic might be clearer ...
+ }
+
+
+ /**
+ * Parse the content of an element.
+ * <pre>
+ * [43] content ::= (element | CharData | Reference
+ * | CDSect | PI | Comment)*
+ * [67] Reference ::= EntityRef | CharRef
+ * </pre>
+ * <p> NOTE: consumes ETtag.
+ */
+ private void parseContent ()
+ throws Exception
+ {
+ char c;
+
+ while (true) {
+ // consume characters (or ignorable whitspace) until delimiter
+ parseCharData ();
+
+ // Handle delimiters
+ c = readCh ();
+ switch (c) {
+
+ case '&': // Found "&"
+ c = readCh ();
+ if (c == '#') {
+ parseCharRef ();
+ } else {
+ unread (c);
+ parseEntityRef (true);
+ }
+ break;
+
+ case '<': // Found "<"
+ dataBufferFlush ();
+ c = readCh ();
+ switch (c) {
+ case '!': // Found "<!"
+ c = readCh ();
+ switch (c) {
+ case '-': // Found "<!-"
+ require ('-');
+ parseComment ();
+ break;
+ case '[': // Found "<!["
+ require ("CDATA[");
+ handler.startCDATA ();
+ inCDATA = true;
+ parseCDSect ();
+ inCDATA = false;
+ handler.endCDATA ();
+ break;
+ default:
+ error ("expected comment or CDATA section", c, null);
+ break;
+ }
+ break;
+
+ case '?': // Found "<?"
+ parsePI ();
+ break;
+
+ case '/': // Found "</"
+ parseETag ();
+ return;
+
+ default: // Found "<" followed by something else
+ unread (c);
+ parseElement (false);
+ break;
+ }
+ }
+ }
+ }
+
+
+ /**
+ * Parse an element type declaration.
+ * <pre>
+ * [45] elementdecl ::= '&lt;!ELEMENT' S Name S contentspec S? '&gt;'
+ * </pre>
+ * <p> NOTE: the '&lt;!ELEMENT' has already been read.
+ */
+ private void parseElementDecl ()
+ throws Exception
+ {
+ String name;
+
+ requireWhitespace ();
+ // Read the element type name.
+ name = readNmtoken (true);
+
+ requireWhitespace ();
+ // Read the content model.
+ parseContentspec (name);
+
+ skipWhitespace ();
+ require ('>');
+ }
+
+
+ /**
+ * Content specification.
+ * <pre>
+ * [46] contentspec ::= 'EMPTY' | 'ANY' | Mixed | elements
+ * </pre>
+ */
+ private void parseContentspec (String name)
+ throws Exception
+ {
+// FIXME: move elementDecl() into setElement(), pass EMTPY/ANY ...
+ if (tryRead ("EMPTY")) {
+ setElement (name, CONTENT_EMPTY, null, null);
+ if (!skippedPE)
+ handler.getDeclHandler ().elementDecl (name, "EMPTY");
+ return;
+ } else if (tryRead ("ANY")) {
+ setElement (name, CONTENT_ANY, null, null);
+ if (!skippedPE)
+ handler.getDeclHandler ().elementDecl (name, "ANY");
+ return;
+ } else {
+ String model;
+ char saved [];
+
+ require ('(');
+ saved = readBuffer;
+ dataBufferAppend ('(');
+ skipWhitespace ();
+ if (tryRead ("#PCDATA")) {
+ dataBufferAppend ("#PCDATA");
+ parseMixed (saved);
+ model = dataBufferToString ();
+ setElement (name, CONTENT_MIXED, model, null);
+ } else {
+ parseElements (saved);
+ model = dataBufferToString ();
+ setElement (name, CONTENT_ELEMENTS, model, null);
+ }
+ if (!skippedPE)
+ handler.getDeclHandler ().elementDecl (name, model);
+ }
+ }
+
+ /**
+ * Parse an element-content model.
+ * <pre>
+ * [47] elements ::= (choice | seq) ('?' | '*' | '+')?
+ * [49] choice ::= '(' S? cp (S? '|' S? cp)+ S? ')'
+ * [50] seq ::= '(' S? cp (S? ',' S? cp)* S? ')'
+ * </pre>
+ *
+ * <p> NOTE: the opening '(' and S have already been read.
+ *
+ * @param saved Buffer for entity that should have the terminal ')'
+ */
+ private void parseElements (char saved [])
+ throws Exception
+ {
+ char c;
+ char sep;
+
+ // Parse the first content particle
+ skipWhitespace ();
+ parseCp ();
+
+ // Check for end or for a separator.
+ skipWhitespace ();
+ c = readCh ();
+ switch (c) {
+ case ')':
+ // VC: Proper Group/PE Nesting
+ if (readBuffer != saved)
+ handler.verror ("Illegal Group/PE nesting");
+
+ dataBufferAppend (')');
+ c = readCh ();
+ switch (c) {
+ case '*':
+ case '+':
+ case '?':
+ dataBufferAppend (c);
+ break;
+ default:
+ unread (c);
+ }
+ return;
+ case ',': // Register the separator.
+ case '|':
+ sep = c;
+ dataBufferAppend (c);
+ break;
+ default:
+ error ("bad separator in content model", c, null);
+ return;
+ }
+
+ // Parse the rest of the content model.
+ while (true) {
+ skipWhitespace ();
+ parseCp ();
+ skipWhitespace ();
+ c = readCh ();
+ if (c == ')') {
+ // VC: Proper Group/PE Nesting
+ if (readBuffer != saved)
+ handler.verror ("Illegal Group/PE nesting");
+
+ dataBufferAppend (')');
+ break;
+ } else if (c != sep) {
+ error ("bad separator in content model", c, null);
+ return;
+ } else {
+ dataBufferAppend (c);
+ }
+ }
+
+ // Check for the occurrence indicator.
+ c = readCh ();
+ switch (c) {
+ case '?':
+ case '*':
+ case '+':
+ dataBufferAppend (c);
+ return;
+ default:
+ unread (c);
+ return;
+ }
+ }
+
+
+ /**
+ * Parse a content particle.
+ * <pre>
+ * [48] cp ::= (Name | choice | seq) ('?' | '*' | '+')?
+ * </pre>
+ */
+ private void parseCp ()
+ throws Exception
+ {
+ if (tryRead ('(')) {
+ dataBufferAppend ('(');
+ parseElements (readBuffer);
+ } else {
+ dataBufferAppend (readNmtoken (true));
+ char c = readCh ();
+ switch (c) {
+ case '?':
+ case '*':
+ case '+':
+ dataBufferAppend (c);
+ break;
+ default:
+ unread (c);
+ break;
+ }
+ }
+ }
+
+
+ /**
+ * Parse mixed content.
+ * <pre>
+ * [51] Mixed ::= '(' S? ( '#PCDATA' (S? '|' S? Name)*) S? ')*'
+ * | '(' S? ('#PCDATA') S? ')'
+ * </pre>
+ *
+ * @param saved Buffer for entity that should have the terminal ')'
+ */
+ private void parseMixed (char saved [])
+ throws Exception
+ {
+ // Check for PCDATA alone.
+ skipWhitespace ();
+ if (tryRead (')')) {
+ // VC: Proper Group/PE Nesting
+ if (readBuffer != saved)
+ handler.verror ("Illegal Group/PE nesting");
+
+ dataBufferAppend (")*");
+ tryRead ('*');
+ return;
+ }
+
+ // Parse mixed content.
+ skipWhitespace ();
+ while (!tryRead (")")) {
+ require ('|');
+ dataBufferAppend ('|');
+ skipWhitespace ();
+ dataBufferAppend (readNmtoken (true));
+ skipWhitespace ();
+ }
+
+ // VC: Proper Group/PE Nesting
+ if (readBuffer != saved)
+ handler.verror ("Illegal Group/PE nesting");
+
+ require ('*');
+ dataBufferAppend (")*");
+ }
+
+
+ /**
+ * Parse an attribute list declaration.
+ * <pre>
+ * [52] AttlistDecl ::= '&lt;!ATTLIST' S Name AttDef* S? '&gt;'
+ * </pre>
+ * <p>NOTE: the '&lt;!ATTLIST' has already been read.
+ */
+ private void parseAttlistDecl ()
+ throws Exception
+ {
+ String elementName;
+
+ requireWhitespace ();
+ elementName = readNmtoken (true);
+ boolean white = tryWhitespace ();
+ while (!tryRead ('>')) {
+ if (!white)
+ error ("whitespace required before attribute definition");
+ parseAttDef (elementName);
+ white = tryWhitespace ();
+ }
+ }
+
+
+ /**
+ * Parse a single attribute definition.
+ * <pre>
+ * [53] AttDef ::= S Name S AttType S DefaultDecl
+ * </pre>
+ */
+ private void parseAttDef (String elementName)
+ throws Exception
+ {
+ String name;
+ String type;
+ String enum = null;
+
+ // Read the attribute name.
+ name = readNmtoken (true);
+
+ // Read the attribute type.
+ requireWhitespace ();
+ type = readAttType ();
+
+ // Get the string of enumerated values if necessary.
+ if ("ENUMERATION" == type || "NOTATION" == type)
+ enum = dataBufferToString ();
+
+ // Read the default value.
+ requireWhitespace ();
+ parseDefault (elementName, name, type, enum);
+ }
+
+
+ /**
+ * Parse the attribute type.
+ * <pre>
+ * [54] AttType ::= StringType | TokenizedType | EnumeratedType
+ * [55] StringType ::= 'CDATA'
+ * [56] TokenizedType ::= 'ID' | 'IDREF' | 'IDREFS' | 'ENTITY'
+ * | 'ENTITIES' | 'NMTOKEN' | 'NMTOKENS'
+ * [57] EnumeratedType ::= NotationType | Enumeration
+ * </pre>
+ */
+ private String readAttType ()
+ throws Exception
+ {
+ if (tryRead ('(')) {
+ parseEnumeration (false);
+ return "ENUMERATION";
+ } else {
+ String typeString = readNmtoken (true);
+ if ("NOTATION" == typeString) {
+ parseNotationType ();
+ return typeString;
+ } else if ("CDATA" == typeString
+ || "ID" == typeString
+ || "IDREF" == typeString
+ || "IDREFS" == typeString
+ || "ENTITY" == typeString
+ || "ENTITIES" == typeString
+ || "NMTOKEN" == typeString
+ || "NMTOKENS" == typeString)
+ return typeString;
+ error ("illegal attribute type", typeString, null);
+ return null;
+ }
+ }
+
+
+ /**
+ * Parse an enumeration.
+ * <pre>
+ * [59] Enumeration ::= '(' S? Nmtoken (S? '|' S? Nmtoken)* S? ')'
+ * </pre>
+ * <p>NOTE: the '(' has already been read.
+ */
+ private void parseEnumeration (boolean isNames)
+ throws Exception
+ {
+ dataBufferAppend ('(');
+
+ // Read the first token.
+ skipWhitespace ();
+ dataBufferAppend (readNmtoken (isNames));
+ // Read the remaining tokens.
+ skipWhitespace ();
+ while (!tryRead (')')) {
+ require ('|');
+ dataBufferAppend ('|');
+ skipWhitespace ();
+ dataBufferAppend (readNmtoken (isNames));
+ skipWhitespace ();
+ }
+ dataBufferAppend (')');
+ }
+
+
+ /**
+ * Parse a notation type for an attribute.
+ * <pre>
+ * [58] NotationType ::= 'NOTATION' S '(' S? NameNtoks
+ * (S? '|' S? name)* S? ')'
+ * </pre>
+ * <p>NOTE: the 'NOTATION' has already been read
+ */
+ private void parseNotationType ()
+ throws Exception
+ {
+ requireWhitespace ();
+ require ('(');
+
+ parseEnumeration (true);
+ }
+
+
+ /**
+ * Parse the default value for an attribute.
+ * <pre>
+ * [60] DefaultDecl ::= '#REQUIRED' | '#IMPLIED'
+ * | (('#FIXED' S)? AttValue)
+ * </pre>
+ */
+ private void parseDefault (
+ String elementName,
+ String name,
+ String type,
+ String enum
+ ) throws Exception
+ {
+ int valueType = ATTRIBUTE_DEFAULT_SPECIFIED;
+ String value = null;
+ int flags = LIT_ATTRIBUTE;
+ boolean saved = expandPE;
+ String defaultType = null;
+
+ // LIT_ATTRIBUTE forces '<' checks now (ASAP) and turns whitespace
+ // chars to spaces (doesn't matter when that's done if it doesn't
+ // interfere with char refs expanding to whitespace).
+
+ if (!skippedPE) {
+ flags |= LIT_ENTITY_REF;
+ if ("CDATA" != type)
+ flags |= LIT_NORMALIZE;
+ }
+
+ expandPE = false;
+ if (tryRead ('#')) {
+ if (tryRead ("FIXED")) {
+ defaultType = "#FIXED";
+ valueType = ATTRIBUTE_DEFAULT_FIXED;
+ requireWhitespace ();
+ value = readLiteral (flags);
+ } else if (tryRead ("REQUIRED")) {
+ defaultType = "#REQUIRED";
+ valueType = ATTRIBUTE_DEFAULT_REQUIRED;
+ } else if (tryRead ("IMPLIED")) {
+ defaultType = "#IMPLIED";
+ valueType = ATTRIBUTE_DEFAULT_IMPLIED;
+ } else {
+ error ("illegal keyword for attribute default value");
+ }
+ } else
+ value = readLiteral (flags);
+ expandPE = saved;
+ setAttribute (elementName, name, type, enum, value, valueType);
+ if ("ENUMERATION" == type)
+ type = enum;
+ else if ("NOTATION" == type)
+ type = "NOTATION " + enum;
+ if (!skippedPE) handler.getDeclHandler ()
+ .attributeDecl (elementName, name, type, defaultType, value);
+ }
+
+
+ /**
+ * Parse a conditional section.
+ * <pre>
+ * [61] conditionalSect ::= includeSect || ignoreSect
+ * [62] includeSect ::= '&lt;![' S? 'INCLUDE' S? '['
+ * extSubsetDecl ']]&gt;'
+ * [63] ignoreSect ::= '&lt;![' S? 'IGNORE' S? '['
+ * ignoreSectContents* ']]&gt;'
+ * [64] ignoreSectContents ::= Ignore
+ * ('&lt;![' ignoreSectContents* ']]&gt;' Ignore )*
+ * [65] Ignore ::= Char* - (Char* ( '&lt;![' | ']]&gt;') Char* )
+ * </pre>
+ * <p> NOTE: the '&gt;![' has already been read.
+ */
+ private void parseConditionalSect (char saved [])
+ throws Exception
+ {
+ skipWhitespace ();
+ if (tryRead ("INCLUDE")) {
+ skipWhitespace ();
+ require ('[');
+ // VC: Proper Conditional Section/PE Nesting
+ if (readBuffer != saved)
+ handler.verror ("Illegal Conditional Section/PE nesting");
+ skipWhitespace ();
+ while (!tryRead ("]]>")) {
+ parseMarkupdecl ();
+ skipWhitespace ();
+ }
+ } else if (tryRead ("IGNORE")) {
+ skipWhitespace ();
+ require ('[');
+ // VC: Proper Conditional Section/PE Nesting
+ if (readBuffer != saved)
+ handler.verror ("Illegal Conditional Section/PE nesting");
+ int nesting = 1;
+ char c;
+ expandPE = false;
+ for (int nest = 1; nest > 0;) {
+ c = readCh ();
+ switch (c) {
+ case '<':
+ if (tryRead ("![")) {
+ nest++;
+ }
+ case ']':
+ if (tryRead ("]>")) {
+ nest--;
+ }
+ }
+ }
+ expandPE = true;
+ } else {
+ error ("conditional section must begin with INCLUDE or IGNORE");
+ }
+ }
+
+
+ /**
+ * Read and interpret a character reference.
+ * <pre>
+ * [66] CharRef ::= '&#' [0-9]+ ';' | '&#x' [0-9a-fA-F]+ ';'
+ * </pre>
+ * <p>NOTE: the '&#' has already been read.
+ */
+ private void parseCharRef ()
+ throws SAXException, IOException
+ {
+ int value = 0;
+ char c;
+
+ if (tryRead ('x')) {
+loop1:
+ while (true) {
+ c = readCh ();
+ int n;
+ switch (c) {
+ case '0': case '1': case '2': case '3': case '4':
+ case '5': case '6': case '7': case '8': case '9':
+ n = c - '0';
+ break;
+ case 'a': case 'b': case 'c': case 'd': case 'e': case 'f':
+ n = (c - 'a') + 10;
+ break;
+ case 'A': case 'B': case 'C': case 'D': case 'E': case 'F':
+ n = (c - 'A') + 10;
+ break;
+ case ';':
+ break loop1;
+ default:
+ error ("illegal character in character reference", c, null);
+ break loop1;
+ }
+ value *= 16;
+ value += n;
+ }
+ } else {
+loop2:
+ while (true) {
+ c = readCh ();
+ switch (c) {
+ case '0': case '1': case '2': case '3': case '4':
+ case '5': case '6': case '7': case '8': case '9':
+ value *= 10;
+ value += c - '0';
+ break;
+ case ';':
+ break loop2;
+ default:
+ error ("illegal character in character reference", c, null);
+ break loop2;
+ }
+ }
+ }
+
+ // check for character refs being legal XML
+ if ((value < 0x0020
+ && ! (value == '\n' || value == '\t' || value == '\r'))
+ || (value >= 0xD800 && value <= 0xDFFF)
+ || value == 0xFFFE || value == 0xFFFF
+ || value > 0x0010ffff)
+ error ("illegal XML character reference U+"
+ + Integer.toHexString (value));
+
+ // Check for surrogates: 00000000 0000xxxx yyyyyyyy zzzzzzzz
+ // (1101|10xx|xxyy|yyyy + 1101|11yy|zzzz|zzzz:
+ if (value <= 0x0000ffff) {
+ // no surrogates needed
+ dataBufferAppend ((char) value);
+ } else if (value <= 0x0010ffff) {
+ value -= 0x10000;
+ // > 16 bits, surrogate needed
+ dataBufferAppend ((char) (0xd800 | (value >> 10)));
+ dataBufferAppend ((char) (0xdc00 | (value & 0x0003ff)));
+ } else {
+ // too big for surrogate
+ error ("character reference " + value + " is too large for UTF-16",
+ new Integer (value).toString (), null);
+ }
+ dataBufferFlush ();
+ }
+
+
+ /**
+ * Parse and expand an entity reference.
+ * <pre>
+ * [68] EntityRef ::= '&' Name ';'
+ * </pre>
+ * <p>NOTE: the '&amp;' has already been read.
+ * @param externalAllowed External entities are allowed here.
+ */
+ private void parseEntityRef (boolean externalAllowed)
+ throws SAXException, IOException
+ {
+ String name;
+
+ name = readNmtoken (true);
+ require (';');
+ switch (getEntityType (name)) {
+ case ENTITY_UNDECLARED:
+ // NOTE: XML REC describes amazingly convoluted handling for
+ // this case. Nothing as meaningful as being a WFness error
+ // unless the processor might _legitimately_ not have seen a
+ // declaration ... which is what this implements.
+ String message;
+
+ message = "reference to undeclared general entity " + name;
+ if (skippedPE && !docIsStandalone) {
+ handler.verror (message);
+ // we don't know this entity, and it might be external...
+ if (externalAllowed)
+ handler.skippedEntity (name);
+ } else
+ error (message);
+ break;
+ case ENTITY_INTERNAL:
+ pushString (name, getEntityValue (name));
+ break;
+ case ENTITY_TEXT:
+ if (externalAllowed) {
+ pushURL (false, name, getEntityIds (name),
+ null, null, null, true);
+ } else {
+ error ("reference to external entity in attribute value.",
+ name, null);
+ }
+ break;
+ case ENTITY_NDATA:
+ if (externalAllowed) {
+ error ("unparsed entity reference in content", name, null);
+ } else {
+ error ("reference to external entity in attribute value.",
+ name, null);
+ }
+ break;
+ default:
+ throw new RuntimeException ();
+ }
+ }
+
+
+ /**
+ * Parse and expand a parameter entity reference.
+ * <pre>
+ * [69] PEReference ::= '%' Name ';'
+ * </pre>
+ * <p>NOTE: the '%' has already been read.
+ */
+ private void parsePEReference ()
+ throws SAXException, IOException
+ {
+ String name;
+
+ name = "%" + readNmtoken (true);
+ require (';');
+ switch (getEntityType (name)) {
+ case ENTITY_UNDECLARED:
+ // VC: Entity Declared
+ handler.verror ("reference to undeclared parameter entity " + name);
+
+ // we should disable handling of all subsequent declarations
+ // unless this is a standalone document (info discarded)
+ break;
+ case ENTITY_INTERNAL:
+ if (inLiteral)
+ pushString (name, getEntityValue (name));
+ else
+ pushString (name, ' ' + getEntityValue (name) + ' ');
+ break;
+ case ENTITY_TEXT:
+ if (!inLiteral)
+ pushString (null, " ");
+ pushURL (true, name, getEntityIds (name), null, null, null, true);
+ if (!inLiteral)
+ pushString (null, " ");
+ break;
+ }
+ }
+
+ /**
+ * Parse an entity declaration.
+ * <pre>
+ * [70] EntityDecl ::= GEDecl | PEDecl
+ * [71] GEDecl ::= '&lt;!ENTITY' S Name S EntityDef S? '&gt;'
+ * [72] PEDecl ::= '&lt;!ENTITY' S '%' S Name S PEDef S? '&gt;'
+ * [73] EntityDef ::= EntityValue | (ExternalID NDataDecl?)
+ * [74] PEDef ::= EntityValue | ExternalID
+ * [75] ExternalID ::= 'SYSTEM' S SystemLiteral
+ * | 'PUBLIC' S PubidLiteral S SystemLiteral
+ * [76] NDataDecl ::= S 'NDATA' S Name
+ * </pre>
+ * <p>NOTE: the '&lt;!ENTITY' has already been read.
+ */
+ private void parseEntityDecl ()
+ throws Exception
+ {
+ boolean peFlag = false;
+ int flags = LIT_DISABLE_CREF;
+
+ // Check for a parameter entity.
+ expandPE = false;
+ requireWhitespace ();
+ if (tryRead ('%')) {
+ peFlag = true;
+ requireWhitespace ();
+ }
+ expandPE = true;
+
+ // Read the entity name, and prepend
+ // '%' if necessary.
+ String name = readNmtoken (true);
+ if (peFlag) {
+ name = "%" + name;
+ }
+
+ // Read the entity value.
+ requireWhitespace ();
+ char c = readCh ();
+ unread (c);
+ if (c == '"' || c == '\'') {
+ // Internal entity ... replacement text has expanded refs
+ // to characters and PEs, but not to general entities
+ String value = readLiteral (flags);
+ setInternalEntity (name, value);
+ } else {
+ // Read the external IDs
+ String ids [] = readExternalIds (false, false);
+
+ // Check for NDATA declaration.
+ boolean white = tryWhitespace ();
+ if (!peFlag && tryRead ("NDATA")) {
+ if (!white)
+ error ("whitespace required before NDATA");
+ requireWhitespace ();
+ String notationName = readNmtoken (true);
+ if (!skippedPE) {
+ setExternalEntity (name, ENTITY_NDATA, ids, notationName);
+ handler.unparsedEntityDecl (name, ids, notationName);
+ }
+ } else if (!skippedPE) {
+ setExternalEntity (name, ENTITY_TEXT, ids, null);
+ handler.getDeclHandler ()
+ .externalEntityDecl (name, ids [0],
+ handler.resolveURIs ()
+ // FIXME: ASSUMES not skipped
+ // "false" forces error on bad URI
+ ? handler.absolutize (ids [2], ids [1], false)
+ : ids [1]);
+ }
+ }
+
+ // Finish the declaration.
+ skipWhitespace ();
+ require ('>');
+ }
+
+
+ /**
+ * Parse a notation declaration.
+ * <pre>
+ * [82] NotationDecl ::= '&lt;!NOTATION' S Name S
+ * (ExternalID | PublicID) S? '&gt;'
+ * [83] PublicID ::= 'PUBLIC' S PubidLiteral
+ * </pre>
+ * <P>NOTE: the '&lt;!NOTATION' has already been read.
+ */
+ private void parseNotationDecl ()
+ throws Exception
+ {
+ String nname, ids[];
+
+
+ requireWhitespace ();
+ nname = readNmtoken (true);
+
+ requireWhitespace ();
+
+ // Read the external identifiers.
+ ids = readExternalIds (true, false);
+
+ // Register the notation.
+ setNotation (nname, ids);
+
+ skipWhitespace ();
+ require ('>');
+ }
+
+
+ /**
+ * Parse character data.
+ * <pre>
+ * [14] CharData ::= [^&lt;&amp;]* - ([^&lt;&amp;]* ']]&gt;' [^&lt;&amp;]*)
+ * </pre>
+ */
+ private void parseCharData ()
+ throws Exception
+ {
+ char c;
+ int state = 0;
+ boolean pureWhite = false;
+
+ // assert (dataBufferPos == 0);
+
+ // are we expecting pure whitespace? it might be dirty...
+ if (currentElementContent == CONTENT_ELEMENTS);
+ pureWhite = true;
+
+ // always report right out of readBuffer
+ // to minimize (pointless) buffer copies
+ while (true) {
+ int lineAugment = 0;
+ int columnAugment = 0;
+ int i;
+
+loop:
+ for (i = readBufferPos; i < readBufferLength; i++) {
+ switch (c = readBuffer [i]) {
+ case '\n':
+ lineAugment++;
+ columnAugment = 0;
+ // pureWhite unmodified
+ break;
+ case '\r': // should not happen!!
+ case '\t':
+ case ' ':
+ // pureWhite unmodified
+ columnAugment++;
+ break;
+ case '&':
+ case '<':
+ columnAugment++;
+ // pureWhite unmodified
+ // CLEAN end of text sequence
+ state = 1;
+ break loop;
+ case ']':
+ // that's not a whitespace char, and
+ // can not terminate pure whitespace either
+ pureWhite = false;
+ if ((i + 2) < readBufferLength) {
+ if (readBuffer [i + 1] == ']'
+ && readBuffer [i + 2] == '>') {
+ // ERROR end of text sequence
+ state = 2;
+ break loop;
+ }
+ } else {
+ // FIXME missing two end-of-buffer cases
+ }
+ columnAugment++;
+ break;
+ default:
+ if (c < 0x0020 || c > 0xFFFD)
+ error ("illegal XML character U+"
+ + Integer.toHexString (c));
+ // that's not a whitespace char
+ pureWhite = false;
+ columnAugment++;
+ }
+ }
+
+ // report text thus far
+ if (lineAugment > 0) {
+ line += lineAugment;
+ column = columnAugment;
+ } else {
+ column += columnAugment;
+ }
+
+ // report characters/whitspace
+ int length = i - readBufferPos;
+
+ if (length != 0) {
+ if (pureWhite)
+ handler.ignorableWhitespace (readBuffer,
+ readBufferPos, length);
+ else
+ handler.charData (readBuffer, readBufferPos, length);
+ readBufferPos = i;
+ }
+
+ if (state != 0)
+ break;
+
+ // fill next buffer from this entity, or
+ // pop stack and continue with previous entity
+ unread (readCh ());
+ }
+
+ // finish, maybe with error
+ if (state != 1) // finish, no error
+ error ("character data may not contain ']]>'");
+ }
+
+
+ //////////////////////////////////////////////////////////////////////
+ // High-level reading and scanning methods.
+ //////////////////////////////////////////////////////////////////////
+
+ /**
+ * Require whitespace characters.
+ */
+ private void requireWhitespace ()
+ throws SAXException, IOException
+ {
+ char c = readCh ();
+ if (isWhitespace (c)) {
+ skipWhitespace ();
+ } else {
+ error ("whitespace required", c, null);
+ }
+ }
+
+
+ /**
+ * Skip whitespace characters.
+ * <pre>
+ * [3] S ::= (#x20 | #x9 | #xd | #xa)+
+ * </pre>
+ */
+ private void skipWhitespace ()
+ throws SAXException, IOException
+ {
+ // Start with a little cheat. Most of
+ // the time, the white space will fall
+ // within the current read buffer; if
+ // not, then fall through.
+ if (USE_CHEATS) {
+ int lineAugment = 0;
+ int columnAugment = 0;
+
+loop:
+ for (int i = readBufferPos; i < readBufferLength; i++) {
+ switch (readBuffer [i]) {
+ case ' ':
+ case '\t':
+ case '\r':
+ columnAugment++;
+ break;
+ case '\n':
+ lineAugment++;
+ columnAugment = 0;
+ break;
+ case '%':
+ if (expandPE)
+ break loop;
+ // else fall through...
+ default:
+ readBufferPos = i;
+ if (lineAugment > 0) {
+ line += lineAugment;
+ column = columnAugment;
+ } else {
+ column += columnAugment;
+ }
+ return;
+ }
+ }
+ }
+
+ // OK, do it the slow way.
+ char c = readCh ();
+ while (isWhitespace (c)) {
+ c = readCh ();
+ }
+ unread (c);
+ }
+
+
+ /**
+ * Read a name or (when parsing an enumeration) name token.
+ * <pre>
+ * [5] Name ::= (Letter | '_' | ':') (NameChar)*
+ * [7] Nmtoken ::= (NameChar)+
+ * </pre>
+ */
+ private String readNmtoken (boolean isName)
+ throws SAXException, IOException
+ {
+ char c;
+
+ if (USE_CHEATS) {
+loop:
+ for (int i = readBufferPos; i < readBufferLength; i++) {
+ c = readBuffer [i];
+ switch (c) {
+ case '%':
+ if (expandPE)
+ break loop;
+ // else fall through...
+
+ // What may legitimately come AFTER a name/nmtoken?
+ case '<': case '>': case '&':
+ case ',': case '|': case '*': case '+': case '?':
+ case ')':
+ case '=':
+ case '\'': case '"':
+ case '[':
+ case ' ': case '\t': case '\r': case '\n':
+ case ';':
+ case '/':
+ int start = readBufferPos;
+ if (i == start)
+ error ("name expected", readBuffer [i], null);
+ readBufferPos = i;
+ return intern (readBuffer, start, i - start);
+
+ default:
+// FIXME ... per IBM's OASIS test submission, these:
+// ? U+06dd
+// REJECT
+// BaseChar U+0132 U+0133 U+013F U+0140 U+0149 U+017F U+01C4 U+01CC
+// U+01F1 U+01F3 U+0E46 U+1011 U+1104 U+1108 U+110A U+110D
+// U+113B U+113F U+1141 U+114D U+114F U+1151 U+1156 U+1162
+// U+1164 U+1166 U+116B U+116F U+1174 U+119F U+11AC U+11B6
+// U+11B9 U+11BB U+11C3 U+11F1 U+212F U+0587
+// Combining U+309B
+
+ // punt on exact tests from Appendix A; approximate
+ // them using the Unicode ID start/part rules
+ if (i == readBufferPos && isName) {
+ if (!Character.isUnicodeIdentifierStart (c)
+ && c != ':' && c != '_')
+ error ("Not a name start character, U+"
+ + Integer.toHexString (c));
+ } else if (!Character.isUnicodeIdentifierPart (c)
+ && c != '-' && c != ':' && c != '_' && c != '.'
+ && !isExtender (c))
+ error ("Not a name character, U+"
+ + Integer.toHexString (c));
+ }
+ }
+ }
+
+ nameBufferPos = 0;
+
+ // Read the first character.
+loop:
+ while (true) {
+ c = readCh ();
+ switch (c) {
+ case '%':
+ case '<': case '>': case '&':
+ case ',': case '|': case '*': case '+': case '?':
+ case ')':
+ case '=':
+ case '\'': case '"':
+ case '[':
+ case ' ': case '\t': case '\n': case '\r':
+ case ';':
+ case '/':
+ unread (c);
+ if (nameBufferPos == 0) {
+ error ("name expected");
+ }
+ // punt on exact tests from Appendix A, but approximate them
+ if (isName
+ && !Character.isUnicodeIdentifierStart (
+ nameBuffer [0])
+ && ":_".indexOf (nameBuffer [0]) == -1)
+ error ("Not a name start character, U+"
+ + Integer.toHexString (nameBuffer [0]));
+ String s = intern (nameBuffer, 0, nameBufferPos);
+ nameBufferPos = 0;
+ return s;
+ default:
+ // punt on exact tests from Appendix A, but approximate them
+
+ if ((nameBufferPos != 0 || !isName)
+ && !Character.isUnicodeIdentifierPart (c)
+ && ":-_.".indexOf (c) == -1
+ && !isExtender (c))
+ error ("Not a name character, U+"
+ + Integer.toHexString (c));
+ if (nameBufferPos >= nameBuffer.length)
+ nameBuffer =
+ (char[]) extendArray (nameBuffer,
+ nameBuffer.length, nameBufferPos);
+ nameBuffer [nameBufferPos++] = c;
+ }
+ }
+ }
+
+ private static boolean isExtender (char c)
+ {
+ // [88] Extender ::= ...
+ return c == 0x00b7 || c == 0x02d0 || c == 0x02d1 || c == 0x0387
+ || c == 0x0640 || c == 0x0e46 || c == 0x0ec6 || c == 0x3005
+ || (c >= 0x3031 && c <= 0x3035)
+ || (c >= 0x309d && c <= 0x309e)
+ || (c >= 0x30fc && c <= 0x30fe);
+ }
+
+
+ /**
+ * Read a literal. With matching single or double quotes as
+ * delimiters (and not embedded!) this is used to parse:
+ * <pre>
+ * [9] EntityValue ::= ... ([^%&amp;] | PEReference | Reference)* ...
+ * [10] AttValue ::= ... ([^<&] | Reference)* ...
+ * [11] SystemLiteral ::= ... (URLchar - "'")* ...
+ * [12] PubidLiteral ::= ... (PubidChar - "'")* ...
+ * </pre>
+ * as well as the quoted strings in XML and text declarations
+ * (for version, encoding, and standalone) which have their
+ * own constraints.
+ */
+ private String readLiteral (int flags)
+ throws SAXException, IOException
+ {
+ char delim, c;
+ int startLine = line;
+ boolean saved = expandPE;
+ boolean savedReport = doReport;
+
+ // Find the first delimiter.
+ delim = readCh ();
+ if (delim != '"' && delim != '\'') {
+ error ("expected '\"' or \"'\"", delim, null);
+ return null;
+ }
+ inLiteral = true;
+ if ((flags & LIT_DISABLE_PE) != 0)
+ expandPE = false;
+ doReport = false;
+
+ // Each level of input source has its own buffer; remember
+ // ours, so we won't read the ending delimiter from any
+ // other input source, regardless of entity processing.
+ char ourBuf [] = readBuffer;
+
+ // Read the literal.
+ try {
+ c = readCh ();
+loop:
+ while (! (c == delim && readBuffer == ourBuf)) {
+ switch (c) {
+ // attributes and public ids are normalized
+ // in almost the same ways
+ case '\n':
+ case '\r':
+ if ((flags & (LIT_ATTRIBUTE | LIT_PUBID)) != 0)
+ c = ' ';
+ break;
+ case '\t':
+ if ((flags & LIT_ATTRIBUTE) != 0)
+ c = ' ';
+ break;
+ case '&':
+ c = readCh ();
+ // Char refs are expanded immediately, except for
+ // all the cases where it's deferred.
+ if (c == '#') {
+ if ((flags & LIT_DISABLE_CREF) != 0) {
+ dataBufferAppend ('&');
+ break;
+ }
+ parseCharRef ();
+
+ // exotic WFness risk: this is an entity literal,
+ // dataBuffer [dataBufferPos - 1] == '&', and
+ // following chars are a _partial_ entity/char ref
+
+ // It looks like an entity ref ...
+ } else {
+ unread (c);
+ // Expand it?
+ if ((flags & LIT_ENTITY_REF) > 0) {
+ parseEntityRef (false);
+
+ // Is it just data?
+ } else if ((flags & LIT_DISABLE_EREF) != 0) {
+ dataBufferAppend ('&');
+
+ // OK, it will be an entity ref -- expanded later.
+ } else {
+ String name = readNmtoken (true);
+ require (';');
+ dataBufferAppend ('&');
+ dataBufferAppend (name);
+ dataBufferAppend (';');
+ }
+ }
+ c = readCh ();
+ continue loop;
+
+ case '<':
+ // and why? Perhaps so "&foo;" expands the same
+ // inside and outside an attribute?
+ if ((flags & LIT_ATTRIBUTE) != 0)
+ error ("attribute values may not contain '<'");
+ break;
+
+ // We don't worry about case '%' and PE refs, readCh does.
+
+ default:
+ break;
+ }
+ dataBufferAppend (c);
+ c = readCh ();
+ }
+ } catch (EOFException e) {
+ error ("end of input while looking for delimiter (started on line "
+ + startLine + ')', null, new Character (delim).toString ());
+ }
+ inLiteral = false;
+ expandPE = saved;
+ doReport = savedReport;
+
+ // Normalise whitespace if necessary.
+ if ((flags & LIT_NORMALIZE) > 0) {
+ dataBufferNormalize ();
+ }
+
+ // Return the value.
+ return dataBufferToString ();
+ }
+
+
+ /**
+ * Try reading external identifiers.
+ * A system identifier is not required for notations.
+ * @param inNotation Are we parsing a notation decl?
+ * @param isSubset Parsing external subset decl (may be omitted)?
+ * @return A three-member String array containing the identifiers,
+ * or nulls. Order: public, system, baseURI.
+ */
+ private String[] readExternalIds (boolean inNotation, boolean isSubset)
+ throws Exception
+ {
+ char c;
+ String ids[] = new String [3];
+ int flags = LIT_DISABLE_CREF | LIT_DISABLE_PE | LIT_DISABLE_EREF;
+
+ if (tryRead ("PUBLIC")) {
+ requireWhitespace ();
+ ids [0] = readLiteral (LIT_NORMALIZE | LIT_PUBID | flags);
+ if (inNotation) {
+ skipWhitespace ();
+ c = readCh ();
+ unread (c);
+ if (c == '"' || c == '\'') {
+ ids [1] = readLiteral (flags);
+ }
+ } else {
+ requireWhitespace ();
+ ids [1] = readLiteral (flags);
+ }
+
+ for (int i = 0; i < ids [0].length (); i++) {
+ c = ids [0].charAt (i);
+ if (c >= 'a' && c <= 'z')
+ continue;
+ if (c >= 'A' && c <= 'Z')
+ continue;
+ if (" \r\n0123456789-' ()+,./:=?;!*#@$_%".indexOf (c) != -1)
+ continue;
+ error ("illegal PUBLIC id character U+"
+ + Integer.toHexString (c));
+ }
+ } else if (tryRead ("SYSTEM")) {
+ requireWhitespace ();
+ ids [1] = readLiteral (flags);
+ } else if (!isSubset)
+ error ("missing SYSTEM or PUBLIC keyword");
+
+ if (ids [1] != null) {
+ if (ids [1].indexOf ('#') != -1)
+ handler.verror ("SYSTEM id has a URI fragment: " + ids [1]);
+ ids [2] = handler.getSystemId ();
+ if (ids [2] == null)
+ handler.warn ("No base URI; hope URI is absolute: "
+ + ids [1]);
+ }
+
+ return ids;
+ }
+
+
+ /**
+ * Test if a character is whitespace.
+ * <pre>
+ * [3] S ::= (#x20 | #x9 | #xd | #xa)+
+ * </pre>
+ * @param c The character to test.
+ * @return true if the character is whitespace.
+ */
+ private final boolean isWhitespace (char c)
+ {
+ if (c > 0x20)
+ return false;
+ if (c == 0x20 || c == 0x0a || c == 0x09 || c == 0x0d)
+ return true;
+ return false; // illegal ...
+ }
+
+
+ //////////////////////////////////////////////////////////////////////
+ // Utility routines.
+ //////////////////////////////////////////////////////////////////////
+
+
+ /**
+ * Add a character to the data buffer.
+ */
+ private void dataBufferAppend (char c)
+ {
+ // Expand buffer if necessary.
+ if (dataBufferPos >= dataBuffer.length)
+ dataBuffer =
+ (char[]) extendArray (dataBuffer,
+ dataBuffer.length, dataBufferPos);
+ dataBuffer [dataBufferPos++] = c;
+ }
+
+
+ /**
+ * Add a string to the data buffer.
+ */
+ private void dataBufferAppend (String s)
+ {
+ dataBufferAppend (s.toCharArray (), 0, s.length ());
+ }
+
+
+ /**
+ * Append (part of) a character array to the data buffer.
+ */
+ private void dataBufferAppend (char ch[], int start, int length)
+ {
+ dataBuffer = (char[])
+ extendArray (dataBuffer, dataBuffer.length,
+ dataBufferPos + length);
+
+ System.arraycopy (ch, start, dataBuffer, dataBufferPos, length);
+ dataBufferPos += length;
+ }
+
+
+ /**
+ * Normalise space characters in the data buffer.
+ */
+ private void dataBufferNormalize ()
+ {
+ int i = 0;
+ int j = 0;
+ int end = dataBufferPos;
+
+ // Skip spaces at the start.
+ while (j < end && dataBuffer [j] == ' ') {
+ j++;
+ }
+
+ // Skip whitespace at the end.
+ while (end > j && dataBuffer [end - 1] == ' ') {
+ end --;
+ }
+
+ // Start copying to the left.
+ while (j < end) {
+
+ char c = dataBuffer [j++];
+
+ // Normalise all other spaces to
+ // a single space.
+ if (c == ' ') {
+ while (j < end && dataBuffer [j++] == ' ')
+ continue;
+ dataBuffer [i++] = ' ';
+ dataBuffer [i++] = dataBuffer [j - 1];
+ } else {
+ dataBuffer [i++] = c;
+ }
+ }
+
+ // The new length is <= the old one.
+ dataBufferPos = i;
+ }
+
+
+ /**
+ * Convert the data buffer to a string.
+ */
+ private String dataBufferToString ()
+ {
+ String s = new String (dataBuffer, 0, dataBufferPos);
+ dataBufferPos = 0;
+ return s;
+ }
+
+
+ /**
+ * Flush the contents of the data buffer to the handler, as
+ * appropriate, and reset the buffer for new input.
+ */
+ private void dataBufferFlush ()
+ throws SAXException
+ {
+ if (currentElementContent == CONTENT_ELEMENTS
+ && dataBufferPos > 0
+ && !inCDATA
+ ) {
+ // We can't just trust the buffer to be whitespace, there
+ // are (error) cases when it isn't
+ for (int i = 0; i < dataBufferPos; i++) {
+ if (!isWhitespace (dataBuffer [i])) {
+ handler.charData (dataBuffer, 0, dataBufferPos);
+ dataBufferPos = 0;
+ }
+ }
+ if (dataBufferPos > 0) {
+ handler.ignorableWhitespace (dataBuffer, 0, dataBufferPos);
+ dataBufferPos = 0;
+ }
+ } else if (dataBufferPos > 0) {
+ handler.charData (dataBuffer, 0, dataBufferPos);
+ dataBufferPos = 0;
+ }
+ }
+
+
+ /**
+ * Require a string to appear, or throw an exception.
+ * <p><em>Precondition:</em> Entity expansion is not required.
+ * <p><em>Precondition:</em> data buffer has no characters that
+ * will get sent to the application.
+ */
+ private void require (String delim)
+ throws SAXException, IOException
+ {
+ int length = delim.length ();
+ char ch [];
+
+ if (length < dataBuffer.length) {
+ ch = dataBuffer;
+ delim.getChars (0, length, ch, 0);
+ } else
+ ch = delim.toCharArray ();
+
+ if (USE_CHEATS
+ && length <= (readBufferLength - readBufferPos)) {
+ int offset = readBufferPos;
+
+ for (int i = 0; i < length; i++, offset++)
+ if (ch [i] != readBuffer [offset])
+ error ("required string", null, delim);
+ readBufferPos = offset;
+
+ } else {
+ for (int i = 0; i < length; i++)
+ require (ch [i]);
+ }
+ }
+
+
+ /**
+ * Require a character to appear, or throw an exception.
+ */
+ private void require (char delim)
+ throws SAXException, IOException
+ {
+ char c = readCh ();
+
+ if (c != delim) {
+ error ("required character", c, new Character (delim).toString ());
+ }
+ }
+
+
+ /**
+ * Create an interned string from a character array.
+ * &AElig;lfred uses this method to create an interned version
+ * of all names and name tokens, so that it can test equality
+ * with <code>==</code> instead of <code>String.equals ()</code>.
+ *
+ * <p>This is much more efficient than constructing a non-interned
+ * string first, and then interning it.
+ *
+ * @param ch an array of characters for building the string.
+ * @param start the starting position in the array.
+ * @param length the number of characters to place in the string.
+ * @return an interned string.
+ * @see #intern (String)
+ * @see java.lang.String#intern
+ */
+ public String intern (char ch[], int start, int length)
+ {
+ int index = 0;
+ int hash = 0;
+ Object bucket [];
+
+ // Generate a hash code. This is a widely used string hash,
+ // often attributed to Brian Kernighan.
+ for (int i = start; i < start + length; i++)
+ hash = 31 * hash + ch [i];
+ hash = (hash & 0x7fffffff) % SYMBOL_TABLE_LENGTH;
+
+ // Get the bucket -- consists of {array,String} pairs
+ if ((bucket = symbolTable [hash]) == null) {
+ // first string in this bucket
+ bucket = new Object [8];
+
+ // Search for a matching tuple, and
+ // return the string if we find one.
+ } else {
+ while (index < bucket.length) {
+ char chFound [] = (char []) bucket [index];
+
+ // Stop when we hit an empty entry.
+ if (chFound == null)
+ break;
+
+ // If they're the same length, check for a match.
+ if (chFound.length == length) {
+ for (int i = 0; i < chFound.length; i++) {
+ // continue search on failure
+ if (ch [start + i] != chFound [i]) {
+ break;
+ } else if (i == length - 1) {
+ // That's it, we have a match!
+ return (String) bucket [index + 1];
+ }
+ }
+ }
+ index += 2;
+ }
+ // Not found -- we'll have to add it.
+
+ // Do we have to grow the bucket?
+ bucket = (Object []) extendArray (bucket, bucket.length, index);
+ }
+ symbolTable [hash] = bucket;
+
+ // OK, add it to the end of the bucket -- "local" interning.
+ // Intern "globally" to let applications share interning benefits.
+ // That is, "!=" and "==" work on our strings, not just equals().
+ String s = new String (ch, start, length).intern ();
+ bucket [index] = s.toCharArray ();
+ bucket [index + 1] = s;
+ return s;
+ }
+
+ /**
+ * Ensure the capacity of an array, allocating a new one if
+ * necessary. Usually extends only for name hash collisions.
+ */
+ private Object extendArray (Object array, int currentSize, int requiredSize)
+ {
+ if (requiredSize < currentSize) {
+ return array;
+ } else {
+ Object newArray = null;
+ int newSize = currentSize * 2;
+
+ if (newSize <= requiredSize)
+ newSize = requiredSize + 1;
+
+ if (array instanceof char[])
+ newArray = new char [newSize];
+ else if (array instanceof Object[])
+ newArray = new Object [newSize];
+ else
+ throw new RuntimeException ();
+
+ System.arraycopy (array, 0, newArray, 0, currentSize);
+ return newArray;
+ }
+ }
+
+
+ //////////////////////////////////////////////////////////////////////
+ // XML query routines.
+ //////////////////////////////////////////////////////////////////////
+
+
+ boolean isStandalone () { return docIsStandalone; }
+
+
+ //
+ // Elements
+ //
+
+ private int getContentType (Object element [], int defaultType)
+ {
+ int retval;
+
+ if (element == null)
+ return defaultType;
+ retval = ((Integer) element [0]).intValue ();
+ if (retval == CONTENT_UNDECLARED)
+ retval = defaultType;
+ return retval;
+ }
+
+
+ /**
+ * Look up the content type of an element.
+ * @param name The element type name.
+ * @return An integer constant representing the content type.
+ * @see #CONTENT_UNDECLARED
+ * @see #CONTENT_ANY
+ * @see #CONTENT_EMPTY
+ * @see #CONTENT_MIXED
+ * @see #CONTENT_ELEMENTS
+ */
+ public int getElementContentType (String name)
+ {
+ Object element [] = (Object []) elementInfo.get (name);
+ return getContentType (element, CONTENT_UNDECLARED);
+ }
+
+
+ /**
+ * Register an element.
+ * Array format:
+ * [0] element type name
+ * [1] content model (mixed, elements only)
+ * [2] attribute hash table
+ */
+ private void setElement (
+ String name,
+ int contentType,
+ String contentModel,
+ Hashtable attributes
+ ) throws SAXException
+ {
+ if (skippedPE)
+ return;
+
+ Object element [] = (Object []) elementInfo.get (name);
+
+ // first <!ELEMENT ...> or <!ATTLIST ...> for this type?
+ if (element == null) {
+ element = new Object [3];
+ element [0] = new Integer (contentType);
+ element [1] = contentModel;
+ element [2] = attributes;
+ elementInfo.put (name, element);
+ return;
+ }
+
+ // <!ELEMENT ...> declaration?
+ if (contentType != CONTENT_UNDECLARED) {
+ // ... following an associated <!ATTLIST ...>
+ if (((Integer) element [0]).intValue () == CONTENT_UNDECLARED) {
+ element [0] = new Integer (contentType);
+ element [1] = contentModel;
+ } else
+ // VC: Unique Element Type Declaration
+ handler.verror ("multiple declarations for element type: "
+ + name);
+ }
+
+ // first <!ATTLIST ...>, before <!ELEMENT ...> ?
+ else if (attributes != null)
+ element [2] = attributes;
+ }
+
+
+ /**
+ * Look up the attribute hash table for an element.
+ * The hash table is the second item in the element array.
+ */
+ private Hashtable getElementAttributes (String name)
+ {
+ Object element[] = (Object[]) elementInfo.get (name);
+ if (element == null)
+ return null;
+ else
+ return (Hashtable) element [2];
+ }
+
+
+
+ //
+ // Attributes
+ //
+
+ /**
+ * Get the declared attributes for an element type.
+ * @param elname The name of the element type.
+ * @return An Enumeration of all the attributes declared for
+ * a specific element type. The results will be valid only
+ * after the DTD (if any) has been parsed.
+ * @see #getAttributeType
+ * @see #getAttributeEnumeration
+ * @see #getAttributeDefaultValueType
+ * @see #getAttributeDefaultValue
+ * @see #getAttributeExpandedValue
+ */
+ private Enumeration declaredAttributes (Object element [])
+ {
+ Hashtable attlist;
+
+ if (element == null)
+ return null;
+ if ((attlist = (Hashtable) element [2]) == null)
+ return null;
+ return attlist.keys ();
+ }
+
+ /**
+ * Get the declared attributes for an element type.
+ * @param elname The name of the element type.
+ * @return An Enumeration of all the attributes declared for
+ * a specific element type. The results will be valid only
+ * after the DTD (if any) has been parsed.
+ * @see #getAttributeType
+ * @see #getAttributeEnumeration
+ * @see #getAttributeDefaultValueType
+ * @see #getAttributeDefaultValue
+ * @see #getAttributeExpandedValue
+ */
+ public Enumeration declaredAttributes (String elname)
+ {
+ return declaredAttributes ((Object []) elementInfo.get (elname));
+ }
+
+
+ /**
+ * Retrieve the declared type of an attribute.
+ * @param name The name of the associated element.
+ * @param aname The name of the attribute.
+ * @return An interend string denoting the type, or null
+ * indicating an undeclared attribute.
+ */
+ public String getAttributeType (String name, String aname)
+ {
+ Object attribute[] = getAttribute (name, aname);
+ if (attribute == null) {
+ return null;
+ } else {
+ return (String) attribute [0];
+ }
+ }
+
+
+ /**
+ * Retrieve the allowed values for an enumerated attribute type.
+ * @param name The name of the associated element.
+ * @param aname The name of the attribute.
+ * @return A string containing the token list.
+ */
+ public String getAttributeEnumeration (String name, String aname)
+ {
+ Object attribute[] = getAttribute (name, aname);
+ if (attribute == null) {
+ return null;
+ } else {
+ // assert: attribute [0] is "ENUMERATION" or "NOTATION"
+ return (String) attribute [3];
+ }
+ }
+
+
+ /**
+ * Retrieve the default value of a declared attribute.
+ * @param name The name of the associated element.
+ * @param aname The name of the attribute.
+ * @return The default value, or null if the attribute was
+ * #IMPLIED or simply undeclared and unspecified.
+ * @see #getAttributeExpandedValue
+ */
+ public String getAttributeDefaultValue (String name, String aname)
+ {
+ Object attribute[] = getAttribute (name, aname);
+ if (attribute == null) {
+ return null;
+ } else {
+ return (String) attribute [1];
+ }
+ }
+
+ /*
+
+// FIXME: Leaving this in, until W3C finally resolves the confusion
+// between parts of the XML 2nd REC about when entity declararations
+// are guaranteed to be known. Current code matches what section 5.1
+// (conformance) describes, but some readings of the self-contradicting
+// text in 4.1 (the "Entity Declared" WFC and VC) seem to expect that
+// attribute expansion/normalization must be deferred in some cases
+// (just TRY to identify them!).
+
+ * Retrieve the expanded value of a declared attribute.
+ * <p>General entities (and char refs) will be expanded (once).
+ * @param name The name of the associated element.
+ * @param aname The name of the attribute.
+ * @return The expanded default value, or null if the attribute was
+ * #IMPLIED or simply undeclared
+ * @see #getAttributeDefaultValue
+ public String getAttributeExpandedValue (String name, String aname)
+ throws Exception
+ {
+ Object attribute[] = getAttribute (name, aname);
+
+ if (attribute == null) {
+ return null;
+ } else if (attribute [4] == null && attribute [1] != null) {
+ // we MUST use the same buf for both quotes else the literal
+ // can't be properly terminated
+ char buf [] = new char [1];
+ int flags = LIT_ENTITY_REF | LIT_ATTRIBUTE;
+ String type = getAttributeType (name, aname);
+
+ if (type != "CDATA" && type != null)
+ flags |= LIT_NORMALIZE;
+ buf [0] = '"';
+ pushCharArray (null, buf, 0, 1);
+ pushString (null, (String) attribute [1]);
+ pushCharArray (null, buf, 0, 1);
+ attribute [4] = readLiteral (flags);
+ }
+ return (String) attribute [4];
+ }
+ */
+
+ /**
+ * Retrieve the default value mode of a declared attribute.
+ * @see #ATTRIBUTE_DEFAULT_SPECIFIED
+ * @see #ATTRIBUTE_DEFAULT_IMPLIED
+ * @see #ATTRIBUTE_DEFAULT_REQUIRED
+ * @see #ATTRIBUTE_DEFAULT_FIXED
+ */
+ public int getAttributeDefaultValueType (String name, String aname)
+ {
+ Object attribute[] = getAttribute (name, aname);
+ if (attribute == null) {
+ return ATTRIBUTE_DEFAULT_UNDECLARED;
+ } else {
+ return ((Integer) attribute [2]).intValue ();
+ }
+ }
+
+
+ /**
+ * Register an attribute declaration for later retrieval.
+ * Format:
+ * - String type
+ * - String default value
+ * - int value type
+ * - enumeration
+ * - processed default value
+ */
+ private void setAttribute (String elName, String name, String type,
+ String enumeration,
+ String value, int valueType)
+ throws Exception
+ {
+ Hashtable attlist;
+
+ if (skippedPE)
+ return;
+
+ // Create a new hashtable if necessary.
+ attlist = getElementAttributes (elName);
+ if (attlist == null)
+ attlist = new Hashtable ();
+
+ // ignore multiple attribute declarations!
+ if (attlist.get (name) != null) {
+ // warn ...
+ return;
+ } else {
+ Object attribute [] = new Object [5];
+ attribute [0] = type;
+ attribute [1] = value;
+ attribute [2] = new Integer (valueType);
+ attribute [3] = enumeration;
+ attribute [4] = null;
+ attlist.put (name, attribute);
+
+ // save; but don't overwrite any existing <!ELEMENT ...>
+ setElement (elName, CONTENT_UNDECLARED, null, attlist);
+ }
+ }
+
+
+ /**
+ * Retrieve the array representing an attribute declaration.
+ */
+ private Object[] getAttribute (String elName, String name)
+ {
+ Hashtable attlist;
+
+ attlist = getElementAttributes (elName);
+ if (attlist == null)
+ return null;
+ return (Object[]) attlist.get (name);
+ }
+
+
+ //
+ // Entities
+ //
+
+ /**
+ * Find the type of an entity.
+ * @returns An integer constant representing the entity type.
+ * @see #ENTITY_UNDECLARED
+ * @see #ENTITY_INTERNAL
+ * @see #ENTITY_NDATA
+ * @see #ENTITY_TEXT
+ */
+ public int getEntityType (String ename)
+ {
+ Object entity[] = (Object[]) entityInfo.get (ename);
+ if (entity == null) {
+ return ENTITY_UNDECLARED;
+ } else {
+ return ((Integer) entity [0]).intValue ();
+ }
+ }
+
+
+ /**
+ * Return an external entity's identifier array.
+ * @param ename The name of the external entity.
+ * @return Three element array containing (in order) the entity's
+ * public identifier, system identifier, and base URI. Null if
+ * the entity was not declared as an external entity.
+ * @see #getEntityType
+ */
+ public String [] getEntityIds (String ename)
+ {
+ Object entity[] = (Object[]) entityInfo.get (ename);
+ if (entity == null) {
+ return null;
+ } else {
+ return (String []) entity [1];
+ }
+ }
+
+
+ /**
+ * Return an internal entity's replacement text.
+ * @param ename The name of the internal entity.
+ * @return The entity's replacement text, or null if
+ * the entity was not declared as an internal entity.
+ * @see #getEntityType
+ */
+ public String getEntityValue (String ename)
+ {
+ Object entity[] = (Object[]) entityInfo.get (ename);
+ if (entity == null) {
+ return null;
+ } else {
+ return (String) entity [3];
+ }
+ }
+
+
+ /**
+ * Register an entity declaration for later retrieval.
+ */
+ private void setInternalEntity (String eName, String value)
+ throws SAXException
+ {
+ if (skippedPE)
+ return;
+
+ if (entityInfo.get (eName) == null) {
+ Object entity[] = new Object [5];
+ entity [0] = new Integer (ENTITY_INTERNAL);
+// FIXME: shrink!! [2] useless
+ entity [3] = value;
+ entityInfo.put (eName, entity);
+ }
+ if ("lt" == eName || "gt" == eName || "quot" == eName
+ || "apos" == eName || "amp" == eName)
+ return;
+ handler.getDeclHandler ()
+ .internalEntityDecl (eName, value);
+ }
+
+
+ /**
+ * Register an external entity declaration for later retrieval.
+ */
+ private void setExternalEntity (String eName, int eClass,
+ String ids [], String nName)
+ {
+ if (entityInfo.get (eName) == null) {
+ Object entity[] = new Object [5];
+ entity [0] = new Integer (eClass);
+ entity [1] = ids;
+// FIXME: shrink!! [2] no longer used, [4] irrelevant given [0]
+ entity [4] = nName;
+ entityInfo.put (eName, entity);
+ }
+ }
+
+
+ //
+ // Notations.
+ //
+
+ /**
+ * Report a notation declaration, checking for duplicates.
+ */
+ private void setNotation (String nname, String ids [])
+ throws SAXException
+ {
+ if (skippedPE)
+ return;
+
+ handler.notationDecl (nname, ids);
+ if (notationInfo.get (nname) == null)
+ notationInfo.put (nname, nname);
+ else
+ // VC: Unique Notation Name
+ handler.verror ("Duplicate notation name decl: " + nname);
+ }
+
+
+ //
+ // Location.
+ //
+
+
+ /**
+ * Return the current line number.
+ */
+ public int getLineNumber ()
+ {
+ return line;
+ }
+
+
+ /**
+ * Return the current column number.
+ */
+ public int getColumnNumber ()
+ {
+ return column;
+ }
+
+
+ //////////////////////////////////////////////////////////////////////
+ // High-level I/O.
+ //////////////////////////////////////////////////////////////////////
+
+
+ /**
+ * Read a single character from the readBuffer.
+ * <p>The readDataChunk () method maintains the buffer.
+ * <p>If we hit the end of an entity, try to pop the stack and
+ * keep going.
+ * <p> (This approach doesn't really enforce XML's rules about
+ * entity boundaries, but this is not currently a validating
+ * parser).
+ * <p>This routine also attempts to keep track of the current
+ * position in external entities, but it's not entirely accurate.
+ * @return The next available input character.
+ * @see #unread (char)
+ * @see #readDataChunk
+ * @see #readBuffer
+ * @see #line
+ * @return The next character from the current input source.
+ */
+ private char readCh ()
+ throws SAXException, IOException
+ {
+ // As long as there's nothing in the
+ // read buffer, try reading more data
+ // (for an external entity) or popping
+ // the entity stack (for either).
+ while (readBufferPos >= readBufferLength) {
+ switch (sourceType) {
+ case INPUT_READER:
+ case INPUT_STREAM:
+ readDataChunk ();
+ while (readBufferLength < 1) {
+ popInput ();
+ if (readBufferLength < 1) {
+ readDataChunk ();
+ }
+ }
+ break;
+
+ default:
+
+ popInput ();
+ break;
+ }
+ }
+
+ char c = readBuffer [readBufferPos++];
+
+ if (c == '\n') {
+ line++;
+ column = 0;
+ } else {
+ if (c == '<') {
+ /* the most common return to parseContent () ... NOP */
+ } else if ((c < 0x0020 && (c != '\t') && (c != '\r')) || c > 0xFFFD)
+ error ("illegal XML character U+"
+ + Integer.toHexString (c));
+
+ // If we're in the DTD and in a context where PEs get expanded,
+ // do so ... 1/14/2000 errata identify those contexts. There
+ // are also spots in the internal subset where PE refs are fatal
+ // errors, hence yet another flag.
+ else if (c == '%' && expandPE) {
+ if (peIsError)
+ error ("PE reference within decl in internal subset.");
+ parsePEReference ();
+ return readCh ();
+ }
+ column++;
+ }
+
+ return c;
+ }
+
+
+ /**
+ * Push a single character back onto the current input stream.
+ * <p>This method usually pushes the character back onto
+ * the readBuffer.
+ * <p>I don't think that this would ever be called with
+ * readBufferPos = 0, because the methods always reads a character
+ * before unreading it, but just in case, I've added a boundary
+ * condition.
+ * @param c The character to push back.
+ * @see #readCh
+ * @see #unread (char[])
+ * @see #readBuffer
+ */
+ private void unread (char c)
+ throws SAXException
+ {
+ // Normal condition.
+ if (c == '\n') {
+ line--;
+ column = -1;
+ }
+ if (readBufferPos > 0) {
+ readBuffer [--readBufferPos] = c;
+ } else {
+ pushString (null, new Character (c).toString ());
+ }
+ }
+
+
+ /**
+ * Push a char array back onto the current input stream.
+ * <p>NOTE: you must <em>never</em> push back characters that you
+ * haven't actually read: use pushString () instead.
+ * @see #readCh
+ * @see #unread (char)
+ * @see #readBuffer
+ * @see #pushString
+ */
+ private void unread (char ch[], int length)
+ throws SAXException
+ {
+ for (int i = 0; i < length; i++) {
+ if (ch [i] == '\n') {
+ line--;
+ column = -1;
+ }
+ }
+ if (length < readBufferPos) {
+ readBufferPos -= length;
+ } else {
+ pushCharArray (null, ch, 0, length);
+ }
+ }
+
+
+ /**
+ * Push, or skip, a new external input source.
+ * The source will be some kind of parsed entity, such as a PE
+ * (including the external DTD subset) or content for the body.
+ *
+ * @param url The java.net.URL object for the entity.
+ * @see SAXDriver#resolveEntity
+ * @see #pushString
+ * @see #sourceType
+ * @see #pushInput
+ * @see #detectEncoding
+ * @see #sourceType
+ * @see #readBuffer
+ */
+ private void pushURL (
+ boolean isPE,
+ String ename,
+ String ids [], // public, system, baseURI
+ Reader reader,
+ InputStream stream,
+ String encoding,
+ boolean doResolve
+ ) throws SAXException, IOException
+ {
+ boolean ignoreEncoding;
+ String systemId;
+ InputSource source;
+
+ if (!isPE)
+ dataBufferFlush ();
+
+ scratch.setPublicId (ids [0]);
+ scratch.setSystemId (ids [1]);
+
+ // See if we should skip or substitute the entity.
+ // If we're not skipping, resolving reports startEntity()
+ // and updates the (handler's) stack of URIs.
+ if (doResolve) {
+ // assert (stream == null && reader == null && encoding == null)
+ source = handler.resolveEntity (isPE, ename, scratch, ids [2]);
+ if (source == null) {
+ handler.warn ("skipping entity: " + ename);
+ handler.skippedEntity (ename);
+ if (isPE)
+ skippedPE = true;
+ return;
+ }
+
+ // we might be using alternate IDs/encoding
+ systemId = source.getSystemId ();
+ if (systemId == null) {
+ handler.warn ("missing system ID, using " + ids [1]);
+ systemId = ids [1];
+ }
+ } else {
+ // "[document]", or "[dtd]" via getExternalSubset()
+ scratch.setCharacterStream (reader);
+ scratch.setByteStream (stream);
+ scratch.setEncoding (encoding);
+ source = scratch;
+ systemId = ids [1];
+ handler.startExternalEntity (ename, systemId,
+ "[document]" == ename);
+ }
+
+ // we may have been given I/O streams directly
+ if (source.getCharacterStream () != null) {
+ if (source.getByteStream () != null)
+ error ("InputSource has two streams!");
+ reader = source.getCharacterStream ();
+ } else if (source.getByteStream () != null) {
+ encoding = source.getEncoding ();
+ if (encoding == null)
+ stream = source.getByteStream ();
+ else try {
+ reader = new InputStreamReader (
+ source.getByteStream (),
+ encoding);
+ } catch (IOException e) {
+ stream = source.getByteStream ();
+ }
+ } else if (systemId == null)
+ error ("InputSource has no URI!");
+ scratch.setCharacterStream (null);
+ scratch.setByteStream (null);
+ scratch.setEncoding (null);
+
+ // Push the existing status.
+ pushInput (ename);
+
+ // Create a new read buffer.
+ // (Note the four-character margin)
+ readBuffer = new char [READ_BUFFER_MAX + 4];
+ readBufferPos = 0;
+ readBufferLength = 0;
+ readBufferOverflow = -1;
+ is = null;
+ line = 1;
+ column = 0;
+ currentByteCount = 0;
+
+ // If there's an explicit character stream, just
+ // ignore encoding declarations.
+ if (reader != null) {
+ sourceType = INPUT_READER;
+ this.reader = reader;
+ tryEncodingDecl (true);
+ return;
+ }
+
+ // Else we handle the conversion, and need to ensure
+ // it's done right.
+ sourceType = INPUT_STREAM;
+ if (stream != null) {
+ is = stream;
+ } else {
+ // We have to open our own stream to the URL.
+ URL url = new URL (systemId);
+
+ externalEntity = url.openConnection ();
+ externalEntity.connect ();
+ is = externalEntity.getInputStream ();
+ }
+
+ // If we get to here, there must be
+ // an InputStream available.
+ if (!is.markSupported ()) {
+ is = new BufferedInputStream (is);
+ }
+
+ // Get any external encoding label.
+ if (encoding == null && externalEntity != null) {
+ // External labels can be untrustworthy; filesystems in
+ // particular often have the wrong default for content
+ // that wasn't locally originated. Those we autodetect.
+ if (!"file".equals (externalEntity.getURL ().getProtocol ())) {
+ int temp;
+
+ // application/xml;charset=something;otherAttr=...
+ // ... with many variants on 'something'
+ encoding = externalEntity.getContentType ();
+
+ // MHK code (fix for Saxon 5.5.1/007):
+ // protect against encoding==null
+ if (encoding==null) {
+ temp = -1;
+ } else {
+ temp = encoding.indexOf ("charset");
+ }
+
+ // RFC 2376 sez MIME text defaults to ASCII, but since the
+ // JDK will create a MIME type out of thin air, we always
+ // autodetect when there's no explicit charset attribute.
+ if (temp < 0)
+ encoding = null; // autodetect
+ else {
+ // only this one attribute
+ if ((temp = encoding.indexOf (';')) > 0)
+ encoding = encoding.substring (0, temp);
+
+ if ((temp = encoding.indexOf ('=', temp + 7)) > 0) {
+ encoding = encoding.substring (temp + 1);
+
+ // attributes can have comment fields (RFC 822)
+ if ((temp = encoding.indexOf ('(')) > 0)
+ encoding = encoding.substring (0, temp);
+ // ... and values may be quoted
+ if ((temp = encoding.indexOf ('"')) > 0)
+ encoding = encoding.substring (temp + 1,
+ encoding.indexOf ('"', temp + 2));
+ encoding.trim ();
+ } else {
+ handler.warn ("ignoring illegal MIME attribute: "
+ + encoding);
+ encoding = null;
+ }
+ }
+ }
+ }
+
+ // if we got an external encoding label, use it ...
+ if (encoding != null) {
+ this.encoding = ENCODING_EXTERNAL;
+ setupDecoding (encoding);
+ ignoreEncoding = true;
+
+ // ... else autodetect from first bytes.
+ } else {
+ detectEncoding ();
+ ignoreEncoding = false;
+ }
+
+ // Read any XML or text declaration.
+ // If we autodetected, it may tell us the "real" encoding.
+ try {
+ tryEncodingDecl (ignoreEncoding);
+ } catch (UnsupportedEncodingException x) {
+ encoding = x.getMessage ();
+
+ // if we don't handle the declared encoding,
+ // try letting a JVM InputStreamReader do it
+ try {
+ if (sourceType != INPUT_STREAM)
+ throw x;
+
+ is.reset ();
+ readBufferPos = 0;
+ readBufferLength = 0;
+ readBufferOverflow = -1;
+ line = 1;
+ currentByteCount = column = 0;
+
+ sourceType = INPUT_READER;
+ this.reader = new InputStreamReader (is, encoding);
+ is = null;
+
+ tryEncodingDecl (true);
+
+ } catch (IOException e) {
+ error ("unsupported text encoding",
+ encoding,
+ null);
+ }
+ }
+ }
+
+
+ /**
+ * Check for an encoding declaration. This is the second part of the
+ * XML encoding autodetection algorithm, relying on detectEncoding to
+ * get to the point that this part can read any encoding declaration
+ * in the document (using only US-ASCII characters).
+ *
+ * <p> Because this part starts to fill parser buffers with this data,
+ * it's tricky to setup a reader so that Java's built-in decoders can be
+ * used for the character encodings that aren't built in to this parser
+ * (such as EUC-JP, KOI8-R, Big5, etc).
+ *
+ * @return any encoding in the declaration, uppercased; or null
+ * @see detectEncoding
+ */
+ private String tryEncodingDecl (boolean ignoreEncoding)
+ throws SAXException, IOException
+ {
+ // Read the XML/text declaration.
+ if (tryRead ("<?xml")) {
+ if (tryWhitespace ()) {
+ if (inputStack.size () > 0) {
+ return parseTextDecl (ignoreEncoding);
+ } else {
+ return parseXMLDecl (ignoreEncoding);
+ }
+ } else {
+ // <?xml-stylesheet ...?> or similar
+ unread ('l');
+ unread ('m');
+ unread ('x');
+ unread ('?');
+ unread ('<');
+ }
+ }
+ return null;
+ }
+
+
+ /**
+ * Attempt to detect the encoding of an entity.
+ * <p>The trick here (as suggested in the XML standard) is that
+ * any entity not in UTF-8, or in UCS-2 with a byte-order mark,
+ * <b>must</b> begin with an XML declaration or an encoding
+ * declaration; we simply have to look for "&lt;?xml" in various
+ * encodings.
+ * <p>This method has no way to distinguish among 8-bit encodings.
+ * Instead, it sets up for UTF-8, then (possibly) revises its assumption
+ * later in setupDecoding (). Any ASCII-derived 8-bit encoding
+ * should work, but most will be rejected later by setupDecoding ().
+ * @see #tryEncoding (byte[], byte, byte, byte, byte)
+ * @see #tryEncoding (byte[], byte, byte)
+ * @see #setupDecoding
+ */
+ private void detectEncoding ()
+ throws SAXException, IOException
+ {
+ byte signature[] = new byte [4];
+
+ // Read the first four bytes for
+ // autodetection.
+ is.mark (4);
+ is.read (signature);
+ is.reset ();
+
+ //
+ // FIRST: four byte encodings (who uses these?)
+ //
+ if (tryEncoding (signature, (byte) 0x00, (byte) 0x00,
+ (byte) 0x00, (byte) 0x3c)) {
+ // UCS-4 must begin with "<?xml"
+ // 0x00 0x00 0x00 0x3c: UCS-4, big-endian (1234)
+ // "UTF-32BE"
+ encoding = ENCODING_UCS_4_1234;
+
+ } else if (tryEncoding (signature, (byte) 0x3c, (byte) 0x00,
+ (byte) 0x00, (byte) 0x00)) {
+ // 0x3c 0x00 0x00 0x00: UCS-4, little-endian (4321)
+ // "UTF-32LE"
+ encoding = ENCODING_UCS_4_4321;
+
+ } else if (tryEncoding (signature, (byte) 0x00, (byte) 0x00,
+ (byte) 0x3c, (byte) 0x00)) {
+ // 0x00 0x00 0x3c 0x00: UCS-4, unusual (2143)
+ encoding = ENCODING_UCS_4_2143;
+
+ } else if (tryEncoding (signature, (byte) 0x00, (byte) 0x3c,
+ (byte) 0x00, (byte) 0x00)) {
+ // 0x00 0x3c 0x00 0x00: UCS-4, unusual (3421)
+ encoding = ENCODING_UCS_4_3412;
+
+ // 00 00 fe ff UCS_4_1234 (with BOM)
+ // ff fe 00 00 UCS_4_4321 (with BOM)
+ }
+
+ //
+ // SECOND: two byte encodings
+ // note ... with 1/14/2000 errata the XML spec identifies some
+ // more "broken UTF-16" autodetection cases, with no XML decl,
+ // which we don't handle here (that's legal too).
+ //
+ else if (tryEncoding (signature, (byte) 0xfe, (byte) 0xff)) {
+ // UCS-2 with a byte-order marker. (UTF-16)
+ // 0xfe 0xff: UCS-2, big-endian (12)
+ encoding = ENCODING_UCS_2_12;
+ is.read (); is.read ();
+
+ } else if (tryEncoding (signature, (byte) 0xff, (byte) 0xfe)) {
+ // UCS-2 with a byte-order marker. (UTF-16)
+ // 0xff 0xfe: UCS-2, little-endian (21)
+ encoding = ENCODING_UCS_2_21;
+ is.read (); is.read ();
+
+ } else if (tryEncoding (signature, (byte) 0x00, (byte) 0x3c,
+ (byte) 0x00, (byte) 0x3f)) {
+ // UTF-16BE (otherwise, malformed UTF-16)
+ // 0x00 0x3c 0x00 0x3f: UCS-2, big-endian, no byte-order mark
+ encoding = ENCODING_UCS_2_12;
+ error ("no byte-order mark for UCS-2 entity");
+
+ } else if (tryEncoding (signature, (byte) 0x3c, (byte) 0x00,
+ (byte) 0x3f, (byte) 0x00)) {
+ // UTF-16LE (otherwise, malformed UTF-16)
+ // 0x3c 0x00 0x3f 0x00: UCS-2, little-endian, no byte-order mark
+ encoding = ENCODING_UCS_2_21;
+ error ("no byte-order mark for UCS-2 entity");
+ }
+
+ //
+ // THIRD: ASCII-derived encodings, fixed and variable lengths
+ //
+ else if (tryEncoding (signature, (byte) 0x3c, (byte) 0x3f,
+ (byte) 0x78, (byte) 0x6d)) {
+ // ASCII derived
+ // 0x3c 0x3f 0x78 0x6d: UTF-8 or other 8-bit markup (read ENCODING)
+ encoding = ENCODING_UTF_8;
+ prefetchASCIIEncodingDecl ();
+
+ } else if (signature [0] == (byte) 0xef
+ && signature [1] == (byte) 0xbb
+ && signature [2] == (byte) 0xbf) {
+ // 0xef 0xbb 0xbf: UTF-8 BOM (not part of document text)
+ // this un-needed notion slipped into XML 2nd ed through a
+ // "non-normative" erratum; now required by MSFT and UDDI,
+ // and E22 made it normative.
+ encoding = ENCODING_UTF_8;
+ is.read (); is.read (); is.read ();
+
+ } else {
+ // 4c 6f a7 94 ... we don't understand EBCDIC flavors
+ // ... but we COULD at least kick in some fixed code page
+
+ // (default) UTF-8 without encoding/XML declaration
+ encoding = ENCODING_UTF_8;
+ }
+ }
+
+
+ /**
+ * Check for a four-byte signature.
+ * <p>Utility routine for detectEncoding ().
+ * <p>Always looks for some part of "<?XML" in a specific encoding.
+ * @param sig The first four bytes read.
+ * @param b1 The first byte of the signature
+ * @param b2 The second byte of the signature
+ * @param b3 The third byte of the signature
+ * @param b4 The fourth byte of the signature
+ * @see #detectEncoding
+ */
+ private static boolean tryEncoding (
+ byte sig[], byte b1, byte b2, byte b3, byte b4)
+ {
+ return (sig [0] == b1 && sig [1] == b2
+ && sig [2] == b3 && sig [3] == b4);
+ }
+
+
+ /**
+ * Check for a two-byte signature.
+ * <p>Looks for a UCS-2 byte-order mark.
+ * <p>Utility routine for detectEncoding ().
+ * @param sig The first four bytes read.
+ * @param b1 The first byte of the signature
+ * @param b2 The second byte of the signature
+ * @see #detectEncoding
+ */
+ private static boolean tryEncoding (byte sig[], byte b1, byte b2)
+ {
+ return ((sig [0] == b1) && (sig [1] == b2));
+ }
+
+
+ /**
+ * This method pushes a string back onto input.
+ * <p>It is useful either as the expansion of an internal entity,
+ * or for backtracking during the parse.
+ * <p>Call pushCharArray () to do the actual work.
+ * @param s The string to push back onto input.
+ * @see #pushCharArray
+ */
+ private void pushString (String ename, String s)
+ throws SAXException
+ {
+ char ch[] = s.toCharArray ();
+ pushCharArray (ename, ch, 0, ch.length);
+ }
+
+
+ /**
+ * Push a new internal input source.
+ * <p>This method is useful for expanding an internal entity,
+ * or for unreading a string of characters. It creates a new
+ * readBuffer containing the characters in the array, instead
+ * of characters converted from an input byte stream.
+ * @param ch The char array to push.
+ * @see #pushString
+ * @see #pushURL
+ * @see #readBuffer
+ * @see #sourceType
+ * @see #pushInput
+ */
+ private void pushCharArray (String ename, char ch[], int start, int length)
+ throws SAXException
+ {
+ // Push the existing status
+ pushInput (ename);
+ if (ename != null && doReport) {
+ dataBufferFlush ();
+ handler.startInternalEntity (ename);
+ }
+ sourceType = INPUT_INTERNAL;
+ readBuffer = ch;
+ readBufferPos = start;
+ readBufferLength = length;
+ readBufferOverflow = -1;
+ }
+
+
+ /**
+ * Save the current input source onto the stack.
+ * <p>This method saves all of the global variables associated with
+ * the current input source, so that they can be restored when a new
+ * input source has finished. It also tests for entity recursion.
+ * <p>The method saves the following global variables onto a stack
+ * using a fixed-length array:
+ * <ol>
+ * <li>sourceType
+ * <li>externalEntity
+ * <li>readBuffer
+ * <li>readBufferPos
+ * <li>readBufferLength
+ * <li>line
+ * <li>encoding
+ * </ol>
+ * @param ename The name of the entity (if any) causing the new input.
+ * @see #popInput
+ * @see #sourceType
+ * @see #externalEntity
+ * @see #readBuffer
+ * @see #readBufferPos
+ * @see #readBufferLength
+ * @see #line
+ * @see #encoding
+ */
+ private void pushInput (String ename)
+ throws SAXException
+ {
+ // Check for entity recursion.
+ if (ename != null) {
+ Enumeration entities = entityStack.elements ();
+ while (entities.hasMoreElements ()) {
+ String e = (String) entities.nextElement ();
+ if (e != null && e == ename) {
+ error ("recursive reference to entity", ename, null);
+ }
+ }
+ }
+ entityStack.push (ename);
+
+ // Don't bother if there is no current input.
+ if (sourceType == INPUT_NONE) {
+ return;
+ }
+
+ // Set up a snapshot of the current
+ // input source.
+ Object input[] = new Object [12];
+
+ input [0] = new Integer (sourceType);
+ input [1] = externalEntity;
+ input [2] = readBuffer;
+ input [3] = new Integer (readBufferPos);
+ input [4] = new Integer (readBufferLength);
+ input [5] = new Integer (line);
+ input [6] = new Integer (encoding);
+ input [7] = new Integer (readBufferOverflow);
+ input [8] = is;
+ input [9] = new Integer (currentByteCount);
+ input [10] = new Integer (column);
+ input [11] = reader;
+
+ // Push it onto the stack.
+ inputStack.push (input);
+ }
+
+
+ /**
+ * Restore a previous input source.
+ * <p>This method restores all of the global variables associated with
+ * the current input source.
+ * @exception java.io.EOFException
+ * If there are no more entries on the input stack.
+ * @see #pushInput
+ * @see #sourceType
+ * @see #externalEntity
+ * @see #readBuffer
+ * @see #readBufferPos
+ * @see #readBufferLength
+ * @see #line
+ * @see #encoding
+ */
+ private void popInput ()
+ throws SAXException, IOException
+ {
+ String ename = (String) entityStack.pop ();
+
+ if (ename != null && doReport)
+ dataBufferFlush ();
+ switch (sourceType) {
+ case INPUT_STREAM:
+ handler.endExternalEntity (ename);
+ is.close ();
+ break;
+ case INPUT_READER:
+ handler.endExternalEntity (ename);
+ reader.close ();
+ break;
+ case INPUT_INTERNAL:
+ if (ename != null && doReport)
+ handler.endInternalEntity (ename);
+ break;
+ }
+
+ // Throw an EOFException if there
+ // is nothing else to pop.
+ if (inputStack.isEmpty ()) {
+ throw new EOFException ("no more input");
+ }
+
+ Object input [] = (Object[]) inputStack.pop ();
+
+ sourceType = ((Integer) input [0]).intValue ();
+ externalEntity = (URLConnection) input [1];
+ readBuffer = (char[]) input [2];
+ readBufferPos = ((Integer) input [3]).intValue ();
+ readBufferLength = ((Integer) input [4]).intValue ();
+ line = ((Integer) input [5]).intValue ();
+ encoding = ((Integer) input [6]).intValue ();
+ readBufferOverflow = ((Integer) input [7]).intValue ();
+ is = (InputStream) input [8];
+ currentByteCount = ((Integer) input [9]).intValue ();
+ column = ((Integer) input [10]).intValue ();
+ reader = (Reader) input [11];
+ }
+
+
+ /**
+ * Return true if we can read the expected character.
+ * <p>Note that the character will be removed from the input stream
+ * on success, but will be put back on failure. Do not attempt to
+ * read the character again if the method succeeds.
+ * @param delim The character that should appear next. For a
+ * insensitive match, you must supply this in upper-case.
+ * @return true if the character was successfully read, or false if
+ * it was not.
+ * @see #tryRead (String)
+ */
+ private boolean tryRead (char delim)
+ throws SAXException, IOException
+ {
+ char c;
+
+ // Read the character
+ c = readCh ();
+
+ // Test for a match, and push the character
+ // back if the match fails.
+ if (c == delim) {
+ return true;
+ } else {
+ unread (c);
+ return false;
+ }
+ }
+
+
+ /**
+ * Return true if we can read the expected string.
+ * <p>This is simply a convenience method.
+ * <p>Note that the string will be removed from the input stream
+ * on success, but will be put back on failure. Do not attempt to
+ * read the string again if the method succeeds.
+ * <p>This method will push back a character rather than an
+ * array whenever possible (probably the majority of cases).
+ * @param delim The string that should appear next.
+ * @return true if the string was successfully read, or false if
+ * it was not.
+ * @see #tryRead (char)
+ */
+ private boolean tryRead (String delim)
+ throws SAXException, IOException
+ {
+ return tryRead (delim.toCharArray ());
+ }
+
+ private boolean tryRead (char ch [])
+ throws SAXException, IOException
+ {
+ char c;
+
+ // Compare the input, character-
+ // by character.
+
+ for (int i = 0; i < ch.length; i++) {
+ c = readCh ();
+ if (c != ch [i]) {
+ unread (c);
+ if (i != 0) {
+ unread (ch, i);
+ }
+ return false;
+ }
+ }
+ return true;
+ }
+
+
+
+ /**
+ * Return true if we can read some whitespace.
+ * <p>This is simply a convenience method.
+ * <p>This method will push back a character rather than an
+ * array whenever possible (probably the majority of cases).
+ * @return true if whitespace was found.
+ */
+ private boolean tryWhitespace ()
+ throws SAXException, IOException
+ {
+ char c;
+ c = readCh ();
+ if (isWhitespace (c)) {
+ skipWhitespace ();
+ return true;
+ } else {
+ unread (c);
+ return false;
+ }
+ }
+
+
+ /**
+ * Read all data until we find the specified string.
+ * This is useful for scanning CDATA sections and PIs.
+ * <p>This is inefficient right now, since it calls tryRead ()
+ * for every character.
+ * @param delim The string delimiter
+ * @see #tryRead (String, boolean)
+ * @see #readCh
+ */
+ private void parseUntil (String delim)
+ throws SAXException, IOException
+ {
+ parseUntil (delim.toCharArray ());
+ }
+
+ private void parseUntil (char delim [])
+ throws SAXException, IOException
+ {
+ char c;
+ int startLine = line;
+
+ try {
+ while (!tryRead (delim)) {
+ c = readCh ();
+ dataBufferAppend (c);
+ }
+ } catch (EOFException e) {
+ error ("end of input while looking for delimiter "
+ + "(started on line " + startLine
+ + ')', null, new String (delim));
+ }
+ }
+
+
+ //////////////////////////////////////////////////////////////////////
+ // Low-level I/O.
+ //////////////////////////////////////////////////////////////////////
+
+
+ /**
+ * Prefetch US-ASCII XML/text decl from input stream into read buffer.
+ * Doesn't buffer more than absolutely needed, so that when an encoding
+ * decl says we need to create an InputStreamReader, we can discard our
+ * buffer and reset(). Caller knows the first chars of the decl exist
+ * in the input stream.
+ */
+ private void prefetchASCIIEncodingDecl ()
+ throws SAXException, IOException
+ {
+ int ch;
+ readBufferPos = readBufferLength = 0;
+
+ is.mark (readBuffer.length);
+ while (true) {
+ ch = is.read ();
+ readBuffer [readBufferLength++] = (char) ch;
+ switch (ch) {
+ case (int) '>':
+ return;
+ case -1:
+ error ("file ends before end of XML or encoding declaration.",
+ null, "?>");
+ }
+ if (readBuffer.length == readBufferLength)
+ error ("unfinished XML or encoding declaration");
+ }
+ }
+
+ /**
+ * Read a chunk of data from an external input source.
+ * <p>This is simply a front-end that fills the rawReadBuffer
+ * with bytes, then calls the appropriate encoding handler.
+ * @see #encoding
+ * @see #rawReadBuffer
+ * @see #readBuffer
+ * @see #filterCR
+ * @see #copyUtf8ReadBuffer
+ * @see #copyIso8859_1ReadBuffer
+ * @see #copyUcs_2ReadBuffer
+ * @see #copyUcs_4ReadBuffer
+ */
+ private void readDataChunk ()
+ throws SAXException, IOException
+ {
+ int count;
+
+ // See if we have any overflow (filterCR sets for CR at end)
+ if (readBufferOverflow > -1) {
+ readBuffer [0] = (char) readBufferOverflow;
+ readBufferOverflow = -1;
+ readBufferPos = 1;
+ sawCR = true;
+ } else {
+ readBufferPos = 0;
+ sawCR = false;
+ }
+
+ // input from a character stream.
+ if (sourceType == INPUT_READER) {
+ count = reader.read (readBuffer,
+ readBufferPos, READ_BUFFER_MAX - readBufferPos);
+ if (count < 0)
+ readBufferLength = readBufferPos;
+ else
+ readBufferLength = readBufferPos + count;
+ if (readBufferLength > 0)
+ filterCR (count >= 0);
+ sawCR = false;
+ return;
+ }
+
+ // Read as many bytes as possible into the raw buffer.
+ count = is.read (rawReadBuffer, 0, READ_BUFFER_MAX);
+
+ // Dispatch to an encoding-specific reader method to populate
+ // the readBuffer. In most parser speed profiles, these routines
+ // show up at the top of the CPU usage chart.
+ if (count > 0) {
+ switch (encoding) {
+ // one byte builtins
+ case ENCODING_ASCII:
+ copyIso8859_1ReadBuffer (count, (char) 0x0080);
+ break;
+ case ENCODING_UTF_8:
+ copyUtf8ReadBuffer (count);
+ break;
+ case ENCODING_ISO_8859_1:
+ copyIso8859_1ReadBuffer (count, (char) 0);
+ break;
+
+ // two byte builtins
+ case ENCODING_UCS_2_12:
+ copyUcs2ReadBuffer (count, 8, 0);
+ break;
+ case ENCODING_UCS_2_21:
+ copyUcs2ReadBuffer (count, 0, 8);
+ break;
+
+ // four byte builtins
+ case ENCODING_UCS_4_1234:
+ copyUcs4ReadBuffer (count, 24, 16, 8, 0);
+ break;
+ case ENCODING_UCS_4_4321:
+ copyUcs4ReadBuffer (count, 0, 8, 16, 24);
+ break;
+ case ENCODING_UCS_4_2143:
+ copyUcs4ReadBuffer (count, 16, 24, 0, 8);
+ break;
+ case ENCODING_UCS_4_3412:
+ copyUcs4ReadBuffer (count, 8, 0, 24, 16);
+ break;
+ }
+ } else
+ readBufferLength = readBufferPos;
+
+ readBufferPos = 0;
+
+ // Filter out all carriage returns if we've seen any
+ // (including any saved from a previous read)
+ if (sawCR) {
+ filterCR (count >= 0);
+ sawCR = false;
+
+ // must actively report EOF, lest some CRs get lost.
+ if (readBufferLength == 0 && count >= 0)
+ readDataChunk ();
+ }
+
+ if (count > 0)
+ currentByteCount += count;
+ }
+
+
+ /**
+ * Filter carriage returns in the read buffer.
+ * CRLF becomes LF; CR becomes LF.
+ * @param moreData true iff more data might come from the same source
+ * @see #readDataChunk
+ * @see #readBuffer
+ * @see #readBufferOverflow
+ */
+ private void filterCR (boolean moreData)
+ {
+ int i, j;
+
+ readBufferOverflow = -1;
+
+loop:
+ for (i = j = readBufferPos; j < readBufferLength; i++, j++) {
+ switch (readBuffer [j]) {
+ case '\r':
+ if (j == readBufferLength - 1) {
+ if (moreData) {
+ readBufferOverflow = '\r';
+ readBufferLength--;
+ } else // CR at end of buffer
+ readBuffer [i++] = '\n';
+ break loop;
+ } else if (readBuffer [j + 1] == '\n') {
+ j++;
+ }
+ readBuffer [i] = '\n';
+ break;
+
+ case '\n':
+ default:
+ readBuffer [i] = readBuffer [j];
+ break;
+ }
+ }
+ readBufferLength = i;
+ }
+
+ /**
+ * Convert a buffer of UTF-8-encoded bytes into UTF-16 characters.
+ * <p>When readDataChunk () calls this method, the raw bytes are in
+ * rawReadBuffer, and the final characters will appear in
+ * readBuffer.
+ * <p>Note that as of Unicode 3.1, good practice became a requirement,
+ * so that each Unicode character has exactly one UTF-8 representation.
+ * @param count The number of bytes to convert.
+ * @see #readDataChunk
+ * @see #rawReadBuffer
+ * @see #readBuffer
+ * @see #getNextUtf8Byte
+ */
+ private void copyUtf8ReadBuffer (int count)
+ throws SAXException, IOException
+ {
+ int i = 0;
+ int j = readBufferPos;
+ int b1;
+ char c = 0;
+
+ /*
+ // check once, so the runtime won't (if it's smart enough)
+ if (count < 0 || count > rawReadBuffer.length)
+ throw new ArrayIndexOutOfBoundsException (Integer.toString (count));
+ */
+
+ while (i < count) {
+ b1 = rawReadBuffer [i++];
+
+ // Determine whether we are dealing
+ // with a one-, two-, three-, or four-
+ // byte sequence.
+ if (b1 < 0) {
+ if ((b1 & 0xe0) == 0xc0) {
+ // 2-byte sequence: 00000yyyyyxxxxxx = 110yyyyy 10xxxxxx
+ c = (char) (((b1 & 0x1f) << 6)
+ | getNextUtf8Byte (i++, count));
+ if (c < 0x0080)
+ encodingError ("Illegal two byte UTF-8 sequence",
+ c, 0);
+ } else if ((b1 & 0xf0) == 0xe0) {
+ // 3-byte sequence:
+ // zzzzyyyyyyxxxxxx = 1110zzzz 10yyyyyy 10xxxxxx
+ // most CJKV characters
+ c = (char) (((b1 & 0x0f) << 12) |
+ (getNextUtf8Byte (i++, count) << 6) |
+ getNextUtf8Byte (i++, count));
+ if (c < 0x0800 || (c >= 0xd800 && c <= 0xdfff))
+ encodingError ("Illegal three byte UTF-8 sequence",
+ c, 0);
+ } else if ((b1 & 0xf8) == 0xf0) {
+ // 4-byte sequence: 11101110wwwwzzzzyy + 110111yyyyxxxxxx
+ // = 11110uuu 10uuzzzz 10yyyyyy 10xxxxxx
+ // (uuuuu = wwww + 1)
+ // "Surrogate Pairs" ... from the "Astral Planes"
+ // Unicode 3.1 assigned the first characters there
+ int iso646 = b1 & 07;
+ iso646 = (iso646 << 6) + getNextUtf8Byte (i++, count);
+ iso646 = (iso646 << 6) + getNextUtf8Byte (i++, count);
+ iso646 = (iso646 << 6) + getNextUtf8Byte (i++, count);
+
+ if (iso646 <= 0xffff) {
+ encodingError ("Illegal four byte UTF-8 sequence",
+ iso646, 0);
+ } else {
+ if (iso646 > 0x0010ffff)
+ encodingError (
+ "UTF-8 value out of range for Unicode",
+ iso646, 0);
+ iso646 -= 0x010000;
+ readBuffer [j++] = (char) (0xd800 | (iso646 >> 10));
+ readBuffer [j++] = (char) (0xdc00 | (iso646 & 0x03ff));
+ continue;
+ }
+ } else {
+ // The five and six byte encodings aren't supported;
+ // they exceed the Unicode (and XML) range.
+ encodingError (
+ "unsupported five or six byte UTF-8 sequence",
+ 0xff & b1, i);
+ // NOTREACHED
+ c = 0;
+ }
+ } else {
+ // 1-byte sequence: 000000000xxxxxxx = 0xxxxxxx
+ // (US-ASCII character, "common" case, one branch to here)
+ c = (char) b1;
+ }
+ readBuffer [j++] = c;
+ if (c == '\r')
+ sawCR = true;
+ }
+ // How many characters have we read?
+ readBufferLength = j;
+ }
+
+
+ /**
+ * Return the next byte value in a UTF-8 sequence.
+ * If it is not possible to get a byte from the current
+ * entity, throw an exception.
+ * @param pos The current position in the rawReadBuffer.
+ * @param count The number of bytes in the rawReadBuffer
+ * @return The significant six bits of a non-initial byte in
+ * a UTF-8 sequence.
+ * @exception EOFException If the sequence is incomplete.
+ */
+ private int getNextUtf8Byte (int pos, int count)
+ throws SAXException, IOException
+ {
+ int val;
+
+ // Take a character from the buffer
+ // or from the actual input stream.
+ if (pos < count) {
+ val = rawReadBuffer [pos];
+ } else {
+ val = is.read ();
+ if (val == -1) {
+ encodingError ("unfinished multi-byte UTF-8 sequence at EOF",
+ -1, pos);
+ }
+ }
+
+ // Check for the correct bits at the start.
+ if ((val & 0xc0) != 0x80) {
+ encodingError ("bad continuation of multi-byte UTF-8 sequence",
+ val, pos + 1);
+ }
+
+ // Return the significant bits.
+ return (val & 0x3f);
+ }
+
+
+ /**
+ * Convert a buffer of US-ASCII or ISO-8859-1-encoded bytes into
+ * UTF-16 characters.
+ *
+ * <p>When readDataChunk () calls this method, the raw bytes are in
+ * rawReadBuffer, and the final characters will appear in
+ * readBuffer.
+ *
+ * @param count The number of bytes to convert.
+ * @param mask For ASCII conversion, 0x7f; else, 0xff.
+ * @see #readDataChunk
+ * @see #rawReadBuffer
+ * @see #readBuffer
+ */
+ private void copyIso8859_1ReadBuffer (int count, char mask)
+ throws IOException
+ {
+ int i, j;
+ for (i = 0, j = readBufferPos; i < count; i++, j++) {
+ char c = (char) (rawReadBuffer [i] & 0xff);
+ if ((c & mask) != 0)
+ throw new CharConversionException ("non-ASCII character U+"
+ + Integer.toHexString (c));
+ readBuffer [j] = c;
+ if (c == '\r') {
+ sawCR = true;
+ }
+ }
+ readBufferLength = j;
+ }
+
+
+ /**
+ * Convert a buffer of UCS-2-encoded bytes into UTF-16 characters
+ * (as used in Java string manipulation).
+ *
+ * <p>When readDataChunk () calls this method, the raw bytes are in
+ * rawReadBuffer, and the final characters will appear in
+ * readBuffer.
+ * @param count The number of bytes to convert.
+ * @param shift1 The number of bits to shift byte 1.
+ * @param shift2 The number of bits to shift byte 2
+ * @see #readDataChunk
+ * @see #rawReadBuffer
+ * @see #readBuffer
+ */
+ private void copyUcs2ReadBuffer (int count, int shift1, int shift2)
+ throws SAXException
+ {
+ int j = readBufferPos;
+
+ if (count > 0 && (count % 2) != 0) {
+ encodingError ("odd number of bytes in UCS-2 encoding", -1, count);
+ }
+ // The loops are faster with less internal brancing; hence two
+ if (shift1 == 0) { // "UTF-16-LE"
+ for (int i = 0; i < count; i += 2) {
+ char c = (char) (rawReadBuffer [i + 1] << 8);
+ c |= 0xff & rawReadBuffer [i];
+ readBuffer [j++] = c;
+ if (c == '\r')
+ sawCR = true;
+ }
+ } else { // "UTF-16-BE"
+ for (int i = 0; i < count; i += 2) {
+ char c = (char) (rawReadBuffer [i] << 8);
+ c |= 0xff & rawReadBuffer [i + 1];
+ readBuffer [j++] = c;
+ if (c == '\r')
+ sawCR = true;
+ }
+ }
+ readBufferLength = j;
+ }
+
+
+ /**
+ * Convert a buffer of UCS-4-encoded bytes into UTF-16 characters.
+ *
+ * <p>When readDataChunk () calls this method, the raw bytes are in
+ * rawReadBuffer, and the final characters will appear in
+ * readBuffer.
+ * <p>Java has Unicode chars, and this routine uses surrogate pairs
+ * for ISO-10646 values between 0x00010000 and 0x000fffff. An
+ * exception is thrown if the ISO-10646 character has no Unicode
+ * representation.
+ *
+ * @param count The number of bytes to convert.
+ * @param shift1 The number of bits to shift byte 1.
+ * @param shift2 The number of bits to shift byte 2
+ * @param shift3 The number of bits to shift byte 2
+ * @param shift4 The number of bits to shift byte 2
+ * @see #readDataChunk
+ * @see #rawReadBuffer
+ * @see #readBuffer
+ */
+ private void copyUcs4ReadBuffer (int count, int shift1, int shift2,
+ int shift3, int shift4)
+ throws SAXException
+ {
+ int j = readBufferPos;
+
+ if (count > 0 && (count % 4) != 0) {
+ encodingError (
+ "number of bytes in UCS-4 encoding not divisible by 4",
+ -1, count);
+ }
+ for (int i = 0; i < count; i += 4) {
+ int value = (((rawReadBuffer [i] & 0xff) << shift1) |
+ ((rawReadBuffer [i + 1] & 0xff) << shift2) |
+ ((rawReadBuffer [i + 2] & 0xff) << shift3) |
+ ((rawReadBuffer [i + 3] & 0xff) << shift4));
+ if (value < 0x0000ffff) {
+ readBuffer [j++] = (char) value;
+ if (value == (int) '\r') {
+ sawCR = true;
+ }
+ } else if (value < 0x0010ffff) {
+ value -= 0x010000;
+ readBuffer [j++] = (char) (0xd8 | ((value >> 10) & 0x03ff));
+ readBuffer [j++] = (char) (0xdc | (value & 0x03ff));
+ } else {
+ encodingError ("UCS-4 value out of range for Unicode",
+ value, i);
+ }
+ }
+ readBufferLength = j;
+ }
+
+
+ /**
+ * Report a character encoding error.
+ */
+ private void encodingError (String message, int value, int offset)
+ throws SAXException
+ {
+ if (value != -1)
+ message = message + " (character code: 0x" +
+ Integer.toHexString (value) + ')';
+ error (message);
+ }
+
+
+ //////////////////////////////////////////////////////////////////////
+ // Local Variables.
+ //////////////////////////////////////////////////////////////////////
+
+ /**
+ * Re-initialize the variables for each parse.
+ */
+ private void initializeVariables ()
+ {
+ // First line
+ line = 1;
+ column = 0;
+
+ // Set up the buffers for data and names
+ dataBufferPos = 0;
+ dataBuffer = new char [DATA_BUFFER_INITIAL];
+ nameBufferPos = 0;
+ nameBuffer = new char [NAME_BUFFER_INITIAL];
+
+ // Set up the DTD hash tables
+ elementInfo = new Hashtable ();
+ entityInfo = new Hashtable ();
+ notationInfo = new Hashtable ();
+ skippedPE = false;
+
+ // Set up the variables for the current
+ // element context.
+ currentElement = null;
+ currentElementContent = CONTENT_UNDECLARED;
+
+ // Set up the input variables
+ sourceType = INPUT_NONE;
+ inputStack = new Stack ();
+ entityStack = new Stack ();
+ externalEntity = null;
+ tagAttributePos = 0;
+ tagAttributes = new String [100];
+ rawReadBuffer = new byte [READ_BUFFER_MAX];
+ readBufferOverflow = -1;
+
+ scratch = new InputSource ();
+
+ inLiteral = false;
+ expandPE = false;
+ peIsError = false;
+
+ doReport = false;
+
+ inCDATA = false;
+
+ symbolTable = new Object [SYMBOL_TABLE_LENGTH][];
+ }
+
+
+ //
+ // The current XML handler interface.
+ //
+ private SAXDriver handler;
+
+ //
+ // I/O information.
+ //
+ private Reader reader; // current reader
+ private InputStream is; // current input stream
+ private int line; // current line number
+ private int column; // current column number
+ private int sourceType; // type of input source
+ private Stack inputStack; // stack of input soruces
+ private URLConnection externalEntity; // current external entity
+ private int encoding; // current character encoding
+ private int currentByteCount; // bytes read from current source
+ private InputSource scratch; // temporary
+
+ //
+ // Buffers for decoded but unparsed character input.
+ //
+ private char readBuffer [];
+ private int readBufferPos;
+ private int readBufferLength;
+ private int readBufferOverflow; // overflow from last data chunk.
+
+
+ //
+ // Buffer for undecoded raw byte input.
+ //
+ private final static int READ_BUFFER_MAX = 16384;
+ private byte rawReadBuffer [];
+
+
+ //
+ // Buffer for attribute values, char refs, DTD stuff.
+ //
+ private static int DATA_BUFFER_INITIAL = 4096;
+ private char dataBuffer [];
+ private int dataBufferPos;
+
+ //
+ // Buffer for parsed names.
+ //
+ private static int NAME_BUFFER_INITIAL = 1024;
+ private char nameBuffer [];
+ private int nameBufferPos;
+
+ //
+ // Save any standalone flag
+ //
+ private boolean docIsStandalone;
+
+ //
+ // Hashtables for DTD information on elements, entities, and notations.
+ // Populated until we start ignoring decls (because of skipping a PE)
+ //
+ private Hashtable elementInfo;
+ private Hashtable entityInfo;
+ private Hashtable notationInfo;
+ private boolean skippedPE;
+
+
+ //
+ // Element type currently in force.
+ //
+ private String currentElement;
+ private int currentElementContent;
+
+ //
+ // Stack of entity names, to detect recursion.
+ //
+ private Stack entityStack;
+
+ //
+ // PE expansion is enabled in most chunks of the DTD, not all.
+ // When it's enabled, literals are treated differently.
+ //
+ private boolean inLiteral;
+ private boolean expandPE;
+ private boolean peIsError;
+
+ //
+ // can't report entity expansion inside two constructs:
+ // - attribute expansions (internal entities only)
+ // - markup declarations (parameter entities only)
+ //
+ private boolean doReport;
+
+ //
+ // Symbol table, for caching interned names.
+ //
+ // These show up wherever XML names or nmtokens are used: naming elements,
+ // attributes, PIs, notations, entities, and enumerated attribute values.
+ //
+ // NOTE: This hashtable doesn't grow. The default size is intended to be
+ // rather large for most documents. Example: one snapshot of the DocBook
+ // XML 4.1 DTD used only about 350 such names. As a rule, only pathological
+ // documents (ones that don't reuse names) should ever see much collision.
+ //
+ // Be sure that SYMBOL_TABLE_LENGTH always stays prime, for best hashing.
+ // "2039" keeps the hash table size at about two memory pages on typical
+ // 32 bit hardware.
+ //
+ private final static int SYMBOL_TABLE_LENGTH = 2039;
+
+ private Object symbolTable [][];
+
+ //
+ // Hash table of attributes found in current start tag.
+ //
+ private String tagAttributes [];
+ private int tagAttributePos;
+
+ //
+ // Utility flag: have we noticed a CR while reading the last
+ // data chunk? If so, we will have to go back and normalise
+ // CR or CR/LF line ends.
+ //
+ private boolean sawCR;
+
+ //
+ // Utility flag: are we in CDATA? If so, whitespace isn't ignorable.
+ //
+ private boolean inCDATA;
+}
diff --git a/external/jaxp/source/gnu/xml/aelfred2/XmlReader.java b/external/jaxp/source/gnu/xml/aelfred2/XmlReader.java
new file mode 100644
index 000000000..e9bd98118
--- /dev/null
+++ b/external/jaxp/source/gnu/xml/aelfred2/XmlReader.java
@@ -0,0 +1,308 @@
+/*
+ * $Id: XmlReader.java,v 1.1 2003-02-01 02:10:13 cbj Exp $
+ * Copyright (C) 1999-2001 David Brownell
+ *
+ * This file is part of GNU JAXP, a library.
+ *
+ * GNU JAXP is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * GNU JAXP is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ * As a special exception, if you link this library with other files to
+ * produce an executable, this library does not by itself cause the
+ * resulting executable to be covered by the GNU General Public License.
+ * This exception does not however invalidate any other reasons why the
+ * executable file might be covered by the GNU General Public License.
+ */
+
+package gnu.xml.aelfred2;
+
+import java.io.IOException;
+import java.util.Locale;
+
+import org.xml.sax.*;
+import org.xml.sax.ext.*;
+
+import gnu.xml.pipeline.EventFilter;
+import gnu.xml.pipeline.ValidationConsumer;
+
+
+// $Id: XmlReader.java,v 1.1 2003-02-01 02:10:13 cbj Exp $
+
+/**
+ * This SAX2 parser optionally layers a validator over the &AElig;lfred2
+ * SAX2 parser. While this will not evaluate every XML validity constraint,
+ * it does support all the validity constraints that are of any real utility
+ * outside the strict SGML-compatible world. See the documentation for the
+ * SAXDriver class for information about the SAX2 features and properties
+ * that are supported, and documentation for the ValidationConsumer for
+ * information about what validity constraints may not be supported.
+ * (&AElig;lfred2 tests some of those, even in non-validating mode, to
+ * achieve better conformance.)
+ *
+ * <p> Note that due to its internal construction, you can't change most
+ * handlers until parse() returns. This diverges slightly from SAX, which
+ * expects later binding to be supported. Early binding involves less
+ * runtime overhead, which is an issue for event pipelines as used inside
+ * this parser. Rather than relying on the parser to handle late binding
+ * to your own handlers, do it yourself.
+ *
+ * @see SAXDriver
+ * @see gnu.xml.pipeline.ValidationConsumer
+ *
+ * @author David Brownell
+ * @version $Date: 2003-02-01 02:10:13 $
+ */
+public final class XmlReader implements XMLReader
+{
+ private SAXDriver aelfred2 = new SAXDriver ();
+ private EventFilter filter = new EventFilter ();
+ private boolean isValidating;
+ private boolean active;
+
+
+ /** Constructs a SAX Parser. */
+ public XmlReader ()
+ { }
+
+ /**
+ * Constructs a SAX Parser, optionally treating validity errors
+ * as if they were fatal errors.
+ */
+ public XmlReader (boolean invalidIsFatal)
+ {
+ if (invalidIsFatal)
+ setErrorHandler (new DefaultHandler2 () {
+ public void error (SAXParseException e)
+ throws SAXException
+ { throw e; }
+ });
+ }
+
+ /**
+ * <b>SAX2</b>: Returns the object used to report the logical
+ * content of an XML document.
+ */
+ public ContentHandler getContentHandler ()
+ { return filter.getContentHandler (); }
+
+ /**
+ * <b>SAX2</b>: Assigns the object used to report the logical
+ * content of an XML document.
+ * @exception IllegalStateException if called mid-parse
+ */
+ public void setContentHandler (ContentHandler handler)
+ {
+ if (active)
+ throw new IllegalStateException ("already parsing");
+ filter.setContentHandler (handler);
+ }
+
+ /**
+ * <b>SAX2</b>: Returns the object used to process declarations related
+ * to notations and unparsed entities.
+ */
+ public DTDHandler getDTDHandler ()
+ { return filter.getDTDHandler (); }
+
+ /**
+ * <b>SAX1</b> Assigns DTD handler
+ * @exception IllegalStateException if called mid-parse
+ */
+ public void setDTDHandler (DTDHandler handler)
+ {
+ if (active)
+ throw new IllegalStateException ("already parsing");
+ filter.setDTDHandler (handler);
+ }
+
+ /**
+ * <b>SAX2</b>: Returns the object used when resolving external
+ * entities during parsing (both general and parameter entities).
+ */
+ public EntityResolver getEntityResolver ()
+ { return aelfred2.getEntityResolver (); }
+
+ /** <b>SAX1</b> Assigns parser's entity resolver */
+ public void setEntityResolver (EntityResolver handler)
+ { aelfred2.setEntityResolver (handler); }
+
+ /**
+ * <b>SAX2</b>: Returns the object used to receive callbacks for XML
+ * errors of all levels (fatal, nonfatal, warning); this is never null;
+ */
+ public ErrorHandler getErrorHandler ()
+ { return aelfred2.getErrorHandler (); }
+
+ /**
+ * <b>SAX1</b> Assigns error handler
+ * @exception IllegalStateException if called mid-parse
+ */
+ public void setErrorHandler (ErrorHandler handler)
+ {
+ if (active)
+ throw new IllegalStateException ("already parsing");
+ aelfred2.setErrorHandler (handler);
+ }
+
+ /**
+ * <b>SAX2</b>: Assigns the specified property.
+ * @exception IllegalStateException if called mid-parse
+ */
+ public void setProperty (String propertyId, Object value)
+ throws SAXNotRecognizedException, SAXNotSupportedException
+ {
+ if (active)
+ throw new IllegalStateException ("already parsing");
+ if (getProperty (propertyId) != value)
+ filter.setProperty (propertyId, value);
+ }
+
+ /**
+ * <b>SAX2</b>: Returns the specified property.
+ */
+ public Object getProperty (String propertyId)
+ throws SAXNotRecognizedException
+ {
+ if ((SAXDriver.PROPERTY + "declaration-handler")
+ .equals (propertyId)
+ || (SAXDriver.PROPERTY + "lexical-handler")
+ .equals (propertyId))
+ return filter.getProperty (propertyId);
+ throw new SAXNotRecognizedException (propertyId);
+ }
+
+ private void forceValidating ()
+ throws SAXNotRecognizedException, SAXNotSupportedException
+ {
+ aelfred2.setFeature (
+ SAXDriver.FEATURE + "namespace-prefixes",
+ true);
+ aelfred2.setFeature (
+ SAXDriver.FEATURE + "external-general-entities",
+ true);
+ aelfred2.setFeature (
+ SAXDriver.FEATURE + "external-parameter-entities",
+ true);
+ }
+
+ /**
+ * <b>SAX2</b>: Sets the state of features supported in this parser.
+ * Note that this parser requires reporting of namespace prefixes when
+ * validating.
+ */
+ public void setFeature (String featureId, boolean state)
+ throws SAXNotRecognizedException, SAXNotSupportedException
+ {
+ boolean value = getFeature (featureId);
+
+ if (state == value)
+ return;
+
+ if ((SAXDriver.FEATURE + "validation").equals (featureId)) {
+ if (active)
+ throw new SAXNotSupportedException ("already parsing");
+ if (state)
+ forceValidating ();
+ isValidating = state;
+ } else
+ aelfred2.setFeature (featureId, state);
+ }
+
+ /**
+ * <b>SAX2</b>: Tells whether this parser supports the specified feature.
+ * At this time, this directly parallels the underlying SAXDriver,
+ * except that validation is optionally supported.
+ *
+ * @see SAXDriver
+ */
+ public boolean getFeature (String featureId)
+ throws SAXNotRecognizedException, SAXNotSupportedException
+ {
+ if ((SAXDriver.FEATURE + "validation").equals (featureId))
+ return isValidating;
+
+ return aelfred2.getFeature (featureId);
+ }
+
+ /**
+ * <b>SAX1</b>: Sets the locale used for diagnostics; currently,
+ * only locales using the English language are supported.
+ * @param locale The locale for which diagnostics will be generated
+ */
+ public void setLocale (Locale locale)
+ throws SAXException
+ { aelfred2.setLocale (locale); }
+
+ /**
+ * <b>SAX1</b>: Preferred API to parse an XML document, using a
+ * system identifier (URI).
+ */
+ public void parse (String systemId)
+ throws SAXException, IOException
+ {
+ parse (new InputSource (systemId));
+ }
+
+ /**
+ * <b>SAX1</b>: Underlying API to parse an XML document, used
+ * directly when no URI is available. When this is invoked,
+ * and the parser is set to validate, some features will be
+ * automatically reset to appropriate values: for reporting
+ * namespace prefixes, and incorporating external entities.
+ *
+ * @param source The XML input source.
+ *
+ * @exception IllegalStateException if called mid-parse
+ * @exception SAXException The handlers may throw any SAXException,
+ * and the parser normally throws SAXParseException objects.
+ * @exception IOException IOExceptions are normally through through
+ * the parser if there are problems reading the source document.
+ */
+ public void parse (InputSource source)
+ throws SAXException, IOException
+ {
+ EventFilter next;
+ boolean nsdecls;
+
+ synchronized (aelfred2) {
+ if (active)
+ throw new IllegalStateException ("already parsing");
+ active = true;
+ }
+
+ // set up the output pipeline
+ if (isValidating) {
+ forceValidating ();
+ next = new ValidationConsumer (filter);
+ } else
+ next = filter;
+
+ // connect pipeline and error handler
+ // don't let _this_ call to bind() affect xmlns* attributes
+ nsdecls = aelfred2.getFeature (
+ SAXDriver.FEATURE + "namespace-prefixes");
+ EventFilter.bind (aelfred2, next);
+ if (!nsdecls)
+ aelfred2.setFeature (
+ SAXDriver.FEATURE + "namespace-prefixes",
+ false);
+
+ // parse, clean up
+ try {
+ aelfred2.parse (source);
+ } finally {
+ active = false;
+ }
+ }
+}
diff --git a/external/jaxp/source/gnu/xml/aelfred2/package.html b/external/jaxp/source/gnu/xml/aelfred2/package.html
new file mode 100644
index 000000000..b521791f9
--- /dev/null
+++ b/external/jaxp/source/gnu/xml/aelfred2/package.html
@@ -0,0 +1,477 @@
+<!DOCTYPE html PUBLIC
+ '-//W3C//DTD XHTML 1.0 Transitional//EN'
+ 'http://www.w3.org/TR/xhtml1/DTD/transitional.dtd'>
+
+<html><head>
+ <title>package overview</title>
+<!--
+/*
+ * Copyright (c) 1999-2001 by David Brownell.
+ * This file is distributed under the GPL.
+ *
+ * $Id: package.html,v 1.1 2003-02-01 02:10:13 cbj Exp $
+ */
+-->
+</head><body>
+
+<p> This package contains &AElig;lfred2, which includes an
+enhanced SAX2-compatible version of the &AElig;lfred
+non-validating XML parser, a modular (and hence optional)
+DTD validating parser, and modular (and hence optional)
+JAXP glue to those.
+Use these like any other SAX2 parsers. </p>
+
+<ul>
+ <li><a href="#about">About &AElig;lfred</a><ul>
+ <li><a href="#principles">Design Principles</a></li>
+ <li><a href="#name">About the Name &AElig;lfred</a></li>
+ <li><a href="#encodings">Character Encodings</a></li>
+ <li><a href="#violations">Known Conformance Violations</a></li>
+ <li><a href="#license">Licensing</a></li>
+ </ul></li>
+
+ <li><a href="#changes">Changes Since the Last Microstar Release</a><ul>
+ <li><a href="#sax2">SAX2 Support</a></li>
+ <li><a href="#validation">Validation</a></li>
+ <li><a href="#smaller">You Want Smaller?</a></li>
+ <li><a href="#bugfixes">Bugs Fixed</a></li>
+ </ul></li>
+
+</ul>
+
+<p> Some of the documentation below was modified from the original
+&AElig;lfred README.txt file. All of it has been updated. </p>
+
+
+<h2><a name="about">About &AElig;lfred</a></h2>
+
+<p>&AElig;lfred is a Java-based XML parser originally from
+Microstar Software Limited (no longer in existence) and
+more or less placed into the public domain.
+
+
+<h3><a name="principles">Design Principles</a></h3>
+
+<p>In most Java applets and applications, XML should not be the central
+feature; instead, XML is the means to another end, such as loading
+configuration information, reading meta-data, or parsing transactions.</p>
+
+<p> When an XML parser is only a single component of a much larger
+program, it cannot be large, slow, or resource-intensive. With Java
+applets, in particular, code size is a significant issue. The standard
+modem is still not operating at 56 Kbaud, or sometimes even with data
+compression. Assuming an uncompressed 28.8 Kbaud modem, only about
+3 KBytes can be downloaded in one second; compression often doubles
+that speed, but a V.90 modem may not provide another doubling. When
+used with embedded processors, similar size concerns apply. </p>
+
+<p> &AElig;lfred is designed for easy and efficient use over the Internet,
+based on the following principles: </p> <ol>
+
+<li> &AElig;lfred must be as small as possible, so that it doesn't add too
+ much to an applet's download time. </li>
+
+<li> &AElig;lfred must use as few class files as possible, to minimize the
+ number of HTTP connections necessary. (The use of JAR files has made this
+ be less of a concern.) </li>
+
+<li> &AElig;lfred must be compatible with most or all Java implementations
+ and platforms. (Write once, run anywhere.) </li>
+
+<li> &AElig;lfred must use as little memory as possible, so that it does
+ not take away resources from the rest of your program. (It doesn't force
+ you to use DOM or a similar costly data structure API.)</li>
+
+<li> &AElig;lfred must run as fast as possible, so that it does not slow down
+ the rest of your program. </li>
+
+<li> &AElig;lfred must produce correct output for well-formed and valid
+ documents, but need not reject every document that is not valid or
+ not well-formed. (In &AElig;lfred2, correctness was a bigger concern
+ than in the original version; and a validation option is available.) </li>
+
+<li> &AElig;lfred must provide full internationalization from the first
+ release. (&AElig;lfred2 now automatically handles all encodings
+ supported by the underlying JVM; previous versions handled only
+ UTF-8, UTF_16, ASCII, and ISO-8859-1.)</li>
+
+</ol>
+
+<p>As you can see from this list, &AElig;lfred is designed for production
+use, but neither validation nor perfect conformance was a requirement.
+Good validating parsers exist, including one in this package,
+and you should use them as appropriate. (See conformance reviews
+available at <a href="http://www.xml.com/">http://www.xml.com</a>)
+</p>
+
+<p> One of the main goals of &AElig;lfred2 was to significantly improve
+conformance, while not significantly affecting the other goals stated above.
+Since the only use of this parser is with SAX, some classes could be
+removed, and so the overall size of &AElig;lfred was actually reduced.
+Subsequent performance work produced a notable speedup (over twenty
+percent on larger files). That is, the tradeoffs between speed, size, and
+conformance were re-targeted towards conformance and support of newer APIs
+(SAX2), with a a positive performance impact. </p>
+
+<p> The role anticipated for this version of &AElig;lfred is as a
+lightweight Free Software SAX parser that can be used in essentially every
+Java program where the handful of conformance violations (noted below)
+are acceptable.
+That certainly includes applets, and
+nowadays one must also mention embedded systems as being even more
+size-critical.
+At this writing, all parsers that are more conformant are
+significantly larger, even when counting the optional
+validation support in this version of &AElig;lfred. </p>
+
+
+<h3><a name="name">About the Name <em>&AElig;lfred</em></a></h3>
+
+<p>&AElig;lfred the Great (AElfred in ASCII) was King of Wessex, and
+some say of King of England, at the time of his death in 899 AD.
+&AElig;lfred introduced a wide-spread literacy program in the hope that
+his people would learn to read English, at least, if Latin was too
+difficult for them. This &AElig;lfred hopes to bring another sort of
+literacy to Java, using XML, at least, if full SGML is too difficult.</p>
+
+<p>The initial &AElig; ligature ("AE)" is also a reminder that XML is
+not limited to ASCII.</p>
+
+
+<h3><a name="encodings">Character Encodings</a></h3>
+
+<p> The &AElig;lfred parser currently builds in support for a handful
+of input encodings. Of course these include UTF-8 and UTF-16, which
+all XML parsers are required to support:</p> <ul>
+
+ <li> UTF-8 ... the standard eight bit encoding, used unless
+ you provide an encoding declaration or a MIME charset tag.</li>
+
+ <li> US-ASCII ... an extremely common seven bit encoding,
+ which happens to be a subset of UTF-8 and ISO-8859-1 as well
+ as many other encodings. XHTML web pages using US-ASCII
+ (without an encoding declaration) are probably more
+ widely interoperable than those in any other encoding. </li>
+
+ <li> ISO-8859-1 ... includes accented characters used in
+ much of western Europe (but excluding the Euro currency
+ symbol).</li>
+
+ <li> UTF-16 ... with several variants, this encodes each
+ sixteen bit Unicode character in sixteen bits of output.
+ Variants include UTF-16BE (big endian, no byte order mark),
+ UTF-16LE (little endian, no byte order mark), and
+ ISO-10646-UCS-2 (an older and less used encoding, using a
+ version of Unicode without surrogate pairs). This is
+ essentially the native encoding used by Java. </li>
+
+ <li> ISO-10646-UCS-4 ... a seldom-used four byte encoding,
+ also known as UTF-32BE. Four byte order variants are supported,
+ including one known as UTF-32LE. Some operating systems
+ standardized on UCS-4 despite its significant size penalty,
+ in anticipation that Unicode (even with surrogate pairs)
+ would eventually become limiting. UCS-4 permits encoding
+ of non-Unicode characters, which Java can't represent (and
+ XML doesn't allow).
+ </li>
+
+ </ul>
+
+<p> If you use any encoding other than UTF-8 or UTF-16 you should
+make sure to label your data appropriately: </p>
+
+<blockquote>
+&lt;?xml version="1.0" encoding="<b>ISO-8859-15</b>"?&gt;
+</blockquote>
+
+<p> Encodings accessed through <code>java.io.InputStreamReader</code>
+are now fully supported for both external labels (such as MIME types)
+and internal types (as shown above).
+There is one limitation in the support for internal labels:
+the encodings must be derived from the US-ASCII encoding,
+the EBCDIC family of encodings is not recognized.
+Note that Java defines its
+own encoding names, which don't always correspond to the standard
+Internet encoding names defined by the IETF/IANA, and that Java
+may even <em>require</em> use of nonstandard encoding names.
+Please report
+such problems; some of them can be worked around in this parser,
+and many can be worked around by using external labels.
+</p>
+
+<p>Note that if you are using the Euro symbol with an fixed length
+eight bit encoding, you should probably be using the encoding label
+<em>iso-8859-15</em> or, with a Microsoft OS, <em>cp-1252</em>.
+Of course, UTF-8 and UTF-16 handle the Euro symbol directly.
+</p>
+
+
+<h3><a name="violations">Known Conformance Violations</a></h3>
+
+<p>Known conformance issues should be of negligible importance for
+most applications, and include: </p><ul>
+
+ <li> Rather than following the voluminous "Appendix B" rules about
+ what characters may appear in names (and name tokens), the Unicode
+ rules embedded in <em>java.lang.Character</em> are used.
+ This means mostly that some names are inappropriately accepted,
+ though a few are inappropriately rejected. (It's much simpler
+ to avoid that much special case code. Recent OASIS/NIST test
+ cases may have these rules be realistically testable.) </li>
+
+ <li> Text containing "]]&gt;" is not rejected unless it fully resides
+ in an internal buffer ... which is, thankfully, the typical case. This
+ text is illegal, but sometimes appears in illegal attempts to
+ nest CDATA sections. (Not catching that boundary condition
+ substantially simplifies parsing text.) </li>
+
+ <li> Surrogate characters that aren't correctly paired are ignored
+ rather than rejected, unless they were encoded using UTF-8. (This
+ simplifies parsing text.) Unicode 3.1 assigned the first characters
+ to those character codes, in early 2001, so few documents (or tools)
+ use such characters in any case. </li>
+
+ <li> Declarations following references to an undefined parameter
+ entity reference are not ignored. (Not maintaining and using state
+ about this validity error simplifies declaration handling; few
+ XML parsers address this constraint in any case.) </li>
+
+ <li> Well formedness constraints for general entity references
+ are not enforced. (The code to handle the "content" production
+ is merged with the element parsing code, making it hard to reuse
+ for this additional situation.) </li>
+
+</ul>
+
+<p> When tested against the July 12, 1999 version of the OASIS
+XML Conformance test suite, an earlier version passed 1057 of 1067 tests.
+That contrasts with the original version, which passed 867. The
+current parser is top-ranked in terms of conformance, as is its
+validating sibling (which has some additional conformance violations
+imposed on it by SAX2 API deficiencies as well as some of the more
+curious SGML layering artifacts found in the XML specification). </p>
+
+<p> The XML 1.0 specification itself was not without problems,
+and after some delays the W3C has come out with a revised
+"second edition" specification. While that doesn't resolve all
+the problems identified the XML specification, many of the most
+egregious problems have been resolved. (You still need to drink
+magic Kool-Aid before some DTD-related issues make sense.)
+To the extent possible, this parser conforms to that second
+edition specification, and does well against corrected versions
+of the OASIS/NIST XML conformance test cases. See <a href=
+"http://xmlconf.sourceforge.net">http://xmlconf.sourceforge.net</a>
+for more information about SAX2/XML conformance testing. </p>
+
+
+<h3><a name="licensing">Licensing</a></h3>
+
+<p> As noted above, the original distribution was more or less
+public domain. The license had the constraint that modifications
+be clearly documented, as has been done here. </p>
+
+<p> This version is Copyright (c) 1999-2001 by David Brownell,
+and all the modifications are distributed under the GNU General
+Public License (GPL). It is subject to the "Library Exception",
+supporting use in some environments (such as embedded systems where
+dynamic linking may not be available) by proprietary code without
+necessarily requiring all code to be licencsed under the GPL.
+</p>
+
+
+<h2><a name="changes">Changes Since the last Microstar Release</a></h2>
+
+<p> As noted above, Microstar has not updated this parser since
+the summer of 1998, when it released version 1.2a on its web site.
+This release is intended to benefit the developer community by
+refocusing the API on SAX2, and improving conformance to the extent
+that most developers should not need to use another XML parser. </p>
+
+<p> The code has been cleaned up (referring to the XML 1.0 spec in
+all the production numbers in
+comments, rather than some preliminary draft, for one example) and
+has been sped up a bit as well.
+JAXP support has been added, although developers are still
+strongly encouraged to use the SAX2 APIs directly. </p>
+
+
+<h3><a name="sax2">SAX2 Support</a></h3>
+
+<p> The original version of &AElig;lfred did not support the
+SAX2 APIs. </p>
+
+<p> This version supports the SAX2 APIs, exposing the standard
+boolean feature descriptors. It supports the "DeclHandler" property
+to provide access to all DTD declarations not already exposed
+through the SAX1 API. The "LexicalHandler" property is supported,
+exposing entity boundaries (including the unnamed external subset) and
+things like comments and CDATA boundaries. SAX1 compatibility is
+currently provided.</p>
+
+
+<h3><a name="validation">Validation</a></h3>
+
+<p> In the 'pipeline' package in this same software distribution is an
+<a href="../pipeline/ValidationConsumer.html">XML Validation component</a>
+using any full SAX2 event stream (including all document type declarations)
+to validate. There is now a <a href="XmlReader.html">XmlReader</a> class
+which combines that class and this enhanced &AElig;lfred parser, creating
+an optionally validating SAX2 parser. </p>
+
+<p> As noted in the documentation for that validating component, certain
+validity constraints can't reliably be tested by a layered validator.
+These include all constraints relying on
+layering violations (exposing XML at the level of tokens or below,
+required since XML isn't a context-free grammar), some that
+SAX2 doesn't support, and a few others. The resulting validating
+parser is conformant enough for most applications that aren't doing
+strange SGML tricks with DTDs.
+Moreover, that validating filter can be used without
+a parser ... any application component that emits SAX event streams
+can DTD-validate its output on demand. </p>
+
+<h3><a name="smaller">You want Smaller?</a></h3>
+
+<p> You'll have noticed that the original version of &AElig;lfred
+had small size as a top goal. &AElig;lfred2 normally includes a
+DTD validation layer, but you can package without that.
+Similarly, JAXP factory support is available but optional.
+Then the main added cost due to this revision are for
+supporting the SAX2 API itself; DTD validation is as
+cleanly layered as allowed by SAX2.</p>
+
+<h3><a name="bugfixes">Bugs Fixed</a></h3>
+
+<p> Bugs fixed in &AElig;lfred2 include: </p>
+
+<ol>
+ <li> Originally &AElig;lfred didn't close file descriptors, which
+ led to file descriptor leakage on programs which ran for any
+ length of time. </li>
+
+ <li> NOTATION declarations without system identifiers are
+ now handled correctly. </li>
+
+ <li> DTD events are now reported for all invocations of a
+ given parser, not just the first one. </li>
+
+ <li> More correct character handling: <ul>
+
+ <li> Rejects out-of-range characters, both in text and in
+ character references. </li>
+
+ <li> Correctly handles character references that expand to
+ surrogate pairs. </li>
+
+ <li> Correctly handles UTF-8 encodings of surrogate pairs. </li>
+
+ <li> Correctly handles Unicode 3.1 rules about illegal UTF-8
+ encodings: there is only one legal encoding per character. </li>
+
+ <li> PUBLIC identifiers are now rejected if they have illegal
+ characters. </li>
+
+ <li> The parser is more correct about what characters are allowed
+ in names and name tokens. Uses Unicode rules (built in to Java)
+ rather than the voluminous XML rules, although some extensions
+ have been made to match XML rules more closely.</li>
+
+ <li> Line ends are now normalized to newlines in all known
+ cases. </li>
+
+ </ul></li>
+
+ <li> Certain validity errors were previously treated as well
+ formedness violations. <ul>
+
+ <li> Repeated declarations of an element type are no
+ longer fatal errors. </li>
+
+ <li> Undeclared parameter entity references are no longer
+ fatal errors. </li>
+
+ </ul></li>
+
+ <li> Attribute handling is improved: <ul>
+
+ <li> Whitespace must exist between attributes. </li>
+
+ <li> Only one value for a given attribute is permitted. </li>
+
+ <li> ATTLIST declarations don't need to declare attributes. </li>
+
+ <li> Attribute values are normalized when required. </li>
+
+ <li> Tabs in attribute values are normalized to spaces. </li>
+
+ <li> Attribute values containing a literal "&lt;" are rejected. </li>
+
+ </ul></li>
+
+ <li> More correct entity handling: <ul>
+
+ <li> Whitespace must precede NDATA when declaring unparsed
+ entities.</li>
+
+ <li> Parameter entity declarations may not have NDATA annotations. </li>
+
+ <li> The XML specification has a bug in that it doesn't specify
+ that certain contexts exist within which parameter entity
+ expansion must not be performed. Lacking an offical erratum,
+ this parser now disables such expansion inside comments,
+ processing instructions, ignored sections, public identifiers,
+ and parts of entity declarations. </li>
+
+ <li> Entity expansions that include quote characters no longer
+ confuse parsing of strings using such expansions. </li>
+
+ <li> Whitespace in the values of internal entities is not mapped
+ to space characters. </li>
+
+ <li> General Entity references in attribute defaults within the
+ DTD now cause fatal errors when the entity is not defined at the
+ time it is referenced. </li>
+
+ <li> Malformed general entity references in entity declarations are
+ now detected. </li>
+
+ </ul></li>
+
+ <li> Neither conditional sections
+ nor parameter entity references within markup declarations
+ are permitted in the internal subset. </li>
+
+ <li> Processing instructions whose target names are "XML"
+ (ignoring case) are now rejected. </li>
+
+ <li> Comments may not include "--".</li>
+
+ <li> Most "]]&gt;" sequences in text are rejected. </li>
+
+ <li> Correct syntax for standalone declarations is enforced. </li>
+
+ <li> Setting a locale for diagnostics only produces an exception
+ if the language of that locale isn't English. </li>
+
+ <li> Some more encoding names are recognized. These include the
+ Unicode 3.0 variants of UTF-16 (UTF-16BE, UTF-16LE) as well as
+ US-ASCII and a few commonly seen synonyms. </li>
+
+ <li> Text (from character content, PIs, or comments) large enough
+ not to fit into internal buffers is now handled correctly even in
+ some cases which were originally handled incorrectly.</li>
+
+ <li> Content is now reported for element types for which attributes
+ have been declared, but no content model is known. (Such documents
+ are invalid, but may still be well formed.) </li>
+
+</ol>
+
+<p> Other bugs may also have been fixed. </p>
+
+<p> For better overall validation support, some of the validity
+constraints that can't be verified using the SAX2 event stream
+are now reported directly by &AElig;lfred2. </p>
+
+</body></html>
+
diff --git a/external/jaxp/source/gnu/xml/dom/Consumer.java b/external/jaxp/source/gnu/xml/dom/Consumer.java
new file mode 100644
index 000000000..c338424e7
--- /dev/null
+++ b/external/jaxp/source/gnu/xml/dom/Consumer.java
@@ -0,0 +1,331 @@
+/*
+ * $Id: Consumer.java,v 1.1 2003-02-01 02:10:13 cbj Exp $
+ * Copyright (C) 2001 David Brownell
+ *
+ * This file is part of GNU JAXP, a library.
+ *
+ * GNU JAXP is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * GNU JAXP is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ * As a special exception, if you link this library with other files to
+ * produce an executable, this library does not by itself cause the
+ * resulting executable to be covered by the GNU General Public License.
+ * This exception does not however invalidate any other reasons why the
+ * executable file might be covered by the GNU General Public License.
+ */
+
+
+package gnu.xml.dom;
+
+import java.io.IOException;
+
+import org.w3c.dom.Document;
+import org.w3c.dom.DocumentType;
+import org.w3c.dom.DOMImplementation;
+import org.w3c.dom.Node;
+import org.w3c.dom.Text;
+
+import org.xml.sax.Attributes;
+import org.xml.sax.ErrorHandler;
+import org.xml.sax.SAXException;
+import org.xml.sax.ext.Attributes2;
+
+import gnu.xml.pipeline.DomConsumer;
+import gnu.xml.pipeline.EventConsumer;
+
+
+/**
+ * Event consumer which constructs DOM documents using the implementation
+ * in this package, using SAX2 events. This packages various backdoors
+ * into this DOM implementation, as needed to address DOM requirements
+ * that can't be met by strictly conforming implementations of DOM.
+ *
+ * <p> These requirements all relate to {@link DocumentType} nodes and
+ * features of that node type. These features are normally not used,
+ * because that interface only exposes a subset of the information found
+ * in DTDs. More, that subset does not include the most important typing
+ * information. For example, it excludes element content models and
+ * attribute typing. It does expose some entity management issues,
+ * although entity management doesn't relate to document typing.
+ *
+ * <p> Note that SAX2 does not expose the literal text of the DTD's
+ * internal subset, so it will not be present in DOM trees constructed
+ * using this API. (Though with a good SAX2 implementation, it could
+ * be partially recreated...)
+ *
+ * @author David Brownell
+ * @version $Date: 2003-02-01 02:10:13 $
+ */
+public class Consumer extends DomConsumer
+{
+ /**
+ * Constructs an unconfigured event consumer,
+ * as a terminus in a SAX event pipeline.
+ */
+ // used by PipelineFactory [terminus]
+ public Consumer ()
+ throws SAXException
+ {
+ super (DomDocument.class);
+ setHandler (new Backdoor (this));
+ }
+
+ /**
+ * Constructs an unconfigured event consumer,
+ * as a stage in a SAX event pipeline.
+ */
+ // used by PipelineFactory [filter]
+ public Consumer (EventConsumer next)
+ throws SAXException
+ {
+ super (DomDocument.class, next);
+ setHandler (new Backdoor (this));
+ }
+
+ /**
+ * Implements the backdoors needed by DOM.
+ * All methods in this class use implementation-specific APIs that are
+ * implied by the DOM specification (needed to implement testable
+ * behavior) but which are excluded from the DOM specification.
+ */
+ public static class Backdoor extends DomConsumer.Handler
+ {
+ /**
+ * Constructor.
+ * @param consumer must have been initialized to use the
+ * {@link DomDocument} class (or a subclass) for
+ * constructing DOM trees
+ */
+ protected Backdoor (DomConsumer consumer)
+ throws SAXException
+ { super (consumer); }
+
+ // helper routine
+ private DomDoctype getDoctype ()
+ throws SAXException
+ {
+ DomDocument doc = (DomDocument) getDocument ();
+ DocumentType dt = doc.getDoctype ();
+
+ if (dt == null)
+ throw new SAXException ("doctype missing!");
+ return (DomDoctype) dt;
+ }
+
+ // SAX2 "lexical" event
+ public void startDTD (String name, String publicId, String systemId)
+ throws SAXException
+ {
+ DomDocument doc = (DomDocument) getDocument ();
+
+ super.startDTD (name, publicId, systemId);
+ // DOM L2 doctype creation model is bizarre
+ doc.appendChild (new DomDoctype (doc, name, publicId, systemId));
+ }
+
+ // SAX2 "lexical" event
+ public void endDTD ()
+ throws SAXException
+ {
+ super.endDTD ();
+ // DOM L2 has no way to make things readonly
+ getDoctype ().makeReadonly ();
+ }
+
+ // SAX1 DTD event
+ public void notationDecl (
+ String name,
+ String publicId, String systemId
+ ) throws SAXException
+ {
+ // DOM L2 can't create/save notation nodes
+ getDoctype ().declareNotation (name, publicId, systemId);
+ }
+
+ // SAX1 DTD event
+ public void unparsedEntityDecl (
+ String name,
+ String publicId, String systemId,
+ String notationName
+ ) throws SAXException
+ {
+ // DOM L2 can't create/save entity nodes
+ getDoctype ().declareEntity (name, publicId, systemId,
+ notationName);
+ }
+
+ // SAX2 declaration event
+ public void internalEntityDecl (String name, String value)
+ throws SAXException
+ {
+ // DOM L2 can't create/save entity nodes
+ // NOTE: this doesn't save the value as a child of this
+ // node, though it could realistically do so.
+ getDoctype ().declareEntity (name, null, null, null);
+ }
+
+ // SAX2 declaration event
+ public void externalEntityDecl (
+ String name,
+ String publicId,
+ String systemId
+ ) throws SAXException
+ {
+ // DOM L2 can't create/save entity nodes
+ // NOTE: DOM allows for these to have children, if
+ // they don't have unbound namespace references.
+ getDoctype ().declareEntity (name, publicId, systemId, null);
+ }
+
+ // SAX2 element
+ public void startElement (
+ String uri,
+ String localName,
+ String qName,
+ Attributes atts
+ ) throws SAXException
+ {
+ Node top;
+
+ super.startElement (uri, localName, qName, atts);
+
+ // might there be more work?
+ top = getTop ();
+ if (!top.hasAttributes () || !(atts instanceof Attributes2))
+ return;
+
+ // remember any attributes that got defaulted
+ DomNamedNodeMap map = (DomNamedNodeMap) top.getAttributes ();
+ Attributes2 attrs = (Attributes2) atts;
+ int length = atts.getLength ();
+
+ map.compact ();
+ for (int i = 0; i < length; i++) {
+ if (attrs.isSpecified (i))
+ continue;
+
+ // value was defaulted.
+ String temp = attrs.getQName (i);
+ DomAttr attr;
+
+ if ("".equals (temp))
+ attr = (DomAttr) map.getNamedItemNS (attrs.getURI (i),
+ atts.getLocalName (i));
+ else
+ attr = (DomAttr) map.getNamedItem (temp);
+
+ // DOM L2 can't write this flag, only read it
+ attr.setSpecified (false);
+ }
+ }
+
+ public void endElement (
+ String uri,
+ String localName,
+ String qName
+ ) throws SAXException
+ {
+ DomNode top = (DomNode) getTop ();
+ top.compact ();
+ super.endElement (uri, localName, qName);
+ }
+
+ protected Text createText (
+ boolean isCDATA,
+ char buf [],
+ int off,
+ int len
+ ) {
+ DomDocument doc = (DomDocument) getDocument ();
+
+ if (isCDATA)
+ return doc.createCDATASection (buf, off, len);
+ else
+ return doc.createTextNode (buf, off, len);
+ }
+
+
+ public void attributeDecl (
+ String ename,
+ String aname,
+ String type,
+ String mode,
+ String value
+ ) throws SAXException
+ {
+ if (value == null && !"ID".equals (type))
+ return;
+
+ DomDoctype.ElementInfo info;
+
+ info = getDoctype ().getElementInfo (ename);
+ if (value != null)
+ info.setAttrDefault (aname, value);
+ if ("ID".equals (type))
+ info.setIdAttr (aname);
+ }
+
+ // force duplicate name checking off while we're
+ // using parser output (don't duplicate the work)
+ public void startDocument () throws SAXException
+ {
+ DomDocument doc;
+
+ super.startDocument ();
+ ((DomDocument) getDocument ()).setCheckingCharacters (false);
+ }
+
+ public void endDocument ()
+ throws SAXException
+ {
+ DomDocument doc = (DomDocument) getDocument ();
+ doc.setCheckingCharacters (true);
+ doc.compact ();
+ super.endDocument ();
+ }
+
+ // these three methods collaborate to populate entity
+ // refs, marking contents readonly on end-of-entity
+
+ public boolean canPopulateEntityRefs ()
+ { return true; }
+
+ public void startEntity (String name)
+ throws SAXException
+ {
+ if (name.charAt (0) == '%' || "[dtd]".equals (name))
+ return;
+ super.startEntity (name);
+
+ DomNode top = (DomNode) getTop ();
+
+ if (top.getNodeType () == Node.ENTITY_REFERENCE_NODE)
+ top.readonly = false;
+ }
+
+ public void endEntity (String name)
+ throws SAXException
+ {
+ if (name.charAt (0) == '%' || "[dtd]".equals (name))
+ return;
+ DomNode top = (DomNode) getTop ();
+
+ if (top.getNodeType () == Node.ENTITY_REFERENCE_NODE) {
+ top.compact ();
+ top.makeReadonly ();
+ }
+ super.endEntity (name);
+ }
+ }
+}
diff --git a/external/jaxp/source/gnu/xml/dom/DomAttr.java b/external/jaxp/source/gnu/xml/dom/DomAttr.java
new file mode 100644
index 000000000..99cc29dcf
--- /dev/null
+++ b/external/jaxp/source/gnu/xml/dom/DomAttr.java
@@ -0,0 +1,267 @@
+/*
+ * $Id: DomAttr.java,v 1.1 2003-02-01 02:10:13 cbj Exp $
+ * Copyright (C) 1999-2001 David Brownell
+ *
+ * This file is part of GNU JAXP, a library.
+ *
+ * GNU JAXP is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * GNU JAXP is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ * As a special exception, if you link this library with other files to
+ * produce an executable, this library does not by itself cause the
+ * resulting executable to be covered by the GNU General Public License.
+ * This exception does not however invalidate any other reasons why the
+ * executable file might be covered by the GNU General Public License.
+ */
+
+package gnu.xml.dom;
+
+import org.w3c.dom.*;
+import org.w3c.dom.events.MutationEvent;
+
+
+// $Id: DomAttr.java,v 1.1 2003-02-01 02:10:13 cbj Exp $
+
+/**
+ * <p> "Attr" implementation. In DOM, attributes cost quite a lot of
+ * memory because their values are complex structures rather than just
+ * simple strings. To reduce your costs, avoid having more than one
+ * child of an attribute; stick to a single Text node child, and ignore
+ * even that by using the attribute's "nodeValue" property.</p>
+ *
+ * <p> As a bit of general advice, only look at attribute modification
+ * events through the DOMAttrModified event (sent to the associated
+ * element). Implementations are not guaranteed to report other events
+ * in the same order, so you're very likely to write nonportable code if
+ * you monitor events at the "children of Attr" level.</p>
+ *
+ * <p> At this writing, not all attribute modifications will cause the
+ * DOMAttrModified event to be triggered ... only the ones using the string
+ * methods (setNodeValue, setValue, and Element.setAttribute) to modify
+ * those values. That is, if you manipulate those children directly,
+ * elements won't get notified that attribute values have changed.
+ * The natural fix for that will report other modifications, but won't
+ * be able to expose "previous" attribute value; it'll need to be cached
+ * or something (at which point why bother using child nodes). </p>
+ *
+ * <p><em>You are strongly advised not to use "children" of any attribute
+ * nodes you work with.</em> </p>
+ *
+ * @author David Brownell
+ * @version $Date: 2003-02-01 02:10:13 $
+ */
+public class DomAttr extends DomNsNode implements Attr
+{
+ private boolean specified;
+
+ // NOTE: it could be possible to rework this code a bit so that
+ // this extra field isn't needed; "parent" might do double duty,
+ // with appropriate safeguards. Using less space is healthy!
+ private DomElement element;
+
+
+ /**
+ * Constructs an Attr node associated with the specified document.
+ * The "specified" flag is initialized to true, since this DOM has
+ * no current "back door" mechanisms to manage default values so
+ * that every value must effectively be "specified".
+ *
+ * <p>This constructor should only be invoked by a Document as part of
+ * its createAttribute functionality, or through a subclass which is
+ * similarly used in a "Sub-DOM" style layer.
+ *
+ * @param owner The document with which this node is associated
+ * @param namespaceURI Combined with the local part of the name,
+ * this is used to uniquely identify a type of attribute
+ * @param name Name of this attribute, which may include a prefix
+ */
+ protected DomAttr (Document owner, String namespaceURI, String name)
+ {
+ super (owner, namespaceURI, name);
+ specified = true;
+
+ // XXX register self to get insertion/removal events
+ // and character data change events and when they happen,
+ // report self-mutation
+ }
+
+
+ /**
+ * <b>DOM L1</b>
+ * Returns the attribute name (same as getNodeName)
+ */
+ final public String getName ()
+ {
+ return getNodeName ();
+ }
+
+ /**
+ * <b>DOM L1</b>
+ * Returns the constant ATTRIBUTE_NODE.
+ */
+ final public short getNodeType ()
+ { return ATTRIBUTE_NODE; }
+
+
+ /**
+ * <b>DOM L1</b>
+ * Returns true if a parser reported this was in the source text.
+ */
+ final public boolean getSpecified ()
+ {
+ return specified;
+ }
+
+
+ /**
+ * Records whether this attribute was in the source text.
+ */
+ final public void setSpecified (boolean value)
+ {
+ specified = value;
+ }
+
+
+ /**
+ * <b>DOM L1</b>
+ * Returns the attribute value, with character and entity
+ * references substituted.
+ * <em>NOTE: entity refs as children aren't currently handled.</em>
+ */
+ public String getNodeValue ()
+ {
+ int length = getLength ();
+ String retval = null;
+
+ for (int i = 0; i < length; i++) {
+ Node n = item (i);
+
+ if (n.getNodeType () == TEXT_NODE) {
+ if (retval == null)
+ retval = n.getNodeValue ();
+ else
+ retval += n.getNodeValue ();
+ continue;
+ }
+
+ // XXX entity ref child of attribute
+ // contents exclude comments, PIs, elements
+ throw new DomEx (DomEx.NOT_SUPPORTED_ERR);
+ }
+ if (retval == null)
+ retval = "";
+ return retval;
+ }
+
+
+ /**
+ * <b>DOM L1</b>
+ * Assigns the value of the attribute; it will have one child,
+ * which is a text node with the specified value (same as
+ * setNodeValue).
+ */
+ final public void setValue (String value)
+ {
+ setNodeValue (value);
+ }
+
+
+ /**
+ * <b>DOM L1</b>
+ * Returns the value of the attribute as a non-null string; same
+ * as getNodeValue.
+ * <em>NOTE: entity refs as children aren't currently handled.</em>
+ */
+ final public String getValue ()
+ {
+ return getNodeValue ();
+ }
+
+
+ /**
+ * <b>DOM L1</b>
+ * Assigns the attribute value; using this API, no entity or
+ * character references will exist.
+ * Causes a DOMAttrModified mutation event to be sent.
+ */
+ public void setNodeValue (String value)
+ {
+ int len = getLength ();
+ String oldValue;
+
+ if (isReadonly ())
+ throw new DomEx (DomEx.NO_MODIFICATION_ALLOWED_ERR);
+
+ oldValue = getValue ();
+ for (int i = 0; i < len; i++)
+ removeChild (getLastChild ());
+ appendChild (getOwnerDocument ().createTextNode (value));
+ specified = true;
+
+ mutating (oldValue, value, MutationEvent.MODIFICATION);
+ }
+
+
+ /**
+ * <b>DOM L2</b>
+ * Returns the element with which this attribute is associated.
+ */
+ final public Element getOwnerElement ()
+ {
+ return element;
+ }
+
+
+ /**
+ * Records the element with which this attribute is associated.
+ */
+ final public void setOwnerElement (Element e)
+ {
+ if (element != null)
+ throw new DomEx (DomEx.HIERARCHY_REQUEST_ERR);
+ if (!(e instanceof DomElement))
+ throw new DomEx (DomEx.WRONG_DOCUMENT_ERR);
+ element = (DomElement) e;
+ }
+
+
+ /**
+ * Shallow clone of the attribute, breaking all ties with any
+ * elements.
+ */
+ public Object clone ()
+ {
+ DomAttr retval = (DomAttr) super.clone ();
+
+ retval.element = null;
+ retval.specified = false;
+ return retval;
+ }
+
+ private void mutating (String oldValue, String newValue, short why)
+ {
+ if (!reportMutations || element == null)
+ return;
+
+ // EVENT: DOMAttrModified, target = element,
+ // prev/new values provided, also attr name
+ MutationEvent event;
+
+ event = (MutationEvent) createEvent ("MutationEvents");
+ event.initMutationEvent ("DOMAttrModified",
+ true /* bubbles */, false /* nocancel */,
+ null, oldValue, newValue, getNodeName (), why);
+ element.dispatchEvent (event);
+ }
+}
diff --git a/external/jaxp/source/gnu/xml/dom/DomCDATA.java b/external/jaxp/source/gnu/xml/dom/DomCDATA.java
new file mode 100644
index 000000000..0f80fe511
--- /dev/null
+++ b/external/jaxp/source/gnu/xml/dom/DomCDATA.java
@@ -0,0 +1,88 @@
+/*
+ * $Id: DomCDATA.java,v 1.1 2003-02-01 02:10:13 cbj Exp $
+ * Copyright (C) 1999-2001 David Brownell
+ *
+ * This file is part of GNU JAXP, a library.
+ *
+ * GNU JAXP is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * GNU JAXP is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ * As a special exception, if you link this library with other files to
+ * produce an executable, this library does not by itself cause the
+ * resulting executable to be covered by the GNU General Public License.
+ * This exception does not however invalidate any other reasons why the
+ * executable file might be covered by the GNU General Public License.
+ */
+
+package gnu.xml.dom;
+
+import org.w3c.dom.*;
+
+
+// $Id: DomCDATA.java,v 1.1 2003-02-01 02:10:13 cbj Exp $
+
+/**
+ * <p> "CDATASection" implementation.
+ * This is a non-core DOM class, supporting the "XML" feature.
+ * CDATA sections are just ways to represent text using different
+ * delimeters. </p>
+ *
+ * <p> <em>You are strongly advised not to use CDATASection nodes.</em>
+ * The advantage of having slightly prettier ways to print text that may
+ * have lots of embedded XML delimiters, such as "&amp;" and "&lt;",
+ * can be dwarfed by the cost of dealing with multiple kinds of text
+ * nodes in all your algorithms. </p>
+ *
+ * @author David Brownell
+ * @version $Date: 2003-02-01 02:10:13 $
+ */
+public class DomCDATA extends DomText implements CDATASection
+{
+ /**
+ * Constructs a CDATA section node associated with the specified
+ * document and holding the specified data.
+ *
+ * <p>This constructor should only be invoked by a Document as part of
+ * its createCDATASection functionality, or through a subclass which is
+ * similarly used in a "Sub-DOM" style layer.
+ *
+ */
+ protected DomCDATA (Document owner, String value)
+ {
+ super (owner, value);
+ }
+
+ protected DomCDATA (Document owner, char buf [], int off, int len)
+ {
+ super (owner, buf, off, len);
+ }
+
+
+ /**
+ * <b>DOM L1</b>
+ * Returns the string "#cdata-section".
+ */
+ final public String getNodeName ()
+ {
+ return "#cdata-section";
+ }
+
+
+ /**
+ * <b>DOM L1</b>
+ * Returns the constant CDATA_SECTION_NODE.
+ */
+ final public short getNodeType ()
+ { return CDATA_SECTION_NODE; }
+}
diff --git a/external/jaxp/source/gnu/xml/dom/DomCharacterData.java b/external/jaxp/source/gnu/xml/dom/DomCharacterData.java
new file mode 100644
index 000000000..b7183074d
--- /dev/null
+++ b/external/jaxp/source/gnu/xml/dom/DomCharacterData.java
@@ -0,0 +1,267 @@
+/*
+ * $Id: DomCharacterData.java,v 1.1 2003-02-01 02:10:14 cbj Exp $
+ * Copyright (C) 1999-2001 David Brownell
+ *
+ * This file is part of GNU JAXP, a library.
+ *
+ * GNU JAXP is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * GNU JAXP is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ * As a special exception, if you link this library with other files to
+ * produce an executable, this library does not by itself cause the
+ * resulting executable to be covered by the GNU General Public License.
+ * This exception does not however invalidate any other reasons why the
+ * executable file might be covered by the GNU General Public License.
+ */
+
+package gnu.xml.dom;
+
+import org.w3c.dom.*;
+import org.w3c.dom.events.MutationEvent;
+
+
+// $Id: DomCharacterData.java,v 1.1 2003-02-01 02:10:14 cbj Exp $
+
+/**
+ * <p> Abstract "CharacterData" implementation. This
+ * facilitates reusing code in classes implementing subtypes of that DOM
+ * interface (Text, Comment, CDATASection). </p>
+ *
+ * @author David Brownell
+ * @version $Date: 2003-02-01 02:10:14 $
+ */
+public abstract class DomCharacterData extends DomNode
+ implements CharacterData
+{
+ private char raw [];
+
+ // package private
+ DomCharacterData (Document doc, String value)
+ {
+ super (doc);
+ if (value != null)
+ raw = value.toCharArray ();
+ else
+ raw = new char [0];
+ }
+
+ // package private
+ DomCharacterData (Document doc, char buf [], int offset, int length)
+ {
+ super (doc);
+ if (buf == null)
+ raw = new char [0];
+ else {
+ raw = new char [length];
+ System.arraycopy (buf, offset, raw, 0, length);
+ }
+ }
+
+ /**
+ * <b>DOM L1</b>
+ * Appends the specified data to the value of this node.
+ * Causes a DOMCharacterDataModified mutation event to be reported.
+ */
+ public void appendData (String arg)
+ {
+ if (isReadonly ())
+ throw new DomEx (DomEx.NO_MODIFICATION_ALLOWED_ERR);
+
+ char tmp [] = arg.toCharArray ();
+ char buf [] = new char [raw.length + tmp.length];
+
+ System.arraycopy (raw, 0, buf, 0, raw.length);
+ System.arraycopy (tmp, 0, buf, raw.length, tmp.length);
+ mutating (new String (buf));
+ raw = buf;
+ }
+
+
+ /**
+ * <b>DOM L1</b>
+ * Modifies the value of this node.
+ * Causes a DOMCharacterDataModified mutation event to be reported.
+ */
+ public void deleteData (int offset, int count)
+ {
+ char buf [];
+
+ if (isReadonly ())
+ throw new DomEx (DomEx.NO_MODIFICATION_ALLOWED_ERR);
+ if (offset < 0 || count < 0 || offset > raw.length)
+ throw new DomEx (DomEx.INDEX_SIZE_ERR);
+ if ((offset + count) > raw.length)
+ count = raw.length - offset;
+ if (count == 0)
+ return;
+ buf = new char [raw.length - count];
+ System.arraycopy (raw, 0, buf, 0, offset);
+ System.arraycopy (raw, offset + count, buf, offset,
+ raw.length - (offset + count));
+ mutating (new String (buf));
+ raw = buf;
+ }
+
+
+ /**
+ * <b>DOM L1</b>
+ * Returns the value of this node.
+ */
+ public String getNodeValue ()
+ {
+ return new String (raw);
+ }
+
+
+ /**
+ * <b>DOM L1</b>
+ * Returns the value of this node; same as getNodeValue.
+ */
+ final public String getData ()
+ {
+ return getNodeValue ();
+ }
+
+
+ /**
+ * <b>DOM L1</b>
+ * Returns the length of the data.
+ */
+ public int getLength ()
+ {
+ return raw.length;
+ }
+
+
+ static final class EmptyNodeList implements NodeList
+ {
+ public int getLength () { return 0; }
+ public Node item (int i) { return null; }
+ }
+
+ static final EmptyNodeList theEmptyNodeList = new EmptyNodeList ();
+
+
+ /**
+ * <b>DOM L1</b>
+ * Returns an empty list of children.
+ */
+ final public NodeList getChildNodes ()
+ {
+ return theEmptyNodeList;
+ }
+
+
+ /**
+ * <b>DOM L1</b>
+ * Modifies the value of this node.
+ */
+ public void insertData (int offset, String arg)
+ {
+ char tmp [] = arg.toCharArray ();
+ char buf [] = new char [raw.length + tmp.length];
+
+ if (isReadonly ())
+ throw new DomEx (DomEx.NO_MODIFICATION_ALLOWED_ERR);
+ try {
+ System.arraycopy (raw, 0, buf, 0, offset);
+ System.arraycopy (tmp, 0, buf, offset,
+ tmp.length);
+ System.arraycopy (raw, offset, buf, offset + tmp.length,
+ raw.length - offset);
+ mutating (new String (buf));
+ raw = buf;
+ } catch (IndexOutOfBoundsException x) {
+ throw new DomEx (DomEx.INDEX_SIZE_ERR);
+ }
+ }
+
+
+ /**
+ * <b>DOM L1</b>
+ * Modifies the value of this node. Causes DOMCharacterDataModified
+ * mutation events to be reported (at least one).
+ */
+ public void replaceData (int offset, int count, String arg)
+ {
+ if (isReadonly ())
+ throw new DomEx (DomEx.NO_MODIFICATION_ALLOWED_ERR);
+
+ // this could be rewritten to be faster,
+ // and to report only one mutation event
+ deleteData (offset, count);
+ insertData (offset, arg);
+ }
+
+
+ /**
+ * <b>DOM L1</b>
+ * Assigns the value of this node.
+ * Causes a DOMCharacterDataModified mutation event to be reported.
+ */
+ public void setNodeValue (String value)
+ {
+ if (isReadonly ())
+ throw new DomEx (DomEx.NO_MODIFICATION_ALLOWED_ERR);
+ if (value == null)
+ value = "";
+ mutating (value);
+ raw = value.toCharArray ();
+ }
+
+
+ /**
+ * <b>DOM L1</b>
+ * Assigns the value of this node; same as setNodeValue.
+ */
+ final public void setData (String data)
+ {
+ setNodeValue (data);
+ }
+
+
+ /**
+ * <b>DOM L1</b>
+ * Returns the specified substring.
+ */
+ public String substringData (int offset, int count)
+ {
+ try {
+ return new String (raw, offset, count);
+ } catch (IndexOutOfBoundsException e) {
+ if (offset >= 0 && count >= 0) {
+ int len = raw.length;
+ if (offset < len && (offset + count) > len)
+ return new String (raw, offset, len - offset);
+ }
+ throw new DomEx (DomEx.INDEX_SIZE_ERR);
+ }
+ }
+
+ private void mutating (String newValue)
+ {
+ if (!reportMutations)
+ return;
+
+ // EVENT: DOMCharacterDataModified, target = this,
+ // prev/new values provided
+ MutationEvent event;
+
+ event = (MutationEvent) createEvent ("MutationEvents");
+ event.initMutationEvent ("DOMCharacterDataModified",
+ true /* bubbles */, false /* nocancel */,
+ null, new String (raw), newValue, null, (short) 0);
+ dispatchEvent (event);
+ }
+}
diff --git a/external/jaxp/source/gnu/xml/dom/DomComment.java b/external/jaxp/source/gnu/xml/dom/DomComment.java
new file mode 100644
index 000000000..5f0947b95
--- /dev/null
+++ b/external/jaxp/source/gnu/xml/dom/DomComment.java
@@ -0,0 +1,77 @@
+/*
+ * $Id: DomComment.java,v 1.1 2003-02-01 02:10:14 cbj Exp $
+ * Copyright (C) 1999-2001 David Brownell
+ *
+ * This file is part of GNU JAXP, a library.
+ *
+ * GNU JAXP is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * GNU JAXP is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ * As a special exception, if you link this library with other files to
+ * produce an executable, this library does not by itself cause the
+ * resulting executable to be covered by the GNU General Public License.
+ * This exception does not however invalidate any other reasons why the
+ * executable file might be covered by the GNU General Public License.
+ */
+
+package gnu.xml.dom;
+
+import org.w3c.dom.*;
+
+
+// $Id: DomComment.java,v 1.1 2003-02-01 02:10:14 cbj Exp $
+
+/**
+ * <p> "Comment" implementation.
+ * Comments hold data intended for direct consumption by people;
+ * programs should only use ProcessingInstruction nodes. Note that
+ * since SAX makes comment reporting optional, XML systems that
+ * rely on comments (such as by using this class) will often lose
+ * those comments at some point in the processing pipeline. </p>
+ *
+ * @author David Brownell
+ * @version $Date: 2003-02-01 02:10:14 $
+ */
+public class DomComment extends DomCharacterData implements Comment
+{
+ /**
+ * Constructs a comment node associated with the specified
+ * document and holding the specified data.
+ *
+ * <p>This constructor should only be invoked by a Document as part of
+ * its createComment functionality, or through a subclass which is
+ * similarly used in a "Sub-DOM" style layer.
+ */
+ protected DomComment (Document owner, String value)
+ {
+ super (owner, value);
+ }
+
+
+ /**
+ * <b>DOM L1</b>
+ * Returns the string "#comment".
+ */
+ final public String getNodeName ()
+ {
+ return "#comment";
+ }
+
+ /**
+ * <b>DOM L1</b>
+ * Returns the constant COMMENT_NODE.
+ */
+ final public short getNodeType ()
+ { return COMMENT_NODE; }
+}
diff --git a/external/jaxp/source/gnu/xml/dom/DomDoctype.java b/external/jaxp/source/gnu/xml/dom/DomDoctype.java
new file mode 100644
index 000000000..1ef26bdd5
--- /dev/null
+++ b/external/jaxp/source/gnu/xml/dom/DomDoctype.java
@@ -0,0 +1,361 @@
+/*
+ * $Id: DomDoctype.java,v 1.1 2003-02-01 02:10:14 cbj Exp $
+ * Copyright (C) 1999-2001 David Brownell
+ *
+ * This file is part of GNU JAXP, a library.
+ *
+ * GNU JAXP is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * GNU JAXP is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ * As a special exception, if you link this library with other files to
+ * produce an executable, this library does not by itself cause the
+ * resulting executable to be covered by the GNU General Public License.
+ * This exception does not however invalidate any other reasons why the
+ * executable file might be covered by the GNU General Public License.
+ */
+
+package gnu.xml.dom;
+
+import org.w3c.dom.*;
+
+import java.util.Hashtable;
+
+
+// $Id: DomDoctype.java,v 1.1 2003-02-01 02:10:14 cbj Exp $
+
+/**
+ * <p> "DocumentType" implementation (with no extensions for supporting
+ * any document typing information). This is a non-core DOM class,
+ * supporting the "XML" feature. </p>
+ *
+ * <p> <em>Few XML applications will actually care about this partial
+ * DTD support</em>, since it doesn't expose any (!) of the data typing
+ * facilities which can motivate applications to use DTDs. It does not
+ * expose element content models, or information about attribute typing
+ * rules. Plus the information it exposes isn't very useful; as one example,
+ * DOM exposes information about unparsed ENTITY objects, which is only used
+ * with certain element attributes, but does not expose the information about
+ * those attributes which is needed to apply that data! </p>
+ *
+ * <p> Also, note that there are no nonportable ways to associate even the
+ * notation and entity information exposed by DOM with a DocumentType. While
+ * there is a DOM L2 method to construct a DocumentType, it only gives access
+ * to the textual content of the &lt;!DOCTYPE ...&gt; declaration. </p>
+ *
+ * <p> In short, <em>you are strongly advised not to rely on this incomplete
+ * DTD functionality</em> in your application code.</p>
+ *
+ * @see DomEntity
+ * @see DomEntityReference
+ * @see DomNotation
+ *
+ * @author David Brownell
+ * @version $Date: 2003-02-01 02:10:14 $
+ */
+public class DomDoctype extends DomExtern implements DocumentType
+{
+ private DomNamedNodeMap notations;
+ private DomNamedNodeMap entities;
+ private DOMImplementation implementation;
+ private String subset;
+
+ private Hashtable elements = new Hashtable ();
+ private boolean ids;
+
+
+ /**
+ * Constructs a DocumentType node associated with the specified
+ * implementation, with the specified name.
+ *
+ * <p>This constructor should only be invoked by a DOMImplementation as
+ * part of its createDocumentType functionality, or through a subclass
+ * which is similarly used in a "Sub-DOM" style layer.
+ *
+ * <p> Note that at this time there is no standard SAX API granting
+ * access to the internal subset text, so that relying on that value
+ * is not currently portable.
+ *
+ * @param impl The implementation with which this object is associated
+ * @param name Name of this root element
+ * @param publicId If non-null, provides the external subset's
+ * PUBLIC identifier
+ * @param systemId If non-null, provides the external subset's
+ * SYSTEM identifier
+ * @param internalSubset Provides the literal value (unparsed, no
+ * entities expanded) of the DTD's internal subset.
+ */
+ protected DomDoctype (
+ DOMImplementation impl,
+ String name,
+ String publicId,
+ String systemId,
+ String internalSubset
+ )
+ {
+ super (null, name, publicId, systemId);
+ implementation = impl;
+ subset = internalSubset;
+ }
+
+ // package private
+ // for JAXP-style builder backdoors
+ DomDoctype (
+ DomDocument doc,
+ String name,
+ String publicId,
+ String systemId
+ )
+ {
+ super (doc, name, publicId, systemId);
+ implementation = doc.getImplementation ();
+ }
+
+
+ /**
+ * <b>DOM L1</b>
+ * Returns the root element's name (just like getNodeName).
+ */
+ final public String getName () { return getNodeName (); }
+
+ /**
+ * <b>DOM L1</b>
+ * Returns the constant DOCUMENT_TYPE_NODE.
+ */
+ final public short getNodeType ()
+ { return DOCUMENT_TYPE_NODE; }
+
+
+ /**
+ * <b>DOM L1</b>
+ * Returns information about any general entities declared
+ * in the DTD.
+ *
+ * <p><em>Note: DOM L1 doesn't throw a DOMException here, but
+ * then it doesn't have the strange construction rules of L2.</em>
+ *
+ * @exception DOMException HIERARCHY_REQUEST_ERR if the DocumentType
+ * is not associated with a document.
+ */
+ public NamedNodeMap getEntities ()
+ {
+ if (entities == null) {
+ if (getOwnerDocument () == null)
+ throw new DomEx (DomEx.HIERARCHY_REQUEST_ERR);
+ entities = new DomNamedNodeMap (getOwnerDocument ());
+ }
+ return entities;
+ }
+
+
+ /**
+ * Records the declaration of a general entity in this DocumentType.
+ *
+ * @param name Name of the entity
+ * @param publicId If non-null, provides the entity's PUBLIC identifier
+ * @param systemId Provides the entity's SYSTEM identifier
+ * @param notation If non-null, provides the entity's notation
+ * (indicating an unparsed entity)
+ * @return The Entity that was declared, or null if the entity wasn't
+ * recorded (because it's a parameter entity or because an entity with
+ * this name was already declared).
+ *
+ * @exception DOMException NO_MODIFICATION_ALLOWED_ERR if the
+ * DocumentType is no longer writable.
+ * @exception DOMException HIERARCHY_REQUEST_ERR if the DocumentType
+ * is not associated with a document.
+ */
+ public Entity declareEntity (
+ String name,
+ String publicId,
+ String systemId,
+ String notation
+ )
+ {
+ DomEntity entity;
+
+ if (name.charAt (0) == '%' || "[dtd]".equals (name))
+ return null;
+ if (isReadonly ())
+ throw new DomEx (DomEx.NO_MODIFICATION_ALLOWED_ERR);
+ getEntities ();
+
+ DomDocument.verifyXmlName (name);
+ if (entities.getNamedItem (name) != null)
+ return null;
+
+ entity = new DomEntity (getOwnerDocument (),
+ name, publicId, systemId, notation);
+ entities.setNamedItem (entity);
+ return entity;
+ }
+
+ /**
+ * <b>DOM L1</b>
+ * Returns information about any notations declared in the DTD.
+ *
+ * <p><em>Note: DOM L1 doesn't throw a DOMException here, but
+ * then it doesn't have the strange construction rules of L2.</em>
+ *
+ * @exception DOMException HIERARCHY_REQUEST_ERR if the DocumentType
+ * is not associated with a document.
+ */
+ public NamedNodeMap getNotations ()
+ {
+ if (notations == null) {
+ if (getOwnerDocument () == null)
+ throw new DomEx (DomEx.HIERARCHY_REQUEST_ERR);
+ notations = new DomNamedNodeMap (getOwnerDocument ());
+ }
+ return notations;
+ }
+
+
+ /**
+ * Records the declaration of a notation in this DocumentType.
+ *
+ * @param name Name of the notation
+ * @param publicId If non-null, provides the notation's PUBLIC identifier
+ * @param systemId If non-null, provides the notation's SYSTEM identifier
+ * @return The notation that was declared.
+ *
+ * @exception DOMException NO_MODIFICATION_ALLOWED_ERR if the
+ * DocumentType is no longer writable.
+ * @exception DOMException HIERARCHY_REQUEST_ERR if the DocumentType
+ * is not associated with a document.
+ */
+ public Notation declareNotation (
+ String name,
+ String publicId,
+ String systemId
+ )
+ {
+ DomNotation notation;
+
+ if (isReadonly ())
+ throw new DomEx (DomEx.NO_MODIFICATION_ALLOWED_ERR);
+ getNotations ();
+
+ DomDocument.verifyXmlName (name);
+
+ notation = new DomNotation (getOwnerDocument (),
+ name, publicId, systemId);
+ notations.setNamedItem (notation);
+ return notation;
+ }
+
+
+ /**
+ * <b>DOM L2</b>
+ * Returns the internal subset of the document, as a string of unparsed
+ * XML declarations (and comments, PIs, whitespace); or returns null if
+ * there is no such subset. There is no vendor-independent expectation
+ * that this attribute be set, or that declarations found in it be
+ * reflected in the <em>entities</em> or <em>notations</em> attributes
+ * of this Document "Type" object.
+ *
+ * <p> Some application-specific XML profiles require that documents
+ * only use specific PUBLIC identifiers, without an internal subset
+ * to modify the interperetation of the declarations associated with
+ * that PUBLIC identifier through some standard.
+ */
+ public String getInternalSubset ()
+ {
+ return subset;
+ }
+
+
+ /**
+ * Sets the internal "readonly" flag so the node and its associated
+ * data (only lists of entities and notations, no type information
+ * at the moment) can't be changed.
+ */
+ public void makeReadonly ()
+ {
+ super.makeReadonly ();
+ if (entities != null)
+ entities.makeReadonly ();
+ if (notations != null)
+ notations.makeReadonly ();
+ }
+
+
+ /**
+ * <b>DOM L2</b>
+ * Consults the DOM implementation to determine if the requested
+ * feature is supported.
+ */
+ final public boolean supports (String feature, String version)
+ {
+ return implementation.hasFeature (feature, version);
+ }
+
+
+ /**
+ * Returns the implementation associated with this document type.
+ */
+ final public DOMImplementation getImplementation ()
+ {
+ return implementation;
+ }
+
+
+ // Yeech. Package-private hooks, I don't like this.
+ // For all that it's better than making this stuff a
+ // public API...
+
+
+ // package private
+ ElementInfo getElementInfo (String element)
+ {
+ ElementInfo info = (ElementInfo) elements.get (element);
+
+ if (info != null)
+ return info;
+ info = new ElementInfo (this);
+ elements.put (element, info);
+ return info;
+ }
+
+ void setHasIds () { ids = true; }
+ boolean hasIds () { return ids; }
+
+ // package private
+ static class ElementInfo extends Hashtable
+ {
+ private String idAttrName;
+ private DomDoctype doctype;
+
+ // is-a vs has-a ... just to minimize number of objects.
+ // keys in table are attribute names, values are defaults.
+
+ ElementInfo (DomDoctype dt) { super (5, 5); doctype = dt; }
+
+ void setAttrDefault (String attName, String value)
+ {
+ if (getAttrDefault (attName) == null)
+ put (attName, value);
+ }
+ String getAttrDefault (String attName)
+ { return (String) get (attName); }
+
+ void setIdAttr (String attName)
+ {
+ if (idAttrName == null)
+ idAttrName = attName;
+ doctype.setHasIds ();
+ }
+ String getIdAttr ()
+ { return idAttrName; }
+ }
+}
diff --git a/external/jaxp/source/gnu/xml/dom/DomDocument.java b/external/jaxp/source/gnu/xml/dom/DomDocument.java
new file mode 100644
index 000000000..6fe0f7ed0
--- /dev/null
+++ b/external/jaxp/source/gnu/xml/dom/DomDocument.java
@@ -0,0 +1,793 @@
+/*
+ * $Id: DomDocument.java,v 1.1 2003-02-01 02:10:14 cbj Exp $
+ * Copyright (C) 1999-2001 David Brownell
+ *
+ * This file is part of GNU JAXP, a library.
+ *
+ * GNU JAXP is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * GNU JAXP is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ * As a special exception, if you link this library with other files to
+ * produce an executable, this library does not by itself cause the
+ * resulting executable to be covered by the GNU General Public License.
+ * This exception does not however invalidate any other reasons why the
+ * executable file might be covered by the GNU General Public License.
+ */
+
+package gnu.xml.dom;
+
+import java.util.Enumeration;
+
+import org.w3c.dom.*;
+import org.w3c.dom.traversal.*;
+
+
+// $Id: DomDocument.java,v 1.1 2003-02-01 02:10:14 cbj Exp $
+
+/**
+ * <p> "Document" and "DocumentTraversal" implementation.
+ *
+ * <p> Note that when this checks names for legality, it uses an
+ * approximation of the XML rules, not the real ones. Specifically,
+ * it uses Unicode rules, with sufficient tweaks to pass a majority
+ * of basic XML conformance tests. (The huge XML character tables are
+ * hairy to implement.)
+ *
+ * @author David Brownell
+ * @version $Date: 2003-02-01 02:10:14 $
+ */
+public class DomDocument extends DomNode
+ implements Document, DocumentTraversal
+{
+ private final DOMImplementation implementation;
+ private boolean checkingCharacters = true;
+
+ // package private
+ final static String xmlNamespace =
+ "http://www.w3.org/XML/1998/namespace";
+ final static String xmlnsURI =
+ "http://www.w3.org/2000/xmlns/";
+
+
+ /**
+ * Constructs a Document node, associating it with an instance
+ * of the DomImpl class.
+ *
+ * <p> Note that this constructor disables character checking.
+ * It is normally used when connecting a DOM to an XML parser,
+ * and duplicating such checks is undesirable. When used for
+ * purposes other than connecting to a parser, you should
+ * re-enable that checking.
+ *
+ * @see #setCheckingCharacters
+ */
+ public DomDocument ()
+ {
+ super (null);
+ implementation = new DomImpl ();
+ }
+
+
+ /**
+ * Constructs a Document node, associating it with the specified
+ * implementation. This should only be used in conjunction with
+ * a specialized implementation; it will normally be called by
+ * that implementation.
+ *
+ * @see DomImpl
+ * @see #setCheckingCharacters
+ */
+ protected DomDocument (DOMImplementation impl)
+ {
+ super (null);
+ implementation = impl;
+ }
+
+
+ /**
+ * <b>DOM L1</b>
+ * Returns the constant "#document".
+ */
+ final public String getNodeName ()
+ {
+ return "#document";
+ }
+
+ /**
+ * <b>DOM L1</b>
+ * Returns the constant DOCUMENT_NODE.
+ */
+ final public short getNodeType ()
+ { return DOCUMENT_NODE; }
+
+
+ /**
+ * <b>DOM L1</b>
+ * Returns the document's root element, or null.
+ */
+ final public Element getDocumentElement ()
+ {
+ for (int i = 0; i < getLength (); i++) {
+ Node n = item (i);
+ if (n.getNodeType () == ELEMENT_NODE)
+ return (Element) n;
+ }
+ return null;
+ }
+
+
+ /**
+ * <b>DOM L1</b>
+ * Returns the document's DocumentType, or null.
+ */
+ final public DocumentType getDoctype ()
+ {
+ for (int i = 0; i < getLength (); i++) {
+ Node n = item (i);
+ if (n.getNodeType () == DOCUMENT_TYPE_NODE)
+ return (DocumentType) n;
+ }
+ return null;
+ }
+
+
+ /**
+ * <b>DOM L1</b>
+ * Returns the document's DOMImplementation.
+ */
+ final public DOMImplementation getImplementation ()
+ {
+ return implementation;
+ }
+
+
+ /**
+ * <b>DOM L1 (relocated in DOM L2)</b>
+ * Returns the element with the specified "ID" attribute, or null.
+ *
+ * <p>Returns null unless {@link Consumer} was used to populate internal
+ * DTD declaration information, using package-private APIs. If that
+ * internal DTD information is available, the document may be searched for
+ * the element with that ID.
+ */
+ public Element getElementById (String id)
+ {
+ DomDoctype doctype = (DomDoctype) getDoctype ();
+
+ if (doctype == null || !doctype.hasIds ()
+ || id == null || id.length () == 0)
+ return null;
+
+ // yes, this is linear in size of document.
+ // it'd be easy enough to maintain a hashtable.
+ Node current = getDocumentElement ();
+ Node temp;
+
+ if (current == null)
+ return null;
+ while (current != this) {
+ // done?
+ if (current.getNodeType () == ELEMENT_NODE) {
+ Element element = (Element) current;
+ DomDoctype.ElementInfo info;
+
+ info = doctype.getElementInfo (current.getNodeName ());
+ if (id.equals (element.getAttribute (info.getIdAttr ())))
+ return element;
+ }
+
+ // descend?
+ if (current.hasChildNodes ()) {
+ current = current.getFirstChild ();
+ continue;
+ }
+
+ // lateral?
+ temp = current.getNextSibling ();
+ if (temp != null) {
+ current = temp;
+ continue;
+ }
+
+ // back up ...
+ do {
+ temp = current.getParentNode ();
+ if (temp == null)
+ return null;
+ current = temp;
+ temp = current.getNextSibling ();
+ } while (temp == null);
+ current = temp;
+ }
+ return null;
+ }
+
+
+ private void checkNewChild (Node newChild)
+ {
+ if (newChild.getNodeType () == ELEMENT_NODE
+ && getDocumentElement () != null)
+ throw new DomEx (DomEx.HIERARCHY_REQUEST_ERR, null, newChild, 0);
+ if (newChild.getNodeType () == DOCUMENT_TYPE_NODE
+ && getDoctype () != null)
+ throw new DomEx (DomEx.HIERARCHY_REQUEST_ERR, null, newChild, 0);
+ }
+
+
+ /**
+ * <b>DOM L1</b>
+ * Appends the specified node to this node's list of children,
+ * enforcing the constraints that there be only one root element
+ * and one document type child.
+ */
+ public Node appendChild (Node newChild)
+ {
+ checkNewChild (newChild);
+ return super.appendChild (newChild);
+ }
+
+
+ /**
+ * <b>DOM L1</b>
+ * Inserts the specified node in this node's list of children,
+ * enforcing the constraints that there be only one root element
+ * and one document type child.
+ */
+ public Node insertBefore (Node newChild, Node refChild)
+ {
+ checkNewChild (newChild);
+ return super.insertBefore (newChild, refChild);
+ }
+
+
+ /**
+ * <b>DOM L1</b>
+ * Replaces the specified node in this node's list of children,
+ * enforcing the constraints that there be only one root element
+ * and one document type child.
+ */
+ public Node replaceChild (Node newChild, Node refChild)
+ {
+ if (!(newChild.getNodeType () == ELEMENT_NODE
+ && refChild.getNodeType () != ELEMENT_NODE)
+ && !(newChild.getNodeType () == DOCUMENT_TYPE_NODE
+ && refChild.getNodeType () != ELEMENT_NODE))
+ checkNewChild (newChild);
+ return super.replaceChild (newChild, refChild);
+ }
+
+
+ // NOTE: DOM can't really tell when the name of an entity,
+ // notation, or PI must follow the namespace rules (excluding
+ // colons) instead of the XML rules (which allow them without
+ // much restriction). That's an API issue. verifyXmlName
+ // aims to enforce the XML rules, not the namespace rules.
+
+ /**
+ * Throws a DOM exception if the specified name is not a legal XML 1.0
+ * name. Actually this uses a very similar set of rules, closer to
+ * Unicode rules than to the rules encoded in the large table at the
+ * end of the XML 1.0 specification.
+ *
+ * @exception DomException INVALID_CHARACTER_ERR if the name isn't
+ * legal as an XML name.
+ */
+ static public void verifyXmlName (String name)
+ {
+ char c;
+ int len = name.length ();
+
+ if (len == 0)
+ throw new DomEx (DomEx.NAMESPACE_ERR, name, null, 0);
+
+ // NOTE: these aren't really the XML rules, but they're
+ // a close approximation that's simple to implement.
+ c = name.charAt (0);
+ if (!Character.isUnicodeIdentifierStart (c)
+ && c != ':' && c != '_')
+ throw new DomEx (DomEx.INVALID_CHARACTER_ERR,
+ name, null, c);
+ for (int i = 1; i < len; i++) {
+ c = name.charAt (i);
+ if (!Character.isUnicodeIdentifierPart (c)
+ && c != ':'&& c != '_' && c != '.' && c != '-'
+ && !isExtender (c))
+ throw new DomEx (DomEx.INVALID_CHARACTER_ERR,
+ name, null, c);
+ }
+ }
+
+ static private boolean isExtender (char c)
+ {
+ // [88] Extender ::= ...
+ return c == 0x00b7 || c == 0x02d0 || c == 0x02d1 || c == 0x0387
+ || c == 0x0640 || c == 0x0e46 || c == 0x0ec6 || c == 0x3005
+ || (c >= 0x3031 && c <= 0x3035)
+ || (c >= 0x309d && c <= 0x309e)
+ || (c >= 0x30fc && c <= 0x30fe);
+ }
+
+ // package private
+ static void verifyNamespaceName (String name)
+ {
+ int index = name.indexOf (':');
+
+ if (index < 0) {
+ verifyXmlName (name);
+ return;
+ }
+ if (name.lastIndexOf (':') != index)
+ throw new DomEx (DomEx.NAMESPACE_ERR, name, null, 0);
+ verifyXmlName (name.substring (0, index));
+ verifyXmlName (name.substring (index + 1));
+ }
+
+ // package private
+ static void verifyXmlCharacters (String value)
+ {
+ int len = value.length ();
+
+ for (int i = 0; i < len; i++) {
+ char c = value.charAt (i);
+
+ // assume surrogate pairing checks out OK, for simplicity
+ if (c >= 0x0020 && c <= 0xFFFD)
+ continue;
+ if (c == '\n' || c == '\t' || c == '\r')
+ continue;
+
+ throw new DomEx (DomEx.INVALID_CHARACTER_ERR, value, null, c);
+ }
+ }
+
+ // package private
+ static void verifyXmlCharacters (char buf [], int off, int len)
+ {
+ for (int i = 0; i < len; i++) {
+ char c = buf [off + i];
+
+ // assume surrogate pairing checks out OK, for simplicity
+ if (c >= 0x0020 && c <= 0xFFFD)
+ continue;
+ if (c == '\n' || c == '\t' || c == '\r')
+ continue;
+
+ throw new DomEx (DomEx.INVALID_CHARACTER_ERR,
+ new String (buf, off, len), null, c);
+ }
+ }
+
+
+ /**
+ * Controls whether certain expensive checks, duplicating those that
+ * conformant XML parsers must perform, are made.
+ */
+ final public void setCheckingCharacters (boolean value)
+ {
+ checkingCharacters = value;
+ }
+
+
+ /**
+ * Returns true if certain expensive checks are performed.
+ * Those checks are intended to reject illegal names, and characters
+ * that are illegal as XML characters.
+ */
+ final public boolean isCheckingCharacters ()
+ {
+ return checkingCharacters;
+ }
+
+
+ /**
+ * <b>DOM L1</b>
+ * Returns a newly created element with the specified name.
+ */
+ public Element createElement (String name)
+ {
+ Element element;
+
+ if (checkingCharacters)
+ verifyXmlName (name);
+ if (name.startsWith ("xml:"))
+ element = createElementNS (null, name);
+ else
+ element = new DomElement (this, null, name);
+ defaultAttributes (element, name);
+ return element;
+ }
+
+
+ /**
+ * <b>DOM L2</b>
+ * Returns a newly created element with the specified name
+ * and namespace information.
+ */
+ public Element createElementNS (String namespaceURI, String name)
+ {
+ if (checkingCharacters)
+ verifyNamespaceName (name);
+
+ if ("".equals (namespaceURI))
+ namespaceURI = null;
+ if (name.startsWith ("xml:")) {
+ if (namespaceURI != null
+ && !xmlNamespace.equals (namespaceURI))
+ throw new DomEx (DomEx.NAMESPACE_ERR,
+ "xml namespace is always " + xmlNamespace, this, 0);
+ namespaceURI = xmlNamespace;
+ } else if (name.startsWith ("xmlns:"))
+ throw new DomEx (DomEx.NAMESPACE_ERR,
+ "xmlns is reserved", this, 0);
+ else if (namespaceURI == null && name.indexOf (':') != -1)
+ throw new DomEx (DomEx.NAMESPACE_ERR,
+ "prefixed name needs a URI", this, 0);
+
+ Element element = new DomElement (this, namespaceURI, name);
+ defaultAttributes (element, name);
+ return element;
+ }
+
+ private void defaultAttributes (Element element, String name)
+ {
+ DomDoctype doctype = (DomDoctype) getDoctype ();
+ DomDoctype.ElementInfo info;
+
+ if (doctype == null)
+ return;
+
+ // default any attributes that need it
+ info = doctype.getElementInfo (name);
+ for (Enumeration e = info.keys (); e.hasMoreElements (); /* NOP */) {
+ String attr = (String) e.nextElement ();
+ DomAttr node = (DomAttr) createAttribute (attr);
+
+ node.setValue ((String) info.get (attr));
+ node.setSpecified (false);
+ element.setAttributeNode (node);
+ }
+ }
+
+
+ /**
+ * <b>DOM L1</b>
+ * Returns a newly created document fragment.
+ */
+ public DocumentFragment createDocumentFragment ()
+ {
+ return new DomFragment (this);
+ }
+
+
+ /**
+ * <b>DOM L1</b>
+ * Returns a newly created text node with the specified value.
+ */
+ public Text createTextNode (String value)
+ {
+ if (checkingCharacters)
+ verifyXmlCharacters (value);
+ return new DomText (this, value);
+ }
+
+ /**
+ * Returns a newly created text node with the specified value.
+ */
+ public Text createTextNode (char buf [], int off, int len)
+ {
+ if (checkingCharacters)
+ verifyXmlCharacters (buf, off, len);
+ return new DomText (this, buf, off, len);
+ }
+
+
+ /**
+ * <b>DOM L1</b>
+ * Returns a newly created comment node with the specified value.
+ */
+ public Comment createComment (String value)
+ {
+ if (checkingCharacters)
+ verifyXmlCharacters (value);
+ return new DomComment (this, value);
+ }
+
+
+ /**
+ * <b>DOM L1</b>
+ * Returns a newly created CDATA section node with the specified value.
+ */
+ public CDATASection createCDATASection (String value)
+ {
+ if (checkingCharacters)
+ verifyXmlCharacters (value);
+ return new DomCDATA (this, value);
+ }
+
+
+ /**
+ * Returns a newly created CDATA section node with the specified value.
+ */
+ public CDATASection createCDATASection (char buf [], int off, int len)
+ {
+ if (checkingCharacters)
+ verifyXmlCharacters (buf, off, len);
+ return new DomCDATA (this, buf, off, len);
+ }
+
+
+ /**
+ * <b>DOM L1</b>
+ * Returns a newly created processing instruction.
+ */
+ public ProcessingInstruction createProcessingInstruction (
+ String target,
+ String data
+ )
+ {
+ if (checkingCharacters) {
+ verifyXmlName (target);
+ verifyXmlCharacters (data);
+ if ("xml".equalsIgnoreCase (target))
+ throw new DomEx (DomEx.SYNTAX_ERR,
+ "illegal PI target name", this, 0);
+ }
+ return new DomPI (this, target, data);
+ }
+
+
+ /**
+ * <b>DOM L1</b>
+ * Returns a newly created attribute with the specified name.
+ */
+ public Attr createAttribute (String name)
+ {
+ if (checkingCharacters)
+ verifyXmlName (name);
+ if (name.startsWith ("xml:") || name.startsWith ("xmlns:"))
+ return createAttributeNS (null, name);
+ else
+ return new DomAttr (this, null, name);
+ }
+
+
+ /**
+ * <b>DOM L2</b>
+ * Returns a newly created attribute with the specified name
+ * and namespace information.
+ */
+ public Attr createAttributeNS (String namespaceURI, String name)
+ {
+ if (checkingCharacters)
+ verifyNamespaceName (name);
+
+ if ("".equals (namespaceURI))
+ namespaceURI = null;
+ if (name.startsWith ("xml:")) {
+ if (namespaceURI == null)
+ namespaceURI = xmlNamespace;
+ else if (!xmlNamespace.equals (namespaceURI))
+ throw new DomEx (DomEx.NAMESPACE_ERR,
+ "xml namespace is always " + xmlNamespace, this, 0);
+ namespaceURI = xmlNamespace;
+
+ } else if (name.startsWith ("xmlns:") || name.equals ("xmlns")) {
+ if (!xmlnsURI.equals (namespaceURI))
+ throw new DomEx (DomEx.NAMESPACE_ERR,
+ "xmlns is reserved", this, 0);
+ namespaceURI = xmlnsURI;
+
+ } else if (namespaceURI == null && name.indexOf (':') != -1)
+ throw new DomEx (DomEx.NAMESPACE_ERR,
+ "prefixed name needs a URI: " + name, this, 0);
+
+ return new DomAttr (this, namespaceURI, name);
+ }
+
+
+ /**
+ * <b>DOM L1</b>
+ * Returns a newly created reference to the specified entity.
+ * The caller should populate this with the appropriate children
+ * and then mark it as readonly.
+ *
+ * @see DomNode#makeReadonly
+ */
+ public EntityReference createEntityReference (String name)
+ {
+ DomEntityReference retval;
+
+ if (checkingCharacters)
+ verifyXmlName (name);
+ retval = new DomEntityReference (this, name);
+ //
+ // If we have such an entity, it's allowed that one arrange that
+ // the children of this reference be "the same as" (in an undefined
+ // sense of "same", clearly not identity) the children of the entity.
+ // That can be immediate or deferred. It's also allowed that nothing
+ // be done -- we take that option here.
+ //
+ retval.makeReadonly ();
+ return retval;
+ }
+
+
+ /**
+ * <b>DOM L2</b>
+ * Makes a copy of the specified node, with all nodes "owned" by
+ * this document and with children optionally copied. This type
+ * of standard utility has become, well, a standard utility.
+ *
+ * <p> Note that EntityReference nodes created through this method (either
+ * directly, or recursively) never have children, and that there is no
+ * portable way to associate them with such children.
+ *
+ * <p> Note also that there is no requirement that the specified node
+ * be associated with a different document. This differs from the
+ * <em>cloneNode</em> operation in that the node itself is not given
+ * an opportunity to participate, so that any information managed
+ * by node subclasses will be lost.
+ */
+ public Node importNode (Node copiedNode, boolean deep)
+ {
+ switch (copiedNode.getNodeType ()) {
+ case TEXT_NODE:
+ return createTextNode (copiedNode.getNodeValue ());
+ case CDATA_SECTION_NODE:
+ return createCDATASection (copiedNode.getNodeValue ());
+ case COMMENT_NODE:
+ return createComment (copiedNode.getNodeValue ());
+ case PROCESSING_INSTRUCTION_NODE:
+ return createProcessingInstruction (
+ copiedNode.getNodeName (),
+ copiedNode.getNodeValue ());
+ case NOTATION_NODE:
+ {
+ // NOTE: There's no standard way to create
+ // these, or add them to a doctype. Useless.
+ Notation node = (Notation) copiedNode;
+ return new DomNotation (this, node.getNodeName (),
+ node.getPublicId (), node.getSystemId ());
+ }
+ case ENTITY_NODE:
+ {
+ // NOTE: There's no standard way to create
+ // these, or add them to a doctype. Useless.
+ Entity node = (Entity) copiedNode;
+
+ // FIXME if "deep", can/should copy children!
+
+ return new DomEntity (this, node.getNodeName (),
+ node.getPublicId (), node.getSystemId (),
+ node.getNotationName ());
+ }
+ case ENTITY_REFERENCE_NODE:
+ return createEntityReference (copiedNode.getNodeName ());
+ case DOCUMENT_FRAGMENT_NODE:
+ {
+ DocumentFragment node = createDocumentFragment ();
+ if (deep) {
+ NodeList kids = copiedNode.getChildNodes ();
+ int len = kids.getLength ();
+ for (int i = 0; i < len; i++)
+ node.appendChild (
+ importNode (kids.item (i), deep));
+ }
+ return node;
+ }
+ case ATTRIBUTE_NODE:
+ {
+ DomAttr retval;
+ String name = copiedNode.getNodeName ();
+ String ns = copiedNode.getNamespaceURI ();
+ NodeList kids = copiedNode.getChildNodes ();
+ int len = kids.getLength ();
+
+ if (ns != null)
+ retval = (DomAttr) createAttributeNS (ns, name);
+ else
+ retval = (DomAttr) createAttribute (name);
+
+ // this is _always_ done regardless of "deep" setting
+ for (int i = 0; i < len; i++)
+ retval.appendChild (importNode (kids.item (i), false));
+ return retval;
+ }
+ case ELEMENT_NODE:
+ {
+ DomElement retval;
+ String name = copiedNode.getNodeName ();
+ String ns = copiedNode.getNamespaceURI ();
+ NamedNodeMap attrs = copiedNode.getAttributes ();
+ int len = attrs.getLength ();
+
+ if (ns != null)
+ retval = (DomElement) createElementNS (ns, name);
+ else
+ retval = (DomElement) createElement (name);
+ for (int i = 0; i < len; i++) {
+ Attr attr = (Attr) attrs.item (i);
+ Attr dflt;
+
+ // maybe update defaulted attributes
+ dflt = retval.getAttributeNode (attr.getNodeName ());
+ if (dflt != null) {
+ String newval = attr.getNodeValue ();
+ if (!dflt.getNodeValue ().equals (newval)
+ || attr.getSpecified () == true)
+ dflt.setNodeValue (newval);
+ continue;
+ }
+
+ retval.setAttributeNode ((Attr)
+ importNode (attr, false));
+ }
+
+ if (!deep)
+ return retval;
+
+ NodeList kids = copiedNode.getChildNodes ();
+
+ len = kids.getLength ();
+ for (int i = 0; i < len; i++)
+ retval.appendChild (importNode (kids.item (i), true));
+
+ return retval;
+ }
+
+ // can't import document or doctype nodes
+ case DOCUMENT_NODE:
+ case DOCUMENT_TYPE_NODE:
+ // FALLTHROUGH
+
+ // can't import unrecognized or nonstandard nodes
+ default:
+ throw new DomEx (DomEx.NOT_SUPPORTED_ERR, null, copiedNode, 0);
+ }
+
+ // FIXME cleanup a bit -- for deep copies, copy those
+ // children in one place, here (code sharing is healthy)
+ }
+
+
+ /**
+ * <b>DOM L2 (Traversal)</b>
+ * Returns a newly created node iterator. Don't forget to detach
+ * this iterator when you're done using it!
+ *
+ * @see DomIterator
+ */
+ public NodeIterator createNodeIterator (
+ Node root,
+ int whatToShow,
+ NodeFilter filter,
+ boolean expandEntities
+ )
+ {
+ return new DomIterator (root, whatToShow, filter, expandEntities);
+ }
+
+
+
+ public TreeWalker createTreeWalker (
+ Node root,
+ int whatToShow,
+ NodeFilter filter,
+ boolean entityReferenceExpansion
+ )
+ {
+nyi (); // FIXME createTreeWalker
+ return null;
+ }
+}
diff --git a/external/jaxp/source/gnu/xml/dom/DomElement.java b/external/jaxp/source/gnu/xml/dom/DomElement.java
new file mode 100644
index 000000000..2986aa48c
--- /dev/null
+++ b/external/jaxp/source/gnu/xml/dom/DomElement.java
@@ -0,0 +1,343 @@
+/*
+ * $Id: DomElement.java,v 1.1 2003-02-01 02:10:15 cbj Exp $
+ * Copyright (C) 1999-2001 David Brownell
+ *
+ * This file is part of GNU JAXP, a library.
+ *
+ * GNU JAXP is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * GNU JAXP is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ * As a special exception, if you link this library with other files to
+ * produce an executable, this library does not by itself cause the
+ * resulting executable to be covered by the GNU General Public License.
+ * This exception does not however invalidate any other reasons why the
+ * executable file might be covered by the GNU General Public License.
+ */
+
+package gnu.xml.dom;
+
+import org.w3c.dom.*;
+
+
+// $Id: DomElement.java,v 1.1 2003-02-01 02:10:15 cbj Exp $
+
+/**
+ * <p> "Element" implementation.
+ *
+ * @author David Brownell
+ * @version $Date: 2003-02-01 02:10:15 $
+ */
+public class DomElement extends DomNsNode implements Element
+{
+ // Attributes are VERY expensive in DOM, and not just for
+ // this implementation. Avoid creating them.
+ private DomNamedNodeMap attributes;
+
+
+ /**
+ * Constructs an Element node associated with the specified document.
+ *
+ * <p>This constructor should only be invoked by a Document as part
+ * of its createElement functionality, or through a subclass which is
+ * similarly used in a "Sub-DOM" style layer.
+ *
+ * @param owner The document with which this node is associated
+ * @param namespaceURI Combined with the local part of the name,
+ * this is used to uniquely identify a type of element
+ * @param name Name of this element, which may include a prefix
+ */
+ protected DomElement (Document owner, String namespaceURI, String name)
+ {
+ super (owner, namespaceURI, name);
+ }
+
+
+ /**
+ * <b>DOM L1</b>
+ * Returns the element's attributes
+ */
+ public NamedNodeMap getAttributes ()
+ {
+ if (attributes == null)
+ attributes = new DomNamedNodeMap (getOwnerDocument (), this);
+ return attributes;
+ }
+
+
+ /**
+ * <b>DOM L2></b>
+ * Returns true iff this is an element node with attributes.
+ */
+ public boolean hasAttributes ()
+ { return attributes != null && attributes.getLength () != 0; }
+
+
+ /**
+ * Shallow clone of the element, except that associated
+ * attributes are (deep) cloned.
+ */
+ public Object clone ()
+ {
+ DomElement retval = (DomElement) super.clone ();
+ DomNamedNodeMap atts;
+
+ if (attributes == null)
+ return retval;
+
+ atts = new DomNamedNodeMap (getOwnerDocument (), retval);
+ retval.attributes = atts;
+ for (int i = 0; i < attributes.getLength (); i++) {
+ Node temp = attributes.item (i);
+
+ temp = temp.cloneNode (true);
+ atts.setNamedItem (temp);
+ }
+ return retval;
+ }
+
+
+ /**
+ * Marks this element, its children, and its associated attributes as
+ * readonly.
+ */
+ public void makeReadonly ()
+ {
+ super.makeReadonly ();
+ if (attributes != null)
+ attributes.makeReadonly ();
+ }
+
+ /**
+ * <b>DOM L1</b>
+ * Returns the element name (same as getNodeName).
+ */
+ final public String getTagName ()
+ {
+ return getNodeName ();
+ }
+
+ /**
+ * <b>DOM L1</b>
+ * Returns the constant ELEMENT_NODE.
+ */
+ final public short getNodeType ()
+ { return ELEMENT_NODE; }
+
+
+ /**
+ * <b>DOM L1</b>
+ * Returns the value of the specified attribute, or an
+ * empty string.
+ */
+ public String getAttribute (String name)
+ {
+ Attr attr = getAttributeNode (name);
+
+ if (attr == null)
+ return "";
+ else
+ return attr.getValue ();
+ }
+
+
+ /**
+ * <b>DOM L2</b>
+ * Returns true if the element has an attribute with the
+ * specified name (specified or DTD defaulted).
+ */
+ public boolean hasAttribute (String name)
+ {
+ return getAttributeNode (name) != null;
+ }
+
+
+ /**
+ * <b>DOM L2</b>
+ * Returns true if the element has an attribute with the
+ * specified name (specified or DTD defaulted).
+ */
+ public boolean hasAttributeNS (String namespaceURI, String local)
+ {
+ return getAttributeNodeNS (namespaceURI, local) != null;
+ }
+
+
+ /**
+ * <b>DOM L2</b>
+ * Returns the value of the specified attribute, or an
+ * empty string.
+ */
+ public String getAttributeNS (String namespaceURI, String local)
+ {
+ Attr attr = getAttributeNodeNS (namespaceURI, local);
+
+ if (attr == null)
+ return "";
+ else
+ return attr.getValue ();
+ }
+
+
+ /**
+ * <b>DOM L1</b>
+ * Returns the appropriate attribute node; the name is the
+ * nodeName property of the attribute.
+ */
+ public Attr getAttributeNode (String name)
+ {
+ if (attributes == null)
+ return null;
+
+ return (Attr) attributes.getNamedItem (name);
+ }
+
+
+ /**
+ * <b>DOM L2</b>
+ * Returns the appropriate attribute node; the name combines
+ * the namespace name and the local part.
+ */
+ public Attr getAttributeNodeNS (String namespace, String localPart)
+ {
+ if (attributes == null)
+ return null;
+
+ return (Attr) attributes.getNamedItemNS (namespace, localPart);
+ }
+
+
+ /**
+ * <b>DOM L1</b>
+ * Modifies an existing attribute to have the specified value,
+ * or creates a new one with that value. The name used is the
+ * nodeName value.
+ */
+ public void setAttribute (String name, String value)
+ {
+ Attr attr = getAttributeNode (name);
+
+ if (attr != null) {
+ attr.setNodeValue (value);
+ return;
+ }
+ attr = getOwnerDocument ().createAttribute (name);
+ attr.setNodeValue (value);
+ setAttributeNode (attr);
+ }
+
+
+ /**
+ * <b>DOM L2</b>
+ * Modifies an existing attribute to have the specified value,
+ * or creates a new one with that value.
+ */
+ public void setAttributeNS (String uri, String aname, String value)
+ {
+ if (("xmlns".equals (aname) || aname.startsWith ("xmlns:"))
+ && !DomDocument.xmlnsURI.equals (uri))
+ throw new DomEx (DomEx.NAMESPACE_ERR,
+ "setting xmlns attribute to illegal value", this, 0);
+
+ Attr attr = getAttributeNodeNS (uri, aname);
+
+ if (attr != null) {
+ attr.setNodeValue (value);
+ return;
+ }
+ attr = getOwnerDocument ().createAttributeNS (uri, aname);
+ attr.setNodeValue (value);
+ setAttributeNodeNS (attr);
+ }
+
+
+ /**
+ * <b>DOM L1</b>
+ * Stores the specified attribute, optionally overwriting any
+ * existing one with that name.
+ */
+ public Attr setAttributeNode (Attr attr)
+ {
+ return (Attr) getAttributes ().setNamedItem (attr);
+ }
+
+ /**
+ * <b>DOM L2</b>
+ * Stores the specified attribute, optionally overwriting any
+ * existing one with that name.
+ */
+ public Attr setAttributeNodeNS (Attr attr)
+ {
+ return (Attr) getAttributes ().setNamedItemNS (attr);
+ }
+
+ /**
+ * <b>DOM L1</b>
+ * Removes the appropriate attribute node.
+ * If there is no such node, this is (bizarrely enough) a NOP so you
+ * won't see exceptions if your code deletes non-existent attributes.
+ *
+ * <p>Note that since there is no portable way for DOM to record
+ * DTD information, default values for attributes will never be
+ * provided automatically.
+ */
+ public void removeAttribute (String name)
+ {
+ if (attributes == null)
+ return;
+ // throw new DomEx (DomEx.NOT_FOUND_ERR, name, null, 0);
+
+ try {
+ attributes.removeNamedItem (name);
+ } catch (DomEx e) {
+ if (e.code == DomEx.NOT_FOUND_ERR)
+ return;
+ }
+ }
+
+
+ /**
+ * <b>DOM L1</b>
+ * Removes the appropriate attribute node; the name is the
+ * nodeName property of the attribute.
+ *
+ * <p>Note that since there is no portable way for DOM to record
+ * DTD information, default values for attributes will never be
+ * provided automatically.
+ */
+ public Attr removeAttributeNode (Attr node)
+ {
+ if (attributes == null)
+ throw new DomEx (DomEx.NOT_FOUND_ERR, null, node, 0);
+
+ return (Attr) attributes.removeNamedItem (node.getNodeName ());
+ }
+
+
+ /**
+ * <b>DOM L2</b>
+ * Removes the appropriate attribute node; the name combines
+ * the namespace name and the local part.
+ *
+ * <p>Note that since there is no portable way for DOM to record
+ * DTD information, default values for attributes will never be
+ * provided automatically.
+ */
+ public void removeAttributeNS (String namespace, String localPart)
+ {
+ if (attributes == null)
+ throw new DomEx (DomEx.NOT_FOUND_ERR, localPart, null, 0);
+
+ attributes.removeNamedItemNS (namespace, localPart);
+ }
+}
diff --git a/external/jaxp/source/gnu/xml/dom/DomEntity.java b/external/jaxp/source/gnu/xml/dom/DomEntity.java
new file mode 100644
index 000000000..c9f388581
--- /dev/null
+++ b/external/jaxp/source/gnu/xml/dom/DomEntity.java
@@ -0,0 +1,115 @@
+/*
+ * $Id: DomEntity.java,v 1.1 2003-02-01 02:10:15 cbj Exp $
+ * Copyright (C) 1999-2001 David Brownell
+ *
+ * This file is part of GNU JAXP, a library.
+ *
+ * GNU JAXP is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * GNU JAXP is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ * As a special exception, if you link this library with other files to
+ * produce an executable, this library does not by itself cause the
+ * resulting executable to be covered by the GNU General Public License.
+ * This exception does not however invalidate any other reasons why the
+ * executable file might be covered by the GNU General Public License.
+ */
+
+package gnu.xml.dom;
+
+import org.w3c.dom.*;
+
+
+// $Id: DomEntity.java,v 1.1 2003-02-01 02:10:15 cbj Exp $
+
+/**
+ * <p> "Entity" implementation. This is a non-core DOM class, supporting the
+ * "XML" feature. There are two types of entities, neither of which works
+ * particularly well in this API:</p><dl>
+ *
+ * <dt><em>Unparsed Entities</em></dt>
+ * <dd>Since ENTITY/ENTITIES attributes, the only legal use of unparsed
+ * entities in XML, can't be detected with DOM, there isn't much point in
+ * trying to use unparsed entities in DOM applications. (XML Linking is
+ * working to provide a better version of this functionality.) </dd>
+ *
+ * <dt><em>Parsed Entities</em></dt>
+ * <dd> While the DOM specification permits nodes for parsed entities
+ * to have a readonly set of children, this is not required and there
+ * is no portable way to provide such children. <em>This implementation
+ * currently does not permit children to be added to Entities.</em>
+ * There are related issues with the use of EntityReference nodes. </dd>
+ *
+ * </dl>
+ *
+ * <p> In short, <em>avoid using this DOM functionality</em>.
+ *
+ * @see DomDoctype
+ * @see DomEntityReference
+ * @see DomNotation
+ *
+ * @author David Brownell
+ * @version $Date: 2003-02-01 02:10:15 $
+ */
+public class DomEntity extends DomExtern implements Entity
+{
+ private String notation;
+
+
+ /**
+ * Constructs an Entity node associated with the specified document,
+ * with the specified descriptive data.
+ *
+ * <p>This constructor should only be invoked by a DomDoctype as part
+ * of its declareEntity functionality, or through a subclass which is
+ * similarly used in a "Sub-DOM" style layer.
+ *
+ * @param owner The document with which this entity is associated
+ * @param name Name of this entity
+ * @param publicId If non-null, provides the entity's PUBLIC identifier
+ * @param systemId Provides the entity's SYSTEM identifier (URI)
+ * @param notation If non-null, provides the unparsed entity's notation.
+ */
+ protected DomEntity (
+ Document owner,
+ String name,
+ String publicId,
+ String systemId,
+ String notation
+ )
+ {
+ super (owner, name, publicId, systemId);
+ this.notation = notation;
+
+ // NOTE: if notation == null, this is a parsed entity
+ // which could reasonably be given child nodes ...
+ makeReadonly ();
+ }
+
+
+ /**
+ * <b>DOM L1</b>
+ * Returns the NOTATION identifier associated with this entity, if any.
+ */
+ final public String getNotationName ()
+ {
+ return notation;
+ }
+
+ /**
+ * <b>DOM L1</b>
+ * Returns the constant ENTITY_NODE.
+ */
+ final public short getNodeType ()
+ { return ENTITY_NODE; }
+}
diff --git a/external/jaxp/source/gnu/xml/dom/DomEntityReference.java b/external/jaxp/source/gnu/xml/dom/DomEntityReference.java
new file mode 100644
index 000000000..cba5b5f17
--- /dev/null
+++ b/external/jaxp/source/gnu/xml/dom/DomEntityReference.java
@@ -0,0 +1,106 @@
+/*
+ * $Id: DomEntityReference.java,v 1.1 2003-02-01 02:10:15 cbj Exp $
+ * Copyright (C) 1999-2001 David Brownell
+ *
+ * This file is part of GNU JAXP, a library.
+ *
+ * GNU JAXP is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * GNU JAXP is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ * As a special exception, if you link this library with other files to
+ * produce an executable, this library does not by itself cause the
+ * resulting executable to be covered by the GNU General Public License.
+ * This exception does not however invalidate any other reasons why the
+ * executable file might be covered by the GNU General Public License.
+ */
+
+package gnu.xml.dom;
+
+import org.w3c.dom.*;
+
+
+// $Id: DomEntityReference.java,v 1.1 2003-02-01 02:10:15 cbj Exp $
+
+/**
+ * <p> "EntityReference" implementation (reference to parsed entity).
+ * This is a non-core DOM class, supporting the "XML" feature.
+ * It does not represent builtin entities (such as "&amp;amp;")
+ * or character references, which are always directly expanded in
+ * DOM trees.</p>
+ *
+ * <p> Note that while the DOM specification permits these nodes to have
+ * a readonly set of children, this is not required. Similarly, it does
+ * not require a DOM to couple EntityReference nodes with any Entity nodes
+ * that have the same entity name (and equivalent children). It also
+ * effectively guarantees that references created directly or indirectly
+ * through the <em>Document.ImportNode</em> method will not have children.
+ * The level of functionality you may get is extremely variable.
+ *
+ * <p> Also significant is that even at their most functional level, the fact
+ * that EntityReference children must be readonly has caused significant
+ * problems when modifying work products held in DOM trees. Other problems
+ * include issues related to undeclared namespace prefixes (and references
+ * to the current default namespace) that may be found in the text of such
+ * parsed entities nodes. These must be contextually bound as part of DOM
+ * tree construction. When such nodes are moved, the namespace associated
+ * with a given prefix (or default) may change to be in conflict with the
+ * namespace bound to the node at creation time.
+ *
+ * <p> In short, <em>avoid using this DOM functionality</em>.
+ *
+ * @see DomDoctype
+ * @see DomEntity
+ *
+ * @author David Brownell
+ * @version $Date: 2003-02-01 02:10:15 $
+ */
+public class DomEntityReference extends DomNode implements EntityReference
+{
+ private String name;
+
+
+ /**
+ * Constructs an EntityReference node associated with the specified
+ * document. The creator should populate this with whatever contents
+ * are appropriate, and then mark it as readonly.
+ *
+ * <p>This constructor should only be invoked by a Document as part of
+ * its createEntityReference functionality, or through a subclass which
+ * is similarly used in a "Sub-DOM" style layer.
+ *
+ * @see DomNode#makeReadonly
+ */
+ protected DomEntityReference (Document owner, String name)
+ {
+ super (owner);
+ this.name = name;
+ }
+
+
+ /**
+ * <b>DOM L1</b>
+ * Returns the name of the referenced entity.
+ */
+ final public String getNodeName ()
+ {
+ return name;
+ }
+
+ /**
+ * <b>DOM L1</b>
+ * Returns the constant ENTITY_REFERENCE_NODE.
+ */
+ final public short getNodeType ()
+ { return ENTITY_REFERENCE_NODE; }
+}
diff --git a/external/jaxp/source/gnu/xml/dom/DomEvent.java b/external/jaxp/source/gnu/xml/dom/DomEvent.java
new file mode 100644
index 000000000..f5bf5a55d
--- /dev/null
+++ b/external/jaxp/source/gnu/xml/dom/DomEvent.java
@@ -0,0 +1,275 @@
+/*
+ * $Id: DomEvent.java,v 1.1 2003-02-01 02:10:15 cbj Exp $
+ * Copyright (C) 1999-2001 David Brownell
+ *
+ * This file is part of GNU JAXP, a library.
+ *
+ * GNU JAXP is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * GNU JAXP is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ * As a special exception, if you link this library with other files to
+ * produce an executable, this library does not by itself cause the
+ * resulting executable to be covered by the GNU General Public License.
+ * This exception does not however invalidate any other reasons why the
+ * executable file might be covered by the GNU General Public License.
+ */
+
+package gnu.xml.dom;
+
+import org.w3c.dom.*;
+import org.w3c.dom.events.*;
+import org.w3c.dom.views.AbstractView; // used by UIEvent
+
+
+// $Id: DomEvent.java,v 1.1 2003-02-01 02:10:15 cbj Exp $
+
+/**
+ * "Event" implementation. Events are
+ * created (through DocumentEvent interface methods on the document object),
+ * and are sent to any target node in the document.
+ *
+ * <p> Applications may define application specific event subclasses, but
+ * should otherwise use the <em>DocumentTraversal</em> interface to acquire
+ * event objects.
+ *
+ * @author David Brownell
+ * @version $Date: 2003-02-01 02:10:15 $
+ */
+public class DomEvent implements Event
+{
+ String type; // init
+ EventTarget target;
+ EventTarget currentNode;
+ short eventPhase;
+ boolean bubbles; // init
+ boolean cancelable; // init
+ long timeStamp; // ?
+
+ /** Returns the event's type (name) as initialized */
+ final public String getType () { return type; }
+
+ /**
+ * Returns event's target; delivery of an event is initiated
+ * by a <em>target.dispatchEvent(event)</em> invocation.
+ */
+ final public EventTarget getTarget () { return target; }
+
+ /**
+ * Returns the target to which events are currently being
+ * delivered. When capturing or bubbling, this will not
+ * be what <em>getTarget</em> returns.
+ */
+ final public EventTarget getCurrentTarget () { return currentNode; }
+
+ /**
+ * Returns CAPTURING_PHASE, AT_TARGET, or BUBBLING;
+ * only meaningful within EventListener.handleEvent
+ */
+ final public short getEventPhase () { return eventPhase; }
+
+ /**
+ * Returns true if the news of the event bubbles to tree tops
+ * (as specified during initialization).
+ */
+ final public boolean getBubbles () { return bubbles; }
+
+ /**
+ * Returns true if the default handling may be canceled
+ * (as specified during initialization).
+ */
+ final public boolean getCancelable () { return cancelable; }
+
+ /**
+ * Returns the event's timestamp.
+ */
+ final public long getTimeStamp () { return timeStamp; }
+
+ boolean stop;
+ boolean doDefault;
+
+
+ /**
+ * Requests the event no longer be captured or bubbled; only
+ * listeners on the event target will see the event, if they
+ * haven't yet been notified.
+ *
+ * <p> <em> Avoid using this </em> except for application-specific
+ * events, for which you the protocol explicitly "blesses" the use
+ * of this with some event types. Otherwise, you are likely to break
+ * algorithms which depend on event notification either directly or
+ * through bubbling or capturing. </p>
+ *
+ * <p> Note that this method is not final, specifically to enable
+ * enforcing of policies about events always propagating. </p>
+ */
+ public void stopPropagation () { stop = true; }
+
+
+ /**
+ * Requests that whoever dispatched the event not perform their
+ * default processing when event delivery completes. Initializes
+ * event timestamp.
+ */
+ final public void preventDefault () { doDefault = false; }
+
+ /** Initializes basic event state. */
+ public void initEvent (
+ String typeArg,
+ boolean canBubbleArg,
+ boolean cancelableArg
+ ) {
+ eventPhase = 0;
+ type = typeArg;
+ bubbles = canBubbleArg;
+ cancelable = cancelableArg;
+ timeStamp = System.currentTimeMillis ();
+ }
+
+ /** Constructs, but does not initialize, an event. */
+ public DomEvent (String type) { this.type = type; }
+
+ /**
+ * Returns a basic printable description of the event's type,
+ * state, and delivery conditions
+ */
+ public String toString ()
+ {
+ StringBuffer buf = new StringBuffer ("[Event ");
+ buf.append (type);
+ switch (eventPhase) {
+ case CAPTURING_PHASE: buf.append (", CAPTURING"); break;
+ case AT_TARGET: buf.append (", AT TARGET"); break;
+ case BUBBLING_PHASE: buf.append (", BUBBLING"); break;
+ default: buf.append (", (inactive)"); break;
+ }
+ if (bubbles && eventPhase != BUBBLING_PHASE)
+ buf.append (", bubbles");
+ if (cancelable)
+ buf.append (", can cancel");
+ // were we to provide subclass info, this's where it'd live
+ buf.append ("]");
+ return buf.toString ();
+ }
+
+
+ /**
+ * "MutationEvent" implementation.
+ */
+ public static final class DomMutationEvent extends DomEvent
+ implements MutationEvent
+ {
+ // package private
+ Node relatedNode; // init
+
+ private String prevValue; // init
+ private String newValue; // init
+
+ private String attrName; // init
+ private short attrChange; // init
+
+ /** Returns any "related" node provided by this type of event */
+ final public Node getRelatedNode () { return relatedNode; }
+ /** Returns any "previous value" provided by this type of event */
+ final public String getPrevValue () { return prevValue; }
+ /** Returns any "new value" provided by this type of event */
+ final public String getNewValue () { return newValue; }
+
+ /** For attribute change events, returns the attribute's name */
+ final public String getAttrName () { return attrName; }
+ /** For attribute change events, returns how the attribuet changed */
+ final public short getAttrChange () { return attrChange; }
+
+ /** Initializes a mutation event */
+ public final void initMutationEvent (
+ String typeArg,
+ boolean canBubbleArg,
+ boolean cancelableArg,
+ Node relatedNodeArg,
+ String prevValueArg,
+ String newValueArg,
+ String attrNameArg,
+ short attrChangeArg
+ ) {
+ // super.initEvent is inlined here for speed
+ // (mutation events are issued on all DOM changes)
+ eventPhase = 0;
+ type = typeArg;
+ bubbles = canBubbleArg;
+ cancelable = cancelableArg;
+ timeStamp = System.currentTimeMillis ();
+
+ relatedNode = relatedNodeArg;
+ prevValue = prevValueArg;
+ newValue = newValueArg;
+ attrName = attrNameArg;
+ attrChange = attrChangeArg;
+ }
+
+ // clear everything that should be GC-able
+ void clear ()
+ {
+ type = null;
+ target = null;
+ relatedNode = null;
+ currentNode = null;
+ prevValue = newValue = attrName = null;
+ }
+
+ /** Constructs an uninitialized mutation event. */
+ public DomMutationEvent (String type) { super (type); }
+ }
+
+
+ /**
+ * "UIEvent" implementation.
+ */
+ public static class DomUIEvent extends DomEvent
+ implements UIEvent
+ {
+ private AbstractView view; // init
+ private int detail; // init
+
+ /** Constructs an uninitialized User Interface (UI) event */
+ public DomUIEvent (String type) { super (type); }
+
+ final public AbstractView getView () { return view; }
+ final public int getDetail () { return detail; }
+
+ /** Initializes a UI event */
+ final public void initUIEvent (
+ String typeArg,
+ boolean canBubbleArg,
+ boolean cancelableArg,
+ AbstractView viewArg,
+ int detailArg
+ ) {
+ super.initEvent (typeArg, canBubbleArg, cancelableArg);
+ view = viewArg;
+ detail = detailArg;
+ }
+ }
+
+
+ /*
+
+ static final class DomMouseEvent extends DomUIEvent
+ implements MouseEvent
+ {
+ // another half dozen state variables/accessors
+ }
+
+ */
+
+}
+
diff --git a/external/jaxp/source/gnu/xml/dom/DomEx.java b/external/jaxp/source/gnu/xml/dom/DomEx.java
new file mode 100644
index 000000000..7b8fa9ace
--- /dev/null
+++ b/external/jaxp/source/gnu/xml/dom/DomEx.java
@@ -0,0 +1,150 @@
+/*
+ * $Id: DomEx.java,v 1.1 2003-02-01 02:10:15 cbj Exp $
+ * Copyright (C) 1999-2001 David Brownell
+ *
+ * This file is part of GNU JAXP, a library.
+ *
+ * GNU JAXP is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * GNU JAXP is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ * As a special exception, if you link this library with other files to
+ * produce an executable, this library does not by itself cause the
+ * resulting executable to be covered by the GNU General Public License.
+ * This exception does not however invalidate any other reasons why the
+ * executable file might be covered by the GNU General Public License.
+ */
+
+package gnu.xml.dom;
+
+import org.w3c.dom.*;
+
+
+// $Id: DomEx.java,v 1.1 2003-02-01 02:10:15 cbj Exp $
+
+/**
+ * <p> DOMException implementation. The version that
+ * is provided by the W3C is abstract, so it can't be instantiated.
+ *
+ * <p> This also provides a bit more information about the error
+ * that is being reported, in terms of the relevant DOM structures
+ * and data.
+ *
+ * @author David Brownell
+ * @version $Date: 2003-02-01 02:10:15 $
+ */
+public class DomEx extends DOMException
+{
+ /** @serial Data that caused an error to be reported */
+ private String data;
+
+ /** @serial Node associated with the error. */
+ private Node node;
+
+ /** @serial Data associated with the error. */
+ private int value;
+
+ /**
+ * Constructs an exception, with the diagnostic message
+ * corresponding to the specified code.
+ */
+ public DomEx (short code)
+ {
+ super (code, diagnostic (code));
+ }
+
+ /**
+ * Constructs an exception, with the diagnostic message
+ * corresponding to the specified code and additional
+ * information as provided.
+ */
+ public DomEx (short code, String data, Node node, int value)
+ {
+ super (code, diagnostic (code));
+ this.data = data;
+ this.node = node;
+ this.value = value;
+ }
+
+ /** Returns the node to which the diagnotic applies, or null. */
+ final public Node getNode () { return node; }
+
+ /** Returns data to which the diagnotic applies, or null. */
+ final public String getData () { return data; }
+
+ /** Returns data to which the diagnotic applies, or null. */
+ final public int getValue () { return value; }
+
+
+ /**
+ * Returns a diagnostic message that may be slightly more useful
+ * than the generic one, where possible.
+ */
+ public String getMessage ()
+ {
+ String retval = super.getMessage ();
+
+ if (data != null)
+ retval += "\nMore Information: " + data;
+ if (value != 0)
+ retval += "\nNumber: " + value;
+ if (node != null)
+ retval += "\nNode Name: " + node.getNodeName ();
+ return retval;
+ }
+
+
+ // these strings should be localizable.
+
+ private static String diagnostic (short code)
+ {
+ switch (code) {
+
+ // DOM L1:
+ case INDEX_SIZE_ERR:
+ return "An index or size is out of range.";
+ case DOMSTRING_SIZE_ERR:
+ return "A string is too big.";
+ case HIERARCHY_REQUEST_ERR:
+ return "The node doesn't belong here.";
+ case WRONG_DOCUMENT_ERR:
+ return "The node belongs in another document.";
+ case INVALID_CHARACTER_ERR:
+ return "That character is not permitted.";
+ case NO_DATA_ALLOWED_ERR:
+ return "This node does not permit data.";
+ case NO_MODIFICATION_ALLOWED_ERR:
+ return "No changes are allowed.";
+ case NOT_FOUND_ERR:
+ return "The node was not found in that context.";
+ case NOT_SUPPORTED_ERR:
+ return "That object is not supported.";
+ case INUSE_ATTRIBUTE_ERR:
+ return "The attribute belongs to a different element.";
+
+ // DOM L2:
+ case INVALID_STATE_ERR:
+ return "The object is not usable.";
+ case SYNTAX_ERR:
+ return "An illegal string was provided.";
+ case INVALID_MODIFICATION_ERR:
+ return "An object's type may not be changed.";
+ case NAMESPACE_ERR:
+ return "The operation violates XML Namespaces.";
+ case INVALID_ACCESS_ERR:
+ return "Parameter or operation isn't supported by this node.";
+ }
+ return "Reserved exception number: " + code;
+ }
+
+}
diff --git a/external/jaxp/source/gnu/xml/dom/DomExtern.java b/external/jaxp/source/gnu/xml/dom/DomExtern.java
new file mode 100644
index 000000000..6582e858b
--- /dev/null
+++ b/external/jaxp/source/gnu/xml/dom/DomExtern.java
@@ -0,0 +1,108 @@
+/*
+ * $Id: DomExtern.java,v 1.1 2003-02-01 02:10:15 cbj Exp $
+ * Copyright (C) 1999-2001 David Brownell
+ *
+ * This file is part of GNU JAXP, a library.
+ *
+ * GNU JAXP is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * GNU JAXP is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ * As a special exception, if you link this library with other files to
+ * produce an executable, this library does not by itself cause the
+ * resulting executable to be covered by the GNU General Public License.
+ * This exception does not however invalidate any other reasons why the
+ * executable file might be covered by the GNU General Public License.
+ */
+
+package gnu.xml.dom;
+
+import org.w3c.dom.*;
+
+
+// $Id: DomExtern.java,v 1.1 2003-02-01 02:10:15 cbj Exp $
+
+/**
+ * <p> Abstract implemention of nodes describing external DTD-related
+ * objects. This facilitates reusing code for Entity, Notation, and
+ * DocumentType (really, external subset) nodes. Such support is not
+ * part of the core DOM; it's for the "XML" feature. </p>
+ *
+ * <p> Note that you are strongly advised to avoid using the DOM
+ * features that take advantage of this class, since (as of L2) none
+ * of them is defined fully enough to permit full use of the
+ * XML feature they partially expose. </p>
+ *
+ * @author David Brownell
+ * @version $Date: 2003-02-01 02:10:15 $
+ */
+public abstract class DomExtern extends DomNode
+{
+ private String name;
+ private String publicId;
+ private String systemId;
+
+
+ /**
+ * Constructs a node associated with the specified document,
+ * with the specified descriptive data.
+ *
+ * @param owner The document with which this object is associated
+ * @param name Name of this object
+ * @param publicId If non-null, provides the entity's PUBLIC identifier
+ * @param systemId If non-null, provides the entity's SYSTEM identifier
+ */
+ // package private
+ DomExtern (
+ Document owner,
+ String name,
+ String publicId,
+ String systemId
+ )
+ {
+ super (owner);
+ this.name = name;
+ this.publicId = publicId;
+ this.systemId = systemId;
+ }
+
+
+ /**
+ * <b>DOM L1</b>
+ * Returns the SYSTEM identifier associated with this object, if any.
+ */
+ final public String getSystemId ()
+ {
+ return systemId;
+ }
+
+
+ /**
+ * <b>DOM L1</b>
+ * Returns the PUBLIC identifier associated with this object, if any.
+ */
+ final public String getPublicId ()
+ {
+ return publicId;
+ }
+
+
+ /**
+ * <b>DOM L1</b>
+ * Returns the object's name.
+ */
+ final public String getNodeName ()
+ {
+ return name;
+ }
+}
diff --git a/external/jaxp/source/gnu/xml/dom/DomFragment.java b/external/jaxp/source/gnu/xml/dom/DomFragment.java
new file mode 100644
index 000000000..fd35ec679
--- /dev/null
+++ b/external/jaxp/source/gnu/xml/dom/DomFragment.java
@@ -0,0 +1,72 @@
+/*
+ * $Id: DomFragment.java,v 1.1 2003-02-01 02:10:15 cbj Exp $
+ * Copyright (C) 1999-2001 David Brownell
+ *
+ * This file is part of GNU JAXP, a library.
+ *
+ * GNU JAXP is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * GNU JAXP is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ * As a special exception, if you link this library with other files to
+ * produce an executable, this library does not by itself cause the
+ * resulting executable to be covered by the GNU General Public License.
+ * This exception does not however invalidate any other reasons why the
+ * executable file might be covered by the GNU General Public License.
+ */
+
+package gnu.xml.dom;
+
+import org.w3c.dom.*;
+
+
+// $Id: DomFragment.java,v 1.1 2003-02-01 02:10:15 cbj Exp $
+
+/**
+ * <p> "DocumentFragment" implementation. </p>
+ *
+ * @author David Brownell
+ * @version $Date: 2003-02-01 02:10:15 $
+ */
+public class DomFragment extends DomNode implements DocumentFragment
+{
+ /**
+ * Constructs a DocumentFragment node associated with the
+ * specified document.
+ *
+ * <p>This constructor should only be invoked by a Document as part of
+ * its createDocumentFragment functionality, or through a subclass which
+ * is similarly used in a "Sub-DOM" style layer.
+ */
+ protected DomFragment (Document owner)
+ {
+ super (owner);
+ }
+
+
+ /**
+ * <b>DOM L1</b>
+ * Returns the string "#document-fragment".
+ */
+ final public String getNodeName ()
+ {
+ return "#document-fragment";
+ }
+
+ /**
+ * <b>DOM L1</b>
+ * Returns the constant DOCUMENT_FRAGMENT_NODE.
+ */
+ final public short getNodeType ()
+ { return DOCUMENT_FRAGMENT_NODE; }
+}
diff --git a/external/jaxp/source/gnu/xml/dom/DomImpl.java b/external/jaxp/source/gnu/xml/dom/DomImpl.java
new file mode 100644
index 000000000..f27131bb5
--- /dev/null
+++ b/external/jaxp/source/gnu/xml/dom/DomImpl.java
@@ -0,0 +1,176 @@
+/*
+ * $Id: DomImpl.java,v 1.1 2003-02-01 02:10:15 cbj Exp $
+ * Copyright (C) 1999-2001 David Brownell
+ *
+ * This file is part of GNU JAXP, a library.
+ *
+ * GNU JAXP is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * GNU JAXP is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ * As a special exception, if you link this library with other files to
+ * produce an executable, this library does not by itself cause the
+ * resulting executable to be covered by the GNU General Public License.
+ * This exception does not however invalidate any other reasons why the
+ * executable file might be covered by the GNU General Public License.
+ */
+
+package gnu.xml.dom;
+
+import java.util.Vector;
+
+import org.w3c.dom.*;
+
+
+// $Id: DomImpl.java,v 1.1 2003-02-01 02:10:15 cbj Exp $
+
+/**
+ * <p> "DOMImplementation" implementation. </p>
+ *
+ * <p> At this writing, the following features are supported: "XML" (L1, L2),
+ * "Events" (L2), "MutationEvents" (L2), "USER-Events" (a conformant extension),
+ * "HTMLEvents" (L2), "UIEvents" (L2), "Traversal" (L2). It is possible to
+ * compile the package so it doesn't support some of these features (notably,
+ * Traversal).
+ *
+ * @author David Brownell
+ * @version $Date: 2003-02-01 02:10:15 $
+ */
+public class DomImpl implements DOMImplementation
+{
+ /**
+ * Constructs a DOMImplementation object which supports
+ * "XML" and other DOM Level 2 features.
+ */
+ public DomImpl () {}
+
+ /**
+ * <b>DOM L1</b>
+ * Returns true if the specified feature and version are
+ * supported. Note that the case of the feature name is ignored.
+ */
+ public boolean hasFeature (String name, String version)
+ {
+ name = name.toLowerCase ();
+
+ if ("xml".equals (name) || "core".equals (name)) {
+ if (version == null || version.equals (""))
+ return true;
+ if ("1.0".equals (version))
+ return true;
+ if ("2.0".equals (version))
+ return true;
+
+ } else if ("events".equals (name)
+ || "mutationevents".equals (name)
+ || "uievents".equals (name)
+ // || "mouseevents".equals (name)
+ || "htmlevents".equals (name)
+ ) {
+ if (version == null || version.equals (""))
+ return true;
+ if ("2.0".equals (version))
+ return true;
+
+ // Extension: "USER-" prefix event types can
+ // be created and passed through the DOM.
+
+ } else if ("user-events".equals (name)) {
+ if (version == null || version.equals (""))
+ return true;
+ if ("0.1".equals (version))
+ return true;
+
+ // NOTE: "hasFeature" for events is here interpreted to
+ // mean the DOM can manufacture those sorts of events,
+ // since actually choosing to report the events is more
+ // often part of the environment or application. It's
+ // only really an issue for mutation events.
+
+ } else if (DomNode.reportMutations
+ && "traversal".equals (name)) {
+
+ // Note: nyet tree walker support ...
+
+ if (version == null || version.equals (""))
+ return true;
+ if ("2.0".equals (version))
+ return true;
+ }
+
+ // views
+ // stylesheets
+ // css, css2
+ // range
+
+ return false;
+ }
+
+
+ /**
+ * <b>DOM L2</b>
+ * Creates and returns a DocumentType, associated with this
+ * implementation. This DocumentType can have no associated
+ * objects (notations, entities) until the DocumentType is
+ * first associated with a document.
+ *
+ * <p> Note that there is no implication that this DTD will
+ * be parsed by the DOM, or ever have contents. Moreover, the
+ * DocumentType created here can only be added to a document by
+ * the createDocument method (below). <em>That means that the only
+ * portable way to create a Document object is to start parsing,
+ * queue comment and processing instruction (PI) nodes, and then only
+ * create a DOM Document after <b>(a)</b> it's known if a DocumentType
+ * object is needed, and <b>(b) the name and namespace of the root
+ * element is known. Queued comment and PI nodes would then be
+ * inserted appropriately in the document prologue, both before and
+ * after the DTD node, and additional attributes assigned to the
+ * root element.</em>
+ * (One hopes that the final DOM REC fixes this serious botch.)
+ */
+ public DocumentType createDocumentType (
+ String rootName,
+ String publicId,
+ String systemId
+ // CR2 deleted internal subset, ensuring DocumentType
+ // is 100% useless instead of just 90% so.
+ ) {
+ DomDocument.verifyNamespaceName (rootName);
+ return new DomDoctype (this, rootName, publicId, systemId, null);
+ }
+
+
+ /**
+ * <b>DOM L2</b>
+ * Creates and returns a Document, populated only with a root element and
+ * optionally a document type (if that was provided).
+ */
+ public Document createDocument (
+ String namespaceURI,
+ String rootName,
+ DocumentType doctype
+ ) {
+ Document doc = new DomDocument (this);
+ Element root;
+
+ root = doc.createElementNS (namespaceURI, rootName);
+ if (rootName.startsWith ("xmlns:"))
+ throw new DomEx (DomEx.NAMESPACE_ERR,
+ "xmlns is reserved", null, 0);
+ // Bleech -- L2 seemingly _requires_ omission of xmlns attributes.
+ if (doctype != null)
+ doc.appendChild (doctype); // handles WRONG_DOCUMENT error
+ doc.appendChild (root);
+ return doc;
+ }
+}
diff --git a/external/jaxp/source/gnu/xml/dom/DomIterator.java b/external/jaxp/source/gnu/xml/dom/DomIterator.java
new file mode 100644
index 000000000..d2b6f4ad3
--- /dev/null
+++ b/external/jaxp/source/gnu/xml/dom/DomIterator.java
@@ -0,0 +1,324 @@
+/*
+ * $Id: DomIterator.java,v 1.1 2003-02-01 02:10:16 cbj Exp $
+ * Copyright (C) 1999-2001 David Brownell
+ *
+ * This file is part of GNU JAXP, a library.
+ *
+ * GNU JAXP is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * GNU JAXP is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ * As a special exception, if you link this library with other files to
+ * produce an executable, this library does not by itself cause the
+ * resulting executable to be covered by the GNU General Public License.
+ * This exception does not however invalidate any other reasons why the
+ * executable file might be covered by the GNU General Public License.
+ */
+
+package gnu.xml.dom;
+
+import java.util.Vector;
+
+import org.w3c.dom.*;
+import org.w3c.dom.events.*;
+import org.w3c.dom.traversal.*;
+
+
+// $Id: DomIterator.java,v 1.1 2003-02-01 02:10:16 cbj Exp $
+
+/**
+ * <p> "NodeIterator" implementation, usable with any L2 DOM which
+ * supports MutationEvents. </p>
+ *
+ * @author David Brownell
+ * @version $Date: 2003-02-01 02:10:16 $
+ */
+final public class DomIterator implements NodeIterator, EventListener
+{
+ private Node reference;
+ private boolean right;
+ private boolean done;
+
+ private final Node root;
+ private final int whatToShow;
+ private final NodeFilter filter;
+ private final boolean expandEntityReferences;
+
+
+ /**
+ * Constructs and initializes an iterator.
+ */
+ protected DomIterator (
+ Node root,
+ int whatToShow,
+ NodeFilter filter,
+ boolean entityReferenceExpansion
+ ) {
+ if (!root.isSupported ("MutationEvents", "2.0"))
+ throw new DomEx (DomEx.NOT_SUPPORTED_ERR,
+ "Iterator needs mutation events", root, 0);
+
+ this.root = root;
+ this.whatToShow = whatToShow;
+ this.filter = filter;
+ this.expandEntityReferences = entityReferenceExpansion;
+
+ // start condition: going right, seen nothing yet.
+ reference = null;
+ right = true;
+
+ EventTarget target = (EventTarget) root;
+ target.addEventListener ("DOMNodeRemoved", this, false);
+ }
+
+
+ /**
+ * <b>DOM L2</b>
+ * Flags the iterator as done, unregistering its event listener so
+ * that the iterator can be garbage collected without relying on weak
+ * references (a "Java 2" feature) in the event subsystem.
+ */
+ public void detach ()
+ {
+ EventTarget target = (EventTarget) root;
+ target.removeEventListener ("DOMNodeRemoved", this, false);
+ done = true;
+ }
+
+
+ /**
+ * <b>DOM L2</b>
+ * Returns the flag controlling whether iteration descends
+ * through entity references.
+ */
+ public boolean getExpandEntityReferences ()
+ {
+ return expandEntityReferences;
+ }
+
+
+ /**
+ * <b>DOM L2</b>
+ * Returns the filter provided during construction.
+ */
+ public NodeFilter getFilter ()
+ {
+ return filter;
+ }
+
+
+ /**
+ * <b>DOM L2</b>
+ * Returns the root of the tree this is iterating through.
+ */
+ public Node getRoot ()
+ {
+ return root;
+ }
+
+
+ /**
+ * <b>DOM L2</b>
+ * Returns the mask of flags provided during construction.
+ */
+ public int getWhatToShow ()
+ {
+ return whatToShow;
+ }
+
+
+ /**
+ * <b>DOM L2</b>
+ * Returns the next node in a forward iteration, masked and filtered.
+ * Note that the node may be read-only due to entity expansions.
+ * A null return indicates the iteration is complete, but may still
+ * be processed backwards.
+ */
+ public Node nextNode ()
+ {
+ if (done)
+ throw new DomEx (DomEx.INVALID_STATE_ERR);
+ right = true;
+ return walk (true);
+ }
+
+
+ /**
+ * <b>DOM L2</b>
+ * Returns the next node in a backward iteration, masked and filtered.
+ * Note that the node may be read-only due to entity expansions.
+ * A null return indicates the iteration is complete, but may still
+ * be processed forwards.
+ */
+ public Node previousNode ()
+ {
+ if (done)
+ throw new DomEx (DomEx.INVALID_STATE_ERR);
+ Node previous = reference;
+ right = false;
+ walk (false);
+ return previous;
+ }
+
+ private boolean shouldShow (Node node)
+ // raises Runtime exceptions indirectly, via acceptNode()
+ {
+ if ((whatToShow & (1 << (node.getNodeType () - 1))) == 0)
+ return false;
+ if (filter == null)
+ return true;
+ return filter.acceptNode (node) == NodeFilter.FILTER_ACCEPT;
+ }
+
+ //
+ // scenario: root = 1, sequence = 1 2 ... 3 4
+ // forward walk: 1 2 ... 3 4 null
+ // then backward: 4 3 ... 2 1 null
+ //
+ // At the leftmost end, "previous" == null
+ // At the rightmost end, "previous" == 4
+ //
+ // The current draft spec really seem to make no sense re the
+ // role of the reference node, so what it says is ignored here.
+ //
+ private Node walk (boolean forward)
+ {
+ Node here = reference;
+
+ while ((here = successor (here, forward)) != null
+ && !shouldShow (here))
+ continue;
+ if (here != null || !forward)
+ reference = here;
+ return here;
+ }
+
+ private boolean isLeaf (Node here)
+ {
+ boolean leaf = !here.hasChildNodes ();
+ if (!leaf && !expandEntityReferences)
+ leaf = (here.getNodeType () == Node.ENTITY_REFERENCE_NODE);
+ return leaf;
+ }
+
+ //
+ // Returns the immediate successor in a forward (or backward)
+ // document order walk, sans filtering ... except that it knows
+ // how to stop, returning null when done. This is a depth first
+ // preorder traversal when run in the forward direction.
+ //
+ private Node successor (Node here, boolean forward)
+ {
+ Node next;
+
+ // the "leftmost" end is funky
+ if (here == null)
+ return forward ? root : null;
+
+ //
+ // Forward, this is preorder: children before siblings.
+ // Backward, it's postorder: we saw the children already.
+ //
+ if (forward && !isLeaf (here))
+ return here.getFirstChild ();
+
+ //
+ // Siblings ... if forward, we visit them, if backwards
+ // we visit their children first.
+ //
+ if (forward) {
+ if ((next = here.getNextSibling ()) != null)
+ return next;
+ } else if ((next = here.getPreviousSibling ()) != null) {
+ if (isLeaf (next))
+ return next;
+ next = next.getLastChild ();
+ while (!isLeaf (next))
+ next = next.getLastChild ();
+ return next;
+ }
+
+ //
+ // We can't go down or lateral -- it's up, then. The logic is
+ // the converse of what's above: backwards is easy (the parent
+ // is next), forwards isn't.
+ //
+ next = here.getParentNode ();
+ if (!forward)
+ return next;
+
+ Node temp = null;
+ while (next != null
+ && next != root
+ && (temp = next.getNextSibling ()) == null)
+ next = next.getParentNode ();
+ if (next == root)
+ return null;
+ return temp;
+ }
+
+
+ /**
+ * Not for public use. This lets the iterator know when its
+ * reference node will be removed from the tree, so that a new
+ * one may be selected.
+ *
+ * <p> This version works by watching removal events as they
+ * bubble up. So, don't prevent them from bubbling.
+ */
+ public void handleEvent (Event e)
+ {
+ MutationEvent event;
+ Node ancestor, removed;
+
+ if (reference == null
+ || !"DOMNodeRemoved".equals (e.getType ())
+ || e.getEventPhase () != Event.BUBBLING_PHASE)
+ return;
+
+ event = (MutationEvent) e;
+ removed = (Node) event.getTarget ();
+
+ // See if the removal will cause trouble for this iterator
+ // by being the reference node or an ancestor of it.
+ for (ancestor = reference;
+ ancestor != null && ancestor != root;
+ ancestor = ancestor.getParentNode ()) {
+ if (ancestor == removed)
+ break;
+ }
+ if (ancestor != removed)
+ return;
+
+ // OK, it'll cause trouble. We want to make the "next"
+ // node in our current traversal direction seem right.
+ // So we pick the nearest node that's not getting removed,
+ // but go in the _opposite_ direction from our current
+ // traversal ... so the "next" doesn't skip anything.
+ Node candidate;
+
+search:
+ while ((candidate = walk (!right)) != null) {
+ for (ancestor = candidate;
+ ancestor != null && ancestor != root;
+ ancestor = ancestor.getParentNode ()) {
+ if (ancestor == removed)
+ continue search;
+ }
+ return;
+ }
+
+ // The current DOM WD talks about a special case here;
+ // I've not yet seen it.
+ }
+}
diff --git a/external/jaxp/source/gnu/xml/dom/DomNamedNodeMap.java b/external/jaxp/source/gnu/xml/dom/DomNamedNodeMap.java
new file mode 100644
index 000000000..f1312df9b
--- /dev/null
+++ b/external/jaxp/source/gnu/xml/dom/DomNamedNodeMap.java
@@ -0,0 +1,346 @@
+/*
+ * $Id: DomNamedNodeMap.java,v 1.1 2003-02-01 02:10:16 cbj Exp $
+ * Copyright (C) 1999-2001 David Brownell
+ *
+ * This file is part of GNU JAXP, a library.
+ *
+ * GNU JAXP is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * GNU JAXP is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ * As a special exception, if you link this library with other files to
+ * produce an executable, this library does not by itself cause the
+ * resulting executable to be covered by the GNU General Public License.
+ * This exception does not however invalidate any other reasons why the
+ * executable file might be covered by the GNU General Public License.
+ */
+
+package gnu.xml.dom;
+
+import java.util.Vector;
+
+import org.w3c.dom.*;
+
+
+// $Id: DomNamedNodeMap.java,v 1.1 2003-02-01 02:10:16 cbj Exp $
+
+/**
+ * <p> "NamedNodeMap" implementation. </p>
+ * Used mostly to hold element attributes, but sometimes also
+ * to list notations or entities.
+ *
+ * @author David Brownell
+ * @version $Date: 2003-02-01 02:10:16 $
+ */
+public class DomNamedNodeMap implements NamedNodeMap
+{
+ private final Document owner;
+
+ private DomNode contents [] = new DomNode [1];
+ private int length;
+ private boolean readonly;
+ private final Element element;
+
+ private static final int DELTA = 5;
+
+
+ /**
+ * Constructs an empty map associated with the specified document.
+ */
+ public DomNamedNodeMap (Document owner)
+ {
+ this.owner = owner;
+ this.element = null;
+ }
+
+ // package private
+ DomNamedNodeMap (Document owner, Element element)
+ {
+ this.owner = owner;
+ this.element = element;
+ }
+
+ /**
+ * Reduces space utilization for this object.
+ */
+ public void compact ()
+ {
+ if (contents.length != length)
+ setCapacity (length);
+ }
+
+ private void setCapacity (int len)
+ {
+ DomNode newContents [] = new DomNode [len];
+
+ System.arraycopy (contents, 0, newContents, 0, length);
+ contents = newContents;
+ }
+
+ /**
+ * Exposes the internal "readonly" flag. In DOM, all NamedNodeMap
+ * objects found in a DocumentType object are read-only (after
+ * they are fully constructed), and those holding attributes of
+ * a readonly element will also be readonly.
+ */
+ final public boolean isReadonly ()
+ {
+ return readonly;
+ }
+
+
+ /**
+ * Sets the internal "readonly" flag so the node and its
+ * children can't be changed.
+ */
+ public void makeReadonly ()
+ {
+ readonly = true;
+ for (int i = 0; i < length; i++)
+ contents [i].makeReadonly ();
+ }
+
+
+ /**
+ * <b>DOM L1</b>
+ * Returns the named item from the map, or null; names are just
+ * the nodeName property.
+ */
+ public Node getNamedItem (String name)
+ {
+ for (int i = 0; i < length; i++) {
+ if (contents [i].getNodeName ().equals (name))
+ return contents [i];
+ }
+ return null;
+ }
+
+
+ /**
+ * <b>DOM L2</b>
+ * Returns the named item from the map, or null; names are the
+ * localName and namespaceURI properties, ignoring any prefix.
+ */
+ public Node getNamedItemNS (String namespaceURI, String localName)
+ {
+ for (int i = 0; i < length; i++) {
+ DomNode temp = contents [i];
+ String tempName = temp.getLocalName ();
+ String ns;
+
+ if (tempName != null && tempName.equals (localName)) {
+ ns = temp.getNamespaceURI ();
+ if ((ns == null && namespaceURI == null)
+ || ns.equals (namespaceURI)) {
+ return temp;
+ }
+ }
+ }
+ return null;
+ }
+
+
+ private void checkAttr (Attr arg)
+ {
+ if (element == null)
+ return;
+
+ Element argOwner = arg.getOwnerElement ();
+
+ if (argOwner != null) {
+ if (argOwner != element)
+ throw new DomEx (DomEx.INUSE_ATTRIBUTE_ERR);
+ return;
+ }
+
+ // We can't escape implementation dependencies here; we let
+ // the Java runtime deal with error reporting
+ ((DomAttr)arg).setOwnerElement (element);
+ }
+
+
+ /**
+ * <b>DOM L1</b>
+ * Stores the named item into the map, optionally overwriting
+ * any existing node with that name. The name used is just
+ * the nodeName attribute.
+ */
+ public Node setNamedItem (Node arg)
+ {
+ if (readonly)
+ throw new DomEx (DomEx.NO_MODIFICATION_ALLOWED_ERR);
+ if (arg.getOwnerDocument () != owner)
+ throw new DomEx (DomEx.WRONG_DOCUMENT_ERR);
+ if (arg instanceof Attr)
+ checkAttr ((Attr) arg);
+
+ String name = arg.getNodeName ();
+
+// maybe attribute ADDITION events (?)
+
+ for (int i = 0; i < length; i++) {
+ Node temp = contents [i];
+ if (temp.getNodeName ().equals (name)) {
+ contents [i] = (DomNode) arg;
+ return temp;
+ }
+ }
+ if (length == contents.length)
+ setCapacity (length + DELTA);
+ contents [length++] = (DomNode) arg;
+ return null;
+ }
+
+
+ /**
+ * <b>DOM L2</b>
+ * Stores the named item into the map, optionally overwriting
+ * any existing node with that fully qualified name. The name
+ * used incorporates the localName and namespaceURI properties,
+ * and ignores any prefix.
+ */
+ public Node setNamedItemNS (Node arg)
+ {
+ if (readonly)
+ throw new DomEx (DomEx.NO_MODIFICATION_ALLOWED_ERR);
+ if (arg.getOwnerDocument () != owner)
+ throw new DomEx (DomEx.WRONG_DOCUMENT_ERR);
+ if (arg instanceof Attr)
+ checkAttr ((Attr) arg);
+
+ String localName = arg.getLocalName ();
+ String namespaceURI = arg.getNamespaceURI ();
+
+ if (localName == null)
+ throw new DomEx (DomEx.INVALID_ACCESS_ERR);
+
+ for (int i = 0; i < length; i++) {
+ DomNode temp = contents [i];
+ String tempName = temp.getLocalName ();
+ String ns;
+
+ if (tempName != null && tempName.equals (localName)) {
+ ns = temp.getNamespaceURI ();
+ if ((ns == null && namespaceURI == null)
+ || ns.equals (namespaceURI)) {
+ contents [i] = (DomNode) arg;
+ return temp;
+ }
+ }
+ }
+ if (length == contents.length)
+ setCapacity (length + DELTA);
+ contents [length++] = (DomNode) arg;
+ return null;
+ }
+
+ private void maybeRestoreDefault (String uri, String name)
+ {
+ DomDoctype doctype = (DomDoctype)owner.getDoctype ();
+ DomDoctype.ElementInfo info;
+ String value;
+ DomAttr attr;
+
+ if (doctype == null)
+ return;
+ if ((info = doctype.getElementInfo (element.getNodeName ())) == null)
+ return;
+ if ((value = info.getAttrDefault (name)) == null)
+ return;
+ if (uri == null)
+ attr = (DomAttr) owner.createAttribute (name);
+ else
+ attr = (DomAttr) owner.createAttributeNS (uri, name);
+ attr.setNodeValue (value);
+ attr.setSpecified (false);
+ setNamedItem (attr);
+ }
+
+ /**
+ * <b>DOM L1</b>
+ * Removes the named item from the map, or reports an exception;
+ * names are just the nodeName property.
+ */
+ public Node removeNamedItem (String name)
+ {
+ if (readonly)
+ throw new DomEx (DomEx.NO_MODIFICATION_ALLOWED_ERR);
+
+// report attribute REMOVAL event?
+
+ for (int i = 0; i < length; i++) {
+ DomNode temp = contents [i];
+ if (temp.getNodeName ().equals (name)) {
+ System.arraycopy (contents, i+1, contents, i,
+ length - (i + 1));
+ contents [--length] = null;
+ if (element != null)
+ maybeRestoreDefault (temp.getNamespaceURI (), name);
+ return temp;
+ }
+ }
+ throw new DomEx (DomEx.NOT_FOUND_ERR);
+ }
+
+
+ /**
+ * <b>DOM L2</b>
+ * Removes the named item from the map, or reports an exception;
+ * names are the localName and namespaceURI properties.
+ */
+ public Node removeNamedItemNS (String namespaceURI, String localName)
+ {
+ if (readonly)
+ throw new DomEx (DomEx.NO_MODIFICATION_ALLOWED_ERR);
+
+ for (int i = 0; i < length; i++) {
+ DomNode temp = contents [i];
+ String tempName = temp.getLocalName ();
+ String ns;
+
+ if (tempName != null && tempName.equals (localName)) {
+ ns = temp.getNamespaceURI ();
+ if ((ns == null && namespaceURI == null)
+ || ns.equals (namespaceURI)) {
+ System.arraycopy (contents, i+1, contents, i,
+ length - (i + 1));
+ contents [--length] = null;
+ if (element != null)
+ maybeRestoreDefault (ns, temp.getNodeName ());
+ return temp;
+ }
+ }
+ }
+ throw new DomEx (DomEx.NOT_FOUND_ERR);
+ }
+
+
+ /**
+ * <b>DOM L1</b>
+ * Returns the indexed item from the map, or null.
+ */
+ public Node item (int index)
+ {
+ if (index < 0 || index >= length)
+ return null;
+ return contents [index];
+ }
+
+
+ /**
+ * <b>DOM L1</b>
+ * Returns the length of the map.
+ */
+ public int getLength ()
+ { return length; }
+}
diff --git a/external/jaxp/source/gnu/xml/dom/DomNode.java b/external/jaxp/source/gnu/xml/dom/DomNode.java
new file mode 100644
index 000000000..efe07b591
--- /dev/null
+++ b/external/jaxp/source/gnu/xml/dom/DomNode.java
@@ -0,0 +1,1571 @@
+/*
+ * $Id: DomNode.java,v 1.1 2003-02-01 02:10:17 cbj Exp $
+ * Copyright (C) 1999-2001 David Brownell
+ *
+ * This file is part of GNU JAXP, a library.
+ *
+ * GNU JAXP is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * GNU JAXP is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ * As a special exception, if you link this library with other files to
+ * produce an executable, this library does not by itself cause the
+ * resulting executable to be covered by the GNU General Public License.
+ * This exception does not however invalidate any other reasons why the
+ * executable file might be covered by the GNU General Public License.
+ */
+
+package gnu.xml.dom;
+
+import org.w3c.dom.*;
+import org.w3c.dom.events.*;
+import org.w3c.dom.traversal.*;
+
+
+// $Id: DomNode.java,v 1.1 2003-02-01 02:10:17 cbj Exp $
+
+/**
+ * <p> "Node", "EventTarget", and "DocumentEvent" implementation.
+ * This provides most of the core DOM functionality; only more
+ * specialized features are provided by subclasses. Those subclasses may
+ * have some particular constraints they must implement, by overriding
+ * methods defined here. Such constraints are noted here in the method
+ * documentation. </p>
+ *
+ * <p> Note that you can create events with type names prefixed with "USER-",
+ * and pass them through this DOM. This lets you use the DOM event scheme
+ * for application specific purposes, although you must use a predefined event
+ * structure (such as MutationEvent) to pass data along with those events.
+ * Test for existence of this feature with the "USER-Events" DOM feature
+ * name.</p>
+ *
+ * <p> Other kinds of events you can send include the "html" events,
+ * like "load", "unload", "abort", "error", and "blur"; and the mutation
+ * events. If this DOM has been compiled with mutation event support
+ * enabled, it will send mutation events when you change parts of the
+ * tree; otherwise you may create and send such events yourself, but
+ * they won't be generated by the DOM itself. </p>
+ *
+ * <p> Note that there is a namespace-aware name comparison method,
+ * <em>nameAndTypeEquals</em>, which compares the names (and types) of
+ * two nodes in conformance with the "Namespaces in XML" specification.
+ * While mostly intended for use with elements and attributes, this should
+ * also be helpful for ProcessingInstruction nodes and some others which
+ * do not have namespace URIs.
+ *
+ * @author David Brownell
+ * @version $Date: 2003-02-01 02:10:17 $
+ */
+public abstract class DomNode
+ implements Node, NodeList, EventTarget, DocumentEvent, Cloneable
+{
+ //
+ // CLASS DATA
+ //
+
+ // tunable
+ // NKIDS_* affects arrays of children (which grow)
+ // (currently) fixed size:
+ // ANCESTORS_* is for event capture/bubbling, # ancestors
+ // NOTIFICATIONS_* is for per-node event delivery, # events
+ private static final int NKIDS_INIT = 5;
+ private static final int NKIDS_DELTA = 8;
+ private static final int ANCESTORS_INIT = 20;
+ private static final int NOTIFICATIONS_INIT = 10;
+
+ // tunable: enable mutation events or not? Enabling it costs about
+ // 10-15% in DOM construction time, last time it was measured.
+
+ // package private !!!
+ static final boolean reportMutations = true;
+
+ // locking protocol changeable only within this class
+ private static final Object lockNode = new Object ();
+
+ // optimize space to share what we can
+ private static final DomNode noKids [] = new DomNode [0];
+
+
+ // NON-FINAL class data
+
+ // Optimize event dispatch by not allocating memory each time
+ private static boolean dispatchDataLock;
+ private static DomNode ancestors []
+ = new DomNode [ANCESTORS_INIT];
+ private static ListenerRecord notificationSet []
+ = new ListenerRecord [NOTIFICATIONS_INIT];
+
+ // Ditto for the (most common) event object itself!
+ private static boolean eventDataLock;
+ private static DomEvent.DomMutationEvent mutationEvent
+ = new DomEvent.DomMutationEvent (null);
+
+ //
+ // PER-INSTANCE DATA
+ //
+
+ private Document owner;
+ private DomNode parent;
+
+ // Bleech ... "package private" so a builder can populate entity refs.
+ // writable during construction. DOM spec is nasty.
+ boolean readonly;
+
+ // children
+ private DomNode children [];
+ private int length;
+
+ // event registrations
+ private ListenerRecord listeners [];
+ private int nListeners;
+
+ // Optimize access to siblings by caching indices.
+ private transient int parentIndex;
+
+ //
+ // Some of the methods here are declared 'final' because
+ // knowledge about their implementation is built into this
+ // class -- for both integrity and performance.
+ //
+
+ // package private
+ void nyi ()
+ {
+ throw new DomEx (DomEx.NOT_SUPPORTED_ERR,
+ "feature not yet implemented", this, 0);
+ }
+
+ /**
+ * Reduces space utilization for this node.
+ */
+ public void compact ()
+ {
+ if (children != null && children != noKids) {
+ if (length == 0)
+ children = noKids;
+ // allow a bit of fuzz (max NKIDS_DELTA).
+ // the JVM won't always use less memory for smaller arrays...
+ else if ((children.length - length) > 1) {
+ DomNode newKids [] = new DomNode [length];
+ System.arraycopy (children, 0, newKids, 0, length);
+ children = newKids;
+ }
+ }
+ if (listeners != null && listeners.length != nListeners) {
+ if (nListeners == 0)
+ listeners = null;
+ else {
+ ListenerRecord l [] = new ListenerRecord [nListeners];
+ System.arraycopy (listeners, 0, l, 0, nListeners);
+ listeners = l;
+ }
+ }
+ }
+
+ /**
+ * Constructs a node and associates it with its owner. Only
+ * Document and DocumentType nodes may be created with no owner,
+ * and DocumentType nodes get an owner as soon as they are
+ * associated with a document.
+ */
+ protected DomNode (Document owner)
+ {
+ short type = getNodeType ();
+
+ if (owner == null) {
+ // DOM calls never go down this path
+ if (type != DOCUMENT_NODE && type != DOCUMENT_TYPE_NODE)
+ throw new IllegalArgumentException ("no owner!");
+ }
+ this.owner = owner;
+
+ switch (type) {
+ case DOCUMENT_NODE:
+ case DOCUMENT_FRAGMENT_NODE:
+ case ENTITY_REFERENCE_NODE:
+ case ELEMENT_NODE:
+ children = new DomNode [NKIDS_INIT];
+ break;
+ // no sane app wants the attributes-with-children model
+ case ATTRIBUTE_NODE:
+ children = new DomNode [1];
+ break;
+ // we don't currently build children with entities
+ case ENTITY_NODE:
+ children = noKids;
+
+ // no other kinds of nodes may have children; so for
+ // such nodes, length stays zero, children stays null
+ }
+ }
+
+
+ /**
+ * <b>DOM L1</b>
+ * Returns null; Element subclasses must override this method.
+ */
+ public NamedNodeMap getAttributes ()
+ { return null; }
+
+ /**
+ * <b>DOM L2></b>
+ * Returns true iff this is an element node with attributes.
+ */
+ public boolean hasAttributes ()
+ { return false; }
+
+ /**
+ * <b>DOM L1</b>
+ * Returns a list, possibly empty, of the children of this node.
+ * In this implementation, to conserve memory, nodes are the same
+ * as their list of children. This can have ramifications for
+ * subclasses, which may need to provide their own getLength method
+ * for reasons unrelated to the NodeList method of the same name.
+ */
+ public NodeList getChildNodes ()
+ { return this; }
+
+
+ /**
+ * <b>DOM L1</b>
+ * Returns the first child of this node, or null if there are none.
+ */
+ final public Node getFirstChild ()
+ { return item (0); }
+
+
+ /**
+ * <b>DOM L1</b>
+ * Returns the last child of this node, or null if there are none.
+ */
+ final public Node getLastChild ()
+ { return item (length - 1); }
+
+
+ /**
+ * <b>DOM L1</b>
+ * Returns true if this node has children.
+ */
+ final public boolean hasChildNodes ()
+ { return length > 0; }
+
+
+ /**
+ * Exposes the internal "readonly" flag. In DOM, children of
+ * entities and entity references are readonly, as are the
+ * objects associated with DocumentType objets.
+ */
+ final public boolean isReadonly ()
+ {
+ return readonly;
+ }
+
+
+ /**
+ * Sets the internal "readonly" flag so this subtree can't be changed.
+ * Subclasses need to override this method for any associated content
+ * that's not a child node, such as an element's attributes or the
+ * (few) declarations associated with a DocumentType.
+ */
+ public void makeReadonly ()
+ {
+ readonly = true;
+
+ for (int i = 0; i < length; i++)
+ children [i].makeReadonly ();
+ }
+
+
+ // we need to have at least N more kids
+ private void ensureEnough (int n)
+ {
+ if ((children.length - length) > n)
+ return;
+
+ // don't grow in micro-chunks
+ if (n < NKIDS_DELTA)
+ n = NKIDS_DELTA;
+ n += children.length;
+
+ DomNode newKids [] = new DomNode [n];
+
+ for (int i = 0; i < length; i++)
+ newKids [i] = children [i];
+ children = newKids;
+ }
+
+ // just checks the node for inclusion -- may be called many
+ // times (docfrag) before anything is allowed to change
+ private void checkMisc (DomNode child)
+ {
+ if (readonly)
+ throw new DomEx (DomEx.NO_MODIFICATION_ALLOWED_ERR,
+ null, this, 0);
+ if (children == null)
+ throw new DomEx (DomEx.HIERARCHY_REQUEST_ERR,
+ null, this, 0);
+ if (parent != null && child.length > 0) {
+ for (Node temp = parent;
+ temp != null;
+ temp = temp.getParentNode ()) {
+ if (child == parent)
+ throw new DomEx (DomEx.HIERARCHY_REQUEST_ERR,
+ "can't make ancestor into a child", this, 0);
+ }
+ }
+
+ Node myOwner = owner;
+ Node newOwner = child.owner;
+ short nodeType = getNodeType ();
+ short newType = child.getNodeType ();
+
+ if (nodeType == DOCUMENT_NODE)
+ myOwner = this;
+
+ if (newOwner != myOwner) {
+ // new in DOM L2, this case -- patch it up later, in reparent()
+ if (!(newType == DOCUMENT_TYPE_NODE && newOwner == null))
+ throw new DomEx (DomEx.WRONG_DOCUMENT_ERR,
+ null, child, 0);
+ }
+
+ // Test code.
+ // System.out.println("DOMNode node type = " + nodeType
+ // + " new type: " + newType);
+
+ // if (newType == 3)
+ // System.out.println("child content = " + child.getNodeValue());
+
+ // enforce various structural constraints
+ switch (nodeType) {
+ case DOCUMENT_NODE:
+ if (newType == ELEMENT_NODE
+ || newType == PROCESSING_INSTRUCTION_NODE
+ || newType == COMMENT_NODE
+ || newType == DOCUMENT_TYPE_NODE)
+ return;
+ break;
+
+ case ATTRIBUTE_NODE:
+ if (newType == TEXT_NODE || newType == ENTITY_REFERENCE_NODE)
+ return;
+ break;
+
+ case DOCUMENT_FRAGMENT_NODE:
+ case ENTITY_REFERENCE_NODE:
+ case ELEMENT_NODE:
+ case ENTITY_NODE:
+ if (newType == ELEMENT_NODE
+ || newType == TEXT_NODE
+ || newType == COMMENT_NODE
+ || newType == PROCESSING_INSTRUCTION_NODE
+ || newType == CDATA_SECTION_NODE
+ || newType == ENTITY_REFERENCE_NODE)
+ return;
+ }
+ throw new DomEx (DomEx.HIERARCHY_REQUEST_ERR,
+ "this node can't have that type of child", this, 0);
+ }
+
+ //
+ // NOTE: after this method, the new child knows its parent,
+ // but the parent doesn't know the child. Don't let that
+ // intermediate state be seen by the application.
+ //
+ // XXX prefer to pass in a mutation event object, making removeChild reuse
+ // it appropriately. That'll shorten critical paths, and remove the
+ // guarantee that the three-message replaceChild case will hit the heap.
+ //
+ private void reparent (DomNode newChild)
+ {
+ short childType = newChild.getNodeType ();
+
+ if (getNodeType () == DOCUMENT_NODE
+ && childType == DOCUMENT_TYPE_NODE) {
+ DomDoctype doctype = (DomDoctype) newChild;
+
+ if (doctype.getImplementation ()
+ != ((Document)this).getImplementation ())
+ throw new DomEx (DomEx.WRONG_DOCUMENT_ERR,
+ "implementation mismatch", newChild, 0);
+ newChild.owner = (Document) this;
+ }
+
+ // get rid of old parent
+ Node oldParent = newChild.parent;
+
+ if (oldParent != null)
+ oldParent.removeChild (newChild);
+
+ if (childType != ATTRIBUTE_NODE)
+ newChild.parent = this;
+ }
+
+
+ // Here's hoping a good optimizer will detect the case when the
+ // next several methods are never called, and won't allocate
+ // object code space of any kind. (Case: not reporting any
+ // mutation events. We can also remove some static variables
+ // listed above.)
+
+
+ private void insertionEvent (
+ DomEvent.DomMutationEvent event,
+ DomNode target
+ ) {
+ boolean doFree = false;
+
+ if (event == null) {
+ event = getMutationEvent ();
+ if (event != null)
+ doFree = true;
+ else
+ event = new DomEvent.DomMutationEvent (null);
+ }
+ event.initMutationEvent ("DOMNodeInserted",
+ true /* bubbles */, false /* nocancel */,
+ this /* related */, null, null, null, (short) 0);
+ target.dispatchEvent (event);
+
+ // XXX should really visit every descendant of 'target'
+ // and sent a DOMNodeInsertedIntoDocument event to it...
+ // bleech, there's no way to keep that acceptably fast.
+
+ if (doFree) {
+ event.target = null;
+ event.relatedNode = null;
+ event.currentNode = null;
+ eventDataLock = false;
+ } // else we created work for the GC
+ }
+
+
+ private void removalEvent (
+ DomEvent.DomMutationEvent event,
+ DomNode target
+ ) {
+ boolean doFree = false;
+
+ if (event == null) {
+ event = getMutationEvent ();
+ if (event != null)
+ doFree = true;
+ else
+ event = new DomEvent.DomMutationEvent (null);
+ }
+ event.initMutationEvent ("DOMNodeRemoved",
+ true /* bubbles */, false /* nocancel */,
+ this /* related */, null, null, null, (short) 0);
+ target.dispatchEvent (event);
+
+ // XXX should really visit every descendant of 'target'
+ // and sent a DOMNodeRemovedFromDocument event to it...
+ // bleech, there's no way to keep that acceptably fast.
+
+ event.target = null;
+ event.relatedNode = null;
+ event.currentNode = null;
+ if (doFree)
+ eventDataLock = false;
+ // else we created more work for the GC
+ }
+
+ //
+ // Avoid creating lots of memory management work, by using a simple
+ // allocation strategy for the mutation event objects that get used
+ // at least once per tree modification. We can't use stack allocation,
+ // so we do the next simplest thing -- more or less, static allocation.
+ // Concurrent notifications should be rare, anyway.
+ //
+ // Returns the preallocated object, which needs to be carefully freed,
+ // or null to indicate the caller needs to allocate their own.
+ //
+ static private DomEvent.DomMutationEvent getMutationEvent ()
+ {
+ synchronized (lockNode) {
+ if (eventDataLock)
+ return null;
+ eventDataLock = true;
+ return mutationEvent;
+ }
+ }
+
+ // NOTE: this is manually inlined in the insertion
+ // and removal event methods above; change in sync.
+ static private void freeMutationEvent ()
+ {
+ // clear fields to enable GC
+ mutationEvent.clear ();
+ eventDataLock = false;
+ }
+
+
+ /**
+ * <b>DOM L1</b>
+ * Appends the specified node to this node's list of children.
+ * Document subclasses must override this to enforce the restrictions
+ * that there be only one element and document type child.
+ *
+ * <p> Causes a DOMNodeInserted mutation event to be reported.
+ * Will first cause a DOMNodeRemoved event to be reported if the
+ * parameter already has a parent. If the new child is a document
+ * fragment node, both events will be reported for each child of
+ * the fragment; the order in which children are removed and
+ * inserted is implementation-specific.
+ *
+ * <p> If this DOM has been compiled without mutation event support,
+ * these events will not be reported.
+ */
+ public Node appendChild (Node newChild)
+ {
+ try {
+ DomNode child = (DomNode) newChild;
+
+ if (newChild.getNodeType () != DOCUMENT_FRAGMENT_NODE) {
+ checkMisc (child);
+ if (!(length < children.length))
+ ensureEnough (1);
+ reparent (child);
+ children [length++] = child;
+ if (reportMutations)
+ insertionEvent (null, child);
+ } else {
+ // See if we can append all the nodes in the fragment
+ for (int i = 0; i < child.length; i++)
+ checkMisc (child.children [i]);
+
+ // yep -- do so!
+ ensureEnough (child.length);
+ for (int i = 0; i <= child.length; i++)
+ appendChild (child.children [0]);
+ }
+ return child;
+
+ } catch (ClassCastException e) {
+ throw new DomEx (DomEx.WRONG_DOCUMENT_ERR,
+ null, newChild, 0);
+ }
+ }
+
+
+ /**
+ * <b>DOM L1</b>
+ * Inserts the specified node in this node's list of children.
+ * Document subclasses must override this to enforce the restrictions
+ * that there be only one element and document type child.
+ *
+ * <p> Causes a DOMNodeInserted mutation event to be reported. Will
+ * first cause a DOMNodeRemoved event to be reported if the newChild
+ * parameter already has a parent. If the new child is a document
+ * fragment node, both events will be reported for each child of
+ * the fragment; the order in which children are removed and inserted
+ * is implementation-specific.
+ *
+ * <p> If this DOM has been compiled without mutation event support,
+ * these events will not be reported.
+ */
+ public Node insertBefore (Node newChild, Node refChild)
+ {
+ if (refChild == null)
+ return appendChild (newChild);
+
+ try {
+ DomNode child = (DomNode) newChild;
+
+ if (newChild.getNodeType () != DOCUMENT_FRAGMENT_NODE) {
+ checkMisc (child);
+ for (int i = 0; i < length; i++) {
+ if (children [i] != refChild)
+ continue;
+
+ ensureEnough (1);
+ reparent (child);
+ if (children [i] != refChild)
+ i--;
+ for (int j = ++length; j > i; j--)
+ children [j] = children [j - 1];
+ children [i] = child;
+ if (reportMutations)
+ insertionEvent (null, child);
+
+ return newChild;
+ }
+ throw new DomEx (DomEx.NOT_FOUND_ERR,
+ "that's no child of mine", refChild, 0);
+
+ } else {
+ // See if we can insert all the nodes in the fragment
+ for (int i = 0; i < child.length; i++)
+ checkMisc (child.children [i]);
+
+ // yep -- do so!
+ ensureEnough (child.length);
+ for (int i = 0; i <= child.length; i++)
+ insertBefore (child.children [0], refChild);
+ return newChild;
+ }
+ } catch (ClassCastException e) {
+ throw new DomEx (DomEx.WRONG_DOCUMENT_ERR,
+ null, newChild, 0);
+ }
+ }
+
+
+ /**
+ * <b>DOM L1</b>
+ * Replaces the specified node in this node's list of children.
+ * Document subclasses must override this to test the restrictions
+ * that there be only one element and document type child.
+ *
+ * <p> Causes DOMNodeRemoved and DOMNodeInserted mutation event to be
+ * reported. Will cause another DOMNodeRemoved event to be reported if
+ * the newChild parameter already has a parent. These events may be
+ * delivered in any order, except that the event reporting removal
+ * from such an existing parent will always be delivered before the
+ * event reporting its re-insertion as a child of some other node.
+ * The order in which children are removed and inserted is implementation
+ * specific.
+ *
+ * <p> If your application needs to depend on the in which those removal
+ * and insertion events are delivered, don't use this API. Instead,
+ * invoke the removeChild and insertBefore methods directly, to guarantee
+ * a specific delivery order. Similarly, don't use document fragments,
+ * Otherwise your application code may not work on a DOM which implements
+ * this method differently.
+ *
+ * <p> If this DOM has been compiled without mutation event support,
+ * these events will not be reported.
+ */
+ public Node replaceChild (Node newChild, Node refChild)
+ {
+ try {
+ DomNode child = (DomNode) newChild;
+
+ if (newChild.getNodeType () != DOCUMENT_FRAGMENT_NODE) {
+ checkMisc (child);
+ for (int i = 0; i < length; i++) {
+ if (children [i] != refChild)
+ continue;
+
+ DomNode rmchild = (DomNode) refChild;
+ DomEvent.DomMutationEvent event;
+ boolean doFree;
+
+ event = getMutationEvent ();
+ if (event != null)
+ doFree = true;
+ else
+ doFree = false;
+ if (reportMutations)
+ removalEvent (event, rmchild);
+ reparent (child);
+ if (children [i] != refChild)
+ i--;
+ children [i] = child;
+ rmchild.parent = null;
+ if (reportMutations)
+ insertionEvent (event, child);
+ if (doFree)
+ freeMutationEvent ();
+
+ return refChild;
+ }
+ throw new DomEx (DomEx.NOT_FOUND_ERR,
+ "that's no child of mine", newChild, 0);
+ } else {
+// XXX implement me
+ throw new DomEx (DomEx.NOT_SUPPORTED_ERR,
+ "replacing with fragment, NYI", null, 0);
+ }
+ } catch (ClassCastException e) {
+ throw new DomEx (DomEx.WRONG_DOCUMENT_ERR,
+ null, newChild, 0);
+ }
+ }
+
+
+ /**
+ * <b>DOM L1</b>
+ * Removes the specified child from this node's list of children,
+ * or else reports an exception.
+ *
+ * <p> Causes a DOMNodeRemoved mutation event to be reported.
+ *
+ * <p> If this DOM has been compiled without mutation event support,
+ * these events will not be reported.
+ */
+ public Node removeChild (Node refChild)
+ {
+ if (readonly)
+ throw new DomEx (DomEx.NO_MODIFICATION_ALLOWED_ERR,
+ null, this, 0);
+ for (int i = 0; i < length; i++) {
+ if (children [i] != refChild)
+ continue;
+
+ DomNode child = (DomNode) refChild;
+
+ if (reportMutations)
+ removalEvent (null, child);
+ for (int j = i + 1; j < length; j++, i++)
+ children [i] = children [j];
+ children [i] = null;
+ child.parent = null;
+ length--;
+
+ return refChild;
+ }
+ throw new DomEx (DomEx.NOT_FOUND_ERR,
+ "that's no child of mine", refChild, 0);
+ }
+
+
+ /**
+ * <b>DOM L1 (NodeList)</b>
+ * Returns the item with the specified index in this NodeList,
+ * else null.
+ */
+ final public Node item (int index)
+ {
+ try {
+ if (index < length)
+ return children [index];
+ } catch (RuntimeException e) {
+ // children == null or index < 0 ... bad parameter
+ // FALLTHROUGh
+ }
+ return null;
+ }
+
+
+ /**
+ * <b>DOM L1 (NodeList)</b>
+ * Returns the number of elements in this NodeList.
+ * (Note that many interfaces have a "Length" property, not just
+ * NodeList, and if a node subtype must implement one of those,
+ * it will also need to override getChildNodes.)
+ */
+ public int getLength ()
+ { return length; }
+
+
+ /**
+ * Minimize extra space consumed by this node to hold children and event
+ * listeners.
+ */
+ public void trimToSize ()
+ {
+ if (children != null && children.length != length) {
+ DomNode newKids [] = new DomNode [length];
+
+ for (int i = 0; i < length; i++)
+ newKids [i] = children [i];
+ children = newKids;
+ }
+
+ if (listeners != null && listeners.length != nListeners) {
+ ListenerRecord newKids [] = new ListenerRecord [length];
+
+ for (int i = 0; i < nListeners; i++)
+ newKids [i] = listeners [i];
+ listeners = newKids;
+ }
+ }
+
+
+ /**
+ * <b>DOM L1</b>
+ * Returns the previous sibling, if one is known.
+ */
+ final public Node getNextSibling ()
+ {
+ if (parent == null || getNodeType() == ATTRIBUTE_NODE)
+ return null;
+
+ // we know parent.getChildNodes () returns itself
+ // ... and that we're somewhere in parent.children[]
+ int index;
+
+ if (parentIndex < parent.length
+ && parent.children [parentIndex] == this) {
+ index = parentIndex + 1;
+ if (index < parent.length)
+ return parent.children [index];
+ else
+ return null;
+ }
+
+ for (index = 0; index < parent.length; index++) {
+ if (parent.children [index] == this) {
+ parentIndex = index++;
+ if (index < parent.length)
+ return parent.children [index];
+ else
+ break;
+ }
+ }
+ return null;
+ }
+
+
+ /**
+ * <b>DOM L1</b>
+ * Returns the previous sibling, if one is known.
+ */
+ final public Node getPreviousSibling ()
+ {
+ if (parent == null || getNodeType () == ATTRIBUTE_NODE)
+ return null;
+
+ NodeList siblings = parent.getChildNodes ();
+ int len = siblings.getLength ();
+
+ if (siblings.item (parentIndex) == this)
+ return siblings.item (parentIndex - 1);
+
+ for (int i = 0; i < len; i++)
+ if (siblings.item (i) == this) {
+ parentIndex = i;
+ return siblings.item (--i);
+ }
+ return null;
+ }
+
+
+ /**
+ * <b>DOM L1</b>
+ * Returns the parent node, if one is known.
+ */
+ final public Node getParentNode ()
+ { return parent; }
+
+ // parent node is only set in reparent() after sanity chex
+
+
+ /**
+ * <b>DOM L2</b>
+ * Consults the DOM implementation to determine if the requested
+ * feature is supported. DocumentType subclasses must override
+ * this method, and associate themselves directly with the
+ * DOMImplementation node used. (This method relies on being able
+ * to access the DOMImplementation from the owner document, but
+ * DocumentType nodes can be created without an owner.)
+ */
+ public boolean isSupported (String feature, String version)
+ {
+ Document doc = owner;
+ DOMImplementation impl = null;
+
+ if (doc == null && getNodeType () == DOCUMENT_NODE)
+ doc = (Document) this;
+
+ if (doc == null)
+ // possible for DocumentType
+ throw new IllegalStateException ("unbound ownerDocument");
+
+ impl = doc.getImplementation ();
+ return impl.hasFeature (feature, version);
+ }
+
+
+ /**
+ * <b>DOM L1 (modified in L2)</b>
+ * Returns the owner document. This is only null for Document nodes,
+ * and (new in L2) for DocumentType nodes which have not yet been
+ * associated with the rest of their document.
+ */
+ final public Document getOwnerDocument ()
+ { return owner; }
+
+
+ /**
+ * <b>DOM L1</b>
+ * Does nothing; this must be overridden (along with the
+ * getNodeValue method) for nodes with a non-null defined value.
+ */
+ public void setNodeValue (String value)
+ { }
+
+
+ /**
+ * <b>DOM L1</b>
+ * Returns null; this must be overridden for nodes types with
+ * a defined value, along with the setNodeValue method.
+ */
+ public String getNodeValue ()
+ { return null; }
+
+
+ /** This forces GCJ compatibility.
+ * Without this method GCJ is unable to compile to byte code.
+ */
+ public abstract short getNodeType ();
+
+ /** This forces GCJ compatibility.
+ * Without this method GCJ seems unable to natively compile GNUJAXP.
+ */
+ public abstract String getNodeName ();
+
+ /**
+ * <b>DOM L2</b>
+ * Does nothing; this must be overridden (along with the
+ * getPrefix method) for element and attribute nodes.
+ */
+ public void setPrefix (String prefix)
+ { }
+
+
+ /**
+ * <b>DOM L2</b>
+ * Returns null; this must be overridden for element and
+ * attribute nodes.
+ */
+ public String getPrefix ()
+ { return null; }
+
+
+ /**
+ * <b>DOM L2</b>
+ * Returns null; this must be overridden for element and
+ * attribute nodes.
+ */
+ public String getNamespaceURI ()
+ { return null; }
+
+
+ /**
+ * <b>DOM L2</b>
+ * Returns the node name; this must be overridden for element and
+ * attribute nodes.
+ */
+ public String getLocalName ()
+ { return null; }
+
+
+ /**
+ * <b>DOM L1</b>
+ * Returns a clone of this node which optionally includes cloned
+ * versions of child nodes. Clones are always mutable, except for
+ * entity reference nodes.
+ */
+ public Node cloneNode (boolean deep)
+ {
+ DomNode retval = (DomNode) clone ();
+
+ if (deep && children != null) {
+ DomNode newKids [] = retval.children;
+
+ if (newKids.length < length)
+ newKids = new DomNode [length];
+ for (int i = 0; i < length; i++)
+ newKids [i] = (DomNode) children [i].cloneNode (true);
+ retval.children = newKids;
+ retval.length = length;
+
+ if (getNodeType () == ENTITY_REFERENCE_NODE)
+ retval.makeReadonly ();
+ }
+ return retval;
+ }
+
+ /**
+ * Clones this node; roughly equivalent to cloneNode(false).
+ * Element subclasses must provide a new implementation which
+ * invokes this method to handle the basics, and then arranges
+ * to clone any element attributes directly. Attribute subclasses
+ * must make similar arrangements, ensuring that existing ties to
+ * elements are broken by cloning.
+ */
+ public Object clone ()
+ {
+ try {
+ DomNode retval = (DomNode) super.clone ();
+
+ retval.parent = null;
+ retval.readonly = false;
+ if (retval.children != null) {
+ retval.children = noKids;
+ retval.length = 0;
+ }
+ retval.listeners = null;
+ retval.nListeners = 0;
+ return retval;
+
+ } catch (CloneNotSupportedException x) {
+ throw new Error ("clone didn't work");
+ }
+ }
+
+
+ // the elements-by-tagname stuff is needed for both
+ // elements and documents ... this is in lieu of a
+ // common base class between Node and NodeNS.
+
+ /**
+ * <b>DOM L1</b>
+ * Creates a NodeList giving array-style access to elements with
+ * the specified name. Access is fastest if indices change by
+ * small values, and the DOM is not modified.
+ */
+ public NodeList getElementsByTagName (String tag)
+ {
+ return new ShadowList (null, tag);
+ }
+
+ /**
+ * <b>DOM L2</b>
+ * Creates a NodeList giving array-style access to elements with
+ * the specified namespace and local name. Access is fastest if
+ * indices change by small values, and the DOM is not modified.
+ */
+ public NodeList getElementsByTagNameNS (String namespace, String local)
+ {
+ return new ShadowList (namespace, local);
+ }
+
+
+ //
+ // This shadow class is GC-able even when the live list it shadows
+ // can't be, because of event registration hookups. Its finalizer
+ // makes that live list become GC-able.
+ //
+ final class ShadowList implements NodeList
+ {
+ private LiveNodeList liveList;
+
+ ShadowList (String ns, String local)
+ { liveList = new LiveNodeList (ns, local); }
+
+ public void finalize ()
+ {
+ liveList.detach ();
+ liveList = null;
+ }
+
+ public Node item (int index)
+ { return liveList.item (index); }
+
+ public int getLength ()
+ { return liveList.getLength (); }
+ }
+
+
+ final class LiveNodeList implements NodeList, EventListener, NodeFilter
+ {
+ private String elementURI;
+ private String elementName;
+
+ private DomIterator current;
+ private int lastIndex;
+
+
+ LiveNodeList (String uri, String name)
+ {
+ elementURI = uri;
+ elementName = name;
+ DomNode.this.addEventListener ("DOMNodeInserted", this, true);
+ DomNode.this.addEventListener ("DOMNodeRemoved", this, true);
+ }
+
+ void detach ()
+ {
+ current.detach ();
+ current = null;
+ DomNode.this.removeEventListener ("DOMNodeInserted", this, true);
+ DomNode.this.removeEventListener ("DOMNodeRemoved", this, true);
+ }
+
+ public short acceptNode (Node element)
+ {
+ if (element == DomNode.this)
+ return FILTER_SKIP;
+
+ // use namespace-aware matching ...
+ if (elementURI != null) {
+ if (!("*".equals (elementURI)
+ || elementURI.equals (element.getNamespaceURI ())))
+ return FILTER_SKIP;
+ if (!("*".equals (elementName)
+ || elementName.equals (element.getLocalName ())))
+ return FILTER_SKIP;
+
+ // ... or qName-based kind.
+ } else {
+ if (!("*".equals (elementName)
+ || elementName.equals (element.getNodeName ())))
+ return FILTER_SKIP;
+ }
+ return FILTER_ACCEPT;
+ }
+
+ private DomIterator createIterator ()
+ {
+ return new DomIterator (DomNode.this,
+ NodeFilter.SHOW_ELEMENT,
+ this, /* filter */
+ true /* expand entity refs */
+ );
+ }
+
+ public void handleEvent (Event e)
+ {
+ MutationEvent mutation = (MutationEvent) e;
+ Node related = mutation.getRelatedNode ();
+
+ // XXX if it's got children ... check all kids too, they
+ // will invalidate our saved index
+
+ if (related.getNodeType () != Node.ELEMENT_NODE)
+ return;
+ if (related.getNodeName () != elementName)
+ return;
+ if (related.getNamespaceURI () != elementURI)
+ return;
+
+ current = null;
+ }
+
+ public Node item (int index)
+ {
+ if (current == null) {
+ current = createIterator ();
+ lastIndex = -1;
+ }
+
+ // last node or before? go backwards
+ if (index <= lastIndex) {
+ while (index != lastIndex) {
+ current.previousNode ();
+ lastIndex--;
+ }
+ return current.previousNode ();
+ }
+
+ // somewhere after last node
+ while (++lastIndex != index)
+ current.nextNode ();
+ return current.nextNode ();
+ }
+
+ public int getLength ()
+ {
+ int retval = 0;
+ NodeIterator iter = createIterator ();
+
+ while (iter.nextNode () != null)
+ retval++;
+ return retval;
+ }
+ }
+
+ //
+ // EventTarget support
+ //
+ static final class ListenerRecord {
+ String type;
+ EventListener listener;
+ boolean useCapture;
+
+ // XXX use JDK 1.2 java.lang.ref.WeakReference to listener,
+ // and we can both get rid of "shadow" classes and remove
+ // the need for applications to apply similar trix ... but
+ // JDK 1.2 support isn't generally available yet
+
+ ListenerRecord (
+ String type,
+ EventListener listener,
+ boolean useCapture
+ ) {
+ this.type = type.intern ();
+ this.listener = listener;
+ this.useCapture = useCapture;
+ }
+
+ boolean equals (ListenerRecord rec)
+ {
+ return listener == rec.listener
+ && useCapture == rec.useCapture
+ && type == rec.type;
+ }
+ }
+
+ /**
+ * <b>DOM L2 (Events)</b>
+ * Returns an instance of the specified type of event object.
+ * Understands about DOM Mutation, HTML, and UI events.
+ *
+ * <p>If the name of the event type begins with "USER-", then an object
+ * implementing the "Event" class will be returned; this provides a
+ * limited facility for application-defined events to use the DOM event
+ * infrastructure. Alternatively, use one of the standard DOM event
+ * classes and initialize it using use such a "USER-" event type name;
+ * or defin, instantiate, and initialize an application-specific subclass
+ * of DomEvent and pass that to dispatchEvent().
+ *
+ * @param eventType Identifies the particular DOM feature module
+ * defining the type of event, such as "MutationEvents".
+ * <em>The event "name" is a different kind of "type".</em>
+ */
+ public Event createEvent (String eventType)
+ {
+ eventType = eventType.toLowerCase ();
+
+ if ("mutationevents".equals (eventType))
+ return new DomEvent.DomMutationEvent (null);
+
+ if ("htmlevents".equals (eventType)
+ || "events".equals (eventType)
+ || "user-events".equals (eventType))
+ return new DomEvent (null);
+
+ if ("uievents".equals (eventType))
+ return new DomEvent.DomUIEvent (null);
+
+ // mouse events
+
+ throw new DomEx (DomEx.NOT_SUPPORTED_ERR,
+ eventType, null, 0);
+ }
+
+
+ /**
+ * <b>DOM L2 (Events)</b>
+ * Registers an event listener's interest in a class of events.
+ */
+ final public void addEventListener (
+ String type,
+ EventListener listener,
+ boolean useCapture
+ ) {
+ if (listeners == null)
+ listeners = new ListenerRecord [1];
+ else if (nListeners == listeners.length) {
+ ListenerRecord newListeners [];
+ newListeners =
+ new ListenerRecord [listeners.length + NKIDS_DELTA];
+ for (int i = 0; i < nListeners; i++)
+ newListeners [i] = listeners [i];
+ listeners = newListeners;
+ }
+
+ // prune duplicates
+ ListenerRecord record;
+
+ record = new ListenerRecord (type, listener, useCapture);
+ for (int i = 0; i < nListeners; i++) {
+ if (record.equals (listeners [i]))
+ return;
+ }
+ listeners [nListeners++] = record;
+ }
+
+
+ // XXX this exception should be discarded from DOM
+
+ // this class can be instantiated, unlike the one in the spec
+ final static class DomEventException extends EventException {
+ DomEventException ()
+ { super (UNSPECIFIED_EVENT_TYPE_ERR, "unspecified event type"); }
+ }
+
+
+ /**
+ * <b>DOM L2 (Events)</b>
+ * Delivers an event to all relevant listeners, returning true if the
+ * caller should perform their default action. Note that the event
+ * must have been provided by the createEvent() method on this
+ * class, else it can't be dispatched.
+ *
+ * @see #createEvent
+ *
+ * @exception NullPointerException When a null event is passed.
+ * @exception ClassCastException When the event wasn't provided by
+ * the createEvent method, or otherwise isn't a DomEvent.
+ * @exception EventException If the event type wasn't specified
+ */
+ final public boolean dispatchEvent (Event event)
+ throws EventException
+ {
+ DomEvent e = (DomEvent) event;
+ DomNode ancestors [] = null;
+ int ancestorMax = 0;
+ boolean haveDispatchDataLock = false;
+
+ if (e.type == null)
+ throw new DomEventException ();
+
+ e.doDefault = true;
+ e.target = this;
+
+ //
+ // Typical case: one nonrecursive dispatchEvent call at a time
+ // for this class. If that's our case, we can avoid allocating
+ // garbage, which is overall a big win. Even with advanced GCs
+ // that deal well with short-lived garbage, and wayfast allocators,
+ // it still helps.
+ //
+ // Remember -- EVERY mutation goes though here at least once.
+ //
+ // When populating a DOM tree, trying to send mutation events is
+ // the primary cost; this dominates the critical path.
+ //
+ try {
+ DomNode current;
+ int index;
+ boolean haveAncestorRegistrations = false;
+ ListenerRecord notificationSet [];
+ int ancestorLen;
+
+ synchronized (lockNode) {
+ if (!dispatchDataLock) {
+ haveDispatchDataLock = dispatchDataLock = true;
+ notificationSet = DomNode.notificationSet;
+ ancestors = DomNode.ancestors;
+ } else {
+ notificationSet = new ListenerRecord [NOTIFICATIONS_INIT];
+ ancestors = new DomNode [ANCESTORS_INIT];
+ }
+ ancestorLen = ancestors.length;
+ }
+
+ // XXX autogrow ancestors ... based on statistics
+
+ // Climb to the top of this subtree and handle capture, letting
+ // each node (from the top down) capture until one stops it or
+ // until we get to this one.
+
+ for (index = 0, current = parent;
+ current != null && index < ancestorLen;
+ index++, current = current.parent) {
+ if (current.nListeners != 0)
+ haveAncestorRegistrations = true;
+ ancestors [index] = current;
+ }
+ if (current != null)
+ throw new RuntimeException ("dispatchEvent capture stack size");
+
+ ancestorMax = index;
+ e.stop = false;
+
+ if (haveAncestorRegistrations) {
+ e.eventPhase = Event.CAPTURING_PHASE;
+ while (!e.stop && index-- > 0) {
+ current = ancestors [index];
+ if (current.nListeners != 0)
+ notifyNode (e, current, true, notificationSet);
+ }
+ }
+
+ // Always deliver events to the target node (this)
+ // unless stopPropagation was called. If we saw
+ // no registrations yet (typical!), we never will.
+ if (!e.stop && nListeners != 0) {
+ e.eventPhase = Event.AT_TARGET;
+ notifyNode (e, this, false, notificationSet);
+ } else if (!haveAncestorRegistrations)
+ e.stop = true;
+
+ // If the event bubbles and propagation wasn't halted,
+ // walk back up the ancestor list. Stop bubbling when
+ // any bubbled event handler stops it.
+
+ if (!e.stop && e.bubbles) {
+ e.eventPhase = Event.BUBBLING_PHASE;
+ for (index = 0;
+ !e.stop
+ && index < ancestorMax
+ && (current = ancestors [index]) != null;
+ index++) {
+ if (current.nListeners != 0)
+ notifyNode (e, current, false, notificationSet);
+ }
+ }
+ e.eventPhase = 0;
+
+ // Caller chooses whether to perform the default
+ // action based on return from this method.
+ return e.doDefault;
+
+ } finally {
+ if (haveDispatchDataLock) {
+ // synchronize to force write ordering
+ synchronized (lockNode) {
+ // null out refs to ensure they'll be GC'd
+ for (int i = 0; i < ancestorMax; i++)
+ ancestors [i] = null;
+ // notificationSet handled by notifyNode
+
+ dispatchDataLock = false;
+ }
+ }
+ }
+ }
+
+
+ private void notifyNode (
+ DomEvent e,
+ DomNode current,
+ boolean capture,
+ ListenerRecord notificationSet []
+ ) {
+ int count = 0;
+
+ // do any of this set of listeners get notified?
+ for (int i = 0; i < current.nListeners; i++) {
+ ListenerRecord rec = current.listeners [i];
+
+ if (rec.useCapture != capture)
+ continue;
+ if (!e.type.equals (rec.type))
+ continue;
+ if (count < notificationSet.length)
+ notificationSet [count++] = rec;
+ else
+ // XXX fire up some cheap growth algorithm
+ throw new RuntimeException (
+ "Event notification set size exceeded");
+ }
+
+ // Notify just those listeners
+ e.currentNode = current;
+ for (int i = 0; i < count; i++) {
+ try {
+ // Late in the DOM CR process (3rd or 4th CR?) the
+ // removeEventListener spec became asymmetric with respect
+ // to addEventListener ... effect is now immediate.
+ for (int j = 0; j < current.nListeners; j++) {
+ if (current.listeners [j].equals (notificationSet [i])) {
+ notificationSet [i].listener.handleEvent (e);
+ break;
+ }
+ }
+
+ } catch (Exception x) {
+ // ignore all exceptions
+ }
+ notificationSet [i] = null; // free for GC
+ }
+ }
+
+ /**
+ * <b>DOM L2 (Events)</b>
+ * Unregisters an event listener.
+ */
+ final public void removeEventListener (
+ String type,
+ EventListener listener,
+ boolean useCapture
+ ) {
+ for (int i = 0; i < nListeners; i++) {
+ if (listeners [i].listener != listener)
+ continue;
+ if (listeners [i].useCapture != useCapture)
+ continue;
+ if (!listeners [i].type.equals (type))
+ continue;
+
+ if (nListeners == 1) {
+ listeners = null;
+ nListeners = 0;
+ } else {
+ for (int j = i + 1; j < nListeners; j++)
+ listeners [i++] = listeners [j++];
+ listeners [--nListeners] = null;
+ }
+ break;
+ }
+ // no exceptions reported
+ }
+
+
+ /**
+ * <b>DOM L1 (relocated in DOM L2)</b>
+ * In this node and all contained nodes (including attributes if
+ * relevant) merge adjacent text nodes. This is done while ignoring
+ * text which happens to use CDATA delimiters).
+ */
+ public void normalize ()
+ {
+ int index = 0;
+ Node child, next;
+ Text temp;
+ NamedNodeMap attributes;
+
+ while ((child = item (index)) != null) {
+ switch (child.getNodeType ()) {
+ case TEXT_NODE:
+ next = item (index + 1);
+ if (next == null || next.getNodeType () != TEXT_NODE)
+ break;
+ temp = (Text) child;
+ temp.appendData (next.getNodeValue ());
+ removeChild (next);
+ // don't increment index ... we do extra fetches
+ // of the current node, affecting only speed.
+ continue;
+
+ case ELEMENT_NODE:
+ child.normalize ();
+ attributes = child.getAttributes ();
+ for (int i = 0; i < attributes.getLength (); i++)
+ attributes.item (i).normalize ();
+ // FALLTHROUGH
+ }
+ index++;
+ continue;
+ }
+ }
+
+
+ /**
+ * Returns true iff node types match, and either (a) both nodes have no
+ * namespace and their getNodeName() values are the same, or (b) both
+ * nodes have the same getNamespaceURI() and same getLocalName() values.
+ *
+ * <p>Note that notion of a "Per-Element-Type" attribute name scope, as
+ * found in a non-normative appendix of the XML Namespaces specification,
+ * is not supported here. Your application must implement that notion,
+ * typically by not bothering to check nameAndTypeEquals for attributes
+ * without namespace URIs unless you already know their elements are
+ * nameAndTypeEquals.
+ */
+ public boolean nameAndTypeEquals (Node other)
+ {
+ // node types must match
+ if (getNodeType () != other.getNodeType ())
+ return false;
+
+ // if both have namespaces, do a "full" comparision
+ // this is a "global" partition
+ String ns1 = this.getNamespaceURI ();
+ String ns2 = other.getNamespaceURI ();
+
+ if (ns1 != null && ns2 != null)
+ return ns1.equals (ns2)
+ && getLocalName ().equals (other.getLocalName ());
+
+ // if neither has a namespace, this is a "no-namespace" name.
+ if (ns1 == null && ns2 == null) {
+ if (getNodeName().equals (other.getNodeName ()) == false)
+ return false;
+ // can test the non-normative "per-element-type" scope here.
+ // if this is an attribute node and both nodes have been bound
+ // to elements (!!), then return the nameAndTypeEquals()
+ // comparison of those elements.
+ return true;
+ }
+
+ // otherwise they're unequal: one scoped, one not.
+ return false;
+ }
+}
diff --git a/external/jaxp/source/gnu/xml/dom/DomNotation.java b/external/jaxp/source/gnu/xml/dom/DomNotation.java
new file mode 100644
index 000000000..a7711be08
--- /dev/null
+++ b/external/jaxp/source/gnu/xml/dom/DomNotation.java
@@ -0,0 +1,89 @@
+/*
+ * $Id: DomNotation.java,v 1.1 2003-02-01 02:10:17 cbj Exp $
+ * Copyright (C) 1999-2001 David Brownell
+ *
+ * This file is part of GNU JAXP, a library.
+ *
+ * GNU JAXP is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * GNU JAXP is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ * As a special exception, if you link this library with other files to
+ * produce an executable, this library does not by itself cause the
+ * resulting executable to be covered by the GNU General Public License.
+ * This exception does not however invalidate any other reasons why the
+ * executable file might be covered by the GNU General Public License.
+ */
+
+package gnu.xml.dom;
+
+import org.w3c.dom.*;
+
+
+// $Id: DomNotation.java,v 1.1 2003-02-01 02:10:17 cbj Exp $
+
+/**
+ * <p> "Notation" implementation. This is a non-core DOM class, supporting
+ * the "XML" feature. </p>
+ *
+ * <p> Although unparsed entities using this notation can be detected using
+ * DOM, neither NOTATIONS nor ENTITY/ENTITIES attributes can be so detected.
+ * More, there is no portable way to construct a Notation node, so there's
+ * no way that vendor-neutral DOM construction APIs could even report a
+ * NOTATION used to identify the intended meaning of a ProcessingInstruction.
+ * </p>
+ *
+ * <p> In short, <em>avoid using this DOM functionality</em>.
+ *
+ * @see DomDoctype
+ * @see DomEntity
+ * @see DomPI
+ *
+ * @author David Brownell
+ * @version $Date: 2003-02-01 02:10:17 $
+ */
+public class DomNotation extends DomExtern implements Notation
+{
+ /**
+ * Constructs a Notation node associated with the specified document,
+ * with the specified descriptive data. Note that at least one of
+ * the PUBLIC and SYSTEM identifiers must be provided; unlike other
+ * external objects in XML, notations may have only a PUBLIC identifier.
+ *
+ * <p>This constructor should only be invoked by a DomDoctype object
+ * as part of its declareNotation functionality, or through a subclass
+ * which is similarly used in a "Sub-DOM" style layer.
+ *
+ * @param owner The document with which this notation is associated
+ * @param name Name of this notation
+ * @param publicId If non-null, provides the notation's PUBLIC identifier
+ * @param systemId If non-null, rovides the notation's SYSTEM identifier
+ */
+ protected DomNotation (
+ Document owner,
+ String name,
+ String publicId,
+ String systemId
+ )
+ {
+ super (owner, name, publicId, systemId);
+ makeReadonly ();
+ }
+
+ /**
+ * <b>DOM L1</b>
+ * Returns the constant NOTATION_NODE.
+ */
+ final public short getNodeType ()
+ { return NOTATION_NODE; }
+}
diff --git a/external/jaxp/source/gnu/xml/dom/DomNsNode.java b/external/jaxp/source/gnu/xml/dom/DomNsNode.java
new file mode 100644
index 000000000..7d800cfb6
--- /dev/null
+++ b/external/jaxp/source/gnu/xml/dom/DomNsNode.java
@@ -0,0 +1,165 @@
+/*
+ * $Id: DomNsNode.java,v 1.1 2003-02-01 02:10:17 cbj Exp $
+ * Copyright (C) 1999-2001 David Brownell
+ *
+ * This file is part of GNU JAXP, a library.
+ *
+ * GNU JAXP is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * GNU JAXP is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ * As a special exception, if you link this library with other files to
+ * produce an executable, this library does not by itself cause the
+ * resulting executable to be covered by the GNU General Public License.
+ * This exception does not however invalidate any other reasons why the
+ * executable file might be covered by the GNU General Public License.
+ */
+
+package gnu.xml.dom;
+
+import org.w3c.dom.*;
+
+
+// $Id: DomNsNode.java,v 1.1 2003-02-01 02:10:17 cbj Exp $
+
+/**
+ * <p> Abstract implemention of namespace support. This facilitates
+ * sharing code for attribute and element nodes.
+ *
+ * @author David Brownell
+ * @version $Date: 2003-02-01 02:10:17 $
+ */
+public abstract class DomNsNode extends DomNode
+{
+ private String name; // changed by setPrefix
+ private final String namespace;
+
+
+ /**
+ * Constructs a node associated with the specified document, and
+ * with the specified namespace information.
+ *
+ * @param owner The document with which this entity is associated
+ * @param namespaceURI Combined with the local part of the name,
+ * this identifies a type of element or attribute; may be null.
+ * If this is the empty string, it is reassigned as null so that
+ * applications only need to test that case.
+ * @param name Name of this node, which may include a prefix
+ */
+ // package private
+ DomNsNode (Document owner, String namespaceURI, String name)
+ {
+ super (owner);
+ this.name = name;
+ if ("".equals (namespaceURI))
+ namespaceURI = null;
+ this.namespace = namespaceURI;
+ }
+
+
+ /**
+ * <b>DOM L1</b>
+ * Returns the node's name, including any namespace prefix.
+ */
+ final public String getNodeName ()
+ {
+ return name;
+ }
+
+
+ /**
+ * <b>DOM L2</b>
+ * Returns the node's namespace URI
+ * <em>or null</em> if the node name is not namespace scoped.
+ */
+ final public String getNamespaceURI ()
+ {
+ return namespace;
+ }
+
+
+ /**
+ * <b>DOM L2</b>
+ * Returns any prefix part of the node's name (before any colon).
+ */
+ public String getPrefix ()
+ {
+ if (namespace == null)
+ return null;
+
+ int index = name.indexOf (':');
+ if (index < 0)
+ return null;
+ else
+ return name.substring (0, index);
+ }
+
+
+ /**
+ * <b>DOM L2</b>
+ * Assigns the prefix part of the node's name (before any colon).
+ */
+ public void setPrefix (String prefix)
+ {
+ String local = getLocalName ();
+
+ if (isReadonly ())
+ throw new DomEx (DomEx.NO_MODIFICATION_ALLOWED_ERR);
+
+ if (prefix == null) {
+ name = local;
+ return;
+ } else if (namespace == null)
+ throw new DomEx (DomEx.NAMESPACE_ERR,
+ "can't set prefix, node has no namespace URI", this, 0);
+
+ DomDocument.verifyXmlName (prefix);
+ if (prefix.indexOf (':') != -1)
+ throw new DomEx (DomEx.NAMESPACE_ERR,
+ "illegal prefix " + prefix, this, 0);
+
+ if ("xml".equals (prefix)
+ && !DomDocument.xmlNamespace.equals (namespace))
+ throw new DomEx (DomEx.NAMESPACE_ERR,
+ "xml namespace is always " + DomDocument.xmlNamespace, this, 0);
+
+ if ("xmlns".equals (prefix)) {
+ if (namespace != null || getNodeType () != ATTRIBUTE_NODE)
+ throw new DomEx (DomEx.NAMESPACE_ERR,
+ "xmlns attribute prefix is reserved", this, 0);
+ } else if (getNodeType () == ATTRIBUTE_NODE
+ && ("xmlns".equals (name) || name.startsWith ("xmlns:")))
+ throw new DomEx (DomEx.NAMESPACE_ERR,
+ "namespace declarations can't change names", this, 0);
+
+ name = prefix + ':' + local;
+ }
+
+
+ /**
+ * <b>DOM L2</b>
+ * Returns the local part of the node's name (after any colon),
+ * <em>or null</em> if the node name is not namespace scoped.
+ */
+ public String getLocalName ()
+ {
+ if (namespace == null)
+ return null;
+
+ int index = name.indexOf (':');
+ if (index < 0)
+ return name;
+ else
+ return name.substring (index + 1);
+ }
+}
diff --git a/external/jaxp/source/gnu/xml/dom/DomPI.java b/external/jaxp/source/gnu/xml/dom/DomPI.java
new file mode 100644
index 000000000..439c309a4
--- /dev/null
+++ b/external/jaxp/source/gnu/xml/dom/DomPI.java
@@ -0,0 +1,146 @@
+/*
+ * $Id: DomPI.java,v 1.1 2003-02-01 02:10:17 cbj Exp $
+ * Copyright (C) 1999-2001 David Brownell
+ *
+ * This file is part of GNU JAXP, a library.
+ *
+ * GNU JAXP is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * GNU JAXP is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ * As a special exception, if you link this library with other files to
+ * produce an executable, this library does not by itself cause the
+ * resulting executable to be covered by the GNU General Public License.
+ * This exception does not however invalidate any other reasons why the
+ * executable file might be covered by the GNU General Public License.
+ */
+
+package gnu.xml.dom;
+
+import org.w3c.dom.*;
+
+
+// $Id: DomPI.java,v 1.1 2003-02-01 02:10:17 cbj Exp $
+
+/**
+ * <p> "ProcessingInstruction" (PI) implementation.
+ * This is a non-core DOM class, supporting the "XML" feature. </p>
+ *
+ * <p> Unlike other DOM APIs in the "XML" feature, this one fully
+ * exposes the functionality it describes. So there is no reason
+ * inherent in DOM to avoid using this API, unless you want to rely
+ * on NOTATION declarations to associate meaning with your PIs;
+ * there is no vendor-neutal way to record those notations in DOM.</p>
+ *
+ * <p> Also of note is that PI support is part of SAX, so that XML
+ * systems using PIs can choose among multiple APIs. </p>
+ *
+ * @see DomNotation
+ *
+ * @author David Brownell
+ * @version $Date: 2003-02-01 02:10:17 $
+ */
+public class DomPI extends DomNode implements ProcessingInstruction
+{
+ private String target;
+ private String data;
+
+
+ /**
+ * Constructs a ProcessingInstruction node associated with the
+ * specified document, with the specified data.
+ *
+ * <p>This constructor should only be invoked by a Document object as
+ * part of its createProcessingInstruction functionality, or through
+ * a subclass which is similarly used in a "Sub-DOM" style layer.
+ */
+ protected DomPI (Document owner, String target, String data)
+ {
+ super (owner);
+ this.target = target;
+ this.data = data;
+ }
+
+
+ /**
+ * <b>DOM L1</b>
+ * Returns the target of the processing instruction.
+ */
+ final public String getTarget ()
+ {
+ return target;
+ }
+
+
+ /**
+ * <b>DOM L1</b>
+ * Returns the target of the processing instruction
+ * (same as getTarget).
+ */
+ final public String getNodeName ()
+ {
+ return target;
+ }
+
+
+ /**
+ * <b>DOM L1</b>
+ * Returns the constant PROCESSING_INSTRUCTION_NODE.
+ */
+ final public short getNodeType ()
+ { return PROCESSING_INSTRUCTION_NODE; }
+
+
+ /**
+ * <b>DOM L1</b>
+ * Returns the data associated with the processing instruction.
+ */
+ final public String getData ()
+ {
+ return data;
+ }
+
+
+ /**
+ * <b>DOM L1</b>
+ * Returns the data associated with the processing instruction
+ * (same as getData).
+ */
+ final public String getNodeValue ()
+ {
+ return data;
+ }
+
+
+ /**
+ * <b>DOM L1</b>
+ * Assigns the data associated with the processing instruction;
+ * same as setNodeValue.
+ */
+ final public void setData (String data)
+ {
+ setNodeValue (data);
+ }
+
+
+ /**
+ * <b>DOM L1</b>
+ * Assigns the data associated with the processing instruction.
+ */
+ final public void setNodeValue (String data)
+ {
+ if (isReadonly ())
+ throw new DomEx (DomEx.NO_MODIFICATION_ALLOWED_ERR);
+ this.data = data;
+ }
+}
diff --git a/external/jaxp/source/gnu/xml/dom/DomText.java b/external/jaxp/source/gnu/xml/dom/DomText.java
new file mode 100644
index 000000000..09017c460
--- /dev/null
+++ b/external/jaxp/source/gnu/xml/dom/DomText.java
@@ -0,0 +1,111 @@
+/*
+ * $Id: DomText.java,v 1.1 2003-02-01 02:10:17 cbj Exp $
+ * Copyright (C) 1999-2001 David Brownell
+ *
+ * This file is part of GNU JAXP, a library.
+ *
+ * GNU JAXP is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * GNU JAXP is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ * As a special exception, if you link this library with other files to
+ * produce an executable, this library does not by itself cause the
+ * resulting executable to be covered by the GNU General Public License.
+ * This exception does not however invalidate any other reasons why the
+ * executable file might be covered by the GNU General Public License.
+ */
+
+package gnu.xml.dom;
+
+import org.w3c.dom.*;
+
+
+// $Id: DomText.java,v 1.1 2003-02-01 02:10:17 cbj Exp $
+
+/**
+ * <p> "Text" implementation. </p>
+ *
+ * @author David Brownell
+ * @version $Date: 2003-02-01 02:10:17 $
+ */
+public class DomText extends DomCharacterData implements Text
+{
+ // NOTE: deleted unused per-instance "isIgnorable"
+ // support to reclaim its space.
+
+ /**
+ * Constructs a text node associated with the specified
+ * document and holding the specified data.
+ *
+ * <p>This constructor should only be invoked by a Document object
+ * as part of its createTextNode functionality, or through a subclass
+ * which is similarly used in a "Sub-DOM" style layer.
+ */
+ protected DomText (Document owner, String value)
+ {
+ super (owner, value);
+ }
+
+ protected DomText (Document owner, char buf [], int off, int len)
+ {
+ super (owner, buf, off, len);
+ }
+
+
+ /**
+ * <b>DOM L1</b>
+ * Returns the string "#text".
+ */
+ // can't be 'final' with CDATA subclassing
+ public String getNodeName ()
+ {
+ return "#text";
+ }
+
+ /**
+ * <b>DOM L1</b>
+ * Returns the constant TEXT_NODE.
+ */
+ // would be final except DomCDATA subclasses this ...
+ public short getNodeType ()
+ { return TEXT_NODE; }
+
+
+ /**
+ * <b>DOM L1</b>
+ * Splits this text node in two parts at the offset, returning
+ * the new text node (the sibling with the second part).
+ */
+ public Text splitText (int offset)
+ {
+ if (isReadonly ())
+ throw new DomEx (DomEx.NO_MODIFICATION_ALLOWED_ERR);
+ try {
+ String before = getNodeValue ().substring (0, offset);
+ String after = getNodeValue ().substring (offset);
+ Text next;
+
+ if (getNodeType () == TEXT_NODE)
+ next = getOwnerDocument ().createTextNode (after);
+ else // CDATA_SECTION_NODE
+ next = getOwnerDocument ().createCDATASection (after);
+
+ getParentNode ().insertBefore (next, getNextSibling ());
+ setNodeValue (before);
+ return next;
+
+ } catch (IndexOutOfBoundsException x) {
+ throw new DomEx (DomEx.INDEX_SIZE_ERR);
+ }
+ }
+}
diff --git a/external/jaxp/source/gnu/xml/dom/JAXPFactory.java b/external/jaxp/source/gnu/xml/dom/JAXPFactory.java
new file mode 100644
index 000000000..2553c4643
--- /dev/null
+++ b/external/jaxp/source/gnu/xml/dom/JAXPFactory.java
@@ -0,0 +1,233 @@
+/*
+ * $Id: JAXPFactory.java,v 1.1 2003-02-01 02:10:17 cbj Exp $
+ * Copyright (C) 2001 David Brownell
+ *
+ * This file is part of GNU JAXP, a library.
+ *
+ * GNU JAXP is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * GNU JAXP is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ * As a special exception, if you link this library with other files to
+ * produce an executable, this library does not by itself cause the
+ * resulting executable to be covered by the GNU General Public License.
+ * This exception does not however invalidate any other reasons why the
+ * executable file might be covered by the GNU General Public License.
+ */
+
+
+package gnu.xml.dom;
+
+import java.io.IOException;
+
+import org.w3c.dom.Document;
+import org.w3c.dom.DocumentType;
+import org.w3c.dom.DOMImplementation;
+
+import org.xml.sax.EntityResolver;
+import org.xml.sax.ErrorHandler;
+import org.xml.sax.InputSource;
+import org.xml.sax.XMLReader;
+import org.xml.sax.SAXException;
+import org.xml.sax.SAXParseException;
+
+import javax.xml.parsers.DocumentBuilder;
+import javax.xml.parsers.DocumentBuilderFactory;
+import javax.xml.parsers.ParserConfigurationException;
+import javax.xml.parsers.SAXParserFactory;
+
+
+/**
+ * DOM bootstrapping API, for use with JAXP.
+ *
+ * @see Consumer
+ *
+ * @author David Brownell
+ * @version $Date: 2003-02-01 02:10:17 $
+ */
+public final class JAXPFactory extends DocumentBuilderFactory
+{
+ private static final String PROPERTY = "http://xml.org/sax/properties/";
+ private static final String FEATURE = "http://xml.org/sax/features/";
+
+ private SAXParserFactory pf;
+
+ /**
+ * Default constructor.
+ */
+ public JAXPFactory () { }
+
+ /**
+ * Constructs a JAXP document builder which uses the default
+ * JAXP SAX2 parser and the DOM implementation in this package.
+ */
+ public DocumentBuilder newDocumentBuilder ()
+ throws ParserConfigurationException
+ {
+ if (pf == null) {
+ // Force use of AElfred2 since not all JAXP parsers
+ // conform very well to the SAX2 API spec ...
+ pf = new gnu.xml.aelfred2.JAXPFactory ();
+ // pf = SAXParserFactory.newInstance ();
+ }
+
+ // JAXP default: false
+ pf.setValidating (isValidating ());
+
+ // FIXME: this namespace setup may cause errors in some
+ // conformant SAX2 parsers, which we CAN patch up by
+ // splicing a "NSFilter" stage up front ...
+
+ // JAXP default: false
+ pf.setNamespaceAware (isNamespaceAware ());
+
+ try {
+ // undo rude "namespace-prefixes=false" default
+ pf.setFeature (FEATURE + "namespace-prefixes", true);
+
+ return new JAXPBuilder (pf.newSAXParser ().getXMLReader (), this);
+ } catch (SAXException e) {
+ throw new ParserConfigurationException (
+ "can't create JAXP DocumentBuilder: " + e.getMessage ());
+ }
+ }
+
+ /** There seems to be no useful specification for attribute names */
+ public void setAttribute (String name, Object value)
+ throws IllegalArgumentException
+ {
+ throw new IllegalArgumentException (name);
+ }
+
+ /** There seems to be no useful specification for attribute names */
+ public Object getAttribute (String name)
+ throws IllegalArgumentException
+ {
+ throw new IllegalArgumentException (name);
+ }
+
+ static final class JAXPBuilder extends DocumentBuilder
+ implements ErrorHandler
+ {
+ private Consumer consumer;
+ private XMLReader producer;
+ private DomImpl impl;
+
+ JAXPBuilder (XMLReader parser, JAXPFactory factory)
+ throws ParserConfigurationException
+ {
+ impl = new DomImpl ();
+
+ // set up consumer side
+ try {
+ consumer = new Consumer ();
+ } catch (SAXException e) {
+ throw new ParserConfigurationException (e.getMessage ());
+ }
+
+ // JAXP defaults: true, noise nodes are good (bleech)
+ consumer.setHidingReferences (
+ factory.isExpandEntityReferences ());
+ consumer.setHidingComments (
+ factory.isIgnoringComments ());
+ consumer.setHidingWhitespace (
+ factory.isIgnoringElementContentWhitespace ());
+ consumer.setHidingCDATA (
+ factory.isCoalescing ());
+
+ // set up producer side
+ producer = parser;
+ producer.setContentHandler (consumer.getContentHandler ());
+ producer.setDTDHandler (consumer.getDTDHandler ());
+
+ try {
+ String id;
+
+ // if validating, report validity errors, and default
+ // to treating them as fatal
+ if (factory.isValidating ()) {
+ producer.setFeature (FEATURE + "validation",
+ true);
+ producer.setErrorHandler (this);
+ }
+
+ // always save prefix info, maybe do namespace processing
+ producer.setFeature (FEATURE + "namespace-prefixes",
+ true);
+ producer.setFeature (FEATURE + "namespaces",
+ factory.isNamespaceAware ());
+
+ // set important handlers
+ id = PROPERTY + "lexical-handler";
+ producer.setProperty (id, consumer.getProperty (id));
+
+ id = PROPERTY + "declaration-handler";
+ producer.setProperty (id, consumer.getProperty (id));
+
+ } catch (SAXException e) {
+ throw new ParserConfigurationException (e.getMessage ());
+ }
+ }
+
+
+ public Document parse (InputSource source)
+ throws SAXException, IOException
+ {
+ producer.parse (source);
+ return consumer.getDocument ();
+ }
+
+ public boolean isNamespaceAware ()
+ {
+ try {
+ return producer.getFeature (FEATURE + "namespaces");
+ } catch (SAXException e) {
+ // "can't happen"
+ throw new RuntimeException (e.getMessage ());
+ }
+ }
+
+ public boolean isValidating ()
+ {
+ try {
+ return producer.getFeature (FEATURE + "validation");
+ } catch (SAXException e) {
+ // "can't happen"
+ throw new RuntimeException (e.getMessage ());
+ }
+ }
+
+ public void setEntityResolver (EntityResolver resolver)
+ { producer.setEntityResolver (resolver); }
+
+ public void setErrorHandler (ErrorHandler handler)
+ {
+ producer.setErrorHandler (handler);
+ consumer.setErrorHandler (handler);
+ }
+
+ public DOMImplementation getDOMImplementation ()
+ { return impl; }
+
+ public Document newDocument ()
+ { return new DomDocument (); }
+
+ // implementation of error handler that's used when validating
+ public void fatalError (SAXParseException e) throws SAXException
+ { throw e; }
+ public void error (SAXParseException e) throws SAXException
+ { throw e; }
+ public void warning (SAXParseException e) throws SAXException
+ { /* ignore */ }
+ }
+}
diff --git a/external/jaxp/source/gnu/xml/dom/package.html b/external/jaxp/source/gnu/xml/dom/package.html
new file mode 100644
index 000000000..7639f6990
--- /dev/null
+++ b/external/jaxp/source/gnu/xml/dom/package.html
@@ -0,0 +1,270 @@
+<html><head>
+<!-- $Id: package.html,v 1.1 2003-02-01 02:10:18 cbj Exp $ -->
+<title>foo</title>
+</head><body>
+
+<p> This is a Free Software
+DOM Level 2 implementation, supporting these features:
+"XML",
+"Events", "MutationEvents",
+"HTMLEvents" (won't generate them though),
+"UIEvents" (also won't generate them),
+"USER-Events" (a conformant extension),
+and
+"Traversal" (optional; no TreeWalker yet).
+It includes JAXP bootstrapping support, addressing the issue that
+DOM (Levels 1 and 2) doesn't include bootstrapping APIs.
+It is intended to be a reasonable base both for
+experimentation and supporting additional DOM modules as clean layers.
+</p>
+
+<p>Note that while DOM does not specify its behavior in the
+face of concurrent access, this implementation does.
+Specifically:
+if only one thread at a time accesses a Document,
+of if several threads cooperate for read-only access,
+then no concurrency conflicts will occur.
+If several threads mutate a given document
+(or send events using it) at the same time,
+there is currently no guarantee that
+they won't interfere with each other.
+</p>
+
+<h3> Design Goals </h3>
+
+<p> A number of DOM implementations are available in Java, including
+commercial ones from Sun, IBM, Oracle, and DataChannel as well as
+noncommercial ones from Docuverse, OpenXML, and Silfide. Why have
+another? Some of the goals of this version: </p> <ul>
+
+ <li> DOM Level 2 support. This was the first generally available
+ implementation of DOM Level 2 in Java. </li>
+
+ <li> Free Software. This one is distributed under the GPL (with
+ "library exception") so it can be used with a different class of
+ application. </li>
+
+ <li> Second implementation syndrome. I can do it simpler this time
+ around ... and heck, writing it only takes a bit over a day once you
+ know your way around. (Debugging is of course a different story,
+ since W3C hasn't provided any conformance test suite and publicly
+ available suites have poor coverage.) </li>
+
+ <li> Sanity check the then-current Last Call DOM draft. Best to find
+ bugs early, when they're relatively fixable. Yes, bugs were found.
+ </li>
+
+ <li> Modularity. Most of the implementations mentioned above are part
+ of huge packages; take all (including bugs, of which some have far
+ too many), or take nothing. I prefer a menu approach, when possible.
+ This code is standalone, not beholden to any particular parser or XSL
+ or XPath code. </li>
+
+ <li> OK, I'm a hacker, I like to write code. </li>
+
+ </ul>
+
+<p> This also works with the Gnu Compiler for Java (GCJ). GCJ promises
+to be quite the environment for programming Java, both directly and from
+C++ using the new CNI interfaces (which really use C++, unlike JNI). </p>
+
+
+<h3> Open Issues </h3>
+
+<p> At this writing: </p> <ul>
+
+ <li> An approximation of XML rules for legal names is used (Unicode
+ rules with minor tweaks) rather than the huge character tables in the
+ XML appendix. </li>
+
+ <li> See below for some restrictions on the mutation event
+ support ... some events aren't reported (and likely won't be). </li>
+
+ <li> There's no implementation (yet)
+ for the TreeWalker traversal API.</li>
+
+ <li> More testing and conformance work is needed. </li>
+
+ </ul>
+
+<p> I ran a profiler a few times and remove some of the performance hotspots,
+but it's not tuned. Reporting mutation events, in particular, is
+rather costly -- it started at about a 40% penalty for appendNode calls,
+I've got it down around 12%, but it'll be hard to shrink it much further.
+The overall code size is relatively small, though you may want to be rid of
+many of the unused DOM interface classes (HTML, CSS, and so on).</p>
+
+
+<h2><a name="features">Features of this Package</a></h2>
+
+<p> Starting with DOM Level 2, you can really see that DOM is constructed
+as a bunch of optional modules around a core of either XML or HTML
+functionality. Different implementations will support different optional
+modules. This implementation provides a set of features that should be
+useful if you're not depending on the HTML functionality (lots of convenience
+functions that mostly don't buy much except API surface area) and user
+interface support. That is, browsers will want more -- but what they
+need should be cleanly layered over what's already here. </p>
+
+<h3> Core Feature Set: "XML" </h3>
+
+<p> This DOM implementation supports the "XML" feature set, which basically
+gets you four things over the bare core (which you're officially not supposed
+to implement except in conjunction with the "XML" or "HTML" feature). In
+order of decreasing utility, those four things are: </p> <ol>
+
+ <li> ProcessingInstruction nodes. These are probably the most
+ valuable thing. Handy little buggers, in part because all the APIs
+ you need to use them are provided, and they're designed to let you
+ escape XML document structure rules in controlled ways.</li>
+
+ <li> CDATASection nodes. These are of of limited utility since CDATA
+ is just text that prints funny. These are of use to some sorts of
+ applications, though I encourage folk to not use them. </li>
+
+ <li> DocumentType nodes, and associated Notation and Entity nodes.
+ These appear to be useless. Briefly, these "Type" nodes expose no
+ typing information. They're only really usable to expose some lexical
+ structure that almost every application needs to ignore. (XML editors
+ might like to see them, but they need true typing information much more.)
+ I strongly encourage people not to use these. </li>
+
+ <li> EntityReference nodes can show up. These are actively annoying,
+ since they add an extra level of hierarchy, are the cause of most of
+ the complexity in attribute values, and their contents are immutable.
+ Avoid these.</li>
+
+ </ol>
+
+<h3> Optional Feature Sets: "Events", and friends </h3>
+
+<p> Events may be one of the more interesting new features in Level 2.
+This package provides the core feature set and exposes mutation events.
+No gooey events though; if you want that, write a layered implementation! </p>
+
+<p> Three mutation events aren't currently generated:</p> <ul>
+
+ <li> <em>DOMSubtreeModified</em> is poorly specified. Think of this
+ as generating one such event around the time of finalization, which
+ is a fully conformant implementation. This implementation is exactly
+ as useful as that one. </li>
+
+ <li> <em>DOMNodeRemovedFromDocument</em> and
+ <em>DOMNodeInsertedIntoDocument</em> are supposed to get sent to
+ every node in a subtree that gets removed or inserted (respectively).
+ This can be <em>extremely costly</em>, and the removal and insertion
+ processing is already significantly slower due to event reporting.
+ It's much easier, and more efficient, to have a listener higher in the
+ tree watch removal and insertion events through the bubbling or capture
+ mechanisms, than it is to watch for these two events.</li>
+
+ </ul>
+
+<p> In addition, certain kinds of attribute modification aren't reported.
+A fix is known, but it couldn't report the previous value of the attribute.
+More work could fix all of this (as well as reduce the generally high cost
+of childful attributes), but that's not been done yet. </p>
+
+<p> Also, note that it is a <em>Bad Thing&#153;</em> to have the listener
+for a mutation event change the ancestry for the target of that event.
+Or to prevent mutation events from bubbling to where they're needed.
+Just don't do those, OK? </p>
+
+<p> As an experimental feature (named "USER-Events"), you can provide
+your own "user" events. Just name them anything starting with "USER-"
+and you're set. Dispatch them through, bubbling, capturing, or what
+ever takes your fancy. One important thing you can't currently do is
+pass any data (like an object) with those events. Maybe later there
+will be a "UserEvent" interface letting you get some substantial use
+out of this mechanism even if you're not "inside" of a DOM package.</p>
+
+<p> You can create and send HTML events. Ditto UIEvents. Since DOM
+doesn't require a UI, it's the UI's job to send them; perhaps that's
+part of your application. </p>
+
+<p><em>This package may be built without the ability to report mutation
+events, gaining a significant speedup in DOM construction time. However,
+if that is done then certain other features -- notably node iterators
+and getElementsByTagname -- will not be available.</em>
+
+
+<h3> Optional Feature: "Traversal" </h3>
+
+<p> Each DOM node has all you need to walk to everything connected
+to that node. Lightweight, efficient utilities are easily layered on
+top of just the core APIs. </p>
+
+<p> Traversal APIs are an optional part of DOM Level 2, providing
+a not-so-lightweight way to walk over DOM trees, if your application
+didn't already have such utilities for use with data represented via
+DOM. Implementing this helped debug the (optional) event and mutation
+event subsystems, so it's provided here. </p>
+
+<p> At this writing, the "TreeWalker" interface isn't implemented. </p>
+
+
+
+<h2><a name='avoid'>DOM Functionality to Avoid</a></h2>
+
+<p> For what appear to be a combination of historical and "committee
+logic" reasons, DOM has a number of <em>features which I strongly advise
+you to avoid using</em> in your library and application code. These
+include the following types of DOM nodes; see the documentation for the
+implementation class for more information: <ul>
+
+ <li> CDATASection
+ (<a href='DomCDATA.html'>DomCDATA</a> class)
+ ... use normal Text nodes instead, so you don't have to make
+ every algorithm recognize multiple types of character data
+
+ <li> DocumentType
+ (<a href='DomDoctype.html'>DomDocType</a> class)
+ ... if this held actual typing information, it might be useful
+
+ <li> Entity
+ (<a href='DomEntity.html'>DomEntity</a> class)
+ ... neither parsed nor unparsed entities work well in DOM; it
+ won't even tell you which attributes identify unparsed entities
+
+ <li> EntityReference
+ (<a href='DomEntityReference.html'>DomEntityReference</a> class)
+ ... permitted implementation variances are extreme, all children
+ are readonly, and these can interact poorly with namespaces
+
+ <li> Notation
+ (<a href='DomNotation.html'>DomNotation</a> class)
+ ... only really usable with unparsed entities (which aren't well
+ supported; see above) or perhaps with PIs after the DTD, not with
+ NOTATION attributes
+
+ </ul>
+
+<p> If you really need to use unparsed entities or notations, use SAX;
+it offers better support for all DTD-related functionality.
+It also exposes actual
+document typing information (such as element content models).</p>
+
+<p> Also, when accessing attribute values, use methods that provide their
+values as single strings, rather than those which expose value substructure
+(Text and EntityReference nodes). (See the <a href='DomAttr.html'>DomAttr</a>
+documentation for more information.) </p>
+
+<p> Note that many of these features were provided as partial support for
+editor functionality (including the incomplete DTD access). Full editor
+functionality requires access to potentially malformed lexical structure,
+at the level of unparsed tokens and below. Access at such levels is so
+complex that using it in non-editor applications sacrifices all the
+benefits of XML; editor aplications need extremely specialized APIs. </p>
+
+<p> (This isn't a slam against DTDs, note; only against the broken support
+for them in DOM. Even despite inclusion of some dubious SGML legacy features
+such as notations and unparsed entities,
+and the ongoing proliferation of alternative schema and validation tools,
+DTDs are still the most widely adopted tool
+to constrain XML document structure.
+Alternative schemes generally focus on data transfer style
+applications; open document architectures comparable to
+DocBook 4.0 don't yet exist in the schema world.
+Feel free to use DTDs; just don't expect DOM to help you.) </p>
+
+</body></html>
diff --git a/external/jaxp/source/gnu/xml/pipeline/CallFilter.java b/external/jaxp/source/gnu/xml/pipeline/CallFilter.java
new file mode 100644
index 000000000..141b50a7a
--- /dev/null
+++ b/external/jaxp/source/gnu/xml/pipeline/CallFilter.java
@@ -0,0 +1,243 @@
+/*
+ * $Id: CallFilter.java,v 1.1 2003-02-01 02:10:18 cbj Exp $
+ * Copyright (C) 1999-2001 David Brownell
+ *
+ * This file is part of GNU JAXP, a library.
+ *
+ * GNU JAXP is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * GNU JAXP is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ * As a special exception, if you link this library with other files to
+ * produce an executable, this library does not by itself cause the
+ * resulting executable to be covered by the GNU General Public License.
+ * This exception does not however invalidate any other reasons why the
+ * executable file might be covered by the GNU General Public License.
+ */
+
+package gnu.xml.pipeline;
+
+import java.io.*;
+import java.net.*;
+
+import org.xml.sax.*;
+import org.xml.sax.ext.*;
+import org.xml.sax.helpers.XMLReaderFactory;
+
+import gnu.xml.util.Resolver;
+import gnu.xml.util.XMLWriter;
+
+
+// $Id: CallFilter.java,v 1.1 2003-02-01 02:10:18 cbj Exp $
+
+/**
+ * Input is sent as an XML request to given URI, and the output of this
+ * filter is the parsed response to that request.
+ * A connection is opened to the remote URI when the startDocument call is
+ * issued through this filter, and the request is finished when the
+ * endDocument call is issued. Events should be written quickly enough to
+ * prevent the remote HTTP server from aborting the connection due to
+ * inactivity; you may want to buffer text in an earlier pipeline stage.
+ * If your application requires validity checking of such
+ * outputs, have the output pipeline include a validation stage.
+ *
+ * <p>In effect, this makes a remote procedure call to the URI, with the
+ * request and response document syntax as chosen by the application.
+ * <em>Note that all the input events must be seen, and sent to the URI,
+ * before the first output event can be seen. </em> Clients are delayed
+ * at least by waiting for the server to respond, constraining concurrency.
+ * Services can thus be used to synchronize concurrent activities, and
+ * even to prioritize service among different clients.
+ *
+ * <p> You are advised to avoid restricting yourself to an "RPC" model
+ * for distributed computation. With a World Wide Web, network latencies
+ * and failures (e.g. non-availability)
+ * are significant; adopting a "procedure" model, rather than a workflow
+ * model where bulk requests are sent and worked on asynchronously, is not
+ * generally an optimal system-wide architecture. When the messages may
+ * need authentication, such as with an OpenPGP signature, or when server
+ * loads don't argue in favor of immediate responses, non-RPC models can
+ * be advantageous. (So-called "peer to peer" computing models are one
+ * additional type of model, though too often that term is applied to
+ * systems that still have a centralized control structure.)
+ *
+ * <p> <em>Be strict in what you send, liberal in what you accept,</em> as
+ * the Internet tradition goes. Strictly conformant data should never cause
+ * problems to its receiver; make your request pipeline be very strict, and
+ * don't compromise on that. Make your response pipeline strict as well,
+ * but be ready to tolerate specific mild, temporary, and well-documented
+ * variations from specific communications peers.
+ *
+ * @see XmlServlet
+ *
+ * @author David Brownell
+ * @version $Date: 2003-02-01 02:10:18 $
+ */
+final public class CallFilter implements EventConsumer
+{
+ private Requestor req;
+ private EventConsumer next;
+ private URL target;
+ private URLConnection conn;
+ private ErrorHandler errHandler;
+
+
+ /**
+ * Initializes a call filter so that its inputs are sent to the
+ * specified URI, and its outputs are sent to the next consumer
+ * provided.
+ *
+ * @exception IOException if the URI isn't accepted as a URL
+ */
+ // constructor used by PipelineFactory
+ public CallFilter (String uri, EventConsumer next)
+ throws IOException
+ {
+ this.next = next;
+ req = new Requestor ();
+ setCallTarget (uri);
+ }
+
+ /**
+ * Assigns the URI of the call target to be used.
+ * Does not affect calls currently being made.
+ */
+ final public void setCallTarget (String uri)
+ throws IOException
+ {
+ target = new URL (uri);
+ }
+
+ /**
+ * Assigns the error handler to be used to present most fatal
+ * errors.
+ */
+ public void setErrorHandler (ErrorHandler handler)
+ {
+ req.setErrorHandler (handler);
+ }
+
+
+ /**
+ * Returns the call target's URI.
+ */
+ final public String getCallTarget ()
+ {
+ return target.toString ();
+ }
+
+ /** Returns the content handler currently in use. */
+ final public org.xml.sax.ContentHandler getContentHandler ()
+ {
+ return req;
+ }
+
+ /** Returns the DTD handler currently in use. */
+ final public DTDHandler getDTDHandler ()
+ {
+ return req;
+ }
+
+
+ /**
+ * Returns the declaration or lexical handler currently in
+ * use, or throws an exception for other properties.
+ */
+ final public Object getProperty (String id)
+ throws SAXNotRecognizedException
+ {
+ if (EventFilter.DECL_HANDLER.equals (id))
+ return req;
+ if (EventFilter.LEXICAL_HANDLER.equals (id))
+ return req;
+ throw new SAXNotRecognizedException (id);
+ }
+
+
+ // JDK 1.1 seems to need it to be done this way, sigh
+ ErrorHandler getErrorHandler () { return errHandler; }
+
+ //
+ // Takes input and echoes to server as POST input.
+ // Then sends the POST reply to the next pipeline element.
+ //
+ final class Requestor extends XMLWriter
+ {
+ Requestor ()
+ {
+ super ((Writer)null);
+ }
+
+ public synchronized void startDocument () throws SAXException
+ {
+ // Connect to remote object and set up to send it XML text
+ try {
+ if (conn != null)
+ throw new IllegalStateException ("call is being made");
+
+ conn = target.openConnection ();
+ conn.setDoOutput (true);
+ conn.setRequestProperty ("Content-Type",
+ "application/xml;charset=UTF-8");
+
+ setWriter (new OutputStreamWriter (
+ conn.getOutputStream (),
+ "UTF8"), "UTF-8");
+
+ } catch (IOException e) {
+ fatal ("can't write (POST) to URI: " + target, e);
+ }
+
+ // NOW base class can safely write that text!
+ super.startDocument ();
+ }
+
+ public void endDocument () throws SAXException
+ {
+ //
+ // Finish writing the request (for HTTP, a POST);
+ // this closes the output stream.
+ //
+ super.endDocument ();
+
+ //
+ // Receive the response.
+ // Produce events for the next stage.
+ //
+ InputSource source;
+ XMLReader producer;
+ String encoding;
+
+ try {
+
+ source = new InputSource (conn.getInputStream ());
+
+// FIXME if status is anything but success, report it!! It'd be good to
+// save the request data just in case we need to deal with a forward.
+
+ encoding = Resolver.getEncoding (conn.getContentType ());
+ if (encoding != null)
+ source.setEncoding (encoding);
+
+ producer = XMLReaderFactory.createXMLReader ();
+ producer.setErrorHandler (getErrorHandler ());
+ EventFilter.bind (producer, next);
+ producer.parse (source);
+ conn = null;
+
+ } catch (IOException e) {
+ fatal ("I/O Exception reading response, " + e.getMessage (), e);
+ }
+ }
+ }
+}
diff --git a/external/jaxp/source/gnu/xml/pipeline/DomConsumer.java b/external/jaxp/source/gnu/xml/pipeline/DomConsumer.java
new file mode 100755
index 000000000..b308310fb
--- /dev/null
+++ b/external/jaxp/source/gnu/xml/pipeline/DomConsumer.java
@@ -0,0 +1,945 @@
+/*
+ * $Id: DomConsumer.java,v 1.1 2003-02-01 02:10:18 cbj Exp $
+ * Copyright (C) 1999-2001 David Brownell
+ *
+ * This file is part of GNU JAXP, a library.
+ *
+ * GNU JAXP is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * GNU JAXP is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ * As a special exception, if you link this library with other files to
+ * produce an executable, this library does not by itself cause the
+ * resulting executable to be covered by the GNU General Public License.
+ * This exception does not however invalidate any other reasons why the
+ * executable file might be covered by the GNU General Public License.
+ */
+
+package gnu.xml.pipeline;
+
+import java.util.Hashtable;
+
+import org.w3c.dom.*;
+import org.xml.sax.*;
+import org.xml.sax.ext.DeclHandler;
+import org.xml.sax.ext.LexicalHandler;
+import org.xml.sax.helpers.AttributesImpl;
+
+import gnu.xml.util.DomParser;
+
+
+/**
+ * This consumer builds a DOM Document from its input, acting either as a
+ * pipeline terminus or as an intermediate buffer. When a document's worth
+ * of events has been delivered to this consumer, that document is read with
+ * a {@link DomParser} and sent to the next consumer. It is also available
+ * as a read-once property.
+ *
+ * <p>The DOM tree is constructed as faithfully as possible. There are some
+ * complications since a DOM should expose behaviors that can't be implemented
+ * without API backdoors into that DOM, and because some SAX parsers don't
+ * report all the information that DOM permits to be exposed. The general
+ * problem areas involve information from the Document Type Declaration (DTD).
+ * DOM only represents a limited subset, but has some behaviors that depend
+ * on much deeper knowledge of a document's DTD. You shouldn't have much to
+ * worry about unless you change handling of "noise" nodes from its default
+ * setting (which ignores them all); note if you use JAXP to populate your
+ * DOM trees, it wants to save "noise" nodes by default. (Such nodes include
+ * ignorable whitespace, comments, entity references and CDATA boundaries.)
+ * Otherwise, your
+ * main worry will be if you use a SAX parser that doesn't flag ignorable
+ * whitespace unless it's validating (few don't).
+ *
+ * <p> The SAX2 events used as input must contain XML Names for elements
+ * and attributes, with original prefixes. In SAX2,
+ * this is optional unless the "namespace-prefixes" parser feature is set.
+ * Moreover, many application components won't provide completely correct
+ * structures anyway. <em>Before you convert a DOM to an output document,
+ * you should plan to postprocess it to create or repair such namespace
+ * information.</em> The {@link NSFilter} pipeline stage does such work.
+ *
+ * <p> <em>Note: changes late in DOM L2 process made it impractical to
+ * attempt to create the DocumentType node in any implementation-neutral way,
+ * much less to populate it (L1 didn't support even creating such nodes).
+ * To create and populate such a node, subclass the inner
+ * {@link DomConsumer.Handler} class and teach it about the backdoors into
+ * whatever DOM implementation you want. It's possible that some revised
+ * DOM API (L3?) will make this problem solvable again. </em>
+ *
+ * @see DomParser
+ *
+ * @author David Brownell
+ * @version $Date: 2003-02-01 02:10:18 $
+ */
+public class DomConsumer implements EventConsumer
+{
+ private Class domImpl;
+
+ private boolean hidingCDATA = true;
+ private boolean hidingComments = true;
+ private boolean hidingWhitespace = true;
+ private boolean hidingReferences = true;
+
+ private Handler handler;
+ private ErrorHandler errHandler;
+
+ private EventConsumer next;
+
+ // FIXME: this can't be a generic pipeline stage just now,
+ // since its input became a Class not a String (to be turned
+ // into a class, using the right class loader)
+
+
+ /**
+ * Configures this pipeline terminus to use the specified implementation
+ * of DOM when constructing its result value.
+ *
+ * @param impl class implementing {@link org.w3c.dom.Document Document}
+ * which publicly exposes a default constructor
+ *
+ * @exception SAXException when there is a problem creating an
+ * empty DOM document using the specified implementation
+ */
+ public DomConsumer (Class impl)
+ throws SAXException
+ {
+ domImpl = impl;
+ handler = new Handler (this);
+ }
+
+ /**
+ * This is the hook through which a subclass provides a handler
+ * which knows how to access DOM extensions, specific to some
+ * implementation, to record additional data in a DOM.
+ * Treat this as part of construction; don't call it except
+ * before (or between) parses.
+ */
+ protected void setHandler (Handler h)
+ {
+ handler = h;
+ }
+
+
+ private Document emptyDocument ()
+ throws SAXException
+ {
+ try {
+ return (Document) domImpl.newInstance ();
+ } catch (IllegalAccessException e) {
+ throw new SAXException ("can't access constructor: "
+ + e.getMessage ());
+ } catch (InstantiationException e) {
+ throw new SAXException ("can't instantiate Document: "
+ + e.getMessage ());
+ }
+ }
+
+
+ /**
+ * Configures this consumer as a buffer/filter, using the specified
+ * DOM implementation when constructing its result value.
+ *
+ * <p> This event consumer acts as a buffer and filter, in that it
+ * builds a DOM tree and then writes it out when <em>endDocument</em>
+ * is invoked. Because of the limitations of DOM, much information
+ * will as a rule not be seen in that replay. To get a full fidelity
+ * copy of the input event stream, use a {@link TeeConsumer}.
+ *
+ * @param impl class implementing {@link org.w3c.dom.Document Document}
+ * which publicly exposes a default constructor
+ * @param next receives a "replayed" sequence of parse events when
+ * the <em>endDocument</em> method is invoked.
+ *
+ * @exception SAXException when there is a problem creating an
+ * empty DOM document using the specified DOM implementation
+ */
+ public DomConsumer (Class impl, EventConsumer n)
+ throws SAXException
+ {
+ this (impl);
+ next = n;
+ }
+
+
+ /**
+ * Returns the document constructed from the preceding
+ * sequence of events. This method should not be
+ * used again until another sequence of events has been
+ * given to this EventConsumer.
+ */
+ final public Document getDocument ()
+ {
+ return handler.clearDocument ();
+ }
+
+ public void setErrorHandler (ErrorHandler handler)
+ {
+ errHandler = handler;
+ }
+
+
+ /**
+ * Returns true if the consumer is hiding entity references nodes
+ * (the default), and false if EntityReference nodes should
+ * instead be created. Such EntityReference nodes will normally be
+ * empty, unless an implementation arranges to populate them and then
+ * turn them back into readonly objects.
+ *
+ * @see #setHidingReferences
+ */
+ final public boolean isHidingReferences ()
+ { return hidingReferences; }
+
+ /**
+ * Controls whether the consumer will hide entity expansions,
+ * or will instead mark them with entity reference nodes.
+ *
+ * @see #isHidingReferences
+ * @param flag False if entity reference nodes will appear
+ */
+ final public void setHidingReferences (boolean flag)
+ { hidingReferences = flag; }
+
+
+ /**
+ * Returns true if the consumer is hiding comments (the default),
+ * and false if they should be placed into the output document.
+ *
+ * @see #setHidingComments
+ */
+ public final boolean isHidingComments ()
+ { return hidingComments; }
+
+ /**
+ * Controls whether the consumer is hiding comments.
+ *
+ * @see #isHidingComments
+ */
+ public final void setHidingComments (boolean flag)
+ { hidingComments = flag; }
+
+
+ /**
+ * Returns true if the consumer is hiding ignorable whitespace
+ * (the default), and false if such whitespace should be placed
+ * into the output document as children of element nodes.
+ *
+ * @see #setHidingWhitespace
+ */
+ public final boolean isHidingWhitespace ()
+ { return hidingWhitespace; }
+
+ /**
+ * Controls whether the consumer hides ignorable whitespace
+ *
+ * @see #isHidingComments
+ */
+ public final void setHidingWhitespace (boolean flag)
+ { hidingWhitespace = flag; }
+
+
+ /**
+ * Returns true if the consumer is saving CDATA boundaries, or
+ * false (the default) otherwise.
+ *
+ * @see #setHidingCDATA
+ */
+ final public boolean isHidingCDATA ()
+ { return hidingCDATA; }
+
+ /**
+ * Controls whether the consumer will save CDATA boundaries.
+ *
+ * @see #isHidingCDATA
+ * @param flag True to treat CDATA text differently from other
+ * text nodes
+ */
+ final public void setHidingCDATA (boolean flag)
+ { hidingCDATA = flag; }
+
+
+
+ /** Returns the document handler being used. */
+ final public ContentHandler getContentHandler ()
+ { return handler; }
+
+ /** Returns the DTD handler being used. */
+ final public DTDHandler getDTDHandler ()
+ { return handler; }
+
+ /**
+ * Returns the lexical handler being used.
+ * (DOM construction can't really use declaration handlers.)
+ */
+ final public Object getProperty (String id)
+ throws SAXNotRecognizedException
+ {
+ if ("http://xml.org/sax/properties/lexical-handler".equals (id))
+ return handler;
+ if ("http://xml.org/sax/properties/declaration-handler".equals (id))
+ return handler;
+ throw new SAXNotRecognizedException (id);
+ }
+
+ EventConsumer getNext () { return next; }
+
+ ErrorHandler getErrorHandler () { return errHandler; }
+
+ /**
+ * Class used to intercept various parsing events and use them to
+ * populate a DOM document. Subclasses would typically know and use
+ * backdoors into specific DOM implementations, used to implement
+ * DTD-related functionality.
+ *
+ * <p> Note that if this ever throws a DOMException (runtime exception)
+ * that will indicate a bug in the DOM (e.g. doesn't support something
+ * per specification) or the parser (e.g. emitted an illegal name, or
+ * accepted illegal input data). </p>
+ */
+ public static class Handler
+ implements ContentHandler, LexicalHandler,
+ DTDHandler, DeclHandler
+ {
+ protected DomConsumer consumer;
+
+ private DOMImplementation impl;
+ private Document document;
+ private boolean isL2;
+
+ private Locator locator;
+ private Node top;
+ private boolean inCDATA;
+ private boolean mergeCDATA;
+ private boolean inDTD;
+ private String currentEntity;
+
+ private boolean recreatedAttrs;
+ private AttributesImpl attributes = new AttributesImpl ();
+
+ /**
+ * Subclasses may use SAX2 events to provide additional
+ * behaviors in the resulting DOM.
+ */
+ protected Handler (DomConsumer consumer)
+ throws SAXException
+ {
+ this.consumer = consumer;
+ document = consumer.emptyDocument ();
+ impl = document.getImplementation ();
+ isL2 = impl.hasFeature ("XML", "2.0");
+ }
+
+ private void fatal (String message, Exception x)
+ throws SAXException
+ {
+ SAXParseException e;
+ ErrorHandler errHandler = consumer.getErrorHandler ();;
+
+ if (locator == null)
+ e = new SAXParseException (message, null, null, -1, -1, x);
+ else
+ e = new SAXParseException (message, locator, x);
+ if (errHandler != null)
+ errHandler.fatalError (e);
+ throw e;
+ }
+
+ /**
+ * Returns and forgets the document produced. If the handler is
+ * reused, a new document may be created.
+ */
+ Document clearDocument ()
+ {
+ Document retval = document;
+ document = null;
+ locator = null;
+ return retval;
+ }
+
+ /**
+ * Returns the document under construction.
+ */
+ protected Document getDocument ()
+ { return document; }
+
+ /**
+ * Returns the current node being populated. This is usually
+ * an Element or Document, but it might be an EntityReference
+ * node if some implementation-specific code knows how to put
+ * those into the result tree and later mark them as readonly.
+ */
+ protected Node getTop ()
+ { return top; }
+
+
+ // SAX1
+ public void setDocumentLocator (Locator locator)
+ {
+ this.locator = locator;
+ }
+
+ // SAX1
+ public void startDocument ()
+ throws SAXException
+ {
+ if (document == null)
+ try {
+ if (isL2) {
+ // couple to original implementation
+ document = impl.createDocument (null, "foo", null);
+ document.removeChild (document.getFirstChild ());
+ } else {
+ document = consumer.emptyDocument ();
+ }
+ } catch (Exception e) {
+ fatal ("DOM create document", e);
+ }
+ top = document;
+ }
+
+ // SAX1
+ public void endDocument ()
+ throws SAXException
+ {
+ try {
+ if (consumer.getNext () != null && document != null) {
+ DomParser parser = new DomParser (document);
+
+ EventFilter.bind (parser, consumer.getNext ());
+ parser.parse ("ignored");
+ }
+ } finally {
+ top = null;
+ }
+ }
+
+ // SAX1
+ public void processingInstruction (String target, String data)
+ throws SAXException
+ {
+ // we can't create populated entity ref nodes using
+ // only public DOM APIs (they've got to be readonly)
+ if (currentEntity != null)
+ return;
+
+ ProcessingInstruction pi;
+
+ if (isL2
+ // && consumer.isUsingNamespaces ()
+ && target.indexOf (':') != -1)
+ namespaceError (
+ "PI target name is namespace nonconformant: "
+ + target);
+ if (inDTD)
+ return;
+ pi = document.createProcessingInstruction (target, data);
+ top.appendChild (pi);
+ }
+
+ /**
+ * Subclasses may overrride this method to provide a more efficient
+ * way to construct text nodes.
+ * Typically, copying the text into a single character array will
+ * be more efficient than doing that as well as allocating other
+ * needed for a String, including an internal StringBuffer.
+ * Those additional memory and CPU costs can be incurred later,
+ * if ever needed.
+ * Unfortunately the standard DOM factory APIs encourage those costs
+ * to be incurred early.
+ */
+ protected Text createText (
+ boolean isCDATA,
+ char ch [],
+ int start,
+ int length
+ ) {
+ String value = new String (ch, start, length);
+
+ if (isCDATA)
+ return document.createCDATASection (value);
+ else
+ return document.createTextNode (value);
+ }
+
+ // SAX1
+ public void characters (char ch [], int start, int length)
+ throws SAXException
+ {
+ // we can't create populated entity ref nodes using
+ // only public DOM APIs (they've got to be readonly
+ // at creation time)
+ if (currentEntity != null)
+ return;
+
+ Node lastChild = top.getLastChild ();
+
+ // merge consecutive text or CDATA nodes if appropriate.
+ if (lastChild instanceof Text) {
+ if (consumer.isHidingCDATA ()
+ // consecutive Text content ... always merge
+ || (!inCDATA
+ && !(lastChild instanceof CDATASection))
+ // consecutive CDATASection content ... don't
+ // merge between sections, only within them
+ || (inCDATA && mergeCDATA
+ && lastChild instanceof CDATASection)
+ ) {
+ CharacterData last = (CharacterData) lastChild;
+ String value = new String (ch, start, length);
+
+ last.appendData (value);
+ return;
+ }
+ }
+ if (inCDATA && !consumer.isHidingCDATA ()) {
+ top.appendChild (createText (true, ch, start, length));
+ mergeCDATA = true;
+ } else
+ top.appendChild (createText (false, ch, start, length));
+ }
+
+ // SAX2
+ public void skippedEntity (String name)
+ throws SAXException
+ {
+ // this callback is useless except to report errors, since
+ // we can't know if the ref was in content, within an
+ // attribute, within a declaration ... only one of those
+ // cases supports more intelligent action than a panic.
+ fatal ("skipped entity: " + name, null);
+ }
+
+ // SAX2
+ public void startPrefixMapping (String prefix, String uri)
+ throws SAXException
+ {
+ // reconstruct "xmlns" attributes deleted by all
+ // SAX2 parsers without "namespace-prefixes" = true
+ if ("".equals (prefix))
+ attributes.addAttribute ("", "", "xmlns",
+ "CDATA", uri);
+ else
+ attributes.addAttribute ("", "", "xmlns:" + prefix,
+ "CDATA", uri);
+ recreatedAttrs = true;
+ }
+
+ // SAX2
+ public void endPrefixMapping (String prefix)
+ throws SAXException
+ { }
+
+ // SAX2
+ public void startElement (
+ String uri,
+ String localName,
+ String qName,
+ Attributes atts
+ ) throws SAXException
+ {
+ // we can't create populated entity ref nodes using
+ // only public DOM APIs (they've got to be readonly)
+ if (currentEntity != null)
+ return;
+
+ // parser discarded basic information; DOM tree isn't writable
+ // without massaging to assign prefixes to all nodes.
+ // the "NSFilter" class does that massaging.
+ if (qName.length () == 0)
+ qName = localName;
+
+
+ Element element;
+ int length = atts.getLength ();
+
+ if (!isL2) {
+ element = document.createElement (qName);
+
+ // first the explicit attributes ...
+ length = atts.getLength ();
+ for (int i = 0; i < length; i++)
+ element.setAttribute (atts.getQName (i),
+ atts.getValue (i));
+ // ... then any recreated ones (DOM deletes duplicates)
+ if (recreatedAttrs) {
+ recreatedAttrs = false;
+ length = attributes.getLength ();
+ for (int i = 0; i < length; i++)
+ element.setAttribute (attributes.getQName (i),
+ attributes.getValue (i));
+ attributes.clear ();
+ }
+
+ top.appendChild (element);
+ top = element;
+ return;
+ }
+
+ // For an L2 DOM when namespace use is enabled, use
+ // createElementNS/createAttributeNS except when
+ // (a) it's an element in the default namespace, or
+ // (b) it's an attribute with no prefix
+ String namespace;
+
+ if (localName.length () != 0)
+ namespace = (uri.length () == 0) ? null : uri;
+ else
+ namespace = getNamespace (getPrefix (qName), atts);
+
+ if (namespace == null)
+ element = document.createElement (qName);
+ else
+ element = document.createElementNS (namespace, qName);
+
+ populateAttributes (element, atts);
+ if (recreatedAttrs) {
+ recreatedAttrs = false;
+ // ... DOM deletes any duplicates
+ populateAttributes (element, attributes);
+ attributes.clear ();
+ }
+
+ top.appendChild (element);
+ top = element;
+ }
+
+ final static String xmlnsURI = "http://www.w3.org/2000/xmlns/";
+
+ private void populateAttributes (Element element, Attributes attrs)
+ throws SAXParseException
+ {
+ int length = attrs.getLength ();
+
+ for (int i = 0; i < length; i++) {
+ String type = attrs.getType (i);
+ String value = attrs.getValue (i);
+ String name = attrs.getQName (i);
+ String local = attrs.getLocalName (i);
+ String uri = attrs.getURI (i);
+
+ // parser discarded basic information, DOM tree isn't writable
+ if (name.length () == 0)
+ name = local;
+
+ // all attribute types other than these three may not
+ // contain scoped names... enumerated attributes get
+ // reported as NMTOKEN, except for NOTATION values
+ if (!("CDATA".equals (type)
+ || "NMTOKEN".equals (type)
+ || "NMTOKENS".equals (type))) {
+ if (value.indexOf (':') != -1) {
+ namespaceError (
+ "namespace nonconformant attribute value: "
+ + "<" + element.getNodeName ()
+ + " " + name + "='" + value + "' ...>");
+ }
+ }
+
+ // xmlns="" is legal (undoes default NS)
+ // xmlns:foo="" is illegal
+ String prefix = getPrefix (name);
+ String namespace;
+
+ if ("xmlns".equals (prefix)) {
+ if ("".equals (value))
+ namespaceError ("illegal null namespace decl, " + name);
+ namespace = xmlnsURI;
+ } else if ("xmlns".equals (name))
+ namespace = xmlnsURI;
+
+ else if (prefix == null)
+ namespace = null;
+ else if (uri != "" && uri.length () != 0)
+ namespace = uri;
+ else
+ namespace = getNamespace (prefix, attrs);
+
+ if (namespace == null)
+ element.setAttribute (name, value);
+ else
+ element.setAttributeNS (namespace, name, value);
+ }
+ }
+
+ private String getPrefix (String name)
+ {
+ int temp;
+
+ if ((temp = name.indexOf (':')) > 0)
+ return name.substring (0, temp);
+ return null;
+ }
+
+ // used with SAX1-level parser output
+ private String getNamespace (String prefix, Attributes attrs)
+ throws SAXParseException
+ {
+ String namespace;
+ String decl;
+
+ // defaulting
+ if (prefix == null) {
+ decl = "xmlns";
+ namespace = attrs.getValue (decl);
+ if ("".equals (namespace))
+ return null;
+ else if (namespace != null)
+ return namespace;
+
+ // "xmlns" is like a keyword
+ // ... according to the Namespace REC, but DOM L2 CR2+
+ // and Infoset violate that by assigning a namespace.
+ // that conflict is resolved elsewhere.
+ } else if ("xmlns".equals (prefix))
+ return null;
+
+ // "xml" prefix is fixed
+ else if ("xml".equals (prefix))
+ return "http://www.w3.org/XML/1998/namespace";
+
+ // otherwise, expect a declaration
+ else {
+ decl = "xmlns:" + prefix;
+ namespace = attrs.getValue (decl);
+ }
+
+ // if we found a local declaration, great
+ if (namespace != null)
+ return namespace;
+
+
+ // ELSE ... search up the tree we've been building
+ for (Node n = top;
+ n != null && n.getNodeType () != Node.DOCUMENT_NODE;
+ n = (Node) n.getParentNode ()) {
+ if (n.getNodeType () == Node.ENTITY_REFERENCE_NODE)
+ continue;
+ Element e = (Element) n;
+ Attr attr = e.getAttributeNode (decl);
+ if (attr != null)
+ return attr.getNodeValue ();
+ }
+ // see above re "xmlns" as keyword
+ if ("xmlns".equals (decl))
+ return null;
+
+ namespaceError ("Undeclared namespace prefix: " + prefix);
+ return null;
+ }
+
+ // SAX2
+ public void endElement (String uri, String localName, String qName)
+ throws SAXException
+ {
+ // we can't create populated entity ref nodes using
+ // only public DOM APIs (they've got to be readonly)
+ if (currentEntity != null)
+ return;
+
+ top = top.getParentNode ();
+ }
+
+ // SAX1 (mandatory reporting if validating)
+ public void ignorableWhitespace (char ch [], int start, int length)
+ throws SAXException
+ {
+ if (consumer.isHidingWhitespace ())
+ return;
+ characters (ch, start, length);
+ }
+
+ // SAX2 lexical event
+ public void startCDATA ()
+ throws SAXException
+ {
+ inCDATA = true;
+ // true except for the first fragment of a cdata section
+ mergeCDATA = false;
+ }
+
+ // SAX2 lexical event
+ public void endCDATA ()
+ throws SAXException
+ {
+ inCDATA = false;
+ }
+
+ // SAX2 lexical event
+ //
+ // this SAX2 callback merges two unrelated things:
+ // - Declaration of the root element type ... belongs with
+ // the other DTD declaration methods, NOT HERE.
+ // - IDs for the optional external subset ... belongs here
+ // with other lexical information.
+ //
+ // ...and it doesn't include the internal DTD subset, desired
+ // both to support DOM L2 and to enable "pass through" processing
+ //
+ public void startDTD (String name, String publicId, String SystemId)
+ throws SAXException
+ {
+ // need to filter out comments and PIs within the DTD
+ inDTD = true;
+ }
+
+ // SAX2 lexical event
+ public void endDTD ()
+ throws SAXException
+ {
+ inDTD = false;
+ }
+
+ // SAX2 lexical event
+ public void comment (char ch [], int start, int length)
+ throws SAXException
+ {
+ Node comment;
+
+ // we can't create populated entity ref nodes using
+ // only public DOM APIs (they've got to be readonly)
+ if (consumer.isHidingComments ()
+ || inDTD
+ || currentEntity != null)
+ return;
+ comment = document.createComment (new String (ch, start, length));
+ top.appendChild (comment);
+ }
+
+ /**
+ * May be overridden by subclasses to return true, indicating
+ * that entity reference nodes can be populated and then made
+ * read-only.
+ */
+ public boolean canPopulateEntityRefs ()
+ { return false; }
+
+ // SAX2 lexical event
+ public void startEntity (String name)
+ throws SAXException
+ {
+ // are we ignoring what would be contents of an
+ // entity ref, since we can't populate it?
+ if (currentEntity != null)
+ return;
+
+ // Are we hiding all entity boundaries?
+ if (consumer.isHidingReferences ())
+ return;
+
+ // SAX2 shows parameter entities; DOM hides them
+ if (name.charAt (0) == '%' || "[dtd]".equals (name))
+ return;
+
+ // Since we can't create a populated entity ref node in any
+ // standard way, we create an unpopulated one.
+ EntityReference ref = document.createEntityReference (name);
+ top.appendChild (ref);
+ top = ref;
+
+ // ... allowing subclasses to populate them
+ if (!canPopulateEntityRefs ())
+ currentEntity = name;
+ }
+
+ // SAX2 lexical event
+ public void endEntity (String name)
+ throws SAXException
+ {
+ if (name.charAt (0) == '%' || "[dtd]".equals (name))
+ return;
+ if (name.equals (currentEntity))
+ currentEntity = null;
+ if (!consumer.isHidingReferences ())
+ top = top.getParentNode ();
+ }
+
+
+ // SAX1 DTD event
+ public void notationDecl (
+ String name,
+ String publicId, String SystemId
+ ) throws SAXException
+ {
+ /* IGNORE -- no public DOM API lets us store these
+ * into the doctype node
+ */
+ }
+
+ // SAX1 DTD event
+ public void unparsedEntityDecl (
+ String name,
+ String publicId, String SystemId,
+ String notationName
+ ) throws SAXException
+ {
+ /* IGNORE -- no public DOM API lets us store these
+ * into the doctype node
+ */
+ }
+
+ // SAX2 declaration event
+ public void elementDecl (String name, String model)
+ throws SAXException
+ {
+ /* IGNORE -- no content model support in DOM L2 */
+ }
+
+ // SAX2 declaration event
+ public void attributeDecl (
+ String eName,
+ String aName,
+ String type,
+ String mode,
+ String value
+ ) throws SAXException
+ {
+ /* IGNORE -- no attribute model support in DOM L2 */
+ }
+
+ // SAX2 declaration event
+ public void internalEntityDecl (String name, String value)
+ throws SAXException
+ {
+ /* IGNORE -- no public DOM API lets us store these
+ * into the doctype node
+ */
+ }
+
+ // SAX2 declaration event
+ public void externalEntityDecl (
+ String name,
+ String publicId,
+ String SystemId
+ ) throws SAXException
+ {
+ /* IGNORE -- no public DOM API lets us store these
+ * into the doctype node
+ */
+ }
+
+ //
+ // These really should offer the option of nonfatal handling,
+ // like other validity errors, though that would cause major
+ // chaos in the DOM data structures. DOM is already spec'd
+ // to treat many of these as fatal, so this is consistent.
+ //
+ private void namespaceError (String description)
+ throws SAXParseException
+ {
+ SAXParseException err;
+
+ err = new SAXParseException (description, locator);
+ throw err;
+ }
+ }
+}
diff --git a/external/jaxp/source/gnu/xml/pipeline/EventConsumer.java b/external/jaxp/source/gnu/xml/pipeline/EventConsumer.java
new file mode 100755
index 000000000..3efb921b8
--- /dev/null
+++ b/external/jaxp/source/gnu/xml/pipeline/EventConsumer.java
@@ -0,0 +1,86 @@
+/*
+ * $Id: EventConsumer.java,v 1.1 2003-02-01 02:10:18 cbj Exp $
+ * Copyright (C) 1999-2001 David Brownell
+ *
+ * This file is part of GNU JAXP, a library.
+ *
+ * GNU JAXP is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * GNU JAXP is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ * As a special exception, if you link this library with other files to
+ * produce an executable, this library does not by itself cause the
+ * resulting executable to be covered by the GNU General Public License.
+ * This exception does not however invalidate any other reasons why the
+ * executable file might be covered by the GNU General Public License.
+ */
+
+package gnu.xml.pipeline;
+
+import org.xml.sax.*;
+
+
+/**
+ * Collects the event consumption apparatus of a SAX pipeline stage.
+ * Consumers which permit some handlers or other characteristics to be
+ * configured will provide methods to support that configuration.
+ *
+ * <p> Two important categories of consumers include <em>filters</em>, which
+ * process events and pass them on to other consumers, and <em>terminus</em>
+ * (or <em>terminal</em>) stages, which don't pass events on. Filters are not
+ * necessarily derived from the {@link EventFilter} class, although that
+ * class can substantially simplify their construction by automating the
+ * most common activities.
+ *
+ * <p> Event consumers which follow certain conventions for the signatures
+ * of their constructors can be automatically assembled into pipelines
+ * by the {@link PipelineFactory} class.
+ *
+ * @author David Brownell
+ * @version $Date: 2003-02-01 02:10:18 $
+ */
+public interface EventConsumer
+{
+ /** Most stages process these core SAX callbacks. */
+ public ContentHandler getContentHandler ();
+
+ /** Few stages will use unparsed entities. */
+ public DTDHandler getDTDHandler ();
+
+ /**
+ * This method works like the SAX2 XMLReader method of the same name,
+ * and is used to retrieve the optional lexical and declaration handlers
+ * in a pipeline.
+ *
+ * @param id This is a URI identifying the type of property desired.
+ * @return The value of that property, if it is defined.
+ *
+ * @exception SAXNotRecognizedException Thrown if the particular
+ * pipeline stage does not understand the specified identifier.
+ */
+ public Object getProperty (String id)
+ throws SAXNotRecognizedException;
+
+ /**
+ * This method provides a filter stage with a handler that abstracts
+ * presentation of warnings and both recoverable and fatal errors.
+ * Most pipeline stages should share a single policy and mechanism
+ * for such reports, since application components require consistency
+ * in such activities. Accordingly, typical responses to this method
+ * invocation involve saving the handler for use; filters will pass
+ * it on to any other consumers they use.
+ *
+ * @param handler encapsulates error handling policy for this stage
+ */
+ public void setErrorHandler (ErrorHandler handler);
+}
diff --git a/external/jaxp/source/gnu/xml/pipeline/EventFilter.java b/external/jaxp/source/gnu/xml/pipeline/EventFilter.java
new file mode 100755
index 000000000..bee10d5e7
--- /dev/null
+++ b/external/jaxp/source/gnu/xml/pipeline/EventFilter.java
@@ -0,0 +1,788 @@
+/*
+ * $Id: EventFilter.java,v 1.1 2003-02-01 02:10:19 cbj Exp $
+ * Copyright (C) 1999-2001 David Brownell
+ *
+ * This file is part of GNU JAXP, a library.
+ *
+ * GNU JAXP is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * GNU JAXP is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ * As a special exception, if you link this library with other files to
+ * produce an executable, this library does not by itself cause the
+ * resulting executable to be covered by the GNU General Public License.
+ * This exception does not however invalidate any other reasons why the
+ * executable file might be covered by the GNU General Public License.
+ */
+
+package gnu.xml.pipeline;
+
+import java.lang.reflect.InvocationTargetException;
+import java.lang.reflect.Method;
+
+import org.xml.sax.*;
+import org.xml.sax.ext.*;
+import org.xml.sax.helpers.XMLFilterImpl;
+
+
+/**
+ * A customizable event consumer, used to assemble various kinds of filters
+ * using SAX handlers and an optional second consumer. It can be constructed
+ * in two ways: <ul>
+ *
+ * <li> To serve as a passthrough, sending all events to a second consumer.
+ * The second consumer may be identified through {@link #getNext}.
+ *
+ * <li> To serve as a dead end, with all handlers null;
+ * {@link #getNext} returns null.
+ *
+ * </ul>
+ *
+ * <p> Additionally, SAX handlers may be assigned, which completely replace
+ * the "upstream" view (through {@link EventConsumer}) of handlers, initially
+ * null or the "next" consumer provided to the constructor. To make
+ * it easier to build specialized filter classes, this class implements
+ * all the standard SAX consumer handlers, and those implementations
+ * delegate "downstream" to the consumer accessed by {@link #getNext}.
+ *
+ * <p> The simplest way to create a custom a filter class is to create a
+ * subclass which overrides one or more handler interface methods. The
+ * constructor for that subclass then registers itself as a handler for
+ * those interfaces using a call such as <em>setContentHandler(this)</em>,
+ * so the "upstream" view of event delivery is modified from the state
+ * established in the base class constructor. That way,
+ * the overridden methods intercept those event callbacks
+ * as they go "downstream", and
+ * all other event callbacks will pass events to any next consumer.
+ * Overridden methods may invoke superclass methods (perhaps after modifying
+ * parameters) if they wish to delegate such calls. Such subclasses
+ * should use {@link #getErrorHandler} to report errors using the
+ * common error reporting mechanism.
+ *
+ * <p> Another important technique is to construct a filter consisting
+ * of only a few specific types of handler. For example, one could easily
+ * prune out lexical events or various declarations by providing handlers
+ * which don't pass those events downstream, or by providing null handlers.
+ *
+ * <hr />
+ *
+ * <p> This may be viewed as the consumer oriented analogue of the SAX2
+ * {@link org.xml.sax.helpers.XMLFilterImpl XMLFilterImpl} class.
+ * Key differences include: <ul>
+ *
+ * <li> This fully separates consumer and producer roles: it
+ * does not implement the producer side <em>XMLReader</em> or
+ * <em>EntityResolver</em> interfaces, so it can only be used
+ * in "push" mode (it has no <em>parse()</em> methods).
+ *
+ * <li> "Extension" handlers are fully supported, enabling a
+ * richer set of application requirements.
+ * And it implements {@link EventConsumer}, which groups related
+ * consumer methods together, rather than leaving them separated.
+ *
+ * <li> The chaining which is visible is "downstream" to the next
+ * consumer, not "upstream" to the preceding producer.
+ * It supports "fan-in", where
+ * a consumer can be fed by several producers. (For "fan-out",
+ * see the {@link TeeConsumer} class.)
+ *
+ * <li> Event chaining is set up differently. It is intended to
+ * work "upstream" from terminus towards producer, during filter
+ * construction, as described above.
+ * This is part of an early binding model:
+ * events don't need to pass through stages which ignore them.
+ *
+ * <li> ErrorHandler support is separated, on the grounds that
+ * pipeline stages need to share the same error handling policy.
+ * For the same reason, error handler setup goes "downstream":
+ * when error handlers get set, they are passed to subsequent
+ * consumers.
+ *
+ * </ul>
+ *
+ * <p> The {@link #chainTo chainTo()} convenience routine supports chaining to
+ * an XMLFilterImpl, in its role as a limited functionality event
+ * consumer. Its event producer role ({@link XMLFilter}) is ignored.
+ *
+ * <hr />
+ *
+ * <p> The {@link #bind bind()} routine may be used associate event pipelines
+ * with any kind of {@link XMLReader} that will produce the events.
+ * Such pipelines don't necessarily need to have any members which are
+ * implemented using this class. That routine has some intelligence
+ * which supports automatic changes to parser feature flags, letting
+ * event piplines become largely independent of the particular feature
+ * sets of parsers.
+ *
+ * @author David Brownell
+ * @version $Date: 2003-02-01 02:10:19 $
+ */
+public class EventFilter
+ implements EventConsumer, ContentHandler, DTDHandler,
+ LexicalHandler, DeclHandler
+{
+ // SAX handlers
+ private ContentHandler docHandler, docNext;
+ private DTDHandler dtdHandler, dtdNext;
+ private LexicalHandler lexHandler, lexNext;
+ private DeclHandler declHandler, declNext;
+ // and ideally, one more for the stuff SAX2 doesn't show
+
+ private Locator locator;
+ private EventConsumer next;
+ private ErrorHandler errHandler;
+
+
+ /** SAX2 URI prefix for standard feature flags. */
+ public static final String FEATURE_URI
+ = "http://xml.org/sax/features/";
+ /** SAX2 URI prefix for standard properties (mostly for handlers). */
+ public static final String PROPERTY_URI
+ = "http://xml.org/sax/properties/";
+
+ /** SAX2 property identifier for {@link DeclHandler} events */
+ public static final String DECL_HANDLER
+ = PROPERTY_URI + "declaration-handler";
+ /** SAX2 property identifier for {@link LexicalHandler} events */
+ public static final String LEXICAL_HANDLER
+ = PROPERTY_URI + "lexical-handler";
+
+ //
+ // These class objects will be null if the relevant class isn't linked.
+ // Small configurations (pJava and some kinds of embedded systems) need
+ // to facilitate smaller executables. So "instanceof" is undesirable
+ // when bind() sees if it can remove some stages.
+ //
+ // SECURITY NOTE: assuming all these classes are part of the same sealed
+ // package, there's no problem saving these in the instance of this class
+ // that's associated with "this" class loader. But that wouldn't be true
+ // for classes in another package.
+ //
+ private static boolean loaded;
+ private static Class nsClass;
+ private static Class validClass;
+ private static Class wfClass;
+ private static Class xincClass;
+
+ static ClassLoader getClassLoader ()
+ {
+ Method m = null;
+
+ try {
+ m = Thread.class.getMethod("getContextClassLoader", null);
+ } catch (NoSuchMethodException e) {
+ // Assume that we are running JDK 1.1, use the current ClassLoader
+ return EventFilter.class.getClassLoader();
+ }
+
+ try {
+ return (ClassLoader) m.invoke(Thread.currentThread(), null);
+ } catch (IllegalAccessException e) {
+ // assert(false)
+ throw new UnknownError(e.getMessage());
+ } catch (InvocationTargetException e) {
+ // assert(e.getTargetException() instanceof SecurityException)
+ throw new UnknownError(e.getMessage());
+ }
+ }
+
+ static Class loadClass (ClassLoader classLoader, String className)
+ {
+ try {
+ if (classLoader == null)
+ return Class.forName(className);
+ else
+ return classLoader.loadClass(className);
+ } catch (Exception e) {
+ return null;
+ }
+ }
+
+ static private void loadClasses ()
+ {
+ ClassLoader loader = getClassLoader ();
+
+ nsClass = loadClass (loader, "gnu.xml.pipeline.NSFilter");
+ validClass = loadClass (loader, "gnu.xml.pipeline.ValidationConsumer");
+ wfClass = loadClass (loader, "gnu.xml.pipeline.WellFormednessFilter");
+ xincClass = loadClass (loader, "gnu.xml.pipeline.XIncludeFilter");
+ loaded = true;
+ }
+
+
+ /**
+ * Binds the standard SAX2 handlers from the specified consumer
+ * pipeline to the specified producer. These handlers include the core
+ * {@link ContentHandler} and {@link DTDHandler}, plus the extension
+ * {@link DeclHandler} and {@link LexicalHandler}. Any additional
+ * application-specific handlers need to be bound separately.
+ * The {@link ErrorHandler} is handled differently: the producer's
+ * error handler is passed through to the consumer pipeline.
+ * The producer is told to include namespace prefix information if it
+ * can, since many pipeline stages need that Infoset information to
+ * work well.
+ *
+ * <p> At the head of the pipeline, certain standard event filters are
+ * recognized and handled specially. This facilitates construction
+ * of processing pipelines that work regardless of the capabilities
+ * of the XMLReader implementation in use; for example, it permits
+ * validating output of a {@link gnu.xml.util.DomParser}. <ul>
+ *
+ * <li> {@link NSFilter} will be removed if the producer can be
+ * told not to discard namespace data, using the "namespace-prefixes"
+ * feature flag.
+ *
+ * <li> {@link ValidationConsumer} will be removed if the producer
+ * can be told to validate, using the "validation" feature flag.
+ *
+ * <li> {@link WellFormednessFilter} is always removed, on the
+ * grounds that no XMLReader is permitted to producee malformed
+ * event streams and this would just be processing overhead.
+ *
+ * <li> {@link XIncludeFilter} stops the special handling, except
+ * that it's told about the "namespace-prefixes" feature of the
+ * event producer so that the event stream is internally consistent.
+ *
+ * <li> The first consumer which is not one of those classes stops
+ * such special handling. This means that if you want to force
+ * one of those filters to be used, you could just precede it with
+ * an instance of {@link EventFilter} configured as a pass-through.
+ * You might need to do that if you are using an {@link NSFilter}
+ * subclass to fix names found in attributes or character data.
+ *
+ * </ul>
+ *
+ * <p> Other than that, this method works with any kind of event consumer,
+ * not just event filters. Note that in all cases, the standard handlers
+ * are assigned; any previous handler assignments for the handler will
+ * be overridden.
+ *
+ * @param producer will deliver events to the specified consumer
+ * @param consumer pipeline supplying event handlers to be associated
+ * with the producer (may not be null)
+ */
+ public static void bind (XMLReader producer, EventConsumer consumer)
+ {
+ Class klass = null;
+ boolean prefixes;
+
+ if (!loaded)
+ loadClasses ();
+
+ // DOM building, printing, layered validation, and other
+ // things don't work well when prefix info is discarded.
+ // Include it by default, whenever possible.
+ try {
+ producer.setFeature (FEATURE_URI + "namespace-prefixes",
+ true);
+ prefixes = true;
+ } catch (SAXException e) {
+ prefixes = false;
+ }
+
+ // NOTE: This loop doesn't use "instanceof", since that
+ // would prevent compiling/linking without those classes
+ // being present.
+ while (consumer != null) {
+ klass = consumer.getClass ();
+
+ // we might have already changed this problematic SAX2 default.
+ if (nsClass != null && nsClass.isAssignableFrom (klass)) {
+ if (!prefixes)
+ break;
+ consumer = ((EventFilter)consumer).getNext ();
+
+ // the parser _might_ do DTD validation by default ...
+ // if not, maybe we can change this setting.
+ } else if (validClass != null
+ && validClass.isAssignableFrom (klass)) {
+ try {
+ producer.setFeature (FEATURE_URI + "validation",
+ true);
+ consumer = ((ValidationConsumer)consumer).getNext ();
+ } catch (SAXException e) {
+ break;
+ }
+
+ // parsers are required not to have such bugs
+ } else if (wfClass != null && wfClass.isAssignableFrom (klass)) {
+ consumer = ((WellFormednessFilter)consumer).getNext ();
+
+ // stop on the first pipeline stage we can't remove
+ } else
+ break;
+
+ if (consumer == null)
+ klass = null;
+ }
+
+ // the actual setting here doesn't matter as much
+ // as that producer and consumer agree
+ if (xincClass != null && klass != null
+ && xincClass.isAssignableFrom (klass))
+ ((XIncludeFilter)consumer).setSavingPrefixes (prefixes);
+
+ // Some SAX parsers can't handle null handlers -- bleech
+ DefaultHandler2 h = new DefaultHandler2 ();
+
+ if (consumer != null && consumer.getContentHandler () != null)
+ producer.setContentHandler (consumer.getContentHandler ());
+ else
+ producer.setContentHandler (h);
+ if (consumer != null && consumer.getDTDHandler () != null)
+ producer.setDTDHandler (consumer.getDTDHandler ());
+ else
+ producer.setDTDHandler (h);
+
+ try {
+ Object dh;
+
+ if (consumer != null)
+ dh = consumer.getProperty (DECL_HANDLER);
+ else
+ dh = null;
+ if (dh == null)
+ dh = h;
+ producer.setProperty (DECL_HANDLER, dh);
+ } catch (Exception e) { /* ignore */ }
+ try {
+ Object lh;
+
+ if (consumer != null)
+ lh = consumer.getProperty (LEXICAL_HANDLER);
+ else
+ lh = null;
+ if (lh == null)
+ lh = h;
+ producer.setProperty (LEXICAL_HANDLER, lh);
+ } catch (Exception e) { /* ignore */ }
+
+ // this binding goes the other way around
+ if (producer.getErrorHandler () == null)
+ producer.setErrorHandler (h);
+ if (consumer != null)
+ consumer.setErrorHandler (producer.getErrorHandler ());
+ }
+
+ /**
+ * Initializes all handlers to null.
+ */
+ // constructor used by PipelineFactory
+ public EventFilter () { }
+
+
+ /**
+ * Handlers that are not otherwise set will default to those from
+ * the specified consumer, making it easy to pass events through.
+ * If the consumer is null, all handlers are initialzed to null.
+ */
+ // constructor used by PipelineFactory
+ public EventFilter (EventConsumer consumer)
+ {
+ if (consumer == null)
+ return;
+
+ next = consumer;
+
+ // We delegate through the "xxNext" handlers, and
+ // report the "xxHandler" ones on our input side.
+
+ // Normally a subclass would both override handler
+ // methods and register itself as the "xxHandler".
+
+ docHandler = docNext = consumer.getContentHandler ();
+ dtdHandler = dtdNext = consumer.getDTDHandler ();
+ try {
+ declHandler = declNext = (DeclHandler)
+ consumer.getProperty (DECL_HANDLER);
+ } catch (SAXException e) { /* leave value null */ }
+ try {
+ lexHandler = lexNext = (LexicalHandler)
+ consumer.getProperty (LEXICAL_HANDLER);
+ } catch (SAXException e) { /* leave value null */ }
+ }
+
+ /**
+ * Treats the XMLFilterImpl as a limited functionality event consumer,
+ * by arranging to deliver events to it; this lets such classes be
+ * "wrapped" as pipeline stages.
+ *
+ * <p> <em>Upstream Event Setup:</em>
+ * If no handlers have been assigned to this EventFilter, then the
+ * handlers from specified XMLFilterImpl are returned from this
+ * {@link EventConsumer}: the XMLFilterImpl is just "wrapped".
+ * Otherwise the specified handlers will be returned.
+ *
+ * <p> <em>Downstream Event Setup:</em>
+ * Subclasses may chain event delivery to the specified XMLFilterImpl
+ * by invoking the appropiate superclass methods,
+ * as if their constructor passed a "next" EventConsumer to the
+ * constructor for this class.
+ * If this EventFilter has an ErrorHandler, it is assigned as
+ * the error handler for the XMLFilterImpl, just as would be
+ * done for a next stage implementing {@link EventConsumer}.
+ *
+ * @param next the next downstream component of the pipeline.
+ * @exception IllegalStateException if the "next" consumer has
+ * already been set through the constructor.
+ */
+ public void chainTo (XMLFilterImpl next)
+ {
+ if (this.next != null)
+ throw new IllegalStateException ();
+
+ docNext = next.getContentHandler ();
+ if (docHandler == null)
+ docHandler = docNext;
+ dtdNext = next.getDTDHandler ();
+ if (dtdHandler == null)
+ dtdHandler = dtdNext;
+
+ try {
+ declNext = (DeclHandler) next.getProperty (DECL_HANDLER);
+ if (declHandler == null)
+ declHandler = declNext;
+ } catch (SAXException e) { /* leave value null */ }
+ try {
+ lexNext = (LexicalHandler) next.getProperty (LEXICAL_HANDLER);
+ if (lexHandler == null)
+ lexHandler = lexNext;
+ } catch (SAXException e) { /* leave value null */ }
+
+ if (errHandler != null)
+ next.setErrorHandler (errHandler);
+ }
+
+ /**
+ * Records the error handler that should be used by this stage, and
+ * passes it "downstream" to any subsequent stage.
+ */
+ final public void setErrorHandler (ErrorHandler handler)
+ {
+ errHandler = handler;
+ if (next != null)
+ next.setErrorHandler (handler);
+ }
+
+ /**
+ * Returns the error handler assigned this filter stage, or null
+ * if no such assigment has been made.
+ */
+ final public ErrorHandler getErrorHandler ()
+ {
+ return errHandler;
+ }
+
+
+ /**
+ * Returns the next event consumer in sequence; or null if there
+ * is no such handler.
+ */
+ final public EventConsumer getNext ()
+ { return next; }
+
+
+ /**
+ * Assigns the content handler to use; a null handler indicates
+ * that these events will not be forwarded.
+ * This overrides the previous settting for this handler, which was
+ * probably pointed to the next consumer by the base class constructor.
+ */
+ final public void setContentHandler (ContentHandler h)
+ {
+ docHandler = h;
+ }
+
+ /** Returns the content handler being used. */
+ final public ContentHandler getContentHandler ()
+ {
+ return docHandler;
+ }
+
+ /**
+ * Assigns the DTD handler to use; a null handler indicates
+ * that these events will not be forwarded.
+ * This overrides the previous settting for this handler, which was
+ * probably pointed to the next consumer by the base class constructor.
+ */
+ final public void setDTDHandler (DTDHandler h)
+ { dtdHandler = h; }
+
+ /** Returns the dtd handler being used. */
+ final public DTDHandler getDTDHandler ()
+ {
+ return dtdHandler;
+ }
+
+ /**
+ * Stores the property, normally a handler; a null handler indicates
+ * that these events will not be forwarded.
+ * This overrides the previous handler settting, which was probably
+ * pointed to the next consumer by the base class constructor.
+ */
+ final public void setProperty (String id, Object o)
+ throws SAXNotRecognizedException, SAXNotSupportedException
+ {
+ try {
+ Object value = getProperty (id);
+
+ if (value == o)
+ return;
+ if (DECL_HANDLER.equals (id)) {
+ declHandler = (DeclHandler) o;
+ return;
+ }
+ if (LEXICAL_HANDLER.equals (id)) {
+ lexHandler = (LexicalHandler) o;
+ return;
+ }
+ throw new SAXNotSupportedException (id);
+
+ } catch (ClassCastException e) {
+ throw new SAXNotSupportedException (id);
+ }
+ }
+
+ /** Retrieves a property of unknown intent (usually a handler) */
+ final public Object getProperty (String id)
+ throws SAXNotRecognizedException
+ {
+ if (DECL_HANDLER.equals (id))
+ return declHandler;
+ if (LEXICAL_HANDLER.equals (id))
+ return lexHandler;
+
+ throw new SAXNotRecognizedException (id);
+ }
+
+ /**
+ * Returns any locator provided to the next consumer, if this class
+ * (or a subclass) is handling {@link ContentHandler } events.
+ */
+ public Locator getDocumentLocator ()
+ { return locator; }
+
+
+ // CONTENT HANDLER DELEGATIONS
+
+ /** <b>SAX2:</b> passes this callback to the next consumer, if any */
+ public void setDocumentLocator (Locator locator)
+ {
+ this.locator = locator;
+ if (docNext != null)
+ docNext.setDocumentLocator (locator);
+ }
+
+ /** <b>SAX2:</b> passes this callback to the next consumer, if any */
+ public void startDocument () throws SAXException
+ {
+ if (docNext != null)
+ docNext.startDocument ();
+ }
+
+ /** <b>SAX2:</b> passes this callback to the next consumer, if any */
+ public void skippedEntity (String name) throws SAXException
+ {
+ if (docNext != null)
+ docNext.skippedEntity (name);
+ }
+
+ /** <b>SAX2:</b> passes this callback to the next consumer, if any */
+ public void processingInstruction (String target, String data)
+ throws SAXException
+ {
+ if (docNext != null)
+ docNext.processingInstruction (target, data);
+ }
+
+ /** <b>SAX2:</b> passes this callback to the next consumer, if any */
+ public void characters (char ch [], int start, int length)
+ throws SAXException
+ {
+ if (docNext != null)
+ docNext.characters (ch, start, length);
+ }
+
+ /** <b>SAX2:</b> passes this callback to the next consumer, if any */
+ public void ignorableWhitespace (char ch [], int start, int length)
+ throws SAXException
+ {
+ if (docNext != null)
+ docNext.ignorableWhitespace (ch, start, length);
+ }
+
+ /** <b>SAX2:</b> passes this callback to the next consumer, if any */
+ public void startPrefixMapping (String prefix, String uri)
+ throws SAXException
+ {
+ if (docNext != null)
+ docNext.startPrefixMapping (prefix, uri);
+ }
+
+ /** <b>SAX2:</b> passes this callback to the next consumer, if any */
+ public void startElement (
+ String uri, String localName,
+ String qName, Attributes atts
+ ) throws SAXException
+ {
+ if (docNext != null)
+ docNext.startElement (uri, localName, qName, atts);
+ }
+
+ /** <b>SAX2:</b> passes this callback to the next consumer, if any */
+ public void endElement (String uri, String localName, String qName)
+ throws SAXException
+ {
+ if (docNext != null)
+ docNext.endElement (uri, localName, qName);
+ }
+
+ /** <b>SAX2:</b> passes this callback to the next consumer, if any */
+ public void endPrefixMapping (String prefix) throws SAXException
+ {
+ if (docNext != null)
+ docNext.endPrefixMapping (prefix);
+ }
+
+ /** <b>SAX2:</b> passes this callback to the next consumer, if any */
+ public void endDocument () throws SAXException
+ {
+ if (docNext != null)
+ docNext.endDocument ();
+ locator = null;
+ }
+
+
+ // DTD HANDLER DELEGATIONS
+
+ /** <b>SAX1:</b> passes this callback to the next consumer, if any */
+ public void unparsedEntityDecl (
+ String name,
+ String publicId,
+ String systemId,
+ String notationName
+ ) throws SAXException
+ {
+ if (dtdNext != null)
+ dtdNext.unparsedEntityDecl (name, publicId, systemId, notationName);
+ }
+
+ /** <b>SAX1:</b> passes this callback to the next consumer, if any */
+ public void notationDecl (String name, String publicId, String systemId)
+ throws SAXException
+ {
+ if (dtdNext != null)
+ dtdNext.notationDecl (name, publicId, systemId);
+ }
+
+
+ // LEXICAL HANDLER DELEGATIONS
+
+ /** <b>SAX2:</b> passes this callback to the next consumer, if any */
+ public void startDTD (String name, String publicId, String systemId)
+ throws SAXException
+ {
+ if (lexNext != null)
+ lexNext.startDTD (name, publicId, systemId);
+ }
+
+ /** <b>SAX2:</b> passes this callback to the next consumer, if any */
+ public void endDTD ()
+ throws SAXException
+ {
+ if (lexNext != null)
+ lexNext.endDTD ();
+ }
+
+ /** <b>SAX2:</b> passes this callback to the next consumer, if any */
+ public void comment (char ch [], int start, int length)
+ throws SAXException
+ {
+ if (lexNext != null)
+ lexNext.comment (ch, start, length);
+ }
+
+ /** <b>SAX2:</b> passes this callback to the next consumer, if any */
+ public void startCDATA ()
+ throws SAXException
+ {
+ if (lexNext != null)
+ lexNext.startCDATA ();
+ }
+
+ /** <b>SAX2:</b> passes this callback to the next consumer, if any */
+ public void endCDATA ()
+ throws SAXException
+ {
+ if (lexNext != null)
+ lexNext.endCDATA ();
+ }
+
+ /**
+ * <b>SAX2:</b> passes this callback to the next consumer, if any.
+ */
+ public void startEntity (String name)
+ throws SAXException
+ {
+ if (lexNext != null)
+ lexNext.startEntity (name);
+ }
+
+ /**
+ * <b>SAX2:</b> passes this callback to the next consumer, if any.
+ */
+ public void endEntity (String name)
+ throws SAXException
+ {
+ if (lexNext != null)
+ lexNext.endEntity (name);
+ }
+
+
+ // DECLARATION HANDLER DELEGATIONS
+
+
+ /** <b>SAX2:</b> passes this callback to the next consumer, if any */
+ public void elementDecl (String name, String model)
+ throws SAXException
+ {
+ if (declNext != null)
+ declNext.elementDecl (name, model);
+ }
+
+ /** <b>SAX2:</b> passes this callback to the next consumer, if any */
+ public void attributeDecl (String eName, String aName,
+ String type, String mode, String value)
+ throws SAXException
+ {
+ if (declNext != null)
+ declNext.attributeDecl (eName, aName, type, mode, value);
+ }
+
+ /** <b>SAX2:</b> passes this callback to the next consumer, if any */
+ public void externalEntityDecl (String name,
+ String publicId, String systemId)
+ throws SAXException
+ {
+ if (declNext != null)
+ declNext.externalEntityDecl (name, publicId, systemId);
+ }
+
+ /** <b>SAX2:</b> passes this callback to the next consumer, if any */
+ public void internalEntityDecl (String name, String value)
+ throws SAXException
+ {
+ if (declNext != null)
+ declNext.internalEntityDecl (name, value);
+ }
+}
diff --git a/external/jaxp/source/gnu/xml/pipeline/LinkFilter.java b/external/jaxp/source/gnu/xml/pipeline/LinkFilter.java
new file mode 100644
index 000000000..b93a27797
--- /dev/null
+++ b/external/jaxp/source/gnu/xml/pipeline/LinkFilter.java
@@ -0,0 +1,236 @@
+/*
+ * $Id: LinkFilter.java,v 1.1 2003-02-01 02:10:19 cbj Exp $
+ * Copyright (C) 1999-2001 David Brownell
+ *
+ * This file is part of GNU JAXP, a library.
+ *
+ * GNU JAXP is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * GNU JAXP is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ * As a special exception, if you link this library with other files to
+ * produce an executable, this library does not by itself cause the
+ * resulting executable to be covered by the GNU General Public License.
+ * This exception does not however invalidate any other reasons why the
+ * executable file might be covered by the GNU General Public License.
+ */
+
+package gnu.xml.pipeline;
+
+import java.io.IOException;
+import java.net.URL;
+import java.util.Enumeration;
+import java.util.Vector;
+
+import org.xml.sax.Attributes;
+import org.xml.sax.Locator;
+import org.xml.sax.SAXException;
+
+
+// $Id: LinkFilter.java,v 1.1 2003-02-01 02:10:19 cbj Exp $
+
+/**
+ * Pipeline filter to remember XHTML links found in a document,
+ * so they can later be crawled. Fragments are not counted, and duplicates
+ * are ignored. Callers are responsible for filtering out URLs they aren't
+ * interested in. Events are passed through unmodified.
+ *
+ * <p> Input MUST include a setDocumentLocator() call, as it's used to
+ * resolve relative links in the absence of a "base" element. Input MUST
+ * also include namespace identifiers, since it is the XHTML namespace
+ * identifier which is used to identify the relevant elements.
+ *
+ * <p><em>FIXME:</em> handle xml:base attribute ... in association with
+ * a stack of base URIs. Similarly, recognize/support XLink data.
+ *
+ * @author David Brownell
+ * @version $Date: 2003-02-01 02:10:19 $
+ */
+public class LinkFilter extends EventFilter
+{
+ // for storing URIs
+ private Vector vector = new Vector ();
+
+ // struct for "full" link record (tbd)
+ // these for troubleshooting original source:
+ // original uri
+ // uri as resolved (base, relative, etc)
+ // URI of originating doc
+ // line #
+ // original element + attrs (img src, desc, etc)
+
+ // XLink model of the link ... for inter-site pairups ?
+
+ private String baseURI;
+
+ private boolean siteRestricted = false;
+
+ //
+ // XXX leverage blacklist info (like robots.txt)
+ //
+ // XXX constructor w/param ... pipeline for sending link data
+ // probably XHTML --> XLink, providing info as sketched above
+ //
+
+
+ /**
+ * Constructs a new event filter, which collects links in private data
+ * structure for later enumeration.
+ */
+ // constructor used by PipelineFactory
+ public LinkFilter ()
+ {
+ super.setContentHandler (this);
+ }
+
+
+ /**
+ * Constructs a new event filter, which collects links in private data
+ * structure for later enumeration and passes all events, unmodified,
+ * to the next consumer.
+ */
+ // constructor used by PipelineFactory
+ public LinkFilter (EventConsumer next)
+ {
+ super (next);
+ super.setContentHandler (this);
+ }
+
+
+ /**
+ * Returns an enumeration of the links found since the filter
+ * was constructed, or since removeAllLinks() was called.
+ *
+ * @return enumeration of strings.
+ */
+ public Enumeration getLinks ()
+ {
+ return vector.elements ();
+ }
+
+ /**
+ * Removes records about all links reported to the event
+ * stream, as if the filter were newly created.
+ */
+ public void removeAllLinks ()
+ {
+ vector = new Vector ();
+ }
+
+
+ /**
+ * Collects URIs for (X)HTML content from elements which hold them.
+ */
+ public void startElement (
+ String uri,
+ String localName,
+ String qName,
+ Attributes atts
+ ) throws SAXException
+ {
+ String link;
+
+ // Recognize XHTML links.
+ if ("http://www.w3.org/1999/xhtml".equals (uri)) {
+
+ if ("a".equals (localName) || "base".equals (localName)
+ || "area".equals (localName))
+ link = atts.getValue ("href");
+ else if ("iframe".equals (localName) || "frame".equals (localName))
+ link = atts.getValue ("src");
+ else if ("blockquote".equals (localName) || "q".equals (localName)
+ || "ins".equals (localName) || "del".equals (localName))
+ link = atts.getValue ("cite");
+ else
+ link = null;
+ link = maybeAddLink (link);
+
+ // "base" modifies designated baseURI
+ if ("base".equals (localName) && link != null)
+ baseURI = link;
+
+ if ("iframe".equals (localName) || "img".equals (localName))
+ maybeAddLink (atts.getValue ("longdesc"));
+ }
+
+ super.startElement (uri, localName, qName, atts);
+ }
+
+ private String maybeAddLink (String link)
+ {
+ int index;
+
+ // ignore empty links and fragments inside docs
+ if (link == null)
+ return null;
+ if ((index = link.indexOf ("#")) >= 0)
+ link = link.substring (0, index);
+ if (link.equals (""))
+ return null;
+
+ try {
+ // get the real URI
+ URL base = new URL ((baseURI != null)
+ ? baseURI
+ : getDocumentLocator ().getSystemId ());
+ URL url = new URL (base, link);
+
+ link = url.toString ();
+
+ // ignore duplicates
+ if (vector.contains (link))
+ return link;
+
+ // other than what "base" does, stick to original site:
+ if (siteRestricted) {
+ // don't switch protocols
+ if (!base.getProtocol ().equals (url.getProtocol ()))
+ return link;
+ // don't switch servers
+ if (base.getHost () != null
+ && !base.getHost ().equals (url.getHost ()))
+ return link;
+ }
+
+ vector.addElement (link);
+
+ return link;
+
+ } catch (IOException e) {
+ // bad URLs we don't want
+ }
+ return null;
+ }
+
+ /**
+ * Reports an error if no Locator has been made available.
+ */
+ public void startDocument ()
+ throws SAXException
+ {
+ if (getDocumentLocator () == null)
+ throw new SAXException ("no Locator!");
+ }
+
+ /**
+ * Forgets about any base URI information that may be recorded.
+ * Applications will often want to call removeAllLinks(), likely
+ * after examining the links which were reported.
+ */
+ public void endDocument ()
+ throws SAXException
+ {
+ baseURI = null;
+ super.endDocument ();
+ }
+}
diff --git a/external/jaxp/source/gnu/xml/pipeline/NSFilter.java b/external/jaxp/source/gnu/xml/pipeline/NSFilter.java
new file mode 100644
index 000000000..0ec3b1ed9
--- /dev/null
+++ b/external/jaxp/source/gnu/xml/pipeline/NSFilter.java
@@ -0,0 +1,331 @@
+/*
+ * $Id: NSFilter.java,v 1.1 2003-02-01 02:10:19 cbj Exp $
+ * Copyright (C) 1999-2001 David Brownell
+ *
+ * This file is part of GNU JAXP, a library.
+ *
+ * GNU JAXP is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * GNU JAXP is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ * As a special exception, if you link this library with other files to
+ * produce an executable, this library does not by itself cause the
+ * resulting executable to be covered by the GNU General Public License.
+ * This exception does not however invalidate any other reasons why the
+ * executable file might be covered by the GNU General Public License.
+ */
+
+package gnu.xml.pipeline;
+
+import java.util.EmptyStackException;
+import java.util.Enumeration;
+import java.util.Stack;
+
+import org.xml.sax.*;
+import org.xml.sax.ext.*;
+import org.xml.sax.helpers.AttributesImpl;
+import org.xml.sax.helpers.NamespaceSupport;
+
+
+/**
+ * This filter ensures that element and attribute names are properly prefixed,
+ * and that such prefixes are declared. Such data is critical for operations
+ * like writing XML text, and validating against DTDs: names or their prefixes
+ * may have been discarded, although they are essential to the exchange of
+ * information using XML. There are various common ways that such data
+ * gets discarded: <ul>
+ *
+ * <li> By default, SAX2 parsers must discard the "xmlns*"
+ * attributes, and may also choose not to report properly prefixed
+ * names for elements or attributes. (Some parsers may support
+ * changing the <em>namespace-prefixes</em> value from the default
+ * to <em>true</em>, effectively eliminating the need to use this
+ * filter on their output.)
+ *
+ * <li> When event streams are generated from a DOM tree, they may
+ * have never have had prefixes or declarations for namespaces; or
+ * the existing prefixes or declarations may have been invalidated
+ * by structural modifications to that DOM tree.
+ *
+ * <li> Other software writing SAX event streams won't necessarily
+ * be worrying about prefix management, and so they will need to
+ * have a transparent solution for managing them.
+ *
+ * </ul>
+ *
+ * <p> This filter uses a heuristic to choose the prefix to assign to any
+ * particular name which wasn't already corectly prefixed. The associated
+ * namespace will be correct, and the prefix will be declared. Original
+ * structures facilitating text editing, such as conventions about use of
+ * mnemonic prefix names or the scoping of prefixes, can't always be
+ * reconstructed after they are discarded, as strongly encouraged by the
+ * current SAX2 defaults.
+ *
+ * <p> Note that this can't possibly know whether values inside attribute
+ * value or document content involve prefixed names. If your application
+ * requires using prefixed names in such locations you'll need to add some
+ * appropriate logic (perhaps adding additional heuristics in a subclass).
+ *
+ * @author David Brownell
+ * @version $Date: 2003-02-01 02:10:19 $
+ */
+public class NSFilter extends EventFilter
+{
+ private NamespaceSupport nsStack = new NamespaceSupport ();
+ private Stack elementStack = new Stack ();
+
+ private boolean pushedContext;
+ private String nsTemp [] = new String [3];
+ private AttributesImpl attributes = new AttributesImpl ();
+ private boolean usedDefault;
+
+ // gensymmed prefixes use this root name
+ private static final String prefixRoot = "prefix-";
+
+
+ /**
+ * Passes events through to the specified consumer, after first
+ * processing them.
+ *
+ * @param next the next event consumer to receive events.
+ */
+ // constructor used by PipelineFactory
+ public NSFilter (EventConsumer next)
+ {
+ super (next);
+
+ setContentHandler (this);
+ }
+
+ private void fatalError (String message)
+ throws SAXException
+ {
+ SAXParseException e;
+ ErrorHandler handler = getErrorHandler ();
+ Locator locator = getDocumentLocator ();
+
+ if (locator == null)
+ e = new SAXParseException (message, null, null, -1, -1);
+ else
+ e = new SAXParseException (message, locator);
+ if (handler != null)
+ handler.fatalError (e);
+ throw e;
+ }
+
+
+ public void startDocument () throws SAXException
+ {
+ elementStack.removeAllElements ();
+ nsStack.reset ();
+ pushedContext = false;
+ super.startDocument ();
+ }
+
+ /**
+ * This call is not passed to the next consumer in the chain.
+ * Prefix declarations and scopes are only exposed in the form
+ * of attributes; this callback just records a declaration that
+ * will be exposed as an attribute.
+ */
+ public void startPrefixMapping (String prefix, String uri)
+ throws SAXException
+ {
+ if (pushedContext == false) {
+ nsStack.pushContext ();
+ pushedContext = true;
+ }
+
+ // this check is awkward, but the paranoia prevents big trouble
+ for (Enumeration e = nsStack.getDeclaredPrefixes ();
+ e.hasMoreElements ();
+ /* NOP */ ) {
+ String declared = (String) e.nextElement ();
+
+ if (!declared.equals (prefix))
+ continue;
+ if (uri.equals (nsStack.getURI (prefix)))
+ return;
+ fatalError ("inconsistent binding for prefix '" + prefix
+ + "' ... " + uri + " (was " + nsStack.getURI (prefix) + ")");
+ }
+
+ if (!nsStack.declarePrefix (prefix, uri))
+ fatalError ("illegal prefix declared: " + prefix);
+ }
+
+ private String fixName (String ns, String l, String name, boolean isAttr)
+ throws SAXException
+ {
+ if ("".equals (name) || name == null) {
+ name = l;
+ if ("".equals (name) || name == null)
+ fatalError ("empty/null name");
+ }
+
+ // can we correctly process the name as-is?
+ // handles "element scope" attribute names here.
+ if (nsStack.processName (name, nsTemp, isAttr) != null
+ && nsTemp [0].equals (ns)
+ ) {
+ return nsTemp [2];
+ }
+
+ // nope, gotta modify the name or declare a default mapping
+ int temp;
+
+ // get rid of any current prefix
+ if ((temp = name.indexOf (':')) >= 0) {
+ name = name.substring (temp + 1);
+
+ // ... maybe that's enough (use/prefer default namespace) ...
+ if (!isAttr && nsStack.processName (name, nsTemp, false) != null
+ && nsTemp [0].equals (ns)
+ ) {
+ return nsTemp [2];
+ }
+ }
+
+ // must we define and use the default/undefined prefix?
+ if ("".equals (ns)) {
+ if (isAttr)
+ fatalError ("processName bug");
+ if (attributes.getIndex ("xmlns") != -1)
+ fatalError ("need to undefine default NS, but it's bound: "
+ + attributes.getValue ("xmlns"));
+
+ nsStack.declarePrefix ("", "");
+ attributes.addAttribute ("", "", "xmlns", "CDATA", "");
+ return name;
+ }
+
+ // is there at least one non-null prefix we can use?
+ for (Enumeration e = nsStack.getDeclaredPrefixes ();
+ e.hasMoreElements ();
+ /* NOP */) {
+ String prefix = (String) e.nextElement ();
+ String uri = nsStack.getURI (prefix);
+
+ if (uri == null || !uri.equals (ns))
+ continue;
+ return prefix + ":" + name;
+ }
+
+ // no such luck. create a prefix name, declare it, use it.
+ for (temp = 0; temp >= 0; temp++) {
+ String prefix = prefixRoot + temp;
+
+ if (nsStack.getURI (prefix) == null) {
+ nsStack.declarePrefix (prefix, ns);
+ attributes.addAttribute ("", "", "xmlns:" + prefix,
+ "CDATA", ns);
+ return prefix + ":" + name;
+ }
+ }
+ fatalError ("too many prefixes genned");
+ // NOTREACHED
+ return null;
+ }
+
+ public void startElement (
+ String uri, String localName,
+ String qName, Attributes atts
+ ) throws SAXException
+ {
+ if (!pushedContext)
+ nsStack.pushContext ();
+ pushedContext = false;
+
+ // make sure we have all NS declarations handy before we start
+ int length = atts.getLength ();
+
+ for (int i = 0; i < length; i++) {
+ String aName = atts.getQName (i);
+
+ if (!aName.startsWith ("xmlns"))
+ continue;
+
+ String prefix;
+
+ if ("xmlns".equals (aName))
+ prefix = "";
+ else if (aName.indexOf (':') == 5)
+ prefix = aName.substring (6);
+ else // "xmlnsfoo" etc.
+ continue;
+ startPrefixMapping (prefix, atts.getValue (i));
+ }
+
+ // put namespace decls at the start of our regenned attlist
+ attributes.clear ();
+ for (Enumeration e = nsStack.getDeclaredPrefixes ();
+ e.hasMoreElements ();
+ /* NOP */) {
+ String prefix = (String) e.nextElement ();
+
+ attributes.addAttribute ("", "",
+ ("".equals (prefix)
+ ? "xmlns"
+ : "xmlns:" + prefix),
+ "CDATA",
+ nsStack.getURI (prefix));
+ }
+
+ // name fixups: element, then attributes.
+ // fixName may declare a new prefix or, for the element,
+ // redeclare the default (if element name needs it).
+ qName = fixName (uri, localName, qName, false);
+
+ for (int i = 0; i < length; i++) {
+ String aName = atts.getQName (i);
+ String aNS = atts.getURI (i);
+ String aLocal = atts.getLocalName (i);
+ String aType = atts.getType (i);
+ String aValue = atts.getValue (i);
+
+ if (aName.startsWith ("xmlns"))
+ continue;
+ aName = fixName (aNS, aLocal, aName, true);
+ attributes.addAttribute (aNS, aLocal, aName, aType, aValue);
+ }
+
+ elementStack.push (qName);
+
+ // pass event along, with cleaned-up names and decls.
+ super.startElement (uri, localName, qName, attributes);
+ }
+
+ public void endElement (String uri, String localName, String qName)
+ throws SAXException
+ {
+ nsStack.popContext ();
+ qName = (String) elementStack.pop ();
+ super.endElement (uri, localName, qName);
+ }
+
+ /**
+ * This call is not passed to the next consumer in the chain.
+ * Prefix declarations and scopes are only exposed in their
+ * attribute form.
+ */
+ public void endPrefixMapping (String prefix)
+ throws SAXException
+ { }
+
+ public void endDocument () throws SAXException
+ {
+ elementStack.removeAllElements ();
+ nsStack.reset ();
+ super.endDocument ();
+ }
+}
diff --git a/external/jaxp/source/gnu/xml/pipeline/PipelineFactory.java b/external/jaxp/source/gnu/xml/pipeline/PipelineFactory.java
new file mode 100644
index 000000000..3cadb40cb
--- /dev/null
+++ b/external/jaxp/source/gnu/xml/pipeline/PipelineFactory.java
@@ -0,0 +1,716 @@
+/*
+ * $Id: PipelineFactory.java,v 1.1 2003-02-01 02:10:20 cbj Exp $
+ * Copyright (C) 1999-2001 David Brownell
+ *
+ * This file is part of GNU JAXP, a library.
+ *
+ * GNU JAXP is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * GNU JAXP is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ * As a special exception, if you link this library with other files to
+ * produce an executable, this library does not by itself cause the
+ * resulting executable to be covered by the GNU General Public License.
+ * This exception does not however invalidate any other reasons why the
+ * executable file might be covered by the GNU General Public License.
+ */
+
+package gnu.xml.pipeline;
+
+import java.io.File;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.OutputStream;
+import java.io.OutputStreamWriter;
+import java.lang.reflect.Constructor;
+import java.util.StringTokenizer;
+
+import org.xml.sax.*;
+import org.xml.sax.ext.*;
+
+
+// $Id: PipelineFactory.java,v 1.1 2003-02-01 02:10:20 cbj Exp $
+
+/**
+ * This provides static factory methods for creating simple event pipelines.
+ * These pipelines are specified by strings, suitable for passing on
+ * command lines or embedding in element attributes. For example, one way
+ * to write a pipeline that restores namespace syntax, validates (stopping
+ * the pipeline on validity errors) and then writes valid data to standard
+ * output is this: <pre>
+ * nsfix | validate | write ( stdout )</pre>
+ *
+ * <p> In this syntax, the tokens are always separated by whitespace, and each
+ * stage of the pipeline may optionally have a parameter (which can be a
+ * pipeline) in parentheses. Interior stages are called filters, and the
+ * rightmost end of a pipeline is called a terminus.
+ *
+ * <p> Stages are usually implemented by a single class, which may not be
+ * able to act as both a filter and a terminus; but any terminus can be
+ * automatically turned into a filter, through use of a {@link TeeConsumer}.
+ * The stage identifiers are either class names, or are one of the following
+ * short identifiers built into this class. (Most of these identifiers are
+ * no more than aliases for classes.) The built-in identifiers include:</p>
+
+ <table border="1" cellpadding="3" cellspacing="0">
+ <tr bgcolor="#ccccff" class="TableHeadingColor">
+ <th align="center" width="5%">Stage</th>
+ <th align="center" width="9%">Parameter</th>
+ <th align="center" width="1%">Terminus</th>
+ <th align="center">Description</th>
+ </tr>
+
+ <tr valign="top" align="center">
+ <td><a href="../dom/Consumer.html">dom</a></td>
+ <td><em>none</em></td>
+ <td> yes </td>
+ <td align="left"> Applications code can access a DOM Document built
+ from the input event stream. When used as a filter, this buffers
+ data up to an <em>endDocument</em> call, and then uses a DOM parser
+ to report everything that has been recorded (which can easily be
+ less than what was reported to it). </td>
+ </tr>
+ <tr valign="top" align="center">
+ <td><a href="NSFilter.html">nsfix</a></td>
+ <td><em>none</em></td>
+ <td>no</td>
+ <td align="left">This stage ensures that the XML element and attribute
+ names in its output use namespace prefixes and declarations correctly.
+ That is, so that they match the "Namespace plus LocalName" naming data
+ with which each XML element and attribute is already associated. </td>
+ </tr>
+ <tr valign="top" align="center">
+ <td><a href="EventFilter.html">null</a></td>
+ <td><em>none</em></td>
+ <td>yes</td>
+ <td align="left">This stage ignores all input event data.</td>
+ </tr>
+ <tr valign="top" align="center">
+ <td><a href="CallFilter.html">server</a></td>
+ <td><em>required</em><br> server URL </td>
+ <td>no</td>
+ <td align="left">Sends its input as XML request to a remote server,
+ normally a web application server using the HTTP or HTTPS protocols.
+ The output of this stage is the parsed response from that server.</td>
+ </tr>
+ <tr valign="top" align="center">
+ <td><a href="TeeConsumer.html">tee</a></td>
+ <td><em>required</em><br> first pipeline</td>
+ <td>no</td>
+ <td align="left">This sends its events down two paths; its parameter
+ is a pipeline descriptor for the first path, and the second path
+ is the output of this stage.</td>
+ </tr>
+
+ <tr valign="top" align="center">
+ <td><a href="ValidationConsumer.html">validate</a></td>
+ <td><em>none</em></td>
+ <td>yes</td>
+ <td align="left">This checks for validity errors, and reports them
+ through its error handler. The input must include declaration events
+ and some lexical events. </td>
+ </tr>
+ <tr valign="top" align="center">
+ <td><a href="WellFormednessFilter.html">wf</a></td>
+ <td><em>none</em></td>
+ <td>yes</td>
+ <td align="left"> This class provides some basic "well formedness"
+ tests on the input event stream, and reports a fatal error if any
+ of them fail. One example: start/end calls for elements must match.
+ No SAX parser is permitted to produce malformed output, but other
+ components can easily do so.</td>
+ </tr>
+ <tr valign="top" align="center">
+ <td>write</td>
+ <td><em>required</em><br> "stdout", "stderr", or filename</td>
+ <td>yes</td>
+ <td align="left"> Writes its input to the specified output, as pretty
+ printed XML text encoded using UTF-8. Input events must be well
+ formed and "namespace fixed", else the output won't be XML (or possibly
+ namespace) conformant. The symbolic names represent
+ <em>System.out</em> and <em>System.err</em> respectively; names must
+ correspond to files which don't yet exist.</td>
+ </tr>
+ <tr valign="top" align="center">
+ <td>xhtml</td>
+ <td><em>required</em><br> "stdout", "stderr", or filename</td>
+ <td>yes</td>
+ <td align="left"> Like <em>write</em> (above), except that XHTML rules
+ are followed. The XHTML 1.0 Transitional document type is declared,
+ and only ASCII characters are written (for interoperability). Other
+ characters are written as entity or character references; the text is
+ pretty printed.</td>
+ </tr>
+ <tr valign="top" align="center">
+ <td><a href="XIncludeFilter.html">xinclude</a></td>
+ <td><em>none</em></td>
+ <td>no</td>
+ <td align="left">This stage handles XInclude processing.
+ This is like entity inclusion, except that the included content
+ is declared in-line rather than in the DTD at the beginning of
+ a document.
+ </td>
+ </tr>
+ <tr valign="top" align="center">
+ <td><a href="XsltFilter.html">xslt</a></td>
+ <td><em>required</em><br> XSLT stylesheet URI</td>
+ <td>no</td>
+ <td align="left">This stage handles XSLT transformation
+ according to a stylesheet.
+ The implementation of the transformation may not actually
+ stream data, although if such an XSLT engine is in use
+ then that can happen.
+ </td>
+ </tr>
+
+ </table>
+
+ * <p> Note that {@link EventFilter#bind} can automatically eliminate
+ * some filters by setting SAX2 parser features appropriately. This means
+ * that you can routinely put filters like "nsfix", "validate", or "wf" at the
+ * front of a pipeline (for components that need inputs conditioned to match
+ * that level of correctness), and know that it won't actually be used unless
+ * it's absolutely necessary.
+ *
+ * @author David Brownell
+ * @version $Date: 2003-02-01 02:10:20 $
+ */
+public class PipelineFactory
+{
+ /**
+ * Creates a simple pipeline according to the description string passed in.
+ */
+ public static EventConsumer createPipeline (String description)
+ throws IOException
+ {
+ return createPipeline (description, null);
+ }
+
+ /**
+ * Extends an existing pipeline by prepending the filter pipeline to the
+ * specified consumer. Some pipelines need more customization than can
+ * be done through this simplified syntax. When they are set up with
+ * direct API calls, use this method to merge more complex pipeline
+ * segments with easily configured ones.
+ */
+ public static EventConsumer createPipeline (
+ String description,
+ EventConsumer next
+ ) throws IOException
+ {
+ // tokens are (for now) what's separated by whitespace;
+ // very easy to parse, but IDs never have spaces.
+
+ StringTokenizer tokenizer;
+ String tokens [];
+
+ tokenizer = new StringTokenizer (description);
+ tokens = new String [tokenizer.countTokens ()];
+ for (int i = 0; i < tokens.length; i++)
+ tokens [i] = tokenizer.nextToken ();
+
+ PipelineFactory factory = new PipelineFactory ();
+ Pipeline pipeline = factory.parsePipeline (tokens, next);
+
+ return pipeline.createPipeline ();
+ }
+
+
+ private PipelineFactory () { /* NYET */ }
+
+
+ /**
+ * Extends an existing pipeline by prepending a pre-tokenized filter
+ * pipeline to the specified consumer. Tokens are class names (or the
+ * predefined aliases) left and right parenthesis, and the vertical bar.
+ */
+ public static EventConsumer createPipeline (
+ String tokens [],
+ EventConsumer next
+ ) throws IOException
+ {
+ PipelineFactory factory = new PipelineFactory ();
+ Pipeline pipeline = factory.parsePipeline (tokens, next);
+
+ return pipeline.createPipeline ();
+ }
+
+
+ private String tokens [];
+ private int index;
+
+ private Pipeline parsePipeline (String toks [], EventConsumer next)
+ {
+ tokens = toks;
+ index = 0;
+
+ Pipeline retval = parsePipeline (next);
+
+ if (index != toks.length)
+ throw new ArrayIndexOutOfBoundsException (
+ "extra token: " + tokens [index]);
+ return retval;
+ }
+
+ // pipeline ::= stage | stage '|' pipeline
+ private Pipeline parsePipeline (EventConsumer next)
+ {
+ Pipeline retval = new Pipeline (parseStage ());
+
+ // minimal pipelines: "stage" and "... | id"
+ if (index > (tokens.length - 2)
+ || !"|".equals (tokens [index])
+ ) {
+ retval.next = next;
+ return retval;
+ }
+ index++;
+ retval.rest = parsePipeline (next);
+ return retval;
+ }
+
+ // stage ::= id | id '(' pipeline ')'
+ private Stage parseStage ()
+ {
+ Stage retval = new Stage (tokens [index++]);
+
+ // minimal stages: "id" and "id ( id )"
+ if (index > (tokens.length - 2)
+ || !"(".equals (tokens [index]) /*)*/
+ )
+ return retval;
+
+ index++;
+ retval.param = parsePipeline (null);
+ if (index >= tokens.length)
+ throw new ArrayIndexOutOfBoundsException (
+ "missing right paren");
+ if (/*(*/ !")".equals (tokens [index++]))
+ throw new ArrayIndexOutOfBoundsException (
+ "required right paren, not: " + tokens [index - 1]);
+ return retval;
+ }
+
+
+ //
+ // these classes obey the conventions for constructors, so they're
+ // only built in to this table of shortnames
+ //
+ // - filter (one or two types of arglist)
+ // * last constructor is 'next' element
+ // * optional (first) string parameter
+ //
+ // - terminus (one or types of arglist)
+ // * optional (only) string parameter
+ //
+ // terminus stages are transformed into filters if needed, by
+ // creating a "tee". filter stages aren't turned to terminus
+ // stages though; either eliminate such stages, or add some
+ // terminus explicitly.
+ //
+ private static final String builtinStages [][] = {
+ { "dom", "gnu.xml.dom.Consumer" },
+ { "nsfix", "gnu.xml.pipeline.NSFilter" },
+ { "null", "gnu.xml.pipeline.EventFilter" },
+ { "server", "gnu.xml.pipeline.CallFilter" },
+ { "tee", "gnu.xml.pipeline.TeeConsumer" },
+ { "validate", "gnu.xml.pipeline.ValidationConsumer" },
+ { "wf", "gnu.xml.pipeline.WellFormednessFilter" },
+ { "xinclude", "gnu.xml.pipeline.XIncludeFilter" },
+ { "xslt", "gnu.xml.pipeline.XsltFilter" },
+
+// XXX want: option for validate, to preload external part of a DTD
+
+ // xhtml, write ... nyet generic-ready
+ };
+
+ private static class Stage
+ {
+ String id;
+ Pipeline param;
+
+ Stage (String name)
+ { id = name; }
+
+ public String toString ()
+ {
+ if (param == null)
+ return id;
+ return id + " ( " + param + " )";
+ }
+
+ private void fail (String message)
+ throws IOException
+ {
+ throw new IOException ("in '" + id
+ + "' stage of pipeline, " + message);
+ }
+
+ EventConsumer createStage (EventConsumer next)
+ throws IOException
+ {
+ String name = id;
+
+ // most builtins are just class aliases
+ for (int i = 0; i < builtinStages.length; i++) {
+ if (id.equals (builtinStages [i][0])) {
+ name = builtinStages [i][1];
+ break;
+ }
+ }
+
+ // Save output as XML or XHTML text
+ if ("write".equals (name) || "xhtml".equals (name)) {
+ String filename;
+ boolean isXhtml = "xhtml".equals (name);
+ OutputStream out = null;
+ TextConsumer consumer;
+
+ if (param == null)
+ fail ("parameter is required");
+
+ filename = param.toString ();
+ if ("stdout".equals (filename))
+ out = System.out;
+ else if ("stderr".equals (filename))
+ out = System.err;
+ else {
+ File f = new File (filename);
+
+/*
+ if (!f.isAbsolute ())
+ fail ("require absolute file paths");
+ */
+ if (f.exists ())
+ fail ("file already exists: " + f.getName ());
+
+// XXX this races against the existence test
+ out = new FileOutputStream (f);
+ }
+
+ if (!isXhtml)
+ consumer = new TextConsumer (out);
+ else
+ consumer = new TextConsumer (
+ new OutputStreamWriter (out, "8859_1"),
+ true);
+
+ consumer.setPrettyPrinting (true);
+ if (next == null)
+ return consumer;
+ return new TeeConsumer (consumer, next);
+
+ } else {
+ //
+ // Here go all the builtins that are just aliases for
+ // classes, and all stage IDs that started out as such
+ // class names. The following logic relies on several
+ // documented conventions for constructor invocation.
+ //
+ String msg = null;
+
+ try {
+ Class klass = Class.forName (name);
+ Class argTypes [] = null;
+ Constructor constructor = null;
+ boolean filter = false;
+ Object params [] = null;
+ Object obj = null;
+
+ // do we need a filter stage?
+ if (next != null) {
+ // "next" consumer is always passed, with
+ // or without the optional string param
+ if (param == null) {
+ argTypes = new Class [1];
+ argTypes [0] = EventConsumer.class;
+
+ params = new Object [1];
+ params [0] = next;
+
+ msg = "no-param filter";
+ } else {
+ argTypes = new Class [2];
+ argTypes [0] = String.class;
+ argTypes [1] = EventConsumer.class;
+
+ params = new Object [2];
+ params [0] = param.toString ();
+ params [1] = next;
+
+ msg = "one-param filter";
+ }
+
+
+ try {
+ constructor = klass.getConstructor (argTypes);
+ } catch (NoSuchMethodException e) {
+ // try creating a filter from a
+ // terminus and a tee
+ filter = true;
+ msg += " built from ";
+ }
+ }
+
+ // build from a terminus stage, with or
+ // without the optional string param
+ if (constructor == null) {
+ String tmp;
+
+ if (param == null) {
+ argTypes = new Class [0];
+ params = new Object [0];
+
+ tmp = "no-param terminus";
+ } else {
+ argTypes = new Class [1];
+ argTypes [0] = String.class;
+
+ params = new Object [1];
+ params [0] = param.toString ();
+
+ tmp = "one-param terminus";
+ }
+ if (msg == null)
+ msg = tmp;
+ else
+ msg += tmp;
+ constructor = klass.getConstructor (argTypes);
+ // NOT creating terminus by dead-ending
+ // filters ... users should think about
+ // that one, something's likely wrong
+ }
+
+ obj = constructor.newInstance (params);
+
+ // return EventConsumers directly, perhaps after
+ // turning them into a filter
+ if (obj instanceof EventConsumer) {
+ if (filter)
+ return new TeeConsumer ((EventConsumer) obj, next);
+ return (EventConsumer) obj;
+ }
+
+ // if it's not a handler, it's an error
+ // we can wrap handlers in a filter
+ EventFilter retval = new EventFilter ();
+ boolean updated = false;
+
+ if (obj instanceof ContentHandler) {
+ retval.setContentHandler ((ContentHandler) obj);
+ updated = true;
+ }
+ if (obj instanceof DTDHandler) {
+ retval.setDTDHandler ((DTDHandler) obj);
+ updated = true;
+ }
+ if (obj instanceof LexicalHandler) {
+ retval.setProperty (
+ EventFilter.PROPERTY_URI + "lexical-handler",
+ obj);
+ updated = true;
+ }
+ if (obj instanceof DeclHandler) {
+ retval.setProperty (
+ EventFilter.PROPERTY_URI + "declaration-handler",
+ obj);
+ updated = true;
+ }
+
+ if (!updated)
+ fail ("class is neither Consumer nor Handler");
+
+ if (filter)
+ return new TeeConsumer (retval, next);
+ return retval;
+
+ } catch (IOException e) {
+ throw e;
+
+ } catch (NoSuchMethodException e) {
+ fail (name + " constructor missing -- " + msg);
+
+ } catch (ClassNotFoundException e) {
+ fail (name + " class not found");
+
+ } catch (Exception e) {
+ // e.printStackTrace ();
+ fail ("stage not available: " + e.getMessage ());
+ }
+ }
+ // NOTREACHED
+ return null;
+ }
+ }
+
+ private static class Pipeline
+ {
+ Stage stage;
+
+ // rest may be null
+ Pipeline rest;
+ EventConsumer next;
+
+ Pipeline (Stage s)
+ { stage = s; }
+
+ public String toString ()
+ {
+ if (rest == null && next == null)
+ return stage.toString ();
+ if (rest != null)
+ return stage + " | " + rest;
+ throw new IllegalArgumentException ("next");
+ }
+
+ EventConsumer createPipeline ()
+ throws IOException
+ {
+ if (next == null) {
+ if (rest == null)
+ next = stage.createStage (null);
+ else
+ next = stage.createStage (rest.createPipeline ());
+ }
+ return next;
+ }
+ }
+
+/*
+ public static void main (String argv [])
+ {
+ try {
+ // three basic terminus cases
+ createPipeline ("null");
+ createPipeline ("validate");
+ createPipeline ("write ( stdout )");
+
+ // four basic filters
+ createPipeline ("nsfix | write ( stderr )");
+ createPipeline ("wf | null");
+ createPipeline ("null | null");
+ createPipeline (
+"call ( http://www.example.com/services/xml-1a ) | xhtml ( stdout )");
+
+ // tee junctions
+ createPipeline ("tee ( validate ) | write ( stdout )");
+ createPipeline ("tee ( nsfix | write ( stdout ) ) | validate");
+
+ // longer pipeline
+ createPipeline ("nsfix | tee ( validate ) | write ( stdout )");
+ createPipeline (
+ "null | wf | nsfix | tee ( validate ) | write ( stdout )");
+
+ // try some parsing error cases
+ try {
+ createPipeline ("null ("); // extra token '('
+ System.err.println ("** didn't report error");
+ } catch (Exception e) {
+ System.err.println ("== err: " + e.getMessage ()); }
+
+ try {
+ createPipeline ("nsfix |"); // extra token '|'
+ System.err.println ("** didn't report error");
+ } catch (Exception e) {
+ System.err.println ("== err: " + e.getMessage ()); }
+
+ try {
+ createPipeline ("xhtml ( foo"); // missing right paren
+ System.err.println ("** didn't report error");
+ } catch (Exception e) {
+ System.err.println ("== err: " + e.getMessage ()); }
+
+ try {
+ createPipeline ("xhtml ( foo bar"); // required right paren
+ System.err.println ("** didn't report error");
+ } catch (Exception e) {
+ System.err.println ("== err: " + e.getMessage ()); }
+
+ try {
+ createPipeline ("tee ( nsfix | validate");// missing right paren
+ System.err.println ("** didn't report error");
+ } catch (Exception e) {
+ System.err.println ("== err: " + e.getMessage ()); }
+
+ // try some construction error cases
+
+ try {
+ createPipeline ("call"); // missing param
+ System.err.println ("** didn't report error");
+ } catch (Exception e) {
+ System.err.println ("== err: " + e.getMessage ()); }
+ try {
+ createPipeline ("call ( foobar )"); // broken param
+ System.err.println ("** didn't report error");
+ } catch (Exception e) {
+ System.err.println ("== err: " + e.getMessage ()); }
+ try {
+ createPipeline ("nsfix ( foobar )"); // illegal param
+ System.err.println ("** didn't report error");
+ } catch (Exception e) {
+ System.err.println ("== err: " + e.getMessage ()); }
+ try {
+ createPipeline ("null ( foobar )"); // illegal param
+ System.err.println ("** didn't report error");
+ } catch (Exception e) {
+ System.err.println ("== err: " + e.getMessage ()); }
+ try {
+ createPipeline ("wf ( foobar )"); // illegal param
+ System.err.println ("** didn't report error");
+ } catch (Exception e) {
+ System.err.println ("== err: " + e.getMessage ()); }
+ try {
+ createPipeline ("xhtml ( foobar.html )");
+ new File ("foobar.html").delete ();
+ // now supported
+ } catch (Exception e) {
+ System.err.println ("** err: " + e.getMessage ()); }
+ try {
+ createPipeline ("xhtml"); // missing param
+ System.err.println ("** didn't report error");
+ } catch (Exception e) {
+ System.err.println ("== err: " + e.getMessage ()); }
+ try {
+ createPipeline ("write ( stdout ) | null"); // nonterminal
+ System.err.println ("** didn't report error");
+ } catch (Exception e) {
+ System.err.println ("== err: " + e.getMessage ()); }
+ try {
+ createPipeline ("validate | null");
+ // now supported
+ } catch (Exception e) {
+ System.err.println ("** err: " + e.getMessage ()); }
+ try {
+ createPipeline ("validate ( foo )"); // illegal param
+ System.err.println ("** didn't report error");
+ } catch (Exception e) {
+ System.err.println ("== err: " + e.getMessage ()); }
+ try {
+ createPipeline ("tee"); // missing param
+ System.err.println ("** didn't report error");
+ } catch (Exception e) {
+ System.err.println ("== err: " + e.getMessage ()); }
+ try {
+ // only builtins so far
+ createPipeline ("com.example.xml.FilterClass");
+ System.err.println ("** didn't report error");
+ } catch (Exception e) {
+ System.err.println ("== err: " + e.getMessage ()); }
+
+ } catch (Exception e) {
+ e.printStackTrace ();
+ }
+ }
+/**/
+
+}
diff --git a/external/jaxp/source/gnu/xml/pipeline/TeeConsumer.java b/external/jaxp/source/gnu/xml/pipeline/TeeConsumer.java
new file mode 100644
index 000000000..1c75dba4f
--- /dev/null
+++ b/external/jaxp/source/gnu/xml/pipeline/TeeConsumer.java
@@ -0,0 +1,404 @@
+/*
+ * $Id: TeeConsumer.java,v 1.1 2003-02-01 02:10:20 cbj Exp $
+ * Copyright (C) 1999-2001 David Brownell
+ *
+ * This file is part of GNU JAXP, a library.
+ *
+ * GNU JAXP is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * GNU JAXP is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ * As a special exception, if you link this library with other files to
+ * produce an executable, this library does not by itself cause the
+ * resulting executable to be covered by the GNU General Public License.
+ * This exception does not however invalidate any other reasons why the
+ * executable file might be covered by the GNU General Public License.
+ */
+
+package gnu.xml.pipeline;
+
+import java.io.IOException;
+import org.xml.sax.*;
+import org.xml.sax.ext.*;
+//import gnu.xml.util;
+
+
+/**
+ * Fans its events out to two other consumers, a "tee" filter stage in an
+ * event pipeline. Networks can be assembled with multiple output points.
+ *
+ * <p> Error handling should be simple if you remember that exceptions
+ * you throw will cancel later stages in that callback's pipeline, and
+ * generally the producer will stop if it sees such an exception. You
+ * may want to protect your pipeline against such backflows, making a
+ * kind of reverse filter (or valve?) so that certain exceptions thrown by
+ * your pipeline will caught and handled before the producer sees them.
+ * Just use a "try/catch" block, rememebering that really important
+ * cleanup tasks should be in "finally" clauses.
+ *
+ * <p> That issue isn't unique to "tee" consumers, but tee consumers have
+ * the additional twist that exceptions thrown by the first consumer
+ * will cause the second consumer not to see the callback (except for
+ * the endDocument callback, which signals state cleanup).
+ *
+ * @author David Brownell
+ * @version $Date: 2003-02-01 02:10:20 $
+ */
+final public class TeeConsumer
+ implements EventConsumer,
+ ContentHandler, DTDHandler,
+ LexicalHandler,DeclHandler
+{
+ private EventConsumer first, rest;
+
+ // cached to minimize time overhead
+ private ContentHandler docFirst, docRest;
+ private DeclHandler declFirst, declRest;
+ private LexicalHandler lexFirst, lexRest;
+
+
+ /**
+ * Constructs a consumer which sends all its events to the first
+ * consumer, and then the second one. If the first consumer throws
+ * an exception, the second one will not see the event which
+ * caused that exception to be reported.
+ *
+ * @param car The first consumer to get the events
+ * @param cdr The second consumer to get the events
+ */
+ public TeeConsumer (EventConsumer car, EventConsumer cdr)
+ {
+ if (car == null || cdr == null)
+ throw new NullPointerException ();
+ first = car;
+ rest = cdr;
+
+ //
+ // Cache the handlers.
+ //
+ docFirst = first.getContentHandler ();
+ docRest = rest.getContentHandler ();
+ // DTD handler isn't cached (rarely needed)
+
+ try {
+ declFirst = null;
+ declFirst = (DeclHandler) first.getProperty (
+ EventFilter.DECL_HANDLER);
+ } catch (SAXException e) {}
+ try {
+ declRest = null;
+ declRest = (DeclHandler) rest.getProperty (
+ EventFilter.DECL_HANDLER);
+ } catch (SAXException e) {}
+
+ try {
+ lexFirst = null;
+ lexFirst = (LexicalHandler) first.getProperty (
+ EventFilter.LEXICAL_HANDLER);
+ } catch (SAXException e) {}
+ try {
+ lexRest = null;
+ lexRest = (LexicalHandler) rest.getProperty (
+ EventFilter.LEXICAL_HANDLER);
+ } catch (SAXException e) {}
+ }
+
+/* FIXME
+ /**
+ * Constructs a pipeline, and is otherwise a shorthand for the
+ * two-consumer constructor for this class.
+ *
+ * @param first Description of the first pipeline to get events,
+ * which will be passed to {@link PipelineFactory#createPipeline}
+ * @param rest The second pipeline to get the events
+ * /
+ // constructor used by PipelineFactory
+ public TeeConsumer (String first, EventConsumer rest)
+ throws IOException
+ {
+ this (PipelineFactory.createPipeline (first), rest);
+ }
+*/
+
+ /** Returns the first pipeline to get event calls. */
+ public EventConsumer getFirst ()
+ { return first; }
+
+ /** Returns the second pipeline to get event calls. */
+ public EventConsumer getRest ()
+ { return rest; }
+
+ /** Returns the content handler being used. */
+ final public ContentHandler getContentHandler ()
+ {
+ if (docRest == null)
+ return docFirst;
+ if (docFirst == null)
+ return docRest;
+ return this;
+ }
+
+ /** Returns the dtd handler being used. */
+ final public DTDHandler getDTDHandler ()
+ {
+ // not cached (hardly used)
+ if (rest.getDTDHandler () == null)
+ return first.getDTDHandler ();
+ if (first.getDTDHandler () == null)
+ return rest.getDTDHandler ();
+ return this;
+ }
+
+ /** Returns the declaration or lexical handler being used. */
+ final public Object getProperty (String id)
+ throws SAXNotRecognizedException
+ {
+ //
+ // in degenerate cases, we have no work to do.
+ //
+ Object firstProp = null, restProp = null;
+
+ try { firstProp = first.getProperty (id); }
+ catch (SAXNotRecognizedException e) { /* ignore */ }
+ try { restProp = rest.getProperty (id); }
+ catch (SAXNotRecognizedException e) { /* ignore */ }
+
+ if (restProp == null)
+ return firstProp;
+ if (firstProp == null)
+ return restProp;
+
+ //
+ // we've got work to do; handle two builtin cases.
+ //
+ if (EventFilter.DECL_HANDLER.equals (id))
+ return this;
+ if (EventFilter.LEXICAL_HANDLER.equals (id))
+ return this;
+
+ //
+ // non-degenerate, handled by both consumers, but we don't know
+ // how to handle this.
+ //
+ throw new SAXNotRecognizedException ("can't tee: " + id);
+ }
+
+ /**
+ * Provides the error handler to both subsequent nodes of
+ * this filter stage.
+ */
+ public void setErrorHandler (ErrorHandler handler)
+ {
+ first.setErrorHandler (handler);
+ rest.setErrorHandler (handler);
+ }
+
+
+ //
+ // ContentHandler
+ //
+ public void setDocumentLocator (Locator locator)
+ {
+ // this call is not made by all parsers
+ docFirst.setDocumentLocator (locator);
+ docRest.setDocumentLocator (locator);
+ }
+
+ public void startDocument ()
+ throws SAXException
+ {
+ docFirst.startDocument ();
+ docRest.startDocument ();
+ }
+
+ public void endDocument ()
+ throws SAXException
+ {
+ try {
+ docFirst.endDocument ();
+ } finally {
+ docRest.endDocument ();
+ }
+ }
+
+ public void startPrefixMapping (String prefix, String uri)
+ throws SAXException
+ {
+ docFirst.startPrefixMapping (prefix, uri);
+ docRest.startPrefixMapping (prefix, uri);
+ }
+
+ public void endPrefixMapping (String prefix)
+ throws SAXException
+ {
+ docFirst.endPrefixMapping (prefix);
+ docRest.endPrefixMapping (prefix);
+ }
+
+ public void skippedEntity (String name)
+ throws SAXException
+ {
+ docFirst.skippedEntity (name);
+ docRest.skippedEntity (name);
+ }
+
+ public void startElement (String uri, String localName,
+ String qName, Attributes atts)
+ throws SAXException
+ {
+ docFirst.startElement (uri, localName, qName, atts);
+ docRest.startElement (uri, localName, qName, atts);
+ }
+
+ public void endElement (String uri, String localName, String qName)
+ throws SAXException
+ {
+ docFirst.endElement (uri, localName, qName);
+ docRest.endElement (uri, localName, qName);
+ }
+
+ public void processingInstruction (String target, String data)
+ throws SAXException
+ {
+ docFirst.processingInstruction (target, data);
+ docRest.processingInstruction (target, data);
+ }
+
+ public void characters (char ch [], int start, int length)
+ throws SAXException
+ {
+ docFirst.characters (ch, start, length);
+ docRest.characters (ch, start, length);
+ }
+
+ public void ignorableWhitespace (char ch [], int start, int length)
+ throws SAXException
+ {
+ docFirst.ignorableWhitespace (ch, start, length);
+ docRest.ignorableWhitespace (ch, start, length);
+ }
+
+
+ //
+ // DTDHandler
+ //
+ public void notationDecl (String name, String publicId, String systemId)
+ throws SAXException
+ {
+ DTDHandler l1 = first.getDTDHandler ();
+ DTDHandler l2 = rest.getDTDHandler ();
+
+ l1.notationDecl (name, publicId, systemId);
+ l2.notationDecl (name, publicId, systemId);
+ }
+
+ public void unparsedEntityDecl (String name,
+ String publicId, String systemId,
+ String notationName
+ ) throws SAXException
+ {
+ DTDHandler l1 = first.getDTDHandler ();
+ DTDHandler l2 = rest.getDTDHandler ();
+
+ l1.unparsedEntityDecl (name, publicId, systemId, notationName);
+ l2.unparsedEntityDecl (name, publicId, systemId, notationName);
+ }
+
+
+ //
+ // DeclHandler
+ //
+ public void attributeDecl (String eName, String aName,
+ String type,
+ String mode, String value)
+ throws SAXException
+ {
+ declFirst.attributeDecl (eName, aName, type, mode, value);
+ declRest.attributeDecl (eName, aName, type, mode, value);
+ }
+
+ public void elementDecl (String name, String model)
+ throws SAXException
+ {
+ declFirst.elementDecl (name, model);
+ declRest.elementDecl (name, model);
+ }
+
+ public void externalEntityDecl (String name,
+ String publicId, String systemId)
+ throws SAXException
+ {
+ declFirst.externalEntityDecl (name, publicId, systemId);
+ declRest.externalEntityDecl (name, publicId, systemId);
+ }
+
+ public void internalEntityDecl (String name, String value)
+ throws SAXException
+ {
+ declFirst.internalEntityDecl (name, value);
+ declRest.internalEntityDecl (name, value);
+ }
+
+
+ //
+ // LexicalHandler
+ //
+ public void comment (char ch [], int start, int length)
+ throws SAXException
+ {
+ lexFirst.comment (ch, start, length);
+ lexRest.comment (ch, start, length);
+ }
+
+ public void startCDATA ()
+ throws SAXException
+ {
+ lexFirst.startCDATA ();
+ lexRest.startCDATA ();
+ }
+
+ public void endCDATA ()
+ throws SAXException
+ {
+ lexFirst.endCDATA ();
+ lexRest.endCDATA ();
+ }
+
+ public void startEntity (String name)
+ throws SAXException
+ {
+ lexFirst.startEntity (name);
+ lexRest.startEntity (name);
+ }
+
+ public void endEntity (String name)
+ throws SAXException
+ {
+ lexFirst.endEntity (name);
+ lexRest.endEntity (name);
+ }
+
+ public void startDTD (String name, String publicId, String systemId)
+ throws SAXException
+ {
+ lexFirst.startDTD (name, publicId, systemId);
+ lexRest.startDTD (name, publicId, systemId);
+ }
+
+ public void endDTD ()
+ throws SAXException
+ {
+ lexFirst.endDTD ();
+ lexRest.endDTD ();
+ }
+}
diff --git a/external/jaxp/source/gnu/xml/pipeline/TextConsumer.java b/external/jaxp/source/gnu/xml/pipeline/TextConsumer.java
new file mode 100644
index 000000000..5c816cb5c
--- /dev/null
+++ b/external/jaxp/source/gnu/xml/pipeline/TextConsumer.java
@@ -0,0 +1,108 @@
+/*
+ * $Id: TextConsumer.java,v 1.1 2003-02-01 02:10:20 cbj Exp $
+ * Copyright (C) 1999-2001 David Brownell
+ *
+ * This file is part of GNU JAXP, a library.
+ *
+ * GNU JAXP is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * GNU JAXP is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ * As a special exception, if you link this library with other files to
+ * produce an executable, this library does not by itself cause the
+ * resulting executable to be covered by the GNU General Public License.
+ * This exception does not however invalidate any other reasons why the
+ * executable file might be covered by the GNU General Public License.
+ */
+
+package gnu.xml.pipeline;
+
+import java.io.*;
+
+import org.xml.sax.*;
+
+import gnu.xml.util.XMLWriter;
+
+
+/**
+ * Terminates a pipeline, consuming events to print them as well formed
+ * XML (or XHTML) text.
+ *
+ * <p> Input must be well formed, and must include XML names (e.g. the
+ * prefixes and prefix declarations must be present), or the output of
+ * this class is undefined.
+ *
+ * @see NSFilter
+ * @see WellFormednessFilter
+ *
+ * @author David Brownell
+ * @version $Date: 2003-02-01 02:10:20 $
+ */
+public class TextConsumer extends XMLWriter implements EventConsumer
+{
+ /**
+ * Constructs an event consumer which echoes its input as text,
+ * optionally adhering to some basic XHTML formatting options
+ * which increase interoperability with old (v3) browsers.
+ *
+ * <p> For the best interoperability, when writing as XHTML only
+ * ASCII characters are emitted; other characters are turned to
+ * entity or character references as needed, and no XML declaration
+ * is provided in the document.
+ */
+ public TextConsumer (Writer w, boolean isXhtml)
+ throws IOException
+ {
+ super (w, isXhtml ? "US-ASCII" : null);
+ setXhtml (isXhtml);
+ }
+
+ /**
+ * Constructs a consumer that writes its input as XML text.
+ * XHTML rules are not followed.
+ */
+ public TextConsumer (Writer w)
+ throws IOException
+ {
+ this (w, false);
+ }
+
+ /**
+ * Constructs a consumer that writes its input as XML text,
+ * encoded in UTF-8. XHTML rules are not followed.
+ */
+ public TextConsumer (OutputStream out)
+ throws IOException
+ {
+ this (new OutputStreamWriter (out, "UTF8"), false);
+ }
+
+ /** <b>EventConsumer</b> Returns the document handler being used. */
+ public ContentHandler getContentHandler ()
+ { return this; }
+
+ /** <b>EventConsumer</b> Returns the dtd handler being used. */
+ public DTDHandler getDTDHandler ()
+ { return this; }
+
+ /** <b>XMLReader</b>Retrieves a property (lexical and decl handlers) */
+ public Object getProperty (String propertyId)
+ throws SAXNotRecognizedException
+ {
+ if (EventFilter.LEXICAL_HANDLER.equals (propertyId))
+ return this;
+ if (EventFilter.DECL_HANDLER.equals (propertyId))
+ return this;
+ throw new SAXNotRecognizedException (propertyId);
+ }
+}
diff --git a/external/jaxp/source/gnu/xml/pipeline/ValidationConsumer.java b/external/jaxp/source/gnu/xml/pipeline/ValidationConsumer.java
new file mode 100644
index 000000000..c64ebedc2
--- /dev/null
+++ b/external/jaxp/source/gnu/xml/pipeline/ValidationConsumer.java
@@ -0,0 +1,1915 @@
+/*
+ * $Id: ValidationConsumer.java,v 1.1 2003-02-01 02:10:22 cbj Exp $
+ * Copyright (C) 1999-2001 David Brownell
+ *
+ * This file is part of GNU JAXP, a library.
+ *
+ * GNU JAXP is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * GNU JAXP is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ * As a special exception, if you link this library with other files to
+ * produce an executable, this library does not by itself cause the
+ * resulting executable to be covered by the GNU General Public License.
+ * This exception does not however invalidate any other reasons why the
+ * executable file might be covered by the GNU General Public License.
+ */
+
+package gnu.xml.pipeline;
+
+import java.io.*;
+
+import java.util.EmptyStackException;
+import java.util.Enumeration;
+import java.util.Hashtable;
+import java.util.Stack;
+import java.util.StringTokenizer;
+import java.util.Vector;
+
+import org.xml.sax.*;
+import org.xml.sax.ext.*;
+import org.xml.sax.helpers.XMLReaderFactory;
+
+
+// $Id: ValidationConsumer.java,v 1.1 2003-02-01 02:10:22 cbj Exp $
+
+/**
+ * This class checks SAX2 events to report validity errors; it works as
+ * both a filter and a terminus on an event pipeline. It relies on the
+ * producer of SAX events to: </p> <ol>
+ *
+ * <li> Conform to the specification of a non-validating XML parser that
+ * reads all external entities, reported using SAX2 events. </li>
+ *
+ * <li> Report ignorable whitespace as such (through the ContentHandler
+ * interface). This is, strictly speaking, optional for nonvalidating
+ * XML processors. </li>
+ *
+ * <li> Make SAX2 DeclHandler callbacks, with default
+ * attribute values already normalized (and without "&lt;").</li>
+ *
+ * <li> Make SAX2 LexicalHandler startDTD() and endDTD ()
+ * callbacks. </li>
+ *
+ * <li> Act as if the <em>(URI)/namespace-prefixes</em> property were
+ * set to true, by providing XML 1.0 names and all <code>xmlns*</code>
+ * attributes (rather than omitting either or both). </li>
+ *
+ * </ol>
+ *
+ * <p> At this writing, the major SAX2 parsers (such as &AElig;lfred2,
+ * Crimson, and Xerces) meet these requirements, and this validation
+ * module is used by the optional &AElig;lfred2 validation support.
+ * </p>
+ *
+ * <p> Note that because this is a layered validator, it has to duplicate some
+ * work that the parser is doing; there are also other cost to layering.
+ * However, <em>because of layering it doesn't need a parser</em> in order
+ * to work! You can use it with anything that generates SAX events, such
+ * as an application component that wants to detect invalid content in
+ * a changed area without validating an entire document, or which wants to
+ * ensure that it doesn't write invalid data to a communications partner.</p>
+ *
+ * <p> Also, note that because this is a layered validator, the line numbers
+ * reported for some errors may seem strange. For example, if an element does
+ * not permit character content, the validator
+ * will use the locator provided to it.
+ * That might reflect the last character of a <em>characters</em> event
+ * callback, rather than the first non-whitespace character. </p>
+ *
+ * <hr />
+ *
+ * <!--
+ * <p> Of interest is the fact that unlike most currently known XML validators,
+ * this one can report some cases of non-determinism in element content models.
+ * It is a compile-time option, enabled by default. This will only report
+ * such XML errors if they relate to content actually appearing in a document;
+ * content models aren't aggressively scanned for non-deterministic structure.
+ * Documents which trigger such non-deterministic transitions may be handled
+ * differently by different validating parsers, without losing conformance
+ * to the XML specification. </p>
+ * -->
+ *
+ * <p> Current limitations of the validation performed are in roughly three
+ * categories. </p>
+ *
+ * <p> The first category represents constraints which demand violations
+ * of software layering: exposing lexical details, one of the first things
+ * that <em>application</em> programming interfaces (APIs) hide. These
+ * invariably relate to XML entity handling, and to historical oddities
+ * of the XML validation semantics. Curiously,
+ * recent (Autumn 1999) conformance testing showed that these constraints are
+ * among those handled worst by existing XML validating parsers. Arguments
+ * have been made that each of these VCs should be turned into WFCs (most
+ * of them) or discarded (popular for the standalone declaration); in short,
+ * that these are bugs in the XML specification (not all via SGML): </p><ul>
+ *
+ * <li> The <em>Proper Declaration/PE Nesting</em> and
+ * <em>Proper Group/PE Nesting</em> VCs can't be tested because they
+ * require access to particularly low level lexical level information.
+ * In essence, the reason XML isn't a simple thing to parse is that
+ * it's not a context free grammar, and these constraints elevate that
+ * SGML-derived context sensitivity to the level of a semantic rule.
+ *
+ * <li> The <em>Standalone Document Declaration</em> VC can't be
+ * tested. This is for two reasons. First, this flag isn't made
+ * available through SAX2. Second, it also requires breaking that
+ * lexical layering boundary. (If you ever wondered why classes
+ * in compiler construction or language design barely mention the
+ * existence of context-sensitive grammars, it's because of messy
+ * issues like these.)
+ *
+ * <li> The <em>Entity Declared</em> VC can't be tested, because it
+ * also requires breaking that lexical layering boundary! There's also
+ * another issue: the VC wording (and seemingly intent) is ambiguous.
+ * (This is still true in the "Second edition" XML spec.)
+ * Since there is a WFC of the same name, everyone's life would be
+ * easier if references to undeclared parsed entities were always well
+ * formedness errors, regardless of whether they're parameter entities
+ * or not. (Note that nonvalidating parsers are not required
+ * to report all such well formedness errors if they don't read external
+ * parameter entities, although currently most XML parsers read them
+ * in an attempt to avoid problems from inconsistent parser behavior.)
+ *
+ * </ul>
+ *
+ * <p> The second category of limitations on this validation represent
+ * constraints associated with information that is not guaranteed to be
+ * available (or in one case, <em>is guaranteed not to be available</em>,
+ * through the SAX2 API: </p><ul>
+ *
+ * <li> The <em>Unique Element Type Declaration</em> VC may not be
+ * reportable, if the underlying parser happens not to expose
+ * multiple declarations. (&AElig;lfred2 reports these validity
+ * errors directly.)</li>
+ *
+ * <li> Similarly, the <em>Unique Notation Name</em> VC, added in the
+ * 14-January-2000 XML spec errata to restrict typing models used by
+ * elements, may not be reportable. (&AElig;lfred reports these
+ * validity errors directly.) </li>
+ *
+ * </ul>
+ *
+ * <p> A third category relates to ease of implementation. (Think of this
+ * as "bugs".) The most notable issue here is character handling. Rather
+ * than attempting to implement the voluminous character tables in the XML
+ * specification (Appendix B), Unicode rules are used directly from
+ * the java.lang.Character class. Recent JVMs have begun to diverge from
+ * the original specification for that class (Unicode 2.0), meaning that
+ * different JVMs may handle that aspect of conformance differently.
+ * </p>
+ *
+ * <p> Note that for some of the validity errors that SAX2 does not
+ * expose, a nonvalidating parser is permitted (by the XML specification)
+ * to report validity errors. When used with a parser that does so for
+ * the validity constraints mentioned above (or any other SAX2 event
+ * stream producer that does the same thing), overall conformance is
+ * substantially improved.
+ *
+ * @see gnu.xml.aelfred2.SAXDriver
+ * @see gnu.xml.aelfred2.XmlReader
+ *
+ * @version $Date: 2003-02-01 02:10:22 $
+ * @author David Brownell
+ */
+public final class ValidationConsumer extends EventFilter
+{
+ // report error if we happen to notice a non-deterministic choice?
+ // we won't report buggy content models; just buggy instances
+ private static final boolean warnNonDeterministic = false;
+
+ // for tracking active content models
+ private String rootName;
+ private Stack contentStack = new Stack ();
+
+ // flags for "saved DTD" processing
+ private boolean disableDeclarations;
+ private boolean disableReset;
+
+ //
+ // most VCs get tested when we see element start tags. the per-element
+ // info (including attributes) recorded here duplicates that found inside
+ // many nonvalidating parsers, hence dual lookups etc ... that's why a
+ // layered validator isn't going to be as fast as a non-layered one.
+ //
+
+ // key = element name; value = ElementInfo
+ private Hashtable elements = new Hashtable ();
+
+ // some VCs relate to ID/IDREF/IDREFS attributes
+ // key = id; value = boolean true (defd) or false (refd)
+ private Hashtable ids = new Hashtable ();
+
+ // we just record declared notation and unparsed entity names.
+ // the implementation here is simple/slow; these features
+ // are seldom used, one hopes they'll wither away soon
+ private Vector notations = new Vector (5, 5);
+ private Vector nDeferred = new Vector (5, 5);
+ private Vector unparsed = new Vector (5, 5);
+ private Vector uDeferred = new Vector (5, 5);
+
+ // note: DocBk 3.1.7 XML defines over 2 dozen notations,
+ // used when defining unparsed entities for graphics
+ // (and maybe in other places)
+
+
+
+ /**
+ * Creates a pipeline terminus which consumes all events passed to
+ * it; this will report validity errors as if they were fatal errors,
+ * unless an error handler is assigned.
+ *
+ * @see #setErrorHandler
+ */
+ // constructor used by PipelineFactory
+ // ... and want one taking system ID of an external subset
+ public ValidationConsumer ()
+ {
+ this (null);
+ }
+
+ /**
+ * Creates a pipeline filter which reports validity errors and then
+ * passes events on to the next consumer if they were not fatal.
+ *
+ * @see #setErrorHandler
+ */
+ // constructor used by PipelineFactory
+ // ... and want one taking system ID of an external subset
+ // (which won't send declaration events)
+ public ValidationConsumer (EventConsumer next)
+ {
+ super (next);
+
+ setContentHandler (this);
+ setDTDHandler (this);
+ try { setProperty (DECL_HANDLER, this); }
+ catch (Exception e) { /* "can't happen" */ }
+ try { setProperty (LEXICAL_HANDLER, this); }
+ catch (Exception e) { /* "can't happen" */ }
+ }
+
+
+ private static final String fakeRootName
+ = ":Nobody:in:their_Right.Mind_would:use:this-name:1x:";
+
+ /**
+ * Creates a validation consumer which is preloaded with the DTD provided.
+ * It does this by constructing a document with that DTD, then parsing
+ * that document and recording its DTD declarations. Then it arranges
+ * not to modify that information.
+ *
+ * <p> The resulting validation consumer will only validate against
+ * the specified DTD, regardless of whether some other DTD is found
+ * in a document being parsed.
+ *
+ * @param rootName The name of the required root element; if this is
+ * null, any root element name will be accepted.
+ * @param publicId If non-null and there is a non-null systemId, this
+ * identifier provides an alternate access identifier for the DTD's
+ * external subset.
+ * @param systemId If non-null, this is a URI (normally URL) that
+ * may be used to access the DTD's external subset.
+ * @param internalSubset If non-null, holds literal markup declarations
+ * comprising the DTD's internal subset.
+ * @param resolver If non-null, this will be provided to the parser for
+ * use when resolving parameter entities (including any external subset).
+ * @param resolver If non-null, this will be provided to the parser for
+ * use when resolving parameter entities (including any external subset).
+ * @param minimalElement If non-null, a minimal valid document.
+ *
+ * @exception SAXNotSupportedException If the default SAX parser does
+ * not support the standard lexical or declaration handlers.
+ * @exception SAXParseException If the specified DTD has either
+ * well-formedness or validity errors
+ * @exception IOException If the specified DTD can't be read for
+ * some reason
+ */
+ public ValidationConsumer (
+ String rootName,
+ String publicId,
+ String systemId,
+ String internalSubset,
+ EntityResolver resolver,
+ String minimalDocument
+ ) throws SAXException, IOException
+ {
+ this (null);
+
+ disableReset = true;
+ if (rootName == null)
+ rootName = fakeRootName;
+
+ //
+ // Synthesize document with that DTD; is it possible to do
+ // better for the declaration of the root element?
+ //
+ // NOTE: can't use SAX2 to write internal subsets.
+ //
+ StringWriter writer = new StringWriter ();
+
+ writer.write ("<!DOCTYPE ");
+ writer.write (rootName);
+ if (systemId != null) {
+ writer.write ("\n ");
+ if (publicId != null) {
+ writer.write ("PUBLIC '");
+ writer.write (publicId);
+ writer.write ("'\n\t'");
+ } else
+ writer.write ("SYSTEM '");
+ writer.write (systemId);
+ writer.write ("'");
+ }
+ writer.write (" [ ");
+ if (rootName == fakeRootName) {
+ writer.write ("\n<!ELEMENT ");
+ writer.write (rootName);
+ writer.write (" EMPTY>");
+ }
+ if (internalSubset != null)
+ writer.write (internalSubset);
+ writer.write ("\n ]>");
+
+ if (minimalDocument != null) {
+ writer.write ("\n");
+ writer.write (minimalDocument);
+ writer.write ("\n");
+ } else {
+ writer.write (" <");
+ writer.write (rootName);
+ writer.write ("/>\n");
+ }
+ minimalDocument = writer.toString ();
+
+ //
+ // OK, load it
+ //
+ XMLReader producer;
+
+ producer = XMLReaderFactory.createXMLReader ();
+ bind (producer, this);
+
+ if (resolver != null)
+ producer.setEntityResolver (resolver);
+
+ InputSource in;
+
+ in = new InputSource (new StringReader (minimalDocument));
+ producer.parse (in);
+
+ disableDeclarations = true;
+ if (rootName == fakeRootName)
+ this.rootName = null;
+ }
+
+ private void resetState ()
+ {
+ if (!disableReset) {
+ rootName = null;
+ contentStack.removeAllElements ();
+ elements.clear ();
+ ids.clear ();
+
+ notations.removeAllElements ();
+ nDeferred.removeAllElements ();
+ unparsed.removeAllElements ();
+ uDeferred.removeAllElements ();
+ }
+ }
+
+
+ private void warning (String description)
+ throws SAXException
+ {
+ ErrorHandler errHandler = getErrorHandler ();
+ Locator locator = getDocumentLocator ();
+ SAXParseException err;
+
+ if (errHandler == null)
+ return;
+
+ if (locator == null)
+ err = new SAXParseException (description, null, null, -1, -1);
+ else
+ err = new SAXParseException (description, locator);
+ errHandler.warning (err);
+ }
+
+ // package private (for ChildrenRecognizer)
+ private void error (String description)
+ throws SAXException
+ {
+ ErrorHandler errHandler = getErrorHandler ();
+ Locator locator = getDocumentLocator ();
+ SAXParseException err;
+
+ if (locator == null)
+ err = new SAXParseException (description, null, null, -1, -1);
+ else
+ err = new SAXParseException (description, locator);
+ if (errHandler != null)
+ errHandler.error (err);
+ else // else we always treat it as fatal!
+ throw err;
+ }
+
+ private void fatalError (String description)
+ throws SAXException
+ {
+ ErrorHandler errHandler = getErrorHandler ();
+ Locator locator = getDocumentLocator ();
+ SAXParseException err;
+
+ if (locator != null)
+ err = new SAXParseException (description, locator);
+ else
+ err = new SAXParseException (description, null, null, -1, -1);
+ if (errHandler != null)
+ errHandler.fatalError (err);
+ // we always treat this as fatal, regardless of the handler
+ throw err;
+ }
+
+
+ private static boolean isExtender (char c)
+ {
+ // [88] Extender ::= ...
+ return c == 0x00b7 || c == 0x02d0 || c == 0x02d1 || c == 0x0387
+ || c == 0x0640 || c == 0x0e46 || c == 0x0ec6 || c == 0x3005
+ || (c >= 0x3031 && c <= 0x3035)
+ || (c >= 0x309d && c <= 0x309e)
+ || (c >= 0x30fc && c <= 0x30fe);
+ }
+
+
+ // use augmented Unicode rules, not full XML rules
+ private boolean isName (String name, String context, String id)
+ throws SAXException
+ {
+ char buf [] = name.toCharArray ();
+ boolean pass = true;
+
+ if (!Character.isUnicodeIdentifierStart (buf [0])
+ && ":_".indexOf (buf [0]) == -1)
+ pass = false;
+ else {
+ int max = buf.length;
+ for (int i = 1; pass && i < max; i++) {
+ char c = buf [i];
+ if (!Character.isUnicodeIdentifierPart (c)
+ && ":-_.".indexOf (c) == -1
+ && !isExtender (c))
+ pass = false;
+ }
+ }
+
+ if (!pass)
+ error ("In " + context + " for " + id
+ + ", '" + name + "' is not a name");
+ return pass; // true == OK
+ }
+
+ // use augmented Unicode rules, not full XML rules
+ private boolean isNmtoken (String nmtoken, String context, String id)
+ throws SAXException
+ {
+ char buf [] = nmtoken.toCharArray ();
+ boolean pass = true;
+ int max = buf.length;
+
+ // XXX make this share code with isName
+
+ for (int i = 0; pass && i < max; i++) {
+ char c = buf [i];
+ if (!Character.isUnicodeIdentifierPart (c)
+ && ":-_.".indexOf (c) == -1
+ && !isExtender (c))
+ pass = false;
+ }
+
+ if (!pass)
+ error ("In " + context + " for " + id
+ + ", '" + nmtoken + "' is not a name token");
+ return pass; // true == OK
+ }
+
+ private void checkEnumeration (String value, String type, String name)
+ throws SAXException
+ {
+ if (!hasMatch (value, type))
+ // VC: Enumeration
+ error ("Value '" + value
+ + "' for attribute '" + name
+ + "' is not permitted: " + type);
+ }
+
+ // used to test enumerated attributes and mixed content models
+ // package private
+ static boolean hasMatch (String value, String orList)
+ {
+ int len = value.length ();
+ int max = orList.length () - len;
+
+ for (int start = 0;
+ (start = orList.indexOf (value, start)) != -1;
+ start++) {
+ char c;
+
+ if (start > max)
+ break;
+ c = orList.charAt (start - 1);
+ if (c != '|' && c != '('/*)*/)
+ continue;
+ c = orList.charAt (start + len);
+ if (c != '|' && /*(*/ c != ')')
+ continue;
+ return true;
+ }
+ return false;
+ }
+
+ /**
+ * <b>LexicalHandler</b> Records the declaration of the root
+ * element, so it can be verified later.
+ * Passed to the next consumer, unless this one was
+ * preloaded with a particular DTD.
+ */
+ public void startDTD (String name, String publicId, String systemId)
+ throws SAXException
+ {
+ if (disableDeclarations)
+ return;
+
+ rootName = name;
+ super.startDTD (name, publicId, systemId);
+ }
+
+ /**
+ * <b>LexicalHandler</b> Verifies that all referenced notations
+ * and unparsed entities have been declared.
+ * Passed to the next consumer, unless this one was
+ * preloaded with a particular DTD.
+ */
+ public void endDTD ()
+ throws SAXException
+ {
+ if (disableDeclarations)
+ return;
+
+ // this is a convenient hook for end-of-dtd checks, but we
+ // could also trigger it in the first startElement call.
+ // locator info is more appropriate here though.
+
+ // VC: Notation Declared (NDATA can refer to them before decls,
+ // as can NOTATION attribute enumerations and defaults)
+ int length = nDeferred.size ();
+ for (int i = 0; i < length; i++) {
+ String notation = (String) nDeferred.elementAt (i);
+ if (!notations.contains (notation)) {
+ error ("A declaration referred to notation '" + notation
+ + "' which was never declared");
+ }
+ }
+ nDeferred.removeAllElements ();
+
+ // VC: Entity Name (attribute values can refer to them
+ // before they're declared); VC Attribute Default Legal
+ length = uDeferred.size ();
+ for (int i = 0; i < length; i++) {
+ String entity = (String) uDeferred.elementAt (i);
+ if (!unparsed.contains (entity)) {
+ error ("An attribute default referred to entity '" + entity
+ + "' which was never declared");
+ }
+ }
+ uDeferred.removeAllElements ();
+ super.endDTD ();
+ }
+
+
+ // These are interned, so we can rely on "==" to find the type of
+ // all attributes except enumerations ...
+ // "(this|or|that|...)" and "NOTATION (this|or|that|...)"
+ static final String types [] = {
+ "CDATA",
+ "ID", "IDREF", "IDREFS",
+ "NMTOKEN", "NMTOKENS",
+ "ENTITY", "ENTITIES"
+ };
+
+
+ /**
+ * <b>DecllHandler</b> Records attribute declaration for later use
+ * in validating document content, and checks validity constraints
+ * that are applicable to attribute declarations.
+ * Passed to the next consumer, unless this one was
+ * preloaded with a particular DTD.
+ */
+ public void attributeDecl (
+ String eName,
+ String aName,
+ String type,
+ String mode,
+ String value
+ ) throws SAXException
+ {
+ if (disableDeclarations)
+ return;
+
+ ElementInfo info = (ElementInfo) elements.get (eName);
+ AttributeInfo ainfo = new AttributeInfo ();
+ boolean checkOne = false;
+ boolean interned = false;
+
+ // cheap interning of type names and #FIXED, #REQUIRED
+ // for faster startElement (we can use "==")
+ for (int i = 0; i < types.length; i++) {
+ if (types [i].equals (type)) {
+ type = types [i];
+ interned = true;
+ break;
+ }
+ }
+ if ("#FIXED".equals (mode))
+ mode = "#FIXED";
+ else if ("#REQUIRED".equals (mode))
+ mode = "#REQUIRED";
+
+ ainfo.type = type;
+ ainfo.mode = mode;
+ ainfo.value = value;
+
+ // we might not have seen the content model yet
+ if (info == null) {
+ info = new ElementInfo (eName);
+ elements.put (eName, info);
+ }
+ if ("ID" == type) {
+ checkOne = true;
+ if (!("#REQUIRED" == mode || "#IMPLIED".equals (mode))) {
+ // VC: ID Attribute Default
+ error ("ID attribute '" + aName
+ + "' must be #IMPLIED or #REQUIRED");
+ }
+
+ } else if (!interned && type.startsWith ("NOTATION ")) {
+ checkOne = true;
+
+ // VC: Notation Attributes (notations must be declared)
+ StringTokenizer tokens = new StringTokenizer (
+ type.substring (10, type.lastIndexOf (')')),
+ "|");
+ while (tokens.hasMoreTokens ()) {
+ String token = tokens.nextToken ();
+ if (!notations.contains (token))
+ nDeferred.addElement (token);
+ }
+ }
+ if (checkOne) {
+ for (Enumeration e = info.attributes.keys ();
+ e.hasMoreElements ();
+ /* NOP */) {
+ String name;
+ AttributeInfo ainfo2;
+
+ name = (String) e.nextElement ();
+ ainfo2 = (AttributeInfo) info.attributes.get (name);
+ if (type == ainfo2.type || !interned /* NOTATION */) {
+ // VC: One ID per Element Type
+ // VC: One Notation per Element TYpe
+ error ("Element '" + eName
+ + "' already has an attribute of type "
+ + (interned ? "NOTATION" : type)
+ + " ('" + name
+ + "') so '" + aName
+ + "' is a validity error");
+ }
+ }
+ }
+
+ // VC: Attribute Default Legal
+ if (value != null) {
+
+ if ("CDATA" == type) {
+ // event source rejected '<'
+
+ } else if ("NMTOKEN" == type) {
+ // VC: Name Token (is a nmtoken)
+ isNmtoken (value, "attribute default", aName);
+
+ } else if ("NMTOKENS" == type) {
+ // VC: Name Token (is a nmtoken; at least one value)
+ StringTokenizer tokens = new StringTokenizer (value);
+ if (!tokens.hasMoreTokens ())
+ error ("Default for attribute '" + aName
+ + "' must have at least one name token.");
+ else do {
+ String token = tokens.nextToken ();
+ isNmtoken (token, "attribute default", aName);
+ } while (tokens.hasMoreTokens ());
+
+ } else if ("IDREF" == type || "ENTITY" == type) {
+ // VC: Entity Name (is a name)
+ // VC: IDREF (is a name) (is declared)
+ isName (value, "attribute default", aName);
+ if ("ENTITY" == type && !unparsed.contains (value))
+ uDeferred.addElement (value);
+
+ } else if ("IDREFS" == type || "ENTITIES" == type) {
+ // VC: Entity Name (is a name; at least one value)
+ // VC: IDREF (is a name; at least one value)
+ StringTokenizer names = new StringTokenizer (value);
+ if (!names.hasMoreTokens ())
+ error ("Default for attribute '" + aName
+ + "' must have at least one name.");
+ else do {
+ String name = names.nextToken ();
+ isName (name, "attribute default", aName);
+ if ("ENTITIES" == type && !unparsed.contains (name))
+ uDeferred.addElement (value);
+ } while (names.hasMoreTokens ());
+
+ } else if (type.charAt (0) == '(' /*)*/ ) {
+ // VC: Enumeration (must match)
+ checkEnumeration (value, type, aName);
+
+ } else if (!interned && checkOne) { /* NOTATION */
+ // VC: Notation attributes (must be names)
+ isName (value, "attribute default", aName);
+
+ // VC: Notation attributes (must be declared)
+ if (!notations.contains (value))
+ nDeferred.addElement (value);
+
+ // VC: Enumeration (must match)
+ checkEnumeration (value, type, aName);
+
+ } else if ("ID" != type)
+ throw new RuntimeException ("illegal attribute type: " + type);
+ }
+
+ if (info.attributes.get (aName) == null)
+ info.attributes.put (aName, ainfo);
+ /*
+ else
+ warning ("Element '" + eName
+ + "' already has an attribute named '" + aName + "'");
+ */
+
+ if ("xml:space".equals (aName)) {
+ if (!("(default|preserve)".equals (type)
+ || "(preserve|default)".equals (type)
+ // these next two are arguable; XHTML's DTD doesn't
+ // deserve errors. After all, it's not like any
+ // illegal _value_ could pass ...
+ || "(preserve)".equals (type)
+ || "(default)".equals (type)
+ ))
+ error (
+ "xml:space attribute type must be like '(default|preserve)'"
+ + " not '" + type + "'"
+ );
+
+ }
+ super.attributeDecl (eName, aName, type, mode, value);
+ }
+
+ /**
+ * <b>DecllHandler</b> Records the element declaration for later use
+ * when checking document content, and checks validity constraints that
+ * apply to element declarations. Passed to the next consumer, unless
+ * this one was preloaded with a particular DTD.
+ */
+ public void elementDecl (String name, String model)
+ throws SAXException
+ {
+ if (disableDeclarations)
+ return;
+
+ ElementInfo info = (ElementInfo) elements.get (name);
+
+ // we might have seen an attribute decl already
+ if (info == null) {
+ info = new ElementInfo (name);
+ elements.put (name, info);
+ }
+ if (info.model != null) {
+ // NOTE: not all parsers can report such duplicates.
+ // VC: Unique Element Type Declaration
+ error ("Element type '" + name
+ + "' was already declared.");
+ } else {
+ info.model = model;
+
+ // VC: No Duplicate Types (in mixed content models)
+ if (model.charAt (1) == '#') // (#PCDATA...
+ info.getRecognizer (this);
+ }
+ super.elementDecl (name, model);
+ }
+
+ /**
+ * <b>DecllHandler</b> passed to the next consumer, unless this
+ * one was preloaded with a particular DTD
+ */
+ public void internalEntityDecl (String name, String value)
+ throws SAXException
+ {
+ if (!disableDeclarations)
+ super.internalEntityDecl (name, value);
+ }
+
+ /**
+ * <b>DecllHandler</b> passed to the next consumer, unless this
+ * one was preloaded with a particular DTD
+ */
+ public void externalEntityDecl (String name,
+ String publicId, String systemId)
+ throws SAXException
+ {
+ if (!disableDeclarations)
+ super.externalEntityDecl (name, publicId, systemId);
+ }
+
+
+ /**
+ * <b>DTDHandler</b> Records the notation name, for checking
+ * NOTATIONS attribute values and declararations of unparsed
+ * entities. Passed to the next consumer, unless this one was
+ * preloaded with a particular DTD.
+ */
+ public void notationDecl (String name, String publicId, String systemId)
+ throws SAXException
+ {
+ if (disableDeclarations)
+ return;
+
+ notations.addElement (name);
+ super.notationDecl (name, publicId, systemId);
+ }
+
+ /**
+ * <b>DTDHandler</b> Records the entity name, for checking
+ * ENTITY and ENTITIES attribute values; records the notation
+ * name if it hasn't yet been declared. Passed to the next consumer,
+ * unless this one was preloaded with a particular DTD.
+ */
+ public void unparsedEntityDecl (
+ String name,
+ String publicId,
+ String systemId,
+ String notationName
+ ) throws SAXException
+ {
+ if (disableDeclarations)
+ return;
+
+ unparsed.addElement (name);
+ if (!notations.contains (notationName))
+ nDeferred.addElement (notationName);
+ super.unparsedEntityDecl (name, publicId, systemId, notationName);
+ }
+
+
+ /**
+ * <b>ContentHandler</b> Ensures that state from any previous parse
+ * has been deleted.
+ * Passed to the next consumer.
+ */
+ public void startDocument ()
+ throws SAXException
+ {
+ resetState ();
+ super.startDocument ();
+ }
+
+
+ private static boolean isAsciiLetter (char c)
+ {
+ return (c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z');
+ }
+
+
+ /**
+ * <b>ContentHandler</b> Reports a fatal exception. Validating
+ * XML processors may not skip any entities.
+ */
+ public void skippedEntity (String name)
+ throws SAXException
+ {
+ fatalError ("may not skip entities");
+ }
+
+ /*
+ * SAX2 doesn't expand non-PE refs in attribute defaults...
+ */
+ private String expandDefaultRefs (String s)
+ throws SAXException
+ {
+ if (s.indexOf ('&') < 0)
+ return s;
+
+// FIXME: handle &#nn; &#xnn; &name;
+ String message = "Can't expand refs in attribute default: " + s;
+ warning (message);
+
+ return s;
+ }
+
+ /**
+ * <b>ContentHandler</b> Performs validity checks against element
+ * (and document) content models, and attribute values.
+ * Passed to the next consumer.
+ */
+ public void startElement (
+ String uri,
+ String localName,
+ String qName,
+ Attributes atts
+ ) throws SAXException
+ {
+ //
+ // First check content model for the enclosing scope.
+ //
+ if (contentStack.isEmpty ()) {
+ // VC: Root Element Type
+ if (!qName.equals (rootName)) {
+ if (rootName == null)
+ warning ("This document has no DTD, can't be valid");
+ else
+ error ("Root element type '" + qName
+ + "' was declared to be '" + rootName + "'");
+ }
+ } else {
+ Recognizer state = (Recognizer) contentStack.peek ();
+
+ if (state != null) {
+ Recognizer newstate = state.acceptElement (qName);
+
+ if (newstate == null)
+ error ("Element type '" + qName
+ + "' in element '" + state.type.name
+ + "' violates content model " + state.type.model
+ );
+ if (newstate != state) {
+ contentStack.pop ();
+ contentStack.push (newstate);
+ }
+ }
+ }
+
+ //
+ // Then check that this element was declared, and push the
+ // object used to validate its content model onto our stack.
+ //
+ // This is where the recognizer gets created, if needed; if
+ // it's a "children" (elements) content model, an NDFA is
+ // created. (One recognizer is used per content type, no
+ // matter how complex that recognizer is.)
+ //
+ ElementInfo info;
+
+ info = (ElementInfo) elements.get (qName);
+ if (info == null || info.model == null) {
+ // VC: Element Valid (base clause)
+ error ("Element type '" + qName + "' was not declared");
+ contentStack.push (null);
+
+ // for less diagnostic noise, fake a declaration.
+ elementDecl (qName, "ANY");
+ } else
+ contentStack.push (info.getRecognizer (this));
+
+ //
+ // Then check each attribute present
+ //
+ int len;
+ String aname;
+ AttributeInfo ainfo;
+
+ if (atts != null)
+ len = atts.getLength ();
+ else
+ len = 0;
+
+ for (int i = 0; i < len; i++) {
+ aname = atts.getQName (i);
+
+ if (info == null
+ || (ainfo = (AttributeInfo) info.attributes.get (aname))
+ == null) {
+ // VC: Attribute Value Type
+ error ("Attribute '" + aname
+ + "' was not declared for element type " + qName);
+ continue;
+ }
+
+ String value = atts.getValue (i);
+
+ // note that "==" for type names and "#FIXED" is correct
+ // (and fast) since we've interned those literals.
+
+ if ("#FIXED" == ainfo.mode) {
+ String expanded = expandDefaultRefs (ainfo.value);
+
+ // VC: Fixed Attribute Default
+ if (!value.equals (expanded)) {
+ error ("Attribute '" + aname
+ + "' must match " + expanded
+ );
+ continue;
+ }
+ }
+
+ if ("CDATA" == ainfo.type)
+ continue;
+
+ //
+ // For all other attribute types, there are various
+ // rules to follow.
+ //
+
+ if ("ID" == ainfo.type) {
+ // VC: ID (must be a name)
+ if (isName (value, "ID attribute", aname)) {
+ if (Boolean.TRUE == ids.get (value))
+ // VC: ID (appears once)
+ error ("ID attribute " + aname
+ + " uses an ID value '" + value
+ + "' which was already declared.");
+ else
+ // any forward refs are no longer problems
+ ids.put (value, Boolean.TRUE);
+ }
+ continue;
+ }
+
+ if ("IDREF" == ainfo.type) {
+ // VC: IDREF (value must be a name)
+ if (isName (value, "IDREF attribute", aname)) {
+ // VC: IDREF (must match some ID attribute)
+ if (ids.get (value) == null)
+ // new -- assume it's a forward ref
+ ids.put (value, Boolean.FALSE);
+ }
+ continue;
+ }
+
+ if ("IDREFS" == ainfo.type) {
+ StringTokenizer tokens = new StringTokenizer (value, " ");
+
+ if (!tokens.hasMoreTokens ()) {
+ // VC: IDREF (one or more values)
+ error ("IDREFS attribute " + aname
+ + " must have at least one ID ref");
+ } else do {
+ String id = tokens.nextToken ();
+
+ // VC: IDREF (value must be a name)
+ if (isName (id, "IDREFS attribute", aname)) {
+ // VC: IDREF (must match some ID attribute)
+ if (ids.get (id) == null)
+ // new -- assume it's a forward ref
+ ids.put (id, Boolean.FALSE);
+ }
+ } while (tokens.hasMoreTokens ());
+ continue;
+ }
+
+ if ("NMTOKEN" == ainfo.type) {
+ // VC: Name Token (is a name token)
+ isNmtoken (value, "NMTOKEN attribute", aname);
+ continue;
+ }
+
+ if ("NMTOKENS" == ainfo.type) {
+ StringTokenizer tokens = new StringTokenizer (value, " ");
+
+ if (!tokens.hasMoreTokens ()) {
+ // VC: Name Token (one or more values)
+ error ("NMTOKENS attribute " + aname
+ + " must have at least one name token");
+ } else do {
+ String token = tokens.nextToken ();
+
+ // VC: Name Token (is a name token)
+ isNmtoken (token, "NMTOKENS attribute", aname);
+ } while (tokens.hasMoreTokens ());
+ continue;
+ }
+
+ if ("ENTITY" == ainfo.type) {
+ if (!unparsed.contains (value))
+ // VC: Entity Name
+ error ("Value of attribute '" + aname
+ + "' refers to unparsed entity '" + value
+ + "' which was not declared.");
+ continue;
+ }
+
+ if ("ENTITIES" == ainfo.type) {
+ StringTokenizer tokens = new StringTokenizer (value, " ");
+
+ if (!tokens.hasMoreTokens ()) {
+ // VC: Entity Name (one or more values)
+ error ("ENTITIES attribute " + aname
+ + " must have at least one name token");
+ } else do {
+ String entity = tokens.nextToken ();
+
+ if (!unparsed.contains (entity))
+ // VC: Entity Name
+ error ("Value of attribute '" + aname
+ + "' refers to unparsed entity '" + entity
+ + "' which was not declared.");
+ } while (tokens.hasMoreTokens ());
+ continue;
+ }
+
+ //
+ // check for enumerations last; more expensive
+ //
+ if (ainfo.type.charAt (0) == '(' /*)*/
+ || ainfo.type.startsWith ("NOTATION ")
+ ) {
+ // VC: Enumeration (value must be defined)
+ checkEnumeration (value, ainfo.type, aname);
+ continue;
+ }
+ }
+
+ //
+ // Last, check that all #REQUIRED attributes were provided
+ //
+ if (info != null) {
+ Hashtable table = info.attributes;
+
+ if (table.size () != 0) {
+ Enumeration e = table.keys ();
+
+ // XXX table.keys uses the heap, bleech -- slows things
+
+ while (e.hasMoreElements ()) {
+ aname = (String) e.nextElement ();
+ ainfo = (AttributeInfo) table.get (aname);
+
+ // "#REQUIRED" mode was interned in attributeDecl
+ if ("#REQUIRED" == ainfo.mode
+ && atts.getValue (aname) == null) {
+ // VC: Required Attribute
+ error ("Attribute '" + aname + "' must be specified "
+ + "for element type " + qName);
+ }
+ }
+ }
+ }
+ super.startElement (uri, localName, qName, atts);
+ }
+
+ /**
+ * <b>ContentHandler</b> Reports a validity error if the element's content
+ * model does not permit character data.
+ * Passed to the next consumer.
+ */
+ public void characters (char ch [], int start, int length)
+ throws SAXException
+ {
+ Recognizer state;
+
+ if (contentStack.empty ())
+ state = null;
+ else
+ state = (Recognizer) contentStack.peek ();
+
+ // NOTE: if this ever supports with SAX parsers that don't
+ // report ignorable whitespace as such (only XP?), this class
+ // needs to morph it into ignorableWhitespace() as needed ...
+
+ if (state != null && !state.acceptCharacters ())
+ // VC: Element Valid (clauses three, four -- see recognizer)
+ error ("Character content not allowed in element "
+ + state.type.name);
+
+ super.characters (ch, start, length);
+ }
+
+
+ /**
+ * <b>ContentHandler</b> Reports a validity error if the element's content
+ * model does not permit end-of-element yet, or a well formedness error
+ * if there was no matching startElement call.
+ * Passed to the next consumer.
+ */
+ public void endElement (String uri, String localName, String qName)
+ throws SAXException
+ {
+ try {
+ Recognizer state = (Recognizer) contentStack.pop ();
+
+ if (state != null && !state.completed ())
+ // VC: Element valid (clauses two, three, four; see Recognizer)
+ error ("Premature end for element '"
+ + state.type.name
+ + "', content model "
+ + state.type.model);
+
+ // could insist on match of start element, but that's
+ // something the input stream must to guarantee.
+
+ } catch (EmptyStackException e) {
+ fatalError ("endElement without startElement: " + qName
+ + ((uri == null)
+ ? ""
+ : ( " { '" + uri + "', " + localName + " }")));
+ }
+ super.endElement (uri, localName, qName);
+ }
+
+ /**
+ * <b>ContentHandler</b> Checks whether all ID values that were
+ * referenced have been declared, and releases all resources.
+ * Passed to the next consumer.
+ *
+ * @see #setDocumentLocator
+ */
+ public void endDocument ()
+ throws SAXException
+ {
+ for (Enumeration idNames = ids.keys ();
+ idNames.hasMoreElements ();
+ /* NOP */) {
+ String id = (String) idNames.nextElement ();
+
+ if (Boolean.FALSE == ids.get (id)) {
+ // VC: IDREF (must match ID)
+ error ("Undeclared ID value '" + id
+ + "' was referred to by an IDREF/IDREFS attribute");
+ }
+ }
+
+ resetState ();
+ super.endDocument ();
+ }
+
+
+ /** Holds per-element declarations */
+ static private final class ElementInfo
+ {
+ String name;
+ String model;
+
+ // key = attribute name; value = AttributeInfo
+ Hashtable attributes = new Hashtable (11);
+
+ ElementInfo (String n) { name = n; }
+
+ private Recognizer recognizer;
+
+ // for validating content models: one per type, shared,
+ // and constructed only on demand ... so unused elements do
+ // not need to consume resources.
+ Recognizer getRecognizer (ValidationConsumer consumer)
+ throws SAXException
+ {
+ if (recognizer == null) {
+ if ("ANY".equals (model))
+ recognizer = ANY;
+ else if ("EMPTY".equals (model))
+ recognizer = new EmptyRecognizer (this);
+ else if ('#' == model.charAt (1))
+ // n.b. this constructor does a validity check
+ recognizer = new MixedRecognizer (this, consumer);
+ else
+ recognizer = new ChildrenRecognizer (this, consumer);
+ }
+ return recognizer;
+ }
+ }
+
+ /** Holds per-attribute declarations */
+ static private final class AttributeInfo
+ {
+ String type;
+ String mode; // #REQUIRED, etc (or null)
+ String value; // or null
+ }
+
+
+ //
+ // Content model validation
+ //
+
+ static private final Recognizer ANY = new Recognizer (null);
+
+
+ // Base class defines the calls used to validate content,
+ // and supports the "ANY" content model
+ static private class Recognizer
+ {
+ final ElementInfo type;
+
+ Recognizer (ElementInfo t) { type = t; }
+
+ // return true iff character data is legal here
+ boolean acceptCharacters ()
+ throws SAXException
+ // VC: Element Valid (third and fourth clauses)
+ { return true; }
+
+ // null return = failure
+ // otherwise, next state (like an FSM)
+ // prerequisite: tested that name was declared
+ Recognizer acceptElement (String name)
+ throws SAXException
+ // VC: Element Valid (fourth clause)
+ { return this; }
+
+ // return true iff model is completed, can finish
+ boolean completed ()
+ throws SAXException
+ // VC: Element Valid (fourth clause)
+ { return true; }
+
+ public String toString ()
+ // n.b. "children" is the interesting case!
+ { return (type == null) ? "ANY" : type.model; }
+ }
+
+ // "EMPTY" content model -- no characters or elements
+ private static final class EmptyRecognizer extends Recognizer
+ {
+ public EmptyRecognizer (ElementInfo type)
+ { super (type); }
+
+ // VC: Element Valid (first clause)
+ boolean acceptCharacters ()
+ { return false; }
+
+ // VC: Element Valid (first clause)
+ Recognizer acceptElement (String name)
+ { return null; }
+ }
+
+ // "Mixed" content model -- ANY, but restricts elements
+ private static final class MixedRecognizer extends Recognizer
+ {
+ private String permitted [];
+
+ // N.B. constructor tests for duplicated element names (VC)
+ public MixedRecognizer (ElementInfo t, ValidationConsumer v)
+ throws SAXException
+ {
+ super (t);
+
+ // (#PCDATA...)* or (#PCDATA) ==> ... or empty
+ // with the "..." being "|elname|..."
+ StringTokenizer tokens = new StringTokenizer (
+ t.model.substring (8, t.model.lastIndexOf (')')),
+ "|");
+ Vector vec = new Vector ();
+
+ while (tokens.hasMoreTokens ()) {
+ String token = tokens.nextToken ();
+
+ if (vec.contains (token))
+ v.error ("element " + token
+ + " is repeated in mixed content model: "
+ + t.model);
+ else
+ vec.addElement (token.intern ());
+ }
+ permitted = new String [vec.size ()];
+ for (int i = 0; i < permitted.length; i++)
+ permitted [i] = (String) vec.elementAt (i);
+
+ // in one large machine-derived DTD sample, most of about
+ // 250 mixed content models were empty, and 25 had ten or
+ // more entries. 2 had over a hundred elements. Linear
+ // search isn't obviously wrong.
+ }
+
+ // VC: Element Valid (third clause)
+ Recognizer acceptElement (String name)
+ {
+ int length = permitted.length;
+
+ // first pass -- optimistic w.r.t. event source interning
+ // (and document validity)
+ for (int i = 0; i < length; i++)
+ if (permitted [i] == name)
+ return this;
+ // second pass -- pessimistic w.r.t. event source interning
+ for (int i = 0; i < length; i++)
+ if (permitted [i].equals (name))
+ return this;
+ return null;
+ }
+ }
+
+
+ // recognizer loop flags, see later
+ private static final int F_LOOPHEAD = 0x01;
+ private static final int F_LOOPNEXT = 0x02;
+
+ // for debugging -- used to label/count nodes in toString()
+ private static int nodeCount;
+
+ /**
+ * "Children" content model -- these are nodes in NDFA state graphs.
+ * They work in fixed space. Note that these graphs commonly have
+ * cycles, handling features such as zero-or-more and one-or-more.
+ *
+ * <p>It's readonly, so only one copy is ever needed. The content model
+ * stack may have any number of pointers into each graph, when a model
+ * happens to be needed more than once due to element nesting. Since
+ * traversing the graph just moves to another node, and never changes
+ * it, traversals never interfere with each other.
+ *
+ * <p>There is an option to report non-deterministic models. These are
+ * always XML errors, but ones which are not often reported despite the
+ * fact that they can lead to different validating parsers giving
+ * different results for the same input. (The XML spec doesn't require
+ * them to be reported.)
+ *
+ * <p><b>FIXME</b> There's currently at least one known bug here, in that
+ * it's not actually detecting the non-determinism it tries to detect.
+ * (Of the "optional.xml" test, the once-or-twice-2* tests are all non-D;
+ * maybe some others.) This may relate to the issue flagged below as
+ * "should not" happen (but it was), which showed up when patching the
+ * graph to have one exit node (or more EMPTY nodes).
+ */
+ private static final class ChildrenRecognizer extends Recognizer
+ implements Cloneable
+ {
+ // for reporting non-deterministic content models
+ // ... a waste of space if we're not reporting those!
+ // ... along with the 'model' member (in base class)
+ private ValidationConsumer consumer;
+
+ // for CHOICE nodes -- each component is an arc that
+ // accepts a different NAME (or is EMPTY indicating
+ // NDFA termination).
+ private Recognizer components [];
+
+ // for NAME/SEQUENCE nodes -- accepts that NAME and
+ // then goes to the next node (CHOICE, NAME, EMPTY).
+ private String name;
+ private Recognizer next;
+
+ // loops always point back to a CHOICE node. we mark such choice
+ // nodes (F_LOOPHEAD) for diagnostics and faster deep cloning.
+ // We also mark nodes before back pointers (F_LOOPNEXT), to ensure
+ // termination when we patch sequences and loops.
+ private int flags;
+
+
+ // prevent a needless indirection between 'this' and 'node'
+ private void copyIn (ChildrenRecognizer node)
+ {
+ // model & consumer are already set
+ components = node.components;
+ name = node.name;
+ next = node.next;
+ flags = node.flags;
+ }
+
+ // used to construct top level "children" content models,
+ public ChildrenRecognizer (ElementInfo type, ValidationConsumer vc)
+ {
+ this (vc, type);
+ populate (type.model.toCharArray (), 0);
+ patchNext (new EmptyRecognizer (type), null);
+ }
+
+ // used internally; populating is separate
+ private ChildrenRecognizer (ValidationConsumer vc, ElementInfo type)
+ {
+ super (type);
+ consumer = vc;
+ }
+
+
+ //
+ // When rewriting some graph nodes we need deep clones in one case;
+ // mostly shallow clones (what the JVM handles for us) are fine.
+ //
+ private ChildrenRecognizer shallowClone ()
+ {
+ try {
+ return (ChildrenRecognizer) clone ();
+ } catch (CloneNotSupportedException e) {
+ throw new Error ("clone");
+ }
+ }
+
+ private ChildrenRecognizer deepClone ()
+ {
+ return deepClone (new Hashtable (37));
+ }
+
+ private ChildrenRecognizer deepClone (Hashtable table)
+ {
+ ChildrenRecognizer retval;
+
+ if ((flags & F_LOOPHEAD) != 0) {
+ retval = (ChildrenRecognizer) table.get (this);
+ if (retval != null)
+ return this;
+
+ retval = shallowClone ();
+ table.put (this, retval);
+ } else
+ retval = shallowClone ();
+
+ if (next != null) {
+ if (next instanceof ChildrenRecognizer)
+ retval.next = ((ChildrenRecognizer)next)
+ .deepClone (table);
+ else if (!(next instanceof EmptyRecognizer))
+ throw new RuntimeException ("deepClone");
+ }
+
+ if (components != null) {
+ retval.components = new Recognizer [components.length];
+ for (int i = 0; i < components.length; i++) {
+ Recognizer temp = components [i];
+
+ if (temp == null)
+ retval.components [i] = null;
+ else if (temp instanceof ChildrenRecognizer)
+ retval.components [i] = ((ChildrenRecognizer)temp)
+ .deepClone (table);
+ else if (!(temp instanceof EmptyRecognizer))
+ throw new RuntimeException ("deepClone");
+ }
+ }
+
+ return retval;
+ }
+
+ // connect subgraphs, first to next (sequencing)
+ private void patchNext (Recognizer theNext, Hashtable table)
+ {
+ // backpointers must not be repatched or followed
+ if ((flags & F_LOOPNEXT) != 0)
+ return;
+
+ // XXX this table "shouldn't" be needed, right?
+ // but some choice nodes looped if it isn't there.
+ if (table != null && table.get (this) != null)
+ return;
+ if (table == null)
+ table = new Hashtable ();
+
+ // NAME/SEQUENCE
+ if (name != null) {
+ if (next == null)
+ next = theNext;
+ else if (next instanceof ChildrenRecognizer) {
+ ((ChildrenRecognizer)next).patchNext (theNext, table);
+ } else if (!(next instanceof EmptyRecognizer))
+ throw new RuntimeException ("patchNext");
+ return;
+ }
+
+ // CHOICE
+ for (int i = 0; i < components.length; i++) {
+ if (components [i] == null)
+ components [i] = theNext;
+ else if (components [i] instanceof ChildrenRecognizer) {
+ ((ChildrenRecognizer)components [i])
+ .patchNext (theNext, table);
+ } else if (!(components [i] instanceof EmptyRecognizer))
+ throw new RuntimeException ("patchNext");
+ }
+
+ if (table != null && (flags | F_LOOPHEAD) != 0)
+ table.put (this, this);
+ }
+
+ /**
+ * Parses a 'children' spec (or recursively 'cp') and makes this
+ * become a regular graph node.
+ *
+ * @return index after this particle
+ */
+ private int populate (char parseBuf [], int startPos)
+ {
+ int nextPos = startPos + 1;
+ char c;
+
+ if (nextPos < 0 || nextPos >= parseBuf.length)
+ throw new IndexOutOfBoundsException ();
+
+ // Grammar of the string is from the XML spec, but
+ // with whitespace removed by the SAX parser.
+
+ // children ::= (choice | seq) ('?' | '*' | '+')?
+ // cp ::= (Name | choice | seq) ('?' | '*' | '+')?
+ // choice ::= '(' cp ('|' choice)* ')'
+ // seq ::= '(' cp (',' choice)* ')'
+
+ // interior nodes only
+ // cp ::= name ...
+ if (parseBuf [startPos] != '('/*)*/) {
+ boolean done = false;
+ do {
+ switch (c = parseBuf [nextPos]) {
+ case '?': case '*': case '+':
+ case '|': case ',':
+ case /*(*/ ')':
+ done = true;
+ continue;
+ default:
+ nextPos++;
+ continue;
+ }
+ } while (!done);
+ name = new String (parseBuf, startPos, nextPos - startPos);
+
+ // interior OR toplevel nodes
+ // cp ::= choice ..
+ // cp ::= seq ..
+ } else {
+ // collect everything as a separate list, and merge it
+ // into "this" later if we can (SEQUENCE or singleton)
+ ChildrenRecognizer first;
+
+ first = new ChildrenRecognizer (consumer, type);
+ nextPos = first.populate (parseBuf, nextPos);
+ c = parseBuf [nextPos++];
+
+ if (c == ',' || c == '|') {
+ ChildrenRecognizer current = first;
+ char separator = c;
+ Vector v = null;
+
+ if (separator == '|') {
+ v = new Vector ();
+ v.addElement (first);
+ }
+
+ do {
+ ChildrenRecognizer link;
+
+ link = new ChildrenRecognizer (consumer, type);
+ nextPos = link.populate (parseBuf, nextPos);
+
+ if (separator == ',') {
+ current.patchNext (link, null);
+ current = link;
+ } else
+ v.addElement (link);
+
+ c = parseBuf [nextPos++];
+ } while (c == separator);
+
+ // choice ... collect everything into one array.
+ if (separator == '|') {
+ // assert v.size() > 1
+ components = new Recognizer [v.size ()];
+ for (int i = 0; i < components.length; i++) {
+ components [i] = (Recognizer)
+ v.elementAt (i);
+ }
+ // assert flags == 0
+
+ // sequence ... merge into "this" to be smaller.
+ } else
+ copyIn (first);
+
+ // treat singletons like one-node sequences.
+ } else
+ copyIn (first);
+
+ if (c != /*(*/ ')')
+ throw new RuntimeException ("corrupt content model");
+ }
+
+ //
+ // Arity is optional, and the root of all fun. We keep the
+ // FSM state graph simple by only having NAME/SEQUENCE and
+ // CHOICE nodes (or EMPTY to terminate a model), easily
+ // evaluated. So we rewrite each node that has arity, using
+ // those primitives. We create loops here, if needed.
+ //
+ if (nextPos < parseBuf.length) {
+ c = parseBuf [nextPos];
+ if (c == '?' || c == '*' || c == '+') {
+ nextPos++;
+
+ // Rewrite 'zero-or-one' "?" arity to a CHOICE:
+ // - SEQUENCE (clone, what's next)
+ // - or, what's next
+ // Size cost: N --> N + 1
+ if (c == '?') {
+ Recognizer once = shallowClone ();
+
+ components = new Recognizer [2];
+ components [0] = once;
+ // components [1] initted to null
+ name = null;
+ next = null;
+ flags = 0;
+
+
+ // Rewrite 'zero-or-more' "*" arity to a CHOICE.
+ // - LOOP (clone, back to this CHOICE)
+ // - or, what's next
+ // Size cost: N --> N + 1
+ } else if (c == '*') {
+ ChildrenRecognizer loop = shallowClone ();
+
+ loop.patchNext (this, null);
+ loop.flags |= F_LOOPNEXT;
+ flags = F_LOOPHEAD;
+
+ components = new Recognizer [2];
+ components [0] = loop;
+ // components [1] initted to null
+ name = null;
+ next = null;
+
+
+ // Rewrite 'one-or-more' "+" arity to a SEQUENCE.
+ // Basically (a)+ --> ((a),(a)*).
+ // - this
+ // - CHOICE
+ // * LOOP (clone, back to the CHOICE)
+ // * or, whatever's next
+ // Size cost: N --> 2N + 1
+ } else if (c == '+') {
+ ChildrenRecognizer loop = deepClone ();
+ ChildrenRecognizer choice;
+
+ choice = new ChildrenRecognizer (consumer, type);
+ loop.patchNext (choice, null);
+ loop.flags |= F_LOOPNEXT;
+ choice.flags = F_LOOPHEAD;
+
+ choice.components = new Recognizer [2];
+ choice.components [0] = loop;
+ // choice.components [1] initted to null
+ // choice.name, choice.next initted to null
+
+ patchNext (choice, null);
+ }
+ }
+ }
+
+ return nextPos;
+ }
+
+ // VC: Element Valid (second clause)
+ boolean acceptCharacters ()
+ { return false; }
+
+ // VC: Element Valid (second clause)
+ Recognizer acceptElement (String type)
+ throws SAXException
+ {
+ // NAME/SEQUENCE
+ if (name != null) {
+ if (name.equals (type))
+ return next;
+ return null;
+ }
+
+ // CHOICE ... optionally reporting nondeterminism we
+ // run across. we won't check out every transition
+ // for nondeterminism; only the ones we follow.
+ Recognizer retval = null;
+
+ for (int i = 0; i < components.length; i++) {
+ Recognizer temp = components [i].acceptElement (type);
+
+ if (temp == null)
+ continue;
+ else if (!warnNonDeterministic)
+ return temp;
+ else if (retval == null)
+ retval = temp;
+ else if (retval != temp)
+ consumer.error ("Content model " + this.type.model
+ + " is non-deterministic for " + type);
+ }
+ return retval;
+ }
+
+ // VC: Element Valid (second clause)
+ boolean completed ()
+ throws SAXException
+ {
+ // expecting a specific element
+ if (name != null)
+ return false;
+
+ // choice, some sequences
+ for (int i = 0; i < components.length; i++) {
+ if (components [i].completed ())
+ return true;
+ }
+
+ return false;
+ }
+
+/** /
+ // FOR DEBUGGING ... flattens the graph for printing.
+
+ public String toString ()
+ {
+ StringBuffer buf = new StringBuffer ();
+
+ // only one set of loop labels can be generated
+ // at a time...
+ synchronized (ANY) {
+ nodeCount = 0;
+
+ toString (buf, new Hashtable ());
+ return buf.toString ();
+ }
+ }
+
+ private void toString (StringBuffer buf, Hashtable table)
+ {
+ // When we visit a node, label and count it.
+ // Nodes are never visited/counted more than once.
+ // For small models labels waste space, but if arity
+ // mappings were used the savings are substantial.
+ // (Plus, the output can be more readily understood.)
+ String temp = (String) table.get (this);
+
+ if (temp != null) {
+ buf.append ('{');
+ buf.append (temp);
+ buf.append ('}');
+ return;
+ } else {
+ StringBuffer scratch = new StringBuffer (15);
+
+ if ((flags & F_LOOPHEAD) != 0)
+ scratch.append ("loop");
+ else
+ scratch.append ("node");
+ scratch.append ('-');
+ scratch.append (++nodeCount);
+ temp = scratch.toString ();
+
+ table.put (this, temp);
+ buf.append ('[');
+ buf.append (temp);
+ buf.append (']');
+ buf.append (':');
+ }
+
+ // NAME/SEQUENCE
+ if (name != null) {
+ // n.b. some output encodings turn some name chars into '?'
+ // e.g. with Japanese names and ASCII output
+ buf.append (name);
+ if (components != null) // bug!
+ buf.append ('$');
+ if (next == null)
+ buf.append (",*");
+ else if (next instanceof EmptyRecognizer) // patch-to-next
+ buf.append (",{}");
+ else if (next instanceof ChildrenRecognizer) {
+ buf.append (',');
+ ((ChildrenRecognizer)next).toString (buf, table);
+ } else // bug!
+ buf.append (",+");
+ return;
+ }
+
+ // CHOICE
+ buf.append ("<");
+ for (int i = 0; i < components.length; i++) {
+ if (i != 0)
+ buf.append ("|");
+ if (components [i] instanceof EmptyRecognizer) {
+ buf.append ("{}");
+ } else if (components [i] == null) { // patch-to-next
+ buf.append ('*');
+ } else {
+ ChildrenRecognizer r;
+
+ r = (ChildrenRecognizer) components [i];
+ r.toString (buf, table);
+ }
+ }
+ buf.append (">");
+ }
+/**/
+ }
+}
diff --git a/external/jaxp/source/gnu/xml/pipeline/WellFormednessFilter.java b/external/jaxp/source/gnu/xml/pipeline/WellFormednessFilter.java
new file mode 100644
index 000000000..b0edec589
--- /dev/null
+++ b/external/jaxp/source/gnu/xml/pipeline/WellFormednessFilter.java
@@ -0,0 +1,352 @@
+/*
+ * $Id: WellFormednessFilter.java,v 1.1 2003-02-01 02:10:22 cbj Exp $
+ * Copyright (C) 1999-2001 David Brownell
+ *
+ * This file is part of GNU JAXP, a library.
+ *
+ * GNU JAXP is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * GNU JAXP is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ * As a special exception, if you link this library with other files to
+ * produce an executable, this library does not by itself cause the
+ * resulting executable to be covered by the GNU General Public License.
+ * This exception does not however invalidate any other reasons why the
+ * executable file might be covered by the GNU General Public License.
+ */
+
+package gnu.xml.pipeline;
+
+import java.util.EmptyStackException;
+import java.util.Stack;
+
+import org.xml.sax.*;
+import org.xml.sax.ext.*;
+
+
+/**
+ * This filter reports fatal exceptions in the case of event streams that
+ * are not well formed. The rules currently tested include: <ul>
+ *
+ * <li>setDocumentLocator ... may be called only before startDocument
+ *
+ * <li>startDocument/endDocument ... must be paired, and all other
+ * calls (except setDocumentLocator) must be nested within these.
+ *
+ * <li>startElement/endElement ... must be correctly paired, and
+ * may never appear within CDATA sections.
+ *
+ * <li>comment ... can't contain "--"
+ *
+ * <li>character data ... can't contain "]]&gt;"
+ *
+ * <li>whitespace ... can't contain CR
+ *
+ * <li>whitespace and character data must be within an element
+ *
+ * <li>processing instruction ... can't contain "?&gt;" or CR
+ *
+ * <li>startCDATA/endCDATA ... must be correctly paired.
+ *
+ * </ul>
+ *
+ * <p> Other checks for event stream correctness may be provided in
+ * the future. For example, insisting that
+ * entity boundaries nest correctly,
+ * namespace scopes nest correctly,
+ * namespace values never contain relative URIs,
+ * attributes don't have "&lt;" characters;
+ * and more.
+ *
+ * @author David Brownell
+ * @version $Date: 2003-02-01 02:10:22 $
+ */
+public final class WellFormednessFilter extends EventFilter
+{
+ private boolean startedDoc;
+ private Stack elementStack = new Stack ();
+ private boolean startedCDATA;
+ private String dtdState = "before";
+
+
+ /**
+ * Swallows all events after performing well formedness checks.
+ */
+ // constructor used by PipelineFactory
+ public WellFormednessFilter ()
+ { this (null); }
+
+
+ /**
+ * Passes events through to the specified consumer, after first
+ * processing them.
+ */
+ // constructor used by PipelineFactory
+ public WellFormednessFilter (EventConsumer consumer)
+ {
+ super (consumer);
+
+ setContentHandler (this);
+ setDTDHandler (this);
+
+ try {
+ setProperty (LEXICAL_HANDLER, this);
+ } catch (SAXException e) { /* can't happen */ }
+ }
+
+ /**
+ * Resets state as if any preceding event stream was well formed.
+ * Particularly useful if it ended through some sort of error,
+ * and the endDocument call wasn't made.
+ */
+ public void reset ()
+ {
+ startedDoc = false;
+ startedCDATA = false;
+ elementStack.removeAllElements ();
+ }
+
+
+ private SAXParseException getException (String message)
+ {
+ SAXParseException e;
+ Locator locator = getDocumentLocator ();
+
+ if (locator == null)
+ return new SAXParseException (message, null, null, -1, -1);
+ else
+ return new SAXParseException (message, locator);
+ }
+
+ private void fatalError (String message)
+ throws SAXException
+ {
+ SAXParseException e = getException (message);
+ ErrorHandler handler = getErrorHandler ();
+
+ if (handler != null)
+ handler.fatalError (e);
+ throw e;
+ }
+
+ /**
+ * Throws an exception when called after startDocument.
+ *
+ * @param locator the locator, to be used in error reporting or relative
+ * URI resolution.
+ *
+ * @exception IllegalStateException when called after the document
+ * has already been started
+ */
+ public void setDocumentLocator (Locator locator)
+ {
+ if (startedDoc)
+ throw new IllegalStateException (
+ "setDocumentLocator called after startDocument");
+ super.setDocumentLocator (locator);
+ }
+
+ public void startDocument () throws SAXException
+ {
+ if (startedDoc)
+ fatalError ("startDocument called more than once");
+ startedDoc = true;
+ startedCDATA = false;
+ elementStack.removeAllElements ();
+ super.startDocument ();
+ }
+
+ public void startElement (
+ String uri, String localName,
+ String qName, Attributes atts
+ ) throws SAXException
+ {
+ if (!startedDoc)
+ fatalError ("callback outside of document?");
+ if ("inside".equals (dtdState))
+ fatalError ("element inside DTD?");
+ else
+ dtdState = "after";
+ if (startedCDATA)
+ fatalError ("element inside CDATA section");
+ if (qName == null || "".equals (qName))
+ fatalError ("startElement name missing");
+ elementStack.push (qName);
+ super.startElement (uri, localName, qName, atts);
+ }
+
+ public void endElement (String uri, String localName, String qName)
+ throws SAXException
+ {
+ if (!startedDoc)
+ fatalError ("callback outside of document?");
+ if (startedCDATA)
+ fatalError ("element inside CDATA section");
+ if (qName == null || "".equals (qName))
+ fatalError ("endElement name missing");
+
+ try {
+ String top = (String) elementStack.pop ();
+
+ if (!qName.equals (top))
+ fatalError ("<" + top + " ...>...</" + qName + ">");
+ // XXX could record/test namespace info
+ } catch (EmptyStackException e) {
+ fatalError ("endElement without startElement: </" + qName + ">");
+ }
+ super.endElement (uri, localName, qName);
+ }
+
+ public void endDocument () throws SAXException
+ {
+ if (!startedDoc)
+ fatalError ("callback outside of document?");
+ dtdState = "before";
+ startedDoc = false;
+ super.endDocument ();
+ }
+
+
+ public void startDTD (String root, String publicId, String systemId)
+ throws SAXException
+ {
+ if (!startedDoc)
+ fatalError ("callback outside of document?");
+ if ("before" != dtdState)
+ fatalError ("two DTDs?");
+ if (!elementStack.empty ())
+ fatalError ("DTD must precede root element");
+ dtdState = "inside";
+ super.startDTD (root, publicId, systemId);
+ }
+
+ public void notationDecl (String name, String publicId, String systemId)
+ throws SAXException
+ {
+// FIXME: not all parsers will report startDTD() ...
+// we'd rather insist we're "inside".
+ if ("after" == dtdState)
+ fatalError ("not inside DTD");
+ super.notationDecl (name, publicId, systemId);
+ }
+
+ public void unparsedEntityDecl (String name,
+ String publicId, String systemId, String notationName)
+ throws SAXException
+ {
+// FIXME: not all parsers will report startDTD() ...
+// we'd rather insist we're "inside".
+ if ("after" == dtdState)
+ fatalError ("not inside DTD");
+ super.unparsedEntityDecl (name, publicId, systemId, notationName);
+ }
+
+ // FIXME: add the four DeclHandler calls too
+
+ public void endDTD ()
+ throws SAXException
+ {
+ if (!startedDoc)
+ fatalError ("callback outside of document?");
+ if ("inside" != dtdState)
+ fatalError ("DTD ends without start?");
+ dtdState = "after";
+ super.endDTD ();
+ }
+
+ public void characters (char ch [], int start, int length)
+ throws SAXException
+ {
+ int here = start, end = start + length;
+ if (elementStack.empty ())
+ fatalError ("characters must be in an element");
+ while (here < end) {
+ if (ch [here++] != ']')
+ continue;
+ if (here == end) // potential problem ...
+ continue;
+ if (ch [here++] != ']')
+ continue;
+ if (here == end) // potential problem ...
+ continue;
+ if (ch [here++] == '>')
+ fatalError ("character data can't contain \"]]>\"");
+ }
+ super.characters (ch, start, length);
+ }
+
+ public void ignorableWhitespace (char ch [], int start, int length)
+ throws SAXException
+ {
+ int here = start, end = start + length;
+ if (elementStack.empty ())
+ fatalError ("characters must be in an element");
+ while (here < end) {
+ if (ch [here++] == '\r')
+ fatalError ("whitespace can't contain CR");
+ }
+ super.ignorableWhitespace (ch, start, length);
+ }
+
+ public void processingInstruction (String target, String data)
+ throws SAXException
+ {
+ if (data.indexOf ('\r') > 0)
+ fatalError ("PIs can't contain CR");
+ if (data.indexOf ("?>") > 0)
+ fatalError ("PIs can't contain \"?>\"");
+ }
+
+ public void comment (char ch [], int start, int length)
+ throws SAXException
+ {
+ if (!startedDoc)
+ fatalError ("callback outside of document?");
+ if (startedCDATA)
+ fatalError ("comments can't nest in CDATA");
+ int here = start, end = start + length;
+ while (here < end) {
+ if (ch [here] == '\r')
+ fatalError ("comments can't contain CR");
+ if (ch [here++] != '-')
+ continue;
+ if (here == end)
+ fatalError ("comments can't end with \"--->\"");
+ if (ch [here++] == '-')
+ fatalError ("comments can't contain \"--\"");
+ }
+ super.comment (ch, start, length);
+ }
+
+ public void startCDATA ()
+ throws SAXException
+ {
+ if (!startedDoc)
+ fatalError ("callback outside of document?");
+ if (startedCDATA)
+ fatalError ("CDATA starts can't nest");
+ startedCDATA = true;
+ super.startCDATA ();
+ }
+
+ public void endCDATA ()
+ throws SAXException
+ {
+ if (!startedDoc)
+ fatalError ("callback outside of document?");
+ if (!startedCDATA)
+ fatalError ("CDATA end without start?");
+ startedCDATA = false;
+ super.endCDATA ();
+ }
+}
diff --git a/external/jaxp/source/gnu/xml/pipeline/XIncludeFilter.java b/external/jaxp/source/gnu/xml/pipeline/XIncludeFilter.java
new file mode 100644
index 000000000..e629542de
--- /dev/null
+++ b/external/jaxp/source/gnu/xml/pipeline/XIncludeFilter.java
@@ -0,0 +1,573 @@
+/*
+ * $Id: XIncludeFilter.java,v 1.1 2003-02-01 02:10:22 cbj Exp $
+ * Copyright (C) 2001-2002 David Brownell
+ *
+ * This file is part of GNU JAXP, a library.
+ *
+ * GNU JAXP is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * GNU JAXP is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ * As a special exception, if you link this library with other files to
+ * produce an executable, this library does not by itself cause the
+ * resulting executable to be covered by the GNU General Public License.
+ * This exception does not however invalidate any other reasons why the
+ * executable file might be covered by the GNU General Public License.
+ */
+
+package gnu.xml.pipeline;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.InputStreamReader;
+import java.net.URL;
+import java.net.URLConnection;
+import java.util.Enumeration;
+import java.util.Hashtable;
+import java.util.Stack;
+import java.util.Vector;
+
+import org.xml.sax.Attributes;
+import org.xml.sax.ErrorHandler;
+import org.xml.sax.InputSource;
+import org.xml.sax.Locator;
+import org.xml.sax.SAXException;
+import org.xml.sax.SAXParseException;
+import org.xml.sax.XMLReader;
+import org.xml.sax.helpers.XMLReaderFactory;
+
+import gnu.xml.util.Resolver;
+
+
+
+// $Id: XIncludeFilter.java,v 1.1 2003-02-01 02:10:22 cbj Exp $
+
+/**
+ * Filter to process an XPointer-free subset of
+ * <a href="http://www.w3.org/TR/xinclude">XInclude</a>, supporting its
+ * use as a kind of replacement for parsed general entities.
+ * XInclude works much like the <code>#include</code> of C/C++ but
+ * works for XML documents as well as unparsed text files.
+ * Restrictions from the 17-Sept-2002 CR draft of XInclude are as follows:
+ *
+ * <ul>
+ *
+ * <li> URIs must not include fragment identifiers.
+ * The CR specifies support for XPointer <em>element()</em> fragment IDs,
+ * which is not currently implemented here.
+ *
+ * <li> <em>xi:fallback</em> handling of resource errors is not
+ * currently supported.
+ *
+ * <li> DTDs are not supported in included files, since the SAX DTD events
+ * must have completely preceded any included file.
+ * The CR explicitly allows the DTD related portions of the infoset to
+ * grow as an effect of including XML documents.
+ *
+ * <li> <em>xml:base</em> fixup isn't done.
+ *
+ * </ul>
+ *
+ * <p> XML documents that are included will normally be processed using
+ * the default SAX namespace rules, meaning that prefix information may
+ * be discarded. This may be changed with {@link #setSavingPrefixes
+ * setSavingPrefixes()}. <em>You are strongly advised to do this.</em>
+ *
+ * <p> Note that XInclude allows highly incompatible implementations, which
+ * are specialized to handle application-specific infoset extensions. Some
+ * such implementations can be implemented by subclassing this one, but
+ * they may only be substituted in applications at "user option".
+ *
+ * <p>TBD: "IURI" handling.
+ *
+ * @author David Brownell
+ * @version $Date: 2003-02-01 02:10:22 $
+ */
+public class XIncludeFilter extends EventFilter implements Locator
+{
+ private Hashtable extEntities = new Hashtable (5, 5);
+ private int ignoreCount;
+ private Stack uris = new Stack ();
+ private Locator locator;
+ private Vector inclusions = new Vector (5, 5);
+ private boolean savingPrefixes;
+
+ /**
+ */
+ public XIncludeFilter (EventConsumer next)
+ throws SAXException
+ {
+ super (next);
+ setContentHandler (this);
+ // DTDHandler callbacks pass straight through
+ setProperty (DECL_HANDLER, this);
+ setProperty (LEXICAL_HANDLER, this);
+ }
+
+ private void fatal (SAXParseException e) throws SAXException
+ {
+ ErrorHandler eh;
+
+ eh = getErrorHandler ();
+ if (eh != null)
+ eh.fatalError (e);
+ throw e;
+ }
+
+ /**
+ * Passes "this" down the filter chain as a proxy locator.
+ */
+ public void setDocumentLocator (Locator locator)
+ {
+ this.locator = locator;
+ super.setDocumentLocator (this);
+ }
+
+ /** Used for proxy locator; do not call directly. */
+ public String getSystemId ()
+ { return (locator == null) ? null : locator.getSystemId (); }
+ /** Used for proxy locator; do not call directly. */
+ public String getPublicId ()
+ { return (locator == null) ? null : locator.getPublicId (); }
+ /** Used for proxy locator; do not call directly. */
+ public int getLineNumber ()
+ { return (locator == null) ? -1 : locator.getLineNumber (); }
+ /** Used for proxy locator; do not call directly. */
+ public int getColumnNumber ()
+ { return (locator == null) ? -1 : locator.getColumnNumber (); }
+
+ /**
+ * Assigns the flag controlling the setting of the SAX2
+ * <em>namespace-prefixes</em> flag.
+ */
+ public void setSavingPrefixes (boolean flag)
+ { savingPrefixes = flag; }
+
+ /**
+ * Returns the flag controlling the setting of the SAX2
+ * <em>namespace-prefixes</em> flag when parsing included documents.
+ * The default value is the SAX2 default (false), which discards
+ * information that can be useful.
+ */
+ public boolean isSavingPrefixes ()
+ { return savingPrefixes; }
+
+ //
+ // Two mechanisms are interacting here.
+ //
+ // - XML Base implies a stack of base URIs, updated both by
+ // "real entity" boundaries and element boundaries.
+ //
+ // - Active "Real Entities" (for document and general entities,
+ // and by xincluded files) are tracked to prevent circular
+ // inclusions.
+ //
+ private String addMarker (String uri)
+ throws SAXException
+ {
+ if (locator != null && locator.getSystemId () != null)
+ uri = locator.getSystemId ();
+
+ // guard against InputSource objects without system IDs
+ if (uri == null)
+ fatal (new SAXParseException ("Entity URI is unknown", locator));
+
+ try {
+ URL url = new URL (uri);
+
+ uri = url.toString ();
+ if (inclusions.contains (uri))
+ fatal (new SAXParseException (
+ "XInclude, circular inclusion", locator));
+ inclusions.addElement (uri);
+ uris.push (url);
+ } catch (IOException e) {
+ // guard against illegal relative URIs (Xerces)
+ fatal (new SAXParseException ("parser bug: relative URI",
+ locator, e));
+ }
+ return uri;
+ }
+
+ private void pop (String uri)
+ {
+ inclusions.removeElement (uri);
+ uris.pop ();
+ }
+
+ //
+ // Document entity boundaries get both treatments.
+ //
+ public void startDocument () throws SAXException
+ {
+ ignoreCount = 0;
+ addMarker (null);
+ super.startDocument ();
+ }
+
+ public void endDocument () throws SAXException
+ {
+ inclusions.setSize (0);
+ extEntities.clear ();
+ uris.setSize (0);
+ super.endDocument ();
+ }
+
+ //
+ // External general entity boundaries get both treatments.
+ //
+ public void externalEntityDecl (String name,
+ String publicId, String systemId)
+ throws SAXException
+ {
+ if (name.charAt (0) == '%')
+ return;
+ try {
+ URL url = new URL (locator.getSystemId ());
+ systemId = new URL (url, systemId).toString ();
+ } catch (IOException e) {
+ // what could we do?
+ }
+ extEntities.put (name, systemId);
+ }
+
+ public void startEntity (String name)
+ throws SAXException
+ {
+ if (ignoreCount != 0) {
+ ignoreCount++;
+ return;
+ }
+
+ String uri = (String) extEntities.get (name);
+ if (uri != null)
+ addMarker (uri);
+ super.startEntity (name);
+ }
+
+ public void endEntity (String name)
+ throws SAXException
+ {
+ if (ignoreCount != 0) {
+ if (--ignoreCount != 0)
+ return;
+ }
+
+ String uri = (String) extEntities.get (name);
+
+ if (uri != null)
+ pop (uri);
+ super.endEntity (name);
+ }
+
+ //
+ // element boundaries only affect the base URI stack,
+ // unless they're XInclude elements.
+ //
+ public void
+ startElement (String uri, String localName, String qName, Attributes atts)
+ throws SAXException
+ {
+ if (ignoreCount != 0) {
+ ignoreCount++;
+ return;
+ }
+
+ URL baseURI = (URL) uris.peek ();
+ String base;
+
+ base = atts.getValue ("http://www.w3.org/XML/1998/namespace", "base");
+ if (base == null)
+ uris.push (baseURI);
+ else {
+ URL url;
+
+ if (base.indexOf ('#') != -1)
+ fatal (new SAXParseException (
+ "xml:base with fragment: " + base,
+ locator));
+
+ try {
+ baseURI = new URL (baseURI, base);
+ uris.push (baseURI);
+ } catch (Exception e) {
+ fatal (new SAXParseException (
+ "xml:base with illegal uri: " + base,
+ locator, e));
+ }
+ }
+
+ if (!"http://www.w3.org/2001/XInclude".equals (uri)) {
+ super.startElement (uri, localName, qName, atts);
+ return;
+ }
+
+ if ("include".equals (localName)) {
+ String href = atts.getValue ("href");
+ String parse = atts.getValue ("parse");
+ String encoding = atts.getValue ("encoding");
+ URL url = (URL) uris.peek ();
+ SAXParseException x = null;
+
+ if (href == null)
+ fatal (new SAXParseException (
+ "XInclude missing href",
+ locator));
+ if (href.indexOf ('#') != -1)
+ fatal (new SAXParseException (
+ "XInclude with fragment: " + href,
+ locator));
+
+ if (parse == null || "xml".equals (parse))
+ x = xinclude (url, href);
+ else if ("text".equals (parse))
+ x = readText (url, href, encoding);
+ else
+ fatal (new SAXParseException (
+ "unknown XInclude parsing mode: " + parse,
+ locator));
+ if (x == null) {
+ // strip out all child content
+ ignoreCount++;
+ return;
+ }
+
+ // FIXME the 17-Sept-2002 CR of XInclude says we "must"
+ // use xi:fallback elements to handle resource errors,
+ // if they exist.
+ fatal (x);
+
+ } else if ("fallback".equals (localName)) {
+ fatal (new SAXParseException (
+ "illegal top level XInclude 'fallback' element",
+ locator));
+ } else {
+ ErrorHandler eh = getErrorHandler ();
+
+ // CR doesn't say this is an error
+ if (eh != null)
+ eh.warning (new SAXParseException (
+ "unrecognized toplevel XInclude element: " + localName,
+ locator));
+ super.startElement (uri, localName, qName, atts);
+ }
+ }
+
+ public void endElement (String uri, String localName, String qName)
+ throws SAXException
+ {
+ if (ignoreCount != 0) {
+ if (--ignoreCount != 0)
+ return;
+ }
+
+ uris.pop ();
+ if (!("http://www.w3.org/2001/XInclude".equals (uri)
+ && "include".equals (localName)))
+ super.endElement (uri, localName, qName);
+ }
+
+ //
+ // ignore all content within non-empty xi:include elements
+ //
+ public void characters (char ch [], int start, int length)
+ throws SAXException
+ {
+ if (ignoreCount == 0)
+ super.characters (ch, start, length);
+ }
+
+ public void processingInstruction (String target, String value)
+ throws SAXException
+ {
+ if (ignoreCount == 0)
+ super.processingInstruction (target, value);
+ }
+
+ public void ignorableWhitespace (char ch [], int start, int length)
+ throws SAXException
+ {
+ if (ignoreCount == 0)
+ super.ignorableWhitespace (ch, start, length);
+ }
+
+ public void comment (char ch [], int start, int length)
+ throws SAXException
+ {
+ if (ignoreCount == 0)
+ super.comment (ch, start, length);
+ }
+
+ public void startCDATA () throws SAXException
+ {
+ if (ignoreCount == 0)
+ super.startCDATA ();
+ }
+
+ public void endCDATA () throws SAXException
+ {
+ if (ignoreCount == 0)
+ super.endCDATA ();
+ }
+
+ public void startPrefixMapping (String prefix, String uri)
+ throws SAXException
+ {
+ if (ignoreCount == 0)
+ super.startPrefixMapping (prefix, uri);
+ }
+
+ public void endPrefixMapping (String prefix) throws SAXException
+ {
+ if (ignoreCount == 0)
+ super.endPrefixMapping (prefix);
+ }
+
+ public void skippedEntity (String name) throws SAXException
+ {
+ if (ignoreCount == 0)
+ super.skippedEntity (name);
+ }
+
+ // JDK 1.1 seems to need it to be done this way, sigh
+ void setLocator (Locator l) { locator = l; }
+ Locator getLocator () { return locator; }
+
+
+ //
+ // for XIncluded entities, manage the current locator and
+ // filter out events that would be incorrect to report
+ //
+ private class Scrubber extends EventFilter
+ {
+ Scrubber (EventFilter f)
+ throws SAXException
+ {
+ // delegation passes to next in chain
+ super (f);
+
+ // process all content events
+ setContentHandler (this);
+ setProperty (LEXICAL_HANDLER, this);
+
+ // drop all DTD events
+ setDTDHandler (null);
+ setProperty (DECL_HANDLER, null);
+ }
+
+ // maintain proxy locator
+ // only one startDocument()/endDocument() pair per event stream
+ public void setDocumentLocator (Locator l)
+ { setLocator (l); }
+ public void startDocument ()
+ { }
+ public void endDocument ()
+ { }
+
+ private void reject (String message) throws SAXException
+ { fatal (new SAXParseException (message, getLocator ())); }
+
+ // only the DTD from the "base document" gets reported
+ public void startDTD (String root, String publicId, String systemId)
+ throws SAXException
+ { reject ("XIncluded DTD: " + systemId); }
+ public void endDTD ()
+ throws SAXException
+ { reject ("XIncluded DTD"); }
+ // ... so this should never happen
+ public void skippedEntity (String name) throws SAXException
+ { reject ("XInclude skipped entity: " + name); }
+
+ // since we rejected DTDs, only builtin entities can be reported
+ }
+
+ // <xi:include parse='xml' ...>
+ // relative to the base URI passed
+ private SAXParseException xinclude (URL url, String href)
+ throws SAXException
+ {
+ XMLReader helper;
+ Scrubber scrubber;
+ Locator savedLocator = locator;
+
+ // start with a parser acting just like our input
+ // modulo DTD-ish stuff (validation flag, entity resolver)
+ helper = XMLReaderFactory.createXMLReader ();
+ helper.setErrorHandler (getErrorHandler ());
+ helper.setFeature (FEATURE_URI + "namespace-prefixes", true);
+
+ // Set up the proxy locator and event filter.
+ scrubber = new Scrubber (this);
+ locator = null;
+ bind (helper, scrubber);
+
+ // Merge the included document, except its DTD
+ try {
+ url = new URL (url, href);
+ href = url.toString ();
+
+ if (inclusions.contains (href))
+ fatal (new SAXParseException (
+ "XInclude, circular inclusion", locator));
+
+ inclusions.addElement (href);
+ uris.push (url);
+ helper.parse (new InputSource (href));
+ return null;
+ } catch (java.io.IOException e) {
+ return new SAXParseException (href, locator, e);
+ } finally {
+ pop (href);
+ locator = savedLocator;
+ }
+ }
+
+ // <xi:include parse='text' ...>
+ // relative to the base URI passed
+ private SAXParseException readText (URL url, String href, String encoding)
+ throws SAXException
+ {
+ InputStream in = null;
+
+ try {
+ URLConnection conn;
+ InputStreamReader reader;
+ char buf [] = new char [4096];
+ int count;
+
+ url = new URL (url, href);
+ conn = url.openConnection ();
+ in = conn.getInputStream ();
+ if (encoding == null)
+ encoding = Resolver.getEncoding (conn.getContentType ());
+ if (encoding == null) {
+ ErrorHandler eh = getErrorHandler ();
+ if (eh != null)
+ eh.warning (new SAXParseException (
+ "guessing text encoding for URL: " + url,
+ locator));
+ reader = new InputStreamReader (in);
+ } else
+ reader = new InputStreamReader (in, encoding);
+
+ while ((count = reader.read (buf, 0, buf.length)) != -1)
+ super.characters (buf, 0, count);
+ in.close ();
+ return null;
+ } catch (IOException e) {
+ return new SAXParseException (
+ "can't XInclude text",
+ locator, e);
+ }
+ }
+}
diff --git a/external/jaxp/source/gnu/xml/pipeline/XsltFilter.java b/external/jaxp/source/gnu/xml/pipeline/XsltFilter.java
new file mode 100644
index 000000000..a3cd447b8
--- /dev/null
+++ b/external/jaxp/source/gnu/xml/pipeline/XsltFilter.java
@@ -0,0 +1,122 @@
+/*
+ * $Id: XsltFilter.java,v 1.1 2003-02-01 02:10:22 cbj Exp $
+ * Copyright (C) 2001 David Brownell
+ *
+ * This file is part of GNU JAXP, a library.
+ *
+ * GNU JAXP is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * GNU JAXP is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ * As a special exception, if you link this library with other files to
+ * produce an executable, this library does not by itself cause the
+ * resulting executable to be covered by the GNU General Public License.
+ * This exception does not however invalidate any other reasons why the
+ * executable file might be covered by the GNU General Public License.
+ */
+
+package gnu.xml.pipeline;
+
+import java.io.IOException;
+
+import javax.xml.transform.TransformerFactory;
+import javax.xml.transform.TransformerConfigurationException;
+import javax.xml.transform.sax.*;
+import javax.xml.transform.stream.StreamSource;
+
+import org.xml.sax.ContentHandler;
+import org.xml.sax.SAXException;
+import org.xml.sax.ext.LexicalHandler;
+
+
+/**
+ * Packages an XSLT transform as a pipeline component.
+ * Note that all DTD events (callbacks to DeclHandler and DTDHandler
+ * interfaces) are discarded, although XSLT transforms may be set up to
+ * use the LexicalHandler to write DTDs with only an external subset.
+ * Not every XSLT engine will necessarily be usable with this filter,
+ * but current versions of
+ * <a href="http://saxon.sourceforge.net">SAXON</a> and
+ * <a href="http://xml.apache.org/xalan-j">Xalan</a> should work well.
+ *
+ * @see TransformerFactory
+ *
+ * @author David Brownell
+ * @version $Date: 2003-02-01 02:10:22 $
+ */
+final public class XsltFilter extends EventFilter
+{
+ /**
+ * Creates a filter that performs the specified transform.
+ * Uses the JAXP 1.1 interfaces to access the default XSLT
+ * engine configured for in the current execution context,
+ * and parses the stylesheet without custom EntityResolver
+ * or ErrorHandler support.
+ *
+ * @param stylesheet URI for the stylesheet specifying the
+ * XSLT transform
+ * @param next provides the ContentHandler and LexicalHandler
+ * to receive XSLT output.
+ * @exception SAXException if the stylesheet can't be parsed
+ * @exception IOException if there are difficulties
+ * bootstrapping the XSLT engine, such as it not supporting
+ * SAX well enough to use this way.
+ */
+ public XsltFilter (String stylesheet, EventConsumer next)
+ throws SAXException, IOException
+ {
+ // First, get a transformer with the stylesheet preloaded
+ TransformerFactory tf = null;
+ TransformerHandler th;
+
+ try {
+ SAXTransformerFactory stf;
+
+ tf = TransformerFactory.newInstance ();
+ if (!tf.getFeature (SAXTransformerFactory.FEATURE) // sax inputs
+ || !tf.getFeature (SAXResult.FEATURE) // sax outputs
+ || !tf.getFeature (StreamSource.FEATURE) // stylesheet
+ )
+ throw new IOException ("XSLT factory ("
+ + tf.getClass ().getName ()
+ + ") does not support SAX");
+ stf = (SAXTransformerFactory) tf;
+ th = stf.newTransformerHandler (new StreamSource (stylesheet));
+ } catch (TransformerConfigurationException e) {
+ throw new IOException ("XSLT factory ("
+ + (tf == null
+ ? "none available"
+ : tf.getClass ().getName ())
+ + ") configuration error, "
+ + e.getMessage ()
+ );
+ }
+
+ // Hook its outputs up to the pipeline ...
+ SAXResult out = new SAXResult ();
+
+ out.setHandler (next.getContentHandler ());
+ try {
+ LexicalHandler lh;
+ lh = (LexicalHandler) next.getProperty (LEXICAL_HANDLER);
+ out.setLexicalHandler (lh);
+ } catch (Exception e) {
+ // ignore
+ }
+ th.setResult (out);
+
+ // ... and make sure its inputs look like ours.
+ setContentHandler (th);
+ setProperty (LEXICAL_HANDLER, th);
+ }
+}
diff --git a/external/jaxp/source/gnu/xml/pipeline/package.html b/external/jaxp/source/gnu/xml/pipeline/package.html
new file mode 100644
index 000000000..182bc03c4
--- /dev/null
+++ b/external/jaxp/source/gnu/xml/pipeline/package.html
@@ -0,0 +1,257 @@
+<html><head><title>
+blah
+<!--
+/*
+ * Copyright (c) 1999-2001 by David Brownell. All Rights Reserved.
+ *
+ * $Id: package.html,v 1.1 2003-02-01 02:10:22 cbj Exp $
+ */
+-->
+</title></head><body>
+
+<p>This package exposes a kind of XML processing pipeline, based on sending
+SAX events, which can be used as components of application architectures.
+Pipelines are used to convey streams of processing events from a producer
+to one or more consumers, and to let each consumer control the data seen by
+later consumers.
+
+<p> There is a <a href="PipelineFactory.html">PipelineFactory</a> class which
+accepts a syntax describing how to construct some simple pipelines. Strings
+describing such pipelines can be used in command line tools (see the
+<a href="../util/DoParse.html">DoParse</a> class)
+and in other places that it is
+useful to let processing be easily reconfigured. Pipelines can of course
+be constructed programmatically, providing access to options that the
+factory won't.
+
+<p> Web applications are supported by making it easy for servlets (or
+non-Java web application components) to be part of a pipeline. They can
+originate XML (or XHTML) data through an <em>InputSource</em> or in
+response to XML messages sent from clients using <em>CallFilter</em>
+pipeline stages. Such facilities are available using the simple syntax
+for pipeline construction.
+
+
+<h2> Programming Models </h2>
+
+<p> Pipelines should be simple to understand.
+
+<ul>
+ <li> XML content, typically entire documents,
+ is pushed through consumers by producers.
+
+ <li> Pipelines are basically about consuming SAX2 callback events,
+ where the events encapsulate XML infoset-level data.<ul>
+
+ <li> Pipelines are constructed by taking one or more consumer
+ stages and combining them to produce a composite consumer.
+
+ <li> A pipeline is presumed to have pending tasks and state from
+ the beginning of its ContentHandler.startDocument() callback until
+ it's returned from its ContentHandler.doneDocument() callback.
+
+ <li> Pipelines may have multiple output stages ("fan-out")
+ or multiple input stages ("fan-in") when appropriate.
+
+ <li> Pipelines may be long-lived, but need not be.
+
+ </ul>
+
+ <li> There is flexibility about event production. <ul>
+
+ <li> SAX2 XMLReader objects are producers, which
+ provide a high level "pull" model: documents (text or DOM) are parsed,
+ and the parser pushes individual events through the pipeline.
+
+ <li> Events can be pushed directly to event consumer components
+ by application modules, if they invoke SAX2 callbacks directly.
+ That is, application modules use the XML Infoset as exposed
+ through SAX2 event callbacks.
+
+ </ul>
+
+ <li> Multiple producer threads may concurrently access a pipeline,
+ if they coordinate appropriately.
+
+ <li> Pipeline processing is not the only framework applications
+ will use.
+
+ </ul>
+
+
+<h3> Producers: XMLReader or Custom </h3>
+
+<p> Many producers will be SAX2 XMLReader objects, and
+will read (pull) data which is then written (pushed) as events.
+Typically these will parse XML text (acquired from
+<code>org.xml.sax.helpers.XMLReaderFactory</code>) or a DOM tree
+(using a <code><a href="../util/DomParser.html">DomParser</a></code>)
+These may be bound to event consumer using a convenience routine,
+<em><a href="EventFilter.html">EventFilter</a>.bind()</em>.
+Once bound, these producers may be given additional documents to
+sent through its pipeline.
+
+<p> In other cases, you will write producers yourself. For example, some
+data structures might know how to write themselves out using one or
+more XML models, expressed as sequences of SAX2 event callbacks.
+An application module might
+itself be a producer, issuing startDocument and endDocument events
+and then asking those data structures to write themselves out to a
+given EventConsumer, or walking data structures (such as JDBC query
+results) and applying its own conversion rules. WAP format XML
+(WBMXL) can be directly converted to producer output.
+
+<p> SAX2 introduced an "XMLFilter" interface, which is a kind of XMLReader.
+It is most useful in conjunction with its XMLFilterImpl helper class;
+see the <em><a href="EventFilter.html">EventFilter</a></em> javadoc
+for information contrasting that XMLFilterImpl approach with the
+relevant parts of this pipeline framework. Briefly, such XMLFilterImpl
+children can be either producers or consumers, and are more limited in
+configuration flexibility. In this framework, the focus of filters is
+on the EventConsumer side; see the section on
+<a href="#fitting">pipe fitting</a> below.
+
+
+<h3> Consume to Standard or Custom Data Representations </h3>
+
+<p> Many consumers will be used to create standard representations of XML
+data. The <a href="TextConsumer.html">TextConsumer</a> takes its events
+and writes them as text for a single XML document,
+using an internal <a href="../util/XMLWriter.html">XMLWriter</a>.
+The <a href="DomConsumer.html">DomConsumer</a> takes its events and uses
+them to create and populate a DOM Document.
+
+<p> In other cases, you will write consumers yourself. For example,
+you might use a particular unmarshaling filter to produce objects
+that fit your application's requirements, instead of using DOM.
+Such consumers work at the level of XML data models, rather than with
+specific representations such as XML text or a DOM tree. You could
+convert your output directly to WAP format data (WBXML).
+
+
+<h3><a name="fitting">Pipe Fitting</a></h3>
+
+<p> Pipelines are composite event consumers, with each stage having
+the opportunity to transform the data before delivering it to any
+subsequent stages.
+
+<p> The <a href="PipelineFactory.html">PipelineFactory</a> class
+provides access to much of this functionality through a simple syntax.
+See the table in that class's javadoc describing a number of standard
+components. Direct API calls are still needed for many of the most
+interesting pipeline configurations, including ones leveraging actual
+or logical concurrency.
+
+<p> Four basic types of pipe fitting are directly supported. These may
+be used to construct complex pipeline networks. <ul>
+
+ <li> <a href="TeeConsumer.html">TeeConsumer</a> objects split event
+ flow so it goes to two two different consumers, one before the other.
+ This is a basic form of event fan-out; you can use this class to
+ copy events to any number of output pipelines.
+
+ <li> Clients can call remote components through HTTP or HTTPS using
+ the <a href="CallFilter.html">CallFilter</a> component, and Servlets
+ can implement such components by extending the
+ <a href="XmlServlet.html">XmlServlet</a> component. Java is not
+ required on either end, and transport protocols other than HTTP may
+ also be used.
+
+ <li> <a href="EventFilter.html">EventFilter</a> objects selectively
+ provide handling for callbacks, and can pass unhandled ones to a
+ subsequent stage. They are often subclassed, since much of the
+ basic filtering machinery is already in place in the base class.
+
+ <li> Applications can merge two event flows by just using the same
+ consumer in each one. If multiple threads are in use, synchronization
+ needs to be addressed by the appropriate application level policy.
+
+ </ul>
+
+<p> Note that filters can be as complex as
+<a href="XsltFilter.html">XSLT transforms</a>
+available) on input data, or as simple as removing simple syntax data
+such as ignorable whitespace, comments, and CDATA delimiters.
+Some simple "built-in" filters are part of this package.
+
+
+<h3> Coding Conventions: Filter and Terminus Stages</h3>
+
+<p> If you follow these coding conventions, your classes may be used
+directly (give the full class name) in pipeline descriptions as understood
+by the PipelineFactory. There are four constructors the factory may
+try to use; in order of decreasing numbers of parameters, these are: <ul>
+
+ <li> Filters that need a single String setup parameter should have
+ a public constructor with two parameters: that string, then the
+ EventConsumer holding the "next" consumer to get events.
+
+ <li> Filters that don't need setup parameters should have a public
+ constructor that accepts a single EventConsumer holding the "next"
+ consumer to get events when they are done.
+
+ <li> Terminus stages may have a public constructor taking a single
+ paramter: the string value of that parameter.
+
+ <li> Terminus stages may have a public no-parameters constructor.
+
+ </ul>
+
+<p> Of course, classes may support more than one such usage convention;
+if they do, they can automatically be used in multiple modes. If you
+try to use a terminus class as a filter, and that terminus has a constructor
+with the appropriate number of arguments, it is automatically wrapped in
+a "tee" filter.
+
+
+<h2> Debugging Tip: "Tee" Joints can Snapshot Data</h2>
+
+<p> It can sometimes be hard to see what's happening, when something
+goes wrong. Easily fixed: just snapshot the data. Then you can find
+out where things start to go wrong.
+
+<p> If you're using pipeline descriptors so that they're easily
+administered, just stick a <em>write&nbsp;(&nbsp;filename&nbsp;)</em>
+filter into the pipeline at an appropriate point.
+
+<p> Inside your programs, you can do the same thing directly: perhaps
+by saving a Writer (perhaps a StringWriter) in a variable, using that
+to create a TextConsumer, and making that the first part of a tee --
+splicing that into your pipeline at a convenient location.
+
+<p> You can also use a DomConsumer to buffer the data, but remember
+that DOM doesn't save all the information that XML provides, so that DOM
+snapshots are relatively low fidelity. They also are substantially more
+expensive in terms of memory than a StringWriter holding similar data.
+
+<h2> Debugging Tip: Non-XML Producers</h2>
+
+<p> Producers in pipelines don't need to start from XML
+data structures, such as text in XML syntax (likely coming
+from some <em>XMLReader</em> that parses XML) or a
+DOM representation (perhaps with a
+<a href="../util/DomParser.html">DomParser</a>).
+
+<p> One common type of event producer will instead make
+direct calls to SAX event handlers returned from an
+<a href="EventConsumer.html">EventConsumer</a>.
+For example, making <em>ContentHandler.startElement</em>
+calls and matching <em>ContentHandler.endElement</em> calls.
+
+<p> Applications making such calls can catch certain
+common "syntax errors" by using a
+<a href="WellFormednessFilter.html">WellFormednessFilter</a>.
+That filter will detect (and report) erroneous input data
+such as mismatched document, element, or CDATA start/end calls.
+Use such a filter near the head of the pipeline that your
+producer feeds, at least while debugging, to help ensure that
+you're providing legal XML Infoset data.
+
+<p> You can also arrange to validate data on the fly.
+For DTD validation, you can configure a
+<a href="ValidationConsumer.html">ValidationConsumer</a>
+to work as a filter, using any DTD you choose.
+Other validation schemes can be handled with other
+validation filters.
+
+</body></html>
diff --git a/external/jaxp/source/gnu/xml/util/DoParse.java b/external/jaxp/source/gnu/xml/util/DoParse.java
new file mode 100644
index 000000000..ea5cdba54
--- /dev/null
+++ b/external/jaxp/source/gnu/xml/util/DoParse.java
@@ -0,0 +1,299 @@
+/*
+ * $Id: DoParse.java,v 1.1 2003-02-01 02:10:23 cbj Exp $
+ * Copyright (C) 1999-2001 David Brownell
+ *
+ * This file is part of GNU JAXP, a library.
+ *
+ * GNU JAXP is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * GNU JAXP is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ * As a special exception, if you link this library with other files to
+ * produce an executable, this library does not by itself cause the
+ * resulting executable to be covered by the GNU General Public License.
+ * This exception does not however invalidate any other reasons why the
+ * executable file might be covered by the GNU General Public License.
+ */
+
+package gnu.xml.util;
+
+import java.io.*;
+
+import org.xml.sax.*;
+import org.xml.sax.helpers.XMLReaderFactory;
+import org.xml.sax.ext.*;
+
+// import gnu.xml.pipeline.*;
+// Added imports directly to fix a GCJ problem.
+import gnu.xml.pipeline.CallFilter;
+import gnu.xml.pipeline.DomConsumer;
+import gnu.xml.pipeline.EventConsumer;
+import gnu.xml.pipeline.EventFilter;
+import gnu.xml.pipeline.LinkFilter;
+import gnu.xml.pipeline.NSFilter;
+import gnu.xml.pipeline.PipelineFactory;
+import gnu.xml.pipeline.TeeConsumer;
+import gnu.xml.pipeline.TextConsumer;
+import gnu.xml.pipeline.ValidationConsumer;
+import gnu.xml.pipeline.WellFormednessFilter;
+import gnu.xml.pipeline.XIncludeFilter;
+import gnu.xml.pipeline.XsltFilter;
+
+
+// $Id: DoParse.java,v 1.1 2003-02-01 02:10:23 cbj Exp $
+
+/**
+ * This class provides a driver which may be invoked from the command line
+ * to process a document using a SAX2 parser and a specified XML processing
+ * pipeline.
+ * This facilitates some common types of command line tools, such as parsing an
+ * XML document in order test it for well formedness or validity.
+ *
+ * <p>The SAX2 XMLReaderFactory should return a SAX2 XML parser which
+ * supports both of the standardized extension handlers (for declaration
+ * and lexical events). That parser will be used to produce events.
+ *
+ * <p>The first parameter to the command gives the name of the document that
+ * will be given to that processor. If it is a file name, it is converted
+ * to a URL first.
+ *
+ * <p>The second parameter describes a simple processing pipeline, and will
+ * be used as input to {@link gnu.xml.pipeline.PipelineFactory}
+ * methods which identify the processing to be done. Examples of such a
+ * pipeline include <pre>
+ *
+ * nsfix | validate <em>to validate the input document </em>
+ * nsfix | write ( stdout ) <em>to echo the file as XML text</em>
+ * dom | nsfix | write ( stdout ) <em>parse into DOM, print the result</em>
+ * </pre>
+ *
+ * <p> Relatively complex pipelines can be described on the command line, but
+ * not all interesting ones will require as little configuration as can be done
+ * in that way. Put filters like "nsfix", perhaps followed by "validate",
+ * at the front of the pipeline so they can be optimized out if a parser
+ * supports those modes natively.
+ *
+ * <p> If the parsing is aborted for any reason, the JVM will exit with a
+ * failure code. If a validating parse was done then both validation and
+ * well formedness errors will cause a failure. A non-validating parse
+ * will report failure on well formedness errors.
+ *
+ * @see gnu.xml.pipeline.PipelineFactory
+ *
+ * @author David Brownell
+ * @version $Date: 2003-02-01 02:10:23 $
+ */
+final public class DoParse
+{
+ private DoParse () { /* no instances allowed */ }
+
+ // first reported nonrecoverable error
+ private static SAXParseException fatal;
+
+ // error categories
+ private static int errorCount;
+ private static int fatalCount;
+
+ /**
+ * Command line invoker for this class; pass a filename or URL
+ * as the first argument, and a pipeline description as the second.
+ * Make sure to use filters to condition the input to stages that
+ * require it; an <em>nsfix</em> filter will be a common requirement,
+ * to restore syntax that SAX2 parsers delete by default. Some
+ * conditioning filters may be eliminated by setting parser options.
+ * (For example, "nsfix" can set the "namespace-prefixes" feature to
+ * a non-default value of "true". In the same way, "validate" can set
+ * the "validation" feature to "true".)
+ */
+ public static void main (String argv [])
+ throws IOException
+ {
+ int exitStatus = 1;
+
+ if (argv.length != 2) {
+ System.err.println ("Usage: DoParse [filename|URL] pipeline-spec");
+ System.err.println ("Example pipeline specs:");
+ System.err.println (" 'nsfix | validate'");
+ System.err.println (
+ " ... restore namespace syntax, validate");
+ System.err.println (" 'nsfix | write ( stdout )'");
+ System.err.println (
+ " ... restore namespace syntax, write to stdout as XML"
+ );
+ System.exit (1);
+ }
+
+ try {
+ //
+ // Get input source for specified document (or try ;-)
+ //
+ argv [0] = Resolver.getURL (argv [0]);
+ InputSource input = new InputSource (argv [0]);
+
+ //
+ // Get the producer, using the system default parser (which
+ // can be overridden for this particular invocation).
+ //
+ // And the pipeline, using commandline options.
+ //
+ XMLReader producer;
+ EventConsumer consumer;
+
+ producer = XMLReaderFactory.createXMLReader ();
+
+ //
+ // XXX pipeline factory now has a pre-tokenized input
+ // method, use it ... that way at least some params
+ // can be written using quotes (have spaces, ...)
+ //
+ consumer = PipelineFactory.createPipeline (argv [1]);
+
+ //
+ // XXX want commandline option for tweaking error handler.
+ // Want to be able to present warnings.
+ //
+ producer.setErrorHandler (new MyErrorHandler ());
+
+ // XXX need facility enabling resolving to local DTDs
+
+ //
+ // Parse. The pipeline may get optimized a bit, so we
+ // can't always fail cleanly for validation without taking
+ // a look at the filter stages.
+ //
+ EventFilter.bind (producer, consumer);
+ producer.parse (input);
+
+ try {
+ if (producer.getFeature (
+ "http://org.xml/sax/features/validation"))
+ exitStatus = ((errorCount + fatalCount) > 0) ? 1 : 0;
+ else if (fatalCount == 0)
+ exitStatus = 0;
+ } catch (SAXException e) {
+ if (hasValidator (consumer))
+ exitStatus = ((errorCount + fatalCount) > 0) ? 1 : 0;
+ else if (fatalCount == 0)
+ exitStatus = 0;
+ }
+
+ } catch (java.net.MalformedURLException e) {
+ System.err.println ("** Malformed URL: " + e.getMessage ());
+ System.err.println ("Is '" + argv [0] + "' a non-existent file?");
+ e.printStackTrace ();
+ // e.g. FNF
+
+ } catch (SAXParseException e) {
+ if (e != fatal) {
+ System.err.print (printParseException ("Parsing Aborted", e));
+ e.printStackTrace ();
+ if (e.getException () != null) {
+ System.err.println ("++ Wrapped exception:");
+ e.getException ().printStackTrace ();
+ }
+ }
+
+ } catch (SAXException e) {
+ Exception x = e;
+ if (e.getException () != null)
+ x = e.getException ();
+ x.printStackTrace ();
+
+ } catch (Throwable t) {
+ t.printStackTrace ();
+ }
+
+ System.exit (exitStatus);
+ }
+
+ // returns true if saw a validator (before end or unrecognized node)
+ // false otherwise
+ private static boolean hasValidator (EventConsumer e)
+ {
+ if (e == null)
+ return false;
+ if (e instanceof ValidationConsumer)
+ return true;
+ if (e instanceof TeeConsumer) {
+ TeeConsumer t = (TeeConsumer) e;
+ return hasValidator (t.getFirst ())
+ || hasValidator (t.getRest ());
+ }
+ if (e instanceof WellFormednessFilter
+ || e instanceof NSFilter
+ )
+ return hasValidator (((EventFilter)e).getNext ());
+
+ // else ... gee, we can't know. Assume not.
+
+ return false;
+ }
+
+ static class MyErrorHandler implements ErrorHandler
+ {
+ // dump validation errors, but continue
+ public void error (SAXParseException e)
+ throws SAXParseException
+ {
+ errorCount++;
+ System.err.print (printParseException ("Error", e));
+ }
+
+ public void warning (SAXParseException e)
+ throws SAXParseException
+ {
+ // System.err.print (printParseException ("Warning", e));
+ }
+
+ // try to continue fatal errors, in case a parser reports more
+ public void fatalError (SAXParseException e)
+ throws SAXParseException
+ {
+ fatalCount++;
+ if (fatal == null)
+ fatal = e;
+ System.err.print (printParseException ("Nonrecoverable Error", e));
+ }
+ }
+
+ static private String printParseException (
+ String label,
+ SAXParseException e
+ ) {
+ StringBuffer buf = new StringBuffer ();
+ int temp;
+
+ buf.append ("** ");
+ buf.append (label);
+ buf.append (": ");
+ buf.append (e.getMessage ());
+ buf.append ('\n');
+ if (e.getSystemId () != null) {
+ buf.append (" URI: ");
+ buf.append (e.getSystemId ());
+ buf.append ('\n');
+ }
+ if ((temp = e.getLineNumber ()) != -1) {
+ buf.append (" line: ");
+ buf.append (temp);
+ buf.append ('\n');
+ }
+ if ((temp = e.getColumnNumber ()) != -1) {
+ buf.append (" char: ");
+ buf.append (temp);
+ buf.append ('\n');
+ }
+
+ return buf.toString ();
+ }
+}
diff --git a/external/jaxp/source/gnu/xml/util/DomParser.java b/external/jaxp/source/gnu/xml/util/DomParser.java
new file mode 100644
index 000000000..c732e6a98
--- /dev/null
+++ b/external/jaxp/source/gnu/xml/util/DomParser.java
@@ -0,0 +1,795 @@
+/*
+ * $Id: DomParser.java,v 1.1 2003-02-01 02:10:23 cbj Exp $
+ * Copyright (C) 1999-2001 David Brownell
+ *
+ * This file is part of GNU JAXP, a library.
+ *
+ * GNU JAXP is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * GNU JAXP is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ * As a special exception, if you link this library with other files to
+ * produce an executable, this library does not by itself cause the
+ * resulting executable to be covered by the GNU General Public License.
+ * This exception does not however invalidate any other reasons why the
+ * executable file might be covered by the GNU General Public License.
+ */
+
+package gnu.xml.util;
+
+import java.util.Enumeration;
+import java.util.Locale;
+
+import org.xml.sax.*;
+import org.xml.sax.helpers.AttributesImpl;
+import org.xml.sax.helpers.NamespaceSupport;
+import org.xml.sax.ext.DeclHandler;
+import org.xml.sax.ext.DefaultHandler2;
+import org.xml.sax.ext.LexicalHandler;
+
+import org.w3c.dom.*;
+
+
+/**
+ * This parser emits SAX2 parsing events as it traverses a DOM tree, using
+ * any conformant implementation of DOM. It exposes all SAX1 features,
+ * and the following SAX2 features and properties (as
+ * identified by standard URIs which are not fully provided here). Note
+ * that if a Level 1 DOM implementation is given, then this behaves as if
+ * namespaces were disabled, and namespace prefixes were enabled. </p>
+ *
+ * <table border="1" width='100%' cellpadding='3' cellspacing='0'>
+ * <tr bgcolor='#ccccff'>
+ * <th><font size='+1'>Name</font></th>
+ * <th><font size='+1'>Notes</font></th></tr>
+ *
+ * <tr><td colspan=2><center><em>Features ... URL prefix is
+ * <b>http://xml.org/sax/features/</b></em></center></td></tr>
+ *
+ * <tr><td>(URL)/external-general-entities</td>
+ * <td>false (does no parsing)</td></tr>
+ * <tr><td>(URL)/external-parameter-entities</td>
+ * <td>false (does no parsing)</td></tr>
+ * <tr><td>(URL)/namespaces</td>
+ * <td>Value is fixed at <em>true</em></td></tr>
+ * <tr><td>(URL)/namespace-prefixes</td>
+ * <td>Value is settable, defaulting to <em>false</em>
+ * (<code>xmlns</code> attributes hidden, and names aren't prefixed)
+ * </td></tr>
+ * <tr><td>(URL)/string-interning</td>
+ * <td>Value is fixed at <em>false</em> (DOM provides no
+ * guarantees as to interning)</td></tr>
+ * <tr><td>(URL)/validation</td>
+ * <td>false (does no parsing)</td></tr>
+ * <tr><td>(URL)/lexical-handler/parameter-entities</td>
+ * <td>false (DOM doesn't do parameter entities)</td></tr>
+ *
+ * <tr><td colspan=2><center><em>Properties ... URL prefix is
+ * <b>http://xml.org/sax/properties/</b></em></center></td></tr>
+ *
+ *
+ * <tr><td>(URL)/dom-node</td>
+ * <td>This property may be set before parsing to hold a DOM
+ * <em>Document</em> node; any arguments given to <em>parse</em>
+ * methods are ignored. When retrieved
+ * during a parse, this value contains the "current" DOM node.
+ * </td></tr>
+ * <tr><td>(URL)/declaration-handler</td>
+ * <td>A declaration handler may be provided. Declaration of external
+ * general entities is exposed, but not parameter entities; none of the
+ * entity names reported here will begin with "%". </td></tr>
+ * <tr><td>(URL)/lexical-handler</td>
+ * <td>A lexical handler may be provided. While the start and end of
+ * any external subset are reported, expansion of other parameter
+ * entities (e.g. inside attribute list declarations) is not exposed.
+ * Expansion of general entities within attributes is also not exposed
+ * (see below).</td></tr>
+ * </table>
+ *
+ * <P> The consequences of modifying a DOM document tree as it is being walked
+ * by this "parser" are unspecified; don't do it! </P>
+ *
+ * @author David Brownell
+ * @version $Date: 2003-02-01 02:10:23 $
+ */
+final public class DomParser implements XMLReader
+{
+ // Stuff used internally to route events correctly
+ private DefaultHandler2 defaultHandler = new DefaultHandler2 ();
+
+ // per-parse SAX stuff
+ private ContentHandler contentHandler = defaultHandler;
+ private DTDHandler dtdHandler = defaultHandler;
+ private DeclHandler declHandler = defaultHandler;
+ private LexicalHandler lexicalHandler = defaultHandler;
+
+ // shared context
+ private ErrorHandler errHandler = defaultHandler;
+ private EntityResolver resolver = defaultHandler;
+ private Locale locale = Locale.getDefault ();
+
+ // parser state
+ private Node start;
+ private Node current;
+ private boolean isL2;
+ private boolean showNamespaces = true;
+ private boolean showXML1_0 = false;
+ private NamespaceSupport prefixStack = new NamespaceSupport ();
+ private boolean isDocument;
+
+
+ /**
+ * Constructs an unitialized <b>SAX2</b> parser.
+ */
+ public DomParser () {
+ }
+
+ /**
+ * Constructs an <b>SAX2</b> parser initialized to traverse the specified
+ * DOM tree. If the node is a document, the startDocument() and
+ * endDocument() calls bracket the calls exposing children.
+ */
+ public DomParser (Node node) {
+ setStart (node);
+ }
+
+
+ // stuff that most components in an application should be sharing:
+ // resolver and error locale.
+
+ /**
+ * <b>SAX2</b>: Returns the object used when resolving external
+ * entities during parsing (both general and parameter entities).
+ */
+ public EntityResolver getEntityResolver ()
+ {
+ return resolver;
+ }
+
+ /**
+ * <b>SAX1</b>: Provides an object which may be used when resolving external
+ * entities during parsing (both general and parameter entities).
+ */
+ public void setEntityResolver (EntityResolver resolver)
+ {
+ if (resolver == null)
+ resolver = defaultHandler;
+ this.resolver = resolver;
+ }
+
+ /**
+ * <b>SAX1</b>: Identifies the locale which the parser should use for the
+ * diagnostics it provides.
+ *
+ * @exception SAXException as defined in the specification for
+ * <em>org.xml.sax.Parser.setLocale()</em>
+ */
+ public void setLocale (Locale locale)
+ throws SAXException
+ {
+ if (locale == null)
+ locale = Locale.getDefault ();
+ this.locale = locale;
+ }
+
+
+ // different modules will tend to handle error handling the same,
+ // but it may not be the same through the whole app
+
+ /**
+ * <b>SAX2</b>: Returns the object used to receive callbacks for XML
+ * errors of all levels (fatal, nonfatal, warning).
+ */
+ public ErrorHandler getErrorHandler ()
+ {
+ return errHandler;
+ }
+
+ /**
+ * <b>SAX1</b>: Provides an object which receives callbacks for XML errors
+ * of all levels (fatal, nonfatal, warning).
+ */
+ public void setErrorHandler (ErrorHandler handler)
+ {
+ if (handler == null)
+ handler = defaultHandler;
+ errHandler = handler;
+ }
+
+
+ // stuff different parts of a module will handle differently
+
+ /**
+ * <b>SAX2</b>: Returns the object used to report the logical
+ * content of an XML document.
+ */
+ public ContentHandler getContentHandler ()
+ {
+ return contentHandler;
+ }
+
+ /**
+ * <b>SAX2</b>: Assigns the object used to report the logical
+ * content of an XML document.
+ */
+ public void setContentHandler (ContentHandler handler)
+ {
+ if (handler == null)
+ handler = defaultHandler;
+ contentHandler = handler;
+ }
+
+ /**
+ * <b>SAX2</b>: Returns the object used to process declarations related
+ * to notations and unparsed entities.
+ */
+ public DTDHandler getDTDHandler ()
+ {
+ return dtdHandler;
+ }
+
+ /**
+ * <b>SAX1</b>: Provides an object which may be used to intercept
+ * declarations related to notations and unparsed entities.
+ */
+ public void setDTDHandler (DTDHandler handler)
+ {
+ if (handler == null)
+ handler = defaultHandler;
+ dtdHandler = handler;
+ }
+
+
+ /**
+ * <b>SAX1</b>: Parses the previously provided DOM document (the
+ * input parameter is ignored). When this returns, that same
+ * document may be parsed again without needing a "reset".
+ *
+ * @param uri ignored (pass an empty string)
+ * @exception SAXException as defined in the specification for
+ * <em>org.xml.sax.Parser.parse()</em>
+ */
+ public void parse (String uri) throws SAXException
+ {
+ parse ();
+ }
+
+ /**
+ * <b>SAX1</b>: Parses the previously provided DOM document (the
+ * input parameter is ignored). When this returns, that same
+ * document may be parsed again without needing a "reset".
+ *
+ * @param input ignored
+ * @exception SAXException as defined in the specification for
+ * <em>org.xml.sax.Parser.parse()</em>
+ */
+ public void parse (InputSource input) throws SAXException
+ {
+ parse ();
+ }
+
+ private void parse () throws SAXException
+ {
+ try {
+ walk ();
+ } finally {
+ if (isDocument)
+ contentHandler.endDocument ();
+ current = null;
+ prefixStack.reset ();
+ }
+ }
+
+ private boolean getIsL2 (Node node)
+ {
+ DOMImplementation impl;
+ Document doc;
+
+ if (node instanceof Document)
+ doc = (Document) node;
+ else
+ doc = node.getOwnerDocument ();
+ if (doc == null)
+ throw new RuntimeException ("? unowned node - L2 DTD ?");
+ impl = doc.getImplementation ();
+ return impl.hasFeature ("XML", "2.0");
+ }
+
+
+ private static final String FEATURES = "http://xml.org/sax/features/";
+ private static final String HANDLERS = "http://xml.org/sax/properties/";
+
+ /**
+ * <b>SAX2</b>: Tells whether this parser supports the specified feature.
+ */
+ public boolean getFeature (String name)
+ throws SAXNotRecognizedException, SAXNotSupportedException
+ {
+ // basically, none are relevant -- they relate more to
+ // parsing than to walking a "parse tree".
+
+ // FIXME: DOM feature to expose interning?
+
+ if ((FEATURES + "validation").equals (name)
+ || (FEATURES + "external-general-entities")
+ .equals (name)
+ || (FEATURES + "external-parameter-entities")
+ .equals (name)
+ || (FEATURES + "string-interning").equals (name)
+ )
+ return false;
+
+ if ((FEATURES + "namespaces").equals (name))
+ return showNamespaces;
+ if ((FEATURES + "namespace-prefixes").equals (name))
+ return showXML1_0;
+
+ throw new SAXNotRecognizedException (name);
+ }
+
+ /**
+ * <b>SAX2</b>: Returns the specified property. At this time only
+ * the declaration and lexical handlers, and current the "DOM" node,
+ * are supported.
+ */
+ public Object getProperty (String name)
+ throws SAXNotRecognizedException, SAXNotSupportedException
+ {
+ if ((HANDLERS + "declaration-handler").equals (name))
+ return declHandler == defaultHandler ? null : declHandler;
+ if ((HANDLERS + "lexical-handler").equals (name))
+ return lexicalHandler == defaultHandler ? null : lexicalHandler;
+
+ if ((HANDLERS + "dom-node").equals (name))
+ return current;
+
+ // unknown properties
+ throw new SAXNotRecognizedException (name);
+ }
+
+ /**
+ * <b>SAX2</b>: Sets the state of features supported in this parser.
+ * Only the namespace support features are mutable.
+ */
+ public void setFeature (String name, boolean state)
+ throws SAXNotRecognizedException, SAXNotSupportedException
+ {
+ if (current != null)
+ throw new IllegalStateException ("feature change midparse");
+
+ boolean value = getFeature (name);
+
+ if (value == state)
+ return;
+
+ if ((FEATURES + "namespaces").equals (name)) {
+ if (!showXML1_0 && state == false)
+ throw new SAXNotSupportedException ("Illegal namespace "
+ + "processing configuration");
+ showNamespaces = state;
+ return;
+ }
+ if ((FEATURES + "namespace-prefixes").equals (name)) {
+ if (!showNamespaces && state == false)
+ throw new SAXNotSupportedException ("Illegal namespace "
+ + "processing configuration");
+ showXML1_0 = state;
+ return;
+ }
+
+ throw new SAXNotSupportedException (name);
+ }
+
+ /**
+ * <b>SAX2</b>: Assigns the specified property. At this time only
+ * declaration and lexical handlers, and the initial DOM document, are
+ * supported. These must not be changed to values of the wrong type.
+ * Like SAX1 handlers, these handlers may be changed at any time.
+ * Like SAX1 input source or document URI, the initial DOM document
+ * may not be changed during a parse.
+ */
+ public void setProperty (String name, Object state)
+ throws SAXNotRecognizedException, SAXNotSupportedException
+ {
+ if ((HANDLERS + "declaration-handler").equals (name)) {
+ if (!(state instanceof DeclHandler || state == null))
+ throw new SAXNotSupportedException (name);
+ declHandler = (DeclHandler) state;
+ return;
+ }
+
+ if ((HANDLERS + "lexical-handler").equals (name)) {
+ if (!(state instanceof LexicalHandler || state == null))
+ throw new SAXNotSupportedException (name);
+ lexicalHandler = (LexicalHandler) state;
+ return;
+ }
+
+ if ((HANDLERS + "dom-node").equals (name)) {
+ if (state == null || state instanceof Node) {
+ if (current != null)
+ throw new SAXNotSupportedException (
+ "property is readonly during parse: " + name);
+ setStart ((Node) state);
+ return;
+ }
+ throw new SAXNotSupportedException ("not a DOM Node");
+ }
+
+ // unknown properties
+ throw new SAXNotRecognizedException (name);
+ }
+
+ private void setStart (Node property)
+ {
+ start = property;
+ if (start != null) {
+ isL2 = getIsL2 (start);
+ isDocument = (start instanceof Document);
+ }
+ }
+
+ //
+ // Non-recursive walk, using DOM state when backtracking is needed
+ //
+ private void walk ()
+ throws SAXException
+ {
+ int type;
+ NamedNodeMap nodes;
+ int length;
+ AttributesImpl attrs = new AttributesImpl ();
+ char chars [];
+ String ns, local;
+
+ synchronized (this) {
+ if (current != null)
+ throw new IllegalStateException ("already walking tree");
+
+ // JVM guarantees assignments are atomic; so no other
+ // thread could get this far till this walk's done.
+ current = start;
+ }
+
+ for (;;) {
+ type = current.getNodeType ();
+
+ //
+ // First, visit the current node, including any "start" calls
+ //
+ switch (type) {
+
+ case Node.DOCUMENT_NODE:
+ contentHandler.startDocument ();
+ break;
+
+ case Node.ELEMENT_NODE:
+ nodes = current.getAttributes ();
+ length = nodes.getLength ();
+ prefixStack.pushContext ();
+ for (int i = 0; i < length; i++) {
+ Attr attr = (Attr) nodes.item (i);
+ String name = attr.getNodeName ();
+
+ if (showNamespaces && name.startsWith ("xmlns")) {
+ String prefix;
+ String uri;
+
+ // NOTE: DOM L2 (CR2+ and REC) violate the
+ // Namespaces REC, treat "xmlns" like a strange
+ // attribute instead of a magic token
+ if ("xmlns".equals (name))
+ prefix = "";
+ else
+ prefix = name.substring (6);
+ uri = attr.getNodeValue ();
+
+ prefixStack.declarePrefix (prefix, uri);
+ contentHandler.startPrefixMapping (prefix, uri);
+
+ if (!showXML1_0)
+ continue;
+ }
+
+ //
+ // NOTE: DOM doesn't record the attribute type info
+ // which SAX exposes; so this always reports CDATA.
+ //
+ // NOTE: SAX doesn't expose the isSpecified info which
+ // DOM exposes; that's discarded here. Similarly with
+ // the information DOM hides inside itself about what
+ // the default values for an attribute are.
+ //
+ if (showNamespaces) {
+ if (isL2) {
+ if ((ns = attr.getNamespaceURI ()) == null)
+ ns = "";
+ // Note: SAX2 and DOM handle "local" names
+ // differently
+ if ((local = attr.getLocalName ()) == null)
+ local = name;
+ } else {
+// XXX
+ throw new RuntimeException (
+ "NYI, ns lookup when parsing L1 DOM");
+ }
+ } else
+ ns = local = "";
+ attrs.addAttribute (ns, local, name,
+ "CDATA", attr.getNodeValue ());
+ }
+ if (showNamespaces) {
+ if (isL2) {
+ if ((ns = current.getNamespaceURI ()) == null)
+ ns = "";
+ // Note: SAX2 and DOM handle "local" names differently
+ if ((local = current.getLocalName ()) == null)
+ local = current.getNodeName ();
+ } else {
+// XXX
+ throw new RuntimeException (
+ "NYI, ns lookup when parsing L1 DOM");
+ }
+ } else
+ ns = local = "";
+ contentHandler.startElement (ns, local,
+ current.getNodeName (), attrs);
+ if (length != 0)
+ attrs.clear ();
+ break;
+
+ case Node.CDATA_SECTION_NODE:
+ lexicalHandler.startCDATA ();
+ chars = current.getNodeValue ().toCharArray ();
+ contentHandler.characters (chars, 0, chars.length);
+ lexicalHandler.endCDATA ();
+ break;
+
+ case Node.COMMENT_NODE:
+ chars = current.getNodeValue ().toCharArray ();
+ lexicalHandler.comment (chars, 0, chars.length);
+ break;
+
+ case Node.DOCUMENT_TYPE_NODE:
+ {
+ DocumentType doctype = (DocumentType) current;
+
+ //
+ // Only DOM L2 supports recreating even some DTDs in full.
+ //
+ if (isL2) {
+ lexicalHandler.startDTD (doctype.getName (),
+ doctype.getPublicId (),
+ doctype.getSystemId ());
+ } else
+ lexicalHandler.startDTD (doctype.getName (),
+ null, null);
+
+ //
+ // The only sure way to recreate is to provide both the
+ // internal and external subsets. Otherwise, only part
+ // of the job can be done ... because from the DTD, DOM
+ // discards both the critical data, like the attribute and
+ // element declarations, as well as the PIs and comments
+ // that are used to hold their documentation.
+ //
+ // Even the entity and notation declarations that it can
+ // expose can't be recorded without proprietary extensions.
+ //
+ // We construct a comment to tell what we know about how
+ // (in)complete this particular really DTD is.
+ //
+ {
+ String message;
+ char buf [];
+
+ //
+ // Though DOM L2 lets the whole doctype be recreated,
+ // SAX2 can't represent it (input or output).
+ // So this will be the typical case.
+ //
+ if (isL2 && doctype.getInternalSubset () != null)
+ message =
+ " Full DTD known; can't be shown using SAX2. ";
+
+ //
+ // Otherwise, we'll concoct a partial DTD. If there's
+ // any more data here at all, it was provided using a
+ // (proprietary) extension to DOM.
+ //
+ else
+ message =
+ " This DTD was was recreated using incomplete DOM L2 records. ";
+
+ buf = message.toCharArray ();
+ lexicalHandler.comment (buf, 0, buf.length);
+ }
+
+ // report notations first
+ nodes = doctype.getNotations ();
+ length = nodes.getLength ();
+ for (int i = 0; i < length; i++) {
+ Notation notation = (Notation) nodes.item (i);
+ dtdHandler.notationDecl (
+ notation.getNodeName (),
+ notation.getPublicId (),
+ notation.getSystemId ());
+ }
+
+ // then parsed and unparsed external general entities
+ nodes = doctype.getEntities ();
+ length = nodes.getLength ();
+ for (int i = 0; i < length; i++) {
+ Entity entity = (Entity) nodes.item (i);
+ String notation = entity.getNotationName ();
+
+ if (notation != null)
+ dtdHandler.unparsedEntityDecl (
+ entity.getNodeName (),
+ entity.getPublicId (),
+ entity.getSystemId (),
+ notation);
+ else if (entity.getSystemId () != null)
+ declHandler.externalEntityDecl (
+ entity.getNodeName (),
+ entity.getPublicId (),
+ entity.getSystemId ());
+
+ //
+ // NOTE: DOM doesn't clearly provide internal
+ // entity support; but in case someone tries to
+ // fudge such support, we defend ourselves above.
+ //
+ // NOTE: DOM doesn't expose parameter entities
+ // (thank you thank you thank you thank you)
+ //
+ }
+
+ //
+ // NOTE: DOM (levels 1 and 2) doesn't expose real
+ // typing information (element or attribute decls),
+ // as exposed by SAX2 declaration handlers.
+ //
+ lexicalHandler.endDTD ();
+ }
+ break;
+
+ case Node.ENTITY_REFERENCE_NODE:
+ // this isn't done except (a) in content, and
+ // (b) not within a start tag (att value)
+ lexicalHandler.startEntity (current.getNodeName ());
+ break;
+
+ case Node.PROCESSING_INSTRUCTION_NODE:
+ contentHandler.processingInstruction (
+ current.getNodeName (), current.getNodeValue ());
+ break;
+
+ case Node.TEXT_NODE:
+ chars = current.getNodeValue ().toCharArray ();
+ contentHandler.characters (chars, 0, chars.length);
+ break;
+
+ default:
+ // e.g. fragments, entities, notations, attributes
+ throw new SAXException ("Illegal DOM Node type in Document: "
+ + current.getNodeType ());
+ }
+
+ //
+ // Then, pick the next node to visit. If the next node isn't
+ // a child, an "end" call may be needed before moving on.
+ // If there's no next node, we're done.
+ //
+ Node next;
+
+ switch (type) {
+ case Node.DOCUMENT_NODE:
+ case Node.ELEMENT_NODE:
+ case Node.ENTITY_REFERENCE_NODE:
+ //
+ // For elements that can have children, visit those
+ // children before any siblings (i.e. depth first)
+ // and after visiting this node (i.e. preorder)
+ //
+ next = current.getFirstChild ();
+ if (next != null) {
+ current = next;
+ break;
+ }
+ //
+ // Else treat this like other childless nodes, but
+ // handle this node's "end" immediately.
+ //
+ callEnd (current);
+
+ // FALLTHROUGH
+
+ case Node.CDATA_SECTION_NODE:
+ case Node.COMMENT_NODE:
+ case Node.DOCUMENT_TYPE_NODE:
+ case Node.ENTITY_NODE:
+ case Node.PROCESSING_INSTRUCTION_NODE:
+ case Node.TEXT_NODE:
+ //
+ // Use next sibling, if there is one.
+ // Else, climb up a level (calling "end")
+ // until we find an ancestral sibling
+ // or until we we climb off the top (FINISH)
+ //
+ for (;;) {
+ if ((next = current.getNextSibling ()) != null)
+ break;
+ current = current.getParentNode ();
+ if (current == null || current == start)
+ return;
+ callEnd (current);
+ }
+ current = next;
+ break;
+
+ default:
+ throw new SAXException (
+ "Illegal DOM Node type found: " + current.getNodeType ());
+ }
+ }
+ }
+
+ private void callEnd (Node node) throws SAXException
+ {
+ switch (node.getNodeType ()) {
+ // only these three container types may ever be found
+ // directly inside a Document.
+ case Node.DOCUMENT_NODE:
+ // for SAX conformance, endDocument must always
+ // be called ... it's done in a "finally" clause)
+ return;
+
+ case Node.ELEMENT_NODE:
+ if (showNamespaces) {
+ if (isL2)
+ contentHandler.endElement (
+ node.getNamespaceURI (),
+ node.getLocalName (),
+ node.getNodeName ());
+ else
+// XXX
+ throw new RuntimeException (
+ "NYI, ns lookup when parsing L1 DOM");
+ for (Enumeration e = prefixStack.getDeclaredPrefixes ();
+ e.hasMoreElements ();
+ ) {
+ contentHandler.endPrefixMapping ((String) e.nextElement ());
+ }
+ } else
+ contentHandler.endElement ("", "", node.getNodeName ());
+ prefixStack.popContext ();
+ return;
+
+ case Node.ENTITY_REFERENCE_NODE:
+ // see above -- in content, outside start tags.
+ lexicalHandler.endEntity (node.getNodeName ());
+ return;
+
+ // these can be given at the top level
+ case Node.DOCUMENT_FRAGMENT_NODE:
+ case Node.ATTRIBUTE_NODE:
+ return;
+
+ default:
+ throw new SAXException (
+ "Illegal DOM container type found: "
+ + current.getNodeType ());
+ }
+ }
+}
diff --git a/external/jaxp/source/gnu/xml/util/Resolver.java b/external/jaxp/source/gnu/xml/util/Resolver.java
new file mode 100644
index 000000000..f22b646c3
--- /dev/null
+++ b/external/jaxp/source/gnu/xml/util/Resolver.java
@@ -0,0 +1,257 @@
+/*
+ * $Id: Resolver.java,v 1.1 2003-02-01 02:10:23 cbj Exp $
+ * Copyright (C) 1999-2001 David Brownell
+ *
+ * This file is part of GNU JAXP, a library.
+ *
+ * GNU JAXP is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * GNU JAXP is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ * As a special exception, if you link this library with other files to
+ * produce an executable, this library does not by itself cause the
+ * resulting executable to be covered by the GNU General Public License.
+ * This exception does not however invalidate any other reasons why the
+ * executable file might be covered by the GNU General Public License.
+ */
+
+package gnu.xml.util;
+
+import java.io.*;
+
+import java.util.Dictionary;
+import java.util.Hashtable;
+
+import org.xml.sax.*;
+
+
+// $Id: Resolver.java,v 1.1 2003-02-01 02:10:23 cbj Exp $
+
+/**
+ * Utility implementation of a SAX resolver, which can be used to improve
+ * network utilization of SAX based XML components. It does this by
+ * supporting local caches of external entities.
+ * SAX parsers <em>should</em> use such local caches when possible.
+ *
+ * @see XCat
+ *
+ * @version $Date: 2003-02-01 02:10:23 $
+ */
+public class Resolver implements EntityResolver, Cloneable
+{
+ /**
+ * Updates a dictionary used to map PUBLIC identifiers to file names,
+ * so that it uses the mappings in a specified directory.
+ *
+ * @param mappings Array of string pairs, where the first member
+ * of each pair is a PUBLIC identifier and the second is the
+ * name of a file, relative to the specified directory.
+ * @param directory File holding the specified files.
+ */
+ public static void addDirectoryMapping (
+ Dictionary table,
+ String mappings [][],
+ File directory
+ ) throws IOException
+ {
+ for (int i = 0; i < mappings.length; i++) {
+ File file = new File (directory, mappings [i][1]);
+ String temp;
+
+ if (!file.exists ()) // ?? log a warning ??
+ continue;
+
+ temp = fileToURL (file);
+ table.put (mappings [i][0], temp);
+ }
+ }
+
+ // FIXME: these *URL routines don't quite belong here, except
+ // that they're all in the same spirit of making it easy to
+ // use local filesystem URIs with XML parsers.
+
+ /**
+ * Provides the URL for a named file, without relying on the JDK 1.2
+ * {@link java.io.File#toURL File.toURL}() utility method.
+ *
+ * @param filename the file name to convert. Relative file names
+ * are resolved the way the JVM resolves them (current to the
+ * process-global current working directory).
+ *
+ * @exception IOException if the file does not exist
+ */
+ public static String fileNameToURL (String filename)
+ throws IOException
+ {
+ return fileToURL (new File (filename));
+ }
+
+ /**
+ * Provides the URL for a file, without relying on the JDK 1.2
+ * {@link java.io.File#toURL File.toURL}() utility method.
+ *
+ * @param f the file to convert. Relative file names
+ * are resolved the way the JVM resolves them (current to the
+ * process-global current working directory).
+ *
+ * @exception IOException if the file does not exist
+ */
+ public static String fileToURL (File f)
+ throws IOException
+ {
+ String temp;
+
+ // NOTE: the javax.xml.parsers.DocumentBuilder and
+ // javax.xml.transform.stream.StreamSource versions
+ // of this don't have this test. Some JVM versions
+ // don't report this error sanely through URL code.
+ if (!f.exists ())
+ throw new IOException ("no such file: " + f.getName ());
+
+ // FIXME: getAbsolutePath() seems buggy; I'm seeing components
+ // like "/foo/../" which are clearly not "absolute"
+ // and should have been resolved with the filesystem.
+
+ // Substituting "/" would be wrong, "foo" may have been
+ // symlinked ... the URL code will make that change
+ // later, so that things can get _really_ broken!
+
+ temp = f.getAbsolutePath ();
+
+ if (File.separatorChar != '/')
+ temp = temp.replace (File.separatorChar, '/');
+ if (!temp.startsWith ("/"))
+ temp = "/" + temp;
+ if (!temp.endsWith ("/") && f.isDirectory ())
+ temp = temp + "/";
+ return "file:" + temp;
+ }
+
+
+ /**
+ * Returns a URL string. Note that if a malformed URL is provided, or
+ * the parameter names a nonexistent file, the resulting URL may be
+ * malformed.
+ *
+ * @param fileOrURL If this is the name of a file which exists,
+ * then its URL is returned. Otherwise the argument is returned.
+ */
+ public static String getURL (String fileOrURL)
+ {
+ try {
+ return fileNameToURL (fileOrURL);
+ } catch (Exception e) {
+ return fileOrURL;
+ }
+ }
+
+
+
+ // note: cloneable, this is just copied; unguarded against mods
+ private Dictionary pubidMapping;
+
+ /**
+ * Constructs a resolver which understands how to map PUBLIC identifiers
+ * to other URIs, typically for local copies of standard DTD components.
+ *
+ * @param dictionary maps PUBLIC identifiers to URIs. This is not
+ * copied; subsequent modifications will be reported through the
+ * resolution operations.
+ */
+ public Resolver (Dictionary dict)
+ { pubidMapping = dict; }
+
+
+ // FIXME: want notion of a "system default" resolver, presumably
+ // loaded with all sorts of useful stuff. At the same time need
+ // a notion of resolver chaining (failure --> next) so that subsystems
+ // can set up things that won't interfere with other ones.
+
+ /**
+ * This parses most MIME content type strings that have <em>charset=...</em>
+ * encoding declarations to and returns the specified encoding. This
+ * conforms to RFC 3023, and is useful when constructing InputSource
+ * objects from URLConnection objects or other objects using MIME
+ * content typing.
+ *
+ * @param contentType the MIME content type that will be parsed; must
+ * not be null.
+ * @return the appropriate encoding, or null if the content type is
+ * not text and there's no <code>charset=...</code> attribute
+ */
+ static public String getEncoding (String contentType)
+ {
+ // currently a dumb parsing algorithm that works "mostly" and handles
+ // ..anything...charset=ABC
+ // ..anything...charset=ABC;otherAttr=DEF
+ // ..anything...charset=ABC (comment);otherAttr=DEF
+ // ..anything...charset= "ABC" (comment);otherAttr=DEF
+
+ int temp;
+ String encoding;
+ String defValue = null;
+
+ if (contentType.startsWith ("text/"))
+ defValue = contentType.startsWith ("text/html")
+ ? "ISO-8859-1" : "US-ASCII";
+
+ // Assumes 'charset' is only an attribute name, not part
+ // of a value, comment, or other attribute name
+ // ALSO assumes no escaped values like "\;" or "\)"
+ if ((temp = contentType.indexOf ("charset")) != -1) {
+ // strip out everything up to '=' ...
+ temp = contentType.indexOf ('=', temp);
+ if (temp == -1)
+ return defValue;
+ encoding = contentType.substring (temp + 1);
+ // ... and any subsequent attributes
+ if ((temp = encoding.indexOf (';')) != -1)
+ encoding = encoding.substring (0, temp);
+ // ... and any comments after value
+ if ((temp = encoding.indexOf ('(')) != -1)
+ encoding = encoding.substring (0, temp);
+ // ... then whitespace, and any (double) quotes
+ encoding = encoding.trim ();
+ if (encoding.charAt (0) == '"')
+ encoding = encoding.substring (1, encoding.length () - 1);
+ } else
+ encoding = defValue;
+ return encoding;
+ }
+
+
+ /**
+ * Uses a local dictionary of public identifiers to resolve URIs,
+ * normally with the goal of minimizing network traffic or latencies.
+ */
+ public InputSource resolveEntity (String publicId, String systemId)
+ throws IOException, SAXException
+ {
+ InputSource retval = null;
+ String uri;
+
+ if (publicId != null
+ && ((uri = (String) pubidMapping.get (publicId)) != null)) {
+ retval = new InputSource (uri);
+ retval.setPublicId (publicId);
+ }
+
+ // Could do URN resolution here
+
+ // URL resolution always done by parser
+
+ // FIXME: chain to "next" resolver
+
+ return retval;
+ }
+}
diff --git a/external/jaxp/source/gnu/xml/util/SAXNullTransformerFactory.java b/external/jaxp/source/gnu/xml/util/SAXNullTransformerFactory.java
new file mode 100644
index 000000000..955990665
--- /dev/null
+++ b/external/jaxp/source/gnu/xml/util/SAXNullTransformerFactory.java
@@ -0,0 +1,541 @@
+/*
+ * $Id: SAXNullTransformerFactory.java,v 1.1 2003-02-01 02:10:24 cbj Exp $
+ * Copyright (C) 2001 David Brownell
+ *
+ * This file is part of GNU JAXP, a library.
+ *
+ * GNU JAXP is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * GNU JAXP is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ * As a special exception, if you link this library with other files to
+ * produce an executable, this library does not by itself cause the
+ * resulting executable to be covered by the GNU General Public License.
+ * This exception does not however invalidate any other reasons why the
+ * executable file might be covered by the GNU General Public License.
+ */
+
+package gnu.xml.util;
+
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.OutputStream;
+import java.net.URL;
+import java.net.URLConnection;
+import java.util.Hashtable;
+import java.util.Properties;
+
+import gnu.xml.dom.Consumer;
+import gnu.xml.dom.DomDocument;
+import gnu.xml.pipeline.DomConsumer;
+import gnu.xml.pipeline.EventFilter;
+
+import javax.xml.transform.*;
+import javax.xml.transform.dom.*;
+import javax.xml.transform.sax.*;
+import javax.xml.transform.stream.*;
+
+import org.xml.sax.*;
+import org.xml.sax.helpers.XMLReaderFactory;
+import org.xml.sax.helpers.LocatorImpl;
+
+
+/**
+ * Implements null transforms. XSLT stylesheets are not supported.
+ * This class provides a way to translate three representations of
+ * XML data (SAX event stream, DOM tree, and XML text) into each other.
+ * In essence it's a thinnish wrapper around basic SAX event
+ * <a href="../pipeline/package-summary.html">pipeline</a> facilities, which
+ * exposes only limited functionality. The <em>javax.xml.transform</em>
+ * functionality is implemented as follows: <ul>
+ *
+ * <li>The {@link javax.xml.transform.sax.SAXSource SAXSource} class
+ * just wraps an {@link XMLReader} and {@link InputSource}, while the
+ * {@link javax.xml.transform.sax.SAXResult SAXResult} class is less
+ * functional than a {@link gnu.xml.pipeline.EventConsumer EventConsumer}.
+ * (Notably, it drops all but one declaration from any DTD.)</li>
+ *
+ * <li>The {@link javax.xml.transform.dom.DOMSource DOMSource} class
+ * corresponds to special SAX parsers like {@link DomParser}, and the
+ * {@link javax.xml.transform.dom.DOMResult DOMResult} class corresponds
+ * to a {@link gnu.xml.pipeline.DomConsumer DomConsumer}.</li>
+ *
+ * <li>The {@link javax.xml.transform.stream.StreamSource StreamSource}
+ * class corresponds to a SAX {@link InputSource}, and the
+ * {@link javax.xml.transform.stream.StreamResult StreamResult} class
+ * corresponds to a {@link gnu.xml.pipeline.TextConsumer TextConsumer}.</li>
+ *
+ * </ul>
+ *
+ * <p><em>This implementation is preliminary.</em>
+ *
+ * @see gnu.xml.pipeline.XsltFilter
+ *
+ * @author David Brownell
+ * @version $Date: 2003-02-01 02:10:24 $
+ */
+public class SAXNullTransformerFactory extends SAXTransformerFactory
+{
+ private ErrorListener errListener;
+ private URIResolver uriResolver;
+
+ /** Default constructor */
+ public SAXNullTransformerFactory () { }
+
+ //
+ // only has stuff that makes sense with null transforms
+ //
+
+ /**
+ * Returns true if the requested feature is supported.
+ * All three kinds of input and output are accepted:
+ * XML text, SAX events, and DOM nodes.
+ */
+ public boolean getFeature (String feature)
+ {
+ return SAXTransformerFactory.FEATURE.equals (feature)
+ || SAXResult.FEATURE.equals (feature)
+ || SAXSource.FEATURE.equals (feature)
+ || DOMResult.FEATURE.equals (feature)
+ || DOMSource.FEATURE.equals (feature)
+ || StreamResult.FEATURE.equals (feature)
+ || StreamSource.FEATURE.equals (feature)
+ ;
+ }
+
+ /** Throws an exception (no implementation attributes are supported) */
+ public void setAttribute (String key, Object value)
+ {
+ throw new IllegalArgumentException ();
+ }
+
+ /** Throws an exception (no implementation attributes are supported) */
+ public Object getAttribute (String key)
+ {
+ throw new IllegalArgumentException ();
+ }
+
+ /** (not yet implemented) */
+ public Source getAssociatedStylesheet (Source source,
+ String media, String title, String charset)
+ throws TransformerConfigurationException
+ {
+// parse, and find the appropriate xsl-stylesheet PI contents
+throw new IllegalArgumentException ();
+ }
+
+ public Transformer newTransformer ()
+ throws TransformerConfigurationException
+ {
+ return new NullTransformer ();
+ }
+
+ /**
+ * Returns a TransformerHandler that knows how to generate output
+ * in all three standard formats. Output text is generated using
+ * {@link XMLWriter}, and the GNU implementation of
+ * {@link DomDocument DOM} is used.
+ *
+ * @see SAXResult
+ * @see StreamResult
+ * @see DOMResult
+ */
+ public TransformerHandler newTransformerHandler ()
+ throws TransformerConfigurationException
+ {
+ NullTransformer transformer = new NullTransformer ();
+ return transformer.handler;
+ }
+
+ //
+ // Stuff that depends on XSLT support, which we don't provide
+ //
+ private static final String noXSLT = "No XSLT support";
+
+ /** Throws an exception (XSLT is not supported). */
+ public Transformer newTransformer (Source stylesheet)
+ throws TransformerConfigurationException
+ { throw new TransformerConfigurationException (noXSLT); }
+
+ /** Throws an exception (XSLT is not supported). */
+ public Templates newTemplates (Source stylesheet)
+ throws TransformerConfigurationException
+ { throw new TransformerConfigurationException (noXSLT); }
+
+ /** Throws an exception (XSLT is not supported). */
+ public TemplatesHandler newTemplatesHandler ()
+ throws TransformerConfigurationException
+ { throw new TransformerConfigurationException (noXSLT); }
+
+ /** Throws an exception (XSLT is not supported). */
+ public TransformerHandler newTransformerHandler (Source stylesheet)
+ throws TransformerConfigurationException
+ { throw new TransformerConfigurationException (noXSLT); }
+
+ /** Throws an exception (XSLT is not supported). */
+ public TransformerHandler newTransformerHandler (Templates stylesheet)
+ throws TransformerConfigurationException
+ { throw new TransformerConfigurationException (noXSLT); }
+
+ /** Throws an exception (XSLT is not supported). */
+ public XMLFilter newXMLFilter (Source stylesheet)
+ throws TransformerConfigurationException
+ { throw new TransformerConfigurationException (noXSLT); }
+
+ /** Throws an exception (XSLT is not supported). */
+ public XMLFilter newXMLFilter (Templates stylesheet)
+ throws TransformerConfigurationException
+ { throw new TransformerConfigurationException (noXSLT); }
+
+ /** Returns the value assigned by {@link #setErrorListener}. */
+ public ErrorListener getErrorListener ()
+ { return errListener; }
+
+ /** Assigns a value that would be used when parsing stylesheets */
+ public void setErrorListener (ErrorListener e)
+ { errListener = e; }
+
+ /** Returns the value assigned by {@link #setURIResolver}. */
+ public URIResolver getURIResolver ()
+ { return uriResolver; }
+
+ /** Assigns a value that would be used when parsing stylesheets */
+ public void setURIResolver (URIResolver u)
+ { uriResolver = u; }
+
+
+ //
+ // Helper classes. These might in theory be subclassed
+ // by an XSLT implementation, if they were exported.
+ //
+
+ static class DomTerminus extends DomConsumer
+ {
+ DomTerminus (DOMResult result) throws SAXException
+ {
+ // won't really throw SAXException
+ super (DomDocument.class);
+ setHandler (new DomHandler (this, result));
+ }
+ }
+
+ static class DomHandler extends Consumer.Backdoor
+ {
+ private DOMResult result;
+
+ DomHandler (DomConsumer c, DOMResult r) throws SAXException
+ {
+ // won't really throw SAXException
+ super (c);
+ result = r;
+ }
+
+ public void endDocument () throws SAXException
+ {
+ super.endDocument ();
+ result.setNode (getDocument ());
+ }
+ }
+
+ private static OutputStream getOutputStream (String uri)
+ throws IOException
+ {
+ // JDK stupidity: file "protocol does not support output" ...
+ if (uri.startsWith ("file:"))
+ return new FileOutputStream (uri.substring (5));
+
+ // Otherwise ...
+ URL url = new URL (uri);
+ URLConnection conn = url.openConnection ();
+
+ conn.setDoOutput (true);
+ return conn.getOutputStream ();
+ }
+
+
+ static class NullHandler extends EventFilter implements TransformerHandler
+ {
+ private String systemId;
+ private Transformer transformer;
+
+ NullHandler (Transformer t)
+ { transformer = t; }
+
+ public Transformer getTransformer ()
+ { return transformer; }
+
+ public String getSystemId ()
+ { return systemId; }
+
+ public void setSystemId (String id)
+ { systemId = id; }
+
+ public void setResult (Result result)
+ {
+ if (result.getSystemId () != null)
+ systemId = result.getSystemId ();
+
+ try {
+
+ // output to partial SAX event stream?
+ if (result instanceof SAXResult) {
+ SAXResult r = (SAXResult) result;
+
+ setContentHandler (r.getHandler ());
+ setProperty (LEXICAL_HANDLER, r.getLexicalHandler ());
+ // DTD info is filtered out by javax.transform
+
+ // output to DOM tree?
+ } else if (result instanceof DOMResult) {
+ DomTerminus out = new DomTerminus ((DOMResult) result);
+
+ setContentHandler (out.getContentHandler ());
+ setProperty (LEXICAL_HANDLER,
+ out.getProperty (LEXICAL_HANDLER));
+ // save DTD-derived info, if any.
+ setDTDHandler (out.getDTDHandler ());
+ setProperty (DECL_HANDLER,
+ out.getProperty (DECL_HANDLER));
+
+ // node is saved into result on endDocument()
+
+ // output to (XML) text?
+ } else if (result instanceof StreamResult) {
+ StreamResult r = (StreamResult) result;
+ XMLWriter out;
+
+// FIXME: when do output properties take effect?
+// encoding, standalone decl, xml/xhtml/... ...
+
+// FIXME: maybe put nsfix filter up front
+
+ try {
+ if (r.getWriter () != null)
+ out = new XMLWriter (r.getWriter ());
+ else if (r.getOutputStream () != null)
+ out = new XMLWriter (r.getOutputStream ());
+ else if (r.getSystemId () != null)
+ out = new XMLWriter (
+ getOutputStream (r.getSystemId ()));
+ else
+ throw new IllegalArgumentException (
+ "bad StreamResult");
+ } catch (IOException e) {
+e.printStackTrace ();
+ // on jdk 1.4, pass the root cause ...
+ throw new IllegalArgumentException (e.getMessage ());
+ }
+
+// out.setExpandingEntities (true);
+// out.setPrettyPrinting (true);
+// out.setXhtml (true);
+
+ setContentHandler (out);
+ setProperty (LEXICAL_HANDLER, out);
+ // save DTD info, if any; why not?
+ setDTDHandler (out);
+ setProperty (DECL_HANDLER, out);
+ }
+
+ } catch (SAXException e) {
+ // SAXNotSupportedException or SAXNotRecognizedException:
+ // "can't happen" ... but SAXException for DOM build probs
+ // could happen, so ...
+ // on jdk 1.4, pass the root cause ...
+ throw new IllegalArgumentException (e.getMessage ());
+ }
+ }
+ }
+
+ // an interface that adds no value
+ static class LocatorAdapter extends LocatorImpl implements SourceLocator
+ {
+ LocatorAdapter (SAXParseException e)
+ {
+ setSystemId (e.getSystemId ());
+ setPublicId (e.getPublicId ());
+ setLineNumber (e.getLineNumber ());
+ setColumnNumber (e.getColumnNumber ());
+ }
+ }
+
+ // another interface that adds no value
+ static class ListenerAdapter implements ErrorHandler
+ {
+ NullTransformer transformer;
+
+ ListenerAdapter (NullTransformer t)
+ { transformer = t; }
+
+ private TransformerException map (SAXParseException e)
+ {
+ return new TransformerException (
+ e.getMessage (),
+ new LocatorAdapter (e),
+ e);
+ }
+
+ public void error (SAXParseException e)
+ throws SAXParseException
+ {
+ try {
+ if (transformer.errListener != null)
+ transformer.errListener.error (map (e));
+ } catch (TransformerException ex) {
+ transformer.ex = ex;
+ throw e;
+ }
+ }
+
+ public void fatalError (SAXParseException e)
+ throws SAXParseException
+ {
+ try {
+ if (transformer.errListener != null)
+ transformer.errListener.fatalError (map (e));
+ else
+ throw map (e);
+ } catch (TransformerException ex) {
+ transformer.ex = ex;
+ throw e;
+ }
+ }
+
+ public void warning (SAXParseException e)
+ throws SAXParseException
+ {
+ try {
+ if (transformer.errListener != null)
+ transformer.errListener.warning (map (e));
+ } catch (TransformerException ex) {
+ transformer.ex = ex;
+ throw e;
+ }
+ }
+ }
+
+ static class NullTransformer extends Transformer
+ {
+ private URIResolver uriResolver;
+ private Properties props = new Properties ();
+ private Hashtable params = new Hashtable (7);
+
+ ErrorListener errListener = null;
+ TransformerException ex = null;
+ NullHandler handler;
+
+ NullTransformer ()
+ {
+ super ();
+ handler = new NullHandler (this);
+ }
+
+ public ErrorListener getErrorListener ()
+ { return errListener; }
+ public void setErrorListener (ErrorListener e)
+ { errListener = e; }
+
+ public URIResolver getURIResolver ()
+ { return uriResolver; }
+ public void setURIResolver (URIResolver u)
+ { uriResolver = u; }
+
+
+ public void setOutputProperties (Properties p)
+ { props = (Properties) p.clone (); }
+ public Properties getOutputProperties ()
+ { return (Properties) props.clone (); }
+
+ public void setOutputProperty (String name, String value)
+ { props.setProperty (name, value); }
+ public String getOutputProperty (String name)
+ { return props.getProperty (name); }
+
+ public void clearParameters ()
+ { params.clear (); }
+ public void setParameter (String name, Object value)
+ { props.put (name, value); }
+ public Object getParameter (String name)
+ { return props.get (name); }
+
+ public void transform (Source in, Result out)
+ throws TransformerException
+ {
+ try {
+ XMLReader producer;
+ InputSource input;
+
+ // Input from DOM?
+ if (in instanceof DOMSource) {
+ DOMSource source = (DOMSource) in;
+
+ if (source.getNode () == null)
+ throw new IllegalArgumentException ("no DOM node");
+ producer = new DomParser (source.getNode ());
+ input = null;
+
+ // Input from SAX?
+ } else if (in instanceof SAXSource) {
+ SAXSource source = (SAXSource) in;
+
+ producer = source.getXMLReader ();
+ if (producer == null)
+ producer = XMLReaderFactory.createXMLReader ();
+
+ input = source.getInputSource ();
+ if (input == null) {
+ if (source.getSystemId () != null)
+ input = new InputSource (source.getSystemId ());
+ else
+ throw new IllegalArgumentException (
+ "missing SAX input");
+ }
+
+ // Input from a stream or something?
+ } else {
+ producer = XMLReaderFactory.createXMLReader ();
+ input = SAXSource.sourceToInputSource (in);
+ if (input == null)
+ throw new IllegalArgumentException ("missing input");
+ }
+
+ // preserve original namespace prefixes
+ try { producer.setFeature (
+ handler.FEATURE_URI + "namespace-prefixes", true);
+ } catch (Exception e) {
+ /* ignore */
+// FIXME if we couldn't, "NsFix" stage before the output ..
+ }
+
+ // arrange the output
+ handler.setResult (out);
+ handler.bind (producer, handler);
+
+ // then parse ... single element pipeline
+ producer.parse (input);
+
+ } catch (IOException e) {
+ throw new TransformerException ("transform failed", e);
+
+ } catch (SAXException e) {
+ if (ex == null && ex.getCause () == e)
+ throw ex;
+ else
+ throw new TransformerException ("transform failed", e);
+
+ } finally {
+ ex = null;
+ }
+ }
+ }
+}
diff --git a/external/jaxp/source/gnu/xml/util/XCat.java b/external/jaxp/source/gnu/xml/util/XCat.java
new file mode 100644
index 000000000..647763029
--- /dev/null
+++ b/external/jaxp/source/gnu/xml/util/XCat.java
@@ -0,0 +1,1599 @@
+/*
+ * $Id: XCat.java,v 1.1 2003-02-01 02:10:25 cbj Exp $
+ * Copyright (C) 2001 David Brownell
+ *
+ * This file is part of GNU JAXP, a library.
+ *
+ * GNU JAXP is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * GNU JAXP is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ * As a special exception, if you link this library with other files to
+ * produce an executable, this library does not by itself cause the
+ * resulting executable to be covered by the GNU General Public License.
+ * This exception does not however invalidate any other reasons why the
+ * executable file might be covered by the GNU General Public License.
+ */
+
+
+package gnu.xml.util;
+
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+import java.net.URL;
+import java.util.Enumeration;
+import java.util.Hashtable;
+import java.util.StringTokenizer;
+import java.util.Stack;
+import java.util.Vector;
+
+import org.xml.sax.Attributes;
+import org.xml.sax.ErrorHandler;
+import org.xml.sax.InputSource;
+import org.xml.sax.Locator;
+import org.xml.sax.SAXException;
+import org.xml.sax.SAXNotRecognizedException;
+import org.xml.sax.SAXParseException;
+import org.xml.sax.XMLReader;
+
+import org.xml.sax.ext.DefaultHandler2;
+import org.xml.sax.ext.EntityResolver2;
+
+import org.xml.sax.helpers.XMLReaderFactory;
+
+/**
+ * Packages <a href=
+ "http://www.oasis-open.org/committees/entity/spec-2001-08-06.html"
+ >OASIS XML Catalogs</a>,
+ * primarily for entity resolution by parsers.
+ * That specification defines an XML syntax for mappings between
+ * identifiers declared in DTDs (particularly PUBLIC identifiers) and
+ * locations. SAX has always supported such mappings, but conventions for
+ * an XML file syntax to maintain them have previously been lacking.
+ *
+ * <p> This has three main operational modes. The primary intended mode is
+ * to create a resolver, then preloading it with one or more site-standard
+ * catalogs before using it with one or more SAX parsers: <pre>
+ * XCat catalog = new XCat ();
+ * catalog.setErrorHandler (diagnosticErrorHandler);
+ * catalog.loadCatalog ("file:/local/catalogs/catalog.cat");
+ * catalog.loadCatalog ("http://shared/catalog.cat");
+ * ...
+ * catalog.disableLoading ();
+ * parser1.setEntityResolver (catalog);
+ * parser2.setEntityResolver (catalog);
+ * ...</pre>
+ *
+ * <p>A second mode is to arrange that your application uses instances of
+ * this class as its entity resolver, and automatically loads catalogs
+ * referenced by <em>&lt;?oasis-xml-catalog...?&gt;</em> processing
+ * instructions found before the DTD in documents it parses.
+ * It would then discard the resolver after each parse.
+ *
+ * <p> A third mode applies catalogs in contexts other than entity
+ * resolution for parsers.
+ * The {@link #resolveURI resolveURI()} method supports resolving URIs
+ * stored in XML application data, rather than inside DTDs.
+ * Catalogs would be loaded as shown above, and the catalog could
+ * be used concurrently for parser entity resolution and for
+ * application URI resolution.
+ * </p>
+ *
+ * <center><hr width='70%'></center>
+ *
+ * <p>Errors in catalogs implicitly loaded (during resolution) are ignored
+ * beyond being reported through any <em>ErrorHandler</em> assigned using
+ * {@link #setErrorHandler setErrorHandler()}. SAX exceptions
+ * thrown from such a handler won't abort resolution, although throwing a
+ * <em>RuntimeException</em> or <em>Error</em> will normally abort both
+ * resolution and parsing. Useful diagnostic information is available to
+ * any <em>ErrorHandler</em> used to report problems, or from any exception
+ * thrown from an explicit {@link #loadCatalog loadCatalog()} invocation.
+ * Applications can use that information as troubleshooting aids.
+ *
+ * <p>While this class requires <em>SAX2 Extensions 1.1</em> classes in
+ * its class path, basic functionality does not require using a SAX2
+ * parser that supports the extended entity resolution functionality.
+ * See the original SAX1
+ * {@link #resolveEntity(java.lang.String,java.lang.String) resolveEntity()}
+ * method for a list of restrictions which apply when it is used with
+ * older SAX parsers.
+ *
+ * @see EntityResolver2
+ *
+ * @author David Brownell
+ */
+public class XCat implements EntityResolver2
+{
+ private Catalog catalogs [];
+ private boolean usingPublic = true;
+ private boolean loadingPermitted = true;
+ private boolean unified = true;
+ private String parserClass;
+ private ErrorHandler errorHandler;
+
+ // private EntityResolver next; // chain to next if we fail...
+
+ //
+ // NOTE: This is a straightforward implementation, and if
+ // there are lots of "nextCatalog" or "delegate*" entries
+ // in use, two tweaks would be worth considering:
+ //
+ // - Centralize some sort of cache (key by URI) for individual
+ // resolvers. That'd avoid multiple copies of a given catalog.
+ //
+ // - Have resolution track what catalogs (+modes) have been
+ // searched. This would support loop detection.
+ //
+
+
+ /**
+ * Initializes without preloading a catalog.
+ * This API is convenient when you may want to arrange that catalogs
+ * are automatically loaded when explicitly referenced in documents,
+ * using the <em>oasis-xml-catalog</em> processing instruction.
+ * In such cases you won't usually be able to preload catalogs.
+ */
+ public XCat () { }
+
+ /**
+ * Initializes, and preloads a catalog using the default SAX parser.
+ * This API is convenient when you operate with one or more standard
+ * catalogs.
+ *
+ * <p> This just delegates to {@link #loadCatalog loadCatalog()};
+ * see it for exception information.
+ *
+ * @param uri absolute URI for the catalog file.
+ */
+ public XCat (String uri)
+ throws SAXException, IOException
+ { loadCatalog (uri); }
+
+
+ /**
+ * Loads an OASIS XML Catalog.
+ * It is appended to the list of currently active catalogs, or
+ * reloaded if a catalog with the same URI was already loaded.
+ * Callers have control over what parser is used, how catalog parsing
+ * errors are reported, and whether URIs will be resolved consistently.
+ *
+ * <p> The OASIS specification says that errors detected when loading
+ * catalogs "must recover by ignoring the catalog entry file that
+ * failed, and proceeding." In this API, that action can be the
+ * responsibility of applications, when they explicitly load any
+ * catalog using this method.
+ *
+ * <p>Note that catalogs referenced by this one will not be loaded
+ * at this time. Catalogs referenced through <em>nextCatalog</em>
+ * or <em>delegate*</em> elements are normally loaded only if needed.
+ *
+ * @see #setErrorHandler
+ * @see #setParserClass
+ * @see #setUnified
+ *
+ * @param uri absolute URI for the catalog file.
+ *
+ * @exception IOException As thrown by the parser, typically to
+ * indicate problems reading data from that URI.
+ * @exception SAXException As thrown by the parser, typically to
+ * indicate problems parsing data from that URI. It may also
+ * be thrown if the parser doesn't support necessary handlers.
+ * @exception IllegalStateException When attempting to load a
+ * catalog after loading has been {@link #disableLoading disabled},
+ * such as after any entity or URI lookup has been performed.
+ */
+ public synchronized void loadCatalog (String uri)
+ throws SAXException, IOException
+ {
+ Catalog catalog;
+ int index = -1;
+
+ if (!loadingPermitted)
+ throw new IllegalStateException ();
+
+ uri = normalizeURI (uri);
+ if (catalogs != null) {
+ // maybe just reload
+ for (index = 0; index < catalogs.length; index++)
+ if (uri.equals (catalogs [index].catalogURI))
+ break;
+ }
+ catalog = loadCatalog (parserClass, errorHandler, uri, unified);
+
+ // add to list of catalogs
+ if (catalogs == null) {
+ index = 0;
+ catalogs = new Catalog [1];
+ } else if (index == catalogs.length) {
+ Catalog tmp [];
+
+ tmp = new Catalog [index + 1];
+ System.arraycopy (catalogs, 0, tmp, 0, index);
+ catalogs = tmp;
+ }
+ catalogs [index] = catalog;
+ }
+
+
+ /**
+ * "New Style" external entity resolution for parsers.
+ * Calls to this method prevent explicit loading of additional catalogs
+ * using {@link #loadCatalog loadCatalog()}.
+ *
+ * <p>This supports the full core catalog functionality for locating
+ * (and relocating) parsed entities that have been declared in a
+ * document's DTD.
+ *
+ * @param name Entity name, such as "dudley", "%nell", or "[dtd]".
+ * @param publicId Either a normalized public ID, or null.
+ * @param baseURI Absolute base URI associated with systemId.
+ * @param systemId URI found in entity declaration (may be
+ * relative to baseURI).
+ *
+ * @return Input source for accessing the external entity, or null
+ * if no mapping was found. The input source may have opened
+ * the stream, and will have a fully resolved URI.
+ *
+ * @see #getExternalSubset
+ */
+ public InputSource resolveEntity (
+ String name, // UNUSED ... systemId is always non-null
+ String publicId,
+ String baseURI, // UNUSED ... it just lets sysId be relative
+ String systemId
+ ) throws SAXException, IOException
+ {
+ if (loadingPermitted)
+ disableLoading ();
+
+ try {
+ // steps as found in OASIS XML catalog spec 7.1.2
+ // steps 1, 8 involve looping over the list of catalogs
+ for (int i = 0; i < catalogs.length; i++) {
+ InputSource retval;
+ retval = catalogs [i].resolve (usingPublic, publicId, systemId);
+ if (retval != null)
+ return retval;;
+ }
+ } catch (DoneDelegation x) {
+ // done!
+ }
+ // step 9 involves returning "no match"
+ return null;
+ }
+
+
+ /**
+ * "New Style" parser callback to add an external subset.
+ * For documents that don't include an external subset, this may
+ * return one according to <em>doctype</em> catalog entries.
+ * (This functionality is not a core part of the OASIS XML Catalog
+ * specification, though it's presented in an appendix.)
+ * If no such entry is defined, this returns null to indicate that
+ * this document will not be modified to include such a subset.
+ * Calls to this method prevent explicit loading of additional catalogs
+ * using {@link #loadCatalog loadCatalog()}.
+ *
+ * <p><em>Warning:</em> That catalog functionality can be dangerous.
+ * It can provide definitions of general entities, and thereby mask
+ * certain well formedess errors.
+ *
+ * @param name Name of the document element, either as declared in
+ * a DOCTYPE declaration or as observed in the text.
+ * @param baseURI Document's base URI (absolute).
+ *
+ * @return Input source for accessing the external subset, or null
+ * if no mapping was found. The input source may have opened
+ * the stream, and will have a fully resolved URI.
+ */
+ public InputSource getExternalSubset (String name, String baseURI)
+ throws SAXException, IOException
+ {
+ if (loadingPermitted)
+ disableLoading ();
+ try {
+ for (int i = 0; i < catalogs.length; i++) {
+ InputSource retval = catalogs [i].getExternalSubset (name);
+ if (retval != null)
+ return retval;
+ }
+ } catch (DoneDelegation x) {
+ // done!
+ }
+ return null;
+ }
+
+
+ /**
+ * "Old Style" external entity resolution for parsers.
+ * This API provides only core functionality.
+ * Calls to this method prevent explicit loading of additional catalogs
+ * using {@link #loadCatalog loadCatalog()}.
+ *
+ * <p>The functional limitations of this interface include:</p><ul>
+ *
+ * <li>Since system IDs will be absolutized before the resolver
+ * sees them, matching against relative URIs won't work.
+ * This may affect <em>system</em>, <em>rewriteSystem</em>,
+ * and <em>delegateSystem</em> catalog entries.
+ *
+ * <li>Because of that absolutization, documents declaring entities
+ * with system IDs using URI schemes that the JVM does not recognize
+ * may be unparsable. URI schemes such as <em>file:/</em>,
+ * <em>http://</em>, <em>https://</em>, and <em>ftp://</em>
+ * will usually work reliably.
+ *
+ * <li>Because missing external subsets can't be provided, the
+ * <em>doctype</em> catalog entries will be ignored.
+ * (The {@link #getExternalSubset getExternalSubset()} method is
+ * a "New Style" resolution option.)
+ *
+ * </ul>
+ *
+ * <p>Applications can tell whether this limited functionality will be
+ * used: if the feature flag associated with the {@link EntityResolver2}
+ * interface is not <em>true</em>, the limitations apply. Applications
+ * can't usually know whether a given document and catalog will trigger
+ * those limitations. The issue can only be bypassed by operational
+ * procedures such as not using catalogs or documents which involve
+ * those features.
+ *
+ * @param publicId Either a normalized public ID, or null
+ * @param systemId Always an absolute URI.
+ *
+ * @return Input source for accessing the external entity, or null
+ * if no mapping was found. The input source may have opened
+ * the stream, and will have a fully resolved URI.
+ */
+ final public InputSource resolveEntity (String publicId, String systemId)
+ throws SAXException, IOException
+ {
+ return resolveEntity (null, publicId, null, systemId);
+ }
+
+
+ /**
+ * Resolves a URI reference that's not defined to the DTD.
+ * This is intended for use with URIs found in document text, such as
+ * <em>xml-stylesheet</em> processing instructions and in attribute
+ * values, where they are not recognized as URIs by XML parsers.
+ * Calls to this method prevent explicit loading of additional catalogs
+ * using {@link #loadCatalog loadCatalog()}.
+ *
+ * <p>This functionality is supported by the OASIS XML Catalog
+ * specification, but will never be invoked by an XML parser.
+ * It corresponds closely to functionality for mapping system
+ * identifiers for entities declared in DTDs; closely enough that
+ * this implementation's default behavior is that they be
+ * identical, to minimize potential confusion.
+ *
+ * <p>This method could be useful when implementing the
+ * {@link javax.xml.transform.URIResolver} interface, wrapping the
+ * input source in a {@link javax.xml.transform.sax.SAXSource}.
+ *
+ * @see #isUnified
+ * @see #setUnified
+ *
+ * @param baseURI The relevant base URI as specified by the XML Base
+ * specification. This recognizes <em>xml:base</em> attributes
+ * as overriding the actual (physical) base URI.
+ * @param uri Either an absolute URI, or one relative to baseURI
+ *
+ * @return Input source for accessing the mapped URI, or null
+ * if no mapping was found. The input source may have opened
+ * the stream, and will have a fully resolved URI.
+ */
+ public InputSource resolveURI (String baseURI, String uri)
+ throws SAXException, IOException
+ {
+ if (loadingPermitted)
+ disableLoading ();
+
+ // NOTE: baseURI isn't used here, but caller MUST have it,
+ // and heuristics _might_ use it in the future ... plus,
+ // it's symmetric with resolveEntity ().
+
+ // steps 1, 6 involve looping
+ try {
+ for (int i = 0; i < catalogs.length; i++) {
+ InputSource tmp = catalogs [i].resolveURI (uri);
+ if (tmp != null)
+ return tmp;
+ }
+ } catch (DoneDelegation x) {
+ // done
+ }
+ // step 7 reports no match
+ return null;
+ }
+
+
+ /**
+ * Records that catalog loading is no longer permitted.
+ * Loading is automatically disabled when lookups are performed,
+ * and should be manually disabled when <em>startDTD()</em> (or
+ * any other DTD declaration callback) is invoked, or at the latest
+ * when the document root element is seen.
+ */
+ public synchronized void disableLoading ()
+ {
+ // NOTE: this method and loadCatalog() are synchronized
+ // so that it's impossible to load (top level) catalogs
+ // after lookups start. Likewise, deferred loading is also
+ // synchronized (for "next" and delegated catalogs) to
+ // ensure that parsers can share resolvers.
+ loadingPermitted = false;
+ }
+
+
+ /**
+ * Returns the error handler used to report catalog errors.
+ * Null is returned if the parser's default error handling
+ * will be used.
+ *
+ * @see #setErrorHandler
+ */
+ public ErrorHandler getErrorHandler ()
+ { return errorHandler; }
+
+ /**
+ * Assigns the error handler used to report catalog errors.
+ * These errors may come either from the SAX2 parser or
+ * from the catalog parsing code driven by the parser.
+ *
+ * <p> If you're sharing the resolver between parsers, don't
+ * change this once lookups have begun.
+ *
+ * @see #getErrorHandler
+ *
+ * @param parser The error handler, or null saying to use the default
+ * (no diagnostics, and only fatal errors terminate loading).
+ */
+ public void setErrorHandler (ErrorHandler handler)
+ { errorHandler = handler; }
+
+
+ /**
+ * Returns the name of the SAX2 parser class used to parse catalogs.
+ * Null is returned if the system default is used.
+ * @see #setParserClass
+ */
+ public String getParserClass ()
+ { return parserClass; }
+
+ /**
+ * Names the SAX2 parser class used to parse catalogs.
+ *
+ * <p> If you're sharing the resolver between parsers, don't change
+ * this once lookups have begun.
+ *
+ * <p> Note that in order to properly support the <em>xml:base</em>
+ * attribute and relative URI resolution, the SAX parser used to parse
+ * the catalog must provide a {@link Locator} and support the optional
+ * declaration and lexical handlers.
+ *
+ * @see #getParserClass
+ *
+ * @param parser The parser class name, or null saying to use the
+ * system default SAX2 parser.
+ */
+ public void setParserClass (String parser)
+ { parserClass = parser; }
+
+
+ /**
+ * Returns true (the default) if all methods resolve
+ * a given URI in the same way.
+ * Returns false if calls resolving URIs as entities (such as
+ * {@link #resolveEntity resolveEntity()}) use different catalog entries
+ * than those resolving them as URIs ({@link #resolveURI resolveURI()}),
+ * which will generally produce different results.
+ *
+ * <p>The OASIS XML Catalog specification defines two related schemes
+ * to map URIs "as URIs" or "as system IDs".
+ * URIs use <em>uri</em>, <em>rewriteURI</em>, and <em>delegateURI</em>
+ * elements. System IDs do the same things with <em>systemId</em>,
+ * <em>rewriteSystemId</em>, and <em>delegateSystemId</em>.
+ * It's confusing and error prone to maintain two parallel copies of
+ * such data. Accordingly, this class makes that behavior optional.
+ * The <em>unified</em> interpretation of URI mappings is preferred,
+ * since it prevents surprises where one URI gets mapped to different
+ * contents depending on whether the reference happens to have come
+ * from a DTD (or not).
+ *
+ * @see #setUnified
+ */
+ public boolean isUnified ()
+ { return unified; }
+
+ /**
+ * Assigns the value of the flag returned by {@link #isUnified}.
+ * Set it to false to be strictly conformant with the OASIS XML Catalog
+ * specification. Set it to true to make all mappings for a given URI
+ * give the same result, regardless of the reason for the mapping.
+ *
+ * <p>Don't change this once you've loaded the first catalog.
+ *
+ * @param value new flag setting
+ */
+ public void setUnified (boolean value)
+ { unified = value; }
+
+
+ /**
+ * Returns true (the default) if a catalog's public identifier
+ * mappings will be used.
+ * When false is returned, such mappings are ignored except when
+ * system IDs are discarded, such as for
+ * entities using the <em>urn:publicid:</em> URI scheme in their
+ * system identifiers. (See RFC 3151 for information about that
+ * URI scheme. Using it in system identifiers may not work well
+ * with many SAX parsers unless the <em>resolve-dtd-uris</em>
+ * feature flag is set to false.)
+ * @see #setUsingPublic
+ */
+ public boolean isUsingPublic ()
+ { return usingPublic; }
+
+ /**
+ * Specifies which catalog search mode is used.
+ * By default, public identifier mappings are able to override system
+ * identifiers when both are available.
+ * Applications may choose to ignore public
+ * identifier mappings in such cases, so that system identifiers
+ * declared in DTDs will only be overridden by an explicit catalog
+ * match for that system ID.
+ *
+ * <p> If you're sharing the resolver between parsers, don't
+ * change this once lookups have begun.
+ * @see #isUsingPublic
+ *
+ * @param value true to always use public identifier mappings,
+ * false to only use them for system ids using the <em>urn:publicid:</em>
+ * URI scheme.
+ */
+ public void setUsingPublic (boolean value)
+ { usingPublic = value; }
+
+
+
+ // hmm, what's this do? :)
+ private static Catalog loadCatalog (
+ String parserClass,
+ ErrorHandler eh,
+ String uri,
+ boolean unified
+ ) throws SAXException, IOException
+ {
+ XMLReader parser;
+ Loader loader;
+ boolean doesIntern = false;
+
+ if (parserClass == null)
+ parser = XMLReaderFactory.createXMLReader ();
+ else
+ parser = XMLReaderFactory.createXMLReader (parserClass);
+ if (eh != null)
+ parser.setErrorHandler (eh);
+ // resolve-dtd-entities is at default value (unrecognized == true)
+
+ try {
+ doesIntern = parser.getFeature (
+ "http://xml.org/sax/features/string-interning");
+ } catch (SAXNotRecognizedException e) { }
+
+ loader = new Loader (doesIntern, eh, unified);
+ loader.cat.parserClass = parserClass;
+ loader.cat.catalogURI = uri;
+
+ parser.setContentHandler (loader);
+ parser.setProperty (
+ "http://xml.org/sax/properties/declaration-handler",
+ loader);
+ parser.setProperty (
+ "http://xml.org/sax/properties/lexical-handler",
+ loader);
+ parser.parse (uri);
+
+ return loader.cat;
+ }
+
+ // perform one or both the normalizations for public ids
+ private static String normalizePublicId (boolean full, String publicId)
+ {
+ if (publicId.startsWith ("urn:publicid:")) {
+ StringBuffer buf = new StringBuffer ();
+ char chars [] = publicId.toCharArray ();
+boolean hasbug = false;
+
+ for (int i = 13; i < chars.length; i++) {
+ switch (chars [i]) {
+ case '+': buf.append (' '); continue;
+ case ':': buf.append ("//"); continue;
+ case ';': buf.append ("::"); continue;
+ case '%':
+// FIXME unhex that char! meanwhile, warn and fallthrough ...
+ hasbug = true;
+ default: buf.append (chars [i]); continue;
+ }
+ }
+ publicId = buf.toString ();
+if (hasbug)
+System.err.println ("nyet unhexing public id: " + publicId);
+ full = true;
+ }
+
+ // SAX parsers do everything except that URN mapping, but
+ // we can't trust other sources to normalize correctly
+ if (full) {
+ StringTokenizer tokens;
+ String token;
+
+ tokens = new StringTokenizer (publicId, " \r\n");
+ publicId = null;
+ while (tokens.hasMoreTokens ()) {
+ if (publicId == null)
+ publicId = tokens.nextToken ();
+ else
+ publicId += " " + tokens.nextToken ();
+ }
+ }
+ return publicId;
+ }
+
+ private static boolean isUriExcluded (int c)
+ { return c <= 0x20 || c >= 0x7f || "\"<>^`{|}".indexOf (c) != -1; }
+
+ private static int hexNibble (int c)
+ {
+ if (c < 10)
+ return c + '0';
+ return ('a' - 10) + c;
+ }
+
+ // handles URIs with "excluded" characters
+ private static String normalizeURI (String systemId)
+ {
+ int length = systemId.length ();
+
+ for (int i = 0; i < length; i++) {
+ char c = systemId.charAt (i);
+
+ // escape non-ASCII plus "excluded" characters
+ if (isUriExcluded (c)) {
+ byte buf [];
+ ByteArrayOutputStream out;
+ int b;
+
+ // a JVM that doesn't know UTF8 and 8859_1 is unusable!
+ try {
+ buf = systemId.getBytes ("UTF8");
+ out = new ByteArrayOutputStream (buf.length + 10);
+
+ for (i = 0; i < buf.length; i++) {
+ b = buf [i] & 0x0ff;
+ if (isUriExcluded (b)) {
+ out.write ((int) '%');
+ out.write (hexNibble (b >> 4));
+ out.write (hexNibble (b & 0x0f));
+ } else
+ out.write (b);
+ }
+ return out.toString ("8859_1");
+ } catch (IOException e) {
+ throw new RuntimeException (
+ "can't normalize URI: " + e.getMessage ());
+ }
+ }
+ }
+ return systemId;
+ }
+
+ // thrown to mark authoritative end of a search
+ private static class DoneDelegation extends SAXException
+ {
+ DoneDelegation () { }
+ }
+
+
+ /**
+ * Represents a OASIS XML Catalog, and encapsulates much of
+ * the catalog functionality.
+ */
+ private static class Catalog
+ {
+ // loading infrastructure
+ String catalogURI;
+ ErrorHandler eh;
+ boolean unified;
+ String parserClass;
+
+ // catalog data
+ boolean hasPreference;
+ boolean usingPublic;
+
+ Hashtable publicIds;
+ Hashtable publicDelegations;
+
+ Hashtable systemIds;
+ Hashtable systemRewrites;
+ Hashtable systemDelegations;
+
+ Hashtable uris;
+ Hashtable uriRewrites;
+ Hashtable uriDelegations;
+
+ Hashtable doctypes;
+
+ Vector next;
+
+ // nonpublic!
+ Catalog () { }
+
+
+ // steps as found in OASIS XML catalog spec 7.1.2
+ private InputSource locatePublicId (String publicId)
+ throws SAXException, IOException
+ {
+ // 5. return (first) 'public' entry
+ if (publicIds != null) {
+ String retval = (String) publicIds.get (publicId);
+ if (retval != null) {
+ // IF the URI is accessible ...
+ return new InputSource (retval);
+ }
+ }
+
+ // 6. return delegatePublic catalog match [complex]
+ if (publicDelegations != null)
+ return checkDelegations (publicDelegations, publicId,
+ publicId, null);
+
+ return null;
+ }
+
+ // steps as found in OASIS XML catalog spec 7.1.2 or 7.2.2
+ private InputSource mapURI (
+ String uri,
+ Hashtable ids,
+ Hashtable rewrites,
+ Hashtable delegations
+ ) throws SAXException, IOException
+ {
+ // 7.1.2: 2. return (first) 'system' entry
+ // 7.2.2: 2. return (first) 'uri' entry
+ if (ids != null) {
+ String retval = (String) ids.get (uri);
+ if (retval != null) {
+ // IF the URI is accessible ...
+ return new InputSource (retval);
+ }
+ }
+
+ // 7.1.2: 3. return 'rewriteSystem' entries
+ // 7.2.2: 3. return 'rewriteURI' entries
+ if (rewrites != null) {
+ String prefix = null;
+ String replace = null;
+ int prefixLen = -1;
+
+ for (Enumeration e = rewrites.keys ();
+ e.hasMoreElements ();
+ /* NOP */) {
+ String temp = (String) e.nextElement ();
+ int len = -1;
+
+ if (!uri.startsWith (temp))
+ continue;
+ if (prefix != null
+ && (len = temp.length ()) < prefixLen)
+ continue;
+ prefix = temp;
+ prefixLen = len;
+ replace = (String) rewrites.get (temp);
+ }
+ if (prefix != null) {
+ StringBuffer buf = new StringBuffer (replace);
+ buf.append (uri.substring (prefixLen));
+ // IF the URI is accessible ...
+ return new InputSource (buf.toString ());
+ }
+ }
+
+ // 7.1.2: 4. return 'delegateSystem' catalog match [complex]
+ // 7.2.2: 4. return 'delegateURI' catalog match [complex]
+ if (delegations != null)
+ return checkDelegations (delegations, uri, null, uri);
+
+ return null;
+ }
+
+
+ /**
+ * Returns a URI for an external entity.
+ */
+ public InputSource resolve (
+ boolean usingPublic,
+ String publicId,
+ String systemId
+ ) throws SAXException, IOException
+ {
+ boolean preferSystem;
+ InputSource retval;
+
+ if (hasPreference)
+ preferSystem = !this.usingPublic;
+ else
+ preferSystem = !usingPublic;
+
+ if (publicId != null)
+ publicId = normalizePublicId (false, publicId);
+
+ // behavior here matches section 7.1.1 of the oasis spec
+ if (systemId != null) {
+ if (systemId.startsWith ("urn:publicid:")) {
+ String temp = normalizePublicId (true, systemId);
+ if (publicId == null) {
+ publicId = temp;
+ systemId = null;
+ } else if (!publicId.equals (temp)) {
+ // error; ok to recover by:
+ systemId = null;
+ }
+ } else
+ systemId = normalizeURI (systemId);
+ }
+
+ if (systemId == null && publicId == null)
+ return null;
+
+ if (systemId != null) {
+ retval = mapURI (systemId, systemIds, systemRewrites,
+ systemDelegations);
+ if (retval != null) {
+ retval.setPublicId (publicId);
+ return retval;
+ }
+ }
+
+ if (publicId != null
+ && !(systemId != null && preferSystem)) {
+ retval = locatePublicId (publicId);
+ if (retval != null) {
+ retval.setPublicId (publicId);
+ return retval;
+ }
+ }
+
+ // 7. apply nextCatalog entries
+ if (next != null) {
+ int length = next.size ();
+ for (int i = 0; i < length; i++) {
+ Catalog n = getNext (i);
+ retval = n.resolve (usingPublic, publicId, systemId);
+ if (retval != null)
+ return retval;
+ }
+ }
+
+ return null;
+ }
+
+ /**
+ * Maps one URI into another, for resources that are not defined
+ * using XML external entity or notation syntax.
+ */
+ public InputSource resolveURI (String uri)
+ throws SAXException, IOException
+ {
+ if (uri.startsWith ("urn:publicid:"))
+ return resolve (true, normalizePublicId (true, uri), null);
+
+ InputSource retval;
+
+ uri = normalizeURI (uri);
+
+ // 7.2.2 steps 2-4
+ retval = mapURI (uri, uris, uriRewrites, uriDelegations);
+ if (retval != null)
+ return retval;
+
+ // 7.2.2 step 5. apply nextCatalog entries
+ if (next != null) {
+ int length = next.size ();
+ for (int i = 0; i < length; i++) {
+ Catalog n = getNext (i);
+ retval = n.resolveURI (uri);
+ if (retval != null)
+ return retval;
+ }
+ }
+
+ return null;
+ }
+
+
+ /**
+ * Finds the external subset associated with a given root element.
+ */
+ public InputSource getExternalSubset (String name)
+ throws SAXException, IOException
+ {
+ if (doctypes != null) {
+ String value = (String) doctypes.get (name);
+ if (value != null) {
+ // IF the URI is accessible ...
+ return new InputSource (value);
+ }
+ }
+ if (next != null) {
+ int length = next.size ();
+ for (int i = 0; i < length; i++) {
+ Catalog n = getNext (i);
+ if (n == null)
+ continue;
+ InputSource retval = n.getExternalSubset (name);
+ if (retval != null)
+ return retval;
+ }
+ }
+ return null;
+ }
+
+ private synchronized Catalog getNext (int i)
+ throws SAXException, IOException
+ {
+ Object obj;
+
+ if (next == null || i < 0 || i >= next.size ())
+ return null;
+ obj = next.elementAt (i);
+ if (obj instanceof Catalog)
+ return (Catalog) obj;
+
+ // ok, we deferred reading that catalog till now.
+ // load and cache it.
+ Catalog cat = null;
+
+ try {
+ cat = loadCatalog (parserClass, eh, (String) obj, unified);
+ next.setElementAt (cat, i);
+ } catch (SAXException e) {
+ // must fail quietly, says the OASIS spec
+ } catch (IOException e) {
+ // same applies here
+ }
+ return cat;
+ }
+
+ private InputSource checkDelegations (
+ Hashtable delegations,
+ String id,
+ String publicId, // only one of public/system
+ String systemId // will be non-null...
+ ) throws SAXException, IOException
+ {
+ Vector matches = null;
+ int length = 0;
+
+ // first, see if any prefixes match.
+ for (Enumeration e = delegations.keys ();
+ e.hasMoreElements ();
+ /* NOP */) {
+ String prefix = (String) e.nextElement ();
+
+ if (!id.startsWith (prefix))
+ continue;
+ if (matches == null)
+ matches = new Vector ();
+
+ // maintain in longer->shorter sorted order
+ // NOTE: assumes not many matches will fire!
+ int index;
+
+ for (index = 0; index < length; index++) {
+ String temp = (String) matches.elementAt (index);
+ if (prefix.length () > temp.length ()) {
+ matches.insertElementAt (prefix, index);
+ break;
+ }
+ }
+ if (index == length)
+ matches.addElement (prefix);
+ length++;
+ }
+ if (matches == null)
+ return null;
+
+ // now we know the list of catalogs to replace our "top level"
+ // list ... we use it here, rather than somehow going back and
+ // restarting, since this helps avoid reading most catalogs.
+ // this assumes stackspace won't be a problem.
+ for (int i = 0; i < length; i++) {
+ Catalog catalog = null;
+ InputSource result;
+
+ // get this catalog. we may not have read it yet.
+ synchronized (delegations) {
+ Object prefix = matches.elementAt (i);
+ Object cat = delegations.get (prefix);
+
+ if (cat instanceof Catalog)
+ catalog = (Catalog) cat;
+ else {
+ try {
+ // load and cache that catalog
+ catalog = loadCatalog (parserClass, eh,
+ (String) cat, unified);
+ delegations.put (prefix, catalog);
+ } catch (SAXException e) {
+ // must ignore, says the OASIS spec
+ } catch (IOException e) {
+ // same applies here
+ }
+ }
+ }
+
+ // ignore failed loads, and proceed
+ if (catalog == null)
+ continue;
+
+ // we have a catalog ... resolve!
+ // usingPublic value can't matter, there's no choice
+ result = catalog.resolve (true, publicId, systemId);
+ if (result != null)
+ return result;
+ }
+
+ // if there were no successes, the entire
+ // lookup failed (all the way to top level)
+ throw new DoneDelegation ();
+ }
+ }
+
+
+ /** This is the namespace URI used for OASIS XML Catalogs. */
+ private static final String catalogNamespace =
+ "urn:oasis:names:tc:entity:xmlns:xml:catalog";
+
+
+ /**
+ * Loads/unmarshals one catalog.
+ */
+ private static class Loader extends DefaultHandler2
+ {
+ private boolean preInterned;
+ private ErrorHandler handler;
+ private boolean unified;
+ private int ignoreDepth;
+ private Locator locator;
+ private boolean started;
+ private Hashtable externals;
+ private Stack bases;
+
+ Catalog cat = new Catalog ();
+
+
+ /**
+ * Constructor.
+ * @param flag true iff the parser already interns strings.
+ * @param eh Errors and warnings are delegated to this.
+ * @param unified true keeps one table for URI mappings;
+ * false matches OASIS spec, storing mappings
+ * for URIs and SYSTEM ids in parallel tables.
+ */
+ Loader (boolean flag, ErrorHandler eh, boolean unified)
+ {
+ preInterned = flag;
+ handler = eh;
+ this.unified = unified;
+ cat.unified = unified;
+ cat.eh = eh;
+ }
+
+
+ // strips out fragments
+ private String nofrag (String uri)
+ throws SAXException
+ {
+ if (uri.indexOf ('#') != -1) {
+ warn ("URI with fragment: " + uri);
+ uri = uri.substring (0, uri.indexOf ('#'));
+ }
+ return uri;
+ }
+
+ // absolutizes relative URIs
+ private String absolutize (String uri)
+ throws SAXException
+ {
+ // avoid creating URLs if they're already absolutized,
+ // or if the URI is already using a known scheme
+ if (uri.startsWith ("file:/")
+ || uri.startsWith ("http:/")
+ || uri.startsWith ("https:/")
+ || uri.startsWith ("ftp:/")
+ || uri.startsWith ("urn:")
+ )
+ return uri;
+
+ // otherwise, let's hope the JDK handles this URI scheme.
+ try {
+ URL base = (URL) bases.peek ();
+ return new URL (base, uri).toString ();
+ } catch (Exception e) {
+ fatal ("can't absolutize URI: " + uri);
+ return null;
+ }
+ }
+
+ // recoverable error
+ private void error (String message)
+ throws SAXException
+ {
+ if (handler == null)
+ return;
+ handler.error (new SAXParseException (message, locator));
+ }
+
+ // nonrecoverable error
+ private void fatal (String message)
+ throws SAXException
+ {
+ SAXParseException spe;
+
+ spe = new SAXParseException (message, locator);
+ if (handler != null)
+ handler.fatalError (spe);
+ throw spe;
+ }
+
+ // low severity problem
+ private void warn (String message)
+ throws SAXException
+ {
+ if (handler == null)
+ return;
+ handler.warning (new SAXParseException (message, locator));
+ }
+
+ // callbacks:
+
+ public void setDocumentLocator (Locator l)
+ { locator = l; }
+
+ public void startDocument ()
+ throws SAXException
+ {
+ if (locator == null)
+ error ("no locator!");
+ bases = new Stack ();
+ String uri = locator.getSystemId ();
+ try {
+ bases.push (new URL (uri));
+ } catch (IOException e) {
+ fatal ("bad document base URI: " + uri);
+ }
+ }
+
+ public void endDocument ()
+ throws SAXException
+ {
+ try {
+ if (!started)
+ error ("not a catalog!");
+ } finally {
+ locator = null;
+ handler = null;
+ externals = null;
+ bases = null;
+ }
+ }
+
+ // XML Base support for external entities.
+
+ // NOTE: expects parser is in default "resolve-dtd-uris" mode.
+ public void externalEntityDecl (String name, String pub, String sys)
+ throws SAXException
+ {
+ if (externals == null)
+ externals = new Hashtable ();
+ if (externals.get (name) == null)
+ externals.put (name, pub);
+ }
+
+ public void startEntity (String name)
+ throws SAXException
+ {
+ if (externals == null)
+ return;
+ String uri = (String) externals.get (name);
+
+ // NOTE: breaks if an EntityResolver substitutes these URIs.
+ // If toplevel loader supports one, must intercept calls...
+ if (uri != null) {
+ try {
+ bases.push (new URL (uri));
+ } catch (IOException e) {
+ fatal ("entity '" + name + "', bad URI: " + uri);
+ }
+ }
+ }
+
+ public void endEntity (String name)
+ {
+ if (externals == null)
+ return;
+ String value = (String) externals.get (name);
+
+ if (value != null)
+ bases.pop ();
+ }
+
+ /**
+ * Processes catalog elements, saving their data.
+ */
+ public void startElement (String namespace, String local,
+ String qName, Attributes atts)
+ throws SAXException
+ {
+ // must ignore non-catalog elements, and their contents
+ if (ignoreDepth != 0 || !catalogNamespace.equals (namespace)) {
+ ignoreDepth++;
+ return;
+ }
+
+ // basic sanity checks
+ if (!preInterned)
+ local = local.intern ();
+ if (!started) {
+ started = true;
+ if ("catalog" != local)
+ fatal ("root element not 'catalog': " + local);
+ }
+
+ // Handle any xml:base attribute
+ String xmlbase = atts.getValue ("xml:base");
+
+ if (xmlbase != null) {
+ URL base = (URL) bases.peek ();
+ try {
+ base = new URL (base, xmlbase);
+ } catch (IOException e) {
+ fatal ("can't resolve xml:base attribute: " + xmlbase);
+ }
+ bases.push (base);
+ } else
+ bases.push (bases.peek ());
+
+ // fetch multi-element attributes, apply standard tweaks
+ // values (uri, catalog, rewritePrefix) get normalized too,
+ // as a precaution and since we may compare the values
+ String catalog = atts.getValue ("catalog");
+ if (catalog != null)
+ catalog = normalizeURI (absolutize (catalog));
+
+ String rewritePrefix = atts.getValue ("rewritePrefix");
+ if (rewritePrefix != null)
+ rewritePrefix = normalizeURI (absolutize (rewritePrefix));
+
+ String systemIdStartString;
+ systemIdStartString = atts.getValue ("systemIdStartString");
+ if (systemIdStartString != null) {
+ systemIdStartString = normalizeURI (systemIdStartString);
+ // unmatchable <rewriteSystemId>, <delegateSystemId> elements
+ if (systemIdStartString.startsWith ("urn:publicid:")) {
+ error ("systemIdStartString is really a publicId!!");
+ return;
+ }
+ }
+
+ String uri = atts.getValue ("uri");
+ if (uri != null)
+ uri = normalizeURI (absolutize (uri));
+
+ String uriStartString;
+ uriStartString = atts.getValue ("uriStartString");
+ if (uriStartString != null) {
+ uriStartString = normalizeURI (uriStartString);
+ // unmatchable <rewriteURI>, <delegateURI> elements
+ if (uriStartString.startsWith ("urn:publicid:")) {
+ error ("uriStartString is really a publicId!!");
+ return;
+ }
+ }
+
+ // strictly speaking "group" and "catalog" shouldn't nest
+ // ... arbitrary restriction, no evident motivation
+
+// FIXME stack "prefer" settings (two elements only!) and use
+// them to populate different public mapping/delegation tables
+
+ if ("catalog" == local || "group" == local) {
+ String prefer = atts.getValue ("prefer");
+
+ if (prefer != null && !"public".equals (prefer)) {
+ if (!"system".equals (prefer)) {
+ error ("in <" + local + " ... prefer='...'>, "
+ + "assuming 'public'");
+ prefer = "public";
+ }
+ }
+ if (prefer != null) {
+ if ("catalog" == local) {
+ cat.hasPreference = true;
+ cat.usingPublic = "public".equals (prefer);
+ } else {
+ if (!cat.hasPreference || cat.usingPublic
+ != "public".equals (prefer)) {
+fatal ("<group prefer=...> case not handled");
+ }
+ }
+ } else if ("group" == local && cat.hasPreference) {
+fatal ("<group prefer=...> case not handled");
+ }
+
+ //
+ // PUBLIC ids: cleanly set up for id substitution
+ //
+ } else if ("public" == local) {
+ String publicId = atts.getValue ("publicId");
+ String value = null;
+
+ if (publicId == null || uri == null) {
+ error ("expecting <public publicId=... uri=.../>");
+ return;
+ }
+ publicId = normalizePublicId (true, publicId);
+ uri = nofrag (uri);
+ if (cat.publicIds == null)
+ cat.publicIds = new Hashtable ();
+ else
+ value = (String) cat.publicIds.get (publicId);
+ if (value != null) {
+ if (!value.equals (uri))
+ warn ("ignoring <public...> entry for " + publicId);
+ } else
+ cat.publicIds.put (publicId, uri);
+
+ } else if ("delegatePublic" == local) {
+ String publicIdStartString;
+ Object value = null;
+
+ publicIdStartString = atts.getValue ("publicIdStartString");
+ if (publicIdStartString == null || catalog == null) {
+ error ("expecting <delegatePublic "
+ + "publicIdStartString=... catalog=.../>");
+ return;
+ }
+ publicIdStartString = normalizePublicId (true,
+ publicIdStartString);
+ if (cat.publicDelegations == null)
+ cat.publicDelegations = new Hashtable ();
+ else
+ value = cat.publicDelegations.get (publicIdStartString);
+ if (value != null) {
+ if (!value.equals (catalog))
+ warn ("ignoring <delegatePublic...> entry for "
+ + uriStartString);
+ } else
+ cat.publicDelegations.put (publicIdStartString, catalog);
+
+
+ //
+ // SYSTEM ids: need substitution due to operational issues
+ //
+ } else if ("system" == local) {
+ String systemId = atts.getValue ("systemId");
+ String value = null;
+
+ if (systemId == null || uri == null) {
+ error ("expecting <system systemId=... uri=.../>");
+ return;
+ }
+ systemId = normalizeURI (systemId);
+ uri = nofrag (uri);
+ if (systemId.startsWith ("urn:publicid:")) {
+ error ("systemId is really a publicId!!");
+ return;
+ }
+ if (cat.systemIds == null) {
+ cat.systemIds = new Hashtable ();
+ if (unified)
+ cat.uris = cat.systemIds;
+ } else
+ value = (String) cat.systemIds.get (systemId);
+ if (value != null) {
+ if (!value.equals (uri))
+ warn ("ignoring <system...> entry for " + systemId);
+ } else
+ cat.systemIds.put (systemId, uri);
+
+ } else if ("rewriteSystem" == local) {
+ String value = null;
+
+ if (systemIdStartString == null || rewritePrefix == null
+ || systemIdStartString.length () == 0
+ || rewritePrefix.length () == 0
+ ) {
+ error ("expecting <rewriteSystem "
+ + "systemIdStartString=... rewritePrefix=.../>");
+ return;
+ }
+ if (cat.systemRewrites == null) {
+ cat.systemRewrites = new Hashtable ();
+ if (unified)
+ cat.uriRewrites = cat.systemRewrites;
+ } else
+ value = (String) cat.systemRewrites.get (
+ systemIdStartString);
+ if (value != null) {
+ if (!value.equals (rewritePrefix))
+ warn ("ignoring <rewriteSystem...> entry for "
+ + systemIdStartString);
+ } else
+ cat.systemRewrites.put (systemIdStartString,
+ rewritePrefix);
+
+ } else if ("delegateSystem" == local) {
+ Object value = null;
+
+ if (systemIdStartString == null || catalog == null) {
+ error ("expecting <delegateSystem "
+ + "systemIdStartString=... catalog=.../>");
+ return;
+ }
+ if (cat.systemDelegations == null) {
+ cat.systemDelegations = new Hashtable ();
+ if (unified)
+ cat.uriDelegations = cat.systemDelegations;
+ } else
+ value = cat.systemDelegations.get (systemIdStartString);
+ if (value != null) {
+ if (!value.equals (catalog))
+ warn ("ignoring <delegateSystem...> entry for "
+ + uriStartString);
+ } else
+ cat.systemDelegations.put (systemIdStartString, catalog);
+
+
+ //
+ // URI: just like "system" ID support, except that
+ // fragment IDs are disallowed in "system" elements.
+ //
+ } else if ("uri" == local) {
+ String name = atts.getValue ("name");
+ String value = null;
+
+ if (name == null || uri == null) {
+ error ("expecting <uri name=... uri=.../>");
+ return;
+ }
+ if (name.startsWith ("urn:publicid:")) {
+ error ("name is really a publicId!!");
+ return;
+ }
+ name = normalizeURI (name);
+ if (cat.uris == null) {
+ cat.uris = new Hashtable ();
+ if (unified)
+ cat.systemIds = cat.uris;
+ } else
+ value = (String) cat.uris.get (name);
+ if (value != null) {
+ if (!value.equals (uri))
+ warn ("ignoring <uri...> entry for " + name);
+ } else
+ cat.uris.put (name, uri);
+
+ } else if ("rewriteURI" == local) {
+ String value = null;
+
+ if (uriStartString == null || rewritePrefix == null
+ || uriStartString.length () == 0
+ || rewritePrefix.length () == 0
+ ) {
+ error ("expecting <rewriteURI "
+ + "uriStartString=... rewritePrefix=.../>");
+ return;
+ }
+ if (cat.uriRewrites == null) {
+ cat.uriRewrites = new Hashtable ();
+ if (unified)
+ cat.systemRewrites = cat.uriRewrites;
+ } else
+ value = (String) cat.uriRewrites.get (uriStartString);
+ if (value != null) {
+ if (!value.equals (rewritePrefix))
+ warn ("ignoring <rewriteURI...> entry for "
+ + uriStartString);
+ } else
+ cat.uriRewrites.put (uriStartString, rewritePrefix);
+
+ } else if ("delegateURI" == local) {
+ Object value = null;
+
+ if (uriStartString == null || catalog == null) {
+ error ("expecting <delegateURI "
+ + "uriStartString=... catalog=.../>");
+ return;
+ }
+ if (cat.uriDelegations == null) {
+ cat.uriDelegations = new Hashtable ();
+ if (unified)
+ cat.systemDelegations = cat.uriDelegations;
+ } else
+ value = cat.uriDelegations.get (uriStartString);
+ if (value != null) {
+ if (!value.equals (catalog))
+ warn ("ignoring <delegateURI...> entry for "
+ + uriStartString);
+ } else
+ cat.uriDelegations.put (uriStartString, catalog);
+
+ //
+ // NON-DELEGATING approach to modularity
+ //
+ } else if ("nextCatalog" == local) {
+ if (catalog == null) {
+ error ("expecting <nextCatalog catalog=.../>");
+ return;
+ }
+ if (cat.next == null)
+ cat.next = new Vector ();
+ cat.next.addElement (catalog);
+
+ //
+ // EXTENSIONS from appendix E
+ //
+ } else if ("doctype" == local) {
+ String name = atts.getValue ("name");
+ String value = null;
+
+ if (name == null || uri == null) {
+ error ("expecting <doctype name=... uri=.../>");
+ return;
+ }
+ name = normalizeURI (name);
+ if (cat.doctypes == null)
+ cat.doctypes = new Hashtable ();
+ else
+ value = (String) cat.doctypes.get (name);
+ if (value != null) {
+ if (!value.equals (uri))
+ warn ("ignoring <doctype...> entry for "
+ + uriStartString);
+ } else
+ cat.doctypes.put (name, uri);
+
+
+ //
+ // RESERVED ... ignore (like reserved attributes) but warn
+ //
+ } else {
+ warn ("ignoring unknown catalog element: " + local);
+ ignoreDepth++;
+ }
+ }
+
+ public void endElement (String uri, String local, String qName)
+ throws SAXException
+ {
+ if (ignoreDepth != 0)
+ ignoreDepth--;
+ else
+ bases.pop ();
+ }
+ }
+}
diff --git a/external/jaxp/source/gnu/xml/util/XHTMLWriter.java b/external/jaxp/source/gnu/xml/util/XHTMLWriter.java
new file mode 100644
index 000000000..9677ffeee
--- /dev/null
+++ b/external/jaxp/source/gnu/xml/util/XHTMLWriter.java
@@ -0,0 +1,103 @@
+/*
+ * $Id: XHTMLWriter.java,v 1.1 2003-02-01 02:10:25 cbj Exp $
+ * Copyright (C) 1999-2001 David Brownell
+ *
+ * This file is part of GNU JAXP, a library.
+ *
+ * GNU JAXP is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * GNU JAXP is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ * As a special exception, if you link this library with other files to
+ * produce an executable, this library does not by itself cause the
+ * resulting executable to be covered by the GNU General Public License.
+ * This exception does not however invalidate any other reasons why the
+ * executable file might be covered by the GNU General Public License.
+ */
+
+package gnu.xml.util;
+
+import java.io.IOException;
+import java.io.OutputStream;
+import java.io.OutputStreamWriter;
+import java.io.Writer;
+
+
+/**
+ * This extends XMLWriter to create a class which defaults to writing
+ * XHTML text, preferring the US-ASCII encoding. It adds no unique
+ * functionality, only changing the defaults slightly to simplify writing
+ * XHTML processing components by providing a bean class whose properties
+ * have more convenient defaults. An artifact of using the US-ASCII
+ * encoding is that no XML declaration is written, so that HTML tools
+ * that can't accept them will not become confused. Components can treat
+ * the output as UTF-8, ISO-8859-1, or US-ASCII without incurring any
+ * data loss.
+ *
+ * @author David Brownell
+ * @version $Date: 2003-02-01 02:10:25 $
+ */
+public class XHTMLWriter extends XMLWriter
+{
+ /**
+ * Constructs this handler with System.out used to write
+ * SAX events using the US-ASCII encoding, as XHTML.
+ */
+ public XHTMLWriter ()
+ throws IOException
+ {
+ this (System.out);
+ }
+
+ /**
+ * Constructs this handler such that the specified output stream
+ * is used to write SAX events in the US-ASCII encoding, as XHTML.
+ *
+ * @param out Where US-ASCII encoding of the stream of SAX
+ * events will be sent.
+ */
+ public XHTMLWriter (OutputStream out)
+ throws IOException
+ {
+ // not all JVMs understand "ASCII" as an encoding name, so
+ // we use 8859_1 (they all seem to handle that one) and
+ // make the echo handler filter out non-ASCII characters
+ this (new OutputStreamWriter (out, "8859_1"), "US-ASCII");
+ }
+
+ /**
+ * Constructs this handler such that the specified output stream
+ * is used to write SAX events as XHTML.
+ *
+ * @param out Where the stream of SAX events will be written.
+ */
+ public XHTMLWriter (Writer out)
+ {
+ this (out, null);
+ }
+
+ /**
+ * Constructs this handler such that the specified output stream
+ * is used to write SAX events as XHTML, labeled with the specified
+ * encoding.
+ *
+ * @param out Where the stream of SAX events will be written.
+ * @param encoding If non-null, this names the encoding to be
+ * placed in the encoding declaration.
+ */
+ public XHTMLWriter (Writer out, String encoding)
+ {
+ super (out, encoding);
+ setXhtml (true);
+ }
+}
diff --git a/external/jaxp/source/gnu/xml/util/XMLWriter.java b/external/jaxp/source/gnu/xml/util/XMLWriter.java
new file mode 100644
index 000000000..2d07e6c9d
--- /dev/null
+++ b/external/jaxp/source/gnu/xml/util/XMLWriter.java
@@ -0,0 +1,1918 @@
+/*
+ * $Id: XMLWriter.java,v 1.1 2003-02-01 02:10:26 cbj Exp $
+ * Copyright (C) 1999-2001 David Brownell
+ *
+ * This file is part of GNU JAXP, a library.
+ *
+ * GNU JAXP is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * GNU JAXP is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ * As a special exception, if you link this library with other files to
+ * produce an executable, this library does not by itself cause the
+ * resulting executable to be covered by the GNU General Public License.
+ * This exception does not however invalidate any other reasons why the
+ * executable file might be covered by the GNU General Public License.
+ */
+
+package gnu.xml.util;
+
+import java.io.BufferedWriter;
+import java.io.CharConversionException;
+import java.io.IOException;
+import java.io.OutputStream;
+import java.io.OutputStreamWriter;
+import java.io.Writer;
+import java.util.Stack;
+
+import org.xml.sax.*;
+import org.xml.sax.ext.*;
+import org.xml.sax.helpers.*;
+
+
+/**
+ * This class is a SAX handler which writes all its input as a well formed
+ * XML or XHTML document. If driven using SAX2 events, this output may
+ * include a recreated document type declaration, subject to limitations
+ * of SAX (no internal subset exposed) or DOM (the important declarations,
+ * with their documentation, are discarded).
+ *
+ * <p> By default, text is generated "as-is", but some optional modes
+ * are supported. Pretty-printing is supported, to make life easier
+ * for people reading the output. XHTML (1.0) output has can be made
+ * particularly pretty; all the built-in character entities are known.
+ * Canonical XML can also be generated, assuming the input is properly
+ * formed.
+ *
+ * <hr>
+ *
+ * <p> Some of the methods on this class are intended for applications to
+ * use directly, rather than as pure SAX2 event callbacks. Some of those
+ * methods access the JavaBeans properties (used to tweak output formats,
+ * for example canonicalization and pretty printing). Subclasses
+ * are expected to add new behaviors, not to modify current behavior, so
+ * many such methods are final.</p>
+ *
+ * <p> The <em>write*()</em> methods may be slightly simpler for some
+ * applications to use than direct callbacks. For example, they support
+ * a simple policy for encoding data items as the content of a single element.
+ *
+ * <p> To reuse an XMLWriter you must provide it with a new Writer, since
+ * this handler closes the writer it was given as part of its endDocument()
+ * handling. (XML documents have an end of input, and the way to encode
+ * that on a stream is to close it.) </p>
+ *
+ * <hr>
+ *
+ * <p> Note that any relative URIs in the source document, as found in
+ * entity and notation declarations, ought to have been fully resolved by
+ * the parser providing events to this handler. This means that the
+ * output text should only have fully resolved URIs, which may not be
+ * the desired behavior in cases where later binding is desired. </p>
+ *
+ * <p> <em>Note that due to SAX2 defaults, you may need to manually
+ * ensure that the input events are XML-conformant with respect to namespace
+ * prefixes and declarations. {@link gnu.xml.pipeline.NSFilter} is
+ * one solution to this problem, in the context of processing pipelines.</em>
+ * Something as simple as connecting this handler to a parser might not
+ * generate the correct output. Another workaround is to ensure that the
+ * <em>namespace-prefixes</em> feature is always set to true, if you're
+ * hooking this directly up to some XMLReader implementation.
+ *
+ * @see gnu.xml.pipeline.TextConsumer
+ *
+ * @author David Brownell
+ * @version $Date: 2003-02-01 02:10:26 $
+ */
+public class XMLWriter
+ implements ContentHandler, LexicalHandler, DTDHandler, DeclHandler
+{
+ // text prints/escapes differently depending on context
+ // CTX_ENTITY ... entity literal value
+ // CTX_ATTRIBUTE ... attribute literal value
+ // CTX_CONTENT ... content of an element
+ // CTX_UNPARSED ... CDATA, comment, PI, names, etc
+ // CTX_NAME ... name or nmtoken, no escapes possible
+ private static final int CTX_ENTITY = 1;
+ private static final int CTX_ATTRIBUTE = 2;
+ private static final int CTX_CONTENT = 3;
+ private static final int CTX_UNPARSED = 4;
+ private static final int CTX_NAME = 5;
+
+// FIXME: names (element, attribute, PI, notation, etc) are not
+// currently written out with range checks (escapeChars).
+// In non-XHTML, some names can't be directly written; panic!
+
+ private static String sysEOL;
+
+ static {
+ try {
+ sysEOL = System.getProperty ("line.separator", "\n");
+
+ // don't use the system's EOL if it's illegal XML.
+ if (!isLineEnd (sysEOL))
+ sysEOL = "\n";
+
+ } catch (SecurityException e) {
+ sysEOL = "\n";
+ }
+ }
+
+ private static boolean isLineEnd (String eol)
+ {
+ return "\n".equals (eol)
+ || "\r".equals (eol)
+ || "\r\n".equals (eol);
+ }
+
+ private Writer out;
+ private boolean inCDATA;
+ private int elementNestLevel;
+ private String eol = sysEOL;
+
+ private short dangerMask;
+ private StringBuffer stringBuf;
+ private Locator locator;
+ private ErrorHandler errHandler;
+
+ private boolean expandingEntities = false;
+ private int entityNestLevel;
+ private boolean xhtml;
+ private boolean startedDoctype;
+ private String encoding;
+
+ private boolean canonical;
+ private boolean inDoctype;
+ private boolean inEpilogue;
+
+ // pretty printing controls
+ private boolean prettyPrinting;
+ private int column;
+ private boolean noWrap;
+ private Stack space = new Stack ();
+
+ // this is not a hard'n'fast rule -- longer lines are OK,
+ // but are to be avoided. Here, prettyprinting is more to
+ // show structure "cleanly" than to be precise about it.
+ // better to have ragged layout than one line 24Kb long.
+ private static final int lineLength = 75;
+
+
+ /**
+ * Constructs this handler with System.out used to write SAX events
+ * using the UTF-8 encoding. Avoid using this except when you know
+ * it's safe to close System.out at the end of the document.
+ */
+ public XMLWriter () throws IOException
+ { this (System.out); }
+
+ /**
+ * Constructs a handler which writes all input to the output stream
+ * in the UTF-8 encoding, and closes it when endDocument is called.
+ * (Yes it's annoying that this throws an exception -- but there's
+ * really no way around it, since it's barely possible a JDK may
+ * exist somewhere that doesn't know how to emit UTF-8.)
+ */
+ public XMLWriter (OutputStream out) throws IOException
+ {
+ this (new OutputStreamWriter (out, "UTF8"));
+ }
+
+ /**
+ * Constructs a handler which writes all input to the writer, and then
+ * closes the writer when the document ends. If an XML declaration is
+ * written onto the output, and this class can determine the name of
+ * the character encoding for this writer, that encoding name will be
+ * included in the XML declaration.
+ *
+ * <P> See the description of the constructor which takes an encoding
+ * name for imporant information about selection of encodings.
+ *
+ * @param writer XML text is written to this writer.
+ */
+ public XMLWriter (Writer writer)
+ {
+ this (writer, null);
+ }
+
+ /**
+ * Constructs a handler which writes all input to the writer, and then
+ * closes the writer when the document ends. If an XML declaration is
+ * written onto the output, this class will use the specified encoding
+ * name in that declaration. If no encoding name is specified, no
+ * encoding name will be declared unless this class can otherwise
+ * determine the name of the character encoding for this writer.
+ *
+ * <P> At this time, only the UTF-8 ("UTF8") and UTF-16 ("Unicode")
+ * output encodings are fully lossless with respect to XML data. If you
+ * use any other encoding you risk having your data be silently mangled
+ * on output, as the standard Java character encoding subsystem silently
+ * maps non-encodable characters to a question mark ("?") and will not
+ * report such errors to applications.
+ *
+ * <p> For a few other encodings the risk can be reduced. If the writer is
+ * a java.io.OutputStreamWriter, and uses either the ISO-8859-1 ("8859_1",
+ * "ISO8859_1", etc) or US-ASCII ("ASCII") encodings, content which
+ * can't be encoded in those encodings will be written safely. Where
+ * relevant, the XHTML entity names will be used; otherwise, numeric
+ * character references will be emitted.
+ *
+ * <P> However, there remain a number of cases where substituting such
+ * entity or character references is not an option. Such references are
+ * not usable within a DTD, comment, PI, or CDATA section. Neither may
+ * they be used when element, attribute, entity, or notation names have
+ * the problematic characters.
+ *
+ * @param writer XML text is written to this writer.
+ * @param encoding if non-null, and an XML declaration is written,
+ * this is the name that will be used for the character encoding.
+ */
+ public XMLWriter (Writer writer, String encoding)
+ {
+ setWriter (writer, encoding);
+ }
+
+ private void setEncoding (String encoding)
+ {
+ if (encoding == null && out instanceof OutputStreamWriter)
+ encoding = ((OutputStreamWriter)out).getEncoding ();
+
+ if (encoding != null) {
+ encoding = encoding.toUpperCase ();
+
+ // Use official encoding names where we know them,
+ // avoiding the Java-only names. When using common
+ // encodings where we can easily tell if characters
+ // are out of range, we'll escape out-of-range
+ // characters using character refs for safety.
+
+ // I _think_ these are all the main synonyms for these!
+ if ("UTF8".equals (encoding)) {
+ encoding = "UTF-8";
+ } else if ("US-ASCII".equals (encoding)
+ || "ASCII".equals (encoding)) {
+ dangerMask = (short) 0xff80;
+ encoding = "US-ASCII";
+ } else if ("ISO-8859-1".equals (encoding)
+ || "8859_1".equals (encoding)
+ || "ISO8859_1".equals (encoding)) {
+ dangerMask = (short) 0xff00;
+ encoding = "ISO-8859-1";
+ } else if ("UNICODE".equals (encoding)
+ || "UNICODE-BIG".equals (encoding)
+ || "UNICODE-LITTLE".equals (encoding)) {
+ encoding = "UTF-16";
+
+ // TODO: UTF-16BE, UTF-16LE ... no BOM; what
+ // release of JDK supports those Unicode names?
+ }
+
+ if (dangerMask != 0)
+ stringBuf = new StringBuffer ();
+ }
+
+ this.encoding = encoding;
+ }
+
+
+ /**
+ * Resets the handler to write a new text document.
+ *
+ * @param writer XML text is written to this writer.
+ * @param encoding if non-null, and an XML declaration is written,
+ * this is the name that will be used for the character encoding.
+ *
+ * @exception IllegalStateException if the current
+ * document hasn't yet ended (with {@link #endDocument})
+ */
+ final public void setWriter (Writer writer, String encoding)
+ {
+ if (out != null)
+ throw new IllegalStateException (
+ "can't change stream in mid course");
+ out = writer;
+ if (out != null)
+ setEncoding (encoding);
+ if (!(out instanceof BufferedWriter))
+ out = new BufferedWriter (out);
+ space.push ("default");
+ }
+
+ /**
+ * Assigns the line ending style to be used on output.
+ * @param eolString null to use the system default; else
+ * "\n", "\r", or "\r\n".
+ */
+ final public void setEOL (String eolString)
+ {
+ if (eolString == null)
+ eol = sysEOL;
+ else if (!isLineEnd (eolString))
+ eol = eolString;
+ else
+ throw new IllegalArgumentException (eolString);
+ }
+
+ /**
+ * Assigns the error handler to be used to present most fatal
+ * errors.
+ */
+ public void setErrorHandler (ErrorHandler handler)
+ {
+ errHandler = handler;
+ }
+
+ /**
+ * Used internally and by subclasses, this encapsulates the logic
+ * involved in reporting fatal errors. It uses locator information
+ * for good diagnostics, if available, and gives the application's
+ * ErrorHandler the opportunity to handle the error before throwing
+ * an exception.
+ */
+ protected void fatal (String message, Exception e)
+ throws SAXException
+ {
+ SAXParseException x;
+
+ if (locator == null)
+ x = new SAXParseException (message, null, null, -1, -1, e);
+ else
+ x = new SAXParseException (message, locator, e);
+ if (errHandler != null)
+ errHandler.fatalError (x);
+ throw x;
+ }
+
+
+ // JavaBeans properties
+
+ /**
+ * Controls whether the output should attempt to follow the "transitional"
+ * XHTML rules so that it meets the "HTML Compatibility Guidelines"
+ * appendix in the XHTML specification. A "transitional" Document Type
+ * Declaration (DTD) is placed near the beginning of the output document,
+ * instead of whatever DTD would otherwise have been placed there, and
+ * XHTML empty elements are printed specially. When writing text in
+ * US-ASCII or ISO-8859-1 encodings, the predefined XHTML internal
+ * entity names are used (in preference to character references) when
+ * writing content characters which can't be expressed in those encodings.
+ *
+ * <p> When this option is enabled, it is the caller's responsibility
+ * to ensure that the input is otherwise valid as XHTML. Things to
+ * be careful of in all cases, as described in the appendix referenced
+ * above, include: <ul>
+ *
+ * <li> Element and attribute names must be in lower case, both
+ * in the document and in any CSS style sheet.
+ * <li> All XML constructs must be valid as defined by the XHTML
+ * "transitional" DTD (including all familiar constructs,
+ * even deprecated ones).
+ * <li> The root element must be "html".
+ * <li> Elements that must be empty (such as <em>&lt;br&gt;</em>
+ * must have no content.
+ * <li> Use both <em>lang</em> and <em>xml:lang</em> attributes
+ * when specifying language.
+ * <li> Similarly, use both <em>id</em> and <em>name</em> attributes
+ * when defining elements that may be referred to through
+ * URI fragment identifiers ... and make sure that the
+ * value is a legal NMTOKEN, since not all such HTML 4.0
+ * identifiers are valid in XML.
+ * <li> Be careful with character encodings; make sure you provide
+ * a <em>&lt;meta http-equiv="Content-type"
+ * content="text/xml;charset=..." /&gt;</em> element in
+ * the HTML "head" element, naming the same encoding
+ * used to create this handler. Also, if that encoding
+ * is anything other than US-ASCII, make sure that if
+ * the document is given a MIME content type, it has
+ * a <em>charset=...</em> attribute with that encoding.
+ * </ul>
+ *
+ * <p> Additionally, some of the oldest browsers have additional
+ * quirks, to address with guidelines such as: <ul>
+ *
+ * <li> Processing instructions may be rendered, so avoid them.
+ * (Similarly for an XML declaration.)
+ * <li> Embedded style sheets and scripts should not contain XML
+ * markup delimiters: &amp;, &lt;, and ]]&gt; are trouble.
+ * <li> Attribute values should not have line breaks or multiple
+ * consecutive white space characters.
+ * <li> Use no more than one of the deprecated (transitional)
+ * <em>&lt;isindex&gt;</em> elements.
+ * <li> Some boolean attributes (such as <em>compact, checked,
+ * disabled, readonly, selected,</em> and more) confuse
+ * some browsers, since they only understand minimized
+ * versions which are illegal in XML.
+ * </ul>
+ *
+ * <p> Also, some characteristics of the resulting output may be
+ * a function of whether the document is later given a MIME
+ * content type of <em>text/html</em> rather than one indicating
+ * XML (<em>application/xml</em> or <em>text/xml</em>). Worse,
+ * some browsers ignore MIME content types and prefer to rely URI
+ * name suffixes -- so an "index.xml" could always be XML, never
+ * XHTML, no matter its MIME type.
+ */
+ final public void setXhtml (boolean value)
+ {
+ if (locator != null)
+ throw new IllegalStateException ("started parsing");
+ xhtml = value;
+ if (xhtml)
+ canonical = false;
+ }
+
+ /**
+ * Returns true if the output attempts to echo the input following
+ * "transitional" XHTML rules and matching the "HTML Compatibility
+ * Guidelines" so that an HTML version 3 browser can read the output
+ * as HTML; returns false (the default) othewise.
+ */
+ final public boolean isXhtml ()
+ {
+ return xhtml;
+ }
+
+ /**
+ * Controls whether the output text contains references to
+ * entities (the default), or instead contains the expanded
+ * values of those entities.
+ */
+ final public void setExpandingEntities (boolean value)
+ {
+ if (locator != null)
+ throw new IllegalStateException ("started parsing");
+ expandingEntities = value;
+ if (!expandingEntities)
+ canonical = false;
+ }
+
+ /**
+ * Returns true if the output will have no entity references;
+ * returns false (the default) otherwise.
+ */
+ final public boolean isExpandingEntities ()
+ {
+ return expandingEntities;
+ }
+
+ /**
+ * Controls pretty-printing, which by default is not enabled
+ * (and currently is most useful for XHTML output).
+ * Pretty printing enables structural indentation, sorting of attributes
+ * by name, line wrapping, and potentially other mechanisms for making
+ * output more or less readable.
+ *
+ * <p> At this writing, structural indentation and line wrapping are
+ * enabled when pretty printing is enabled and the <em>xml:space</em>
+ * attribute has the value <em>default</em> (its other legal value is
+ * <em>preserve</em>, as defined in the XML specification). The three
+ * XHTML element types which use another value are recognized by their
+ * names (namespaces are ignored).
+ *
+ * <p> Also, for the record, the "pretty" aspect of printing here
+ * is more to provide basic structure on outputs that would otherwise
+ * risk being a single long line of text. For now, expect the
+ * structure to be ragged ... unless you'd like to submit a patch
+ * to make this be more strictly formatted!
+ *
+ * @exception IllegalStateException thrown if this method is invoked
+ * after output has begun.
+ */
+ final public void setPrettyPrinting (boolean value)
+ {
+ if (locator != null)
+ throw new IllegalStateException ("started parsing");
+ prettyPrinting = value;
+ if (prettyPrinting)
+ canonical = false;
+ }
+
+ /**
+ * Returns value of flag controlling pretty printing.
+ */
+ final public boolean isPrettyPrinting ()
+ {
+ return prettyPrinting;
+ }
+
+
+ /**
+ * Sets the output style to be canonicalized. Input events must
+ * meet requirements that are slightly more stringent than the
+ * basic well-formedness ones, and include: <ul>
+ *
+ * <li> Namespace prefixes must not have been changed from those
+ * in the original document. (This may only be ensured by setting
+ * the SAX2 XMLReader <em>namespace-prefixes</em> feature flag;
+ * by default, it is cleared.)
+ *
+ * <li> Redundant namespace declaration attributes have been
+ * removed. (If an ancestor element defines a namespace prefix
+ * and that declaration hasn't been overriden, an element must
+ * not redeclare it.)
+ *
+ * <li> If comments are not to be included in the canonical output,
+ * they must first be removed from the input event stream; this
+ * <em>Canonical XML with comments</em> by default.
+ *
+ * <li> If the input character encoding was not UCS-based, the
+ * character data must have been normalized using Unicode
+ * Normalization Form C. (UTF-8 and UTF-16 are UCS-based.)
+ *
+ * <li> Attribute values must have been normalized, as is done
+ * by any conformant XML processor which processes all external
+ * parameter entities.
+ *
+ * <li> Similarly, attribute value defaulting has been performed.
+ *
+ * </ul>
+ *
+ * <p> Note that fragments of XML documents, as specified by an XPath
+ * node set, may be canonicalized. In such cases, elements may need
+ * some fixup (for <em>xml:*</em> attributes and application-specific
+ * context).
+ *
+ * @exception IllegalArgumentException if the output encoding
+ * is anything other than UTF-8.
+ */
+ final public void setCanonical (boolean value)
+ {
+ if (value && !"UTF-8".equals (encoding))
+ throw new IllegalArgumentException ("encoding != UTF-8");
+ canonical = value;
+ if (canonical) {
+ prettyPrinting = xhtml = false;
+ expandingEntities = true;
+ eol = "\n";
+ }
+ }
+
+
+ /**
+ * Returns value of flag controlling canonical output.
+ */
+ final public boolean isCanonical ()
+ {
+ return canonical;
+ }
+
+
+ /**
+ * Flushes the output stream. When this handler is used in long lived
+ * pipelines, it can be important to flush buffered state, for example
+ * so that it can reach the disk as part of a state checkpoint.
+ */
+ final public void flush ()
+ throws IOException
+ {
+ if (out != null)
+ out.flush ();
+ }
+
+
+ // convenience routines
+
+// FIXME: probably want a subclass that holds a lot of these...
+// and maybe more!
+
+ /**
+ * Writes the string as if characters() had been called on the contents
+ * of the string. This is particularly useful when applications act as
+ * producers and write data directly to event consumers.
+ */
+ final public void write (String data)
+ throws SAXException
+ {
+ char buf [] = data.toCharArray ();
+ characters (buf, 0, buf.length);
+ }
+
+
+ /**
+ * Writes an element that has content consisting of a single string.
+ * @see #writeEmptyElement
+ * @see #startElement
+ */
+ public void writeElement (
+ String uri,
+ String localName,
+ String qName,
+ Attributes atts,
+ String content
+ ) throws SAXException
+ {
+ if (content == null || content.length () == 0) {
+ writeEmptyElement (uri, localName, qName, atts);
+ return;
+ }
+ startElement (uri, localName, qName, atts);
+ char chars [] = content.toCharArray ();
+ characters (chars, 0, chars.length);
+ endElement (uri, localName, qName);
+ }
+
+
+ /**
+ * Writes an element that has content consisting of a single integer,
+ * encoded as a decimal string.
+ * @see #writeEmptyElement
+ * @see #startElement
+ */
+ public void writeElement (
+ String uri,
+ String localName,
+ String qName,
+ Attributes atts,
+ int content
+ ) throws SAXException
+ {
+ writeElement (uri, localName, qName, atts, Integer.toString (content));
+ }
+
+
+ // SAX1 ContentHandler
+ /** <b>SAX1</b>: provides parser status information */
+ final public void setDocumentLocator (Locator l)
+ {
+ locator = l;
+ }
+
+
+ // URL for dtd that validates against all normal HTML constructs
+ private static final String xhtmlFullDTD =
+ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd";
+
+
+ /**
+ * <b>SAX1</b>: indicates the beginning of a document parse.
+ * If you're writing (well formed) fragments of XML, neither
+ * this nor endDocument should be called.
+ */
+ // NOT final
+ public void startDocument ()
+ throws SAXException
+ {
+ try {
+ if (out == null)
+ throw new IllegalStateException (
+ "null Writer given to XMLWriter");
+
+ // Not all parsers provide the locator we want; this also
+ // flags whether events are being sent to this object yet.
+ // We could only have this one call if we only printed whole
+ // documents ... but we also print fragments, so most of the
+ // callbacks here replicate this test.
+
+ if (locator == null)
+ locator = new LocatorImpl ();
+
+ // Unless the data is in US-ASCII or we're canonicalizing, write
+ // the XML declaration if we know the encoding. US-ASCII won't
+ // normally get mangled by web server confusion about the
+ // character encodings used. Plus, it's an easy way to
+ // ensure we can write ASCII that's unlikely to confuse
+ // elderly HTML parsers.
+
+ if (!canonical
+ && dangerMask != (short) 0xff80
+ && encoding != null) {
+ rawWrite ("<?xml version='1.0'");
+ rawWrite (" encoding='" + encoding + "'");
+ rawWrite ("?>");
+ newline ();
+ }
+
+ if (xhtml) {
+
+ rawWrite ("<!DOCTYPE html PUBLIC");
+ newline ();
+ rawWrite (" '-//W3C//DTD XHTML 1.0 Transitional//EN'");
+ newline ();
+ rawWrite (" '");
+ // NOTE: URL (above) matches the REC
+ rawWrite (xhtmlFullDTD);
+ rawWrite ("'>");
+ newline ();
+ newline ();
+
+ // fake the rest of the handler into ignoring
+ // everything until the root element, so any
+ // XHTML DTD comments, PIs, etc are ignored
+ startedDoctype = true;
+ }
+
+ entityNestLevel = 0;
+
+ } catch (IOException e) {
+ fatal ("can't write", e);
+ }
+ }
+
+ /**
+ * <b>SAX1</b>: indicates the completion of a parse.
+ * Note that all complete SAX event streams make this call, even
+ * if an error is reported during a parse.
+ */
+ // NOT final
+ public void endDocument ()
+ throws SAXException
+ {
+ try {
+ if (!canonical) {
+ newline ();
+ newline ();
+ }
+ out.close ();
+ out = null;
+ locator = null;
+ } catch (IOException e) {
+ fatal ("can't write", e);
+ }
+ }
+
+ // XHTML elements declared as EMPTY print differently
+ final private static boolean isEmptyElementTag (String tag)
+ {
+ switch (tag.charAt (0)) {
+ case 'a': return "area".equals (tag);
+ case 'b': return "base".equals (tag)
+ || "basefont".equals (tag)
+ || "br".equals (tag);
+ case 'c': return "col".equals (tag);
+ case 'f': return "frame".equals (tag);
+ case 'h': return "hr".equals (tag);
+ case 'i': return "img".equals (tag)
+ || "input".equals (tag)
+ || "isindex".equals (tag);
+ case 'l': return "link".equals (tag);
+ case 'm': return "meta".equals (tag);
+ case 'p': return "param".equals (tag);
+ }
+ return false;
+ }
+
+ private static boolean indentBefore (String tag)
+ {
+ // basically indent before block content
+ // and within structure like tables, lists
+ switch (tag.charAt (0)) {
+ case 'a': return "applet".equals (tag);
+ case 'b': return "body".equals (tag)
+ || "blockquote".equals (tag);
+ case 'c': return "center".equals (tag);
+ case 'f': return "frame".equals (tag)
+ || "frameset".equals (tag);
+ case 'h': return "head".equals (tag);
+ case 'm': return "meta".equals (tag);
+ case 'o': return "object".equals (tag);
+ case 'p': return "param".equals (tag)
+ || "pre".equals (tag);
+ case 's': return "style".equals (tag);
+ case 't': return "title".equals (tag)
+ || "td".equals (tag)
+ || "th".equals (tag);
+ }
+ // ... but not inline elements like "em", "b", "font"
+ return false;
+ }
+
+ private static boolean spaceBefore (String tag)
+ {
+ // blank line AND INDENT before certain structural content
+ switch (tag.charAt (0)) {
+ case 'h': return "h1".equals (tag)
+ || "h2".equals (tag)
+ || "h3".equals (tag)
+ || "h4".equals (tag)
+ || "h5".equals (tag)
+ || "h6".equals (tag)
+ || "hr".equals (tag);
+ case 'l': return "li".equals (tag);
+ case 'o': return "ol".equals (tag);
+ case 'p': return "p".equals (tag);
+ case 't': return "table".equals (tag)
+ || "tr".equals (tag);
+ case 'u': return "ul".equals (tag);
+ }
+ return false;
+ }
+
+ // XHTML DTDs say these three have xml:space="preserve"
+ private static boolean spacePreserve (String tag)
+ {
+ return "pre".equals (tag)
+ || "style".equals (tag)
+ || "script".equals (tag);
+ }
+
+ /**
+ * <b>SAX2</b>: ignored.
+ */
+ final public void startPrefixMapping (String prefix, String uri)
+ {}
+
+ /**
+ * <b>SAX2</b>: ignored.
+ */
+ final public void endPrefixMapping (String prefix)
+ {}
+
+ private void writeStartTag (
+ String name,
+ Attributes atts,
+ boolean isEmpty
+ ) throws SAXException, IOException
+ {
+ rawWrite ('<');
+ rawWrite (name);
+
+ // write out attributes ... sorting is particularly useful
+ // with output that's been heavily defaulted.
+ if (atts != null && atts.getLength () != 0) {
+
+ // Set up to write, with optional sorting
+ int indices [] = new int [atts.getLength ()];
+
+ for (int i= 0; i < indices.length; i++)
+ indices [i] = i;
+
+ // optionally sort
+
+// FIXME: canon xml demands xmlns nodes go first,
+// and sorting by URI first (empty first) then localname
+// it should maybe use a different sort
+
+ if (canonical || prettyPrinting) {
+
+ // insertion sort by attribute name
+ for (int i = 1; i < indices.length; i++) {
+ int n = indices [i], j;
+ String s = atts.getQName (n);
+
+ for (j = i - 1; j >= 0; j--) {
+ if (s.compareTo (atts.getQName (indices [j]))
+ >= 0)
+ break;
+ indices [j + 1] = indices [j];
+ }
+ indices [j + 1] = n;
+ }
+ }
+
+ // write, sorted or no
+ for (int i= 0; i < indices.length; i++) {
+ String s = atts.getQName (indices [i]);
+
+ if (s == null || "".equals (s))
+ throw new IllegalArgumentException ("no XML name");
+ rawWrite (" ");
+ rawWrite (s);
+ rawWrite ("=");
+ writeQuotedValue (atts.getValue (indices [i]),
+ CTX_ATTRIBUTE);
+ }
+ }
+ if (isEmpty)
+ rawWrite (" /");
+ rawWrite ('>');
+ }
+
+ /**
+ * <b>SAX2</b>: indicates the start of an element.
+ * When XHTML is in use, avoid attribute values with
+ * line breaks or multiple whitespace characters, since
+ * not all user agents handle them correctly.
+ */
+ final public void startElement (
+ String uri,
+ String localName,
+ String qName,
+ Attributes atts
+ ) throws SAXException
+ {
+ startedDoctype = false;
+
+ if (locator == null)
+ locator = new LocatorImpl ();
+
+ if (qName == null || "".equals (qName))
+ throw new IllegalArgumentException ("no XML name");
+
+ try {
+ if (entityNestLevel != 0)
+ return;
+ if (prettyPrinting) {
+ String whitespace = null;
+
+ if (xhtml && spacePreserve (qName))
+ whitespace = "preserve";
+ else if (atts != null)
+ whitespace = atts.getValue ("xml:space");
+ if (whitespace == null)
+ whitespace = (String) space.peek ();
+ space.push (whitespace);
+
+ if ("default".equals (whitespace)) {
+ if (xhtml) {
+ if (spaceBefore (qName)) {
+ newline ();
+ doIndent ();
+ } else if (indentBefore (qName))
+ doIndent ();
+ // else it's inlined, modulo line length
+ // FIXME: incrementing element nest level
+ // for inlined elements causes ugliness
+ } else
+ doIndent ();
+ }
+ }
+ elementNestLevel++;
+ writeStartTag (qName, atts, xhtml && isEmptyElementTag (qName));
+
+ if (xhtml) {
+// FIXME: if this is an XHTML "pre" element, turn
+// off automatic wrapping.
+ }
+
+ } catch (IOException e) {
+ fatal ("can't write", e);
+ }
+ }
+
+ /**
+ * Writes an empty element.
+ * @see #startElement
+ */
+ public void writeEmptyElement (
+ String uri,
+ String localName,
+ String qName,
+ Attributes atts
+ ) throws SAXException
+ {
+ if (canonical) {
+ startElement (uri, localName, qName, atts);
+ endElement (uri, localName, qName);
+ } else {
+ try {
+ writeStartTag (qName, atts, true);
+ } catch (IOException e) {
+ fatal ("can't write", e);
+ }
+ }
+ }
+
+
+ /** <b>SAX2</b>: indicates the end of an element */
+ final public void endElement (String uri, String localName, String qName)
+ throws SAXException
+ {
+ if (qName == null || "".equals (qName))
+ throw new IllegalArgumentException ("no XML name");
+
+ try {
+ elementNestLevel--;
+ if (entityNestLevel != 0)
+ return;
+ if (xhtml && isEmptyElementTag (qName))
+ return;
+ rawWrite ("</");
+ rawWrite (qName);
+ rawWrite ('>');
+
+ if (prettyPrinting) {
+ if (!space.empty ())
+ space.pop ();
+ else
+ fatal ("stack discipline", null);
+ }
+ if (elementNestLevel == 0)
+ inEpilogue = true;
+
+ } catch (IOException e) {
+ fatal ("can't write", e);
+ }
+ }
+
+ /** <b>SAX1</b>: reports content characters */
+ final public void characters (char ch [], int start, int length)
+ throws SAXException
+ {
+ if (locator == null)
+ locator = new LocatorImpl ();
+
+ try {
+ if (entityNestLevel != 0)
+ return;
+ if (inCDATA) {
+ escapeChars (ch, start, length, CTX_UNPARSED);
+ } else {
+ escapeChars (ch, start, length, CTX_CONTENT);
+ }
+ } catch (IOException e) {
+ fatal ("can't write", e);
+ }
+ }
+
+ /** <b>SAX1</b>: reports ignorable whitespace */
+ final public void ignorableWhitespace (char ch [], int start, int length)
+ throws SAXException
+ {
+ if (locator == null)
+ locator = new LocatorImpl ();
+
+ try {
+ if (entityNestLevel != 0)
+ return;
+ // don't forget to map NL to CRLF, CR, etc
+ escapeChars (ch, start, length, CTX_CONTENT);
+ } catch (IOException e) {
+ fatal ("can't write", e);
+ }
+ }
+
+ /**
+ * <b>SAX1</b>: reports a PI.
+ * This doesn't check for illegal target names, such as "xml" or "XML",
+ * or namespace-incompatible ones like "big:dog"; the caller is
+ * responsible for ensuring those names are legal.
+ */
+ final public void processingInstruction (String target, String data)
+ throws SAXException
+ {
+ if (locator == null)
+ locator = new LocatorImpl ();
+
+ // don't print internal subset for XHTML
+ if (xhtml && startedDoctype)
+ return;
+
+ // ancient HTML browsers might render these ... their loss.
+ // to prevent: "if (xhtml) return;".
+
+ try {
+ if (entityNestLevel != 0)
+ return;
+ if (canonical && inEpilogue)
+ newline ();
+ rawWrite ("<?");
+ rawWrite (target);
+ rawWrite (' ');
+ escapeChars (data.toCharArray (), -1, -1, CTX_UNPARSED);
+ rawWrite ("?>");
+ if (elementNestLevel == 0 && !(canonical && inEpilogue))
+ newline ();
+ } catch (IOException e) {
+ fatal ("can't write", e);
+ }
+ }
+
+ /** <b>SAX1</b>: indicates a non-expanded entity reference */
+ public void skippedEntity (String name)
+ throws SAXException
+ {
+ try {
+ rawWrite ("&");
+ rawWrite (name);
+ rawWrite (";");
+ } catch (IOException e) {
+ fatal ("can't write", e);
+ }
+ }
+
+ // SAX2 LexicalHandler
+
+ /** <b>SAX2</b>: called before parsing CDATA characters */
+ final public void startCDATA ()
+ throws SAXException
+ {
+ if (locator == null)
+ locator = new LocatorImpl ();
+
+ if (canonical)
+ return;
+
+ try {
+ inCDATA = true;
+ if (entityNestLevel == 0)
+ rawWrite ("<![CDATA[");
+ } catch (IOException e) {
+ fatal ("can't write", e);
+ }
+ }
+
+ /** <b>SAX2</b>: called after parsing CDATA characters */
+ final public void endCDATA ()
+ throws SAXException
+ {
+ if (canonical)
+ return;
+
+ try {
+ inCDATA = false;
+ if (entityNestLevel == 0)
+ rawWrite ("]]>");
+ } catch (IOException e) {
+ fatal ("can't write", e);
+ }
+ }
+
+ /**
+ * <b>SAX2</b>: called when the doctype is partially parsed
+ * Note that this, like other doctype related calls, is ignored
+ * when XHTML is in use.
+ */
+ final public void startDTD (String name, String publicId, String systemId)
+ throws SAXException
+ {
+ if (locator == null)
+ locator = new LocatorImpl ();
+ if (xhtml)
+ return;
+ try {
+ inDoctype = startedDoctype = true;
+ if (canonical)
+ return;
+ rawWrite ("<!DOCTYPE ");
+ rawWrite (name);
+ rawWrite (' ');
+
+ if (!expandingEntities) {
+ if (publicId != null)
+ rawWrite ("PUBLIC '" + publicId + "' '" + systemId + "' ");
+ else if (systemId != null)
+ rawWrite ("SYSTEM '" + systemId + "' ");
+ }
+
+ rawWrite ('[');
+ newline ();
+ } catch (IOException e) {
+ fatal ("can't write", e);
+ }
+ }
+
+ /** <b>SAX2</b>: called after the doctype is parsed */
+ final public void endDTD ()
+ throws SAXException
+ {
+ inDoctype = false;
+ if (canonical || xhtml)
+ return;
+ try {
+ rawWrite ("]>");
+ newline ();
+ } catch (IOException e) {
+ fatal ("can't write", e);
+ }
+ }
+
+ /**
+ * <b>SAX2</b>: called before parsing a general entity in content
+ */
+ final public void startEntity (String name)
+ throws SAXException
+ {
+ try {
+ boolean writeEOL = true;
+
+ // Predefined XHTML entities (for characters) will get
+ // mapped back later.
+ if (xhtml || expandingEntities)
+ return;
+
+ entityNestLevel++;
+ if (name.equals ("[dtd]"))
+ return;
+ if (entityNestLevel != 1)
+ return;
+ if (!name.startsWith ("%")) {
+ writeEOL = false;
+ rawWrite ('&');
+ }
+ rawWrite (name);
+ rawWrite (';');
+ if (writeEOL)
+ newline ();
+ } catch (IOException e) {
+ fatal ("can't write", e);
+ }
+ }
+
+ /**
+ * <b>SAX2</b>: called after parsing a general entity in content
+ */
+ final public void endEntity (String name)
+ throws SAXException
+ {
+ if (xhtml || expandingEntities)
+ return;
+ entityNestLevel--;
+ }
+
+ /**
+ * <b>SAX2</b>: called when comments are parsed.
+ * When XHTML is used, the old HTML tradition of using comments
+ * to for inline CSS, or for JavaScript code is discouraged.
+ * This is because XML processors are encouraged to discard, on
+ * the grounds that comments are for users (and perhaps text
+ * editors) not programs. Instead, use external scripts
+ */
+ final public void comment (char ch [], int start, int length)
+ throws SAXException
+ {
+ if (locator == null)
+ locator = new LocatorImpl ();
+
+ // don't print internal subset for XHTML
+ if (xhtml && startedDoctype)
+ return;
+ // don't print comment in doctype for canon xml
+ if (canonical && inDoctype)
+ return;
+
+ try {
+ boolean indent;
+
+ if (prettyPrinting && space.empty ())
+ fatal ("stack discipline", null);
+ indent = prettyPrinting && "default".equals (space.peek ());
+ if (entityNestLevel != 0)
+ return;
+ if (indent)
+ doIndent ();
+ if (canonical && inEpilogue)
+ newline ();
+ rawWrite ("<!--");
+ escapeChars (ch, start, length, CTX_UNPARSED);
+ rawWrite ("-->");
+ if (indent)
+ doIndent ();
+ if (elementNestLevel == 0 && !(canonical && inEpilogue))
+ newline ();
+ } catch (IOException e) {
+ fatal ("can't write", e);
+ }
+ }
+
+ // SAX1 DTDHandler
+
+ /** <b>SAX1</b>: called on notation declarations */
+ final public void notationDecl (String name,
+ String publicId, String systemId)
+ throws SAXException
+ {
+ if (xhtml)
+ return;
+ try {
+ // At this time, only SAX2 callbacks start these.
+ if (!startedDoctype)
+ return;
+
+ if (entityNestLevel != 0)
+ return;
+ rawWrite ("<!NOTATION " + name + " ");
+ if (publicId != null)
+ rawWrite ("PUBLIC \"" + publicId + '"');
+ else
+ rawWrite ("SYSTEM ");
+ if (systemId != null)
+ rawWrite ('"' + systemId + '"');
+ rawWrite (">");
+ newline ();
+ } catch (IOException e) {
+ fatal ("can't write", e);
+ }
+ }
+
+ /** <b>SAX1</b>: called on unparsed entity declarations */
+ final public void unparsedEntityDecl (String name,
+ String publicId, String systemId,
+ String notationName)
+ throws SAXException
+ {
+ if (xhtml)
+ return;
+ try {
+ // At this time, only SAX2 callbacks start these.
+ if (!startedDoctype) {
+ // FIXME: write to temporary buffer, and make the start
+ // of the root element write these declarations.
+ return;
+ }
+
+ if (entityNestLevel != 0)
+ return;
+ rawWrite ("<!ENTITY " + name + " ");
+ if (publicId != null)
+ rawWrite ("PUBLIC \"" + publicId + '"');
+ else
+ rawWrite ("SYSTEM ");
+ rawWrite ('"' + systemId + '"');
+ rawWrite (" NDATA " + notationName + ">");
+ newline ();
+ } catch (IOException e) {
+ fatal ("can't write", e);
+ }
+ }
+
+ // SAX2 DeclHandler
+
+ /** <b>SAX2</b>: called on attribute declarations */
+ final public void attributeDecl (String eName, String aName,
+ String type, String mode, String value)
+ throws SAXException
+ {
+ if (xhtml)
+ return;
+ try {
+ // At this time, only SAX2 callbacks start these.
+ if (!startedDoctype)
+ return;
+ if (entityNestLevel != 0)
+ return;
+ rawWrite ("<!ATTLIST " + eName + ' ' + aName + ' ');
+ rawWrite (type);
+ rawWrite (' ');
+ if (mode != null)
+ rawWrite (mode + ' ');
+ if (value != null)
+ writeQuotedValue (value, CTX_ATTRIBUTE);
+ rawWrite ('>');
+ newline ();
+ } catch (IOException e) {
+ fatal ("can't write", e);
+ }
+ }
+
+ /** <b>SAX2</b>: called on element declarations */
+ final public void elementDecl (String name, String model)
+ throws SAXException
+ {
+ if (xhtml)
+ return;
+ try {
+ // At this time, only SAX2 callbacks start these.
+ if (!startedDoctype)
+ return;
+ if (entityNestLevel != 0)
+ return;
+ rawWrite ("<!ELEMENT " + name + ' ' + model + '>');
+ newline ();
+ } catch (IOException e) {
+ fatal ("can't write", e);
+ }
+ }
+
+ /** <b>SAX2</b>: called on external entity declarations */
+ final public void externalEntityDecl (
+ String name,
+ String publicId,
+ String systemId)
+ throws SAXException
+ {
+ if (xhtml)
+ return;
+ try {
+ // At this time, only SAX2 callbacks start these.
+ if (!startedDoctype)
+ return;
+ if (entityNestLevel != 0)
+ return;
+ rawWrite ("<!ENTITY ");
+ if (name.startsWith ("%")) {
+ rawWrite ("% ");
+ rawWrite (name.substring (1));
+ } else
+ rawWrite (name);
+ if (publicId != null)
+ rawWrite (" PUBLIC \"" + publicId + '"');
+ else
+ rawWrite (" SYSTEM ");
+ rawWrite ('"' + systemId + "\">");
+ newline ();
+ } catch (IOException e) {
+ fatal ("can't write", e);
+ }
+ }
+
+ /** <b>SAX2</b>: called on internal entity declarations */
+ final public void internalEntityDecl (String name, String value)
+ throws SAXException
+ {
+ if (xhtml)
+ return;
+ try {
+ // At this time, only SAX2 callbacks start these.
+ if (!startedDoctype)
+ return;
+ if (entityNestLevel != 0)
+ return;
+ rawWrite ("<!ENTITY ");
+ if (name.startsWith ("%")) {
+ rawWrite ("% ");
+ rawWrite (name.substring (1));
+ } else
+ rawWrite (name);
+ rawWrite (' ');
+ writeQuotedValue (value, CTX_ENTITY);
+ rawWrite ('>');
+ newline ();
+ } catch (IOException e) {
+ fatal ("can't write", e);
+ }
+ }
+
+ private void writeQuotedValue (String value, int code)
+ throws SAXException, IOException
+ {
+ char buf [] = value.toCharArray ();
+ int off = 0, len = buf.length;
+
+ // we can't add line breaks to attribute/entity/... values
+ noWrap = true;
+ rawWrite ('"');
+ escapeChars (buf, off, len, code);
+ rawWrite ('"');
+ noWrap = false;
+ }
+
+ // From "HTMLlat1x.ent" ... names of entities for ISO-8859-1
+ // (Latin/1) characters, all codes: 160-255 (0xA0-0xFF).
+ // Codes 128-159 have no assigned values.
+ private static final String HTMLlat1x [] = {
+ // 160
+ "nbsp", "iexcl", "cent", "pound", "curren",
+ "yen", "brvbar", "sect", "uml", "copy",
+
+ // 170
+ "ordf", "laquo", "not", "shy", "reg",
+ "macr", "deg", "plusmn", "sup2", "sup3",
+
+ // 180
+ "acute", "micro", "para", "middot", "cedil",
+ "sup1", "ordm", "raquo", "frac14", "frac12",
+
+ // 190
+ "frac34", "iquest", "Agrave", "Aacute", "Acirc",
+ "Atilde", "Auml", "Aring", "AElig", "Ccedil",
+
+ // 200
+ "Egrave", "Eacute", "Ecirc", "Euml", "Igrave",
+ "Iacute", "Icirc", "Iuml", "ETH", "Ntilde",
+
+ // 210
+ "Ograve", "Oacute", "Ocirc", "Otilde", "Ouml",
+ "times", "Oslash", "Ugrave", "Uacute", "Ucirc",
+
+ // 220
+ "Uuml", "Yacute", "THORN", "szlig", "agrave",
+ "aacute", "acirc", "atilde", "auml", "aring",
+
+ // 230
+ "aelig", "ccedil", "egrave", "eacute", "ecirc",
+ "euml", "igrave", "iacute", "icirc", "iuml",
+
+ // 240
+ "eth", "ntilde", "ograve", "oacute", "ocirc",
+ "otilde", "ouml", "divide", "oslash", "ugrave",
+
+ // 250
+ "uacute", "ucirc", "uuml", "yacute", "thorn",
+ "yuml"
+ };
+
+ // From "HTMLsymbolx.ent" ... some of the symbols that
+ // we can conveniently handle. Entities for the Greek.
+ // alphabet (upper and lower cases) are compact.
+ private static final String HTMLsymbolx_GR [] = {
+ // 913
+ "Alpha", "Beta", "Gamma", "Delta", "Epsilon",
+ "Zeta", "Eta", "Theta", "Iota", "Kappa",
+
+ // 923
+ "Lambda", "Mu", "Nu", "Xi", "Omicron",
+ "Pi", "Rho", null, "Sigma", "Tau",
+
+ // 933
+ "Upsilon", "Phi", "Chi", "Psi", "Omega"
+ };
+
+ private static final String HTMLsymbolx_gr [] = {
+ // 945
+ "alpha", "beta", "gamma", "delta", "epsilon",
+ "zeta", "eta", "theta", "iota", "kappa",
+
+ // 955
+ "lambda", "mu", "nu", "xi", "omicron",
+ "pi", "rho", "sigmaf", "sigma", "tau",
+
+ // 965
+ "upsilon", "phi", "chi", "psi", "omega"
+ };
+
+
+ // General routine to write text and substitute predefined
+ // entities (XML, and a special case for XHTML) as needed.
+ private void escapeChars (char buf [], int off, int len, int code)
+ throws SAXException, IOException
+ {
+ int first = 0;
+
+ if (off < 0) {
+ off = 0;
+ len = buf.length;
+ }
+ for (int i = 0; i < len; i++) {
+ String esc;
+ char c = buf [off + i];
+
+ switch (c) {
+ // Note that CTX_ATTRIBUTE isn't explicitly tested here;
+ // all syntax delimiters are escaped in CTX_ATTRIBUTE,
+ // otherwise it's similar to CTX_CONTENT
+
+ // ampersand flags entity references; entity replacement
+ // text has unexpanded references, other text doesn't.
+ case '&':
+ if (code == CTX_ENTITY || code == CTX_UNPARSED)
+ continue;
+ esc = "amp";
+ break;
+
+ // attributes and text may NOT have literal '<', but
+ // entities may have markup constructs
+ case '<':
+ if (code == CTX_ENTITY || code == CTX_UNPARSED)
+ continue;
+ esc = "lt";
+ break;
+
+ // as above re markup constructs; but otherwise
+ // except when canonicalizing, this is for consistency
+ case '>':
+ if (code == CTX_ENTITY || code == CTX_UNPARSED)
+ continue;
+ esc = "gt";
+ break;
+ case '\'':
+ if (code == CTX_CONTENT || code == CTX_UNPARSED)
+ continue;
+ if (canonical)
+ continue;
+ esc = "apos";
+ break;
+
+ // needed when printing quoted attribute/entity values
+ case '"':
+ if (code == CTX_CONTENT || code == CTX_UNPARSED)
+ continue;
+ esc = "quot";
+ break;
+
+ // make line ends work per host OS convention
+ case '\n':
+ esc = eol;
+ break;
+
+ //
+ // No other characters NEED special treatment ... except
+ // for encoding-specific issues, like whether the character
+ // can really be represented in that encoding.
+ //
+ default:
+ //
+ // There are characters we can never write safely; getting
+ // them is an error.
+ //
+ // (a) They're never legal in XML ... detected by range
+ // checks, and (eventually) by remerging surrogate
+ // pairs on output. (Easy error for apps to prevent.)
+ //
+ // (b) This encoding can't represent them, and we
+ // can't make reference substitution (e.g. inside
+ // CDATA sections, names, PI data, etc). (Hard for
+ // apps to prevent, except by using UTF-8 or UTF-16
+ // as their output encoding.)
+ //
+ // We know a very little bit about what characters
+ // the US-ASCII and ISO-8859-1 encodings support. For
+ // other encodings we can't detect the second type of
+ // error at all. (Never an issue for UTF-8 or UTF-16.)
+ //
+
+// FIXME: CR in CDATA is an error; in text, turn to a char ref
+
+// FIXME: CR/LF/TAB in attributes should become char refs
+
+ if ((c > 0xfffd)
+ || ((c < 0x0020) && !((c == 0x0009)
+ || (c == 0x000A) || (c == 0x000D)))
+ || (((c & dangerMask) != 0)
+ && (code == CTX_UNPARSED))) {
+
+ // if case (b) in CDATA, we might end the section,
+ // write a reference, then restart ... possible
+ // in one DOM L3 draft.
+
+ throw new CharConversionException (
+ "Illegal or non-writable character: U+"
+ + Integer.toHexString (c));
+ }
+
+ //
+ // If the output encoding represents the character
+ // directly, let it do so! Else we'll escape it.
+ //
+ if ((c & dangerMask) == 0)
+ continue;
+ esc = null;
+
+ // Avoid numeric refs where symbolic ones exist, as
+ // symbolic ones make more sense to humans reading!
+ if (xhtml) {
+ // all the HTMLlat1x.ent entities
+ // (all the "ISO-8859-1" characters)
+ if (c >= 160 && c <= 255)
+ esc = HTMLlat1x [c - 160];
+
+ // not quite half the HTMLsymbolx.ent entities
+ else if (c >= 913 && c <= 937)
+ esc = HTMLsymbolx_GR [c - 913];
+ else if (c >= 945 && c <= 969)
+ esc = HTMLsymbolx_gr [c - 945];
+
+ else switch (c) {
+ // all of the HTMLspecialx.ent entities
+ case 338: esc = "OElig"; break;
+ case 339: esc = "oelig"; break;
+ case 352: esc = "Scaron"; break;
+ case 353: esc = "scaron"; break;
+ case 376: esc = "Yuml"; break;
+ case 710: esc = "circ"; break;
+ case 732: esc = "tilde"; break;
+ case 8194: esc = "ensp"; break;
+ case 8195: esc = "emsp"; break;
+ case 8201: esc = "thinsp"; break;
+ case 8204: esc = "zwnj"; break;
+ case 8205: esc = "zwj"; break;
+ case 8206: esc = "lrm"; break;
+ case 8207: esc = "rlm"; break;
+ case 8211: esc = "ndash"; break;
+ case 8212: esc = "mdash"; break;
+ case 8216: esc = "lsquo"; break;
+ case 8217: esc = "rsquo"; break;
+ case 8218: esc = "sbquo"; break;
+ case 8220: esc = "ldquo"; break;
+ case 8221: esc = "rdquo"; break;
+ case 8222: esc = "bdquo"; break;
+ case 8224: esc = "dagger"; break;
+ case 8225: esc = "Dagger"; break;
+ case 8240: esc = "permil"; break;
+ case 8249: esc = "lsaquo"; break;
+ case 8250: esc = "rsaquo"; break;
+ case 8364: esc = "euro"; break;
+
+ // the other HTMLsymbox.ent entities
+ case 402: esc = "fnof"; break;
+ case 977: esc = "thetasym"; break;
+ case 978: esc = "upsih"; break;
+ case 982: esc = "piv"; break;
+ case 8226: esc = "bull"; break;
+ case 8230: esc = "hellip"; break;
+ case 8242: esc = "prime"; break;
+ case 8243: esc = "Prime"; break;
+ case 8254: esc = "oline"; break;
+ case 8260: esc = "frasl"; break;
+ case 8472: esc = "weierp"; break;
+ case 8465: esc = "image"; break;
+ case 8476: esc = "real"; break;
+ case 8482: esc = "trade"; break;
+ case 8501: esc = "alefsym"; break;
+ case 8592: esc = "larr"; break;
+ case 8593: esc = "uarr"; break;
+ case 8594: esc = "rarr"; break;
+ case 8595: esc = "darr"; break;
+ case 8596: esc = "harr"; break;
+ case 8629: esc = "crarr"; break;
+ case 8656: esc = "lArr"; break;
+ case 8657: esc = "uArr"; break;
+ case 8658: esc = "rArr"; break;
+ case 8659: esc = "dArr"; break;
+ case 8660: esc = "hArr"; break;
+ case 8704: esc = "forall"; break;
+ case 8706: esc = "part"; break;
+ case 8707: esc = "exist"; break;
+ case 8709: esc = "empty"; break;
+ case 8711: esc = "nabla"; break;
+ case 8712: esc = "isin"; break;
+ case 8713: esc = "notin"; break;
+ case 8715: esc = "ni"; break;
+ case 8719: esc = "prod"; break;
+ case 8721: esc = "sum"; break;
+ case 8722: esc = "minus"; break;
+ case 8727: esc = "lowast"; break;
+ case 8730: esc = "radic"; break;
+ case 8733: esc = "prop"; break;
+ case 8734: esc = "infin"; break;
+ case 8736: esc = "ang"; break;
+ case 8743: esc = "and"; break;
+ case 8744: esc = "or"; break;
+ case 8745: esc = "cap"; break;
+ case 8746: esc = "cup"; break;
+ case 8747: esc = "int"; break;
+ case 8756: esc = "there4"; break;
+ case 8764: esc = "sim"; break;
+ case 8773: esc = "cong"; break;
+ case 8776: esc = "asymp"; break;
+ case 8800: esc = "ne"; break;
+ case 8801: esc = "equiv"; break;
+ case 8804: esc = "le"; break;
+ case 8805: esc = "ge"; break;
+ case 8834: esc = "sub"; break;
+ case 8835: esc = "sup"; break;
+ case 8836: esc = "nsub"; break;
+ case 8838: esc = "sube"; break;
+ case 8839: esc = "supe"; break;
+ case 8853: esc = "oplus"; break;
+ case 8855: esc = "otimes"; break;
+ case 8869: esc = "perp"; break;
+ case 8901: esc = "sdot"; break;
+ case 8968: esc = "lceil"; break;
+ case 8969: esc = "rceil"; break;
+ case 8970: esc = "lfloor"; break;
+ case 8971: esc = "rfloor"; break;
+ case 9001: esc = "lang"; break;
+ case 9002: esc = "rang"; break;
+ case 9674: esc = "loz"; break;
+ case 9824: esc = "spades"; break;
+ case 9827: esc = "clubs"; break;
+ case 9829: esc = "hearts"; break;
+ case 9830: esc = "diams"; break;
+ }
+ }
+
+ // else escape with numeric char refs
+ if (esc == null) {
+ stringBuf.setLength (0);
+ stringBuf.append ("#x");
+ stringBuf.append (Integer.toHexString (c).toUpperCase ());
+ esc = stringBuf.toString ();
+
+ // FIXME: We don't write surrogate pairs correctly.
+ // They should work as one ref per character, since
+ // each pair is one character. For reading back into
+ // Unicode, it matters beginning in Unicode 3.1 ...
+ }
+ break;
+ }
+ if (i != first)
+ rawWrite (buf, off + first, i - first);
+ first = i + 1;
+ if (esc == eol)
+ newline ();
+ else {
+ rawWrite ('&');
+ rawWrite (esc);
+ rawWrite (';');
+ }
+ }
+ if (first < len)
+ rawWrite (buf, off + first, len - first);
+ }
+
+
+
+ private void newline ()
+ throws SAXException, IOException
+ {
+ out.write (eol);
+ column = 0;
+ }
+
+ private void doIndent ()
+ throws SAXException, IOException
+ {
+ int space = elementNestLevel * 2;
+
+ newline ();
+ column = space;
+ // track tabs only at line starts
+ while (space > 8) {
+ out.write ("\t");
+ space -= 8;
+ }
+ while (space > 0) {
+ out.write (" ");
+ space -= 2;
+ }
+ }
+
+ private void rawWrite (char c)
+ throws IOException
+ {
+ out.write (c);
+ column++;
+ }
+
+ private void rawWrite (String s)
+ throws SAXException, IOException
+ {
+ if (prettyPrinting && "default".equals (space.peek ())) {
+ char data [] = s.toCharArray ();
+ rawWrite (data, 0, data.length);
+ } else {
+ out.write (s);
+ column += s.length ();
+ }
+ }
+
+ // NOTE: if xhtml, the REC gives some rules about whitespace
+ // which we could follow ... notably, many places where conformant
+ // agents "must" consolidate/normalize whitespace. Line ends can
+ // be removed there, etc. This may not be the right place to do
+ // such mappings though.
+
+ // Line buffering may help clarify algorithms and improve results.
+
+ // It's likely xml:space needs more attention.
+
+ private void rawWrite (char buf [], int offset, int length)
+ throws SAXException, IOException
+ {
+ boolean wrap;
+
+ if (prettyPrinting && space.empty ())
+ fatal ("stack discipline", null);
+
+ wrap = prettyPrinting && "default".equals (space.peek ());
+ if (!wrap) {
+ out.write (buf, offset, length);
+ column += length;
+ return;
+ }
+
+ // we're pretty printing and want to fill lines out only
+ // to the desired line length.
+ while (length > 0) {
+ int target = lineLength - column;
+ boolean wrote = false;
+
+ // Do we even have a problem?
+ if (target > length || noWrap) {
+ out.write (buf, offset, length);
+ column += length;
+ return;
+ }
+
+ // break the line at a space character, trying to fill
+ // as much of the line as possible.
+ char c;
+
+ for (int i = target - 1; i >= 0; i--) {
+ if ((c = buf [offset + i]) == ' ' || c == '\t') {
+ i++;
+ out.write (buf, offset, i);
+ doIndent ();
+ offset += i;
+ length -= i;
+ wrote = true;
+ break;
+ }
+ }
+ if (wrote)
+ continue;
+
+ // no space character permitting break before target
+ // line length is filled. So, take the next one.
+ if (target < 0)
+ target = 0;
+ for (int i = target; i < length; i++)
+ if ((c = buf [offset + i]) == ' ' || c == '\t') {
+ i++;
+ out.write (buf, offset, i);
+ doIndent ();
+ offset += i;
+ length -= i;
+ wrote = true;
+ break;
+ }
+ if (wrote)
+ continue;
+
+ // no such luck.
+ out.write (buf, offset, length);
+ column += length;
+ break;
+ }
+ }
+}
diff --git a/external/jaxp/source/gnu/xml/util/package.html b/external/jaxp/source/gnu/xml/util/package.html
new file mode 100644
index 000000000..0849289cc
--- /dev/null
+++ b/external/jaxp/source/gnu/xml/util/package.html
@@ -0,0 +1,22 @@
+<!DOCTYPE html PUBLIC
+ "-//W3C//DTD XHTML 1.0 Transitional//EN"
+ "http://www.w3.org/TR/1999/PR-xhtml1-19991210/DTD/xhtml1-transitional.dtd">
+
+<html><head><title> org.brownell.xml package </title> </head>
+<!--
+/*
+ * Copyright (c) 1999-2000 by David Brownell.
+ *
+ * $Id: package.html,v 1.1 2003-02-01 02:10:26 cbj Exp $
+ */
+-->
+<body>
+ <p> This package contains XML utilities, including SAX2 XML writers
+ and a parser of DOM trees, plus a command line driver.
+ That <a href="DoParse.html">driver</a>
+ connects parsers simple processing pipelines.
+ It can be handy for command line validation or
+ transformation tasks, possibly in batch mode,
+ or within Makefiles. </p>
+
+</body></html>
diff --git a/external/jaxp/source/javax/xml/parsers/ClassStuff.java b/external/jaxp/source/javax/xml/parsers/ClassStuff.java
new file mode 100644
index 000000000..038863748
--- /dev/null
+++ b/external/jaxp/source/javax/xml/parsers/ClassStuff.java
@@ -0,0 +1,158 @@
+/*
+ * $Id: ClassStuff.java,v 1.1 2003-02-01 02:10:26 cbj Exp $
+ * Copyright (C) 2001 David Brownell
+ *
+ * This file is part of GNU JAXP, a library.
+ *
+ * GNU JAXP is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * GNU JAXP is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ * As a special exception, if you link this library with other files to
+ * produce an executable, this library does not by itself cause the
+ * resulting executable to be covered by the GNU General Public License.
+ * This exception does not however invalidate any other reasons why the
+ * executable file might be covered by the GNU General Public License.
+ */
+
+package javax.xml.parsers;
+
+import java.io.BufferedReader;
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.InputStream;
+import java.io.InputStreamReader;
+import java.lang.reflect.Method;
+import java.util.Properties;
+
+
+// $Id: ClassStuff.java,v 1.1 2003-02-01 02:10:26 cbj Exp $
+
+/**
+ * Package-private utility methods for sharing
+ * magic related to class loading.
+ * NOTE: This is cloned in javax.xml.transform,
+ * where a different exception is thrown (bleech).
+ * Keep changes to the two copies in sync.
+ *
+ * @author David Brownell
+ * @version $Id: ClassStuff.java,v 1.1 2003-02-01 02:10:26 cbj Exp $
+ */
+final class ClassStuff
+{
+ private ClassStuff () { }
+
+ /**
+ * Get the default factory using the four-stage defaulting
+ * mechanism defined by JAXP.
+ */
+ static Object
+ createFactory (String label, String defaultClass)
+ throws FactoryConfigurationError
+ {
+ String name = null;
+ ClassLoader loader = null;
+
+ // figure out which class loader to use.
+ // source compiles on jdk 1.1, but works with jdk 1.2+ security
+ try {
+ Method m = null;
+
+ // Can we use JDK 1.2 APIs? Preferred: security policies apply.
+ m = Thread.class.getMethod ("getContextClassLoader", null);
+ loader = (ClassLoader) m.invoke (Thread.currentThread(), null);
+ } catch (NoSuchMethodException e) {
+ // Assume that we are running JDK 1.1; use current ClassLoader
+ loader = ClassStuff.class.getClassLoader();
+ } catch (NoSuchMethodError e) {
+ // evidently IE does this (one of its bugs)
+ loader = ClassStuff.class.getClassLoader();
+ } catch (Throwable e) {
+ // "should not happen"
+ throw new UnknownError (e.getMessage());
+ }
+
+ // 1. Check System Property
+ // ... normally fails in applet environments
+ try { name = System.getProperty (label);
+ } catch (SecurityException e) { /* IGNORE */ }
+
+ // 2. Check in $JAVA_HOME/lib/jaxp.properties
+ try {
+ if (name == null) {
+ String javaHome;
+ File file;
+
+ javaHome = System.getProperty ("java.home");
+ file = new File (new File (javaHome, "lib"), "jaxp.properties");
+ if (file.exists() == true) {
+ FileInputStream in = new FileInputStream (file);
+ Properties props = new Properties();
+
+ props.load (in);
+ name = props.getProperty (label);
+ in.close ();
+ }
+ }
+ } catch (Exception e) { /* IGNORE */ }
+
+ // 3. Check Services API
+ if (name == null) {
+ try {
+ String service = "META-INF/services/" + label;
+ InputStream in;
+ BufferedReader reader;
+
+ if (loader == null)
+ in = ClassLoader.getSystemResourceAsStream (service);
+ else
+ in = loader.getResourceAsStream (service);
+ if (in != null) {
+ reader = new BufferedReader (
+ new InputStreamReader (in, "UTF8"));
+ name = reader.readLine();
+ in.close ();
+ }
+ } catch (Exception e2) { /* IGNORE */ }
+ }
+
+ // 4. Distro-specific fallback
+ if (name == null)
+ name = defaultClass;
+
+ // Instantiate!
+ try {
+ Class klass;
+
+ if (loader == null)
+ klass = Class.forName (name);
+ else
+ klass = loader.loadClass (name);
+ return klass.newInstance ();
+
+ } catch (ClassNotFoundException e) {
+ throw new FactoryConfigurationError (e,
+ "Factory class " + name
+ + " not found");
+ } catch (IllegalAccessException e) {
+ throw new FactoryConfigurationError (e,
+ "Factory class " + name
+ + " found but cannot be loaded");
+ } catch (InstantiationException e) {
+ throw new FactoryConfigurationError (e,
+ "Factory class " + name
+ + " loaded but cannot be instantiated"
+ + " ((no default constructor?)");
+ }
+ }
+}
diff --git a/external/jaxp/source/javax/xml/parsers/DocumentBuilder.java b/external/jaxp/source/javax/xml/parsers/DocumentBuilder.java
new file mode 100644
index 000000000..2c583ef84
--- /dev/null
+++ b/external/jaxp/source/javax/xml/parsers/DocumentBuilder.java
@@ -0,0 +1,146 @@
+/*
+ * $Id: DocumentBuilder.java,v 1.1 2003-02-01 02:10:26 cbj Exp $
+ * Copyright (C) 2001 Andrew Selkirk
+ * Copyright (C) 2001 David Brownell
+ *
+ * This file is part of GNU JAXP, a library.
+ *
+ * GNU JAXP is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * GNU JAXP is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ * As a special exception, if you link this library with other files to
+ * produce an executable, this library does not by itself cause the
+ * resulting executable to be covered by the GNU General Public License.
+ * This exception does not however invalidate any other reasons why the
+ * executable file might be covered by the GNU General Public License.
+ */
+
+package javax.xml.parsers;
+
+// Imports
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.InputStream;
+import java.io.IOException;
+// import java.net.*;
+import org.w3c.dom.DOMImplementation;
+import org.w3c.dom.Document;
+import org.xml.sax.InputSource;
+import org.xml.sax.EntityResolver;
+import org.xml.sax.ErrorHandler;
+import org.xml.sax.InputSource;
+import org.xml.sax.SAXException;
+
+
+/**
+ * Uses an XML parser to construct a DOM document.
+ * @author Andrew Selkirk, David Brownell
+ * @version $Id: DocumentBuilder.java,v 1.1 2003-02-01 02:10:26 cbj Exp $
+ */
+public abstract class DocumentBuilder
+{
+ /** Only subclasses may use the constructor. */
+ protected DocumentBuilder() { }
+
+
+ //-------------------------------------------------------------
+ // Methods ----------------------------------------------------
+ //-------------------------------------------------------------
+
+ public abstract DOMImplementation getDOMImplementation ();
+
+ public abstract boolean isNamespaceAware();
+
+ public abstract boolean isValidating();
+
+ public abstract Document newDocument();
+
+ // we don't demand jdk 1.2 File.toURL() in the runtime
+ // keep in sync with gnu.xml.util.Resolver
+ // and javax.xml.transform.stream.StreamSource
+ static String fileToURL (File f)
+ throws IOException
+ {
+ String temp;
+
+ // FIXME: getAbsolutePath() seems buggy; I'm seeing components
+ // like "/foo/../" which are clearly not "absolute"
+ // and should have been resolved with the filesystem.
+
+ // Substituting "/" would be wrong, "foo" may have been
+ // symlinked ... the URL code will make that change
+ // later, so that things can get _really_ broken!
+
+ temp = f.getAbsolutePath ();
+
+ if (File.separatorChar != '/')
+ temp = temp.replace (File.separatorChar, '/');
+ if (!temp.startsWith ("/"))
+ temp = "/" + temp;
+ if (!temp.endsWith ("/") && f.isDirectory ())
+ temp = temp + "/";
+ return "file:" + temp;
+ }
+
+ /**
+ * Constructs an InputSource from the file, and invokes parse ().
+ * The InputSource includes the URI for the file.
+ */
+ public Document parse (File file)
+ throws SAXException, IOException
+ {
+ InputSource source;
+
+ source = new InputSource (fileToURL (file));
+ source.setByteStream (new FileInputStream(file));
+ return parse (source);
+ }
+
+ public abstract Document parse(InputSource source)
+ throws SAXException, IOException;
+
+ /**
+ * Avoid using this call; provide the system ID wherever possible.
+ * System IDs are essential when parsers resolve relative URIs,
+ * or provide diagnostics.
+ */
+ public Document parse(InputStream stream)
+ throws SAXException, IOException {
+ return parse(new InputSource(stream));
+ } // parse()
+
+ public Document parse(InputStream stream, String systemID)
+ throws SAXException, IOException {
+
+ // Variables
+ InputSource source;
+
+ // Create Source
+ source = new InputSource(stream);
+ source.setSystemId(systemID);
+
+ // Parse Input Source
+ return parse(source);
+
+ } // parse()
+
+ public Document parse(String uri)
+ throws SAXException, IOException {
+ return parse(new InputSource(uri));
+ } // parse()
+
+ public abstract void setEntityResolver(EntityResolver resolver);
+
+ public abstract void setErrorHandler(ErrorHandler handler);
+}
diff --git a/external/jaxp/source/javax/xml/parsers/DocumentBuilderFactory.java b/external/jaxp/source/javax/xml/parsers/DocumentBuilderFactory.java
new file mode 100644
index 000000000..2783bb44c
--- /dev/null
+++ b/external/jaxp/source/javax/xml/parsers/DocumentBuilderFactory.java
@@ -0,0 +1,145 @@
+/*
+ * $Id: DocumentBuilderFactory.java,v 1.1 2003-02-01 02:10:26 cbj Exp $
+ * Copyright (C) 2001 Andrew Selkirk
+ * Copyright (C) 2001 David Brownell
+ *
+ * This file is part of GNU JAXP, a library.
+ *
+ * GNU JAXP is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * GNU JAXP is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ * As a special exception, if you link this library with other files to
+ * produce an executable, this library does not by itself cause the
+ * resulting executable to be covered by the GNU General Public License.
+ * This exception does not however invalidate any other reasons why the
+ * executable file might be covered by the GNU General Public License.
+ */
+
+package javax.xml.parsers;
+
+// Imports
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.File;
+import java.io.BufferedReader;
+import java.io.InputStreamReader;
+import java.util.Properties;
+import org.w3c.dom.*;
+import org.xml.sax.*;
+
+/**
+ * DocumentBuilderFactory is used to resolve the problem that the
+ * W3C DOM APIs don't include portable bootstrapping.
+ *
+ * @author Andrew Selkirk, David Brownell
+ * @version $Id: DocumentBuilderFactory.java,v 1.1 2003-02-01 02:10:26 cbj Exp $
+ */
+public abstract class DocumentBuilderFactory {
+
+ //-------------------------------------------------------------
+ // Variables --------------------------------------------------
+ //-------------------------------------------------------------
+
+ private static final String defaultPropName =
+ "javax.xml.parsers.DocumentBuilderFactory";
+
+ private boolean validating = false;
+ private boolean namespaceAware = false;
+ private boolean whitespace = false;
+ private boolean expandEntityRef = false;
+ private boolean ignoreComments = false;
+ private boolean coalescing = false;
+
+
+ //-------------------------------------------------------------
+ // Initialization ---------------------------------------------
+ //-------------------------------------------------------------
+
+ protected DocumentBuilderFactory() {
+ } // DocumentBuilderFactory()
+
+
+ //-------------------------------------------------------------
+ // Methods ----------------------------------------------------
+ //-------------------------------------------------------------
+
+ public abstract Object getAttribute(String name)
+ throws IllegalArgumentException;
+
+ public boolean isCoalescing() {
+ return coalescing;
+ } // isCoalescing()
+
+ public boolean isExpandEntityReferences() {
+ return expandEntityRef;
+ } // isExpandEntityReferences()
+
+ public boolean isIgnoringComments() {
+ return ignoreComments;
+ } // isIgnoringComments()
+
+ public boolean isIgnoringElementContentWhitespace() {
+ return whitespace;
+ } // isIgnoringElementContentWhitespace()
+
+ public boolean isNamespaceAware() {
+ return namespaceAware;
+ } // isNamespaceAware()
+
+ public boolean isValidating() {
+ return validating;
+ } // isValidating()
+
+ public abstract DocumentBuilder newDocumentBuilder()
+ throws ParserConfigurationException;
+
+ public static DocumentBuilderFactory newInstance() {
+ try {
+ return (DocumentBuilderFactory)
+ ClassStuff.createFactory (
+ defaultPropName,
+ "gnu.xml.dom.JAXPFactory");
+ } catch (ClassCastException e) {
+ throw new FactoryConfigurationError (e,
+ "Factory class is the wrong type");
+ }
+ }
+
+ public abstract void setAttribute(String name, Object value)
+ throws IllegalArgumentException;
+
+ public void setCoalescing(boolean value) {
+ coalescing = value;
+ } // setCoalescing()
+
+ public void setExpandEntityReferences(boolean value) {
+ expandEntityRef = value;
+ } // setExpandEntityReferences()
+
+ public void setIgnoringComments(boolean value) {
+ ignoreComments = value;
+ } // setIgnoringComments()
+
+ public void setIgnoringElementContentWhitespace(boolean value) {
+ whitespace = value;
+ } // setIgnoringElementContentWhitespace()
+
+ public void setNamespaceAware(boolean value) {
+ namespaceAware = value;
+ } // setNamespaceAware()
+
+ public void setValidating(boolean value) {
+ validating = value;
+ } // setValidating()
+}
diff --git a/external/jaxp/source/javax/xml/parsers/FactoryConfigurationError.java b/external/jaxp/source/javax/xml/parsers/FactoryConfigurationError.java
new file mode 100644
index 000000000..797d91a12
--- /dev/null
+++ b/external/jaxp/source/javax/xml/parsers/FactoryConfigurationError.java
@@ -0,0 +1,81 @@
+/*
+ * $Id: FactoryConfigurationError.java,v 1.1 2003-02-01 02:10:27 cbj Exp $
+ * Copyright (C) 2001 Andrew Selkirk
+ *
+ * This file is part of GNU JAXP, a library.
+ *
+ * GNU JAXP is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * GNU JAXP is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ * As a special exception, if you link this library with other files to
+ * produce an executable, this library does not by itself cause the
+ * resulting executable to be covered by the GNU General Public License.
+ * This exception does not however invalidate any other reasons why the
+ * executable file might be covered by the GNU General Public License.
+ */
+
+package javax.xml.parsers;
+
+/**
+ * FactoryConfigurationError
+ * @author Andrew Selkirk
+ * @version 1.0
+ */
+public class FactoryConfigurationError extends Error {
+
+ //-------------------------------------------------------------
+ // Variables --------------------------------------------------
+ //-------------------------------------------------------------
+
+ private Exception exception = null;
+
+
+ //-------------------------------------------------------------
+ // Initialization ---------------------------------------------
+ //-------------------------------------------------------------
+ public FactoryConfigurationError() {
+ super();
+ } // FactoryConfigurationError()
+
+ public FactoryConfigurationError(String msg) {
+ super(msg);
+ } // FactoryConfigurationError()
+
+ public FactoryConfigurationError(Exception ex) {
+ super();
+ exception = ex;
+ } // FactoryConfigurationError()
+
+ public FactoryConfigurationError(Exception ex, String msg) {
+ super(msg);
+ exception = ex;
+ } // FactoryConfigurationError()
+
+
+ //-------------------------------------------------------------
+ // Methods ----------------------------------------------------
+ //-------------------------------------------------------------
+
+ public String getMessage() {
+ return super.getMessage();
+ } // getMessage()
+
+ public Exception getException() {
+ return exception;
+ } // getException()
+
+
+} // FactoryConfigurationError
+
+
diff --git a/external/jaxp/source/javax/xml/parsers/ParserConfigurationException.java b/external/jaxp/source/javax/xml/parsers/ParserConfigurationException.java
new file mode 100644
index 000000000..1648e33cd
--- /dev/null
+++ b/external/jaxp/source/javax/xml/parsers/ParserConfigurationException.java
@@ -0,0 +1,51 @@
+/*
+ * $Id: ParserConfigurationException.java,v 1.1 2003-02-01 02:10:27 cbj Exp $
+ * Copyright (C) 2001 Andrew Selkirk
+ *
+ * This file is part of GNU JAXP, a library.
+ *
+ * GNU JAXP is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * GNU JAXP is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ * As a special exception, if you link this library with other files to
+ * produce an executable, this library does not by itself cause the
+ * resulting executable to be covered by the GNU General Public License.
+ * This exception does not however invalidate any other reasons why the
+ * executable file might be covered by the GNU General Public License.
+ */
+
+package javax.xml.parsers;
+
+/**
+ * ParserConfigurationException
+ * @author Andrew Selkirk
+ * @version 1.0
+ */
+public class ParserConfigurationException extends Exception {
+
+ //-------------------------------------------------------------
+ // Initialization ---------------------------------------------
+ //-------------------------------------------------------------
+
+ public ParserConfigurationException() {
+ super();
+ } // ParserConfigurationException()
+
+ public ParserConfigurationException(String message) {
+ super(message);
+ } // ParserConfigurationException()
+
+
+} // ParserConfigurationException
+
diff --git a/external/jaxp/source/javax/xml/parsers/SAXParser.java b/external/jaxp/source/javax/xml/parsers/SAXParser.java
new file mode 100644
index 000000000..c1ecf2756
--- /dev/null
+++ b/external/jaxp/source/javax/xml/parsers/SAXParser.java
@@ -0,0 +1,226 @@
+/*
+ * $Id: SAXParser.java,v 1.1 2003-02-01 02:10:27 cbj Exp $
+ * Copyright (C) 2001 Andrew Selkirk
+ * Copyright (C) 2001 David Brownell
+ *
+ * This file is part of GNU JAXP, a library.
+ *
+ * GNU JAXP is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * GNU JAXP is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ * As a special exception, if you link this library with other files to
+ * produce an executable, this library does not by itself cause the
+ * resulting executable to be covered by the GNU General Public License.
+ * This exception does not however invalidate any other reasons why the
+ * executable file might be covered by the GNU General Public License.
+ */
+
+package javax.xml.parsers;
+
+// Imports
+import java.io.*;
+import java.net.*;
+import org.w3c.dom.*;
+import org.xml.sax.*;
+import org.xml.sax.helpers.*;
+
+/**
+ * Wraps a SAX2 (or SAX1) parser.
+ *
+ * <p>Note that parsing with methods on this interface requires use of one
+ * of the optional SAX base classes. It's usually preferable to use the
+ * SAX parser APIs directly. SAX gives much more flexibility about how
+ * application classes are organized, and about how the document entity is
+ * packaged for delivery to the parser. And JAXP doesn't otherwise provide
+ * access to the SAX2 extension handlers for lexical or declaration events.
+ *
+ * @author Andrew Selkirk
+ * @author David Brownell
+ * @version 1.0
+ */
+public abstract class SAXParser
+{
+ /** Only subclasses may use the constructor. */
+ protected SAXParser() { }
+
+
+ //-------------------------------------------------------------
+ // Methods ----------------------------------------------------
+ //-------------------------------------------------------------
+
+ public abstract void setProperty (String id, Object value)
+ throws SAXNotRecognizedException, SAXNotSupportedException;
+
+ public abstract Object getProperty (String id)
+ throws SAXNotRecognizedException, SAXNotSupportedException;
+
+ /**
+ * Parse using (deprecated) SAX1 style handlers,
+ * and a byte stream (with no URI).
+ * Avoid using this API, since relative URIs in the document need
+ * to be resolved against the document entity's URI, and good
+ * diagnostics also need that URI.
+ */
+ public void parse(InputStream stream, HandlerBase handler)
+ throws SAXException, IOException
+ { parse (new InputSource (stream), handler); }
+
+ /**
+ * Parse using (deprecated) SAX1 style handlers,
+ * and a byte stream with a specified URI.
+ */
+ public void parse (
+ InputStream stream,
+ HandlerBase handler,
+ String systemID
+ ) throws SAXException, IOException
+ {
+ InputSource source;
+
+ // Prepare Source
+ source = new InputSource(stream);
+ source.setSystemId(systemID);
+
+ parse(source, handler);
+
+ }
+
+ /**
+ * Parse using SAX2 style handlers,
+ * and a byte stream (with no URI).
+ * Avoid using this API, since relative URIs in the document need
+ * to be resolved against the document entity's URI, and good
+ * diagnostics also need that URI.
+ */
+ public void parse(InputStream stream, DefaultHandler def)
+ throws SAXException, IOException
+ { parse (new InputSource (stream), def); }
+
+ /**
+ * Parse using SAX2 style handlers,
+ * and a byte stream with a specified URI.
+ */
+ public void parse (
+ InputStream stream,
+ DefaultHandler def,
+ String systemID
+ ) throws SAXException, IOException
+ {
+ InputSource source;
+
+ // Prepare Source
+ source = new InputSource(stream);
+ source.setSystemId(systemID);
+
+ parse(source, def);
+
+ }
+
+ /**
+ * Parse using (deprecated) SAX1 style handlers,
+ * and a URI for the document entity.
+ */
+ public void parse(String uri, HandlerBase handler)
+ throws SAXException, IOException
+ { parse (new InputSource (uri), handler); }
+
+ /**
+ * Parse using SAX2 style handlers,
+ * and a URI for the document entity.
+ */
+ public void parse(String uri, DefaultHandler def)
+ throws SAXException, IOException
+ { parse (new InputSource (uri), def); }
+
+ /**
+ * Parse using (deprecated) SAX1 style handlers,
+ * turning a file name into the document URI.
+ */
+ public void parse(File file, HandlerBase handler)
+ throws SAXException, IOException
+ {
+ InputSource in;
+
+ in = new InputSource (DocumentBuilder.fileToURL (file));
+ parse (in, handler);
+ }
+
+ /**
+ * Parse using SAX2 style handlers,
+ * turning a file name into the document URI.
+ */
+ public void parse(File file, DefaultHandler def)
+ throws SAXException, IOException
+ {
+ InputSource in;
+
+ in = new InputSource (DocumentBuilder.fileToURL (file));
+ parse (in, def);
+ }
+
+ /**
+ * Parse using (deprecated) SAX1 style handlers.
+ */
+ public void parse(InputSource source, HandlerBase handler)
+ throws SAXException, IOException
+ {
+ Parser parser;
+
+ // Prepare Parser
+ parser = getParser();
+ parser.setDocumentHandler(handler);
+ parser.setDTDHandler(handler);
+ parser.setEntityResolver(handler);
+ parser.setErrorHandler(handler);
+
+ // Parse
+ parser.parse(source);
+
+ }
+
+ /**
+ * Parse using SAX2 style handlers.
+ */
+ public void parse(InputSource source, DefaultHandler def)
+ throws SAXException, IOException
+ {
+ XMLReader reader;
+
+ // Prepare XML Reader
+ reader = getXMLReader();
+ reader.setContentHandler(def);
+ reader.setDTDHandler(def);
+ reader.setEntityResolver(def);
+ reader.setErrorHandler(def);
+
+ // NOTE: this should NOT understand the
+ // extension handlers (lexical, decl).
+
+ reader.parse(source);
+ }
+
+ /**
+ * Get a (deprecated) SAX1 driver for the underlying parser.
+ */
+ public abstract Parser getParser() throws SAXException;
+
+ /**
+ * Get a SAX2 driver for the underlying parser.
+ */
+ public abstract XMLReader getXMLReader() throws SAXException;
+
+ public abstract boolean isNamespaceAware();
+
+ public abstract boolean isValidating();
+}
diff --git a/external/jaxp/source/javax/xml/parsers/SAXParserFactory.java b/external/jaxp/source/javax/xml/parsers/SAXParserFactory.java
new file mode 100644
index 000000000..760c737fa
--- /dev/null
+++ b/external/jaxp/source/javax/xml/parsers/SAXParserFactory.java
@@ -0,0 +1,160 @@
+/*
+ * $Id: SAXParserFactory.java,v 1.1 2003-02-01 02:10:27 cbj Exp $
+ * Copyright (C) 2001 Andrew Selkirk
+ * Copyright (C) 2001 David Brownell
+ *
+ * This file is part of GNU JAXP, a library.
+ *
+ * GNU JAXP is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * GNU JAXP is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ * As a special exception, if you link this library with other files to
+ * produce an executable, this library does not by itself cause the
+ * resulting executable to be covered by the GNU General Public License.
+ * This exception does not however invalidate any other reasons why the
+ * executable file might be covered by the GNU General Public License.
+ */
+
+package javax.xml.parsers;
+
+// Imports
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.File;
+import java.io.BufferedReader;
+import java.io.InputStreamReader;
+import java.util.Properties;
+import org.w3c.dom.*;
+import org.xml.sax.*;
+
+/**
+ * SAXParserFactory is used to bootstrap JAXP wrappers for
+ * SAX parsers.
+ *
+ * <para> Note that the JAXP 1.1 spec does not specify how
+ * the <em>isValidating()</em> or <em>isNamespaceAware()</em>
+ * flags relate to the SAX2 feature flags controlling those
+ * same features.
+ *
+ * @author Andrew Selkirk, David Brownell
+ * @version 1.0
+ */
+
+public abstract class SAXParserFactory {
+
+ //-------------------------------------------------------------
+ // Variables --------------------------------------------------
+ //-------------------------------------------------------------
+
+ private static final String defaultPropName =
+ "javax.xml.parsers.SAXParserFactory";
+
+ private boolean validating = false;
+ private boolean namespaceAware = false;
+
+
+ //-------------------------------------------------------------
+ // Initialization ---------------------------------------------
+ //-------------------------------------------------------------
+
+ protected SAXParserFactory() {
+ } // SAXParserFactory()
+
+
+ //-------------------------------------------------------------
+ // Methods ----------------------------------------------------
+ //-------------------------------------------------------------
+
+ public static SAXParserFactory newInstance() {
+ try {
+ return (SAXParserFactory)
+ ClassStuff.createFactory (
+ defaultPropName,
+ "gnu.xml.aelfred2.JAXPFactory");
+ } catch (ClassCastException e) {
+ throw new FactoryConfigurationError (e,
+ "Factory class is the wrong type");
+ }
+ }
+
+ /**
+ * Returns a new instance of a SAXParser using the platform
+ * default implementation and the currently specified factory
+ * feature flag settings.
+ *
+ * @exception ParserConfigurationException
+ * when the parameter combination is not supported
+ * @exception SAXNotRecognizedException
+ * if one of the specified SAX2 feature flags is not recognized
+ * @exception SAXNotSupportedException
+ * if one of the specified SAX2 feature flags values can
+ * not be set, perhaps because of sequencing requirements
+ * (which could be met by using SAX2 directly)
+ */
+ public abstract SAXParser newSAXParser()
+ throws ParserConfigurationException, SAXException;
+
+ public void setNamespaceAware(boolean value) {
+ namespaceAware = value;
+ } // setNamespaceAware()
+
+ public void setValidating(boolean value) {
+ validating = value;
+ } // setValidating()
+
+ public boolean isNamespaceAware() {
+ return namespaceAware;
+ } // isNamespaceAware()
+
+ public boolean isValidating() {
+ return validating;
+ } // isValidating()
+
+ /**
+ * Establishes a factory parameter corresponding to the
+ * specified feature flag.
+ *
+ * @param name identifies the feature flag
+ * @param value specifies the desired flag value
+ *
+ * @exception SAXNotRecognizedException
+ * if the specified SAX2 feature flag is not recognized
+ * @exception SAXNotSupportedException
+ * if the specified SAX2 feature flag values can not be set,
+ * perhaps because of sequencing requirements (which could
+ * be met by using SAX2 directly)
+ */
+ public abstract void setFeature (String name, boolean value)
+ throws ParserConfigurationException,
+ SAXNotRecognizedException,
+ SAXNotSupportedException;
+
+ /**
+ * Retrieves a current factory feature flag setting.
+ *
+ * @param name identifies the feature flag
+ *
+ * @exception SAXNotRecognizedException
+ * if the specified SAX2 feature flag is not recognized
+ * @exception SAXNotSupportedException
+ * if the specified SAX2 feature flag values can not be
+ * accessed before parsing begins.
+ */
+ public abstract boolean getFeature (String name)
+ throws ParserConfigurationException,
+ SAXNotRecognizedException,
+ SAXNotSupportedException;
+
+} // SAXParserFactory
+
diff --git a/external/jaxp/source/javax/xml/parsers/package.html b/external/jaxp/source/javax/xml/parsers/package.html
new file mode 100644
index 000000000..71739b92c
--- /dev/null
+++ b/external/jaxp/source/javax/xml/parsers/package.html
@@ -0,0 +1,16 @@
+<html><head>javax.xml.parsers</head><body>
+
+<p>Bootstrapping APIs for JAXP parsers.
+This is the first portable API defined for bootstrapping DOM.
+
+<p>JAXP parsers bootstrap in two stages.
+First is getting a factory, and configuring it.
+Second is asking that factory for a parser.
+
+<p>The SAX bootstrapping support corresponds to functionality
+found in the <em>org.xml.sax.helpers</em> package, except
+that it uses the JAXP two stage bootstrap paradigm and
+that the parser that's bootstrapped is normally wrapping
+a SAX parser rather than exposing it for direct use.
+
+</body></html>
diff --git a/external/jaxp/source/javax/xml/transform/ClassStuff.java b/external/jaxp/source/javax/xml/transform/ClassStuff.java
new file mode 100644
index 000000000..f7ca8442f
--- /dev/null
+++ b/external/jaxp/source/javax/xml/transform/ClassStuff.java
@@ -0,0 +1,155 @@
+/*
+ * $Id: ClassStuff.java,v 1.1 2003-02-01 02:10:27 cbj Exp $
+ * Copyright (C) 2001 David Brownell
+ *
+ * This file is part of GNU JAXP, a library.
+ *
+ * GNU JAXP is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * GNU JAXP is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ * As a special exception, if you link this library with other files to
+ * produce an executable, this library does not by itself cause the
+ * resulting executable to be covered by the GNU General Public License.
+ * This exception does not however invalidate any other reasons why the
+ * executable file might be covered by the GNU General Public License.
+ */
+
+package javax.xml.transform;
+
+import java.io.BufferedReader;
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.InputStream;
+import java.io.InputStreamReader;
+import java.lang.reflect.Method;
+import java.util.Properties;
+
+
+// $Id: ClassStuff.java,v 1.1 2003-02-01 02:10:27 cbj Exp $
+
+/**
+ * Package-private utility methods for sharing
+ * magic related to class loading.
+ * NOTE: This is cloned in javax.xml.parsers,
+ * where a different exception is thrown (bleech).
+ * Keep changes to the two copies in sync.
+ *
+ * @author David Brownell
+ * @version $Id: ClassStuff.java,v 1.1 2003-02-01 02:10:27 cbj Exp $
+ */
+final class ClassStuff
+{
+ private ClassStuff () { }
+
+ /**
+ * Get the default factory using the four-stage defaulting
+ * mechanism defined by JAXP.
+ */
+ static Object
+ createFactory (String label, String defaultClass)
+ throws TransformerFactoryConfigurationError
+ {
+ String name = null;
+ ClassLoader loader = null;
+
+ // figure out which class loader to use.
+ // source compiles on jdk 1.1, but works with jdk 1.2+ security
+ try {
+ Method m = null;
+
+ // Can we use JDK 1.2 APIs? Preferred: security policies apply.
+ m = Thread.class.getMethod ("getContextClassLoader", null);
+ loader = (ClassLoader) m.invoke (Thread.currentThread(), null);
+ } catch (NoSuchMethodException e) {
+ // Assume that we are running JDK 1.1; use current ClassLoader
+ loader = ClassStuff.class.getClassLoader();
+ } catch (Exception e) {
+ // "should not happen"
+ throw new UnknownError (e.getMessage());
+ }
+
+ // 1. Check System Property
+ // ... normally fails in applet environments
+ try { name = System.getProperty (label);
+ } catch (SecurityException e) { /* IGNORE */ }
+
+ // 2. Check in $JAVA_HOME/lib/jaxp.properties
+ try {
+ if (name == null) {
+ String javaHome;
+ File file;
+
+ javaHome = System.getProperty ("java.home");
+ file = new File (new File (javaHome, "lib"), "jaxp.properties");
+ if (file.exists() == true) {
+ FileInputStream in = new FileInputStream (file);
+ Properties props = new Properties();
+
+ props.load (in);
+ name = props.getProperty (label);
+ in.close ();
+ }
+ }
+ } catch (Exception e) { /* IGNORE */ }
+
+ // 3. Check Services API
+ if (name == null) {
+ try {
+ String service = "META-INF/services/" + label;
+ InputStream in;
+ BufferedReader reader;
+
+ if (loader == null)
+ in = ClassLoader.getSystemResourceAsStream (service);
+ else
+ in = loader.getResourceAsStream (service);
+ if (in != null) {
+ reader = new BufferedReader (
+ new InputStreamReader (in, "UTF8"));
+ name = reader.readLine();
+ in.close ();
+ }
+ } catch (Exception e2) { /* IGNORE */ }
+ }
+
+ // 4. Distro-specific fallback
+ if (name == null)
+ name = defaultClass;
+
+ // Instantiate!
+ try {
+ Class klass;
+
+ if (loader == null)
+ klass = Class.forName (name);
+ else
+ klass = loader.loadClass (name);
+ return klass.newInstance ();
+
+ } catch (ClassNotFoundException e) {
+ throw new TransformerFactoryConfigurationError (e,
+ "Factory class " + name
+ + " not found");
+ } catch (IllegalAccessException e) {
+ throw new TransformerFactoryConfigurationError (e,
+ "Factory class " + name
+ + " found but cannot be loaded");
+ } catch (InstantiationException e) {
+ throw new TransformerFactoryConfigurationError (e,
+ "Factory class " + name
+ + " loaded but cannot be instantiated"
+ + " ((no default constructor?)");
+ }
+ }
+}
diff --git a/external/jaxp/source/javax/xml/transform/ErrorListener.java b/external/jaxp/source/javax/xml/transform/ErrorListener.java
new file mode 100644
index 000000000..c4139efc8
--- /dev/null
+++ b/external/jaxp/source/javax/xml/transform/ErrorListener.java
@@ -0,0 +1,52 @@
+/*
+ * $Id: ErrorListener.java,v 1.1 2003-02-01 02:10:27 cbj Exp $
+ * Copyright (C) 2001 Andrew Selkirk
+ *
+ * This file is part of GNU JAXP, a library.
+ *
+ * GNU JAXP is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * GNU JAXP is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ * As a special exception, if you link this library with other files to
+ * produce an executable, this library does not by itself cause the
+ * resulting executable to be covered by the GNU General Public License.
+ * This exception does not however invalidate any other reasons why the
+ * executable file might be covered by the GNU General Public License.
+ */
+package javax.xml.transform;
+
+/**
+ * JAXP/Transform analogue of SAX ErrorHandler, using
+ * {@link TransformerException} classes.
+ * @author Andrew Selkirk
+ * @version 1.0
+ */
+public interface ErrorListener {
+
+ //-------------------------------------------------------------
+ // Interface: ErrorListener -----------------------------------
+ //-------------------------------------------------------------
+
+ public void error(TransformerException exception)
+ throws TransformerException;
+
+ public void fatalError(TransformerException exception)
+ throws TransformerException;
+
+ public void warning(TransformerException exception)
+ throws TransformerException;
+
+
+} // ErrorListener
+
diff --git a/external/jaxp/source/javax/xml/transform/OutputKeys.java b/external/jaxp/source/javax/xml/transform/OutputKeys.java
new file mode 100644
index 000000000..3cad338f2
--- /dev/null
+++ b/external/jaxp/source/javax/xml/transform/OutputKeys.java
@@ -0,0 +1,61 @@
+/*
+ * $Id: OutputKeys.java,v 1.1 2003-02-01 02:10:27 cbj Exp $
+ * Copyright (C) 2001 Andrew Selkirk
+ *
+ * This file is part of GNU JAXP, a library.
+ *
+ * GNU JAXP is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * GNU JAXP is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ * As a special exception, if you link this library with other files to
+ * produce an executable, this library does not by itself cause the
+ * resulting executable to be covered by the GNU General Public License.
+ * This exception does not however invalidate any other reasons why the
+ * executable file might be covered by the GNU General Public License.
+ */
+package javax.xml.transform;
+
+/**
+ * Provides names for XSLT output attributes.
+ * @author Andrew Selkirk
+ * @version 1.0
+ */
+public class OutputKeys {
+
+ //-------------------------------------------------------------
+ // Constants --------------------------------------------------
+ //-------------------------------------------------------------
+
+ public static final String CDATA_SECTION_ELEMENTS = "cdata-section-elements";
+ public static final String DOCTYPE_PUBLIC = "doctype-public";
+ public static final String DOCTYPE_SYSTEM = "doctype-system";
+ public static final String ENCODING = "encoding";
+ public static final String INDENT = "indent";
+ public static final String MEDIA_TYPE = "media-type";
+ public static final String METHOD = "method";
+ public static final String OMIT_XML_DECLARATION = "omit-xml-declaration";
+ public static final String STANDALONE = "standalone";
+ public static final String VERSION = "version";
+
+
+ //-------------------------------------------------------------
+ // Initialization ---------------------------------------------
+ //-------------------------------------------------------------
+
+ private OutputKeys() {
+ } // OutputKeys()
+
+
+} // OutputKeys
+
diff --git a/external/jaxp/source/javax/xml/transform/Result.java b/external/jaxp/source/javax/xml/transform/Result.java
new file mode 100644
index 000000000..d4f4b4f0c
--- /dev/null
+++ b/external/jaxp/source/javax/xml/transform/Result.java
@@ -0,0 +1,57 @@
+/*
+ * $Id: Result.java,v 1.1 2003-02-01 02:10:27 cbj Exp $
+ * Copyright (C) 2001 Andrew Selkirk
+ *
+ * This file is part of GNU JAXP, a library.
+ *
+ * GNU JAXP is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * GNU JAXP is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ * As a special exception, if you link this library with other files to
+ * produce an executable, this library does not by itself cause the
+ * resulting executable to be covered by the GNU General Public License.
+ * This exception does not however invalidate any other reasons why the
+ * executable file might be covered by the GNU General Public License.
+ */
+package javax.xml.transform;
+
+/**
+ * Result
+ * @author Andrew Selkirk
+ * @version 1.0
+ */
+public interface Result {
+
+ //-------------------------------------------------------------
+ // Constants --------------------------------------------------
+ //-------------------------------------------------------------
+
+ public static final String PI_DISABLE_OUTPUT_ESCAPING =
+ "javax.xml.transform.disable-output-escaping";
+
+ public static final String PI_ENABLE_OUTPUT_ESCAPING =
+ "javax.xml.transform.disable-output-escaping";
+
+
+ //-------------------------------------------------------------
+ // Interface: Result ------------------------------------------
+ //-------------------------------------------------------------
+
+ public String getSystemId();
+
+ public void setSystemId(String systemID);
+
+
+} // Result
+
diff --git a/external/jaxp/source/javax/xml/transform/Source.java b/external/jaxp/source/javax/xml/transform/Source.java
new file mode 100644
index 000000000..da76cc6cf
--- /dev/null
+++ b/external/jaxp/source/javax/xml/transform/Source.java
@@ -0,0 +1,60 @@
+/*
+ * $Id: Source.java,v 1.1 2003-02-01 02:10:27 cbj Exp $
+ * Copyright (C) 2001 Andrew Selkirk
+ * Copyright (C) 2001 David Brownell
+ *
+ * This file is part of GNU JAXP, a library.
+ *
+ * GNU JAXP is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * GNU JAXP is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ * As a special exception, if you link this library with other files to
+ * produce an executable, this library does not by itself cause the
+ * resulting executable to be covered by the GNU General Public License.
+ * This exception does not however invalidate any other reasons why the
+ * executable file might be covered by the GNU General Public License.
+ */
+package javax.xml.transform;
+
+/**
+ * Identifies the URI for either a transformation (XSLT stylesheet)
+ * or an input to a transformation (XML document to be transformed).
+ *
+ * @author Andrew Selkirk, David Brownell
+ * @version 1.0
+ */
+public interface Source {
+
+ //-------------------------------------------------------------
+ // Interface: Source ------------------------------------------
+ //-------------------------------------------------------------
+
+ /**
+ * Returns the URI for this source. Some sources may not need URIs,
+ * for example ones provided as an input stream, but such URIs
+ * are important for resolving relative URIs and for providing
+ * usable diagnostics.
+ */
+ public String getSystemId();
+
+ /**
+ * Associates a URI with this source.
+ *
+ * @param systemID the URI
+ */
+ public void setSystemId(String systemID);
+
+
+} // Source
+
diff --git a/external/jaxp/source/javax/xml/transform/SourceLocator.java b/external/jaxp/source/javax/xml/transform/SourceLocator.java
new file mode 100644
index 000000000..b176870ac
--- /dev/null
+++ b/external/jaxp/source/javax/xml/transform/SourceLocator.java
@@ -0,0 +1,52 @@
+/*
+ * $Id: SourceLocator.java,v 1.1 2003-02-01 02:10:27 cbj Exp $
+ * Copyright (C) 2001 Andrew Selkirk
+ *
+ * This file is part of GNU JAXP, a library.
+ *
+ * GNU JAXP is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * GNU JAXP is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ * As a special exception, if you link this library with other files to
+ * produce an executable, this library does not by itself cause the
+ * resulting executable to be covered by the GNU General Public License.
+ * This exception does not however invalidate any other reasons why the
+ * executable file might be covered by the GNU General Public License.
+ */
+package javax.xml.transform;
+
+/**
+ * JAXP/transform analogue of SAX Locator.
+ * @see org.xml.sax.Locator
+ * @author Andrew Selkirk
+ * @version 1.0
+ */
+public interface SourceLocator {
+
+ //-------------------------------------------------------------
+ // Interface: SourceLocator -----------------------------------
+ //-------------------------------------------------------------
+
+ public String getPublicId();
+
+ public String getSystemId();
+
+ public int getLineNumber();
+
+ public int getColumnNumber();
+
+
+} // SourceLocator
+
+
diff --git a/external/jaxp/source/javax/xml/transform/Templates.java b/external/jaxp/source/javax/xml/transform/Templates.java
new file mode 100644
index 000000000..d89c3317b
--- /dev/null
+++ b/external/jaxp/source/javax/xml/transform/Templates.java
@@ -0,0 +1,50 @@
+/*
+ * $Id: Templates.java,v 1.1 2003-02-01 02:10:27 cbj Exp $
+ * Copyright (C) 2001 Andrew Selkirk
+ *
+ * This file is part of GNU JAXP, a library.
+ *
+ * GNU JAXP is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * GNU JAXP is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ * As a special exception, if you link this library with other files to
+ * produce an executable, this library does not by itself cause the
+ * resulting executable to be covered by the GNU General Public License.
+ * This exception does not however invalidate any other reasons why the
+ * executable file might be covered by the GNU General Public License.
+ */
+package javax.xml.transform;
+
+// Imports
+import java.util.Properties;
+
+/**
+ * Encapsulates a pre-parsed (reusable) XSLT transform.
+ * @author Andrew Selkirk
+ * @version 1.0
+ */
+public interface Templates {
+
+ //-------------------------------------------------------------
+ // Interface: Templates ---------------------------------------
+ //-------------------------------------------------------------
+
+ public Transformer newTransformer()
+ throws TransformerConfigurationException;
+
+ public Properties getOutputProperties();
+
+
+} // Templates
+
diff --git a/external/jaxp/source/javax/xml/transform/Transformer.java b/external/jaxp/source/javax/xml/transform/Transformer.java
new file mode 100644
index 000000000..e16addf91
--- /dev/null
+++ b/external/jaxp/source/javax/xml/transform/Transformer.java
@@ -0,0 +1,142 @@
+/*
+ * $Id: Transformer.java,v 1.1 2003-02-01 02:10:27 cbj Exp $
+ * Copyright (C) 2001 Andrew Selkirk
+ * Copyright (C) 2001 David Brownell
+ *
+ * This file is part of GNU JAXP, a library.
+ *
+ * GNU JAXP is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * GNU JAXP is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ * As a special exception, if you link this library with other files to
+ * produce an executable, this library does not by itself cause the
+ * resulting executable to be covered by the GNU General Public License.
+ * This exception does not however invalidate any other reasons why the
+ * executable file might be covered by the GNU General Public License.
+ */
+package javax.xml.transform;
+
+// Imports
+import java.util.Properties;
+
+/**
+ * Apply a transformation from a source, populating a result.
+ * Transformers may be reused, but not concurrently.
+ *
+ * @author Andrew Selkirk, David Brownell
+ * @version 1.0
+ */
+public abstract class Transformer {
+
+ //-------------------------------------------------------------
+ // Initialization ---------------------------------------------
+ //-------------------------------------------------------------
+
+ /** Default constructor, for use only by subclasses. */
+ protected Transformer() {
+ } // Transformer()
+
+
+ //-------------------------------------------------------------
+ // Methods ----------------------------------------------------
+ //-------------------------------------------------------------
+
+ /**
+ * Clears all parameter settings.
+ * @see #setParameter
+ */
+ public abstract void clearParameters();
+
+ /** Returns the error handler used as documents are transformed. */
+ public abstract ErrorListener getErrorListener();
+
+ /**
+ * Returns a copy of the transformer's non-default output properties.
+ * That is, properties set in the stylesheet or through
+ * methods on this class are not set.
+ * @see OutputKeys
+ * @see #setOutputProperties
+ */
+ public abstract Properties getOutputProperties();
+
+ /**
+ * Returns the value of a property applying to this transform.
+ * Values returned by this method are only those that have
+ * been set explicitly.
+ * @see OutputKeys
+ * @see #setOutputProperty
+ */
+ public abstract String getOutputProperty(String name)
+ throws IllegalArgumentException;
+
+ /**
+ * Returns the value of a parameter passed to this transform.
+ * These are primarily for use access within transformations
+ * and extensions.
+ * @see #setParameter
+ */
+ public abstract Object getParameter(String name);
+
+ /** Returns the resolver applied to documents being transformed. */
+ public abstract URIResolver getURIResolver();
+
+ /** Assigns the error handler used as documents are transformed. */
+ public abstract void setErrorListener(ErrorListener listener)
+ throws IllegalArgumentException;
+ /**
+ * Assigns a set of output properties, as if made by multiple
+ * calls to {@link #setOutputProperty}.
+ * @see OutputKeys
+ * @param outputformat set of properties, or null to reset all
+ * properties to their default values
+ */
+ public abstract void setOutputProperties(Properties outputformat)
+ throws IllegalArgumentException;
+
+ /**
+ * Assigns the value of a transformation property, affecting
+ * generation of output (mostly text syntax). Parameters include
+ * those defined by the xslt:output element. Default settings may
+ * be explicitly overridden.
+ * @see OutputKeys
+ * @see #getOutputProperty
+ * @see #setOutputProperties
+ * @param name an XML name, or a namespace-scoped XML name
+ * encoded as <em>{uri}localName</em>.
+ * @param value associated with the name
+ */
+ public abstract void setOutputProperty(String name, String value)
+ throws IllegalArgumentException;
+
+ /**
+ * Assigns the value of a parameter passed to this transform.
+ * These are primarily for use access within transformations
+ * and extensions.
+ * @see #getParameter
+ * @see #clearParameters
+ * @param name an XML name, or a namespace-scoped XML name
+ * encoded as <em>{uri}localName</em>.
+ * @param value associated with the name
+ */
+ public abstract void setParameter(String name, Object value);
+
+ /** Assigns the resolver applied to documents being transformed. */
+ public abstract void setURIResolver(URIResolver resolver);
+
+ /** Apply the appropriate transformation */
+ public abstract void transform(Source source, Result result)
+ throws TransformerException;
+
+} // Transformer
+
diff --git a/external/jaxp/source/javax/xml/transform/TransformerConfigurationException.java b/external/jaxp/source/javax/xml/transform/TransformerConfigurationException.java
new file mode 100644
index 000000000..8022993cf
--- /dev/null
+++ b/external/jaxp/source/javax/xml/transform/TransformerConfigurationException.java
@@ -0,0 +1,59 @@
+/*
+ * $Id: TransformerConfigurationException.java,v 1.1 2003-02-01 02:10:27 cbj Exp $
+ * Copyright (C) 2001 Andrew Selkirk
+ *
+ * This file is part of GNU JAXP, a library.
+ *
+ * GNU JAXP is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * GNU JAXP is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ * As a special exception, if you link this library with other files to
+ * produce an executable, this library does not by itself cause the
+ * resulting executable to be covered by the GNU General Public License.
+ * This exception does not however invalidate any other reasons why the
+ * executable file might be covered by the GNU General Public License.
+ */
+package javax.xml.transform;
+
+/**
+ * TransformerConfigurationException
+ * @author Andrew Selkirk
+ * @version 1.0
+ */
+public class TransformerConfigurationException extends TransformerException {
+
+ //-------------------------------------------------------------
+ // Initialization ---------------------------------------------
+ //-------------------------------------------------------------
+
+ public TransformerConfigurationException() {
+ super((String)null);
+ } // TransformerConfigurationException()
+
+ public TransformerConfigurationException(String msg) {
+ super(msg);
+ } // TransformerConfigurationException()
+
+ public TransformerConfigurationException(Throwable ex) {
+ super(ex);
+ } // TransformerConfigurationException()
+
+ public TransformerConfigurationException(String msg, Throwable ex) {
+ super(msg, ex);
+ } // TransformerConfigurationException()
+
+
+} // TranformerConfigurationException
+
+
diff --git a/external/jaxp/source/javax/xml/transform/TransformerException.java b/external/jaxp/source/javax/xml/transform/TransformerException.java
new file mode 100644
index 000000000..b0ab61582
--- /dev/null
+++ b/external/jaxp/source/javax/xml/transform/TransformerException.java
@@ -0,0 +1,183 @@
+/*
+ * $Id: TransformerException.java,v 1.1 2003-02-01 02:10:28 cbj Exp $
+ * Copyright (C) 2001 Andrew Selkirk
+ * Copyright (C) 2001 David Brownell
+ *
+ * This file is part of GNU JAXP, a library.
+ *
+ * GNU JAXP is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * GNU JAXP is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ * As a special exception, if you link this library with other files to
+ * produce an executable, this library does not by itself cause the
+ * resulting executable to be covered by the GNU General Public License.
+ * This exception does not however invalidate any other reasons why the
+ * executable file might be covered by the GNU General Public License.
+ */
+package javax.xml.transform;
+
+// Imports
+import java.io.*;
+
+/**
+ * Encapsulates a problem exposed during a transformation.
+ * @author Andrew Selkirk, David Brownell
+ * @version 1.0
+ */
+public class TransformerException extends Exception {
+
+ //-------------------------------------------------------------
+ // Variables --------------------------------------------------
+ //-------------------------------------------------------------
+
+ private SourceLocator locator = null;
+ private Throwable containedException = null;
+ private boolean causeKnown;
+
+
+ //-------------------------------------------------------------
+ // Initialization ---------------------------------------------
+ //-------------------------------------------------------------
+
+ public TransformerException(String msg) {
+ super(msg);
+ }
+
+ public TransformerException(Throwable cause) {
+ super();
+ initCause (cause);
+ }
+
+ public TransformerException(String msg, Throwable cause) {
+ super(msg);
+ initCause (cause);
+ }
+
+ public TransformerException(String msg, SourceLocator locator) {
+ super(msg);
+ setLocator (locator);
+ }
+
+ public TransformerException(String msg, SourceLocator locator,
+ Throwable cause) {
+ super(msg);
+ setLocator (locator);
+ initCause (cause);
+ }
+
+
+ //-------------------------------------------------------------
+ // Methods ----------------------------------------------------
+ //-------------------------------------------------------------
+
+ /**
+ * Returns the root cause of this exception,
+ * or null if none is known.
+ */
+ public Throwable getCause() {
+ return containedException;
+ }
+
+ /**
+ * Synonym for {@link #getCause}.
+ */
+ public Throwable getException() {
+ return containedException;
+ }
+
+ /**
+ * Returns a readable version of the locator info, or null
+ * if there is no locator.
+ */
+ public String getLocationAsString() {
+ if (locator == null)
+ return null;
+
+ StringBuffer retval = new StringBuffer ();
+
+ if (locator.getPublicId () != null) {
+ retval.append ("public='");
+ retval.append (locator.getPublicId ());
+ retval.append ("' ");
+ }
+ if (locator.getSystemId () != null) {
+ retval.append ("uri='");
+ retval.append (locator.getSystemId ());
+ retval.append ("' ");
+ }
+ if (locator.getLineNumber () != -1) {
+ retval.append ("line=");
+ retval.append (locator.getLineNumber ());
+ retval.append (" ");
+ }
+ if (locator.getColumnNumber () != -1) {
+ retval.append ("column=");
+ retval.append (locator.getColumnNumber ());
+ //retval.append (" ");
+ }
+ return retval.toString ();
+ }
+
+ public SourceLocator getLocator() {
+ return locator;
+ }
+
+ /**
+ * Returns this exception's message, with readable location
+ * information appended if it is available.
+ */
+ public String getMessageAndLocation() {
+ if (locator == null)
+ return getMessage ();
+ return getMessage () + ": " + getLocationAsString ();
+ }
+
+ /**
+ * Records the root cause of this exception; may be
+ * called only once, normally during initialization.
+ */
+ public synchronized Throwable initCause(Throwable cause) {
+ if (cause == this)
+ throw new IllegalArgumentException ();
+ if (containedException != null)
+ throw new IllegalStateException ();
+ containedException = cause;
+ causeKnown = true;
+// FIXME: spec implies "this" may be the right value; another bug?
+ return cause;
+ }
+
+
+ public void printStackTrace() {
+ printStackTrace(System.out);
+ }
+
+ public void printStackTrace(PrintStream stream) {
+ PrintWriter out = new PrintWriter(
+ new OutputStreamWriter(stream));
+ printStackTrace(out);
+ out.flush ();
+ }
+
+ public void printStackTrace(PrintWriter writer) {
+ if (containedException != null) {
+ containedException.printStackTrace(writer);
+ }
+ super.printStackTrace(writer);
+ }
+
+ public void setLocator (SourceLocator location) {
+ locator = location;
+ }
+}
diff --git a/external/jaxp/source/javax/xml/transform/TransformerFactory.java b/external/jaxp/source/javax/xml/transform/TransformerFactory.java
new file mode 100644
index 000000000..9a8fba265
--- /dev/null
+++ b/external/jaxp/source/javax/xml/transform/TransformerFactory.java
@@ -0,0 +1,140 @@
+/*
+ * $Id: TransformerFactory.java,v 1.1 2003-02-01 02:10:28 cbj Exp $
+ * Copyright (C) 2001 Andrew Selkirk
+ * Copyright (C) 2001 David Brownell
+ *
+ * This file is part of GNU JAXP, a library.
+ *
+ * GNU JAXP is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * GNU JAXP is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ * As a special exception, if you link this library with other files to
+ * produce an executable, this library does not by itself cause the
+ * resulting executable to be covered by the GNU General Public License.
+ * This exception does not however invalidate any other reasons why the
+ * executable file might be covered by the GNU General Public License.
+ */
+package javax.xml.transform;
+
+// Imports
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.FileInputStream;
+import java.io.File;
+import java.io.BufferedReader;
+import java.io.InputStreamReader;
+import java.util.Properties;
+
+/**
+ * Abstract class extended by implementations.
+ *
+ * @author Andrew Selkirk, David Brownell
+ * @version 1.0
+ */
+public abstract class TransformerFactory {
+
+ /** Constructor, for use by subclasses. */
+ protected TransformerFactory() {
+ }
+
+
+ //-------------------------------------------------------------
+ // Methods ----------------------------------------------------
+ //-------------------------------------------------------------
+
+ /**
+ * Returns an object encapsulating the &lt;?xml-stylesheet&nbsp;?&gt;
+ * processing instruction from the document that matches the
+ * specified criteria.
+ */
+ public abstract Source getAssociatedStylesheet(Source source,
+ String media, String title, String charset)
+ throws TransformerConfigurationException;
+
+ /** Returns an implementation-specific attribute */
+ public abstract Object getAttribute(String name)
+ throws IllegalArgumentException;
+
+ /** Returns the ErrorListener used when parsing stylesheets. */
+ public abstract ErrorListener getErrorListener();
+
+ /**
+ * Exposes capabilities of the underlying implementation.
+ * Examples include SAXSource.FEATURE and DOMResult.FEATURE.
+ */
+ public abstract boolean getFeature(String name);
+
+ /** Returns the URIResolver used when parsing stylesheets. */
+ public abstract URIResolver getURIResolver();
+
+
+ /**
+ * Returns a new TransformerFactory. The name of this class
+ * is found by checking, in order:
+ * the <em>javax.xml.transform.TransformerFactory</em>
+ * system property,
+ * <em>$JAVA_HOME/lib/jaxp.properties</em> for the key with
+ * that same name,
+ * JAR files in the class path with a <em>META-INF/services</em>
+ * file with that same name,
+ * else the compiled-in platform default.
+ */
+ public static TransformerFactory newInstance()
+ throws TransformerFactoryConfigurationError
+ {
+ try {
+ return (TransformerFactory) ClassStuff.createFactory (
+ "javax.xml.transform.TransformerFactory",
+ "com.icl.saxon.TransformerFactoryImpl"
+ // "gnu.xml.util.SAXNullTransformerFactory"
+ // "org.apache.xalan.processor.TransformerFactoryImpl"
+ );
+ } catch (ClassCastException e) {
+ throw new TransformerFactoryConfigurationError(e);
+ }
+ }
+
+
+ /**
+ * Returns a pre-compiled stylesheet.
+ * @param stylesheet XSLT stylesheet specifying transform
+ */
+ public abstract Templates newTemplates (Source stylesheet)
+ throws TransformerConfigurationException;
+
+ /**
+ * Returns a transformer that performs the null transform.
+ */
+ public abstract Transformer newTransformer()
+ throws TransformerConfigurationException;
+
+ /**
+ * Returns a transformer making a specified transform.
+ * @param stylesheet XSLT stylesheet specifying transform
+ */
+ public abstract Transformer newTransformer (Source stylesheet)
+ throws TransformerConfigurationException;
+
+
+ /** Assigns an implementation-specific attribute */
+ public abstract void setAttribute(String name, Object value)
+ throws IllegalArgumentException;
+
+ /** Assigns the ErrorListener used when parsing stylesheets. */
+ public abstract void setErrorListener(ErrorListener listener)
+ throws IllegalArgumentException;
+
+ /** Assigns the URIResolver used when parsing stylesheets. */
+ public abstract void setURIResolver(URIResolver resolver);
+}
diff --git a/external/jaxp/source/javax/xml/transform/TransformerFactoryConfigurationError.java b/external/jaxp/source/javax/xml/transform/TransformerFactoryConfigurationError.java
new file mode 100644
index 000000000..32d686e19
--- /dev/null
+++ b/external/jaxp/source/javax/xml/transform/TransformerFactoryConfigurationError.java
@@ -0,0 +1,73 @@
+/*
+ * $Id: TransformerFactoryConfigurationError.java,v 1.1 2003-02-01 02:10:28 cbj Exp $
+ * Copyright (C) 2001 Andrew Selkirk
+ * Copyright (C) 2001 David Brownell
+ *
+ * This file is part of GNU JAXP, a library.
+ *
+ * GNU JAXP is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * GNU JAXP is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ * As a special exception, if you link this library with other files to
+ * produce an executable, this library does not by itself cause the
+ * resulting executable to be covered by the GNU General Public License.
+ * This exception does not however invalidate any other reasons why the
+ * executable file might be covered by the GNU General Public License.
+ */
+package javax.xml.transform;
+
+/**
+ * Reports a {@link TransformerFactory} configuration error.
+ * @author Andrew Selkirk, David Brownell
+ * @version 1.0
+ */
+public class TransformerFactoryConfigurationError extends Error
+{
+ private Exception exception = null;
+
+
+ //-------------------------------------------------------------
+ // Initialization ---------------------------------------------
+ //-------------------------------------------------------------
+
+ public TransformerFactoryConfigurationError ()
+ { }
+
+ public TransformerFactoryConfigurationError (Exception e)
+ { exception = e; }
+
+ public TransformerFactoryConfigurationError (Exception e, String msg)
+ {
+ super (msg);
+ exception = e;
+ }
+
+ public TransformerFactoryConfigurationError (String msg)
+ { super (msg); }
+
+
+ //-------------------------------------------------------------
+ // Methods ----------------------------------------------------
+ //-------------------------------------------------------------
+
+ public String getMessage ()
+ {
+ if (super.getMessage () == null && exception != null)
+ return exception.getMessage ();
+ return super.getMessage ();
+ }
+
+ public Exception getException ()
+ { return exception; }
+}
diff --git a/external/jaxp/source/javax/xml/transform/URIResolver.java b/external/jaxp/source/javax/xml/transform/URIResolver.java
new file mode 100644
index 000000000..3f5a6ac06
--- /dev/null
+++ b/external/jaxp/source/javax/xml/transform/URIResolver.java
@@ -0,0 +1,45 @@
+/*
+ * $Id: URIResolver.java,v 1.1 2003-02-01 02:10:28 cbj Exp $
+ * Copyright (C) 2001 Andrew Selkirk
+ *
+ * This file is part of GNU JAXP, a library.
+ *
+ * GNU JAXP is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * GNU JAXP is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ * As a special exception, if you link this library with other files to
+ * produce an executable, this library does not by itself cause the
+ * resulting executable to be covered by the GNU General Public License.
+ * This exception does not however invalidate any other reasons why the
+ * executable file might be covered by the GNU General Public License.
+ */
+package javax.xml.transform;
+
+/**
+ * URIResolver
+ * @author Andrew Selkirk
+ * @version 1.0
+ */
+public interface URIResolver {
+
+ //-------------------------------------------------------------
+ // Interface: URIResolver -------------------------------------
+ //-------------------------------------------------------------
+
+ public Source resolve(String href, String base)
+ throws TransformerException;
+
+
+} // URIResolver
+
diff --git a/external/jaxp/source/javax/xml/transform/dom/DOMLocator.java b/external/jaxp/source/javax/xml/transform/dom/DOMLocator.java
new file mode 100644
index 000000000..575a66728
--- /dev/null
+++ b/external/jaxp/source/javax/xml/transform/dom/DOMLocator.java
@@ -0,0 +1,49 @@
+/*
+ * $Id: DOMLocator.java,v 1.1 2003-02-01 02:10:28 cbj Exp $
+ * Copyright (C) 2001 Andrew Selkirk
+ *
+ * This file is part of GNU JAXP, a library.
+ *
+ * GNU JAXP is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * GNU JAXP is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ * As a special exception, if you link this library with other files to
+ * produce an executable, this library does not by itself cause the
+ * resulting executable to be covered by the GNU General Public License.
+ * This exception does not however invalidate any other reasons why the
+ * executable file might be covered by the GNU General Public License.
+ */
+package javax.xml.transform.dom;
+
+// Imports
+import org.w3c.dom.Node;
+import javax.xml.transform.SourceLocator;
+
+/**
+ * DOM Locator
+ * @author Andrew Selkirk
+ * @version 1.0
+ */
+public interface DOMLocator extends SourceLocator {
+
+ //-------------------------------------------------------------
+ // Interface: DOMLocator --------------------------------------
+ //-------------------------------------------------------------
+
+ public Node getOriginatingNode();
+
+
+} // DOMLocator
+
+
diff --git a/external/jaxp/source/javax/xml/transform/dom/DOMResult.java b/external/jaxp/source/javax/xml/transform/dom/DOMResult.java
new file mode 100644
index 000000000..cb8fac129
--- /dev/null
+++ b/external/jaxp/source/javax/xml/transform/dom/DOMResult.java
@@ -0,0 +1,90 @@
+/*
+ * $Id: DOMResult.java,v 1.1 2003-02-01 02:10:28 cbj Exp $
+ * Copyright (C) 2001 Andrew Selkirk
+ *
+ * This file is part of GNU JAXP, a library.
+ *
+ * GNU JAXP is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * GNU JAXP is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ * As a special exception, if you link this library with other files to
+ * produce an executable, this library does not by itself cause the
+ * resulting executable to be covered by the GNU General Public License.
+ * This exception does not however invalidate any other reasons why the
+ * executable file might be covered by the GNU General Public License.
+ */
+package javax.xml.transform.dom;
+
+// Imports
+import org.w3c.dom.Node;
+import javax.xml.transform.Result;
+
+/**
+ * DOM Result
+ * @author Andrew Selkirk
+ * @version 1.0
+ */
+public class DOMResult implements Result {
+
+ //-------------------------------------------------------------
+ // Variables --------------------------------------------------
+ //-------------------------------------------------------------
+
+ public static final String FEATURE =
+ "http://javax.xml.transform.dom.DOMResult/feature";
+
+ private Node node = null;
+ private String systemId = null;
+
+
+ //-------------------------------------------------------------
+ // Initialization ---------------------------------------------
+ //-------------------------------------------------------------
+
+ public DOMResult() {
+ } // DOMResult()
+
+ public DOMResult(Node node) {
+ this.node = node;
+ } // DOMResult()
+
+ public DOMResult(Node node, String systemID) {
+ this.node = node;
+ this.systemId = systemID;
+ } // DOMResult()
+
+
+ //-------------------------------------------------------------
+ // Methods ----------------------------------------------------
+ //-------------------------------------------------------------
+
+ public void setNode(Node node) {
+ this.node = node;
+ } // setNode()
+
+ public Node getNode() {
+ return node;
+ } // getNode()
+
+ public void setSystemId(String systemID) {
+ this.systemId = systemID;
+ } // systemID()
+
+ public String getSystemId() {
+ return systemId;
+ } // getSystemId()
+
+
+} // DOMResult
+
diff --git a/external/jaxp/source/javax/xml/transform/dom/DOMSource.java b/external/jaxp/source/javax/xml/transform/dom/DOMSource.java
new file mode 100644
index 000000000..6f60fd0ec
--- /dev/null
+++ b/external/jaxp/source/javax/xml/transform/dom/DOMSource.java
@@ -0,0 +1,90 @@
+/*
+ * $Id: DOMSource.java,v 1.1 2003-02-01 02:10:28 cbj Exp $
+ * Copyright (C) 2001 Andrew Selkirk
+ *
+ * This file is part of GNU JAXP, a library.
+ *
+ * GNU JAXP is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * GNU JAXP is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ * As a special exception, if you link this library with other files to
+ * produce an executable, this library does not by itself cause the
+ * resulting executable to be covered by the GNU General Public License.
+ * This exception does not however invalidate any other reasons why the
+ * executable file might be covered by the GNU General Public License.
+ */
+package javax.xml.transform.dom;
+
+// Imports
+import org.w3c.dom.Node;
+import javax.xml.transform.Source;
+
+/**
+ * DOM Source
+ * @author Andrew Selkirk
+ * @version 1.0
+ */
+public class DOMSource implements Source {
+
+ //-------------------------------------------------------------
+ // Variables --------------------------------------------------
+ //-------------------------------------------------------------
+
+ public static final String FEATURE =
+ "http://javax.xml.transform.dom.DOMSource/feature";
+
+ private Node node = null;
+ String baseID = null;
+
+
+ //-------------------------------------------------------------
+ // Initialization ---------------------------------------------
+ //-------------------------------------------------------------
+
+ public DOMSource() {
+ } // DOMSource()
+
+ public DOMSource(Node node) {
+ this.node = node;
+ } // DOMSource()
+
+ public DOMSource(Node node, String systemID) {
+ this.node = node;
+ this.baseID = systemID;
+ } // DOMSource()
+
+
+ //-------------------------------------------------------------
+ // Methods ----------------------------------------------------
+ //-------------------------------------------------------------
+
+ public void setNode(Node node) {
+ this.node = node;
+ } // setNode()
+
+ public Node getNode() {
+ return node;
+ } // getNode()
+
+ public void setSystemId(String systemID) {
+ baseID = systemID;
+ } // setSystemId()
+
+ public String getSystemId() {
+ return baseID;
+ } // getSystemId()
+
+
+} // DOMSource
+
diff --git a/external/jaxp/source/javax/xml/transform/dom/package.html b/external/jaxp/source/javax/xml/transform/dom/package.html
new file mode 100644
index 000000000..0600fc724
--- /dev/null
+++ b/external/jaxp/source/javax/xml/transform/dom/package.html
@@ -0,0 +1,5 @@
+<html><head>trax for dom</head><body>
+
+<p>Support for DOM inputs and outputs to transformers.
+
+</body></html>
diff --git a/external/jaxp/source/javax/xml/transform/package.html b/external/jaxp/source/javax/xml/transform/package.html
new file mode 100644
index 000000000..bc67c2b80
--- /dev/null
+++ b/external/jaxp/source/javax/xml/transform/package.html
@@ -0,0 +1,38 @@
+<html><head>trax </head><body>
+
+<p>Base "TRAX" API for XSLT transformers.
+This API borrows many structural notions from SAX,
+such as the way error handling and external entity
+resolution are handled, although it does not reuse
+the corresponding SAX classes.
+To use XSLT transformers: <ul>
+
+<li>Start with <em>TransformerFactory.newInstance()</em>;
+
+<li>Then you may wish to configure that factory through
+its features and properties. This includes modifying
+the way errors are handled and URIs are resolved.
+
+<li>Then you have several options for how to perform
+the XSLT transformations. One generic option is to ask the
+factory for a <a href="Transformer.html">Transformer</a>
+and then use <em>Transformer.transform()</em> to pull
+input text onto output text.
+
+<li>Alternatively, most factories support flexible integration
+with SAX event streams. You can cast such factories to a
+<a href="sax/SAXTransformerFactory.html">SAXTransformerFactory</a>
+and perform either push or pull mode transformations.
+
+</ul>
+
+<p>The <a href="OutputKeys.html">OutputKeys</a> class
+holds constants that can be used to configure output
+properties used with <em>Result</em> objects, as if
+they were specified in <em>xslt:output</em> attributes
+in the stylesheet specifying the transform.
+
+<p>The <a href="Templates.html">Templates</a> class
+accomodates the notion of "compiled" transforms.
+
+</body></html>
diff --git a/external/jaxp/source/javax/xml/transform/sax/SAXResult.java b/external/jaxp/source/javax/xml/transform/sax/SAXResult.java
new file mode 100644
index 000000000..a3e5cf41e
--- /dev/null
+++ b/external/jaxp/source/javax/xml/transform/sax/SAXResult.java
@@ -0,0 +1,94 @@
+/*
+ * $Id: SAXResult.java,v 1.1 2003-02-01 02:10:28 cbj Exp $
+ * Copyright (C) 2001 Andrew Selkirk
+ *
+ * This file is part of GNU JAXP, a library.
+ *
+ * GNU JAXP is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * GNU JAXP is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ * As a special exception, if you link this library with other files to
+ * produce an executable, this library does not by itself cause the
+ * resulting executable to be covered by the GNU General Public License.
+ * This exception does not however invalidate any other reasons why the
+ * executable file might be covered by the GNU General Public License.
+ */
+package javax.xml.transform.sax;
+
+// Imports
+import org.xml.sax.ContentHandler;
+import org.xml.sax.ext.LexicalHandler;
+import javax.xml.transform.Result;
+
+/**
+ * Collects the result of a SAX transform.
+ * @author Andrew Selkirk, David Brownell
+ * @version 1.0
+ */
+public class SAXResult implements Result
+{
+ /**
+ * Used with <em>TransformerFactory.getFeature()</em> to determine
+ * whether the transformers it produces support SAXResult objects
+ * as outputs.
+ */
+ public static final String FEATURE =
+ "http://javax.xml.transform.sax.SAXResult/feature";
+
+ private ContentHandler handler = null;
+ private LexicalHandler lexhandler = null;
+ private String systemId = null;
+
+
+ //-------------------------------------------------------------
+ // Initialization ---------------------------------------------
+ //-------------------------------------------------------------
+
+ public SAXResult() {
+ } // SAXResult()
+
+ public SAXResult(ContentHandler handler) {
+ this.handler = handler;
+ } // SAXResult()
+
+
+ //-------------------------------------------------------------
+ // Methods ----------------------------------------------------
+ //-------------------------------------------------------------
+
+ public ContentHandler getHandler() {
+ return handler;
+ }
+
+ public String getSystemId() {
+ return systemId;
+ }
+
+ public LexicalHandler getLexicalHandler() {
+ return lexhandler;
+ }
+
+
+ public void setHandler(ContentHandler handler) {
+ this.handler = handler;
+ }
+
+ public void setSystemId(String systemID) {
+ this.systemId = systemID;
+ }
+
+ public void setLexicalHandler(LexicalHandler lexHandler) {
+ this.lexhandler = lexHandler;
+ }
+}
diff --git a/external/jaxp/source/javax/xml/transform/sax/SAXSource.java b/external/jaxp/source/javax/xml/transform/sax/SAXSource.java
new file mode 100644
index 000000000..08f220af1
--- /dev/null
+++ b/external/jaxp/source/javax/xml/transform/sax/SAXSource.java
@@ -0,0 +1,148 @@
+/*
+ * $Id: SAXSource.java,v 1.1 2003-02-01 02:10:28 cbj Exp $
+ * Copyright (C) 2001 Andrew Selkirk
+ * Copyright (C) 2001 David Brownell
+ *
+ * This file is part of GNU JAXP, a library.
+ *
+ * GNU JAXP is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * GNU JAXP is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ * As a special exception, if you link this library with other files to
+ * produce an executable, this library does not by itself cause the
+ * resulting executable to be covered by the GNU General Public License.
+ * This exception does not however invalidate any other reasons why the
+ * executable file might be covered by the GNU General Public License.
+ */
+package javax.xml.transform.sax;
+
+import org.xml.sax.XMLReader;
+import org.xml.sax.InputSource;
+import javax.xml.transform.Source;
+import javax.xml.transform.stream.StreamSource;
+
+
+/**
+ * Acts as a holder for "pull style" inputs to an XSLT transform.
+ * SAX based transforms can support a second style of inputs,
+ * driving by a {@link TransformerHandler} as output of some
+ * other SAX processing pipeline. stage.
+ *
+ * @see SAXTransformerFactory#newTransformerHandler
+ *
+ * @author Andrew Selkirk, David Brownell
+ * @version 1.0
+ */
+public class SAXSource implements Source
+{
+ /**
+ * Used with <em>TransformerFactory.getFeature()</em> to determine
+ * whether the transformers it produces support SAXSource objects
+ * (possibly without URIs) as inputs.
+ */
+ public static final String FEATURE =
+ "http://javax.xml.transform.sax.SAXSource/feature";
+
+ private XMLReader reader = null;
+ private InputSource inputSource = null;
+
+
+ //-------------------------------------------------------------
+ // Initialization ---------------------------------------------
+ //-------------------------------------------------------------
+
+ public SAXSource() {
+ } // SAXSource()
+
+ public SAXSource(XMLReader reader, InputSource source) {
+ this.reader = reader;
+ this.inputSource = source;
+ } // SAXSource()
+
+ public SAXSource(InputSource source) {
+ this.inputSource = source;
+ } // SAXSource()
+
+
+ //-------------------------------------------------------------
+ // Methods ----------------------------------------------------
+ //-------------------------------------------------------------
+
+ public void setXMLReader(XMLReader reader) {
+ this.reader = reader;
+ } // setXMLReader()
+
+ public XMLReader getXMLReader() {
+ return reader;
+ } // getXMLReader()
+
+ public void setInputSource(InputSource source) {
+ this.inputSource = source;
+ } // setInputSource()
+
+ public InputSource getInputSource() {
+ return inputSource;
+ } // inputSource()
+
+ public void setSystemId(String systemID) {
+ if (inputSource != null) {
+ inputSource.setSystemId(systemID);
+ }
+ } // setSystemId()
+
+ public String getSystemId() {
+ if (inputSource != null) {
+ return inputSource.getSystemId();
+ } // if
+ return null;
+ } // getSystemId()
+
+ /**
+ * Creates a SAX input source from its argument.
+ * Understands StreamSource and System ID based input sources,
+ * and insists on finding either a system ID (URI) or some kind
+ * of input stream (character or byte).
+ *
+ * @param in TRAX style input source
+ * @return SAX input source, or null if one could not be
+ * created.
+ */
+ public static InputSource sourceToInputSource (Source in)
+ {
+ InputSource retval;
+ boolean ok = false;
+
+ if (in.getSystemId () != null) {
+ retval = new InputSource (in.getSystemId ());
+ ok = true;
+ } else
+ retval = new InputSource ();
+
+ if (in instanceof StreamSource) {
+ StreamSource ss = (StreamSource) in;
+
+ if (ss.getReader () != null) {
+ retval.setCharacterStream (ss.getReader ());
+ ok = true;
+ } else if (ss.getInputStream () != null) {
+ retval.setByteStream (ss.getInputStream ());
+ ok = true;
+ }
+ if (ss.getPublicId () != null)
+ retval.setPublicId (ss.getPublicId ());
+ }
+
+ return ok ? retval : null;
+ }
+}
diff --git a/external/jaxp/source/javax/xml/transform/sax/SAXTransformerFactory.java b/external/jaxp/source/javax/xml/transform/sax/SAXTransformerFactory.java
new file mode 100644
index 000000000..615f8c057
--- /dev/null
+++ b/external/jaxp/source/javax/xml/transform/sax/SAXTransformerFactory.java
@@ -0,0 +1,142 @@
+/*
+ * $Id: SAXTransformerFactory.java,v 1.1 2003-02-01 02:10:28 cbj Exp $
+ * Copyright (C) 2001 Andrew Selkirk
+ * Copyright (C) 2001 David Brownell
+ *
+ * This file is part of GNU JAXP, a library.
+ *
+ * GNU JAXP is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * GNU JAXP is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ * As a special exception, if you link this library with other files to
+ * produce an executable, this library does not by itself cause the
+ * resulting executable to be covered by the GNU General Public License.
+ * This exception does not however invalidate any other reasons why the
+ * executable file might be covered by the GNU General Public License.
+ */
+package javax.xml.transform.sax;
+
+// Imports
+import org.xml.sax.InputSource;
+import org.xml.sax.XMLFilter;
+import javax.xml.transform.Transformer;
+import javax.xml.transform.TransformerFactory;
+import javax.xml.transform.Result;
+import javax.xml.transform.Source;
+import javax.xml.transform.Templates;
+import javax.xml.transform.TransformerConfigurationException;
+
+/**
+ * A TransformerFactory that supports several separate modes for
+ * working with SAX inputs and outputs. Those modes include: <ul>
+ *
+ * <li> Pipeline Stage, pushing events through {@link TransformerHandler}
+ * objects used as SAX handlers, and passing the transformed data
+ * through a {@link SAXResult} encapsulating SAX ContentHandler and
+ * LexicalHandler objects;
+ * <li> Pipeline Termination, like a normal pipeline stage but using some
+ * other kind of {@link Result} to store transformed data rather than
+ * passing it to another stage;
+ * <li> Event producer, an {@link XMLFilter} object taking data from a URI
+ * or from a SAX {@link InputSource} input object and delivering it
+ * to a SAX ContentHandler;
+ * <li> Transformer objects produced by this factory will usually be able
+ * to accept {@link SAXSource} objects as inputs, and the XMLReader
+ * object in such a source could be an XMLFilter.
+ * </ul>
+ *
+ * <p>Transformer objects produced by this factory will of course be
+ * able to perform {@link Transformer#transform Transformer.transform()}
+ * operations to map XML text into other text.
+ *
+ * <p>The factory also supports creating Templates objects.
+ *
+ * @author Andrew Selkirk, David Brownell
+ * @version 1.0
+ */
+public abstract class SAXTransformerFactory extends TransformerFactory
+{
+ /**
+ * Used with <em>TransformerFactory.getFeature()</em> to determine
+ * whether the transformers it produces extend this class.
+ */
+ public static final String FEATURE =
+ "http://javax.xml.transform.sax.SAXTransformerFactory/feature";
+
+ /**
+ * Used with <em>TransformerFactory.getFeature()</em> to determine
+ * whether <em>newXMLFilter()</em> methods are supported.
+ */
+ public static final String FEATURE_XMLFILTER =
+ "http://javax.xml.transform.sax.SAXTransformerFactory/feature/xmlfilter";
+
+
+ //-------------------------------------------------------------
+ // Initialization ---------------------------------------------
+ //-------------------------------------------------------------
+
+ /** Constructor, for use with subclasses */
+ protected SAXTransformerFactory() {
+ }
+
+
+ //-------------------------------------------------------------
+ // Methods ----------------------------------------------------
+ //-------------------------------------------------------------
+
+ /**
+ * Returns a SAX event consumer sending its inputs to some Result
+ * after transforming them according to a stylesheet.
+ */
+ public abstract TransformerHandler
+ newTransformerHandler (Source stylesheet)
+ throws TransformerConfigurationException;
+
+ /**
+ * Returns a SAX event consumer sending its inputs to some Result
+ * after transforming them according to a pre-parsed stylesheet.
+ */
+ public abstract TransformerHandler
+ newTransformerHandler (Templates stylesheet)
+ throws TransformerConfigurationException;
+
+ /**
+ * Returns a SAX event consumer sending its inputs to some Result
+ * without transforming them (null transformation).
+ */
+ public abstract TransformerHandler newTransformerHandler()
+ throws TransformerConfigurationException;
+
+ /**
+ * Returns a SAX parser that transforms XML data according
+ * to a stylesheet before reporting SAX events.
+ */
+ public abstract XMLFilter newXMLFilter (Source stylesheet)
+ throws TransformerConfigurationException;
+
+ /**
+ * Returns a SAX parser that transforms XML data according
+ * to a pre-parsed stylesheet before reporting SAX events.
+ */
+ public abstract XMLFilter newXMLFilter (Templates stylesheet)
+ throws TransformerConfigurationException;
+
+ /**
+ * Returns a SAX event consumer collecting its inputs into
+ * a pre-parsed stylesheet.
+ */
+ public abstract TemplatesHandler newTemplatesHandler()
+ throws TransformerConfigurationException;
+
+}
diff --git a/external/jaxp/source/javax/xml/transform/sax/TemplatesHandler.java b/external/jaxp/source/javax/xml/transform/sax/TemplatesHandler.java
new file mode 100644
index 000000000..9bffbe6fc
--- /dev/null
+++ b/external/jaxp/source/javax/xml/transform/sax/TemplatesHandler.java
@@ -0,0 +1,52 @@
+/*
+ * $Id: TemplatesHandler.java,v 1.1 2003-02-01 02:10:28 cbj Exp $
+ * Copyright (C) 2001 Andrew Selkirk
+ *
+ * This file is part of GNU JAXP, a library.
+ *
+ * GNU JAXP is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * GNU JAXP is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ * As a special exception, if you link this library with other files to
+ * produce an executable, this library does not by itself cause the
+ * resulting executable to be covered by the GNU General Public License.
+ * This exception does not however invalidate any other reasons why the
+ * executable file might be covered by the GNU General Public License.
+ */
+package javax.xml.transform.sax;
+
+// Imports
+import org.xml.sax.ContentHandler;
+import javax.xml.transform.Templates;
+
+/**
+ * Handler used to create pre-parsed XSLT transforms.
+ * @author Andrew Selkirk
+ * @version 1.0
+ */
+public interface TemplatesHandler extends ContentHandler {
+
+ //-------------------------------------------------------------
+ // Interface: TemplatesHandler --------------------------------
+ //-------------------------------------------------------------
+
+ public Templates getTemplates();
+
+ public void setSystemId(String systemID);
+
+ public String getSystemId();
+
+
+} // TemplatesHandler
+
diff --git a/external/jaxp/source/javax/xml/transform/sax/TransformerHandler.java b/external/jaxp/source/javax/xml/transform/sax/TransformerHandler.java
new file mode 100644
index 000000000..08f238bd6
--- /dev/null
+++ b/external/jaxp/source/javax/xml/transform/sax/TransformerHandler.java
@@ -0,0 +1,63 @@
+/*
+ * $Id: TransformerHandler.java,v 1.1 2003-02-01 02:10:28 cbj Exp $
+ * Copyright (C) 2001 Andrew Selkirk
+ * Copyright (C) 2001 David Brownell
+ *
+ * This file is part of GNU JAXP, a library.
+ *
+ * GNU JAXP is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * GNU JAXP is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ * As a special exception, if you link this library with other files to
+ * produce an executable, this library does not by itself cause the
+ * resulting executable to be covered by the GNU General Public License.
+ * This exception does not however invalidate any other reasons why the
+ * executable file might be covered by the GNU General Public License.
+ */
+package javax.xml.transform.sax;
+
+import org.xml.sax.ContentHandler;
+import org.xml.sax.DTDHandler;
+import org.xml.sax.ext.LexicalHandler;
+import javax.xml.transform.Result;
+import javax.xml.transform.Transformer;
+
+
+/**
+ * Transforms SAX input events to a Result, according to some
+ * stylesheet. Note the expectation that XSLT transforms will
+ * discard most DTD declarations (DeclHandler is not supported).
+ *
+ * @author Andrew Selkirk, David Brownell
+ * @version 1.0
+ */
+public interface TransformerHandler
+ extends ContentHandler, LexicalHandler, DTDHandler
+{
+ /**
+ * Assigns the result of the transform.
+ */
+ public void setResult(Result result)
+ throws IllegalArgumentException;
+
+ public void setSystemId(String systemID);
+
+ public String getSystemId();
+
+ /**
+ * Returns the associated transformer, for use in setting
+ * parameters and output properties.
+ */
+ public Transformer getTransformer();
+}
diff --git a/external/jaxp/source/javax/xml/transform/sax/package.html b/external/jaxp/source/javax/xml/transform/sax/package.html
new file mode 100644
index 000000000..b2d2978a3
--- /dev/null
+++ b/external/jaxp/source/javax/xml/transform/sax/package.html
@@ -0,0 +1,9 @@
+<html><head>trax for sax</head><body>
+
+<p>Support for SAX2-based XSLT transformers.
+Normally you would cast a TransformerFactory to a
+<a href="SAXTransformerFactory.html">SAXTransformerFactory</a>
+and use that to in any of the various modes supported
+(such as push or pull).
+
+</body></html>
diff --git a/external/jaxp/source/javax/xml/transform/stream/StreamResult.java b/external/jaxp/source/javax/xml/transform/stream/StreamResult.java
new file mode 100644
index 000000000..531dda75d
--- /dev/null
+++ b/external/jaxp/source/javax/xml/transform/stream/StreamResult.java
@@ -0,0 +1,116 @@
+/*
+ * $Id: StreamResult.java,v 1.1 2003-02-01 02:10:28 cbj Exp $
+ * Copyright (C) 2001 Andrew Selkirk
+ * Copyright (C) 2001 David Brownell
+ *
+ * This file is part of GNU JAXP, a library.
+ *
+ * GNU JAXP is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * GNU JAXP is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ * As a special exception, if you link this library with other files to
+ * produce an executable, this library does not by itself cause the
+ * resulting executable to be covered by the GNU General Public License.
+ * This exception does not however invalidate any other reasons why the
+ * executable file might be covered by the GNU General Public License.
+ */
+package javax.xml.transform.stream;
+
+import java.io.OutputStream;
+import java.io.Writer;
+import java.io.File;
+import java.io.IOException;
+import javax.xml.transform.Result;
+
+
+/**
+ * Stream Result
+ * @author Andrew Selkirk, David Brownell
+ * @version 1.0
+ */
+public class StreamResult implements Result {
+
+ //-------------------------------------------------------------
+ // Variables --------------------------------------------------
+ //-------------------------------------------------------------
+
+ public static final String FEATURE =
+ "http://javax.xml.transform.stream.StreamResult/feature";
+
+ private String systemId = null;
+ private OutputStream outputStream = null;
+ private Writer writer = null;
+
+
+ //-------------------------------------------------------------
+ // Initialization ---------------------------------------------
+ //-------------------------------------------------------------
+
+ public StreamResult() {
+ }
+
+ public StreamResult(OutputStream stream) {
+ this.outputStream = stream;
+ }
+
+ public StreamResult(Writer writer) {
+ this.writer = writer;
+ }
+
+ public StreamResult(String systemID) {
+ this.systemId = systemID;
+ }
+
+ public StreamResult(File file) {
+ setSystemId (file);
+ }
+
+
+ //-------------------------------------------------------------
+ // Methods ----------------------------------------------------
+ //-------------------------------------------------------------
+
+ public OutputStream getOutputStream() {
+ return outputStream;
+ }
+
+ public String getSystemId() {
+ return systemId;
+ }
+
+ public Writer getWriter() {
+ return writer;
+ }
+
+ public void setOutputStream(OutputStream stream) {
+ this.outputStream = stream;
+ }
+
+ public void setWriter(Writer writer) {
+ this.writer = writer;
+ }
+
+ public void setSystemId(File file) {
+ try {
+ this.systemId = StreamSource.fileToURL (file).toString ();
+ } catch (IOException e) {
+ // can't happen
+ throw new RuntimeException (e.getMessage ());
+ }
+ }
+
+ public void setSystemId(String systemID) {
+ this.systemId = systemID;
+ }
+}
diff --git a/external/jaxp/source/javax/xml/transform/stream/StreamSource.java b/external/jaxp/source/javax/xml/transform/stream/StreamSource.java
new file mode 100644
index 000000000..3189580b0
--- /dev/null
+++ b/external/jaxp/source/javax/xml/transform/stream/StreamSource.java
@@ -0,0 +1,163 @@
+/*
+ * $Id: StreamSource.java,v 1.1 2003-02-01 02:10:28 cbj Exp $
+ * Copyright (C) 2001 Andrew Selkirk
+ * Copyright (C) 2001 David Brownell
+ *
+ * This file is part of GNU JAXP, a library.
+ *
+ * GNU JAXP is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * GNU JAXP is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ * As a special exception, if you link this library with other files to
+ * produce an executable, this library does not by itself cause the
+ * resulting executable to be covered by the GNU General Public License.
+ * This exception does not however invalidate any other reasons why the
+ * executable file might be covered by the GNU General Public License.
+ */
+package javax.xml.transform.stream;
+
+import java.io.InputStream;
+import java.io.Reader;
+import java.io.File;
+import java.io.IOException;
+import javax.xml.transform.Source;
+
+
+/**
+ * Stream Source
+ * @author Andrew Selkirk
+ * @version 1.0
+ */
+public class StreamSource implements Source {
+
+ //-------------------------------------------------------------
+ // Variables --------------------------------------------------
+ //-------------------------------------------------------------
+
+ public static final String FEATURE =
+ "http://javax.xml.transform.stream.StreamSource/feature";
+
+ private String publicId = null;
+ private String systemId = null;
+ private InputStream inputStream = null;
+ private Reader reader = null;
+
+
+ //-------------------------------------------------------------
+ // Initialization ---------------------------------------------
+ //-------------------------------------------------------------
+
+ public StreamSource() {
+ }
+
+ public StreamSource(File file) {
+ setSystemId (file);
+ }
+
+ public StreamSource(InputStream stream) {
+ this.inputStream = stream;
+ }
+
+ public StreamSource(InputStream stream, String systemID) {
+ this.inputStream = stream;
+ this.systemId = systemID;
+ }
+
+ public StreamSource(Reader reader) {
+ this.reader = reader;
+ }
+
+ public StreamSource(Reader reader, String systemID) {
+ this.reader = reader;
+ this.systemId = systemID;
+ }
+
+ public StreamSource(String systemID) {
+ this.systemId = systemID;
+ }
+
+
+ //-------------------------------------------------------------
+ // Methods ----------------------------------------------------
+ //-------------------------------------------------------------
+
+ public InputStream getInputStream() {
+ return inputStream;
+ }
+
+ public String getPublicId() {
+ return publicId;
+ }
+
+ public Reader getReader() {
+ return reader;
+ }
+
+ public String getSystemId() {
+ return systemId;
+ }
+
+
+ public void setInputStream(InputStream stream) {
+ this.inputStream = stream;
+ }
+
+ public void setPublicId(String publicID) {
+ this.publicId = publicID;
+ }
+
+ public void setReader(Reader reader) {
+ this.reader = reader;
+ }
+
+ public void setSystemId(File file) {
+ try {
+ this.systemId = fileToURL (file).toString ();
+ } catch (IOException e) {
+ // can't happen
+ throw new RuntimeException (e.getMessage ());
+ }
+ }
+
+ public void setSystemId(String systemID) {
+ this.systemId = systemID;
+ }
+
+ // we don't demand jdk 1.2 File.toURL() in the runtime
+ // keep in sync with gnu.xml.util.Resolver
+ // and javax.xml.parsers.DocumentBuilder
+ static String fileToURL (File f)
+ throws IOException
+ {
+ String temp;
+
+ // FIXME: getAbsolutePath() seems buggy; I'm seeing components
+ // like "/foo/../" which are clearly not "absolute"
+ // and should have been resolved with the filesystem.
+
+ // Substituting "/" would be wrong, "foo" may have been
+ // symlinked ... the URL code will make that change
+ // later, so that things can get _really_ broken!
+
+ temp = f.getAbsolutePath ();
+
+ if (File.separatorChar != '/')
+ temp = temp.replace (File.separatorChar, '/');
+ if (!temp.startsWith ("/"))
+ temp = "/" + temp;
+ if (!temp.endsWith ("/") && f.isDirectory ())
+ temp = temp + "/";
+ return "file:" + temp;
+ }
+}
diff --git a/external/jaxp/source/javax/xml/transform/stream/package.html b/external/jaxp/source/javax/xml/transform/stream/package.html
new file mode 100644
index 000000000..f9d052b19
--- /dev/null
+++ b/external/jaxp/source/javax/xml/transform/stream/package.html
@@ -0,0 +1,6 @@
+<html><head>trax for streams</head><body>
+
+<p>Support for text stream inputs and outputs to transformers.
+
+</body></html>
+
diff --git a/external/jaxp/source/org/w3c/dom/Attr.java b/external/jaxp/source/org/w3c/dom/Attr.java
new file mode 100755
index 000000000..4ba62e239
--- /dev/null
+++ b/external/jaxp/source/org/w3c/dom/Attr.java
@@ -0,0 +1,124 @@
+/*
+ * Copyright (c) 2000 World Wide Web Consortium,
+ * (Massachusetts Institute of Technology, Institut National de
+ * Recherche en Informatique et en Automatique, Keio University). All
+ * Rights Reserved. This program is distributed under the W3C's Software
+ * Intellectual Property License. This program is distributed in the
+ * hope that it will be useful, but WITHOUT ANY WARRANTY; without even
+ * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+ * PURPOSE.
+ * See W3C License http://www.w3.org/Consortium/Legal/ for more details.
+ */
+
+package org.w3c.dom;
+
+/**
+ * The <code>Attr</code> interface represents an attribute in an
+ * <code>Element</code> object. Typically the allowable values for the
+ * attribute are defined in a document type definition.
+ * <p><code>Attr</code> objects inherit the <code>Node</code> interface, but
+ * since they are not actually child nodes of the element they describe, the
+ * DOM does not consider them part of the document tree. Thus, the
+ * <code>Node</code> attributes <code>parentNode</code>,
+ * <code>previousSibling</code>, and <code>nextSibling</code> have a
+ * <code>null</code> value for <code>Attr</code> objects. The DOM takes the
+ * view that attributes are properties of elements rather than having a
+ * separate identity from the elements they are associated with; this should
+ * make it more efficient to implement such features as default attributes
+ * associated with all elements of a given type. Furthermore,
+ * <code>Attr</code> nodes may not be immediate children of a
+ * <code>DocumentFragment</code>. However, they can be associated with
+ * <code>Element</code> nodes contained within a
+ * <code>DocumentFragment</code>. In short, users and implementors of the
+ * DOM need to be aware that <code>Attr</code> nodes have some things in
+ * common with other objects inheriting the <code>Node</code> interface, but
+ * they also are quite distinct.
+ * <p>The attribute's effective value is determined as follows: if this
+ * attribute has been explicitly assigned any value, that value is the
+ * attribute's effective value; otherwise, if there is a declaration for
+ * this attribute, and that declaration includes a default value, then that
+ * default value is the attribute's effective value; otherwise, the
+ * attribute does not exist on this element in the structure model until it
+ * has been explicitly added. Note that the <code>nodeValue</code> attribute
+ * on the <code>Attr</code> instance can also be used to retrieve the string
+ * version of the attribute's value(s).
+ * <p>In XML, where the value of an attribute can contain entity references,
+ * the child nodes of the <code>Attr</code> node may be either
+ * <code>Text</code> or <code>EntityReference</code> nodes (when these are
+ * in use; see the description of <code>EntityReference</code> for
+ * discussion). Because the DOM Core is not aware of attribute types, it
+ * treats all attribute values as simple strings, even if the DTD or schema
+ * declares them as having tokenized types.
+ * <p>See also the <a href='http://www.w3.org/TR/2000/REC-DOM-Level-2-Core-20001113'>Document Object Model (DOM) Level 2 Core Specification</a>.
+ */
+public interface Attr extends Node {
+ /**
+ * Returns the name of this attribute.
+ */
+ public String getName();
+
+ /**
+ * If this attribute was explicitly given a value in the original
+ * document, this is <code>true</code>; otherwise, it is
+ * <code>false</code>. Note that the implementation is in charge of this
+ * attribute, not the user. If the user changes the value of the
+ * attribute (even if it ends up having the same value as the default
+ * value) then the <code>specified</code> flag is automatically flipped
+ * to <code>true</code>. To re-specify the attribute as the default
+ * value from the DTD, the user must delete the attribute. The
+ * implementation will then make a new attribute available with
+ * <code>specified</code> set to <code>false</code> and the default
+ * value (if one exists).
+ * <br>In summary: If the attribute has an assigned value in the document
+ * then <code>specified</code> is <code>true</code>, and the value is
+ * the assigned value.If the attribute has no assigned value in the
+ * document and has a default value in the DTD, then
+ * <code>specified</code> is <code>false</code>, and the value is the
+ * default value in the DTD.If the attribute has no assigned value in
+ * the document and has a value of #IMPLIED in the DTD, then the
+ * attribute does not appear in the structure model of the document.If
+ * the <code>ownerElement</code> attribute is <code>null</code> (i.e.
+ * because it was just created or was set to <code>null</code> by the
+ * various removal and cloning operations) <code>specified</code> is
+ * <code>true</code>.
+ */
+ public boolean getSpecified();
+
+ /**
+ * On retrieval, the value of the attribute is returned as a string.
+ * Character and general entity references are replaced with their
+ * values. See also the method <code>getAttribute</code> on the
+ * <code>Element</code> interface.
+ * <br>On setting, this creates a <code>Text</code> node with the unparsed
+ * contents of the string. I.e. any characters that an XML processor
+ * would recognize as markup are instead treated as literal text. See
+ * also the method <code>setAttribute</code> on the <code>Element</code>
+ * interface.
+ * @exception DOMException
+ * NO_MODIFICATION_ALLOWED_ERR: Raised when the node is readonly.
+ */
+ public String getValue();
+ /**
+ * On retrieval, the value of the attribute is returned as a string.
+ * Character and general entity references are replaced with their
+ * values. See also the method <code>getAttribute</code> on the
+ * <code>Element</code> interface.
+ * <br>On setting, this creates a <code>Text</code> node with the unparsed
+ * contents of the string. I.e. any characters that an XML processor
+ * would recognize as markup are instead treated as literal text. See
+ * also the method <code>setAttribute</code> on the <code>Element</code>
+ * interface.
+ * @exception DOMException
+ * NO_MODIFICATION_ALLOWED_ERR: Raised when the node is readonly.
+ */
+ public void setValue(String value)
+ throws DOMException;
+
+ /**
+ * The <code>Element</code> node this attribute is attached to or
+ * <code>null</code> if this attribute is not in use.
+ * @since DOM Level 2
+ */
+ public Element getOwnerElement();
+
+}
diff --git a/external/jaxp/source/org/w3c/dom/CDATASection.java b/external/jaxp/source/org/w3c/dom/CDATASection.java
new file mode 100755
index 000000000..f3aea8ae8
--- /dev/null
+++ b/external/jaxp/source/org/w3c/dom/CDATASection.java
@@ -0,0 +1,48 @@
+/*
+ * Copyright (c) 2000 World Wide Web Consortium,
+ * (Massachusetts Institute of Technology, Institut National de
+ * Recherche en Informatique et en Automatique, Keio University). All
+ * Rights Reserved. This program is distributed under the W3C's Software
+ * Intellectual Property License. This program is distributed in the
+ * hope that it will be useful, but WITHOUT ANY WARRANTY; without even
+ * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+ * PURPOSE.
+ * See W3C License http://www.w3.org/Consortium/Legal/ for more details.
+ */
+
+package org.w3c.dom;
+
+/**
+ * CDATA sections are used to escape blocks of text containing characters that
+ * would otherwise be regarded as markup. The only delimiter that is
+ * recognized in a CDATA section is the "]]&gt;" string that ends the CDATA
+ * section. CDATA sections cannot be nested. Their primary purpose is for
+ * including material such as XML fragments, without needing to escape all
+ * the delimiters.
+ * <p>The <code>DOMString</code> attribute of the <code>Text</code> node holds
+ * the text that is contained by the CDATA section. Note that this may
+ * contain characters that need to be escaped outside of CDATA sections and
+ * that, depending on the character encoding ("charset") chosen for
+ * serialization, it may be impossible to write out some characters as part
+ * of a CDATA section.
+ * <p>The <code>CDATASection</code> interface inherits from the
+ * <code>CharacterData</code> interface through the <code>Text</code>
+ * interface. Adjacent <code>CDATASection</code> nodes are not merged by use
+ * of the <code>normalize</code> method of the <code>Node</code> interface.
+ * Because no markup is recognized within a <code>CDATASection</code>,
+ * character numeric references cannot be used as an escape mechanism when
+ * serializing. Therefore, action needs to be taken when serializing a
+ * <code>CDATASection</code> with a character encoding where some of the
+ * contained characters cannot be represented. Failure to do so would not
+ * produce well-formed XML.One potential solution in the serialization
+ * process is to end the CDATA section before the character, output the
+ * character using a character reference or entity reference, and open a new
+ * CDATA section for any further characters in the text node. Note, however,
+ * that some code conversion libraries at the time of writing do not return
+ * an error or exception when a character is missing from the encoding,
+ * making the task of ensuring that data is not corrupted on serialization
+ * more difficult.
+ * <p>See also the <a href='http://www.w3.org/TR/2000/REC-DOM-Level-2-Core-20001113'>Document Object Model (DOM) Level 2 Core Specification</a>.
+ */
+public interface CDATASection extends Text {
+}
diff --git a/external/jaxp/source/org/w3c/dom/CharacterData.java b/external/jaxp/source/org/w3c/dom/CharacterData.java
new file mode 100755
index 000000000..c067120f6
--- /dev/null
+++ b/external/jaxp/source/org/w3c/dom/CharacterData.java
@@ -0,0 +1,159 @@
+/*
+ * Copyright (c) 2000 World Wide Web Consortium,
+ * (Massachusetts Institute of Technology, Institut National de
+ * Recherche en Informatique et en Automatique, Keio University). All
+ * Rights Reserved. This program is distributed under the W3C's Software
+ * Intellectual Property License. This program is distributed in the
+ * hope that it will be useful, but WITHOUT ANY WARRANTY; without even
+ * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+ * PURPOSE.
+ * See W3C License http://www.w3.org/Consortium/Legal/ for more details.
+ */
+
+package org.w3c.dom;
+
+/**
+ * The <code>CharacterData</code> interface extends Node with a set of
+ * attributes and methods for accessing character data in the DOM. For
+ * clarity this set is defined here rather than on each object that uses
+ * these attributes and methods. No DOM objects correspond directly to
+ * <code>CharacterData</code>, though <code>Text</code> and others do
+ * inherit the interface from it. All <code>offsets</code> in this interface
+ * start from <code>0</code>.
+ * <p>As explained in the <code>DOMString</code> interface, text strings in
+ * the DOM are represented in UTF-16, i.e. as a sequence of 16-bit units. In
+ * the following, the term 16-bit units is used whenever necessary to
+ * indicate that indexing on CharacterData is done in 16-bit units.
+ * <p>See also the <a href='http://www.w3.org/TR/2000/REC-DOM-Level-2-Core-20001113'>Document Object Model (DOM) Level 2 Core Specification</a>.
+ */
+public interface CharacterData extends Node {
+ /**
+ * The character data of the node that implements this interface. The DOM
+ * implementation may not put arbitrary limits on the amount of data
+ * that may be stored in a <code>CharacterData</code> node. However,
+ * implementation limits may mean that the entirety of a node's data may
+ * not fit into a single <code>DOMString</code>. In such cases, the user
+ * may call <code>substringData</code> to retrieve the data in
+ * appropriately sized pieces.
+ * @exception DOMException
+ * NO_MODIFICATION_ALLOWED_ERR: Raised when the node is readonly.
+ * @exception DOMException
+ * DOMSTRING_SIZE_ERR: Raised when it would return more characters than
+ * fit in a <code>DOMString</code> variable on the implementation
+ * platform.
+ */
+ public String getData()
+ throws DOMException;
+ /**
+ * The character data of the node that implements this interface. The DOM
+ * implementation may not put arbitrary limits on the amount of data
+ * that may be stored in a <code>CharacterData</code> node. However,
+ * implementation limits may mean that the entirety of a node's data may
+ * not fit into a single <code>DOMString</code>. In such cases, the user
+ * may call <code>substringData</code> to retrieve the data in
+ * appropriately sized pieces.
+ * @exception DOMException
+ * NO_MODIFICATION_ALLOWED_ERR: Raised when the node is readonly.
+ * @exception DOMException
+ * DOMSTRING_SIZE_ERR: Raised when it would return more characters than
+ * fit in a <code>DOMString</code> variable on the implementation
+ * platform.
+ */
+ public void setData(String data)
+ throws DOMException;
+
+ /**
+ * The number of 16-bit units that are available through <code>data</code>
+ * and the <code>substringData</code> method below. This may have the
+ * value zero, i.e., <code>CharacterData</code> nodes may be empty.
+ */
+ public int getLength();
+
+ /**
+ * Extracts a range of data from the node.
+ * @param offset Start offset of substring to extract.
+ * @param count The number of 16-bit units to extract.
+ * @return The specified substring. If the sum of <code>offset</code> and
+ * <code>count</code> exceeds the <code>length</code>, then all 16-bit
+ * units to the end of the data are returned.
+ * @exception DOMException
+ * INDEX_SIZE_ERR: Raised if the specified <code>offset</code> is
+ * negative or greater than the number of 16-bit units in
+ * <code>data</code>, or if the specified <code>count</code> is
+ * negative.
+ * <br>DOMSTRING_SIZE_ERR: Raised if the specified range of text does
+ * not fit into a <code>DOMString</code>.
+ */
+ public String substringData(int offset,
+ int count)
+ throws DOMException;
+
+ /**
+ * Append the string to the end of the character data of the node. Upon
+ * success, <code>data</code> provides access to the concatenation of
+ * <code>data</code> and the <code>DOMString</code> specified.
+ * @param arg The <code>DOMString</code> to append.
+ * @exception DOMException
+ * NO_MODIFICATION_ALLOWED_ERR: Raised if this node is readonly.
+ */
+ public void appendData(String arg)
+ throws DOMException;
+
+ /**
+ * Insert a string at the specified 16-bit unit offset.
+ * @param offset The character offset at which to insert.
+ * @param arg The <code>DOMString</code> to insert.
+ * @exception DOMException
+ * INDEX_SIZE_ERR: Raised if the specified <code>offset</code> is
+ * negative or greater than the number of 16-bit units in
+ * <code>data</code>.
+ * <br>NO_MODIFICATION_ALLOWED_ERR: Raised if this node is readonly.
+ */
+ public void insertData(int offset,
+ String arg)
+ throws DOMException;
+
+ /**
+ * Remove a range of 16-bit units from the node. Upon success,
+ * <code>data</code> and <code>length</code> reflect the change.
+ * @param offset The offset from which to start removing.
+ * @param count The number of 16-bit units to delete. If the sum of
+ * <code>offset</code> and <code>count</code> exceeds
+ * <code>length</code> then all 16-bit units from <code>offset</code>
+ * to the end of the data are deleted.
+ * @exception DOMException
+ * INDEX_SIZE_ERR: Raised if the specified <code>offset</code> is
+ * negative or greater than the number of 16-bit units in
+ * <code>data</code>, or if the specified <code>count</code> is
+ * negative.
+ * <br>NO_MODIFICATION_ALLOWED_ERR: Raised if this node is readonly.
+ */
+ public void deleteData(int offset,
+ int count)
+ throws DOMException;
+
+ /**
+ * Replace the characters starting at the specified 16-bit unit offset
+ * with the specified string.
+ * @param offset The offset from which to start replacing.
+ * @param count The number of 16-bit units to replace. If the sum of
+ * <code>offset</code> and <code>count</code> exceeds
+ * <code>length</code>, then all 16-bit units to the end of the data
+ * are replaced; (i.e., the effect is the same as a <code>remove</code>
+ * method call with the same range, followed by an <code>append</code>
+ * method invocation).
+ * @param arg The <code>DOMString</code> with which the range must be
+ * replaced.
+ * @exception DOMException
+ * INDEX_SIZE_ERR: Raised if the specified <code>offset</code> is
+ * negative or greater than the number of 16-bit units in
+ * <code>data</code>, or if the specified <code>count</code> is
+ * negative.
+ * <br>NO_MODIFICATION_ALLOWED_ERR: Raised if this node is readonly.
+ */
+ public void replaceData(int offset,
+ int count,
+ String arg)
+ throws DOMException;
+
+}
diff --git a/external/jaxp/source/org/w3c/dom/Comment.java b/external/jaxp/source/org/w3c/dom/Comment.java
new file mode 100755
index 000000000..109792190
--- /dev/null
+++ b/external/jaxp/source/org/w3c/dom/Comment.java
@@ -0,0 +1,24 @@
+/*
+ * Copyright (c) 2000 World Wide Web Consortium,
+ * (Massachusetts Institute of Technology, Institut National de
+ * Recherche en Informatique et en Automatique, Keio University). All
+ * Rights Reserved. This program is distributed under the W3C's Software
+ * Intellectual Property License. This program is distributed in the
+ * hope that it will be useful, but WITHOUT ANY WARRANTY; without even
+ * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+ * PURPOSE.
+ * See W3C License http://www.w3.org/Consortium/Legal/ for more details.
+ */
+
+package org.w3c.dom;
+
+/**
+ * This interface inherits from <code>CharacterData</code> and represents the
+ * content of a comment, i.e., all the characters between the starting '
+ * <code>&lt;!--</code>' and ending '<code>--&gt;</code>'. Note that this is
+ * the definition of a comment in XML, and, in practice, HTML, although some
+ * HTML tools may implement the full SGML comment structure.
+ * <p>See also the <a href='http://www.w3.org/TR/2000/REC-DOM-Level-2-Core-20001113'>Document Object Model (DOM) Level 2 Core Specification</a>.
+ */
+public interface Comment extends CharacterData {
+}
diff --git a/external/jaxp/source/org/w3c/dom/DOMException.java b/external/jaxp/source/org/w3c/dom/DOMException.java
new file mode 100755
index 000000000..16866cebc
--- /dev/null
+++ b/external/jaxp/source/org/w3c/dom/DOMException.java
@@ -0,0 +1,116 @@
+/*
+ * Copyright (c) 2000 World Wide Web Consortium,
+ * (Massachusetts Institute of Technology, Institut National de
+ * Recherche en Informatique et en Automatique, Keio University). All
+ * Rights Reserved. This program is distributed under the W3C's Software
+ * Intellectual Property License. This program is distributed in the
+ * hope that it will be useful, but WITHOUT ANY WARRANTY; without even
+ * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+ * PURPOSE.
+ * See W3C License http://www.w3.org/Consortium/Legal/ for more details.
+ */
+
+package org.w3c.dom;
+
+/**
+ * DOM operations only raise exceptions in "exceptional" circumstances, i.e.,
+ * when an operation is impossible to perform (either for logical reasons,
+ * because data is lost, or because the implementation has become unstable).
+ * In general, DOM methods return specific error values in ordinary
+ * processing situations, such as out-of-bound errors when using
+ * <code>NodeList</code>.
+ * <p>Implementations should raise other exceptions under other circumstances.
+ * For example, implementations should raise an implementation-dependent
+ * exception if a <code>null</code> argument is passed.
+ * <p>Some languages and object systems do not support the concept of
+ * exceptions. For such systems, error conditions may be indicated using
+ * native error reporting mechanisms. For some bindings, for example,
+ * methods may return error codes similar to those listed in the
+ * corresponding method descriptions.
+ * <p>See also the <a href='http://www.w3.org/TR/2000/REC-DOM-Level-2-Core-20001113'>Document Object Model (DOM) Level 2 Core Specification</a>.
+ */
+public class DOMException extends RuntimeException {
+ public DOMException(short code, String message) {
+ super(message);
+ this.code = code;
+ }
+ public short code;
+ // ExceptionCode
+ /**
+ * If index or size is negative, or greater than the allowed value
+ */
+ public static final short INDEX_SIZE_ERR = 1;
+ /**
+ * If the specified range of text does not fit into a DOMString
+ */
+ public static final short DOMSTRING_SIZE_ERR = 2;
+ /**
+ * If any node is inserted somewhere it doesn't belong
+ */
+ public static final short HIERARCHY_REQUEST_ERR = 3;
+ /**
+ * If a node is used in a different document than the one that created it
+ * (that doesn't support it)
+ */
+ public static final short WRONG_DOCUMENT_ERR = 4;
+ /**
+ * If an invalid or illegal character is specified, such as in a name. See
+ * production 2 in the XML specification for the definition of a legal
+ * character, and production 5 for the definition of a legal name
+ * character.
+ */
+ public static final short INVALID_CHARACTER_ERR = 5;
+ /**
+ * If data is specified for a node which does not support data
+ */
+ public static final short NO_DATA_ALLOWED_ERR = 6;
+ /**
+ * If an attempt is made to modify an object where modifications are not
+ * allowed
+ */
+ public static final short NO_MODIFICATION_ALLOWED_ERR = 7;
+ /**
+ * If an attempt is made to reference a node in a context where it does
+ * not exist
+ */
+ public static final short NOT_FOUND_ERR = 8;
+ /**
+ * If the implementation does not support the requested type of object or
+ * operation.
+ */
+ public static final short NOT_SUPPORTED_ERR = 9;
+ /**
+ * If an attempt is made to add an attribute that is already in use
+ * elsewhere
+ */
+ public static final short INUSE_ATTRIBUTE_ERR = 10;
+ /**
+ * If an attempt is made to use an object that is not, or is no longer,
+ * usable.
+ * @since DOM Level 2
+ */
+ public static final short INVALID_STATE_ERR = 11;
+ /**
+ * If an invalid or illegal string is specified.
+ * @since DOM Level 2
+ */
+ public static final short SYNTAX_ERR = 12;
+ /**
+ * If an attempt is made to modify the type of the underlying object.
+ * @since DOM Level 2
+ */
+ public static final short INVALID_MODIFICATION_ERR = 13;
+ /**
+ * If an attempt is made to create or change an object in a way which is
+ * incorrect with regard to namespaces.
+ * @since DOM Level 2
+ */
+ public static final short NAMESPACE_ERR = 14;
+ /**
+ * If a parameter or an operation is not supported by the underlying
+ * object.
+ * @since DOM Level 2
+ */
+ public static final short INVALID_ACCESS_ERR = 15;
+
+}
diff --git a/external/jaxp/source/org/w3c/dom/DOMImplementation.java b/external/jaxp/source/org/w3c/dom/DOMImplementation.java
new file mode 100755
index 000000000..6e9a55404
--- /dev/null
+++ b/external/jaxp/source/org/w3c/dom/DOMImplementation.java
@@ -0,0 +1,110 @@
+/*
+ * Copyright (c) 2000 World Wide Web Consortium,
+ * (Massachusetts Institute of Technology, Institut National de
+ * Recherche en Informatique et en Automatique, Keio University). All
+ * Rights Reserved. This program is distributed under the W3C's Software
+ * Intellectual Property License. This program is distributed in the
+ * hope that it will be useful, but WITHOUT ANY WARRANTY; without even
+ * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+ * PURPOSE.
+ * See W3C License http://www.w3.org/Consortium/Legal/ for more details.
+ */
+
+package org.w3c.dom;
+
+/**
+ * The <code>DOMImplementation</code> interface provides a number of methods
+ * for performing operations that are independent of any particular instance
+ * of the document object model.
+ * <p>See also the <a href='http://www.w3.org/TR/2000/REC-DOM-Level-2-Core-20001113'>Document Object Model (DOM) Level 2 Core Specification</a>.
+ */
+public interface DOMImplementation {
+ /**
+ * Test if the DOM implementation implements a specific feature.
+ * @param feature The name of the feature to test (case-insensitive). The
+ * values used by DOM features are defined throughout the DOM Level 2
+ * specifications and listed in the section. The name must be an XML
+ * name. To avoid possible conflicts, as a convention, names referring
+ * to features defined outside the DOM specification should be made
+ * unique.
+ * @param version This is the version number of the feature to test. In
+ * Level 2, the string can be either "2.0" or "1.0". If the version is
+ * not specified, supporting any version of the feature causes the
+ * method to return <code>true</code>.
+ * @return <code>true</code> if the feature is implemented in the
+ * specified version, <code>false</code> otherwise.
+ */
+ public boolean hasFeature(String feature,
+ String version);
+
+ /**
+ * Creates an empty <code>DocumentType</code> node. Entity declarations
+ * and notations are not made available. Entity reference expansions and
+ * default attribute additions do not occur. It is expected that a
+ * future version of the DOM will provide a way for populating a
+ * <code>DocumentType</code>.
+ * @param qualifiedName The qualified name of the document type to be
+ * created.
+ * @param publicId The external subset public identifier.
+ * @param systemId The external subset system identifier.
+ * @return A new <code>DocumentType</code> node with
+ * <code>Node.ownerDocument</code> set to <code>null</code>.
+ * @exception DOMException
+ * INVALID_CHARACTER_ERR: Raised if the specified qualified name
+ * contains an illegal character.
+ * <br>NAMESPACE_ERR: Raised if the <code>qualifiedName</code> is
+ * malformed.
+ * <br>NOT_SUPPORTED_ERR: May be raised by DOM implementations which do
+ * not support the <code>"XML"</code> feature, if they choose not to
+ * support this method. Other features introduced in the future, by
+ * the DOM WG or in extensions defined by other groups, may also
+ * demand support for this method; please consult the definition of
+ * the feature to see if it requires this method.
+ * @since DOM Level 2
+ */
+ public DocumentType createDocumentType(String qualifiedName,
+ String publicId,
+ String systemId)
+ throws DOMException;
+
+ /**
+ * Creates a DOM Document object of the specified type with its document
+ * element.
+ * @param namespaceURI The namespace URI of the document element to
+ * create.
+ * @param qualifiedName The qualified name of the document element to be
+ * created.
+ * @param doctype The type of document to be created or <code>null</code>.
+ * When <code>doctype</code> is not <code>null</code>, its
+ * <code>Node.ownerDocument</code> attribute is set to the document
+ * being created.
+ * @return A new <code>Document</code> object.
+ * @exception DOMException
+ * INVALID_CHARACTER_ERR: Raised if the specified qualified name
+ * contains an illegal character.
+ * <br>NAMESPACE_ERR: Raised if the <code>qualifiedName</code> is
+ * malformed, if the <code>qualifiedName</code> has a prefix and the
+ * <code>namespaceURI</code> is <code>null</code>, or if the
+ * <code>qualifiedName</code> has a prefix that is "xml" and the
+ * <code>namespaceURI</code> is different from "
+ * http://www.w3.org/XML/1998/namespace" , or if the DOM
+ * implementation does not support the <code>"XML"</code> feature but
+ * a non-null namespace URI was provided, since namespaces were
+ * defined by XML.
+ * <br>WRONG_DOCUMENT_ERR: Raised if <code>doctype</code> has already
+ * been used with a different document or was created from a different
+ * implementation.
+ * <br>NOT_SUPPORTED_ERR: May be raised by DOM implementations which do
+ * not support the "XML" feature, if they choose not to support this
+ * method. Other features introduced in the future, by the DOM WG or
+ * in extensions defined by other groups, may also demand support for
+ * this method; please consult the definition of the feature to see if
+ * it requires this method.
+ * @since DOM Level 2
+ */
+ public Document createDocument(String namespaceURI,
+ String qualifiedName,
+ DocumentType doctype)
+ throws DOMException;
+
+}
diff --git a/external/jaxp/source/org/w3c/dom/Document.java b/external/jaxp/source/org/w3c/dom/Document.java
new file mode 100755
index 000000000..79214e017
--- /dev/null
+++ b/external/jaxp/source/org/w3c/dom/Document.java
@@ -0,0 +1,428 @@
+/*
+ * Copyright (c) 2000 World Wide Web Consortium,
+ * (Massachusetts Institute of Technology, Institut National de
+ * Recherche en Informatique et en Automatique, Keio University). All
+ * Rights Reserved. This program is distributed under the W3C's Software
+ * Intellectual Property License. This program is distributed in the
+ * hope that it will be useful, but WITHOUT ANY WARRANTY; without even
+ * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+ * PURPOSE.
+ * See W3C License http://www.w3.org/Consortium/Legal/ for more details.
+ */
+
+package org.w3c.dom;
+
+/**
+ * The <code>Document</code> interface represents the entire HTML or XML
+ * document. Conceptually, it is the root of the document tree, and provides
+ * the primary access to the document's data.
+ * <p>Since elements, text nodes, comments, processing instructions, etc.
+ * cannot exist outside the context of a <code>Document</code>, the
+ * <code>Document</code> interface also contains the factory methods needed
+ * to create these objects. The <code>Node</code> objects created have a
+ * <code>ownerDocument</code> attribute which associates them with the
+ * <code>Document</code> within whose context they were created.
+ * <p>See also the <a href='http://www.w3.org/TR/2000/REC-DOM-Level-2-Core-20001113'>Document Object Model (DOM) Level 2 Core Specification</a>.
+ */
+public interface Document extends Node {
+ /**
+ * The Document Type Declaration (see <code>DocumentType</code>)
+ * associated with this document. For HTML documents as well as XML
+ * documents without a document type declaration this returns
+ * <code>null</code>. The DOM Level 2 does not support editing the
+ * Document Type Declaration. <code>docType</code> cannot be altered in
+ * any way, including through the use of methods inherited from the
+ * <code>Node</code> interface, such as <code>insertNode</code> or
+ * <code>removeNode</code>.
+ */
+ public DocumentType getDoctype();
+
+ /**
+ * The <code>DOMImplementation</code> object that handles this document. A
+ * DOM application may use objects from multiple implementations.
+ */
+ public DOMImplementation getImplementation();
+
+ /**
+ * This is a convenience attribute that allows direct access to the child
+ * node that is the root element of the document. For HTML documents,
+ * this is the element with the tagName "HTML".
+ */
+ public Element getDocumentElement();
+
+ /**
+ * Creates an element of the type specified. Note that the instance
+ * returned implements the <code>Element</code> interface, so attributes
+ * can be specified directly on the returned object.
+ * <br>In addition, if there are known attributes with default values,
+ * <code>Attr</code> nodes representing them are automatically created
+ * and attached to the element.
+ * <br>To create an element with a qualified name and namespace URI, use
+ * the <code>createElementNS</code> method.
+ * @param tagName The name of the element type to instantiate. For XML,
+ * this is case-sensitive. For HTML, the <code>tagName</code>
+ * parameter may be provided in any case, but it must be mapped to the
+ * canonical uppercase form by the DOM implementation.
+ * @return A new <code>Element</code> object with the
+ * <code>nodeName</code> attribute set to <code>tagName</code>, and
+ * <code>localName</code>, <code>prefix</code>, and
+ * <code>namespaceURI</code> set to <code>null</code>.
+ * @exception DOMException
+ * INVALID_CHARACTER_ERR: Raised if the specified name contains an
+ * illegal character.
+ */
+ public Element createElement(String tagName)
+ throws DOMException;
+
+ /**
+ * Creates an empty <code>DocumentFragment</code> object.
+ * @return A new <code>DocumentFragment</code>.
+ */
+ public DocumentFragment createDocumentFragment();
+
+ /**
+ * Creates a <code>Text</code> node given the specified string.
+ * @param data The data for the node.
+ * @return The new <code>Text</code> object.
+ */
+ public Text createTextNode(String data);
+
+ /**
+ * Creates a <code>Comment</code> node given the specified string.
+ * @param data The data for the node.
+ * @return The new <code>Comment</code> object.
+ */
+ public Comment createComment(String data);
+
+ /**
+ * Creates a <code>CDATASection</code> node whose value is the specified
+ * string.
+ * @param data The data for the <code>CDATASection</code> contents.
+ * @return The new <code>CDATASection</code> object.
+ * @exception DOMException
+ * NOT_SUPPORTED_ERR: Raised if this document is an HTML document.
+ */
+ public CDATASection createCDATASection(String data)
+ throws DOMException;
+
+ /**
+ * Creates a <code>ProcessingInstruction</code> node given the specified
+ * name and data strings.
+ * @param target The target part of the processing instruction.
+ * @param data The data for the node.
+ * @return The new <code>ProcessingInstruction</code> object.
+ * @exception DOMException
+ * INVALID_CHARACTER_ERR: Raised if the specified target contains an
+ * illegal character.
+ * <br>NOT_SUPPORTED_ERR: Raised if this document is an HTML document.
+ */
+ public ProcessingInstruction createProcessingInstruction(String target,
+ String data)
+ throws DOMException;
+
+ /**
+ * Creates an <code>Attr</code> of the given name. Note that the
+ * <code>Attr</code> instance can then be set on an <code>Element</code>
+ * using the <code>setAttributeNode</code> method.
+ * <br>To create an attribute with a qualified name and namespace URI, use
+ * the <code>createAttributeNS</code> method.
+ * @param name The name of the attribute.
+ * @return A new <code>Attr</code> object with the <code>nodeName</code>
+ * attribute set to <code>name</code>, and <code>localName</code>,
+ * <code>prefix</code>, and <code>namespaceURI</code> set to
+ * <code>null</code>. The value of the attribute is the empty string.
+ * @exception DOMException
+ * INVALID_CHARACTER_ERR: Raised if the specified name contains an
+ * illegal character.
+ */
+ public Attr createAttribute(String name)
+ throws DOMException;
+
+ /**
+ * Creates an <code>EntityReference</code> object. In addition, if the
+ * referenced entity is known, the child list of the
+ * <code>EntityReference</code> node is made the same as that of the
+ * corresponding <code>Entity</code> node.If any descendant of the
+ * <code>Entity</code> node has an unbound namespace prefix, the
+ * corresponding descendant of the created <code>EntityReference</code>
+ * node is also unbound; (its <code>namespaceURI</code> is
+ * <code>null</code>). The DOM Level 2 does not support any mechanism to
+ * resolve namespace prefixes.
+ * @param name The name of the entity to reference.
+ * @return The new <code>EntityReference</code> object.
+ * @exception DOMException
+ * INVALID_CHARACTER_ERR: Raised if the specified name contains an
+ * illegal character.
+ * <br>NOT_SUPPORTED_ERR: Raised if this document is an HTML document.
+ */
+ public EntityReference createEntityReference(String name)
+ throws DOMException;
+
+ /**
+ * Returns a <code>NodeList</code> of all the <code>Elements</code> with a
+ * given tag name in the order in which they are encountered in a
+ * preorder traversal of the <code>Document</code> tree.
+ * @param tagname The name of the tag to match on. The special value "*"
+ * matches all tags.
+ * @return A new <code>NodeList</code> object containing all the matched
+ * <code>Elements</code>.
+ */
+ public NodeList getElementsByTagName(String tagname);
+
+ /**
+ * Imports a node from another document to this document. The returned
+ * node has no parent; (<code>parentNode</code> is <code>null</code>).
+ * The source node is not altered or removed from the original document;
+ * this method creates a new copy of the source node.
+ * <br>For all nodes, importing a node creates a node object owned by the
+ * importing document, with attribute values identical to the source
+ * node's <code>nodeName</code> and <code>nodeType</code>, plus the
+ * attributes related to namespaces (<code>prefix</code>,
+ * <code>localName</code>, and <code>namespaceURI</code>). As in the
+ * <code>cloneNode</code> operation on a <code>Node</code>, the source
+ * node is not altered.
+ * <br>Additional information is copied as appropriate to the
+ * <code>nodeType</code>, attempting to mirror the behavior expected if
+ * a fragment of XML or HTML source was copied from one document to
+ * another, recognizing that the two documents may have different DTDs
+ * in the XML case. The following list describes the specifics for each
+ * type of node.
+ * <dl>
+ * <dt>ATTRIBUTE_NODE</dt>
+ * <dd>The <code>ownerElement</code> attribute
+ * is set to <code>null</code> and the <code>specified</code> flag is
+ * set to <code>true</code> on the generated <code>Attr</code>. The
+ * descendants of the source <code>Attr</code> are recursively imported
+ * and the resulting nodes reassembled to form the corresponding subtree.
+ * Note that the <code>deep</code> parameter has no effect on
+ * <code>Attr</code> nodes; they always carry their children with them
+ * when imported.</dd>
+ * <dt>DOCUMENT_FRAGMENT_NODE</dt>
+ * <dd>If the <code>deep</code> option
+ * was set to <code>true</code>, the descendants of the source element
+ * are recursively imported and the resulting nodes reassembled to form
+ * the corresponding subtree. Otherwise, this simply generates an empty
+ * <code>DocumentFragment</code>.</dd>
+ * <dt>DOCUMENT_NODE</dt>
+ * <dd><code>Document</code>
+ * nodes cannot be imported.</dd>
+ * <dt>DOCUMENT_TYPE_NODE</dt>
+ * <dd><code>DocumentType</code>
+ * nodes cannot be imported.</dd>
+ * <dt>ELEMENT_NODE</dt>
+ * <dd>Specified attribute nodes of the
+ * source element are imported, and the generated <code>Attr</code>
+ * nodes are attached to the generated <code>Element</code>. Default
+ * attributes are not copied, though if the document being imported into
+ * defines default attributes for this element name, those are assigned.
+ * If the <code>importNode</code> <code>deep</code> parameter was set to
+ * <code>true</code>, the descendants of the source element are
+ * recursively imported and the resulting nodes reassembled to form the
+ * corresponding subtree.</dd>
+ * <dt>ENTITY_NODE</dt>
+ * <dd><code>Entity</code> nodes can be
+ * imported, however in the current release of the DOM the
+ * <code>DocumentType</code> is readonly. Ability to add these imported
+ * nodes to a <code>DocumentType</code> will be considered for addition
+ * to a future release of the DOM.On import, the <code>publicId</code>,
+ * <code>systemId</code>, and <code>notationName</code> attributes are
+ * copied. If a <code>deep</code> import is requested, the descendants
+ * of the the source <code>Entity</code> are recursively imported and
+ * the resulting nodes reassembled to form the corresponding subtree.</dd>
+ * <dt>
+ * ENTITY_REFERENCE_NODE</dt>
+ * <dd>Only the <code>EntityReference</code> itself is
+ * copied, even if a <code>deep</code> import is requested, since the
+ * source and destination documents might have defined the entity
+ * differently. If the document being imported into provides a
+ * definition for this entity name, its value is assigned.</dd>
+ * <dt>NOTATION_NODE</dt>
+ * <dd>
+ * <code>Notation</code> nodes can be imported, however in the current
+ * release of the DOM the <code>DocumentType</code> is readonly. Ability
+ * to add these imported nodes to a <code>DocumentType</code> will be
+ * considered for addition to a future release of the DOM.On import, the
+ * <code>publicId</code> and <code>systemId</code> attributes are copied.
+ * Note that the <code>deep</code> parameter has no effect on
+ * <code>Notation</code> nodes since they never have any children.</dd>
+ * <dt>
+ * PROCESSING_INSTRUCTION_NODE</dt>
+ * <dd>The imported node copies its
+ * <code>target</code> and <code>data</code> values from those of the
+ * source node.</dd>
+ * <dt>TEXT_NODE, CDATA_SECTION_NODE, COMMENT_NODE</dt>
+ * <dd>These three
+ * types of nodes inheriting from <code>CharacterData</code> copy their
+ * <code>data</code> and <code>length</code> attributes from those of
+ * the source node.</dd>
+ * </dl>
+ * @param importedNode The node to import.
+ * @param deep If <code>true</code>, recursively import the subtree under
+ * the specified node; if <code>false</code>, import only the node
+ * itself, as explained above. This has no effect on <code>Attr</code>
+ * , <code>EntityReference</code>, and <code>Notation</code> nodes.
+ * @return The imported node that belongs to this <code>Document</code>.
+ * @exception DOMException
+ * NOT_SUPPORTED_ERR: Raised if the type of node being imported is not
+ * supported.
+ * @since DOM Level 2
+ */
+ public Node importNode(Node importedNode,
+ boolean deep)
+ throws DOMException;
+
+ /**
+ * Creates an element of the given qualified name and namespace URI.
+ * @param namespaceURI The namespace URI of the element to create.
+ * @param qualifiedName The qualified name of the element type to
+ * instantiate.
+ * @return A new <code>Element</code> object with the following
+ * attributes:
+ * <table border='1'>
+ * <tr>
+ * <th>Attribute</th>
+ * <th>Value</th>
+ * </tr>
+ * <tr>
+ * <td valign='top' rowspan='1' colspan='1'><code>Node.nodeName</code></td>
+ * <td valign='top' rowspan='1' colspan='1'>
+ * <code>qualifiedName</code></td>
+ * </tr>
+ * <tr>
+ * <td valign='top' rowspan='1' colspan='1'><code>Node.namespaceURI</code></td>
+ * <td valign='top' rowspan='1' colspan='1'>
+ * <code>namespaceURI</code></td>
+ * </tr>
+ * <tr>
+ * <td valign='top' rowspan='1' colspan='1'><code>Node.prefix</code></td>
+ * <td valign='top' rowspan='1' colspan='1'>prefix, extracted
+ * from <code>qualifiedName</code>, or <code>null</code> if there is
+ * no prefix</td>
+ * </tr>
+ * <tr>
+ * <td valign='top' rowspan='1' colspan='1'><code>Node.localName</code></td>
+ * <td valign='top' rowspan='1' colspan='1'>local name, extracted from
+ * <code>qualifiedName</code></td>
+ * </tr>
+ * <tr>
+ * <td valign='top' rowspan='1' colspan='1'><code>Element.tagName</code></td>
+ * <td valign='top' rowspan='1' colspan='1'>
+ * <code>qualifiedName</code></td>
+ * </tr>
+ * </table>
+ * @exception DOMException
+ * INVALID_CHARACTER_ERR: Raised if the specified qualified name
+ * contains an illegal character, per the XML 1.0 specification .
+ * <br>NAMESPACE_ERR: Raised if the <code>qualifiedName</code> is
+ * malformed per the Namespaces in XML specification, if the
+ * <code>qualifiedName</code> has a prefix and the
+ * <code>namespaceURI</code> is <code>null</code>, or if the
+ * <code>qualifiedName</code> has a prefix that is "xml" and the
+ * <code>namespaceURI</code> is different from "
+ * http://www.w3.org/XML/1998/namespace" .
+ * <br>NOT_SUPPORTED_ERR: Always thrown if the current document does not
+ * support the <code>"XML"</code> feature, since namespaces were
+ * defined by XML.
+ * @since DOM Level 2
+ */
+ public Element createElementNS(String namespaceURI,
+ String qualifiedName)
+ throws DOMException;
+
+ /**
+ * Creates an attribute of the given qualified name and namespace URI.
+ * @param namespaceURI The namespace URI of the attribute to create.
+ * @param qualifiedName The qualified name of the attribute to
+ * instantiate.
+ * @return A new <code>Attr</code> object with the following attributes:
+ * <table border='1'>
+ * <tr>
+ * <th>
+ * Attribute</th>
+ * <th>Value</th>
+ * </tr>
+ * <tr>
+ * <td valign='top' rowspan='1' colspan='1'><code>Node.nodeName</code></td>
+ * <td valign='top' rowspan='1' colspan='1'>qualifiedName</td>
+ * </tr>
+ * <tr>
+ * <td valign='top' rowspan='1' colspan='1'>
+ * <code>Node.namespaceURI</code></td>
+ * <td valign='top' rowspan='1' colspan='1'><code>namespaceURI</code></td>
+ * </tr>
+ * <tr>
+ * <td valign='top' rowspan='1' colspan='1'>
+ * <code>Node.prefix</code></td>
+ * <td valign='top' rowspan='1' colspan='1'>prefix, extracted from
+ * <code>qualifiedName</code>, or <code>null</code> if there is no
+ * prefix</td>
+ * </tr>
+ * <tr>
+ * <td valign='top' rowspan='1' colspan='1'><code>Node.localName</code></td>
+ * <td valign='top' rowspan='1' colspan='1'>local name, extracted from
+ * <code>qualifiedName</code></td>
+ * </tr>
+ * <tr>
+ * <td valign='top' rowspan='1' colspan='1'><code>Attr.name</code></td>
+ * <td valign='top' rowspan='1' colspan='1'>
+ * <code>qualifiedName</code></td>
+ * </tr>
+ * <tr>
+ * <td valign='top' rowspan='1' colspan='1'><code>Node.nodeValue</code></td>
+ * <td valign='top' rowspan='1' colspan='1'>the empty
+ * string</td>
+ * </tr>
+ * </table>
+ * @exception DOMException
+ * INVALID_CHARACTER_ERR: Raised if the specified qualified name
+ * contains an illegal character, per the XML 1.0 specification .
+ * <br>NAMESPACE_ERR: Raised if the <code>qualifiedName</code> is
+ * malformed per the Namespaces in XML specification, if the
+ * <code>qualifiedName</code> has a prefix and the
+ * <code>namespaceURI</code> is <code>null</code>, if the
+ * <code>qualifiedName</code> has a prefix that is "xml" and the
+ * <code>namespaceURI</code> is different from "
+ * http://www.w3.org/XML/1998/namespace", or if the
+ * <code>qualifiedName</code>, or its prefix, is "xmlns" and the
+ * <code>namespaceURI</code> is different from "
+ * http://www.w3.org/2000/xmlns/".
+ * <br>NOT_SUPPORTED_ERR: Always thrown if the current document does not
+ * support the <code>"XML"</code> feature, since namespaces were
+ * defined by XML.
+ * @since DOM Level 2
+ */
+ public Attr createAttributeNS(String namespaceURI,
+ String qualifiedName)
+ throws DOMException;
+
+ /**
+ * Returns a <code>NodeList</code> of all the <code>Elements</code> with a
+ * given local name and namespace URI in the order in which they are
+ * encountered in a preorder traversal of the <code>Document</code> tree.
+ * @param namespaceURI The namespace URI of the elements to match on. The
+ * special value "*" matches all namespaces.
+ * @param localName The local name of the elements to match on. The
+ * special value "*" matches all local names.
+ * @return A new <code>NodeList</code> object containing all the matched
+ * <code>Elements</code>.
+ * @since DOM Level 2
+ */
+ public NodeList getElementsByTagNameNS(String namespaceURI,
+ String localName);
+
+ /**
+ * Returns the <code>Element</code> whose <code>ID</code> is given by
+ * <code>elementId</code>. If no such element exists, returns
+ * <code>null</code>. Behavior is not defined if more than one element
+ * has this <code>ID</code>. The DOM implementation must have
+ * information that says which attributes are of type ID. Attributes
+ * with the name "ID" are not of type ID unless so defined.
+ * Implementations that do not know whether attributes are of type ID or
+ * not are expected to return <code>null</code>.
+ * @param elementId The unique <code>id</code> value for an element.
+ * @return The matching element.
+ * @since DOM Level 2
+ */
+ public Element getElementById(String elementId);
+
+}
diff --git a/external/jaxp/source/org/w3c/dom/DocumentFragment.java b/external/jaxp/source/org/w3c/dom/DocumentFragment.java
new file mode 100755
index 000000000..6ade30cc9
--- /dev/null
+++ b/external/jaxp/source/org/w3c/dom/DocumentFragment.java
@@ -0,0 +1,52 @@
+/*
+ * Copyright (c) 2000 World Wide Web Consortium,
+ * (Massachusetts Institute of Technology, Institut National de
+ * Recherche en Informatique et en Automatique, Keio University). All
+ * Rights Reserved. This program is distributed under the W3C's Software
+ * Intellectual Property License. This program is distributed in the
+ * hope that it will be useful, but WITHOUT ANY WARRANTY; without even
+ * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+ * PURPOSE.
+ * See W3C License http://www.w3.org/Consortium/Legal/ for more details.
+ */
+
+package org.w3c.dom;
+
+/**
+ * <code>DocumentFragment</code> is a "lightweight" or "minimal"
+ * <code>Document</code> object. It is very common to want to be able to
+ * extract a portion of a document's tree or to create a new fragment of a
+ * document. Imagine implementing a user command like cut or rearranging a
+ * document by moving fragments around. It is desirable to have an object
+ * which can hold such fragments and it is quite natural to use a Node for
+ * this purpose. While it is true that a <code>Document</code> object could
+ * fulfill this role, a <code>Document</code> object can potentially be a
+ * heavyweight object, depending on the underlying implementation. What is
+ * really needed for this is a very lightweight object.
+ * <code>DocumentFragment</code> is such an object.
+ * <p>Furthermore, various operations -- such as inserting nodes as children
+ * of another <code>Node</code> -- may take <code>DocumentFragment</code>
+ * objects as arguments; this results in all the child nodes of the
+ * <code>DocumentFragment</code> being moved to the child list of this node.
+ * <p>The children of a <code>DocumentFragment</code> node are zero or more
+ * nodes representing the tops of any sub-trees defining the structure of
+ * the document. <code>DocumentFragment</code> nodes do not need to be
+ * well-formed XML documents (although they do need to follow the rules
+ * imposed upon well-formed XML parsed entities, which can have multiple top
+ * nodes). For example, a <code>DocumentFragment</code> might have only one
+ * child and that child node could be a <code>Text</code> node. Such a
+ * structure model represents neither an HTML document nor a well-formed XML
+ * document.
+ * <p>When a <code>DocumentFragment</code> is inserted into a
+ * <code>Document</code> (or indeed any other <code>Node</code> that may
+ * take children) the children of the <code>DocumentFragment</code> and not
+ * the <code>DocumentFragment</code> itself are inserted into the
+ * <code>Node</code>. This makes the <code>DocumentFragment</code> very
+ * useful when the user wishes to create nodes that are siblings; the
+ * <code>DocumentFragment</code> acts as the parent of these nodes so that
+ * the user can use the standard methods from the <code>Node</code>
+ * interface, such as <code>insertBefore</code> and <code>appendChild</code>.
+ * <p>See also the <a href='http://www.w3.org/TR/2000/REC-DOM-Level-2-Core-20001113'>Document Object Model (DOM) Level 2 Core Specification</a>.
+ */
+public interface DocumentFragment extends Node {
+}
diff --git a/external/jaxp/source/org/w3c/dom/DocumentType.java b/external/jaxp/source/org/w3c/dom/DocumentType.java
new file mode 100755
index 000000000..86c312b72
--- /dev/null
+++ b/external/jaxp/source/org/w3c/dom/DocumentType.java
@@ -0,0 +1,80 @@
+/*
+ * Copyright (c) 2000 World Wide Web Consortium,
+ * (Massachusetts Institute of Technology, Institut National de
+ * Recherche en Informatique et en Automatique, Keio University). All
+ * Rights Reserved. This program is distributed under the W3C's Software
+ * Intellectual Property License. This program is distributed in the
+ * hope that it will be useful, but WITHOUT ANY WARRANTY; without even
+ * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+ * PURPOSE.
+ * See W3C License http://www.w3.org/Consortium/Legal/ for more details.
+ */
+
+package org.w3c.dom;
+
+/**
+ * Each <code>Document</code> has a <code>doctype</code> attribute whose value
+ * is either <code>null</code> or a <code>DocumentType</code> object. The
+ * <code>DocumentType</code> interface in the DOM Core provides an interface
+ * to the list of entities that are defined for the document, and little
+ * else because the effect of namespaces and the various XML schema efforts
+ * on DTD representation are not clearly understood as of this writing.
+ * <p>The DOM Level 2 doesn't support editing <code>DocumentType</code> nodes.
+ * <p>See also the <a href='http://www.w3.org/TR/2000/REC-DOM-Level-2-Core-20001113'>Document Object Model (DOM) Level 2 Core Specification</a>.
+ */
+public interface DocumentType extends Node {
+ /**
+ * The name of DTD; i.e., the name immediately following the
+ * <code>DOCTYPE</code> keyword.
+ */
+ public String getName();
+
+ /**
+ * A <code>NamedNodeMap</code> containing the general entities, both
+ * external and internal, declared in the DTD. Parameter entities are
+ * not contained. Duplicates are discarded. For example in:
+ * <pre>&lt;!DOCTYPE
+ * ex SYSTEM "ex.dtd" [ &lt;!ENTITY foo "foo"&gt; &lt;!ENTITY bar
+ * "bar"&gt; &lt;!ENTITY bar "bar2"&gt; &lt;!ENTITY % baz "baz"&gt;
+ * ]&gt; &lt;ex/&gt;</pre>
+ * the interface provides access to <code>foo</code>
+ * and the first declaration of <code>bar</code> but not the second
+ * declaration of <code>bar</code> or <code>baz</code>. Every node in
+ * this map also implements the <code>Entity</code> interface.
+ * <br>The DOM Level 2 does not support editing entities, therefore
+ * <code>entities</code> cannot be altered in any way.
+ */
+ public NamedNodeMap getEntities();
+
+ /**
+ * A <code>NamedNodeMap</code> containing the notations declared in the
+ * DTD. Duplicates are discarded. Every node in this map also implements
+ * the <code>Notation</code> interface.
+ * <br>The DOM Level 2 does not support editing notations, therefore
+ * <code>notations</code> cannot be altered in any way.
+ */
+ public NamedNodeMap getNotations();
+
+ /**
+ * The public identifier of the external subset.
+ * @since DOM Level 2
+ */
+ public String getPublicId();
+
+ /**
+ * The system identifier of the external subset.
+ * @since DOM Level 2
+ */
+ public String getSystemId();
+
+ /**
+ * The internal subset as a string, or <code>null</code> if there is none.
+ * This is does not contain the delimiting square brackets.The actual
+ * content returned depends on how much information is available to the
+ * implementation. This may vary depending on various parameters,
+ * including the XML processor used to build the document.
+ * @since DOM Level 2
+ */
+ public String getInternalSubset();
+
+}
diff --git a/external/jaxp/source/org/w3c/dom/Element.java b/external/jaxp/source/org/w3c/dom/Element.java
new file mode 100755
index 000000000..614ca8784
--- /dev/null
+++ b/external/jaxp/source/org/w3c/dom/Element.java
@@ -0,0 +1,322 @@
+/*
+ * Copyright (c) 2000 World Wide Web Consortium,
+ * (Massachusetts Institute of Technology, Institut National de
+ * Recherche en Informatique et en Automatique, Keio University). All
+ * Rights Reserved. This program is distributed under the W3C's Software
+ * Intellectual Property License. This program is distributed in the
+ * hope that it will be useful, but WITHOUT ANY WARRANTY; without even
+ * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+ * PURPOSE.
+ * See W3C License http://www.w3.org/Consortium/Legal/ for more details.
+ */
+
+package org.w3c.dom;
+
+/**
+ * The <code>Element</code> interface represents an element in an HTML or XML
+ * document. Elements may have attributes associated with them; since the
+ * <code>Element</code> interface inherits from <code>Node</code>, the
+ * generic <code>Node</code> interface attribute <code>attributes</code> may
+ * be used to retrieve the set of all attributes for an element. There are
+ * methods on the <code>Element</code> interface to retrieve either an
+ * <code>Attr</code> object by name or an attribute value by name. In XML,
+ * where an attribute value may contain entity references, an
+ * <code>Attr</code> object should be retrieved to examine the possibly
+ * fairly complex sub-tree representing the attribute value. On the other
+ * hand, in HTML, where all attributes have simple string values, methods to
+ * directly access an attribute value can safely be used as a convenience.In
+ * DOM Level 2, the method <code>normalize</code> is inherited from the
+ * <code>Node</code> interface where it was moved.
+ * <p>See also the <a href='http://www.w3.org/TR/2000/REC-DOM-Level-2-Core-20001113'>Document Object Model (DOM) Level 2 Core Specification</a>.
+ */
+public interface Element extends Node {
+ /**
+ * The name of the element. For example, in:
+ * <pre> &lt;elementExample
+ * id="demo"&gt; ... &lt;/elementExample&gt; , </pre>
+ * <code>tagName</code> has
+ * the value <code>"elementExample"</code>. Note that this is
+ * case-preserving in XML, as are all of the operations of the DOM. The
+ * HTML DOM returns the <code>tagName</code> of an HTML element in the
+ * canonical uppercase form, regardless of the case in the source HTML
+ * document.
+ */
+ public String getTagName();
+
+ /**
+ * Retrieves an attribute value by name.
+ * @param name The name of the attribute to retrieve.
+ * @return The <code>Attr</code> value as a string, or the empty string
+ * if that attribute does not have a specified or default value.
+ */
+ public String getAttribute(String name);
+
+ /**
+ * Adds a new attribute. If an attribute with that name is already present
+ * in the element, its value is changed to be that of the value
+ * parameter. This value is a simple string; it is not parsed as it is
+ * being set. So any markup (such as syntax to be recognized as an
+ * entity reference) is treated as literal text, and needs to be
+ * appropriately escaped by the implementation when it is written out.
+ * In order to assign an attribute value that contains entity
+ * references, the user must create an <code>Attr</code> node plus any
+ * <code>Text</code> and <code>EntityReference</code> nodes, build the
+ * appropriate subtree, and use <code>setAttributeNode</code> to assign
+ * it as the value of an attribute.
+ * <br>To set an attribute with a qualified name and namespace URI, use
+ * the <code>setAttributeNS</code> method.
+ * @param name The name of the attribute to create or alter.
+ * @param value Value to set in string form.
+ * @exception DOMException
+ * INVALID_CHARACTER_ERR: Raised if the specified name contains an
+ * illegal character.
+ * <br>NO_MODIFICATION_ALLOWED_ERR: Raised if this node is readonly.
+ */
+ public void setAttribute(String name,
+ String value)
+ throws DOMException;
+
+ /**
+ * Removes an attribute by name. If the removed attribute is known to have
+ * a default value, an attribute immediately appears containing the
+ * default value as well as the corresponding namespace URI, local name,
+ * and prefix when applicable.
+ * <br>To remove an attribute by local name and namespace URI, use the
+ * <code>removeAttributeNS</code> method.
+ * @param name The name of the attribute to remove.
+ * @exception DOMException
+ * NO_MODIFICATION_ALLOWED_ERR: Raised if this node is readonly.
+ */
+ public void removeAttribute(String name)
+ throws DOMException;
+
+ /**
+ * Retrieves an attribute node by name.
+ * <br>To retrieve an attribute node by qualified name and namespace URI,
+ * use the <code>getAttributeNodeNS</code> method.
+ * @param name The name (<code>nodeName</code>) of the attribute to
+ * retrieve.
+ * @return The <code>Attr</code> node with the specified name (
+ * <code>nodeName</code>) or <code>null</code> if there is no such
+ * attribute.
+ */
+ public Attr getAttributeNode(String name);
+
+ /**
+ * Adds a new attribute node. If an attribute with that name (
+ * <code>nodeName</code>) is already present in the element, it is
+ * replaced by the new one.
+ * <br>To add a new attribute node with a qualified name and namespace
+ * URI, use the <code>setAttributeNodeNS</code> method.
+ * @param newAttr The <code>Attr</code> node to add to the attribute list.
+ * @return If the <code>newAttr</code> attribute replaces an existing
+ * attribute, the replaced <code>Attr</code> node is returned,
+ * otherwise <code>null</code> is returned.
+ * @exception DOMException
+ * WRONG_DOCUMENT_ERR: Raised if <code>newAttr</code> was created from a
+ * different document than the one that created the element.
+ * <br>NO_MODIFICATION_ALLOWED_ERR: Raised if this node is readonly.
+ * <br>INUSE_ATTRIBUTE_ERR: Raised if <code>newAttr</code> is already an
+ * attribute of another <code>Element</code> object. The DOM user must
+ * explicitly clone <code>Attr</code> nodes to re-use them in other
+ * elements.
+ */
+ public Attr setAttributeNode(Attr newAttr)
+ throws DOMException;
+
+ /**
+ * Removes the specified attribute node. If the removed <code>Attr</code>
+ * has a default value it is immediately replaced. The replacing
+ * attribute has the same namespace URI and local name, as well as the
+ * original prefix, when applicable.
+ * @param oldAttr The <code>Attr</code> node to remove from the attribute
+ * list.
+ * @return The <code>Attr</code> node that was removed.
+ * @exception DOMException
+ * NO_MODIFICATION_ALLOWED_ERR: Raised if this node is readonly.
+ * <br>NOT_FOUND_ERR: Raised if <code>oldAttr</code> is not an attribute
+ * of the element.
+ */
+ public Attr removeAttributeNode(Attr oldAttr)
+ throws DOMException;
+
+ /**
+ * Returns a <code>NodeList</code> of all descendant <code>Elements</code>
+ * with a given tag name, in the order in which they are encountered in
+ * a preorder traversal of this <code>Element</code> tree.
+ * @param name The name of the tag to match on. The special value "*"
+ * matches all tags.
+ * @return A list of matching <code>Element</code> nodes.
+ */
+ public NodeList getElementsByTagName(String name);
+
+ /**
+ * Retrieves an attribute value by local name and namespace URI.
+ * <br>Documents which do not support the "XML" feature will permit only
+ * the DOM Level 1 calls for creating/setting elements and attributes.
+ * Hence, if you specify a non-null namespace URI, these DOMs will never
+ * find a matching node.
+ * @param namespaceURI The namespace URI of the attribute to retrieve.
+ * @param localName The local name of the attribute to retrieve.
+ * @return The <code>Attr</code> value as a string, or the empty string
+ * if that attribute does not have a specified or default value.
+ * @since DOM Level 2
+ */
+ public String getAttributeNS(String namespaceURI,
+ String localName);
+
+ /**
+ * Adds a new attribute. If an attribute with the same local name and
+ * namespace URI is already present on the element, its prefix is
+ * changed to be the prefix part of the <code>qualifiedName</code>, and
+ * its value is changed to be the <code>value</code> parameter. This
+ * value is a simple string; it is not parsed as it is being set. So any
+ * markup (such as syntax to be recognized as an entity reference) is
+ * treated as literal text, and needs to be appropriately escaped by the
+ * implementation when it is written out. In order to assign an
+ * attribute value that contains entity references, the user must create
+ * an <code>Attr</code> node plus any <code>Text</code> and
+ * <code>EntityReference</code> nodes, build the appropriate subtree,
+ * and use <code>setAttributeNodeNS</code> or
+ * <code>setAttributeNode</code> to assign it as the value of an
+ * attribute.
+ * @param namespaceURI The namespace URI of the attribute to create or
+ * alter.
+ * @param qualifiedName The qualified name of the attribute to create or
+ * alter.
+ * @param value The value to set in string form.
+ * @exception DOMException
+ * INVALID_CHARACTER_ERR: Raised if the specified qualified name
+ * contains an illegal character, per the XML 1.0 specification .
+ * <br>NO_MODIFICATION_ALLOWED_ERR: Raised if this node is readonly.
+ * <br>NAMESPACE_ERR: Raised if the <code>qualifiedName</code> is
+ * malformed per the Namespaces in XML specification, if the
+ * <code>qualifiedName</code> has a prefix and the
+ * <code>namespaceURI</code> is <code>null</code>, if the
+ * <code>qualifiedName</code> has a prefix that is "xml" and the
+ * <code>namespaceURI</code> is different from "
+ * http://www.w3.org/XML/1998/namespace", or if the
+ * <code>qualifiedName</code>, or its prefix, is "xmlns" and the
+ * <code>namespaceURI</code> is different from "
+ * http://www.w3.org/2000/xmlns/".
+ * <br>NOT_SUPPORTED_ERR: Always thrown if the current document does not
+ * support the <code>"XML"</code> feature, since namespaces were
+ * defined by XML.
+ * @since DOM Level 2
+ */
+ public void setAttributeNS(String namespaceURI,
+ String qualifiedName,
+ String value)
+ throws DOMException;
+
+ /**
+ * Removes an attribute by local name and namespace URI. If the removed
+ * attribute has a default value it is immediately replaced. The
+ * replacing attribute has the same namespace URI and local name, as
+ * well as the original prefix.
+ * <br>Documents which do not support the "XML" feature will permit only
+ * the DOM Level 1 calls for creating/setting elements and attributes.
+ * Hence, if you specify a non-null namespace URI, these DOMs will never
+ * find a matching node.
+ * @param namespaceURI The namespace URI of the attribute to remove.
+ * @param localName The local name of the attribute to remove.
+ * @exception DOMException
+ * NO_MODIFICATION_ALLOWED_ERR: Raised if this node is readonly.
+ * @since DOM Level 2
+ */
+ public void removeAttributeNS(String namespaceURI,
+ String localName)
+ throws DOMException;
+
+ /**
+ * Retrieves an <code>Attr</code> node by local name and namespace URI.
+ * <br>Documents which do not support the "XML" feature will permit only
+ * the DOM Level 1 calls for creating/setting elements and attributes.
+ * Hence, if you specify a non-null namespace URI, these DOMs will never
+ * find a matching node.
+ * @param namespaceURI The namespace URI of the attribute to retrieve.
+ * @param localName The local name of the attribute to retrieve.
+ * @return The <code>Attr</code> node with the specified attribute local
+ * name and namespace URI or <code>null</code> if there is no such
+ * attribute.
+ * @since DOM Level 2
+ */
+ public Attr getAttributeNodeNS(String namespaceURI,
+ String localName);
+
+ /**
+ * Adds a new attribute. If an attribute with that local name and that
+ * namespace URI is already present in the element, it is replaced by
+ * the new one.
+ * @param newAttr The <code>Attr</code> node to add to the attribute list.
+ * @return If the <code>newAttr</code> attribute replaces an existing
+ * attribute with the same local name and namespace URI, the replaced
+ * <code>Attr</code> node is returned, otherwise <code>null</code> is
+ * returned.
+ * @exception DOMException
+ * WRONG_DOCUMENT_ERR: Raised if <code>newAttr</code> was created from a
+ * different document than the one that created the element.
+ * <br>NO_MODIFICATION_ALLOWED_ERR: Raised if this node is readonly.
+ * <br>INUSE_ATTRIBUTE_ERR: Raised if <code>newAttr</code> is already an
+ * attribute of another <code>Element</code> object. The DOM user must
+ * explicitly clone <code>Attr</code> nodes to re-use them in other
+ * elements.
+ * <br>NOT_SUPPORTED_ERR: Always thrown if the current document does not
+ * support the <code>"XML"</code> feature, since namespaces were
+ * defined by XML.
+ * @since DOM Level 2
+ */
+ public Attr setAttributeNodeNS(Attr newAttr)
+ throws DOMException;
+
+ /**
+ * Returns a <code>NodeList</code> of all the descendant
+ * <code>Elements</code> with a given local name and namespace URI in
+ * the order in which they are encountered in a preorder traversal of
+ * this <code>Element</code> tree.
+ * <br>Documents which do not support the "XML" feature will permit only
+ * the DOM Level 1 calls for creating/setting elements and attributes.
+ * Hence, if you specify a non-null namespace URI, these DOMs will never
+ * find a matching node.
+ * @param namespaceURI The namespace URI of the elements to match on. The
+ * special value "*" matches all namespaces.
+ * @param localName The local name of the elements to match on. The
+ * special value "*" matches all local names.
+ * @return A new <code>NodeList</code> object containing all the matched
+ * <code>Elements</code>.
+ * @since DOM Level 2
+ */
+ public NodeList getElementsByTagNameNS(String namespaceURI,
+ String localName);
+
+ /**
+ * Returns <code>true</code> when an attribute with a given name is
+ * specified on this element or has a default value, <code>false</code>
+ * otherwise.
+ * @param name The name of the attribute to look for.
+ * @return <code>true</code> if an attribute with the given name is
+ * specified on this element or has a default value, <code>false</code>
+ * otherwise.
+ * @since DOM Level 2
+ */
+ public boolean hasAttribute(String name);
+
+ /**
+ * Returns <code>true</code> when an attribute with a given local name and
+ * namespace URI is specified on this element or has a default value,
+ * <code>false</code> otherwise.
+ * <br>Documents which do not support the "XML" feature will permit only
+ * the DOM Level 1 calls for creating/setting elements and attributes.
+ * Hence, if you specify a non-null namespace URI, these DOMs will never
+ * find a matching node.
+ * @param namespaceURI The namespace URI of the attribute to look for.
+ * @param localName The local name of the attribute to look for.
+ * @return <code>true</code> if an attribute with the given local name
+ * and namespace URI is specified or has a default value on this
+ * element, <code>false</code> otherwise.
+ * @since DOM Level 2
+ */
+ public boolean hasAttributeNS(String namespaceURI,
+ String localName);
+
+}
diff --git a/external/jaxp/source/org/w3c/dom/Entity.java b/external/jaxp/source/org/w3c/dom/Entity.java
new file mode 100755
index 000000000..11bd0dfd6
--- /dev/null
+++ b/external/jaxp/source/org/w3c/dom/Entity.java
@@ -0,0 +1,68 @@
+/*
+ * Copyright (c) 2000 World Wide Web Consortium,
+ * (Massachusetts Institute of Technology, Institut National de
+ * Recherche en Informatique et en Automatique, Keio University). All
+ * Rights Reserved. This program is distributed under the W3C's Software
+ * Intellectual Property License. This program is distributed in the
+ * hope that it will be useful, but WITHOUT ANY WARRANTY; without even
+ * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+ * PURPOSE.
+ * See W3C License http://www.w3.org/Consortium/Legal/ for more details.
+ */
+
+package org.w3c.dom;
+
+/**
+ * This interface represents an entity, either parsed or unparsed, in an XML
+ * document. Note that this models the entity itself not the entity
+ * declaration. <code>Entity</code> declaration modeling has been left for a
+ * later Level of the DOM specification.
+ * <p>The <code>nodeName</code> attribute that is inherited from
+ * <code>Node</code> contains the name of the entity.
+ * <p>An XML processor may choose to completely expand entities before the
+ * structure model is passed to the DOM; in this case there will be no
+ * <code>EntityReference</code> nodes in the document tree.
+ * <p>XML does not mandate that a non-validating XML processor read and
+ * process entity declarations made in the external subset or declared in
+ * external parameter entities. This means that parsed entities declared in
+ * the external subset need not be expanded by some classes of applications,
+ * and that the replacement value of the entity may not be available. When
+ * the replacement value is available, the corresponding <code>Entity</code>
+ * node's child list represents the structure of that replacement text.
+ * Otherwise, the child list is empty.
+ * <p>The DOM Level 2 does not support editing <code>Entity</code> nodes; if a
+ * user wants to make changes to the contents of an <code>Entity</code>,
+ * every related <code>EntityReference</code> node has to be replaced in the
+ * structure model by a clone of the <code>Entity</code>'s contents, and
+ * then the desired changes must be made to each of those clones instead.
+ * <code>Entity</code> nodes and all their descendants are readonly.
+ * <p>An <code>Entity</code> node does not have any parent.If the entity
+ * contains an unbound namespace prefix, the <code>namespaceURI</code> of
+ * the corresponding node in the <code>Entity</code> node subtree is
+ * <code>null</code>. The same is true for <code>EntityReference</code>
+ * nodes that refer to this entity, when they are created using the
+ * <code>createEntityReference</code> method of the <code>Document</code>
+ * interface. The DOM Level 2 does not support any mechanism to resolve
+ * namespace prefixes.
+ * <p>See also the <a href='http://www.w3.org/TR/2000/REC-DOM-Level-2-Core-20001113'>Document Object Model (DOM) Level 2 Core Specification</a>.
+ */
+public interface Entity extends Node {
+ /**
+ * The public identifier associated with the entity, if specified. If the
+ * public identifier was not specified, this is <code>null</code>.
+ */
+ public String getPublicId();
+
+ /**
+ * The system identifier associated with the entity, if specified. If the
+ * system identifier was not specified, this is <code>null</code>.
+ */
+ public String getSystemId();
+
+ /**
+ * For unparsed entities, the name of the notation for the entity. For
+ * parsed entities, this is <code>null</code>.
+ */
+ public String getNotationName();
+
+}
diff --git a/external/jaxp/source/org/w3c/dom/EntityReference.java b/external/jaxp/source/org/w3c/dom/EntityReference.java
new file mode 100755
index 000000000..ff3cf9d9f
--- /dev/null
+++ b/external/jaxp/source/org/w3c/dom/EntityReference.java
@@ -0,0 +1,39 @@
+/*
+ * Copyright (c) 2000 World Wide Web Consortium,
+ * (Massachusetts Institute of Technology, Institut National de
+ * Recherche en Informatique et en Automatique, Keio University). All
+ * Rights Reserved. This program is distributed under the W3C's Software
+ * Intellectual Property License. This program is distributed in the
+ * hope that it will be useful, but WITHOUT ANY WARRANTY; without even
+ * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+ * PURPOSE.
+ * See W3C License http://www.w3.org/Consortium/Legal/ for more details.
+ */
+
+package org.w3c.dom;
+
+/**
+ * <code>EntityReference</code> objects may be inserted into the structure
+ * model when an entity reference is in the source document, or when the
+ * user wishes to insert an entity reference. Note that character references
+ * and references to predefined entities are considered to be expanded by
+ * the HTML or XML processor so that characters are represented by their
+ * Unicode equivalent rather than by an entity reference. Moreover, the XML
+ * processor may completely expand references to entities while building the
+ * structure model, instead of providing <code>EntityReference</code>
+ * objects. If it does provide such objects, then for a given
+ * <code>EntityReference</code> node, it may be that there is no
+ * <code>Entity</code> node representing the referenced entity. If such an
+ * <code>Entity</code> exists, then the subtree of the
+ * <code>EntityReference</code> node is in general a copy of the
+ * <code>Entity</code> node subtree. However, this may not be true when an
+ * entity contains an unbound namespace prefix. In such a case, because the
+ * namespace prefix resolution depends on where the entity reference is, the
+ * descendants of the <code>EntityReference</code> node may be bound to
+ * different namespace URIs.
+ * <p>As for <code>Entity</code> nodes, <code>EntityReference</code> nodes and
+ * all their descendants are readonly.
+ * <p>See also the <a href='http://www.w3.org/TR/2000/REC-DOM-Level-2-Core-20001113'>Document Object Model (DOM) Level 2 Core Specification</a>.
+ */
+public interface EntityReference extends Node {
+}
diff --git a/external/jaxp/source/org/w3c/dom/NamedNodeMap.java b/external/jaxp/source/org/w3c/dom/NamedNodeMap.java
new file mode 100755
index 000000000..843736679
--- /dev/null
+++ b/external/jaxp/source/org/w3c/dom/NamedNodeMap.java
@@ -0,0 +1,174 @@
+/*
+ * Copyright (c) 2000 World Wide Web Consortium,
+ * (Massachusetts Institute of Technology, Institut National de
+ * Recherche en Informatique et en Automatique, Keio University). All
+ * Rights Reserved. This program is distributed under the W3C's Software
+ * Intellectual Property License. This program is distributed in the
+ * hope that it will be useful, but WITHOUT ANY WARRANTY; without even
+ * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+ * PURPOSE.
+ * See W3C License http://www.w3.org/Consortium/Legal/ for more details.
+ */
+
+package org.w3c.dom;
+
+/**
+ * Objects implementing the <code>NamedNodeMap</code> interface are used to
+ * represent collections of nodes that can be accessed by name. Note that
+ * <code>NamedNodeMap</code> does not inherit from <code>NodeList</code>;
+ * <code>NamedNodeMaps</code> are not maintained in any particular order.
+ * Objects contained in an object implementing <code>NamedNodeMap</code> may
+ * also be accessed by an ordinal index, but this is simply to allow
+ * convenient enumeration of the contents of a <code>NamedNodeMap</code>,
+ * and does not imply that the DOM specifies an order to these Nodes.
+ * <p><code>NamedNodeMap</code> objects in the DOM are live.
+ * <p>See also the <a href='http://www.w3.org/TR/2000/REC-DOM-Level-2-Core-20001113'>Document Object Model (DOM) Level 2 Core Specification</a>.
+ */
+public interface NamedNodeMap {
+ /**
+ * Retrieves a node specified by name.
+ * @param name The <code>nodeName</code> of a node to retrieve.
+ * @return A <code>Node</code> (of any type) with the specified
+ * <code>nodeName</code>, or <code>null</code> if it does not identify
+ * any node in this map.
+ */
+ public Node getNamedItem(String name);
+
+ /**
+ * Adds a node using its <code>nodeName</code> attribute. If a node with
+ * that name is already present in this map, it is replaced by the new
+ * one.
+ * <br>As the <code>nodeName</code> attribute is used to derive the name
+ * which the node must be stored under, multiple nodes of certain types
+ * (those that have a "special" string value) cannot be stored as the
+ * names would clash. This is seen as preferable to allowing nodes to be
+ * aliased.
+ * @param arg A node to store in this map. The node will later be
+ * accessible using the value of its <code>nodeName</code> attribute.
+ * @return If the new <code>Node</code> replaces an existing node the
+ * replaced <code>Node</code> is returned, otherwise <code>null</code>
+ * is returned.
+ * @exception DOMException
+ * WRONG_DOCUMENT_ERR: Raised if <code>arg</code> was created from a
+ * different document than the one that created this map.
+ * <br>NO_MODIFICATION_ALLOWED_ERR: Raised if this map is readonly.
+ * <br>INUSE_ATTRIBUTE_ERR: Raised if <code>arg</code> is an
+ * <code>Attr</code> that is already an attribute of another
+ * <code>Element</code> object. The DOM user must explicitly clone
+ * <code>Attr</code> nodes to re-use them in other elements.
+ * <br>HIERARCHY_REQUEST_ERR: Raised if an attempt is made to add a node
+ * doesn't belong in this NamedNodeMap. Examples would include trying
+ * to insert something other than an Attr node into an Element's map
+ * of attributes, or a non-Entity node into the DocumentType's map of
+ * Entities.
+ */
+ public Node setNamedItem(Node arg)
+ throws DOMException;
+
+ /**
+ * Removes a node specified by name. When this map contains the attributes
+ * attached to an element, if the removed attribute is known to have a
+ * default value, an attribute immediately appears containing the
+ * default value as well as the corresponding namespace URI, local name,
+ * and prefix when applicable.
+ * @param name The <code>nodeName</code> of the node to remove.
+ * @return The node removed from this map if a node with such a name
+ * exists.
+ * @exception DOMException
+ * NOT_FOUND_ERR: Raised if there is no node named <code>name</code> in
+ * this map.
+ * <br>NO_MODIFICATION_ALLOWED_ERR: Raised if this map is readonly.
+ */
+ public Node removeNamedItem(String name)
+ throws DOMException;
+
+ /**
+ * Returns the <code>index</code>th item in the map. If <code>index</code>
+ * is greater than or equal to the number of nodes in this map, this
+ * returns <code>null</code>.
+ * @param index Index into this map.
+ * @return The node at the <code>index</code>th position in the map, or
+ * <code>null</code> if that is not a valid index.
+ */
+ public Node item(int index);
+
+ /**
+ * The number of nodes in this map. The range of valid child node indices
+ * is <code>0</code> to <code>length-1</code> inclusive.
+ */
+ public int getLength();
+
+ /**
+ * Retrieves a node specified by local name and namespace URI.
+ * <br>Documents which do not support the "XML" feature will permit only
+ * the DOM Level 1 calls for creating/setting elements and attributes.
+ * Hence, if you specify a non-null namespace URI, these DOMs will never
+ * find a matching node.
+ * @param namespaceURI The namespace URI of the node to retrieve.
+ * @param localName The local name of the node to retrieve.
+ * @return A <code>Node</code> (of any type) with the specified local
+ * name and namespace URI, or <code>null</code> if they do not
+ * identify any node in this map.
+ * @since DOM Level 2
+ */
+ public Node getNamedItemNS(String namespaceURI,
+ String localName);
+
+ /**
+ * Adds a node using its <code>namespaceURI</code> and
+ * <code>localName</code>. If a node with that namespace URI and that
+ * local name is already present in this map, it is replaced by the new
+ * one.
+ * @param arg A node to store in this map. The node will later be
+ * accessible using the value of its <code>namespaceURI</code> and
+ * <code>localName</code> attributes.
+ * @return If the new <code>Node</code> replaces an existing node the
+ * replaced <code>Node</code> is returned, otherwise <code>null</code>
+ * is returned.
+ * @exception DOMException
+ * WRONG_DOCUMENT_ERR: Raised if <code>arg</code> was created from a
+ * different document than the one that created this map.
+ * <br>NO_MODIFICATION_ALLOWED_ERR: Raised if this map is readonly.
+ * <br>INUSE_ATTRIBUTE_ERR: Raised if <code>arg</code> is an
+ * <code>Attr</code> that is already an attribute of another
+ * <code>Element</code> object. The DOM user must explicitly clone
+ * <code>Attr</code> nodes to re-use them in other elements.
+ * <br>HIERARCHY_REQUEST_ERR: Raised if an attempt is made to add a node
+ * doesn't belong in this NamedNodeMap. Examples would include trying
+ * to insert something other than an Attr node into an Element's map
+ * of attributes, or a non-Entity node into the DocumentType's map of
+ * Entities.
+ * <br>NOT_SUPPORTED_ERR: Always thrown if the current document does not
+ * support the <code>"XML"</code> feature, since namespaces were
+ * defined by XML.
+ * @since DOM Level 2
+ */
+ public Node setNamedItemNS(Node arg)
+ throws DOMException;
+
+ /**
+ * Removes a node specified by local name and namespace URI. A removed
+ * attribute may be known to have a default value when this map contains
+ * the attributes attached to an element, as returned by the attributes
+ * attribute of the <code>Node</code> interface. If so, an attribute
+ * immediately appears containing the default value as well as the
+ * corresponding namespace URI, local name, and prefix when applicable.
+ * <br>Documents which do not support the "XML" feature will permit only
+ * the DOM Level 1 calls for creating/setting elements and attributes.
+ * Hence, if you specify a non-null namespace URI, these DOMs will never
+ * find a matching node.
+ * @param namespaceURI The namespace URI of the node to remove.
+ * @param localName The local name of the node to remove.
+ * @return The node removed from this map if a node with such a local
+ * name and namespace URI exists.
+ * @exception DOMException
+ * NOT_FOUND_ERR: Raised if there is no node with the specified
+ * <code>namespaceURI</code> and <code>localName</code> in this map.
+ * <br>NO_MODIFICATION_ALLOWED_ERR: Raised if this map is readonly.
+ * @since DOM Level 2
+ */
+ public Node removeNamedItemNS(String namespaceURI,
+ String localName)
+ throws DOMException;
+
+}
diff --git a/external/jaxp/source/org/w3c/dom/Node.java b/external/jaxp/source/org/w3c/dom/Node.java
new file mode 100755
index 000000000..56ed30a57
--- /dev/null
+++ b/external/jaxp/source/org/w3c/dom/Node.java
@@ -0,0 +1,526 @@
+/*
+ * Copyright (c) 2000 World Wide Web Consortium,
+ * (Massachusetts Institute of Technology, Institut National de
+ * Recherche en Informatique et en Automatique, Keio University). All
+ * Rights Reserved. This program is distributed under the W3C's Software
+ * Intellectual Property License. This program is distributed in the
+ * hope that it will be useful, but WITHOUT ANY WARRANTY; without even
+ * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+ * PURPOSE.
+ * See W3C License http://www.w3.org/Consortium/Legal/ for more details.
+ */
+
+package org.w3c.dom;
+
+/**
+ * The <code>Node</code> interface is the primary datatype for the entire
+ * Document Object Model. It represents a single node in the document tree.
+ * While all objects implementing the <code>Node</code> interface expose
+ * methods for dealing with children, not all objects implementing the
+ * <code>Node</code> interface may have children. For example,
+ * <code>Text</code> nodes may not have children, and adding children to
+ * such nodes results in a <code>DOMException</code> being raised.
+ * <p>The attributes <code>nodeName</code>, <code>nodeValue</code> and
+ * <code>attributes</code> are included as a mechanism to get at node
+ * information without casting down to the specific derived interface. In
+ * cases where there is no obvious mapping of these attributes for a
+ * specific <code>nodeType</code> (e.g., <code>nodeValue</code> for an
+ * <code>Element</code> or <code>attributes</code> for a <code>Comment</code>
+ * ), this returns <code>null</code>. Note that the specialized interfaces
+ * may contain additional and more convenient mechanisms to get and set the
+ * relevant information.
+ * <p>The values of <code>nodeName</code>,
+ * <code>nodeValue</code>, and <code>attributes</code> vary according to the
+ * node type as follows:
+ * <table border='1'>
+ * <tr>
+ * <th>Interface</th>
+ * <th>nodeName</th>
+ * <th>nodeValue</th>
+ * <th>attributes</th>
+ * </tr>
+ * <tr>
+ * <td valign='top' rowspan='1' colspan='1'>Attr</td>
+ * <td valign='top' rowspan='1' colspan='1'>name of
+ * attribute</td>
+ * <td valign='top' rowspan='1' colspan='1'>value of attribute</td>
+ * <td valign='top' rowspan='1' colspan='1'>null</td>
+ * </tr>
+ * <tr>
+ * <td valign='top' rowspan='1' colspan='1'>CDATASection</td>
+ * <td valign='top' rowspan='1' colspan='1'><code>"#cdata-section"</code></td>
+ * <td valign='top' rowspan='1' colspan='1'>
+ * content of the CDATA Section</td>
+ * <td valign='top' rowspan='1' colspan='1'>null</td>
+ * </tr>
+ * <tr>
+ * <td valign='top' rowspan='1' colspan='1'>Comment</td>
+ * <td valign='top' rowspan='1' colspan='1'><code>"#comment"</code></td>
+ * <td valign='top' rowspan='1' colspan='1'>content of
+ * the comment</td>
+ * <td valign='top' rowspan='1' colspan='1'>null</td>
+ * </tr>
+ * <tr>
+ * <td valign='top' rowspan='1' colspan='1'>Document</td>
+ * <td valign='top' rowspan='1' colspan='1'><code>"#document"</code></td>
+ * <td valign='top' rowspan='1' colspan='1'>null</td>
+ * <td valign='top' rowspan='1' colspan='1'>null</td>
+ * </tr>
+ * <tr>
+ * <td valign='top' rowspan='1' colspan='1'>DocumentFragment</td>
+ * <td valign='top' rowspan='1' colspan='1'>
+ * <code>"#document-fragment"</code></td>
+ * <td valign='top' rowspan='1' colspan='1'>null</td>
+ * <td valign='top' rowspan='1' colspan='1'>null</td>
+ * </tr>
+ * <tr>
+ * <td valign='top' rowspan='1' colspan='1'>DocumentType</td>
+ * <td valign='top' rowspan='1' colspan='1'>document type name</td>
+ * <td valign='top' rowspan='1' colspan='1'>
+ * null</td>
+ * <td valign='top' rowspan='1' colspan='1'>null</td>
+ * </tr>
+ * <tr>
+ * <td valign='top' rowspan='1' colspan='1'>Element</td>
+ * <td valign='top' rowspan='1' colspan='1'>tag name</td>
+ * <td valign='top' rowspan='1' colspan='1'>null</td>
+ * <td valign='top' rowspan='1' colspan='1'>NamedNodeMap</td>
+ * </tr>
+ * <tr>
+ * <td valign='top' rowspan='1' colspan='1'>Entity</td>
+ * <td valign='top' rowspan='1' colspan='1'>entity name</td>
+ * <td valign='top' rowspan='1' colspan='1'>null</td>
+ * <td valign='top' rowspan='1' colspan='1'>null</td>
+ * </tr>
+ * <tr>
+ * <td valign='top' rowspan='1' colspan='1'>
+ * EntityReference</td>
+ * <td valign='top' rowspan='1' colspan='1'>name of entity referenced</td>
+ * <td valign='top' rowspan='1' colspan='1'>null</td>
+ * <td valign='top' rowspan='1' colspan='1'>null</td>
+ * </tr>
+ * <tr>
+ * <td valign='top' rowspan='1' colspan='1'>Notation</td>
+ * <td valign='top' rowspan='1' colspan='1'>notation name</td>
+ * <td valign='top' rowspan='1' colspan='1'>null</td>
+ * <td valign='top' rowspan='1' colspan='1'>
+ * null</td>
+ * </tr>
+ * <tr>
+ * <td valign='top' rowspan='1' colspan='1'>ProcessingInstruction</td>
+ * <td valign='top' rowspan='1' colspan='1'>target</td>
+ * <td valign='top' rowspan='1' colspan='1'>entire content excluding the target</td>
+ * <td valign='top' rowspan='1' colspan='1'>null</td>
+ * </tr>
+ * <tr>
+ * <td valign='top' rowspan='1' colspan='1'>Text</td>
+ * <td valign='top' rowspan='1' colspan='1'>
+ * <code>"#text"</code></td>
+ * <td valign='top' rowspan='1' colspan='1'>content of the text node</td>
+ * <td valign='top' rowspan='1' colspan='1'>null</td>
+ * </tr>
+ * </table>
+ * <p>See also the <a href='http://www.w3.org/TR/2000/REC-DOM-Level-2-Core-20001113'>Document Object Model (DOM) Level 2 Core Specification</a>.
+ */
+public interface Node {
+ // NodeType
+ /**
+ * The node is an <code>Element</code>.
+ */
+ public static final short ELEMENT_NODE = 1;
+ /**
+ * The node is an <code>Attr</code>.
+ */
+ public static final short ATTRIBUTE_NODE = 2;
+ /**
+ * The node is a <code>Text</code> node.
+ */
+ public static final short TEXT_NODE = 3;
+ /**
+ * The node is a <code>CDATASection</code>.
+ */
+ public static final short CDATA_SECTION_NODE = 4;
+ /**
+ * The node is an <code>EntityReference</code>.
+ */
+ public static final short ENTITY_REFERENCE_NODE = 5;
+ /**
+ * The node is an <code>Entity</code>.
+ */
+ public static final short ENTITY_NODE = 6;
+ /**
+ * The node is a <code>ProcessingInstruction</code>.
+ */
+ public static final short PROCESSING_INSTRUCTION_NODE = 7;
+ /**
+ * The node is a <code>Comment</code>.
+ */
+ public static final short COMMENT_NODE = 8;
+ /**
+ * The node is a <code>Document</code>.
+ */
+ public static final short DOCUMENT_NODE = 9;
+ /**
+ * The node is a <code>DocumentType</code>.
+ */
+ public static final short DOCUMENT_TYPE_NODE = 10;
+ /**
+ * The node is a <code>DocumentFragment</code>.
+ */
+ public static final short DOCUMENT_FRAGMENT_NODE = 11;
+ /**
+ * The node is a <code>Notation</code>.
+ */
+ public static final short NOTATION_NODE = 12;
+
+ /**
+ * The name of this node, depending on its type; see the table above.
+ */
+ public String getNodeName();
+
+ /**
+ * The value of this node, depending on its type; see the table above.
+ * When it is defined to be <code>null</code>, setting it has no effect.
+ * @exception DOMException
+ * NO_MODIFICATION_ALLOWED_ERR: Raised when the node is readonly.
+ * @exception DOMException
+ * DOMSTRING_SIZE_ERR: Raised when it would return more characters than
+ * fit in a <code>DOMString</code> variable on the implementation
+ * platform.
+ */
+ public String getNodeValue()
+ throws DOMException;
+ /**
+ * The value of this node, depending on its type; see the table above.
+ * When it is defined to be <code>null</code>, setting it has no effect.
+ * @exception DOMException
+ * NO_MODIFICATION_ALLOWED_ERR: Raised when the node is readonly.
+ * @exception DOMException
+ * DOMSTRING_SIZE_ERR: Raised when it would return more characters than
+ * fit in a <code>DOMString</code> variable on the implementation
+ * platform.
+ */
+ public void setNodeValue(String nodeValue)
+ throws DOMException;
+
+ /**
+ * A code representing the type of the underlying object, as defined above.
+ */
+ public short getNodeType();
+
+ /**
+ * The parent of this node. All nodes, except <code>Attr</code>,
+ * <code>Document</code>, <code>DocumentFragment</code>,
+ * <code>Entity</code>, and <code>Notation</code> may have a parent.
+ * However, if a node has just been created and not yet added to the
+ * tree, or if it has been removed from the tree, this is
+ * <code>null</code>.
+ */
+ public Node getParentNode();
+
+ /**
+ * A <code>NodeList</code> that contains all children of this node. If
+ * there are no children, this is a <code>NodeList</code> containing no
+ * nodes.
+ */
+ public NodeList getChildNodes();
+
+ /**
+ * The first child of this node. If there is no such node, this returns
+ * <code>null</code>.
+ */
+ public Node getFirstChild();
+
+ /**
+ * The last child of this node. If there is no such node, this returns
+ * <code>null</code>.
+ */
+ public Node getLastChild();
+
+ /**
+ * The node immediately preceding this node. If there is no such node,
+ * this returns <code>null</code>.
+ */
+ public Node getPreviousSibling();
+
+ /**
+ * The node immediately following this node. If there is no such node,
+ * this returns <code>null</code>.
+ */
+ public Node getNextSibling();
+
+ /**
+ * A <code>NamedNodeMap</code> containing the attributes of this node (if
+ * it is an <code>Element</code>) or <code>null</code> otherwise.
+ */
+ public NamedNodeMap getAttributes();
+
+ /**
+ * The <code>Document</code> object associated with this node. This is
+ * also the <code>Document</code> object used to create new nodes. When
+ * this node is a <code>Document</code> or a <code>DocumentType</code>
+ * which is not used with any <code>Document</code> yet, this is
+ * <code>null</code>.
+ * @version DOM Level 2
+ */
+ public Document getOwnerDocument();
+
+ /**
+ * Inserts the node <code>newChild</code> before the existing child node
+ * <code>refChild</code>. If <code>refChild</code> is <code>null</code>,
+ * insert <code>newChild</code> at the end of the list of children.
+ * <br>If <code>newChild</code> is a <code>DocumentFragment</code> object,
+ * all of its children are inserted, in the same order, before
+ * <code>refChild</code>. If the <code>newChild</code> is already in the
+ * tree, it is first removed.
+ * @param newChild The node to insert.
+ * @param refChild The reference node, i.e., the node before which the
+ * new node must be inserted.
+ * @return The node being inserted.
+ * @exception DOMException
+ * HIERARCHY_REQUEST_ERR: Raised if this node is of a type that does not
+ * allow children of the type of the <code>newChild</code> node, or if
+ * the node to insert is one of this node's ancestors or this node
+ * itself.
+ * <br>WRONG_DOCUMENT_ERR: Raised if <code>newChild</code> was created
+ * from a different document than the one that created this node.
+ * <br>NO_MODIFICATION_ALLOWED_ERR: Raised if this node is readonly or
+ * if the parent of the node being inserted is readonly.
+ * <br>NOT_FOUND_ERR: Raised if <code>refChild</code> is not a child of
+ * this node.
+ */
+ public Node insertBefore(Node newChild,
+ Node refChild)
+ throws DOMException;
+
+ /**
+ * Replaces the child node <code>oldChild</code> with <code>newChild</code>
+ * in the list of children, and returns the <code>oldChild</code> node.
+ * <br>If <code>newChild</code> is a <code>DocumentFragment</code> object,
+ * <code>oldChild</code> is replaced by all of the
+ * <code>DocumentFragment</code> children, which are inserted in the
+ * same order. If the <code>newChild</code> is already in the tree, it
+ * is first removed.
+ * @param newChild The new node to put in the child list.
+ * @param oldChild The node being replaced in the list.
+ * @return The node replaced.
+ * @exception DOMException
+ * HIERARCHY_REQUEST_ERR: Raised if this node is of a type that does not
+ * allow children of the type of the <code>newChild</code> node, or if
+ * the node to put in is one of this node's ancestors or this node
+ * itself.
+ * <br>WRONG_DOCUMENT_ERR: Raised if <code>newChild</code> was created
+ * from a different document than the one that created this node.
+ * <br>NO_MODIFICATION_ALLOWED_ERR: Raised if this node or the parent of
+ * the new node is readonly.
+ * <br>NOT_FOUND_ERR: Raised if <code>oldChild</code> is not a child of
+ * this node.
+ */
+ public Node replaceChild(Node newChild,
+ Node oldChild)
+ throws DOMException;
+
+ /**
+ * Removes the child node indicated by <code>oldChild</code> from the list
+ * of children, and returns it.
+ * @param oldChild The node being removed.
+ * @return The node removed.
+ * @exception DOMException
+ * NO_MODIFICATION_ALLOWED_ERR: Raised if this node is readonly.
+ * <br>NOT_FOUND_ERR: Raised if <code>oldChild</code> is not a child of
+ * this node.
+ */
+ public Node removeChild(Node oldChild)
+ throws DOMException;
+
+ /**
+ * Adds the node <code>newChild</code> to the end of the list of children
+ * of this node. If the <code>newChild</code> is already in the tree, it
+ * is first removed.
+ * @param newChild The node to add.If it is a
+ * <code>DocumentFragment</code> object, the entire contents of the
+ * document fragment are moved into the child list of this node
+ * @return The node added.
+ * @exception DOMException
+ * HIERARCHY_REQUEST_ERR: Raised if this node is of a type that does not
+ * allow children of the type of the <code>newChild</code> node, or if
+ * the node to append is one of this node's ancestors or this node
+ * itself.
+ * <br>WRONG_DOCUMENT_ERR: Raised if <code>newChild</code> was created
+ * from a different document than the one that created this node.
+ * <br>NO_MODIFICATION_ALLOWED_ERR: Raised if this node is readonly or
+ * if the previous parent of the node being inserted is readonly.
+ */
+ public Node appendChild(Node newChild)
+ throws DOMException;
+
+ /**
+ * Returns whether this node has any children.
+ * @return <code>true</code> if this node has any children,
+ * <code>false</code> otherwise.
+ */
+ public boolean hasChildNodes();
+
+ /**
+ * Returns a duplicate of this node, i.e., serves as a generic copy
+ * constructor for nodes. The duplicate node has no parent; (
+ * <code>parentNode</code> is <code>null</code>.).
+ * <br>Cloning an <code>Element</code> copies all attributes and their
+ * values, including those generated by the XML processor to represent
+ * defaulted attributes, but this method does not copy any text it
+ * contains unless it is a deep clone, since the text is contained in a
+ * child <code>Text</code> node. Cloning an <code>Attribute</code>
+ * directly, as opposed to be cloned as part of an <code>Element</code>
+ * cloning operation, returns a specified attribute (
+ * <code>specified</code> is <code>true</code>). Cloning any other type
+ * of node simply returns a copy of this node.
+ * <br>Note that cloning an immutable subtree results in a mutable copy,
+ * but the children of an <code>EntityReference</code> clone are readonly
+ * . In addition, clones of unspecified <code>Attr</code> nodes are
+ * specified. And, cloning <code>Document</code>,
+ * <code>DocumentType</code>, <code>Entity</code>, and
+ * <code>Notation</code> nodes is implementation dependent.
+ * @param deep If <code>true</code>, recursively clone the subtree under
+ * the specified node; if <code>false</code>, clone only the node
+ * itself (and its attributes, if it is an <code>Element</code>).
+ * @return The duplicate node.
+ */
+ public Node cloneNode(boolean deep);
+
+ /**
+ * Puts all <code>Text</code> nodes in the full depth of the sub-tree
+ * underneath this <code>Node</code>, including attribute nodes, into a
+ * "normal" form where only structure (e.g., elements, comments,
+ * processing instructions, CDATA sections, and entity references)
+ * separates <code>Text</code> nodes, i.e., there are neither adjacent
+ * <code>Text</code> nodes nor empty <code>Text</code> nodes. This can
+ * be used to ensure that the DOM view of a document is the same as if
+ * it were saved and re-loaded, and is useful when operations (such as
+ * XPointer lookups) that depend on a particular document tree
+ * structure are to be used.In cases where the document contains
+ * <code>CDATASections</code>, the normalize operation alone may not be
+ * sufficient, since XPointers do not differentiate between
+ * <code>Text</code> nodes and <code>CDATASection</code> nodes.
+ * @version DOM Level 2
+ */
+ public void normalize();
+
+ /**
+ * Tests whether the DOM implementation implements a specific feature and
+ * that feature is supported by this node.
+ * @param feature The name of the feature to test. This is the same name
+ * which can be passed to the method <code>hasFeature</code> on
+ * <code>DOMImplementation</code>.
+ * @param version This is the version number of the feature to test. In
+ * Level 2, version 1, this is the string "2.0". If the version is not
+ * specified, supporting any version of the feature will cause the
+ * method to return <code>true</code>.
+ * @return Returns <code>true</code> if the specified feature is
+ * supported on this node, <code>false</code> otherwise.
+ * @since DOM Level 2
+ */
+ public boolean isSupported(String feature,
+ String version);
+
+ /**
+ * The namespace URI of this node, or <code>null</code> if it is
+ * unspecified.
+ * <br>This is not a computed value that is the result of a namespace
+ * lookup based on an examination of the namespace declarations in
+ * scope. It is merely the namespace URI given at creation time.
+ * <br>For nodes of any type other than <code>ELEMENT_NODE</code> and
+ * <code>ATTRIBUTE_NODE</code> and nodes created with a DOM Level 1
+ * method, such as <code>createElement</code> from the
+ * <code>Document</code> interface, this is always <code>null</code>.Per
+ * the Namespaces in XML Specification an attribute does not inherit
+ * its namespace from the element it is attached to. If an attribute is
+ * not explicitly given a namespace, it simply has no namespace.
+ * @since DOM Level 2
+ */
+ public String getNamespaceURI();
+
+ /**
+ * The namespace prefix of this node, or <code>null</code> if it is
+ * unspecified.
+ * <br>Note that setting this attribute, when permitted, changes the
+ * <code>nodeName</code> attribute, which holds the qualified name, as
+ * well as the <code>tagName</code> and <code>name</code> attributes of
+ * the <code>Element</code> and <code>Attr</code> interfaces, when
+ * applicable.
+ * <br>Note also that changing the prefix of an attribute that is known to
+ * have a default value, does not make a new attribute with the default
+ * value and the original prefix appear, since the
+ * <code>namespaceURI</code> and <code>localName</code> do not change.
+ * <br>For nodes of any type other than <code>ELEMENT_NODE</code> and
+ * <code>ATTRIBUTE_NODE</code> and nodes created with a DOM Level 1
+ * method, such as <code>createElement</code> from the
+ * <code>Document</code> interface, this is always <code>null</code>.
+ * @exception DOMException
+ * INVALID_CHARACTER_ERR: Raised if the specified prefix contains an
+ * illegal character, per the XML 1.0 specification .
+ * <br>NO_MODIFICATION_ALLOWED_ERR: Raised if this node is readonly.
+ * <br>NAMESPACE_ERR: Raised if the specified <code>prefix</code> is
+ * malformed per the Namespaces in XML specification, if the
+ * <code>namespaceURI</code> of this node is <code>null</code>, if the
+ * specified prefix is "xml" and the <code>namespaceURI</code> of this
+ * node is different from "http://www.w3.org/XML/1998/namespace", if
+ * this node is an attribute and the specified prefix is "xmlns" and
+ * the <code>namespaceURI</code> of this node is different from "
+ * http://www.w3.org/2000/xmlns/", or if this node is an attribute and
+ * the <code>qualifiedName</code> of this node is "xmlns" .
+ * @since DOM Level 2
+ */
+ public String getPrefix();
+ /**
+ * The namespace prefix of this node, or <code>null</code> if it is
+ * unspecified.
+ * <br>Note that setting this attribute, when permitted, changes the
+ * <code>nodeName</code> attribute, which holds the qualified name, as
+ * well as the <code>tagName</code> and <code>name</code> attributes of
+ * the <code>Element</code> and <code>Attr</code> interfaces, when
+ * applicable.
+ * <br>Note also that changing the prefix of an attribute that is known to
+ * have a default value, does not make a new attribute with the default
+ * value and the original prefix appear, since the
+ * <code>namespaceURI</code> and <code>localName</code> do not change.
+ * <br>For nodes of any type other than <code>ELEMENT_NODE</code> and
+ * <code>ATTRIBUTE_NODE</code> and nodes created with a DOM Level 1
+ * method, such as <code>createElement</code> from the
+ * <code>Document</code> interface, this is always <code>null</code>.
+ * @exception DOMException
+ * INVALID_CHARACTER_ERR: Raised if the specified prefix contains an
+ * illegal character, per the XML 1.0 specification .
+ * <br>NO_MODIFICATION_ALLOWED_ERR: Raised if this node is readonly.
+ * <br>NAMESPACE_ERR: Raised if the specified <code>prefix</code> is
+ * malformed per the Namespaces in XML specification, if the
+ * <code>namespaceURI</code> of this node is <code>null</code>, if the
+ * specified prefix is "xml" and the <code>namespaceURI</code> of this
+ * node is different from "http://www.w3.org/XML/1998/namespace", if
+ * this node is an attribute and the specified prefix is "xmlns" and
+ * the <code>namespaceURI</code> of this node is different from "
+ * http://www.w3.org/2000/xmlns/", or if this node is an attribute and
+ * the <code>qualifiedName</code> of this node is "xmlns" .
+ * @since DOM Level 2
+ */
+ public void setPrefix(String prefix)
+ throws DOMException;
+
+ /**
+ * Returns the local part of the qualified name of this node.
+ * <br>For nodes of any type other than <code>ELEMENT_NODE</code> and
+ * <code>ATTRIBUTE_NODE</code> and nodes created with a DOM Level 1
+ * method, such as <code>createElement</code> from the
+ * <code>Document</code> interface, this is always <code>null</code>.
+ * @since DOM Level 2
+ */
+ public String getLocalName();
+
+ /**
+ * Returns whether this node (if it is an element) has any attributes.
+ * @return <code>true</code> if this node has any attributes,
+ * <code>false</code> otherwise.
+ * @since DOM Level 2
+ */
+ public boolean hasAttributes();
+
+}
diff --git a/external/jaxp/source/org/w3c/dom/NodeList.java b/external/jaxp/source/org/w3c/dom/NodeList.java
new file mode 100755
index 000000000..a90b4fd4f
--- /dev/null
+++ b/external/jaxp/source/org/w3c/dom/NodeList.java
@@ -0,0 +1,41 @@
+/*
+ * Copyright (c) 2000 World Wide Web Consortium,
+ * (Massachusetts Institute of Technology, Institut National de
+ * Recherche en Informatique et en Automatique, Keio University). All
+ * Rights Reserved. This program is distributed under the W3C's Software
+ * Intellectual Property License. This program is distributed in the
+ * hope that it will be useful, but WITHOUT ANY WARRANTY; without even
+ * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+ * PURPOSE.
+ * See W3C License http://www.w3.org/Consortium/Legal/ for more details.
+ */
+
+package org.w3c.dom;
+
+/**
+ * The <code>NodeList</code> interface provides the abstraction of an ordered
+ * collection of nodes, without defining or constraining how this collection
+ * is implemented. <code>NodeList</code> objects in the DOM are live.
+ * <p>The items in the <code>NodeList</code> are accessible via an integral
+ * index, starting from 0.
+ * <p>See also the <a href='http://www.w3.org/TR/2000/REC-DOM-Level-2-Core-20001113'>Document Object Model (DOM) Level 2 Core Specification</a>.
+ */
+public interface NodeList {
+ /**
+ * Returns the <code>index</code>th item in the collection. If
+ * <code>index</code> is greater than or equal to the number of nodes in
+ * the list, this returns <code>null</code>.
+ * @param index Index into the collection.
+ * @return The node at the <code>index</code>th position in the
+ * <code>NodeList</code>, or <code>null</code> if that is not a valid
+ * index.
+ */
+ public Node item(int index);
+
+ /**
+ * The number of nodes in the list. The range of valid child node indices
+ * is 0 to <code>length-1</code> inclusive.
+ */
+ public int getLength();
+
+}
diff --git a/external/jaxp/source/org/w3c/dom/Notation.java b/external/jaxp/source/org/w3c/dom/Notation.java
new file mode 100755
index 000000000..186836d73
--- /dev/null
+++ b/external/jaxp/source/org/w3c/dom/Notation.java
@@ -0,0 +1,40 @@
+/*
+ * Copyright (c) 2000 World Wide Web Consortium,
+ * (Massachusetts Institute of Technology, Institut National de
+ * Recherche en Informatique et en Automatique, Keio University). All
+ * Rights Reserved. This program is distributed under the W3C's Software
+ * Intellectual Property License. This program is distributed in the
+ * hope that it will be useful, but WITHOUT ANY WARRANTY; without even
+ * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+ * PURPOSE.
+ * See W3C License http://www.w3.org/Consortium/Legal/ for more details.
+ */
+
+package org.w3c.dom;
+
+/**
+ * This interface represents a notation declared in the DTD. A notation either
+ * declares, by name, the format of an unparsed entity (see section 4.7 of
+ * the XML 1.0 specification ), or is used for formal declaration of
+ * processing instruction targets (see section 2.6 of the XML 1.0
+ * specification ). The <code>nodeName</code> attribute inherited from
+ * <code>Node</code> is set to the declared name of the notation.
+ * <p>The DOM Level 1 does not support editing <code>Notation</code> nodes;
+ * they are therefore readonly.
+ * <p>A <code>Notation</code> node does not have any parent.
+ * <p>See also the <a href='http://www.w3.org/TR/2000/REC-DOM-Level-2-Core-20001113'>Document Object Model (DOM) Level 2 Core Specification</a>.
+ */
+public interface Notation extends Node {
+ /**
+ * The public identifier of this notation. If the public identifier was
+ * not specified, this is <code>null</code>.
+ */
+ public String getPublicId();
+
+ /**
+ * The system identifier of this notation. If the system identifier was
+ * not specified, this is <code>null</code>.
+ */
+ public String getSystemId();
+
+}
diff --git a/external/jaxp/source/org/w3c/dom/ProcessingInstruction.java b/external/jaxp/source/org/w3c/dom/ProcessingInstruction.java
new file mode 100755
index 000000000..fe447b51c
--- /dev/null
+++ b/external/jaxp/source/org/w3c/dom/ProcessingInstruction.java
@@ -0,0 +1,47 @@
+/*
+ * Copyright (c) 2000 World Wide Web Consortium,
+ * (Massachusetts Institute of Technology, Institut National de
+ * Recherche en Informatique et en Automatique, Keio University). All
+ * Rights Reserved. This program is distributed under the W3C's Software
+ * Intellectual Property License. This program is distributed in the
+ * hope that it will be useful, but WITHOUT ANY WARRANTY; without even
+ * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+ * PURPOSE.
+ * See W3C License http://www.w3.org/Consortium/Legal/ for more details.
+ */
+
+package org.w3c.dom;
+
+/**
+ * The <code>ProcessingInstruction</code> interface represents a "processing
+ * instruction", used in XML as a way to keep processor-specific information
+ * in the text of the document.
+ * <p>See also the <a href='http://www.w3.org/TR/2000/REC-DOM-Level-2-Core-20001113'>Document Object Model (DOM) Level 2 Core Specification</a>.
+ */
+public interface ProcessingInstruction extends Node {
+ /**
+ * The target of this processing instruction. XML defines this as being
+ * the first token following the markup that begins the processing
+ * instruction.
+ */
+ public String getTarget();
+
+ /**
+ * The content of this processing instruction. This is from the first non
+ * white space character after the target to the character immediately
+ * preceding the <code>?&gt;</code>.
+ * @exception DOMException
+ * NO_MODIFICATION_ALLOWED_ERR: Raised when the node is readonly.
+ */
+ public String getData();
+ /**
+ * The content of this processing instruction. This is from the first non
+ * white space character after the target to the character immediately
+ * preceding the <code>?&gt;</code>.
+ * @exception DOMException
+ * NO_MODIFICATION_ALLOWED_ERR: Raised when the node is readonly.
+ */
+ public void setData(String data)
+ throws DOMException;
+
+}
diff --git a/external/jaxp/source/org/w3c/dom/Text.java b/external/jaxp/source/org/w3c/dom/Text.java
new file mode 100755
index 000000000..842a9737b
--- /dev/null
+++ b/external/jaxp/source/org/w3c/dom/Text.java
@@ -0,0 +1,56 @@
+/*
+ * Copyright (c) 2000 World Wide Web Consortium,
+ * (Massachusetts Institute of Technology, Institut National de
+ * Recherche en Informatique et en Automatique, Keio University). All
+ * Rights Reserved. This program is distributed under the W3C's Software
+ * Intellectual Property License. This program is distributed in the
+ * hope that it will be useful, but WITHOUT ANY WARRANTY; without even
+ * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+ * PURPOSE.
+ * See W3C License http://www.w3.org/Consortium/Legal/ for more details.
+ */
+
+package org.w3c.dom;
+
+/**
+ * The <code>Text</code> interface inherits from <code>CharacterData</code>
+ * and represents the textual content (termed character data in XML) of an
+ * <code>Element</code> or <code>Attr</code>. If there is no markup inside
+ * an element's content, the text is contained in a single object
+ * implementing the <code>Text</code> interface that is the only child of
+ * the element. If there is markup, it is parsed into the information items
+ * (elements, comments, etc.) and <code>Text</code> nodes that form the list
+ * of children of the element.
+ * <p>When a document is first made available via the DOM, there is only one
+ * <code>Text</code> node for each block of text. Users may create adjacent
+ * <code>Text</code> nodes that represent the contents of a given element
+ * without any intervening markup, but should be aware that there is no way
+ * to represent the separations between these nodes in XML or HTML, so they
+ * will not (in general) persist between DOM editing sessions. The
+ * <code>normalize()</code> method on <code>Node</code> merges any such
+ * adjacent <code>Text</code> objects into a single node for each block of
+ * text.
+ * <p>See also the <a href='http://www.w3.org/TR/2000/REC-DOM-Level-2-Core-20001113'>Document Object Model (DOM) Level 2 Core Specification</a>.
+ */
+public interface Text extends CharacterData {
+ /**
+ * Breaks this node into two nodes at the specified <code>offset</code>,
+ * keeping both in the tree as siblings. After being split, this node
+ * will contain all the content up to the <code>offset</code> point. A
+ * new node of the same type, which contains all the content at and
+ * after the <code>offset</code> point, is returned. If the original
+ * node had a parent node, the new node is inserted as the next sibling
+ * of the original node. When the <code>offset</code> is equal to the
+ * length of this node, the new node has no data.
+ * @param offset The 16-bit unit offset at which to split, starting from
+ * <code>0</code>.
+ * @return The new node, of the same type as this node.
+ * @exception DOMException
+ * INDEX_SIZE_ERR: Raised if the specified offset is negative or greater
+ * than the number of 16-bit units in <code>data</code>.
+ * <br>NO_MODIFICATION_ALLOWED_ERR: Raised if this node is readonly.
+ */
+ public Text splitText(int offset)
+ throws DOMException;
+
+}
diff --git a/external/jaxp/source/org/w3c/dom/css/CSS2Azimuth.java b/external/jaxp/source/org/w3c/dom/css/CSS2Azimuth.java
new file mode 100755
index 000000000..de9016ec0
--- /dev/null
+++ b/external/jaxp/source/org/w3c/dom/css/CSS2Azimuth.java
@@ -0,0 +1,94 @@
+/*
+ * Copyright (c) 2000 World Wide Web Consortium,
+ * (Massachusetts Institute of Technology, Institut National de
+ * Recherche en Informatique et en Automatique, Keio University). All
+ * Rights Reserved. This program is distributed under the W3C's Software
+ * Intellectual Property License. This program is distributed in the
+ * hope that it will be useful, but WITHOUT ANY WARRANTY; without even
+ * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+ * PURPOSE. See W3C License http://www.w3.org/Consortium/Legal/ for more
+ * details.
+ */
+
+package org.w3c.dom.css;
+
+import org.w3c.dom.DOMException;
+
+/**
+ * The <code>CSS2Azimuth</code> interface represents the azimuth CSS Level 2
+ * property.
+ * <p> For this extension of the <code>CSSValue</code> interface, the
+ * <code>valueType</code> attribute of the underlying <code>CSSValue</code>
+ * interface shall be <code>CSS_CUSTOM</code> .
+ * <p>See also the <a href='http://www.w3.org/TR/2000/CR-DOM-Level-2-20000510'>Document Object Model (DOM) Level 2 Specification</a>.
+ * @since DOM Level 2
+ */
+public interface CSS2Azimuth extends CSSValue {
+ /**
+ * A code defining the type of the value as defined in
+ * <code>CSSValue</code> . It would be one of <code>CSS_DEG</code> ,
+ * <code>CSS_RAD</code> , <code>CSS_GRAD</code> or <code>CSS_IDENT</code>
+ * .
+ */
+ public short getAzimuthType();
+
+ /**
+ * If <code>azimuthType</code> is <code>CSS_IDENT</code> ,
+ * <code>identifier</code> contains one of left-side, far-left, left,
+ * center-left, center, center-right, right, far-right, right-side,
+ * leftwards, rightwards. The empty string if none is set.
+ */
+ public String getIdentifier();
+
+ /**
+ * <code>behind</code> indicates whether the behind identifier has been
+ * set.
+ */
+ public boolean getBehind();
+
+ /**
+ * A method to set the angle value with a specified unit. This method
+ * will unset any previously set identifier value.
+ * @param uType The unitType could only be one of <code>CSS_DEG</code> ,
+ * <code>CSS_RAD</code> or <code>CSS_GRAD</code> ).
+ * @param fValue The new float value of the angle.
+ * @exception DOMException
+ * INVALID_ACCESS_ERR: Raised if the unit type is invalid.
+ * <br> NO_MODIFICATION_ALLOWED_ERR: Raised if this property is
+ * readonly.
+ */
+ public void setAngleValue(short uType,
+ float fValue)
+ throws DOMException;
+
+ /**
+ * Used to retrieved the float value of the azimuth property.
+ * @param uType The unit type can be only an angle unit type (
+ * <code>CSS_DEG</code> , <code>CSS_RAD</code> or <code>CSS_GRAD</code>
+ * ).
+ * @return The float value.
+ * @exception DOMException
+ * INVALID_ACCESS_ERR: Raised if the unit type is invalid.
+ */
+ public float getAngleValue(short uType)
+ throws DOMException;
+
+ /**
+ * Setting the identifier for the azimuth property will unset any
+ * previously set angle value. The value of <code>azimuthType</code> is
+ * set to <code>CSS_IDENT</code>
+ * @param ident The new identifier. If the identifier is "leftwards" or
+ * "rightward", the behind attribute is ignored.
+ * @param b The new value for behind.
+ * @exception DOMException
+ * SYNTAX_ERR: Raised if the specified <code>identifier</code> has a
+ * syntax error and is unparsable.
+ * <br> NO_MODIFICATION_ALLOWED_ERR: Raised if this property is
+ * readonly.
+ */
+ public void setIdentifier(String ident,
+ boolean b)
+ throws DOMException;
+
+}
+
diff --git a/external/jaxp/source/org/w3c/dom/css/CSS2BackgroundPosition.java b/external/jaxp/source/org/w3c/dom/css/CSS2BackgroundPosition.java
new file mode 100755
index 000000000..159504353
--- /dev/null
+++ b/external/jaxp/source/org/w3c/dom/css/CSS2BackgroundPosition.java
@@ -0,0 +1,144 @@
+/*
+ * Copyright (c) 2000 World Wide Web Consortium,
+ * (Massachusetts Institute of Technology, Institut National de
+ * Recherche en Informatique et en Automatique, Keio University). All
+ * Rights Reserved. This program is distributed under the W3C's Software
+ * Intellectual Property License. This program is distributed in the
+ * hope that it will be useful, but WITHOUT ANY WARRANTY; without even
+ * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+ * PURPOSE. See W3C License http://www.w3.org/Consortium/Legal/ for more
+ * details.
+ */
+
+package org.w3c.dom.css;
+
+import org.w3c.dom.DOMException;
+
+/**
+ * The <code>CSS2BackgroundPosition</code> interface represents the
+ * background-position CSS Level 2 property.
+ * <p> For this extension of the <code>CSSValue</code> interface, the
+ * <code>valueType</code> attribute of the underlying <code>CSSValue</code>
+ * interface shall be <code>CSS_CUSTOM</code> .
+ * <p>See also the <a href='http://www.w3.org/TR/2000/CR-DOM-Level-2-20000510'>Document Object Model (DOM) Level 2 Specification</a>.
+ * @since DOM Level 2
+ */
+public interface CSS2BackgroundPosition extends CSSValue {
+ /**
+ * A code defining the type of the horizontal value. It would be one of
+ * <code>CSS_PERCENTAGE</code> , <code>CSS_EMS</code> ,
+ * <code>CSS_EXS</code> , <code>CSS_PX</code> , <code>CSS_CM</code> ,
+ * <code>CSS_MM</code> , <code>CSS_IN</code> , <code>CSS_PT</code> ,
+ * <code>CSS_PC</code> or <code>CSS_IDENT</code> . If one of horizontal or
+ * vertical is <code>CSS_IDENT</code> , it's guaranteed that the other is
+ * the same.
+ */
+ public short getHorizontalType();
+
+ /**
+ * A code defining the type of the horizontal value. The code can be one
+ * of the following units : <code>CSS_PERCENTAGE</code> ,
+ * <code>CSS_EMS</code> , <code>CSS_EXS</code> , <code>CSS_PX</code> ,
+ * <code>CSS_CM</code> , <code>CSS_MM</code> , <code>CSS_IN</code> ,
+ * <code>CSS_PT</code> , <code>CSS_PC</code> , <code>CSS_IDENT</code> ,
+ * <code>CSS_INHERIT</code> . If one of horizontal or vertical is
+ * <code>CSS_IDENT</code> or <code>CSS_INHERIT</code> , it's guaranteed
+ * that the other is the same.
+ */
+ public short getVerticalType();
+
+ /**
+ * If <code>horizontalType</code> is <code>CSS_IDENT</code> or
+ * <code>CSS_INHERIT</code> , this attribute contains the string
+ * representation of the ident, otherwise it contains an empty string.
+ */
+ public String getHorizontalIdentifier();
+
+ /**
+ * If <code>verticalType</code> is <code>CSS_IDENT</code> or
+ * <code>CSS_INHERIT</code> , this attribute contains the string
+ * representation of the ident, otherwise it contains an empty string. The
+ * value is <code>"center"</code> if only the horizontalIdentifier has
+ * been set.
+ */
+ public String getVerticalIdentifier();
+
+ /**
+ * This method is used to get the float value in a specified unit if the
+ * <code>horizontalPosition</code> represents a length or a percentage. If
+ * the float doesn't contain a float value or can't be converted into the
+ * specified unit, a <code>DOMException</code> is raised.
+ * @param hType The horizontal unit.
+ * @return The float value.
+ * @exception DOMException
+ * INVALID_ACCESS_ERR: Raised if the property doesn't contain a float
+ * or the value can't be converted.
+ */
+ public float getHorizontalPosition(float hType)
+ throws DOMException;
+
+ /**
+ * This method is used to get the float value in a specified unit if the
+ * <code>verticalPosition</code> represents a length or a percentage. If
+ * the float doesn't contain a float value or can't be converted into the
+ * specified unit, a <code>DOMException</code> is raised. The value is
+ * <code>50%</code> if only the horizontal value has been specified.
+ * @param vType The vertical unit.
+ * @return The float value.
+ * @exception DOMException
+ * INVALID_ACCESS_ERR: Raised if the property doesn't contain a float
+ * or the value can't be converted.
+ */
+ public float getVerticalPosition(float vType)
+ throws DOMException;
+
+ /**
+ * This method is used to set the horizontal position with a specified
+ * unit. If the vertical value is not a percentage or a length, it sets
+ * the vertical position to <code>50%</code> .
+ * @param hType The specified unit (a length or a percentage).
+ * @param value The new value.
+ * @exception DOMException
+ * INVALID_ACCESS_ERR: Raised if the specified unit is not a length or
+ * a percentage.
+ * <br> NO_MODIFICATION_ALLOWED_ERR: Raised if this property is
+ * readonly.
+ */
+ public void setHorizontalPosition(short hType,
+ float value)
+ throws DOMException;
+
+ /**
+ * This method is used to set the vertical position with a specified
+ * unit. If the horizontal value is not a percentage or a length, it sets
+ * the vertical position to <code>50%</code> .
+ * @param vType The specified unit (a length or a percentage).
+ * @param value The new value.
+ * @exception DOMException
+ * INVALID_ACCESS_ERR: Raised if the specified unit is not a length or
+ * a percentage.
+ * <br> NO_MODIFICATION_ALLOWED_ERR: Raised if this property is
+ * readonly.
+ */
+ public void setVerticalPosition(short vType,
+ float value)
+ throws DOMException;
+
+ /**
+ * Sets the identifiers. If the second identifier is the empty string,
+ * the vertical identifier is set to its default value (
+ * <code>"center"</code> ).
+ * @param hIdentifier The new horizontal identifier.
+ * @param vIdentifier The new vertical identifier.
+ * @exception DOMException
+ * SYNTAX_ERR: Raised if the identifiers have a syntax error and are
+ * unparsable.
+ * <br> NO_MODIFICATION_ALLOWED_ERR: Raised if this property is
+ * readonly.
+ */
+ public void setPositionIdentifier(String hIdentifier,
+ String vIdentifier)
+ throws DOMException;
+
+}
+
diff --git a/external/jaxp/source/org/w3c/dom/css/CSS2BorderSpacing.java b/external/jaxp/source/org/w3c/dom/css/CSS2BorderSpacing.java
new file mode 100755
index 000000000..920ebb2b3
--- /dev/null
+++ b/external/jaxp/source/org/w3c/dom/css/CSS2BorderSpacing.java
@@ -0,0 +1,106 @@
+/*
+ * Copyright (c) 2000 World Wide Web Consortium,
+ * (Massachusetts Institute of Technology, Institut National de
+ * Recherche en Informatique et en Automatique, Keio University). All
+ * Rights Reserved. This program is distributed under the W3C's Software
+ * Intellectual Property License. This program is distributed in the
+ * hope that it will be useful, but WITHOUT ANY WARRANTY; without even
+ * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+ * PURPOSE. See W3C License http://www.w3.org/Consortium/Legal/ for more
+ * details.
+ */
+
+package org.w3c.dom.css;
+
+import org.w3c.dom.DOMException;
+
+/**
+ * The <code>CSS2BorderSpacing</code> interface represents the border-spacing
+ * CSS Level 2 property.
+ * <p> For this extension of the <code>CSSValue</code> interface, the
+ * <code>valueType</code> attribute of the underlying <code>CSSValue</code>
+ * interface shall be <code>CSS_CUSTOM</code> .
+ * <p>See also the <a href='http://www.w3.org/TR/2000/CR-DOM-Level-2-20000510'>Document Object Model (DOM) Level 2 Specification</a>.
+ * @since DOM Level 2
+ */
+public interface CSS2BorderSpacing extends CSSValue {
+ /**
+ * The A code defining the type of the value as defined in
+ * <code>CSSValue</code> . It would be one of <code>CSS_EMS</code> ,
+ * <code>CSS_EXS</code> , <code>CSS_PX</code> , <code>CSS_CM</code> ,
+ * <code>CSS_MM</code> , <code>CSS_IN</code> , <code>CSS_PT</code> or
+ * <code>CSS_PC</code> .
+ */
+ public short getHorizontalType();
+
+ /**
+ * The A code defining the type of the value as defined in
+ * <code>CSSValue</code> . It would be one of <code>CSS_EMS</code> ,
+ * <code>CSS_EXS</code> , <code>CSS_PX</code> , <code>CSS_CM</code> ,
+ * <code>CSS_MM</code> , <code>CSS_IN</code> , <code>CSS_PT</code> ,
+ * <code>CSS_PC</code> or <code>CSS_INHERIT</code> .
+ */
+ public short getVerticalType();
+
+ /**
+ * This method is used to get the float value in a specified unit if the
+ * <code>horizontalSpacing</code> represents a length. If the float
+ * doesn't contain a float value or can't be converted into the specified
+ * unit, a <code>DOMException</code> is raised.
+ * @param hType The horizontal unit.
+ * @return The float value.
+ * @exception DOMException
+ * INVALID_ACCESS_ERR: Raised if the property doesn't contain a float
+ * or the value can't be converted.
+ */
+ public float getHorizontalSpacing(float hType)
+ throws DOMException;
+
+ /**
+ * This method is used to get the float value in a specified unit if the
+ * <code>verticalSpacing</code> represents a length. If the float doesn't
+ * contain a float value or can't be converted into the specified unit, a
+ * <code>DOMException</code> is raised. The value is <code>0</code> if
+ * only the horizontal value has been specified.
+ * @param vType The vertical unit.
+ * @return The float value.
+ * @exception DOMException
+ * INVALID_ACCESS_ERR: Raised if the property doesn't contain a float
+ * or the value can't be converted.
+ */
+ public float getVerticalSpacing(float vType)
+ throws DOMException;
+
+ /**
+ * This method is used to set the horizontal spacing with a specified
+ * unit. If the vertical value is a length, it sets the vertical spacing
+ * to <code>0</code> .
+ * @param hType The horizontal unit.
+ * @param value The new value.
+ * @exception DOMException
+ * INVALID_ACCESS_ERR: Raised if the specified unit is not a length.
+ * <br> NO_MODIFICATION_ALLOWED_ERR: Raised if this property is
+ * readonly.
+ */
+ public void setHorizontalSpacing(short hType,
+ float value)
+ throws DOMException;
+
+ /**
+ * This method is used to set the vertical spacing with a specified unit.
+ * If the horizontal value is not a length, it sets the vertical spacing
+ * to <code>0</code> .
+ * @param vType The vertical unit.
+ * @param value The new value.
+ * @exception DOMException
+ * INVALID_ACCESS_ERR: Raised if the specified unit is not a length or
+ * a percentage.
+ * <br> NO_MODIFICATION_ALLOWED_ERR: Raised if this property is
+ * readonly.
+ */
+ public void setVerticalSpacing(short vType,
+ float value)
+ throws DOMException;
+
+}
+
diff --git a/external/jaxp/source/org/w3c/dom/css/CSS2CounterIncrement.java b/external/jaxp/source/org/w3c/dom/css/CSS2CounterIncrement.java
new file mode 100755
index 000000000..f1bd26ba1
--- /dev/null
+++ b/external/jaxp/source/org/w3c/dom/css/CSS2CounterIncrement.java
@@ -0,0 +1,49 @@
+/*
+ * Copyright (c) 2000 World Wide Web Consortium,
+ * (Massachusetts Institute of Technology, Institut National de
+ * Recherche en Informatique et en Automatique, Keio University). All
+ * Rights Reserved. This program is distributed under the W3C's Software
+ * Intellectual Property License. This program is distributed in the
+ * hope that it will be useful, but WITHOUT ANY WARRANTY; without even
+ * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+ * PURPOSE. See W3C License http://www.w3.org/Consortium/Legal/ for more
+ * details.
+ */
+
+package org.w3c.dom.css;
+
+import org.w3c.dom.DOMException;
+
+/**
+ * The <code>CSS2CounterIncrement</code> interface represents a simple value
+ * for the counter-increment CSS Level 2 property.
+ * <p> For this extension of the <code>CSSValue</code> interface, the
+ * <code>valueType</code> attribute of the underlying <code>CSSValue</code>
+ * interface shall be <code>CSS_CUSTOM</code> .
+ * <p>See also the <a href='http://www.w3.org/TR/2000/CR-DOM-Level-2-20000510'>Document Object Model (DOM) Level 2 Specification</a>.
+ * @since DOM Level 2
+ */
+public interface CSS2CounterIncrement extends CSSValue {
+ /**
+ * The element name.
+ * @exception DOMException
+ * SYNTAX_ERR: Raised if the specified identifier has a syntax error
+ * and is unparsable.
+ * <br> NO_MODIFICATION_ALLOWED_ERR: Raised if this identifier is
+ * readonly.
+ */
+ public String getIdentifier();
+ public void setIdentifier(String identifier)
+ throws DOMException;
+
+ /**
+ * The increment. (Default value is 1.)
+ * @exception DOMException
+ * NO_MODIFICATION_ALLOWED_ERR: Raised if this identifier is readonly.
+ */
+ public short getIncrement();
+ public void setIncrement(short increment)
+ throws DOMException;
+
+}
+
diff --git a/external/jaxp/source/org/w3c/dom/css/CSS2CounterReset.java b/external/jaxp/source/org/w3c/dom/css/CSS2CounterReset.java
new file mode 100755
index 000000000..5c665f5da
--- /dev/null
+++ b/external/jaxp/source/org/w3c/dom/css/CSS2CounterReset.java
@@ -0,0 +1,49 @@
+/*
+ * Copyright (c) 2000 World Wide Web Consortium,
+ * (Massachusetts Institute of Technology, Institut National de
+ * Recherche en Informatique et en Automatique, Keio University). All
+ * Rights Reserved. This program is distributed under the W3C's Software
+ * Intellectual Property License. This program is distributed in the
+ * hope that it will be useful, but WITHOUT ANY WARRANTY; without even
+ * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+ * PURPOSE. See W3C License http://www.w3.org/Consortium/Legal/ for more
+ * details.
+ */
+
+package org.w3c.dom.css;
+
+import org.w3c.dom.DOMException;
+
+/**
+ * The <code>CSS2CounterReset</code> interface represents a simple value for
+ * the counter-reset CSS Level 2 property.
+ * <p> For this extension of the <code>CSSValue</code> interface, the
+ * <code>valueType</code> attribute of the underlying <code>CSSValue</code>
+ * interface shall be <code>CSS_CUSTOM</code> .
+ * <p>See also the <a href='http://www.w3.org/TR/2000/CR-DOM-Level-2-20000510'>Document Object Model (DOM) Level 2 Specification</a>.
+ * @since DOM Level 2
+ */
+public interface CSS2CounterReset extends CSSValue {
+ /**
+ * The element name.
+ * @exception DOMException
+ * SYNTAX_ERR: Raised if the specified identifier has a syntax error
+ * and is unparsable.
+ * <br> NO_MODIFICATION_ALLOWED_ERR: Raised if this identifier is
+ * readonly.
+ */
+ public String getIdentifier();
+ public void setIdentifier(String identifier)
+ throws DOMException;
+
+ /**
+ * The reset (default value is 0).
+ * @exception DOMException
+ * NO_MODIFICATION_ALLOWED_ERR: Raised if this identifier is readonly.
+ */
+ public short getReset();
+ public void setReset(short reset)
+ throws DOMException;
+
+}
+
diff --git a/external/jaxp/source/org/w3c/dom/css/CSS2Cursor.java b/external/jaxp/source/org/w3c/dom/css/CSS2Cursor.java
new file mode 100755
index 000000000..298565d88
--- /dev/null
+++ b/external/jaxp/source/org/w3c/dom/css/CSS2Cursor.java
@@ -0,0 +1,46 @@
+/*
+ * Copyright (c) 2000 World Wide Web Consortium,
+ * (Massachusetts Institute of Technology, Institut National de
+ * Recherche en Informatique et en Automatique, Keio University). All
+ * Rights Reserved. This program is distributed under the W3C's Software
+ * Intellectual Property License. This program is distributed in the
+ * hope that it will be useful, but WITHOUT ANY WARRANTY; without even
+ * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+ * PURPOSE. See W3C License http://www.w3.org/Consortium/Legal/ for more
+ * details.
+ */
+
+package org.w3c.dom.css;
+
+import org.w3c.dom.DOMException;
+
+/**
+ * The <code>CSS2Cursor</code> interface represents the cursor CSS Level 2
+ * property.
+ * <p> For this extension of the <code>CSSValue</code> interface, the
+ * <code>valueType</code> attribute of the underlying <code>CSSValue</code>
+ * interface shall be <code>CSS_CUSTOM</code> .
+ * <p>See also the <a href='http://www.w3.org/TR/2000/CR-DOM-Level-2-20000510'>Document Object Model (DOM) Level 2 Specification</a>.
+ * @since DOM Level 2
+ */
+public interface CSS2Cursor extends CSSValue {
+ /**
+ * <code>uris</code> represents the list of URIs (<code>CSS_URI</code> )
+ * on the cursor property. The list can be empty.
+ */
+ public CSSValueList getUris();
+
+ /**
+ * This identifier represents a generic cursor name or an empty string.
+ * @exception DOMException
+ * SYNTAX_ERR: Raised if the specified CSS string value has a syntax
+ * error and is unparsable.
+ * <br> NO_MODIFICATION_ALLOWED_ERR: Raised if this declaration is
+ * readonly.
+ */
+ public String getPredefinedCursor();
+ public void setPredefinedCursor(String predefinedCursor)
+ throws DOMException;
+
+}
+
diff --git a/external/jaxp/source/org/w3c/dom/css/CSS2FontFaceSrc.java b/external/jaxp/source/org/w3c/dom/css/CSS2FontFaceSrc.java
new file mode 100755
index 000000000..1385e9357
--- /dev/null
+++ b/external/jaxp/source/org/w3c/dom/css/CSS2FontFaceSrc.java
@@ -0,0 +1,57 @@
+/*
+ * Copyright (c) 2000 World Wide Web Consortium,
+ * (Massachusetts Institute of Technology, Institut National de
+ * Recherche en Informatique et en Automatique, Keio University). All
+ * Rights Reserved. This program is distributed under the W3C's Software
+ * Intellectual Property License. This program is distributed in the
+ * hope that it will be useful, but WITHOUT ANY WARRANTY; without even
+ * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+ * PURPOSE. See W3C License http://www.w3.org/Consortium/Legal/ for more
+ * details.
+ */
+
+package org.w3c.dom.css;
+
+import org.w3c.dom.DOMException;
+
+/**
+ * The <code>CSS2FontFaceSrc</code> interface represents the src CSS Level 2
+ * descriptor.
+ * <p> For this extension of the <code>CSSValue</code> interface, the
+ * <code>valueType</code> attribute of the underlying <code>CSSValue</code>
+ * interface shall be <code>CSS_CUSTOM</code> .
+ * <p>See also the <a href='http://www.w3.org/TR/2000/CR-DOM-Level-2-20000510'>Document Object Model (DOM) Level 2 Specification</a>.
+ * @since DOM Level 2
+ */
+public interface CSS2FontFaceSrc extends CSSValue {
+ /**
+ * Specifies the source of the font, empty string otherwise.
+ * @exception DOMException
+ * SYNTAX_ERR: Raised if the specified CSS string value has a syntax
+ * error and is unparsable.
+ * <br> NO_MODIFICATION_ALLOWED_ERR: Raised if this declaration is
+ * readonly.
+ */
+ public String getUri();
+ public void setUri(String uri)
+ throws DOMException;
+
+ /**
+ * This attribute contains a list of strings for the format CSS function.
+ */
+ public CSSValueList getFormat();
+
+ /**
+ * Specifies the full font name of a locally installed font.
+ * @exception DOMException
+ * SYNTAX_ERR: Raised if the specified CSS string value has a syntax
+ * error and is unparsable.
+ * <br> NO_MODIFICATION_ALLOWED_ERR: Raised if this declaration is
+ * readonly.
+ */
+ public String getFontFaceName();
+ public void setFontFaceName(String fontFaceName)
+ throws DOMException;
+
+}
+
diff --git a/external/jaxp/source/org/w3c/dom/css/CSS2FontFaceWidths.java b/external/jaxp/source/org/w3c/dom/css/CSS2FontFaceWidths.java
new file mode 100755
index 000000000..e4ad5e82c
--- /dev/null
+++ b/external/jaxp/source/org/w3c/dom/css/CSS2FontFaceWidths.java
@@ -0,0 +1,45 @@
+/*
+ * Copyright (c) 2000 World Wide Web Consortium,
+ * (Massachusetts Institute of Technology, Institut National de
+ * Recherche en Informatique et en Automatique, Keio University). All
+ * Rights Reserved. This program is distributed under the W3C's Software
+ * Intellectual Property License. This program is distributed in the
+ * hope that it will be useful, but WITHOUT ANY WARRANTY; without even
+ * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+ * PURPOSE. See W3C License http://www.w3.org/Consortium/Legal/ for more
+ * details.
+ */
+
+package org.w3c.dom.css;
+
+import org.w3c.dom.DOMException;
+
+/**
+ * The <code>CSS2FontFaceWidths</code> interface represents a simple value
+ * for the widths CSS Level 2 descriptor.
+ * <p> For this extension of the <code>CSSValue</code> interface, the
+ * <code>valueType</code> attribute of the underlying <code>CSSValue</code>
+ * interface shall be <code>CSS_CUSTOM</code> .
+ * <p>See also the <a href='http://www.w3.org/TR/2000/CR-DOM-Level-2-20000510'>Document Object Model (DOM) Level 2 Specification</a>.
+ * @since DOM Level 2
+ */
+public interface CSS2FontFaceWidths extends CSSValue {
+ /**
+ * The range for the characters.
+ * @exception DOMException
+ * SYNTAX_ERR: Raised if the specified CSS string value has a syntax
+ * error and is unparsable.
+ * <br> NO_MODIFICATION_ALLOWED_ERR: Raised if this declaration is
+ * readonly.
+ */
+ public String getUrange();
+ public void setUrange(String urange)
+ throws DOMException;
+
+ /**
+ * A list of numbers representing the glyph widths.
+ */
+ public CSSValueList getNumbers();
+
+}
+
diff --git a/external/jaxp/source/org/w3c/dom/css/CSS2PageSize.java b/external/jaxp/source/org/w3c/dom/css/CSS2PageSize.java
new file mode 100755
index 000000000..d27ec909e
--- /dev/null
+++ b/external/jaxp/source/org/w3c/dom/css/CSS2PageSize.java
@@ -0,0 +1,126 @@
+/*
+ * Copyright (c) 2000 World Wide Web Consortium,
+ * (Massachusetts Institute of Technology, Institut National de
+ * Recherche en Informatique et en Automatique, Keio University). All
+ * Rights Reserved. This program is distributed under the W3C's Software
+ * Intellectual Property License. This program is distributed in the
+ * hope that it will be useful, but WITHOUT ANY WARRANTY; without even
+ * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+ * PURPOSE. See W3C License http://www.w3.org/Consortium/Legal/ for more
+ * details.
+ */
+
+package org.w3c.dom.css;
+
+import org.w3c.dom.DOMException;
+
+/**
+ * The <code>CSS2PageSize</code> interface represents the size CSS Level 2
+ * descriptor.
+ * <p> For this extension of the <code>CSSValue</code> interface, the
+ * <code>valueType</code> attribute of the underlying <code>CSSValue</code>
+ * interface shall be <code>CSS_CUSTOM</code> .
+ * <p>See also the <a href='http://www.w3.org/TR/2000/CR-DOM-Level-2-20000510'>Document Object Model (DOM) Level 2 Specification</a>.
+ * @since DOM Level 2
+ */
+public interface CSS2PageSize extends CSSValue {
+ /**
+ * A code defining the type of the width of the page. It would be one of
+ * <code>CSS_EMS</code> , <code>CSS_EXS</code> , <code>CSS_PX</code> ,
+ * <code>CSS_CM</code> , <code>CSS_MM</code> , <code>CSS_IN</code> ,
+ * <code>CSS_PT</code> , <code>CSS_PC</code> or <code>CSS_IDENT</code> .
+ */
+ public short getWidthType();
+
+ /**
+ * A code defining the type of the height of the page. It would be one of
+ * <code>CSS_EMS</code> , <code>CSS_EXS</code> , <code>CSS_PX</code> ,
+ * <code>CSS_CM</code> , <code>CSS_MM</code> , <code>CSS_IN</code> ,
+ * <code>CSS_PT</code> , <code>CSS_PC</code> or <code>CSS_IDENT</code> .
+ * If one of width or height is <code>CSS_IDENT</code> , it's guaranteed
+ * that the other is the same.
+ */
+ public short getHeightType();
+
+ /**
+ * If <code>width</code> is <code>CSS_IDENT</code> , this attribute
+ * contains the string representation of the ident, otherwise it contains
+ * an empty string.
+ */
+ public String getIdentifier();
+
+ /**
+ * This method is used to get the float value in a specified unit if the
+ * <code>widthType</code> represents a length. If the float doesn't
+ * contain a float value or can't be converted into the specified unit, a
+ * <code>DOMException</code> is raised.
+ * @param wType The width unit.
+ * @return The float value.
+ * @exception DOMException
+ * INVALID_ACCESS_ERR: Raised if the property doesn't contain a float
+ * or the value can't be converted.
+ */
+ public float getWidth(float wType)
+ throws DOMException;
+
+ /**
+ * This method is used to get the float value in a specified unit if the
+ * <code>heightType</code> represents a length. If the float doesn't
+ * contain a float value or can't be converted into the specified unit, a
+ * <code>DOMException</code> is raised. If only the width value has been
+ * specified, the height value is the same.
+ * @param hType The height unit.
+ * @return The float value.
+ * @exception DOMException
+ * INVALID_ACCESS_ERR: Raised if the property doesn't contain a float
+ * or the value can't be converted.
+ */
+ public float getHeightSize(float hType)
+ throws DOMException;
+
+ /**
+ * This method is used to set the width position with a specified unit.
+ * If the <code>heightType</code> is not a length, it sets the height
+ * position to the same value.
+ * @param wType The width unit.
+ * @param value The new value.
+ * @exception DOMException
+ * INVALID_ACCESS_ERR: Raised if the specified unit is not a length or
+ * a percentage.
+ * <br> NO_MODIFICATION_ALLOWED_ERR: Raised if this property is
+ * readonly.
+ */
+ public void setWidthSize(short wType,
+ float value)
+ throws DOMException;
+
+ /**
+ * This method is used to set the height position with a specified unit.
+ * If the <code>widthType</code> is not a length, it sets the width
+ * position to the same value.
+ * @param hType The height unit.
+ * @param value The new value.
+ * @exception DOMException
+ * INVALID_ACCESS_ERR: Raised if the specified unit is not a length or
+ * a percentage.
+ * <br> NO_MODIFICATION_ALLOWED_ERR: Raised if this property is
+ * readonly.
+ */
+ public void setHeightSize(short hType,
+ float value)
+ throws DOMException;
+
+ /**
+ * Sets the identifier.
+ * @param ident The new identifier.
+ * @exception DOMException
+ * SYNTAX_ERR: Raised if the identifier has a syntax error and is
+ * unparsable.
+ * <br> NO_MODIFICATION_ALLOWED_ERR: Raised if this property is
+ * readonly.
+ */
+ public void setIdentifier(String ident)
+ throws DOMException;
+
+}
+
diff --git a/external/jaxp/source/org/w3c/dom/css/CSS2PlayDuring.java b/external/jaxp/source/org/w3c/dom/css/CSS2PlayDuring.java
new file mode 100755
index 000000000..4034cc4e5
--- /dev/null
+++ b/external/jaxp/source/org/w3c/dom/css/CSS2PlayDuring.java
@@ -0,0 +1,84 @@
+/*
+ * Copyright (c) 2000 World Wide Web Consortium,
+ * (Massachusetts Institute of Technology, Institut National de
+ * Recherche en Informatique et en Automatique, Keio University). All
+ * Rights Reserved. This program is distributed under the W3C's Software
+ * Intellectual Property License. This program is distributed in the
+ * hope that it will be useful, but WITHOUT ANY WARRANTY; without even
+ * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+ * PURPOSE. See W3C License http://www.w3.org/Consortium/Legal/ for more
+ * details.
+ */
+
+package org.w3c.dom.css;
+
+import org.w3c.dom.DOMException;
+
+/**
+ * The <code>CSS2PlayDuring</code> interface represents the play-during CSS
+ * Level 2 property.
+ * <p> For this extension of the <code>CSSValue</code> interface, the
+ * <code>valueType</code> attribute of the underlying <code>CSSValue</code>
+ * interface shall be <code>CSS_CUSTOM</code> .
+ * <p>See also the <a href='http://www.w3.org/TR/2000/CR-DOM-Level-2-20000510'>Document Object Model (DOM) Level 2 Specification</a>.
+ * @since DOM Level 2
+ */
+public interface CSS2PlayDuring extends CSSValue {
+ /**
+ * A code defining the type of the value as defined in
+ * <code>CSSvalue</code> . It would be one of <code>CSS_UNKNOWN</code> or
+ * <code>CSS_IDENT</code> .
+ */
+ public short getPlayDuringType();
+
+ /**
+ * One of <code>"inherit"</code> , <code>"auto"</code> ,
+ * <code>"none"</code> or the empty string if the
+ * <code>playDuringType</code> is <code>CSS_UNKNOWN</code> . On setting,
+ * it will set the <code>uri</code> to the empty string and
+ * <code>mix</code> and <code>repeat</code> to <code>false</code> .
+ * @exception DOMException
+ * SYNTAX_ERR: Raised if the specified CSS string value has a syntax
+ * error and is unparsable.
+ * <br> NO_MODIFICATION_ALLOWED_ERR: Raised if this declaration is
+ * readonly.
+ */
+ public String getPlayDuringIdentifier();
+ public void setPlayDuringIdentifier(String playDuringIdentifier)
+ throws DOMException;
+
+ /**
+ * The sound specified by the <code>uri</code> . It will set the
+ * <code>playDuringType</code> attribute to <code>CSS_UNKNOWN</code> .
+ * @exception DOMException
+ * SYNTAX_ERR: Raised if the specified CSS string value has a syntax
+ * error and is unparsable.
+ * <br> NO_MODIFICATION_ALLOWED_ERR: Raised if this declaration is
+ * readonly.
+ */
+ public String getUri();
+ public void setUri(String uri)
+ throws DOMException;
+
+ /**
+ * <code>true</code> if the sound should be mixed. It will be ignored if
+ * the attribute doesn't contain a <code>uri</code> .
+ * @exception DOMException
+ * NO_MODIFICATION_ALLOWED_ERR: Raised if this declaration is readonly.
+ */
+ public boolean getMix();
+ public void setMix(boolean mix)
+ throws DOMException;
+
+ /**
+ * <code>true</code> if the sound should be repeated. It will be ignored
+ * if the attribute doesn't contain a <code>uri</code> .
+ * @exception DOMException
+ * NO_MODIFICATION_ALLOWED_ERR: Raised if this declaration is readonly.
+ */
+ public boolean getRepeat();
+ public void setRepeat(boolean repeat)
+ throws DOMException;
+
+}
+
diff --git a/external/jaxp/source/org/w3c/dom/css/CSS2Properties.java b/external/jaxp/source/org/w3c/dom/css/CSS2Properties.java
new file mode 100755
index 000000000..18f589fd2
--- /dev/null
+++ b/external/jaxp/source/org/w3c/dom/css/CSS2Properties.java
@@ -0,0 +1,2265 @@
+/*
+ * Copyright (c) 2000 World Wide Web Consortium,
+ * (Massachusetts Institute of Technology, Institut National de
+ * Recherche en Informatique et en Automatique, Keio University). All
+ * Rights Reserved. This program is distributed under the W3C's Software
+ * Intellectual Property License. This program is distributed in the
+ * hope that it will be useful, but WITHOUT ANY WARRANTY; without even
+ * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+ * PURPOSE.
+ * See W3C License http://www.w3.org/Consortium/Legal/ for more details.
+ */
+
+package org.w3c.dom.css;
+
+import org.w3c.dom.DOMException;
+
+/**
+ * The <code>CSS2Properties</code> interface represents a convenience
+ * mechanism for retrieving and setting properties within a
+ * <code>CSSStyleDeclaration</code>. The attributes of this interface
+ * correspond to all the properties specified in CSS2. Getting an attribute
+ * of this interface is equivalent to calling the
+ * <code>getPropertyValue</code> method of the
+ * <code>CSSStyleDeclaration</code> interface. Setting an attribute of this
+ * interface is equivalent to calling the <code>setProperty</code> method of
+ * the <code>CSSStyleDeclaration</code> interface.
+ * <p> A conformant implementation of the CSS module is not required to
+ * implement the <code>CSS2Properties</code> interface. If an implementation
+ * does implement this interface, the expectation is that language-specific
+ * methods can be used to cast from an instance of the
+ * <code>CSSStyleDeclaration</code> interface to the
+ * <code>CSS2Properties</code> interface.
+ * <p> If an implementation does implement this interface, it is expected to
+ * understand the specific syntax of the shorthand properties, and apply
+ * their semantics; when the <code>margin</code> property is set, for
+ * example, the <code>marginTop</code>, <code>marginRight</code>,
+ * <code>marginBottom</code> and <code>marginLeft</code> properties are
+ * actually being set by the underlying implementation.
+ * <p> When dealing with CSS "shorthand" properties, the shorthand properties
+ * should be decomposed into their component longhand properties as
+ * appropriate, and when querying for their value, the form returned should
+ * be the shortest form exactly equivalent to the declarations made in the
+ * ruleset. However, if there is no shorthand declaration that could be
+ * added to the ruleset without changing in any way the rules already
+ * declared in the ruleset (i.e., by adding longhand rules that were
+ * previously not declared in the ruleset), then the empty string should be
+ * returned for the shorthand property.
+ * <p> For example, querying for the <code>font</code> property should not
+ * return "normal normal normal 14pt/normal Arial, sans-serif", when "14pt
+ * Arial, sans-serif" suffices. (The normals are initial values, and are
+ * implied by use of the longhand property.)
+ * <p> If the values for all the longhand properties that compose a particular
+ * string are the initial values, then a string consisting of all the
+ * initial values should be returned (e.g. a <code>border-width</code> value
+ * of "medium" should be returned as such, not as "").
+ * <p> For some shorthand properties that take missing values from other
+ * sides, such as the <code>margin</code>, <code>padding</code>, and
+ * <code>border-[width|style|color]</code> properties, the minimum number of
+ * sides possible should be used; i.e., "0px 10px" will be returned instead
+ * of "0px 10px 0px 10px".
+ * <p> If the value of a shorthand property can not be decomposed into its
+ * component longhand properties, as is the case for the <code>font</code>
+ * property with a value of "menu", querying for the values of the component
+ * longhand properties should return the empty string.
+ * <p>See also the <a href='http://www.w3.org/TR/2000/REC-DOM-Level-2-Style-20001113'>Document Object Model (DOM) Level 2 Style Specification</a>.
+ * @since DOM Level 2
+ */
+public interface CSS2Properties {
+ /**
+ * See the azimuth property definition in CSS2.
+ * @exception DOMException
+ * SYNTAX_ERR: Raised if the new value has a syntax error and is
+ * unparsable.
+ * <br>NO_MODIFICATION_ALLOWED_ERR: Raised if this property is readonly.
+ */
+ public String getAzimuth();
+ /**
+ * See the azimuth property definition in CSS2.
+ * @exception DOMException
+ * SYNTAX_ERR: Raised if the new value has a syntax error and is
+ * unparsable.
+ * <br>NO_MODIFICATION_ALLOWED_ERR: Raised if this property is readonly.
+ */
+ public void setAzimuth(String azimuth)
+ throws DOMException;
+
+ /**
+ * See the background property definition in CSS2.
+ * @exception DOMException
+ * SYNTAX_ERR: Raised if the new value has a syntax error and is
+ * unparsable.
+ * <br>NO_MODIFICATION_ALLOWED_ERR: Raised if this property is readonly.
+ */
+ public String getBackground();
+ /**
+ * See the background property definition in CSS2.
+ * @exception DOMException
+ * SYNTAX_ERR: Raised if the new value has a syntax error and is
+ * unparsable.
+ * <br>NO_MODIFICATION_ALLOWED_ERR: Raised if this property is readonly.
+ */
+ public void setBackground(String background)
+ throws DOMException;
+
+ /**
+ * See the background-attachment property definition in CSS2.
+ * @exception DOMException
+ * SYNTAX_ERR: Raised if the new value has a syntax error and is
+ * unparsable.
+ * <br>NO_MODIFICATION_ALLOWED_ERR: Raised if this property is readonly.
+ */
+ public String getBackgroundAttachment();
+ /**
+ * See the background-attachment property definition in CSS2.
+ * @exception DOMException
+ * SYNTAX_ERR: Raised if the new value has a syntax error and is
+ * unparsable.
+ * <br>NO_MODIFICATION_ALLOWED_ERR: Raised if this property is readonly.
+ */
+ public void setBackgroundAttachment(String backgroundAttachment)
+ throws DOMException;
+
+ /**
+ * See the background-color property definition in CSS2.
+ * @exception DOMException
+ * SYNTAX_ERR: Raised if the new value has a syntax error and is
+ * unparsable.
+ * <br>NO_MODIFICATION_ALLOWED_ERR: Raised if this property is readonly.
+ */
+ public String getBackgroundColor();
+ /**
+ * See the background-color property definition in CSS2.
+ * @exception DOMException
+ * SYNTAX_ERR: Raised if the new value has a syntax error and is
+ * unparsable.
+ * <br>NO_MODIFICATION_ALLOWED_ERR: Raised if this property is readonly.
+ */
+ public void setBackgroundColor(String backgroundColor)
+ throws DOMException;
+
+ /**
+ * See the background-image property definition in CSS2.
+ * @exception DOMException
+ * SYNTAX_ERR: Raised if the new value has a syntax error and is
+ * unparsable.
+ * <br>NO_MODIFICATION_ALLOWED_ERR: Raised if this property is readonly.
+ */
+ public String getBackgroundImage();
+ /**
+ * See the background-image property definition in CSS2.
+ * @exception DOMException
+ * SYNTAX_ERR: Raised if the new value has a syntax error and is
+ * unparsable.
+ * <br>NO_MODIFICATION_ALLOWED_ERR: Raised if this property is readonly.
+ */
+ public void setBackgroundImage(String backgroundImage)
+ throws DOMException;
+
+ /**
+ * See the background-position property definition in CSS2.
+ * @exception DOMException
+ * SYNTAX_ERR: Raised if the new value has a syntax error and is
+ * unparsable.
+ * <br>NO_MODIFICATION_ALLOWED_ERR: Raised if this property is readonly.
+ */
+ public String getBackgroundPosition();
+ /**
+ * See the background-position property definition in CSS2.
+ * @exception DOMException
+ * SYNTAX_ERR: Raised if the new value has a syntax error and is
+ * unparsable.
+ * <br>NO_MODIFICATION_ALLOWED_ERR: Raised if this property is readonly.
+ */
+ public void setBackgroundPosition(String backgroundPosition)
+ throws DOMException;
+
+ /**
+ * See the background-repeat property definition in CSS2.
+ * @exception DOMException
+ * SYNTAX_ERR: Raised if the new value has a syntax error and is
+ * unparsable.
+ * <br>NO_MODIFICATION_ALLOWED_ERR: Raised if this property is readonly.
+ */
+ public String getBackgroundRepeat();
+ /**
+ * See the background-repeat property definition in CSS2.
+ * @exception DOMException
+ * SYNTAX_ERR: Raised if the new value has a syntax error and is
+ * unparsable.
+ * <br>NO_MODIFICATION_ALLOWED_ERR: Raised if this property is readonly.
+ */
+ public void setBackgroundRepeat(String backgroundRepeat)
+ throws DOMException;
+
+ /**
+ * See the border property definition in CSS2.
+ * @exception DOMException
+ * SYNTAX_ERR: Raised if the new value has a syntax error and is
+ * unparsable.
+ * <br>NO_MODIFICATION_ALLOWED_ERR: Raised if this property is readonly.
+ */
+ public String getBorder();
+ /**
+ * See the border property definition in CSS2.
+ * @exception DOMException
+ * SYNTAX_ERR: Raised if the new value has a syntax error and is
+ * unparsable.
+ * <br>NO_MODIFICATION_ALLOWED_ERR: Raised if this property is readonly.
+ */
+ public void setBorder(String border)
+ throws DOMException;
+
+ /**
+ * See the border-collapse property definition in CSS2.
+ * @exception DOMException
+ * SYNTAX_ERR: Raised if the new value has a syntax error and is
+ * unparsable.
+ * <br>NO_MODIFICATION_ALLOWED_ERR: Raised if this property is readonly.
+ */
+ public String getBorderCollapse();
+ /**
+ * See the border-collapse property definition in CSS2.
+ * @exception DOMException
+ * SYNTAX_ERR: Raised if the new value has a syntax error and is
+ * unparsable.
+ * <br>NO_MODIFICATION_ALLOWED_ERR: Raised if this property is readonly.
+ */
+ public void setBorderCollapse(String borderCollapse)
+ throws DOMException;
+
+ /**
+ * See the border-color property definition in CSS2.
+ * @exception DOMException
+ * SYNTAX_ERR: Raised if the new value has a syntax error and is
+ * unparsable.
+ * <br>NO_MODIFICATION_ALLOWED_ERR: Raised if this property is readonly.
+ */
+ public String getBorderColor();
+ /**
+ * See the border-color property definition in CSS2.
+ * @exception DOMException
+ * SYNTAX_ERR: Raised if the new value has a syntax error and is
+ * unparsable.
+ * <br>NO_MODIFICATION_ALLOWED_ERR: Raised if this property is readonly.
+ */
+ public void setBorderColor(String borderColor)
+ throws DOMException;
+
+ /**
+ * See the border-spacing property definition in CSS2.
+ * @exception DOMException
+ * SYNTAX_ERR: Raised if the new value has a syntax error and is
+ * unparsable.
+ * <br>NO_MODIFICATION_ALLOWED_ERR: Raised if this property is readonly.
+ */
+ public String getBorderSpacing();
+ /**
+ * See the border-spacing property definition in CSS2.
+ * @exception DOMException
+ * SYNTAX_ERR: Raised if the new value has a syntax error and is
+ * unparsable.
+ * <br>NO_MODIFICATION_ALLOWED_ERR: Raised if this property is readonly.
+ */
+ public void setBorderSpacing(String borderSpacing)
+ throws DOMException;
+
+ /**
+ * See the border-style property definition in CSS2.
+ * @exception DOMException
+ * SYNTAX_ERR: Raised if the new value has a syntax error and is
+ * unparsable.
+ * <br>NO_MODIFICATION_ALLOWED_ERR: Raised if this property is readonly.
+ */
+ public String getBorderStyle();
+ /**
+ * See the border-style property definition in CSS2.
+ * @exception DOMException
+ * SYNTAX_ERR: Raised if the new value has a syntax error and is
+ * unparsable.
+ * <br>NO_MODIFICATION_ALLOWED_ERR: Raised if this property is readonly.
+ */
+ public void setBorderStyle(String borderStyle)
+ throws DOMException;
+
+ /**
+ * See the border-top property definition in CSS2.
+ * @exception DOMException
+ * SYNTAX_ERR: Raised if the new value has a syntax error and is
+ * unparsable.
+ * <br>NO_MODIFICATION_ALLOWED_ERR: Raised if this property is readonly.
+ */
+ public String getBorderTop();
+ /**
+ * See the border-top property definition in CSS2.
+ * @exception DOMException
+ * SYNTAX_ERR: Raised if the new value has a syntax error and is
+ * unparsable.
+ * <br>NO_MODIFICATION_ALLOWED_ERR: Raised if this property is readonly.
+ */
+ public void setBorderTop(String borderTop)
+ throws DOMException;
+
+ /**
+ * See the border-right property definition in CSS2.
+ * @exception DOMException
+ * SYNTAX_ERR: Raised if the new value has a syntax error and is
+ * unparsable.
+ * <br>NO_MODIFICATION_ALLOWED_ERR: Raised if this property is readonly.
+ */
+ public String getBorderRight();
+ /**
+ * See the border-right property definition in CSS2.
+ * @exception DOMException
+ * SYNTAX_ERR: Raised if the new value has a syntax error and is
+ * unparsable.
+ * <br>NO_MODIFICATION_ALLOWED_ERR: Raised if this property is readonly.
+ */
+ public void setBorderRight(String borderRight)
+ throws DOMException;
+
+ /**
+ * See the border-bottom property definition in CSS2.
+ * @exception DOMException
+ * SYNTAX_ERR: Raised if the new value has a syntax error and is
+ * unparsable.
+ * <br>NO_MODIFICATION_ALLOWED_ERR: Raised if this property is readonly.
+ */
+ public String getBorderBottom();
+ /**
+ * See the border-bottom property definition in CSS2.
+ * @exception DOMException
+ * SYNTAX_ERR: Raised if the new value has a syntax error and is
+ * unparsable.
+ * <br>NO_MODIFICATION_ALLOWED_ERR: Raised if this property is readonly.
+ */
+ public void setBorderBottom(String borderBottom)
+ throws DOMException;
+
+ /**
+ * See the border-left property definition in CSS2.
+ * @exception DOMException
+ * SYNTAX_ERR: Raised if the new value has a syntax error and is
+ * unparsable.
+ * <br>NO_MODIFICATION_ALLOWED_ERR: Raised if this property is readonly.
+ */
+ public String getBorderLeft();
+ /**
+ * See the border-left property definition in CSS2.
+ * @exception DOMException
+ * SYNTAX_ERR: Raised if the new value has a syntax error and is
+ * unparsable.
+ * <br>NO_MODIFICATION_ALLOWED_ERR: Raised if this property is readonly.
+ */
+ public void setBorderLeft(String borderLeft)
+ throws DOMException;
+
+ /**
+ * See the border-top-color property definition in CSS2.
+ * @exception DOMException
+ * SYNTAX_ERR: Raised if the new value has a syntax error and is
+ * unparsable.
+ * <br>NO_MODIFICATION_ALLOWED_ERR: Raised if this property is readonly.
+ */
+ public String getBorderTopColor();
+ /**
+ * See the border-top-color property definition in CSS2.
+ * @exception DOMException
+ * SYNTAX_ERR: Raised if the new value has a syntax error and is
+ * unparsable.
+ * <br>NO_MODIFICATION_ALLOWED_ERR: Raised if this property is readonly.
+ */
+ public void setBorderTopColor(String borderTopColor)
+ throws DOMException;
+
+ /**
+ * See the border-right-color property definition in CSS2.
+ * @exception DOMException
+ * SYNTAX_ERR: Raised if the new value has a syntax error and is
+ * unparsable.
+ * <br>NO_MODIFICATION_ALLOWED_ERR: Raised if this property is readonly.
+ */
+ public String getBorderRightColor();
+ /**
+ * See the border-right-color property definition in CSS2.
+ * @exception DOMException
+ * SYNTAX_ERR: Raised if the new value has a syntax error and is
+ * unparsable.
+ * <br>NO_MODIFICATION_ALLOWED_ERR: Raised if this property is readonly.
+ */
+ public void setBorderRightColor(String borderRightColor)
+ throws DOMException;
+
+ /**
+ * See the border-bottom-color property definition in CSS2.
+ * @exception DOMException
+ * SYNTAX_ERR: Raised if the new value has a syntax error and is
+ * unparsable.
+ * <br>NO_MODIFICATION_ALLOWED_ERR: Raised if this property is readonly.
+ */
+ public String getBorderBottomColor();
+ /**
+ * See the border-bottom-color property definition in CSS2.
+ * @exception DOMException
+ * SYNTAX_ERR: Raised if the new value has a syntax error and is
+ * unparsable.
+ * <br>NO_MODIFICATION_ALLOWED_ERR: Raised if this property is readonly.
+ */
+ public void setBorderBottomColor(String borderBottomColor)
+ throws DOMException;
+
+ /**
+ * See the border-left-color property definition in CSS2.
+ * @exception DOMException
+ * SYNTAX_ERR: Raised if the new value has a syntax error and is
+ * unparsable.
+ * <br>NO_MODIFICATION_ALLOWED_ERR: Raised if this property is readonly.
+ */
+ public String getBorderLeftColor();
+ /**
+ * See the border-left-color property definition in CSS2.
+ * @exception DOMException
+ * SYNTAX_ERR: Raised if the new value has a syntax error and is
+ * unparsable.
+ * <br>NO_MODIFICATION_ALLOWED_ERR: Raised if this property is readonly.
+ */
+ public void setBorderLeftColor(String borderLeftColor)
+ throws DOMException;
+
+ /**
+ * See the border-top-style property definition in CSS2.
+ * @exception DOMException
+ * SYNTAX_ERR: Raised if the new value has a syntax error and is
+ * unparsable.
+ * <br>NO_MODIFICATION_ALLOWED_ERR: Raised if this property is readonly.
+ */
+ public String getBorderTopStyle();
+ /**
+ * See the border-top-style property definition in CSS2.
+ * @exception DOMException
+ * SYNTAX_ERR: Raised if the new value has a syntax error and is
+ * unparsable.
+ * <br>NO_MODIFICATION_ALLOWED_ERR: Raised if this property is readonly.
+ */
+ public void setBorderTopStyle(String borderTopStyle)
+ throws DOMException;
+
+ /**
+ * See the border-right-style property definition in CSS2.
+ * @exception DOMException
+ * SYNTAX_ERR: Raised if the new value has a syntax error and is
+ * unparsable.
+ * <br>NO_MODIFICATION_ALLOWED_ERR: Raised if this property is readonly.
+ */
+ public String getBorderRightStyle();
+ /**
+ * See the border-right-style property definition in CSS2.
+ * @exception DOMException
+ * SYNTAX_ERR: Raised if the new value has a syntax error and is
+ * unparsable.
+ * <br>NO_MODIFICATION_ALLOWED_ERR: Raised if this property is readonly.
+ */
+ public void setBorderRightStyle(String borderRightStyle)
+ throws DOMException;
+
+ /**
+ * See the border-bottom-style property definition in CSS2.
+ * @exception DOMException
+ * SYNTAX_ERR: Raised if the new value has a syntax error and is
+ * unparsable.
+ * <br>NO_MODIFICATION_ALLOWED_ERR: Raised if this property is readonly.
+ */
+ public String getBorderBottomStyle();
+ /**
+ * See the border-bottom-style property definition in CSS2.
+ * @exception DOMException
+ * SYNTAX_ERR: Raised if the new value has a syntax error and is
+ * unparsable.
+ * <br>NO_MODIFICATION_ALLOWED_ERR: Raised if this property is readonly.
+ */
+ public void setBorderBottomStyle(String borderBottomStyle)
+ throws DOMException;
+
+ /**
+ * See the border-left-style property definition in CSS2.
+ * @exception DOMException
+ * SYNTAX_ERR: Raised if the new value has a syntax error and is
+ * unparsable.
+ * <br>NO_MODIFICATION_ALLOWED_ERR: Raised if this property is readonly.
+ */
+ public String getBorderLeftStyle();
+ /**
+ * See the border-left-style property definition in CSS2.
+ * @exception DOMException
+ * SYNTAX_ERR: Raised if the new value has a syntax error and is
+ * unparsable.
+ * <br>NO_MODIFICATION_ALLOWED_ERR: Raised if this property is readonly.
+ */
+ public void setBorderLeftStyle(String borderLeftStyle)
+ throws DOMException;
+
+ /**
+ * See the border-top-width property definition in CSS2.
+ * @exception DOMException
+ * SYNTAX_ERR: Raised if the new value has a syntax error and is
+ * unparsable.
+ * <br>NO_MODIFICATION_ALLOWED_ERR: Raised if this property is readonly.
+ */
+ public String getBorderTopWidth();
+ /**
+ * See the border-top-width property definition in CSS2.
+ * @exception DOMException
+ * SYNTAX_ERR: Raised if the new value has a syntax error and is
+ * unparsable.
+ * <br>NO_MODIFICATION_ALLOWED_ERR: Raised if this property is readonly.
+ */
+ public void setBorderTopWidth(String borderTopWidth)
+ throws DOMException;
+
+ /**
+ * See the border-right-width property definition in CSS2.
+ * @exception DOMException
+ * SYNTAX_ERR: Raised if the new value has a syntax error and is
+ * unparsable.
+ * <br>NO_MODIFICATION_ALLOWED_ERR: Raised if this property is readonly.
+ */
+ public String getBorderRightWidth();
+ /**
+ * See the border-right-width property definition in CSS2.
+ * @exception DOMException
+ * SYNTAX_ERR: Raised if the new value has a syntax error and is
+ * unparsable.
+ * <br>NO_MODIFICATION_ALLOWED_ERR: Raised if this property is readonly.
+ */
+ public void setBorderRightWidth(String borderRightWidth)
+ throws DOMException;
+
+ /**
+ * See the border-bottom-width property definition in CSS2.
+ * @exception DOMException
+ * SYNTAX_ERR: Raised if the new value has a syntax error and is
+ * unparsable.
+ * <br>NO_MODIFICATION_ALLOWED_ERR: Raised if this property is readonly.
+ */
+ public String getBorderBottomWidth();
+ /**
+ * See the border-bottom-width property definition in CSS2.
+ * @exception DOMException
+ * SYNTAX_ERR: Raised if the new value has a syntax error and is
+ * unparsable.
+ * <br>NO_MODIFICATION_ALLOWED_ERR: Raised if this property is readonly.
+ */
+ public void setBorderBottomWidth(String borderBottomWidth)
+ throws DOMException;
+
+ /**
+ * See the border-left-width property definition in CSS2.
+ * @exception DOMException
+ * SYNTAX_ERR: Raised if the new value has a syntax error and is
+ * unparsable.
+ * <br>NO_MODIFICATION_ALLOWED_ERR: Raised if this property is readonly.
+ */
+ public String getBorderLeftWidth();
+ /**
+ * See the border-left-width property definition in CSS2.
+ * @exception DOMException
+ * SYNTAX_ERR: Raised if the new value has a syntax error and is
+ * unparsable.
+ * <br>NO_MODIFICATION_ALLOWED_ERR: Raised if this property is readonly.
+ */
+ public void setBorderLeftWidth(String borderLeftWidth)
+ throws DOMException;
+
+ /**
+ * See the border-width property definition in CSS2.
+ * @exception DOMException
+ * SYNTAX_ERR: Raised if the new value has a syntax error and is
+ * unparsable.
+ * <br>NO_MODIFICATION_ALLOWED_ERR: Raised if this property is readonly.
+ */
+ public String getBorderWidth();
+ /**
+ * See the border-width property definition in CSS2.
+ * @exception DOMException
+ * SYNTAX_ERR: Raised if the new value has a syntax error and is
+ * unparsable.
+ * <br>NO_MODIFICATION_ALLOWED_ERR: Raised if this property is readonly.
+ */
+ public void setBorderWidth(String borderWidth)
+ throws DOMException;
+
+ /**
+ * See the bottom property definition in CSS2.
+ * @exception DOMException
+ * SYNTAX_ERR: Raised if the new value has a syntax error and is
+ * unparsable.
+ * <br>NO_MODIFICATION_ALLOWED_ERR: Raised if this property is readonly.
+ */
+ public String getBottom();
+ /**
+ * See the bottom property definition in CSS2.
+ * @exception DOMException
+ * SYNTAX_ERR: Raised if the new value has a syntax error and is
+ * unparsable.
+ * <br>NO_MODIFICATION_ALLOWED_ERR: Raised if this property is readonly.
+ */
+ public void setBottom(String bottom)
+ throws DOMException;
+
+ /**
+ * See the caption-side property definition in CSS2.
+ * @exception DOMException
+ * SYNTAX_ERR: Raised if the new value has a syntax error and is
+ * unparsable.
+ * <br>NO_MODIFICATION_ALLOWED_ERR: Raised if this property is readonly.
+ */
+ public String getCaptionSide();
+ /**
+ * See the caption-side property definition in CSS2.
+ * @exception DOMException
+ * SYNTAX_ERR: Raised if the new value has a syntax error and is
+ * unparsable.
+ * <br>NO_MODIFICATION_ALLOWED_ERR: Raised if this property is readonly.
+ */
+ public void setCaptionSide(String captionSide)
+ throws DOMException;
+
+ /**
+ * See the clear property definition in CSS2.
+ * @exception DOMException
+ * SYNTAX_ERR: Raised if the new value has a syntax error and is
+ * unparsable.
+ * <br>NO_MODIFICATION_ALLOWED_ERR: Raised if this property is readonly.
+ */
+ public String getClear();
+ /**
+ * See the clear property definition in CSS2.
+ * @exception DOMException
+ * SYNTAX_ERR: Raised if the new value has a syntax error and is
+ * unparsable.
+ * <br>NO_MODIFICATION_ALLOWED_ERR: Raised if this property is readonly.
+ */
+ public void setClear(String clear)
+ throws DOMException;
+
+ /**
+ * See the clip property definition in CSS2.
+ * @exception DOMException
+ * SYNTAX_ERR: Raised if the new value has a syntax error and is
+ * unparsable.
+ * <br>NO_MODIFICATION_ALLOWED_ERR: Raised if this property is readonly.
+ */
+ public String getClip();
+ /**
+ * See the clip property definition in CSS2.
+ * @exception DOMException
+ * SYNTAX_ERR: Raised if the new value has a syntax error and is
+ * unparsable.
+ * <br>NO_MODIFICATION_ALLOWED_ERR: Raised if this property is readonly.
+ */
+ public void setClip(String clip)
+ throws DOMException;
+
+ /**
+ * See the color property definition in CSS2.
+ * @exception DOMException
+ * SYNTAX_ERR: Raised if the new value has a syntax error and is
+ * unparsable.
+ * <br>NO_MODIFICATION_ALLOWED_ERR: Raised if this property is readonly.
+ */
+ public String getColor();
+ /**
+ * See the color property definition in CSS2.
+ * @exception DOMException
+ * SYNTAX_ERR: Raised if the new value has a syntax error and is
+ * unparsable.
+ * <br>NO_MODIFICATION_ALLOWED_ERR: Raised if this property is readonly.
+ */
+ public void setColor(String color)
+ throws DOMException;
+
+ /**
+ * See the content property definition in CSS2.
+ * @exception DOMException
+ * SYNTAX_ERR: Raised if the new value has a syntax error and is
+ * unparsable.
+ * <br>NO_MODIFICATION_ALLOWED_ERR: Raised if this property is readonly.
+ */
+ public String getContent();
+ /**
+ * See the content property definition in CSS2.
+ * @exception DOMException
+ * SYNTAX_ERR: Raised if the new value has a syntax error and is
+ * unparsable.
+ * <br>NO_MODIFICATION_ALLOWED_ERR: Raised if this property is readonly.
+ */
+ public void setContent(String content)
+ throws DOMException;
+
+ /**
+ * See the counter-increment property definition in CSS2.
+ * @exception DOMException
+ * SYNTAX_ERR: Raised if the new value has a syntax error and is
+ * unparsable.
+ * <br>NO_MODIFICATION_ALLOWED_ERR: Raised if this property is readonly.
+ */
+ public String getCounterIncrement();
+ /**
+ * See the counter-increment property definition in CSS2.
+ * @exception DOMException
+ * SYNTAX_ERR: Raised if the new value has a syntax error and is
+ * unparsable.
+ * <br>NO_MODIFICATION_ALLOWED_ERR: Raised if this property is readonly.
+ */
+ public void setCounterIncrement(String counterIncrement)
+ throws DOMException;
+
+ /**
+ * See the counter-reset property definition in CSS2.
+ * @exception DOMException
+ * SYNTAX_ERR: Raised if the new value has a syntax error and is
+ * unparsable.
+ * <br>NO_MODIFICATION_ALLOWED_ERR: Raised if this property is readonly.
+ */
+ public String getCounterReset();
+ /**
+ * See the counter-reset property definition in CSS2.
+ * @exception DOMException
+ * SYNTAX_ERR: Raised if the new value has a syntax error and is
+ * unparsable.
+ * <br>NO_MODIFICATION_ALLOWED_ERR: Raised if this property is readonly.
+ */
+ public void setCounterReset(String counterReset)
+ throws DOMException;
+
+ /**
+ * See the cue property definition in CSS2.
+ * @exception DOMException
+ * SYNTAX_ERR: Raised if the new value has a syntax error and is
+ * unparsable.
+ * <br>NO_MODIFICATION_ALLOWED_ERR: Raised if this property is readonly.
+ */
+ public String getCue();
+ /**
+ * See the cue property definition in CSS2.
+ * @exception DOMException
+ * SYNTAX_ERR: Raised if the new value has a syntax error and is
+ * unparsable.
+ * <br>NO_MODIFICATION_ALLOWED_ERR: Raised if this property is readonly.
+ */
+ public void setCue(String cue)
+ throws DOMException;
+
+ /**
+ * See the cue-after property definition in CSS2.
+ * @exception DOMException
+ * SYNTAX_ERR: Raised if the new value has a syntax error and is
+ * unparsable.
+ * <br>NO_MODIFICATION_ALLOWED_ERR: Raised if this property is readonly.
+ */
+ public String getCueAfter();
+ /**
+ * See the cue-after property definition in CSS2.
+ * @exception DOMException
+ * SYNTAX_ERR: Raised if the new value has a syntax error and is
+ * unparsable.
+ * <br>NO_MODIFICATION_ALLOWED_ERR: Raised if this property is readonly.
+ */
+ public void setCueAfter(String cueAfter)
+ throws DOMException;
+
+ /**
+ * See the cue-before property definition in CSS2.
+ * @exception DOMException
+ * SYNTAX_ERR: Raised if the new value has a syntax error and is
+ * unparsable.
+ * <br>NO_MODIFICATION_ALLOWED_ERR: Raised if this property is readonly.
+ */
+ public String getCueBefore();
+ /**
+ * See the cue-before property definition in CSS2.
+ * @exception DOMException
+ * SYNTAX_ERR: Raised if the new value has a syntax error and is
+ * unparsable.
+ * <br>NO_MODIFICATION_ALLOWED_ERR: Raised if this property is readonly.
+ */
+ public void setCueBefore(String cueBefore)
+ throws DOMException;
+
+ /**
+ * See the cursor property definition in CSS2.
+ * @exception DOMException
+ * SYNTAX_ERR: Raised if the new value has a syntax error and is
+ * unparsable.
+ * <br>NO_MODIFICATION_ALLOWED_ERR: Raised if this property is readonly.
+ */
+ public String getCursor();
+ /**
+ * See the cursor property definition in CSS2.
+ * @exception DOMException
+ * SYNTAX_ERR: Raised if the new value has a syntax error and is
+ * unparsable.
+ * <br>NO_MODIFICATION_ALLOWED_ERR: Raised if this property is readonly.
+ */
+ public void setCursor(String cursor)
+ throws DOMException;
+
+ /**
+ * See the direction property definition in CSS2.
+ * @exception DOMException
+ * SYNTAX_ERR: Raised if the new value has a syntax error and is
+ * unparsable.
+ * <br>NO_MODIFICATION_ALLOWED_ERR: Raised if this property is readonly.
+ */
+ public String getDirection();
+ /**
+ * See the direction property definition in CSS2.
+ * @exception DOMException
+ * SYNTAX_ERR: Raised if the new value has a syntax error and is
+ * unparsable.
+ * <br>NO_MODIFICATION_ALLOWED_ERR: Raised if this property is readonly.
+ */
+ public void setDirection(String direction)
+ throws DOMException;
+
+ /**
+ * See the display property definition in CSS2.
+ * @exception DOMException
+ * SYNTAX_ERR: Raised if the new value has a syntax error and is
+ * unparsable.
+ * <br>NO_MODIFICATION_ALLOWED_ERR: Raised if this property is readonly.
+ */
+ public String getDisplay();
+ /**
+ * See the display property definition in CSS2.
+ * @exception DOMException
+ * SYNTAX_ERR: Raised if the new value has a syntax error and is
+ * unparsable.
+ * <br>NO_MODIFICATION_ALLOWED_ERR: Raised if this property is readonly.
+ */
+ public void setDisplay(String display)
+ throws DOMException;
+
+ /**
+ * See the elevation property definition in CSS2.
+ * @exception DOMException
+ * SYNTAX_ERR: Raised if the new value has a syntax error and is
+ * unparsable.
+ * <br>NO_MODIFICATION_ALLOWED_ERR: Raised if this property is readonly.
+ */
+ public String getElevation();
+ /**
+ * See the elevation property definition in CSS2.
+ * @exception DOMException
+ * SYNTAX_ERR: Raised if the new value has a syntax error and is
+ * unparsable.
+ * <br>NO_MODIFICATION_ALLOWED_ERR: Raised if this property is readonly.
+ */
+ public void setElevation(String elevation)
+ throws DOMException;
+
+ /**
+ * See the empty-cells property definition in CSS2.
+ * @exception DOMException
+ * SYNTAX_ERR: Raised if the new value has a syntax error and is
+ * unparsable.
+ * <br>NO_MODIFICATION_ALLOWED_ERR: Raised if this property is readonly.
+ */
+ public String getEmptyCells();
+ /**
+ * See the empty-cells property definition in CSS2.
+ * @exception DOMException
+ * SYNTAX_ERR: Raised if the new value has a syntax error and is
+ * unparsable.
+ * <br>NO_MODIFICATION_ALLOWED_ERR: Raised if this property is readonly.
+ */
+ public void setEmptyCells(String emptyCells)
+ throws DOMException;
+
+ /**
+ * See the float property definition in CSS2.
+ * @exception DOMException
+ * SYNTAX_ERR: Raised if the new value has a syntax error and is
+ * unparsable.
+ * <br>NO_MODIFICATION_ALLOWED_ERR: Raised if this property is readonly.
+ */
+ public String getCssFloat();
+ /**
+ * See the float property definition in CSS2.
+ * @exception DOMException
+ * SYNTAX_ERR: Raised if the new value has a syntax error and is
+ * unparsable.
+ * <br>NO_MODIFICATION_ALLOWED_ERR: Raised if this property is readonly.
+ */
+ public void setCssFloat(String cssFloat)
+ throws DOMException;
+
+ /**
+ * See the font property definition in CSS2.
+ * @exception DOMException
+ * SYNTAX_ERR: Raised if the new value has a syntax error and is
+ * unparsable.
+ * <br>NO_MODIFICATION_ALLOWED_ERR: Raised if this property is readonly.
+ */
+ public String getFont();
+ /**
+ * See the font property definition in CSS2.
+ * @exception DOMException
+ * SYNTAX_ERR: Raised if the new value has a syntax error and is
+ * unparsable.
+ * <br>NO_MODIFICATION_ALLOWED_ERR: Raised if this property is readonly.
+ */
+ public void setFont(String font)
+ throws DOMException;
+
+ /**
+ * See the font-family property definition in CSS2.
+ * @exception DOMException
+ * SYNTAX_ERR: Raised if the new value has a syntax error and is
+ * unparsable.
+ * <br>NO_MODIFICATION_ALLOWED_ERR: Raised if this property is readonly.
+ */
+ public String getFontFamily();
+ /**
+ * See the font-family property definition in CSS2.
+ * @exception DOMException
+ * SYNTAX_ERR: Raised if the new value has a syntax error and is
+ * unparsable.
+ * <br>NO_MODIFICATION_ALLOWED_ERR: Raised if this property is readonly.
+ */
+ public void setFontFamily(String fontFamily)
+ throws DOMException;
+
+ /**
+ * See the font-size property definition in CSS2.
+ * @exception DOMException
+ * SYNTAX_ERR: Raised if the new value has a syntax error and is
+ * unparsable.
+ * <br>NO_MODIFICATION_ALLOWED_ERR: Raised if this property is readonly.
+ */
+ public String getFontSize();
+ /**
+ * See the font-size property definition in CSS2.
+ * @exception DOMException
+ * SYNTAX_ERR: Raised if the new value has a syntax error and is
+ * unparsable.
+ * <br>NO_MODIFICATION_ALLOWED_ERR: Raised if this property is readonly.
+ */
+ public void setFontSize(String fontSize)
+ throws DOMException;
+
+ /**
+ * See the font-size-adjust property definition in CSS2.
+ * @exception DOMException
+ * SYNTAX_ERR: Raised if the new value has a syntax error and is
+ * unparsable.
+ * <br>NO_MODIFICATION_ALLOWED_ERR: Raised if this property is readonly.
+ */
+ public String getFontSizeAdjust();
+ /**
+ * See the font-size-adjust property definition in CSS2.
+ * @exception DOMException
+ * SYNTAX_ERR: Raised if the new value has a syntax error and is
+ * unparsable.
+ * <br>NO_MODIFICATION_ALLOWED_ERR: Raised if this property is readonly.
+ */
+ public void setFontSizeAdjust(String fontSizeAdjust)
+ throws DOMException;
+
+ /**
+ * See the font-stretch property definition in CSS2.
+ * @exception DOMException
+ * SYNTAX_ERR: Raised if the new value has a syntax error and is
+ * unparsable.
+ * <br>NO_MODIFICATION_ALLOWED_ERR: Raised if this property is readonly.
+ */
+ public String getFontStretch();
+ /**
+ * See the font-stretch property definition in CSS2.
+ * @exception DOMException
+ * SYNTAX_ERR: Raised if the new value has a syntax error and is
+ * unparsable.
+ * <br>NO_MODIFICATION_ALLOWED_ERR: Raised if this property is readonly.
+ */
+ public void setFontStretch(String fontStretch)
+ throws DOMException;
+
+ /**
+ * See the font-style property definition in CSS2.
+ * @exception DOMException
+ * SYNTAX_ERR: Raised if the new value has a syntax error and is
+ * unparsable.
+ * <br>NO_MODIFICATION_ALLOWED_ERR: Raised if this property is readonly.
+ */
+ public String getFontStyle();
+ /**
+ * See the font-style property definition in CSS2.
+ * @exception DOMException
+ * SYNTAX_ERR: Raised if the new value has a syntax error and is
+ * unparsable.
+ * <br>NO_MODIFICATION_ALLOWED_ERR: Raised if this property is readonly.
+ */
+ public void setFontStyle(String fontStyle)
+ throws DOMException;
+
+ /**
+ * See the font-variant property definition in CSS2.
+ * @exception DOMException
+ * SYNTAX_ERR: Raised if the new value has a syntax error and is
+ * unparsable.
+ * <br>NO_MODIFICATION_ALLOWED_ERR: Raised if this property is readonly.
+ */
+ public String getFontVariant();
+ /**
+ * See the font-variant property definition in CSS2.
+ * @exception DOMException
+ * SYNTAX_ERR: Raised if the new value has a syntax error and is
+ * unparsable.
+ * <br>NO_MODIFICATION_ALLOWED_ERR: Raised if this property is readonly.
+ */
+ public void setFontVariant(String fontVariant)
+ throws DOMException;
+
+ /**
+ * See the font-weight property definition in CSS2.
+ * @exception DOMException
+ * SYNTAX_ERR: Raised if the new value has a syntax error and is
+ * unparsable.
+ * <br>NO_MODIFICATION_ALLOWED_ERR: Raised if this property is readonly.
+ */
+ public String getFontWeight();
+ /**
+ * See the font-weight property definition in CSS2.
+ * @exception DOMException
+ * SYNTAX_ERR: Raised if the new value has a syntax error and is
+ * unparsable.
+ * <br>NO_MODIFICATION_ALLOWED_ERR: Raised if this property is readonly.
+ */
+ public void setFontWeight(String fontWeight)
+ throws DOMException;
+
+ /**
+ * See the height property definition in CSS2.
+ * @exception DOMException
+ * SYNTAX_ERR: Raised if the new value has a syntax error and is
+ * unparsable.
+ * <br>NO_MODIFICATION_ALLOWED_ERR: Raised if this property is readonly.
+ */
+ public String getHeight();
+ /**
+ * See the height property definition in CSS2.
+ * @exception DOMException
+ * SYNTAX_ERR: Raised if the new value has a syntax error and is
+ * unparsable.
+ * <br>NO_MODIFICATION_ALLOWED_ERR: Raised if this property is readonly.
+ */
+ public void setHeight(String height)
+ throws DOMException;
+
+ /**
+ * See the left property definition in CSS2.
+ * @exception DOMException
+ * SYNTAX_ERR: Raised if the new value has a syntax error and is
+ * unparsable.
+ * <br>NO_MODIFICATION_ALLOWED_ERR: Raised if this property is readonly.
+ */
+ public String getLeft();
+ /**
+ * See the left property definition in CSS2.
+ * @exception DOMException
+ * SYNTAX_ERR: Raised if the new value has a syntax error and is
+ * unparsable.
+ * <br>NO_MODIFICATION_ALLOWED_ERR: Raised if this property is readonly.
+ */
+ public void setLeft(String left)
+ throws DOMException;
+
+ /**
+ * See the letter-spacing property definition in CSS2.
+ * @exception DOMException
+ * SYNTAX_ERR: Raised if the new value has a syntax error and is
+ * unparsable.
+ * <br>NO_MODIFICATION_ALLOWED_ERR: Raised if this property is readonly.
+ */
+ public String getLetterSpacing();
+ /**
+ * See the letter-spacing property definition in CSS2.
+ * @exception DOMException
+ * SYNTAX_ERR: Raised if the new value has a syntax error and is
+ * unparsable.
+ * <br>NO_MODIFICATION_ALLOWED_ERR: Raised if this property is readonly.
+ */
+ public void setLetterSpacing(String letterSpacing)
+ throws DOMException;
+
+ /**
+ * See the line-height property definition in CSS2.
+ * @exception DOMException
+ * SYNTAX_ERR: Raised if the new value has a syntax error and is
+ * unparsable.
+ * <br>NO_MODIFICATION_ALLOWED_ERR: Raised if this property is readonly.
+ */
+ public String getLineHeight();
+ /**
+ * See the line-height property definition in CSS2.
+ * @exception DOMException
+ * SYNTAX_ERR: Raised if the new value has a syntax error and is
+ * unparsable.
+ * <br>NO_MODIFICATION_ALLOWED_ERR: Raised if this property is readonly.
+ */
+ public void setLineHeight(String lineHeight)
+ throws DOMException;
+
+ /**
+ * See the list-style property definition in CSS2.
+ * @exception DOMException
+ * SYNTAX_ERR: Raised if the new value has a syntax error and is
+ * unparsable.
+ * <br>NO_MODIFICATION_ALLOWED_ERR: Raised if this property is readonly.
+ */
+ public String getListStyle();
+ /**
+ * See the list-style property definition in CSS2.
+ * @exception DOMException
+ * SYNTAX_ERR: Raised if the new value has a syntax error and is
+ * unparsable.
+ * <br>NO_MODIFICATION_ALLOWED_ERR: Raised if this property is readonly.
+ */
+ public void setListStyle(String listStyle)
+ throws DOMException;
+
+ /**
+ * See the list-style-image property definition in CSS2.
+ * @exception DOMException
+ * SYNTAX_ERR: Raised if the new value has a syntax error and is
+ * unparsable.
+ * <br>NO_MODIFICATION_ALLOWED_ERR: Raised if this property is readonly.
+ */
+ public String getListStyleImage();
+ /**
+ * See the list-style-image property definition in CSS2.
+ * @exception DOMException
+ * SYNTAX_ERR: Raised if the new value has a syntax error and is
+ * unparsable.
+ * <br>NO_MODIFICATION_ALLOWED_ERR: Raised if this property is readonly.
+ */
+ public void setListStyleImage(String listStyleImage)
+ throws DOMException;
+
+ /**
+ * See the list-style-position property definition in CSS2.
+ * @exception DOMException
+ * SYNTAX_ERR: Raised if the new value has a syntax error and is
+ * unparsable.
+ * <br>NO_MODIFICATION_ALLOWED_ERR: Raised if this property is readonly.
+ */
+ public String getListStylePosition();
+ /**
+ * See the list-style-position property definition in CSS2.
+ * @exception DOMException
+ * SYNTAX_ERR: Raised if the new value has a syntax error and is
+ * unparsable.
+ * <br>NO_MODIFICATION_ALLOWED_ERR: Raised if this property is readonly.
+ */
+ public void setListStylePosition(String listStylePosition)
+ throws DOMException;
+
+ /**
+ * See the list-style-type property definition in CSS2.
+ * @exception DOMException
+ * SYNTAX_ERR: Raised if the new value has a syntax error and is
+ * unparsable.
+ * <br>NO_MODIFICATION_ALLOWED_ERR: Raised if this property is readonly.
+ */
+ public String getListStyleType();
+ /**
+ * See the list-style-type property definition in CSS2.
+ * @exception DOMException
+ * SYNTAX_ERR: Raised if the new value has a syntax error and is
+ * unparsable.
+ * <br>NO_MODIFICATION_ALLOWED_ERR: Raised if this property is readonly.
+ */
+ public void setListStyleType(String listStyleType)
+ throws DOMException;
+
+ /**
+ * See the margin property definition in CSS2.
+ * @exception DOMException
+ * SYNTAX_ERR: Raised if the new value has a syntax error and is
+ * unparsable.
+ * <br>NO_MODIFICATION_ALLOWED_ERR: Raised if this property is readonly.
+ */
+ public String getMargin();
+ /**
+ * See the margin property definition in CSS2.
+ * @exception DOMException
+ * SYNTAX_ERR: Raised if the new value has a syntax error and is
+ * unparsable.
+ * <br>NO_MODIFICATION_ALLOWED_ERR: Raised if this property is readonly.
+ */
+ public void setMargin(String margin)
+ throws DOMException;
+
+ /**
+ * See the margin-top property definition in CSS2.
+ * @exception DOMException
+ * SYNTAX_ERR: Raised if the new value has a syntax error and is
+ * unparsable.
+ * <br>NO_MODIFICATION_ALLOWED_ERR: Raised if this property is readonly.
+ */
+ public String getMarginTop();
+ /**
+ * See the margin-top property definition in CSS2.
+ * @exception DOMException
+ * SYNTAX_ERR: Raised if the new value has a syntax error and is
+ * unparsable.
+ * <br>NO_MODIFICATION_ALLOWED_ERR: Raised if this property is readonly.
+ */
+ public void setMarginTop(String marginTop)
+ throws DOMException;
+
+ /**
+ * See the margin-right property definition in CSS2.
+ * @exception DOMException
+ * SYNTAX_ERR: Raised if the new value has a syntax error and is
+ * unparsable.
+ * <br>NO_MODIFICATION_ALLOWED_ERR: Raised if this property is readonly.
+ */
+ public String getMarginRight();
+ /**
+ * See the margin-right property definition in CSS2.
+ * @exception DOMException
+ * SYNTAX_ERR: Raised if the new value has a syntax error and is
+ * unparsable.
+ * <br>NO_MODIFICATION_ALLOWED_ERR: Raised if this property is readonly.
+ */
+ public void setMarginRight(String marginRight)
+ throws DOMException;
+
+ /**
+ * See the margin-bottom property definition in CSS2.
+ * @exception DOMException
+ * SYNTAX_ERR: Raised if the new value has a syntax error and is
+ * unparsable.
+ * <br>NO_MODIFICATION_ALLOWED_ERR: Raised if this property is readonly.
+ */
+ public String getMarginBottom();
+ /**
+ * See the margin-bottom property definition in CSS2.
+ * @exception DOMException
+ * SYNTAX_ERR: Raised if the new value has a syntax error and is
+ * unparsable.
+ * <br>NO_MODIFICATION_ALLOWED_ERR: Raised if this property is readonly.
+ */
+ public void setMarginBottom(String marginBottom)
+ throws DOMException;
+
+ /**
+ * See the margin-left property definition in CSS2.
+ * @exception DOMException
+ * SYNTAX_ERR: Raised if the new value has a syntax error and is
+ * unparsable.
+ * <br>NO_MODIFICATION_ALLOWED_ERR: Raised if this property is readonly.
+ */
+ public String getMarginLeft();
+ /**
+ * See the margin-left property definition in CSS2.
+ * @exception DOMException
+ * SYNTAX_ERR: Raised if the new value has a syntax error and is
+ * unparsable.
+ * <br>NO_MODIFICATION_ALLOWED_ERR: Raised if this property is readonly.
+ */
+ public void setMarginLeft(String marginLeft)
+ throws DOMException;
+
+ /**
+ * See the marker-offset property definition in CSS2.
+ * @exception DOMException
+ * SYNTAX_ERR: Raised if the new value has a syntax error and is
+ * unparsable.
+ * <br>NO_MODIFICATION_ALLOWED_ERR: Raised if this property is readonly.
+ */
+ public String getMarkerOffset();
+ /**
+ * See the marker-offset property definition in CSS2.
+ * @exception DOMException
+ * SYNTAX_ERR: Raised if the new value has a syntax error and is
+ * unparsable.
+ * <br>NO_MODIFICATION_ALLOWED_ERR: Raised if this property is readonly.
+ */
+ public void setMarkerOffset(String markerOffset)
+ throws DOMException;
+
+ /**
+ * See the marks property definition in CSS2.
+ * @exception DOMException
+ * SYNTAX_ERR: Raised if the new value has a syntax error and is
+ * unparsable.
+ * <br>NO_MODIFICATION_ALLOWED_ERR: Raised if this property is readonly.
+ */
+ public String getMarks();
+ /**
+ * See the marks property definition in CSS2.
+ * @exception DOMException
+ * SYNTAX_ERR: Raised if the new value has a syntax error and is
+ * unparsable.
+ * <br>NO_MODIFICATION_ALLOWED_ERR: Raised if this property is readonly.
+ */
+ public void setMarks(String marks)
+ throws DOMException;
+
+ /**
+ * See the max-height property definition in CSS2.
+ * @exception DOMException
+ * SYNTAX_ERR: Raised if the new value has a syntax error and is
+ * unparsable.
+ * <br>NO_MODIFICATION_ALLOWED_ERR: Raised if this property is readonly.
+ */
+ public String getMaxHeight();
+ /**
+ * See the max-height property definition in CSS2.
+ * @exception DOMException
+ * SYNTAX_ERR: Raised if the new value has a syntax error and is
+ * unparsable.
+ * <br>NO_MODIFICATION_ALLOWED_ERR: Raised if this property is readonly.
+ */
+ public void setMaxHeight(String maxHeight)
+ throws DOMException;
+
+ /**
+ * See the max-width property definition in CSS2.
+ * @exception DOMException
+ * SYNTAX_ERR: Raised if the new value has a syntax error and is
+ * unparsable.
+ * <br>NO_MODIFICATION_ALLOWED_ERR: Raised if this property is readonly.
+ */
+ public String getMaxWidth();
+ /**
+ * See the max-width property definition in CSS2.
+ * @exception DOMException
+ * SYNTAX_ERR: Raised if the new value has a syntax error and is
+ * unparsable.
+ * <br>NO_MODIFICATION_ALLOWED_ERR: Raised if this property is readonly.
+ */
+ public void setMaxWidth(String maxWidth)
+ throws DOMException;
+
+ /**
+ * See the min-height property definition in CSS2.
+ * @exception DOMException
+ * SYNTAX_ERR: Raised if the new value has a syntax error and is
+ * unparsable.
+ * <br>NO_MODIFICATION_ALLOWED_ERR: Raised if this property is readonly.
+ */
+ public String getMinHeight();
+ /**
+ * See the min-height property definition in CSS2.
+ * @exception DOMException
+ * SYNTAX_ERR: Raised if the new value has a syntax error and is
+ * unparsable.
+ * <br>NO_MODIFICATION_ALLOWED_ERR: Raised if this property is readonly.
+ */
+ public void setMinHeight(String minHeight)
+ throws DOMException;
+
+ /**
+ * See the min-width property definition in CSS2.
+ * @exception DOMException
+ * SYNTAX_ERR: Raised if the new value has a syntax error and is
+ * unparsable.
+ * <br>NO_MODIFICATION_ALLOWED_ERR: Raised if this property is readonly.
+ */
+ public String getMinWidth();
+ /**
+ * See the min-width property definition in CSS2.
+ * @exception DOMException
+ * SYNTAX_ERR: Raised if the new value has a syntax error and is
+ * unparsable.
+ * <br>NO_MODIFICATION_ALLOWED_ERR: Raised if this property is readonly.
+ */
+ public void setMinWidth(String minWidth)
+ throws DOMException;
+
+ /**
+ * See the orphans property definition in CSS2.
+ * @exception DOMException
+ * SYNTAX_ERR: Raised if the new value has a syntax error and is
+ * unparsable.
+ * <br>NO_MODIFICATION_ALLOWED_ERR: Raised if this property is readonly.
+ */
+ public String getOrphans();
+ /**
+ * See the orphans property definition in CSS2.
+ * @exception DOMException
+ * SYNTAX_ERR: Raised if the new value has a syntax error and is
+ * unparsable.
+ * <br>NO_MODIFICATION_ALLOWED_ERR: Raised if this property is readonly.
+ */
+ public void setOrphans(String orphans)
+ throws DOMException;
+
+ /**
+ * See the outline property definition in CSS2.
+ * @exception DOMException
+ * SYNTAX_ERR: Raised if the new value has a syntax error and is
+ * unparsable.
+ * <br>NO_MODIFICATION_ALLOWED_ERR: Raised if this property is readonly.
+ */
+ public String getOutline();
+ /**
+ * See the outline property definition in CSS2.
+ * @exception DOMException
+ * SYNTAX_ERR: Raised if the new value has a syntax error and is
+ * unparsable.
+ * <br>NO_MODIFICATION_ALLOWED_ERR: Raised if this property is readonly.
+ */
+ public void setOutline(String outline)
+ throws DOMException;
+
+ /**
+ * See the outline-color property definition in CSS2.
+ * @exception DOMException
+ * SYNTAX_ERR: Raised if the new value has a syntax error and is
+ * unparsable.
+ * <br>NO_MODIFICATION_ALLOWED_ERR: Raised if this property is readonly.
+ */
+ public String getOutlineColor();
+ /**
+ * See the outline-color property definition in CSS2.
+ * @exception DOMException
+ * SYNTAX_ERR: Raised if the new value has a syntax error and is
+ * unparsable.
+ * <br>NO_MODIFICATION_ALLOWED_ERR: Raised if this property is readonly.
+ */
+ public void setOutlineColor(String outlineColor)
+ throws DOMException;
+
+ /**
+ * See the outline-style property definition in CSS2.
+ * @exception DOMException
+ * SYNTAX_ERR: Raised if the new value has a syntax error and is
+ * unparsable.
+ * <br>NO_MODIFICATION_ALLOWED_ERR: Raised if this property is readonly.
+ */
+ public String getOutlineStyle();
+ /**
+ * See the outline-style property definition in CSS2.
+ * @exception DOMException
+ * SYNTAX_ERR: Raised if the new value has a syntax error and is
+ * unparsable.
+ * <br>NO_MODIFICATION_ALLOWED_ERR: Raised if this property is readonly.
+ */
+ public void setOutlineStyle(String outlineStyle)
+ throws DOMException;
+
+ /**
+ * See the outline-width property definition in CSS2.
+ * @exception DOMException
+ * SYNTAX_ERR: Raised if the new value has a syntax error and is
+ * unparsable.
+ * <br>NO_MODIFICATION_ALLOWED_ERR: Raised if this property is readonly.
+ */
+ public String getOutlineWidth();
+ /**
+ * See the outline-width property definition in CSS2.
+ * @exception DOMException
+ * SYNTAX_ERR: Raised if the new value has a syntax error and is
+ * unparsable.
+ * <br>NO_MODIFICATION_ALLOWED_ERR: Raised if this property is readonly.
+ */
+ public void setOutlineWidth(String outlineWidth)
+ throws DOMException;
+
+ /**
+ * See the overflow property definition in CSS2.
+ * @exception DOMException
+ * SYNTAX_ERR: Raised if the new value has a syntax error and is
+ * unparsable.
+ * <br>NO_MODIFICATION_ALLOWED_ERR: Raised if this property is readonly.
+ */
+ public String getOverflow();
+ /**
+ * See the overflow property definition in CSS2.
+ * @exception DOMException
+ * SYNTAX_ERR: Raised if the new value has a syntax error and is
+ * unparsable.
+ * <br>NO_MODIFICATION_ALLOWED_ERR: Raised if this property is readonly.
+ */
+ public void setOverflow(String overflow)
+ throws DOMException;
+
+ /**
+ * See the padding property definition in CSS2.
+ * @exception DOMException
+ * SYNTAX_ERR: Raised if the new value has a syntax error and is
+ * unparsable.
+ * <br>NO_MODIFICATION_ALLOWED_ERR: Raised if this property is readonly.
+ */
+ public String getPadding();
+ /**
+ * See the padding property definition in CSS2.
+ * @exception DOMException
+ * SYNTAX_ERR: Raised if the new value has a syntax error and is
+ * unparsable.
+ * <br>NO_MODIFICATION_ALLOWED_ERR: Raised if this property is readonly.
+ */
+ public void setPadding(String padding)
+ throws DOMException;
+
+ /**
+ * See the padding-top property definition in CSS2.
+ * @exception DOMException
+ * SYNTAX_ERR: Raised if the new value has a syntax error and is
+ * unparsable.
+ * <br>NO_MODIFICATION_ALLOWED_ERR: Raised if this property is readonly.
+ */
+ public String getPaddingTop();
+ /**
+ * See the padding-top property definition in CSS2.
+ * @exception DOMException
+ * SYNTAX_ERR: Raised if the new value has a syntax error and is
+ * unparsable.
+ * <br>NO_MODIFICATION_ALLOWED_ERR: Raised if this property is readonly.
+ */
+ public void setPaddingTop(String paddingTop)
+ throws DOMException;
+
+ /**
+ * See the padding-right property definition in CSS2.
+ * @exception DOMException
+ * SYNTAX_ERR: Raised if the new value has a syntax error and is
+ * unparsable.
+ * <br>NO_MODIFICATION_ALLOWED_ERR: Raised if this property is readonly.
+ */
+ public String getPaddingRight();
+ /**
+ * See the padding-right property definition in CSS2.
+ * @exception DOMException
+ * SYNTAX_ERR: Raised if the new value has a syntax error and is
+ * unparsable.
+ * <br>NO_MODIFICATION_ALLOWED_ERR: Raised if this property is readonly.
+ */
+ public void setPaddingRight(String paddingRight)
+ throws DOMException;
+
+ /**
+ * See the padding-bottom property definition in CSS2.
+ * @exception DOMException
+ * SYNTAX_ERR: Raised if the new value has a syntax error and is
+ * unparsable.
+ * <br>NO_MODIFICATION_ALLOWED_ERR: Raised if this property is readonly.
+ */
+ public String getPaddingBottom();
+ /**
+ * See the padding-bottom property definition in CSS2.
+ * @exception DOMException
+ * SYNTAX_ERR: Raised if the new value has a syntax error and is
+ * unparsable.
+ * <br>NO_MODIFICATION_ALLOWED_ERR: Raised if this property is readonly.
+ */
+ public void setPaddingBottom(String paddingBottom)
+ throws DOMException;
+
+ /**
+ * See the padding-left property definition in CSS2.
+ * @exception DOMException
+ * SYNTAX_ERR: Raised if the new value has a syntax error and is
+ * unparsable.
+ * <br>NO_MODIFICATION_ALLOWED_ERR: Raised if this property is readonly.
+ */
+ public String getPaddingLeft();
+ /**
+ * See the padding-left property definition in CSS2.
+ * @exception DOMException
+ * SYNTAX_ERR: Raised if the new value has a syntax error and is
+ * unparsable.
+ * <br>NO_MODIFICATION_ALLOWED_ERR: Raised if this property is readonly.
+ */
+ public void setPaddingLeft(String paddingLeft)
+ throws DOMException;
+
+ /**
+ * See the page property definition in CSS2.
+ * @exception DOMException
+ * SYNTAX_ERR: Raised if the new value has a syntax error and is
+ * unparsable.
+ * <br>NO_MODIFICATION_ALLOWED_ERR: Raised if this property is readonly.
+ */
+ public String getPage();
+ /**
+ * See the page property definition in CSS2.
+ * @exception DOMException
+ * SYNTAX_ERR: Raised if the new value has a syntax error and is
+ * unparsable.
+ * <br>NO_MODIFICATION_ALLOWED_ERR: Raised if this property is readonly.
+ */
+ public void setPage(String page)
+ throws DOMException;
+
+ /**
+ * See the page-break-after property definition in CSS2.
+ * @exception DOMException
+ * SYNTAX_ERR: Raised if the new value has a syntax error and is
+ * unparsable.
+ * <br>NO_MODIFICATION_ALLOWED_ERR: Raised if this property is readonly.
+ */
+ public String getPageBreakAfter();
+ /**
+ * See the page-break-after property definition in CSS2.
+ * @exception DOMException
+ * SYNTAX_ERR: Raised if the new value has a syntax error and is
+ * unparsable.
+ * <br>NO_MODIFICATION_ALLOWED_ERR: Raised if this property is readonly.
+ */
+ public void setPageBreakAfter(String pageBreakAfter)
+ throws DOMException;
+
+ /**
+ * See the page-break-before property definition in CSS2.
+ * @exception DOMException
+ * SYNTAX_ERR: Raised if the new value has a syntax error and is
+ * unparsable.
+ * <br>NO_MODIFICATION_ALLOWED_ERR: Raised if this property is readonly.
+ */
+ public String getPageBreakBefore();
+ /**
+ * See the page-break-before property definition in CSS2.
+ * @exception DOMException
+ * SYNTAX_ERR: Raised if the new value has a syntax error and is
+ * unparsable.
+ * <br>NO_MODIFICATION_ALLOWED_ERR: Raised if this property is readonly.
+ */
+ public void setPageBreakBefore(String pageBreakBefore)
+ throws DOMException;
+
+ /**
+ * See the page-break-inside property definition in CSS2.
+ * @exception DOMException
+ * SYNTAX_ERR: Raised if the new value has a syntax error and is
+ * unparsable.
+ * <br>NO_MODIFICATION_ALLOWED_ERR: Raised if this property is readonly.
+ */
+ public String getPageBreakInside();
+ /**
+ * See the page-break-inside property definition in CSS2.
+ * @exception DOMException
+ * SYNTAX_ERR: Raised if the new value has a syntax error and is
+ * unparsable.
+ * <br>NO_MODIFICATION_ALLOWED_ERR: Raised if this property is readonly.
+ */
+ public void setPageBreakInside(String pageBreakInside)
+ throws DOMException;
+
+ /**
+ * See the pause property definition in CSS2.
+ * @exception DOMException
+ * SYNTAX_ERR: Raised if the new value has a syntax error and is
+ * unparsable.
+ * <br>NO_MODIFICATION_ALLOWED_ERR: Raised if this property is readonly.
+ */
+ public String getPause();
+ /**
+ * See the pause property definition in CSS2.
+ * @exception DOMException
+ * SYNTAX_ERR: Raised if the new value has a syntax error and is
+ * unparsable.
+ * <br>NO_MODIFICATION_ALLOWED_ERR: Raised if this property is readonly.
+ */
+ public void setPause(String pause)
+ throws DOMException;
+
+ /**
+ * See the pause-after property definition in CSS2.
+ * @exception DOMException
+ * SYNTAX_ERR: Raised if the new value has a syntax error and is
+ * unparsable.
+ * <br>NO_MODIFICATION_ALLOWED_ERR: Raised if this property is readonly.
+ */
+ public String getPauseAfter();
+ /**
+ * See the pause-after property definition in CSS2.
+ * @exception DOMException
+ * SYNTAX_ERR: Raised if the new value has a syntax error and is
+ * unparsable.
+ * <br>NO_MODIFICATION_ALLOWED_ERR: Raised if this property is readonly.
+ */
+ public void setPauseAfter(String pauseAfter)
+ throws DOMException;
+
+ /**
+ * See the pause-before property definition in CSS2.
+ * @exception DOMException
+ * SYNTAX_ERR: Raised if the new value has a syntax error and is
+ * unparsable.
+ * <br>NO_MODIFICATION_ALLOWED_ERR: Raised if this property is readonly.
+ */
+ public String getPauseBefore();
+ /**
+ * See the pause-before property definition in CSS2.
+ * @exception DOMException
+ * SYNTAX_ERR: Raised if the new value has a syntax error and is
+ * unparsable.
+ * <br>NO_MODIFICATION_ALLOWED_ERR: Raised if this property is readonly.
+ */
+ public void setPauseBefore(String pauseBefore)
+ throws DOMException;
+
+ /**
+ * See the pitch property definition in CSS2.
+ * @exception DOMException
+ * SYNTAX_ERR: Raised if the new value has a syntax error and is
+ * unparsable.
+ * <br>NO_MODIFICATION_ALLOWED_ERR: Raised if this property is readonly.
+ */
+ public String getPitch();
+ /**
+ * See the pitch property definition in CSS2.
+ * @exception DOMException
+ * SYNTAX_ERR: Raised if the new value has a syntax error and is
+ * unparsable.
+ * <br>NO_MODIFICATION_ALLOWED_ERR: Raised if this property is readonly.
+ */
+ public void setPitch(String pitch)
+ throws DOMException;
+
+ /**
+ * See the pitch-range property definition in CSS2.
+ * @exception DOMException
+ * SYNTAX_ERR: Raised if the new value has a syntax error and is
+ * unparsable.
+ * <br>NO_MODIFICATION_ALLOWED_ERR: Raised if this property is readonly.
+ */
+ public String getPitchRange();
+ /**
+ * See the pitch-range property definition in CSS2.
+ * @exception DOMException
+ * SYNTAX_ERR: Raised if the new value has a syntax error and is
+ * unparsable.
+ * <br>NO_MODIFICATION_ALLOWED_ERR: Raised if this property is readonly.
+ */
+ public void setPitchRange(String pitchRange)
+ throws DOMException;
+
+ /**
+ * See the play-during property definition in CSS2.
+ * @exception DOMException
+ * SYNTAX_ERR: Raised if the new value has a syntax error and is
+ * unparsable.
+ * <br>NO_MODIFICATION_ALLOWED_ERR: Raised if this property is readonly.
+ */
+ public String getPlayDuring();
+ /**
+ * See the play-during property definition in CSS2.
+ * @exception DOMException
+ * SYNTAX_ERR: Raised if the new value has a syntax error and is
+ * unparsable.
+ * <br>NO_MODIFICATION_ALLOWED_ERR: Raised if this property is readonly.
+ */
+ public void setPlayDuring(String playDuring)
+ throws DOMException;
+
+ /**
+ * See the position property definition in CSS2.
+ * @exception DOMException
+ * SYNTAX_ERR: Raised if the new value has a syntax error and is
+ * unparsable.
+ * <br>NO_MODIFICATION_ALLOWED_ERR: Raised if this property is readonly.
+ */
+ public String getPosition();
+ /**
+ * See the position property definition in CSS2.
+ * @exception DOMException
+ * SYNTAX_ERR: Raised if the new value has a syntax error and is
+ * unparsable.
+ * <br>NO_MODIFICATION_ALLOWED_ERR: Raised if this property is readonly.
+ */
+ public void setPosition(String position)
+ throws DOMException;
+
+ /**
+ * See the quotes property definition in CSS2.
+ * @exception DOMException
+ * SYNTAX_ERR: Raised if the new value has a syntax error and is
+ * unparsable.
+ * <br>NO_MODIFICATION_ALLOWED_ERR: Raised if this property is readonly.
+ */
+ public String getQuotes();
+ /**
+ * See the quotes property definition in CSS2.
+ * @exception DOMException
+ * SYNTAX_ERR: Raised if the new value has a syntax error and is
+ * unparsable.
+ * <br>NO_MODIFICATION_ALLOWED_ERR: Raised if this property is readonly.
+ */
+ public void setQuotes(String quotes)
+ throws DOMException;
+
+ /**
+ * See the richness property definition in CSS2.
+ * @exception DOMException
+ * SYNTAX_ERR: Raised if the new value has a syntax error and is
+ * unparsable.
+ * <br>NO_MODIFICATION_ALLOWED_ERR: Raised if this property is readonly.
+ */
+ public String getRichness();
+ /**
+ * See the richness property definition in CSS2.
+ * @exception DOMException
+ * SYNTAX_ERR: Raised if the new value has a syntax error and is
+ * unparsable.
+ * <br>NO_MODIFICATION_ALLOWED_ERR: Raised if this property is readonly.
+ */
+ public void setRichness(String richness)
+ throws DOMException;
+
+ /**
+ * See the right property definition in CSS2.
+ * @exception DOMException
+ * SYNTAX_ERR: Raised if the new value has a syntax error and is
+ * unparsable.
+ * <br>NO_MODIFICATION_ALLOWED_ERR: Raised if this property is readonly.
+ */
+ public String getRight();
+ /**
+ * See the right property definition in CSS2.
+ * @exception DOMException
+ * SYNTAX_ERR: Raised if the new value has a syntax error and is
+ * unparsable.
+ * <br>NO_MODIFICATION_ALLOWED_ERR: Raised if this property is readonly.
+ */
+ public void setRight(String right)
+ throws DOMException;
+
+ /**
+ * See the size property definition in CSS2.
+ * @exception DOMException
+ * SYNTAX_ERR: Raised if the new value has a syntax error and is
+ * unparsable.
+ * <br>NO_MODIFICATION_ALLOWED_ERR: Raised if this property is readonly.
+ */
+ public String getSize();
+ /**
+ * See the size property definition in CSS2.
+ * @exception DOMException
+ * SYNTAX_ERR: Raised if the new value has a syntax error and is
+ * unparsable.
+ * <br>NO_MODIFICATION_ALLOWED_ERR: Raised if this property is readonly.
+ */
+ public void setSize(String size)
+ throws DOMException;
+
+ /**
+ * See the speak property definition in CSS2.
+ * @exception DOMException
+ * SYNTAX_ERR: Raised if the new value has a syntax error and is
+ * unparsable.
+ * <br>NO_MODIFICATION_ALLOWED_ERR: Raised if this property is readonly.
+ */
+ public String getSpeak();
+ /**
+ * See the speak property definition in CSS2.
+ * @exception DOMException
+ * SYNTAX_ERR: Raised if the new value has a syntax error and is
+ * unparsable.
+ * <br>NO_MODIFICATION_ALLOWED_ERR: Raised if this property is readonly.
+ */
+ public void setSpeak(String speak)
+ throws DOMException;
+
+ /**
+ * See the speak-header property definition in CSS2.
+ * @exception DOMException
+ * SYNTAX_ERR: Raised if the new value has a syntax error and is
+ * unparsable.
+ * <br>NO_MODIFICATION_ALLOWED_ERR: Raised if this property is readonly.
+ */
+ public String getSpeakHeader();
+ /**
+ * See the speak-header property definition in CSS2.
+ * @exception DOMException
+ * SYNTAX_ERR: Raised if the new value has a syntax error and is
+ * unparsable.
+ * <br>NO_MODIFICATION_ALLOWED_ERR: Raised if this property is readonly.
+ */
+ public void setSpeakHeader(String speakHeader)
+ throws DOMException;
+
+ /**
+ * See the speak-numeral property definition in CSS2.
+ * @exception DOMException
+ * SYNTAX_ERR: Raised if the new value has a syntax error and is
+ * unparsable.
+ * <br>NO_MODIFICATION_ALLOWED_ERR: Raised if this property is readonly.
+ */
+ public String getSpeakNumeral();
+ /**
+ * See the speak-numeral property definition in CSS2.
+ * @exception DOMException
+ * SYNTAX_ERR: Raised if the new value has a syntax error and is
+ * unparsable.
+ * <br>NO_MODIFICATION_ALLOWED_ERR: Raised if this property is readonly.
+ */
+ public void setSpeakNumeral(String speakNumeral)
+ throws DOMException;
+
+ /**
+ * See the speak-punctuation property definition in CSS2.
+ * @exception DOMException
+ * SYNTAX_ERR: Raised if the new value has a syntax error and is
+ * unparsable.
+ * <br>NO_MODIFICATION_ALLOWED_ERR: Raised if this property is readonly.
+ */
+ public String getSpeakPunctuation();
+ /**
+ * See the speak-punctuation property definition in CSS2.
+ * @exception DOMException
+ * SYNTAX_ERR: Raised if the new value has a syntax error and is
+ * unparsable.
+ * <br>NO_MODIFICATION_ALLOWED_ERR: Raised if this property is readonly.
+ */
+ public void setSpeakPunctuation(String speakPunctuation)
+ throws DOMException;
+
+ /**
+ * See the speech-rate property definition in CSS2.
+ * @exception DOMException
+ * SYNTAX_ERR: Raised if the new value has a syntax error and is
+ * unparsable.
+ * <br>NO_MODIFICATION_ALLOWED_ERR: Raised if this property is readonly.
+ */
+ public String getSpeechRate();
+ /**
+ * See the speech-rate property definition in CSS2.
+ * @exception DOMException
+ * SYNTAX_ERR: Raised if the new value has a syntax error and is
+ * unparsable.
+ * <br>NO_MODIFICATION_ALLOWED_ERR: Raised if this property is readonly.
+ */
+ public void setSpeechRate(String speechRate)
+ throws DOMException;
+
+ /**
+ * See the stress property definition in CSS2.
+ * @exception DOMException
+ * SYNTAX_ERR: Raised if the new value has a syntax error and is
+ * unparsable.
+ * <br>NO_MODIFICATION_ALLOWED_ERR: Raised if this property is readonly.
+ */
+ public String getStress();
+ /**
+ * See the stress property definition in CSS2.
+ * @exception DOMException
+ * SYNTAX_ERR: Raised if the new value has a syntax error and is
+ * unparsable.
+ * <br>NO_MODIFICATION_ALLOWED_ERR: Raised if this property is readonly.
+ */
+ public void setStress(String stress)
+ throws DOMException;
+
+ /**
+ * See the table-layout property definition in CSS2.
+ * @exception DOMException
+ * SYNTAX_ERR: Raised if the new value has a syntax error and is
+ * unparsable.
+ * <br>NO_MODIFICATION_ALLOWED_ERR: Raised if this property is readonly.
+ */
+ public String getTableLayout();
+ /**
+ * See the table-layout property definition in CSS2.
+ * @exception DOMException
+ * SYNTAX_ERR: Raised if the new value has a syntax error and is
+ * unparsable.
+ * <br>NO_MODIFICATION_ALLOWED_ERR: Raised if this property is readonly.
+ */
+ public void setTableLayout(String tableLayout)
+ throws DOMException;
+
+ /**
+ * See the text-align property definition in CSS2.
+ * @exception DOMException
+ * SYNTAX_ERR: Raised if the new value has a syntax error and is
+ * unparsable.
+ * <br>NO_MODIFICATION_ALLOWED_ERR: Raised if this property is readonly.
+ */
+ public String getTextAlign();
+ /**
+ * See the text-align property definition in CSS2.
+ * @exception DOMException
+ * SYNTAX_ERR: Raised if the new value has a syntax error and is
+ * unparsable.
+ * <br>NO_MODIFICATION_ALLOWED_ERR: Raised if this property is readonly.
+ */
+ public void setTextAlign(String textAlign)
+ throws DOMException;
+
+ /**
+ * See the text-decoration property definition in CSS2.
+ * @exception DOMException
+ * SYNTAX_ERR: Raised if the new value has a syntax error and is
+ * unparsable.
+ * <br>NO_MODIFICATION_ALLOWED_ERR: Raised if this property is readonly.
+ */
+ public String getTextDecoration();
+ /**
+ * See the text-decoration property definition in CSS2.
+ * @exception DOMException
+ * SYNTAX_ERR: Raised if the new value has a syntax error and is
+ * unparsable.
+ * <br>NO_MODIFICATION_ALLOWED_ERR: Raised if this property is readonly.
+ */
+ public void setTextDecoration(String textDecoration)
+ throws DOMException;
+
+ /**
+ * See the text-indent property definition in CSS2.
+ * @exception DOMException
+ * SYNTAX_ERR: Raised if the new value has a syntax error and is
+ * unparsable.
+ * <br>NO_MODIFICATION_ALLOWED_ERR: Raised if this property is readonly.
+ */
+ public String getTextIndent();
+ /**
+ * See the text-indent property definition in CSS2.
+ * @exception DOMException
+ * SYNTAX_ERR: Raised if the new value has a syntax error and is
+ * unparsable.
+ * <br>NO_MODIFICATION_ALLOWED_ERR: Raised if this property is readonly.
+ */
+ public void setTextIndent(String textIndent)
+ throws DOMException;
+
+ /**
+ * See the text-shadow property definition in CSS2.
+ * @exception DOMException
+ * SYNTAX_ERR: Raised if the new value has a syntax error and is
+ * unparsable.
+ * <br>NO_MODIFICATION_ALLOWED_ERR: Raised if this property is readonly.
+ */
+ public String getTextShadow();
+ /**
+ * See the text-shadow property definition in CSS2.
+ * @exception DOMException
+ * SYNTAX_ERR: Raised if the new value has a syntax error and is
+ * unparsable.
+ * <br>NO_MODIFICATION_ALLOWED_ERR: Raised if this property is readonly.
+ */
+ public void setTextShadow(String textShadow)
+ throws DOMException;
+
+ /**
+ * See the text-transform property definition in CSS2.
+ * @exception DOMException
+ * SYNTAX_ERR: Raised if the new value has a syntax error and is
+ * unparsable.
+ * <br>NO_MODIFICATION_ALLOWED_ERR: Raised if this property is readonly.
+ */
+ public String getTextTransform();
+ /**
+ * See the text-transform property definition in CSS2.
+ * @exception DOMException
+ * SYNTAX_ERR: Raised if the new value has a syntax error and is
+ * unparsable.
+ * <br>NO_MODIFICATION_ALLOWED_ERR: Raised if this property is readonly.
+ */
+ public void setTextTransform(String textTransform)
+ throws DOMException;
+
+ /**
+ * See the top property definition in CSS2.
+ * @exception DOMException
+ * SYNTAX_ERR: Raised if the new value has a syntax error and is
+ * unparsable.
+ * <br>NO_MODIFICATION_ALLOWED_ERR: Raised if this property is readonly.
+ */
+ public String getTop();
+ /**
+ * See the top property definition in CSS2.
+ * @exception DOMException
+ * SYNTAX_ERR: Raised if the new value has a syntax error and is
+ * unparsable.
+ * <br>NO_MODIFICATION_ALLOWED_ERR: Raised if this property is readonly.
+ */
+ public void setTop(String top)
+ throws DOMException;
+
+ /**
+ * See the unicode-bidi property definition in CSS2.
+ * @exception DOMException
+ * SYNTAX_ERR: Raised if the new value has a syntax error and is
+ * unparsable.
+ * <br>NO_MODIFICATION_ALLOWED_ERR: Raised if this property is readonly.
+ */
+ public String getUnicodeBidi();
+ /**
+ * See the unicode-bidi property definition in CSS2.
+ * @exception DOMException
+ * SYNTAX_ERR: Raised if the new value has a syntax error and is
+ * unparsable.
+ * <br>NO_MODIFICATION_ALLOWED_ERR: Raised if this property is readonly.
+ */
+ public void setUnicodeBidi(String unicodeBidi)
+ throws DOMException;
+
+ /**
+ * See the vertical-align property definition in CSS2.
+ * @exception DOMException
+ * SYNTAX_ERR: Raised if the new value has a syntax error and is
+ * unparsable.
+ * <br>NO_MODIFICATION_ALLOWED_ERR: Raised if this property is readonly.
+ */
+ public String getVerticalAlign();
+ /**
+ * See the vertical-align property definition in CSS2.
+ * @exception DOMException
+ * SYNTAX_ERR: Raised if the new value has a syntax error and is
+ * unparsable.
+ * <br>NO_MODIFICATION_ALLOWED_ERR: Raised if this property is readonly.
+ */
+ public void setVerticalAlign(String verticalAlign)
+ throws DOMException;
+
+ /**
+ * See the visibility property definition in CSS2.
+ * @exception DOMException
+ * SYNTAX_ERR: Raised if the new value has a syntax error and is
+ * unparsable.
+ * <br>NO_MODIFICATION_ALLOWED_ERR: Raised if this property is readonly.
+ */
+ public String getVisibility();
+ /**
+ * See the visibility property definition in CSS2.
+ * @exception DOMException
+ * SYNTAX_ERR: Raised if the new value has a syntax error and is
+ * unparsable.
+ * <br>NO_MODIFICATION_ALLOWED_ERR: Raised if this property is readonly.
+ */
+ public void setVisibility(String visibility)
+ throws DOMException;
+
+ /**
+ * See the voice-family property definition in CSS2.
+ * @exception DOMException
+ * SYNTAX_ERR: Raised if the new value has a syntax error and is
+ * unparsable.
+ * <br>NO_MODIFICATION_ALLOWED_ERR: Raised if this property is readonly.
+ */
+ public String getVoiceFamily();
+ /**
+ * See the voice-family property definition in CSS2.
+ * @exception DOMException
+ * SYNTAX_ERR: Raised if the new value has a syntax error and is
+ * unparsable.
+ * <br>NO_MODIFICATION_ALLOWED_ERR: Raised if this property is readonly.
+ */
+ public void setVoiceFamily(String voiceFamily)
+ throws DOMException;
+
+ /**
+ * See the volume property definition in CSS2.
+ * @exception DOMException
+ * SYNTAX_ERR: Raised if the new value has a syntax error and is
+ * unparsable.
+ * <br>NO_MODIFICATION_ALLOWED_ERR: Raised if this property is readonly.
+ */
+ public String getVolume();
+ /**
+ * See the volume property definition in CSS2.
+ * @exception DOMException
+ * SYNTAX_ERR: Raised if the new value has a syntax error and is
+ * unparsable.
+ * <br>NO_MODIFICATION_ALLOWED_ERR: Raised if this property is readonly.
+ */
+ public void setVolume(String volume)
+ throws DOMException;
+
+ /**
+ * See the white-space property definition in CSS2.
+ * @exception DOMException
+ * SYNTAX_ERR: Raised if the new value has a syntax error and is
+ * unparsable.
+ * <br>NO_MODIFICATION_ALLOWED_ERR: Raised if this property is readonly.
+ */
+ public String getWhiteSpace();
+ /**
+ * See the white-space property definition in CSS2.
+ * @exception DOMException
+ * SYNTAX_ERR: Raised if the new value has a syntax error and is
+ * unparsable.
+ * <br>NO_MODIFICATION_ALLOWED_ERR: Raised if this property is readonly.
+ */
+ public void setWhiteSpace(String whiteSpace)
+ throws DOMException;
+
+ /**
+ * See the widows property definition in CSS2.
+ * @exception DOMException
+ * SYNTAX_ERR: Raised if the new value has a syntax error and is
+ * unparsable.
+ * <br>NO_MODIFICATION_ALLOWED_ERR: Raised if this property is readonly.
+ */
+ public String getWidows();
+ /**
+ * See the widows property definition in CSS2.
+ * @exception DOMException
+ * SYNTAX_ERR: Raised if the new value has a syntax error and is
+ * unparsable.
+ * <br>NO_MODIFICATION_ALLOWED_ERR: Raised if this property is readonly.
+ */
+ public void setWidows(String widows)
+ throws DOMException;
+
+ /**
+ * See the width property definition in CSS2.
+ * @exception DOMException
+ * SYNTAX_ERR: Raised if the new value has a syntax error and is
+ * unparsable.
+ * <br>NO_MODIFICATION_ALLOWED_ERR: Raised if this property is readonly.
+ */
+ public String getWidth();
+ /**
+ * See the width property definition in CSS2.
+ * @exception DOMException
+ * SYNTAX_ERR: Raised if the new value has a syntax error and is
+ * unparsable.
+ * <br>NO_MODIFICATION_ALLOWED_ERR: Raised if this property is readonly.
+ */
+ public void setWidth(String width)
+ throws DOMException;
+
+ /**
+ * See the word-spacing property definition in CSS2.
+ * @exception DOMException
+ * SYNTAX_ERR: Raised if the new value has a syntax error and is
+ * unparsable.
+ * <br>NO_MODIFICATION_ALLOWED_ERR: Raised if this property is readonly.
+ */
+ public String getWordSpacing();
+ /**
+ * See the word-spacing property definition in CSS2.
+ * @exception DOMException
+ * SYNTAX_ERR: Raised if the new value has a syntax error and is
+ * unparsable.
+ * <br>NO_MODIFICATION_ALLOWED_ERR: Raised if this property is readonly.
+ */
+ public void setWordSpacing(String wordSpacing)
+ throws DOMException;
+
+ /**
+ * See the z-index property definition in CSS2.
+ * @exception DOMException
+ * SYNTAX_ERR: Raised if the new value has a syntax error and is
+ * unparsable.
+ * <br>NO_MODIFICATION_ALLOWED_ERR: Raised if this property is readonly.
+ */
+ public String getZIndex();
+ /**
+ * See the z-index property definition in CSS2.
+ * @exception DOMException
+ * SYNTAX_ERR: Raised if the new value has a syntax error and is
+ * unparsable.
+ * <br>NO_MODIFICATION_ALLOWED_ERR: Raised if this property is readonly.
+ */
+ public void setZIndex(String zIndex)
+ throws DOMException;
+
+}
diff --git a/external/jaxp/source/org/w3c/dom/css/CSS2TextShadow.java b/external/jaxp/source/org/w3c/dom/css/CSS2TextShadow.java
new file mode 100755
index 000000000..fd17ef9cd
--- /dev/null
+++ b/external/jaxp/source/org/w3c/dom/css/CSS2TextShadow.java
@@ -0,0 +1,50 @@
+/*
+ * Copyright (c) 2000 World Wide Web Consortium,
+ * (Massachusetts Institute of Technology, Institut National de
+ * Recherche en Informatique et en Automatique, Keio University). All
+ * Rights Reserved. This program is distributed under the W3C's Software
+ * Intellectual Property License. This program is distributed in the
+ * hope that it will be useful, but WITHOUT ANY WARRANTY; without even
+ * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+ * PURPOSE. See W3C License http://www.w3.org/Consortium/Legal/ for more
+ * details.
+ */
+
+package org.w3c.dom.css;
+
+/**
+ * The <code>CSS2TextShadow</code> interface represents a simple value for
+ * the text-shadow CSS Level 2 property.
+ * <p> For this extension of the <code>CSSValue</code> interface, the
+ * <code>valueType</code> attribute of the underlying <code>CSSValue</code>
+ * interface shall be <code>CSS_CUSTOM</code> .
+ * <p>See also the <a href='http://www.w3.org/TR/2000/CR-DOM-Level-2-20000510'>Document Object Model (DOM) Level 2 Specification</a>.
+ * @since DOM Level 2
+ */
+public interface CSS2TextShadow extends CSSValue {
+ /**
+ * Specifies the color of the text shadow. The CSS Value can contain an
+ * empty string if no color has been specified.
+ */
+ public CSSValue getColor();
+
+ /**
+ * The horizontal position of the text shadow. <code>0</code> if no
+ * length has been specified.
+ */
+ public CSSValue getHorizontal();
+
+ /**
+ * The vertical position of the text shadow. <code>0</code> if no length
+ * has been specified.
+ */
+ public CSSValue getVertical();
+
+ /**
+ * The blur radius of the text shadow. <code>0</code> if no length has
+ * been specified.
+ */
+ public CSSValue getBlur();
+
+}
+
diff --git a/external/jaxp/source/org/w3c/dom/css/CSSCharsetRule.java b/external/jaxp/source/org/w3c/dom/css/CSSCharsetRule.java
new file mode 100755
index 000000000..fc85a057d
--- /dev/null
+++ b/external/jaxp/source/org/w3c/dom/css/CSSCharsetRule.java
@@ -0,0 +1,56 @@
+/*
+ * Copyright (c) 2000 World Wide Web Consortium,
+ * (Massachusetts Institute of Technology, Institut National de
+ * Recherche en Informatique et en Automatique, Keio University). All
+ * Rights Reserved. This program is distributed under the W3C's Software
+ * Intellectual Property License. This program is distributed in the
+ * hope that it will be useful, but WITHOUT ANY WARRANTY; without even
+ * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+ * PURPOSE.
+ * See W3C License http://www.w3.org/Consortium/Legal/ for more details.
+ */
+
+package org.w3c.dom.css;
+
+import org.w3c.dom.DOMException;
+
+/**
+ * The <code>CSSCharsetRule</code> interface represents a @charset rule in a
+ * CSS style sheet. The value of the <code>encoding</code> attribute does
+ * not affect the encoding of text data in the DOM objects; this encoding is
+ * always UTF-16. After a stylesheet is loaded, the value of the
+ * <code>encoding</code> attribute is the value found in the
+ * <code>@charset</code> rule. If there was no <code>@charset</code> in the
+ * original document, then no <code>CSSCharsetRule</code> is created. The
+ * value of the <code>encoding</code> attribute may also be used as a hint
+ * for the encoding used on serialization of the style sheet.
+ * <p> The value of the @charset rule (and therefore of the
+ * <code>CSSCharsetRule</code>) may not correspond to the encoding the
+ * document actually came in; character encoding information e.g. in an HTTP
+ * header, has priority (see CSS document representation) but this is not
+ * reflected in the <code>CSSCharsetRule</code>.
+ * <p>See also the <a href='http://www.w3.org/TR/2000/REC-DOM-Level-2-Style-20001113'>Document Object Model (DOM) Level 2 Style Specification</a>.
+ * @since DOM Level 2
+ */
+public interface CSSCharsetRule extends CSSRule {
+ /**
+ * The encoding information used in this <code>@charset</code> rule.
+ * @exception DOMException
+ * SYNTAX_ERR: Raised if the specified encoding value has a syntax error
+ * and is unparsable.
+ * <br>NO_MODIFICATION_ALLOWED_ERR: Raised if this encoding rule is
+ * readonly.
+ */
+ public String getEncoding();
+ /**
+ * The encoding information used in this <code>@charset</code> rule.
+ * @exception DOMException
+ * SYNTAX_ERR: Raised if the specified encoding value has a syntax error
+ * and is unparsable.
+ * <br>NO_MODIFICATION_ALLOWED_ERR: Raised if this encoding rule is
+ * readonly.
+ */
+ public void setEncoding(String encoding)
+ throws DOMException;
+
+}
diff --git a/external/jaxp/source/org/w3c/dom/css/CSSFontFaceRule.java b/external/jaxp/source/org/w3c/dom/css/CSSFontFaceRule.java
new file mode 100755
index 000000000..a17957061
--- /dev/null
+++ b/external/jaxp/source/org/w3c/dom/css/CSSFontFaceRule.java
@@ -0,0 +1,28 @@
+/*
+ * Copyright (c) 2000 World Wide Web Consortium,
+ * (Massachusetts Institute of Technology, Institut National de
+ * Recherche en Informatique et en Automatique, Keio University). All
+ * Rights Reserved. This program is distributed under the W3C's Software
+ * Intellectual Property License. This program is distributed in the
+ * hope that it will be useful, but WITHOUT ANY WARRANTY; without even
+ * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+ * PURPOSE.
+ * See W3C License http://www.w3.org/Consortium/Legal/ for more details.
+ */
+
+package org.w3c.dom.css;
+
+/**
+ * The <code>CSSFontFaceRule</code> interface represents a @font-face rule in
+ * a CSS style sheet. The <code>@font-face</code> rule is used to hold a set
+ * of font descriptions.
+ * <p>See also the <a href='http://www.w3.org/TR/2000/REC-DOM-Level-2-Style-20001113'>Document Object Model (DOM) Level 2 Style Specification</a>.
+ * @since DOM Level 2
+ */
+public interface CSSFontFaceRule extends CSSRule {
+ /**
+ * The declaration-block of this rule.
+ */
+ public CSSStyleDeclaration getStyle();
+
+}
diff --git a/external/jaxp/source/org/w3c/dom/css/CSSImportRule.java b/external/jaxp/source/org/w3c/dom/css/CSSImportRule.java
new file mode 100755
index 000000000..e18ad569b
--- /dev/null
+++ b/external/jaxp/source/org/w3c/dom/css/CSSImportRule.java
@@ -0,0 +1,44 @@
+/*
+ * Copyright (c) 2000 World Wide Web Consortium,
+ * (Massachusetts Institute of Technology, Institut National de
+ * Recherche en Informatique et en Automatique, Keio University). All
+ * Rights Reserved. This program is distributed under the W3C's Software
+ * Intellectual Property License. This program is distributed in the
+ * hope that it will be useful, but WITHOUT ANY WARRANTY; without even
+ * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+ * PURPOSE.
+ * See W3C License http://www.w3.org/Consortium/Legal/ for more details.
+ */
+
+package org.w3c.dom.css;
+
+import org.w3c.dom.stylesheets.MediaList;
+
+/**
+ * The <code>CSSImportRule</code> interface represents a @import rule within
+ * a CSS style sheet. The <code>@import</code> rule is used to import style
+ * rules from other style sheets.
+ * <p>See also the <a href='http://www.w3.org/TR/2000/REC-DOM-Level-2-Style-20001113'>Document Object Model (DOM) Level 2 Style Specification</a>.
+ * @since DOM Level 2
+ */
+public interface CSSImportRule extends CSSRule {
+ /**
+ * The location of the style sheet to be imported. The attribute will not
+ * contain the <code>"url(...)"</code> specifier around the URI.
+ */
+ public String getHref();
+
+ /**
+ * A list of media types for which this style sheet may be used.
+ */
+ public MediaList getMedia();
+
+ /**
+ * The style sheet referred to by this rule, if it has been loaded. The
+ * value of this attribute is <code>null</code> if the style sheet has
+ * not yet been loaded or if it will not be loaded (e.g. if the style
+ * sheet is for a media type not supported by the user agent).
+ */
+ public CSSStyleSheet getStyleSheet();
+
+}
diff --git a/external/jaxp/source/org/w3c/dom/css/CSSMediaRule.java b/external/jaxp/source/org/w3c/dom/css/CSSMediaRule.java
new file mode 100755
index 000000000..68a73045e
--- /dev/null
+++ b/external/jaxp/source/org/w3c/dom/css/CSSMediaRule.java
@@ -0,0 +1,76 @@
+/*
+ * Copyright (c) 2000 World Wide Web Consortium,
+ * (Massachusetts Institute of Technology, Institut National de
+ * Recherche en Informatique et en Automatique, Keio University). All
+ * Rights Reserved. This program is distributed under the W3C's Software
+ * Intellectual Property License. This program is distributed in the
+ * hope that it will be useful, but WITHOUT ANY WARRANTY; without even
+ * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+ * PURPOSE.
+ * See W3C License http://www.w3.org/Consortium/Legal/ for more details.
+ */
+
+package org.w3c.dom.css;
+
+import org.w3c.dom.DOMException;
+import org.w3c.dom.stylesheets.MediaList;
+
+/**
+ * The <code>CSSMediaRule</code> interface represents a @media rule in a CSS
+ * style sheet. A <code>@media</code> rule can be used to delimit style
+ * rules for specific media types.
+ * <p>See also the <a href='http://www.w3.org/TR/2000/REC-DOM-Level-2-Style-20001113'>Document Object Model (DOM) Level 2 Style Specification</a>.
+ * @since DOM Level 2
+ */
+public interface CSSMediaRule extends CSSRule {
+ /**
+ * A list of media types for this rule.
+ */
+ public MediaList getMedia();
+
+ /**
+ * A list of all CSS rules contained within the media block.
+ */
+ public CSSRuleList getCssRules();
+
+ /**
+ * Used to insert a new rule into the media block.
+ * @param rule The parsable text representing the rule. For rule sets
+ * this contains both the selector and the style declaration. For
+ * at-rules, this specifies both the at-identifier and the rule
+ * content.
+ * @param index The index within the media block's rule collection of
+ * the rule before which to insert the specified rule. If the
+ * specified index is equal to the length of the media blocks's rule
+ * collection, the rule will be added to the end of the media block.
+ * @return The index within the media block's rule collection of the
+ * newly inserted rule.
+ * @exception DOMException
+ * HIERARCHY_REQUEST_ERR: Raised if the rule cannot be inserted at the
+ * specified index, e.g., if an <code>@import</code> rule is inserted
+ * after a standard rule set or other at-rule.
+ * <br>INDEX_SIZE_ERR: Raised if the specified index is not a valid
+ * insertion point.
+ * <br>NO_MODIFICATION_ALLOWED_ERR: Raised if this media rule is
+ * readonly.
+ * <br>SYNTAX_ERR: Raised if the specified rule has a syntax error and
+ * is unparsable.
+ */
+ public int insertRule(String rule,
+ int index)
+ throws DOMException;
+
+ /**
+ * Used to delete a rule from the media block.
+ * @param index The index within the media block's rule collection of
+ * the rule to remove.
+ * @exception DOMException
+ * INDEX_SIZE_ERR: Raised if the specified index does not correspond to
+ * a rule in the media rule list.
+ * <br>NO_MODIFICATION_ALLOWED_ERR: Raised if this media rule is
+ * readonly.
+ */
+ public void deleteRule(int index)
+ throws DOMException;
+
+}
diff --git a/external/jaxp/source/org/w3c/dom/css/CSSPageRule.java b/external/jaxp/source/org/w3c/dom/css/CSSPageRule.java
new file mode 100755
index 000000000..cb95a3e59
--- /dev/null
+++ b/external/jaxp/source/org/w3c/dom/css/CSSPageRule.java
@@ -0,0 +1,48 @@
+/*
+ * Copyright (c) 2000 World Wide Web Consortium,
+ * (Massachusetts Institute of Technology, Institut National de
+ * Recherche en Informatique et en Automatique, Keio University). All
+ * Rights Reserved. This program is distributed under the W3C's Software
+ * Intellectual Property License. This program is distributed in the
+ * hope that it will be useful, but WITHOUT ANY WARRANTY; without even
+ * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+ * PURPOSE.
+ * See W3C License http://www.w3.org/Consortium/Legal/ for more details.
+ */
+
+package org.w3c.dom.css;
+
+import org.w3c.dom.DOMException;
+
+/**
+ * The <code>CSSPageRule</code> interface represents a @page rule within a
+ * CSS style sheet. The <code>@page</code> rule is used to specify the
+ * dimensions, orientation, margins, etc. of a page box for paged media.
+ * <p>See also the <a href='http://www.w3.org/TR/2000/REC-DOM-Level-2-Style-20001113'>Document Object Model (DOM) Level 2 Style Specification</a>.
+ * @since DOM Level 2
+ */
+public interface CSSPageRule extends CSSRule {
+ /**
+ * The parsable textual representation of the page selector for the rule.
+ * @exception DOMException
+ * SYNTAX_ERR: Raised if the specified CSS string value has a syntax
+ * error and is unparsable.
+ * <br>NO_MODIFICATION_ALLOWED_ERR: Raised if this rule is readonly.
+ */
+ public String getSelectorText();
+ /**
+ * The parsable textual representation of the page selector for the rule.
+ * @exception DOMException
+ * SYNTAX_ERR: Raised if the specified CSS string value has a syntax
+ * error and is unparsable.
+ * <br>NO_MODIFICATION_ALLOWED_ERR: Raised if this rule is readonly.
+ */
+ public void setSelectorText(String selectorText)
+ throws DOMException;
+
+ /**
+ * The declaration-block of this rule.
+ */
+ public CSSStyleDeclaration getStyle();
+
+}
diff --git a/external/jaxp/source/org/w3c/dom/css/CSSPrimitiveValue.java b/external/jaxp/source/org/w3c/dom/css/CSSPrimitiveValue.java
new file mode 100755
index 000000000..4131d26cd
--- /dev/null
+++ b/external/jaxp/source/org/w3c/dom/css/CSSPrimitiveValue.java
@@ -0,0 +1,296 @@
+/*
+ * Copyright (c) 2000 World Wide Web Consortium,
+ * (Massachusetts Institute of Technology, Institut National de
+ * Recherche en Informatique et en Automatique, Keio University). All
+ * Rights Reserved. This program is distributed under the W3C's Software
+ * Intellectual Property License. This program is distributed in the
+ * hope that it will be useful, but WITHOUT ANY WARRANTY; without even
+ * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+ * PURPOSE.
+ * See W3C License http://www.w3.org/Consortium/Legal/ for more details.
+ */
+
+package org.w3c.dom.css;
+
+import org.w3c.dom.DOMException;
+
+/**
+ * The <code>CSSPrimitiveValue</code> interface represents a single CSS value
+ * . This interface may be used to determine the value of a specific style
+ * property currently set in a block or to set a specific style property
+ * explicitly within the block. An instance of this interface might be
+ * obtained from the <code>getPropertyCSSValue</code> method of the
+ * <code>CSSStyleDeclaration</code> interface. A
+ * <code>CSSPrimitiveValue</code> object only occurs in a context of a CSS
+ * property.
+ * <p> Conversions are allowed between absolute values (from millimeters to
+ * centimeters, from degrees to radians, and so on) but not between relative
+ * values. (For example, a pixel value cannot be converted to a centimeter
+ * value.) Percentage values can't be converted since they are relative to
+ * the parent value (or another property value). There is one exception for
+ * color percentage values: since a color percentage value is relative to
+ * the range 0-255, a color percentage value can be converted to a number;
+ * (see also the <code>RGBColor</code> interface).
+ * <p>See also the <a href='http://www.w3.org/TR/2000/REC-DOM-Level-2-Style-20001113'>Document Object Model (DOM) Level 2 Style Specification</a>.
+ * @since DOM Level 2
+ */
+public interface CSSPrimitiveValue extends CSSValue {
+ // UnitTypes
+ /**
+ * The value is not a recognized CSS2 value. The value can only be
+ * obtained by using the <code>cssText</code> attribute.
+ */
+ public static final short CSS_UNKNOWN = 0;
+ /**
+ * The value is a simple number. The value can be obtained by using the
+ * <code>getFloatValue</code> method.
+ */
+ public static final short CSS_NUMBER = 1;
+ /**
+ * The value is a percentage. The value can be obtained by using the
+ * <code>getFloatValue</code> method.
+ */
+ public static final short CSS_PERCENTAGE = 2;
+ /**
+ * The value is a length (ems). The value can be obtained by using the
+ * <code>getFloatValue</code> method.
+ */
+ public static final short CSS_EMS = 3;
+ /**
+ * The value is a length (exs). The value can be obtained by using the
+ * <code>getFloatValue</code> method.
+ */
+ public static final short CSS_EXS = 4;
+ /**
+ * The value is a length (px). The value can be obtained by using the
+ * <code>getFloatValue</code> method.
+ */
+ public static final short CSS_PX = 5;
+ /**
+ * The value is a length (cm). The value can be obtained by using the
+ * <code>getFloatValue</code> method.
+ */
+ public static final short CSS_CM = 6;
+ /**
+ * The value is a length (mm). The value can be obtained by using the
+ * <code>getFloatValue</code> method.
+ */
+ public static final short CSS_MM = 7;
+ /**
+ * The value is a length (in). The value can be obtained by using the
+ * <code>getFloatValue</code> method.
+ */
+ public static final short CSS_IN = 8;
+ /**
+ * The value is a length (pt). The value can be obtained by using the
+ * <code>getFloatValue</code> method.
+ */
+ public static final short CSS_PT = 9;
+ /**
+ * The value is a length (pc). The value can be obtained by using the
+ * <code>getFloatValue</code> method.
+ */
+ public static final short CSS_PC = 10;
+ /**
+ * The value is an angle (deg). The value can be obtained by using the
+ * <code>getFloatValue</code> method.
+ */
+ public static final short CSS_DEG = 11;
+ /**
+ * The value is an angle (rad). The value can be obtained by using the
+ * <code>getFloatValue</code> method.
+ */
+ public static final short CSS_RAD = 12;
+ /**
+ * The value is an angle (grad). The value can be obtained by using the
+ * <code>getFloatValue</code> method.
+ */
+ public static final short CSS_GRAD = 13;
+ /**
+ * The value is a time (ms). The value can be obtained by using the
+ * <code>getFloatValue</code> method.
+ */
+ public static final short CSS_MS = 14;
+ /**
+ * The value is a time (s). The value can be obtained by using the
+ * <code>getFloatValue</code> method.
+ */
+ public static final short CSS_S = 15;
+ /**
+ * The value is a frequency (Hz). The value can be obtained by using the
+ * <code>getFloatValue</code> method.
+ */
+ public static final short CSS_HZ = 16;
+ /**
+ * The value is a frequency (kHz). The value can be obtained by using the
+ * <code>getFloatValue</code> method.
+ */
+ public static final short CSS_KHZ = 17;
+ /**
+ * The value is a number with an unknown dimension. The value can be
+ * obtained by using the <code>getFloatValue</code> method.
+ */
+ public static final short CSS_DIMENSION = 18;
+ /**
+ * The value is a STRING. The value can be obtained by using the
+ * <code>getStringValue</code> method.
+ */
+ public static final short CSS_STRING = 19;
+ /**
+ * The value is a URI. The value can be obtained by using the
+ * <code>getStringValue</code> method.
+ */
+ public static final short CSS_URI = 20;
+ /**
+ * The value is an identifier. The value can be obtained by using the
+ * <code>getStringValue</code> method.
+ */
+ public static final short CSS_IDENT = 21;
+ /**
+ * The value is a attribute function. The value can be obtained by using
+ * the <code>getStringValue</code> method.
+ */
+ public static final short CSS_ATTR = 22;
+ /**
+ * The value is a counter or counters function. The value can be obtained
+ * by using the <code>getCounterValue</code> method.
+ */
+ public static final short CSS_COUNTER = 23;
+ /**
+ * The value is a rect function. The value can be obtained by using the
+ * <code>getRectValue</code> method.
+ */
+ public static final short CSS_RECT = 24;
+ /**
+ * The value is a RGB color. The value can be obtained by using the
+ * <code>getRGBColorValue</code> method.
+ */
+ public static final short CSS_RGBCOLOR = 25;
+
+ /**
+ * The type of the value as defined by the constants specified above.
+ */
+ public short getPrimitiveType();
+
+ /**
+ * A method to set the float value with a specified unit. If the property
+ * attached with this value can not accept the specified unit or the
+ * float value, the value will be unchanged and a
+ * <code>DOMException</code> will be raised.
+ * @param unitType A unit code as defined above. The unit code can only
+ * be a float unit type (i.e. <code>CSS_NUMBER</code>,
+ * <code>CSS_PERCENTAGE</code>, <code>CSS_EMS</code>,
+ * <code>CSS_EXS</code>, <code>CSS_PX</code>, <code>CSS_CM</code>,
+ * <code>CSS_MM</code>, <code>CSS_IN</code>, <code>CSS_PT</code>,
+ * <code>CSS_PC</code>, <code>CSS_DEG</code>, <code>CSS_RAD</code>,
+ * <code>CSS_GRAD</code>, <code>CSS_MS</code>, <code>CSS_S</code>,
+ * <code>CSS_HZ</code>, <code>CSS_KHZ</code>,
+ * <code>CSS_DIMENSION</code>).
+ * @param floatValue The new float value.
+ * @exception DOMException
+ * INVALID_ACCESS_ERR: Raised if the attached property doesn't support
+ * the float value or the unit type.
+ * <br>NO_MODIFICATION_ALLOWED_ERR: Raised if this property is readonly.
+ */
+ public void setFloatValue(short unitType,
+ float floatValue)
+ throws DOMException;
+
+ /**
+ * This method is used to get a float value in a specified unit. If this
+ * CSS value doesn't contain a float value or can't be converted into
+ * the specified unit, a <code>DOMException</code> is raised.
+ * @param unitType A unit code to get the float value. The unit code can
+ * only be a float unit type (i.e. <code>CSS_NUMBER</code>,
+ * <code>CSS_PERCENTAGE</code>, <code>CSS_EMS</code>,
+ * <code>CSS_EXS</code>, <code>CSS_PX</code>, <code>CSS_CM</code>,
+ * <code>CSS_MM</code>, <code>CSS_IN</code>, <code>CSS_PT</code>,
+ * <code>CSS_PC</code>, <code>CSS_DEG</code>, <code>CSS_RAD</code>,
+ * <code>CSS_GRAD</code>, <code>CSS_MS</code>, <code>CSS_S</code>,
+ * <code>CSS_HZ</code>, <code>CSS_KHZ</code>,
+ * <code>CSS_DIMENSION</code>).
+ * @return The float value in the specified unit.
+ * @exception DOMException
+ * INVALID_ACCESS_ERR: Raised if the CSS value doesn't contain a float
+ * value or if the float value can't be converted into the specified
+ * unit.
+ */
+ public float getFloatValue(short unitType)
+ throws DOMException;
+
+ /**
+ * A method to set the string value with the specified unit. If the
+ * property attached to this value can't accept the specified unit or
+ * the string value, the value will be unchanged and a
+ * <code>DOMException</code> will be raised.
+ * @param stringType A string code as defined above. The string code can
+ * only be a string unit type (i.e. <code>CSS_STRING</code>,
+ * <code>CSS_URI</code>, <code>CSS_IDENT</code>, and
+ * <code>CSS_ATTR</code>).
+ * @param stringValue The new string value.
+ * @exception DOMException
+ * INVALID_ACCESS_ERR: Raised if the CSS value doesn't contain a string
+ * value or if the string value can't be converted into the specified
+ * unit.
+ * <br>NO_MODIFICATION_ALLOWED_ERR: Raised if this property is readonly.
+ */
+ public void setStringValue(short stringType,
+ String stringValue)
+ throws DOMException;
+
+ /**
+ * This method is used to get the string value. If the CSS value doesn't
+ * contain a string value, a <code>DOMException</code> is raised. Some
+ * properties (like 'font-family' or 'voice-family') convert a
+ * whitespace separated list of idents to a string.
+ * @return The string value in the current unit. The current
+ * <code>primitiveType</code> can only be a string unit type (i.e.
+ * <code>CSS_STRING</code>, <code>CSS_URI</code>,
+ * <code>CSS_IDENT</code> and <code>CSS_ATTR</code>).
+ * @exception DOMException
+ * INVALID_ACCESS_ERR: Raised if the CSS value doesn't contain a string
+ * value.
+ */
+ public String getStringValue()
+ throws DOMException;
+
+ /**
+ * This method is used to get the Counter value. If this CSS value
+ * doesn't contain a counter value, a <code>DOMException</code> is
+ * raised. Modification to the corresponding style property can be
+ * achieved using the <code>Counter</code> interface.
+ * @return The Counter value.
+ * @exception DOMException
+ * INVALID_ACCESS_ERR: Raised if the CSS value doesn't contain a
+ * Counter value (e.g. this is not <code>CSS_COUNTER</code>).
+ */
+ public Counter getCounterValue()
+ throws DOMException;
+
+ /**
+ * This method is used to get the Rect value. If this CSS value doesn't
+ * contain a rect value, a <code>DOMException</code> is raised.
+ * Modification to the corresponding style property can be achieved
+ * using the <code>Rect</code> interface.
+ * @return The Rect value.
+ * @exception DOMException
+ * INVALID_ACCESS_ERR: Raised if the CSS value doesn't contain a Rect
+ * value. (e.g. this is not <code>CSS_RECT</code>).
+ */
+ public Rect getRectValue()
+ throws DOMException;
+
+ /**
+ * This method is used to get the RGB color. If this CSS value doesn't
+ * contain a RGB color value, a <code>DOMException</code> is raised.
+ * Modification to the corresponding style property can be achieved
+ * using the <code>RGBColor</code> interface.
+ * @return the RGB color value.
+ * @exception DOMException
+ * INVALID_ACCESS_ERR: Raised if the attached property can't return a
+ * RGB color value (e.g. this is not <code>CSS_RGBCOLOR</code>).
+ */
+ public RGBColor getRGBColorValue()
+ throws DOMException;
+
+}
diff --git a/external/jaxp/source/org/w3c/dom/css/CSSRule.java b/external/jaxp/source/org/w3c/dom/css/CSSRule.java
new file mode 100755
index 000000000..2d375e91a
--- /dev/null
+++ b/external/jaxp/source/org/w3c/dom/css/CSSRule.java
@@ -0,0 +1,105 @@
+/*
+ * Copyright (c) 2000 World Wide Web Consortium,
+ * (Massachusetts Institute of Technology, Institut National de
+ * Recherche en Informatique et en Automatique, Keio University). All
+ * Rights Reserved. This program is distributed under the W3C's Software
+ * Intellectual Property License. This program is distributed in the
+ * hope that it will be useful, but WITHOUT ANY WARRANTY; without even
+ * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+ * PURPOSE.
+ * See W3C License http://www.w3.org/Consortium/Legal/ for more details.
+ */
+
+package org.w3c.dom.css;
+
+import org.w3c.dom.DOMException;
+
+/**
+ * The <code>CSSRule</code> interface is the abstract base interface for any
+ * type of CSS statement. This includes both rule sets and at-rules. An
+ * implementation is expected to preserve all rules specified in a CSS style
+ * sheet, even if the rule is not recognized by the parser. Unrecognized
+ * rules are represented using the <code>CSSUnknownRule</code> interface.
+ * <p>See also the <a href='http://www.w3.org/TR/2000/REC-DOM-Level-2-Style-20001113'>Document Object Model (DOM) Level 2 Style Specification</a>.
+ * @since DOM Level 2
+ */
+public interface CSSRule {
+ // RuleType
+ /**
+ * The rule is a <code>CSSUnknownRule</code>.
+ */
+ public static final short UNKNOWN_RULE = 0;
+ /**
+ * The rule is a <code>CSSStyleRule</code>.
+ */
+ public static final short STYLE_RULE = 1;
+ /**
+ * The rule is a <code>CSSCharsetRule</code>.
+ */
+ public static final short CHARSET_RULE = 2;
+ /**
+ * The rule is a <code>CSSImportRule</code>.
+ */
+ public static final short IMPORT_RULE = 3;
+ /**
+ * The rule is a <code>CSSMediaRule</code>.
+ */
+ public static final short MEDIA_RULE = 4;
+ /**
+ * The rule is a <code>CSSFontFaceRule</code>.
+ */
+ public static final short FONT_FACE_RULE = 5;
+ /**
+ * The rule is a <code>CSSPageRule</code>.
+ */
+ public static final short PAGE_RULE = 6;
+
+ /**
+ * The type of the rule, as defined above. The expectation is that
+ * binding-specific casting methods can be used to cast down from an
+ * instance of the <code>CSSRule</code> interface to the specific
+ * derived interface implied by the <code>type</code>.
+ */
+ public short getType();
+
+ /**
+ * The parsable textual representation of the rule. This reflects the
+ * current state of the rule and not its initial value.
+ * @exception DOMException
+ * SYNTAX_ERR: Raised if the specified CSS string value has a syntax
+ * error and is unparsable.
+ * <br>INVALID_MODIFICATION_ERR: Raised if the specified CSS string
+ * value represents a different type of rule than the current one.
+ * <br>HIERARCHY_REQUEST_ERR: Raised if the rule cannot be inserted at
+ * this point in the style sheet.
+ * <br>NO_MODIFICATION_ALLOWED_ERR: Raised if the rule is readonly.
+ */
+ public String getCssText();
+ /**
+ * The parsable textual representation of the rule. This reflects the
+ * current state of the rule and not its initial value.
+ * @exception DOMException
+ * SYNTAX_ERR: Raised if the specified CSS string value has a syntax
+ * error and is unparsable.
+ * <br>INVALID_MODIFICATION_ERR: Raised if the specified CSS string
+ * value represents a different type of rule than the current one.
+ * <br>HIERARCHY_REQUEST_ERR: Raised if the rule cannot be inserted at
+ * this point in the style sheet.
+ * <br>NO_MODIFICATION_ALLOWED_ERR: Raised if the rule is readonly.
+ */
+ public void setCssText(String cssText)
+ throws DOMException;
+
+ /**
+ * The style sheet that contains this rule.
+ */
+ public CSSStyleSheet getParentStyleSheet();
+
+ /**
+ * If this rule is contained inside another rule (e.g. a style rule
+ * inside an @media block), this is the containing rule. If this rule is
+ * not nested inside any other rules, this returns <code>null</code>.
+ */
+ public CSSRule getParentRule();
+
+}
diff --git a/external/jaxp/source/org/w3c/dom/css/CSSRuleList.java b/external/jaxp/source/org/w3c/dom/css/CSSRuleList.java
new file mode 100755
index 000000000..41c2c6837
--- /dev/null
+++ b/external/jaxp/source/org/w3c/dom/css/CSSRuleList.java
@@ -0,0 +1,43 @@
+/*
+ * Copyright (c) 2000 World Wide Web Consortium,
+ * (Massachusetts Institute of Technology, Institut National de
+ * Recherche en Informatique et en Automatique, Keio University). All
+ * Rights Reserved. This program is distributed under the W3C's Software
+ * Intellectual Property License. This program is distributed in the
+ * hope that it will be useful, but WITHOUT ANY WARRANTY; without even
+ * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+ * PURPOSE.
+ * See W3C License http://www.w3.org/Consortium/Legal/ for more details.
+ */
+
+package org.w3c.dom.css;
+
+/**
+ * The <code>CSSRuleList</code> interface provides the abstraction of an
+ * ordered collection of CSS rules.
+ * <p> The items in the <code>CSSRuleList</code> are accessible via an
+ * integral index, starting from 0.
+ * <p>See also the <a href='http://www.w3.org/TR/2000/REC-DOM-Level-2-Style-20001113'>Document Object Model (DOM) Level 2 Style Specification</a>.
+ * @since DOM Level 2
+ */
+public interface CSSRuleList {
+ /**
+ * The number of <code>CSSRules</code> in the list. The range of valid
+ * child rule indices is <code>0</code> to <code>length-1</code>
+ * inclusive.
+ */
+ public int getLength();
+
+ /**
+ * Used to retrieve a CSS rule by ordinal index. The order in this
+ * collection represents the order of the rules in the CSS style sheet.
+ * If index is greater than or equal to the number of rules in the list,
+ * this returns <code>null</code>.
+ * @param index Index into the collection
+ * @return The style rule at the <code>index</code> position in the
+ * <code>CSSRuleList</code>, or <code>null</code> if that is not a
+ * valid index.
+ */
+ public CSSRule item(int index);
+
+}
diff --git a/external/jaxp/source/org/w3c/dom/css/CSSStyleDeclaration.java b/external/jaxp/source/org/w3c/dom/css/CSSStyleDeclaration.java
new file mode 100755
index 000000000..bcd5229ff
--- /dev/null
+++ b/external/jaxp/source/org/w3c/dom/css/CSSStyleDeclaration.java
@@ -0,0 +1,164 @@
+/*
+ * Copyright (c) 2000 World Wide Web Consortium,
+ * (Massachusetts Institute of Technology, Institut National de
+ * Recherche en Informatique et en Automatique, Keio University). All
+ * Rights Reserved. This program is distributed under the W3C's Software
+ * Intellectual Property License. This program is distributed in the
+ * hope that it will be useful, but WITHOUT ANY WARRANTY; without even
+ * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+ * PURPOSE.
+ * See W3C License http://www.w3.org/Consortium/Legal/ for more details.
+ */
+
+package org.w3c.dom.css;
+
+import org.w3c.dom.DOMException;
+
+/**
+ * The <code>CSSStyleDeclaration</code> interface represents a single CSS
+ * declaration block. This interface may be used to determine the style
+ * properties currently set in a block or to set style properties explicitly
+ * within the block.
+ * <p> While an implementation may not recognize all CSS properties within a
+ * CSS declaration block, it is expected to provide access to all specified
+ * properties in the style sheet through the <code>CSSStyleDeclaration</code>
+ * interface. Furthermore, implementations that support a specific level of
+ * CSS should correctly handle CSS shorthand properties for that level. For
+ * a further discussion of shorthand properties, see the
+ * <code>CSS2Properties</code> interface.
+ * <p> This interface is also used to provide a read-only access to the
+ * computed values of an element. See also the <code>ViewCSS</code>
+ * interface. The CSS Object Model doesn't provide an access to the
+ * specified or actual values of the CSS cascade.
+ * <p>See also the <a href='http://www.w3.org/TR/2000/REC-DOM-Level-2-Style-20001113'>Document Object Model (DOM) Level 2 Style Specification</a>.
+ * @since DOM Level 2
+ */
+public interface CSSStyleDeclaration {
+ /**
+ * The parsable textual representation of the declaration block
+ * (excluding the surrounding curly braces). Setting this attribute will
+ * result in the parsing of the new value and resetting of all the
+ * properties in the declaration block including the removal or addition
+ * of properties.
+ * @exception DOMException
+ * SYNTAX_ERR: Raised if the specified CSS string value has a syntax
+ * error and is unparsable.
+ * <br>NO_MODIFICATION_ALLOWED_ERR: Raised if this declaration is
+ * readonly or a property is readonly.
+ */
+ public String getCssText();
+ /**
+ * The parsable textual representation of the declaration block
+ * (excluding the surrounding curly braces). Setting this attribute will
+ * result in the parsing of the new value and resetting of all the
+ * properties in the declaration block including the removal or addition
+ * of properties.
+ * @exception DOMException
+ * SYNTAX_ERR: Raised if the specified CSS string value has a syntax
+ * error and is unparsable.
+ * <br>NO_MODIFICATION_ALLOWED_ERR: Raised if this declaration is
+ * readonly or a property is readonly.
+ */
+ public void setCssText(String cssText)
+ throws DOMException;
+
+ /**
+ * Used to retrieve the value of a CSS property if it has been explicitly
+ * set within this declaration block.
+ * @param propertyName The name of the CSS property. See the CSS
+ * property index.
+ * @return Returns the value of the property if it has been explicitly
+ * set for this declaration block. Returns the empty string if the
+ * property has not been set.
+ */
+ public String getPropertyValue(String propertyName);
+
+ /**
+ * Used to retrieve the object representation of the value of a CSS
+ * property if it has been explicitly set within this declaration block.
+ * This method returns <code>null</code> if the property is a shorthand
+ * property. Shorthand property values can only be accessed and modified
+ * as strings, using the <code>getPropertyValue</code> and
+ * <code>setProperty</code> methods.
+ * @param propertyName The name of the CSS property. See the CSS
+ * property index.
+ * @return Returns the value of the property if it has been explicitly
+ * set for this declaration block. Returns <code>null</code> if the
+ * property has not been set.
+ */
+ public CSSValue getPropertyCSSValue(String propertyName);
+
+ /**
+ * Used to remove a CSS property if it has been explicitly set within
+ * this declaration block.
+ * @param propertyName The name of the CSS property. See the CSS
+ * property index.
+ * @return Returns the value of the property if it has been explicitly
+ * set for this declaration block. Returns the empty string if the
+ * property has not been set or the property name does not correspond
+ * to a known CSS property.
+ * @exception DOMException
+ * NO_MODIFICATION_ALLOWED_ERR: Raised if this declaration is readonly
+ * or the property is readonly.
+ */
+ public String removeProperty(String propertyName)
+ throws DOMException;
+
+ /**
+ * Used to retrieve the priority of a CSS property (e.g. the
+ * <code>"important"</code> qualifier) if the property has been
+ * explicitly set in this declaration block.
+ * @param propertyName The name of the CSS property. See the CSS
+ * property index.
+ * @return A string representing the priority (e.g.
+ * <code>"important"</code>) if one exists. The empty string if none
+ * exists.
+ */
+ public String getPropertyPriority(String propertyName);
+
+ /**
+ * Used to set a property value and priority within this declaration
+ * block.
+ * @param propertyName The name of the CSS property. See the CSS
+ * property index.
+ * @param value The new value of the property.
+ * @param priority The new priority of the property (e.g.
+ * <code>"important"</code>).
+ * @exception DOMException
+ * SYNTAX_ERR: Raised if the specified value has a syntax error and is
+ * unparsable.
+ * <br>NO_MODIFICATION_ALLOWED_ERR: Raised if this declaration is
+ * readonly or the property is readonly.
+ */
+ public void setProperty(String propertyName,
+ String value,
+ String priority)
+ throws DOMException;
+
+ /**
+ * The number of properties that have been explicitly set in this
+ * declaration block. The range of valid indices is 0 to length-1
+ * inclusive.
+ */
+ public int getLength();
+
+ /**
+ * Used to retrieve the properties that have been explicitly set in this
+ * declaration block. The order of the properties retrieved using this
+ * method does not have to be the order in which they were set. This
+ * method can be used to iterate over all properties in this declaration
+ * block.
+ * @param index Index of the property name to retrieve.
+ * @return The name of the property at this ordinal position. The empty
+ * string if no property exists at this position.
+ */
+ public String item(int index);
+
+ /**
+ * The CSS rule that contains this declaration block or <code>null</code>
+ * if this <code>CSSStyleDeclaration</code> is not attached to a
+ * <code>CSSRule</code>.
+ */
+ public CSSRule getParentRule();
+
+}
diff --git a/external/jaxp/source/org/w3c/dom/css/CSSStyleRule.java b/external/jaxp/source/org/w3c/dom/css/CSSStyleRule.java
new file mode 100755
index 000000000..e3e0cd81a
--- /dev/null
+++ b/external/jaxp/source/org/w3c/dom/css/CSSStyleRule.java
@@ -0,0 +1,51 @@
+/*
+ * Copyright (c) 2000 World Wide Web Consortium,
+ * (Massachusetts Institute of Technology, Institut National de
+ * Recherche en Informatique et en Automatique, Keio University). All
+ * Rights Reserved. This program is distributed under the W3C's Software
+ * Intellectual Property License. This program is distributed in the
+ * hope that it will be useful, but WITHOUT ANY WARRANTY; without even
+ * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+ * PURPOSE.
+ * See W3C License http://www.w3.org/Consortium/Legal/ for more details.
+ */
+
+package org.w3c.dom.css;
+
+import org.w3c.dom.DOMException;
+
+/**
+ * The <code>CSSStyleRule</code> interface represents a single rule set in a
+ * CSS style sheet.
+ * <p>See also the <a href='http://www.w3.org/TR/2000/REC-DOM-Level-2-Style-20001113'>Document Object Model (DOM) Level 2 Style Specification</a>.
+ * @since DOM Level 2
+ */
+public interface CSSStyleRule extends CSSRule {
+ /**
+ * The textual representation of the selector for the rule set. The
+ * implementation may have stripped out insignificant whitespace while
+ * parsing the selector.
+ * @exception DOMException
+ * SYNTAX_ERR: Raised if the specified CSS string value has a syntax
+ * error and is unparsable.
+ * <br>NO_MODIFICATION_ALLOWED_ERR: Raised if this rule is readonly.
+ */
+ public String getSelectorText();
+ /**
+ * The textual representation of the selector for the rule set. The
+ * implementation may have stripped out insignificant whitespace while
+ * parsing the selector.
+ * @exception DOMException
+ * SYNTAX_ERR: Raised if the specified CSS string value has a syntax
+ * error and is unparsable.
+ * <br>NO_MODIFICATION_ALLOWED_ERR: Raised if this rule is readonly.
+ */
+ public void setSelectorText(String selectorText)
+ throws DOMException;
+
+ /**
+ * The declaration-block of this rule set.
+ */
+ public CSSStyleDeclaration getStyle();
+
+}
diff --git a/external/jaxp/source/org/w3c/dom/css/CSSStyleSheet.java b/external/jaxp/source/org/w3c/dom/css/CSSStyleSheet.java
new file mode 100755
index 000000000..b529e5db0
--- /dev/null
+++ b/external/jaxp/source/org/w3c/dom/css/CSSStyleSheet.java
@@ -0,0 +1,85 @@
+/*
+ * Copyright (c) 2000 World Wide Web Consortium,
+ * (Massachusetts Institute of Technology, Institut National de
+ * Recherche en Informatique et en Automatique, Keio University). All
+ * Rights Reserved. This program is distributed under the W3C's Software
+ * Intellectual Property License. This program is distributed in the
+ * hope that it will be useful, but WITHOUT ANY WARRANTY; without even
+ * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+ * PURPOSE.
+ * See W3C License http://www.w3.org/Consortium/Legal/ for more details.
+ */
+
+package org.w3c.dom.css;
+
+import org.w3c.dom.DOMException;
+import org.w3c.dom.stylesheets.StyleSheet;
+
+/**
+ * The <code>CSSStyleSheet</code> interface is a concrete interface used to
+ * represent a CSS style sheet i.e., a style sheet whose content type is
+ * "text/css".
+ * <p>See also the <a href='http://www.w3.org/TR/2000/REC-DOM-Level-2-Style-20001113'>Document Object Model (DOM) Level 2 Style Specification</a>.
+ * @since DOM Level 2
+ */
+public interface CSSStyleSheet extends StyleSheet {
+ /**
+ * If this style sheet comes from an <code>@import</code> rule, the
+ * <code>ownerRule</code> attribute will contain the
+ * <code>CSSImportRule</code>. In that case, the <code>ownerNode</code>
+ * attribute in the <code>StyleSheet</code> interface will be
+ * <code>null</code>. If the style sheet comes from an element or a
+ * processing instruction, the <code>ownerRule</code> attribute will be
+ * <code>null</code> and the <code>ownerNode</code> attribute will
+ * contain the <code>Node</code>.
+ */
+ public CSSRule getOwnerRule();
+
+ /**
+ * The list of all CSS rules contained within the style sheet. This
+ * includes both rule sets and at-rules.
+ */
+ public CSSRuleList getCssRules();
+
+ /**
+ * Used to insert a new rule into the style sheet. The new rule now
+ * becomes part of the cascade.
+ * @param rule The parsable text representing the rule. For rule sets
+ * this contains both the selector and the style declaration. For
+ * at-rules, this specifies both the at-identifier and the rule
+ * content.
+ * @param index The index within the style sheet's rule list of the rule
+ * before which to insert the specified rule. If the specified index
+ * is equal to the length of the style sheet's rule collection, the
+ * rule will be added to the end of the style sheet.
+ * @return The index within the style sheet's rule collection of the
+ * newly inserted rule.
+ * @exception DOMException
+ * HIERARCHY_REQUEST_ERR: Raised if the rule cannot be inserted at the
+ * specified index e.g. if an <code>@import</code> rule is inserted
+ * after a standard rule set or other at-rule.
+ * <br>INDEX_SIZE_ERR: Raised if the specified index is not a valid
+ * insertion point.
+ * <br>NO_MODIFICATION_ALLOWED_ERR: Raised if this style sheet is
+ * readonly.
+ * <br>SYNTAX_ERR: Raised if the specified rule has a syntax error and
+ * is unparsable.
+ */
+ public int insertRule(String rule,
+ int index)
+ throws DOMException;
+
+ /**
+ * Used to delete a rule from the style sheet.
+ * @param index The index within the style sheet's rule list of the rule
+ * to remove.
+ * @exception DOMException
+ * INDEX_SIZE_ERR: Raised if the specified index does not correspond to
+ * a rule in the style sheet's rule list.
+ * <br>NO_MODIFICATION_ALLOWED_ERR: Raised if this style sheet is
+ * readonly.
+ */
+ public void deleteRule(int index)
+ throws DOMException;
+
+}
diff --git a/external/jaxp/source/org/w3c/dom/css/CSSUnknownRule.java b/external/jaxp/source/org/w3c/dom/css/CSSUnknownRule.java
new file mode 100755
index 000000000..763d5f1b6
--- /dev/null
+++ b/external/jaxp/source/org/w3c/dom/css/CSSUnknownRule.java
@@ -0,0 +1,22 @@
+/*
+ * Copyright (c) 2000 World Wide Web Consortium,
+ * (Massachusetts Institute of Technology, Institut National de
+ * Recherche en Informatique et en Automatique, Keio University). All
+ * Rights Reserved. This program is distributed under the W3C's Software
+ * Intellectual Property License. This program is distributed in the
+ * hope that it will be useful, but WITHOUT ANY WARRANTY; without even
+ * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+ * PURPOSE.
+ * See W3C License http://www.w3.org/Consortium/Legal/ for more details.
+ */
+
+package org.w3c.dom.css;
+
+/**
+ * The <code>CSSUnknownRule</code> interface represents an at-rule not
+ * supported by this user agent.
+ * <p>See also the <a href='http://www.w3.org/TR/2000/REC-DOM-Level-2-Style-20001113'>Document Object Model (DOM) Level 2 Style Specification</a>.
+ * @since DOM Level 2
+ */
+public interface CSSUnknownRule extends CSSRule {
+}
diff --git a/external/jaxp/source/org/w3c/dom/css/CSSValue.java b/external/jaxp/source/org/w3c/dom/css/CSSValue.java
new file mode 100755
index 000000000..48b2fbd6f
--- /dev/null
+++ b/external/jaxp/source/org/w3c/dom/css/CSSValue.java
@@ -0,0 +1,78 @@
+/*
+ * Copyright (c) 2000 World Wide Web Consortium,
+ * (Massachusetts Institute of Technology, Institut National de
+ * Recherche en Informatique et en Automatique, Keio University). All
+ * Rights Reserved. This program is distributed under the W3C's Software
+ * Intellectual Property License. This program is distributed in the
+ * hope that it will be useful, but WITHOUT ANY WARRANTY; without even
+ * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+ * PURPOSE.
+ * See W3C License http://www.w3.org/Consortium/Legal/ for more details.
+ */
+
+package org.w3c.dom.css;
+
+import org.w3c.dom.DOMException;
+
+/**
+ * The <code>CSSValue</code> interface represents a simple or a complex
+ * value. A <code>CSSValue</code> object only occurs in a context of a CSS
+ * property.
+ * <p>See also the <a href='http://www.w3.org/TR/2000/REC-DOM-Level-2-Style-20001113'>Document Object Model (DOM) Level 2 Style Specification</a>.
+ * @since DOM Level 2
+ */
+public interface CSSValue {
+ // UnitTypes
+ /**
+ * The value is inherited and the <code>cssText</code> contains "inherit".
+ */
+ public static final short CSS_INHERIT = 0;
+ /**
+ * The value is a primitive value and an instance of the
+ * <code>CSSPrimitiveValue</code> interface can be obtained by using
+ * binding-specific casting methods on this instance of the
+ * <code>CSSValue</code> interface.
+ */
+ public static final short CSS_PRIMITIVE_VALUE = 1;
+ /**
+ * The value is a <code>CSSValue</code> list and an instance of the
+ * <code>CSSValueList</code> interface can be obtained by using
+ * binding-specific casting methods on this instance of the
+ * <code>CSSValue</code> interface.
+ */
+ public static final short CSS_VALUE_LIST = 2;
+ /**
+ * The value is a custom value.
+ */
+ public static final short CSS_CUSTOM = 3;
+
+ /**
+ * A string representation of the current value.
+ * @exception DOMException
+ * SYNTAX_ERR: Raised if the specified CSS string value has a syntax
+ * error (according to the attached property) or is unparsable.
+ * <br>INVALID_MODIFICATION_ERR: Raised if the specified CSS string
+ * value represents a different type of values than the values allowed
+ * by the CSS property.
+ * <br> NO_MODIFICATION_ALLOWED_ERR: Raised if this value is readonly.
+ */
+ public String getCssText();
+ /**
+ * A string representation of the current value.
+ * @exception DOMException
+ * SYNTAX_ERR: Raised if the specified CSS string value has a syntax
+ * error (according to the attached property) or is unparsable.
+ * <br>INVALID_MODIFICATION_ERR: Raised if the specified CSS string
+ * value represents a different type of values than the values allowed
+ * by the CSS property.
+ * <br> NO_MODIFICATION_ALLOWED_ERR: Raised if this value is readonly.
+ */
+ public void setCssText(String cssText)
+ throws DOMException;
+
+ /**
+ * A code defining the type of the value as defined above.
+ */
+ public short getCssValueType();
+
+}
diff --git a/external/jaxp/source/org/w3c/dom/css/CSSValueList.java b/external/jaxp/source/org/w3c/dom/css/CSSValueList.java
new file mode 100755
index 000000000..bf15bb3eb
--- /dev/null
+++ b/external/jaxp/source/org/w3c/dom/css/CSSValueList.java
@@ -0,0 +1,46 @@
+/*
+ * Copyright (c) 2000 World Wide Web Consortium,
+ * (Massachusetts Institute of Technology, Institut National de
+ * Recherche en Informatique et en Automatique, Keio University). All
+ * Rights Reserved. This program is distributed under the W3C's Software
+ * Intellectual Property License. This program is distributed in the
+ * hope that it will be useful, but WITHOUT ANY WARRANTY; without even
+ * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+ * PURPOSE.
+ * See W3C License http://www.w3.org/Consortium/Legal/ for more details.
+ */
+
+package org.w3c.dom.css;
+
+/**
+ * The <code>CSSValueList</code> interface provides the abstraction of an
+ * ordered collection of CSS values.
+ * <p> Some properties allow an empty list into their syntax. In that case,
+ * these properties take the <code>none</code> identifier. So, an empty list
+ * means that the property has the value <code>none</code>.
+ * <p> The items in the <code>CSSValueList</code> are accessible via an
+ * integral index, starting from 0.
+ * <p>See also the <a href='http://www.w3.org/TR/2000/REC-DOM-Level-2-Style-20001113'>Document Object Model (DOM) Level 2 Style Specification</a>.
+ * @since DOM Level 2
+ */
+public interface CSSValueList extends CSSValue {
+ /**
+ * The number of <code>CSSValues</code> in the list. The range of valid
+ * values of the indices is <code>0</code> to <code>length-1</code>
+ * inclusive.
+ */
+ public int getLength();
+
+ /**
+ * Used to retrieve a <code>CSSValue</code> by ordinal index. The order in
+ * this collection represents the order of the values in the CSS style
+ * property. If index is greater than or equal to the number of values
+ * in the list, this returns <code>null</code>.
+ * @param index Index into the collection.
+ * @return The <code>CSSValue</code> at the <code>index</code> position
+ * in the <code>CSSValueList</code>, or <code>null</code> if that is
+ * not a valid index.
+ */
+ public CSSValue item(int index);
+
+}
diff --git a/external/jaxp/source/org/w3c/dom/css/Counter.java b/external/jaxp/source/org/w3c/dom/css/Counter.java
new file mode 100755
index 000000000..8cd4967b3
--- /dev/null
+++ b/external/jaxp/source/org/w3c/dom/css/Counter.java
@@ -0,0 +1,38 @@
+/*
+ * Copyright (c) 2000 World Wide Web Consortium,
+ * (Massachusetts Institute of Technology, Institut National de
+ * Recherche en Informatique et en Automatique, Keio University). All
+ * Rights Reserved. This program is distributed under the W3C's Software
+ * Intellectual Property License. This program is distributed in the
+ * hope that it will be useful, but WITHOUT ANY WARRANTY; without even
+ * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+ * PURPOSE.
+ * See W3C License http://www.w3.org/Consortium/Legal/ for more details.
+ */
+
+package org.w3c.dom.css;
+
+/**
+ * The <code>Counter</code> interface is used to represent any counter or
+ * counters function value. This interface reflects the values in the
+ * underlying style property.
+ * <p>See also the <a href='http://www.w3.org/TR/2000/REC-DOM-Level-2-Style-20001113'>Document Object Model (DOM) Level 2 Style Specification</a>.
+ * @since DOM Level 2
+ */
+public interface Counter {
+ /**
+ * This attribute is used for the identifier of the counter.
+ */
+ public String getIdentifier();
+
+ /**
+ * This attribute is used for the style of the list.
+ */
+ public String getListStyle();
+
+ /**
+ * This attribute is used for the separator of the nested counters.
+ */
+ public String getSeparator();
+
+}
diff --git a/external/jaxp/source/org/w3c/dom/css/DOMImplementationCSS.java b/external/jaxp/source/org/w3c/dom/css/DOMImplementationCSS.java
new file mode 100755
index 000000000..65c97291e
--- /dev/null
+++ b/external/jaxp/source/org/w3c/dom/css/DOMImplementationCSS.java
@@ -0,0 +1,40 @@
+/*
+ * Copyright (c) 2000 World Wide Web Consortium,
+ * (Massachusetts Institute of Technology, Institut National de
+ * Recherche en Informatique et en Automatique, Keio University). All
+ * Rights Reserved. This program is distributed under the W3C's Software
+ * Intellectual Property License. This program is distributed in the
+ * hope that it will be useful, but WITHOUT ANY WARRANTY; without even
+ * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+ * PURPOSE.
+ * See W3C License http://www.w3.org/Consortium/Legal/ for more details.
+ */
+
+package org.w3c.dom.css;
+
+import org.w3c.dom.DOMImplementation;
+import org.w3c.dom.DOMException;
+
+/**
+ * This interface allows the DOM user to create a <code>CSSStyleSheet</code>
+ * outside the context of a document. There is no way to associate the new
+ * <code>CSSStyleSheet</code> with a document in DOM Level 2.
+ * <p>See also the <a href='http://www.w3.org/TR/2000/REC-DOM-Level-2-Style-20001113'>Document Object Model (DOM) Level 2 Style Specification</a>.
+ * @since DOM Level 2
+ */
+public interface DOMImplementationCSS extends DOMImplementation {
+ /**
+ * Creates a new <code>CSSStyleSheet</code>.
+ * @param title The advisory title. See also the section.
+ * @param media The comma-separated list of media associated with the
+ * new style sheet. See also the section.
+ * @return A new CSS style sheet.
+ * @exception DOMException
+ * SYNTAX_ERR: Raised if the specified media string value has a syntax
+ * error and is unparsable.
+ */
+ public CSSStyleSheet createCSSStyleSheet(String title,
+ String media)
+ throws DOMException;
+
+}
diff --git a/external/jaxp/source/org/w3c/dom/css/DocumentCSS.java b/external/jaxp/source/org/w3c/dom/css/DocumentCSS.java
new file mode 100755
index 000000000..8fe93c79a
--- /dev/null
+++ b/external/jaxp/source/org/w3c/dom/css/DocumentCSS.java
@@ -0,0 +1,50 @@
+/*
+ * Copyright (c) 2000 World Wide Web Consortium,
+ * (Massachusetts Institute of Technology, Institut National de
+ * Recherche en Informatique et en Automatique, Keio University). All
+ * Rights Reserved. This program is distributed under the W3C's Software
+ * Intellectual Property License. This program is distributed in the
+ * hope that it will be useful, but WITHOUT ANY WARRANTY; without even
+ * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+ * PURPOSE.
+ * See W3C License http://www.w3.org/Consortium/Legal/ for more details.
+ */
+
+package org.w3c.dom.css;
+
+import org.w3c.dom.Element;
+import org.w3c.dom.stylesheets.DocumentStyle;
+
+/**
+ * This interface represents a document with a CSS view.
+ * <p> The <code>getOverrideStyle</code> method provides a mechanism through
+ * which a DOM author could effect immediate change to the style of an
+ * element without modifying the explicitly linked style sheets of a
+ * document or the inline style of elements in the style sheets. This style
+ * sheet comes after the author style sheet in the cascade algorithm and is
+ * called override style sheet. The override style sheet takes precedence
+ * over author style sheets. An "!important" declaration still takes
+ * precedence over a normal declaration. Override, author, and user style
+ * sheets all may contain "!important" declarations. User "!important" rules
+ * take precedence over both override and author "!important" rules, and
+ * override "!important" rules take precedence over author "!important"
+ * rules.
+ * <p> The expectation is that an instance of the <code>DocumentCSS</code>
+ * interface can be obtained by using binding-specific casting methods on an
+ * instance of the <code>Document</code> interface.
+ * <p>See also the <a href='http://www.w3.org/TR/2000/REC-DOM-Level-2-Style-20001113'>Document Object Model (DOM) Level 2 Style Specification</a>.
+ * @since DOM Level 2
+ */
+public interface DocumentCSS extends DocumentStyle {
+ /**
+ * This method is used to retrieve the override style declaration for a
+ * specified element and a specified pseudo-element.
+ * @param elt The element whose style is to be modified. This parameter
+ * cannot be null.
+ * @param pseudoElt The pseudo-element or <code>null</code> if none.
+ * @return The override style declaration.
+ */
+ public CSSStyleDeclaration getOverrideStyle(Element elt,
+ String pseudoElt);
+
+}
diff --git a/external/jaxp/source/org/w3c/dom/css/ElementCSSInlineStyle.java b/external/jaxp/source/org/w3c/dom/css/ElementCSSInlineStyle.java
new file mode 100755
index 000000000..98b60bf9d
--- /dev/null
+++ b/external/jaxp/source/org/w3c/dom/css/ElementCSSInlineStyle.java
@@ -0,0 +1,32 @@
+/*
+ * Copyright (c) 2000 World Wide Web Consortium,
+ * (Massachusetts Institute of Technology, Institut National de
+ * Recherche en Informatique et en Automatique, Keio University). All
+ * Rights Reserved. This program is distributed under the W3C's Software
+ * Intellectual Property License. This program is distributed in the
+ * hope that it will be useful, but WITHOUT ANY WARRANTY; without even
+ * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+ * PURPOSE.
+ * See W3C License http://www.w3.org/Consortium/Legal/ for more details.
+ */
+
+package org.w3c.dom.css;
+
+/**
+ * Inline style information attached to elements is exposed through the
+ * <code>style</code> attribute. This represents the contents of the STYLE
+ * attribute for HTML elements (or elements in other schemas or DTDs which
+ * use the STYLE attribute in the same way). The expectation is that an
+ * instance of the ElementCSSInlineStyle interface can be obtained by using
+ * binding-specific casting methods on an instance of the Element interface
+ * when the element supports inline CSS style informations.
+ * <p>See also the <a href='http://www.w3.org/TR/2000/REC-DOM-Level-2-Style-20001113'>Document Object Model (DOM) Level 2 Style Specification</a>.
+ * @since DOM Level 2
+ */
+public interface ElementCSSInlineStyle {
+ /**
+ * The style attribute.
+ */
+ public CSSStyleDeclaration getStyle();
+
+}
diff --git a/external/jaxp/source/org/w3c/dom/css/RGBColor.java b/external/jaxp/source/org/w3c/dom/css/RGBColor.java
new file mode 100755
index 000000000..cd5daa567
--- /dev/null
+++ b/external/jaxp/source/org/w3c/dom/css/RGBColor.java
@@ -0,0 +1,47 @@
+/*
+ * Copyright (c) 2000 World Wide Web Consortium,
+ * (Massachusetts Institute of Technology, Institut National de
+ * Recherche en Informatique et en Automatique, Keio University). All
+ * Rights Reserved. This program is distributed under the W3C's Software
+ * Intellectual Property License. This program is distributed in the
+ * hope that it will be useful, but WITHOUT ANY WARRANTY; without even
+ * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+ * PURPOSE.
+ * See W3C License http://www.w3.org/Consortium/Legal/ for more details.
+ */
+
+package org.w3c.dom.css;
+
+/**
+ * The <code>RGBColor</code> interface is used to represent any RGB color
+ * value. This interface reflects the values in the underlying style
+ * property. Hence, modifications made to the <code>CSSPrimitiveValue</code>
+ * objects modify the style property.
+ * <p> A specified RGB color is not clipped (even if the number is outside the
+ * range 0-255 or 0%-100%). A computed RGB color is clipped depending on the
+ * device.
+ * <p> Even if a style sheet can only contain an integer for a color value,
+ * the internal storage of this integer is a float, and this can be used as
+ * a float in the specified or the computed style.
+ * <p> A color percentage value can always be converted to a number and vice
+ * versa.
+ * <p>See also the <a href='http://www.w3.org/TR/2000/REC-DOM-Level-2-Style-20001113'>Document Object Model (DOM) Level 2 Style Specification</a>.
+ * @since DOM Level 2
+ */
+public interface RGBColor {
+ /**
+ * This attribute is used for the red value of the RGB color.
+ */
+ public CSSPrimitiveValue getRed();
+
+ /**
+ * This attribute is used for the green value of the RGB color.
+ */
+ public CSSPrimitiveValue getGreen();
+
+ /**
+ * This attribute is used for the blue value of the RGB color.
+ */
+ public CSSPrimitiveValue getBlue();
+
+}
diff --git a/external/jaxp/source/org/w3c/dom/css/Rect.java b/external/jaxp/source/org/w3c/dom/css/Rect.java
new file mode 100755
index 000000000..f5efb1084
--- /dev/null
+++ b/external/jaxp/source/org/w3c/dom/css/Rect.java
@@ -0,0 +1,44 @@
+/*
+ * Copyright (c) 2000 World Wide Web Consortium,
+ * (Massachusetts Institute of Technology, Institut National de
+ * Recherche en Informatique et en Automatique, Keio University). All
+ * Rights Reserved. This program is distributed under the W3C's Software
+ * Intellectual Property License. This program is distributed in the
+ * hope that it will be useful, but WITHOUT ANY WARRANTY; without even
+ * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+ * PURPOSE.
+ * See W3C License http://www.w3.org/Consortium/Legal/ for more details.
+ */
+
+package org.w3c.dom.css;
+
+/**
+ * The <code>Rect</code> interface is used to represent any rect value. This
+ * interface reflects the values in the underlying style property. Hence,
+ * modifications made to the <code>CSSPrimitiveValue</code> objects modify
+ * the style property.
+ * <p>See also the <a href='http://www.w3.org/TR/2000/REC-DOM-Level-2-Style-20001113'>Document Object Model (DOM) Level 2 Style Specification</a>.
+ * @since DOM Level 2
+ */
+public interface Rect {
+ /**
+ * This attribute is used for the top of the rect.
+ */
+ public CSSPrimitiveValue getTop();
+
+ /**
+ * This attribute is used for the right of the rect.
+ */
+ public CSSPrimitiveValue getRight();
+
+ /**
+ * This attribute is used for the bottom of the rect.
+ */
+ public CSSPrimitiveValue getBottom();
+
+ /**
+ * This attribute is used for the left of the rect.
+ */
+ public CSSPrimitiveValue getLeft();
+
+}
diff --git a/external/jaxp/source/org/w3c/dom/css/ViewCSS.java b/external/jaxp/source/org/w3c/dom/css/ViewCSS.java
new file mode 100755
index 000000000..0f7e88ff9
--- /dev/null
+++ b/external/jaxp/source/org/w3c/dom/css/ViewCSS.java
@@ -0,0 +1,43 @@
+/*
+ * Copyright (c) 2000 World Wide Web Consortium,
+ * (Massachusetts Institute of Technology, Institut National de
+ * Recherche en Informatique et en Automatique, Keio University). All
+ * Rights Reserved. This program is distributed under the W3C's Software
+ * Intellectual Property License. This program is distributed in the
+ * hope that it will be useful, but WITHOUT ANY WARRANTY; without even
+ * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+ * PURPOSE.
+ * See W3C License http://www.w3.org/Consortium/Legal/ for more details.
+ */
+
+package org.w3c.dom.css;
+
+import org.w3c.dom.Element;
+import org.w3c.dom.views.AbstractView;
+
+/**
+ * This interface represents a CSS view. The <code>getComputedStyle</code>
+ * method provides a read only access to the computed values of an element.
+ * <p> The expectation is that an instance of the <code>ViewCSS</code>
+ * interface can be obtained by using binding-specific casting methods on an
+ * instance of the <code>AbstractView</code> interface.
+ * <p> Since a computed style is related to an <code>Element</code> node, if
+ * this element is removed from the document, the associated
+ * <code>CSSStyleDeclaration</code> and <code>CSSValue</code> related to
+ * this declaration are no longer valid.
+ * <p>See also the <a href='http://www.w3.org/TR/2000/REC-DOM-Level-2-Style-20001113'>Document Object Model (DOM) Level 2 Style Specification</a>.
+ * @since DOM Level 2
+ */
+public interface ViewCSS extends AbstractView {
+ /**
+ * This method is used to get the computed style as it is defined in .
+ * @param elt The element whose style is to be computed. This parameter
+ * cannot be null.
+ * @param pseudoElt The pseudo-element or <code>null</code> if none.
+ * @return The computed style. The <code>CSSStyleDeclaration</code> is
+ * read-only and contains only absolute values.
+ */
+ public CSSStyleDeclaration getComputedStyle(Element elt,
+ String pseudoElt);
+
+}
diff --git a/external/jaxp/source/org/w3c/dom/css/package.html b/external/jaxp/source/org/w3c/dom/css/package.html
new file mode 100755
index 000000000..7f4d5a7ea
--- /dev/null
+++ b/external/jaxp/source/org/w3c/dom/css/package.html
@@ -0,0 +1,11 @@
+<html><head>
+<title>yadda yadda</title>
+</head><body>
+
+<p>Supports the optional "CSS" and "CSS2"
+<a href="http://www.w3.org/TR/2000/REC-DOM-Level-2-Style-20001113/"
+>stylesheet</a>
+features of the
+DOM Level 2 Recommendation. </p>
+
+</body></html>
diff --git a/external/jaxp/source/org/w3c/dom/events/DocumentEvent.java b/external/jaxp/source/org/w3c/dom/events/DocumentEvent.java
new file mode 100755
index 000000000..76644bc5a
--- /dev/null
+++ b/external/jaxp/source/org/w3c/dom/events/DocumentEvent.java
@@ -0,0 +1,56 @@
+/*
+ * Copyright (c) 2000 World Wide Web Consortium,
+ * (Massachusetts Institute of Technology, Institut National de
+ * Recherche en Informatique et en Automatique, Keio University). All
+ * Rights Reserved. This program is distributed under the W3C's Software
+ * Intellectual Property License. This program is distributed in the
+ * hope that it will be useful, but WITHOUT ANY WARRANTY; without even
+ * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+ * PURPOSE.
+ * See W3C License http://www.w3.org/Consortium/Legal/ for more details.
+ */
+
+package org.w3c.dom.events;
+
+import org.w3c.dom.DOMException;
+
+/**
+ * The <code>DocumentEvent</code> interface provides a mechanism by which the
+ * user can create an Event of a type supported by the implementation. It is
+ * expected that the <code>DocumentEvent</code> interface will be
+ * implemented on the same object which implements the <code>Document</code>
+ * interface in an implementation which supports the Event model.
+ * <p>See also the <a href='http://www.w3.org/TR/2000/REC-DOM-Level-2-Events-20001113'>Document Object Model (DOM) Level 2 Events Specification</a>.
+ * @since DOM Level 2
+ */
+public interface DocumentEvent {
+ /**
+ *
+ * @param eventType The <code>eventType</code> parameter specifies the
+ * type of <code>Event</code> interface to be created. If the
+ * <code>Event</code> interface specified is supported by the
+ * implementation this method will return a new <code>Event</code> of
+ * the interface type requested. If the <code>Event</code> is to be
+ * dispatched via the <code>dispatchEvent</code> method the
+ * appropriate event init method must be called after creation in
+ * order to initialize the <code>Event</code>'s values. As an example,
+ * a user wishing to synthesize some kind of <code>UIEvent</code>
+ * would call <code>createEvent</code> with the parameter "UIEvents".
+ * The <code>initUIEvent</code> method could then be called on the
+ * newly created <code>UIEvent</code> to set the specific type of
+ * UIEvent to be dispatched and set its context information.The
+ * <code>createEvent</code> method is used in creating
+ * <code>Event</code>s when it is either inconvenient or unnecessary
+ * for the user to create an <code>Event</code> themselves. In cases
+ * where the implementation provided <code>Event</code> is
+ * insufficient, users may supply their own <code>Event</code>
+ * implementations for use with the <code>dispatchEvent</code> method.
+ * @return The newly created <code>Event</code>
+ * @exception DOMException
+ * NOT_SUPPORTED_ERR: Raised if the implementation does not support the
+ * type of <code>Event</code> interface requested
+ */
+ public Event createEvent(String eventType)
+ throws DOMException;
+
+}
diff --git a/external/jaxp/source/org/w3c/dom/events/Event.java b/external/jaxp/source/org/w3c/dom/events/Event.java
new file mode 100755
index 000000000..14a9239ed
--- /dev/null
+++ b/external/jaxp/source/org/w3c/dom/events/Event.java
@@ -0,0 +1,141 @@
+/*
+ * Copyright (c) 2000 World Wide Web Consortium,
+ * (Massachusetts Institute of Technology, Institut National de
+ * Recherche en Informatique et en Automatique, Keio University). All
+ * Rights Reserved. This program is distributed under the W3C's Software
+ * Intellectual Property License. This program is distributed in the
+ * hope that it will be useful, but WITHOUT ANY WARRANTY; without even
+ * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+ * PURPOSE.
+ * See W3C License http://www.w3.org/Consortium/Legal/ for more details.
+ */
+
+package org.w3c.dom.events;
+
+/**
+ * The <code>Event</code> interface is used to provide contextual information
+ * about an event to the handler processing the event. An object which
+ * implements the <code>Event</code> interface is generally passed as the
+ * first parameter to an event handler. More specific context information is
+ * passed to event handlers by deriving additional interfaces from
+ * <code>Event</code> which contain information directly relating to the
+ * type of event they accompany. These derived interfaces are also
+ * implemented by the object passed to the event listener.
+ * <p>See also the <a href='http://www.w3.org/TR/2000/REC-DOM-Level-2-Events-20001113'>Document Object Model (DOM) Level 2 Events Specification</a>.
+ * @since DOM Level 2
+ */
+public interface Event {
+ // PhaseType
+ /**
+ * The current event phase is the capturing phase.
+ */
+ public static final short CAPTURING_PHASE = 1;
+ /**
+ * The event is currently being evaluated at the target
+ * <code>EventTarget</code>.
+ */
+ public static final short AT_TARGET = 2;
+ /**
+ * The current event phase is the bubbling phase.
+ */
+ public static final short BUBBLING_PHASE = 3;
+
+ /**
+ * The name of the event (case-insensitive). The name must be an XML name.
+ */
+ public String getType();
+
+ /**
+ * Used to indicate the <code>EventTarget</code> to which the event was
+ * originally dispatched.
+ */
+ public EventTarget getTarget();
+
+ /**
+ * Used to indicate the <code>EventTarget</code> whose
+ * <code>EventListeners</code> are currently being processed. This is
+ * particularly useful during capturing and bubbling.
+ */
+ public EventTarget getCurrentTarget();
+
+ /**
+ * Used to indicate which phase of event flow is currently being
+ * evaluated.
+ */
+ public short getEventPhase();
+
+ /**
+ * Used to indicate whether or not an event is a bubbling event. If the
+ * event can bubble the value is true, else the value is false.
+ */
+ public boolean getBubbles();
+
+ /**
+ * Used to indicate whether or not an event can have its default action
+ * prevented. If the default action can be prevented the value is true,
+ * else the value is false.
+ */
+ public boolean getCancelable();
+
+ /**
+ * Used to specify the time (in milliseconds relative to the epoch) at
+ * which the event was created. Due to the fact that some systems may
+ * not provide this information the value of <code>timeStamp</code> may
+ * be not available for all events. When not available, a value of 0
+ * will be returned. Examples of epoch time are the time of the system
+ * start or 0:0:0 UTC 1st January 1970.
+ */
+ public long getTimeStamp();
+
+ /**
+ * The <code>stopPropagation</code> method is used prevent further
+ * propagation of an event during event flow. If this method is called
+ * by any <code>EventListener</code> the event will cease propagating
+ * through the tree. The event will complete dispatch to all listeners
+ * on the current <code>EventTarget</code> before event flow stops. This
+ * method may be used during any stage of event flow.
+ */
+ public void stopPropagation();
+
+ /**
+ * If an event is cancelable, the <code>preventDefault</code> method is
+ * used to signify that the event is to be canceled, meaning any default
+ * action normally taken by the implementation as a result of the event
+ * will not occur. If, during any stage of event flow, the
+ * <code>preventDefault</code> method is called the event is canceled.
+ * Any default action associated with the event will not occur. Calling
+ * this method for a non-cancelable event has no effect. Once
+ * <code>preventDefault</code> has been called it will remain in effect
+ * throughout the remainder of the event's propagation. This method may
+ * be used during any stage of event flow.
+ */
+ public void preventDefault();
+
+ /**
+ * The <code>initEvent</code> method is used to initialize the value of an
+ * <code>Event</code> created through the <code>DocumentEvent</code>
+ * interface. This method may only be called before the
+ * <code>Event</code> has been dispatched via the
+ * <code>dispatchEvent</code> method, though it may be called multiple
+ * times during that phase if necessary. If called multiple times the
+ * final invocation takes precedence. If called from a subclass of
+ * <code>Event</code> interface only the values specified in the
+ * <code>initEvent</code> method are modified, all other attributes are
+ * left unchanged.
+ * @param eventTypeArg Specifies the event type. This type may be any
+ * event type currently defined in this specification or a new event
+ * type.. The string must be an XML name. Any new event type must not
+ * begin with any upper, lower, or mixed case version of the string
+ * "DOM". This prefix is reserved for future DOM event sets. It is
+ * also strongly recommended that third parties adding their own
+ * events use their own prefix to avoid confusion and lessen the
+ * probability of conflicts with other new events.
+ * @param canBubbleArg Specifies whether or not the event can bubble.
+ * @param cancelableArg Specifies whether or not the event's default
+ * action can be prevented.
+ */
+ public void initEvent(String eventTypeArg,
+ boolean canBubbleArg,
+ boolean cancelableArg);
+
+}
diff --git a/external/jaxp/source/org/w3c/dom/events/EventException.java b/external/jaxp/source/org/w3c/dom/events/EventException.java
new file mode 100755
index 000000000..7a6ff2620
--- /dev/null
+++ b/external/jaxp/source/org/w3c/dom/events/EventException.java
@@ -0,0 +1,36 @@
+/*
+ * Copyright (c) 2000 World Wide Web Consortium,
+ * (Massachusetts Institute of Technology, Institut National de
+ * Recherche en Informatique et en Automatique, Keio University). All
+ * Rights Reserved. This program is distributed under the W3C's Software
+ * Intellectual Property License. This program is distributed in the
+ * hope that it will be useful, but WITHOUT ANY WARRANTY; without even
+ * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+ * PURPOSE.
+ * See W3C License http://www.w3.org/Consortium/Legal/ for more details.
+ */
+
+package org.w3c.dom.events;
+
+/**
+ * Event operations may throw an <code>EventException</code> as specified in
+ * their method descriptions.
+ * <p>See also the <a href='http://www.w3.org/TR/2000/REC-DOM-Level-2-Events-20001113'>Document Object Model (DOM) Level 2 Events Specification</a>.
+ * @since DOM Level 2
+ */
+public class EventException extends RuntimeException {
+ public EventException(short code, String message) {
+ super(message);
+ this.code = code;
+ }
+ public short code;
+ // EventExceptionCode
+ /**
+ * If the <code>Event</code>'s type was not specified by initializing the
+ * event before the method was called. Specification of the Event's type
+ * as <code>null</code> or an empty string will also trigger this
+ * exception.
+ */
+ public static final short UNSPECIFIED_EVENT_TYPE_ERR = 0;
+
+}
diff --git a/external/jaxp/source/org/w3c/dom/events/EventListener.java b/external/jaxp/source/org/w3c/dom/events/EventListener.java
new file mode 100755
index 000000000..1df80202c
--- /dev/null
+++ b/external/jaxp/source/org/w3c/dom/events/EventListener.java
@@ -0,0 +1,41 @@
+/*
+ * Copyright (c) 2000 World Wide Web Consortium,
+ * (Massachusetts Institute of Technology, Institut National de
+ * Recherche en Informatique et en Automatique, Keio University). All
+ * Rights Reserved. This program is distributed under the W3C's Software
+ * Intellectual Property License. This program is distributed in the
+ * hope that it will be useful, but WITHOUT ANY WARRANTY; without even
+ * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+ * PURPOSE.
+ * See W3C License http://www.w3.org/Consortium/Legal/ for more details.
+ */
+
+package org.w3c.dom.events;
+
+/**
+ * The <code>EventListener</code> interface is the primary method for
+ * handling events. Users implement the <code>EventListener</code> interface
+ * and register their listener on an <code>EventTarget</code> using the
+ * <code>AddEventListener</code> method. The users should also remove their
+ * <code>EventListener</code> from its <code>EventTarget</code> after they
+ * have completed using the listener.
+ * <p> When a <code>Node</code> is copied using the <code>cloneNode</code>
+ * method the <code>EventListener</code>s attached to the source
+ * <code>Node</code> are not attached to the copied <code>Node</code>. If
+ * the user wishes the same <code>EventListener</code>s to be added to the
+ * newly created copy the user must add them manually.
+ * <p>See also the <a href='http://www.w3.org/TR/2000/REC-DOM-Level-2-Events-20001113'>Document Object Model (DOM) Level 2 Events Specification</a>.
+ * @since DOM Level 2
+ */
+public interface EventListener {
+ /**
+ * This method is called whenever an event occurs of the type for which
+ * the <code> EventListener</code> interface was registered.
+ * @param evt The <code>Event</code> contains contextual information
+ * about the event. It also contains the <code>stopPropagation</code>
+ * and <code>preventDefault</code> methods which are used in
+ * determining the event's flow and default action.
+ */
+ public void handleEvent(Event evt);
+
+}
diff --git a/external/jaxp/source/org/w3c/dom/events/EventTarget.java b/external/jaxp/source/org/w3c/dom/events/EventTarget.java
new file mode 100755
index 000000000..f07663660
--- /dev/null
+++ b/external/jaxp/source/org/w3c/dom/events/EventTarget.java
@@ -0,0 +1,102 @@
+/*
+ * Copyright (c) 2000 World Wide Web Consortium,
+ * (Massachusetts Institute of Technology, Institut National de
+ * Recherche en Informatique et en Automatique, Keio University). All
+ * Rights Reserved. This program is distributed under the W3C's Software
+ * Intellectual Property License. This program is distributed in the
+ * hope that it will be useful, but WITHOUT ANY WARRANTY; without even
+ * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+ * PURPOSE.
+ * See W3C License http://www.w3.org/Consortium/Legal/ for more details.
+ */
+
+package org.w3c.dom.events;
+
+/**
+ * The <code>EventTarget</code> interface is implemented by all
+ * <code>Nodes</code> in an implementation which supports the DOM Event
+ * Model. Therefore, this interface can be obtained by using
+ * binding-specific casting methods on an instance of the <code>Node</code>
+ * interface. The interface allows registration and removal of
+ * <code>EventListeners</code> on an <code>EventTarget</code> and dispatch
+ * of events to that <code>EventTarget</code>.
+ * <p>See also the <a href='http://www.w3.org/TR/2000/REC-DOM-Level-2-Events-20001113'>Document Object Model (DOM) Level 2 Events Specification</a>.
+ * @since DOM Level 2
+ */
+public interface EventTarget {
+ /**
+ * This method allows the registration of event listeners on the event
+ * target. If an <code>EventListener</code> is added to an
+ * <code>EventTarget</code> while it is processing an event, it will not
+ * be triggered by the current actions but may be triggered during a
+ * later stage of event flow, such as the bubbling phase.
+ * <br> If multiple identical <code>EventListener</code>s are registered
+ * on the same <code>EventTarget</code> with the same parameters the
+ * duplicate instances are discarded. They do not cause the
+ * <code>EventListener</code> to be called twice and since they are
+ * discarded they do not need to be removed with the
+ * <code>removeEventListener</code> method.
+ * @param type The event type for which the user is registering
+ * @param listener The <code>listener</code> parameter takes an interface
+ * implemented by the user which contains the methods to be called
+ * when the event occurs.
+ * @param useCapture If true, <code>useCapture</code> indicates that the
+ * user wishes to initiate capture. After initiating capture, all
+ * events of the specified type will be dispatched to the registered
+ * <code>EventListener</code> before being dispatched to any
+ * <code>EventTargets</code> beneath them in the tree. Events which
+ * are bubbling upward through the tree will not trigger an
+ * <code>EventListener</code> designated to use capture.
+ */
+ public void addEventListener(String type,
+ EventListener listener,
+ boolean useCapture);
+
+ /**
+ * This method allows the removal of event listeners from the event
+ * target. If an <code>EventListener</code> is removed from an
+ * <code>EventTarget</code> while it is processing an event, it will not
+ * be triggered by the current actions. <code>EventListener</code>s can
+ * never be invoked after being removed.
+ * <br>Calling <code>removeEventListener</code> with arguments which do
+ * not identify any currently registered <code>EventListener</code> on
+ * the <code>EventTarget</code> has no effect.
+ * @param type Specifies the event type of the <code>EventListener</code>
+ * being removed.
+ * @param listener The <code>EventListener</code> parameter indicates the
+ * <code>EventListener </code> to be removed.
+ * @param useCapture Specifies whether the <code>EventListener</code>
+ * being removed was registered as a capturing listener or not. If a
+ * listener was registered twice, one with capture and one without,
+ * each must be removed separately. Removal of a capturing listener
+ * does not affect a non-capturing version of the same listener, and
+ * vice versa.
+ */
+ public void removeEventListener(String type,
+ EventListener listener,
+ boolean useCapture);
+
+ /**
+ * This method allows the dispatch of events into the implementations
+ * event model. Events dispatched in this manner will have the same
+ * capturing and bubbling behavior as events dispatched directly by the
+ * implementation. The target of the event is the
+ * <code> EventTarget</code> on which <code>dispatchEvent</code> is
+ * called.
+ * @param evt Specifies the event type, behavior, and contextual
+ * information to be used in processing the event.
+ * @return The return value of <code>dispatchEvent</code> indicates
+ * whether any of the listeners which handled the event called
+ * <code>preventDefault</code>. If <code>preventDefault</code> was
+ * called the value is false, else the value is true.
+ * @exception EventException
+ * UNSPECIFIED_EVENT_TYPE_ERR: Raised if the <code>Event</code>'s type
+ * was not specified by initializing the event before
+ * <code>dispatchEvent</code> was called. Specification of the
+ * <code>Event</code>'s type as <code>null</code> or an empty string
+ * will also trigger this exception.
+ */
+ public boolean dispatchEvent(Event evt)
+ throws EventException;
+
+}
diff --git a/external/jaxp/source/org/w3c/dom/events/MouseEvent.java b/external/jaxp/source/org/w3c/dom/events/MouseEvent.java
new file mode 100755
index 000000000..be780357a
--- /dev/null
+++ b/external/jaxp/source/org/w3c/dom/events/MouseEvent.java
@@ -0,0 +1,156 @@
+/*
+ * Copyright (c) 2000 World Wide Web Consortium,
+ * (Massachusetts Institute of Technology, Institut National de
+ * Recherche en Informatique et en Automatique, Keio University). All
+ * Rights Reserved. This program is distributed under the W3C's Software
+ * Intellectual Property License. This program is distributed in the
+ * hope that it will be useful, but WITHOUT ANY WARRANTY; without even
+ * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+ * PURPOSE.
+ * See W3C License http://www.w3.org/Consortium/Legal/ for more details.
+ */
+
+package org.w3c.dom.events;
+
+import org.w3c.dom.views.AbstractView;
+
+/**
+ * The <code>MouseEvent</code> interface provides specific contextual
+ * information associated with Mouse events.
+ * <p>The <code>detail</code> attribute inherited from <code>UIEvent</code>
+ * indicates the number of times a mouse button has been pressed and
+ * released over the same screen location during a user action. The
+ * attribute value is 1 when the user begins this action and increments by 1
+ * for each full sequence of pressing and releasing. If the user moves the
+ * mouse between the mousedown and mouseup the value will be set to 0,
+ * indicating that no click is occurring.
+ * <p>In the case of nested elements mouse events are always targeted at the
+ * most deeply nested element. Ancestors of the targeted element may use
+ * bubbling to obtain notification of mouse events which occur within its
+ * descendent elements.
+ * <p>See also the <a href='http://www.w3.org/TR/2000/REC-DOM-Level-2-Events-20001113'>Document Object Model (DOM) Level 2 Events Specification</a>.
+ * @since DOM Level 2
+ */
+public interface MouseEvent extends UIEvent {
+ /**
+ * The horizontal coordinate at which the event occurred relative to the
+ * origin of the screen coordinate system.
+ */
+ public int getScreenX();
+
+ /**
+ * The vertical coordinate at which the event occurred relative to the
+ * origin of the screen coordinate system.
+ */
+ public int getScreenY();
+
+ /**
+ * The horizontal coordinate at which the event occurred relative to the
+ * DOM implementation's client area.
+ */
+ public int getClientX();
+
+ /**
+ * The vertical coordinate at which the event occurred relative to the DOM
+ * implementation's client area.
+ */
+ public int getClientY();
+
+ /**
+ * Used to indicate whether the 'ctrl' key was depressed during the firing
+ * of the event.
+ */
+ public boolean getCtrlKey();
+
+ /**
+ * Used to indicate whether the 'shift' key was depressed during the
+ * firing of the event.
+ */
+ public boolean getShiftKey();
+
+ /**
+ * Used to indicate whether the 'alt' key was depressed during the firing
+ * of the event. On some platforms this key may map to an alternative
+ * key name.
+ */
+ public boolean getAltKey();
+
+ /**
+ * Used to indicate whether the 'meta' key was depressed during the firing
+ * of the event. On some platforms this key may map to an alternative
+ * key name.
+ */
+ public boolean getMetaKey();
+
+ /**
+ * During mouse events caused by the depression or release of a mouse
+ * button, <code>button</code> is used to indicate which mouse button
+ * changed state. The values for <code>button</code> range from zero to
+ * indicate the left button of the mouse, one to indicate the middle
+ * button if present, and two to indicate the right button. For mice
+ * configured for left handed use in which the button actions are
+ * reversed the values are instead read from right to left.
+ */
+ public short getButton();
+
+ /**
+ * Used to identify a secondary <code>EventTarget</code> related to a UI
+ * event. Currently this attribute is used with the mouseover event to
+ * indicate the <code>EventTarget</code> which the pointing device
+ * exited and with the mouseout event to indicate the
+ * <code>EventTarget</code> which the pointing device entered.
+ */
+ public EventTarget getRelatedTarget();
+
+ /**
+ * The <code>initMouseEvent</code> method is used to initialize the value
+ * of a <code>MouseEvent</code> created through the
+ * <code>DocumentEvent</code> interface. This method may only be called
+ * before the <code>MouseEvent</code> has been dispatched via the
+ * <code>dispatchEvent</code> method, though it may be called multiple
+ * times during that phase if necessary. If called multiple times, the
+ * final invocation takes precedence.
+ * @param typeArg Specifies the event type.
+ * @param canBubbleArg Specifies whether or not the event can bubble.
+ * @param cancelableArg Specifies whether or not the event's default
+ * action can be prevented.
+ * @param viewArg Specifies the <code>Event</code>'s
+ * <code>AbstractView</code>.
+ * @param detailArg Specifies the <code>Event</code>'s mouse click count.
+ * @param screenXArg Specifies the <code>Event</code>'s screen x
+ * coordinate
+ * @param screenYArg Specifies the <code>Event</code>'s screen y
+ * coordinate
+ * @param clientXArg Specifies the <code>Event</code>'s client x
+ * coordinate
+ * @param clientYArg Specifies the <code>Event</code>'s client y
+ * coordinate
+ * @param ctrlKeyArg Specifies whether or not control key was depressed
+ * during the <code>Event</code>.
+ * @param altKeyArg Specifies whether or not alt key was depressed during
+ * the <code>Event</code>.
+ * @param shiftKeyArg Specifies whether or not shift key was depressed
+ * during the <code>Event</code>.
+ * @param metaKeyArg Specifies whether or not meta key was depressed
+ * during the <code>Event</code>.
+ * @param buttonArg Specifies the <code>Event</code>'s mouse button.
+ * @param relatedTargetArg Specifies the <code>Event</code>'s related
+ * <code>EventTarget</code>.
+ */
+ public void initMouseEvent(String typeArg,
+ boolean canBubbleArg,
+ boolean cancelableArg,
+ AbstractView viewArg,
+ int detailArg,
+ int screenXArg,
+ int screenYArg,
+ int clientXArg,
+ int clientYArg,
+ boolean ctrlKeyArg,
+ boolean altKeyArg,
+ boolean shiftKeyArg,
+ boolean metaKeyArg,
+ short buttonArg,
+ EventTarget relatedTargetArg);
+
+}
diff --git a/external/jaxp/source/org/w3c/dom/events/MutationEvent.java b/external/jaxp/source/org/w3c/dom/events/MutationEvent.java
new file mode 100755
index 000000000..351f77b3b
--- /dev/null
+++ b/external/jaxp/source/org/w3c/dom/events/MutationEvent.java
@@ -0,0 +1,108 @@
+/*
+ * Copyright (c) 2000 World Wide Web Consortium,
+ * (Massachusetts Institute of Technology, Institut National de
+ * Recherche en Informatique et en Automatique, Keio University). All
+ * Rights Reserved. This program is distributed under the W3C's Software
+ * Intellectual Property License. This program is distributed in the
+ * hope that it will be useful, but WITHOUT ANY WARRANTY; without even
+ * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+ * PURPOSE.
+ * See W3C License http://www.w3.org/Consortium/Legal/ for more details.
+ */
+
+package org.w3c.dom.events;
+
+import org.w3c.dom.Node;
+
+/**
+ * The <code>MutationEvent</code> interface provides specific contextual
+ * information associated with Mutation events.
+ * <p>See also the <a href='http://www.w3.org/TR/2000/REC-DOM-Level-2-Events-20001113'>Document Object Model (DOM) Level 2 Events Specification</a>.
+ * @since DOM Level 2
+ */
+public interface MutationEvent extends Event {
+ // attrChangeType
+ /**
+ * The <code>Attr</code> was modified in place.
+ */
+ public static final short MODIFICATION = 1;
+ /**
+ * The <code>Attr</code> was just added.
+ */
+ public static final short ADDITION = 2;
+ /**
+ * The <code>Attr</code> was just removed.
+ */
+ public static final short REMOVAL = 3;
+
+ /**
+ * <code>relatedNode</code> is used to identify a secondary node related
+ * to a mutation event. For example, if a mutation event is dispatched
+ * to a node indicating that its parent has changed, the
+ * <code>relatedNode</code> is the changed parent. If an event is
+ * instead dispatched to a subtree indicating a node was changed within
+ * it, the <code>relatedNode</code> is the changed node. In the case of
+ * the DOMAttrModified event it indicates the <code>Attr</code> node
+ * which was modified, added, or removed.
+ */
+ public Node getRelatedNode();
+
+ /**
+ * <code>prevValue</code> indicates the previous value of the
+ * <code>Attr</code> node in DOMAttrModified events, and of the
+ * <code>CharacterData</code> node in DOMCharDataModified events.
+ */
+ public String getPrevValue();
+
+ /**
+ * <code>newValue</code> indicates the new value of the <code>Attr</code>
+ * node in DOMAttrModified events, and of the <code>CharacterData</code>
+ * node in DOMCharDataModified events.
+ */
+ public String getNewValue();
+
+ /**
+ * <code>attrName</code> indicates the name of the changed
+ * <code>Attr</code> node in a DOMAttrModified event.
+ */
+ public String getAttrName();
+
+ /**
+ * <code>attrChange</code> indicates the type of change which triggered
+ * the DOMAttrModified event. The values can be <code>MODIFICATION</code>
+ * , <code>ADDITION</code>, or <code>REMOVAL</code>.
+ */
+ public short getAttrChange();
+
+ /**
+ * The <code>initMutationEvent</code> method is used to initialize the
+ * value of a <code>MutationEvent</code> created through the
+ * <code>DocumentEvent</code> interface. This method may only be called
+ * before the <code>MutationEvent</code> has been dispatched via the
+ * <code>dispatchEvent</code> method, though it may be called multiple
+ * times during that phase if necessary. If called multiple times, the
+ * final invocation takes precedence.
+ * @param typeArg Specifies the event type.
+ * @param canBubbleArg Specifies whether or not the event can bubble.
+ * @param cancelableArg Specifies whether or not the event's default
+ * action can be prevented.
+ * @param relatedNodeArg Specifies the <code>Event</code>'s related Node.
+ * @param prevValueArg Specifies the <code>Event</code>'s
+ * <code>prevValue</code> attribute. This value may be null.
+ * @param newValueArg Specifies the <code>Event</code>'s
+ * <code>newValue</code> attribute. This value may be null.
+ * @param attrNameArg Specifies the <code>Event</code>'s
+ * <code>attrName</code> attribute. This value may be null.
+ * @param attrChangeArg Specifies the <code>Event</code>'s
+ * <code>attrChange</code> attribute
+ */
+ public void initMutationEvent(String typeArg,
+ boolean canBubbleArg,
+ boolean cancelableArg,
+ Node relatedNodeArg,
+ String prevValueArg,
+ String newValueArg,
+ String attrNameArg,
+ short attrChangeArg);
+
+}
diff --git a/external/jaxp/source/org/w3c/dom/events/UIEvent.java b/external/jaxp/source/org/w3c/dom/events/UIEvent.java
new file mode 100755
index 000000000..15affe879
--- /dev/null
+++ b/external/jaxp/source/org/w3c/dom/events/UIEvent.java
@@ -0,0 +1,58 @@
+/*
+ * Copyright (c) 2000 World Wide Web Consortium,
+ * (Massachusetts Institute of Technology, Institut National de
+ * Recherche en Informatique et en Automatique, Keio University). All
+ * Rights Reserved. This program is distributed under the W3C's Software
+ * Intellectual Property License. This program is distributed in the
+ * hope that it will be useful, but WITHOUT ANY WARRANTY; without even
+ * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+ * PURPOSE.
+ * See W3C License http://www.w3.org/Consortium/Legal/ for more details.
+ */
+
+package org.w3c.dom.events;
+
+import org.w3c.dom.views.AbstractView;
+
+/**
+ * The <code>UIEvent</code> interface provides specific contextual information
+ * associated with User Interface events.
+ * <p>See also the <a href='http://www.w3.org/TR/2000/REC-DOM-Level-2-Events-20001113'>Document Object Model (DOM) Level 2 Events Specification</a>.
+ * @since DOM Level 2
+ */
+public interface UIEvent extends Event {
+ /**
+ * The <code>view</code> attribute identifies the <code>AbstractView</code>
+ * from which the event was generated.
+ */
+ public AbstractView getView();
+
+ /**
+ * Specifies some detail information about the <code>Event</code>,
+ * depending on the type of event.
+ */
+ public int getDetail();
+
+ /**
+ * The <code>initUIEvent</code> method is used to initialize the value of
+ * a <code>UIEvent</code> created through the <code>DocumentEvent</code>
+ * interface. This method may only be called before the
+ * <code>UIEvent</code> has been dispatched via the
+ * <code>dispatchEvent</code> method, though it may be called multiple
+ * times during that phase if necessary. If called multiple times, the
+ * final invocation takes precedence.
+ * @param typeArg Specifies the event type.
+ * @param canBubbleArg Specifies whether or not the event can bubble.
+ * @param cancelableArg Specifies whether or not the event's default
+ * action can be prevented.
+ * @param viewArg Specifies the <code>Event</code>'s
+ * <code>AbstractView</code>.
+ * @param detailArg Specifies the <code>Event</code>'s detail.
+ */
+ public void initUIEvent(String typeArg,
+ boolean canBubbleArg,
+ boolean cancelableArg,
+ AbstractView viewArg,
+ int detailArg);
+
+}
diff --git a/external/jaxp/source/org/w3c/dom/events/package.html b/external/jaxp/source/org/w3c/dom/events/package.html
new file mode 100755
index 000000000..7131ce96e
--- /dev/null
+++ b/external/jaxp/source/org/w3c/dom/events/package.html
@@ -0,0 +1,18 @@
+<html><head>
+<title>yadda yadda</title>
+</head><body>
+
+<p>Supports the optional
+<a href="http://www.w3.org/TR/2000/REC-DOM-Level-2-Events-20001113/"
+>"Events"</a>, "UIEvents", "MouseEvents",
+"MutationEvents", and "HTMLEvents" features of the
+DOM Level 2 Recommendation. </p>
+
+<p> Note that apart from the basic "Events" infrastructure and
+the "MutationEvents", all other events currently defined in the
+DOM specification imply having some user interface that issues
+various events to the DOM. Also, to fully
+support the "UIEvents" and its child event set "MouseEvents",
+the DOM implementation must also support the "Views" feature. </p>
+
+</body></html>
diff --git a/external/jaxp/source/org/w3c/dom/html/HTMLAnchorElement.java b/external/jaxp/source/org/w3c/dom/html/HTMLAnchorElement.java
new file mode 100755
index 000000000..b086cb7f1
--- /dev/null
+++ b/external/jaxp/source/org/w3c/dom/html/HTMLAnchorElement.java
@@ -0,0 +1,112 @@
+/*
+ * Copyright (c) 2000 World Wide Web Consortium,
+ * (Massachusetts Institute of Technology, Institut National de
+ * Recherche en Informatique et en Automatique, Keio University). All
+ * Rights Reserved. This program is distributed under the W3C's Software
+ * Intellectual Property License. This program is distributed in the
+ * hope that it will be useful, but WITHOUT ANY WARRANTY; without even
+ * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+ * PURPOSE. See W3C License http://www.w3.org/Consortium/Legal/ for more
+ * details.
+ */
+
+package org.w3c.dom.html;
+
+/**
+ * The anchor element. See the A element definition in HTML 4.0.
+ * <p>See also the <a href='http://www.w3.org/TR/2000/CR-DOM-Level-2-20000510'>Document Object Model (DOM) Level 2 Specification</a>.
+ */
+public interface HTMLAnchorElement extends HTMLElement {
+ /**
+ * A single character access key to give access to the form control. See
+ * the accesskey attribute definition in HTML 4.0.
+ */
+ public String getAccessKey();
+ public void setAccessKey(String accessKey);
+
+ /**
+ * The character encoding of the linked resource. See the charset
+ * attribute definition in HTML 4.0.
+ */
+ public String getCharset();
+ public void setCharset(String charset);
+
+ /**
+ * Comma-separated list of lengths, defining an active region geometry.
+ * See also <code>shape</code> for the shape of the region. See the
+ * coords attribute definition in HTML 4.0.
+ */
+ public String getCoords();
+ public void setCoords(String coords);
+
+ /**
+ * The URI of the linked resource. See the href attribute definition in
+ * HTML 4.0.
+ */
+ public String getHref();
+ public void setHref(String href);
+
+ /**
+ * Language code of the linked resource. See the hreflang attribute
+ * definition in HTML 4.0.
+ */
+ public String getHreflang();
+ public void setHreflang(String hreflang);
+
+ /**
+ * Anchor name. See the name attribute definition in HTML 4.0.
+ */
+ public String getName();
+ public void setName(String name);
+
+ /**
+ * Forward link type. See the rel attribute definition in HTML 4.0.
+ */
+ public String getRel();
+ public void setRel(String rel);
+
+ /**
+ * Reverse link type. See the rev attribute definition in HTML 4.0.
+ */
+ public String getRev();
+ public void setRev(String rev);
+
+ /**
+ * The shape of the active area. The coordinates are given by
+ * <code>coords</code> . See the shape attribute definition in HTML 4.0.
+ */
+ public String getShape();
+ public void setShape(String shape);
+
+ /**
+ * Index that represents the element's position in the tabbing order. See
+ * the tabindex attribute definition in HTML 4.0.
+ */
+ public int getTabIndex();
+ public void setTabIndex(int tabIndex);
+
+ /**
+ * Frame to render the resource in. See the target attribute definition
+ * in HTML 4.0.
+ */
+ public String getTarget();
+ public void setTarget(String target);
+
+ /**
+ * Advisory content type. See the type attribute definition in HTML 4.0.
+ */
+ public String getType();
+ public void setType(String type);
+
+ /**
+ * Removes keyboard focus from this element.
+ */
+ public void blur();
+
+ /**
+ * Gives keyboard focus to this element.
+ */
+ public void focus();
+
+}
+
diff --git a/external/jaxp/source/org/w3c/dom/html/HTMLAppletElement.java b/external/jaxp/source/org/w3c/dom/html/HTMLAppletElement.java
new file mode 100755
index 000000000..2e32bd6b9
--- /dev/null
+++ b/external/jaxp/source/org/w3c/dom/html/HTMLAppletElement.java
@@ -0,0 +1,103 @@
+/*
+ * Copyright (c) 2000 World Wide Web Consortium,
+ * (Massachusetts Institute of Technology, Institut National de
+ * Recherche en Informatique et en Automatique, Keio University). All
+ * Rights Reserved. This program is distributed under the W3C's Software
+ * Intellectual Property License. This program is distributed in the
+ * hope that it will be useful, but WITHOUT ANY WARRANTY; without even
+ * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+ * PURPOSE. See W3C License http://www.w3.org/Consortium/Legal/ for more
+ * details.
+ */
+
+package org.w3c.dom.html;
+
+/**
+ * An embedded Java applet. See the APPLET element definition in HTML 4.0.
+ * This element is deprecated in HTML 4.0.
+ * <p>See also the <a href='http://www.w3.org/TR/2000/CR-DOM-Level-2-20000510'>Document Object Model (DOM) Level 2 Specification</a>.
+ */
+public interface HTMLAppletElement extends HTMLElement {
+ /**
+ * Aligns this object (vertically or horizontally) with respect to its
+ * surrounding text. See the align attribute definition in HTML 4.0.
+ * This attribute is deprecated in HTML 4.0.
+ */
+ public String getAlign();
+ public void setAlign(String align);
+
+ /**
+ * Alternate text for user agents not rendering the normal content of
+ * this element. See the alt attribute definition in HTML 4.0. This
+ * attribute is deprecated in HTML 4.0.
+ */
+ public String getAlt();
+ public void setAlt(String alt);
+
+ /**
+ * Comma-separated archive list. See the archive attribute definition in
+ * HTML 4.0. This attribute is deprecated in HTML 4.0.
+ */
+ public String getArchive();
+ public void setArchive(String archive);
+
+ /**
+ * Applet class file. See the code attribute definition in HTML 4.0.
+ * This attribute is deprecated in HTML 4.0.
+ */
+ public String getCode();
+ public void setCode(String code);
+
+ /**
+ * Optional base URI for applet. See the codebase attribute definition
+ * in HTML 4.0. This attribute is deprecated in HTML 4.0.
+ */
+ public String getCodeBase();
+ public void setCodeBase(String codeBase);
+
+ /**
+ * Override height. See the height attribute definition in HTML 4.0.
+ * This attribute is deprecated in HTML 4.0.
+ */
+ public String getHeight();
+ public void setHeight(String height);
+
+ /**
+ * Horizontal space to the left and right of this image, applet, or
+ * object. See the hspace attribute definition in HTML 4.0. This
+ * attribute is deprecated in HTML 4.0.
+ */
+ public String getHspace();
+ public void setHspace(String hspace);
+
+ /**
+ * The name of the applet. See the name attribute definition in HTML
+ * 4.0. This attribute is deprecated in HTML 4.0.
+ */
+ public String getName();
+ public void setName(String name);
+
+ /**
+ * Serialized applet file. See the object attribute definition in HTML
+ * 4.0. This attribute is deprecated in HTML 4.0.
+ */
+ public String getObject();
+ public void setObject(String object);
+
+ /**
+ * Vertical space above and below this image, applet, or object. See the
+ * vspace attribute definition in HTML 4.0. This attribute is deprecated
+ * in HTML 4.0.
+ */
+ public String getVspace();
+ public void setVspace(String vspace);
+
+ /**
+ * Override width. See the width attribute definition in HTML 4.0. This
+ * attribute is deprecated in HTML 4.0.
+ */
+ public String getWidth();
+ public void setWidth(String width);
+
+}
+
diff --git a/external/jaxp/source/org/w3c/dom/html/HTMLAreaElement.java b/external/jaxp/source/org/w3c/dom/html/HTMLAreaElement.java
new file mode 100755
index 000000000..bbb244825
--- /dev/null
+++ b/external/jaxp/source/org/w3c/dom/html/HTMLAreaElement.java
@@ -0,0 +1,79 @@
+/*
+ * Copyright (c) 2000 World Wide Web Consortium,
+ * (Massachusetts Institute of Technology, Institut National de
+ * Recherche en Informatique et en Automatique, Keio University). All
+ * Rights Reserved. This program is distributed under the W3C's Software
+ * Intellectual Property License. This program is distributed in the
+ * hope that it will be useful, but WITHOUT ANY WARRANTY; without even
+ * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+ * PURPOSE. See W3C License http://www.w3.org/Consortium/Legal/ for more
+ * details.
+ */
+
+package org.w3c.dom.html;
+
+/**
+ * Client-side image map area definition. See the AREA element definition in
+ * HTML 4.0.
+ * <p>See also the <a href='http://www.w3.org/TR/2000/CR-DOM-Level-2-20000510'>Document Object Model (DOM) Level 2 Specification</a>.
+ */
+public interface HTMLAreaElement extends HTMLElement {
+ /**
+ * A single character access key to give access to the form control. See
+ * the accesskey attribute definition in HTML 4.0.
+ */
+ public String getAccessKey();
+ public void setAccessKey(String accessKey);
+
+ /**
+ * Alternate text for user agents not rendering the normal content of
+ * this element. See the alt attribute definition in HTML 4.0.
+ */
+ public String getAlt();
+ public void setAlt(String alt);
+
+ /**
+ * Comma-separated list of lengths, defining an active region geometry.
+ * See also <code>shape</code> for the shape of the region. See the
+ * coords attribute definition in HTML 4.0.
+ */
+ public String getCoords();
+ public void setCoords(String coords);
+
+ /**
+ * The URI of the linked resource. See the href attribute definition in
+ * HTML 4.0.
+ */
+ public String getHref();
+ public void setHref(String href);
+
+ /**
+ * Specifies that this area is inactive, i.e., has no associated action.
+ * See the nohref attribute definition in HTML 4.0.
+ */
+ public boolean getNoHref();
+ public void setNoHref(boolean noHref);
+
+ /**
+ * The shape of the active area. The coordinates are given by
+ * <code>coords</code> . See the shape attribute definition in HTML 4.0.
+ */
+ public String getShape();
+ public void setShape(String shape);
+
+ /**
+ * Index that represents the element's position in the tabbing order. See
+ * the tabindex attribute definition in HTML 4.0.
+ */
+ public int getTabIndex();
+ public void setTabIndex(int tabIndex);
+
+ /**
+ * Frame to render the resource in. See the target attribute definition
+ * in HTML 4.0.
+ */
+ public String getTarget();
+ public void setTarget(String target);
+
+}
+
diff --git a/external/jaxp/source/org/w3c/dom/html/HTMLBRElement.java b/external/jaxp/source/org/w3c/dom/html/HTMLBRElement.java
new file mode 100755
index 000000000..12eba4e69
--- /dev/null
+++ b/external/jaxp/source/org/w3c/dom/html/HTMLBRElement.java
@@ -0,0 +1,28 @@
+/*
+ * Copyright (c) 2000 World Wide Web Consortium,
+ * (Massachusetts Institute of Technology, Institut National de
+ * Recherche en Informatique et en Automatique, Keio University). All
+ * Rights Reserved. This program is distributed under the W3C's Software
+ * Intellectual Property License. This program is distributed in the
+ * hope that it will be useful, but WITHOUT ANY WARRANTY; without even
+ * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+ * PURPOSE. See W3C License http://www.w3.org/Consortium/Legal/ for more
+ * details.
+ */
+
+package org.w3c.dom.html;
+
+/**
+ * Force a line break. See the BR element definition in HTML 4.0.
+ * <p>See also the <a href='http://www.w3.org/TR/2000/CR-DOM-Level-2-20000510'>Document Object Model (DOM) Level 2 Specification</a>.
+ */
+public interface HTMLBRElement extends HTMLElement {
+ /**
+ * Control flow of text around floats. See the clear attribute definition
+ * in HTML 4.0. This attribute is deprecated in HTML 4.0.
+ */
+ public String getClear();
+ public void setClear(String clear);
+
+}
+
diff --git a/external/jaxp/source/org/w3c/dom/html/HTMLBaseElement.java b/external/jaxp/source/org/w3c/dom/html/HTMLBaseElement.java
new file mode 100755
index 000000000..c976632e1
--- /dev/null
+++ b/external/jaxp/source/org/w3c/dom/html/HTMLBaseElement.java
@@ -0,0 +1,34 @@
+/*
+ * Copyright (c) 2000 World Wide Web Consortium,
+ * (Massachusetts Institute of Technology, Institut National de
+ * Recherche en Informatique et en Automatique, Keio University). All
+ * Rights Reserved. This program is distributed under the W3C's Software
+ * Intellectual Property License. This program is distributed in the
+ * hope that it will be useful, but WITHOUT ANY WARRANTY; without even
+ * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+ * PURPOSE. See W3C License http://www.w3.org/Consortium/Legal/ for more
+ * details.
+ */
+
+package org.w3c.dom.html;
+
+/**
+ * Document base URI. See the BASE element definition in HTML 4.0.
+ * <p>See also the <a href='http://www.w3.org/TR/2000/CR-DOM-Level-2-20000510'>Document Object Model (DOM) Level 2 Specification</a>.
+ */
+public interface HTMLBaseElement extends HTMLElement {
+ /**
+ * The base URI. See the href attribute definition in HTML 4.0.
+ */
+ public String getHref();
+ public void setHref(String href);
+
+ /**
+ * The default target frame. See the target attribute definition in HTML
+ * 4.0.
+ */
+ public String getTarget();
+ public void setTarget(String target);
+
+}
+
diff --git a/external/jaxp/source/org/w3c/dom/html/HTMLBaseFontElement.java b/external/jaxp/source/org/w3c/dom/html/HTMLBaseFontElement.java
new file mode 100755
index 000000000..ba6a9f989
--- /dev/null
+++ b/external/jaxp/source/org/w3c/dom/html/HTMLBaseFontElement.java
@@ -0,0 +1,43 @@
+/*
+ * Copyright (c) 2000 World Wide Web Consortium,
+ * (Massachusetts Institute of Technology, Institut National de
+ * Recherche en Informatique et en Automatique, Keio University). All
+ * Rights Reserved. This program is distributed under the W3C's Software
+ * Intellectual Property License. This program is distributed in the
+ * hope that it will be useful, but WITHOUT ANY WARRANTY; without even
+ * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+ * PURPOSE. See W3C License http://www.w3.org/Consortium/Legal/ for more
+ * details.
+ */
+
+package org.w3c.dom.html;
+
+/**
+ * Base font. See the BASEFONT element definition in HTML 4.0. This element
+ * is deprecated in HTML 4.0.
+ * <p>See also the <a href='http://www.w3.org/TR/2000/CR-DOM-Level-2-20000510'>Document Object Model (DOM) Level 2 Specification</a>.
+ */
+public interface HTMLBaseFontElement extends HTMLElement {
+ /**
+ * Font color. See the color attribute definition in HTML 4.0. This
+ * attribute is deprecated in HTML 4.0.
+ */
+ public String getColor();
+ public void setColor(String color);
+
+ /**
+ * Font face identifier. See the face attribute definition in HTML 4.0.
+ * This attribute is deprecated in HTML 4.0.
+ */
+ public String getFace();
+ public void setFace(String face);
+
+ /**
+ * Font size. See the size attribute definition in HTML 4.0. This
+ * attribute is deprecated in HTML 4.0.
+ */
+ public String getSize();
+ public void setSize(String size);
+
+}
+
diff --git a/external/jaxp/source/org/w3c/dom/html/HTMLBodyElement.java b/external/jaxp/source/org/w3c/dom/html/HTMLBodyElement.java
new file mode 100755
index 000000000..fd780b5b2
--- /dev/null
+++ b/external/jaxp/source/org/w3c/dom/html/HTMLBodyElement.java
@@ -0,0 +1,69 @@
+/*
+ * Copyright (c) 2000 World Wide Web Consortium,
+ * (Massachusetts Institute of Technology, Institut National de
+ * Recherche en Informatique et en Automatique, Keio University). All
+ * Rights Reserved. This program is distributed under the W3C's Software
+ * Intellectual Property License. This program is distributed in the
+ * hope that it will be useful, but WITHOUT ANY WARRANTY; without even
+ * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+ * PURPOSE. See W3C License http://www.w3.org/Consortium/Legal/ for more
+ * details.
+ */
+
+package org.w3c.dom.html;
+
+/**
+ * The HTML document body. This element is always present in the DOM API,
+ * even if the tags are not present in the source document. See the BODY
+ * element definition in HTML 4.0.
+ * <p>See also the <a href='http://www.w3.org/TR/2000/CR-DOM-Level-2-20000510'>Document Object Model (DOM) Level 2 Specification</a>.
+ */
+public interface HTMLBodyElement extends HTMLElement {
+ /**
+ * Color of active links (after mouse-button down, but before
+ * mouse-button up). See the alink attribute definition in HTML 4.0.
+ * This attribute is deprecated in HTML 4.0.
+ */
+ public String getALink();
+ public void setALink(String aLink);
+
+ /**
+ * URI of the background texture tile image. See the background
+ * attribute definition in HTML 4.0. This attribute is deprecated in HTML
+ * 4.0.
+ */
+ public String getBackground();
+ public void setBackground(String background);
+
+ /**
+ * Document background color. See the bgcolor attribute definition in
+ * HTML 4.0. This attribute is deprecated in HTML 4.0.
+ */
+ public String getBgColor();
+ public void setBgColor(String bgColor);
+
+ /**
+ * Color of links that are not active and unvisited. See the link
+ * attribute definition in HTML 4.0. This attribute is deprecated in HTML
+ * 4.0.
+ */
+ public String getLink();
+ public void setLink(String link);
+
+ /**
+ * Document text color. See the text attribute definition in HTML 4.0.
+ * This attribute is deprecated in HTML 4.0.
+ */
+ public String getText();
+ public void setText(String text);
+
+ /**
+ * Color of links that have been visited by the user. See the vlink
+ * attribute definition in HTML 4.0. This attribute is deprecated in HTML
+ * 4.0.
+ */
+ public String getVLink();
+ public void setVLink(String vLink);
+
+}
+
diff --git a/external/jaxp/source/org/w3c/dom/html/HTMLButtonElement.java b/external/jaxp/source/org/w3c/dom/html/HTMLButtonElement.java
new file mode 100755
index 000000000..4696cfaa9
--- /dev/null
+++ b/external/jaxp/source/org/w3c/dom/html/HTMLButtonElement.java
@@ -0,0 +1,67 @@
+/*
+ * Copyright (c) 2000 World Wide Web Consortium,
+ * (Massachusetts Institute of Technology, Institut National de
+ * Recherche en Informatique et en Automatique, Keio University). All
+ * Rights Reserved. This program is distributed under the W3C's Software
+ * Intellectual Property License. This program is distributed in the
+ * hope that it will be useful, but WITHOUT ANY WARRANTY; without even
+ * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+ * PURPOSE. See W3C License http://www.w3.org/Consortium/Legal/ for more
+ * details.
+ */
+
+package org.w3c.dom.html;
+
+/**
+ * Push button. See the BUTTON element definition in HTML 4.0.
+ * <p>See also the <a href='http://www.w3.org/TR/2000/CR-DOM-Level-2-20000510'>Document Object Model (DOM) Level 2 Specification</a>.
+ */
+public interface HTMLButtonElement extends HTMLElement {
+ /**
+ * Returns the <code>FORM</code> element containing this control. Returns
+ * <code>null</code> if this control is not within the context of a form.
+ */
+ public HTMLFormElement getForm();
+
+ /**
+ * A single character access key to give access to the form control. See
+ * the accesskey attribute definition in HTML 4.0.
+ */
+ public String getAccessKey();
+ public void setAccessKey(String accessKey);
+
+ /**
+ * The control is unavailable in this context. See the disabled
+ * attribute definition in HTML 4.0.
+ */
+ public boolean getDisabled();
+ public void setDisabled(boolean disabled);
+
+ /**
+ * Form control or object name when submitted with a form. See the name
+ * attribute definition in HTML 4.0.
+ */
+ public String getName();
+ public void setName(String name);
+
+ /**
+ * Index that represents the element's position in the tabbing order. See
+ * the tabindex attribute definition in HTML 4.0.
+ */
+ public int getTabIndex();
+ public void setTabIndex(int tabIndex);
+
+ /**
+ * The type of button. See the type attribute definition in HTML 4.0.
+ */
+ public String getType();
+
+ /**
+ * The current form control value. See the value attribute definition in
+ * HTML 4.0.
+ */
+ public String getValue();
+ public void setValue(String value);
+
+}
+
diff --git a/external/jaxp/source/org/w3c/dom/html/HTMLCollection.java b/external/jaxp/source/org/w3c/dom/html/HTMLCollection.java
new file mode 100755
index 000000000..8fd54f68c
--- /dev/null
+++ b/external/jaxp/source/org/w3c/dom/html/HTMLCollection.java
@@ -0,0 +1,57 @@
+/*
+ * Copyright (c) 2000 World Wide Web Consortium,
+ * (Massachusetts Institute of Technology, Institut National de
+ * Recherche en Informatique et en Automatique, Keio University). All
+ * Rights Reserved. This program is distributed under the W3C's Software
+ * Intellectual Property License. This program is distributed in the
+ * hope that it will be useful, but WITHOUT ANY WARRANTY; without even
+ * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+ * PURPOSE. See W3C License http://www.w3.org/Consortium/Legal/ for more
+ * details.
+ */
+
+package org.w3c.dom.html;
+
+import org.w3c.dom.Node;
+
+/**
+ * An <code>HTMLCollection</code> is a list of nodes. An individual node may
+ * be accessed by either ordinal index or the node's<code>name</code> or
+ * <code>id</code> attributes. Note: Collections in the HTML DOM are assumed
+ * to be live meaning that they are automatically updated when the
+ * underlying document is changed.
+ * <p>See also the <a href='http://www.w3.org/TR/2000/CR-DOM-Level-2-20000510'>Document Object Model (DOM) Level 2 Specification</a>.
+ */
+public interface HTMLCollection {
+ /**
+ * This attribute specifies the length or size of the list.
+ */
+ public int getLength();
+
+ /**
+ * This method retrieves a node specified by ordinal index. Nodes are
+ * numbered in tree order (depth-first traversal order).
+ * @param index The index of the node to be fetched. The index origin is
+ * 0.
+ * @return The <code>Node</code> at the corresponding position upon
+ * success. A value of <code>null</code> is returned if the index is
+ * out of range.
+ */
+ public Node item(int index);
+
+ /**
+ * This method retrieves a <code>Node</code> using a name. It first
+ * searches for a <code>Node</code> with a matching <code>id</code>
+ * attribute. If it doesn't find one, it then searches for a
+ * <code>Node</code> with a matching <code>name</code> attribute, but
+ * only on those elements that are allowed a name attribute.
+ * @param name The name of the <code>Node</code> to be fetched.
+ * @return The <code>Node</code> with a <code>name</code> or
+ * <code>id</code> attribute whose value corresponds to the specified
+ * string. Upon failure (e.g., no node with this name exists), returns
+ * <code>null</code> .
+ */
+ public Node namedItem(String name);
+
+}
+
diff --git a/external/jaxp/source/org/w3c/dom/html/HTMLDListElement.java b/external/jaxp/source/org/w3c/dom/html/HTMLDListElement.java
new file mode 100755
index 000000000..0d4bbeb29
--- /dev/null
+++ b/external/jaxp/source/org/w3c/dom/html/HTMLDListElement.java
@@ -0,0 +1,28 @@
+/*
+ * Copyright (c) 2000 World Wide Web Consortium,
+ * (Massachusetts Institute of Technology, Institut National de
+ * Recherche en Informatique et en Automatique, Keio University). All
+ * Rights Reserved. This program is distributed under the W3C's Software
+ * Intellectual Property License. This program is distributed in the
+ * hope that it will be useful, but WITHOUT ANY WARRANTY; without even
+ * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+ * PURPOSE. See W3C License http://www.w3.org/Consortium/Legal/ for more
+ * details.
+ */
+
+package org.w3c.dom.html;
+
+/**
+ * Definition list. See the DL element definition in HTML 4.0.
+ * <p>See also the <a href='http://www.w3.org/TR/2000/CR-DOM-Level-2-20000510'>Document Object Model (DOM) Level 2 Specification</a>.
+ */
+public interface HTMLDListElement extends HTMLElement {
+ /**
+ * Reduce spacing between list items. See the compact attribute
+ * definition in HTML 4.0. This attribute is deprecated in HTML 4.0.
+ */
+ public boolean getCompact();
+ public void setCompact(boolean compact);
+
+}
+
diff --git a/external/jaxp/source/org/w3c/dom/html/HTMLDOMImplementation.java b/external/jaxp/source/org/w3c/dom/html/HTMLDOMImplementation.java
new file mode 100755
index 000000000..98284078e
--- /dev/null
+++ b/external/jaxp/source/org/w3c/dom/html/HTMLDOMImplementation.java
@@ -0,0 +1,36 @@
+/*
+ * Copyright (c) 2000 World Wide Web Consortium,
+ * (Massachusetts Institute of Technology, Institut National de
+ * Recherche en Informatique et en Automatique, Keio University). All
+ * Rights Reserved. This program is distributed under the W3C's Software
+ * Intellectual Property License. This program is distributed in the
+ * hope that it will be useful, but WITHOUT ANY WARRANTY; without even
+ * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+ * PURPOSE. See W3C License http://www.w3.org/Consortium/Legal/ for more
+ * details.
+ */
+
+package org.w3c.dom.html;
+
+import org.w3c.dom.DOMImplementation;
+
+/**
+ * The <code>HTMLDOMImplementation</code> interface extends the
+ * <code>DOMImplementation</code> interface with a method for creating an
+ * HTML document instance.
+ * <p>See also the <a href='http://www.w3.org/TR/2000/CR-DOM-Level-2-20000510'>Document Object Model (DOM) Level 2 Specification</a>.
+ * @since DOM Level 2
+ */
+public interface HTMLDOMImplementation extends DOMImplementation {
+ /**
+ * Creates an <code>HTMLDocument</code> object with the minimal tree made
+ * of the following elements: <code>HTML</code> , <code>HEAD</code> ,
+ * <code>TITLE</code> , and <code>BODY</code> .
+ * @param title The title of the document to be set as the content of the
+ * <code>TITLE</code> element, through a child <code>Text</code> node.
+ * @return A new <code>HTMLDocument</code> object.
+ */
+ public HTMLDocument createHTMLDocument(String title);
+
+}
+
diff --git a/external/jaxp/source/org/w3c/dom/html/HTMLDirectoryElement.java b/external/jaxp/source/org/w3c/dom/html/HTMLDirectoryElement.java
new file mode 100755
index 000000000..7c9de1019
--- /dev/null
+++ b/external/jaxp/source/org/w3c/dom/html/HTMLDirectoryElement.java
@@ -0,0 +1,29 @@
+/*
+ * Copyright (c) 2000 World Wide Web Consortium,
+ * (Massachusetts Institute of Technology, Institut National de
+ * Recherche en Informatique et en Automatique, Keio University). All
+ * Rights Reserved. This program is distributed under the W3C's Software
+ * Intellectual Property License. This program is distributed in the
+ * hope that it will be useful, but WITHOUT ANY WARRANTY; without even
+ * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+ * PURPOSE. See W3C License http://www.w3.org/Consortium/Legal/ for more
+ * details.
+ */
+
+package org.w3c.dom.html;
+
+/**
+ * Directory list. See the DIR element definition in HTML 4.0. This element
+ * is deprecated in HTML 4.0.
+ * <p>See also the <a href='http://www.w3.org/TR/2000/CR-DOM-Level-2-20000510'>Document Object Model (DOM) Level 2 Specification</a>.
+ */
+public interface HTMLDirectoryElement extends HTMLElement {
+ /**
+ * Reduce spacing between list items. See the compact attribute
+ * definition in HTML 4.0. This attribute is deprecated in HTML 4.0.
+ */
+ public boolean getCompact();
+ public void setCompact(boolean compact);
+
+}
+
diff --git a/external/jaxp/source/org/w3c/dom/html/HTMLDivElement.java b/external/jaxp/source/org/w3c/dom/html/HTMLDivElement.java
new file mode 100755
index 000000000..239a3ad85
--- /dev/null
+++ b/external/jaxp/source/org/w3c/dom/html/HTMLDivElement.java
@@ -0,0 +1,28 @@
+/*
+ * Copyright (c) 2000 World Wide Web Consortium,
+ * (Massachusetts Institute of Technology, Institut National de
+ * Recherche en Informatique et en Automatique, Keio University). All
+ * Rights Reserved. This program is distributed under the W3C's Software
+ * Intellectual Property License. This program is distributed in the
+ * hope that it will be useful, but WITHOUT ANY WARRANTY; without even
+ * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+ * PURPOSE. See W3C License http://www.w3.org/Consortium/Legal/ for more
+ * details.
+ */
+
+package org.w3c.dom.html;
+
+/**
+ * Generic block container. See the DIV element definition in HTML 4.0.
+ * <p>See also the <a href='http://www.w3.org/TR/2000/CR-DOM-Level-2-20000510'>Document Object Model (DOM) Level 2 Specification</a>.
+ */
+public interface HTMLDivElement extends HTMLElement {
+ /**
+ * Horizontal text alignment. See the align attribute definition in HTML
+ * 4.0. This attribute is deprecated in HTML 4.0.
+ */
+ public String getAlign();
+ public void setAlign(String align);
+
+}
+
diff --git a/external/jaxp/source/org/w3c/dom/html/HTMLDocument.java b/external/jaxp/source/org/w3c/dom/html/HTMLDocument.java
new file mode 100755
index 000000000..23c3099d6
--- /dev/null
+++ b/external/jaxp/source/org/w3c/dom/html/HTMLDocument.java
@@ -0,0 +1,155 @@
+/*
+ * Copyright (c) 2000 World Wide Web Consortium,
+ * (Massachusetts Institute of Technology, Institut National de
+ * Recherche en Informatique et en Automatique, Keio University). All
+ * Rights Reserved. This program is distributed under the W3C's Software
+ * Intellectual Property License. This program is distributed in the
+ * hope that it will be useful, but WITHOUT ANY WARRANTY; without even
+ * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+ * PURPOSE. See W3C License http://www.w3.org/Consortium/Legal/ for more
+ * details.
+ */
+
+package org.w3c.dom.html;
+
+import org.w3c.dom.Document;
+import org.w3c.dom.NodeList;
+
+/**
+ * An <code>HTMLDocument</code> is the root of the HTML hierarchy and holds
+ * the entire content. Besides providing access to the hierarchy, it also
+ * provides some convenience methods for accessing certain sets of
+ * information from the document.
+ * <p> The following properties have been deprecated in favor of the
+ * corresponding ones for the <code>BODY</code> element: alinkColor background
+ * bgColor fgColor linkColor vlinkColor In DOM Level 2, the method
+ * <code>getElementById</code> is inherited from the <code>Document</code>
+ * interface where it was moved.
+ * <p>See also the <a href='http://www.w3.org/TR/2000/CR-DOM-Level-2-20000510'>Document Object Model (DOM) Level 2 Specification</a>.
+ */
+public interface HTMLDocument extends Document {
+ /**
+ * The title of a document as specified by the <code>TITLE</code> element
+ * in the head of the document.
+ */
+ public String getTitle();
+ public void setTitle(String title);
+
+ /**
+ * Returns the URI of the page that linked to this page. The value is an
+ * empty string if the user navigated to the page directly (not through a
+ * link, but, for example, via a bookmark).
+ */
+ public String getReferrer();
+
+ /**
+ * The domain name of the server that served the document, or
+ * <code>null</code> if the server cannot be identified by a domain name.
+ */
+ public String getDomain();
+
+ /**
+ * The complete URI of the document.
+ */
+ public String getURL();
+
+ /**
+ * The element that contains the content for the document. In documents
+ * with <code>BODY</code> contents, returns the <code>BODY</code>
+ * element. In frameset documents, this returns the outermost
+ * <code>FRAMESET</code> element.
+ */
+ public HTMLElement getBody();
+ public void setBody(HTMLElement body);
+
+ /**
+ * A collection of all the <code>IMG</code> elements in a document. The
+ * behavior is limited to <code>IMG</code> elements for backwards
+ * compatibility.
+ */
+ public HTMLCollection getImages();
+
+ /**
+ * A collection of all the <code>OBJECT</code> elements that include
+ * applets and <code>APPLET</code> ( deprecated ) elements in a document.
+ */
+ public HTMLCollection getApplets();
+
+ /**
+ * A collection of all <code>AREA</code> elements and anchor (
+ * <code>A</code> ) elements in a document with a value for the
+ * <code>href</code> attribute.
+ */
+ public HTMLCollection getLinks();
+
+ /**
+ * A collection of all the forms of a document.
+ */
+ public HTMLCollection getForms();
+
+ /**
+ * A collection of all the anchor (<code>A</code> ) elements in a document
+ * with a value for the <code>name</code> attribute. Note. For reasons
+ * of backwards compatibility, the returned set of anchors only contains
+ * those anchors created with the <code>name</code> attribute, not those
+ * created with the <code>id</code> attribute.
+ */
+ public HTMLCollection getAnchors();
+
+ /**
+ * The cookies associated with this document. If there are none, the
+ * value is an empty string. Otherwise, the value is a string: a
+ * semicolon-delimited list of "name, value" pairs for all the cookies
+ * associated with the page. For example,
+ * <code>name=value;expires=date</code> .
+ */
+ public String getCookie();
+ public void setCookie(String cookie);
+
+ /**
+ * Note. This method and the ones following allow a user to add to or
+ * replace the structure model of a document using strings of unparsed
+ * HTML. At the time of writing alternate methods for providing similar
+ * functionality for both HTML and XML documents were being considered.
+ * The following methods may be deprecated at some point in the future in
+ * favor of a more general-purpose mechanism.
+ * <br> Open a document stream for writing. If a document exists in the
+ * target, this method clears it.
+ */
+ public void open();
+
+ /**
+ * Closes a document stream opened by <code>open()</code> and forces
+ * rendering.
+ */
+ public void close();
+
+ /**
+ * Write a string of text to a document stream opened by
+ * <code>open()</code> . The text is parsed into the document's structure
+ * model.
+ * @param text The string to be parsed into some structure in the
+ * document structure model.
+ */
+ public void write(String text);
+
+ /**
+ * Write a string of text followed by a newline character to a document
+ * stream opened by <code>open()</code> . The text is parsed into the
+ * document's structure model.
+ * @param text The string to be parsed into some structure in the
+ * document structure model.
+ */
+ public void writeln(String text);
+
+ /**
+ * Returns the (possibly empty) collection of elements whose
+ * <code>name</code> value is given by <code>elementName</code> .
+ * @param elementName The <code>name</code> attribute value for an
+ * element.
+ * @return The matching elements.
+ */
+ public NodeList getElementsByName(String elementName);
+
+}
+
diff --git a/external/jaxp/source/org/w3c/dom/html/HTMLElement.java b/external/jaxp/source/org/w3c/dom/html/HTMLElement.java
new file mode 100755
index 000000000..73ac6d4cb
--- /dev/null
+++ b/external/jaxp/source/org/w3c/dom/html/HTMLElement.java
@@ -0,0 +1,66 @@
+/*
+ * Copyright (c) 2000 World Wide Web Consortium,
+ * (Massachusetts Institute of Technology, Institut National de
+ * Recherche en Informatique et en Automatique, Keio University). All
+ * Rights Reserved. This program is distributed under the W3C's Software
+ * Intellectual Property License. This program is distributed in the
+ * hope that it will be useful, but WITHOUT ANY WARRANTY; without even
+ * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+ * PURPOSE. See W3C License http://www.w3.org/Consortium/Legal/ for more
+ * details.
+ */
+
+package org.w3c.dom.html;
+
+import org.w3c.dom.Element;
+
+/**
+ * All HTML element interfaces derive from this class. Elements that only
+ * expose the HTML core attributes are represented by the base
+ * <code>HTMLElement</code> interface. These elements are as follows: HEAD
+ * special: SUB, SUP, SPAN, BDO font: TT, I, B, U, S, STRIKE, BIG, SMALL
+ * phrase: EM, STRONG, DFN, CODE, SAMP, KBD, VAR, CITE, ACRONYM, ABBR list:
+ * DD, DT NOFRAMES, NOSCRIPT ADDRESS, CENTER The <code>style</code> attribute
+ * of an HTML element is accessible through the
+ * <code>ElementCSSInlineStyle</code> interface which is defined in the .
+ * <p>See also the <a href='http://www.w3.org/TR/2000/CR-DOM-Level-2-20000510'>Document Object Model (DOM) Level 2 Specification</a>.
+ */
+public interface HTMLElement extends Element {
+ /**
+ * The element's identifier. See the id attribute definition in HTML 4.0.
+ */
+ public String getId();
+ public void setId(String id);
+
+ /**
+ * The element's advisory title. See the title attribute definition in
+ * HTML 4.0.
+ */
+ public String getTitle();
+ public void setTitle(String title);
+
+ /**
+ * Language code defined in RFC 1766. See the lang attribute definition
+ * in HTML 4.0.
+ */
+ public String getLang();
+ public void setLang(String lang);
+
+ /**
+ * Specifies the base direction of directionally neutral text and the
+ * directionality of tables. See the dir attribute definition in HTML
+ * 4.0.
+ */
+ public String getDir();
+ public void setDir(String dir);
+
+ /**
+ * The class attribute of the element. This attribute has been renamed
+ * due to conflicts with the "class" keyword exposed by many languages.
+ * See the class attribute definition in HTML 4.0.
+ */
+ public String getClassName();
+ public void setClassName(String className);
+
+}
+
diff --git a/external/jaxp/source/org/w3c/dom/html/HTMLFieldSetElement.java b/external/jaxp/source/org/w3c/dom/html/HTMLFieldSetElement.java
new file mode 100755
index 000000000..0abea21db
--- /dev/null
+++ b/external/jaxp/source/org/w3c/dom/html/HTMLFieldSetElement.java
@@ -0,0 +1,28 @@
+/*
+ * Copyright (c) 2000 World Wide Web Consortium,
+ * (Massachusetts Institute of Technology, Institut National de
+ * Recherche en Informatique et en Automatique, Keio University). All
+ * Rights Reserved. This program is distributed under the W3C's Software
+ * Intellectual Property License. This program is distributed in the
+ * hope that it will be useful, but WITHOUT ANY WARRANTY; without even
+ * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+ * PURPOSE. See W3C License http://www.w3.org/Consortium/Legal/ for more
+ * details.
+ */
+
+package org.w3c.dom.html;
+
+/**
+ * Organizes form controls into logical groups. See the FIELDSET element
+ * definition in HTML 4.0.
+ * <p>See also the <a href='http://www.w3.org/TR/2000/CR-DOM-Level-2-20000510'>Document Object Model (DOM) Level 2 Specification</a>.
+ */
+public interface HTMLFieldSetElement extends HTMLElement {
+ /**
+ * Returns the <code>FORM</code> element containing this control. Returns
+ * <code>null</code> if this control is not within the context of a form.
+ */
+ public HTMLFormElement getForm();
+
+}
+
diff --git a/external/jaxp/source/org/w3c/dom/html/HTMLFontElement.java b/external/jaxp/source/org/w3c/dom/html/HTMLFontElement.java
new file mode 100755
index 000000000..052020baf
--- /dev/null
+++ b/external/jaxp/source/org/w3c/dom/html/HTMLFontElement.java
@@ -0,0 +1,43 @@
+/*
+ * Copyright (c) 2000 World Wide Web Consortium,
+ * (Massachusetts Institute of Technology, Institut National de
+ * Recherche en Informatique et en Automatique, Keio University). All
+ * Rights Reserved. This program is distributed under the W3C's Software
+ * Intellectual Property License. This program is distributed in the
+ * hope that it will be useful, but WITHOUT ANY WARRANTY; without even
+ * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+ * PURPOSE. See W3C License http://www.w3.org/Consortium/Legal/ for more
+ * details.
+ */
+
+package org.w3c.dom.html;
+
+/**
+ * Local change to font. See the FONT element definition in HTML 4.0. This
+ * element is deprecated in HTML 4.0.
+ * <p>See also the <a href='http://www.w3.org/TR/2000/CR-DOM-Level-2-20000510'>Document Object Model (DOM) Level 2 Specification</a>.
+ */
+public interface HTMLFontElement extends HTMLElement {
+ /**
+ * Font color. See the color attribute definition in HTML 4.0. This
+ * attribute is deprecated in HTML 4.0.
+ */
+ public String getColor();
+ public void setColor(String color);
+
+ /**
+ * Font face identifier. See the face attribute definition in HTML 4.0.
+ * This attribute is deprecated in HTML 4.0.
+ */
+ public String getFace();
+ public void setFace(String face);
+
+ /**
+ * Font size. See the size attribute definition in HTML 4.0. This
+ * attribute is deprecated in HTML 4.0.
+ */
+ public String getSize();
+ public void setSize(String size);
+
+}
+
diff --git a/external/jaxp/source/org/w3c/dom/html/HTMLFormElement.java b/external/jaxp/source/org/w3c/dom/html/HTMLFormElement.java
new file mode 100755
index 000000000..2a74fb328
--- /dev/null
+++ b/external/jaxp/source/org/w3c/dom/html/HTMLFormElement.java
@@ -0,0 +1,87 @@
+/*
+ * Copyright (c) 2000 World Wide Web Consortium,
+ * (Massachusetts Institute of Technology, Institut National de
+ * Recherche en Informatique et en Automatique, Keio University). All
+ * Rights Reserved. This program is distributed under the W3C's Software
+ * Intellectual Property License. This program is distributed in the
+ * hope that it will be useful, but WITHOUT ANY WARRANTY; without even
+ * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+ * PURPOSE. See W3C License http://www.w3.org/Consortium/Legal/ for more
+ * details.
+ */
+
+package org.w3c.dom.html;
+
+/**
+ * The <code>FORM</code> element encompasses behavior similar to a collection
+ * and an element. It provides direct access to the contained input elements
+ * as well as the attributes of the form element. See the FORM element
+ * definition in HTML 4.0.
+ * <p>See also the <a href='http://www.w3.org/TR/2000/CR-DOM-Level-2-20000510'>Document Object Model (DOM) Level 2 Specification</a>.
+ */
+public interface HTMLFormElement extends HTMLElement {
+ /**
+ * Returns a collection of all control elements in the form.
+ */
+ public HTMLCollection getElements();
+
+ /**
+ * The number of form controls in the form.
+ */
+ public int getLength();
+
+ /**
+ * Names the form.
+ */
+ public String getName();
+ public void setName(String name);
+
+ /**
+ * List of character sets supported by the server. See the
+ * accept-charset attribute definition in HTML 4.0.
+ */
+ public String getAcceptCharset();
+ public void setAcceptCharset(String acceptCharset);
+
+ /**
+ * Server-side form handler. See the action attribute definition in HTML
+ * 4.0.
+ */
+ public String getAction();
+ public void setAction(String action);
+
+ /**
+ * The content type of the submitted form, generally
+ * "application/x-www-form-urlencoded". See the enctype attribute
+ * definition in HTML 4.0.
+ */
+ public String getEnctype();
+ public void setEnctype(String enctype);
+
+ /**
+ * HTTP method used to submit form. See the method attribute definition
+ * in HTML 4.0.
+ */
+ public String getMethod();
+ public void setMethod(String method);
+
+ /**
+ * Frame to render the resource in. See the target attribute definition
+ * in HTML 4.0.
+ */
+ public String getTarget();
+ public void setTarget(String target);
+
+ /**
+ * Submits the form. It performs the same action as a submit button.
+ */
+ public void submit();
+
+ /**
+ * Restores a form element's default values. It performs the same action
+ * as a reset button.
+ */
+ public void reset();
+
+}
+
diff --git a/external/jaxp/source/org/w3c/dom/html/HTMLFrameElement.java b/external/jaxp/source/org/w3c/dom/html/HTMLFrameElement.java
new file mode 100755
index 000000000..6efd70257
--- /dev/null
+++ b/external/jaxp/source/org/w3c/dom/html/HTMLFrameElement.java
@@ -0,0 +1,86 @@
+/*
+ * Copyright (c) 2000 World Wide Web Consortium,
+ * (Massachusetts Institute of Technology, Institut National de
+ * Recherche en Informatique et en Automatique, Keio University). All
+ * Rights Reserved. This program is distributed under the W3C's Software
+ * Intellectual Property License. This program is distributed in the
+ * hope that it will be useful, but WITHOUT ANY WARRANTY; without even
+ * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+ * PURPOSE. See W3C License http://www.w3.org/Consortium/Legal/ for more
+ * details.
+ */
+
+package org.w3c.dom.html;
+
+import org.w3c.dom.Document;
+
+/**
+ * Create a frame. See the FRAME element definition in HTML 4.0.
+ * <p>See also the <a href='http://www.w3.org/TR/2000/CR-DOM-Level-2-20000510'>Document Object Model (DOM) Level 2 Specification</a>.
+ */
+public interface HTMLFrameElement extends HTMLElement {
+ /**
+ * Request frame borders. See the frameborder attribute definition in
+ * HTML 4.0.
+ */
+ public String getFrameBorder();
+ public void setFrameBorder(String frameBorder);
+
+ /**
+ * URI designating a long description of this image or frame. See the
+ * longdesc attribute definition in HTML 4.0.
+ */
+ public String getLongDesc();
+ public void setLongDesc(String longDesc);
+
+ /**
+ * Frame margin height, in pixels. See the marginheight attribute
+ * definition in HTML 4.0.
+ */
+ public String getMarginHeight();
+ public void setMarginHeight(String marginHeight);
+
+ /**
+ * Frame margin width, in pixels. See the marginwidth attribute
+ * definition in HTML 4.0.
+ */
+ public String getMarginWidth();
+ public void setMarginWidth(String marginWidth);
+
+ /**
+ * The frame name (object of the <code>target</code> attribute). See the
+ * name attribute definition in HTML 4.0.
+ */
+ public String getName();
+ public void setName(String name);
+
+ /**
+ * When true, forbid user from resizing frame. See the noresize
+ * attribute definition in HTML 4.0.
+ */
+ public boolean getNoResize();
+ public void setNoResize(boolean noResize);
+
+ /**
+ * Specify whether or not the frame should have scrollbars. See the
+ * scrolling attribute definition in HTML 4.0.
+ */
+ public String getScrolling();
+ public void setScrolling(String scrolling);
+
+ /**
+ * A URI designating the initial frame contents. See the src attribute
+ * definition in HTML 4.0.
+ */
+ public String getSrc();
+ public void setSrc(String src);
+
+ /**
+ * The document this frame contains, if there is any and it is available,
+ * or <code>null</code> otherwise.
+ * @since DOM Level 2
+ */
+ public Document getContentDocument();
+
+}
+
diff --git a/external/jaxp/source/org/w3c/dom/html/HTMLFrameSetElement.java b/external/jaxp/source/org/w3c/dom/html/HTMLFrameSetElement.java
new file mode 100755
index 000000000..c13453b64
--- /dev/null
+++ b/external/jaxp/source/org/w3c/dom/html/HTMLFrameSetElement.java
@@ -0,0 +1,35 @@
+/*
+ * Copyright (c) 2000 World Wide Web Consortium,
+ * (Massachusetts Institute of Technology, Institut National de
+ * Recherche en Informatique et en Automatique, Keio University). All
+ * Rights Reserved. This program is distributed under the W3C's Software
+ * Intellectual Property License. This program is distributed in the
+ * hope that it will be useful, but WITHOUT ANY WARRANTY; without even
+ * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+ * PURPOSE. See W3C License http://www.w3.org/Consortium/Legal/ for more
+ * details.
+ */
+
+package org.w3c.dom.html;
+
+/**
+ * Create a grid of frames. See the FRAMESET element definition in HTML 4.0.
+ * <p>See also the <a href='http://www.w3.org/TR/2000/CR-DOM-Level-2-20000510'>Document Object Model (DOM) Level 2 Specification</a>.
+ */
+public interface HTMLFrameSetElement extends HTMLElement {
+ /**
+ * The number of columns of frames in the frameset. See the cols
+ * attribute definition in HTML 4.0.
+ */
+ public String getCols();
+ public void setCols(String cols);
+
+ /**
+ * The number of rows of frames in the frameset. See the rows attribute
+ * definition in HTML 4.0.
+ */
+ public String getRows();
+ public void setRows(String rows);
+
+}
+
diff --git a/external/jaxp/source/org/w3c/dom/html/HTMLHRElement.java b/external/jaxp/source/org/w3c/dom/html/HTMLHRElement.java
new file mode 100755
index 000000000..8a10aa660
--- /dev/null
+++ b/external/jaxp/source/org/w3c/dom/html/HTMLHRElement.java
@@ -0,0 +1,50 @@
+/*
+ * Copyright (c) 2000 World Wide Web Consortium,
+ * (Massachusetts Institute of Technology, Institut National de
+ * Recherche en Informatique et en Automatique, Keio University). All
+ * Rights Reserved. This program is distributed under the W3C's Software
+ * Intellectual Property License. This program is distributed in the
+ * hope that it will be useful, but WITHOUT ANY WARRANTY; without even
+ * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+ * PURPOSE. See W3C License http://www.w3.org/Consortium/Legal/ for more
+ * details.
+ */
+
+package org.w3c.dom.html;
+
+/**
+ * Create a horizontal rule. See the HR element definition in HTML 4.0.
+ * <p>See also the <a href='http://www.w3.org/TR/2000/CR-DOM-Level-2-20000510'>Document Object Model (DOM) Level 2 Specification</a>.
+ */
+public interface HTMLHRElement extends HTMLElement {
+ /**
+ * Align the rule on the page. See the align attribute definition in
+ * HTML 4.0. This attribute is deprecated in HTML 4.0.
+ */
+ public String getAlign();
+ public void setAlign(String align);
+
+ /**
+ * Indicates to the user agent that there should be no shading in the
+ * rendering of this element. See the noshade attribute definition in
+ * HTML 4.0. This attribute is deprecated in HTML 4.0.
+ */
+ public boolean getNoShade();
+ public void setNoShade(boolean noShade);
+
+ /**
+ * The height of the rule. See the size attribute definition in HTML
+ * 4.0. This attribute is deprecated in HTML 4.0.
+ */
+ public String getSize();
+ public void setSize(String size);
+
+ /**
+ * The width of the rule. See the width attribute definition in HTML
+ * 4.0. This attribute is deprecated in HTML 4.0.
+ */
+ public String getWidth();
+ public void setWidth(String width);
+
+}
+
diff --git a/external/jaxp/source/org/w3c/dom/html/HTMLHeadElement.java b/external/jaxp/source/org/w3c/dom/html/HTMLHeadElement.java
new file mode 100755
index 000000000..93abb7502
--- /dev/null
+++ b/external/jaxp/source/org/w3c/dom/html/HTMLHeadElement.java
@@ -0,0 +1,28 @@
+/*
+ * Copyright (c) 2000 World Wide Web Consortium,
+ * (Massachusetts Institute of Technology, Institut National de
+ * Recherche en Informatique et en Automatique, Keio University). All
+ * Rights Reserved. This program is distributed under the W3C's Software
+ * Intellectual Property License. This program is distributed in the
+ * hope that it will be useful, but WITHOUT ANY WARRANTY; without even
+ * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+ * PURPOSE. See W3C License http://www.w3.org/Consortium/Legal/ for more
+ * details.
+ */
+
+package org.w3c.dom.html;
+
+/**
+ * Document head information. See the HEAD element definition in HTML 4.0.
+ * <p>See also the <a href='http://www.w3.org/TR/2000/CR-DOM-Level-2-20000510'>Document Object Model (DOM) Level 2 Specification</a>.
+ */
+public interface HTMLHeadElement extends HTMLElement {
+ /**
+ * URI designating a metadata profile. See the profile attribute
+ * definition in HTML 4.0.
+ */
+ public String getProfile();
+ public void setProfile(String profile);
+
+}
+
diff --git a/external/jaxp/source/org/w3c/dom/html/HTMLHeadingElement.java b/external/jaxp/source/org/w3c/dom/html/HTMLHeadingElement.java
new file mode 100755
index 000000000..8121d2c45
--- /dev/null
+++ b/external/jaxp/source/org/w3c/dom/html/HTMLHeadingElement.java
@@ -0,0 +1,29 @@
+/*
+ * Copyright (c) 2000 World Wide Web Consortium,
+ * (Massachusetts Institute of Technology, Institut National de
+ * Recherche en Informatique et en Automatique, Keio University). All
+ * Rights Reserved. This program is distributed under the W3C's Software
+ * Intellectual Property License. This program is distributed in the
+ * hope that it will be useful, but WITHOUT ANY WARRANTY; without even
+ * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+ * PURPOSE. See W3C License http://www.w3.org/Consortium/Legal/ for more
+ * details.
+ */
+
+package org.w3c.dom.html;
+
+/**
+ * For the <code>H1</code> to <code>H6</code> elements. See the H1 element
+ * definition in HTML 4.0.
+ * <p>See also the <a href='http://www.w3.org/TR/2000/CR-DOM-Level-2-20000510'>Document Object Model (DOM) Level 2 Specification</a>.
+ */
+public interface HTMLHeadingElement extends HTMLElement {
+ /**
+ * Horizontal text alignment. See the align attribute definition in HTML
+ * 4.0. This attribute is deprecated in HTML 4.0.
+ */
+ public String getAlign();
+ public void setAlign(String align);
+
+}
+
diff --git a/external/jaxp/source/org/w3c/dom/html/HTMLHtmlElement.java b/external/jaxp/source/org/w3c/dom/html/HTMLHtmlElement.java
new file mode 100755
index 000000000..ee8f16eab
--- /dev/null
+++ b/external/jaxp/source/org/w3c/dom/html/HTMLHtmlElement.java
@@ -0,0 +1,29 @@
+/*
+ * Copyright (c) 2000 World Wide Web Consortium,
+ * (Massachusetts Institute of Technology, Institut National de
+ * Recherche en Informatique et en Automatique, Keio University). All
+ * Rights Reserved. This program is distributed under the W3C's Software
+ * Intellectual Property License. This program is distributed in the
+ * hope that it will be useful, but WITHOUT ANY WARRANTY; without even
+ * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+ * PURPOSE. See W3C License http://www.w3.org/Consortium/Legal/ for more
+ * details.
+ */
+
+package org.w3c.dom.html;
+
+/**
+ * Root of an HTML document. See the HTML element definition in HTML 4.0.
+ * <p>See also the <a href='http://www.w3.org/TR/2000/CR-DOM-Level-2-20000510'>Document Object Model (DOM) Level 2 Specification</a>.
+ */
+public interface HTMLHtmlElement extends HTMLElement {
+ /**
+ * Version information about the document's DTD. See the version
+ * attribute definition in HTML 4.0. This attribute is deprecated in HTML
+ * 4.0.
+ */
+ public String getVersion();
+ public void setVersion(String version);
+
+}
+
diff --git a/external/jaxp/source/org/w3c/dom/html/HTMLIFrameElement.java b/external/jaxp/source/org/w3c/dom/html/HTMLIFrameElement.java
new file mode 100755
index 000000000..d78f4a99c
--- /dev/null
+++ b/external/jaxp/source/org/w3c/dom/html/HTMLIFrameElement.java
@@ -0,0 +1,99 @@
+/*
+ * Copyright (c) 2000 World Wide Web Consortium,
+ * (Massachusetts Institute of Technology, Institut National de
+ * Recherche en Informatique et en Automatique, Keio University). All
+ * Rights Reserved. This program is distributed under the W3C's Software
+ * Intellectual Property License. This program is distributed in the
+ * hope that it will be useful, but WITHOUT ANY WARRANTY; without even
+ * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+ * PURPOSE. See W3C License http://www.w3.org/Consortium/Legal/ for more
+ * details.
+ */
+
+package org.w3c.dom.html;
+
+import org.w3c.dom.Document;
+
+/**
+ * Inline subwindows. See the IFRAME element definition in HTML 4.0.
+ * <p>See also the <a href='http://www.w3.org/TR/2000/CR-DOM-Level-2-20000510'>Document Object Model (DOM) Level 2 Specification</a>.
+ */
+public interface HTMLIFrameElement extends HTMLElement {
+ /**
+ * Aligns this object (vertically or horizontally) with respect to its
+ * surrounding text. See the align attribute definition in HTML 4.0.
+ * This attribute is deprecated in HTML 4.0.
+ */
+ public String getAlign();
+ public void setAlign(String align);
+
+ /**
+ * Request frame borders. See the frameborder attribute definition in
+ * HTML 4.0.
+ */
+ public String getFrameBorder();
+ public void setFrameBorder(String frameBorder);
+
+ /**
+ * Frame height. See the height attribute definition in HTML 4.0.
+ */
+ public String getHeight();
+ public void setHeight(String height);
+
+ /**
+ * URI designating a long description of this image or frame. See the
+ * longdesc attribute definition in HTML 4.0.
+ */
+ public String getLongDesc();
+ public void setLongDesc(String longDesc);
+
+ /**
+ * Frame margin height, in pixels. See the marginheight attribute
+ * definition in HTML 4.0.
+ */
+ public String getMarginHeight();
+ public void setMarginHeight(String marginHeight);
+
+ /**
+ * Frame margin width, in pixels. See the marginwidth attribute
+ * definition in HTML 4.0.
+ */
+ public String getMarginWidth();
+ public void setMarginWidth(String marginWidth);
+
+ /**
+ * The frame name (object of the <code>target</code> attribute). See the
+ * name attribute definition in HTML 4.0.
+ */
+ public String getName();
+ public void setName(String name);
+
+ /**
+ * Specify whether or not the frame should have scrollbars. See the
+ * scrolling attribute definition in HTML 4.0.
+ */
+ public String getScrolling();
+ public void setScrolling(String scrolling);
+
+ /**
+ * A URI designating the initial frame contents. See the src attribute
+ * definition in HTML 4.0.
+ */
+ public String getSrc();
+ public void setSrc(String src);
+
+ /**
+ * Frame width. See the width attribute definition in HTML 4.0.
+ */
+ public String getWidth();
+ public void setWidth(String width);
+
+ /**
+ * The document this frame contains, if there is any and it is available,
+ * or <code>null</code> otherwise.
+ * @since DOM Level 2
+ */
+ public Document getContentDocument();
+
+}
+
diff --git a/external/jaxp/source/org/w3c/dom/html/HTMLImageElement.java b/external/jaxp/source/org/w3c/dom/html/HTMLImageElement.java
new file mode 100755
index 000000000..6b59c032d
--- /dev/null
+++ b/external/jaxp/source/org/w3c/dom/html/HTMLImageElement.java
@@ -0,0 +1,110 @@
+/*
+ * Copyright (c) 2000 World Wide Web Consortium,
+ * (Massachusetts Institute of Technology, Institut National de
+ * Recherche en Informatique et en Automatique, Keio University). All
+ * Rights Reserved. This program is distributed under the W3C's Software
+ * Intellectual Property License. This program is distributed in the
+ * hope that it will be useful, but WITHOUT ANY WARRANTY; without even
+ * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+ * PURPOSE. See W3C License http://www.w3.org/Consortium/Legal/ for more
+ * details.
+ */
+
+package org.w3c.dom.html;
+
+/**
+ * Embedded image. See the IMG element definition in HTML 4.0.
+ * <p>See also the <a href='http://www.w3.org/TR/2000/CR-DOM-Level-2-20000510'>Document Object Model (DOM) Level 2 Specification</a>.
+ */
+public interface HTMLImageElement extends HTMLElement {
+ /**
+ * URI designating the source of this image, for low-resolution output.
+ */
+ public String getLowSrc();
+ public void setLowSrc(String lowSrc);
+
+ /**
+ * The name of the element (for backwards compatibility).
+ */
+ public String getName();
+ public void setName(String name);
+
+ /**
+ * Aligns this object (vertically or horizontally) with respect to its
+ * surrounding text. See the align attribute definition in HTML 4.0.
+ * This attribute is deprecated in HTML 4.0.
+ */
+ public String getAlign();
+ public void setAlign(String align);
+
+ /**
+ * Alternate text for user agents not rendering the normal content of
+ * this element. See the alt attribute definition in HTML 4.0.
+ */
+ public String getAlt();
+ public void setAlt(String alt);
+
+ /**
+ * Width of border around image. See the border attribute definition in
+ * HTML 4.0. This attribute is deprecated in HTML 4.0.
+ */
+ public String getBorder();
+ public void setBorder(String border);
+
+ /**
+ * Override height. See the height attribute definition in HTML 4.0.
+ */
+ public String getHeight();
+ public void setHeight(String height);
+
+ /**
+ * Horizontal space to the left and right of this image. See the hspace
+ * attribute definition in HTML 4.0. This attribute is deprecated in HTML
+ * 4.0.
+ */
+ public String getHspace();
+ public void setHspace(String hspace);
+
+ /**
+ * Use server-side image map. See the ismap attribute definition in HTML
+ * 4.0.
+ */
+ public boolean getIsMap();
+ public void setIsMap(boolean isMap);
+
+ /**
+ * URI designating a long description of this image or frame. See the
+ * longdesc attribute definition in HTML 4.0.
+ */
+ public String getLongDesc();
+ public void setLongDesc(String longDesc);
+
+ /**
+ * URI designating the source of this image. See the src attribute
+ * definition in HTML 4.0.
+ */
+ public String getSrc();
+ public void setSrc(String src);
+
+ /**
+ * Use client-side image map. See the usemap attribute definition in
+ * HTML 4.0.
+ */
+ public String getUseMap();
+ public void setUseMap(String useMap);
+
+ /**
+ * Vertical space above and below this image. See the vspace attribute
+ * definition in HTML 4.0. This attribute is deprecated in HTML 4.0.
+ */
+ public String getVspace();
+ public void setVspace(String vspace);
+
+ /**
+ * Override width. See the width attribute definition in HTML 4.0.
+ */
+ public String getWidth();
+ public void setWidth(String width);
+
+}
+
diff --git a/external/jaxp/source/org/w3c/dom/html/HTMLInputElement.java b/external/jaxp/source/org/w3c/dom/html/HTMLInputElement.java
new file mode 100755
index 000000000..372eb8a91
--- /dev/null
+++ b/external/jaxp/source/org/w3c/dom/html/HTMLInputElement.java
@@ -0,0 +1,197 @@
+/*
+ * Copyright (c) 2000 World Wide Web Consortium,
+ * (Massachusetts Institute of Technology, Institut National de
+ * Recherche en Informatique et en Automatique, Keio University). All
+ * Rights Reserved. This program is distributed under the W3C's Software
+ * Intellectual Property License. This program is distributed in the
+ * hope that it will be useful, but WITHOUT ANY WARRANTY; without even
+ * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+ * PURPOSE. See W3C License http://www.w3.org/Consortium/Legal/ for more
+ * details.
+ */
+
+package org.w3c.dom.html;
+
+/**
+ * Form control. Note. Depending upon the environment in which the page is
+ * being viewed, the value property may be read-only for the file upload
+ * input type. For the "password" input type, the actual value returned may
+ * be masked to prevent unauthorized use. See the INPUT element definition
+ * in HTML 4.0.
+ * <p>See also the <a href='http://www.w3.org/TR/2000/CR-DOM-Level-2-20000510'>Document Object Model (DOM) Level 2 Specification</a>.
+ */
+public interface HTMLInputElement extends HTMLElement {
+ /**
+ * When the <code>type</code> attribute of the element has the value
+ * "Text", "File" or "Password", this represents the HTML value attribute
+ * of the element. The value of this attribute does not change if the
+ * contents of the corresponding form control, in an interactive user
+ * agent, changes. Changing this attribute, however, resets the contents
+ * of the form control. See the value attribute definition in HTML 4.0.
+ */
+ public String getDefaultValue();
+ public void setDefaultValue(String defaultValue);
+
+ /**
+ * When <code>type</code> has the value "Radio" or "Checkbox", this
+ * represents the HTML checked attribute of the element. The value of
+ * this attribute does not change if the state of the corresponding form
+ * control, in an interactive user agent, changes. Changes to this
+ * attribute, however, resets the state of the form control. See the
+ * checked attribute definition in HTML 4.0.
+ */
+ public boolean getDefaultChecked();
+ public void setDefaultChecked(boolean defaultChecked);
+
+ /**
+ * Returns the <code>FORM</code> element containing this control. Returns
+ * <code>null</code> if this control is not within the context of a form.
+ */
+ public HTMLFormElement getForm();
+
+ /**
+ * A comma-separated list of content types that a server processing this
+ * form will handle correctly. See the accept attribute definition in
+ * HTML 4.0.
+ */
+ public String getAccept();
+ public void setAccept(String accept);
+
+ /**
+ * A single character access key to give access to the form control. See
+ * the accesskey attribute definition in HTML 4.0.
+ */
+ public String getAccessKey();
+ public void setAccessKey(String accessKey);
+
+ /**
+ * Aligns this object (vertically or horizontally) with respect to its
+ * surrounding text. See the align attribute definition in HTML 4.0.
+ * This attribute is deprecated in HTML 4.0.
+ */
+ public String getAlign();
+ public void setAlign(String align);
+
+ /**
+ * Alternate text for user agents not rendering the normal content of
+ * this element. See the alt attribute definition in HTML 4.0.
+ */
+ public String getAlt();
+ public void setAlt(String alt);
+
+ /**
+ * When the <code>type</code> attribute of the element has the value
+ * "Radio" or "Checkbox", this represents the current state of the form
+ * control, in an interactive user agent. Changes to this attribute
+ * change the state of the form control, but do not change the value of
+ * the HTML value attribute of the element.
+ */
+ public boolean getChecked();
+ public void setChecked(boolean checked);
+
+ /**
+ * The control is unavailable in this context. See the disabled
+ * attribute definition in HTML 4.0.
+ */
+ public boolean getDisabled();
+ public void setDisabled(boolean disabled);
+
+ /**
+ * Maximum number of characters for text fields, when <code>type</code>
+ * has the value "Text" or "Password". See the maxlength attribute
+ * definition in HTML 4.0.
+ */
+ public int getMaxLength();
+ public void setMaxLength(int maxLength);
+
+ /**
+ * Form control or object name when submitted with a form. See the name
+ * attribute definition in HTML 4.0.
+ */
+ public String getName();
+ public void setName(String name);
+
+ /**
+ * This control is read-only. Relevant only when <code>type</code> has
+ * the value "Text" or "Password". See the readonly attribute definition
+ * in HTML 4.0.
+ */
+ public boolean getReadOnly();
+ public void setReadOnly(boolean readOnly);
+
+ /**
+ * Size information. The precise meaning is specific to each type of
+ * field. See the size attribute definition in HTML 4.0.
+ */
+ public String getSize();
+ public void setSize(String size);
+
+ /**
+ * When the <code>type</code> attribute has the value "Image", this
+ * attribute specifies the location of the image to be used to decorate
+ * the graphical submit button. See the src attribute definition in HTML
+ * 4.0.
+ */
+ public String getSrc();
+ public void setSrc(String src);
+
+ /**
+ * Index that represents the element's position in the tabbing order. See
+ * the tabindex attribute definition in HTML 4.0.
+ */
+ public int getTabIndex();
+ public void setTabIndex(int tabIndex);
+
+ /**
+ * The type of control created. See the type attribute definition in
+ * HTML 4.0.
+ */
+ public String getType();
+
+ /**
+ * Use client-side image map. See the usemap attribute definition in
+ * HTML 4.0.
+ */
+ public String getUseMap();
+ public void setUseMap(String useMap);
+
+ /**
+ * When the <code>type</code> attribute of the element has the value
+ * "Text", "File" or "Password", this represents the current contents of
+ * the corresponding form control, in an interactive user agent. Changing
+ * this attribute changes the contents of the form control, but does not
+ * change the value of the HTML value attribute of the element. When the
+ * <code>type</code> attribute of the element has the value "Button",
+ * "Hidden", "Submit", "Reset", "Image", "Checkbox" or "Radio", this
+ * represents the HTML value attribute of the element. See the value
+ * attribute definition in HTML 4.0.
+ */
+ public String getValue();
+ public void setValue(String value);
+
+ /**
+ * Removes keyboard focus from this element.
+ */
+ public void blur();
+
+ /**
+ * Gives keyboard focus to this element.
+ */
+ public void focus();
+
+ /**
+ * Select the contents of the text area. For <code>INPUT</code> elements
+ * whose <code>type</code> attribute has one of the following values:
+ * "Text", "File", or "Password".
+ */
+ public void select();
+
+ /**
+ * Simulate a mouse-click. For <code>INPUT</code> elements whose
+ * <code>type</code> attribute has one of the following values: "Button",
+ * "Checkbox", "Radio", "Reset", or "Submit".
+ */
+ public void click();
+
+}
+
diff --git a/external/jaxp/source/org/w3c/dom/html/HTMLIsIndexElement.java b/external/jaxp/source/org/w3c/dom/html/HTMLIsIndexElement.java
new file mode 100755
index 000000000..6eb459627
--- /dev/null
+++ b/external/jaxp/source/org/w3c/dom/html/HTMLIsIndexElement.java
@@ -0,0 +1,35 @@
+/*
+ * Copyright (c) 2000 World Wide Web Consortium,
+ * (Massachusetts Institute of Technology, Institut National de
+ * Recherche en Informatique et en Automatique, Keio University). All
+ * Rights Reserved. This program is distributed under the W3C's Software
+ * Intellectual Property License. This program is distributed in the
+ * hope that it will be useful, but WITHOUT ANY WARRANTY; without even
+ * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+ * PURPOSE. See W3C License http://www.w3.org/Consortium/Legal/ for more
+ * details.
+ */
+
+package org.w3c.dom.html;
+
+/**
+ * This element is used for single-line text input. See the ISINDEX element
+ * definition in HTML 4.0. This element is deprecated in HTML 4.0.
+ * <p>See also the <a href='http://www.w3.org/TR/2000/CR-DOM-Level-2-20000510'>Document Object Model (DOM) Level 2 Specification</a>.
+ */
+public interface HTMLIsIndexElement extends HTMLElement {
+ /**
+ * Returns the <code>FORM</code> element containing this control. Returns
+ * <code>null</code> if this control is not within the context of a form.
+ */
+ public HTMLFormElement getForm();
+
+ /**
+ * The prompt message. See the prompt attribute definition in HTML 4.0.
+ * This attribute is deprecated in HTML 4.0.
+ */
+ public String getPrompt();
+ public void setPrompt(String prompt);
+
+}
+
diff --git a/external/jaxp/source/org/w3c/dom/html/HTMLLIElement.java b/external/jaxp/source/org/w3c/dom/html/HTMLLIElement.java
new file mode 100755
index 000000000..c7dba9ca5
--- /dev/null
+++ b/external/jaxp/source/org/w3c/dom/html/HTMLLIElement.java
@@ -0,0 +1,36 @@
+/*
+ * Copyright (c) 2000 World Wide Web Consortium,
+ * (Massachusetts Institute of Technology, Institut National de
+ * Recherche en Informatique et en Automatique, Keio University). All
+ * Rights Reserved. This program is distributed under the W3C's Software
+ * Intellectual Property License. This program is distributed in the
+ * hope that it will be useful, but WITHOUT ANY WARRANTY; without even
+ * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+ * PURPOSE. See W3C License http://www.w3.org/Consortium/Legal/ for more
+ * details.
+ */
+
+package org.w3c.dom.html;
+
+/**
+ * List item. See the LI element definition in HTML 4.0.
+ * <p>See also the <a href='http://www.w3.org/TR/2000/CR-DOM-Level-2-20000510'>Document Object Model (DOM) Level 2 Specification</a>.
+ */
+public interface HTMLLIElement extends HTMLElement {
+ /**
+ * List item bullet style. See the type attribute definition in HTML
+ * 4.0. This attribute is deprecated in HTML 4.0.
+ */
+ public String getType();
+ public void setType(String type);
+
+ /**
+ * Reset sequence number when used in <code>OL</code> . See the value
+ * attribute definition in HTML 4.0. This attribute is deprecated in HTML
+ * 4.0.
+ */
+ public int getValue();
+ public void setValue(int value);
+
+}
+
diff --git a/external/jaxp/source/org/w3c/dom/html/HTMLLabelElement.java b/external/jaxp/source/org/w3c/dom/html/HTMLLabelElement.java
new file mode 100755
index 000000000..17334155e
--- /dev/null
+++ b/external/jaxp/source/org/w3c/dom/html/HTMLLabelElement.java
@@ -0,0 +1,42 @@
+/*
+ * Copyright (c) 2000 World Wide Web Consortium,
+ * (Massachusetts Institute of Technology, Institut National de
+ * Recherche en Informatique et en Automatique, Keio University). All
+ * Rights Reserved. This program is distributed under the W3C's Software
+ * Intellectual Property License. This program is distributed in the
+ * hope that it will be useful, but WITHOUT ANY WARRANTY; without even
+ * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+ * PURPOSE. See W3C License http://www.w3.org/Consortium/Legal/ for more
+ * details.
+ */
+
+package org.w3c.dom.html;
+
+/**
+ * Form field label text. See the LABEL element definition in HTML 4.0.
+ * <p>See also the <a href='http://www.w3.org/TR/2000/CR-DOM-Level-2-20000510'>Document Object Model (DOM) Level 2 Specification</a>.
+ */
+public interface HTMLLabelElement extends HTMLElement {
+ /**
+ * Returns the <code>FORM</code> element containing this control. Returns
+ * <code>null</code> if this control is not within the context of a form.
+ */
+ public HTMLFormElement getForm();
+
+ /**
+ * A single character access key to give access to the form control. See
+ * the accesskey attribute definition in HTML 4.0.
+ */
+ public String getAccessKey();
+ public void setAccessKey(String accessKey);
+
+ /**
+ * This attribute links this label with another form control by
+ * <code>id</code> attribute. See the for attribute definition in HTML
+ * 4.0.
+ */
+ public String getHtmlFor();
+ public void setHtmlFor(String htmlFor);
+
+}
+
diff --git a/external/jaxp/source/org/w3c/dom/html/HTMLLegendElement.java b/external/jaxp/source/org/w3c/dom/html/HTMLLegendElement.java
new file mode 100755
index 000000000..9bf48d43c
--- /dev/null
+++ b/external/jaxp/source/org/w3c/dom/html/HTMLLegendElement.java
@@ -0,0 +1,43 @@
+/*
+ * Copyright (c) 2000 World Wide Web Consortium,
+ * (Massachusetts Institute of Technology, Institut National de
+ * Recherche en Informatique et en Automatique, Keio University). All
+ * Rights Reserved. This program is distributed under the W3C's Software
+ * Intellectual Property License. This program is distributed in the
+ * hope that it will be useful, but WITHOUT ANY WARRANTY; without even
+ * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+ * PURPOSE. See W3C License http://www.w3.org/Consortium/Legal/ for more
+ * details.
+ */
+
+package org.w3c.dom.html;
+
+/**
+ * Provides a caption for a <code>FIELDSET</code> grouping. See the LEGEND
+ * element definition in HTML 4.0.
+ * <p>See also the <a href='http://www.w3.org/TR/2000/CR-DOM-Level-2-20000510'>Document Object Model (DOM) Level 2 Specification</a>.
+ */
+public interface HTMLLegendElement extends HTMLElement {
+ /**
+ * Returns the <code>FORM</code> element containing this control. Returns
+ * <code>null</code> if this control is not within the context of a form.
+ */
+ public HTMLFormElement getForm();
+
+ /**
+ * A single character access key to give access to the form control. See
+ * the accesskey attribute definition in HTML 4.0.
+ */
+ public String getAccessKey();
+ public void setAccessKey(String accessKey);
+
+ /**
+ * Text alignment relative to <code>FIELDSET</code> . See the align
+ * attribute definition in HTML 4.0. This attribute is deprecated in HTML
+ * 4.0.
+ */
+ public String getAlign();
+ public void setAlign(String align);
+
+}
+
diff --git a/external/jaxp/source/org/w3c/dom/html/HTMLLinkElement.java b/external/jaxp/source/org/w3c/dom/html/HTMLLinkElement.java
new file mode 100755
index 000000000..089b90cc5
--- /dev/null
+++ b/external/jaxp/source/org/w3c/dom/html/HTMLLinkElement.java
@@ -0,0 +1,84 @@
+/*
+ * Copyright (c) 2000 World Wide Web Consortium,
+ * (Massachusetts Institute of Technology, Institut National de
+ * Recherche en Informatique et en Automatique, Keio University). All
+ * Rights Reserved. This program is distributed under the W3C's Software
+ * Intellectual Property License. This program is distributed in the
+ * hope that it will be useful, but WITHOUT ANY WARRANTY; without even
+ * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+ * PURPOSE. See W3C License http://www.w3.org/Consortium/Legal/ for more
+ * details.
+ */
+
+package org.w3c.dom.html;
+
+/**
+ * The <code>LINK</code> element specifies a link to an external resource,
+ * and defines this document's relationship to that resource (or vice versa).
+ * See the LINK element definition in HTML 4.0 (see also the
+ * <code>LinkStyle</code> interface in the module).
+ * <p>See also the <a href='http://www.w3.org/TR/2000/CR-DOM-Level-2-20000510'>Document Object Model (DOM) Level 2 Specification</a>.
+ */
+public interface HTMLLinkElement extends HTMLElement {
+ /**
+ * Enables/disables the link. This is currently only used for style sheet
+ * links, and may be used to activate or deactivate style sheets.
+ */
+ public boolean getDisabled();
+ public void setDisabled(boolean disabled);
+
+ /**
+ * The character encoding of the resource being linked to. See the
+ * charset attribute definition in HTML 4.0.
+ */
+ public String getCharset();
+ public void setCharset(String charset);
+
+ /**
+ * The URI of the linked resource. See the href attribute definition in
+ * HTML 4.0.
+ */
+ public String getHref();
+ public void setHref(String href);
+
+ /**
+ * Language code of the linked resource. See the hreflang attribute
+ * definition in HTML 4.0.
+ */
+ public String getHreflang();
+ public void setHreflang(String hreflang);
+
+ /**
+ * Designed for use with one or more target media. See the media
+ * attribute definition in HTML 4.0.
+ */
+ public String getMedia();
+ public void setMedia(String media);
+
+ /**
+ * Forward link type. See the rel attribute definition in HTML 4.0.
+ */
+ public String getRel();
+ public void setRel(String rel);
+
+ /**
+ * Reverse link type. See the rev attribute definition in HTML 4.0.
+ */
+ public String getRev();
+ public void setRev(String rev);
+
+ /**
+ * Frame to render the resource in. See the target attribute definition
+ * in HTML 4.0.
+ */
+ public String getTarget();
+ public void setTarget(String target);
+
+ /**
+ * Advisory content type. See the type attribute definition in HTML 4.0.
+ */
+ public String getType();
+ public void setType(String type);
+
+}
+
diff --git a/external/jaxp/source/org/w3c/dom/html/HTMLMapElement.java b/external/jaxp/source/org/w3c/dom/html/HTMLMapElement.java
new file mode 100755
index 000000000..bd464b1a7
--- /dev/null
+++ b/external/jaxp/source/org/w3c/dom/html/HTMLMapElement.java
@@ -0,0 +1,33 @@
+/*
+ * Copyright (c) 2000 World Wide Web Consortium,
+ * (Massachusetts Institute of Technology, Institut National de
+ * Recherche en Informatique et en Automatique, Keio University). All
+ * Rights Reserved. This program is distributed under the W3C's Software
+ * Intellectual Property License. This program is distributed in the
+ * hope that it will be useful, but WITHOUT ANY WARRANTY; without even
+ * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+ * PURPOSE. See W3C License http://www.w3.org/Consortium/Legal/ for more
+ * details.
+ */
+
+package org.w3c.dom.html;
+
+/**
+ * Client-side image map. See the MAP element definition in HTML 4.0.
+ * <p>See also the <a href='http://www.w3.org/TR/2000/CR-DOM-Level-2-20000510'>Document Object Model (DOM) Level 2 Specification</a>.
+ */
+public interface HTMLMapElement extends HTMLElement {
+ /**
+ * The list of areas defined for the image map.
+ */
+ public HTMLCollection getAreas();
+
+ /**
+ * Names the map (for use with <code>usemap</code> ). See the name
+ * attribute definition in HTML 4.0.
+ */
+ public String getName();
+ public void setName(String name);
+
+}
+
diff --git a/external/jaxp/source/org/w3c/dom/html/HTMLMenuElement.java b/external/jaxp/source/org/w3c/dom/html/HTMLMenuElement.java
new file mode 100755
index 000000000..cf1fd1247
--- /dev/null
+++ b/external/jaxp/source/org/w3c/dom/html/HTMLMenuElement.java
@@ -0,0 +1,29 @@
+/*
+ * Copyright (c) 2000 World Wide Web Consortium,
+ * (Massachusetts Institute of Technology, Institut National de
+ * Recherche en Informatique et en Automatique, Keio University). All
+ * Rights Reserved. This program is distributed under the W3C's Software
+ * Intellectual Property License. This program is distributed in the
+ * hope that it will be useful, but WITHOUT ANY WARRANTY; without even
+ * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+ * PURPOSE. See W3C License http://www.w3.org/Consortium/Legal/ for more
+ * details.
+ */
+
+package org.w3c.dom.html;
+
+/**
+ * Menu list. See the MENU element definition in HTML 4.0. This element is
+ * deprecated in HTML 4.0.
+ * <p>See also the <a href='http://www.w3.org/TR/2000/CR-DOM-Level-2-20000510'>Document Object Model (DOM) Level 2 Specification</a>.
+ */
+public interface HTMLMenuElement extends HTMLElement {
+ /**
+ * Reduce spacing between list items. See the compact attribute
+ * definition in HTML 4.0. This attribute is deprecated in HTML 4.0.
+ */
+ public boolean getCompact();
+ public void setCompact(boolean compact);
+
+}
+
diff --git a/external/jaxp/source/org/w3c/dom/html/HTMLMetaElement.java b/external/jaxp/source/org/w3c/dom/html/HTMLMetaElement.java
new file mode 100755
index 000000000..8cb608a27
--- /dev/null
+++ b/external/jaxp/source/org/w3c/dom/html/HTMLMetaElement.java
@@ -0,0 +1,49 @@
+/*
+ * Copyright (c) 2000 World Wide Web Consortium,
+ * (Massachusetts Institute of Technology, Institut National de
+ * Recherche en Informatique et en Automatique, Keio University). All
+ * Rights Reserved. This program is distributed under the W3C's Software
+ * Intellectual Property License. This program is distributed in the
+ * hope that it will be useful, but WITHOUT ANY WARRANTY; without even
+ * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+ * PURPOSE. See W3C License http://www.w3.org/Consortium/Legal/ for more
+ * details.
+ */
+
+package org.w3c.dom.html;
+
+/**
+ * This contains generic meta-information about the document. See the META
+ * element definition in HTML 4.0.
+ * <p>See also the <a href='http://www.w3.org/TR/2000/CR-DOM-Level-2-20000510'>Document Object Model (DOM) Level 2 Specification</a>.
+ */
+public interface HTMLMetaElement extends HTMLElement {
+ /**
+ * Associated information. See the content attribute definition in HTML
+ * 4.0.
+ */
+ public String getContent();
+ public void setContent(String content);
+
+ /**
+ * HTTP response header name. See the http-equiv attribute definition in
+ * HTML 4.0.
+ */
+ public String getHttpEquiv();
+ public void setHttpEquiv(String httpEquiv);
+
+ /**
+ * Meta information name. See the name attribute definition in HTML 4.0.
+ */
+ public String getName();
+ public void setName(String name);
+
+ /**
+ * Select form of content. See the scheme attribute definition in HTML
+ * 4.0.
+ */
+ public String getScheme();
+ public void setScheme(String scheme);
+
+}
+
diff --git a/external/jaxp/source/org/w3c/dom/html/HTMLModElement.java b/external/jaxp/source/org/w3c/dom/html/HTMLModElement.java
new file mode 100755
index 000000000..419825d8b
--- /dev/null
+++ b/external/jaxp/source/org/w3c/dom/html/HTMLModElement.java
@@ -0,0 +1,36 @@
+/*
+ * Copyright (c) 2000 World Wide Web Consortium,
+ * (Massachusetts Institute of Technology, Institut National de
+ * Recherche en Informatique et en Automatique, Keio University). All
+ * Rights Reserved. This program is distributed under the W3C's Software
+ * Intellectual Property License. This program is distributed in the
+ * hope that it will be useful, but WITHOUT ANY WARRANTY; without even
+ * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+ * PURPOSE. See W3C License http://www.w3.org/Consortium/Legal/ for more
+ * details.
+ */
+
+package org.w3c.dom.html;
+
+/**
+ * Notice of modification to part of a document. See the INS and DEL
+ * element definitions in HTML 4.0.
+ * <p>See also the <a href='http://www.w3.org/TR/2000/CR-DOM-Level-2-20000510'>Document Object Model (DOM) Level 2 Specification</a>.
+ */
+public interface HTMLModElement extends HTMLElement {
+ /**
+ * A URI designating a document that describes the reason for the change.
+ * See the cite attribute definition in HTML 4.0.
+ */
+ public String getCite();
+ public void setCite(String cite);
+
+ /**
+ * The date and time of the change. See the datetime attribute definition
+ * in HTML 4.0.
+ */
+ public String getDateTime();
+ public void setDateTime(String dateTime);
+
+}
+
diff --git a/external/jaxp/source/org/w3c/dom/html/HTMLOListElement.java b/external/jaxp/source/org/w3c/dom/html/HTMLOListElement.java
new file mode 100755
index 000000000..1357ff138
--- /dev/null
+++ b/external/jaxp/source/org/w3c/dom/html/HTMLOListElement.java
@@ -0,0 +1,42 @@
+/*
+ * Copyright (c) 2000 World Wide Web Consortium,
+ * (Massachusetts Institute of Technology, Institut National de
+ * Recherche en Informatique et en Automatique, Keio University). All
+ * Rights Reserved. This program is distributed under the W3C's Software
+ * Intellectual Property License. This program is distributed in the
+ * hope that it will be useful, but WITHOUT ANY WARRANTY; without even
+ * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+ * PURPOSE. See W3C License http://www.w3.org/Consortium/Legal/ for more
+ * details.
+ */
+
+package org.w3c.dom.html;
+
+/**
+ * Ordered list. See the OL element definition in HTML 4.0.
+ * <p>See also the <a href='http://www.w3.org/TR/2000/CR-DOM-Level-2-20000510'>Document Object Model (DOM) Level 2 Specification</a>.
+ */
+public interface HTMLOListElement extends HTMLElement {
+ /**
+ * Reduce spacing between list items. See the compact attribute
+ * definition in HTML 4.0. This attribute is deprecated in HTML 4.0.
+ */
+ public boolean getCompact();
+ public void setCompact(boolean compact);
+
+ /**
+ * Starting sequence number. See the start attribute definition in HTML
+ * 4.0. This attribute is deprecated in HTML 4.0.
+ */
+ public int getStart();
+ public void setStart(int start);
+
+ /**
+ * Numbering style. See the type attribute definition in HTML 4.0. This
+ * attribute is deprecated in HTML 4.0.
+ */
+ public String getType();
+ public void setType(String type);
+
+}
+
diff --git a/external/jaxp/source/org/w3c/dom/html/HTMLObjectElement.java b/external/jaxp/source/org/w3c/dom/html/HTMLObjectElement.java
new file mode 100755
index 000000000..c682e67fc
--- /dev/null
+++ b/external/jaxp/source/org/w3c/dom/html/HTMLObjectElement.java
@@ -0,0 +1,160 @@
+/*
+ * Copyright (c) 2000 World Wide Web Consortium,
+ * (Massachusetts Institute of Technology, Institut National de
+ * Recherche en Informatique et en Automatique, Keio University). All
+ * Rights Reserved. This program is distributed under the W3C's Software
+ * Intellectual Property License. This program is distributed in the
+ * hope that it will be useful, but WITHOUT ANY WARRANTY; without even
+ * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+ * PURPOSE. See W3C License http://www.w3.org/Consortium/Legal/ for more
+ * details.
+ */
+
+package org.w3c.dom.html;
+
+import org.w3c.dom.Document;
+
+/**
+ * Generic embedded object. Note. In principle, all properties on the object
+ * element are read-write but in some environments some properties may be
+ * read-only once the underlying object is instantiated. See the OBJECT
+ * element definition in HTML 4.0.
+ * <p>See also the <a href='http://www.w3.org/TR/2000/CR-DOM-Level-2-20000510'>Document Object Model (DOM) Level 2 Specification</a>.
+ */
+public interface HTMLObjectElement extends HTMLElement {
+ /**
+ * Returns the <code>FORM</code> element containing this control. Returns
+ * <code>null</code> if this control is not within the context of a form.
+ */
+ public HTMLFormElement getForm();
+
+ /**
+ * Applet class file. See the <code>code</code> attribute for
+ * HTMLAppletElement.
+ */
+ public String getCode();
+ public void setCode(String code);
+
+ /**
+ * Aligns this object (vertically or horizontally) with respect to its
+ * surrounding text. See the align attribute definition in HTML 4.0.
+ * This attribute is deprecated in HTML 4.0.
+ */
+ public String getAlign();
+ public void setAlign(String align);
+
+ /**
+ * Space-separated list of archives. See the archive attribute definition
+ * in HTML 4.0.
+ */
+ public String getArchive();
+ public void setArchive(String archive);
+
+ /**
+ * Width of border around the object. See the border attribute definition
+ * in HTML 4.0. This attribute is deprecated in HTML 4.0.
+ */
+ public String getBorder();
+ public void setBorder(String border);
+
+ /**
+ * Base URI for <code>classid</code> , <code>data</code> , and
+ * <code>archive</code> attributes. See the codebase attribute definition
+ * in HTML 4.0.
+ */
+ public String getCodeBase();
+ public void setCodeBase(String codeBase);
+
+ /**
+ * Content type for data downloaded via <code>classid</code> attribute.
+ * See the codetype attribute definition in HTML 4.0.
+ */
+ public String getCodeType();
+ public void setCodeType(String codeType);
+
+ /**
+ * A URI specifying the location of the object's data. See the data
+ * attribute definition in HTML 4.0.
+ */
+ public String getData();
+ public void setData(String data);
+
+ /**
+ * Declare (for future reference), but do not instantiate, this object.
+ * See the declare attribute definition in HTML 4.0.
+ */
+ public boolean getDeclare();
+ public void setDeclare(boolean declare);
+
+ /**
+ * Override height. See the height attribute definition in HTML 4.0.
+ */
+ public String getHeight();
+ public void setHeight(String height);
+
+ /**
+ * Horizontal space to the left and right of this image, applet, or
+ * object. See the hspace attribute definition in HTML 4.0. This
+ * attribute is deprecated in HTML 4.0.
+ */
+ public String getHspace();
+ public void setHspace(String hspace);
+
+ /**
+ * Form control or object name when submitted with a form. See the name
+ * attribute definition in HTML 4.0.
+ */
+ public String getName();
+ public void setName(String name);
+
+ /**
+ * Message to render while loading the object. See the standby attribute
+ * definition in HTML 4.0.
+ */
+ public String getStandby();
+ public void setStandby(String standby);
+
+ /**
+ * Index that represents the element's position in the tabbing order. See
+ * the tabindex attribute definition in HTML 4.0.
+ */
+ public int getTabIndex();
+ public void setTabIndex(int tabIndex);
+
+ /**
+ * Content type for data downloaded via <code>data</code> attribute. See
+ * the type attribute definition in HTML 4.0.
+ */
+ public String getType();
+ public void setType(String type);
+
+ /**
+ * Use client-side image map. See the usemap attribute definition in
+ * HTML 4.0.
+ */
+ public String getUseMap();
+ public void setUseMap(String useMap);
+
+ /**
+ * Vertical space above and below this image, applet, or object. See the
+ * vspace attribute definition in HTML 4.0. This attribute is deprecated
+ * in HTML 4.0.
+ */
+ public String getVspace();
+ public void setVspace(String vspace);
+
+ /**
+ * Override width. See the width attribute definition in HTML 4.0.
+ */
+ public String getWidth();
+ public void setWidth(String width);
+
+ /**
+ * The document this object contains, if there is any and it is
+ * available, or <code>null</code> otherwise.
+ * @since DOM Level 2
+ */
+ public Document getContentDocument();
+
+}
+
diff --git a/external/jaxp/source/org/w3c/dom/html/HTMLOptGroupElement.java b/external/jaxp/source/org/w3c/dom/html/HTMLOptGroupElement.java
new file mode 100755
index 000000000..ca38157b6
--- /dev/null
+++ b/external/jaxp/source/org/w3c/dom/html/HTMLOptGroupElement.java
@@ -0,0 +1,36 @@
+/*
+ * Copyright (c) 2000 World Wide Web Consortium,
+ * (Massachusetts Institute of Technology, Institut National de
+ * Recherche en Informatique et en Automatique, Keio University). All
+ * Rights Reserved. This program is distributed under the W3C's Software
+ * Intellectual Property License. This program is distributed in the
+ * hope that it will be useful, but WITHOUT ANY WARRANTY; without even
+ * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+ * PURPOSE. See W3C License http://www.w3.org/Consortium/Legal/ for more
+ * details.
+ */
+
+package org.w3c.dom.html;
+
+/**
+ * Group options together in logical subdivisions. See the OPTGROUP element
+ * definition in HTML 4.0.
+ * <p>See also the <a href='http://www.w3.org/TR/2000/CR-DOM-Level-2-20000510'>Document Object Model (DOM) Level 2 Specification</a>.
+ */
+public interface HTMLOptGroupElement extends HTMLElement {
+ /**
+ * The control is unavailable in this context. See the disabled
+ * attribute definition in HTML 4.0.
+ */
+ public boolean getDisabled();
+ public void setDisabled(boolean disabled);
+
+ /**
+ * Assigns a label to this option group. See the label attribute
+ * definition in HTML 4.0.
+ */
+ public String getLabel();
+ public void setLabel(String label);
+
+}
+
diff --git a/external/jaxp/source/org/w3c/dom/html/HTMLOptionElement.java b/external/jaxp/source/org/w3c/dom/html/HTMLOptionElement.java
new file mode 100755
index 000000000..8af033c37
--- /dev/null
+++ b/external/jaxp/source/org/w3c/dom/html/HTMLOptionElement.java
@@ -0,0 +1,78 @@
+/*
+ * Copyright (c) 2000 World Wide Web Consortium,
+ * (Massachusetts Institute of Technology, Institut National de
+ * Recherche en Informatique et en Automatique, Keio University). All
+ * Rights Reserved. This program is distributed under the W3C's Software
+ * Intellectual Property License. This program is distributed in the
+ * hope that it will be useful, but WITHOUT ANY WARRANTY; without even
+ * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+ * PURPOSE. See W3C License http://www.w3.org/Consortium/Legal/ for more
+ * details.
+ */
+
+package org.w3c.dom.html;
+
+/**
+ * A selectable choice. See the OPTION element definition in HTML 4.0.
+ * <p>See also the <a href='http://www.w3.org/TR/2000/CR-DOM-Level-2-20000510'>Document Object Model (DOM) Level 2 Specification</a>.
+ */
+public interface HTMLOptionElement extends HTMLElement {
+ /**
+ * Returns the <code>FORM</code> element containing this control. Returns
+ * <code>null</code> if this control is not within the context of a form.
+ */
+ public HTMLFormElement getForm();
+
+ /**
+ * Represents the value of the HTML selected attribute. The value of this
+ * attribute does not change if the state of the corresponding form
+ * control, in an interactive user agent, changes. Changing
+ * <code>defaultSelected</code> , however, resets the state of the form
+ * control. See the selected attribute definition in HTML 4.0.
+ */
+ public boolean getDefaultSelected();
+ public void setDefaultSelected(boolean defaultSelected);
+
+ /**
+ * The text contained within the option element.
+ */
+ public String getText();
+
+ /**
+ * The index of this <code>OPTION</code> in its parent <code>SELECT</code>
+ * , starting from 0.
+ */
+ public int getIndex();
+
+ /**
+ * The control is unavailable in this context. See the disabled
+ * attribute definition in HTML 4.0.
+ */
+ public boolean getDisabled();
+ public void setDisabled(boolean disabled);
+
+ /**
+ * Option label for use in hierarchical menus. See the label attribute
+ * definition in HTML 4.0.
+ */
+ public String getLabel();
+ public void setLabel(String label);
+
+ /**
+ * Represents the current state of the corresponding form control, in an
+ * interactive user agent. Changing this attribute changes the state of
+ * the form control, but does not change the value of the HTML selected
+ * attribute of the element.
+ */
+ public boolean getSelected();
+ public void setSelected(boolean selected);
+
+ /**
+ * The current form control value. See the value attribute definition in
+ * HTML 4.0.
+ */
+ public String getValue();
+ public void setValue(String value);
+
+}
+
diff --git a/external/jaxp/source/org/w3c/dom/html/HTMLParagraphElement.java b/external/jaxp/source/org/w3c/dom/html/HTMLParagraphElement.java
new file mode 100755
index 000000000..179241a9f
--- /dev/null
+++ b/external/jaxp/source/org/w3c/dom/html/HTMLParagraphElement.java
@@ -0,0 +1,28 @@
+/*
+ * Copyright (c) 2000 World Wide Web Consortium,
+ * (Massachusetts Institute of Technology, Institut National de
+ * Recherche en Informatique et en Automatique, Keio University). All
+ * Rights Reserved. This program is distributed under the W3C's Software
+ * Intellectual Property License. This program is distributed in the
+ * hope that it will be useful, but WITHOUT ANY WARRANTY; without even
+ * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+ * PURPOSE. See W3C License http://www.w3.org/Consortium/Legal/ for more
+ * details.
+ */
+
+package org.w3c.dom.html;
+
+/**
+ * Paragraphs. See the P element definition in HTML 4.0.
+ * <p>See also the <a href='http://www.w3.org/TR/2000/CR-DOM-Level-2-20000510'>Document Object Model (DOM) Level 2 Specification</a>.
+ */
+public interface HTMLParagraphElement extends HTMLElement {
+ /**
+ * Horizontal text alignment. See the align attribute definition in HTML
+ * 4.0. This attribute is deprecated in HTML 4.0.
+ */
+ public String getAlign();
+ public void setAlign(String align);
+
+}
+
diff --git a/external/jaxp/source/org/w3c/dom/html/HTMLParamElement.java b/external/jaxp/source/org/w3c/dom/html/HTMLParamElement.java
new file mode 100755
index 000000000..e30fd5329
--- /dev/null
+++ b/external/jaxp/source/org/w3c/dom/html/HTMLParamElement.java
@@ -0,0 +1,51 @@
+/*
+ * Copyright (c) 2000 World Wide Web Consortium,
+ * (Massachusetts Institute of Technology, Institut National de
+ * Recherche en Informatique et en Automatique, Keio University). All
+ * Rights Reserved. This program is distributed under the W3C's Software
+ * Intellectual Property License. This program is distributed in the
+ * hope that it will be useful, but WITHOUT ANY WARRANTY; without even
+ * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+ * PURPOSE. See W3C License http://www.w3.org/Consortium/Legal/ for more
+ * details.
+ */
+
+package org.w3c.dom.html;
+
+/**
+ * Parameters fed to the <code>OBJECT</code> element. See the PARAM element
+ * definition in HTML 4.0.
+ * <p>See also the <a href='http://www.w3.org/TR/2000/CR-DOM-Level-2-20000510'>Document Object Model (DOM) Level 2 Specification</a>.
+ */
+public interface HTMLParamElement extends HTMLElement {
+ /**
+ * The name of a run-time parameter. See the name attribute definition
+ * in HTML 4.0.
+ */
+ public String getName();
+ public void setName(String name);
+
+ /**
+ * Content type for the <code>value</code> attribute when
+ * <code>valuetype</code> has the value "ref". See the type attribute
+ * definition in HTML 4.0.
+ */
+ public String getType();
+ public void setType(String type);
+
+ /**
+ * The value of a run-time parameter. See the value attribute definition
+ * in HTML 4.0.
+ */
+ public String getValue();
+ public void setValue(String value);
+
+ /**
+ * Information about the meaning of the <code>value</code> attribute
+ * value. See the valuetype attribute definition in HTML 4.0.
+ */
+ public String getValueType();
+ public void setValueType(String valueType);
+
+}
+
diff --git a/external/jaxp/source/org/w3c/dom/html/HTMLPreElement.java b/external/jaxp/source/org/w3c/dom/html/HTMLPreElement.java
new file mode 100755
index 000000000..23fc398eb
--- /dev/null
+++ b/external/jaxp/source/org/w3c/dom/html/HTMLPreElement.java
@@ -0,0 +1,28 @@
+/*
+ * Copyright (c) 2000 World Wide Web Consortium,
+ * (Massachusetts Institute of Technology, Institut National de
+ * Recherche en Informatique et en Automatique, Keio University). All
+ * Rights Reserved. This program is distributed under the W3C's Software
+ * Intellectual Property License. This program is distributed in the
+ * hope that it will be useful, but WITHOUT ANY WARRANTY; without even
+ * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+ * PURPOSE. See W3C License http://www.w3.org/Consortium/Legal/ for more
+ * details.
+ */
+
+package org.w3c.dom.html;
+
+/**
+ * Preformatted text. See the PRE element definition in HTML 4.0.
+ * <p>See also the <a href='http://www.w3.org/TR/2000/CR-DOM-Level-2-20000510'>Document Object Model (DOM) Level 2 Specification</a>.
+ */
+public interface HTMLPreElement extends HTMLElement {
+ /**
+ * Fixed width for content. See the width attribute definition in HTML
+ * 4.0. This attribute is deprecated in HTML 4.0.
+ */
+ public int getWidth();
+ public void setWidth(int width);
+
+}
+
diff --git a/external/jaxp/source/org/w3c/dom/html/HTMLQuoteElement.java b/external/jaxp/source/org/w3c/dom/html/HTMLQuoteElement.java
new file mode 100755
index 000000000..26873f48f
--- /dev/null
+++ b/external/jaxp/source/org/w3c/dom/html/HTMLQuoteElement.java
@@ -0,0 +1,29 @@
+/*
+ * Copyright (c) 2000 World Wide Web Consortium,
+ * (Massachusetts Institute of Technology, Institut National de
+ * Recherche en Informatique et en Automatique, Keio University). All
+ * Rights Reserved. This program is distributed under the W3C's Software
+ * Intellectual Property License. This program is distributed in the
+ * hope that it will be useful, but WITHOUT ANY WARRANTY; without even
+ * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+ * PURPOSE. See W3C License http://www.w3.org/Consortium/Legal/ for more
+ * details.
+ */
+
+package org.w3c.dom.html;
+
+/**
+ * For the <code>Q</code> and <code>BLOCKQUOTE</code> elements. See the Q
+ * element definition in HTML 4.0.
+ * <p>See also the <a href='http://www.w3.org/TR/2000/CR-DOM-Level-2-20000510'>Document Object Model (DOM) Level 2 Specification</a>.
+ */
+public interface HTMLQuoteElement extends HTMLElement {
+ /**
+ * A URI designating a source document or message. See the cite
+ * attribute definition in HTML 4.0.
+ */
+ public String getCite();
+ public void setCite(String cite);
+
+}
+
diff --git a/external/jaxp/source/org/w3c/dom/html/HTMLScriptElement.java b/external/jaxp/source/org/w3c/dom/html/HTMLScriptElement.java
new file mode 100755
index 000000000..3294a504f
--- /dev/null
+++ b/external/jaxp/source/org/w3c/dom/html/HTMLScriptElement.java
@@ -0,0 +1,67 @@
+/*
+ * Copyright (c) 2000 World Wide Web Consortium,
+ * (Massachusetts Institute of Technology, Institut National de
+ * Recherche en Informatique et en Automatique, Keio University). All
+ * Rights Reserved. This program is distributed under the W3C's Software
+ * Intellectual Property License. This program is distributed in the
+ * hope that it will be useful, but WITHOUT ANY WARRANTY; without even
+ * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+ * PURPOSE. See W3C License http://www.w3.org/Consortium/Legal/ for more
+ * details.
+ */
+
+package org.w3c.dom.html;
+
+/**
+ * Script statements. See the SCRIPT element definition in HTML 4.0.
+ * <p>See also the <a href='http://www.w3.org/TR/2000/CR-DOM-Level-2-20000510'>Document Object Model (DOM) Level 2 Specification</a>.
+ */
+public interface HTMLScriptElement extends HTMLElement {
+ /**
+ * The script content of the element.
+ */
+ public String getText();
+ public void setText(String text);
+
+ /**
+ * Reserved for future use.
+ */
+ public String getHtmlFor();
+ public void setHtmlFor(String htmlFor);
+
+ /**
+ * Reserved for future use.
+ */
+ public String getEvent();
+ public void setEvent(String event);
+
+ /**
+ * The character encoding of the linked resource. See the charset
+ * attribute definition in HTML 4.0.
+ */
+ public String getCharset();
+ public void setCharset(String charset);
+
+ /**
+ * Indicates that the user agent can defer processing of the script. See
+ * the defer attribute definition in HTML 4.0.
+ */
+ public boolean getDefer();
+ public void setDefer(boolean defer);
+
+ /**
+ * URI designating an external script. See the src attribute definition
+ * in HTML 4.0.
+ */
+ public String getSrc();
+ public void setSrc(String src);
+
+ /**
+ * The content type of the script language. See the type attribute
+ * definition in HTML 4.0.
+ */
+ public String getType();
+ public void setType(String type);
+
+}
+
diff --git a/external/jaxp/source/org/w3c/dom/html/HTMLSelectElement.java b/external/jaxp/source/org/w3c/dom/html/HTMLSelectElement.java
new file mode 100755
index 000000000..c66995f3c
--- /dev/null
+++ b/external/jaxp/source/org/w3c/dom/html/HTMLSelectElement.java
@@ -0,0 +1,134 @@
+/*
+ * Copyright (c) 2000 World Wide Web Consortium,
+ * (Massachusetts Institute of Technology, Institut National de
+ * Recherche en Informatique et en Automatique, Keio University). All
+ * Rights Reserved. This program is distributed under the W3C's Software
+ * Intellectual Property License. This program is distributed in the
+ * hope that it will be useful, but WITHOUT ANY WARRANTY; without even
+ * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+ * PURPOSE. See W3C License http://www.w3.org/Consortium/Legal/ for more
+ * details.
+ */
+
+package org.w3c.dom.html;
+
+import org.w3c.dom.DOMException;
+
+/**
+ * The select element allows the selection of an option. The contained
+ * options can be directly accessed through the select element as a
+ * collection. See the SELECT element definition in HTML 4.0.
+ * <p>See also the <a href='http://www.w3.org/TR/2000/CR-DOM-Level-2-20000510'>Document Object Model (DOM) Level 2 Specification</a>.
+ */
+public interface HTMLSelectElement extends HTMLElement {
+ /**
+ * The type of this form control. This is the string "select-multiple"
+ * when the multiple attribute is <code>true</code> and the string
+ * "select-one" when <code>false</code> .
+ */
+ public String getType();
+
+ /**
+ * The ordinal index of the selected option, starting from 0. The value
+ * -1 is returned if no element is selected. If multiple options are
+ * selected, the index of the first selected option is returned.
+ */
+ public int getSelectedIndex();
+ public void setSelectedIndex(int selectedIndex);
+
+ /**
+ * The current form control value.
+ */
+ public String getValue();
+ public void setValue(String value);
+
+ /**
+ * The number of options in this <code>SELECT</code> .
+ */
+ public int getLength();
+
+ /**
+ * Returns the <code>FORM</code> element containing this control. Returns
+ * <code>null</code> if this control is not within the context of a form.
+ */
+ public HTMLFormElement getForm();
+
+ /**
+ * The collection of <code>OPTION</code> elements contained by this
+ * element.
+ */
+ public HTMLCollection getOptions();
+
+ /**
+ * The control is unavailable in this context. See the disabled
+ * attribute definition in HTML 4.0.
+ */
+ public boolean getDisabled();
+ public void setDisabled(boolean disabled);
+
+ /**
+ * If true, multiple <code>OPTION</code> elements may be selected in
+ * this <code>SELECT</code> . See the multiple attribute definition in
+ * HTML 4.0.
+ */
+ public boolean getMultiple();
+ public void setMultiple(boolean multiple);
+
+ /**
+ * Form control or object name when submitted with a form. See the name
+ * attribute definition in HTML 4.0.
+ */
+ public String getName();
+ public void setName(String name);
+
+ /**
+ * Number of visible rows. See the size attribute definition in HTML 4.0.
+ */
+ public int getSize();
+ public void setSize(int size);
+
+ /**
+ * Index that represents the element's position in the tabbing order. See
+ * the tabindex attribute definition in HTML 4.0.
+ */
+ public int getTabIndex();
+ public void setTabIndex(int tabIndex);
+
+ /**
+ * Add a new element to the collection of <code>OPTION</code> elements
+ * for this <code>SELECT</code> . This method is the equivalent of the
+ * <code>appendChild</code> method of the <code>Node</code> interface if
+ * the <code>before</code> parameter is <code>null</code> . It is
+ * equivalent to the <code>insertBefore</code> method on the parent of
+ * <code>before</code> in all other cases.
+ * @param element The element to add.
+ * @param before The element to insert before, or <code>null</code> for
+ * the tail of the list.
+ * @exception DOMException
+ * NOT_FOUND_ERR: Raised if <code>before</code> is not a descendant of
+ * the <code>SELECT</code> element.
+ */
+ public void add(HTMLElement element,
+ HTMLElement before)
+ throws DOMException;
+
+ /**
+ * Remove an element from the collection of <code>OPTION</code> elements
+ * for this <code>SELECT</code> . Does nothing if no element has the given
+ * index.
+ * @param index The index of the item to remove, starting from 0.
+ */
+ public void remove(int index);
+
+ /**
+ * Removes keyboard focus from this element.
+ */
+ public void blur();
+
+ /**
+ * Gives keyboard focus to this element.
+ */
+ public void focus();
+
+}
+
diff --git a/external/jaxp/source/org/w3c/dom/html/HTMLStyleElement.java b/external/jaxp/source/org/w3c/dom/html/HTMLStyleElement.java
new file mode 100755
index 000000000..e3d04bd44
--- /dev/null
+++ b/external/jaxp/source/org/w3c/dom/html/HTMLStyleElement.java
@@ -0,0 +1,42 @@
+/*
+ * Copyright (c) 2000 World Wide Web Consortium,
+ * (Massachusetts Institute of Technology, Institut National de
+ * Recherche en Informatique et en Automatique, Keio University). All
+ * Rights Reserved. This program is distributed under the W3C's Software
+ * Intellectual Property License. This program is distributed in the
+ * hope that it will be useful, but WITHOUT ANY WARRANTY; without even
+ * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+ * PURPOSE. See W3C License http://www.w3.org/Consortium/Legal/ for more
+ * details.
+ */
+
+package org.w3c.dom.html;
+
+/**
+ * Style information. See the STYLE element definition in HTML 4.0, the
+ * module and the <code>LinkStyle</code> interface in the module.
+ * <p>See also the <a href='http://www.w3.org/TR/2000/CR-DOM-Level-2-20000510'>Document Object Model (DOM) Level 2 Specification</a>.
+ */
+public interface HTMLStyleElement extends HTMLElement {
+ /**
+ * Enables/disables the style sheet.
+ */
+ public boolean getDisabled();
+ public void setDisabled(boolean disabled);
+
+ /**
+ * Designed for use with one or more target media. See the media
+ * attribute definition in HTML 4.0.
+ */
+ public String getMedia();
+ public void setMedia(String media);
+
+ /**
+ * The content type pf the style sheet language. See the type attribute
+ * definition in HTML 4.0.
+ */
+ public String getType();
+ public void setType(String type);
+
+}
+
diff --git a/external/jaxp/source/org/w3c/dom/html/HTMLTableCaptionElement.java b/external/jaxp/source/org/w3c/dom/html/HTMLTableCaptionElement.java
new file mode 100755
index 000000000..58a8bed5e
--- /dev/null
+++ b/external/jaxp/source/org/w3c/dom/html/HTMLTableCaptionElement.java
@@ -0,0 +1,28 @@
+/*
+ * Copyright (c) 2000 World Wide Web Consortium,
+ * (Massachusetts Institute of Technology, Institut National de
+ * Recherche en Informatique et en Automatique, Keio University). All
+ * Rights Reserved. This program is distributed under the W3C's Software
+ * Intellectual Property License. This program is distributed in the
+ * hope that it will be useful, but WITHOUT ANY WARRANTY; without even
+ * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+ * PURPOSE. See W3C License http://www.w3.org/Consortium/Legal/ for more
+ * details.
+ */
+
+package org.w3c.dom.html;
+
+/**
+ * Table caption See the CAPTION element definition in HTML 4.0.
+ * <p>See also the <a href='http://www.w3.org/TR/2000/CR-DOM-Level-2-20000510'>Document Object Model (DOM) Level 2 Specification</a>.
+ */
+public interface HTMLTableCaptionElement extends HTMLElement {
+ /**
+ * Caption alignment with respect to the table. See the align attribute
+ * definition in HTML 4.0. This attribute is deprecated in HTML 4.0.
+ */
+ public String getAlign();
+ public void setAlign(String align);
+
+}
+
diff --git a/external/jaxp/source/org/w3c/dom/html/HTMLTableCellElement.java b/external/jaxp/source/org/w3c/dom/html/HTMLTableCellElement.java
new file mode 100755
index 000000000..b818ce137
--- /dev/null
+++ b/external/jaxp/source/org/w3c/dom/html/HTMLTableCellElement.java
@@ -0,0 +1,126 @@
+/*
+ * Copyright (c) 2000 World Wide Web Consortium,
+ * (Massachusetts Institute of Technology, Institut National de
+ * Recherche en Informatique et en Automatique, Keio University). All
+ * Rights Reserved. This program is distributed under the W3C's Software
+ * Intellectual Property License. This program is distributed in the
+ * hope that it will be useful, but WITHOUT ANY WARRANTY; without even
+ * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+ * PURPOSE. See W3C License http://www.w3.org/Consortium/Legal/ for more
+ * details.
+ */
+
+package org.w3c.dom.html;
+
+/**
+ * The object used to represent the <code>TH</code> and <code>TD</code>
+ * elements. See the TD element definition in HTML 4.0.
+ * <p>See also the <a href='http://www.w3.org/TR/2000/CR-DOM-Level-2-20000510'>Document Object Model (DOM) Level 2 Specification</a>.
+ */
+public interface HTMLTableCellElement extends HTMLElement {
+ /**
+ * The index of this cell in the row, starting from 0. This index is in
+ * document tree order and not display order.
+ */
+ public int getCellIndex();
+
+ /**
+ * Abbreviation for header cells. See the abbr attribute definition in
+ * HTML 4.0.
+ */
+ public String getAbbr();
+ public void setAbbr(String abbr);
+
+ /**
+ * Horizontal alignment of data in cell. See the align attribute
+ * definition in HTML 4.0.
+ */
+ public String getAlign();
+ public void setAlign(String align);
+
+ /**
+ * Names group of related headers. See the axis attribute definition in
+ * HTML 4.0.
+ */
+ public String getAxis();
+ public void setAxis(String axis);
+
+ /**
+ * Cell background color. See the bgcolor attribute definition in HTML
+ * 4.0. This attribute is deprecated in HTML 4.0.
+ */
+ public String getBgColor();
+ public void setBgColor(String bgColor);
+
+ /**
+ * Alignment character for cells in a column. See the char attribute
+ * definition in HTML 4.0.
+ */
+ public String getCh();
+ public void setCh(String ch);
+
+ /**
+ * Offset of alignment character. See the charoff attribute definition
+ * in HTML 4.0.
+ */
+ public String getChOff();
+ public void setChOff(String chOff);
+
+ /**
+ * Number of columns spanned by cell. See the colspan attribute
+ * definition in HTML 4.0.
+ */
+ public int getColSpan();
+ public void setColSpan(int colSpan);
+
+ /**
+ * List of <code>id</code> attribute values for header cells. See the
+ * headers attribute definition in HTML 4.0.
+ */
+ public String getHeaders();
+ public void setHeaders(String headers);
+
+ /**
+ * Cell height. See the height attribute definition in HTML 4.0. This
+ * attribute is deprecated in HTML 4.0.
+ */
+ public String getHeight();
+ public void setHeight(String height);
+
+ /**
+ * Suppress word wrapping. See the nowrap attribute definition in HTML
+ * 4.0. This attribute is deprecated in HTML 4.0.
+ */
+ public boolean getNoWrap();
+ public void setNoWrap(boolean noWrap);
+
+ /**
+ * Number of rows spanned by cell. See the rowspan attribute definition
+ * in HTML 4.0.
+ */
+ public int getRowSpan();
+ public void setRowSpan(int rowSpan);
+
+ /**
+ * Scope covered by header cells. See the scope attribute definition in
+ * HTML 4.0.
+ */
+ public String getScope();
+ public void setScope(String scope);
+
+ /**
+ * Vertical alignment of data in cell. See the valign attribute
+ * definition in HTML 4.0.
+ */
+ public String getVAlign();
+ public void setVAlign(String vAlign);
+
+ /**
+ * Cell width. See the width attribute definition in HTML 4.0. This
+ * attribute is deprecated in HTML 4.0.
+ */
+ public String getWidth();
+ public void setWidth(String width);
+
+}
+
diff --git a/external/jaxp/source/org/w3c/dom/html/HTMLTableColElement.java b/external/jaxp/source/org/w3c/dom/html/HTMLTableColElement.java
new file mode 100755
index 000000000..895ee041e
--- /dev/null
+++ b/external/jaxp/source/org/w3c/dom/html/HTMLTableColElement.java
@@ -0,0 +1,63 @@
+/*
+ * Copyright (c) 2000 World Wide Web Consortium,
+ * (Massachusetts Institute of Technology, Institut National de
+ * Recherche en Informatique et en Automatique, Keio University). All
+ * Rights Reserved. This program is distributed under the W3C's Software
+ * Intellectual Property License. This program is distributed in the
+ * hope that it will be useful, but WITHOUT ANY WARRANTY; without even
+ * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+ * PURPOSE. See W3C License http://www.w3.org/Consortium/Legal/ for more
+ * details.
+ */
+
+package org.w3c.dom.html;
+
+/**
+ * Regroups the <code>COL</code> and <code>COLGROUP</code> elements. See the
+ * COL element definition in HTML 4.0.
+ * <p>See also the <a href='http://www.w3.org/TR/2000/CR-DOM-Level-2-20000510'>Document Object Model (DOM) Level 2 Specification</a>.
+ */
+public interface HTMLTableColElement extends HTMLElement {
+ /**
+ * Horizontal alignment of cell data in column. See the align attribute
+ * definition in HTML 4.0.
+ */
+ public String getAlign();
+ public void setAlign(String align);
+
+ /**
+ * Alignment character for cells in a column. See the char attribute
+ * definition in HTML 4.0.
+ */
+ public String getCh();
+ public void setCh(String ch);
+
+ /**
+ * Offset of alignment character. See the charoff attribute definition
+ * in HTML 4.0.
+ */
+ public String getChOff();
+ public void setChOff(String chOff);
+
+ /**
+ * Indicates the number of columns in a group or affected by a grouping.
+ * See the span attribute definition in HTML 4.0.
+ */
+ public int getSpan();
+ public void setSpan(int span);
+
+ /**
+ * Vertical alignment of cell data in column. See the valign attribute
+ * definition in HTML 4.0.
+ */
+ public String getVAlign();
+ public void setVAlign(String vAlign);
+
+ /**
+ * Default column width. See the width attribute definition in HTML 4.0.
+ */
+ public String getWidth();
+ public void setWidth(String width);
+
+}
+
diff --git a/external/jaxp/source/org/w3c/dom/html/HTMLTableElement.java b/external/jaxp/source/org/w3c/dom/html/HTMLTableElement.java
new file mode 100755
index 000000000..42aa2482e
--- /dev/null
+++ b/external/jaxp/source/org/w3c/dom/html/HTMLTableElement.java
@@ -0,0 +1,189 @@
+/*
+ * Copyright (c) 2000 World Wide Web Consortium,
+ * (Massachusetts Institute of Technology, Institut National de
+ * Recherche en Informatique et en Automatique, Keio University). All
+ * Rights Reserved. This program is distributed under the W3C's Software
+ * Intellectual Property License. This program is distributed in the
+ * hope that it will be useful, but WITHOUT ANY WARRANTY; without even
+ * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+ * PURPOSE. See W3C License http://www.w3.org/Consortium/Legal/ for more
+ * details.
+ */
+
+package org.w3c.dom.html;
+
+import org.w3c.dom.DOMException;
+
+/**
+ * The create* and delete* methods on the table allow authors to construct
+ * and modify tables. HTML 4.0 specifies that only one of each of the
+ * <code>CAPTION</code> , <code>THEAD</code> , and <code>TFOOT</code>
+ * elements may exist in a table. Therefore, if one exists, and the
+ * createTHead() or createTFoot() method is called, the method returns the
+ * existing THead or TFoot element. See the TABLE element definition in HTML
+ * 4.0.
+ * <p>See also the <a href='http://www.w3.org/TR/2000/CR-DOM-Level-2-20000510'>Document Object Model (DOM) Level 2 Specification</a>.
+ */
+public interface HTMLTableElement extends HTMLElement {
+ /**
+ * Returns the table's <code>CAPTION</code> , or void if none exists.
+ */
+ public HTMLTableCaptionElement getCaption();
+ public void setCaption(HTMLTableCaptionElement caption);
+
+ /**
+ * Returns the table's <code>THEAD</code> , or <code>null</code> if none
+ * exists.
+ */
+ public HTMLTableSectionElement getTHead();
+ public void setTHead(HTMLTableSectionElement tHead);
+
+ /**
+ * Returns the table's <code>TFOOT</code> , or <code>null</code> if none
+ * exists.
+ */
+ public HTMLTableSectionElement getTFoot();
+ public void setTFoot(HTMLTableSectionElement tFoot);
+
+ /**
+ * Returns a collection of all the rows in the table, including all in
+ * <code>THEAD</code> , <code>TFOOT</code> , all <code>TBODY</code>
+ * elements.
+ */
+ public HTMLCollection getRows();
+
+ /**
+ * Returns a collection of the defined table bodies.
+ */
+ public HTMLCollection getTBodies();
+
+ /**
+ * Specifies the table's position with respect to the rest of the
+ * document. See the align attribute definition in HTML 4.0. This
+ * attribute is deprecated in HTML 4.0.
+ */
+ public String getAlign();
+ public void setAlign(String align);
+
+ /**
+ * Cell background color. See the bgcolor attribute definition in HTML
+ * 4.0. This attribute is deprecated in HTML 4.0.
+ */
+ public String getBgColor();
+ public void setBgColor(String bgColor);
+
+ /**
+ * The width of the border around the table. See the border attribute
+ * definition in HTML 4.0.
+ */
+ public String getBorder();
+ public void setBorder(String border);
+
+ /**
+ * Specifies the horizontal and vertical space between cell content and
+ * cell borders. See the cellpadding attribute definition in HTML 4.0.
+ */
+ public String getCellPadding();
+ public void setCellPadding(String cellPadding);
+
+ /**
+ * Specifies the horizontal and vertical separation between cells. See
+ * the cellspacing attribute definition in HTML 4.0.
+ */
+ public String getCellSpacing();
+ public void setCellSpacing(String cellSpacing);
+
+ /**
+ * Specifies which external table borders to render. See the frame
+ * attribute definition in HTML 4.0.
+ */
+ public String getFrame();
+ public void setFrame(String frame);
+
+ /**
+ * Specifies which internal table borders to render. See the rules
+ * attribute definition in HTML 4.0.
+ */
+ public String getRules();
+ public void setRules(String rules);
+
+ /**
+ * Description about the purpose or structure of a table. See the
+ * summary attribute definition in HTML 4.0.
+ */
+ public String getSummary();
+ public void setSummary(String summary);
+
+ /**
+ * Specifies the desired table width. See the width attribute definition
+ * in HTML 4.0.
+ */
+ public String getWidth();
+ public void setWidth(String width);
+
+ /**
+ * Create a table header row or return an existing one.
+ * @return A new table header element (<code>THEAD</code> ).
+ */
+ public HTMLElement createTHead();
+
+ /**
+ * Delete the header from the table, if one exists.
+ */
+ public void deleteTHead();
+
+ /**
+ * Create a table footer row or return an existing one.
+ * @return A footer element (<code>TFOOT</code> ).
+ */
+ public HTMLElement createTFoot();
+
+ /**
+ * Delete the footer from the table, if one exists.
+ */
+ public void deleteTFoot();
+
+ /**
+ * Create a new table caption object or return an existing one.
+ * @return A <code>CAPTION</code> element.
+ */
+ public HTMLElement createCaption();
+
+ /**
+ * Delete the table caption, if one exists.
+ */
+ public void deleteCaption();
+
+ /**
+ * Insert a new empty row in the table. The new row is inserted
+ * immediately before and in the same section as the current
+ * <code>index</code> th row in the table. If <code>index</code> is equal
+ * to the number of rows, the new row is appended. In addition, when the
+ * table is empty the row is inserted into a <code>TBODY</code> which is
+ * created and inserted into the table. Note. A table row cannot be empty
+ * according to HTML 4.0 Recommendation.
+ * @param index The row number where to insert a new row. This index
+ * starts from 0 and is relative to all the rows contained inside the
+ * table, regardless of section parentage.
+ * @return The newly created row.
+ * @exception DOMException
+ * INDEX_SIZE_ERR: Raised if the specified index is greater than the
+ * number of rows or if the index is negative.
+ */
+ public HTMLElement insertRow(int index)
+ throws DOMException;
+
+ /**
+ * Delete a table row.
+ * @param index The index of the row to be deleted. This index starts
+ * from 0 and is relative to all the rows contained inside the table,
+ * regardless of section parentage.
+ * @exception DOMException
+ * INDEX_SIZE_ERR: Raised if the specified index is greater than or
+ * equal to the number of rows or if the index is negative.
+ */
+ public void deleteRow(int index)
+ throws DOMException;
+
+}
+
diff --git a/external/jaxp/source/org/w3c/dom/html/HTMLTableRowElement.java b/external/jaxp/source/org/w3c/dom/html/HTMLTableRowElement.java
new file mode 100755
index 000000000..a15f06f0a
--- /dev/null
+++ b/external/jaxp/source/org/w3c/dom/html/HTMLTableRowElement.java
@@ -0,0 +1,103 @@
+/*
+ * Copyright (c) 2000 World Wide Web Consortium,
+ * (Massachusetts Institute of Technology, Institut National de
+ * Recherche en Informatique et en Automatique, Keio University). All
+ * Rights Reserved. This program is distributed under the W3C's Software
+ * Intellectual Property License. This program is distributed in the
+ * hope that it will be useful, but WITHOUT ANY WARRANTY; without even
+ * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+ * PURPOSE. See W3C License http://www.w3.org/Consortium/Legal/ for more
+ * details.
+ */
+
+package org.w3c.dom.html;
+
+import org.w3c.dom.DOMException;
+
+/**
+ * A row in a table. See the TR element definition in HTML 4.0.
+ * <p>See also the <a href='http://www.w3.org/TR/2000/CR-DOM-Level-2-20000510'>Document Object Model (DOM) Level 2 Specification</a>.
+ */
+public interface HTMLTableRowElement extends HTMLElement {
+ /**
+ * The index of this row, relative to the entire table, starting from 0.
+ * This is in document tree order and not display order. The
+ * <code>rowIndex</code> does not take into account sections (
+ * <code>THEAD</code> , <code>TFOOT</code> , or <code>TBODY</code> )
+ * within the table.
+ */
+ public int getRowIndex();
+
+ /**
+ * The index of this row, relative to the current section (
+ * <code>THEAD</code> , <code>TFOOT</code> , or <code>TBODY</code> ),
+ * starting from 0.
+ */
+ public int getSectionRowIndex();
+
+ /**
+ * The collection of cells in this row.
+ */
+ public HTMLCollection getCells();
+
+ /**
+ * Horizontal alignment of data within cells of this row. See the align
+ * attribute definition in HTML 4.0.
+ */
+ public String getAlign();
+ public void setAlign(String align);
+
+ /**
+ * Background color for rows. See the bgcolor attribute definition in
+ * HTML 4.0. This attribute is deprecated in HTML 4.0.
+ */
+ public String getBgColor();
+ public void setBgColor(String bgColor);
+
+ /**
+ * Alignment character for cells in a column. See the char attribute
+ * definition in HTML 4.0.
+ */
+ public String getCh();
+ public void setCh(String ch);
+
+ /**
+ * Offset of alignment character. See the charoff attribute definition
+ * in HTML 4.0.
+ */
+ public String getChOff();
+ public void setChOff(String chOff);
+
+ /**
+ * Vertical alignment of data within cells of this row. See the valign
+ * attribute definition in HTML 4.0.
+ */
+ public String getVAlign();
+ public void setVAlign(String vAlign);
+
+ /**
+ * Insert an empty <code>TD</code> cell into this row. If
+ * <code>index</code> is equal to the number of cells, the new cell is
+ * appended
+ * @param index The place to insert the cell, starting from 0.
+ * @return The newly created cell.
+ * @exception DOMException
+ * INDEX_SIZE_ERR: Raised if the specified <code>index</code> is
+ * greater than the number of cells or if the index is negative.
+ */
+ public HTMLElement insertCell(int index)
+ throws DOMException;
+
+ /**
+ * Delete a cell from the current row.
+ * @param index The index of the cell to delete, starting from 0.
+ * @exception DOMException
+ * INDEX_SIZE_ERR: Raised if the specified <code>index</code> is
+ * greater than or equal to the number of cells or if the index is
+ * negative.
+ */
+ public void deleteCell(int index)
+ throws DOMException;
+
+}
+
diff --git a/external/jaxp/source/org/w3c/dom/html/HTMLTableSectionElement.java b/external/jaxp/source/org/w3c/dom/html/HTMLTableSectionElement.java
new file mode 100755
index 000000000..99bff3591
--- /dev/null
+++ b/external/jaxp/source/org/w3c/dom/html/HTMLTableSectionElement.java
@@ -0,0 +1,85 @@
+/*
+ * Copyright (c) 2000 World Wide Web Consortium,
+ * (Massachusetts Institute of Technology, Institut National de
+ * Recherche en Informatique et en Automatique, Keio University). All
+ * Rights Reserved. This program is distributed under the W3C's Software
+ * Intellectual Property License. This program is distributed in the
+ * hope that it will be useful, but WITHOUT ANY WARRANTY; without even
+ * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+ * PURPOSE. See W3C License http://www.w3.org/Consortium/Legal/ for more
+ * details.
+ */
+
+package org.w3c.dom.html;
+
+import org.w3c.dom.DOMException;
+
+/**
+ * The <code>THEAD</code> , <code>TFOOT</code> , and <code>TBODY</code>
+ * elements.
+ * <p>See also the <a href='http://www.w3.org/TR/2000/CR-DOM-Level-2-20000510'>Document Object Model (DOM) Level 2 Specification</a>.
+ */
+public interface HTMLTableSectionElement extends HTMLElement {
+ /**
+ * Horizontal alignment of data in cells. See the <code>align</code>
+ * attribute for HTMLTheadElement for details.
+ */
+ public String getAlign();
+ public void setAlign(String align);
+
+ /**
+ * Alignment character for cells in a column. See the char attribute
+ * definition in HTML 4.0.
+ */
+ public String getCh();
+ public void setCh(String ch);
+
+ /**
+ * Offset of alignment character. See the charoff attribute definition
+ * in HTML 4.0.
+ */
+ public String getChOff();
+ public void setChOff(String chOff);
+
+ /**
+ * Vertical alignment of data in cells. See the <code>valign</code>
+ * attribute for HTMLTheadElement for details.
+ */
+ public String getVAlign();
+ public void setVAlign(String vAlign);
+
+ /**
+ * The collection of rows in this table section.
+ */
+ public HTMLCollection getRows();
+
+ /**
+ * Insert a row into this section. The new row is inserted immediately
+ * before the current <code>index</code> th row in this section. If
+ * <code>index</code> is equal to the number of rows in this section, the
+ * new row is appended.
+ * @param index The row number where to insert a new row. This index
+ * starts from 0 and is relative only to the rows contained inside this
+ * section, not all the rows in the table.
+ * @return The newly created row.
+ * @exception DOMException
+ * INDEX_SIZE_ERR: Raised if the specified index is greater than the
+ * number of rows of if the index is neagative.
+ */
+ public HTMLElement insertRow(int index)
+ throws DOMException;
+
+ /**
+ * Delete a row from this section.
+ * @param index The index of the row to be deleted. This index starts
+ * from 0 and is relative only to the rows contained inside this
+ * section, not all the rows in the table.
+ * @exception DOMException
+ * INDEX_SIZE_ERR: Raised if the specified index is greater than or
+ * equal to the number of rows or if the index is negative.
+ */
+ public void deleteRow(int index)
+ throws DOMException;
+
+}
+
diff --git a/external/jaxp/source/org/w3c/dom/html/HTMLTextAreaElement.java b/external/jaxp/source/org/w3c/dom/html/HTMLTextAreaElement.java
new file mode 100755
index 000000000..b189a968d
--- /dev/null
+++ b/external/jaxp/source/org/w3c/dom/html/HTMLTextAreaElement.java
@@ -0,0 +1,114 @@
+/*
+ * Copyright (c) 2000 World Wide Web Consortium,
+ * (Massachusetts Institute of Technology, Institut National de
+ * Recherche en Informatique et en Automatique, Keio University). All
+ * Rights Reserved. This program is distributed under the W3C's Software
+ * Intellectual Property License. This program is distributed in the
+ * hope that it will be useful, but WITHOUT ANY WARRANTY; without even
+ * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+ * PURPOSE. See W3C License http://www.w3.org/Consortium/Legal/ for more
+ * details.
+ */
+
+package org.w3c.dom.html;
+
+/**
+ * Multi-line text field. See the TEXTAREA element definition in HTML 4.0.
+ * <p>See also the <a href='http://www.w3.org/TR/2000/CR-DOM-Level-2-20000510'>Document Object Model (DOM) Level 2 Specification</a>.
+ */
+public interface HTMLTextAreaElement extends HTMLElement {
+ /**
+ * Represents the contents of the element. The value of this attribute
+ * does not change if the contents of the corresponding form control, in
+ * an interactive user agent, changes. Changing this attribute, however,
+ * resets the contents of the form control.
+ */
+ public String getDefaultValue();
+ public void setDefaultValue(String defaultValue);
+
+ /**
+ * Returns the <code>FORM</code> element containing this control. Returns
+ * <code>null</code> if this control is not within the context of a form.
+ */
+ public HTMLFormElement getForm();
+
+ /**
+ * A single character access key to give access to the form control. See
+ * the accesskey attribute definition in HTML 4.0.
+ */
+ public String getAccessKey();
+ public void setAccessKey(String accessKey);
+
+ /**
+ * Width of control (in characters). See the cols attribute definition
+ * in HTML 4.0.
+ */
+ public int getCols();
+ public void setCols(int cols);
+
+ /**
+ * The control is unavailable in this context. See the disabled
+ * attribute definition in HTML 4.0.
+ */
+ public boolean getDisabled();
+ public void setDisabled(boolean disabled);
+
+ /**
+ * Form control or object name when submitted with a form. See the name
+ * attribute definition in HTML 4.0.
+ */
+ public String getName();
+ public void setName(String name);
+
+ /**
+ * This control is read-only. See the readonly attribute definition in
+ * HTML 4.0.
+ */
+ public boolean getReadOnly();
+ public void setReadOnly(boolean readOnly);
+
+ /**
+ * Number of text rows. See the rows attribute definition in HTML 4.0.
+ */
+ public int getRows();
+ public void setRows(int rows);
+
+ /**
+ * Index that represents the element's position in the tabbing order. See
+ * the tabindex attribute definition in HTML 4.0.
+ */
+ public int getTabIndex();
+ public void setTabIndex(int tabIndex);
+
+ /**
+ * The type of this form control. This the string "textarea".
+ */
+ public String getType();
+
+ /**
+ * Represents the current contents of the corresponding form control, in
+ * an interactive user agent. Changing this attribute changes the
+ * contents of the form control, but does not change the contents of the
+ * element. If the entirety of the data can not fit into a single
+ * <code>DOMString</code> , the implementation may truncate the data.
+ */
+ public String getValue();
+ public void setValue(String value);
+
+ /**
+ * Removes keyboard focus from this element.
+ */
+ public void blur();
+
+ /**
+ * Gives keyboard focus to this element.
+ */
+ public void focus();
+
+ /**
+ * Select the contents of the <code>TEXTAREA</code> .
+ */
+ public void select();
+
+}
+
diff --git a/external/jaxp/source/org/w3c/dom/html/HTMLTitleElement.java b/external/jaxp/source/org/w3c/dom/html/HTMLTitleElement.java
new file mode 100755
index 000000000..9a2b1ff1d
--- /dev/null
+++ b/external/jaxp/source/org/w3c/dom/html/HTMLTitleElement.java
@@ -0,0 +1,27 @@
+/*
+ * Copyright (c) 2000 World Wide Web Consortium,
+ * (Massachusetts Institute of Technology, Institut National de
+ * Recherche en Informatique et en Automatique, Keio University). All
+ * Rights Reserved. This program is distributed under the W3C's Software
+ * Intellectual Property License. This program is distributed in the
+ * hope that it will be useful, but WITHOUT ANY WARRANTY; without even
+ * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+ * PURPOSE. See W3C License http://www.w3.org/Consortium/Legal/ for more
+ * details.
+ */
+
+package org.w3c.dom.html;
+
+/**
+ * The document title. See the TITLE element definition in HTML 4.0.
+ * <p>See also the <a href='http://www.w3.org/TR/2000/CR-DOM-Level-2-20000510'>Document Object Model (DOM) Level 2 Specification</a>.
+ */
+public interface HTMLTitleElement extends HTMLElement {
+ /**
+ * The specified title as a string.
+ */
+ public String getText();
+ public void setText(String text);
+
+}
+
diff --git a/external/jaxp/source/org/w3c/dom/html/HTMLUListElement.java b/external/jaxp/source/org/w3c/dom/html/HTMLUListElement.java
new file mode 100755
index 000000000..dac1789d9
--- /dev/null
+++ b/external/jaxp/source/org/w3c/dom/html/HTMLUListElement.java
@@ -0,0 +1,35 @@
+/*
+ * Copyright (c) 2000 World Wide Web Consortium,
+ * (Massachusetts Institute of Technology, Institut National de
+ * Recherche en Informatique et en Automatique, Keio University). All
+ * Rights Reserved. This program is distributed under the W3C's Software
+ * Intellectual Property License. This program is distributed in the
+ * hope that it will be useful, but WITHOUT ANY WARRANTY; without even
+ * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+ * PURPOSE. See W3C License http://www.w3.org/Consortium/Legal/ for more
+ * details.
+ */
+
+package org.w3c.dom.html;
+
+/**
+ * Unordered list. See the UL element definition in HTML 4.0.
+ * <p>See also the <a href='http://www.w3.org/TR/2000/CR-DOM-Level-2-20000510'>Document Object Model (DOM) Level 2 Specification</a>.
+ */
+public interface HTMLUListElement extends HTMLElement {
+ /**
+ * Reduce spacing between list items. See the compact attribute
+ * definition in HTML 4.0. This attribute is deprecated in HTML 4.0.
+ */
+ public boolean getCompact();
+ public void setCompact(boolean compact);
+
+ /**
+ * Bullet style. See the type attribute definition in HTML 4.0. This
+ * attribute is deprecated in HTML 4.0.
+ */
+ public String getType();
+ public void setType(String type);
+
+}
+
diff --git a/external/jaxp/source/org/w3c/dom/html/package.html b/external/jaxp/source/org/w3c/dom/html/package.html
new file mode 100755
index 000000000..f1dca68d2
--- /dev/null
+++ b/external/jaxp/source/org/w3c/dom/html/package.html
@@ -0,0 +1,8 @@
+<html><head>
+<title>yadda yadda</title>
+</head><body>
+
+<p>Supports the optional "HTML" feature of the
+second DOM Level 2 Candidate Recommendation. </p>
+
+</body></html>
diff --git a/external/jaxp/source/org/w3c/dom/package.html b/external/jaxp/source/org/w3c/dom/package.html
new file mode 100755
index 000000000..b333acec6
--- /dev/null
+++ b/external/jaxp/source/org/w3c/dom/package.html
@@ -0,0 +1,9 @@
+<html><head>
+<title>DOM Level 2</title>
+</head><body>
+
+<p>Contains the core and "XML" feature set of the
+<a href="http://www.w3.org/TR/2000/REC-DOM-Level-2-core-20001113/">
+DOM Level 2</a> Recommendation. </p>
+
+</body></html>
diff --git a/external/jaxp/source/org/w3c/dom/ranges/DocumentRange.java b/external/jaxp/source/org/w3c/dom/ranges/DocumentRange.java
new file mode 100644
index 000000000..6b522670e
--- /dev/null
+++ b/external/jaxp/source/org/w3c/dom/ranges/DocumentRange.java
@@ -0,0 +1,33 @@
+/*
+ * Copyright (c) 2000 World Wide Web Consortium,
+ * (Massachusetts Institute of Technology, Institut National de
+ * Recherche en Informatique et en Automatique, Keio University). All
+ * Rights Reserved. This program is distributed under the W3C's Software
+ * Intellectual Property License. This program is distributed in the
+ * hope that it will be useful, but WITHOUT ANY WARRANTY; without even
+ * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+ * PURPOSE.
+ * See W3C License http://www.w3.org/Consortium/Legal/ for more details.
+ */
+
+package org.w3c.dom.ranges;
+
+/**
+ * <p>See also the <a href='http://www.w3.org/TR/2000/REC-DOM-Level-2-Traversal-Range-20001113'>Document Object Model (DOM) Level 2 Traversal and Range Specification</a>.
+ * @since DOM Level 2
+ */
+public interface DocumentRange {
+ /**
+ * This interface can be obtained from the object implementing the
+ * <code>Document</code> interface using binding-specific casting
+ * methods.
+ * @return The initial state of the Range returned from this method is
+ * such that both of its boundary-points are positioned at the
+ * beginning of the corresponding Document, before any content. The
+ * Range returned can only be used to select content associated with
+ * this Document, or with DocumentFragments and Attrs for which this
+ * Document is the <code>ownerDocument</code>.
+ */
+ public Range createRange();
+
+}
diff --git a/external/jaxp/source/org/w3c/dom/ranges/Range.java b/external/jaxp/source/org/w3c/dom/ranges/Range.java
new file mode 100644
index 000000000..a576b4dd6
--- /dev/null
+++ b/external/jaxp/source/org/w3c/dom/ranges/Range.java
@@ -0,0 +1,416 @@
+/*
+ * Copyright (c) 2000 World Wide Web Consortium,
+ * (Massachusetts Institute of Technology, Institut National de
+ * Recherche en Informatique et en Automatique, Keio University). All
+ * Rights Reserved. This program is distributed under the W3C's Software
+ * Intellectual Property License. This program is distributed in the
+ * hope that it will be useful, but WITHOUT ANY WARRANTY; without even
+ * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+ * PURPOSE.
+ * See W3C License http://www.w3.org/Consortium/Legal/ for more details.
+ */
+
+package org.w3c.dom.ranges;
+
+import org.w3c.dom.Node;
+import org.w3c.dom.DOMException;
+import org.w3c.dom.DocumentFragment;
+
+/**
+ * <p>See also the <a href='http://www.w3.org/TR/2000/REC-DOM-Level-2-Traversal-Range-20001113'>Document Object Model (DOM) Level 2 Traversal and Range Specification</a>.
+ * @since DOM Level 2
+ */
+public interface Range {
+ /**
+ * Node within which the Range begins
+ * @exception DOMException
+ * INVALID_STATE_ERR: Raised if <code>detach()</code> has already been
+ * invoked on this object.
+ */
+ public Node getStartContainer()
+ throws DOMException;
+
+ /**
+ * Offset within the starting node of the Range.
+ * @exception DOMException
+ * INVALID_STATE_ERR: Raised if <code>detach()</code> has already been
+ * invoked on this object.
+ */
+ public int getStartOffset()
+ throws DOMException;
+
+ /**
+ * Node within which the Range ends
+ * @exception DOMException
+ * INVALID_STATE_ERR: Raised if <code>detach()</code> has already been
+ * invoked on this object.
+ */
+ public Node getEndContainer()
+ throws DOMException;
+
+ /**
+ * Offset within the ending node of the Range.
+ * @exception DOMException
+ * INVALID_STATE_ERR: Raised if <code>detach()</code> has already been
+ * invoked on this object.
+ */
+ public int getEndOffset()
+ throws DOMException;
+
+ /**
+ * TRUE if the Range is collapsed
+ * @exception DOMException
+ * INVALID_STATE_ERR: Raised if <code>detach()</code> has already been
+ * invoked on this object.
+ */
+ public boolean getCollapsed()
+ throws DOMException;
+
+ /**
+ * The deepest common ancestor container of the Range's two
+ * boundary-points.
+ * @exception DOMException
+ * INVALID_STATE_ERR: Raised if <code>detach()</code> has already been
+ * invoked on this object.
+ */
+ public Node getCommonAncestorContainer()
+ throws DOMException;
+
+ /**
+ * Sets the attributes describing the start of the Range.
+ * @param refNode The <code>refNode</code> value. This parameter must be
+ * different from <code>null</code>.
+ * @param offset The <code>startOffset</code> value.
+ * @exception RangeException
+ * INVALID_NODE_TYPE_ERR: Raised if <code>refNode</code> or an ancestor
+ * of <code>refNode</code> is an Entity, Notation, or DocumentType
+ * node.
+ * @exception DOMException
+ * INDEX_SIZE_ERR: Raised if <code>offset</code> is negative or greater
+ * than the number of child units in <code>refNode</code>. Child units
+ * are 16-bit units if <code>refNode</code> is a type of CharacterData
+ * node (e.g., a Text or Comment node) or a ProcessingInstruction
+ * node. Child units are Nodes in all other cases.
+ * <br>INVALID_STATE_ERR: Raised if <code>detach()</code> has already
+ * been invoked on this object.
+ * <br>WRONG_DOCUMENT_ERR: Raised if <code>refNode</code> was created
+ * from a different document than the one that created this range.
+ */
+ public void setStart(Node refNode,
+ int offset)
+ throws RangeException, DOMException;
+
+ /**
+ * Sets the attributes describing the end of a Range.
+ * @param refNode The <code>refNode</code> value. This parameter must be
+ * different from <code>null</code>.
+ * @param offset The <code>endOffset</code> value.
+ * @exception RangeException
+ * INVALID_NODE_TYPE_ERR: Raised if <code>refNode</code> or an ancestor
+ * of <code>refNode</code> is an Entity, Notation, or DocumentType
+ * node.
+ * @exception DOMException
+ * INDEX_SIZE_ERR: Raised if <code>offset</code> is negative or greater
+ * than the number of child units in <code>refNode</code>. Child units
+ * are 16-bit units if <code>refNode</code> is a type of CharacterData
+ * node (e.g., a Text or Comment node) or a ProcessingInstruction
+ * node. Child units are Nodes in all other cases.
+ * <br>INVALID_STATE_ERR: Raised if <code>detach()</code> has already
+ * been invoked on this object.
+ * <br>WRONG_DOCUMENT_ERR: Raised if <code>refNode</code> was created
+ * from a different document than the one that created this range.
+ */
+ public void setEnd(Node refNode,
+ int offset)
+ throws RangeException, DOMException;
+
+ /**
+ * Sets the start position to be before a node
+ * @param refNode Range starts before <code>refNode</code>
+ * @exception RangeException
+ * INVALID_NODE_TYPE_ERR: Raised if the root container of
+ * <code>refNode</code> is not an Attr, Document, or DocumentFragment
+ * node or if <code>refNode</code> is a Document, DocumentFragment,
+ * Attr, Entity, or Notation node.
+ * @exception DOMException
+ * INVALID_STATE_ERR: Raised if <code>detach()</code> has already been
+ * invoked on this object.
+ * <br>WRONG_DOCUMENT_ERR: Raised if <code>refNode</code> was created
+ * from a different document than the one that created this range.
+ */
+ public void setStartBefore(Node refNode)
+ throws RangeException, DOMException;
+
+ /**
+ * Sets the start position to be after a node
+ * @param refNode Range starts after <code>refNode</code>
+ * @exception RangeException
+ * INVALID_NODE_TYPE_ERR: Raised if the root container of
+ * <code>refNode</code> is not an Attr, Document, or DocumentFragment
+ * node or if <code>refNode</code> is a Document, DocumentFragment,
+ * Attr, Entity, or Notation node.
+ * @exception DOMException
+ * INVALID_STATE_ERR: Raised if <code>detach()</code> has already been
+ * invoked on this object.
+ * <br>WRONG_DOCUMENT_ERR: Raised if <code>refNode</code> was created
+ * from a different document than the one that created this range.
+ */
+ public void setStartAfter(Node refNode)
+ throws RangeException, DOMException;
+
+ /**
+ * Sets the end position to be before a node.
+ * @param refNode Range ends before <code>refNode</code>
+ * @exception RangeException
+ * INVALID_NODE_TYPE_ERR: Raised if the root container of
+ * <code>refNode</code> is not an Attr, Document, or DocumentFragment
+ * node or if <code>refNode</code> is a Document, DocumentFragment,
+ * Attr, Entity, or Notation node.
+ * @exception DOMException
+ * INVALID_STATE_ERR: Raised if <code>detach()</code> has already been
+ * invoked on this object.
+ * <br>WRONG_DOCUMENT_ERR: Raised if <code>refNode</code> was created
+ * from a different document than the one that created this range.
+ */
+ public void setEndBefore(Node refNode)
+ throws RangeException, DOMException;
+
+ /**
+ * Sets the end of a Range to be after a node
+ * @param refNode Range ends after <code>refNode</code>.
+ * @exception RangeException
+ * INVALID_NODE_TYPE_ERR: Raised if the root container of
+ * <code>refNode</code> is not an Attr, Document or DocumentFragment
+ * node or if <code>refNode</code> is a Document, DocumentFragment,
+ * Attr, Entity, or Notation node.
+ * @exception DOMException
+ * INVALID_STATE_ERR: Raised if <code>detach()</code> has already been
+ * invoked on this object.
+ * <br>WRONG_DOCUMENT_ERR: Raised if <code>refNode</code> was created
+ * from a different document than the one that created this range.
+ */
+ public void setEndAfter(Node refNode)
+ throws RangeException, DOMException;
+
+ /**
+ * Collapse a Range onto one of its boundary-points
+ * @param toStart If TRUE, collapses the Range onto its start; if FALSE,
+ * collapses it onto its end.
+ * @exception DOMException
+ * INVALID_STATE_ERR: Raised if <code>detach()</code> has already been
+ * invoked on this object.
+ */
+ public void collapse(boolean toStart)
+ throws DOMException;
+
+ /**
+ * Select a node and its contents
+ * @param refNode The node to select.
+ * @exception RangeException
+ * INVALID_NODE_TYPE_ERR: Raised if an ancestor of <code>refNode</code>
+ * is an Entity, Notation or DocumentType node or if
+ * <code>refNode</code> is a Document, DocumentFragment, Attr, Entity,
+ * or Notation node.
+ * @exception DOMException
+ * INVALID_STATE_ERR: Raised if <code>detach()</code> has already been
+ * invoked on this object.
+ * <br>WRONG_DOCUMENT_ERR: Raised if <code>refNode</code> was created
+ * from a different document than the one that created this range.
+ */
+ public void selectNode(Node refNode)
+ throws RangeException, DOMException;
+
+ /**
+ * Select the contents within a node
+ * @param refNode Node to select from
+ * @exception RangeException
+ * INVALID_NODE_TYPE_ERR: Raised if <code>refNode</code> or an ancestor
+ * of <code>refNode</code> is an Entity, Notation or DocumentType node.
+ * @exception DOMException
+ * INVALID_STATE_ERR: Raised if <code>detach()</code> has already been
+ * invoked on this object.
+ * <br>WRONG_DOCUMENT_ERR: Raised if <code>refNode</code> was created
+ * from a different document than the one that created this range.
+ */
+ public void selectNodeContents(Node refNode)
+ throws RangeException, DOMException;
+
+ // CompareHow
+ /**
+ * Compare start boundary-point of <code>sourceRange</code> to start
+ * boundary-point of Range on which <code>compareBoundaryPoints</code>
+ * is invoked.
+ */
+ public static final short START_TO_START = 0;
+ /**
+ * Compare start boundary-point of <code>sourceRange</code> to end
+ * boundary-point of Range on which <code>compareBoundaryPoints</code>
+ * is invoked.
+ */
+ public static final short START_TO_END = 1;
+ /**
+ * Compare end boundary-point of <code>sourceRange</code> to end
+ * boundary-point of Range on which <code>compareBoundaryPoints</code>
+ * is invoked.
+ */
+ public static final short END_TO_END = 2;
+ /**
+ * Compare end boundary-point of <code>sourceRange</code> to start
+ * boundary-point of Range on which <code>compareBoundaryPoints</code>
+ * is invoked.
+ */
+ public static final short END_TO_START = 3;
+
+ /**
+ * Compare the boundary-points of two Ranges in a document.
+ * @param how A code representing the type of comparison, as defined
+ * above.
+ * @param sourceRange The <code>Range</code> on which this current
+ * <code>Range</code> is compared to.
+ * @return -1, 0 or 1 depending on whether the corresponding
+ * boundary-point of the Range is respectively before, equal to, or
+ * after the corresponding boundary-point of <code>sourceRange</code>.
+ * @exception DOMException
+ * WRONG_DOCUMENT_ERR: Raised if the two Ranges are not in the same
+ * Document or DocumentFragment.
+ * <br>INVALID_STATE_ERR: Raised if <code>detach()</code> has already
+ * been invoked on this object.
+ */
+ public short compareBoundaryPoints(short how,
+ Range sourceRange)
+ throws DOMException;
+
+ /**
+ * Removes the contents of a Range from the containing document or
+ * document fragment without returning a reference to the removed
+ * content.
+ * @exception DOMException
+ * NO_MODIFICATION_ALLOWED_ERR: Raised if any portion of the content of
+ * the Range is read-only or any of the nodes that contain any of the
+ * content of the Range are read-only.
+ * <br>INVALID_STATE_ERR: Raised if <code>detach()</code> has already
+ * been invoked on this object.
+ */
+ public void deleteContents()
+ throws DOMException;
+
+ /**
+ * Moves the contents of a Range from the containing document or document
+ * fragment to a new DocumentFragment.
+ * @return A DocumentFragment containing the extracted contents.
+ * @exception DOMException
+ * NO_MODIFICATION_ALLOWED_ERR: Raised if any portion of the content of
+ * the Range is read-only or any of the nodes which contain any of the
+ * content of the Range are read-only.
+ * <br>HIERARCHY_REQUEST_ERR: Raised if a DocumentType node would be
+ * extracted into the new DocumentFragment.
+ * <br>INVALID_STATE_ERR: Raised if <code>detach()</code> has already
+ * been invoked on this object.
+ */
+ public DocumentFragment extractContents()
+ throws DOMException;
+
+ /**
+ * Duplicates the contents of a Range
+ * @return A DocumentFragment that contains content equivalent to this
+ * Range.
+ * @exception DOMException
+ * HIERARCHY_REQUEST_ERR: Raised if a DocumentType node would be
+ * extracted into the new DocumentFragment.
+ * <br>INVALID_STATE_ERR: Raised if <code>detach()</code> has already
+ * been invoked on this object.
+ */
+ public DocumentFragment cloneContents()
+ throws DOMException;
+
+ /**
+ * Inserts a node into the Document or DocumentFragment at the start of
+ * the Range. If the container is a Text node, this will be split at the
+ * start of the Range (as if the Text node's splitText method was
+ * performed at the insertion point) and the insertion will occur
+ * between the two resulting Text nodes. Adjacent Text nodes will not be
+ * automatically merged. If the node to be inserted is a
+ * DocumentFragment node, the children will be inserted rather than the
+ * DocumentFragment node itself.
+ * @param newNode The node to insert at the start of the Range
+ * @exception DOMException
+ * NO_MODIFICATION_ALLOWED_ERR: Raised if an ancestor container of the
+ * start of the Range is read-only.
+ * <br>WRONG_DOCUMENT_ERR: Raised if <code>newNode</code> and the
+ * container of the start of the Range were not created from the same
+ * document.
+ * <br>HIERARCHY_REQUEST_ERR: Raised if the container of the start of
+ * the Range is of a type that does not allow children of the type of
+ * <code>newNode</code> or if <code>newNode</code> is an ancestor of
+ * the container.
+ * <br>INVALID_STATE_ERR: Raised if <code>detach()</code> has already
+ * been invoked on this object.
+ * @exception RangeException
+ * INVALID_NODE_TYPE_ERR: Raised if <code>newNode</code> is an Attr,
+ * Entity, Notation, or Document node.
+ */
+ public void insertNode(Node newNode)
+ throws DOMException, RangeException;
+
+ /**
+ * Reparents the contents of the Range to the given node and inserts the
+ * node at the position of the start of the Range.
+ * @param newParent The node to surround the contents with.
+ * @exception DOMException
+ * NO_MODIFICATION_ALLOWED_ERR: Raised if an ancestor container of
+ * either boundary-point of the Range is read-only.
+ * <br>WRONG_DOCUMENT_ERR: Raised if <code> newParent</code> and the
+ * container of the start of the Range were not created from the same
+ * document.
+ * <br>HIERARCHY_REQUEST_ERR: Raised if the container of the start of
+ * the Range is of a type that does not allow children of the type of
+ * <code>newParent</code> or if <code>newParent</code> is an ancestor
+ * of the container or if <code>node</code> would end up with a child
+ * node of a type not allowed by the type of <code>node</code>.
+ * <br>INVALID_STATE_ERR: Raised if <code>detach()</code> has already
+ * been invoked on this object.
+ * @exception RangeException
+ * BAD_BOUNDARYPOINTS_ERR: Raised if the Range partially selects a
+ * non-text node.
+ * <br>INVALID_NODE_TYPE_ERR: Raised if <code> node</code> is an Attr,
+ * Entity, DocumentType, Notation, Document, or DocumentFragment node.
+ */
+ public void surroundContents(Node newParent)
+ throws DOMException, RangeException;
+
+ /**
+ * Produces a new Range whose boundary-points are equal to the
+ * boundary-points of the Range.
+ * @return The duplicated Range.
+ * @exception DOMException
+ * INVALID_STATE_ERR: Raised if <code>detach()</code> has already been
+ * invoked on this object.
+ */
+ public Range cloneRange()
+ throws DOMException;
+
+ /**
+ * Returns the contents of a Range as a string. This string contains only
+ * the data characters, not any markup.
+ * @return The contents of the Range.
+ * @exception DOMException
+ * INVALID_STATE_ERR: Raised if <code>detach()</code> has already been
+ * invoked on this object.
+ */
+ public String toString()
+ throws DOMException;
+
+ /**
+ * Called to indicate that the Range is no longer in use and that the
+ * implementation may relinquish any resources associated with this
+ * Range. Subsequent calls to any methods or attribute getters on this
+ * Range will result in a <code>DOMException</code> being thrown with an
+ * error code of <code>INVALID_STATE_ERR</code>.
+ * @exception DOMException
+ * INVALID_STATE_ERR: Raised if <code>detach()</code> has already been
+ * invoked on this object.
+ */
+ public void detach()
+ throws DOMException;
+
+}
diff --git a/external/jaxp/source/org/w3c/dom/ranges/RangeException.java b/external/jaxp/source/org/w3c/dom/ranges/RangeException.java
new file mode 100644
index 000000000..551008e5d
--- /dev/null
+++ b/external/jaxp/source/org/w3c/dom/ranges/RangeException.java
@@ -0,0 +1,39 @@
+/*
+ * Copyright (c) 2000 World Wide Web Consortium,
+ * (Massachusetts Institute of Technology, Institut National de
+ * Recherche en Informatique et en Automatique, Keio University). All
+ * Rights Reserved. This program is distributed under the W3C's Software
+ * Intellectual Property License. This program is distributed in the
+ * hope that it will be useful, but WITHOUT ANY WARRANTY; without even
+ * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+ * PURPOSE.
+ * See W3C License http://www.w3.org/Consortium/Legal/ for more details.
+ */
+
+package org.w3c.dom.ranges;
+
+/**
+ * Range operations may throw a <code>RangeException</code> as specified in
+ * their method descriptions.
+ * <p>See also the <a href='http://www.w3.org/TR/2000/REC-DOM-Level-2-Traversal-Range-20001113'>Document Object Model (DOM) Level 2 Traversal and Range Specification</a>.
+ * @since DOM Level 2
+ */
+public class RangeException extends RuntimeException {
+ public RangeException(short code, String message) {
+ super(message);
+ this.code = code;
+ }
+ public short code;
+ // RangeExceptionCode
+ /**
+ * If the boundary-points of a Range do not meet specific requirements.
+ */
+ public static final short BAD_BOUNDARYPOINTS_ERR = 1;
+ /**
+ * If the container of an boundary-point of a Range is being set to either
+ * a node of an invalid type or a node with an ancestor of an invalid
+ * type.
+ */
+ public static final short INVALID_NODE_TYPE_ERR = 2;
+
+}
diff --git a/external/jaxp/source/org/w3c/dom/ranges/package.html b/external/jaxp/source/org/w3c/dom/ranges/package.html
new file mode 100755
index 000000000..cdb9bb792
--- /dev/null
+++ b/external/jaxp/source/org/w3c/dom/ranges/package.html
@@ -0,0 +1,10 @@
+<html><head>
+<title>yadda yadda</title>
+</head><body>
+
+<p>Supports the optional
+<a href="http://www.w3.org/TR/2000/REC-DOM-Level-2-Traversal-Range-20001113/"
+>"Range"</a> feature of the
+DOM Level 2 Recommendation. </p>
+
+</body></html>
diff --git a/external/jaxp/source/org/w3c/dom/stylesheets/DocumentStyle.java b/external/jaxp/source/org/w3c/dom/stylesheets/DocumentStyle.java
new file mode 100755
index 000000000..2270505e7
--- /dev/null
+++ b/external/jaxp/source/org/w3c/dom/stylesheets/DocumentStyle.java
@@ -0,0 +1,34 @@
+/*
+ * Copyright (c) 2000 World Wide Web Consortium,
+ * (Massachusetts Institute of Technology, Institut National de
+ * Recherche en Informatique et en Automatique, Keio University). All
+ * Rights Reserved. This program is distributed under the W3C's Software
+ * Intellectual Property License. This program is distributed in the
+ * hope that it will be useful, but WITHOUT ANY WARRANTY; without even
+ * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+ * PURPOSE.
+ * See W3C License http://www.w3.org/Consortium/Legal/ for more details.
+ */
+
+package org.w3c.dom.stylesheets;
+
+/**
+ * The <code>DocumentStyle</code> interface provides a mechanism by which the
+ * style sheets embedded in a document can be retrieved. The expectation is
+ * that an instance of the <code>DocumentStyle</code> interface can be
+ * obtained by using binding-specific casting methods on an instance of the
+ * <code>Document</code> interface.
+ * <p>See also the <a href='http://www.w3.org/TR/2000/REC-DOM-Level-2-Style-20001113'>Document Object Model (DOM) Level 2 Style Specification</a>.
+ * @since DOM Level 2
+ */
+public interface DocumentStyle {
+ /**
+ * A list containing all the style sheets explicitly linked into or
+ * embedded in a document. For HTML documents, this includes external
+ * style sheets, included via the HTML LINK element, and inline STYLE
+ * elements. In XML, this includes external style sheets, included via
+ * style sheet processing instructions (see ).
+ */
+ public StyleSheetList getStyleSheets();
+
+}
diff --git a/external/jaxp/source/org/w3c/dom/stylesheets/LinkStyle.java b/external/jaxp/source/org/w3c/dom/stylesheets/LinkStyle.java
new file mode 100755
index 000000000..481bd19db
--- /dev/null
+++ b/external/jaxp/source/org/w3c/dom/stylesheets/LinkStyle.java
@@ -0,0 +1,31 @@
+/*
+ * Copyright (c) 2000 World Wide Web Consortium,
+ * (Massachusetts Institute of Technology, Institut National de
+ * Recherche en Informatique et en Automatique, Keio University). All
+ * Rights Reserved. This program is distributed under the W3C's Software
+ * Intellectual Property License. This program is distributed in the
+ * hope that it will be useful, but WITHOUT ANY WARRANTY; without even
+ * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+ * PURPOSE.
+ * See W3C License http://www.w3.org/Consortium/Legal/ for more details.
+ */
+
+package org.w3c.dom.stylesheets;
+
+/**
+ * The <code>LinkStyle</code> interface provides a mechanism by which a style
+ * sheet can be retrieved from the node responsible for linking it into a
+ * document. An instance of the <code>LinkStyle</code> interface can be
+ * obtained using binding-specific casting methods on an instance of a
+ * linking node (<code>HTMLLinkElement</code>, <code>HTMLStyleElement</code>
+ * or <code>ProcessingInstruction</code> in DOM Level 2).
+ * <p>See also the <a href='http://www.w3.org/TR/2000/REC-DOM-Level-2-Style-20001113'>Document Object Model (DOM) Level 2 Style Specification</a>.
+ * @since DOM Level 2
+ */
+public interface LinkStyle {
+ /**
+ * The style sheet.
+ */
+ public StyleSheet getSheet();
+
+}
diff --git a/external/jaxp/source/org/w3c/dom/stylesheets/MediaList.java b/external/jaxp/source/org/w3c/dom/stylesheets/MediaList.java
new file mode 100755
index 000000000..3b10ed213
--- /dev/null
+++ b/external/jaxp/source/org/w3c/dom/stylesheets/MediaList.java
@@ -0,0 +1,90 @@
+/*
+ * Copyright (c) 2000 World Wide Web Consortium,
+ * (Massachusetts Institute of Technology, Institut National de
+ * Recherche en Informatique et en Automatique, Keio University). All
+ * Rights Reserved. This program is distributed under the W3C's Software
+ * Intellectual Property License. This program is distributed in the
+ * hope that it will be useful, but WITHOUT ANY WARRANTY; without even
+ * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+ * PURPOSE.
+ * See W3C License http://www.w3.org/Consortium/Legal/ for more details.
+ */
+
+package org.w3c.dom.stylesheets;
+
+import org.w3c.dom.DOMException;
+
+/**
+ * The <code>MediaList</code> interface provides the abstraction of an
+ * ordered collection of media, without defining or constraining how this
+ * collection is implemented. An empty list is the same as a list that
+ * contains the medium <code>"all"</code>.
+ * <p> The items in the <code>MediaList</code> are accessible via an integral
+ * index, starting from 0.
+ * <p>See also the <a href='http://www.w3.org/TR/2000/REC-DOM-Level-2-Style-20001113'>Document Object Model (DOM) Level 2 Style Specification</a>.
+ * @since DOM Level 2
+ */
+public interface MediaList {
+ /**
+ * The parsable textual representation of the media list. This is a
+ * comma-separated list of media.
+ * @exception DOMException
+ * SYNTAX_ERR: Raised if the specified string value has a syntax error
+ * and is unparsable.
+ * <br>NO_MODIFICATION_ALLOWED_ERR: Raised if this media list is
+ * readonly.
+ */
+ public String getMediaText();
+ /**
+ * The parsable textual representation of the media list. This is a
+ * comma-separated list of media.
+ * @exception DOMException
+ * SYNTAX_ERR: Raised if the specified string value has a syntax error
+ * and is unparsable.
+ * <br>NO_MODIFICATION_ALLOWED_ERR: Raised if this media list is
+ * readonly.
+ */
+ public void setMediaText(String mediaText)
+ throws DOMException;
+
+ /**
+ * The number of media in the list. The range of valid media is
+ * <code>0</code> to <code>length-1</code> inclusive.
+ */
+ public int getLength();
+
+ /**
+ * Returns the <code>index</code>th in the list. If <code>index</code> is
+ * greater than or equal to the number of media in the list, this
+ * returns <code>null</code>.
+ * @param index Index into the collection.
+ * @return The medium at the <code>index</code>th position in the
+ * <code>MediaList</code>, or <code>null</code> if that is not a valid
+ * index.
+ */
+ public String item(int index);
+
+ /**
+ * Deletes the medium indicated by <code>oldMedium</code> from the list.
+ * @param oldMedium The medium to delete in the media list.
+ * @exception DOMException
+ * NO_MODIFICATION_ALLOWED_ERR: Raised if this list is readonly.
+ * <br> NOT_FOUND_ERR: Raised if <code>oldMedium</code> is not in the
+ * list.
+ */
+ public void deleteMedium(String oldMedium)
+ throws DOMException;
+
+ /**
+ * Adds the medium <code>newMedium</code> to the end of the list. If the
+ * <code>newMedium</code> is already used, it is first removed.
+ * @param newMedium The new medium to add.
+ * @exception DOMException
+ * INVALID_CHARACTER_ERR: If the medium contains characters that are
+ * invalid in the underlying style language.
+ * <br> NO_MODIFICATION_ALLOWED_ERR: Raised if this list is readonly.
+ */
+ public void appendMedium(String newMedium)
+ throws DOMException;
+
+}
diff --git a/external/jaxp/source/org/w3c/dom/stylesheets/StyleSheet.java b/external/jaxp/source/org/w3c/dom/stylesheets/StyleSheet.java
new file mode 100755
index 000000000..3da430769
--- /dev/null
+++ b/external/jaxp/source/org/w3c/dom/stylesheets/StyleSheet.java
@@ -0,0 +1,103 @@
+/*
+ * Copyright (c) 2000 World Wide Web Consortium,
+ * (Massachusetts Institute of Technology, Institut National de
+ * Recherche en Informatique et en Automatique, Keio University). All
+ * Rights Reserved. This program is distributed under the W3C's Software
+ * Intellectual Property License. This program is distributed in the
+ * hope that it will be useful, but WITHOUT ANY WARRANTY; without even
+ * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+ * PURPOSE.
+ * See W3C License http://www.w3.org/Consortium/Legal/ for more details.
+ */
+
+package org.w3c.dom.stylesheets;
+
+import org.w3c.dom.Node;
+
+/**
+ * The <code>StyleSheet</code> interface is the abstract base interface for
+ * any type of style sheet. It represents a single style sheet associated
+ * with a structured document. In HTML, the StyleSheet interface represents
+ * either an external style sheet, included via the HTML LINK element, or
+ * an inline STYLE element. In XML, this interface represents an external
+ * style sheet, included via a style sheet processing instruction.
+ * <p>See also the <a href='http://www.w3.org/TR/2000/REC-DOM-Level-2-Style-20001113'>Document Object Model (DOM) Level 2 Style Specification</a>.
+ * @since DOM Level 2
+ */
+public interface StyleSheet {
+ /**
+ * This specifies the style sheet language for this style sheet. The
+ * style sheet language is specified as a content type (e.g.
+ * "text/css"). The content type is often specified in the
+ * <code>ownerNode</code>. Also see the type attribute definition for
+ * the <code>LINK</code> element in HTML 4.0, and the type
+ * pseudo-attribute for the XML style sheet processing instruction.
+ */
+ public String getType();
+
+ /**
+ * <code>false</code> if the style sheet is applied to the document.
+ * <code>true</code> if it is not. Modifying this attribute may cause a
+ * new resolution of style for the document. A stylesheet only applies
+ * if both an appropriate medium definition is present and the disabled
+ * attribute is false. So, if the media doesn't apply to the current
+ * user agent, the <code>disabled</code> attribute is ignored.
+ */
+ public boolean getDisabled();
+ /**
+ * <code>false</code> if the style sheet is applied to the document.
+ * <code>true</code> if it is not. Modifying this attribute may cause a
+ * new resolution of style for the document. A stylesheet only applies
+ * if both an appropriate medium definition is present and the disabled
+ * attribute is false. So, if the media doesn't apply to the current
+ * user agent, the <code>disabled</code> attribute is ignored.
+ */
+ public void setDisabled(boolean disabled);
+
+ /**
+ * The node that associates this style sheet with the document. For HTML,
+ * this may be the corresponding <code>LINK</code> or <code>STYLE</code>
+ * element. For XML, it may be the linking processing instruction. For
+ * style sheets that are included by other style sheets, the value of
+ * this attribute is <code>null</code>.
+ */
+ public Node getOwnerNode();
+
+ /**
+ * For style sheet languages that support the concept of style sheet
+ * inclusion, this attribute represents the including style sheet, if
+ * one exists. If the style sheet is a top-level style sheet, or the
+ * style sheet language does not support inclusion, the value of this
+ * attribute is <code>null</code>.
+ */
+ public StyleSheet getParentStyleSheet();
+
+ /**
+ * If the style sheet is a linked style sheet, the value of its attribute
+ * is its location. For inline style sheets, the value of this attribute
+ * is <code>null</code>. See the href attribute definition for the
+ * <code>LINK</code> element in HTML 4.0, and the href pseudo-attribute
+ * for the XML style sheet processing instruction.
+ */
+ public String getHref();
+
+ /**
+ * The advisory title. The title is often specified in the
+ * <code>ownerNode</code>. See the title attribute definition for the
+ * <code>LINK</code> element in HTML 4.0, and the title pseudo-attribute
+ * for the XML style sheet processing instruction.
+ */
+ public String getTitle();
+
+ /**
+ * The intended destination media for style information. The media is
+ * often specified in the <code>ownerNode</code>. If no media has been
+ * specified, the <code>MediaList</code> will be empty. See the media
+ * attribute definition for the <code>LINK</code> element in HTML 4.0,
+ * and the media pseudo-attribute for the XML style sheet processing
+ * instruction . Modifying the media list may cause a change to the
+ * attribute <code>disabled</code>.
+ */
+ public MediaList getMedia();
+
+}
diff --git a/external/jaxp/source/org/w3c/dom/stylesheets/StyleSheetList.java b/external/jaxp/source/org/w3c/dom/stylesheets/StyleSheetList.java
new file mode 100755
index 000000000..b8f9a4423
--- /dev/null
+++ b/external/jaxp/source/org/w3c/dom/stylesheets/StyleSheetList.java
@@ -0,0 +1,42 @@
+/*
+ * Copyright (c) 2000 World Wide Web Consortium,
+ * (Massachusetts Institute of Technology, Institut National de
+ * Recherche en Informatique et en Automatique, Keio University). All
+ * Rights Reserved. This program is distributed under the W3C's Software
+ * Intellectual Property License. This program is distributed in the
+ * hope that it will be useful, but WITHOUT ANY WARRANTY; without even
+ * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+ * PURPOSE.
+ * See W3C License http://www.w3.org/Consortium/Legal/ for more details.
+ */
+
+package org.w3c.dom.stylesheets;
+
+/**
+ * The <code>StyleSheetList</code> interface provides the abstraction of an
+ * ordered collection of style sheets.
+ * <p> The items in the <code>StyleSheetList</code> are accessible via an
+ * integral index, starting from 0.
+ * <p>See also the <a href='http://www.w3.org/TR/2000/REC-DOM-Level-2-Style-20001113'>Document Object Model (DOM) Level 2 Style Specification</a>.
+ * @since DOM Level 2
+ */
+public interface StyleSheetList {
+ /**
+ * The number of <code>StyleSheets</code> in the list. The range of valid
+ * child stylesheet indices is <code>0</code> to <code>length-1</code>
+ * inclusive.
+ */
+ public int getLength();
+
+ /**
+ * Used to retrieve a style sheet by ordinal index. If index is greater
+ * than or equal to the number of style sheets in the list, this returns
+ * <code>null</code>.
+ * @param index Index into the collection
+ * @return The style sheet at the <code>index</code> position in the
+ * <code>StyleSheetList</code>, or <code>null</code> if that is not a
+ * valid index.
+ */
+ public StyleSheet item(int index);
+
+}
diff --git a/external/jaxp/source/org/w3c/dom/stylesheets/package.html b/external/jaxp/source/org/w3c/dom/stylesheets/package.html
new file mode 100755
index 000000000..8a50000de
--- /dev/null
+++ b/external/jaxp/source/org/w3c/dom/stylesheets/package.html
@@ -0,0 +1,10 @@
+<html><head>
+<title>yadda yadda</title>
+</head><body>
+
+<p>Supports optional
+<a href="http://www.w3.org/TR/2000/REC-DOM-Level-2-Style-20001113/">
+"StyleSheets"</a> features (see the sibling
+CSS package) of the DOM Level 2 Recommendation. </p>
+
+</body></html>
diff --git a/external/jaxp/source/org/w3c/dom/traversal/DocumentTraversal.java b/external/jaxp/source/org/w3c/dom/traversal/DocumentTraversal.java
new file mode 100755
index 000000000..103cde0de
--- /dev/null
+++ b/external/jaxp/source/org/w3c/dom/traversal/DocumentTraversal.java
@@ -0,0 +1,92 @@
+/*
+ * Copyright (c) 2000 World Wide Web Consortium,
+ * (Massachusetts Institute of Technology, Institut National de
+ * Recherche en Informatique et en Automatique, Keio University). All
+ * Rights Reserved. This program is distributed under the W3C's Software
+ * Intellectual Property License. This program is distributed in the
+ * hope that it will be useful, but WITHOUT ANY WARRANTY; without even
+ * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+ * PURPOSE.
+ * See W3C License http://www.w3.org/Consortium/Legal/ for more details.
+ */
+
+package org.w3c.dom.traversal;
+
+import org.w3c.dom.Node;
+import org.w3c.dom.DOMException;
+
+/**
+ * <code>DocumentTraversal</code> contains methods that create
+ * <code>NodeIterators</code> and <code>TreeWalkers</code> to traverse a
+ * node and its children in document order (depth first, pre-order
+ * traversal, which is equivalent to the order in which the start tags occur
+ * in the text representation of the document). In DOMs which support the
+ * Traversal feature, <code>DocumentTraversal</code> will be implemented by
+ * the same objects that implement the Document interface.
+ * <p>See also the <a href='http://www.w3.org/TR/2000/REC-DOM-Level-2-Traversal-Range-20001113'>Document Object Model (DOM) Level 2 Traversal and Range Specification</a>.
+ * @since DOM Level 2
+ */
+public interface DocumentTraversal {
+ /**
+ * Create a new <code>NodeIterator</code> over the subtree rooted at the
+ * specified node.
+ * @param root The node which will be iterated together with its
+ * children. The <code>NodeIterator</code> is initially positioned
+ * just before this node. The <code>whatToShow</code> flags and the
+ * filter, if any, are not considered when setting this position. The
+ * root must not be <code>null</code>.
+ * @param whatToShow This flag specifies which node types may appear in
+ * the logical view of the tree presented by the
+ * <code>NodeIterator</code>. See the description of
+ * <code>NodeFilter</code> for the set of possible <code>SHOW_</code>
+ * values.These flags can be combined using <code>OR</code>.
+ * @param filter The <code>NodeFilter</code> to be used with this
+ * <code>TreeWalker</code>, or <code>null</code> to indicate no filter.
+ * @param entityReferenceExpansion The value of this flag determines
+ * whether entity reference nodes are expanded.
+ * @return The newly created <code>NodeIterator</code>.
+ * @exception DOMException
+ * NOT_SUPPORTED_ERR: Raised if the specified <code>root</code> is
+ * <code>null</code>.
+ */
+ public NodeIterator createNodeIterator(Node root,
+ int whatToShow,
+ NodeFilter filter,
+ boolean entityReferenceExpansion)
+ throws DOMException;
+
+ /**
+ * Create a new <code>TreeWalker</code> over the subtree rooted at the
+ * specified node.
+ * @param root The node which will serve as the <code>root</code> for the
+ * <code>TreeWalker</code>. The <code>whatToShow</code> flags and the
+ * <code>NodeFilter</code> are not considered when setting this value;
+ * any node type will be accepted as the <code>root</code>. The
+ * <code>currentNode</code> of the <code>TreeWalker</code> is
+ * initialized to this node, whether or not it is visible. The
+ * <code>root</code> functions as a stopping point for traversal
+ * methods that look upward in the document structure, such as
+ * <code>parentNode</code> and nextNode. The <code>root</code> must
+ * not be <code>null</code>.
+ * @param whatToShow This flag specifies which node types may appear in
+ * the logical view of the tree presented by the
+ * <code>TreeWalker</code>. See the description of
+ * <code>NodeFilter</code> for the set of possible <code>SHOW_</code>
+ * values.These flags can be combined using <code>OR</code>.
+ * @param filter The <code>NodeFilter</code> to be used with this
+ * <code>TreeWalker</code>, or <code>null</code> to indicate no filter.
+ * @param entityReferenceExpansion If this flag is false, the contents of
+ * <code>EntityReference</code> nodes are not presented in the logical
+ * view.
+ * @return The newly created <code>TreeWalker</code>.
+ * @exception DOMException
+ * NOT_SUPPORTED_ERR: Raised if the specified <code>root</code> is
+ * <code>null</code>.
+ */
+ public TreeWalker createTreeWalker(Node root,
+ int whatToShow,
+ NodeFilter filter,
+ boolean entityReferenceExpansion)
+ throws DOMException;
+
+}
diff --git a/external/jaxp/source/org/w3c/dom/traversal/NodeFilter.java b/external/jaxp/source/org/w3c/dom/traversal/NodeFilter.java
new file mode 100755
index 000000000..b9beac476
--- /dev/null
+++ b/external/jaxp/source/org/w3c/dom/traversal/NodeFilter.java
@@ -0,0 +1,144 @@
+/*
+ * Copyright (c) 2000 World Wide Web Consortium,
+ * (Massachusetts Institute of Technology, Institut National de
+ * Recherche en Informatique et en Automatique, Keio University). All
+ * Rights Reserved. This program is distributed under the W3C's Software
+ * Intellectual Property License. This program is distributed in the
+ * hope that it will be useful, but WITHOUT ANY WARRANTY; without even
+ * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+ * PURPOSE.
+ * See W3C License http://www.w3.org/Consortium/Legal/ for more details.
+ */
+
+package org.w3c.dom.traversal;
+
+import org.w3c.dom.Node;
+
+/**
+ * Filters are objects that know how to "filter out" nodes. If a
+ * <code>NodeIterator</code> or <code>TreeWalker</code> is given a
+ * <code>NodeFilter</code>, it applies the filter before it returns the next
+ * node. If the filter says to accept the node, the traversal logic returns
+ * it; otherwise, traversal looks for the next node and pretends that the
+ * node that was rejected was not there.
+ * <p>The DOM does not provide any filters. <code>NodeFilter</code> is just an
+ * interface that users can implement to provide their own filters.
+ * <p><code>NodeFilters</code> do not need to know how to traverse from node
+ * to node, nor do they need to know anything about the data structure that
+ * is being traversed. This makes it very easy to write filters, since the
+ * only thing they have to know how to do is evaluate a single node. One
+ * filter may be used with a number of different kinds of traversals,
+ * encouraging code reuse.
+ * <p>See also the <a href='http://www.w3.org/TR/2000/REC-DOM-Level-2-Traversal-Range-20001113'>Document Object Model (DOM) Level 2 Traversal and Range Specification</a>.
+ * @since DOM Level 2
+ */
+public interface NodeFilter {
+ // Constants returned by acceptNode
+ /**
+ * Accept the node. Navigation methods defined for
+ * <code>NodeIterator</code> or <code>TreeWalker</code> will return this
+ * node.
+ */
+ public static final short FILTER_ACCEPT = 1;
+ /**
+ * Reject the node. Navigation methods defined for
+ * <code>NodeIterator</code> or <code>TreeWalker</code> will not return
+ * this node. For <code>TreeWalker</code>, the children of this node
+ * will also be rejected. <code>NodeIterators</code> treat this as a
+ * synonym for <code>FILTER_SKIP</code>.
+ */
+ public static final short FILTER_REJECT = 2;
+ /**
+ * Skip this single node. Navigation methods defined for
+ * <code>NodeIterator</code> or <code>TreeWalker</code> will not return
+ * this node. For both <code>NodeIterator</code> and
+ * <code>TreeWalker</code>, the children of this node will still be
+ * considered.
+ */
+ public static final short FILTER_SKIP = 3;
+
+ // Constants for whatToShow
+ /**
+ * Show all <code>Nodes</code>.
+ */
+ public static final int SHOW_ALL = 0xFFFFFFFF;
+ /**
+ * Show <code>Element</code> nodes.
+ */
+ public static final int SHOW_ELEMENT = 0x00000001;
+ /**
+ * Show <code>Attr</code> nodes. This is meaningful only when creating an
+ * <code>NodeIterator</code> or <code>TreeWalker</code> with an
+ * attribute node as its <code>root</code>; in this case, it means that
+ * the attribute node will appear in the first position of the iteration
+ * or traversal. Since attributes are never children of other nodes,
+ * they do not appear when traversing over the document tree.
+ */
+ public static final int SHOW_ATTRIBUTE = 0x00000002;
+ /**
+ * Show <code>Text</code> nodes.
+ */
+ public static final int SHOW_TEXT = 0x00000004;
+ /**
+ * Show <code>CDATASection</code> nodes.
+ */
+ public static final int SHOW_CDATA_SECTION = 0x00000008;
+ /**
+ * Show <code>EntityReference</code> nodes.
+ */
+ public static final int SHOW_ENTITY_REFERENCE = 0x00000010;
+ /**
+ * Show <code>Entity</code> nodes. This is meaningful only when creating
+ * an <code>NodeIterator</code> or <code>TreeWalker</code> with an
+ * <code>Entity</code> node as its <code>root</code>; in this case, it
+ * means that the <code>Entity</code> node will appear in the first
+ * position of the traversal. Since entities are not part of the
+ * document tree, they do not appear when traversing over the document
+ * tree.
+ */
+ public static final int SHOW_ENTITY = 0x00000020;
+ /**
+ * Show <code>ProcessingInstruction</code> nodes.
+ */
+ public static final int SHOW_PROCESSING_INSTRUCTION = 0x00000040;
+ /**
+ * Show <code>Comment</code> nodes.
+ */
+ public static final int SHOW_COMMENT = 0x00000080;
+ /**
+ * Show <code>Document</code> nodes.
+ */
+ public static final int SHOW_DOCUMENT = 0x00000100;
+ /**
+ * Show <code>DocumentType</code> nodes.
+ */
+ public static final int SHOW_DOCUMENT_TYPE = 0x00000200;
+ /**
+ * Show <code>DocumentFragment</code> nodes.
+ */
+ public static final int SHOW_DOCUMENT_FRAGMENT = 0x00000400;
+ /**
+ * Show <code>Notation</code> nodes. This is meaningful only when creating
+ * an <code>NodeIterator</code> or <code>TreeWalker</code> with a
+ * <code>Notation</code> node as its <code>root</code>; in this case, it
+ * means that the <code>Notation</code> node will appear in the first
+ * position of the traversal. Since notations are not part of the
+ * document tree, they do not appear when traversing over the document
+ * tree.
+ */
+ public static final int SHOW_NOTATION = 0x00000800;
+
+ /**
+ * Test whether a specified node is visible in the logical view of a
+ * <code>TreeWalker</code> or <code>NodeIterator</code>. This function
+ * will be called by the implementation of <code>TreeWalker</code> and
+ * <code>NodeIterator</code>; it is not normally called directly from
+ * user code. (Though you could do so if you wanted to use the same
+ * filter to guide your own application logic.)
+ * @param n The node to check to see if it passes the filter or not.
+ * @return A constant to determine whether the node is accepted,
+ * rejected, or skipped, as defined above.
+ */
+ public short acceptNode(Node n);
+
+}
diff --git a/external/jaxp/source/org/w3c/dom/traversal/NodeIterator.java b/external/jaxp/source/org/w3c/dom/traversal/NodeIterator.java
new file mode 100755
index 000000000..d1f0d0839
--- /dev/null
+++ b/external/jaxp/source/org/w3c/dom/traversal/NodeIterator.java
@@ -0,0 +1,109 @@
+/*
+ * Copyright (c) 2000 World Wide Web Consortium,
+ * (Massachusetts Institute of Technology, Institut National de
+ * Recherche en Informatique et en Automatique, Keio University). All
+ * Rights Reserved. This program is distributed under the W3C's Software
+ * Intellectual Property License. This program is distributed in the
+ * hope that it will be useful, but WITHOUT ANY WARRANTY; without even
+ * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+ * PURPOSE.
+ * See W3C License http://www.w3.org/Consortium/Legal/ for more details.
+ */
+
+package org.w3c.dom.traversal;
+
+import org.w3c.dom.Node;
+import org.w3c.dom.DOMException;
+
+/**
+ * <code>NodeIterators</code> are used to step through a set of nodes, e.g.
+ * the set of nodes in a <code>NodeList</code>, the document subtree
+ * governed by a particular <code>Node</code>, the results of a query, or
+ * any other set of nodes. The set of nodes to be iterated is determined by
+ * the implementation of the <code>NodeIterator</code>. DOM Level 2
+ * specifies a single <code>NodeIterator</code> implementation for
+ * document-order traversal of a document subtree. Instances of these
+ * <code>NodeIterators</code> are created by calling
+ * <code>DocumentTraversal</code><code>.createNodeIterator()</code>.
+ * <p>See also the <a href='http://www.w3.org/TR/2000/REC-DOM-Level-2-Traversal-Range-20001113'>Document Object Model (DOM) Level 2 Traversal and Range Specification</a>.
+ * @since DOM Level 2
+ */
+public interface NodeIterator {
+ /**
+ * The root node of the <code>NodeIterator</code>, as specified when it
+ * was created.
+ */
+ public Node getRoot();
+
+ /**
+ * This attribute determines which node types are presented via the
+ * <code>NodeIterator</code>. The available set of constants is defined
+ * in the <code>NodeFilter</code> interface. Nodes not accepted by
+ * <code>whatToShow</code> will be skipped, but their children may still
+ * be considered. Note that this skip takes precedence over the filter,
+ * if any.
+ */
+ public int getWhatToShow();
+
+ /**
+ * The <code>NodeFilter</code> used to screen nodes.
+ */
+ public NodeFilter getFilter();
+
+ /**
+ * The value of this flag determines whether the children of entity
+ * reference nodes are visible to the <code>NodeIterator</code>. If
+ * false, these children and their descendants will be rejected. Note
+ * that this rejection takes precedence over <code>whatToShow</code> and
+ * the filter. Also note that this is currently the only situation where
+ * <code>NodeIterators</code> may reject a complete subtree rather than
+ * skipping individual nodes.
+ * <br>
+ * <br> To produce a view of the document that has entity references
+ * expanded and does not expose the entity reference node itself, use
+ * the <code>whatToShow</code> flags to hide the entity reference node
+ * and set <code>expandEntityReferences</code> to true when creating the
+ * <code>NodeIterator</code>. To produce a view of the document that has
+ * entity reference nodes but no entity expansion, use the
+ * <code>whatToShow</code> flags to show the entity reference node and
+ * set <code>expandEntityReferences</code> to false.
+ */
+ public boolean getExpandEntityReferences();
+
+ /**
+ * Returns the next node in the set and advances the position of the
+ * <code>NodeIterator</code> in the set. After a
+ * <code>NodeIterator</code> is created, the first call to
+ * <code>nextNode()</code> returns the first node in the set.
+ * @return The next <code>Node</code> in the set being iterated over, or
+ * <code>null</code> if there are no more members in that set.
+ * @exception DOMException
+ * INVALID_STATE_ERR: Raised if this method is called after the
+ * <code>detach</code> method was invoked.
+ */
+ public Node nextNode()
+ throws DOMException;
+
+ /**
+ * Returns the previous node in the set and moves the position of the
+ * <code>NodeIterator</code> backwards in the set.
+ * @return The previous <code>Node</code> in the set being iterated over,
+ * or <code>null</code> if there are no more members in that set.
+ * @exception DOMException
+ * INVALID_STATE_ERR: Raised if this method is called after the
+ * <code>detach</code> method was invoked.
+ */
+ public Node previousNode()
+ throws DOMException;
+
+ /**
+ * Detaches the <code>NodeIterator</code> from the set which it iterated
+ * over, releasing any computational resources and placing the
+ * <code>NodeIterator</code> in the INVALID state. After
+ * <code>detach</code> has been invoked, calls to <code>nextNode</code>
+ * or <code>previousNode</code> will raise the exception
+ * INVALID_STATE_ERR.
+ */
+ public void detach();
+
+}
diff --git a/external/jaxp/source/org/w3c/dom/traversal/TreeWalker.java b/external/jaxp/source/org/w3c/dom/traversal/TreeWalker.java
new file mode 100755
index 000000000..e90da0663
--- /dev/null
+++ b/external/jaxp/source/org/w3c/dom/traversal/TreeWalker.java
@@ -0,0 +1,182 @@
+/*
+ * Copyright (c) 2000 World Wide Web Consortium,
+ * (Massachusetts Institute of Technology, Institut National de
+ * Recherche en Informatique et en Automatique, Keio University). All
+ * Rights Reserved. This program is distributed under the W3C's Software
+ * Intellectual Property License. This program is distributed in the
+ * hope that it will be useful, but WITHOUT ANY WARRANTY; without even
+ * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+ * PURPOSE.
+ * See W3C License http://www.w3.org/Consortium/Legal/ for more details.
+ */
+
+package org.w3c.dom.traversal;
+
+import org.w3c.dom.Node;
+import org.w3c.dom.DOMException;
+
+/**
+ * <code>TreeWalker</code> objects are used to navigate a document tree or
+ * subtree using the view of the document defined by their
+ * <code>whatToShow</code> flags and filter (if any). Any function which
+ * performs navigation using a <code>TreeWalker</code> will automatically
+ * support any view defined by a <code>TreeWalker</code>.
+ * <p>Omitting nodes from the logical view of a subtree can result in a
+ * structure that is substantially different from the same subtree in the
+ * complete, unfiltered document. Nodes that are siblings in the
+ * <code>TreeWalker</code> view may be children of different, widely
+ * separated nodes in the original view. For instance, consider a
+ * <code>NodeFilter</code> that skips all nodes except for Text nodes and
+ * the root node of a document. In the logical view that results, all text
+ * nodes will be siblings and appear as direct children of the root node, no
+ * matter how deeply nested the structure of the original document.
+ * <p>See also the <a href='http://www.w3.org/TR/2000/REC-DOM-Level-2-Traversal-Range-20001113'>Document Object Model (DOM) Level 2 Traversal and Range Specification</a>.
+ * @since DOM Level 2
+ */
+public interface TreeWalker {
+ /**
+ * The <code>root</code> node of the <code>TreeWalker</code>, as specified
+ * when it was created.
+ */
+ public Node getRoot();
+
+ /**
+ * This attribute determines which node types are presented via the
+ * <code>TreeWalker</code>. The available set of constants is defined in
+ * the <code>NodeFilter</code> interface. Nodes not accepted by
+ * <code>whatToShow</code> will be skipped, but their children may still
+ * be considered. Note that this skip takes precedence over the filter,
+ * if any.
+ */
+ public int getWhatToShow();
+
+ /**
+ * The filter used to screen nodes.
+ */
+ public NodeFilter getFilter();
+
+ /**
+ * The value of this flag determines whether the children of entity
+ * reference nodes are visible to the <code>TreeWalker</code>. If false,
+ * these children and their descendants will be rejected. Note that
+ * this rejection takes precedence over <code>whatToShow</code> and the
+ * filter, if any.
+ * <br> To produce a view of the document that has entity references
+ * expanded and does not expose the entity reference node itself, use
+ * the <code>whatToShow</code> flags to hide the entity reference node
+ * and set <code>expandEntityReferences</code> to true when creating the
+ * <code>TreeWalker</code>. To produce a view of the document that has
+ * entity reference nodes but no entity expansion, use the
+ * <code>whatToShow</code> flags to show the entity reference node and
+ * set <code>expandEntityReferences</code> to false.
+ */
+ public boolean getExpandEntityReferences();
+
+ /**
+ * The node at which the <code>TreeWalker</code> is currently positioned.
+ * <br>Alterations to the DOM tree may cause the current node to no longer
+ * be accepted by the <code>TreeWalker</code>'s associated filter.
+ * <code>currentNode</code> may also be explicitly set to any node,
+ * whether or not it is within the subtree specified by the
+ * <code>root</code> node or would be accepted by the filter and
+ * <code>whatToShow</code> flags. Further traversal occurs relative to
+ * <code>currentNode</code> even if it is not part of the current view,
+ * by applying the filters in the requested direction; if no traversal
+ * is possible, <code>currentNode</code> is not changed.
+ * @exception DOMException
+ * NOT_SUPPORTED_ERR: Raised if an attempt is made to set
+ * <code>currentNode</code> to <code>null</code>.
+ */
+ public Node getCurrentNode();
+ /**
+ * The node at which the <code>TreeWalker</code> is currently positioned.
+ * <br>Alterations to the DOM tree may cause the current node to no longer
+ * be accepted by the <code>TreeWalker</code>'s associated filter.
+ * <code>currentNode</code> may also be explicitly set to any node,
+ * whether or not it is within the subtree specified by the
+ * <code>root</code> node or would be accepted by the filter and
+ * <code>whatToShow</code> flags. Further traversal occurs relative to
+ * <code>currentNode</code> even if it is not part of the current view,
+ * by applying the filters in the requested direction; if no traversal
+ * is possible, <code>currentNode</code> is not changed.
+ * @exception DOMException
+ * NOT_SUPPORTED_ERR: Raised if an attempt is made to set
+ * <code>currentNode</code> to <code>null</code>.
+ */
+ public void setCurrentNode(Node currentNode)
+ throws DOMException;
+
+ /**
+ * Moves to and returns the closest visible ancestor node of the current
+ * node. If the search for <code>parentNode</code> attempts to step
+ * upward from the <code>TreeWalker</code>'s <code>root</code> node, or
+ * if it fails to find a visible ancestor node, this method retains the
+ * current position and returns <code>null</code>.
+ * @return The new parent node, or <code>null</code> if the current node
+ * has no parent in the <code>TreeWalker</code>'s logical view.
+ */
+ public Node parentNode();
+
+ /**
+ * Moves the <code>TreeWalker</code> to the first visible child of the
+ * current node, and returns the new node. If the current node has no
+ * visible children, returns <code>null</code>, and retains the current
+ * node.
+ * @return The new node, or <code>null</code> if the current node has no
+ * visible children in the <code>TreeWalker</code>'s logical view.
+ */
+ public Node firstChild();
+
+ /**
+ * Moves the <code>TreeWalker</code> to the last visible child of the
+ * current node, and returns the new node. If the current node has no
+ * visible children, returns <code>null</code>, and retains the current
+ * node.
+ * @return The new node, or <code>null</code> if the current node has no
+ * children in the <code>TreeWalker</code>'s logical view.
+ */
+ public Node lastChild();
+
+ /**
+ * Moves the <code>TreeWalker</code> to the previous sibling of the
+ * current node, and returns the new node. If the current node has no
+ * visible previous sibling, returns <code>null</code>, and retains the
+ * current node.
+ * @return The new node, or <code>null</code> if the current node has no
+ * previous sibling. in the <code>TreeWalker</code>'s logical view.
+ */
+ public Node previousSibling();
+
+ /**
+ * Moves the <code>TreeWalker</code> to the next sibling of the current
+ * node, and returns the new node. If the current node has no visible
+ * next sibling, returns <code>null</code>, and retains the current node.
+ * @return The new node, or <code>null</code> if the current node has no
+ * next sibling. in the <code>TreeWalker</code>'s logical view.
+ */
+ public Node nextSibling();
+
+ /**
+ * Moves the <code>TreeWalker</code> to the previous visible node in
+ * document order relative to the current node, and returns the new
+ * node. If the current node has no previous node, or if the search for
+ * <code>previousNode</code> attempts to step upward from the
+ * <code>TreeWalker</code>'s <code>root</code> node, returns
+ * <code>null</code>, and retains the current node.
+ * @return The new node, or <code>null</code> if the current node has no
+ * previous node in the <code>TreeWalker</code>'s logical view.
+ */
+ public Node previousNode();
+
+ /**
+ * Moves the <code>TreeWalker</code> to the next visible node in document
+ * order relative to the current node, and returns the new node. If the
+ * current node has no next node, or if the search for nextNode attempts
+ * to step upward from the <code>TreeWalker</code>'s <code>root</code>
+ * node, returns <code>null</code>, and retains the current node.
+ * @return The new node, or <code>null</code> if the current node has no
+ * next node in the <code>TreeWalker</code>'s logical view.
+ */
+ public Node nextNode();
+
+}
diff --git a/external/jaxp/source/org/w3c/dom/traversal/package.html b/external/jaxp/source/org/w3c/dom/traversal/package.html
new file mode 100755
index 000000000..f3caf0697
--- /dev/null
+++ b/external/jaxp/source/org/w3c/dom/traversal/package.html
@@ -0,0 +1,10 @@
+<html><head>
+<title>yadda yadda</title>
+</head><body>
+
+<p>Supports the optional
+<a href="http://www.w3.org/TR/2000/REC-DOM-Level-2-Traversal-Range-20001113/"
+>"Traversal"</a> feature of the
+DOM Level 2 Recommendation. </p>
+
+</body></html>
diff --git a/external/jaxp/source/org/w3c/dom/views/AbstractView.java b/external/jaxp/source/org/w3c/dom/views/AbstractView.java
new file mode 100755
index 000000000..97e8f0e2b
--- /dev/null
+++ b/external/jaxp/source/org/w3c/dom/views/AbstractView.java
@@ -0,0 +1,27 @@
+/*
+ * Copyright (c) 2000 World Wide Web Consortium,
+ * (Massachusetts Institute of Technology, Institut National de
+ * Recherche en Informatique et en Automatique, Keio University). All
+ * Rights Reserved. This program is distributed under the W3C's Software
+ * Intellectual Property License. This program is distributed in the
+ * hope that it will be useful, but WITHOUT ANY WARRANTY; without even
+ * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+ * PURPOSE.
+ * See W3C License http://www.w3.org/Consortium/Legal/ for more details.
+ */
+
+package org.w3c.dom.views;
+
+/**
+ * A base interface that all views shall derive from.
+ * <p>See also the <a href='http://www.w3.org/TR/2000/REC-DOM-Level-2-Views-20001113'>Document Object Model (DOM) Level 2 Views Specification</a>.
+ * @since DOM Level 2
+ */
+public interface AbstractView {
+ /**
+ * The source <code>DocumentView</code> of which this is an
+ * <code>AbstractView</code>.
+ */
+ public DocumentView getDocument();
+
+}
diff --git a/external/jaxp/source/org/w3c/dom/views/DocumentView.java b/external/jaxp/source/org/w3c/dom/views/DocumentView.java
new file mode 100755
index 000000000..2cb9eebb8
--- /dev/null
+++ b/external/jaxp/source/org/w3c/dom/views/DocumentView.java
@@ -0,0 +1,30 @@
+/*
+ * Copyright (c) 2000 World Wide Web Consortium,
+ * (Massachusetts Institute of Technology, Institut National de
+ * Recherche en Informatique et en Automatique, Keio University). All
+ * Rights Reserved. This program is distributed under the W3C's Software
+ * Intellectual Property License. This program is distributed in the
+ * hope that it will be useful, but WITHOUT ANY WARRANTY; without even
+ * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+ * PURPOSE.
+ * See W3C License http://www.w3.org/Consortium/Legal/ for more details.
+ */
+
+package org.w3c.dom.views;
+
+/**
+ * The <code>DocumentView</code> interface is implemented by
+ * <code>Document</code> objects in DOM implementations supporting DOM
+ * Views. It provides an attribute to retrieve the default view of a
+ * document.
+ * <p>See also the <a href='http://www.w3.org/TR/2000/REC-DOM-Level-2-Views-20001113'>Document Object Model (DOM) Level 2 Views Specification</a>.
+ * @since DOM Level 2
+ */
+public interface DocumentView {
+ /**
+ * The default <code>AbstractView</code> for this <code>Document</code>,
+ * or <code>null</code> if none available.
+ */
+ public AbstractView getDefaultView();
+
+}
diff --git a/external/jaxp/source/org/w3c/dom/views/package.html b/external/jaxp/source/org/w3c/dom/views/package.html
new file mode 100755
index 000000000..2582247ee
--- /dev/null
+++ b/external/jaxp/source/org/w3c/dom/views/package.html
@@ -0,0 +1,10 @@
+<html><head>
+<title>yadda yadda</title>
+</head><body>
+
+<p>Supports the optional
+<a href="http://www.w3.org/TR/2000/REC-DOM-Level-2-Views-20001113/"
+>"Views"</a> feature of the
+DOM Level 2 Recommendation. </p>
+
+</body></html>
diff --git a/external/jaxp/source/org/xml/sax/AttributeList.java b/external/jaxp/source/org/xml/sax/AttributeList.java
new file mode 100755
index 000000000..37c48d1e9
--- /dev/null
+++ b/external/jaxp/source/org/xml/sax/AttributeList.java
@@ -0,0 +1,193 @@
+// SAX Attribute List Interface.
+// http://www.saxproject.org
+// No warranty; no copyright -- use this as you will.
+// $Id: AttributeList.java,v 1.1 2003-02-01 02:10:41 cbj Exp $
+
+package org.xml.sax;
+
+/**
+ * Interface for an element's attribute specifications.
+ *
+ * <blockquote>
+ * <em>This module, both source code and documentation, is in the
+ * Public Domain, and comes with <strong>NO WARRANTY</strong>.</em>
+ * See <a href='http://www.saxproject.org'>http://www.saxproject.org</a>
+ * for further information.
+ * </blockquote>
+ *
+ * <p>This is the original SAX1 interface for reporting an element's
+ * attributes. Unlike the new {@link org.xml.sax.Attributes Attributes}
+ * interface, it does not support Namespace-related information.</p>
+ *
+ * <p>When an attribute list is supplied as part of a
+ * {@link org.xml.sax.DocumentHandler#startElement startElement}
+ * event, the list will return valid results only during the
+ * scope of the event; once the event handler returns control
+ * to the parser, the attribute list is invalid. To save a
+ * persistent copy of the attribute list, use the SAX1
+ * {@link org.xml.sax.helpers.AttributeListImpl AttributeListImpl}
+ * helper class.</p>
+ *
+ * <p>An attribute list includes only attributes that have been
+ * specified or defaulted: #IMPLIED attributes will not be included.</p>
+ *
+ * <p>There are two ways for the SAX application to obtain information
+ * from the AttributeList. First, it can iterate through the entire
+ * list:</p>
+ *
+ * <pre>
+ * public void startElement (String name, AttributeList atts) {
+ * for (int i = 0; i < atts.getLength(); i++) {
+ * String name = atts.getName(i);
+ * String type = atts.getType(i);
+ * String value = atts.getValue(i);
+ * [...]
+ * }
+ * }
+ * </pre>
+ *
+ * <p>(Note that the result of getLength() will be zero if there
+ * are no attributes.)
+ *
+ * <p>As an alternative, the application can request the value or
+ * type of specific attributes:</p>
+ *
+ * <pre>
+ * public void startElement (String name, AttributeList atts) {
+ * String identifier = atts.getValue("id");
+ * String label = atts.getValue("label");
+ * [...]
+ * }
+ * </pre>
+ *
+ * @deprecated This interface has been replaced by the SAX2
+ * {@link org.xml.sax.Attributes Attributes}
+ * interface, which includes Namespace support.
+ * @since SAX 1.0
+ * @author David Megginson
+ * @version 2.0.1 (sax2r2)
+ * @see org.xml.sax.DocumentHandler#startElement startElement
+ * @see org.xml.sax.helpers.AttributeListImpl AttributeListImpl
+ */
+public interface AttributeList {
+
+
+ ////////////////////////////////////////////////////////////////////
+ // Iteration methods.
+ ////////////////////////////////////////////////////////////////////
+
+
+ /**
+ * Return the number of attributes in this list.
+ *
+ * <p>The SAX parser may provide attributes in any
+ * arbitrary order, regardless of the order in which they were
+ * declared or specified. The number of attributes may be
+ * zero.</p>
+ *
+ * @return The number of attributes in the list.
+ */
+ public abstract int getLength ();
+
+
+ /**
+ * Return the name of an attribute in this list (by position).
+ *
+ * <p>The names must be unique: the SAX parser shall not include the
+ * same attribute twice. Attributes without values (those declared
+ * #IMPLIED without a value specified in the start tag) will be
+ * omitted from the list.</p>
+ *
+ * <p>If the attribute name has a namespace prefix, the prefix
+ * will still be attached.</p>
+ *
+ * @param i The index of the attribute in the list (starting at 0).
+ * @return The name of the indexed attribute, or null
+ * if the index is out of range.
+ * @see #getLength
+ */
+ public abstract String getName (int i);
+
+
+ /**
+ * Return the type of an attribute in the list (by position).
+ *
+ * <p>The attribute type is one of the strings "CDATA", "ID",
+ * "IDREF", "IDREFS", "NMTOKEN", "NMTOKENS", "ENTITY", "ENTITIES",
+ * or "NOTATION" (always in upper case).</p>
+ *
+ * <p>If the parser has not read a declaration for the attribute,
+ * or if the parser does not report attribute types, then it must
+ * return the value "CDATA" as stated in the XML 1.0 Recommentation
+ * (clause 3.3.3, "Attribute-Value Normalization").</p>
+ *
+ * <p>For an enumerated attribute that is not a notation, the
+ * parser will report the type as "NMTOKEN".</p>
+ *
+ * @param i The index of the attribute in the list (starting at 0).
+ * @return The attribute type as a string, or
+ * null if the index is out of range.
+ * @see #getLength
+ * @see #getType(java.lang.String)
+ */
+ public abstract String getType (int i);
+
+
+ /**
+ * Return the value of an attribute in the list (by position).
+ *
+ * <p>If the attribute value is a list of tokens (IDREFS,
+ * ENTITIES, or NMTOKENS), the tokens will be concatenated
+ * into a single string separated by whitespace.</p>
+ *
+ * @param i The index of the attribute in the list (starting at 0).
+ * @return The attribute value as a string, or
+ * null if the index is out of range.
+ * @see #getLength
+ * @see #getValue(java.lang.String)
+ */
+ public abstract String getValue (int i);
+
+
+
+ ////////////////////////////////////////////////////////////////////
+ // Lookup methods.
+ ////////////////////////////////////////////////////////////////////
+
+
+ /**
+ * Return the type of an attribute in the list (by name).
+ *
+ * <p>The return value is the same as the return value for
+ * getType(int).</p>
+ *
+ * <p>If the attribute name has a namespace prefix in the document,
+ * the application must include the prefix here.</p>
+ *
+ * @param name The name of the attribute.
+ * @return The attribute type as a string, or null if no
+ * such attribute exists.
+ * @see #getType(int)
+ */
+ public abstract String getType (String name);
+
+
+ /**
+ * Return the value of an attribute in the list (by name).
+ *
+ * <p>The return value is the same as the return value for
+ * getValue(int).</p>
+ *
+ * <p>If the attribute name has a namespace prefix in the document,
+ * the application must include the prefix here.</p>
+ *
+ * @param i The index of the attribute in the list.
+ * @return The attribute value as a string, or null if
+ * no such attribute exists.
+ * @see #getValue(int)
+ */
+ public abstract String getValue (String name);
+
+}
+
+// end of AttributeList.java
diff --git a/external/jaxp/source/org/xml/sax/Attributes.java b/external/jaxp/source/org/xml/sax/Attributes.java
new file mode 100755
index 000000000..aebee8298
--- /dev/null
+++ b/external/jaxp/source/org/xml/sax/Attributes.java
@@ -0,0 +1,250 @@
+// Attributes.java - attribute list with Namespace support
+// http://www.saxproject.org
+// Written by David Megginson
+// NO WARRANTY! This class is in the public domain.
+// $Id: Attributes.java,v 1.1 2003-02-01 02:10:41 cbj Exp $
+
+package org.xml.sax;
+
+
+/**
+ * Interface for a list of XML attributes.
+ *
+ * <blockquote>
+ * <em>This module, both source code and documentation, is in the
+ * Public Domain, and comes with <strong>NO WARRANTY</strong>.</em>
+ * See <a href='http://www.saxproject.org'>http://www.saxproject.org</a>
+ * for further information.
+ * </blockquote>
+ *
+ * <p>This interface allows access to a list of attributes in
+ * three different ways:</p>
+ *
+ * <ol>
+ * <li>by attribute index;</li>
+ * <li>by Namespace-qualified name; or</li>
+ * <li>by qualified (prefixed) name.</li>
+ * </ol>
+ *
+ * <p>The list will not contain attributes that were declared
+ * #IMPLIED but not specified in the start tag. It will also not
+ * contain attributes used as Namespace declarations (xmlns*) unless
+ * the <code>http://xml.org/sax/features/namespace-prefixes</code>
+ * feature is set to <var>true</var> (it is <var>false</var> by
+ * default).
+ * Because SAX2 conforms to the "Namespaces in XML" specification,
+ * it does not give namespace declaration attributes a namespace URI.
+ * Some other W3C specifications are in conflict with that, expecting
+ * these declarations to be in a namespace.
+ * Handler code may need to resolve that conflict.
+ * </p>
+ *
+ * <p>If the namespace-prefixes feature (see above) is <var>false</var>,
+ * access by qualified name may not be available; if the
+ * <code>http://xml.org/sax/features/namespaces</code>
+ * feature is <var>false</var>, access by Namespace-qualified names
+ * may not be available.</p>
+ *
+ * <p>This interface replaces the now-deprecated SAX1 {@link
+ * org.xml.sax.AttributeList AttributeList} interface, which does not
+ * contain Namespace support. In addition to Namespace support, it
+ * adds the <var>getIndex</var> methods (below).</p>
+ *
+ * <p>The order of attributes in the list is unspecified, and will
+ * vary from implementation to implementation.</p>
+ *
+ * @since SAX 2.0
+ * @author David Megginson
+ * @version 2.0.1 (sax2r2)
+ * @see org.xml.sax.helpers.AttributesImpl
+ * @see org.xml.sax.ext.DeclHandler#attributeDecl
+ */
+public interface Attributes
+{
+
+
+ ////////////////////////////////////////////////////////////////////
+ // Indexed access.
+ ////////////////////////////////////////////////////////////////////
+
+
+ /**
+ * Return the number of attributes in the list.
+ *
+ * <p>Once you know the number of attributes, you can iterate
+ * through the list.</p>
+ *
+ * @return The number of attributes in the list.
+ * @see #getURI(int)
+ * @see #getLocalName(int)
+ * @see #getQName(int)
+ * @see #getType(int)
+ * @see #getValue(int)
+ */
+ public abstract int getLength ();
+
+
+ /**
+ * Look up an attribute's Namespace URI by index.
+ *
+ * @param index The attribute index (zero-based).
+ * @return The Namespace URI, or the empty string if none
+ * is available, or null if the index is out of
+ * range.
+ * @see #getLength
+ */
+ public abstract String getURI (int index);
+
+
+ /**
+ * Look up an attribute's local name by index.
+ *
+ * @param index The attribute index (zero-based).
+ * @return The local name, or the empty string if Namespace
+ * processing is not being performed, or null
+ * if the index is out of range.
+ * @see #getLength
+ */
+ public abstract String getLocalName (int index);
+
+
+ /**
+ * Look up an attribute's XML 1.0 qualified name by index.
+ *
+ * @param index The attribute index (zero-based).
+ * @return The XML 1.0 qualified name, or the empty string
+ * if none is available, or null if the index
+ * is out of range.
+ * @see #getLength
+ */
+ public abstract String getQName (int index);
+
+
+ /**
+ * Look up an attribute's type by index.
+ *
+ * <p>The attribute type is one of the strings "CDATA", "ID",
+ * "IDREF", "IDREFS", "NMTOKEN", "NMTOKENS", "ENTITY", "ENTITIES",
+ * or "NOTATION" (always in upper case).</p>
+ *
+ * <p>If the parser has not read a declaration for the attribute,
+ * or if the parser does not report attribute types, then it must
+ * return the value "CDATA" as stated in the XML 1.0 Recommentation
+ * (clause 3.3.3, "Attribute-Value Normalization").</p>
+ *
+ * <p>For an enumerated attribute that is not a notation, the
+ * parser will report the type as "NMTOKEN".</p>
+ *
+ * @param index The attribute index (zero-based).
+ * @return The attribute's type as a string, or null if the
+ * index is out of range.
+ * @see #getLength
+ */
+ public abstract String getType (int index);
+
+
+ /**
+ * Look up an attribute's value by index.
+ *
+ * <p>If the attribute value is a list of tokens (IDREFS,
+ * ENTITIES, or NMTOKENS), the tokens will be concatenated
+ * into a single string with each token separated by a
+ * single space.</p>
+ *
+ * @param index The attribute index (zero-based).
+ * @return The attribute's value as a string, or null if the
+ * index is out of range.
+ * @see #getLength
+ */
+ public abstract String getValue (int index);
+
+
+
+ ////////////////////////////////////////////////////////////////////
+ // Name-based query.
+ ////////////////////////////////////////////////////////////////////
+
+
+ /**
+ * Look up the index of an attribute by Namespace name.
+ *
+ * @param uri The Namespace URI, or the empty string if
+ * the name has no Namespace URI.
+ * @param localName The attribute's local name.
+ * @return The index of the attribute, or -1 if it does not
+ * appear in the list.
+ */
+ public int getIndex (String uri, String localName);
+
+
+ /**
+ * Look up the index of an attribute by XML 1.0 qualified name.
+ *
+ * @param qName The qualified (prefixed) name.
+ * @return The index of the attribute, or -1 if it does not
+ * appear in the list.
+ */
+ public int getIndex (String qName);
+
+
+ /**
+ * Look up an attribute's type by Namespace name.
+ *
+ * <p>See {@link #getType(int) getType(int)} for a description
+ * of the possible types.</p>
+ *
+ * @param uri The Namespace URI, or the empty String if the
+ * name has no Namespace URI.
+ * @param localName The local name of the attribute.
+ * @return The attribute type as a string, or null if the
+ * attribute is not in the list or if Namespace
+ * processing is not being performed.
+ */
+ public abstract String getType (String uri, String localName);
+
+
+ /**
+ * Look up an attribute's type by XML 1.0 qualified name.
+ *
+ * <p>See {@link #getType(int) getType(int)} for a description
+ * of the possible types.</p>
+ *
+ * @param qName The XML 1.0 qualified name.
+ * @return The attribute type as a string, or null if the
+ * attribute is not in the list or if qualified names
+ * are not available.
+ */
+ public abstract String getType (String qName);
+
+
+ /**
+ * Look up an attribute's value by Namespace name.
+ *
+ * <p>See {@link #getValue(int) getValue(int)} for a description
+ * of the possible values.</p>
+ *
+ * @param uri The Namespace URI, or the empty String if the
+ * name has no Namespace URI.
+ * @param localName The local name of the attribute.
+ * @return The attribute value as a string, or null if the
+ * attribute is not in the list.
+ */
+ public abstract String getValue (String uri, String localName);
+
+
+ /**
+ * Look up an attribute's value by XML 1.0 qualified name.
+ *
+ * <p>See {@link #getValue(int) getValue(int)} for a description
+ * of the possible values.</p>
+ *
+ * @param qName The XML 1.0 qualified name.
+ * @return The attribute value as a string, or null if the
+ * attribute is not in the list or if qualified names
+ * are not available.
+ */
+ public abstract String getValue (String qName);
+
+}
+
+// end of Attributes.java
diff --git a/external/jaxp/source/org/xml/sax/ContentHandler.java b/external/jaxp/source/org/xml/sax/ContentHandler.java
new file mode 100755
index 000000000..37034649d
--- /dev/null
+++ b/external/jaxp/source/org/xml/sax/ContentHandler.java
@@ -0,0 +1,407 @@
+// ContentHandler.java - handle main document content.
+// http://www.saxproject.org
+// Written by David Megginson
+// NO WARRANTY! This class is in the public domain.
+// $Id: ContentHandler.java,v 1.1 2003-02-01 02:10:41 cbj Exp $
+
+package org.xml.sax;
+
+
+/**
+ * Receive notification of the logical content of a document.
+ *
+ * <blockquote>
+ * <em>This module, both source code and documentation, is in the
+ * Public Domain, and comes with <strong>NO WARRANTY</strong>.</em>
+ * See <a href='http://www.saxproject.org'>http://www.saxproject.org</a>
+ * for further information.
+ * </blockquote>
+ *
+ * <p>This is the main interface that most SAX applications
+ * implement: if the application needs to be informed of basic parsing
+ * events, it implements this interface and registers an instance with
+ * the SAX parser using the {@link org.xml.sax.XMLReader#setContentHandler
+ * setContentHandler} method. The parser uses the instance to report
+ * basic document-related events like the start and end of elements
+ * and character data.</p>
+ *
+ * <p>The order of events in this interface is very important, and
+ * mirrors the order of information in the document itself. For
+ * example, all of an element's content (character data, processing
+ * instructions, and/or subelements) will appear, in order, between
+ * the startElement event and the corresponding endElement event.</p>
+ *
+ * <p>This interface is similar to the now-deprecated SAX 1.0
+ * DocumentHandler interface, but it adds support for Namespaces
+ * and for reporting skipped entities (in non-validating XML
+ * processors).</p>
+ *
+ * <p>Implementors should note that there is also a Java class
+ * {@link java.net.ContentHandler ContentHandler} in the java.net
+ * package; that means that it's probably a bad idea to do</p>
+ *
+ * <blockquote>
+ * import java.net.*;
+ * import org.xml.sax.*;
+ * </blockquote>
+ *
+ * <p>In fact, "import ...*" is usually a sign of sloppy programming
+ * anyway, so the user should consider this a feature rather than a
+ * bug.</p>
+ *
+ * @since SAX 2.0
+ * @author David Megginson
+ * @version 2.0.1 (sax2r2)
+ * @see org.xml.sax.XMLReader
+ * @see org.xml.sax.DTDHandler
+ * @see org.xml.sax.ErrorHandler
+ */
+public interface ContentHandler
+{
+
+ /**
+ * Receive an object for locating the origin of SAX document events.
+ *
+ * <p>SAX parsers are strongly encouraged (though not absolutely
+ * required) to supply a locator: if it does so, it must supply
+ * the locator to the application by invoking this method before
+ * invoking any of the other methods in the ContentHandler
+ * interface.</p>
+ *
+ * <p>The locator allows the application to determine the end
+ * position of any document-related event, even if the parser is
+ * not reporting an error. Typically, the application will
+ * use this information for reporting its own errors (such as
+ * character content that does not match an application's
+ * business rules). The information returned by the locator
+ * is probably not sufficient for use with a search engine.</p>
+ *
+ * <p>Note that the locator will return correct information only
+ * during the invocation of the events in this interface. The
+ * application should not attempt to use it at any other time.</p>
+ *
+ * @param locator An object that can return the location of
+ * any SAX document event.
+ * @see org.xml.sax.Locator
+ */
+ public void setDocumentLocator (Locator locator);
+
+
+ /**
+ * Receive notification of the beginning of a document.
+ *
+ * <p>The SAX parser will invoke this method only once, before any
+ * other event callbacks (except for {@link #setDocumentLocator
+ * setDocumentLocator}).</p>
+ *
+ * @exception org.xml.sax.SAXException Any SAX exception, possibly
+ * wrapping another exception.
+ * @see #endDocument
+ */
+ public void startDocument ()
+ throws SAXException;
+
+
+ /**
+ * Receive notification of the end of a document.
+ *
+ * <p>The SAX parser will invoke this method only once, and it will
+ * be the last method invoked during the parse. The parser shall
+ * not invoke this method until it has either abandoned parsing
+ * (because of an unrecoverable error) or reached the end of
+ * input.</p>
+ *
+ * @exception org.xml.sax.SAXException Any SAX exception, possibly
+ * wrapping another exception.
+ * @see #startDocument
+ */
+ public void endDocument()
+ throws SAXException;
+
+
+ /**
+ * Begin the scope of a prefix-URI Namespace mapping.
+ *
+ * <p>The information from this event is not necessary for
+ * normal Namespace processing: the SAX XML reader will
+ * automatically replace prefixes for element and attribute
+ * names when the <code>http://xml.org/sax/features/namespaces</code>
+ * feature is <var>true</var> (the default).</p>
+ *
+ * <p>There are cases, however, when applications need to
+ * use prefixes in character data or in attribute values,
+ * where they cannot safely be expanded automatically; the
+ * start/endPrefixMapping event supplies the information
+ * to the application to expand prefixes in those contexts
+ * itself, if necessary.</p>
+ *
+ * <p>Note that start/endPrefixMapping events are not
+ * guaranteed to be properly nested relative to each other:
+ * all startPrefixMapping events will occur immediately before the
+ * corresponding {@link #startElement startElement} event,
+ * and all {@link #endPrefixMapping endPrefixMapping}
+ * events will occur immediately after the corresponding
+ * {@link #endElement endElement} event,
+ * but their order is not otherwise
+ * guaranteed.</p>
+ *
+ * <p>There should never be start/endPrefixMapping events for the
+ * "xml" prefix, since it is predeclared and immutable.</p>
+ *
+ * @param prefix The Namespace prefix being declared.
+ * An empty string is used for the default element namespace,
+ * which has no prefix.
+ * @param uri The Namespace URI the prefix is mapped to.
+ * @exception org.xml.sax.SAXException The client may throw
+ * an exception during processing.
+ * @see #endPrefixMapping
+ * @see #startElement
+ */
+ public void startPrefixMapping (String prefix, String uri)
+ throws SAXException;
+
+
+ /**
+ * End the scope of a prefix-URI mapping.
+ *
+ * <p>See {@link #startPrefixMapping startPrefixMapping} for
+ * details. These events will always occur immediately after the
+ * corresponding {@link #endElement endElement} event, but the order of
+ * {@link #endPrefixMapping endPrefixMapping} events is not otherwise
+ * guaranteed.</p>
+ *
+ * @param prefix The prefix that was being mapped.
+ * This is the empty string when a default mapping scope ends.
+ * @exception org.xml.sax.SAXException The client may throw
+ * an exception during processing.
+ * @see #startPrefixMapping
+ * @see #endElement
+ */
+ public void endPrefixMapping (String prefix)
+ throws SAXException;
+
+
+ /**
+ * Receive notification of the beginning of an element.
+ *
+ * <p>The Parser will invoke this method at the beginning of every
+ * element in the XML document; there will be a corresponding
+ * {@link #endElement endElement} event for every startElement event
+ * (even when the element is empty). All of the element's content will be
+ * reported, in order, before the corresponding endElement
+ * event.</p>
+ *
+ * <p>This event allows up to three name components for each
+ * element:</p>
+ *
+ * <ol>
+ * <li>the Namespace URI;</li>
+ * <li>the local name; and</li>
+ * <li>the qualified (prefixed) name.</li>
+ * </ol>
+ *
+ * <p>Any or all of these may be provided, depending on the
+ * values of the <var>http://xml.org/sax/features/namespaces</var>
+ * and the <var>http://xml.org/sax/features/namespace-prefixes</var>
+ * properties:</p>
+ *
+ * <ul>
+ * <li>the Namespace URI and local name are required when
+ * the namespaces property is <var>true</var> (the default), and are
+ * optional when the namespaces property is <var>false</var> (if one is
+ * specified, both must be);</li>
+ * <li>the qualified name is required when the namespace-prefixes property
+ * is <var>true</var>, and is optional when the namespace-prefixes property
+ * is <var>false</var> (the default).</li>
+ * </ul>
+ *
+ * <p>Note that the attribute list provided will contain only
+ * attributes with explicit values (specified or defaulted):
+ * #IMPLIED attributes will be omitted. The attribute list
+ * will contain attributes used for Namespace declarations
+ * (xmlns* attributes) only if the
+ * <code>http://xml.org/sax/features/namespace-prefixes</code>
+ * property is true (it is false by default, and support for a
+ * true value is optional).</p>
+ *
+ * <p>Like {@link #characters characters()}, attribute values may have
+ * characters that need more than one <code>char</code> value. </p>
+ *
+ * @param uri The Namespace URI, or the empty string if the
+ * element has no Namespace URI or if Namespace
+ * processing is not being performed.
+ * @param localName The local name (without prefix), or the
+ * empty string if Namespace processing is not being
+ * performed.
+ * @param qName The qualified name (with prefix), or the
+ * empty string if qualified names are not available.
+ * @param atts The attributes attached to the element. If
+ * there are no attributes, it shall be an empty
+ * Attributes object.
+ * @exception org.xml.sax.SAXException Any SAX exception, possibly
+ * wrapping another exception.
+ * @see #endElement
+ * @see org.xml.sax.Attributes
+ */
+ public void startElement (String uri, String localName,
+ String qName, Attributes atts)
+ throws SAXException;
+
+
+ /**
+ * Receive notification of the end of an element.
+ *
+ * <p>The SAX parser will invoke this method at the end of every
+ * element in the XML document; there will be a corresponding
+ * {@link #startElement startElement} event for every endElement
+ * event (even when the element is empty).</p>
+ *
+ * <p>For information on the names, see startElement.</p>
+ *
+ * @param uri The Namespace URI, or the empty string if the
+ * element has no Namespace URI or if Namespace
+ * processing is not being performed.
+ * @param localName The local name (without prefix), or the
+ * empty string if Namespace processing is not being
+ * performed.
+ * @param qName The qualified XML 1.0 name (with prefix), or the
+ * empty string if qualified names are not available.
+ * @exception org.xml.sax.SAXException Any SAX exception, possibly
+ * wrapping another exception.
+ */
+ public void endElement (String uri, String localName,
+ String qName)
+ throws SAXException;
+
+
+ /**
+ * Receive notification of character data.
+ *
+ * <p>The Parser will call this method to report each chunk of
+ * character data. SAX parsers may return all contiguous character
+ * data in a single chunk, or they may split it into several
+ * chunks; however, all of the characters in any single event
+ * must come from the same external entity so that the Locator
+ * provides useful information.</p>
+ *
+ * <p>The application must not attempt to read from the array
+ * outside of the specified range.</p>
+ *
+ * <p>Individual characters may consist of more than one Java
+ * <code>char</code> value. There are two important cases where this
+ * happens, because characters can't be represented in just sixteen bits.
+ * In one case, characters are represented in a <em>Surrogate Pair</em>,
+ * using two special Unicode values. Such characters are in the so-called
+ * "Astral Planes", with a code point above U+FFFF. A second case involves
+ * composite characters, such as a base character combining with one or
+ * more accent characters. </p>
+ *
+ * <p> Your code should not assume that algorithms using
+ * <code>char</code>-at-a-time idioms will be working in character
+ * units; in some cases they will split characters. This is relevant
+ * wherever XML permits arbitrary characters, such as attribute values,
+ * processing instruction data, and comments as well as in data reported
+ * from this method. It's also generally relevant whenever Java code
+ * manipulates internationalized text; the issue isn't unique to XML.</p>
+ *
+ * <p>Note that some parsers will report whitespace in element
+ * content using the {@link #ignorableWhitespace ignorableWhitespace}
+ * method rather than this one (validating parsers <em>must</em>
+ * do so).</p>
+ *
+ * @param ch The characters from the XML document.
+ * @param start The start position in the array.
+ * @param length The number of characters to read from the array.
+ * @exception org.xml.sax.SAXException Any SAX exception, possibly
+ * wrapping another exception.
+ * @see #ignorableWhitespace
+ * @see org.xml.sax.Locator
+ */
+ public void characters (char ch[], int start, int length)
+ throws SAXException;
+
+
+ /**
+ * Receive notification of ignorable whitespace in element content.
+ *
+ * <p>Validating Parsers must use this method to report each chunk
+ * of whitespace in element content (see the W3C XML 1.0 recommendation,
+ * section 2.10): non-validating parsers may also use this method
+ * if they are capable of parsing and using content models.</p>
+ *
+ * <p>SAX parsers may return all contiguous whitespace in a single
+ * chunk, or they may split it into several chunks; however, all of
+ * the characters in any single event must come from the same
+ * external entity, so that the Locator provides useful
+ * information.</p>
+ *
+ * <p>The application must not attempt to read from the array
+ * outside of the specified range.</p>
+ *
+ * @param ch The characters from the XML document.
+ * @param start The start position in the array.
+ * @param length The number of characters to read from the array.
+ * @exception org.xml.sax.SAXException Any SAX exception, possibly
+ * wrapping another exception.
+ * @see #characters
+ */
+ public void ignorableWhitespace (char ch[], int start, int length)
+ throws SAXException;
+
+
+ /**
+ * Receive notification of a processing instruction.
+ *
+ * <p>The Parser will invoke this method once for each processing
+ * instruction found: note that processing instructions may occur
+ * before or after the main document element.</p>
+ *
+ * <p>A SAX parser must never report an XML declaration (XML 1.0,
+ * section 2.8) or a text declaration (XML 1.0, section 4.3.1)
+ * using this method.</p>
+ *
+ * <p>Like {@link #characters characters()}, processing instruction
+ * data may have characters that need more than one <code>char</code>
+ * value. </p>
+ *
+ * @param target The processing instruction target.
+ * @param data The processing instruction data, or null if
+ * none was supplied. The data does not include any
+ * whitespace separating it from the target.
+ * @exception org.xml.sax.SAXException Any SAX exception, possibly
+ * wrapping another exception.
+ */
+ public void processingInstruction (String target, String data)
+ throws SAXException;
+
+
+ /**
+ * Receive notification of a skipped entity.
+ * This is not called for entity references within markup constructs
+ * such as element start tags or markup declarations. (The XML
+ * recommendation requires reporting skipped external entities.
+ * SAX also reports internal entity expansion/non-expansion, except
+ * within markup constructs.)
+ *
+ * <p>The Parser will invoke this method each time the entity is
+ * skipped. Non-validating processors may skip entities if they
+ * have not seen the declarations (because, for example, the
+ * entity was declared in an external DTD subset). All processors
+ * may skip external entities, depending on the values of the
+ * <code>http://xml.org/sax/features/external-general-entities</code>
+ * and the
+ * <code>http://xml.org/sax/features/external-parameter-entities</code>
+ * properties.</p>
+ *
+ * @param name The name of the skipped entity. If it is a
+ * parameter entity, the name will begin with '%', and if
+ * it is the external DTD subset, it will be the string
+ * "[dtd]".
+ * @exception org.xml.sax.SAXException Any SAX exception, possibly
+ * wrapping another exception.
+ */
+ public void skippedEntity (String name)
+ throws SAXException;
+}
+
+// end of ContentHandler.java
diff --git a/external/jaxp/source/org/xml/sax/DTDHandler.java b/external/jaxp/source/org/xml/sax/DTDHandler.java
new file mode 100755
index 000000000..881f49782
--- /dev/null
+++ b/external/jaxp/source/org/xml/sax/DTDHandler.java
@@ -0,0 +1,117 @@
+// SAX DTD handler.
+// http://www.saxproject.org
+// No warranty; no copyright -- use this as you will.
+// $Id: DTDHandler.java,v 1.1 2003-02-01 02:10:41 cbj Exp $
+
+package org.xml.sax;
+
+/**
+ * Receive notification of basic DTD-related events.
+ *
+ * <blockquote>
+ * <em>This module, both source code and documentation, is in the
+ * Public Domain, and comes with <strong>NO WARRANTY</strong>.</em>
+ * See <a href='http://www.saxproject.org'>http://www.saxproject.org</a>
+ * for further information.
+ * </blockquote>
+ *
+ * <p>If a SAX application needs information about notations and
+ * unparsed entities, then the application implements this
+ * interface and registers an instance with the SAX parser using
+ * the parser's setDTDHandler method. The parser uses the
+ * instance to report notation and unparsed entity declarations to
+ * the application.</p>
+ *
+ * <p>Note that this interface includes only those DTD events that
+ * the XML recommendation <em>requires</em> processors to report:
+ * notation and unparsed entity declarations.</p>
+ *
+ * <p>The SAX parser may report these events in any order, regardless
+ * of the order in which the notations and unparsed entities were
+ * declared; however, all DTD events must be reported after the
+ * document handler's startDocument event, and before the first
+ * startElement event.
+ * (If the {@link org.xml.sax.ext.LexicalHandler LexicalHandler} is
+ * used, these events must also be reported before the endDTD event.)
+ * </p>
+ *
+ * <p>It is up to the application to store the information for
+ * future use (perhaps in a hash table or object tree).
+ * If the application encounters attributes of type "NOTATION",
+ * "ENTITY", or "ENTITIES", it can use the information that it
+ * obtained through this interface to find the entity and/or
+ * notation corresponding with the attribute value.</p>
+ *
+ * @since SAX 1.0
+ * @author David Megginson
+ * @version 2.0.1 (sax2r2)
+ * @see org.xml.sax.XMLReader#setDTDHandler
+ */
+public interface DTDHandler {
+
+
+ /**
+ * Receive notification of a notation declaration event.
+ *
+ * <p>It is up to the application to record the notation for later
+ * reference, if necessary;
+ * notations may appear as attribute values and in unparsed entity
+ * declarations, and are sometime used with processing instruction
+ * target names.</p>
+ *
+ * <p>At least one of publicId and systemId must be non-null.
+ * If a system identifier is present, and it is a URL, the SAX
+ * parser must resolve it fully before passing it to the
+ * application through this event.</p>
+ *
+ * <p>There is no guarantee that the notation declaration will be
+ * reported before any unparsed entities that use it.</p>
+ *
+ * @param name The notation name.
+ * @param publicId The notation's public identifier, or null if
+ * none was given.
+ * @param systemId The notation's system identifier, or null if
+ * none was given.
+ * @exception org.xml.sax.SAXException Any SAX exception, possibly
+ * wrapping another exception.
+ * @see #unparsedEntityDecl
+ * @see org.xml.sax.Attributes
+ */
+ public abstract void notationDecl (String name,
+ String publicId,
+ String systemId)
+ throws SAXException;
+
+
+ /**
+ * Receive notification of an unparsed entity declaration event.
+ *
+ * <p>Note that the notation name corresponds to a notation
+ * reported by the {@link #notationDecl notationDecl} event.
+ * It is up to the application to record the entity for later
+ * reference, if necessary;
+ * unparsed entities may appear as attribute values.
+ * </p>
+ *
+ * <p>If the system identifier is a URL, the parser must resolve it
+ * fully before passing it to the application.</p>
+ *
+ * @exception org.xml.sax.SAXException Any SAX exception, possibly
+ * wrapping another exception.
+ * @param name The unparsed entity's name.
+ * @param publicId The entity's public identifier, or null if none
+ * was given.
+ * @param systemId The entity's system identifier.
+ * @param notationName The name of the associated notation.
+ * @see #notationDecl
+ * @see org.xml.sax.Attributes
+ */
+ public abstract void unparsedEntityDecl (String name,
+ String publicId,
+ String systemId,
+ String notationName)
+ throws SAXException;
+
+}
+
+// end of DTDHandler.java
diff --git a/external/jaxp/source/org/xml/sax/DocumentHandler.java b/external/jaxp/source/org/xml/sax/DocumentHandler.java
new file mode 100755
index 000000000..0368533ec
--- /dev/null
+++ b/external/jaxp/source/org/xml/sax/DocumentHandler.java
@@ -0,0 +1,232 @@
+// SAX document handler.
+// http://www.saxproject.org
+// No warranty; no copyright -- use this as you will.
+// $Id: DocumentHandler.java,v 1.1 2003-02-01 02:10:42 cbj Exp $
+
+package org.xml.sax;
+
+/**
+ * Receive notification of general document events.
+ *
+ * <blockquote>
+ * <em>This module, both source code and documentation, is in the
+ * Public Domain, and comes with <strong>NO WARRANTY</strong>.</em>
+ * See <a href='http://www.saxproject.org'>http://www.saxproject.org</a>
+ * for further information.
+ * </blockquote>
+ *
+ * <p>This was the main event-handling interface for SAX1; in
+ * SAX2, it has been replaced by {@link org.xml.sax.ContentHandler
+ * ContentHandler}, which provides Namespace support and reporting
+ * of skipped entities. This interface is included in SAX2 only
+ * to support legacy SAX1 applications.</p>
+ *
+ * <p>The order of events in this interface is very important, and
+ * mirrors the order of information in the document itself. For
+ * example, all of an element's content (character data, processing
+ * instructions, and/or subelements) will appear, in order, between
+ * the startElement event and the corresponding endElement event.</p>
+ *
+ * <p>Application writers who do not want to implement the entire
+ * interface can derive a class from HandlerBase, which implements
+ * the default functionality; parser writers can instantiate
+ * HandlerBase to obtain a default handler. The application can find
+ * the location of any document event using the Locator interface
+ * supplied by the Parser through the setDocumentLocator method.</p>
+ *
+ * @deprecated This interface has been replaced by the SAX2
+ * {@link org.xml.sax.ContentHandler ContentHandler}
+ * interface, which includes Namespace support.
+ * @since SAX 1.0
+ * @author David Megginson
+ * @version 2.0.1 (sax2r2)
+ * @see org.xml.sax.Parser#setDocumentHandler
+ * @see org.xml.sax.Locator
+ * @see org.xml.sax.HandlerBase
+ */
+public interface DocumentHandler {
+
+
+ /**
+ * Receive an object for locating the origin of SAX document events.
+ *
+ * <p>SAX parsers are strongly encouraged (though not absolutely
+ * required) to supply a locator: if it does so, it must supply
+ * the locator to the application by invoking this method before
+ * invoking any of the other methods in the DocumentHandler
+ * interface.</p>
+ *
+ * <p>The locator allows the application to determine the end
+ * position of any document-related event, even if the parser is
+ * not reporting an error. Typically, the application will
+ * use this information for reporting its own errors (such as
+ * character content that does not match an application's
+ * business rules). The information returned by the locator
+ * is probably not sufficient for use with a search engine.</p>
+ *
+ * <p>Note that the locator will return correct information only
+ * during the invocation of the events in this interface. The
+ * application should not attempt to use it at any other time.</p>
+ *
+ * @param locator An object that can return the location of
+ * any SAX document event.
+ * @see org.xml.sax.Locator
+ */
+ public abstract void setDocumentLocator (Locator locator);
+
+
+ /**
+ * Receive notification of the beginning of a document.
+ *
+ * <p>The SAX parser will invoke this method only once, before any
+ * other methods in this interface or in DTDHandler (except for
+ * setDocumentLocator).</p>
+ *
+ * @exception org.xml.sax.SAXException Any SAX exception, possibly
+ * wrapping another exception.
+ */
+ public abstract void startDocument ()
+ throws SAXException;
+
+
+ /**
+ * Receive notification of the end of a document.
+ *
+ * <p>The SAX parser will invoke this method only once, and it will
+ * be the last method invoked during the parse. The parser shall
+ * not invoke this method until it has either abandoned parsing
+ * (because of an unrecoverable error) or reached the end of
+ * input.</p>
+ *
+ * @exception org.xml.sax.SAXException Any SAX exception, possibly
+ * wrapping another exception.
+ */
+ public abstract void endDocument ()
+ throws SAXException;
+
+
+ /**
+ * Receive notification of the beginning of an element.
+ *
+ * <p>The Parser will invoke this method at the beginning of every
+ * element in the XML document; there will be a corresponding
+ * endElement() event for every startElement() event (even when the
+ * element is empty). All of the element's content will be
+ * reported, in order, before the corresponding endElement()
+ * event.</p>
+ *
+ * <p>If the element name has a namespace prefix, the prefix will
+ * still be attached. Note that the attribute list provided will
+ * contain only attributes with explicit values (specified or
+ * defaulted): #IMPLIED attributes will be omitted.</p>
+ *
+ * @param name The element type name.
+ * @param atts The attributes attached to the element, if any.
+ * @exception org.xml.sax.SAXException Any SAX exception, possibly
+ * wrapping another exception.
+ * @see #endElement
+ * @see org.xml.sax.AttributeList
+ */
+ public abstract void startElement (String name, AttributeList atts)
+ throws SAXException;
+
+
+ /**
+ * Receive notification of the end of an element.
+ *
+ * <p>The SAX parser will invoke this method at the end of every
+ * element in the XML document; there will be a corresponding
+ * startElement() event for every endElement() event (even when the
+ * element is empty).</p>
+ *
+ * <p>If the element name has a namespace prefix, the prefix will
+ * still be attached to the name.</p>
+ *
+ * @param name The element type name
+ * @exception org.xml.sax.SAXException Any SAX exception, possibly
+ * wrapping another exception.
+ */
+ public abstract void endElement (String name)
+ throws SAXException;
+
+
+ /**
+ * Receive notification of character data.
+ *
+ * <p>The Parser will call this method to report each chunk of
+ * character data. SAX parsers may return all contiguous character
+ * data in a single chunk, or they may split it into several
+ * chunks; however, all of the characters in any single event
+ * must come from the same external entity, so that the Locator
+ * provides useful information.</p>
+ *
+ * <p>The application must not attempt to read from the array
+ * outside of the specified range.</p>
+ *
+ * <p>Note that some parsers will report whitespace using the
+ * ignorableWhitespace() method rather than this one (validating
+ * parsers must do so).</p>
+ *
+ * @param ch The characters from the XML document.
+ * @param start The start position in the array.
+ * @param length The number of characters to read from the array.
+ * @exception org.xml.sax.SAXException Any SAX exception, possibly
+ * wrapping another exception.
+ * @see #ignorableWhitespace
+ * @see org.xml.sax.Locator
+ */
+ public abstract void characters (char ch[], int start, int length)
+ throws SAXException;
+
+
+ /**
+ * Receive notification of ignorable whitespace in element content.
+ *
+ * <p>Validating Parsers must use this method to report each chunk
+ * of ignorable whitespace (see the W3C XML 1.0 recommendation,
+ * section 2.10): non-validating parsers may also use this method
+ * if they are capable of parsing and using content models.</p>
+ *
+ * <p>SAX parsers may return all contiguous whitespace in a single
+ * chunk, or they may split it into several chunks; however, all of
+ * the characters in any single event must come from the same
+ * external entity, so that the Locator provides useful
+ * information.</p>
+ *
+ * <p>The application must not attempt to read from the array
+ * outside of the specified range.</p>
+ *
+ * @param ch The characters from the XML document.
+ * @param start The start position in the array.
+ * @param length The number of characters to read from the array.
+ * @exception org.xml.sax.SAXException Any SAX exception, possibly
+ * wrapping another exception.
+ * @see #characters
+ */
+ public abstract void ignorableWhitespace (char ch[], int start, int length)
+ throws SAXException;
+
+
+ /**
+ * Receive notification of a processing instruction.
+ *
+ * <p>The Parser will invoke this method once for each processing
+ * instruction found: note that processing instructions may occur
+ * before or after the main document element.</p>
+ *
+ * <p>A SAX parser should never report an XML declaration (XML 1.0,
+ * section 2.8) or a text declaration (XML 1.0, section 4.3.1)
+ * using this method.</p>
+ *
+ * @param target The processing instruction target.
+ * @param data The processing instruction data, or null if
+ * none was supplied.
+ * @exception org.xml.sax.SAXException Any SAX exception, possibly
+ * wrapping another exception.
+ */
+ public abstract void processingInstruction (String target, String data)
+ throws SAXException;
+
+}
+
+// end of DocumentHandler.java
diff --git a/external/jaxp/source/org/xml/sax/EntityResolver.java b/external/jaxp/source/org/xml/sax/EntityResolver.java
new file mode 100755
index 000000000..3e22251cd
--- /dev/null
+++ b/external/jaxp/source/org/xml/sax/EntityResolver.java
@@ -0,0 +1,119 @@
+// SAX entity resolver.
+// http://www.saxproject.org
+// No warranty; no copyright -- use this as you will.
+// $Id: EntityResolver.java,v 1.1 2003-02-01 02:10:42 cbj Exp $
+
+package org.xml.sax;
+
+import java.io.IOException;
+
+
+/**
+ * Basic interface for resolving entities.
+ *
+ * <blockquote>
+ * <em>This module, both source code and documentation, is in the
+ * Public Domain, and comes with <strong>NO WARRANTY</strong>.</em>
+ * See <a href='http://www.saxproject.org'>http://www.saxproject.org</a>
+ * for further information.
+ * </blockquote>
+ *
+ * <p>If a SAX application needs to implement customized handling
+ * for external entities, it must implement this interface and
+ * register an instance with the SAX driver using the
+ * {@link org.xml.sax.XMLReader#setEntityResolver setEntityResolver}
+ * method.</p>
+ *
+ * <p>The XML reader will then allow the application to intercept any
+ * external entities (including the external DTD subset and external
+ * parameter entities, if any) before including them.</p>
+ *
+ * <p>Many SAX applications will not need to implement this interface,
+ * but it will be especially useful for applications that build
+ * XML documents from databases or other specialised input sources,
+ * or for applications that use URI types other than URLs.</p>
+ *
+ * <p>The following resolver would provide the application
+ * with a special character stream for the entity with the system
+ * identifier "http://www.myhost.com/today":</p>
+ *
+ * <pre>
+ * import org.xml.sax.EntityResolver;
+ * import org.xml.sax.InputSource;
+ *
+ * public class MyResolver implements EntityResolver {
+ * public InputSource resolveEntity (String publicId, String systemId)
+ * {
+ * if (systemId.equals("http://www.myhost.com/today")) {
+ * // return a special input source
+ * MyReader reader = new MyReader();
+ * return new InputSource(reader);
+ * } else {
+ * // use the default behaviour
+ * return null;
+ * }
+ * }
+ * }
+ * </pre>
+ *
+ * <p>The application can also use this interface to redirect system
+ * identifiers to local URIs or to look up replacements in a catalog
+ * (possibly by using the public identifier).</p>
+ *
+ * @since SAX 1.0
+ * @author David Megginson
+ * @version 2.0.1 (sax2r2)
+ * @see org.xml.sax.XMLReader#setEntityResolver
+ * @see org.xml.sax.InputSource
+ */
+public interface EntityResolver {
+
+
+ /**
+ * Allow the application to resolve external entities.
+ *
+ * <p>The parser will call this method before opening any external
+ * entity except the top-level document entity. Such entities include
+ * the external DTD subset and external parameter entities referenced
+ * within the DTD (in either case, only if the parser reads external
+ * parameter entities), and external general entities referenced
+ * within the document element (if the parser reads external general
+ * entities). The application may request that the parser locate
+ * the entity itself, that it use an alternative URI, or that it
+ * use data provided by the application (as a character or byte
+ * input stream).</p>
+ *
+ * <p>Application writers can use this method to redirect external
+ * system identifiers to secure and/or local URIs, to look up
+ * public identifiers in a catalogue, or to read an entity from a
+ * database or other input source (including, for example, a dialog
+ * box). Neither XML nor SAX specifies a preferred policy for using
+ * public or system IDs to resolve resources. However, SAX specifies
+ * how to interpret any InputSource returned by this method, and that
+ * if none is returned, then the system ID will be dereferenced as
+ * a URL. </p>
+ *
+ * <p>If the system identifier is a URL, the SAX parser must
+ * resolve it fully before reporting it to the application.</p>
+ *
+ * @param publicId The public identifier of the external entity
+ * being referenced, or null if none was supplied.
+ * @param systemId The system identifier of the external entity
+ * being referenced.
+ * @return An InputSource object describing the new input source,
+ * or null to request that the parser open a regular
+ * URI connection to the system identifier.
+ * @exception org.xml.sax.SAXException Any SAX exception, possibly
+ * wrapping another exception.
+ * @exception java.io.IOException A Java-specific IO exception,
+ * possibly the result of creating a new InputStream
+ * or Reader for the InputSource.
+ * @see org.xml.sax.InputSource
+ */
+ public abstract InputSource resolveEntity (String publicId,
+ String systemId)
+ throws SAXException, IOException;
+
+}
+
+// end of EntityResolver.java
diff --git a/external/jaxp/source/org/xml/sax/ErrorHandler.java b/external/jaxp/source/org/xml/sax/ErrorHandler.java
new file mode 100755
index 000000000..eec24f366
--- /dev/null
+++ b/external/jaxp/source/org/xml/sax/ErrorHandler.java
@@ -0,0 +1,125 @@
+// SAX error handler.
+// http://www.saxproject.org
+// No warranty; no copyright -- use this as you will.
+// $Id: ErrorHandler.java,v 1.1 2003-02-01 02:10:42 cbj Exp $
+
+package org.xml.sax;
+
+
+/**
+ * Basic interface for SAX error handlers.
+ *
+ * <blockquote>
+ * <em>This module, both source code and documentation, is in the
+ * Public Domain, and comes with <strong>NO WARRANTY</strong>.</em>
+ * See <a href='http://www.saxproject.org'>http://www.saxproject.org</a>
+ * for further information.
+ * </blockquote>
+ *
+ * <p>If a SAX application needs to implement customized error
+ * handling, it must implement this interface and then register an
+ * instance with the XML reader using the
+ * {@link org.xml.sax.XMLReader#setErrorHandler setErrorHandler}
+ * method. The parser will then report all errors and warnings
+ * through this interface.</p>
+ *
+ * <p><strong>WARNING:</strong> If an application does <em>not</em>
+ * register an ErrorHandler, XML parsing errors will go unreported
+ * and bizarre behaviour may result.</p>
+ *
+ * <p>For XML processing errors, a SAX driver must use this interface
+ * instead of throwing an exception: it is up to the application
+ * to decide whether to throw an exception for different types of
+ * errors and warnings. Note, however, that there is no requirement that
+ * the parser continue to provide useful information after a call to
+ * {@link #fatalError fatalError} (in other words, a SAX driver class
+ * could catch an exception and report a fatalError).</p>
+ *
+ * @since SAX 1.0
+ * @author David Megginson
+ * @version 2.0.1 (sax2r2)
+ * @see org.xml.sax.XMLReader#setErrorHandler
+ * @see org.xml.sax.SAXParseException
+ */
+public interface ErrorHandler {
+
+
+ /**
+ * Receive notification of a warning.
+ *
+ * <p>SAX parsers will use this method to report conditions that
+ * are not errors or fatal errors as defined by the XML 1.0
+ * recommendation. The default behaviour is to take no action.</p>
+ *
+ * <p>The SAX parser must continue to provide normal parsing events
+ * after invoking this method: it should still be possible for the
+ * application to process the document through to the end.</p>
+ *
+ * <p>Filters may use this method to report other, non-XML warnings
+ * as well.</p>
+ *
+ * @param exception The warning information encapsulated in a
+ * SAX parse exception.
+ * @exception org.xml.sax.SAXException Any SAX exception, possibly
+ * wrapping another exception.
+ * @see org.xml.sax.SAXParseException
+ */
+ public abstract void warning (SAXParseException exception)
+ throws SAXException;
+
+
+ /**
+ * Receive notification of a recoverable error.
+ *
+ * <p>This corresponds to the definition of "error" in section 1.2
+ * of the W3C XML 1.0 Recommendation. For example, a validating
+ * parser would use this callback to report the violation of a
+ * validity constraint. The default behaviour is to take no
+ * action.</p>
+ *
+ * <p>The SAX parser must continue to provide normal parsing events
+ * after invoking this method: it should still be possible for the
+ * application to process the document through to the end. If the
+ * application cannot do so, then the parser should report a fatal
+ * error even if the XML 1.0 recommendation does not require it to
+ * do so.</p>
+ *
+ * <p>Filters may use this method to report other, non-XML errors
+ * as well.</p>
+ *
+ * @param exception The error information encapsulated in a
+ * SAX parse exception.
+ * @exception org.xml.sax.SAXException Any SAX exception, possibly
+ * wrapping another exception.
+ * @see org.xml.sax.SAXParseException
+ */
+ public abstract void error (SAXParseException exception)
+ throws SAXException;
+
+
+ /**
+ * Receive notification of a non-recoverable error.
+ *
+ * <p>This corresponds to the definition of "fatal error" in
+ * section 1.2 of the W3C XML 1.0 Recommendation. For example, a
+ * parser would use this callback to report the violation of a
+ * well-formedness constraint.</p>
+ *
+ * <p>The application must assume that the document is unusable
+ * after the parser has invoked this method, and should continue
+ * (if at all) only for the sake of collecting addition error
+ * messages: in fact, SAX parsers are free to stop reporting any
+ * other events once this method has been invoked.</p>
+ *
+ * @param exception The error information encapsulated in a
+ * SAX parse exception.
+ * @exception org.xml.sax.SAXException Any SAX exception, possibly
+ * wrapping another exception.
+ * @see org.xml.sax.SAXParseException
+ */
+ public abstract void fatalError (SAXParseException exception)
+ throws SAXException;
+
+}
+
+// end of ErrorHandler.java
diff --git a/external/jaxp/source/org/xml/sax/HandlerBase.java b/external/jaxp/source/org/xml/sax/HandlerBase.java
new file mode 100755
index 000000000..d1d6db5e7
--- /dev/null
+++ b/external/jaxp/source/org/xml/sax/HandlerBase.java
@@ -0,0 +1,370 @@
+// SAX default handler base class.
+// http://www.saxproject.org
+// No warranty; no copyright -- use this as you will.
+// $Id: HandlerBase.java,v 1.1 2003-02-01 02:10:42 cbj Exp $
+
+package org.xml.sax;
+
+/**
+ * Default base class for handlers.
+ *
+ * <blockquote>
+ * <em>This module, both source code and documentation, is in the
+ * Public Domain, and comes with <strong>NO WARRANTY</strong>.</em>
+ * See <a href='http://www.saxproject.org'>http://www.saxproject.org</a>
+ * for further information.
+ * </blockquote>
+ *
+ * <p>This class implements the default behaviour for four SAX1
+ * interfaces: EntityResolver, DTDHandler, DocumentHandler,
+ * and ErrorHandler. It is now obsolete, but is included in SAX2 to
+ * support legacy SAX1 applications. SAX2 applications should use
+ * the {@link org.xml.sax.helpers.DefaultHandler DefaultHandler}
+ * class instead.</p>
+ *
+ * <p>Application writers can extend this class when they need to
+ * implement only part of an interface; parser writers can
+ * instantiate this class to provide default handlers when the
+ * application has not supplied its own.</p>
+ *
+ * <p>Note that the use of this class is optional.</p>
+ *
+ * @deprecated This class works with the deprecated
+ * {@link org.xml.sax.DocumentHandler DocumentHandler}
+ * interface. It has been replaced by the SAX2
+ * {@link org.xml.sax.helpers.DefaultHandler DefaultHandler}
+ * class.
+ * @since SAX 1.0
+ * @author David Megginson
+ * @version 2.0.1 (sax2r2)
+ * @see org.xml.sax.EntityResolver
+ * @see org.xml.sax.DTDHandler
+ * @see org.xml.sax.DocumentHandler
+ * @see org.xml.sax.ErrorHandler
+ */
+public class HandlerBase
+ implements EntityResolver, DTDHandler, DocumentHandler, ErrorHandler
+{
+
+
+ ////////////////////////////////////////////////////////////////////
+ // Default implementation of the EntityResolver interface.
+ ////////////////////////////////////////////////////////////////////
+
+ /**
+ * Resolve an external entity.
+ *
+ * <p>Always return null, so that the parser will use the system
+ * identifier provided in the XML document. This method implements
+ * the SAX default behaviour: application writers can override it
+ * in a subclass to do special translations such as catalog lookups
+ * or URI redirection.</p>
+ *
+ * @param publicId The public identifer, or null if none is
+ * available.
+ * @param systemId The system identifier provided in the XML
+ * document.
+ * @return The new input source, or null to require the
+ * default behaviour.
+ * @exception org.xml.sax.SAXException Any SAX exception, possibly
+ * wrapping another exception.
+ * @see org.xml.sax.EntityResolver#resolveEntity
+ */
+ public InputSource resolveEntity (String publicId, String systemId)
+ throws SAXException
+ {
+ return null;
+ }
+
+
+
+ ////////////////////////////////////////////////////////////////////
+ // Default implementation of DTDHandler interface.
+ ////////////////////////////////////////////////////////////////////
+
+
+ /**
+ * Receive notification of a notation declaration.
+ *
+ * <p>By default, do nothing. Application writers may override this
+ * method in a subclass if they wish to keep track of the notations
+ * declared in a document.</p>
+ *
+ * @param name The notation name.
+ * @param publicId The notation public identifier, or null if not
+ * available.
+ * @param systemId The notation system identifier.
+ * @see org.xml.sax.DTDHandler#notationDecl
+ */
+ public void notationDecl (String name, String publicId, String systemId)
+ {
+ // no op
+ }
+
+
+ /**
+ * Receive notification of an unparsed entity declaration.
+ *
+ * <p>By default, do nothing. Application writers may override this
+ * method in a subclass to keep track of the unparsed entities
+ * declared in a document.</p>
+ *
+ * @param name The entity name.
+ * @param publicId The entity public identifier, or null if not
+ * available.
+ * @param systemId The entity system identifier.
+ * @param notationName The name of the associated notation.
+ * @see org.xml.sax.DTDHandler#unparsedEntityDecl
+ */
+ public void unparsedEntityDecl (String name, String publicId,
+ String systemId, String notationName)
+ {
+ // no op
+ }
+
+
+
+ ////////////////////////////////////////////////////////////////////
+ // Default implementation of DocumentHandler interface.
+ ////////////////////////////////////////////////////////////////////
+
+
+ /**
+ * Receive a Locator object for document events.
+ *
+ * <p>By default, do nothing. Application writers may override this
+ * method in a subclass if they wish to store the locator for use
+ * with other document events.</p>
+ *
+ * @param locator A locator for all SAX document events.
+ * @see org.xml.sax.DocumentHandler#setDocumentLocator
+ * @see org.xml.sax.Locator
+ */
+ public void setDocumentLocator (Locator locator)
+ {
+ // no op
+ }
+
+
+ /**
+ * Receive notification of the beginning of the document.
+ *
+ * <p>By default, do nothing. Application writers may override this
+ * method in a subclass to take specific actions at the beginning
+ * of a document (such as allocating the root node of a tree or
+ * creating an output file).</p>
+ *
+ * @exception org.xml.sax.SAXException Any SAX exception, possibly
+ * wrapping another exception.
+ * @see org.xml.sax.DocumentHandler#startDocument
+ */
+ public void startDocument ()
+ throws SAXException
+ {
+ // no op
+ }
+
+
+ /**
+ * Receive notification of the end of the document.
+ *
+ * <p>By default, do nothing. Application writers may override this
+ * method in a subclass to take specific actions at the beginning
+ * of a document (such as finalising a tree or closing an output
+ * file).</p>
+ *
+ * @exception org.xml.sax.SAXException Any SAX exception, possibly
+ * wrapping another exception.
+ * @see org.xml.sax.DocumentHandler#endDocument
+ */
+ public void endDocument ()
+ throws SAXException
+ {
+ // no op
+ }
+
+
+ /**
+ * Receive notification of the start of an element.
+ *
+ * <p>By default, do nothing. Application writers may override this
+ * method in a subclass to take specific actions at the start of
+ * each element (such as allocating a new tree node or writing
+ * output to a file).</p>
+ *
+ * @param name The element type name.
+ * @param attributes The specified or defaulted attributes.
+ * @exception org.xml.sax.SAXException Any SAX exception, possibly
+ * wrapping another exception.
+ * @see org.xml.sax.DocumentHandler#startElement
+ */
+ public void startElement (String name, AttributeList attributes)
+ throws SAXException
+ {
+ // no op
+ }
+
+
+ /**
+ * Receive notification of the end of an element.
+ *
+ * <p>By default, do nothing. Application writers may override this
+ * method in a subclass to take specific actions at the end of
+ * each element (such as finalising a tree node or writing
+ * output to a file).</p>
+ *
+ * @param name The element type name.
+ * @param attributes The specified or defaulted attributes.
+ * @exception org.xml.sax.SAXException Any SAX exception, possibly
+ * wrapping another exception.
+ * @see org.xml.sax.DocumentHandler#endElement
+ */
+ public void endElement (String name)
+ throws SAXException
+ {
+ // no op
+ }
+
+
+ /**
+ * Receive notification of character data inside an element.
+ *
+ * <p>By default, do nothing. Application writers may override this
+ * method to take specific actions for each chunk of character data
+ * (such as adding the data to a node or buffer, or printing it to
+ * a file).</p>
+ *
+ * @param ch The characters.
+ * @param start The start position in the character array.
+ * @param length The number of characters to use from the
+ * character array.
+ * @exception org.xml.sax.SAXException Any SAX exception, possibly
+ * wrapping another exception.
+ * @see org.xml.sax.DocumentHandler#characters
+ */
+ public void characters (char ch[], int start, int length)
+ throws SAXException
+ {
+ // no op
+ }
+
+
+ /**
+ * Receive notification of ignorable whitespace in element content.
+ *
+ * <p>By default, do nothing. Application writers may override this
+ * method to take specific actions for each chunk of ignorable
+ * whitespace (such as adding data to a node or buffer, or printing
+ * it to a file).</p>
+ *
+ * @param ch The whitespace characters.
+ * @param start The start position in the character array.
+ * @param length The number of characters to use from the
+ * character array.
+ * @exception org.xml.sax.SAXException Any SAX exception, possibly
+ * wrapping another exception.
+ * @see org.xml.sax.DocumentHandler#ignorableWhitespace
+ */
+ public void ignorableWhitespace (char ch[], int start, int length)
+ throws SAXException
+ {
+ // no op
+ }
+
+
+ /**
+ * Receive notification of a processing instruction.
+ *
+ * <p>By default, do nothing. Application writers may override this
+ * method in a subclass to take specific actions for each
+ * processing instruction, such as setting status variables or
+ * invoking other methods.</p>
+ *
+ * @param target The processing instruction target.
+ * @param data The processing instruction data, or null if
+ * none is supplied.
+ * @exception org.xml.sax.SAXException Any SAX exception, possibly
+ * wrapping another exception.
+ * @see org.xml.sax.DocumentHandler#processingInstruction
+ */
+ public void processingInstruction (String target, String data)
+ throws SAXException
+ {
+ // no op
+ }
+
+
+
+ ////////////////////////////////////////////////////////////////////
+ // Default implementation of the ErrorHandler interface.
+ ////////////////////////////////////////////////////////////////////
+
+
+ /**
+ * Receive notification of a parser warning.
+ *
+ * <p>The default implementation does nothing. Application writers
+ * may override this method in a subclass to take specific actions
+ * for each warning, such as inserting the message in a log file or
+ * printing it to the console.</p>
+ *
+ * @param e The warning information encoded as an exception.
+ * @exception org.xml.sax.SAXException Any SAX exception, possibly
+ * wrapping another exception.
+ * @see org.xml.sax.ErrorHandler#warning
+ * @see org.xml.sax.SAXParseException
+ */
+ public void warning (SAXParseException e)
+ throws SAXException
+ {
+ // no op
+ }
+
+
+ /**
+ * Receive notification of a recoverable parser error.
+ *
+ * <p>The default implementation does nothing. Application writers
+ * may override this method in a subclass to take specific actions
+ * for each error, such as inserting the message in a log file or
+ * printing it to the console.</p>
+ *
+ * @param e The warning information encoded as an exception.
+ * @exception org.xml.sax.SAXException Any SAX exception, possibly
+ * wrapping another exception.
+ * @see org.xml.sax.ErrorHandler#warning
+ * @see org.xml.sax.SAXParseException
+ */
+ public void error (SAXParseException e)
+ throws SAXException
+ {
+ // no op
+ }
+
+
+ /**
+ * Report a fatal XML parsing error.
+ *
+ * <p>The default implementation throws a SAXParseException.
+ * Application writers may override this method in a subclass if
+ * they need to take specific actions for each fatal error (such as
+ * collecting all of the errors into a single report): in any case,
+ * the application must stop all regular processing when this
+ * method is invoked, since the document is no longer reliable, and
+ * the parser may no longer report parsing events.</p>
+ *
+ * @param e The error information encoded as an exception.
+ * @exception org.xml.sax.SAXException Any SAX exception, possibly
+ * wrapping another exception.
+ * @see org.xml.sax.ErrorHandler#fatalError
+ * @see org.xml.sax.SAXParseException
+ */
+ public void fatalError (SAXParseException e)
+ throws SAXException
+ {
+ throw e;
+ }
+
+}
+
+// end of HandlerBase.java
diff --git a/external/jaxp/source/org/xml/sax/InputSource.java b/external/jaxp/source/org/xml/sax/InputSource.java
new file mode 100755
index 000000000..3c4067fc2
--- /dev/null
+++ b/external/jaxp/source/org/xml/sax/InputSource.java
@@ -0,0 +1,336 @@
+// SAX input source.
+// http://www.saxproject.org
+// No warranty; no copyright -- use this as you will.
+// $Id: InputSource.java,v 1.1 2003-02-01 02:10:42 cbj Exp $
+
+package org.xml.sax;
+
+import java.io.Reader;
+import java.io.InputStream;
+
+/**
+ * A single input source for an XML entity.
+ *
+ * <blockquote>
+ * <em>This module, both source code and documentation, is in the
+ * Public Domain, and comes with <strong>NO WARRANTY</strong>.</em>
+ * See <a href='http://www.saxproject.org'>http://www.saxproject.org</a>
+ * for further information.
+ * </blockquote>
+ *
+ * <p>This class allows a SAX application to encapsulate information
+ * about an input source in a single object, which may include
+ * a public identifier, a system identifier, a byte stream (possibly
+ * with a specified encoding), and/or a character stream.</p>
+ *
+ * <p>There are two places that the application can deliver an
+ * input source to the parser: as the argument to the Parser.parse
+ * method, or as the return value of the EntityResolver.resolveEntity
+ * method.</p>
+ *
+ * <p>The SAX parser will use the InputSource object to determine how
+ * to read XML input. If there is a character stream available, the
+ * parser will read that stream directly, disregarding any text
+ * encoding declaration found in that stream.
+ * If there is no character stream, but there is
+ * a byte stream, the parser will use that byte stream, using the
+ * encoding specified in the InputSource or else (if no encoding is
+ * specified) autodetecting the character encoding using an algorithm
+ * such as the one in the XML specification. If neither a character
+ * stream nor a
+ * byte stream is available, the parser will attempt to open a URI
+ * connection to the resource identified by the system
+ * identifier.</p>
+ *
+ * <p>An InputSource object belongs to the application: the SAX parser
+ * shall never modify it in any way (it may modify a copy if
+ * necessary). However, standard processing of both byte and
+ * character streams is to close them on as part of end-of-parse cleanup,
+ * so applications should not attempt to re-use such streams after they
+ * have been handed to a parser. </p>
+ *
+ * @since SAX 1.0
+ * @author David Megginson
+ * @version 2.0.1 (sax2r2)
+ * @see org.xml.sax.XMLReader#parse(org.xml.sax.InputSource)
+ * @see org.xml.sax.EntityResolver#resolveEntity
+ * @see java.io.InputStream
+ * @see java.io.Reader
+ */
+public class InputSource {
+
+ /**
+ * Zero-argument default constructor.
+ *
+ * @see #setPublicId
+ * @see #setSystemId
+ * @see #setByteStream
+ * @see #setCharacterStream
+ * @see #setEncoding
+ */
+ public InputSource ()
+ {
+ }
+
+
+ /**
+ * Create a new input source with a system identifier.
+ *
+ * <p>Applications may use setPublicId to include a
+ * public identifier as well, or setEncoding to specify
+ * the character encoding, if known.</p>
+ *
+ * <p>If the system identifier is a URL, it must be fully
+ * resolved (it may not be a relative URL).</p>
+ *
+ * @param systemId The system identifier (URI).
+ * @see #setPublicId
+ * @see #setSystemId
+ * @see #setByteStream
+ * @see #setEncoding
+ * @see #setCharacterStream
+ */
+ public InputSource (String systemId)
+ {
+ setSystemId(systemId);
+ }
+
+
+ /**
+ * Create a new input source with a byte stream.
+ *
+ * <p>Application writers should use setSystemId() to provide a base
+ * for resolving relative URIs, may use setPublicId to include a
+ * public identifier, and may use setEncoding to specify the object's
+ * character encoding.</p>
+ *
+ * @param byteStream The raw byte stream containing the document.
+ * @see #setPublicId
+ * @see #setSystemId
+ * @see #setEncoding
+ * @see #setByteStream
+ * @see #setCharacterStream
+ */
+ public InputSource (InputStream byteStream)
+ {
+ setByteStream(byteStream);
+ }
+
+
+ /**
+ * Create a new input source with a character stream.
+ *
+ * <p>Application writers should use setSystemId() to provide a base
+ * for resolving relative URIs, and may use setPublicId to include a
+ * public identifier.</p>
+ *
+ * <p>The character stream shall not include a byte order mark.</p>
+ *
+ * @see #setPublicId
+ * @see #setSystemId
+ * @see #setByteStream
+ * @see #setCharacterStream
+ */
+ public InputSource (Reader characterStream)
+ {
+ setCharacterStream(characterStream);
+ }
+
+
+ /**
+ * Set the public identifier for this input source.
+ *
+ * <p>The public identifier is always optional: if the application
+ * writer includes one, it will be provided as part of the
+ * location information.</p>
+ *
+ * @param publicId The public identifier as a string.
+ * @see #getPublicId
+ * @see org.xml.sax.Locator#getPublicId
+ * @see org.xml.sax.SAXParseException#getPublicId
+ */
+ public void setPublicId (String publicId)
+ {
+ this.publicId = publicId;
+ }
+
+
+ /**
+ * Get the public identifier for this input source.
+ *
+ * @return The public identifier, or null if none was supplied.
+ * @see #setPublicId
+ */
+ public String getPublicId ()
+ {
+ return publicId;
+ }
+
+
+ /**
+ * Set the system identifier for this input source.
+ *
+ * <p>The system identifier is optional if there is a byte stream
+ * or a character stream, but it is still useful to provide one,
+ * since the application can use it to resolve relative URIs
+ * and can include it in error messages and warnings (the parser
+ * will attempt to open a connection to the URI only if
+ * there is no byte stream or character stream specified).</p>
+ *
+ * <p>If the application knows the character encoding of the
+ * object pointed to by the system identifier, it can register
+ * the encoding using the setEncoding method.</p>
+ *
+ * <p>If the system identifier is a URL, it must be fully
+ * resolved (it may not be a relative URL).</p>
+ *
+ * @param systemId The system identifier as a string.
+ * @see #setEncoding
+ * @see #getSystemId
+ * @see org.xml.sax.Locator#getSystemId
+ * @see org.xml.sax.SAXParseException#getSystemId
+ */
+ public void setSystemId (String systemId)
+ {
+ this.systemId = systemId;
+ }
+
+
+ /**
+ * Get the system identifier for this input source.
+ *
+ * <p>The getEncoding method will return the character encoding
+ * of the object pointed to, or null if unknown.</p>
+ *
+ * <p>If the system ID is a URL, it will be fully resolved.</p>
+ *
+ * @return The system identifier, or null if none was supplied.
+ * @see #setSystemId
+ * @see #getEncoding
+ */
+ public String getSystemId ()
+ {
+ return systemId;
+ }
+
+
+ /**
+ * Set the byte stream for this input source.
+ *
+ * <p>The SAX parser will ignore this if there is also a character
+ * stream specified, but it will use a byte stream in preference
+ * to opening a URI connection itself.</p>
+ *
+ * <p>If the application knows the character encoding of the
+ * byte stream, it should set it with the setEncoding method.</p>
+ *
+ * @param byteStream A byte stream containing an XML document or
+ * other entity.
+ * @see #setEncoding
+ * @see #getByteStream
+ * @see #getEncoding
+ * @see java.io.InputStream
+ */
+ public void setByteStream (InputStream byteStream)
+ {
+ this.byteStream = byteStream;
+ }
+
+
+ /**
+ * Get the byte stream for this input source.
+ *
+ * <p>The getEncoding method will return the character
+ * encoding for this byte stream, or null if unknown.</p>
+ *
+ * @return The byte stream, or null if none was supplied.
+ * @see #getEncoding
+ * @see #setByteStream
+ */
+ public InputStream getByteStream ()
+ {
+ return byteStream;
+ }
+
+
+ /**
+ * Set the character encoding, if known.
+ *
+ * <p>The encoding must be a string acceptable for an
+ * XML encoding declaration (see section 4.3.3 of the XML 1.0
+ * recommendation).</p>
+ *
+ * <p>This method has no effect when the application provides a
+ * character stream.</p>
+ *
+ * @param encoding A string describing the character encoding.
+ * @see #setSystemId
+ * @see #setByteStream
+ * @see #getEncoding
+ */
+ public void setEncoding (String encoding)
+ {
+ this.encoding = encoding;
+ }
+
+
+ /**
+ * Get the character encoding for a byte stream or URI.
+ * This value will be ignored when the application provides a
+ * character stream.
+ *
+ * @return The encoding, or null if none was supplied.
+ * @see #setByteStream
+ * @see #getSystemId
+ * @see #getByteStream
+ */
+ public String getEncoding ()
+ {
+ return encoding;
+ }
+
+
+ /**
+ * Set the character stream for this input source.
+ *
+ * <p>If there is a character stream specified, the SAX parser
+ * will ignore any byte stream and will not attempt to open
+ * a URI connection to the system identifier.</p>
+ *
+ * @param characterStream The character stream containing the
+ * XML document or other entity.
+ * @see #getCharacterStream
+ * @see java.io.Reader
+ */
+ public void setCharacterStream (Reader characterStream)
+ {
+ this.characterStream = characterStream;
+ }
+
+
+ /**
+ * Get the character stream for this input source.
+ *
+ * @return The character stream, or null if none was supplied.
+ * @see #setCharacterStream
+ */
+ public Reader getCharacterStream ()
+ {
+ return characterStream;
+ }
+
+
+
+ ////////////////////////////////////////////////////////////////////
+ // Internal state.
+ ////////////////////////////////////////////////////////////////////
+
+ private String publicId;
+ private String systemId;
+ private InputStream byteStream;
+ private String encoding;
+ private Reader characterStream;
+
+}
+
+// end of InputSource.java
diff --git a/external/jaxp/source/org/xml/sax/Locator.java b/external/jaxp/source/org/xml/sax/Locator.java
new file mode 100755
index 000000000..0a97ed8c0
--- /dev/null
+++ b/external/jaxp/source/org/xml/sax/Locator.java
@@ -0,0 +1,136 @@
+// SAX locator interface for document events.
+// http://www.saxproject.org
+// No warranty; no copyright -- use this as you will.
+// $Id: Locator.java,v 1.1 2003-02-01 02:10:42 cbj Exp $
+
+package org.xml.sax;
+
+
+/**
+ * Interface for associating a SAX event with a document location.
+ *
+ * <blockquote>
+ * <em>This module, both source code and documentation, is in the
+ * Public Domain, and comes with <strong>NO WARRANTY</strong>.</em>
+ * See <a href='http://www.saxproject.org'>http://www.saxproject.org</a>
+ * for further information.
+ * </blockquote>
+ *
+ * <p>If a SAX parser provides location information to the SAX
+ * application, it does so by implementing this interface and then
+ * passing an instance to the application using the content
+ * handler's {@link org.xml.sax.ContentHandler#setDocumentLocator
+ * setDocumentLocator} method. The application can use the
+ * object to obtain the location of any other SAX event
+ * in the XML source document.</p>
+ *
+ * <p>Note that the results returned by the object will be valid only
+ * during the scope of each callback method: the application
+ * will receive unpredictable results if it attempts to use the
+ * locator at any other time, or after parsing completes.</p>
+ *
+ * <p>SAX parsers are not required to supply a locator, but they are
+ * very strongly encouraged to do so. If the parser supplies a
+ * locator, it must do so before reporting any other document events.
+ * If no locator has been set by the time the application receives
+ * the {@link org.xml.sax.ContentHandler#startDocument startDocument}
+ * event, the application should assume that a locator is not
+ * available.</p>
+ *
+ * @since SAX 1.0
+ * @author David Megginson
+ * @version 2.0.1 (sax2r2)
+ * @see org.xml.sax.ContentHandler#setDocumentLocator
+ */
+public interface Locator {
+
+
+ /**
+ * Return the public identifier for the current document event.
+ *
+ * <p>The return value is the public identifier of the document
+ * entity or of the external parsed entity in which the markup
+ * triggering the event appears.</p>
+ *
+ * @return A string containing the public identifier, or
+ * null if none is available.
+ * @see #getSystemId
+ */
+ public abstract String getPublicId ();
+
+
+ /**
+ * Return the system identifier for the current document event.
+ *
+ * <p>The return value is the system identifier of the document
+ * entity or of the external parsed entity in which the markup
+ * triggering the event appears.</p>
+ *
+ * <p>If the system identifier is a URL, the parser must resolve it
+ * fully before passing it to the application. For example, a file
+ * name must always be provided as a <em>file:...</em> URL, and other
+ * kinds of relative URI are also resolved against their bases.</p>
+ *
+ * @return A string containing the system identifier, or null
+ * if none is available.
+ * @see #getPublicId
+ */
+ public abstract String getSystemId ();
+
+
+ /**
+ * Return the line number where the current document event ends.
+ * Lines are delimited by line ends, which are defined in
+ * the XML specification.
+ *
+ * <p><strong>Warning:</strong> The return value from the method
+ * is intended only as an approximation for the sake of diagnostics;
+ * it is not intended to provide sufficient information
+ * to edit the character content of the original XML document.
+ * In some cases, these "line" numbers match what would be displayed
+ * as columns, and in others they may not match the source text
+ * due to internal entity expansion. </p>
+ *
+ * <p>The return value is an approximation of the line number
+ * in the document entity or external parsed entity where the
+ * markup triggering the event appears.</p>
+ *
+ * <p>If possible, the SAX driver should provide the line position
+ * of the first character after the text associated with the document
+ * event. The first line is line 1.</p>
+ *
+ * @return The line number, or -1 if none is available.
+ * @see #getColumnNumber
+ */
+ public abstract int getLineNumber ();
+
+
+ /**
+ * Return the column number where the current document event ends.
+ * This is one-based number of Java <code>char</code> values since
+ * the last line end.
+ *
+ * <p><strong>Warning:</strong> The return value from the method
+ * is intended only as an approximation for the sake of diagnostics;
+ * it is not intended to provide sufficient information
+ * to edit the character content of the original XML document.
+ * For example, when lines contain combining character sequences, wide
+ * characters, surrogate pairs, or bi-directional text, the value may
+ * not correspond to the column in a text editor's display. </p>
+ *
+ * <p>The return value is an approximation of the column number
+ * in the document entity or external parsed entity where the
+ * markup triggering the event appears.</p>
+ *
+ * <p>If possible, the SAX driver should provide the line position
+ * of the first character after the text associated with the document
+ * event. The first column in each line is column 1.</p>
+ *
+ * @return The column number, or -1 if none is available.
+ * @see #getLineNumber
+ */
+ public abstract int getColumnNumber ();
+
+}
+
+// end of Locator.java
diff --git a/external/jaxp/source/org/xml/sax/Parser.java b/external/jaxp/source/org/xml/sax/Parser.java
new file mode 100755
index 000000000..3171566b2
--- /dev/null
+++ b/external/jaxp/source/org/xml/sax/Parser.java
@@ -0,0 +1,209 @@
+// SAX parser interface.
+// http://www.saxproject.org
+// No warranty; no copyright -- use this as you will.
+// $Id: Parser.java,v 1.1 2003-02-01 02:10:43 cbj Exp $
+
+package org.xml.sax;
+
+import java.io.IOException;
+import java.util.Locale;
+
+
+/**
+ * Basic interface for SAX (Simple API for XML) parsers.
+ *
+ * <blockquote>
+ * <em>This module, both source code and documentation, is in the
+ * Public Domain, and comes with <strong>NO WARRANTY</strong>.</em>
+ * See <a href='http://www.saxproject.org'>http://www.saxproject.org</a>
+ * for further information.
+ * </blockquote>
+ *
+ * <p>This was the main event supplier interface for SAX1; it has
+ * been replaced in SAX2 by {@link org.xml.sax.XMLReader XMLReader},
+ * which includes Namespace support and sophisticated configurability
+ * and extensibility.</p>
+ *
+ * <p>All SAX1 parsers must implement this basic interface: it allows
+ * applications to register handlers for different types of events
+ * and to initiate a parse from a URI, or a character stream.</p>
+ *
+ * <p>All SAX1 parsers must also implement a zero-argument constructor
+ * (though other constructors are also allowed).</p>
+ *
+ * <p>SAX1 parsers are reusable but not re-entrant: the application
+ * may reuse a parser object (possibly with a different input source)
+ * once the first parse has completed successfully, but it may not
+ * invoke the parse() methods recursively within a parse.</p>
+ *
+ * @deprecated This interface has been replaced by the SAX2
+ * {@link org.xml.sax.XMLReader XMLReader}
+ * interface, which includes Namespace support.
+ * @since SAX 1.0
+ * @author David Megginson
+ * @version 2.0.1 (sax2r2)
+ * @see org.xml.sax.EntityResolver
+ * @see org.xml.sax.DTDHandler
+ * @see org.xml.sax.DocumentHandler
+ * @see org.xml.sax.ErrorHandler
+ * @see org.xml.sax.HandlerBase
+ * @see org.xml.sax.InputSource
+ */
+public interface Parser
+{
+
+ /**
+ * Allow an application to request a locale for errors and warnings.
+ *
+ * <p>SAX parsers are not required to provide localisation for errors
+ * and warnings; if they cannot support the requested locale,
+ * however, they must throw a SAX exception. Applications may
+ * not request a locale change in the middle of a parse.</p>
+ *
+ * @param locale A Java Locale object.
+ * @exception org.xml.sax.SAXException Throws an exception
+ * (using the previous or default locale) if the
+ * requested locale is not supported.
+ * @see org.xml.sax.SAXException
+ * @see org.xml.sax.SAXParseException
+ */
+ public abstract void setLocale (Locale locale)
+ throws SAXException;
+
+
+ /**
+ * Allow an application to register a custom entity resolver.
+ *
+ * <p>If the application does not register an entity resolver, the
+ * SAX parser will resolve system identifiers and open connections
+ * to entities itself (this is the default behaviour implemented in
+ * HandlerBase).</p>
+ *
+ * <p>Applications may register a new or different entity resolver
+ * in the middle of a parse, and the SAX parser must begin using
+ * the new resolver immediately.</p>
+ *
+ * @param resolver The object for resolving entities.
+ * @see EntityResolver
+ * @see HandlerBase
+ */
+ public abstract void setEntityResolver (EntityResolver resolver);
+
+
+ /**
+ * Allow an application to register a DTD event handler.
+ *
+ * <p>If the application does not register a DTD handler, all DTD
+ * events reported by the SAX parser will be silently
+ * ignored (this is the default behaviour implemented by
+ * HandlerBase).</p>
+ *
+ * <p>Applications may register a new or different
+ * handler in the middle of a parse, and the SAX parser must
+ * begin using the new handler immediately.</p>
+ *
+ * @param handler The DTD handler.
+ * @see DTDHandler
+ * @see HandlerBase
+ */
+ public abstract void setDTDHandler (DTDHandler handler);
+
+
+ /**
+ * Allow an application to register a document event handler.
+ *
+ * <p>If the application does not register a document handler, all
+ * document events reported by the SAX parser will be silently
+ * ignored (this is the default behaviour implemented by
+ * HandlerBase).</p>
+ *
+ * <p>Applications may register a new or different handler in the
+ * middle of a parse, and the SAX parser must begin using the new
+ * handler immediately.</p>
+ *
+ * @param handler The document handler.
+ * @see DocumentHandler
+ * @see HandlerBase
+ */
+ public abstract void setDocumentHandler (DocumentHandler handler);
+
+
+ /**
+ * Allow an application to register an error event handler.
+ *
+ * <p>If the application does not register an error event handler,
+ * all error events reported by the SAX parser will be silently
+ * ignored, except for fatalError, which will throw a SAXException
+ * (this is the default behaviour implemented by HandlerBase).</p>
+ *
+ * <p>Applications may register a new or different handler in the
+ * middle of a parse, and the SAX parser must begin using the new
+ * handler immediately.</p>
+ *
+ * @param handler The error handler.
+ * @see ErrorHandler
+ * @see SAXException
+ * @see HandlerBase
+ */
+ public abstract void setErrorHandler (ErrorHandler handler);
+
+
+ /**
+ * Parse an XML document.
+ *
+ * <p>The application can use this method to instruct the SAX parser
+ * to begin parsing an XML document from any valid input
+ * source (a character stream, a byte stream, or a URI).</p>
+ *
+ * <p>Applications may not invoke this method while a parse is in
+ * progress (they should create a new Parser instead for each
+ * additional XML document). Once a parse is complete, an
+ * application may reuse the same Parser object, possibly with a
+ * different input source.</p>
+ *
+ * @param source The input source for the top-level of the
+ * XML document.
+ * @exception org.xml.sax.SAXException Any SAX exception, possibly
+ * wrapping another exception.
+ * @exception java.io.IOException An IO exception from the parser,
+ * possibly from a byte stream or character stream
+ * supplied by the application.
+ * @see org.xml.sax.InputSource
+ * @see #parse(java.lang.String)
+ * @see #setEntityResolver
+ * @see #setDTDHandler
+ * @see #setDocumentHandler
+ * @see #setErrorHandler
+ */
+ public abstract void parse (InputSource source)
+ throws SAXException, IOException;
+
+
+ /**
+ * Parse an XML document from a system identifier (URI).
+ *
+ * <p>This method is a shortcut for the common case of reading a
+ * document from a system identifier. It is the exact
+ * equivalent of the following:</p>
+ *
+ * <pre>
+ * parse(new InputSource(systemId));
+ * </pre>
+ *
+ * <p>If the system identifier is a URL, it must be fully resolved
+ * by the application before it is passed to the parser.</p>
+ *
+ * @param systemId The system identifier (URI).
+ * @exception org.xml.sax.SAXException Any SAX exception, possibly
+ * wrapping another exception.
+ * @exception java.io.IOException An IO exception from the parser,
+ * possibly from a byte stream or character stream
+ * supplied by the application.
+ * @see #parse(org.xml.sax.InputSource)
+ */
+ public abstract void parse (String systemId)
+ throws SAXException, IOException;
+
+}
+
+// end of Parser.java
diff --git a/external/jaxp/source/org/xml/sax/SAXException.java b/external/jaxp/source/org/xml/sax/SAXException.java
new file mode 100755
index 000000000..fceb9ef73
--- /dev/null
+++ b/external/jaxp/source/org/xml/sax/SAXException.java
@@ -0,0 +1,153 @@
+// SAX exception class.
+// http://www.saxproject.org
+// No warranty; no copyright -- use this as you will.
+// $Id: SAXException.java,v 1.1 2003-02-01 02:10:43 cbj Exp $
+
+package org.xml.sax;
+
+/**
+ * Encapsulate a general SAX error or warning.
+ *
+ * <blockquote>
+ * <em>This module, both source code and documentation, is in the
+ * Public Domain, and comes with <strong>NO WARRANTY</strong>.</em>
+ * See <a href='http://www.saxproject.org'>http://www.saxproject.org</a>
+ * for further information.
+ * </blockquote>
+ *
+ * <p>This class can contain basic error or warning information from
+ * either the XML parser or the application: a parser writer or
+ * application writer can subclass it to provide additional
+ * functionality. SAX handlers may throw this exception or
+ * any exception subclassed from it.</p>
+ *
+ * <p>If the application needs to pass through other types of
+ * exceptions, it must wrap those exceptions in a SAXException
+ * or an exception derived from a SAXException.</p>
+ *
+ * <p>If the parser or application needs to include information about a
+ * specific location in an XML document, it should use the
+ * {@link org.xml.sax.SAXParseException SAXParseException} subclass.</p>
+ *
+ * @since SAX 1.0
+ * @author David Megginson
+ * @version 2.0.1 (sax2r2)
+ * @see org.xml.sax.SAXParseException
+ */
+public class SAXException extends Exception {
+
+
+ /**
+ * Create a new SAXException.
+ */
+ public SAXException ()
+ {
+ super();
+ this.exception = null;
+ }
+
+
+ /**
+ * Create a new SAXException.
+ *
+ * @param message The error or warning message.
+ */
+ public SAXException (String message) {
+ super(message);
+ this.exception = null;
+ }
+
+
+ /**
+ * Create a new SAXException wrapping an existing exception.
+ *
+ * <p>The existing exception will be embedded in the new
+ * one, and its message will become the default message for
+ * the SAXException.</p>
+ *
+ * @param e The exception to be wrapped in a SAXException.
+ */
+ public SAXException (Exception e)
+ {
+ super();
+ this.exception = e;
+ }
+
+
+ /**
+ * Create a new SAXException from an existing exception.
+ *
+ * <p>The existing exception will be embedded in the new
+ * one, but the new exception will have its own message.</p>
+ *
+ * @param message The detail message.
+ * @param e The exception to be wrapped in a SAXException.
+ */
+ public SAXException (String message, Exception e)
+ {
+ super(message);
+ this.exception = e;
+ }
+
+
+ /**
+ * Return a detail message for this exception.
+ *
+ * <p>If there is an embedded exception, and if the SAXException
+ * has no detail message of its own, this method will return
+ * the detail message from the embedded exception.</p>
+ *
+ * @return The error or warning message.
+ */
+ public String getMessage ()
+ {
+ String message = super.getMessage();
+
+ if (message == null && exception != null) {
+ return exception.getMessage();
+ } else {
+ return message;
+ }
+ }
+
+
+ /**
+ * Return the embedded exception, if any.
+ *
+ * @return The embedded exception, or null if there is none.
+ */
+ public Exception getException ()
+ {
+ return exception;
+ }
+
+
+ /**
+ * Override toString to pick up any embedded exception.
+ *
+ * @return A string representation of this exception.
+ */
+ public String toString ()
+ {
+ if (exception != null) {
+ return exception.toString();
+ } else {
+ return super.toString();
+ }
+ }
+
+
+
+ //////////////////////////////////////////////////////////////////////
+ // Internal state.
+ //////////////////////////////////////////////////////////////////////
+
+
+ /**
+ * @serial The embedded exception if tunnelling, or null.
+ */
+ private Exception exception;
+
+}
+
+// end of SAXException.java
diff --git a/external/jaxp/source/org/xml/sax/SAXNotRecognizedException.java b/external/jaxp/source/org/xml/sax/SAXNotRecognizedException.java
new file mode 100755
index 000000000..b1fc54daf
--- /dev/null
+++ b/external/jaxp/source/org/xml/sax/SAXNotRecognizedException.java
@@ -0,0 +1,53 @@
+// SAXNotRecognizedException.java - unrecognized feature or value.
+// http://www.saxproject.org
+// Written by David Megginson
+// NO WARRANTY! This class is in the Public Domain.
+// $Id: SAXNotRecognizedException.java,v 1.1 2003-02-01 02:10:43 cbj Exp $
+
+package org.xml.sax;
+
+
+/**
+ * Exception class for an unrecognized identifier.
+ *
+ * <blockquote>
+ * <em>This module, both source code and documentation, is in the
+ * Public Domain, and comes with <strong>NO WARRANTY</strong>.</em>
+ * See <a href='http://www.saxproject.org'>http://www.saxproject.org</a>
+ * for further information.
+ * </blockquote>
+ *
+ * <p>An XMLReader will throw this exception when it finds an
+ * unrecognized feature or property identifier; SAX applications and
+ * extensions may use this class for other, similar purposes.</p>
+ *
+ * @since SAX 2.0
+ * @author David Megginson
+ * @version 2.0.1 (sax2r2)
+ * @see org.xml.sax.SAXNotSupportedException
+ */
+public class SAXNotRecognizedException extends SAXException
+{
+
+ /**
+ * Default constructor.
+ */
+ public SAXNotRecognizedException ()
+ {
+ super();
+ }
+
+
+ /**
+ * Construct a new exception with the given message.
+ *
+ * @param message The text message of the exception.
+ */
+ public SAXNotRecognizedException (String message)
+ {
+ super(message);
+ }
+
+}
+
+// end of SAXNotRecognizedException.java
diff --git a/external/jaxp/source/org/xml/sax/SAXNotSupportedException.java b/external/jaxp/source/org/xml/sax/SAXNotSupportedException.java
new file mode 100755
index 000000000..736f73a5f
--- /dev/null
+++ b/external/jaxp/source/org/xml/sax/SAXNotSupportedException.java
@@ -0,0 +1,53 @@
+// SAXNotSupportedException.java - unsupported feature or value.
+// http://www.saxproject.org
+// Written by David Megginson
+// NO WARRANTY! This class is in the Public Domain.
+// $Id: SAXNotSupportedException.java,v 1.1 2003-02-01 02:10:43 cbj Exp $
+
+package org.xml.sax;
+
+/**
+ * Exception class for an unsupported operation.
+ *
+ * <blockquote>
+ * <em>This module, both source code and documentation, is in the
+ * Public Domain, and comes with <strong>NO WARRANTY</strong>.</em>
+ * See <a href='http://www.saxproject.org'>http://www.saxproject.org</a>
+ * for further information.
+ * </blockquote>
+ *
+ * <p>An XMLReader will throw this exception when it recognizes a
+ * feature or property identifier, but cannot perform the requested
+ * operation (setting a state or value). Other SAX2 applications and
+ * extensions may use this class for similar purposes.</p>
+ *
+ * @since SAX 2.0
+ * @author David Megginson
+ * @version 2.0.1 (sax2r2)
+ * @see org.xml.sax.SAXNotRecognizedException
+ */
+public class SAXNotSupportedException extends SAXException
+{
+
+ /**
+ * Construct a new exception with no message.
+ */
+ public SAXNotSupportedException ()
+ {
+ super();
+ }
+
+
+ /**
+ * Construct a new exception with the given message.
+ *
+ * @param message The text message of the exception.
+ */
+ public SAXNotSupportedException (String message)
+ {
+ super(message);
+ }
+
+}
+
+// end of SAXNotSupportedException.java
diff --git a/external/jaxp/source/org/xml/sax/SAXParseException.java b/external/jaxp/source/org/xml/sax/SAXParseException.java
new file mode 100755
index 000000000..36b91e125
--- /dev/null
+++ b/external/jaxp/source/org/xml/sax/SAXParseException.java
@@ -0,0 +1,270 @@
+// SAX exception class.
+// http://www.saxproject.org
+// No warranty; no copyright -- use this as you will.
+// $Id: SAXParseException.java,v 1.1 2003-02-01 02:10:43 cbj Exp $
+
+package org.xml.sax;
+
+/**
+ * Encapsulate an XML parse error or warning.
+ *
+ * <blockquote>
+ * <em>This module, both source code and documentation, is in the
+ * Public Domain, and comes with <strong>NO WARRANTY</strong>.</em>
+ * See <a href='http://www.saxproject.org'>http://www.saxproject.org</a>
+ * for further information.
+ * </blockquote>
+ *
+ * <p>This exception may include information for locating the error
+ * in the original XML document, as if it came from a {@link Locator}
+ * object. Note that although the application
+ * will receive a SAXParseException as the argument to the handlers
+ * in the {@link org.xml.sax.ErrorHandler ErrorHandler} interface,
+ * the application is not actually required to throw the exception;
+ * instead, it can simply read the information in it and take a
+ * different action.</p>
+ *
+ * <p>Since this exception is a subclass of {@link org.xml.sax.SAXException
+ * SAXException}, it inherits the ability to wrap another exception.</p>
+ *
+ * @since SAX 1.0
+ * @author David Megginson
+ * @version 2.0.1 (sax2r2)
+ * @see org.xml.sax.SAXException
+ * @see org.xml.sax.Locator
+ * @see org.xml.sax.ErrorHandler
+ */
+public class SAXParseException extends SAXException {
+
+
+ //////////////////////////////////////////////////////////////////////
+ // Constructors.
+ //////////////////////////////////////////////////////////////////////
+
+
+ /**
+ * Create a new SAXParseException from a message and a Locator.
+ *
+ * <p>This constructor is especially useful when an application is
+ * creating its own exception from within a {@link org.xml.sax.ContentHandler
+ * ContentHandler} callback.</p>
+ *
+ * @param message The error or warning message.
+ * @param locator The locator object for the error or warning (may be
+ * null).
+ * @see org.xml.sax.Locator
+ */
+ public SAXParseException (String message, Locator locator) {
+ super(message);
+ if (locator != null) {
+ init(locator.getPublicId(), locator.getSystemId(),
+ locator.getLineNumber(), locator.getColumnNumber());
+ } else {
+ init(null, null, -1, -1);
+ }
+ }
+
+
+ /**
+ * Wrap an existing exception in a SAXParseException.
+ *
+ * <p>This constructor is especially useful when an application is
+ * creating its own exception from within a {@link org.xml.sax.ContentHandler
+ * ContentHandler} callback, and needs to wrap an existing exception that is not a
+ * subclass of {@link org.xml.sax.SAXException SAXException}.</p>
+ *
+ * @param message The error or warning message, or null to
+ * use the message from the embedded exception.
+ * @param locator The locator object for the error or warning (may be
+ * null).
+ * @param e Any exception.
+ * @see org.xml.sax.Locator
+ */
+ public SAXParseException (String message, Locator locator,
+ Exception e) {
+ super(message, e);
+ if (locator != null) {
+ init(locator.getPublicId(), locator.getSystemId(),
+ locator.getLineNumber(), locator.getColumnNumber());
+ } else {
+ init(null, null, -1, -1);
+ }
+ }
+
+
+ /**
+ * Create a new SAXParseException.
+ *
+ * <p>This constructor is most useful for parser writers.</p>
+ *
+ * <p>All parameters except the message are as if
+ * they were provided by a {@link Locator}. For example, if the
+ * system identifier is a URL (including relative filename), the
+ * caller must resolve it fully before creating the exception.</p>
+ *
+ *
+ * @param message The error or warning message.
+ * @param publicId The public identifer of the entity that generated
+ * the error or warning.
+ * @param systemId The system identifer of the entity that generated
+ * the error or warning.
+ * @param lineNumber The line number of the end of the text that
+ * caused the error or warning.
+ * @param columnNumber The column number of the end of the text that
+ * cause the error or warning.
+ */
+ public SAXParseException (String message, String publicId, String systemId,
+ int lineNumber, int columnNumber)
+ {
+ super(message);
+ init(publicId, systemId, lineNumber, columnNumber);
+ }
+
+
+ /**
+ * Create a new SAXParseException with an embedded exception.
+ *
+ * <p>This constructor is most useful for parser writers who
+ * need to wrap an exception that is not a subclass of
+ * {@link org.xml.sax.SAXException SAXException}.</p>
+ *
+ * <p>All parameters except the message and exception are as if
+ * they were provided by a {@link Locator}. For example, if the
+ * system identifier is a URL (including relative filename), the
+ * caller must resolve it fully before creating the exception.</p>
+ *
+ * @param message The error or warning message, or null to use
+ * the message from the embedded exception.
+ * @param publicId The public identifer of the entity that generated
+ * the error or warning.
+ * @param systemId The system identifer of the entity that generated
+ * the error or warning.
+ * @param lineNumber The line number of the end of the text that
+ * caused the error or warning.
+ * @param columnNumber The column number of the end of the text that
+ * cause the error or warning.
+ * @param e Another exception to embed in this one.
+ */
+ public SAXParseException (String message, String publicId, String systemId,
+ int lineNumber, int columnNumber, Exception e)
+ {
+ super(message, e);
+ init(publicId, systemId, lineNumber, columnNumber);
+ }
+
+
+ /**
+ * Internal initialization method.
+ *
+ * @param publicId The public identifier of the entity which generated the exception,
+ * or null.
+ * @param systemId The system identifier of the entity which generated the exception,
+ * or null.
+ * @param lineNumber The line number of the error, or -1.
+ * @param columnNumber The column number of the error, or -1.
+ */
+ private void init (String publicId, String systemId,
+ int lineNumber, int columnNumber)
+ {
+ this.publicId = publicId;
+ this.systemId = systemId;
+ this.lineNumber = lineNumber;
+ this.columnNumber = columnNumber;
+ }
+
+
+ /**
+ * Get the public identifier of the entity where the exception occurred.
+ *
+ * @return A string containing the public identifier, or null
+ * if none is available.
+ * @see org.xml.sax.Locator#getPublicId
+ */
+ public String getPublicId ()
+ {
+ return this.publicId;
+ }
+
+
+ /**
+ * Get the system identifier of the entity where the exception occurred.
+ *
+ * <p>If the system identifier is a URL, it will have been resolved
+ * fully.</p>
+ *
+ * @return A string containing the system identifier, or null
+ * if none is available.
+ * @see org.xml.sax.Locator#getSystemId
+ */
+ public String getSystemId ()
+ {
+ return this.systemId;
+ }
+
+
+ /**
+ * The line number of the end of the text where the exception occurred.
+ *
+ * <p>The first line is line 1.</p>
+ *
+ * @return An integer representing the line number, or -1
+ * if none is available.
+ * @see org.xml.sax.Locator#getLineNumber
+ */
+ public int getLineNumber ()
+ {
+ return this.lineNumber;
+ }
+
+
+ /**
+ * The column number of the end of the text where the exception occurred.
+ *
+ * <p>The first column in a line is position 1.</p>
+ *
+ * @return An integer representing the column number, or -1
+ * if none is available.
+ * @see org.xml.sax.Locator#getColumnNumber
+ */
+ public int getColumnNumber ()
+ {
+ return this.columnNumber;
+ }
+
+
+
+ //////////////////////////////////////////////////////////////////////
+ // Internal state.
+ //////////////////////////////////////////////////////////////////////
+
+
+ /**
+ * @serial The public identifier, or null.
+ * @see #getPublicId
+ */
+ private String publicId;
+
+
+ /**
+ * @serial The system identifier, or null.
+ * @see #getSystemId
+ */
+ private String systemId;
+
+
+ /**
+ * @serial The line number, or -1.
+ * @see #getLineNumber
+ */
+ private int lineNumber;
+
+
+ /**
+ * @serial The column number, or -1.
+ * @see #getColumnNumber
+ */
+ private int columnNumber;
+
+}
+
+// end of SAXParseException.java
diff --git a/external/jaxp/source/org/xml/sax/XMLFilter.java b/external/jaxp/source/org/xml/sax/XMLFilter.java
new file mode 100755
index 000000000..d179f23d6
--- /dev/null
+++ b/external/jaxp/source/org/xml/sax/XMLFilter.java
@@ -0,0 +1,65 @@
+// XMLFilter.java - filter SAX2 events.
+// http://www.saxproject.org
+// Written by David Megginson
+// NO WARRANTY! This class is in the Public Domain.
+// $Id: XMLFilter.java,v 1.1 2003-02-01 02:10:43 cbj Exp $
+
+package org.xml.sax;
+
+
+/**
+ * Interface for an XML filter.
+ *
+ * <blockquote>
+ * <em>This module, both source code and documentation, is in the
+ * Public Domain, and comes with <strong>NO WARRANTY</strong>.</em>
+ * See <a href='http://www.saxproject.org'>http://www.saxproject.org</a>
+ * for further information.
+ * </blockquote>
+ *
+ * <p>An XML filter is like an XML reader, except that it obtains its
+ * events from another XML reader rather than a primary source like
+ * an XML document or database. Filters can modify a stream of
+ * events as they pass on to the final application.</p>
+ *
+ * <p>The XMLFilterImpl helper class provides a convenient base
+ * for creating SAX2 filters, by passing on all {@link org.xml.sax.EntityResolver
+ * EntityResolver}, {@link org.xml.sax.DTDHandler DTDHandler},
+ * {@link org.xml.sax.ContentHandler ContentHandler} and {@link org.xml.sax.ErrorHandler
+ * ErrorHandler} events automatically.</p>
+ *
+ * @since SAX 2.0
+ * @author David Megginson
+ * @version 2.0.1 (sax2r2)
+ * @see org.xml.sax.helpers.XMLFilterImpl
+ */
+public interface XMLFilter extends XMLReader
+{
+
+ /**
+ * Set the parent reader.
+ *
+ * <p>This method allows the application to link the filter to
+ * a parent reader (which may be another filter). The argument
+ * may not be null.</p>
+ *
+ * @param parent The parent reader.
+ */
+ public abstract void setParent (XMLReader parent);
+
+
+ /**
+ * Get the parent reader.
+ *
+ * <p>This method allows the application to query the parent
+ * reader (which may be another filter). It is generally a
+ * bad idea to perform any operations on the parent reader
+ * directly: they should all pass through this filter.</p>
+ *
+ * @return The parent filter, or null if none has been set.
+ */
+ public abstract XMLReader getParent ();
+
+}
+
+// end of XMLFilter.java
diff --git a/external/jaxp/source/org/xml/sax/XMLReader.java b/external/jaxp/source/org/xml/sax/XMLReader.java
new file mode 100755
index 000000000..c1cf3c267
--- /dev/null
+++ b/external/jaxp/source/org/xml/sax/XMLReader.java
@@ -0,0 +1,397 @@
+// XMLReader.java - read an XML document.
+// http://www.saxproject.org
+// Written by David Megginson
+// NO WARRANTY! This class is in the Public Domain.
+// $Id: XMLReader.java,v 1.1 2003-02-01 02:10:43 cbj Exp $
+
+package org.xml.sax;
+
+import java.io.IOException;
+
+
+/**
+ * Interface for reading an XML document using callbacks.
+ *
+ * <blockquote>
+ * <em>This module, both source code and documentation, is in the
+ * Public Domain, and comes with <strong>NO WARRANTY</strong>.</em>
+ * See <a href='http://www.saxproject.org'>http://www.saxproject.org</a>
+ * for further information.
+ * </blockquote>
+ *
+ * <p><strong>Note:</strong> despite its name, this interface does
+ * <em>not</em> extend the standard Java {@link java.io.Reader Reader}
+ * interface, because reading XML is a fundamentally different activity
+ * than reading character data.</p>
+ *
+ * <p>XMLReader is the interface that an XML parser's SAX2 driver must
+ * implement. This interface allows an application to set and
+ * query features and properties in the parser, to register
+ * event handlers for document processing, and to initiate
+ * a document parse.</p>
+ *
+ * <p>All SAX interfaces are assumed to be synchronous: the
+ * {@link #parse parse} methods must not return until parsing
+ * is complete, and readers must wait for an event-handler callback
+ * to return before reporting the next event.</p>
+ *
+ * <p>This interface replaces the (now deprecated) SAX 1.0 {@link
+ * org.xml.sax.Parser Parser} interface. The XMLReader interface
+ * contains two important enhancements over the old Parser
+ * interface (as well as some minor ones):</p>
+ *
+ * <ol>
+ * <li>it adds a standard way to query and set features and
+ * properties; and</li>
+ * <li>it adds Namespace support, which is required for many
+ * higher-level XML standards.</li>
+ * </ol>
+ *
+ * <p>There are adapters available to convert a SAX1 Parser to
+ * a SAX2 XMLReader and vice-versa.</p>
+ *
+ * @since SAX 2.0
+ * @author David Megginson
+ * @version 2.0.1 (sax2r2)
+ * @see org.xml.sax.XMLFilter
+ * @see org.xml.sax.helpers.ParserAdapter
+ * @see org.xml.sax.helpers.XMLReaderAdapter
+ */
+public interface XMLReader
+{
+
+
+ ////////////////////////////////////////////////////////////////////
+ // Configuration.
+ ////////////////////////////////////////////////////////////////////
+
+
+ /**
+ * Look up the value of a feature flag.
+ *
+ * <p>The feature name is any fully-qualified URI. It is
+ * possible for an XMLReader to recognize a feature name but
+ * temporarily be unable to return its value.
+ * Some feature values may be available only in specific
+ * contexts, such as before, during, or after a parse.
+ * Also, some feature values may not be programmatically accessible.
+ * (In the case of an adapter for SAX1 {@link Parser}, there is no
+ * implementation-independent way to expose whether the underlying
+ * parser is performing validation, expanding external entities,
+ * and so forth.) </p>
+ *
+ * <p>All XMLReaders are required to recognize the
+ * http://xml.org/sax/features/namespaces and the
+ * http://xml.org/sax/features/namespace-prefixes feature names.</p>
+ *
+ * <p>Typical usage is something like this:</p>
+ *
+ * <pre>
+ * XMLReader r = new MySAXDriver();
+ *
+ * // try to activate validation
+ * try {
+ * r.setFeature("http://xml.org/sax/features/validation", true);
+ * } catch (SAXException e) {
+ * System.err.println("Cannot activate validation.");
+ * }
+ *
+ * // register event handlers
+ * r.setContentHandler(new MyContentHandler());
+ * r.setErrorHandler(new MyErrorHandler());
+ *
+ * // parse the first document
+ * try {
+ * r.parse("http://www.foo.com/mydoc.xml");
+ * } catch (IOException e) {
+ * System.err.println("I/O exception reading XML document");
+ * } catch (SAXException e) {
+ * System.err.println("XML exception reading document.");
+ * }
+ * </pre>
+ *
+ * <p>Implementors are free (and encouraged) to invent their own features,
+ * using names built on their own URIs.</p>
+ *
+ * @param name The feature name, which is a fully-qualified URI.
+ * @return The current value of the feature (true or false).
+ * @exception org.xml.sax.SAXNotRecognizedException If the feature
+ * value can't be assigned or retrieved.
+ * @exception org.xml.sax.SAXNotSupportedException When the
+ * XMLReader recognizes the feature name but
+ * cannot determine its value at this time.
+ * @see #setFeature
+ */
+ public boolean getFeature (String name)
+ throws SAXNotRecognizedException, SAXNotSupportedException;
+
+
+ /**
+ * Set the value of a feature flag.
+ *
+ * <p>The feature name is any fully-qualified URI. It is
+ * possible for an XMLReader to expose a feature value but
+ * to be unable to change the current value.
+ * Some feature values may be immutable or mutable only
+ * in specific contexts, such as before, during, or after
+ * a parse.</p>
+ *
+ * <p>All XMLReaders are required to support setting
+ * http://xml.org/sax/features/namespaces to true and
+ * http://xml.org/sax/features/namespace-prefixes to false.</p>
+ *
+ * @param name The feature name, which is a fully-qualified URI.
+ * @param value The requested value of the feature (true or false).
+ * @exception org.xml.sax.SAXNotRecognizedException If the feature
+ * value can't be assigned or retrieved.
+ * @exception org.xml.sax.SAXNotSupportedException When the
+ * XMLReader recognizes the feature name but
+ * cannot set the requested value.
+ * @see #getFeature
+ */
+ public void setFeature (String name, boolean value)
+ throws SAXNotRecognizedException, SAXNotSupportedException;
+
+
+ /**
+ * Look up the value of a property.
+ *
+ * <p>The property name is any fully-qualified URI. It is
+ * possible for an XMLReader to recognize a property name but
+ * temporarily be unable to return its value.
+ * Some property values may be available only in specific
+ * contexts, such as before, during, or after a parse.</p>
+ *
+ * <p>XMLReaders are not required to recognize any specific
+ * property names, though an initial core set is documented for
+ * SAX2.</p>
+ *
+ * <p>Implementors are free (and encouraged) to invent their own properties,
+ * using names built on their own URIs.</p>
+ *
+ * @param name The property name, which is a fully-qualified URI.
+ * @return The current value of the property.
+ * @exception org.xml.sax.SAXNotRecognizedException If the property
+ * value can't be assigned or retrieved.
+ * @exception org.xml.sax.SAXNotSupportedException When the
+ * XMLReader recognizes the property name but
+ * cannot determine its value at this time.
+ * @see #setProperty
+ */
+ public Object getProperty (String name)
+ throws SAXNotRecognizedException, SAXNotSupportedException;
+
+
+ /**
+ * Set the value of a property.
+ *
+ * <p>The property name is any fully-qualified URI. It is
+ * possible for an XMLReader to recognize a property name but
+ * to be unable to change the current value.
+ * Some property values may be immutable or mutable only
+ * in specific contexts, such as before, during, or after
+ * a parse.</p>
+ *
+ * <p>XMLReaders are not required to recognize setting
+ * any specific property names, though a core set is defined by
+ * SAX2.</p>
+ *
+ * <p>This method is also the standard mechanism for setting
+ * extended handlers.</p>
+ *
+ * @param name The property name, which is a fully-qualified URI.
+ * @param value The requested value for the property.
+ * @exception org.xml.sax.SAXNotRecognizedException If the property
+ * value can't be assigned or retrieved.
+ * @exception org.xml.sax.SAXNotSupportedException When the
+ * XMLReader recognizes the property name but
+ * cannot set the requested value.
+ */
+ public void setProperty (String name, Object value)
+ throws SAXNotRecognizedException, SAXNotSupportedException;
+
+
+
+ ////////////////////////////////////////////////////////////////////
+ // Event handlers.
+ ////////////////////////////////////////////////////////////////////
+
+
+ /**
+ * Allow an application to register an entity resolver.
+ *
+ * <p>If the application does not register an entity resolver,
+ * the XMLReader will perform its own default resolution.</p>
+ *
+ * <p>Applications may register a new or different resolver in the
+ * middle of a parse, and the SAX parser must begin using the new
+ * resolver immediately.</p>
+ *
+ * @param resolver The entity resolver.
+ * @see #getEntityResolver
+ */
+ public void setEntityResolver (EntityResolver resolver);
+
+
+ /**
+ * Return the current entity resolver.
+ *
+ * @return The current entity resolver, or null if none
+ * has been registered.
+ * @see #setEntityResolver
+ */
+ public EntityResolver getEntityResolver ();
+
+
+ /**
+ * Allow an application to register a DTD event handler.
+ *
+ * <p>If the application does not register a DTD handler, all DTD
+ * events reported by the SAX parser will be silently ignored.</p>
+ *
+ * <p>Applications may register a new or different handler in the
+ * middle of a parse, and the SAX parser must begin using the new
+ * handler immediately.</p>
+ *
+ * @param handler The DTD handler.
+ * @see #getDTDHandler
+ */
+ public void setDTDHandler (DTDHandler handler);
+
+
+ /**
+ * Return the current DTD handler.
+ *
+ * @return The current DTD handler, or null if none
+ * has been registered.
+ * @see #setDTDHandler
+ */
+ public DTDHandler getDTDHandler ();
+
+
+ /**
+ * Allow an application to register a content event handler.
+ *
+ * <p>If the application does not register a content handler, all
+ * content events reported by the SAX parser will be silently
+ * ignored.</p>
+ *
+ * <p>Applications may register a new or different handler in the
+ * middle of a parse, and the SAX parser must begin using the new
+ * handler immediately.</p>
+ *
+ * @param handler The content handler.
+ * @see #getContentHandler
+ */
+ public void setContentHandler (ContentHandler handler);
+
+
+ /**
+ * Return the current content handler.
+ *
+ * @return The current content handler, or null if none
+ * has been registered.
+ * @see #setContentHandler
+ */
+ public ContentHandler getContentHandler ();
+
+
+ /**
+ * Allow an application to register an error event handler.
+ *
+ * <p>If the application does not register an error handler, all
+ * error events reported by the SAX parser will be silently
+ * ignored; however, normal processing may not continue. It is
+ * highly recommended that all SAX applications implement an
+ * error handler to avoid unexpected bugs.</p>
+ *
+ * <p>Applications may register a new or different handler in the
+ * middle of a parse, and the SAX parser must begin using the new
+ * handler immediately.</p>
+ *
+ * @param handler The error handler.
+ * @see #getErrorHandler
+ */
+ public void setErrorHandler (ErrorHandler handler);
+
+
+ /**
+ * Return the current error handler.
+ *
+ * @return The current error handler, or null if none
+ * has been registered.
+ * @see #setErrorHandler
+ */
+ public ErrorHandler getErrorHandler ();
+
+
+
+ ////////////////////////////////////////////////////////////////////
+ // Parsing.
+ ////////////////////////////////////////////////////////////////////
+
+ /**
+ * Parse an XML document.
+ *
+ * <p>The application can use this method to instruct the XML
+ * reader to begin parsing an XML document from any valid input
+ * source (a character stream, a byte stream, or a URI).</p>
+ *
+ * <p>Applications may not invoke this method while a parse is in
+ * progress (they should create a new XMLReader instead for each
+ * nested XML document). Once a parse is complete, an
+ * application may reuse the same XMLReader object, possibly with a
+ * different input source.</p>
+ *
+ * <p>During the parse, the XMLReader will provide information
+ * about the XML document through the registered event
+ * handlers.</p>
+ *
+ * <p>This method is synchronous: it will not return until parsing
+ * has ended. If a client application wants to terminate
+ * parsing early, it should throw an exception.</p>
+ *
+ * @param source The input source for the top-level of the
+ * XML document.
+ * @exception org.xml.sax.SAXException Any SAX exception, possibly
+ * wrapping another exception.
+ * @exception java.io.IOException An IO exception from the parser,
+ * possibly from a byte stream or character stream
+ * supplied by the application.
+ * @see org.xml.sax.InputSource
+ * @see #parse(java.lang.String)
+ * @see #setEntityResolver
+ * @see #setDTDHandler
+ * @see #setContentHandler
+ * @see #setErrorHandler
+ */
+ public void parse (InputSource input)
+ throws IOException, SAXException;
+
+
+ /**
+ * Parse an XML document from a system identifier (URI).
+ *
+ * <p>This method is a shortcut for the common case of reading a
+ * document from a system identifier. It is the exact
+ * equivalent of the following:</p>
+ *
+ * <pre>
+ * parse(new InputSource(systemId));
+ * </pre>
+ *
+ * <p>If the system identifier is a URL, it must be fully resolved
+ * by the application before it is passed to the parser.</p>
+ *
+ * @param systemId The system identifier (URI).
+ * @exception org.xml.sax.SAXException Any SAX exception, possibly
+ * wrapping another exception.
+ * @exception java.io.IOException An IO exception from the parser,
+ * possibly from a byte stream or character stream
+ * supplied by the application.
+ * @see #parse(org.xml.sax.InputSource)
+ */
+ public void parse (String systemId)
+ throws IOException, SAXException;
+
+}
diff --git a/external/jaxp/source/org/xml/sax/ext/Attributes2.java b/external/jaxp/source/org/xml/sax/ext/Attributes2.java
new file mode 100644
index 000000000..f7708701d
--- /dev/null
+++ b/external/jaxp/source/org/xml/sax/ext/Attributes2.java
@@ -0,0 +1,92 @@
+// Attributes2.java - extended Attributes
+// http://www.saxproject.org
+// Public Domain: no warranty.
+// $Id: Attributes2.java,v 1.1 2003-02-01 02:10:44 cbj Exp $
+
+package org.xml.sax.ext;
+
+import org.xml.sax.Attributes;
+
+
+/**
+ * SAX2 extension to augment the per-attribute information
+ * provided though {@link Attributes}.
+ * If an implementation supports this extension, the attributes
+ * provided in {@link org.xml.sax.ContentHandler#startElement
+ * ContentHandler.startElement() } will implement this interface,
+ * and the <em>http://xml.org/sax/features/use-attributes2</em>
+ * feature flag will have the value <em>true</em>.
+ *
+ * <blockquote>
+ * <em>This module, both source code and documentation, is in the
+ * Public Domain, and comes with <strong>NO WARRANTY</strong>.</em>
+ * </blockquote>
+ *
+ * <p> XMLReader implementations are not required to support this
+ * information, and it is not part of core-only SAX2 distributions.</p>
+ *
+ * @since SAX 2.0 (extensions 1.1 alpha)
+ * @author David Brownell
+ * @version TBS
+ */
+public interface Attributes2 extends Attributes
+{
+
+
+ /** @return false unless the attribute was declared in the DTD.
+ * @throws java.lang.ArrayIndexOutOfBoundsException
+ * When the supplied index does not identify an attribute.
+ */
+ public boolean isDeclared (int index);
+
+ /** @return false unless the attribute was declared in the DTD.
+ * @throws java.lang.IllegalArgumentException
+ * When the supplied names do not identify an attribute.
+ */
+ public boolean isDeclared (java.lang.String qName);
+
+ /** @return false unless the attribute was declared in the DTD.
+ * @throws java.lang.IllegalArgumentException
+ * When the supplied names do not identify an attribute.
+ */
+ public boolean isDeclared (java.lang.String uri, java.lang.String localName);
+
+
+ /**
+ * Returns true unless the attribute value was provided
+ * by DTD defaulting.
+ *
+ * @param index The attribute index (zero-based).
+ * @return true if the value was found in the XML text,
+ * false if the value was provided by DTD defaulting.
+ * @exception java.lang.ArrayIndexOutOfBoundsException When the
+ * supplied index does not identify an attribute.
+ */
+ public boolean isSpecified (int index);
+
+ /**
+ * Returns true unless the attribute value was provided
+ * by DTD defaulting.
+ *
+ * @param uri The Namespace URI, or the empty string if
+ * the name has no Namespace URI.
+ * @param localName The attribute's local name.
+ * @return true if the value was found in the XML text,
+ * false if the value was provided by DTD defaulting.
+ * @exception java.lang.IllegalArgumentException When the
+ * supplied names do not identify an attribute.
+ */
+ public boolean isSpecified (String uri, String localName);
+
+ /**
+ * Returns true unless the attribute value was provided
+ * by DTD defaulting.
+ *
+ * @param qName The XML 1.0 qualified name.
+ * @return true if the value was found in the XML text,
+ * false if the value was provided by DTD defaulting.
+ * @exception java.lang.IllegalArgumentException When the
+ * supplied name does not identify an attribute.
+ */
+ public boolean isSpecified (String qName);
+}
diff --git a/external/jaxp/source/org/xml/sax/ext/Attributes2Impl.java b/external/jaxp/source/org/xml/sax/ext/Attributes2Impl.java
new file mode 100644
index 000000000..0f07d0152
--- /dev/null
+++ b/external/jaxp/source/org/xml/sax/ext/Attributes2Impl.java
@@ -0,0 +1,280 @@
+// Attributes2Impl.java - extended AttributesImpl
+// http://www.saxproject.org
+// Public Domain: no warranty.
+// $Id: Attributes2Impl.java,v 1.1 2003-02-01 02:10:44 cbj Exp $
+
+package org.xml.sax.ext;
+
+import org.xml.sax.Attributes;
+import org.xml.sax.helpers.AttributesImpl;
+
+
+/**
+ * SAX2 extension helper for additional Attributes information,
+ * implementing the {@link Attributes2} interface.
+ *
+ * <blockquote>
+ * <em>This module, both source code and documentation, is in the
+ * Public Domain, and comes with <strong>NO WARRANTY</strong>.</em>
+ * </blockquote>
+ *
+ * <p>This is not part of core-only SAX2 distributions.</p>
+ *
+ * <p>The <em>specified</em> flag for each attribute will always
+ * be true, unless it has been set to false in the copy constructor
+ * or using {@link #setSpecified}. </p>
+ *
+ * @since SAX 2.0 (extensions 1.1 alpha)
+ * @author David Brownell
+ * @version TBS
+ */
+public class Attributes2Impl extends AttributesImpl implements Attributes2
+{
+ private boolean flags [];
+
+ private boolean declaredFlags[];
+
+ /**
+ * Construct a new, empty Attributes2Impl object.
+ */
+ public Attributes2Impl () { }
+
+
+ /**
+ * Copy an existing Attributes or Attributes2 object.
+ * If the object implements Attributes2, values of the
+ * <em>specified</em> flag for each attribute are copied,
+ * otherwise the flag values are set to <em>true</em>.
+ *
+ * <p>This constructor is especially useful inside a
+ * {@link org.xml.sax.ContentHandler#startElement startElement} event.</p>
+ *
+ * @param atts The existing Attributes object.
+ */
+ public Attributes2Impl (Attributes atts)
+ {
+ super (atts);
+ }
+
+
+ ////////////////////////////////////////////////////////////////////
+ // Implementation of Attributes2
+ ////////////////////////////////////////////////////////////////////
+
+
+
+ /*
+ note(1)
+ The implementation of the isDeclared methods is wrong. It's only here
+ to make the class compile, it's not intended to work yet.
+ */
+
+
+ /** @return false unless the attribute was declared in the DTD.
+ * @throws java.lang.ArrayIndexOutOfBoundsException
+ * When the supplied index does not identify an attribute.
+ */
+ public boolean isDeclared (int index)
+ {
+ if (index < 0 || index >= getLength ())
+ throw new ArrayIndexOutOfBoundsException ("No attribute at index: " + index);
+ return declaredFlags [index];
+ }
+
+ /** @return false unless the attribute was declared in the DTD.
+ * @throws java.lang.IllegalArgumentException
+ * When the supplied names do not identify an attribute.
+ */
+ public boolean isDeclared (java.lang.String qName)
+ {
+ int index = getIndex (qName);
+ if (index < 0)
+ throw new IllegalArgumentException ("No such attribute: " + qName);
+ return declaredFlags [index];
+ }
+
+ /** @return false unless the attribute was declared in the DTD.
+ * @throws java.lang.IllegalArgumentException
+ * When the supplied names do not identify an attribute.
+ */
+ public boolean isDeclared (java.lang.String uri, java.lang.String localName)
+ {
+ int index = getIndex (uri, localName);
+ if (index < 0)
+ throw new IllegalArgumentException ("No such attribute: local="
+ + localName
+ + ", namespace=" + uri);
+ return declaredFlags [index];
+ }
+
+
+ /**
+ * Returns the current value of an attribute's "specified" flag.
+ *
+ * @param index The attribute index (zero-based).
+ * @return current flag value
+ * @exception java.lang.ArrayIndexOutOfBoundsException When the
+ * supplied index does not identify an attribute.
+ */
+ public boolean isSpecified (int index)
+ {
+ if (index < 0 || index >= getLength ())
+ throw new ArrayIndexOutOfBoundsException (
+ "No attribute at index: " + index);
+ return flags [index];
+ }
+
+
+ /**
+ * Returns the current value of an attribute's "specified" flag.
+ *
+ * @param uri The Namespace URI, or the empty string if
+ * the name has no Namespace URI.
+ * @param localName The attribute's local name.
+ * @return current flag value
+ * @exception java.lang.IllegalArgumentException When the
+ * supplied names do not identify an attribute.
+ */
+ public boolean isSpecified (String uri, String localName)
+ {
+ int index = getIndex (uri, localName);
+
+ if (index < 0)
+ throw new IllegalArgumentException (
+ "No such attribute: local=" + localName
+ + ", namespace=" + uri);
+ return flags [index];
+ }
+
+
+ /**
+ * Returns the current value of an attribute's "specified" flag.
+ *
+ * @param qName The XML 1.0 qualified name.
+ * @return current flag value
+ * @exception java.lang.IllegalArgumentException When the
+ * supplied name does not identify an attribute.
+ */
+ public boolean isSpecified (String qName)
+ {
+ int index = getIndex (qName);
+
+ if (index < 0)
+ throw new IllegalArgumentException (
+ "No such attribute: " + qName);
+ return flags [index];
+ }
+
+
+ ////////////////////////////////////////////////////////////////////
+ // Manipulators
+ ////////////////////////////////////////////////////////////////////
+
+
+ /**
+ * Copy an entire Attributes object. The "specified" flags are
+ * assigned as true, unless the object is an Attributes2 object
+ * in which case those values are copied.
+ *
+ * @see AttributesImpl#setAttributes
+ */
+ public void setAttributes (Attributes atts)
+ {
+ int length = atts.getLength ();
+
+ super.setAttributes (atts);
+ flags = new boolean [length];
+ declaredFlags = new boolean[length];
+
+ if (atts instanceof Attributes2) {
+ Attributes2 a2 = (Attributes2) atts;
+ for (int i = 0; i < length; i++) {
+ flags [i] = a2.isSpecified (i);
+ declaredFlags[i] = a2.isDeclared(i);
+ }
+ } else {
+ for (int i = 0; i < length; i++) {
+ flags [i] = true;
+ declaredFlags[i] = getType(i).equals("CDATA");
+ }
+ }
+
+ }
+
+
+ /**
+ * Add an attribute to the end of the list, setting its
+ * "specified" flag to true. To set that flag's value
+ * to false, use {@link #setSpecified}.
+ *
+ * @see AttributesImpl#addAttribute
+ */
+ public void addAttribute (String uri, String localName, String qName,
+ String type, String value)
+ {
+ super.addAttribute (uri, localName, qName, type, value);
+
+ int length = getLength ();
+
+ if (length < flags.length) {
+ boolean newFlags [] = new boolean [length];
+ System.arraycopy (flags, 0, newFlags, 0, flags.length);
+ flags = newFlags;
+ boolean newDeclFlags[] = new boolean[length];
+ System.arraycopy (declaredFlags, 0, newDeclFlags, 0, declaredFlags.length);
+ declaredFlags = newDeclFlags;
+ }
+
+ flags [length - 1] = true;
+ declaredFlags[length - 1] = type.equals("CDATA");
+ }
+
+
+ // javadoc entirely from superclass
+ public void removeAttribute (int index)
+ {
+ int origMax = getLength () - 1;
+
+ super.removeAttribute (index);
+ if (index != origMax)
+ System.arraycopy (flags, index + 1, flags, index,
+ origMax - index);
+ }
+
+
+
+ /**
+ * Assign a value to the "declared" flag of a specific attribute.
+ * This is the only way this flag can be cleared, except clearing
+ * by initialization with the copy constructor.
+ *
+ * @param index The index of the attribute (zero-based).
+ * @param value The desired flag value.
+ * @throws java.lang.ArrayIndexOutOfBoundsException
+ * When the supplied index does not identify an attribute.
+ */
+ public void setDeclared (int index, boolean value)
+ {
+ if (index < 0 || index >= getLength ())
+ throw new ArrayIndexOutOfBoundsException ("No attribute at index: " + index);
+ declaredFlags [index] = value;
+ }
+
+ /**
+ * Assign a value to the "specified" flag of a specific attribute.
+ * This is the only way this flag can be cleared, except clearing
+ * by initialization with the copy constructor.
+ *
+ * @param index The index of the attribute (zero-based).
+ * @param value The desired flag value.
+ * @exception java.lang.ArrayIndexOutOfBoundsException When the
+ * supplied index does not identify an attribute.
+ */
+ public void setSpecified (int index, boolean value)
+ {
+ if (index < 0 || index >= getLength ())
+ throw new ArrayIndexOutOfBoundsException (
+ "No attribute at index: " + index);
+ flags [index] = value;
+ }
+}
diff --git a/external/jaxp/source/org/xml/sax/ext/DeclHandler.java b/external/jaxp/source/org/xml/sax/ext/DeclHandler.java
new file mode 100755
index 000000000..211cdc6bc
--- /dev/null
+++ b/external/jaxp/source/org/xml/sax/ext/DeclHandler.java
@@ -0,0 +1,143 @@
+// DeclHandler.java - Optional handler for DTD declaration events.
+// http://www.saxproject.org
+// Public Domain: no warranty.
+// $Id: DeclHandler.java,v 1.1 2003-02-01 02:10:44 cbj Exp $
+
+package org.xml.sax.ext;
+
+import org.xml.sax.SAXException;
+
+
+/**
+ * SAX2 extension handler for DTD declaration events.
+ *
+ * <blockquote>
+ * <em>This module, both source code and documentation, is in the
+ * Public Domain, and comes with <strong>NO WARRANTY</strong>.</em>
+ * See <a href='http://www.saxproject.org'>http://www.saxproject.org</a>
+ * for further information.
+ * </blockquote>
+ *
+ * <p>This is an optional extension handler for SAX2 to provide more
+ * complete information about DTD declarations in an XML document.
+ * XML readers are not required to recognize this handler, and it
+ * is not part of core-only SAX2 distributions.</p>
+ *
+ * <p>Note that data-related DTD declarations (unparsed entities and
+ * notations) are already reported through the {@link
+ * org.xml.sax.DTDHandler DTDHandler} interface.</p>
+ *
+ * <p>If you are using the declaration handler together with a lexical
+ * handler, all of the events will occur between the
+ * {@link org.xml.sax.ext.LexicalHandler#startDTD startDTD} and the
+ * {@link org.xml.sax.ext.LexicalHandler#endDTD endDTD} events.</p>
+ *
+ * <p>To set the DeclHandler for an XML reader, use the
+ * {@link org.xml.sax.XMLReader#setProperty setProperty} method
+ * with the property name
+ * <code>http://xml.org/sax/properties/declaration-handler</code>
+ * and an object implementing this interface (or null) as the value.
+ * If the reader does not report declaration events, it will throw a
+ * {@link org.xml.sax.SAXNotRecognizedException SAXNotRecognizedException}
+ * when you attempt to register the handler.</p>
+ *
+ * @since SAX 2.0 (extensions 1.0)
+ * @author David Megginson
+ * @version 2.0.1 (sax2r2)
+ */
+public interface DeclHandler
+{
+
+ /**
+ * Report an element type declaration.
+ *
+ * <p>The content model will consist of the string "EMPTY", the
+ * string "ANY", or a parenthesised group, optionally followed
+ * by an occurrence indicator. The model will be normalized so
+ * that all parameter entities are fully resolved and all whitespace
+ * is removed,and will include the enclosing parentheses. Other
+ * normalization (such as removing redundant parentheses or
+ * simplifying occurrence indicators) is at the discretion of the
+ * parser.</p>
+ *
+ * @param name The element type name.
+ * @param model The content model as a normalized string.
+ * @exception SAXException The application may raise an exception.
+ */
+ public abstract void elementDecl (String name, String model)
+ throws SAXException;
+
+
+ /**
+ * Report an attribute type declaration.
+ *
+ * <p>Only the effective (first) declaration for an attribute will
+ * be reported. The type will be one of the strings "CDATA",
+ * "ID", "IDREF", "IDREFS", "NMTOKEN", "NMTOKENS", "ENTITY",
+ * "ENTITIES", a parenthesized token group with
+ * the separator "|" and all whitespace removed, or the word
+ * "NOTATION" followed by a space followed by a parenthesized
+ * token group with all whitespace removed.</p>
+ *
+ * <p>The value will be the value as reported to applications,
+ * appropriately normalized and with entity and character
+ * references expanded. </p>
+ *
+ * @param eName The name of the associated element.
+ * @param aName The name of the attribute.
+ * @param type A string representing the attribute type.
+ * @param mode A string representing the attribute defaulting mode
+ * ("#IMPLIED", "#REQUIRED", or "#FIXED") or null if
+ * none of these applies.
+ * @param value A string representing the attribute's default value,
+ * or null if there is none.
+ * @exception SAXException The application may raise an exception.
+ */
+ public abstract void attributeDecl (String eName,
+ String aName,
+ String type,
+ String mode,
+ String value)
+ throws SAXException;
+
+
+ /**
+ * Report an internal entity declaration.
+ *
+ * <p>Only the effective (first) declaration for each entity
+ * will be reported. All parameter entities in the value
+ * will be expanded, but general entities will not.</p>
+ *
+ * @param name The name of the entity. If it is a parameter
+ * entity, the name will begin with '%'.
+ * @param value The replacement text of the entity.
+ * @exception SAXException The application may raise an exception.
+ * @see #externalEntityDecl
+ * @see org.xml.sax.DTDHandler#unparsedEntityDecl
+ */
+ public abstract void internalEntityDecl (String name, String value)
+ throws SAXException;
+
+
+ /**
+ * Report a parsed external entity declaration.
+ *
+ * <p>Only the effective (first) declaration for each entity
+ * will be reported.</p>
+ *
+ * @param name The name of the entity. If it is a parameter
+ * entity, the name will begin with '%'.
+ * @param publicId The declared public identifier of the entity, or
+ * null if none was declared.
+ * @param systemId The declared system identifier of the entity.
+ * @exception SAXException The application may raise an exception.
+ * @see #internalEntityDecl
+ * @see org.xml.sax.DTDHandler#unparsedEntityDecl
+ */
+ public abstract void externalEntityDecl (String name, String publicId,
+ String systemId)
+ throws SAXException;
+
+}
+
+// end of DeclHandler.java
diff --git a/external/jaxp/source/org/xml/sax/ext/DefaultHandler2.java b/external/jaxp/source/org/xml/sax/ext/DefaultHandler2.java
new file mode 100644
index 000000000..2e809f0f5
--- /dev/null
+++ b/external/jaxp/source/org/xml/sax/ext/DefaultHandler2.java
@@ -0,0 +1,130 @@
+// DefaultHandler2.java - extended DefaultHandler
+// http://www.saxproject.org
+// Public Domain: no warranty.
+// $Id: DefaultHandler2.java,v 1.1 2003-02-01 02:10:44 cbj Exp $
+
+package org.xml.sax.ext;
+
+import java.io.IOException;
+import org.xml.sax.InputSource;
+import org.xml.sax.SAXException;
+import org.xml.sax.helpers.DefaultHandler;
+
+
+/**
+ * This class extends the SAX2 base handler class to support the
+ * SAX2 {@link LexicalHandler}, {@link DeclHandler}, and
+ * {@link EntityResolver2} extensions. Except for overriding the
+ * original SAX1 {@link DefaultHandler#resolveEntity resolveEntity()}
+ * method the added handler methods just return. Subclassers may
+ * override everything on a method-by-method basis.
+ *
+ * <blockquote>
+ * <em>This module, both source code and documentation, is in the
+ * Public Domain, and comes with <strong>NO WARRANTY</strong>.</em>
+ * </blockquote>
+ *
+ * <p> <em>Note:</em> this class might yet learn that the
+ * <em>ContentHandler.setDocumentLocator()</em> call might be passed a
+ * {@link Locator2} object, and that the
+ * <em>ContentHandler.startElement()</em> call might be passed a
+ * {@link Attributes2} object.
+ *
+ * @since SAX 2.0 (extensions 1.1 alpha)
+ * @author David Brownell
+ * @version TBS
+ */
+public class DefaultHandler2 extends DefaultHandler
+ implements LexicalHandler, DeclHandler, EntityResolver2
+{
+ /** Constructs a handler which ignores all parsing events. */
+ public DefaultHandler2 () { }
+
+
+ // SAX2 ext-1.0 LexicalHandler
+
+ public void startCDATA ()
+ throws SAXException
+ {}
+
+ public void endCDATA ()
+ throws SAXException
+ {}
+
+ public void startDTD (String name, String publicId, String systemId)
+ throws SAXException
+ {}
+
+ public void endDTD ()
+ throws SAXException
+ {}
+
+ public void startEntity (String name)
+ throws SAXException
+ {}
+
+ public void endEntity (String name)
+ throws SAXException
+ {}
+
+ public void comment (char ch [], int start, int length)
+ throws SAXException
+ { }
+
+
+ // SAX2 ext-1.0 DeclHandler
+
+ public void attributeDecl (String eName, String aName,
+ String type, String mode, String value)
+ throws SAXException
+ {}
+
+ public void elementDecl (String name, String model)
+ throws SAXException
+ {}
+
+ public void externalEntityDecl (String name,
+ String publicId, String systemId)
+ throws SAXException
+ {}
+
+ public void internalEntityDecl (String name, String value)
+ throws SAXException
+ {}
+
+ // SAX2 ext-1.1 EntityResolver2
+
+ /**
+ * Tells the parser that if no external subset has been declared
+ * in the document text, none should be used.
+ */
+ public InputSource getExternalSubset (String name, String baseURI)
+ throws SAXException, IOException
+ { return null; }
+
+ /**
+ * Tells the parser to resolve the systemId against the baseURI
+ * and read the entity text from that resulting absolute URI.
+ * Note that because the older
+ * {@link DefaultHandler#resolveEntity DefaultHandler.resolveEntity()},
+ * method is overridden to call this one, this method may sometimes
+ * be invoked with null <em>name</em> and <em>baseURI</em>, and
+ * with the <em>systemId</em> already absolutized.
+ */
+ public InputSource resolveEntity (String name, String publicId,
+ String baseURI, String systemId)
+ throws SAXException, IOException
+ { return null; }
+
+ // SAX1 EntityResolver
+
+ /**
+ * Invokes
+ * {@link EntityResolver2#resolveEntity EntityResolver2.resolveEntity()}
+ * with null entity name and base URI.
+ * You only need to override that method to use this class.
+ */
+ public InputSource resolveEntity (String publicId, String systemId)
+ throws SAXException, IOException
+ { return resolveEntity (null, publicId, null, systemId); }
+}
diff --git a/external/jaxp/source/org/xml/sax/ext/EntityResolver2.java b/external/jaxp/source/org/xml/sax/ext/EntityResolver2.java
new file mode 100644
index 000000000..475213ae7
--- /dev/null
+++ b/external/jaxp/source/org/xml/sax/ext/EntityResolver2.java
@@ -0,0 +1,197 @@
+// EntityResolver2.java - Extended SAX entity resolver.
+// http://www.saxproject.org
+// No warranty; no copyright -- use this as you will.
+// $Id: EntityResolver2.java,v 1.1 2003-02-01 02:10:44 cbj Exp $
+
+package org.xml.sax.ext;
+
+import java.io.IOException;
+
+import org.xml.sax.EntityResolver;
+import org.xml.sax.InputSource;
+import org.xml.sax.XMLReader;
+import org.xml.sax.SAXException;
+
+
+/**
+ * Extended interface for mapping external entity references to input
+ * sources, or providing a missing external subset. The
+ * {@link XMLReader#setEntityResolver XMLReader.setEntityResolver()} method
+ * is used to provide implementations of this interface to parsers.
+ * When a parser uses the methods in this interface, the
+ * {@link EntityResolver2#resolveEntity EntityResolver2.resolveEntity()}
+ * method (in this interface) is used <em>instead of</em> the older (SAX 1.0)
+ * {@link EntityResolver#resolveEntity EntityResolver.resolveEntity()} method.
+ *
+ * <blockquote>
+ * <em>This module, both source code and documentation, is in the
+ * Public Domain, and comes with <strong>NO WARRANTY</strong>.</em>
+ * </blockquote>
+ *
+ * <p>If a SAX application requires the customized handling which this
+ * interface defines for external entities, it must ensure that it uses
+ * an XMLReader with the
+ * <em>http://xml.org/sax/features/use-entity-resolver2</em> feature flag
+ * set to <em>true</em> (which is its default value when the feature is
+ * recognized). If that flag is unrecognized, or its value is false,
+ * or the resolver does not implement this interface, then only the
+ * {@link EntityResolver} method will be used.
+ * </p>
+ *
+ * <p>That supports three categories of application that modify entity
+ * resolution. <em>Old Style</em> applications won't know about this interface;
+ * they will provide an EntityResolver.
+ * <em>Transitional Mode</em> provide an EntityResolver2 and automatically
+ * get the benefit of its methods in any systems (parsers or other tools)
+ * supporting it, due to polymorphism.
+ * Both <em>Old Style</em> and <em>Transitional Mode</em> applications will
+ * work with any SAX2 parser.
+ * <em>New style</em> applications will fail to run except on SAX2 parsers
+ * that support this particular feature.
+ * They will insist that feature flag have a value of "true", and the
+ * EntityResolver2 implementation they provide might throw an exception
+ * if the original SAX 1.0 style entity resolution method is invoked.
+ * </p>
+ *
+ * @see org.xml.sax.XMLReader#setEntityResolver
+ *
+ * @since SAX 2.0 (extensions 1.1 alpha)
+ * @author David Brownell
+ * @version TBD
+ */
+public interface EntityResolver2 extends EntityResolver
+{
+ /**
+ * Allows applications to provide an external subset for documents
+ * that don't explicitly define one. Documents with DOCTYPE declarations
+ * that omit an external subset can thus augment the declarations
+ * available for validation, entity processing, and attribute processing
+ * (normalization, defaulting, and reporting types including ID).
+ * This augmentation is reported
+ * through the {@link LexicalHandler#startDTD startDTD()} method as if
+ * the document text had originally included the external subset;
+ * this callback is made before any internal subset data or errors
+ * are reported.</p>
+ *
+ * <p>This method can also be used with documents that have no DOCTYPE
+ * declaration. When the root element is encountered,
+ * but no DOCTYPE declaration has been seen, this method is
+ * invoked. If it returns a value for the external subset, that root
+ * element is declared to be the root element, giving the effect of
+ * splicing a DOCTYPE declaration at the end the prolog of a document
+ * that could not otherwise be valid. The sequence of parser callbacks
+ * in that case logically resembles this:</p>
+ *
+ * <pre>
+ * ... comments and PIs from the prolog (as usual)
+ * startDTD ("rootName", source.getPublicId (), source.getSystemId ());
+ * startEntity ("[dtd]");
+ * ... declarations, comments, and PIs from the external subset
+ * endEntity ("[dtd]");
+ * endDTD ();
+ * ... then the rest of the document (as usual)
+ * startElement (..., "rootName", ...);
+ * </pre>
+ *
+ * <p>Note that the InputSource gets no further resolution.
+ * Implementations of this method may wish to invoke
+ * {@link #resolveEntity resolveEntity()} to gain benefits such as use
+ * of local caches of DTD entities. Also, this method will never be
+ * used by a (non-validating) processor that is not including external
+ * parameter entities. </p>
+ *
+ * <p>Uses for this method include facilitating data validation when
+ * interoperating with XML processors that would always require
+ * undesirable network accesses for external entities, or which for
+ * other reasons adopt a "no DTDs" policy.
+ * Non-validation motives include forcing documents to include DTDs so
+ * that attributes are handled consistently.
+ * For example, an XPath processor needs to know which attibutes have
+ * type "ID" before it can process a widely used type of reference.</p>
+ *
+ * <p><strong>Warning:</strong> Returning an external subset modifies
+ * the input document. By providing definitions for general entities,
+ * it can make a malformed document appear to be well formed.
+ * </p>
+ *
+ * @param name Identifies the document root element. This name comes
+ * from a DOCTYPE declaration (where available) or from the actual
+ * root element.
+ * @param baseURI The document's base URI, serving as an additional
+ * hint for selecting the external subset. This is always an absolute
+ * URI, unless it is null because the XMLReader was given an InputSource
+ * without one.
+ *
+ * @return An InputSource object describing the new external subset
+ * to be used by the parser, or null to indicate that no external
+ * subset is provided.
+ *
+ * @exception SAXException Any SAX exception, possibly wrapping
+ * another exception.
+ * @exception IOException Probably indicating a failure to create
+ * a new InputStream or Reader, or an illegal URL.
+ */
+ public InputSource getExternalSubset (String name, String baseURI)
+ throws SAXException, IOException;
+
+ /**
+ * Allows applications to map references to external entities into input
+ * sources, or tell the parser it should use conventional URI resolution.
+ * This method is only called for external entities which have been
+ * properly declared.
+ * This method provides more flexibility than the {@link EntityResolver}
+ * interface, supporting implementations of more complex catalogue
+ * schemes such as the one defined by the <a href=
+ "http://www.oasis-open.org/committees/entity/spec-2001-08-06.html"
+ >OASIS XML Catalogs</a> specification.</p>
+ *
+ * <p>Parsers configured to use this resolver method will call it
+ * to determine the input source to use for any external entity
+ * being included because of a reference in the XML text.
+ * That excludes the document entity, and any external entity returned
+ * by {@link #getExternalSubset getExternalSubset()}.
+ * When a (non-validating) processor is configured not to include
+ * a class of entities (parameter or general) through use of feature
+ * flags, this method is not invoked for such entities. </p>
+ *
+ * <p>Note that the entity naming scheme used here is the same one
+ * used in the {@link LexicalHandler}, or in the {@link
+ org.xml.sax.ContentHandler#skippedEntity
+ ContentHandler.skippedEntity()}
+ * method. </p>
+ *
+ * @param name Identifies the external entity being resolved.
+ * Either "[dtd]" for the external subset, or a name starting
+ * with "%" to indicate a parameter entity, or else the name of
+ * a general entity. This is never null when invoked by a SAX2
+ * parser.
+ * @param publicId The public identifier of the external entity being
+ * referenced (normalized as required by the XML specification), or
+ * null if none was supplied.
+ * @param baseURI The URI with respect to which relative systemIDs
+ * are interpreted. This is always an absolute URI, unless it is
+ * null (likely because the XMLReader was given an InputSource without
+ * one). This URI is defined by the XML specification to be the one
+ * associated with the "&lt;" starting the relevant declaration.
+ * @param systemId The system identifier of the external entity
+ * being referenced; either a relative or absolute URI.
+ * This is never null when invoked by a SAX2 parser; only declared
+ * entities, and any external subset, are resolved by such parsers.
+ *
+ * @return An InputSource object describing the new input source to
+ * be used by the parser. Returning null directs the parser to
+ * resolve the system ID against the base URI and open a connection
+ * to resulting URI.
+ *
+ * @exception SAXException Any SAX exception, possibly wrapping
+ * another exception.
+ * @exception IOException Probably indicating a failure to create
+ * a new InputStream or Reader, or an illegal URL.
+ */
+ public InputSource resolveEntity (
+ String name,
+ String publicId,
+ String baseURI,
+ String systemId
+ ) throws SAXException, IOException;
+}
diff --git a/external/jaxp/source/org/xml/sax/ext/LexicalHandler.java b/external/jaxp/source/org/xml/sax/ext/LexicalHandler.java
new file mode 100755
index 000000000..f87f49350
--- /dev/null
+++ b/external/jaxp/source/org/xml/sax/ext/LexicalHandler.java
@@ -0,0 +1,212 @@
+// LexicalHandler.java - optional handler for lexical parse events.
+// http://www.saxproject.org
+// Public Domain: no warranty.
+// $Id: LexicalHandler.java,v 1.1 2003-02-01 02:10:44 cbj Exp $
+
+package org.xml.sax.ext;
+
+import org.xml.sax.SAXException;
+
+/**
+ * SAX2 extension handler for lexical events.
+ *
+ * <blockquote>
+ * <em>This module, both source code and documentation, is in the
+ * Public Domain, and comes with <strong>NO WARRANTY</strong>.</em>
+ * See <a href='http://www.saxproject.org'>http://www.saxproject.org</a>
+ * for further information.
+ * </blockquote>
+ *
+ * <p>This is an optional extension handler for SAX2 to provide
+ * lexical information about an XML document, such as comments
+ * and CDATA section boundaries.
+ * XML readers are not required to recognize this handler, and it
+ * is not part of core-only SAX2 distributions.</p>
+ *
+ * <p>The events in the lexical handler apply to the entire document,
+ * not just to the document element, and all lexical handler events
+ * must appear between the content handler's startDocument and
+ * endDocument events.</p>
+ *
+ * <p>To set the LexicalHandler for an XML reader, use the
+ * {@link org.xml.sax.XMLReader#setProperty setProperty} method
+ * with the property name
+ * <code>http://xml.org/sax/properties/lexical-handler</code>
+ * and an object implementing this interface (or null) as the value.
+ * If the reader does not report lexical events, it will throw a
+ * {@link org.xml.sax.SAXNotRecognizedException SAXNotRecognizedException}
+ * when you attempt to register the handler.</p>
+ *
+ * @since SAX 2.0 (extensions 1.0)
+ * @author David Megginson
+ * @version 2.0.1 (sax2r2)
+ */
+public interface LexicalHandler
+{
+
+ /**
+ * Report the start of DTD declarations, if any.
+ *
+ * <p>This method is intended to report the beginning of the
+ * DOCTYPE declaration; if the document has no DOCTYPE declaration,
+ * this method will not be invoked.</p>
+ *
+ * <p>All declarations reported through
+ * {@link org.xml.sax.DTDHandler DTDHandler} or
+ * {@link org.xml.sax.ext.DeclHandler DeclHandler} events must appear
+ * between the startDTD and {@link #endDTD endDTD} events.
+ * Declarations are assumed to belong to the internal DTD subset
+ * unless they appear between {@link #startEntity startEntity}
+ * and {@link #endEntity endEntity} events. Comments and
+ * processing instructions from the DTD should also be reported
+ * between the startDTD and endDTD events, in their original
+ * order of (logical) occurrence; they are not required to
+ * appear in their correct locations relative to DTDHandler
+ * or DeclHandler events, however.</p>
+ *
+ * <p>Note that the start/endDTD events will appear within
+ * the start/endDocument events from ContentHandler and
+ * before the first
+ * {@link org.xml.sax.ContentHandler#startElement startElement}
+ * event.</p>
+ *
+ * @param name The document type name.
+ * @param publicId The declared public identifier for the
+ * external DTD subset, or null if none was declared.
+ * @param systemId The declared system identifier for the
+ * external DTD subset, or null if none was declared.
+ * (Note that this is not resolved against the document
+ * base URI.)
+ * @exception SAXException The application may raise an
+ * exception.
+ * @see #endDTD
+ * @see #startEntity
+ */
+ public abstract void startDTD (String name, String publicId,
+ String systemId)
+ throws SAXException;
+
+
+ /**
+ * Report the end of DTD declarations.
+ *
+ * <p>This method is intended to report the end of the
+ * DOCTYPE declaration; if the document has no DOCTYPE declaration,
+ * this method will not be invoked.</p>
+ *
+ * @exception SAXException The application may raise an exception.
+ * @see #startDTD
+ */
+ public abstract void endDTD ()
+ throws SAXException;
+
+
+ /**
+ * Report the beginning of some internal and external XML entities.
+ *
+ * <p>The reporting of parameter entities (including
+ * the external DTD subset) is optional, and SAX2 drivers that
+ * report LexicalHandler events may not implement it; you can use the
+ * <code
+ * >http://xml.org/sax/features/lexical-handler/parameter-entities</code>
+ * feature to query or control the reporting of parameter entities.</p>
+ *
+ * <p>General entities are reported with their regular names,
+ * parameter entities have '%' prepended to their names, and
+ * the external DTD subset has the pseudo-entity name "[dtd]".</p>
+ *
+ * <p>When a SAX2 driver is providing these events, all other
+ * events must be properly nested within start/end entity
+ * events. There is no additional requirement that events from
+ * {@link org.xml.sax.ext.DeclHandler DeclHandler} or
+ * {@link org.xml.sax.DTDHandler DTDHandler} be properly ordered.</p>
+ *
+ * <p>Note that skipped entities will be reported through the
+ * {@link org.xml.sax.ContentHandler#skippedEntity skippedEntity}
+ * event, which is part of the ContentHandler interface.</p>
+ *
+ * <p>Because of the streaming event model that SAX uses, some
+ * entity boundaries cannot be reported under any
+ * circumstances:</p>
+ *
+ * <ul>
+ * <li>general entities within attribute values</li>
+ * <li>parameter entities within declarations</li>
+ * </ul>
+ *
+ * <p>These will be silently expanded, with no indication of where
+ * the original entity boundaries were.</p>
+ *
+ * <p>Note also that the boundaries of character references (which
+ * are not really entities anyway) are not reported.</p>
+ *
+ * <p>All start/endEntity events must be properly nested.
+ *
+ * @param name The name of the entity. If it is a parameter
+ * entity, the name will begin with '%', and if it is the
+ * external DTD subset, it will be "[dtd]".
+ * @exception SAXException The application may raise an exception.
+ * @see #endEntity
+ * @see org.xml.sax.ext.DeclHandler#internalEntityDecl
+ * @see org.xml.sax.ext.DeclHandler#externalEntityDecl
+ */
+ public abstract void startEntity (String name)
+ throws SAXException;
+
+
+ /**
+ * Report the end of an entity.
+ *
+ * @param name The name of the entity that is ending.
+ * @exception SAXException The application may raise an exception.
+ * @see #startEntity
+ */
+ public abstract void endEntity (String name)
+ throws SAXException;
+
+
+ /**
+ * Report the start of a CDATA section.
+ *
+ * <p>The contents of the CDATA section will be reported through
+ * the regular {@link org.xml.sax.ContentHandler#characters
+ * characters} event; this event is intended only to report
+ * the boundary.</p>
+ *
+ * @exception SAXException The application may raise an exception.
+ * @see #endCDATA
+ */
+ public abstract void startCDATA ()
+ throws SAXException;
+
+
+ /**
+ * Report the end of a CDATA section.
+ *
+ * @exception SAXException The application may raise an exception.
+ * @see #startCDATA
+ */
+ public abstract void endCDATA ()
+ throws SAXException;
+
+
+ /**
+ * Report an XML comment anywhere in the document.
+ *
+ * <p>This callback will be used for comments inside or outside the
+ * document element, including comments in the external DTD
+ * subset (if read). Comments in the DTD must be properly
+ * nested inside start/endDTD and start/endEntity events (if
+ * used).</p>
+ *
+ * @param ch An array holding the characters in the comment.
+ * @param start The starting position in the array.
+ * @param length The number of characters to use from the array.
+ * @exception SAXException The application may raise an exception.
+ */
+ public abstract void comment (char ch[], int start, int length)
+ throws SAXException;
+
+}
+
+// end of LexicalHandler.java
diff --git a/external/jaxp/source/org/xml/sax/ext/Locator2.java b/external/jaxp/source/org/xml/sax/ext/Locator2.java
new file mode 100644
index 000000000..5c90fcb1b
--- /dev/null
+++ b/external/jaxp/source/org/xml/sax/ext/Locator2.java
@@ -0,0 +1,77 @@
+// Locator2.java - extended Locator
+// http://www.saxproject.org
+// Public Domain: no warranty.
+// $Id: Locator2.java,v 1.1 2003-02-01 02:10:44 cbj Exp $
+
+package org.xml.sax.ext;
+
+import org.xml.sax.Locator;
+
+
+/**
+ * SAX2 extension to augment the entity information provided
+ * though a {@link Locator}.
+ * If an implementation supports this extension, the Locator
+ * provided in {@link org.xml.sax.ContentHandler#setDocumentLocator
+ * ContentHandler.setDocumentLocator() } will implement this
+ * interface, and the
+ * <em>http://xml.org/sax/features/use-locator2</em> feature
+ * flag will have the value <em>true</em>.
+ *
+ * <blockquote>
+ * <em>This module, both source code and documentation, is in the
+ * Public Domain, and comes with <strong>NO WARRANTY</strong>.</em>
+ * </blockquote>
+ *
+ * <p> XMLReader implementations are not required to support this
+ * information, and it is not part of core-only SAX2 distributions.</p>
+ *
+ * @since SAX 2.0 (extensions 1.1 alpha)
+ * @author David Brownell
+ * @version TBS
+ */
+public interface Locator2 extends Locator
+{
+ /**
+ * Returns the version of XML used for the entity. This will
+ * normally be the identifier from the current entity's
+ * <em>&lt;?xml&nbsp;version='...'&nbsp;...?&gt;</em> declaration,
+ * or be defaulted by the parser.
+ *
+ * <p> At this writing, only one version ("1.0") is defined, but it
+ * seems likely that a new version will be defined which has slightly
+ * different rules about which characters are legal in XML names.
+ *
+ * @return Identifier for the XML version being used to interpret
+ * the entity's text.
+ */
+ public String getXMLVersion ();
+
+ /**
+ * Returns the name of the character encoding for the entity.
+ * If the encoding was declared externally (for example, in a MIME
+ * Content-Type header), that will be the name returned. Else if there
+ * was an <em>&lt;?xml&nbsp;...encoding='...'?&gt;</em> declaration at
+ * the start of the document, that encoding name will be returned.
+ * Otherwise the encoding will been inferred (normally to be UTF-8, or
+ * some UTF-16 variant), and that inferred name will be returned.
+ *
+ * <p>When an {@link org.xml.sax.InputSource InputSource} is used
+ * to provide an entity's character stream, this method returns the
+ * encoding provided in that input stream.
+ *
+ * <p> Note that some recent W3C specifications require that text
+ * in some encodings be normalized, using Unicode Normalization
+ * Form C, before processing. Such normalization must be performed
+ * by applications, and would normally be triggered based on the
+ * value returned by this method.
+ *
+ * <p> Encoding names may be those used by the underlying JVM,
+ * and comparisons should be case-insensitive.
+ *
+ * @return Name of the character encoding being used to interpret
+ * the entity's text, or null if this was not provided for a
+ * character stream passed through an InputSource.
+ */
+ public String getEncoding ();
+}
diff --git a/external/jaxp/source/org/xml/sax/ext/Locator2Impl.java b/external/jaxp/source/org/xml/sax/ext/Locator2Impl.java
new file mode 100644
index 000000000..d1e4068b6
--- /dev/null
+++ b/external/jaxp/source/org/xml/sax/ext/Locator2Impl.java
@@ -0,0 +1,101 @@
+// Locator2Impl.java - extended LocatorImpl
+// http://www.saxproject.org
+// Public Domain: no warranty.
+// $Id: Locator2Impl.java,v 1.1 2003-02-01 02:10:44 cbj Exp $
+
+package org.xml.sax.ext;
+
+import org.xml.sax.Locator;
+import org.xml.sax.helpers.LocatorImpl;
+
+
+/**
+ * SAX2 extension helper for holding additional Entity information,
+ * implementing the {@link Locator2} interface.
+ *
+ * <blockquote>
+ * <em>This module, both source code and documentation, is in the
+ * Public Domain, and comes with <strong>NO WARRANTY</strong>.</em>
+ * </blockquote>
+ *
+ * <p> This is not part of core-only SAX2 distributions.</p>
+ *
+ * @since SAX 2.0 (extensions 1.1 alpha)
+ * @author David Brownell
+ * @version TBS
+ */
+public class Locator2Impl extends LocatorImpl implements Locator2
+{
+ private String encoding;
+ private String version;
+
+
+ /**
+ * Construct a new, empty Locator2Impl object.
+ * This will not normally be useful, since the main purpose
+ * of this class is to make a snapshot of an existing Locator.
+ */
+ public Locator2Impl () { }
+
+ /**
+ * Copy an existing Locator or Locator2 object.
+ * If the object implements Locator2, values of the
+ * <em>encoding</em> and <em>version</em>strings are copied,
+ * otherwise they set to <em>null</em>.
+ *
+ * @param locator The existing Locator object.
+ */
+ public Locator2Impl (Locator locator)
+ {
+ super (locator);
+ if (locator instanceof Locator2) {
+ Locator2 l2 = (Locator2) locator;
+
+ version = l2.getXMLVersion ();
+ encoding = l2.getEncoding ();
+ }
+ }
+
+ ////////////////////////////////////////////////////////////////////
+ // Locator2 method implementations
+ ////////////////////////////////////////////////////////////////////
+
+ /**
+ * Returns the current value of the version property.
+ *
+ * @see #setXMLVersion
+ */
+ public String getXMLVersion ()
+ { return version; }
+
+ /**
+ * Returns the current value of the encoding property.
+ *
+ * @see #setEncoding
+ */
+ public String getEncoding ()
+ { return encoding; }
+
+
+ ////////////////////////////////////////////////////////////////////
+ // Setters
+ ////////////////////////////////////////////////////////////////////
+
+ /**
+ * Assigns the current value of the version property.
+ *
+ * @param version the new "version" value
+ * @see #getXMLVersion
+ */
+ public void setXMLVersion (String version)
+ { this.version = version; }
+
+ /**
+ * Assigns the current value of the encoding property.
+ *
+ * @param version the new "encoding" value
+ * @see #getEncoding
+ */
+ public void setEncoding (String encoding)
+ { this.encoding = encoding; }
+}
diff --git a/external/jaxp/source/org/xml/sax/ext/package.html b/external/jaxp/source/org/xml/sax/ext/package.html
new file mode 100755
index 000000000..d506f270d
--- /dev/null
+++ b/external/jaxp/source/org/xml/sax/ext/package.html
@@ -0,0 +1,46 @@
+<HTML><HEAD>
+<!-- $Id: package.html,v 1.1 2003-02-01 02:10:44 cbj Exp $ -->
+</HEAD><BODY>
+
+<p>
+This package contains interfaces to SAX2 facilities that
+conformant SAX drivers won't necessarily support.
+
+<p>See <a href='http://www.saxproject.org'>http://www.saxproject.org</a>
+for more information about SAX.</p>
+
+<p> This package is independent of the SAX2 core, though the functionality
+exposed generally needs to be implemented within a parser core.
+That independence has several consequences:</p>
+
+<ul>
+
+<li>SAX2 drivers are <em>not</em> required to recognize these handlers.
+</li>
+
+<li>You cannot assume that the class files will be present in every SAX2
+installation.</li>
+
+<li>This package may be updated independently of SAX2 (i.e. new
+handlers and classes may be added without updating SAX2 itself).</li>
+
+<li>The new handlers are not implemented by the SAX2
+<code>org.xml.sax.helpers.DefaultHandler</code> or
+<code>org.xml.sax.helpers.XMLFilterImpl</code> classes.
+You can subclass these if you need such behavior, or
+use the helper classes found here.</li>
+
+<li>The handlers need to be registered differently than core SAX2
+handlers.</li>
+
+</ul>
+
+<p>This package, SAX2-ext, is a standardized extension to SAX2. It is
+designed both to allow SAX parsers to pass certain types of information
+to applications, and to serve as a simple model for other SAX2 parser
+extension packages. Not all such extension packages should need to
+be recognized directly by parsers, however.
+As an example, most validation systems can be cleanly layered on top
+of parsers supporting the standardized SAX2 interfaces. </p>
+
+</BODY></HTML>
diff --git a/external/jaxp/source/org/xml/sax/helpers/AttributeListImpl.java b/external/jaxp/source/org/xml/sax/helpers/AttributeListImpl.java
new file mode 100755
index 000000000..86597d17d
--- /dev/null
+++ b/external/jaxp/source/org/xml/sax/helpers/AttributeListImpl.java
@@ -0,0 +1,312 @@
+// SAX default implementation for AttributeList.
+// http://www.saxproject.org
+// No warranty; no copyright -- use this as you will.
+// $Id: AttributeListImpl.java,v 1.1 2003-02-01 02:10:45 cbj Exp $
+
+package org.xml.sax.helpers;
+
+import org.xml.sax.AttributeList;
+
+import java.util.Vector;
+
+
+/**
+ * Default implementation for AttributeList.
+ *
+ * <blockquote>
+ * <em>This module, both source code and documentation, is in the
+ * Public Domain, and comes with <strong>NO WARRANTY</strong>.</em>
+ * See <a href='http://www.saxproject.org'>http://www.saxproject.org</a>
+ * for further information.
+ * </blockquote>
+ *
+ * <p>AttributeList implements the deprecated SAX1 {@link
+ * org.xml.sax.AttributeList AttributeList} interface, and has been
+ * replaced by the new SAX2 {@link org.xml.sax.helpers.AttributesImpl
+ * AttributesImpl} interface.</p>
+ *
+ * <p>This class provides a convenience implementation of the SAX
+ * {@link org.xml.sax.AttributeList AttributeList} interface. This
+ * implementation is useful both for SAX parser writers, who can use
+ * it to provide attributes to the application, and for SAX application
+ * writers, who can use it to create a persistent copy of an element's
+ * attribute specifications:</p>
+ *
+ * <pre>
+ * private AttributeList myatts;
+ *
+ * public void startElement (String name, AttributeList atts)
+ * {
+ * // create a persistent copy of the attribute list
+ * // for use outside this method
+ * myatts = new AttributeListImpl(atts);
+ * [...]
+ * }
+ * </pre>
+ *
+ * <p>Please note that SAX parsers are not required to use this
+ * class to provide an implementation of AttributeList; it is
+ * supplied only as an optional convenience. In particular,
+ * parser writers are encouraged to invent more efficient
+ * implementations.</p>
+ *
+ * @deprecated This class implements a deprecated interface,
+ * {@link org.xml.sax.AttributeList AttributeList};
+ * that interface has been replaced by
+ * {@link org.xml.sax.Attributes Attributes},
+ * which is implemented in the
+ * {@link org.xml.sax.helpers.AttributesImpl
+ * AttributesImpl} helper class.
+ * @since SAX 1.0
+ * @author David Megginson
+ * @version 2.0.1 (sax2r2)
+ * @see org.xml.sax.AttributeList
+ * @see org.xml.sax.DocumentHandler#startElement
+ */
+public class AttributeListImpl implements AttributeList
+{
+
+ /**
+ * Create an empty attribute list.
+ *
+ * <p>This constructor is most useful for parser writers, who
+ * will use it to create a single, reusable attribute list that
+ * can be reset with the clear method between elements.</p>
+ *
+ * @see #addAttribute
+ * @see #clear
+ */
+ public AttributeListImpl ()
+ {
+ }
+
+
+ /**
+ * Construct a persistent copy of an existing attribute list.
+ *
+ * <p>This constructor is most useful for application writers,
+ * who will use it to create a persistent copy of an existing
+ * attribute list.</p>
+ *
+ * @param atts The attribute list to copy
+ * @see org.xml.sax.DocumentHandler#startElement
+ */
+ public AttributeListImpl (AttributeList atts)
+ {
+ setAttributeList(atts);
+ }
+
+
+
+ ////////////////////////////////////////////////////////////////////
+ // Methods specific to this class.
+ ////////////////////////////////////////////////////////////////////
+
+
+ /**
+ * Set the attribute list, discarding previous contents.
+ *
+ * <p>This method allows an application writer to reuse an
+ * attribute list easily.</p>
+ *
+ * @param atts The attribute list to copy.
+ */
+ public void setAttributeList (AttributeList atts)
+ {
+ int count = atts.getLength();
+
+ clear();
+
+ for (int i = 0; i < count; i++) {
+ addAttribute(atts.getName(i), atts.getType(i), atts.getValue(i));
+ }
+ }
+
+
+ /**
+ * Add an attribute to an attribute list.
+ *
+ * <p>This method is provided for SAX parser writers, to allow them
+ * to build up an attribute list incrementally before delivering
+ * it to the application.</p>
+ *
+ * @param name The attribute name.
+ * @param type The attribute type ("NMTOKEN" for an enumeration).
+ * @param value The attribute value (must not be null).
+ * @see #removeAttribute
+ * @see org.xml.sax.DocumentHandler#startElement
+ */
+ public void addAttribute (String name, String type, String value)
+ {
+ names.addElement(name);
+ types.addElement(type);
+ values.addElement(value);
+ }
+
+
+ /**
+ * Remove an attribute from the list.
+ *
+ * <p>SAX application writers can use this method to filter an
+ * attribute out of an AttributeList. Note that invoking this
+ * method will change the length of the attribute list and
+ * some of the attribute's indices.</p>
+ *
+ * <p>If the requested attribute is not in the list, this is
+ * a no-op.</p>
+ *
+ * @param name The attribute name.
+ * @see #addAttribute
+ */
+ public void removeAttribute (String name)
+ {
+ int i = names.indexOf(name);
+
+ if (i >= 0) {
+ names.removeElementAt(i);
+ types.removeElementAt(i);
+ values.removeElementAt(i);
+ }
+ }
+
+
+ /**
+ * Clear the attribute list.
+ *
+ * <p>SAX parser writers can use this method to reset the attribute
+ * list between DocumentHandler.startElement events. Normally,
+ * it will make sense to reuse the same AttributeListImpl object
+ * rather than allocating a new one each time.</p>
+ *
+ * @see org.xml.sax.DocumentHandler#startElement
+ */
+ public void clear ()
+ {
+ names.removeAllElements();
+ types.removeAllElements();
+ values.removeAllElements();
+ }
+
+
+
+ ////////////////////////////////////////////////////////////////////
+ // Implementation of org.xml.sax.AttributeList
+ ////////////////////////////////////////////////////////////////////
+
+
+ /**
+ * Return the number of attributes in the list.
+ *
+ * @return The number of attributes in the list.
+ * @see org.xml.sax.AttributeList#getLength
+ */
+ public int getLength ()
+ {
+ return names.size();
+ }
+
+
+ /**
+ * Get the name of an attribute (by position).
+ *
+ * @param i The position of the attribute in the list.
+ * @return The attribute name as a string, or null if there
+ * is no attribute at that position.
+ * @see org.xml.sax.AttributeList#getName(int)
+ */
+ public String getName (int i)
+ {
+ if (i < 0) {
+ return null;
+ }
+ try {
+ return (String)names.elementAt(i);
+ } catch (ArrayIndexOutOfBoundsException e) {
+ return null;
+ }
+ }
+
+
+ /**
+ * Get the type of an attribute (by position).
+ *
+ * @param i The position of the attribute in the list.
+ * @return The attribute type as a string ("NMTOKEN" for an
+ * enumeration, and "CDATA" if no declaration was
+ * read), or null if there is no attribute at
+ * that position.
+ * @see org.xml.sax.AttributeList#getType(int)
+ */
+ public String getType (int i)
+ {
+ if (i < 0) {
+ return null;
+ }
+ try {
+ return (String)types.elementAt(i);
+ } catch (ArrayIndexOutOfBoundsException e) {
+ return null;
+ }
+ }
+
+
+ /**
+ * Get the value of an attribute (by position).
+ *
+ * @param i The position of the attribute in the list.
+ * @return The attribute value as a string, or null if
+ * there is no attribute at that position.
+ * @see org.xml.sax.AttributeList#getValue(int)
+ */
+ public String getValue (int i)
+ {
+ if (i < 0) {
+ return null;
+ }
+ try {
+ return (String)values.elementAt(i);
+ } catch (ArrayIndexOutOfBoundsException e) {
+ return null;
+ }
+ }
+
+
+ /**
+ * Get the type of an attribute (by name).
+ *
+ * @param name The attribute name.
+ * @return The attribute type as a string ("NMTOKEN" for an
+ * enumeration, and "CDATA" if no declaration was
+ * read).
+ * @see org.xml.sax.AttributeList#getType(java.lang.String)
+ */
+ public String getType (String name)
+ {
+ return getType(names.indexOf(name));
+ }
+
+
+ /**
+ * Get the value of an attribute (by name).
+ *
+ * @param name The attribute name.
+ * @see org.xml.sax.AttributeList#getValue(java.lang.String)
+ */
+ public String getValue (String name)
+ {
+ return getValue(names.indexOf(name));
+ }
+
+
+
+ ////////////////////////////////////////////////////////////////////
+ // Internal state.
+ ////////////////////////////////////////////////////////////////////
+
+ Vector names = new Vector();
+ Vector types = new Vector();
+ Vector values = new Vector();
+
+}
+
+// end of AttributeListImpl.java
diff --git a/external/jaxp/source/org/xml/sax/helpers/AttributesImpl.java b/external/jaxp/source/org/xml/sax/helpers/AttributesImpl.java
new file mode 100755
index 000000000..1ac4a6cec
--- /dev/null
+++ b/external/jaxp/source/org/xml/sax/helpers/AttributesImpl.java
@@ -0,0 +1,618 @@
+// AttributesImpl.java - default implementation of Attributes.
+// http://www.saxproject.org
+// Written by David Megginson
+// NO WARRANTY! This class is in the public domain.
+// $Id: AttributesImpl.java,v 1.1 2003-02-01 02:10:45 cbj Exp $
+
+package org.xml.sax.helpers;
+
+import org.xml.sax.Attributes;
+
+
+/**
+ * Default implementation of the Attributes interface.
+ *
+ * <blockquote>
+ * <em>This module, both source code and documentation, is in the
+ * Public Domain, and comes with <strong>NO WARRANTY</strong>.</em>
+ * See <a href='http://www.saxproject.org'>http://www.saxproject.org</a>
+ * for further information.
+ * </blockquote>
+ *
+ * <p>This class provides a default implementation of the SAX2
+ * {@link org.xml.sax.Attributes Attributes} interface, with the
+ * addition of manipulators so that the list can be modified or
+ * reused.</p>
+ *
+ * <p>There are two typical uses of this class:</p>
+ *
+ * <ol>
+ * <li>to take a persistent snapshot of an Attributes object
+ * in a {@link org.xml.sax.ContentHandler#startElement startElement} event; or</li>
+ * <li>to construct or modify an Attributes object in a SAX2 driver or filter.</li>
+ * </ol>
+ *
+ * <p>This class replaces the now-deprecated SAX1 {@link
+ * org.xml.sax.helpers.AttributeListImpl AttributeListImpl}
+ * class; in addition to supporting the updated Attributes
+ * interface rather than the deprecated {@link org.xml.sax.AttributeList
+ * AttributeList} interface, it also includes a much more efficient
+ * implementation using a single array rather than a set of Vectors.</p>
+ *
+ * @since SAX 2.0
+ * @author David Megginson
+ * @version 2.0.1 (sax2r2)
+ */
+public class AttributesImpl implements Attributes
+{
+
+
+ ////////////////////////////////////////////////////////////////////
+ // Constructors.
+ ////////////////////////////////////////////////////////////////////
+
+
+ /**
+ * Construct a new, empty AttributesImpl object.
+ */
+ public AttributesImpl ()
+ {
+ length = 0;
+ data = null;
+ }
+
+
+ /**
+ * Copy an existing Attributes object.
+ *
+ * <p>This constructor is especially useful inside a
+ * {@link org.xml.sax.ContentHandler#startElement startElement} event.</p>
+ *
+ * @param atts The existing Attributes object.
+ */
+ public AttributesImpl (Attributes atts)
+ {
+ setAttributes(atts);
+ }
+
+
+
+ ////////////////////////////////////////////////////////////////////
+ // Implementation of org.xml.sax.Attributes.
+ ////////////////////////////////////////////////////////////////////
+
+
+ /**
+ * Return the number of attributes in the list.
+ *
+ * @return The number of attributes in the list.
+ * @see org.xml.sax.Attributes#getLength
+ */
+ public int getLength ()
+ {
+ return length;
+ }
+
+
+ /**
+ * Return an attribute's Namespace URI.
+ *
+ * @param index The attribute's index (zero-based).
+ * @return The Namespace URI, the empty string if none is
+ * available, or null if the index is out of range.
+ * @see org.xml.sax.Attributes#getURI
+ */
+ public String getURI (int index)
+ {
+ if (index >= 0 && index < length) {
+ return data[index*5];
+ } else {
+ return null;
+ }
+ }
+
+
+ /**
+ * Return an attribute's local name.
+ *
+ * @param index The attribute's index (zero-based).
+ * @return The attribute's local name, the empty string if
+ * none is available, or null if the index if out of range.
+ * @see org.xml.sax.Attributes#getLocalName
+ */
+ public String getLocalName (int index)
+ {
+ if (index >= 0 && index < length) {
+ return data[index*5+1];
+ } else {
+ return null;
+ }
+ }
+
+
+ /**
+ * Return an attribute's qualified (prefixed) name.
+ *
+ * @param index The attribute's index (zero-based).
+ * @return The attribute's qualified name, the empty string if
+ * none is available, or null if the index is out of bounds.
+ * @see org.xml.sax.Attributes#getQName
+ */
+ public String getQName (int index)
+ {
+ if (index >= 0 && index < length) {
+ return data[index*5+2];
+ } else {
+ return null;
+ }
+ }
+
+
+ /**
+ * Return an attribute's type by index.
+ *
+ * @param index The attribute's index (zero-based).
+ * @return The attribute's type, "CDATA" if the type is unknown, or null
+ * if the index is out of bounds.
+ * @see org.xml.sax.Attributes#getType(int)
+ */
+ public String getType (int index)
+ {
+ if (index >= 0 && index < length) {
+ return data[index*5+3];
+ } else {
+ return null;
+ }
+ }
+
+
+ /**
+ * Return an attribute's value by index.
+ *
+ * @param index The attribute's index (zero-based).
+ * @return The attribute's value or null if the index is out of bounds.
+ * @see org.xml.sax.Attributes#getValue(int)
+ */
+ public String getValue (int index)
+ {
+ if (index >= 0 && index < length) {
+ return data[index*5+4];
+ } else {
+ return null;
+ }
+ }
+
+
+ /**
+ * Look up an attribute's index by Namespace name.
+ *
+ * <p>In many cases, it will be more efficient to look up the name once and
+ * use the index query methods rather than using the name query methods
+ * repeatedly.</p>
+ *
+ * @param uri The attribute's Namespace URI, or the empty
+ * string if none is available.
+ * @param localName The attribute's local name.
+ * @return The attribute's index, or -1 if none matches.
+ * @see org.xml.sax.Attributes#getIndex(java.lang.String,java.lang.String)
+ */
+ public int getIndex (String uri, String localName)
+ {
+ int max = length * 5;
+ for (int i = 0; i < max; i += 5) {
+ if (data[i].equals(uri) && data[i+1].equals(localName)) {
+ return i / 5;
+ }
+ }
+ return -1;
+ }
+
+
+ /**
+ * Look up an attribute's index by qualified (prefixed) name.
+ *
+ * @param qName The qualified name.
+ * @return The attribute's index, or -1 if none matches.
+ * @see org.xml.sax.Attributes#getIndex(java.lang.String)
+ */
+ public int getIndex (String qName)
+ {
+ int max = length * 5;
+ for (int i = 0; i < max; i += 5) {
+ if (data[i+2].equals(qName)) {
+ return i / 5;
+ }
+ }
+ return -1;
+ }
+
+
+ /**
+ * Look up an attribute's type by Namespace-qualified name.
+ *
+ * @param uri The Namespace URI, or the empty string for a name
+ * with no explicit Namespace URI.
+ * @param localName The local name.
+ * @return The attribute's type, or null if there is no
+ * matching attribute.
+ * @see org.xml.sax.Attributes#getType(java.lang.String,java.lang.String)
+ */
+ public String getType (String uri, String localName)
+ {
+ int max = length * 5;
+ for (int i = 0; i < max; i += 5) {
+ if (data[i].equals(uri) && data[i+1].equals(localName)) {
+ return data[i+3];
+ }
+ }
+ return null;
+ }
+
+
+ /**
+ * Look up an attribute's type by qualified (prefixed) name.
+ *
+ * @param qName The qualified name.
+ * @return The attribute's type, or null if there is no
+ * matching attribute.
+ * @see org.xml.sax.Attributes#getType(java.lang.String)
+ */
+ public String getType (String qName)
+ {
+ int max = length * 5;
+ for (int i = 0; i < max; i += 5) {
+ if (data[i+2].equals(qName)) {
+ return data[i+3];
+ }
+ }
+ return null;
+ }
+
+
+ /**
+ * Look up an attribute's value by Namespace-qualified name.
+ *
+ * @param uri The Namespace URI, or the empty string for a name
+ * with no explicit Namespace URI.
+ * @param localName The local name.
+ * @return The attribute's value, or null if there is no
+ * matching attribute.
+ * @see org.xml.sax.Attributes#getValue(java.lang.String,java.lang.String)
+ */
+ public String getValue (String uri, String localName)
+ {
+ int max = length * 5;
+ for (int i = 0; i < max; i += 5) {
+ if (data[i].equals(uri) && data[i+1].equals(localName)) {
+ return data[i+4];
+ }
+ }
+ return null;
+ }
+
+
+ /**
+ * Look up an attribute's value by qualified (prefixed) name.
+ *
+ * @param qName The qualified name.
+ * @return The attribute's value, or null if there is no
+ * matching attribute.
+ * @see org.xml.sax.Attributes#getValue(java.lang.String)
+ */
+ public String getValue (String qName)
+ {
+ int max = length * 5;
+ for (int i = 0; i < max; i += 5) {
+ if (data[i+2].equals(qName)) {
+ return data[i+4];
+ }
+ }
+ return null;
+ }
+
+
+
+ ////////////////////////////////////////////////////////////////////
+ // Manipulators.
+ ////////////////////////////////////////////////////////////////////
+
+
+ /**
+ * Clear the attribute list for reuse.
+ *
+ * <p>Note that little memory is freed by this call:
+ * the current array is kept so it can be
+ * reused.</p>
+ */
+ public void clear ()
+ {
+ if (data != null) {
+ for (int i = 0; i < (length * 5); i++)
+ data [i] = null;
+ }
+ length = 0;
+ }
+
+
+ /**
+ * Copy an entire Attributes object.
+ *
+ * <p>It may be more efficient to reuse an existing object
+ * rather than constantly allocating new ones.</p>
+ *
+ * @param atts The attributes to copy.
+ */
+ public void setAttributes (Attributes atts)
+ {
+ clear();
+ length = atts.getLength();
+ if (length > 0) {
+ data = new String[length*5];
+ for (int i = 0; i < length; i++) {
+ data[i*5] = atts.getURI(i);
+ data[i*5+1] = atts.getLocalName(i);
+ data[i*5+2] = atts.getQName(i);
+ data[i*5+3] = atts.getType(i);
+ data[i*5+4] = atts.getValue(i);
+ }
+ }
+ }
+
+
+ /**
+ * Add an attribute to the end of the list.
+ *
+ * <p>For the sake of speed, this method does no checking
+ * to see if the attribute is already in the list: that is
+ * the responsibility of the application.</p>
+ *
+ * @param uri The Namespace URI, or the empty string if
+ * none is available or Namespace processing is not
+ * being performed.
+ * @param localName The local name, or the empty string if
+ * Namespace processing is not being performed.
+ * @param qName The qualified (prefixed) name, or the empty string
+ * if qualified names are not available.
+ * @param type The attribute type as a string.
+ * @param value The attribute value.
+ */
+ public void addAttribute (String uri, String localName, String qName,
+ String type, String value)
+ {
+ ensureCapacity(length+1);
+ data[length*5] = uri;
+ data[length*5+1] = localName;
+ data[length*5+2] = qName;
+ data[length*5+3] = type;
+ data[length*5+4] = value;
+ length++;
+ }
+
+
+ /**
+ * Set an attribute in the list.
+ *
+ * <p>For the sake of speed, this method does no checking
+ * for name conflicts or well-formedness: such checks are the
+ * responsibility of the application.</p>
+ *
+ * @param index The index of the attribute (zero-based).
+ * @param uri The Namespace URI, or the empty string if
+ * none is available or Namespace processing is not
+ * being performed.
+ * @param localName The local name, or the empty string if
+ * Namespace processing is not being performed.
+ * @param qName The qualified name, or the empty string
+ * if qualified names are not available.
+ * @param type The attribute type as a string.
+ * @param value The attribute value.
+ * @exception java.lang.ArrayIndexOutOfBoundsException When the
+ * supplied index does not point to an attribute
+ * in the list.
+ */
+ public void setAttribute (int index, String uri, String localName,
+ String qName, String type, String value)
+ {
+ if (index >= 0 && index < length) {
+ data[index*5] = uri;
+ data[index*5+1] = localName;
+ data[index*5+2] = qName;
+ data[index*5+3] = type;
+ data[index*5+4] = value;
+ } else {
+ badIndex(index);
+ }
+ }
+
+
+ /**
+ * Remove an attribute from the list.
+ *
+ * @param index The index of the attribute (zero-based).
+ * @exception java.lang.ArrayIndexOutOfBoundsException When the
+ * supplied index does not point to an attribute
+ * in the list.
+ */
+ public void removeAttribute (int index)
+ {
+ if (index >= 0 && index < length) {
+ if (index < length - 1) {
+ System.arraycopy(data, (index+1)*5, data, index*5,
+ (length-index-1)*5);
+ }
+ index = (length - 1) * 5;
+ data [index++] = null;
+ data [index++] = null;
+ data [index++] = null;
+ data [index++] = null;
+ data [index] = null;
+ length--;
+ } else {
+ badIndex(index);
+ }
+ }
+
+
+ /**
+ * Set the Namespace URI of a specific attribute.
+ *
+ * @param index The index of the attribute (zero-based).
+ * @param uri The attribute's Namespace URI, or the empty
+ * string for none.
+ * @exception java.lang.ArrayIndexOutOfBoundsException When the
+ * supplied index does not point to an attribute
+ * in the list.
+ */
+ public void setURI (int index, String uri)
+ {
+ if (index >= 0 && index < length) {
+ data[index*5] = uri;
+ } else {
+ badIndex(index);
+ }
+ }
+
+
+ /**
+ * Set the local name of a specific attribute.
+ *
+ * @param index The index of the attribute (zero-based).
+ * @param localName The attribute's local name, or the empty
+ * string for none.
+ * @exception java.lang.ArrayIndexOutOfBoundsException When the
+ * supplied index does not point to an attribute
+ * in the list.
+ */
+ public void setLocalName (int index, String localName)
+ {
+ if (index >= 0 && index < length) {
+ data[index*5+1] = localName;
+ } else {
+ badIndex(index);
+ }
+ }
+
+
+ /**
+ * Set the qualified name of a specific attribute.
+ *
+ * @param index The index of the attribute (zero-based).
+ * @param qName The attribute's qualified name, or the empty
+ * string for none.
+ * @exception java.lang.ArrayIndexOutOfBoundsException When the
+ * supplied index does not point to an attribute
+ * in the list.
+ */
+ public void setQName (int index, String qName)
+ {
+ if (index >= 0 && index < length) {
+ data[index*5+2] = qName;
+ } else {
+ badIndex(index);
+ }
+ }
+
+
+ /**
+ * Set the type of a specific attribute.
+ *
+ * @param index The index of the attribute (zero-based).
+ * @param type The attribute's type.
+ * @exception java.lang.ArrayIndexOutOfBoundsException When the
+ * supplied index does not point to an attribute
+ * in the list.
+ */
+ public void setType (int index, String type)
+ {
+ if (index >= 0 && index < length) {
+ data[index*5+3] = type;
+ } else {
+ badIndex(index);
+ }
+ }
+
+
+ /**
+ * Set the value of a specific attribute.
+ *
+ * @param index The index of the attribute (zero-based).
+ * @param value The attribute's value.
+ * @exception java.lang.ArrayIndexOutOfBoundsException When the
+ * supplied index does not point to an attribute
+ * in the list.
+ */
+ public void setValue (int index, String value)
+ {
+ if (index >= 0 && index < length) {
+ data[index*5+4] = value;
+ } else {
+ badIndex(index);
+ }
+ }
+
+
+
+ ////////////////////////////////////////////////////////////////////
+ // Internal methods.
+ ////////////////////////////////////////////////////////////////////
+
+
+ /**
+ * Ensure the internal array's capacity.
+ *
+ * @param n The minimum number of attributes that the array must
+ * be able to hold.
+ */
+ private void ensureCapacity (int n) {
+ if (n <= 0) {
+ return;
+ }
+ int max;
+ if (data == null || data.length == 0) {
+ max = 25;
+ }
+ else if (data.length >= n * 5) {
+ return;
+ }
+ else {
+ max = data.length;
+ }
+ while (max < n * 5) {
+ max *= 2;
+ }
+
+ String newData[] = new String[max];
+ if (length > 0) {
+ System.arraycopy(data, 0, newData, 0, length*5);
+ }
+ data = newData;
+ }
+
+
+ /**
+ * Report a bad array index in a manipulator.
+ *
+ * @param index The index to report.
+ * @exception java.lang.ArrayIndexOutOfBoundsException Always.
+ */
+ private void badIndex (int index)
+ throws ArrayIndexOutOfBoundsException
+ {
+ String msg =
+ "Attempt to modify attribute at illegal index: " + index;
+ throw new ArrayIndexOutOfBoundsException(msg);
+ }
+
+
+
+ ////////////////////////////////////////////////////////////////////
+ // Internal state.
+ ////////////////////////////////////////////////////////////////////
+
+ int length;
+ String data [];
+
+}
+
+// end of AttributesImpl.java
+
diff --git a/external/jaxp/source/org/xml/sax/helpers/DefaultHandler.java b/external/jaxp/source/org/xml/sax/helpers/DefaultHandler.java
new file mode 100755
index 000000000..1243516f8
--- /dev/null
+++ b/external/jaxp/source/org/xml/sax/helpers/DefaultHandler.java
@@ -0,0 +1,467 @@
+// DefaultHandler.java - default implementation of the core handlers.
+// http://www.saxproject.org
+// Written by David Megginson
+// NO WARRANTY! This class is in the public domain.
+// $Id: DefaultHandler.java,v 1.1 2003-02-01 02:10:45 cbj Exp $
+
+package org.xml.sax.helpers;
+
+import java.io.IOException;
+
+import org.xml.sax.InputSource;
+import org.xml.sax.Locator;
+import org.xml.sax.Attributes;
+import org.xml.sax.EntityResolver;
+import org.xml.sax.DTDHandler;
+import org.xml.sax.ContentHandler;
+import org.xml.sax.ErrorHandler;
+import org.xml.sax.SAXException;
+import org.xml.sax.SAXParseException;
+
+
+/**
+ * Default base class for SAX2 event handlers.
+ *
+ * <blockquote>
+ * <em>This module, both source code and documentation, is in the
+ * Public Domain, and comes with <strong>NO WARRANTY</strong>.</em>
+ * See <a href='http://www.saxproject.org'>http://www.saxproject.org</a>
+ * for further information.
+ * </blockquote>
+ *
+ * <p>This class is available as a convenience base class for SAX2
+ * applications: it provides default implementations for all of the
+ * callbacks in the four core SAX2 handler classes:</p>
+ *
+ * <ul>
+ * <li>{@link org.xml.sax.EntityResolver EntityResolver}</li>
+ * <li>{@link org.xml.sax.DTDHandler DTDHandler}</li>
+ * <li>{@link org.xml.sax.ContentHandler ContentHandler}</li>
+ * <li>{@link org.xml.sax.ErrorHandler ErrorHandler}</li>
+ * </ul>
+ *
+ * <p>Application writers can extend this class when they need to
+ * implement only part of an interface; parser writers can
+ * instantiate this class to provide default handlers when the
+ * application has not supplied its own.</p>
+ *
+ * <p>This class replaces the deprecated SAX1
+ * {@link org.xml.sax.HandlerBase HandlerBase} class.</p>
+ *
+ * @since SAX 2.0
+ * @author David Megginson,
+ * @version 2.0.1 (sax2r2)
+ * @see org.xml.sax.EntityResolver
+ * @see org.xml.sax.DTDHandler
+ * @see org.xml.sax.ContentHandler
+ * @see org.xml.sax.ErrorHandler
+ */
+public class DefaultHandler
+ implements EntityResolver, DTDHandler, ContentHandler, ErrorHandler
+{
+
+
+ ////////////////////////////////////////////////////////////////////
+ // Default implementation of the EntityResolver interface.
+ ////////////////////////////////////////////////////////////////////
+
+ /**
+ * Resolve an external entity.
+ *
+ * <p>Always return null, so that the parser will use the system
+ * identifier provided in the XML document. This method implements
+ * the SAX default behaviour: application writers can override it
+ * in a subclass to do special translations such as catalog lookups
+ * or URI redirection.</p>
+ *
+ * @param publicId The public identifer, or null if none is
+ * available.
+ * @param systemId The system identifier provided in the XML
+ * document.
+ * @return The new input source, or null to require the
+ * default behaviour.
+ * @exception java.io.IOException If there is an error setting
+ * up the new input source.
+ * @exception org.xml.sax.SAXException Any SAX exception, possibly
+ * wrapping another exception.
+ * @see org.xml.sax.EntityResolver#resolveEntity
+ */
+ public InputSource resolveEntity (String publicId, String systemId)
+ throws IOException, SAXException
+ {
+ return null;
+ }
+
+
+
+ ////////////////////////////////////////////////////////////////////
+ // Default implementation of DTDHandler interface.
+ ////////////////////////////////////////////////////////////////////
+
+
+ /**
+ * Receive notification of a notation declaration.
+ *
+ * <p>By default, do nothing. Application writers may override this
+ * method in a subclass if they wish to keep track of the notations
+ * declared in a document.</p>
+ *
+ * @param name The notation name.
+ * @param publicId The notation public identifier, or null if not
+ * available.
+ * @param systemId The notation system identifier.
+ * @exception org.xml.sax.SAXException Any SAX exception, possibly
+ * wrapping another exception.
+ * @see org.xml.sax.DTDHandler#notationDecl
+ */
+ public void notationDecl (String name, String publicId, String systemId)
+ throws SAXException
+ {
+ // no op
+ }
+
+
+ /**
+ * Receive notification of an unparsed entity declaration.
+ *
+ * <p>By default, do nothing. Application writers may override this
+ * method in a subclass to keep track of the unparsed entities
+ * declared in a document.</p>
+ *
+ * @param name The entity name.
+ * @param publicId The entity public identifier, or null if not
+ * available.
+ * @param systemId The entity system identifier.
+ * @param notationName The name of the associated notation.
+ * @exception org.xml.sax.SAXException Any SAX exception, possibly
+ * wrapping another exception.
+ * @see org.xml.sax.DTDHandler#unparsedEntityDecl
+ */
+ public void unparsedEntityDecl (String name, String publicId,
+ String systemId, String notationName)
+ throws SAXException
+ {
+ // no op
+ }
+
+
+
+ ////////////////////////////////////////////////////////////////////
+ // Default implementation of ContentHandler interface.
+ ////////////////////////////////////////////////////////////////////
+
+
+ /**
+ * Receive a Locator object for document events.
+ *
+ * <p>By default, do nothing. Application writers may override this
+ * method in a subclass if they wish to store the locator for use
+ * with other document events.</p>
+ *
+ * @param locator A locator for all SAX document events.
+ * @see org.xml.sax.ContentHandler#setDocumentLocator
+ * @see org.xml.sax.Locator
+ */
+ public void setDocumentLocator (Locator locator)
+ {
+ // no op
+ }
+
+
+ /**
+ * Receive notification of the beginning of the document.
+ *
+ * <p>By default, do nothing. Application writers may override this
+ * method in a subclass to take specific actions at the beginning
+ * of a document (such as allocating the root node of a tree or
+ * creating an output file).</p>
+ *
+ * @exception org.xml.sax.SAXException Any SAX exception, possibly
+ * wrapping another exception.
+ * @see org.xml.sax.ContentHandler#startDocument
+ */
+ public void startDocument ()
+ throws SAXException
+ {
+ // no op
+ }
+
+
+ /**
+ * Receive notification of the end of the document.
+ *
+ * <p>By default, do nothing. Application writers may override this
+ * method in a subclass to take specific actions at the end
+ * of a document (such as finalising a tree or closing an output
+ * file).</p>
+ *
+ * @exception org.xml.sax.SAXException Any SAX exception, possibly
+ * wrapping another exception.
+ * @see org.xml.sax.ContentHandler#endDocument
+ */
+ public void endDocument ()
+ throws SAXException
+ {
+ // no op
+ }
+
+
+ /**
+ * Receive notification of the start of a Namespace mapping.
+ *
+ * <p>By default, do nothing. Application writers may override this
+ * method in a subclass to take specific actions at the start of
+ * each Namespace prefix scope (such as storing the prefix mapping).</p>
+ *
+ * @param prefix The Namespace prefix being declared.
+ * @param uri The Namespace URI mapped to the prefix.
+ * @exception org.xml.sax.SAXException Any SAX exception, possibly
+ * wrapping another exception.
+ * @see org.xml.sax.ContentHandler#startPrefixMapping
+ */
+ public void startPrefixMapping (String prefix, String uri)
+ throws SAXException
+ {
+ // no op
+ }
+
+
+ /**
+ * Receive notification of the end of a Namespace mapping.
+ *
+ * <p>By default, do nothing. Application writers may override this
+ * method in a subclass to take specific actions at the end of
+ * each prefix mapping.</p>
+ *
+ * @param prefix The Namespace prefix being declared.
+ * @exception org.xml.sax.SAXException Any SAX exception, possibly
+ * wrapping another exception.
+ * @see org.xml.sax.ContentHandler#endPrefixMapping
+ */
+ public void endPrefixMapping (String prefix)
+ throws SAXException
+ {
+ // no op
+ }
+
+
+ /**
+ * Receive notification of the start of an element.
+ *
+ * <p>By default, do nothing. Application writers may override this
+ * method in a subclass to take specific actions at the start of
+ * each element (such as allocating a new tree node or writing
+ * output to a file).</p>
+ *
+ * @param uri The Namespace URI, or the empty string if the
+ * element has no Namespace URI or if Namespace
+ * processing is not being performed.
+ * @param localName The local name (without prefix), or the
+ * empty string if Namespace processing is not being
+ * performed.
+ * @param qName The qualified name (with prefix), or the
+ * empty string if qualified names are not available.
+ * @param atts The attributes attached to the element. If
+ * there are no attributes, it shall be an empty
+ * Attributes object.
+ * @exception org.xml.sax.SAXException Any SAX exception, possibly
+ * wrapping another exception.
+ * @see org.xml.sax.ContentHandler#startElement
+ */
+ public void startElement (String uri, String localName,
+ String qName, Attributes attributes)
+ throws SAXException
+ {
+ // no op
+ }
+
+
+ /**
+ * Receive notification of the end of an element.
+ *
+ * <p>By default, do nothing. Application writers may override this
+ * method in a subclass to take specific actions at the end of
+ * each element (such as finalising a tree node or writing
+ * output to a file).</p>
+ *
+ * @param uri The Namespace URI, or the empty string if the
+ * element has no Namespace URI or if Namespace
+ * processing is not being performed.
+ * @param localName The local name (without prefix), or the
+ * empty string if Namespace processing is not being
+ * performed.
+ * @param qName The qualified name (with prefix), or the
+ * empty string if qualified names are not available.
+ * @exception org.xml.sax.SAXException Any SAX exception, possibly
+ * wrapping another exception.
+ * @see org.xml.sax.ContentHandler#endElement
+ */
+ public void endElement (String uri, String localName, String qName)
+ throws SAXException
+ {
+ // no op
+ }
+
+
+ /**
+ * Receive notification of character data inside an element.
+ *
+ * <p>By default, do nothing. Application writers may override this
+ * method to take specific actions for each chunk of character data
+ * (such as adding the data to a node or buffer, or printing it to
+ * a file).</p>
+ *
+ * @param ch The characters.
+ * @param start The start position in the character array.
+ * @param length The number of characters to use from the
+ * character array.
+ * @exception org.xml.sax.SAXException Any SAX exception, possibly
+ * wrapping another exception.
+ * @see org.xml.sax.ContentHandler#characters
+ */
+ public void characters (char ch[], int start, int length)
+ throws SAXException
+ {
+ // no op
+ }
+
+
+ /**
+ * Receive notification of ignorable whitespace in element content.
+ *
+ * <p>By default, do nothing. Application writers may override this
+ * method to take specific actions for each chunk of ignorable
+ * whitespace (such as adding data to a node or buffer, or printing
+ * it to a file).</p>
+ *
+ * @param ch The whitespace characters.
+ * @param start The start position in the character array.
+ * @param length The number of characters to use from the
+ * character array.
+ * @exception org.xml.sax.SAXException Any SAX exception, possibly
+ * wrapping another exception.
+ * @see org.xml.sax.ContentHandler#ignorableWhitespace
+ */
+ public void ignorableWhitespace (char ch[], int start, int length)
+ throws SAXException
+ {
+ // no op
+ }
+
+
+ /**
+ * Receive notification of a processing instruction.
+ *
+ * <p>By default, do nothing. Application writers may override this
+ * method in a subclass to take specific actions for each
+ * processing instruction, such as setting status variables or
+ * invoking other methods.</p>
+ *
+ * @param target The processing instruction target.
+ * @param data The processing instruction data, or null if
+ * none is supplied.
+ * @exception org.xml.sax.SAXException Any SAX exception, possibly
+ * wrapping another exception.
+ * @see org.xml.sax.ContentHandler#processingInstruction
+ */
+ public void processingInstruction (String target, String data)
+ throws SAXException
+ {
+ // no op
+ }
+
+
+ /**
+ * Receive notification of a skipped entity.
+ *
+ * <p>By default, do nothing. Application writers may override this
+ * method in a subclass to take specific actions for each
+ * processing instruction, such as setting status variables or
+ * invoking other methods.</p>
+ *
+ * @param name The name of the skipped entity.
+ * @exception org.xml.sax.SAXException Any SAX exception, possibly
+ * wrapping another exception.
+ * @see org.xml.sax.ContentHandler#processingInstruction
+ */
+ public void skippedEntity (String name)
+ throws SAXException
+ {
+ // no op
+ }
+
+
+
+ ////////////////////////////////////////////////////////////////////
+ // Default implementation of the ErrorHandler interface.
+ ////////////////////////////////////////////////////////////////////
+
+
+ /**
+ * Receive notification of a parser warning.
+ *
+ * <p>The default implementation does nothing. Application writers
+ * may override this method in a subclass to take specific actions
+ * for each warning, such as inserting the message in a log file or
+ * printing it to the console.</p>
+ *
+ * @param e The warning information encoded as an exception.
+ * @exception org.xml.sax.SAXException Any SAX exception, possibly
+ * wrapping another exception.
+ * @see org.xml.sax.ErrorHandler#warning
+ * @see org.xml.sax.SAXParseException
+ */
+ public void warning (SAXParseException e)
+ throws SAXException
+ {
+ // no op
+ }
+
+
+ /**
+ * Receive notification of a recoverable parser error.
+ *
+ * <p>The default implementation does nothing. Application writers
+ * may override this method in a subclass to take specific actions
+ * for each error, such as inserting the message in a log file or
+ * printing it to the console.</p>
+ *
+ * @param e The warning information encoded as an exception.
+ * @exception org.xml.sax.SAXException Any SAX exception, possibly
+ * wrapping another exception.
+ * @see org.xml.sax.ErrorHandler#warning
+ * @see org.xml.sax.SAXParseException
+ */
+ public void error (SAXParseException e)
+ throws SAXException
+ {
+ // no op
+ }
+
+
+ /**
+ * Report a fatal XML parsing error.
+ *
+ * <p>The default implementation throws a SAXParseException.
+ * Application writers may override this method in a subclass if
+ * they need to take specific actions for each fatal error (such as
+ * collecting all of the errors into a single report): in any case,
+ * the application must stop all regular processing when this
+ * method is invoked, since the document is no longer reliable, and
+ * the parser may no longer report parsing events.</p>
+ *
+ * @param e The error information encoded as an exception.
+ * @exception org.xml.sax.SAXException Any SAX exception, possibly
+ * wrapping another exception.
+ * @see org.xml.sax.ErrorHandler#fatalError
+ * @see org.xml.sax.SAXParseException
+ */
+ public void fatalError (SAXParseException e)
+ throws SAXException
+ {
+ throw e;
+ }
+
+}
+
+// end of DefaultHandler.java
diff --git a/external/jaxp/source/org/xml/sax/helpers/LocatorImpl.java b/external/jaxp/source/org/xml/sax/helpers/LocatorImpl.java
new file mode 100755
index 000000000..f672fbfa5
--- /dev/null
+++ b/external/jaxp/source/org/xml/sax/helpers/LocatorImpl.java
@@ -0,0 +1,214 @@
+// SAX default implementation for Locator.
+// http://www.saxproject.org
+// No warranty; no copyright -- use this as you will.
+// $Id: LocatorImpl.java,v 1.1 2003-02-01 02:10:46 cbj Exp $
+
+package org.xml.sax.helpers;
+
+import org.xml.sax.Locator;
+
+
+/**
+ * Provide an optional convenience implementation of Locator.
+ *
+ * <blockquote>
+ * <em>This module, both source code and documentation, is in the
+ * Public Domain, and comes with <strong>NO WARRANTY</strong>.</em>
+ * See <a href='http://www.saxproject.org'>http://www.saxproject.org</a>
+ * for further information.
+ * </blockquote>
+ *
+ * <p>This class is available mainly for application writers, who
+ * can use it to make a persistent snapshot of a locator at any
+ * point during a document parse:</p>
+ *
+ * <pre>
+ * Locator locator;
+ * Locator startloc;
+ *
+ * public void setLocator (Locator locator)
+ * {
+ * // note the locator
+ * this.locator = locator;
+ * }
+ *
+ * public void startDocument ()
+ * {
+ * // save the location of the start of the document
+ * // for future use.
+ * Locator startloc = new LocatorImpl(locator);
+ * }
+ *</pre>
+ *
+ * <p>Normally, parser writers will not use this class, since it
+ * is more efficient to provide location information only when
+ * requested, rather than constantly updating a Locator object.</p>
+ *
+ * @since SAX 1.0
+ * @author David Megginson
+ * @version 2.0.1 (sax2r2)
+ * @see org.xml.sax.Locator Locator
+ */
+public class LocatorImpl implements Locator
+{
+
+
+ /**
+ * Zero-argument constructor.
+ *
+ * <p>This will not normally be useful, since the main purpose
+ * of this class is to make a snapshot of an existing Locator.</p>
+ */
+ public LocatorImpl ()
+ {
+ }
+
+
+ /**
+ * Copy constructor.
+ *
+ * <p>Create a persistent copy of the current state of a locator.
+ * When the original locator changes, this copy will still keep
+ * the original values (and it can be used outside the scope of
+ * DocumentHandler methods).</p>
+ *
+ * @param locator The locator to copy.
+ */
+ public LocatorImpl (Locator locator)
+ {
+ setPublicId(locator.getPublicId());
+ setSystemId(locator.getSystemId());
+ setLineNumber(locator.getLineNumber());
+ setColumnNumber(locator.getColumnNumber());
+ }
+
+
+
+ ////////////////////////////////////////////////////////////////////
+ // Implementation of org.xml.sax.Locator
+ ////////////////////////////////////////////////////////////////////
+
+
+ /**
+ * Return the saved public identifier.
+ *
+ * @return The public identifier as a string, or null if none
+ * is available.
+ * @see org.xml.sax.Locator#getPublicId
+ * @see #setPublicId
+ */
+ public String getPublicId ()
+ {
+ return publicId;
+ }
+
+
+ /**
+ * Return the saved system identifier.
+ *
+ * @return The system identifier as a string, or null if none
+ * is available.
+ * @see org.xml.sax.Locator#getSystemId
+ * @see #setSystemId
+ */
+ public String getSystemId ()
+ {
+ return systemId;
+ }
+
+
+ /**
+ * Return the saved line number (1-based).
+ *
+ * @return The line number as an integer, or -1 if none is available.
+ * @see org.xml.sax.Locator#getLineNumber
+ * @see #setLineNumber
+ */
+ public int getLineNumber ()
+ {
+ return lineNumber;
+ }
+
+
+ /**
+ * Return the saved column number (1-based).
+ *
+ * @return The column number as an integer, or -1 if none is available.
+ * @see org.xml.sax.Locator#getColumnNumber
+ * @see #setColumnNumber
+ */
+ public int getColumnNumber ()
+ {
+ return columnNumber;
+ }
+
+
+
+ ////////////////////////////////////////////////////////////////////
+ // Setters for the properties (not in org.xml.sax.Locator)
+ ////////////////////////////////////////////////////////////////////
+
+
+ /**
+ * Set the public identifier for this locator.
+ *
+ * @param publicId The new public identifier, or null
+ * if none is available.
+ * @see #getPublicId
+ */
+ public void setPublicId (String publicId)
+ {
+ this.publicId = publicId;
+ }
+
+
+ /**
+ * Set the system identifier for this locator.
+ *
+ * @param systemId The new system identifier, or null
+ * if none is available.
+ * @see #getSystemId
+ */
+ public void setSystemId (String systemId)
+ {
+ this.systemId = systemId;
+ }
+
+
+ /**
+ * Set the line number for this locator (1-based).
+ *
+ * @param lineNumber The line number, or -1 if none is available.
+ * @see #getLineNumber
+ */
+ public void setLineNumber (int lineNumber)
+ {
+ this.lineNumber = lineNumber;
+ }
+
+
+ /**
+ * Set the column number for this locator (1-based).
+ *
+ * @param columnNumber The column number, or -1 if none is available.
+ * @see #getColumnNumber
+ */
+ public void setColumnNumber (int columnNumber)
+ {
+ this.columnNumber = columnNumber;
+ }
+
+
+
+ ////////////////////////////////////////////////////////////////////
+ // Internal state.
+ ////////////////////////////////////////////////////////////////////
+
+ private String publicId;
+ private String systemId;
+ private int lineNumber;
+ private int columnNumber;
+
+}
+
+// end of LocatorImpl.java
diff --git a/external/jaxp/source/org/xml/sax/helpers/NamespaceSupport.java b/external/jaxp/source/org/xml/sax/helpers/NamespaceSupport.java
new file mode 100755
index 000000000..ff225dd1f
--- /dev/null
+++ b/external/jaxp/source/org/xml/sax/helpers/NamespaceSupport.java
@@ -0,0 +1,769 @@
+// NamespaceSupport.java - generic Namespace support for SAX.
+// http://www.saxproject.org
+// Written by David Megginson
+// This class is in the Public Domain. NO WARRANTY!
+// $Id: NamespaceSupport.java,v 1.1 2003-02-01 02:10:46 cbj Exp $
+
+package org.xml.sax.helpers;
+
+import java.util.EmptyStackException;
+import java.util.Enumeration;
+import java.util.Hashtable;
+import java.util.Vector;
+
+
+/**
+ * Encapsulate Namespace logic for use by applications using SAX,
+ * or internally by SAX drivers.
+ *
+ * <blockquote>
+ * <em>This module, both source code and documentation, is in the
+ * Public Domain, and comes with <strong>NO WARRANTY</strong>.</em>
+ * See <a href='http://www.saxproject.org'>http://www.saxproject.org</a>
+ * for further information.
+ * </blockquote>
+ *
+ * <p>This class encapsulates the logic of Namespace processing:
+ * it tracks the declarations currently in force for each context
+ * and automatically processes qualified XML 1.0 names into their
+ * Namespace parts; it can also be used in reverse for generating
+ * XML 1.0 from Namespaces.</p>
+ *
+ * <p>Namespace support objects are reusable, but the reset method
+ * must be invoked between each session.</p>
+ *
+ * <p>Here is a simple session:</p>
+ *
+ * <pre>
+ * String parts[] = new String[3];
+ * NamespaceSupport support = new NamespaceSupport();
+ *
+ * support.pushContext();
+ * support.declarePrefix("", "http://www.w3.org/1999/xhtml");
+ * support.declarePrefix("dc", "http://www.purl.org/dc#");
+ *
+ * parts = support.processName("p", parts, false);
+ * System.out.println("Namespace URI: " + parts[0]);
+ * System.out.println("Local name: " + parts[1]);
+ * System.out.println("Raw name: " + parts[2]);
+ *
+ * parts = support.processName("dc:title", parts, false);
+ * System.out.println("Namespace URI: " + parts[0]);
+ * System.out.println("Local name: " + parts[1]);
+ * System.out.println("Raw name: " + parts[2]);
+ *
+ * support.popContext();
+ * </pre>
+ *
+ * <p>Note that this class is optimized for the use case where most
+ * elements do not contain Namespace declarations: if the same
+ * prefix/URI mapping is repeated for each context (for example), this
+ * class will be somewhat less efficient.</p>
+ *
+ * <p>Although SAX drivers (parsers) may choose to use this class to
+ * implement namespace handling, they are not required to do so.
+ * Applications must track namespace information themselves if they
+ * want to use namespace information.
+ *
+ * @since SAX 2.0
+ * @author David Megginson
+ * @version 2.0.1 (sax2r2)
+ */
+public class NamespaceSupport
+{
+
+
+ ////////////////////////////////////////////////////////////////////
+ // Constants.
+ ////////////////////////////////////////////////////////////////////
+
+
+ /**
+ * The XML Namespace URI as a constant.
+ * The value is <code>http://www.w3.org/XML/1998/namespace</code>
+ * as defined in the XML Namespaces specification.
+ *
+ * <p>This is the Namespace URI that is automatically mapped
+ * to the "xml" prefix.</p>
+ */
+ public final static String XMLNS =
+ "http://www.w3.org/XML/1998/namespace";
+
+
+ /**
+ * An empty enumeration.
+ */
+ private final static Enumeration EMPTY_ENUMERATION =
+ new Vector().elements();
+
+
+ ////////////////////////////////////////////////////////////////////
+ // Constructor.
+ ////////////////////////////////////////////////////////////////////
+
+
+ /**
+ * Create a new Namespace support object.
+ */
+ public NamespaceSupport ()
+ {
+ reset();
+ }
+
+
+
+ ////////////////////////////////////////////////////////////////////
+ // Context management.
+ ////////////////////////////////////////////////////////////////////
+
+
+ /**
+ * Reset this Namespace support object for reuse.
+ *
+ * <p>It is necessary to invoke this method before reusing the
+ * Namespace support object for a new session.</p>
+ */
+ public void reset ()
+ {
+ contexts = new Context[32];
+ contextPos = 0;
+ contexts[contextPos] = currentContext = new Context();
+ currentContext.declarePrefix("xml", XMLNS);
+ }
+
+
+ /**
+ * Start a new Namespace context.
+ * The new context will automatically inherit
+ * the declarations of its parent context, but it will also keep
+ * track of which declarations were made within this context.
+ *
+ * <p>Event callback code should start a new context once per element.
+ * This means being ready to call this in either of two places.
+ * For elements that don't include namespace declarations, the
+ * <em>ContentHandler.startElement()</em> callback is the right place.
+ * For elements with such a declaration, it'd done in the first
+ * <em>ContentHandler.startPrefixMapping()</em> callback.
+ * A boolean flag can be used to
+ * track whether a context has been started yet. When either of
+ * those methods is called, it checks the flag to see if a new context
+ * needs to be started. If so, it starts the context and sets the
+ * flag. After <em>ContentHandler.startElement()</em>
+ * does that, it always clears the flag.
+ *
+ * <p>Normally, SAX drivers would push a new context at the beginning
+ * of each XML element. Then they perform a first pass over the
+ * attributes to process all namespace declarations, making
+ * <em>ContentHandler.startPrefixMapping()</em> callbacks.
+ * Then a second pass is made, to determine the namespace-qualified
+ * names for all attributes and for the element name.
+ * Finally all the information for the
+ * <em>ContentHandler.startElement()</em> callback is available,
+ * so it can then be made.
+ *
+ * <p>The Namespace support object always starts with a base context
+ * already in force: in this context, only the "xml" prefix is
+ * declared.</p>
+ *
+ * @see org.xml.sax.ContentHandler
+ * @see #popContext
+ */
+ public void pushContext ()
+ {
+ int max = contexts.length;
+
+ contexts [contextPos].declsOK = false;
+ contextPos++;
+
+ // Extend the array if necessary
+ if (contextPos >= max) {
+ Context newContexts[] = new Context[max*2];
+ System.arraycopy(contexts, 0, newContexts, 0, max);
+ max *= 2;
+ contexts = newContexts;
+ }
+
+ // Allocate the context if necessary.
+ currentContext = contexts[contextPos];
+ if (currentContext == null) {
+ contexts[contextPos] = currentContext = new Context();
+ }
+
+ // Set the parent, if any.
+ if (contextPos > 0) {
+ currentContext.setParent(contexts[contextPos - 1]);
+ }
+ }
+
+
+ /**
+ * Revert to the previous Namespace context.
+ *
+ * <p>Normally, you should pop the context at the end of each
+ * XML element. After popping the context, all Namespace prefix
+ * mappings that were previously in force are restored.</p>
+ *
+ * <p>You must not attempt to declare additional Namespace
+ * prefixes after popping a context, unless you push another
+ * context first.</p>
+ *
+ * @see #pushContext
+ */
+ public void popContext ()
+ {
+ contexts[contextPos].clear();
+ contextPos--;
+ if (contextPos < 0) {
+ throw new EmptyStackException();
+ }
+ currentContext = contexts[contextPos];
+ }
+
+
+
+ ////////////////////////////////////////////////////////////////////
+ // Operations within a context.
+ ////////////////////////////////////////////////////////////////////
+
+
+ /**
+ * Declare a Namespace prefix. All prefixes must be declared
+ * before they are referenced. For example, a SAX driver (parser)
+ * would scan an element's attributes
+ * in two passes: first for namespace declarations,
+ * then a second pass using {@link #processName processName()} to
+ * interpret prefixes against (potentially redefined) prefixes.
+ *
+ * <p>This method declares a prefix in the current Namespace
+ * context; the prefix will remain in force until this context
+ * is popped, unless it is shadowed in a descendant context.</p>
+ *
+ * <p>To declare the default element Namespace, use the empty string as
+ * the prefix.</p>
+ *
+ * <p>Note that you must <em>not</em> declare a prefix after
+ * you've pushed and popped another Namespace context, or
+ * treated the declarations phase as complete by processing
+ * a prefixed name.</p>
+ *
+ * <p>Note that there is an asymmetry in this library: {@link
+ * #getPrefix getPrefix} will not return the "" prefix,
+ * even if you have declared a default element namespace.
+ * To check for a default namespace,
+ * you have to look it up explicitly using {@link #getURI getURI}.
+ * This asymmetry exists to make it easier to look up prefixes
+ * for attribute names, where the default prefix is not allowed.</p>
+ *
+ * @param prefix The prefix to declare, or the empty string to
+ * indicate the default element namespace. This may never have
+ * the value "xml" or "xmlns".
+ * @param uri The Namespace URI to associate with the prefix.
+ * @return true if the prefix was legal, false otherwise
+ * @exception IllegalStateException when a prefix is declared
+ * after looking up a name in the context, or after pushing
+ * another context on top of it.
+ *
+ * @see #processName
+ * @see #getURI
+ * @see #getPrefix
+ */
+ public boolean declarePrefix (String prefix, String uri)
+ {
+ if (prefix.equals("xml") || prefix.equals("xmlns")) {
+ return false;
+ } else {
+ currentContext.declarePrefix(prefix, uri);
+ return true;
+ }
+ }
+
+
+ /**
+ * Process a raw XML 1.0 name, after all declarations in the current
+ * context have been handled by {@link #declarePrefix declarePrefix()}.
+ *
+ * <p>This method processes a raw XML 1.0 name in the current
+ * context by removing the prefix and looking it up among the
+ * prefixes currently declared. The return value will be the
+ * array supplied by the caller, filled in as follows:</p>
+ *
+ * <dl>
+ * <dt>parts[0]</dt>
+ * <dd>The Namespace URI, or an empty string if none is
+ * in use.</dd>
+ * <dt>parts[1]</dt>
+ * <dd>The local name (without prefix).</dd>
+ * <dt>parts[2]</dt>
+ * <dd>The original raw name.</dd>
+ * </dl>
+ *
+ * <p>All of the strings in the array will be internalized. If
+ * the raw name has a prefix that has not been declared, then
+ * the return value will be null.</p>
+ *
+ * <p>Note that attribute names are processed differently than
+ * element names: an unprefixed element name will received the
+ * default Namespace (if any), while an unprefixed attribute name
+ * will not.</p>
+ *
+ * @param qName The raw XML 1.0 name to be processed.
+ * @param parts An array supplied by the caller, capable of
+ * holding at least three members.
+ * @param isAttribute A flag indicating whether this is an
+ * attribute name (true) or an element name (false).
+ * @return The supplied array holding three internalized strings
+ * representing the Namespace URI (or empty string), the
+ * local name, and the raw XML 1.0 name; or null if there
+ * is an undeclared prefix.
+ * @see #declarePrefix
+ * @see java.lang.String#intern */
+ public String [] processName (String qName, String parts[],
+ boolean isAttribute)
+ {
+ String myParts[] = currentContext.processName(qName, isAttribute);
+ if (myParts == null) {
+ return null;
+ } else {
+ parts[0] = myParts[0];
+ parts[1] = myParts[1];
+ parts[2] = myParts[2];
+ return parts;
+ }
+ }
+
+
+ /**
+ * Look up a prefix and get the currently-mapped Namespace URI.
+ *
+ * <p>This method looks up the prefix in the current context.
+ * Use the empty string ("") for the default Namespace.</p>
+ *
+ * @param prefix The prefix to look up.
+ * @return The associated Namespace URI, or null if the prefix
+ * is undeclared in this context.
+ * @see #getPrefix
+ * @see #getPrefixes
+ */
+ public String getURI (String prefix)
+ {
+ return currentContext.getURI(prefix);
+ }
+
+
+ /**
+ * Return an enumeration of all prefixes currently declared.
+ *
+ * <p><strong>Note:</strong> if there is a default prefix, it will not be
+ * returned in this enumeration; check for the default prefix
+ * using the {@link #getURI getURI} with an argument of "".</p>
+ *
+ * @return An enumeration of all prefixes declared in the
+ * current context except for the empty (default)
+ * prefix.
+ * @see #getDeclaredPrefixes
+ * @see #getURI
+ */
+ public Enumeration getPrefixes ()
+ {
+ return currentContext.getPrefixes();
+ }
+
+
+ /**
+ * Return one of the prefixes mapped to a Namespace URI.
+ *
+ * <p>If more than one prefix is currently mapped to the same
+ * URI, this method will make an arbitrary selection; if you
+ * want all of the prefixes, use the {@link #getPrefixes}
+ * method instead.</p>
+ *
+ * <p><strong>Note:</strong> this will never return the empty (default) prefix;
+ * to check for a default prefix, use the {@link #getURI getURI}
+ * method with an argument of "".</p>
+ *
+ * @param uri The Namespace URI.
+ * @param isAttribute true if this prefix is for an attribute
+ * (and the default Namespace is not allowed).
+ * @return One of the prefixes currently mapped to the URI supplied,
+ * or null if none is mapped or if the URI is assigned to
+ * the default Namespace.
+ * @see #getPrefixes(java.lang.String)
+ * @see #getURI
+ */
+ public String getPrefix (String uri)
+ {
+ return currentContext.getPrefix(uri);
+ }
+
+
+ /**
+ * Return an enumeration of all prefixes currently declared for a URI.
+ *
+ * <p>This method returns prefixes mapped to a specific Namespace
+ * URI. The xml: prefix will be included. If you want only one
+ * prefix that's mapped to the Namespace URI, and you don't care
+ * which one you get, use the {@link #getPrefix getPrefix}
+ * method instead.</p>
+ *
+ * <p><strong>Note:</strong> the empty (default) prefix is <em>never</em> included
+ * in this enumeration; to check for the presence of a default
+ * Namespace, use the {@link #getURI getURI} method with an
+ * argument of "".</p>
+ *
+ * @param uri The Namespace URI.
+ * @return An enumeration of all prefixes declared in the
+ * current context.
+ * @see #getPrefix
+ * @see #getDeclaredPrefixes
+ * @see #getURI
+ */
+ public Enumeration getPrefixes (String uri)
+ {
+ Vector prefixes = new Vector();
+ Enumeration allPrefixes = getPrefixes();
+ while (allPrefixes.hasMoreElements()) {
+ String prefix = (String)allPrefixes.nextElement();
+ if (uri.equals(getURI(prefix))) {
+ prefixes.addElement(prefix);
+ }
+ }
+ return prefixes.elements();
+ }
+
+
+ /**
+ * Return an enumeration of all prefixes declared in this context.
+ *
+ * <p>The empty (default) prefix will be included in this
+ * enumeration; note that this behaviour differs from that of
+ * {@link #getPrefix} and {@link #getPrefixes}.</p>
+ *
+ * @return An enumeration of all prefixes declared in this
+ * context.
+ * @see #getPrefixes
+ * @see #getURI
+ */
+ public Enumeration getDeclaredPrefixes ()
+ {
+ return currentContext.getDeclaredPrefixes();
+ }
+
+
+
+ ////////////////////////////////////////////////////////////////////
+ // Internal state.
+ ////////////////////////////////////////////////////////////////////
+
+ private Context contexts[];
+ private Context currentContext;
+ private int contextPos;
+
+
+
+ ////////////////////////////////////////////////////////////////////
+ // Internal classes.
+ ////////////////////////////////////////////////////////////////////
+
+ /**
+ * Internal class for a single Namespace context.
+ *
+ * <p>This module caches and reuses Namespace contexts,
+ * so the number allocated
+ * will be equal to the element depth of the document, not to the total
+ * number of elements (i.e. 5-10 rather than tens of thousands).
+ * Also, data structures used to represent contexts are shared when
+ * possible (child contexts without declarations) to further reduce
+ * the amount of memory that's consumed.
+ * </p>
+ */
+ final class Context {
+
+ /**
+ * Create the root-level Namespace context.
+ */
+ Context ()
+ {
+ copyTables();
+ }
+
+
+ /**
+ * (Re)set the parent of this Namespace context.
+ * The context must either have been freshly constructed,
+ * or must have been cleared.
+ *
+ * @param context The parent Namespace context object.
+ */
+ void setParent (Context parent)
+ {
+ this.parent = parent;
+ declarations = null;
+ prefixTable = parent.prefixTable;
+ uriTable = parent.uriTable;
+ elementNameTable = parent.elementNameTable;
+ attributeNameTable = parent.attributeNameTable;
+ defaultNS = parent.defaultNS;
+ declSeen = false;
+ declsOK = true;
+ }
+
+ /**
+ * Makes associated state become collectible,
+ * invalidating this context.
+ * {@link #setParent} must be called before
+ * this context may be used again.
+ */
+ void clear ()
+ {
+ parent = null;
+ prefixTable = null;
+ uriTable = null;
+ elementNameTable = null;
+ attributeNameTable = null;
+ defaultNS = null;
+ }
+
+
+ /**
+ * Declare a Namespace prefix for this context.
+ *
+ * @param prefix The prefix to declare.
+ * @param uri The associated Namespace URI.
+ * @see org.xml.sax.helpers.NamespaceSupport#declarePrefix
+ */
+ void declarePrefix (String prefix, String uri)
+ {
+ // Lazy processing...
+ if (!declsOK)
+ throw new IllegalStateException (
+ "can't declare any more prefixes in this context");
+ if (!declSeen) {
+ copyTables();
+ }
+ if (declarations == null) {
+ declarations = new Vector();
+ }
+
+ prefix = prefix.intern();
+ uri = uri.intern();
+ if ("".equals(prefix)) {
+ if ("".equals(uri)) {
+ defaultNS = null;
+ } else {
+ defaultNS = uri;
+ }
+ } else {
+ prefixTable.put(prefix, uri);
+ uriTable.put(uri, prefix); // may wipe out another prefix
+ }
+ declarations.addElement(prefix);
+ }
+
+
+ /**
+ * Process a raw XML 1.0 name in this context.
+ *
+ * @param qName The raw XML 1.0 name.
+ * @param isAttribute true if this is an attribute name.
+ * @return An array of three strings containing the
+ * URI part (or empty string), the local part,
+ * and the raw name, all internalized, or null
+ * if there is an undeclared prefix.
+ * @see org.xml.sax.helpers.NamespaceSupport#processName
+ */
+ String [] processName (String qName, boolean isAttribute)
+ {
+ String name[];
+ Hashtable table;
+
+ // detect errors in call sequence
+ declsOK = false;
+
+ // Select the appropriate table.
+ if (isAttribute) {
+ table = attributeNameTable;
+ } else {
+ table = elementNameTable;
+ }
+
+ // Start by looking in the cache, and
+ // return immediately if the name
+ // is already known in this content
+ name = (String[])table.get(qName);
+ if (name != null) {
+ return name;
+ }
+
+ // We haven't seen this name in this
+ // context before. Maybe in the parent
+ // context, but we can't assume prefix
+ // bindings are the same.
+ name = new String[3];
+ name[2] = qName.intern();
+ int index = qName.indexOf(':');
+
+
+ // No prefix.
+ if (index == -1) {
+ if (isAttribute || defaultNS == null) {
+ name[0] = "";
+ } else {
+ name[0] = defaultNS;
+ }
+ name[1] = name[2];
+ }
+
+ // Prefix
+ else {
+ String prefix = qName.substring(0, index);
+ String local = qName.substring(index+1);
+ String uri;
+ if ("".equals(prefix)) {
+ uri = defaultNS;
+ } else {
+ uri = (String)prefixTable.get(prefix);
+ }
+ if (uri == null) {
+ return null;
+ }
+ name[0] = uri;
+ name[1] = local.intern();
+ }
+
+ // Save in the cache for future use.
+ // (Could be shared with parent context...)
+ table.put(name[2], name);
+ return name;
+ }
+
+
+ /**
+ * Look up the URI associated with a prefix in this context.
+ *
+ * @param prefix The prefix to look up.
+ * @return The associated Namespace URI, or null if none is
+ * declared.
+ * @see org.xml.sax.helpers.NamespaceSupport#getURI
+ */
+ String getURI (String prefix)
+ {
+ if ("".equals(prefix)) {
+ return defaultNS;
+ } else if (prefixTable == null) {
+ return null;
+ } else {
+ return (String)prefixTable.get(prefix);
+ }
+ }
+
+
+ /**
+ * Look up one of the prefixes associated with a URI in this context.
+ *
+ * <p>Since many prefixes may be mapped to the same URI,
+ * the return value may be unreliable.</p>
+ *
+ * @param uri The URI to look up.
+ * @return The associated prefix, or null if none is declared.
+ * @see org.xml.sax.helpers.NamespaceSupport#getPrefix
+ */
+ String getPrefix (String uri)
+ {
+ if (uriTable == null) {
+ return null;
+ } else {
+ return (String)uriTable.get(uri);
+ }
+ }
+
+
+ /**
+ * Return an enumeration of prefixes declared in this context.
+ *
+ * @return An enumeration of prefixes (possibly empty).
+ * @see org.xml.sax.helpers.NamespaceSupport#getDeclaredPrefixes
+ */
+ Enumeration getDeclaredPrefixes ()
+ {
+ if (declarations == null) {
+ return EMPTY_ENUMERATION;
+ } else {
+ return declarations.elements();
+ }
+ }
+
+
+ /**
+ * Return an enumeration of all prefixes currently in force.
+ *
+ * <p>The default prefix, if in force, is <em>not</em>
+ * returned, and will have to be checked for separately.</p>
+ *
+ * @return An enumeration of prefixes (never empty).
+ * @see org.xml.sax.helpers.NamespaceSupport#getPrefixes
+ */
+ Enumeration getPrefixes ()
+ {
+ if (prefixTable == null) {
+ return EMPTY_ENUMERATION;
+ } else {
+ return prefixTable.keys();
+ }
+ }
+
+
+
+ ////////////////////////////////////////////////////////////////
+ // Internal methods.
+ ////////////////////////////////////////////////////////////////
+
+
+ /**
+ * Copy on write for the internal tables in this context.
+ *
+ * <p>This class is optimized for the normal case where most
+ * elements do not contain Namespace declarations.</p>
+ */
+ private void copyTables ()
+ {
+ if (prefixTable != null) {
+ prefixTable = (Hashtable)prefixTable.clone();
+ } else {
+ prefixTable = new Hashtable();
+ }
+ if (uriTable != null) {
+ uriTable = (Hashtable)uriTable.clone();
+ } else {
+ uriTable = new Hashtable();
+ }
+ elementNameTable = new Hashtable();
+ attributeNameTable = new Hashtable();
+ declSeen = true;
+ }
+
+
+
+ ////////////////////////////////////////////////////////////////
+ // Protected state.
+ ////////////////////////////////////////////////////////////////
+
+ Hashtable prefixTable;
+ Hashtable uriTable;
+ Hashtable elementNameTable;
+ Hashtable attributeNameTable;
+ String defaultNS = null;
+ boolean declsOK = true;
+
+
+
+ ////////////////////////////////////////////////////////////////
+ // Internal state.
+ ////////////////////////////////////////////////////////////////
+
+ private Vector declarations = null;
+ private boolean declSeen = false;
+ private Context parent = null;
+ }
+}
+
+// end of NamespaceSupport.java
diff --git a/external/jaxp/source/org/xml/sax/helpers/NewInstance.java b/external/jaxp/source/org/xml/sax/helpers/NewInstance.java
new file mode 100644
index 000000000..df3f9df01
--- /dev/null
+++ b/external/jaxp/source/org/xml/sax/helpers/NewInstance.java
@@ -0,0 +1,79 @@
+// NewInstance.java - create a new instance of a class by name.
+// http://www.saxproject.org
+// Written by Edwin Goei, edwingo@apache.org
+// and by David Brownell, dbrownell@users.sourceforge.net
+// NO WARRANTY! This class is in the Public Domain.
+// $Id: NewInstance.java,v 1.1 2003-02-01 02:10:46 cbj Exp $
+
+package org.xml.sax.helpers;
+
+import java.lang.reflect.Method;
+import java.lang.reflect.InvocationTargetException;
+
+/**
+ * Create a new instance of a class by name.
+ *
+ * <blockquote>
+ * <em>This module, both source code and documentation, is in the
+ * Public Domain, and comes with <strong>NO WARRANTY</strong>.</em>
+ * See <a href='http://www.saxproject.org'>http://www.saxproject.org</a>
+ * for further information.
+ * </blockquote>
+ *
+ * <p>This class contains a static method for creating an instance of a
+ * class from an explicit class name. It tries to use the thread's context
+ * ClassLoader if possible and falls back to using
+ * Class.forName(String).</p>
+ *
+ * <p>This code is designed to compile and run on JDK version 1.1 and later
+ * including versions of Java 2.</p>
+ *
+ * @author Edwin Goei, David Brownell
+ * @version 2.0.1 (sax2r2)
+ */
+class NewInstance {
+
+ /**
+ * Creates a new instance of the specified class name
+ *
+ * Package private so this code is not exposed at the API level.
+ */
+ static Object newInstance (ClassLoader classLoader, String className)
+ throws ClassNotFoundException, IllegalAccessException,
+ InstantiationException
+ {
+ Class driverClass;
+ if (classLoader == null) {
+ driverClass = Class.forName(className);
+ } else {
+ driverClass = classLoader.loadClass(className);
+ }
+ return driverClass.newInstance();
+ }
+
+ /**
+ * Figure out which ClassLoader to use. For JDK 1.2 and later use
+ * the context ClassLoader.
+ */
+ static ClassLoader getClassLoader ()
+ {
+ Method m = null;
+
+ try {
+ m = Thread.class.getMethod("getContextClassLoader", null);
+ } catch (NoSuchMethodException e) {
+ // Assume that we are running JDK 1.1, use the current ClassLoader
+ return NewInstance.class.getClassLoader();
+ }
+
+ try {
+ return (ClassLoader) m.invoke(Thread.currentThread(), null);
+ } catch (IllegalAccessException e) {
+ // assert(false)
+ throw new UnknownError(e.getMessage());
+ } catch (InvocationTargetException e) {
+ // assert(e.getTargetException() instanceof SecurityException)
+ throw new UnknownError(e.getMessage());
+ }
+ }
+}
diff --git a/external/jaxp/source/org/xml/sax/helpers/ParserAdapter.java b/external/jaxp/source/org/xml/sax/helpers/ParserAdapter.java
new file mode 100755
index 000000000..6f0c780da
--- /dev/null
+++ b/external/jaxp/source/org/xml/sax/helpers/ParserAdapter.java
@@ -0,0 +1,1025 @@
+// ParserAdapter.java - adapt a SAX1 Parser to a SAX2 XMLReader.
+// http://www.saxproject.org
+// Written by David Megginson
+// NO WARRANTY! This class is in the public domain.
+// $Id: ParserAdapter.java,v 1.1 2003-02-01 02:10:47 cbj Exp $
+
+package org.xml.sax.helpers;
+
+import java.io.IOException;
+import java.util.Enumeration;
+import java.util.Vector;
+
+import org.xml.sax.Parser; // deprecated
+import org.xml.sax.InputSource;
+import org.xml.sax.Locator;
+import org.xml.sax.AttributeList; // deprecated
+import org.xml.sax.EntityResolver;
+import org.xml.sax.DTDHandler;
+import org.xml.sax.DocumentHandler; // deprecated
+import org.xml.sax.ErrorHandler;
+import org.xml.sax.SAXException;
+import org.xml.sax.SAXParseException;
+
+import org.xml.sax.XMLReader;
+import org.xml.sax.Attributes;
+import org.xml.sax.ContentHandler;
+import org.xml.sax.SAXNotRecognizedException;
+import org.xml.sax.SAXNotSupportedException;
+
+
+/**
+ * Adapt a SAX1 Parser as a SAX2 XMLReader.
+ *
+ * <blockquote>
+ * <em>This module, both source code and documentation, is in the
+ * Public Domain, and comes with <strong>NO WARRANTY</strong>.</em>
+ * See <a href='http://www.saxproject.org'>http://www.saxproject.org</a>
+ * for further information.
+ * </blockquote>
+ *
+ * <p>This class wraps a SAX1 {@link org.xml.sax.Parser Parser}
+ * and makes it act as a SAX2 {@link org.xml.sax.XMLReader XMLReader},
+ * with feature, property, and Namespace support. Note
+ * that it is not possible to report {@link org.xml.sax.ContentHandler#skippedEntity
+ * skippedEntity} events, since SAX1 does not make that information available.</p>
+ *
+ * <p>This adapter does not test for duplicate Namespace-qualified
+ * attribute names.</p>
+ *
+ * @since SAX 2.0
+ * @author David Megginson
+ * @version 2.0.1 (sax2r2)
+ * @see org.xml.sax.helpers.XMLReaderAdapter
+ * @see org.xml.sax.XMLReader
+ * @see org.xml.sax.Parser
+ */
+public class ParserAdapter implements XMLReader, DocumentHandler
+{
+
+
+ ////////////////////////////////////////////////////////////////////
+ // Constructors.
+ ////////////////////////////////////////////////////////////////////
+
+
+ /**
+ * Construct a new parser adapter.
+ *
+ * <p>Use the "org.xml.sax.parser" property to locate the
+ * embedded SAX1 driver.</p>
+ *
+ * @exception SAXException If the embedded driver
+ * cannot be instantiated or if the
+ * org.xml.sax.parser property is not specified.
+ */
+ public ParserAdapter ()
+ throws SAXException
+ {
+ super();
+
+ String driver = System.getProperty("org.xml.sax.parser");
+
+ try {
+ setup(ParserFactory.makeParser());
+ } catch (ClassNotFoundException e1) {
+ throw new
+ SAXException("Cannot find SAX1 driver class " +
+ driver, e1);
+ } catch (IllegalAccessException e2) {
+ throw new
+ SAXException("SAX1 driver class " +
+ driver +
+ " found but cannot be loaded", e2);
+ } catch (InstantiationException e3) {
+ throw new
+ SAXException("SAX1 driver class " +
+ driver +
+ " loaded but cannot be instantiated", e3);
+ } catch (ClassCastException e4) {
+ throw new
+ SAXException("SAX1 driver class " +
+ driver +
+ " does not implement org.xml.sax.Parser");
+ } catch (NullPointerException e5) {
+ throw new
+ SAXException("System property org.xml.sax.parser not specified");
+ }
+ }
+
+
+ /**
+ * Construct a new parser adapter.
+ *
+ * <p>Note that the embedded parser cannot be changed once the
+ * adapter is created; to embed a different parser, allocate
+ * a new ParserAdapter.</p>
+ *
+ * @param parser The SAX1 parser to embed.
+ * @exception java.lang.NullPointerException If the parser parameter
+ * is null.
+ */
+ public ParserAdapter (Parser parser)
+ {
+ super();
+ setup(parser);
+ }
+
+
+ /**
+ * Internal setup method.
+ *
+ * @param parser The embedded parser.
+ * @exception java.lang.NullPointerException If the parser parameter
+ * is null.
+ */
+ private void setup (Parser parser)
+ {
+ if (parser == null) {
+ throw new
+ NullPointerException("Parser argument must not be null");
+ }
+ this.parser = parser;
+ atts = new AttributesImpl();
+ nsSupport = new NamespaceSupport();
+ attAdapter = new AttributeListAdapter();
+ }
+
+
+
+ ////////////////////////////////////////////////////////////////////
+ // Implementation of org.xml.sax.XMLReader.
+ ////////////////////////////////////////////////////////////////////
+
+
+ //
+ // Internal constants for the sake of convenience.
+ //
+ private final static String FEATURES = "http://xml.org/sax/features/";
+ private final static String NAMESPACES = FEATURES + "namespaces";
+ private final static String NAMESPACE_PREFIXES = FEATURES + "namespace-prefixes";
+
+
+ /**
+ * Set a feature flag for the parser.
+ *
+ * <p>The only features recognized are namespaces and
+ * namespace-prefixes.</p>
+ *
+ * @param name The feature name, as a complete URI.
+ * @param value The requested feature value.
+ * @exception SAXNotRecognizedException If the feature
+ * can't be assigned or retrieved.
+ * @exception SAXNotSupportedException If the feature
+ * can't be assigned that value.
+ * @see org.xml.sax.XMLReader#setFeature
+ */
+ public void setFeature (String name, boolean value)
+ throws SAXNotRecognizedException, SAXNotSupportedException
+ {
+ if (name.equals(NAMESPACES)) {
+ checkNotParsing("feature", name);
+ namespaces = value;
+ if (!namespaces && !prefixes) {
+ prefixes = true;
+ }
+ } else if (name.equals(NAMESPACE_PREFIXES)) {
+ checkNotParsing("feature", name);
+ prefixes = value;
+ if (!prefixes && !namespaces) {
+ namespaces = true;
+ }
+ } else {
+ throw new SAXNotRecognizedException("Feature: " + name);
+ }
+ }
+
+
+ /**
+ * Check a parser feature flag.
+ *
+ * <p>The only features recognized are namespaces and
+ * namespace-prefixes.</p>
+ *
+ * @param name The feature name, as a complete URI.
+ * @return The current feature value.
+ * @exception SAXNotRecognizedException If the feature
+ * value can't be assigned or retrieved.
+ * @exception SAXNotSupportedException If the
+ * feature is not currently readable.
+ * @see org.xml.sax.XMLReader#setFeature
+ */
+ public boolean getFeature (String name)
+ throws SAXNotRecognizedException, SAXNotSupportedException
+ {
+ if (name.equals(NAMESPACES)) {
+ return namespaces;
+ } else if (name.equals(NAMESPACE_PREFIXES)) {
+ return prefixes;
+ } else {
+ throw new SAXNotRecognizedException("Feature: " + name);
+ }
+ }
+
+
+ /**
+ * Set a parser property.
+ *
+ * <p>No properties are currently recognized.</p>
+ *
+ * @param name The property name.
+ * @param value The property value.
+ * @exception SAXNotRecognizedException If the property
+ * value can't be assigned or retrieved.
+ * @exception SAXNotSupportedException If the property
+ * can't be assigned that value.
+ * @see org.xml.sax.XMLReader#setProperty
+ */
+ public void setProperty (String name, Object value)
+ throws SAXNotRecognizedException, SAXNotSupportedException
+ {
+ throw new SAXNotRecognizedException("Property: " + name);
+ }
+
+
+ /**
+ * Get a parser property.
+ *
+ * <p>No properties are currently recognized.</p>
+ *
+ * @param name The property name.
+ * @return The property value.
+ * @exception SAXNotRecognizedException If the property
+ * value can't be assigned or retrieved.
+ * @exception SAXNotSupportedException If the property
+ * value is not currently readable.
+ * @see org.xml.sax.XMLReader#getProperty
+ */
+ public Object getProperty (String name)
+ throws SAXNotRecognizedException, SAXNotSupportedException
+ {
+ throw new SAXNotRecognizedException("Property: " + name);
+ }
+
+
+ /**
+ * Set the entity resolver.
+ *
+ * @param resolver The new entity resolver.
+ * @see org.xml.sax.XMLReader#setEntityResolver
+ */
+ public void setEntityResolver (EntityResolver resolver)
+ {
+ entityResolver = resolver;
+ }
+
+
+ /**
+ * Return the current entity resolver.
+ *
+ * @return The current entity resolver, or null if none was supplied.
+ * @see org.xml.sax.XMLReader#getEntityResolver
+ */
+ public EntityResolver getEntityResolver ()
+ {
+ return entityResolver;
+ }
+
+
+ /**
+ * Set the DTD handler.
+ *
+ * @param resolver The new DTD handler.
+ * @see org.xml.sax.XMLReader#setEntityResolver
+ */
+ public void setDTDHandler (DTDHandler handler)
+ {
+ dtdHandler = handler;
+ }
+
+
+ /**
+ * Return the current DTD handler.
+ *
+ * @return The current DTD handler, or null if none was supplied.
+ * @see org.xml.sax.XMLReader#getEntityResolver
+ */
+ public DTDHandler getDTDHandler ()
+ {
+ return dtdHandler;
+ }
+
+
+ /**
+ * Set the content handler.
+ *
+ * @param resolver The new content handler.
+ * @see org.xml.sax.XMLReader#setEntityResolver
+ */
+ public void setContentHandler (ContentHandler handler)
+ {
+ contentHandler = handler;
+ }
+
+
+ /**
+ * Return the current content handler.
+ *
+ * @return The current content handler, or null if none was supplied.
+ * @see org.xml.sax.XMLReader#getEntityResolver
+ */
+ public ContentHandler getContentHandler ()
+ {
+ return contentHandler;
+ }
+
+
+ /**
+ * Set the error handler.
+ *
+ * @param resolver The new error handler.
+ * @see org.xml.sax.XMLReader#setEntityResolver
+ */
+ public void setErrorHandler (ErrorHandler handler)
+ {
+ errorHandler = handler;
+ }
+
+
+ /**
+ * Return the current error handler.
+ *
+ * @return The current error handler, or null if none was supplied.
+ * @see org.xml.sax.XMLReader#getEntityResolver
+ */
+ public ErrorHandler getErrorHandler ()
+ {
+ return errorHandler;
+ }
+
+
+ /**
+ * Parse an XML document.
+ *
+ * @param systemId The absolute URL of the document.
+ * @exception java.io.IOException If there is a problem reading
+ * the raw content of the document.
+ * @exception SAXException If there is a problem
+ * processing the document.
+ * @see #parse(org.xml.sax.InputSource)
+ * @see org.xml.sax.Parser#parse(java.lang.String)
+ */
+ public void parse (String systemId)
+ throws IOException, SAXException
+ {
+ parse(new InputSource(systemId));
+ }
+
+
+ /**
+ * Parse an XML document.
+ *
+ * @param input An input source for the document.
+ * @exception java.io.IOException If there is a problem reading
+ * the raw content of the document.
+ * @exception SAXException If there is a problem
+ * processing the document.
+ * @see #parse(java.lang.String)
+ * @see org.xml.sax.Parser#parse(org.xml.sax.InputSource)
+ */
+ public void parse (InputSource input)
+ throws IOException, SAXException
+ {
+ if (parsing) {
+ throw new SAXException("Parser is already in use");
+ }
+ setupParser();
+ parsing = true;
+ try {
+ parser.parse(input);
+ } finally {
+ parsing = false;
+ }
+ parsing = false;
+ }
+
+
+
+ ////////////////////////////////////////////////////////////////////
+ // Implementation of org.xml.sax.DocumentHandler.
+ ////////////////////////////////////////////////////////////////////
+
+
+ /**
+ * Adapter implementation method; do not call.
+ * Adapt a SAX1 document locator event.
+ *
+ * @param locator A document locator.
+ * @see org.xml.sax.ContentHandler#setDocumentLocator
+ */
+ public void setDocumentLocator (Locator locator)
+ {
+ this.locator = locator;
+ if (contentHandler != null) {
+ contentHandler.setDocumentLocator(locator);
+ }
+ }
+
+
+ /**
+ * Adapter implementation method; do not call.
+ * Adapt a SAX1 start document event.
+ *
+ * @exception SAXException The client may raise a
+ * processing exception.
+ * @see org.xml.sax.DocumentHandler#startDocument
+ */
+ public void startDocument ()
+ throws SAXException
+ {
+ if (contentHandler != null) {
+ contentHandler.startDocument();
+ }
+ }
+
+
+ /**
+ * Adapter implementation method; do not call.
+ * Adapt a SAX1 end document event.
+ *
+ * @exception SAXException The client may raise a
+ * processing exception.
+ * @see org.xml.sax.DocumentHandler#endDocument
+ */
+ public void endDocument ()
+ throws SAXException
+ {
+ if (contentHandler != null) {
+ contentHandler.endDocument();
+ }
+ }
+
+
+ /**
+ * Adapter implementation method; do not call.
+ * Adapt a SAX1 startElement event.
+ *
+ * <p>If necessary, perform Namespace processing.</p>
+ *
+ * @param qName The qualified (prefixed) name.
+ * @param qAtts The XML 1.0 attribute list (with qnames).
+ * @exception SAXException The client may raise a
+ * processing exception.
+ */
+ public void startElement (String qName, AttributeList qAtts)
+ throws SAXException
+ {
+ // These are exceptions from the
+ // first pass; they should be
+ // ignored if there's a second pass,
+ // but reported otherwise.
+ Vector exceptions = null;
+
+ // If we're not doing Namespace
+ // processing, dispatch this quickly.
+ if (!namespaces) {
+ if (contentHandler != null) {
+ attAdapter.setAttributeList(qAtts);
+ contentHandler.startElement("", "", qName.intern(),
+ attAdapter);
+ }
+ return;
+ }
+
+
+ // OK, we're doing Namespace processing.
+ nsSupport.pushContext();
+ int length = qAtts.getLength();
+
+ // First pass: handle NS decls
+ for (int i = 0; i < length; i++) {
+ String attQName = qAtts.getName(i);
+
+ if (!attQName.startsWith("xmlns"))
+ continue;
+ // Could be a declaration...
+ String prefix;
+ int n = attQName.indexOf(':');
+
+ // xmlns=...
+ if (n == -1 && attQName.length () == 5) {
+ prefix = "";
+ } else if (n != 5) {
+ // XML namespaces spec doesn't discuss "xmlnsf:oo"
+ // (and similarly named) attributes ... at most, warn
+ continue;
+ } else // xmlns:foo=...
+ prefix = attQName.substring(n+1);
+
+ String value = qAtts.getValue(i);
+ if (!nsSupport.declarePrefix(prefix, value)) {
+ reportError("Illegal Namespace prefix: " + prefix);
+ continue;
+ }
+ if (contentHandler != null)
+ contentHandler.startPrefixMapping(prefix, value);
+ }
+
+ // Second pass: copy all relevant
+ // attributes into the SAX2 AttributeList
+ // using updated prefix bindings
+ atts.clear();
+ for (int i = 0; i < length; i++) {
+ String attQName = qAtts.getName(i);
+ String type = qAtts.getType(i);
+ String value = qAtts.getValue(i);
+
+ // Declaration?
+ if (attQName.startsWith("xmlns")) {
+ String prefix;
+ int n = attQName.indexOf(':');
+
+ if (n == -1 && attQName.length () == 5) {
+ prefix = "";
+ } else if (n != 5) {
+ // XML namespaces spec doesn't discuss "xmlnsf:oo"
+ // (and similarly named) attributes ... ignore
+ prefix = null;
+ } else {
+ prefix = attQName.substring(n+1);
+ }
+ // Yes, decl: report or prune
+ if (prefix != null) {
+ if (prefixes)
+ atts.addAttribute("", "", attQName.intern(),
+ type, value);
+ continue;
+ }
+ }
+
+ // Not a declaration -- report
+ try {
+ String attName[] = processName(attQName, true, true);
+ atts.addAttribute(attName[0], attName[1], attName[2],
+ type, value);
+ } catch (SAXException e) {
+ if (exceptions == null)
+ exceptions = new Vector();
+ exceptions.addElement(e);
+ atts.addAttribute("", attQName, attQName, type, value);
+ }
+ }
+
+ // now handle the deferred exception reports
+ if (exceptions != null && errorHandler != null) {
+ for (int i = 0; i < exceptions.size(); i++)
+ errorHandler.error((SAXParseException)
+ (exceptions.elementAt(i)));
+ }
+
+ // OK, finally report the event.
+ if (contentHandler != null) {
+ String name[] = processName(qName, false, false);
+ contentHandler.startElement(name[0], name[1], name[2], atts);
+ }
+ }
+
+
+ /**
+ * Adapter implementation method; do not call.
+ * Adapt a SAX1 end element event.
+ *
+ * @param qName The qualified (prefixed) name.
+ * @exception SAXException The client may raise a
+ * processing exception.
+ * @see org.xml.sax.DocumentHandler#endElement
+ */
+ public void endElement (String qName)
+ throws SAXException
+ {
+ // If we're not doing Namespace
+ // processing, dispatch this quickly.
+ if (!namespaces) {
+ if (contentHandler != null) {
+ contentHandler.endElement("", "", qName.intern());
+ }
+ return;
+ }
+
+ // Split the name.
+ String names[] = processName(qName, false, false);
+ if (contentHandler != null) {
+ contentHandler.endElement(names[0], names[1], names[2]);
+ Enumeration prefixes = nsSupport.getDeclaredPrefixes();
+ while (prefixes.hasMoreElements()) {
+ String prefix = (String)prefixes.nextElement();
+ contentHandler.endPrefixMapping(prefix);
+ }
+ }
+ nsSupport.popContext();
+ }
+
+
+ /**
+ * Adapter implementation method; do not call.
+ * Adapt a SAX1 characters event.
+ *
+ * @param ch An array of characters.
+ * @param start The starting position in the array.
+ * @param length The number of characters to use.
+ * @exception SAXException The client may raise a
+ * processing exception.
+ * @see org.xml.sax.DocumentHandler#characters
+ */
+ public void characters (char ch[], int start, int length)
+ throws SAXException
+ {
+ if (contentHandler != null) {
+ contentHandler.characters(ch, start, length);
+ }
+ }
+
+
+ /**
+ * Adapter implementation method; do not call.
+ * Adapt a SAX1 ignorable whitespace event.
+ *
+ * @param ch An array of characters.
+ * @param start The starting position in the array.
+ * @param length The number of characters to use.
+ * @exception SAXException The client may raise a
+ * processing exception.
+ * @see org.xml.sax.DocumentHandler#ignorableWhitespace
+ */
+ public void ignorableWhitespace (char ch[], int start, int length)
+ throws SAXException
+ {
+ if (contentHandler != null) {
+ contentHandler.ignorableWhitespace(ch, start, length);
+ }
+ }
+
+
+ /**
+ * Adapter implementation method; do not call.
+ * Adapt a SAX1 processing instruction event.
+ *
+ * @param target The processing instruction target.
+ * @param data The remainder of the processing instruction
+ * @exception SAXException The client may raise a
+ * processing exception.
+ * @see org.xml.sax.DocumentHandler#processingInstruction
+ */
+ public void processingInstruction (String target, String data)
+ throws SAXException
+ {
+ if (contentHandler != null) {
+ contentHandler.processingInstruction(target, data);
+ }
+ }
+
+
+
+ ////////////////////////////////////////////////////////////////////
+ // Internal utility methods.
+ ////////////////////////////////////////////////////////////////////
+
+
+ /**
+ * Initialize the parser before each run.
+ */
+ private void setupParser ()
+ {
+ nsSupport.reset();
+
+ if (entityResolver != null) {
+ parser.setEntityResolver(entityResolver);
+ }
+ if (dtdHandler != null) {
+ parser.setDTDHandler(dtdHandler);
+ }
+ if (errorHandler != null) {
+ parser.setErrorHandler(errorHandler);
+ }
+ parser.setDocumentHandler(this);
+ locator = null;
+ }
+
+
+ /**
+ * Process a qualified (prefixed) name.
+ *
+ * <p>If the name has an undeclared prefix, use only the qname
+ * and make an ErrorHandler.error callback in case the app is
+ * interested.</p>
+ *
+ * @param qName The qualified (prefixed) name.
+ * @param isAttribute true if this is an attribute name.
+ * @return The name split into three parts.
+ * @exception SAXException The client may throw
+ * an exception if there is an error callback.
+ */
+ private String [] processName (String qName, boolean isAttribute,
+ boolean useException)
+ throws SAXException
+ {
+ String parts[] = nsSupport.processName(qName, nameParts,
+ isAttribute);
+ if (parts == null) {
+ if (useException)
+ throw makeException("Undeclared prefix: " + qName);
+ reportError("Undeclared prefix: " + qName);
+ parts = new String[3];
+ parts[0] = parts[1] = "";
+ parts[2] = qName.intern();
+ }
+ return parts;
+ }
+
+
+ /**
+ * Report a non-fatal error.
+ *
+ * @param message The error message.
+ * @exception SAXException The client may throw
+ * an exception.
+ */
+ void reportError (String message)
+ throws SAXException
+ {
+ if (errorHandler != null)
+ errorHandler.error(makeException(message));
+ }
+
+
+ /**
+ * Construct an exception for the current context.
+ *
+ * @param message The error message.
+ */
+ private SAXParseException makeException (String message)
+ {
+ if (locator != null) {
+ return new SAXParseException(message, locator);
+ } else {
+ return new SAXParseException(message, null, null, -1, -1);
+ }
+ }
+
+
+ /**
+ * Throw an exception if we are parsing.
+ *
+ * <p>Use this method to detect illegal feature or
+ * property changes.</p>
+ *
+ * @param type The type of thing (feature or property).
+ * @param name The feature or property name.
+ * @exception SAXNotSupportedException If a
+ * document is currently being parsed.
+ */
+ private void checkNotParsing (String type, String name)
+ throws SAXNotSupportedException
+ {
+ if (parsing) {
+ throw new SAXNotSupportedException("Cannot change " +
+ type + ' ' +
+ name + " while parsing");
+
+ }
+ }
+
+
+
+ ////////////////////////////////////////////////////////////////////
+ // Internal state.
+ ////////////////////////////////////////////////////////////////////
+
+ private NamespaceSupport nsSupport;
+ private AttributeListAdapter attAdapter;
+
+ private boolean parsing = false;
+ private String nameParts[] = new String[3];
+
+ private Parser parser = null;
+
+ private AttributesImpl atts = null;
+
+ // Features
+ private boolean namespaces = true;
+ private boolean prefixes = false;
+
+ // Properties
+
+ // Handlers
+ Locator locator;
+
+ EntityResolver entityResolver = null;
+ DTDHandler dtdHandler = null;
+ ContentHandler contentHandler = null;
+ ErrorHandler errorHandler = null;
+
+
+
+ ////////////////////////////////////////////////////////////////////
+ // Inner class to wrap an AttributeList when not doing NS proc.
+ ////////////////////////////////////////////////////////////////////
+
+
+ /**
+ * Adapt a SAX1 AttributeList as a SAX2 Attributes object.
+ *
+ * <p>This class is in the Public Domain, and comes with NO
+ * WARRANTY of any kind.</p>
+ *
+ * <p>This wrapper class is used only when Namespace support
+ * is disabled -- it provides pretty much a direct mapping
+ * from SAX1 to SAX2, except that names and types are
+ * interned whenever requested.</p>
+ */
+ final class AttributeListAdapter implements Attributes
+ {
+
+ /**
+ * Construct a new adapter.
+ */
+ AttributeListAdapter ()
+ {
+ }
+
+
+ /**
+ * Set the embedded AttributeList.
+ *
+ * <p>This method must be invoked before any of the others
+ * can be used.</p>
+ *
+ * @param The SAX1 attribute list (with qnames).
+ */
+ void setAttributeList (AttributeList qAtts)
+ {
+ this.qAtts = qAtts;
+ }
+
+
+ /**
+ * Return the length of the attribute list.
+ *
+ * @return The number of attributes in the list.
+ * @see org.xml.sax.Attributes#getLength
+ */
+ public int getLength ()
+ {
+ return qAtts.getLength();
+ }
+
+
+ /**
+ * Return the Namespace URI of the specified attribute.
+ *
+ * @param The attribute's index.
+ * @return Always the empty string.
+ * @see org.xml.sax.Attributes#getURI
+ */
+ public String getURI (int i)
+ {
+ return "";
+ }
+
+
+ /**
+ * Return the local name of the specified attribute.
+ *
+ * @param The attribute's index.
+ * @return Always the empty string.
+ * @see org.xml.sax.Attributes#getLocalName
+ */
+ public String getLocalName (int i)
+ {
+ return "";
+ }
+
+
+ /**
+ * Return the qualified (prefixed) name of the specified attribute.
+ *
+ * @param The attribute's index.
+ * @return The attribute's qualified name, internalized.
+ */
+ public String getQName (int i)
+ {
+ return qAtts.getName(i).intern();
+ }
+
+
+ /**
+ * Return the type of the specified attribute.
+ *
+ * @param The attribute's index.
+ * @return The attribute's type as an internalized string.
+ */
+ public String getType (int i)
+ {
+ return qAtts.getType(i).intern();
+ }
+
+
+ /**
+ * Return the value of the specified attribute.
+ *
+ * @param The attribute's index.
+ * @return The attribute's value.
+ */
+ public String getValue (int i)
+ {
+ return qAtts.getValue(i);
+ }
+
+
+ /**
+ * Look up an attribute index by Namespace name.
+ *
+ * @param uri The Namespace URI or the empty string.
+ * @param localName The local name.
+ * @return The attributes index, or -1 if none was found.
+ * @see org.xml.sax.Attributes#getIndex(java.lang.String,java.lang.String)
+ */
+ public int getIndex (String uri, String localName)
+ {
+ return -1;
+ }
+
+
+ /**
+ * Look up an attribute index by qualified (prefixed) name.
+ *
+ * @param qName The qualified name.
+ * @return The attributes index, or -1 if none was found.
+ * @see org.xml.sax.Attributes#getIndex(java.lang.String)
+ */
+ public int getIndex (String qName)
+ {
+ int max = atts.getLength();
+ for (int i = 0; i < max; i++) {
+ if (qAtts.getName(i).equals(qName)) {
+ return i;
+ }
+ }
+ return -1;
+ }
+
+
+ /**
+ * Look up the type of an attribute by Namespace name.
+ *
+ * @param uri The Namespace URI
+ * @param localName The local name.
+ * @return The attribute's type as an internalized string.
+ */
+ public String getType (String uri, String localName)
+ {
+ return null;
+ }
+
+
+ /**
+ * Look up the type of an attribute by qualified (prefixed) name.
+ *
+ * @param qName The qualified name.
+ * @return The attribute's type as an internalized string.
+ */
+ public String getType (String qName)
+ {
+ return qAtts.getType(qName).intern();
+ }
+
+
+ /**
+ * Look up the value of an attribute by Namespace name.
+ *
+ * @param uri The Namespace URI
+ * @param localName The local name.
+ * @return The attribute's value.
+ */
+ public String getValue (String uri, String localName)
+ {
+ return null;
+ }
+
+
+ /**
+ * Look up the value of an attribute by qualified (prefixed) name.
+ *
+ * @param qName The qualified name.
+ * @return The attribute's value.
+ */
+ public String getValue (String qName)
+ {
+ return qAtts.getValue(qName);
+ }
+
+ private AttributeList qAtts;
+ }
+}
+
+// end of ParserAdapter.java
diff --git a/external/jaxp/source/org/xml/sax/helpers/ParserFactory.java b/external/jaxp/source/org/xml/sax/helpers/ParserFactory.java
new file mode 100755
index 000000000..fc978536d
--- /dev/null
+++ b/external/jaxp/source/org/xml/sax/helpers/ParserFactory.java
@@ -0,0 +1,129 @@
+// SAX parser factory.
+// http://www.saxproject.org
+// No warranty; no copyright -- use this as you will.
+// $Id: ParserFactory.java,v 1.1 2003-02-01 02:10:47 cbj Exp $
+
+package org.xml.sax.helpers;
+
+import java.lang.ClassNotFoundException;
+import java.lang.IllegalAccessException;
+import java.lang.InstantiationException;
+import java.lang.SecurityException;
+import java.lang.ClassCastException;
+
+import org.xml.sax.Parser;
+
+
+/**
+ * Java-specific class for dynamically loading SAX parsers.
+ *
+ * <blockquote>
+ * <em>This module, both source code and documentation, is in the
+ * Public Domain, and comes with <strong>NO WARRANTY</strong>.</em>
+ * See <a href='http://www.saxproject.org'>http://www.saxproject.org</a>
+ * for further information.
+ * </blockquote>
+ *
+ * <p><strong>Note:</strong> This class is designed to work with the now-deprecated
+ * SAX1 {@link org.xml.sax.Parser Parser} class. SAX2 applications should use
+ * {@link org.xml.sax.helpers.XMLReaderFactory XMLReaderFactory} instead.</p>
+ *
+ * <p>ParserFactory is not part of the platform-independent definition
+ * of SAX; it is an additional convenience class designed
+ * specifically for Java XML application writers. SAX applications
+ * can use the static methods in this class to allocate a SAX parser
+ * dynamically at run-time based either on the value of the
+ * `org.xml.sax.parser' system property or on a string containing the class
+ * name.</p>
+ *
+ * <p>Note that the application still requires an XML parser that
+ * implements SAX1.</p>
+ *
+ * @deprecated This class works with the deprecated
+ * {@link org.xml.sax.Parser Parser}
+ * interface.
+ * @since SAX 1.0
+ * @author David Megginson
+ * @version 2.0.1 (sax2r2)
+ */
+public class ParserFactory {
+
+
+ /**
+ * Private null constructor.
+ */
+ private ParserFactory ()
+ {
+ }
+
+
+ /**
+ * Create a new SAX parser using the `org.xml.sax.parser' system property.
+ *
+ * <p>The named class must exist and must implement the
+ * {@link org.xml.sax.Parser Parser} interface.</p>
+ *
+ * @exception java.lang.NullPointerException There is no value
+ * for the `org.xml.sax.parser' system property.
+ * @exception java.lang.ClassNotFoundException The SAX parser
+ * class was not found (check your CLASSPATH).
+ * @exception IllegalAccessException The SAX parser class was
+ * found, but you do not have permission to load
+ * it.
+ * @exception InstantiationException The SAX parser class was
+ * found but could not be instantiated.
+ * @exception java.lang.ClassCastException The SAX parser class
+ * was found and instantiated, but does not implement
+ * org.xml.sax.Parser.
+ * @see #makeParser(java.lang.String)
+ * @see org.xml.sax.Parser
+ */
+ public static Parser makeParser ()
+ throws ClassNotFoundException,
+ IllegalAccessException,
+ InstantiationException,
+ NullPointerException,
+ ClassCastException
+ {
+ String className = System.getProperty("org.xml.sax.parser");
+ if (className == null) {
+ throw new NullPointerException("No value for sax.parser property");
+ } else {
+ return makeParser(className);
+ }
+ }
+
+
+ /**
+ * Create a new SAX parser object using the class name provided.
+ *
+ * <p>The named class must exist and must implement the
+ * {@link org.xml.sax.Parser Parser} interface.</p>
+ *
+ * @param className A string containing the name of the
+ * SAX parser class.
+ * @exception java.lang.ClassNotFoundException The SAX parser
+ * class was not found (check your CLASSPATH).
+ * @exception IllegalAccessException The SAX parser class was
+ * found, but you do not have permission to load
+ * it.
+ * @exception InstantiationException The SAX parser class was
+ * found but could not be instantiated.
+ * @exception java.lang.ClassCastException The SAX parser class
+ * was found and instantiated, but does not implement
+ * org.xml.sax.Parser.
+ * @see #makeParser()
+ * @see org.xml.sax.Parser
+ */
+ public static Parser makeParser (String className)
+ throws ClassNotFoundException,
+ IllegalAccessException,
+ InstantiationException,
+ ClassCastException
+ {
+ return (Parser) NewInstance.newInstance (
+ NewInstance.getClassLoader (), className);
+ }
+
+}
+
diff --git a/external/jaxp/source/org/xml/sax/helpers/XMLFilterImpl.java b/external/jaxp/source/org/xml/sax/helpers/XMLFilterImpl.java
new file mode 100755
index 000000000..f632551e5
--- /dev/null
+++ b/external/jaxp/source/org/xml/sax/helpers/XMLFilterImpl.java
@@ -0,0 +1,713 @@
+// XMLFilterImpl.java - base SAX2 filter implementation.
+// http://www.saxproject.org
+// Written by David Megginson
+// NO WARRANTY! This class is in the Public Domain.
+// $Id: XMLFilterImpl.java,v 1.1 2003-02-01 02:10:47 cbj Exp $
+
+package org.xml.sax.helpers;
+
+import java.io.IOException;
+
+import org.xml.sax.XMLReader;
+import org.xml.sax.XMLFilter;
+import org.xml.sax.InputSource;
+import org.xml.sax.Locator;
+import org.xml.sax.Attributes;
+import org.xml.sax.EntityResolver;
+import org.xml.sax.DTDHandler;
+import org.xml.sax.ContentHandler;
+import org.xml.sax.ErrorHandler;
+import org.xml.sax.SAXException;
+import org.xml.sax.SAXParseException;
+import org.xml.sax.SAXNotSupportedException;
+import org.xml.sax.SAXNotRecognizedException;
+
+
+/**
+ * Base class for deriving an XML filter.
+ *
+ * <blockquote>
+ * <em>This module, both source code and documentation, is in the
+ * Public Domain, and comes with <strong>NO WARRANTY</strong>.</em>
+ * See <a href='http://www.saxproject.org'>http://www.saxproject.org</a>
+ * for further information.
+ * </blockquote>
+ *
+ * <p>This class is designed to sit between an {@link org.xml.sax.XMLReader
+ * XMLReader} and the client application's event handlers. By default, it
+ * does nothing but pass requests up to the reader and events
+ * on to the handlers unmodified, but subclasses can override
+ * specific methods to modify the event stream or the configuration
+ * requests as they pass through.</p>
+ *
+ * @since SAX 2.0
+ * @author David Megginson
+ * @version 2.0.1 (sax2r2)
+ * @see org.xml.sax.XMLFilter
+ * @see org.xml.sax.XMLReader
+ * @see org.xml.sax.EntityResolver
+ * @see org.xml.sax.DTDHandler
+ * @see org.xml.sax.ContentHandler
+ * @see org.xml.sax.ErrorHandler
+ */
+public class XMLFilterImpl
+ implements XMLFilter, EntityResolver, DTDHandler, ContentHandler, ErrorHandler
+{
+
+
+ ////////////////////////////////////////////////////////////////////
+ // Constructors.
+ ////////////////////////////////////////////////////////////////////
+
+
+ /**
+ * Construct an empty XML filter, with no parent.
+ *
+ * <p>This filter will have no parent: you must assign a parent
+ * before you start a parse or do any configuration with
+ * setFeature or setProperty, unless you use this as a pure event
+ * consumer rather than as an {@link XMLReader}.</p>
+ *
+ * @see org.xml.sax.XMLReader#setFeature
+ * @see org.xml.sax.XMLReader#setProperty
+ * @see #setParent
+ */
+ public XMLFilterImpl ()
+ {
+ super();
+ }
+
+
+ /**
+ * Construct an XML filter with the specified parent.
+ *
+ * @see #setParent
+ * @see #getParent
+ */
+ public XMLFilterImpl (XMLReader parent)
+ {
+ super();
+ setParent(parent);
+ }
+
+
+
+ ////////////////////////////////////////////////////////////////////
+ // Implementation of org.xml.sax.XMLFilter.
+ ////////////////////////////////////////////////////////////////////
+
+
+ /**
+ * Set the parent reader.
+ *
+ * <p>This is the {@link org.xml.sax.XMLReader XMLReader} from which
+ * this filter will obtain its events and to which it will pass its
+ * configuration requests. The parent may itself be another filter.</p>
+ *
+ * <p>If there is no parent reader set, any attempt to parse
+ * or to set or get a feature or property will fail.</p>
+ *
+ * @param parent The parent XML reader.
+ * @see #getParent
+ */
+ public void setParent (XMLReader parent)
+ {
+ this.parent = parent;
+ }
+
+
+ /**
+ * Get the parent reader.
+ *
+ * @return The parent XML reader, or null if none is set.
+ * @see #setParent
+ */
+ public XMLReader getParent ()
+ {
+ return parent;
+ }
+
+
+
+ ////////////////////////////////////////////////////////////////////
+ // Implementation of org.xml.sax.XMLReader.
+ ////////////////////////////////////////////////////////////////////
+
+
+ /**
+ * Set the value of a feature.
+ *
+ * <p>This will always fail if the parent is null.</p>
+ *
+ * @param name The feature name.
+ * @param value The requested feature value.
+ * @exception org.xml.sax.SAXNotRecognizedException If the feature
+ * value can't be assigned or retrieved from the parent.
+ * @exception org.xml.sax.SAXNotSupportedException When the
+ * parent recognizes the feature name but
+ * cannot set the requested value.
+ */
+ public void setFeature (String name, boolean value)
+ throws SAXNotRecognizedException, SAXNotSupportedException
+ {
+ if (parent != null) {
+ parent.setFeature(name, value);
+ } else {
+ throw new SAXNotRecognizedException("Feature: " + name);
+ }
+ }
+
+
+ /**
+ * Look up the value of a feature.
+ *
+ * <p>This will always fail if the parent is null.</p>
+ *
+ * @param name The feature name.
+ * @return The current value of the feature.
+ * @exception org.xml.sax.SAXNotRecognizedException If the feature
+ * value can't be assigned or retrieved from the parent.
+ * @exception org.xml.sax.SAXNotSupportedException When the
+ * parent recognizes the feature name but
+ * cannot determine its value at this time.
+ */
+ public boolean getFeature (String name)
+ throws SAXNotRecognizedException, SAXNotSupportedException
+ {
+ if (parent != null) {
+ return parent.getFeature(name);
+ } else {
+ throw new SAXNotRecognizedException("Feature: " + name);
+ }
+ }
+
+
+ /**
+ * Set the value of a property.
+ *
+ * <p>This will always fail if the parent is null.</p>
+ *
+ * @param name The property name.
+ * @param value The requested property value.
+ * @exception org.xml.sax.SAXNotRecognizedException If the property
+ * value can't be assigned or retrieved from the parent.
+ * @exception org.xml.sax.SAXNotSupportedException When the
+ * parent recognizes the property name but
+ * cannot set the requested value.
+ */
+ public void setProperty (String name, Object value)
+ throws SAXNotRecognizedException, SAXNotSupportedException
+ {
+ if (parent != null) {
+ parent.setProperty(name, value);
+ } else {
+ throw new SAXNotRecognizedException("Property: " + name);
+ }
+ }
+
+
+ /**
+ * Look up the value of a property.
+ *
+ * @param name The property name.
+ * @return The current value of the property.
+ * @exception org.xml.sax.SAXNotRecognizedException If the property
+ * value can't be assigned or retrieved from the parent.
+ * @exception org.xml.sax.SAXNotSupportedException When the
+ * parent recognizes the property name but
+ * cannot determine its value at this time.
+ */
+ public Object getProperty (String name)
+ throws SAXNotRecognizedException, SAXNotSupportedException
+ {
+ if (parent != null) {
+ return parent.getProperty(name);
+ } else {
+ throw new SAXNotRecognizedException("Property: " + name);
+ }
+ }
+
+
+ /**
+ * Set the entity resolver.
+ *
+ * @param resolver The new entity resolver.
+ */
+ public void setEntityResolver (EntityResolver resolver)
+ {
+ entityResolver = resolver;
+ }
+
+
+ /**
+ * Get the current entity resolver.
+ *
+ * @return The current entity resolver, or null if none was set.
+ */
+ public EntityResolver getEntityResolver ()
+ {
+ return entityResolver;
+ }
+
+
+ /**
+ * Set the DTD event handler.
+ *
+ * @param resolver The new DTD handler.
+ */
+ public void setDTDHandler (DTDHandler handler)
+ {
+ dtdHandler = handler;
+ }
+
+
+ /**
+ * Get the current DTD event handler.
+ *
+ * @return The current DTD handler, or null if none was set.
+ */
+ public DTDHandler getDTDHandler ()
+ {
+ return dtdHandler;
+ }
+
+
+ /**
+ * Set the content event handler.
+ *
+ * @param resolver The new content handler.
+ */
+ public void setContentHandler (ContentHandler handler)
+ {
+ contentHandler = handler;
+ }
+
+
+ /**
+ * Get the content event handler.
+ *
+ * @return The current content handler, or null if none was set.
+ */
+ public ContentHandler getContentHandler ()
+ {
+ return contentHandler;
+ }
+
+
+ /**
+ * Set the error event handler.
+ *
+ * @param handle The new error handler.
+ */
+ public void setErrorHandler (ErrorHandler handler)
+ {
+ errorHandler = handler;
+ }
+
+
+ /**
+ * Get the current error event handler.
+ *
+ * @return The current error handler, or null if none was set.
+ */
+ public ErrorHandler getErrorHandler ()
+ {
+ return errorHandler;
+ }
+
+
+ /**
+ * Parse a document.
+ *
+ * @param input The input source for the document entity.
+ * @exception org.xml.sax.SAXException Any SAX exception, possibly
+ * wrapping another exception.
+ * @exception java.io.IOException An IO exception from the parser,
+ * possibly from a byte stream or character stream
+ * supplied by the application.
+ */
+ public void parse (InputSource input)
+ throws SAXException, IOException
+ {
+ setupParse();
+ parent.parse(input);
+ }
+
+
+ /**
+ * Parse a document.
+ *
+ * @param systemId The system identifier as a fully-qualified URI.
+ * @exception org.xml.sax.SAXException Any SAX exception, possibly
+ * wrapping another exception.
+ * @exception java.io.IOException An IO exception from the parser,
+ * possibly from a byte stream or character stream
+ * supplied by the application.
+ */
+ public void parse (String systemId)
+ throws SAXException, IOException
+ {
+ parse(new InputSource(systemId));
+ }
+
+
+
+ ////////////////////////////////////////////////////////////////////
+ // Implementation of org.xml.sax.EntityResolver.
+ ////////////////////////////////////////////////////////////////////
+
+
+ /**
+ * Filter an external entity resolution.
+ *
+ * @param publicId The entity's public identifier, or null.
+ * @param systemId The entity's system identifier.
+ * @return A new InputSource or null for the default.
+ * @exception org.xml.sax.SAXException The client may throw
+ * an exception during processing.
+ * @exception java.io.IOException The client may throw an
+ * I/O-related exception while obtaining the
+ * new InputSource.
+ */
+ public InputSource resolveEntity (String publicId, String systemId)
+ throws SAXException, IOException
+ {
+ if (entityResolver != null) {
+ return entityResolver.resolveEntity(publicId, systemId);
+ } else {
+ return null;
+ }
+ }
+
+
+
+ ////////////////////////////////////////////////////////////////////
+ // Implementation of org.xml.sax.DTDHandler.
+ ////////////////////////////////////////////////////////////////////
+
+
+ /**
+ * Filter a notation declaration event.
+ *
+ * @param name The notation name.
+ * @param publicId The notation's public identifier, or null.
+ * @param systemId The notation's system identifier, or null.
+ * @exception org.xml.sax.SAXException The client may throw
+ * an exception during processing.
+ */
+ public void notationDecl (String name, String publicId, String systemId)
+ throws SAXException
+ {
+ if (dtdHandler != null) {
+ dtdHandler.notationDecl(name, publicId, systemId);
+ }
+ }
+
+
+ /**
+ * Filter an unparsed entity declaration event.
+ *
+ * @param name The entity name.
+ * @param publicId The entity's public identifier, or null.
+ * @param systemId The entity's system identifier, or null.
+ * @param notationName The name of the associated notation.
+ * @exception org.xml.sax.SAXException The client may throw
+ * an exception during processing.
+ */
+ public void unparsedEntityDecl (String name, String publicId,
+ String systemId, String notationName)
+ throws SAXException
+ {
+ if (dtdHandler != null) {
+ dtdHandler.unparsedEntityDecl(name, publicId, systemId,
+ notationName);
+ }
+ }
+
+
+
+ ////////////////////////////////////////////////////////////////////
+ // Implementation of org.xml.sax.ContentHandler.
+ ////////////////////////////////////////////////////////////////////
+
+
+ /**
+ * Filter a new document locator event.
+ *
+ * @param locator The document locator.
+ */
+ public void setDocumentLocator (Locator locator)
+ {
+ this.locator = locator;
+ if (contentHandler != null) {
+ contentHandler.setDocumentLocator(locator);
+ }
+ }
+
+
+ /**
+ * Filter a start document event.
+ *
+ * @exception org.xml.sax.SAXException The client may throw
+ * an exception during processing.
+ */
+ public void startDocument ()
+ throws SAXException
+ {
+ if (contentHandler != null) {
+ contentHandler.startDocument();
+ }
+ }
+
+
+ /**
+ * Filter an end document event.
+ *
+ * @exception org.xml.sax.SAXException The client may throw
+ * an exception during processing.
+ */
+ public void endDocument ()
+ throws SAXException
+ {
+ if (contentHandler != null) {
+ contentHandler.endDocument();
+ }
+ }
+
+
+ /**
+ * Filter a start Namespace prefix mapping event.
+ *
+ * @param prefix The Namespace prefix.
+ * @param uri The Namespace URI.
+ * @exception org.xml.sax.SAXException The client may throw
+ * an exception during processing.
+ */
+ public void startPrefixMapping (String prefix, String uri)
+ throws SAXException
+ {
+ if (contentHandler != null) {
+ contentHandler.startPrefixMapping(prefix, uri);
+ }
+ }
+
+
+ /**
+ * Filter an end Namespace prefix mapping event.
+ *
+ * @param prefix The Namespace prefix.
+ * @exception org.xml.sax.SAXException The client may throw
+ * an exception during processing.
+ */
+ public void endPrefixMapping (String prefix)
+ throws SAXException
+ {
+ if (contentHandler != null) {
+ contentHandler.endPrefixMapping(prefix);
+ }
+ }
+
+
+ /**
+ * Filter a start element event.
+ *
+ * @param uri The element's Namespace URI, or the empty string.
+ * @param localName The element's local name, or the empty string.
+ * @param qName The element's qualified (prefixed) name, or the empty
+ * string.
+ * @param atts The element's attributes.
+ * @exception org.xml.sax.SAXException The client may throw
+ * an exception during processing.
+ */
+ public void startElement (String uri, String localName, String qName,
+ Attributes atts)
+ throws SAXException
+ {
+ if (contentHandler != null) {
+ contentHandler.startElement(uri, localName, qName, atts);
+ }
+ }
+
+
+ /**
+ * Filter an end element event.
+ *
+ * @param uri The element's Namespace URI, or the empty string.
+ * @param localName The element's local name, or the empty string.
+ * @param qName The element's qualified (prefixed) name, or the empty
+ * string.
+ * @exception org.xml.sax.SAXException The client may throw
+ * an exception during processing.
+ */
+ public void endElement (String uri, String localName, String qName)
+ throws SAXException
+ {
+ if (contentHandler != null) {
+ contentHandler.endElement(uri, localName, qName);
+ }
+ }
+
+
+ /**
+ * Filter a character data event.
+ *
+ * @param ch An array of characters.
+ * @param start The starting position in the array.
+ * @param length The number of characters to use from the array.
+ * @exception org.xml.sax.SAXException The client may throw
+ * an exception during processing.
+ */
+ public void characters (char ch[], int start, int length)
+ throws SAXException
+ {
+ if (contentHandler != null) {
+ contentHandler.characters(ch, start, length);
+ }
+ }
+
+
+ /**
+ * Filter an ignorable whitespace event.
+ *
+ * @param ch An array of characters.
+ * @param start The starting position in the array.
+ * @param length The number of characters to use from the array.
+ * @exception org.xml.sax.SAXException The client may throw
+ * an exception during processing.
+ */
+ public void ignorableWhitespace (char ch[], int start, int length)
+ throws SAXException
+ {
+ if (contentHandler != null) {
+ contentHandler.ignorableWhitespace(ch, start, length);
+ }
+ }
+
+
+ /**
+ * Filter a processing instruction event.
+ *
+ * @param target The processing instruction target.
+ * @param data The text following the target.
+ * @exception org.xml.sax.SAXException The client may throw
+ * an exception during processing.
+ */
+ public void processingInstruction (String target, String data)
+ throws SAXException
+ {
+ if (contentHandler != null) {
+ contentHandler.processingInstruction(target, data);
+ }
+ }
+
+
+ /**
+ * Filter a skipped entity event.
+ *
+ * @param name The name of the skipped entity.
+ * @exception org.xml.sax.SAXException The client may throw
+ * an exception during processing.
+ */
+ public void skippedEntity (String name)
+ throws SAXException
+ {
+ if (contentHandler != null) {
+ contentHandler.skippedEntity(name);
+ }
+ }
+
+
+
+ ////////////////////////////////////////////////////////////////////
+ // Implementation of org.xml.sax.ErrorHandler.
+ ////////////////////////////////////////////////////////////////////
+
+
+ /**
+ * Filter a warning event.
+ *
+ * @param e The warning as an exception.
+ * @exception org.xml.sax.SAXException The client may throw
+ * an exception during processing.
+ */
+ public void warning (SAXParseException e)
+ throws SAXException
+ {
+ if (errorHandler != null) {
+ errorHandler.warning(e);
+ }
+ }
+
+
+ /**
+ * Filter an error event.
+ *
+ * @param e The error as an exception.
+ * @exception org.xml.sax.SAXException The client may throw
+ * an exception during processing.
+ */
+ public void error (SAXParseException e)
+ throws SAXException
+ {
+ if (errorHandler != null) {
+ errorHandler.error(e);
+ }
+ }
+
+
+ /**
+ * Filter a fatal error event.
+ *
+ * @param e The error as an exception.
+ * @exception org.xml.sax.SAXException The client may throw
+ * an exception during processing.
+ */
+ public void fatalError (SAXParseException e)
+ throws SAXException
+ {
+ if (errorHandler != null) {
+ errorHandler.fatalError(e);
+ }
+ }
+
+
+
+ ////////////////////////////////////////////////////////////////////
+ // Internal methods.
+ ////////////////////////////////////////////////////////////////////
+
+
+ /**
+ * Set up before a parse.
+ *
+ * <p>Before every parse, check whether the parent is
+ * non-null, and re-register the filter for all of the
+ * events.</p>
+ */
+ private void setupParse ()
+ {
+ if (parent == null) {
+ throw new NullPointerException("No parent for filter");
+ }
+ parent.setEntityResolver(this);
+ parent.setDTDHandler(this);
+ parent.setContentHandler(this);
+ parent.setErrorHandler(this);
+ }
+
+
+
+ ////////////////////////////////////////////////////////////////////
+ // Internal state.
+ ////////////////////////////////////////////////////////////////////
+
+ private XMLReader parent = null;
+ private Locator locator = null;
+ private EntityResolver entityResolver = null;
+ private DTDHandler dtdHandler = null;
+ private ContentHandler contentHandler = null;
+ private ErrorHandler errorHandler = null;
+
+}
+
+// end of XMLFilterImpl.java
diff --git a/external/jaxp/source/org/xml/sax/helpers/XMLReaderAdapter.java b/external/jaxp/source/org/xml/sax/helpers/XMLReaderAdapter.java
new file mode 100755
index 000000000..56f22ff8c
--- /dev/null
+++ b/external/jaxp/source/org/xml/sax/helpers/XMLReaderAdapter.java
@@ -0,0 +1,538 @@
+// XMLReaderAdapter.java - adapt an SAX2 XMLReader to a SAX1 Parser
+// http://www.saxproject.org
+// Written by David Megginson
+// NO WARRANTY! This class is in the public domain.
+// $Id: XMLReaderAdapter.java,v 1.1 2003-02-01 02:10:48 cbj Exp $
+
+package org.xml.sax.helpers;
+
+import java.io.IOException;
+import java.util.Locale;
+
+import org.xml.sax.Parser; // deprecated
+import org.xml.sax.Locator;
+import org.xml.sax.InputSource;
+import org.xml.sax.AttributeList; // deprecated
+import org.xml.sax.EntityResolver;
+import org.xml.sax.DTDHandler;
+import org.xml.sax.DocumentHandler; // deprecated
+import org.xml.sax.ErrorHandler;
+import org.xml.sax.SAXException;
+
+import org.xml.sax.XMLReader;
+import org.xml.sax.Attributes;
+import org.xml.sax.ContentHandler;
+import org.xml.sax.SAXNotSupportedException;
+
+
+/**
+ * Adapt a SAX2 XMLReader as a SAX1 Parser.
+ *
+ * <blockquote>
+ * <em>This module, both source code and documentation, is in the
+ * Public Domain, and comes with <strong>NO WARRANTY</strong>.</em>
+ * See <a href='http://www.saxproject.org'>http://www.saxproject.org</a>
+ * for further information.
+ * </blockquote>
+ *
+ * <p>This class wraps a SAX2 {@link org.xml.sax.XMLReader XMLReader}
+ * and makes it act as a SAX1 {@link org.xml.sax.Parser Parser}. The XMLReader
+ * must support a true value for the
+ * http://xml.org/sax/features/namespace-prefixes property or parsing will fail
+ * with a {@link org.xml.sax.SAXException SAXException}; if the XMLReader
+ * supports a false value for the http://xml.org/sax/features/namespaces
+ * property, that will also be used to improve efficiency.</p>
+ *
+ * @since SAX 2.0
+ * @author David Megginson
+ * @version 2.0.1 (sax2r2)
+ * @see org.xml.sax.Parser
+ * @see org.xml.sax.XMLReader
+ */
+public class XMLReaderAdapter implements Parser, ContentHandler
+{
+
+
+ ////////////////////////////////////////////////////////////////////
+ // Constructor.
+ ////////////////////////////////////////////////////////////////////
+
+
+ /**
+ * Create a new adapter.
+ *
+ * <p>Use the "org.xml.sax.driver" property to locate the SAX2
+ * driver to embed.</p>
+ *
+ * @exception org.xml.sax.SAXException If the embedded driver
+ * cannot be instantiated or if the
+ * org.xml.sax.driver property is not specified.
+ */
+ public XMLReaderAdapter ()
+ throws SAXException
+ {
+ setup(XMLReaderFactory.createXMLReader());
+ }
+
+
+ /**
+ * Create a new adapter.
+ *
+ * <p>Create a new adapter, wrapped around a SAX2 XMLReader.
+ * The adapter will make the XMLReader act like a SAX1
+ * Parser.</p>
+ *
+ * @param xmlReader The SAX2 XMLReader to wrap.
+ * @exception java.lang.NullPointerException If the argument is null.
+ */
+ public XMLReaderAdapter (XMLReader xmlReader)
+ {
+ setup(xmlReader);
+ }
+
+
+
+ /**
+ * Internal setup.
+ *
+ * @param xmlReader The embedded XMLReader.
+ */
+ private void setup (XMLReader xmlReader)
+ {
+ if (xmlReader == null) {
+ throw new NullPointerException("XMLReader must not be null");
+ }
+ this.xmlReader = xmlReader;
+ qAtts = new AttributesAdapter();
+ }
+
+
+
+ ////////////////////////////////////////////////////////////////////
+ // Implementation of org.xml.sax.Parser.
+ ////////////////////////////////////////////////////////////////////
+
+
+ /**
+ * Set the locale for error reporting.
+ *
+ * <p>This is not supported in SAX2, and will always throw
+ * an exception.</p>
+ *
+ * @param The locale for error reporting.
+ * @see org.xml.sax.Parser#setLocale
+ * @exception org.xml.sax.SAXException Thrown unless overridden.
+ */
+ public void setLocale (Locale locale)
+ throws SAXException
+ {
+ throw new SAXNotSupportedException("setLocale not supported");
+ }
+
+
+ /**
+ * Register the entity resolver.
+ *
+ * @param resolver The new resolver.
+ * @see org.xml.sax.Parser#setEntityResolver
+ */
+ public void setEntityResolver (EntityResolver resolver)
+ {
+ xmlReader.setEntityResolver(resolver);
+ }
+
+
+ /**
+ * Register the DTD event handler.
+ *
+ * @param handler The new DTD event handler.
+ * @see org.xml.sax.Parser#setDTDHandler
+ */
+ public void setDTDHandler (DTDHandler handler)
+ {
+ xmlReader.setDTDHandler(handler);
+ }
+
+
+ /**
+ * Register the SAX1 document event handler.
+ *
+ * <p>Note that the SAX1 document handler has no Namespace
+ * support.</p>
+ *
+ * @param handler The new SAX1 document event handler.
+ * @see org.xml.sax.Parser#setDocumentHandler
+ */
+ public void setDocumentHandler (DocumentHandler handler)
+ {
+ documentHandler = handler;
+ }
+
+
+ /**
+ * Register the error event handler.
+ *
+ * @param handler The new error event handler.
+ * @see org.xml.sax.Parser#setErrorHandler
+ */
+ public void setErrorHandler (ErrorHandler handler)
+ {
+ xmlReader.setErrorHandler(handler);
+ }
+
+
+ /**
+ * Parse the document.
+ *
+ * <p>This method will throw an exception if the embedded
+ * XMLReader does not support the
+ * http://xml.org/sax/features/namespace-prefixes property.</p>
+ *
+ * @param systemId The absolute URL of the document.
+ * @exception java.io.IOException If there is a problem reading
+ * the raw content of the document.
+ * @exception org.xml.sax.SAXException If there is a problem
+ * processing the document.
+ * @see #parse(org.xml.sax.InputSource)
+ * @see org.xml.sax.Parser#parse(java.lang.String)
+ */
+ public void parse (String systemId)
+ throws IOException, SAXException
+ {
+ parse(new InputSource(systemId));
+ }
+
+
+ /**
+ * Parse the document.
+ *
+ * <p>This method will throw an exception if the embedded
+ * XMLReader does not support the
+ * http://xml.org/sax/features/namespace-prefixes property.</p>
+ *
+ * @param input An input source for the document.
+ * @exception java.io.IOException If there is a problem reading
+ * the raw content of the document.
+ * @exception org.xml.sax.SAXException If there is a problem
+ * processing the document.
+ * @see #parse(java.lang.String)
+ * @see org.xml.sax.Parser#parse(org.xml.sax.InputSource)
+ */
+ public void parse (InputSource input)
+ throws IOException, SAXException
+ {
+ setupXMLReader();
+ xmlReader.parse(input);
+ }
+
+
+ /**
+ * Set up the XML reader.
+ */
+ private void setupXMLReader ()
+ throws SAXException
+ {
+ xmlReader.setFeature("http://xml.org/sax/features/namespace-prefixes", true);
+ try {
+ xmlReader.setFeature("http://xml.org/sax/features/namespaces",
+ false);
+ } catch (SAXException e) {
+ // NO OP: it's just extra information, and we can ignore it
+ }
+ xmlReader.setContentHandler(this);
+ }
+
+
+
+ ////////////////////////////////////////////////////////////////////
+ // Implementation of org.xml.sax.ContentHandler.
+ ////////////////////////////////////////////////////////////////////
+
+
+ /**
+ * Set a document locator.
+ *
+ * @param locator The document locator.
+ * @see org.xml.sax.ContentHandler#setDocumentLocator
+ */
+ public void setDocumentLocator (Locator locator)
+ {
+ if (documentHandler != null)
+ documentHandler.setDocumentLocator(locator);
+ }
+
+
+ /**
+ * Start document event.
+ *
+ * @exception org.xml.sax.SAXException The client may raise a
+ * processing exception.
+ * @see org.xml.sax.ContentHandler#startDocument
+ */
+ public void startDocument ()
+ throws SAXException
+ {
+ if (documentHandler != null)
+ documentHandler.startDocument();
+ }
+
+
+ /**
+ * End document event.
+ *
+ * @exception org.xml.sax.SAXException The client may raise a
+ * processing exception.
+ * @see org.xml.sax.ContentHandler#endDocument
+ */
+ public void endDocument ()
+ throws SAXException
+ {
+ if (documentHandler != null)
+ documentHandler.endDocument();
+ }
+
+
+ /**
+ * Adapt a SAX2 start prefix mapping event.
+ *
+ * @param prefix The prefix being mapped.
+ * @param uri The Namespace URI being mapped to.
+ * @see org.xml.sax.ContentHandler#startPrefixMapping
+ */
+ public void startPrefixMapping (String prefix, String uri)
+ {
+ }
+
+
+ /**
+ * Adapt a SAX2 end prefix mapping event.
+ *
+ * @param prefix The prefix being mapped.
+ * @see org.xml.sax.ContentHandler#endPrefixMapping
+ */
+ public void endPrefixMapping (String prefix)
+ {
+ }
+
+
+ /**
+ * Adapt a SAX2 start element event.
+ *
+ * @param uri The Namespace URI.
+ * @param localName The Namespace local name.
+ * @param qName The qualified (prefixed) name.
+ * @param atts The SAX2 attributes.
+ * @exception org.xml.sax.SAXException The client may raise a
+ * processing exception.
+ * @see org.xml.sax.ContentHandler#endDocument
+ */
+ public void startElement (String uri, String localName,
+ String qName, Attributes atts)
+ throws SAXException
+ {
+ if (documentHandler != null) {
+ qAtts.setAttributes(atts);
+ documentHandler.startElement(qName, qAtts);
+ }
+ }
+
+
+ /**
+ * Adapt a SAX2 end element event.
+ *
+ * @param uri The Namespace URI.
+ * @param localName The Namespace local name.
+ * @param qName The qualified (prefixed) name.
+ * @exception org.xml.sax.SAXException The client may raise a
+ * processing exception.
+ * @see org.xml.sax.ContentHandler#endElement
+ */
+ public void endElement (String uri, String localName,
+ String qName)
+ throws SAXException
+ {
+ if (documentHandler != null)
+ documentHandler.endElement(qName);
+ }
+
+
+ /**
+ * Adapt a SAX2 characters event.
+ *
+ * @param ch An array of characters.
+ * @param start The starting position in the array.
+ * @param length The number of characters to use.
+ * @exception org.xml.sax.SAXException The client may raise a
+ * processing exception.
+ * @see org.xml.sax.ContentHandler#characters
+ */
+ public void characters (char ch[], int start, int length)
+ throws SAXException
+ {
+ if (documentHandler != null)
+ documentHandler.characters(ch, start, length);
+ }
+
+
+ /**
+ * Adapt a SAX2 ignorable whitespace event.
+ *
+ * @param ch An array of characters.
+ * @param start The starting position in the array.
+ * @param length The number of characters to use.
+ * @exception org.xml.sax.SAXException The client may raise a
+ * processing exception.
+ * @see org.xml.sax.ContentHandler#ignorableWhitespace
+ */
+ public void ignorableWhitespace (char ch[], int start, int length)
+ throws SAXException
+ {
+ if (documentHandler != null)
+ documentHandler.ignorableWhitespace(ch, start, length);
+ }
+
+
+ /**
+ * Adapt a SAX2 processing instruction event.
+ *
+ * @param target The processing instruction target.
+ * @param data The remainder of the processing instruction
+ * @exception org.xml.sax.SAXException The client may raise a
+ * processing exception.
+ * @see org.xml.sax.ContentHandler#processingInstruction
+ */
+ public void processingInstruction (String target, String data)
+ throws SAXException
+ {
+ if (documentHandler != null)
+ documentHandler.processingInstruction(target, data);
+ }
+
+
+ /**
+ * Adapt a SAX2 skipped entity event.
+ *
+ * @param name The name of the skipped entity.
+ * @see org.xml.sax.ContentHandler#skippedEntity
+ * @exception org.xml.sax.SAXException Throwable by subclasses.
+ */
+ public void skippedEntity (String name)
+ throws SAXException
+ {
+ }
+
+
+
+ ////////////////////////////////////////////////////////////////////
+ // Internal state.
+ ////////////////////////////////////////////////////////////////////
+
+ XMLReader xmlReader;
+ DocumentHandler documentHandler;
+ AttributesAdapter qAtts;
+
+
+
+ ////////////////////////////////////////////////////////////////////
+ // Internal class.
+ ////////////////////////////////////////////////////////////////////
+
+
+ /**
+ * Internal class to wrap a SAX2 Attributes object for SAX1.
+ */
+ final class AttributesAdapter implements AttributeList
+ {
+ AttributesAdapter ()
+ {
+ }
+
+
+ /**
+ * Set the embedded Attributes object.
+ *
+ * @param The embedded SAX2 Attributes.
+ */
+ void setAttributes (Attributes attributes)
+ {
+ this.attributes = attributes;
+ }
+
+
+ /**
+ * Return the number of attributes.
+ *
+ * @return The length of the attribute list.
+ * @see org.xml.sax.AttributeList#getLength
+ */
+ public int getLength ()
+ {
+ return attributes.getLength();
+ }
+
+
+ /**
+ * Return the qualified (prefixed) name of an attribute by position.
+ *
+ * @return The qualified name.
+ * @see org.xml.sax.AttributeList#getName
+ */
+ public String getName (int i)
+ {
+ return attributes.getQName(i);
+ }
+
+
+ /**
+ * Return the type of an attribute by position.
+ *
+ * @return The type.
+ * @see org.xml.sax.AttributeList#getType(int)
+ */
+ public String getType (int i)
+ {
+ return attributes.getType(i);
+ }
+
+
+ /**
+ * Return the value of an attribute by position.
+ *
+ * @return The value.
+ * @see org.xml.sax.AttributeList#getValue(int)
+ */
+ public String getValue (int i)
+ {
+ return attributes.getValue(i);
+ }
+
+
+ /**
+ * Return the type of an attribute by qualified (prefixed) name.
+ *
+ * @return The type.
+ * @see org.xml.sax.AttributeList#getType(java.lang.String)
+ */
+ public String getType (String qName)
+ {
+ return attributes.getType(qName);
+ }
+
+
+ /**
+ * Return the value of an attribute by qualified (prefixed) name.
+ *
+ * @return The value.
+ * @see org.xml.sax.AttributeList#getValue(java.lang.String)
+ */
+ public String getValue (String qName)
+ {
+ return attributes.getValue(qName);
+ }
+
+ private Attributes attributes;
+ }
+
+}
+
+// end of XMLReaderAdapter.java
diff --git a/external/jaxp/source/org/xml/sax/helpers/XMLReaderFactory.java b/external/jaxp/source/org/xml/sax/helpers/XMLReaderFactory.java
new file mode 100755
index 000000000..82d2dcfe3
--- /dev/null
+++ b/external/jaxp/source/org/xml/sax/helpers/XMLReaderFactory.java
@@ -0,0 +1,201 @@
+// XMLReaderFactory.java - factory for creating a new reader.
+// http://www.saxproject.org
+// Written by David Megginson
+// and by David Brownell
+// NO WARRANTY! This class is in the Public Domain.
+// $Id: XMLReaderFactory.java,v 1.1 2003-02-01 02:10:48 cbj Exp $
+
+package org.xml.sax.helpers;
+import java.io.BufferedReader;
+import java.io.InputStream;
+import java.io.InputStreamReader;
+import org.xml.sax.XMLReader;
+import org.xml.sax.SAXException;
+
+
+/**
+ * Factory for creating an XML reader.
+ *
+ * <blockquote>
+ * <em>This module, both source code and documentation, is in the
+ * Public Domain, and comes with <strong>NO WARRANTY</strong>.</em>
+ * See <a href='http://www.saxproject.org'>http://www.saxproject.org</a>
+ * for further information.
+ * </blockquote>
+ *
+ * <p>This class contains static methods for creating an XML reader
+ * from an explicit class name, or based on runtime defaults:</p>
+ *
+ * <pre>
+ * try {
+ * XMLReader myReader = XMLReaderFactory.createXMLReader();
+ * } catch (SAXException e) {
+ * System.err.println(e.getMessage());
+ * }
+ * </pre>
+ *
+ * <p><strong>Note to Distributions bundled with parsers:</strong>
+ * You should modify the implementation of the no-arguments
+ * <em>createXMLReader</em> to handle cases where the external
+ * configuration mechanisms aren't set up. That method should do its
+ * best to return a parser when one is in the class path, even when
+ * nothing bound its class name to <code>org.xml.sax.driver</code> so
+ * those configuration mechanisms would see it.</p>
+ *
+ * @since SAX 2.0
+ * @author David Megginson, David Brownell
+ * @version 2.0.1 (sax2r2)
+ */
+final public class XMLReaderFactory
+{
+ /**
+ * Private constructor.
+ *
+ * <p>This constructor prevents the class from being instantiated.</p>
+ */
+ private XMLReaderFactory ()
+ {
+ }
+
+ private static final String property = "org.xml.sax.driver";
+
+ /**
+ * Attempt to create an XMLReader from system defaults.
+ * In environments which can support it, the name of the XMLReader
+ * class is determined by trying each these options in order, and
+ * using the first one which succeeds:</p> <ul>
+ *
+ * <li>If the system property <code>org.xml.sax.driver</code>
+ * has a value, that is used as an XMLReader class name. </li>
+ *
+ * <li>The JAR "Services API" is used to look for a class name
+ * in the <em>META-INF/services/org.xml.sax.driver</em> file in
+ * jarfiles available to the runtime.</li>
+ *
+ * <li> SAX parser distributions are strongly encouraged to provide
+ * a default XMLReader class name that will take effect only when
+ * previous options (on this list) are not successful.</li>
+ *
+ * <li>Finally, if {@link ParserFactory#makeParser()} can
+ * return a system default SAX1 parser, that parser is wrapped in
+ * a {@link ParserAdapter}. (This is a migration aid for SAX1
+ * environments, where the <code>org.xml.sax.parser</code> system
+ * property will often be usable.) </li>
+ *
+ * </ul>
+ *
+ * <p> In environments such as small embedded systems, which can not
+ * support that flexibility, other mechanisms to determine the default
+ * may be used. </p>
+ *
+ * <p>Note that many Java environments allow system properties to be
+ * initialized on a command line. This means that <em>in most cases</em>
+ * setting a good value for that property ensures that calls to this
+ * method will succeed, except when security policies intervene.
+ * This will also maximize application portability to older SAX
+ * environments, with less robust implementations of this method.
+ * </p>
+ *
+ * @return A new XMLReader.
+ * @exception org.xml.sax.SAXException If no default XMLReader class
+ * can be identified and instantiated.
+ * @see #createXMLReader(java.lang.String)
+ */
+ public static XMLReader createXMLReader ()
+ throws SAXException
+ {
+ String className = null;
+ ClassLoader loader = NewInstance.getClassLoader ();
+
+ // 1. try the JVM-instance-wide system property
+ try { className = System.getProperty (property); }
+ catch (Exception e) { /* normally fails for applets */ }
+
+ // 2. if that fails, try META-INF/services/
+ if (className == null) {
+ try {
+ String service = "META-INF/services/" + property;
+ InputStream in;
+ BufferedReader reader;
+
+ if (loader == null)
+ in = ClassLoader.getSystemResourceAsStream (service);
+ else
+ in = loader.getResourceAsStream (service);
+
+ if (in != null) {
+ reader = new BufferedReader (
+ new InputStreamReader (in, "UTF8"));
+ className = reader.readLine ();
+ in.close ();
+ }
+ } catch (Exception e) {
+ }
+ }
+
+ // 3. Distro-specific fallback
+ if (className == null) {
+// BEGIN DISTRIBUTION-SPECIFIC
+
+ // use the non-validating one
+ className = "gnu.xml.aelfred2.SAXDriver";
+
+// END DISTRIBUTION-SPECIFIC
+ }
+
+ // do we know the XMLReader implementation class yet?
+ if (className != null)
+ return loadClass (loader, className);
+
+ // 4. panic -- adapt any SAX1 parser
+ try {
+ return new ParserAdapter (ParserFactory.makeParser ());
+ } catch (Exception e) {
+ throw new SAXException ("Can't create default XMLReader; "
+ + "is system property org.xml.sax.driver set?");
+ }
+ }
+
+
+ /**
+ * Attempt to create an XML reader from a class name.
+ *
+ * <p>Given a class name, this method attempts to load
+ * and instantiate the class as an XML reader.</p>
+ *
+ * <p>Note that this method will not be usable in environments where
+ * the caller (perhaps an applet) is not permitted to load classes
+ * dynamically.</p>
+ *
+ * @return A new XML reader.
+ * @exception org.xml.sax.SAXException If the class cannot be
+ * loaded, instantiated, and cast to XMLReader.
+ * @see #createXMLReader()
+ */
+ public static XMLReader createXMLReader (String className)
+ throws SAXException
+ {
+ return loadClass (NewInstance.getClassLoader (), className);
+ }
+
+ private static XMLReader loadClass (ClassLoader loader, String className)
+ throws SAXException
+ {
+ try {
+ return (XMLReader) NewInstance.newInstance (loader, className);
+ } catch (ClassNotFoundException e1) {
+ throw new SAXException("SAX2 driver class " + className +
+ " not found", e1);
+ } catch (IllegalAccessException e2) {
+ throw new SAXException("SAX2 driver class " + className +
+ " found but cannot be loaded", e2);
+ } catch (InstantiationException e3) {
+ throw new SAXException("SAX2 driver class " + className +
+ " loaded but cannot be instantiated (no empty public constructor?)",
+ e3);
+ } catch (ClassCastException e4) {
+ throw new SAXException("SAX2 driver class " + className +
+ " does not implement XMLReader", e4);
+ }
+ }
+}
diff --git a/external/jaxp/source/org/xml/sax/helpers/package.html b/external/jaxp/source/org/xml/sax/helpers/package.html
new file mode 100755
index 000000000..6b432a31d
--- /dev/null
+++ b/external/jaxp/source/org/xml/sax/helpers/package.html
@@ -0,0 +1,11 @@
+<HTML><HEAD>
+<!-- $Id: package.html,v 1.1 2003-02-01 02:10:48 cbj Exp $ -->
+</HEAD><BODY>
+
+<p>This package contains "helper" classes, including
+support for bootstrapping SAX-based applications.
+
+<p>See <a href='http://www.saxproject.org'>http://www.saxproject.org</a>
+for more information about SAX.</p>
+
+</BODY></HTML>
diff --git a/external/jaxp/source/org/xml/sax/package.html b/external/jaxp/source/org/xml/sax/package.html
new file mode 100755
index 000000000..abd09ca3f
--- /dev/null
+++ b/external/jaxp/source/org/xml/sax/package.html
@@ -0,0 +1,229 @@
+<html><head>
+<!-- $Id: package.html,v 1.1 2003-02-01 02:10:43 cbj Exp $ -->
+</head><body>
+
+<p> This package provides the core SAX APIs.
+Some SAX1 APIs are deprecated to encourage integration of
+namespace-awareness into designs of new applications
+and into maintainance of existing infrastructure. </p>
+
+<p>See <a href='http://www.saxproject.org'>http://www.saxproject.org</a>
+for more information about SAX.</p>
+
+
+<h2> SAX2 Standard Feature Flags </h2>
+
+<p> One of the essential characteristics of SAX2 is that it added
+feature flags which can be used to examine and perhaps modify
+parser modes, in particular modes such as validation.
+Since features are identified by (absolute) URIs, anyone
+can define such features.
+Currently defined standard feature URIs have the prefix
+<code>http://xml.org/sax/features/</code> before an identifier such as
+<code>validation</code>. Turn features on or off using
+<em>setFeature</em>. Those standard identifiers are: </p>
+
+
+<table border="1" cellpadding="3" cellspacing="0" width="100%">
+ <tr align="center" bgcolor="#ccccff">
+ <th>Feature ID</th>
+ <th>Default</th>
+ <th>Description</th>
+ </tr>
+
+ <tr>
+ <td>external-general-entities</td>
+ <td><em>unspecified</em></td>
+ <td> Reports whether this parser processes external
+ general entities; always true if validating</td>
+ </tr>
+
+ <tr>
+ <td>external-parameter-entities</td>
+ <td><em>unspecified</em></td>
+ <td> Reports whether this parser processes external
+ parameter entities; always true if validating</td>
+ </tr>
+
+ <tr>
+ <td>is-standalone</td>
+ <td><em>none</em></td>
+ <td> May be examined only during a parse, after the
+ <em>startDocument()</em> callback has been made; read-only.
+ The value is true if the document specified the
+ "standalone" flag in its XML declaration,
+ and otherwise is false. </td>
+ </tr>
+
+ <tr>
+ <td>lexical-handler/parameter-entities</td>
+ <td><em>unspecified</em></td>
+ <td> true indicates that the LexicalHandler will report the
+ beginning and end of parameter entities
+ </td>
+ </tr>
+
+ <tr>
+ <td>namespaces</td>
+ <td>true</td>
+ <td> true indicates namespace URIs and unprefixed local names
+ for element and attribute names will be available </td>
+ </tr>
+
+ <tr>
+ <td>namespace-prefixes</td>
+ <td>false</td>
+ <td> true indicates XML 1.0 names (with prefixes) and attributes
+ (including <em>xmlns*</em> attributes) will be available </td>
+ </tr>
+
+ <tr>
+ <td>resolve-dtd-uris</td>
+ <td><em>true</em></td>
+ <td> A value of "true" indicates that system IDs in declarations will
+ be absolutized (relative to their base URIs) before reporting.
+ (That is the default behavior for all SAX2 XML parsers.)
+ A value of "false" indicates those IDs will not be absolutized;
+ parsers will provide the base URI from
+ <em>Locator.getSystemId()</em>.
+ This applies to system IDs passed in <ul>
+ <li><em>DTDHandler.notationDecl()</em>,
+ <li><em>DTDHandler.unparsedEntityDecl()</em>, and
+ <li><em>DeclHandler.externalEntityDecl()</em>.
+ </ul>
+ It does not apply to <em>EntityResolver.resolveEntity()</em>,
+ which is not used to report declarations, or to
+ <em>LexicalHandler.startDTD()</em>, which already provides
+ the non-absolutized URI.
+ </td>
+ </tr>
+
+ <tr>
+ <td>string-interning</td>
+ <td><em>unspecified</em></td>
+ <td> true if all XML names (for elements, prefixes, attributes,
+ entities, notations, and local names),
+ as well as Namespace URIs, will have been interned
+ using <em>java.lang.String.intern</em>. This supports fast
+ testing of equality/inequality against string constants.</td>
+ </tr>
+
+ <tr>
+ <td>use-attributes2</td>
+ <td><em>unspecified</em></td>
+ <td> Returns true if the <em>Attributes</em> objects passed by
+ this parser in <em>ContentHandler.startElement()</em>
+ implement the <a href="ext/Attributes2.html"
+ ><em>org.xml.sax.ext.Attributes2</em></a> interface.
+ That interface exposes additional information,
+ such as whether the attribute was specified in the
+ source text rather than defaulted.
+ </td>
+ </tr>
+
+ <tr>
+ <td>use-locator2</td>
+ <td><em>unspecified</em></td>
+ <td> Returns true if the <em>Locator</em> objects passed by
+ this parser in <em>ContentHandler.setDocumentLocator()</em>
+ implement the <a href="ext/Locator2.html"
+ ><em>org.xml.sax.ext.Locator2</em></a> interface.
+ That interface exposes additional entity information,
+ such as the character encoding and XML version used.
+ </td>
+ </tr>
+
+ <tr>
+ <td>use-entity-resolver2</td>
+ <td><em>true</em> (when recognized)</td>
+ <td> Returns true if, when <em>setEntityResolver</em> is given
+ an object implementing the <a href="ext/EntityResolver2.html"
+ ><em>org.xml.sax.ext.EntityResolver2</em></a> interface,
+ those new methods will be used.
+ Returns false to indicate that those methods will not be used.
+ </td>
+ </tr>
+
+ <tr>
+ <td>validation</td>
+ <td><em>unspecified</em></td>
+ <td> controls whether the parser is reporting all validity
+ errors; if true, all external entities will be read. </td>
+ </tr>
+
+</table>
+
+<p> Support for the default values of the
+<em>namespaces</em> and <em>namespace-prefixes</em>
+properties is required.
+</p>
+
+<p> For default values not specified by SAX2,
+each XMLReader implementation specifies its default,
+or may choose not to expose the feature flag.
+Unless otherwise specified here,
+implementations may support changing current values
+of these standard feature flags, but not while parsing.
+</p>
+
+<h2> SAX2 Standard Handler and Property IDs </h2>
+
+<p> For parser interface characteristics that are described
+as objects, a separate namespace is defined. The
+objects in this namespace are again identified by URI, and
+the standard property URIs have the prefix
+<code>http://xml.org/sax/properties/</code> before an identifier such as
+<code>lexical-handler</code> or
+<code>dom-node</code>. Manage those properties using
+<em>setProperty()</em>. Those identifiers are: </p>
+
+<table border="1" cellpadding="3" cellspacing="0" width="100%">
+ <tr align="center" bgcolor="#ccccff">
+ <th>Property ID</th>
+ <th>Description</th>
+ </tr>
+
+ <tr>
+ <td>declaration-handler</td>
+ <td> Used to see most DTD declarations except those treated
+ as lexical ("document element name is ...") or which are
+ mandatory for all SAX parsers (<em>DTDHandler</em>).
+ The Object must implement <a href="ext/DeclHandler.html"
+ ><em>org.xml.sax.ext.DeclHandler</em></a>.
+ </td>
+ </tr>
+
+ <tr>
+ <td>dom-node</td>
+ <td> For "DOM Walker" style parsers, which ignore their
+ <em>parser.parse()</em> parameters, this is used to
+ specify the DOM (sub)tree being walked by the parser.
+ The Object must implement the
+ <em>org.w3c.dom.Node</em> interface.
+ </td>
+ </tr>
+
+ <tr>
+ <td>lexical-handler</td>
+ <td> Used to see some syntax events that are essential in some
+ applications: comments, CDATA delimeters, selected general
+ entity inclusions, and the start and end of the DTD
+ (and declaration of document element name).
+ The Object must implement <a href="ext/LexicalHandler.html"
+ ><em>org.xml.sax.ext.LexicalHandler</em></a>.
+ </td>
+ </tr>
+
+ <tr>
+ <td>xml-string</td>
+ <td> Readable only during a parser callback, this exposes a <b>TBS</b>
+ chunk of characters responsible for the current event. </td>
+ </tr>
+
+</table>
+
+<p> All of these standard properties are optional;
+XMLReader implementations need not support them.
+</p>
+
+</body></html>
diff --git a/external/jaxp/tests/dom/NodeType.java b/external/jaxp/tests/dom/NodeType.java
new file mode 100644
index 000000000..7dac3b7d3
--- /dev/null
+++ b/external/jaxp/tests/dom/NodeType.java
@@ -0,0 +1,73 @@
+package tests.dom;
+
+
+import org.w3c.dom.*;
+import javax.xml.parsers.*;
+import java.io.*;
+
+/**
+ * NodeType DOM test.
+ * Test that the values of Dom nodes are correct.
+ *
+ *
+ * @author <a href="mailto:arnaud.vandyck@ulg.ac.be">Arnaud Vandyck</a>
+ * @created Thu Oct 10 21:44:07 2002
+ * @version
+ */
+public class NodeType
+{
+
+ public static String[] NODETYPE =
+ {
+ "Unknow Node", "ELEMENT_NODE", "ATTRIBUTE_NODE", "TEXT_NODE",
+ "CDATA_SECTION_NODE", "ENTITY_REFERENCE_NODE", "ENTITY_NODE",
+ "PROCESSING_INSTRUCTION_NODE", "COMMENT_NODE", "DOCUMENT_NODE",
+ "DOCUMENT_TYPE_NODE", "DOCUMENT_FRAGMENT_NODE", "NOTATION_NODE"
+ };
+
+ public NodeType ()
+ {
+ }
+
+ public static void main(String[] args)
+ {
+ try
+ {
+ System.out.println( "Starting processing..." );
+
+ DocumentBuilder domManager = DocumentBuilderFactory.newInstance().newDocumentBuilder();
+
+ FileInputStream fis = new FileInputStream("tests/dom/nodetype.xml");
+ Document d = domManager.parse( fis );
+ System.out.println( "File has been passed to the processor..." );
+
+ Element root = d.getDocumentElement();
+ System.out.println( "Root tag name: " + root.getTagName() );
+
+ printChildNodes( root.getChildNodes() );
+ }
+ catch (Exception e1)
+ {
+ e1.printStackTrace();
+ }
+ }
+
+ static private void printChildNodes( NodeList list )
+ {
+ int l = list.getLength();
+ for (int i=0; i<l; i++)
+ {
+ Node node = list.item( i );
+ printNode( node );
+ printChildNodes( node.getChildNodes() );
+ }
+ }
+
+ static private void printNode( Node node )
+ {
+ System.out.println( node.getNodeName()
+ + " [" + NODETYPE[node.getNodeType()] + "]: "
+ + node.getNodeValue() );
+ }
+
+}
diff --git a/external/jaxp/tests/dom/nodetype.xml b/external/jaxp/tests/dom/nodetype.xml
new file mode 100644
index 000000000..333030d8a
--- /dev/null
+++ b/external/jaxp/tests/dom/nodetype.xml
@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="ISO-8859-1" standalone="no" ?>
+<?xml-stylesheet type="text/xsl" href="sdocbook.xsl"?>
+<!DOCTYPE article SYSTEM "file:///usr/share/sgml/docbook/dtd/xml/4.2/docbookx.dtd"
+[
+<!NOTATION wmf SYSTEM "wmf" >
+<!ENTITY g001 SYSTEM "images/example_001.wmf" NDATA wmf >
+
+<!ENTITY yo "Yooooooo">
+<!ENTITY yo2 "&yo;">
+]>
+
+<article>
+ <articleinfo>
+ <title>Titre de test</title>
+ <author>
+ <firstname>Arnaud</firstname>
+ <surname>Vandyck</surname>
+ </author>
+ </articleinfo>
+ <section>
+ <title>Test</title>
+ <para>Entite yo: &yo;</para>
+ <para>Entite yo2: &yo2;</para>
+ <para>Entite EURO: &euro;</para>
+ </section>
+</article> \ No newline at end of file