/* * The Apache Software License, Version 1.1 * * * Copyright (c) 1999-2002 The Apache Software Foundation. All rights * reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the * distribution. * * 3. The end-user documentation included with the redistribution, * if any, must include the following acknowledgment: * "This product includes software developed by the * Apache Software Foundation (http://www.apache.org/)." * Alternately, this acknowledgment may appear in the software itself, * if and wherever such third-party acknowledgments normally appear. * * 4. The names "Xerces" and "Apache Software Foundation" must * not be used to endorse or promote products derived from this * software without prior written permission. For written * permission, please contact apache@apache.org. * * 5. Products derived from this software may not be called "Apache", * nor may "Apache" appear in their name, without prior written * permission of the Apache Software Foundation. * * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * ==================================================================== * * This software consists of voluntary contributions made by many * individuals on behalf of the Apache Software Foundation and was * originally based on software copyright (c) 1999, International * Business Machines, Inc., http://www.apache.org. For more * information on the Apache Software Foundation, please see * . */ import java.io.OutputStream; import java.io.OutputStreamWriter; import java.io.PrintWriter; import java.io.UnsupportedEncodingException; import org.xml.sax.Attributes; import org.xml.sax.SAXException; import org.xml.sax.SAXNotRecognizedException; import org.xml.sax.SAXNotSupportedException; import org.xml.sax.SAXParseException; import org.xml.sax.ext.LexicalHandler; import org.xml.sax.helpers.DefaultHandler; import org.xml.sax.helpers.ParserAdapter; import javax.xml.parsers.SAXParserFactory; import javax.xml.parsers.SAXParser; import javax.xml.parsers.ParserConfigurationException; /** * A sample SAX2 writer. This sample program illustrates how to * register a SAX2 ContentHandler and receive the callbacks in * order to print a document that is parsed. * * @author Andy Clark, IBM * * @version $Id: Writer.java,v 1.7 2002/05/07 10:47:48 andyc Exp $ */ public class Writer extends DefaultHandler implements LexicalHandler { // // Data // /** Print writer. */ protected PrintWriter fOut; /** Canonical output. */ protected boolean fCanonical; /** Element depth. */ protected int fElementDepth; // // Constructors // /** Default constructor. */ public Writer() { try { setOutput(System.out, "UTF8"); } catch (Exception e) { } } // () // // Public methods // /** Sets whether output is canonical. */ public void setCanonical(boolean canonical) { fCanonical = canonical; } // setCanonical(boolean) /** Sets the output stream for printing. */ public void setOutput(OutputStream stream, String encoding) throws UnsupportedEncodingException { if (encoding == null) { encoding = "UTF8"; } java.io.Writer writer = new OutputStreamWriter(stream, encoding); fOut = new PrintWriter(writer); } // setOutput(OutputStream,String) /** Sets the output writer. */ public void setOutput(java.io.Writer writer) { fOut = writer instanceof PrintWriter ? (PrintWriter)writer : new PrintWriter(writer); } // setOutput(java.io.Writer) // // ContentHandler methods // /** Start document. */ public void startDocument() throws SAXException { fElementDepth = 0; if (!fCanonical) { fOut.println(""); fOut.flush(); } } // startDocument() /** Processing instruction. */ public void processingInstruction(String target, String data) throws SAXException { if (fElementDepth > 0) { fOut.print(" 0) { fOut.print(' '); fOut.print(data); } fOut.print("?>"); fOut.flush(); } } // processingInstruction(String,String) /** Start element. */ public void startElement(String uri, String local, String raw, Attributes attrs) throws SAXException { fElementDepth++; fOut.print('<'); fOut.print(raw); if (attrs != null) { int len = attrs.getLength(); for (int i = 0; i < len; i++) { fOut.print(' '); fOut.print(attrs.getQName(i)); fOut.print("=\""); normalizeAndPrint(attrs.getValue(i)); fOut.print('"'); } } fOut.print('>'); fOut.flush(); } // startElement(String,String,String,Attributes) /** Characters. */ public void characters(char ch[], int start, int length) throws SAXException { normalizeAndPrint(ch, start, length); fOut.flush(); } // characters(char[],int,int); /** Ignorable whitespace. */ public void ignorableWhitespace(char ch[], int start, int length) throws SAXException { characters(ch, start, length); fOut.flush(); } // ignorableWhitespace(char[],int,int); /** End element. */ public void endElement(String uri, String local, String raw) throws SAXException { fElementDepth--; fOut.print("'); fOut.flush(); } // endElement(String) // // ErrorHandler methods // /** Warning. */ public void warning(SAXParseException ex) throws SAXException { printError("Warning", ex); } // warning(SAXParseException) /** Error. */ public void error(SAXParseException ex) throws SAXException { printError("Error", ex); } // error(SAXParseException) /** Fatal error. */ public void fatalError(SAXParseException ex) throws SAXException { printError("Fatal Error", ex); throw ex; } // fatalError(SAXParseException) // // LexicalHandler methods // /** Start DTD. */ public void startDTD(String name, String publicId, String systemId) throws SAXException { } // startDTD(String,String,String) /** End DTD. */ public void endDTD() throws SAXException { } // endDTD() /** Start entity. */ public void startEntity(String name) throws SAXException { } // startEntity(String) /** End entity. */ public void endEntity(String name) throws SAXException { } // endEntity(String) /** Start CDATA section. */ public void startCDATA() throws SAXException { } // startCDATA() /** End CDATA section. */ public void endCDATA() throws SAXException { } // endCDATA() /** Comment. */ public void comment(char ch[], int start, int length) throws SAXException { if (!fCanonical && fElementDepth > 0) { fOut.print(""); fOut.flush(); } } // comment(char[],int,int) // // Protected methods // /** Normalizes and prints the given string. */ protected void normalizeAndPrint(String s) { int len = (s != null) ? s.length() : 0; for (int i = 0; i < len; i++) { char c = s.charAt(i); normalizeAndPrint(c); } } // normalizeAndPrint(String) /** Normalizes and prints the given array of characters. */ protected void normalizeAndPrint(char[] ch, int offset, int length) { for (int i = 0; i < length; i++) { normalizeAndPrint(ch[offset + i]); } } // normalizeAndPrint(char[],int,int) /** Normalizes and print the given character. */ protected void normalizeAndPrint(char c) { switch (c) { case '<': { fOut.print("<"); break; } case '>': { fOut.print(">"); break; } case '&': { fOut.print("&"); break; } case '"': { fOut.print("""); break; } case '\r': case '\n': { if (fCanonical) { fOut.print("&#"); fOut.print(Integer.toString(c)); fOut.print(';'); break; } // else, default print char } default: { fOut.print(c); } } } // normalizeAndPrint(char) /** Prints the error message. */ protected void printError(String type, SAXParseException ex) { System.err.print("["); System.err.print(type); System.err.print("] "); String systemId = ex.getSystemId(); if (systemId != null) { int index = systemId.lastIndexOf('/'); if (index != -1) systemId = systemId.substring(index + 1); System.err.print(systemId); } System.err.print(':'); System.err.print(ex.getLineNumber()); System.err.print(':'); System.err.print(ex.getColumnNumber()); System.err.print(": "); System.err.print(ex.getMessage()); System.err.println(); System.err.flush(); } // printError(String,SAXParseException) } // class Writer