Makefile.am: New file.

* external/w3c_dom/Makefile.am: New file.
	* external/w3c_dom/Makefile.in: New file.
	* external/sax/Makefile.am: New file.
	* external/sax/Makefile.in: New file.
	* external/Makefile.in: New file.
	* external/Makefile.am: New file.
	* external/README: New file from Classpath.
	* configure, aclocal.m4, Makefile.in: Rebuilt.
	* configure.ac (AC_CONFIG_FILES): Create new Makefiles.
	* Makefile.am (SUBDIRS): Added external.
	(toolexeclib_LTLIBRARIES): Removed lib-org-xml-sax.la,
	lib-org-w3c-dom.la, lib-org-ietf-gss.la.
	(BOOTCLASSPATH): New variable.
	(AM_GCJFLAGS): Use it.
	(gnu_xml_source_files): New variable.
	(libgcj_la_SOURCES): Use it.
	(libgcj_la_LDADD): Include new convenience libraries.
	(lib_org_ietf_jgss_la_SOURCES): Removed.
	(lib_org_ietf_jgss_la_DEPENDENCIES): Likewise.
	(lib_org_ietf_jgss_la_LIBADD): Likewise.
	(lib_org_w3c_dom_la_SOURCES): Removed.
	(lib_org_w3c_dom_la_DEPENDENCIES): Likewise.
	(lib_org_w3c_dom_la_LIBADD): Likewise.
	(lib_org_xml_sax_la_SOURCES): Removed.
	(lib_org_xml_sax_la_DEPENDENCIES): Likewise.
	(lib_org_xml_sax_la_LIBADD): Likewise.
	(all_java_source_files): Updated.
	(property_files): Likewise.
	(libgcj-@gcc_version@.jar): Include classes from external/.
	(javax_source_files): Updated.
	(ordinary_java_source_files): Updated.
	* javax/xml/XMLConstants.java,
	javax/xml/datatype/DatatypeConfigurationException.java,
	javax/xml/datatype/DatatypeConstants.java,
	javax/xml/datatype/DatatypeFactory.java,
	javax/xml/datatype/Duration.java,
	javax/xml/datatype/XMLGregorianCalendar.java,
	javax/xml/datatype/package.html,
	javax/xml/namespace/NamespaceContext.java,
	javax/xml/namespace/QName.java, javax/xml/namespace/package.html,
	javax/xml/parsers/DocumentBuilder.java,
	javax/xml/parsers/DocumentBuilderFactory.java,
	javax/xml/parsers/FactoryConfigurationError.java,
	javax/xml/parsers/ParserConfigurationException.java,
	javax/xml/parsers/SAXParser.java,
	javax/xml/parsers/SAXParserFactory.java,
	javax/xml/parsers/package.html,
	javax/xml/transform/ErrorListener.java,
	javax/xml/transform/OutputKeys.java,
	javax/xml/transform/Result.java, javax/xml/transform/Source.java,
	javax/xml/transform/SourceLocator.java,
	javax/xml/transform/Templates.java,
	javax/xml/transform/Transformer.java,
	javax/xml/transform/TransformerConfigurationException.java,
	javax/xml/transform/TransformerException.java,
	javax/xml/transform/TransformerFactory.java,
	javax/xml/transform/TransformerFactoryConfigurationError.java,
	javax/xml/transform/URIResolver.java,
	javax/xml/transform/package.html,
	javax/xml/transform/dom/DOMLocator.java,
	javax/xml/transform/dom/DOMResult.java,
	javax/xml/transform/dom/DOMSource.java,
	javax/xml/transform/dom/package.html,
	javax/xml/transform/sax/SAXResult.java,
	javax/xml/transform/sax/SAXSource.java,
	javax/xml/transform/sax/SAXTransformerFactory.java,
	javax/xml/transform/sax/TemplatesHandler.java,
	javax/xml/transform/sax/TransformerHandler.java,
	javax/xml/transform/sax/package.html,
	javax/xml/transform/stream/StreamResult.java,
	javax/xml/transform/stream/StreamSource.java,
	javax/xml/transform/stream/package.html,
	javax/xml/validation/Schema.java,
	javax/xml/validation/SchemaFactory.java,
	javax/xml/validation/TypeInfoProvider.java,
	javax/xml/validation/Validator.java,
	javax/xml/validation/ValidatorHandler.java,
	javax/xml/validation/package.html, javax/xml/xpath/XPath.java,
	javax/xml/xpath/XPathConstants.java,
	javax/xml/xpath/XPathException.java,
	javax/xml/xpath/XPathExpression.java,
	javax/xml/xpath/XPathExpressionException.java,
	javax/xml/xpath/XPathFactory.java,
	javax/xml/xpath/XPathFactoryConfigurationException.java,
	javax/xml/xpath/XPathFunction.java,
	javax/xml/xpath/XPathFunctionException.java,
	javax/xml/xpath/XPathFunctionResolver.java,
	javax/xml/xpath/XPathVariableResolver.java,
	javax/xml/xpath/package.html: New files, from GNU JAXP.
	* org/w3c/dom/Attr.java, org/w3c/dom/CDATASection.java,
	org/w3c/dom/CharacterData.java, org/w3c/dom/Comment.java,
	org/w3c/dom/DOMException.java, org/w3c/dom/DOMImplementation.java,
	org/w3c/dom/Document.java, org/w3c/dom/DocumentFragment.java,
	org/w3c/dom/DocumentType.java, org/w3c/dom/Element.java,
	org/w3c/dom/Entity.java, org/w3c/dom/EntityReference.java,
	org/w3c/dom/NamedNodeMap.java, org/w3c/dom/Node.java,
	org/w3c/dom/NodeList.java, org/w3c/dom/Notation.java,
	org/w3c/dom/ProcessingInstruction.java, org/w3c/dom/Text.java,
	org/w3c/dom/ranges/DocumentRange.java,
	org/w3c/dom/ranges/Range.java,
	org/w3c/dom/ranges/RangeException.java,
	org/w3c/dom/traversal/DocumentTraversal.java,
	org/w3c/dom/traversal/NodeFilter.java,
	org/w3c/dom/traversal/NodeIterator.java,
	org/w3c/dom/traversal/TreeWalker.java,
	org/xml/sax/AttributeList.java, org/xml/sax/Attributes.java,
	org/xml/sax/ContentHandler.java, org/xml/sax/DTDHandler.java,
	org/xml/sax/DocumentHandler.java, org/xml/sax/EntityResolver.java,
	org/xml/sax/ErrorHandler.java, org/xml/sax/HandlerBase.java,
	org/xml/sax/InputSource.java, org/xml/sax/Locator.java,
	org/xml/sax/Parser.java, org/xml/sax/SAXException.java,
	org/xml/sax/SAXNotRecognizedException.java,
	org/xml/sax/SAXNotSupportedException.java,
	org/xml/sax/SAXParseException.java, org/xml/sax/XMLFilter.java,
	org/xml/sax/XMLReader.java, org/xml/sax/package.html,
	org/xml/sax/ext/DeclHandler.java,
	org/xml/sax/ext/LexicalHandler.java, org/xml/sax/ext/package.html,
	org/xml/sax/helpers/AttributeListImpl.java,
	org/xml/sax/helpers/AttributesImpl.java,
	org/xml/sax/helpers/DefaultHandler.java,
	org/xml/sax/helpers/LocatorImpl.java,
	org/xml/sax/helpers/NamespaceSupport.java,
	org/xml/sax/helpers/NewInstance.java,
	org/xml/sax/helpers/ParserAdapter.java,
	org/xml/sax/helpers/ParserFactory.java,
	org/xml/sax/helpers/XMLFilterImpl.java,
	org/xml/sax/helpers/XMLReaderAdapter.java,
	org/xml/sax/helpers/XMLReaderFactory.java,
	org/xml/sax/helpers/package.html: Moved to external/.
	* external/sax/README,
	external/sax/org/xml/sax/AttributeList.java,
	external/sax/org/xml/sax/Attributes.java,
	external/sax/org/xml/sax/ContentHandler.java,
	external/sax/org/xml/sax/DTDHandler.java,
	external/sax/org/xml/sax/DocumentHandler.java,
	external/sax/org/xml/sax/EntityResolver.java,
	external/sax/org/xml/sax/ErrorHandler.java,
	external/sax/org/xml/sax/HandlerBase.java,
	external/sax/org/xml/sax/InputSource.java,
	external/sax/org/xml/sax/Locator.java,
	external/sax/org/xml/sax/Parser.java,
	external/sax/org/xml/sax/SAXException.java,
	external/sax/org/xml/sax/SAXNotRecognizedException.java,
	external/sax/org/xml/sax/SAXNotSupportedException.java,
	external/sax/org/xml/sax/SAXParseException.java,
	external/sax/org/xml/sax/XMLFilter.java,
	external/sax/org/xml/sax/XMLReader.java,
	external/sax/org/xml/sax/package.html,
	external/sax/org/xml/sax/ext/Attributes2.java,
	external/sax/org/xml/sax/ext/Attributes2Impl.java,
	external/sax/org/xml/sax/ext/DeclHandler.java,
	external/sax/org/xml/sax/ext/DefaultHandler2.java,
	external/sax/org/xml/sax/ext/EntityResolver2.java,
	external/sax/org/xml/sax/ext/LexicalHandler.java,
	external/sax/org/xml/sax/ext/Locator2.java,
	external/sax/org/xml/sax/ext/Locator2Impl.java,
	external/sax/org/xml/sax/ext/package.html,
	external/sax/org/xml/sax/helpers/AttributeListImpl.java,
	external/sax/org/xml/sax/helpers/AttributesImpl.java,
	external/sax/org/xml/sax/helpers/DefaultHandler.java,
	external/sax/org/xml/sax/helpers/LocatorImpl.java,
	external/sax/org/xml/sax/helpers/NamespaceSupport.java,
	external/sax/org/xml/sax/helpers/NewInstance.java,
	external/sax/org/xml/sax/helpers/ParserAdapter.java,
	external/sax/org/xml/sax/helpers/ParserFactory.java,
	external/sax/org/xml/sax/helpers/XMLFilterImpl.java,
	external/sax/org/xml/sax/helpers/XMLReaderAdapter.java,
	external/sax/org/xml/sax/helpers/XMLReaderFactory.java,
	external/sax/org/xml/sax/helpers/package.html,
	external/w3c_dom/COPYRIGHT.html, external/w3c_dom/README,
	external/w3c_dom/org/w3c/dom/Attr.java,
	external/w3c_dom/org/w3c/dom/CDATASection.java,
	external/w3c_dom/org/w3c/dom/CharacterData.java,
	external/w3c_dom/org/w3c/dom/Comment.java,
	external/w3c_dom/org/w3c/dom/DOMConfiguration.java,
	external/w3c_dom/org/w3c/dom/DOMError.java,
	external/w3c_dom/org/w3c/dom/DOMErrorHandler.java,
	external/w3c_dom/org/w3c/dom/DOMException.java,
	external/w3c_dom/org/w3c/dom/DOMImplementation.java,
	external/w3c_dom/org/w3c/dom/DOMImplementationList.java,
	external/w3c_dom/org/w3c/dom/DOMImplementationSource.java,
	external/w3c_dom/org/w3c/dom/DOMLocator.java,
	external/w3c_dom/org/w3c/dom/DOMStringList.java,
	external/w3c_dom/org/w3c/dom/Document.java,
	external/w3c_dom/org/w3c/dom/DocumentFragment.java,
	external/w3c_dom/org/w3c/dom/DocumentType.java,
	external/w3c_dom/org/w3c/dom/Element.java,
	external/w3c_dom/org/w3c/dom/Entity.java,
	external/w3c_dom/org/w3c/dom/EntityReference.java,
	external/w3c_dom/org/w3c/dom/NameList.java,
	external/w3c_dom/org/w3c/dom/NamedNodeMap.java,
	external/w3c_dom/org/w3c/dom/Node.java,
	external/w3c_dom/org/w3c/dom/NodeList.java,
	external/w3c_dom/org/w3c/dom/Notation.java,
	external/w3c_dom/org/w3c/dom/ProcessingInstruction.java,
	external/w3c_dom/org/w3c/dom/Text.java,
	external/w3c_dom/org/w3c/dom/TypeInfo.java,
	external/w3c_dom/org/w3c/dom/UserDataHandler.java,
	external/w3c_dom/org/w3c/dom/bootstrap/DOMImplementationRegistry.java,
	external/w3c_dom/org/w3c/dom/css/CSS2Properties.java,
	external/w3c_dom/org/w3c/dom/css/CSSCharsetRule.java,
	external/w3c_dom/org/w3c/dom/css/CSSFontFaceRule.java,
	external/w3c_dom/org/w3c/dom/css/CSSImportRule.java,
	external/w3c_dom/org/w3c/dom/css/CSSMediaRule.java,
	external/w3c_dom/org/w3c/dom/css/CSSPageRule.java,
	external/w3c_dom/org/w3c/dom/css/CSSPrimitiveValue.java,
	external/w3c_dom/org/w3c/dom/css/CSSRule.java,
	external/w3c_dom/org/w3c/dom/css/CSSRuleList.java,
	external/w3c_dom/org/w3c/dom/css/CSSStyleDeclaration.java,
	external/w3c_dom/org/w3c/dom/css/CSSStyleRule.java,
	external/w3c_dom/org/w3c/dom/css/CSSStyleSheet.java,
	external/w3c_dom/org/w3c/dom/css/CSSUnknownRule.java,
	external/w3c_dom/org/w3c/dom/css/CSSValue.java,
	external/w3c_dom/org/w3c/dom/css/CSSValueList.java,
	external/w3c_dom/org/w3c/dom/css/Counter.java,
	external/w3c_dom/org/w3c/dom/css/DOMImplementationCSS.java,
	external/w3c_dom/org/w3c/dom/css/DocumentCSS.java,
	external/w3c_dom/org/w3c/dom/css/ElementCSSInlineStyle.java,
	external/w3c_dom/org/w3c/dom/css/RGBColor.java,
	external/w3c_dom/org/w3c/dom/css/Rect.java,
	external/w3c_dom/org/w3c/dom/css/ViewCSS.java,
	external/w3c_dom/org/w3c/dom/events/DocumentEvent.java,
	external/w3c_dom/org/w3c/dom/events/Event.java,
	external/w3c_dom/org/w3c/dom/events/EventException.java,
	external/w3c_dom/org/w3c/dom/events/EventListener.java,
	external/w3c_dom/org/w3c/dom/events/EventTarget.java,
	external/w3c_dom/org/w3c/dom/events/MouseEvent.java,
	external/w3c_dom/org/w3c/dom/events/MutationEvent.java,
	external/w3c_dom/org/w3c/dom/events/UIEvent.java,
	external/w3c_dom/org/w3c/dom/html2/HTMLAnchorElement.java,
	external/w3c_dom/org/w3c/dom/html2/HTMLAppletElement.java,
	external/w3c_dom/org/w3c/dom/html2/HTMLAreaElement.java,
	external/w3c_dom/org/w3c/dom/html2/HTMLBRElement.java,
	external/w3c_dom/org/w3c/dom/html2/HTMLBaseElement.java,
	external/w3c_dom/org/w3c/dom/html2/HTMLBaseFontElement.java,
	external/w3c_dom/org/w3c/dom/html2/HTMLBodyElement.java,
	external/w3c_dom/org/w3c/dom/html2/HTMLButtonElement.java,
	external/w3c_dom/org/w3c/dom/html2/HTMLCollection.java,
	external/w3c_dom/org/w3c/dom/html2/HTMLDListElement.java,
	external/w3c_dom/org/w3c/dom/html2/HTMLDirectoryElement.java,
	external/w3c_dom/org/w3c/dom/html2/HTMLDivElement.java,
	external/w3c_dom/org/w3c/dom/html2/HTMLDocument.java,
	external/w3c_dom/org/w3c/dom/html2/HTMLElement.java,
	external/w3c_dom/org/w3c/dom/html2/HTMLFieldSetElement.java,
	external/w3c_dom/org/w3c/dom/html2/HTMLFontElement.java,
	external/w3c_dom/org/w3c/dom/html2/HTMLFormElement.java,
	external/w3c_dom/org/w3c/dom/html2/HTMLFrameElement.java,
	external/w3c_dom/org/w3c/dom/html2/HTMLFrameSetElement.java,
	external/w3c_dom/org/w3c/dom/html2/HTMLHRElement.java,
	external/w3c_dom/org/w3c/dom/html2/HTMLHeadElement.java,
	external/w3c_dom/org/w3c/dom/html2/HTMLHeadingElement.java,
	external/w3c_dom/org/w3c/dom/html2/HTMLHtmlElement.java,
	external/w3c_dom/org/w3c/dom/html2/HTMLIFrameElement.java,
	external/w3c_dom/org/w3c/dom/html2/HTMLImageElement.java,
	external/w3c_dom/org/w3c/dom/html2/HTMLInputElement.java,
	external/w3c_dom/org/w3c/dom/html2/HTMLIsIndexElement.java,
	external/w3c_dom/org/w3c/dom/html2/HTMLLIElement.java,
	external/w3c_dom/org/w3c/dom/html2/HTMLLabelElement.java,
	external/w3c_dom/org/w3c/dom/html2/HTMLLegendElement.java,
	external/w3c_dom/org/w3c/dom/html2/HTMLLinkElement.java,
	external/w3c_dom/org/w3c/dom/html2/HTMLMapElement.java,
	external/w3c_dom/org/w3c/dom/html2/HTMLMenuElement.java,
	external/w3c_dom/org/w3c/dom/html2/HTMLMetaElement.java,
	external/w3c_dom/org/w3c/dom/html2/HTMLModElement.java,
	external/w3c_dom/org/w3c/dom/html2/HTMLOListElement.java,
	external/w3c_dom/org/w3c/dom/html2/HTMLObjectElement.java,
	external/w3c_dom/org/w3c/dom/html2/HTMLOptGroupElement.java,
	external/w3c_dom/org/w3c/dom/html2/HTMLOptionElement.java,
	external/w3c_dom/org/w3c/dom/html2/HTMLOptionsCollection.java,
	external/w3c_dom/org/w3c/dom/html2/HTMLParagraphElement.java,
	external/w3c_dom/org/w3c/dom/html2/HTMLParamElement.java,
	external/w3c_dom/org/w3c/dom/html2/HTMLPreElement.java,
	external/w3c_dom/org/w3c/dom/html2/HTMLQuoteElement.java,
	external/w3c_dom/org/w3c/dom/html2/HTMLScriptElement.java,
	external/w3c_dom/org/w3c/dom/html2/HTMLSelectElement.java,
	external/w3c_dom/org/w3c/dom/html2/HTMLStyleElement.java,
	external/w3c_dom/org/w3c/dom/html2/HTMLTableCaptionElement.java,
	external/w3c_dom/org/w3c/dom/html2/HTMLTableCellElement.java,
	external/w3c_dom/org/w3c/dom/html2/HTMLTableColElement.java,
	external/w3c_dom/org/w3c/dom/html2/HTMLTableElement.java,
	external/w3c_dom/org/w3c/dom/html2/HTMLTableRowElement.java,
	external/w3c_dom/org/w3c/dom/html2/HTMLTableSectionElement.java,
	external/w3c_dom/org/w3c/dom/html2/HTMLTextAreaElement.java,
	external/w3c_dom/org/w3c/dom/html2/HTMLTitleElement.java,
	external/w3c_dom/org/w3c/dom/html2/HTMLUListElement.java,
	external/w3c_dom/org/w3c/dom/ls/DOMImplementationLS.java,
	external/w3c_dom/org/w3c/dom/ls/LSException.java,
	external/w3c_dom/org/w3c/dom/ls/LSInput.java,
	external/w3c_dom/org/w3c/dom/ls/LSLoadEvent.java,
	external/w3c_dom/org/w3c/dom/ls/LSOutput.java,
	external/w3c_dom/org/w3c/dom/ls/LSParser.java,
	external/w3c_dom/org/w3c/dom/ls/LSParserFilter.java,
	external/w3c_dom/org/w3c/dom/ls/LSProgressEvent.java,
	external/w3c_dom/org/w3c/dom/ls/LSResourceResolver.java,
	external/w3c_dom/org/w3c/dom/ls/LSSerializer.java,
	external/w3c_dom/org/w3c/dom/ls/LSSerializerFilter.java,
	external/w3c_dom/org/w3c/dom/ranges/DocumentRange.java,
	external/w3c_dom/org/w3c/dom/ranges/Range.java,
	external/w3c_dom/org/w3c/dom/ranges/RangeException.java,
	external/w3c_dom/org/w3c/dom/stylesheets/DocumentStyle.java,
	external/w3c_dom/org/w3c/dom/stylesheets/LinkStyle.java,
	external/w3c_dom/org/w3c/dom/stylesheets/MediaList.java,
	external/w3c_dom/org/w3c/dom/stylesheets/StyleSheet.java,
	external/w3c_dom/org/w3c/dom/stylesheets/StyleSheetList.java,
	external/w3c_dom/org/w3c/dom/traversal/DocumentTraversal.java,
	external/w3c_dom/org/w3c/dom/traversal/NodeFilter.java,
	external/w3c_dom/org/w3c/dom/traversal/NodeIterator.java,
	external/w3c_dom/org/w3c/dom/traversal/TreeWalker.java,
	external/w3c_dom/org/w3c/dom/views/AbstractView.java,
	external/w3c_dom/org/w3c/dom/views/DocumentView.java,
	external/w3c_dom/org/w3c/dom/xpath/XPathEvaluator.java,
	external/w3c_dom/org/w3c/dom/xpath/XPathException.java,
	external/w3c_dom/org/w3c/dom/xpath/XPathExpression.java,
	external/w3c_dom/org/w3c/dom/xpath/XPathNSResolver.java,
	external/w3c_dom/org/w3c/dom/xpath/XPathNamespace.java,
	external/w3c_dom/org/w3c/dom/xpath/XPathResult.java: New files
	from Classpath.

