/* * ==================================================================== * Copyright (c) 2004-2012 TMate Software Ltd. All rights reserved. * * This software is licensed as described in the file COPYING, which * you should have received as part of this distribution. The terms * are also available at http://svnkit.com/license.html * If newer versions of this license are posted there, you may use a * newer version instead, at your option. * ==================================================================== */ package org.tmatesoft.svn.core.wc.xml; import java.io.IOException; import java.io.OutputStream; import java.io.OutputStreamWriter; import java.io.UnsupportedEncodingException; import java.io.Writer; import org.tmatesoft.svn.core.internal.util.SVNEncodingUtil; import org.xml.sax.Attributes; import org.xml.sax.ContentHandler; import org.xml.sax.Locator; import org.xml.sax.SAXException; /** * This implementation of <b>ContentHandler</b> can write XML contents to * a specified output stream or writer. * * @version 1.3 * @author TMate Software Ltd. * @since 1.2 */ public class SVNXMLSerializer implements ContentHandler { private Writer myWriter; private String myEol = System.getProperty("line.separator"); private boolean myCharacters = false; /** * Creates a serializer to write XML contents to the specified * output stream. * * @param os an output stream to write contents to */ public SVNXMLSerializer(final OutputStream os) { try { myWriter = new OutputStreamWriter(os, "UTF-8"); } catch (UnsupportedEncodingException e) { myWriter = new OutputStreamWriter(os); } } /** * Creates a serializer to write XML contents to the specified * writer. * * @param writer a writer to write contents to */ public SVNXMLSerializer(Writer writer) { myWriter = writer; } /** * Flushes written bytes. * * @throws IOException */ public void flush() throws IOException { myWriter.flush(); } /** * Starts xml document. * * @throws SAXException */ public void startDocument() throws SAXException { try { myWriter.write("<?xml version=\"1.0\"?>"); } catch (IOException e) { throw new SAXException(e); } } /** * Starts an xml element. * * @param namespaceURI * @param localName * @param qName * @param atts * @throws SAXException */ public void startElement(String namespaceURI, String localName, String qName, Attributes atts) throws SAXException { try { myWriter.write(myEol); myWriter.write("<"); myWriter.write(qName); for(int i = 0; i < atts.getLength(); i++) { myWriter.write(myEol); myWriter.write(" "); myWriter.write(atts.getQName(i)); myWriter.write("=\""); myWriter.write(SVNEncodingUtil.xmlEncodeAttr(atts.getValue(i))); myWriter.write("\""); } if ("against".equals(qName)) { myWriter.write("/>"); } else { myWriter.write(">"); } } catch (IOException e) { throw new SAXException(e); } } /** * Handles CData characters. * * @param ch * @param start * @param length * @throws SAXException */ public void characters(char[] ch, int start, int length) throws SAXException { myCharacters = true; try { String cdata = SVNEncodingUtil.xmlEncodeCDATA(new String(ch, start, length)); myWriter.write(cdata); } catch (IOException e) { throw new SAXException(e); } } /** * Closes the xml element. * * @param namespaceURI * @param localName * @param qName * @throws SAXException */ public void endElement(String namespaceURI, String localName, String qName) throws SAXException { if ("against".equals(qName)) { return; } try { if (!myCharacters) { myWriter.write(myEol); } myWriter.write("</"); myWriter.write(qName); myWriter.write(">"); } catch (IOException e) { throw new SAXException(e); } finally { myCharacters = false; } } /** * Writes a End Of Line marker to the output. * * @throws SAXException */ public void endDocument() throws SAXException { try { myWriter.write(myEol); } catch (IOException e) { throw new SAXException(e); } } /** * Does nothing. * * @param ch * @param start * @param length * @throws SAXException */ public void ignorableWhitespace(char[] ch, int start, int length) throws SAXException { } /** * Does nothing. * * @param prefix * @throws SAXException */ public void endPrefixMapping(String prefix) throws SAXException { } /** * Does nothing. * * @param name * @throws SAXException */ public void skippedEntity(String name) throws SAXException { } /** * Does nothing. * * @param locator */ public void setDocumentLocator(Locator locator) { } /** * Does nothing. * * @param target * @param data * @throws SAXException */ public void processingInstruction(String target, String data) throws SAXException { } /** * Does nothing. * * @param prefix * @param uri * @throws SAXException */ public void startPrefixMapping(String prefix, String uri) throws SAXException { } }