From-SVN: r94577
This commit is contained in:
Tom Tromey
2005-02-02 00:42:32 +00:00
committed by Tom Tromey
parent c1c5b5e383
commit 9ecd03471f
453 changed files with 88593 additions and 6760 deletions
+306
View File
@@ -0,0 +1,306 @@
/* DoParse.java --
Copyright (C) 1999,2000,2001 Free Software Foundation, Inc.
This file is part of GNU Classpath.
GNU Classpath 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, or (at your option)
any later version.
GNU Classpath 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 GNU Classpath; see the file COPYING. If not, write to the
Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
02111-1307 USA.
Linking this library statically or dynamically with other modules is
making a combined work based on this library. Thus, the terms and
conditions of the GNU General Public License cover the whole
combination.
As a special exception, the copyright holders of this library give you
permission to link this library with independent modules to produce an
executable, regardless of the license terms of these independent
modules, and to copy and distribute the resulting executable under
terms of your choice, provided that you also meet, for each linked
independent module, the terms and conditions of the license of that
module. An independent module is a module which is not derived from
or based on this library. If you modify this library, you may extend
this exception to your version of the library, but you are not
obligated to do so. If you do not wish to do so, delete this
exception statement from your version. */
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;
/**
* 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
*/
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 ();
}
}
+804
View File
@@ -0,0 +1,804 @@
/* DomParser.java --
Copyright (C) 1999,2000,2001 Free Software Foundation, Inc.
This file is part of GNU Classpath.
GNU Classpath 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, or (at your option)
any later version.
GNU Classpath 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 GNU Classpath; see the file COPYING. If not, write to the
Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
02111-1307 USA.
Linking this library statically or dynamically with other modules is
making a combined work based on this library. Thus, the terms and
conditions of the GNU General Public License cover the whole
combination.
As a special exception, the copyright holders of this library give you
permission to link this library with independent modules to produce an
executable, regardless of the license terms of these independent
modules, and to copy and distribute the resulting executable under
terms of your choice, provided that you also meet, for each linked
independent module, the terms and conditions of the license of that
module. An independent module is a module which is not derived from
or based on this library. If you modify this library, you may extend
this exception to your version of the library, but you are not
obligated to do so. If you do not wish to do so, delete this
exception statement from your version. */
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
*/
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 ());
}
}
}
+263
View File
@@ -0,0 +1,263 @@
/* Resolver.java --
Copyright (C) 1999,2000,2001 Free Software Foundation, Inc.
This file is part of GNU Classpath.
GNU Classpath 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, or (at your option)
any later version.
GNU Classpath 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 GNU Classpath; see the file COPYING. If not, write to the
Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
02111-1307 USA.
Linking this library statically or dynamically with other modules is
making a combined work based on this library. Thus, the terms and
conditions of the GNU General Public License cover the whole
combination.
As a special exception, the copyright holders of this library give you
permission to link this library with independent modules to produce an
executable, regardless of the license terms of these independent
modules, and to copy and distribute the resulting executable under
terms of your choice, provided that you also meet, for each linked
independent module, the terms and conditions of the license of that
module. An independent module is a module which is not derived from
or based on this library. If you modify this library, you may extend
this exception to your version of the library, but you are not
obligated to do so. If you do not wish to do so, delete this
exception statement from your version. */
package gnu.xml.util;
import java.io.*;
import java.util.Dictionary;
import java.util.Hashtable;
import org.xml.sax.*;
/**
* 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
*/
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;
}
}
@@ -0,0 +1,675 @@
/* SAXNullTransformerFactory.java --
Copyright (C) 2001 Free Software Foundation, Inc.
This file is part of GNU Classpath.
GNU Classpath 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, or (at your option)
any later version.
GNU Classpath 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 GNU Classpath; see the file COPYING. If not, write to the
Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
02111-1307 USA.
Linking this library statically or dynamically with other modules is
making a combined work based on this library. Thus, the terms and
conditions of the GNU General Public License cover the whole
combination.
As a special exception, the copyright holders of this library give you
permission to link this library with independent modules to produce an
executable, regardless of the license terms of these independent
modules, and to copy and distribute the resulting executable under
terms of your choice, provided that you also meet, for each linked
independent module, the terms and conditions of the license of that
module. An independent module is a module which is not derived from
or based on this library. If you modify this library, you may extend
this exception to your version of the library, but you are not
obligated to do so. If you do not wish to do so, delete this
exception statement from your version. */
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
*/
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)
;
}
public void setFeature(String name, boolean value)
throws TransformerConfigurationException
{
throw new TransformerConfigurationException(name);
}
/** 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;
}
}
}
}
File diff suppressed because it is too large Load Diff
+112
View File
@@ -0,0 +1,112 @@
/* XHTMLWriter.java --
Copyright (C) 1999,2000,2001 Free Software Foundation, Inc.
This file is part of GNU Classpath.
GNU Classpath 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, or (at your option)
any later version.
GNU Classpath 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 GNU Classpath; see the file COPYING. If not, write to the
Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
02111-1307 USA.
Linking this library statically or dynamically with other modules is
making a combined work based on this library. Thus, the terms and
conditions of the GNU General Public License cover the whole
combination.
As a special exception, the copyright holders of this library give you
permission to link this library with independent modules to produce an
executable, regardless of the license terms of these independent
modules, and to copy and distribute the resulting executable under
terms of your choice, provided that you also meet, for each linked
independent module, the terms and conditions of the license of that
module. An independent module is a module which is not derived from
or based on this library. If you modify this library, you may extend
this exception to your version of the library, but you are not
obligated to do so. If you do not wish to do so, delete this
exception statement from your version. */
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
*/
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);
}
}
File diff suppressed because it is too large Load Diff
+20
View File
@@ -0,0 +1,20 @@
<!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 The Free Software Foundation, Inc.
*/
-->
<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>