/* * Copyright (c) 2004-2014, Willem Cazander * All rights reserved. * * Redistribution and use in source and binary forms, with or without modification, are permitted provided * that the following conditions are met: * * * Redistributions of source code must retain the above copyright notice, this list of conditions and the * following disclaimer. * * 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. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY * EXPRESS 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 COPYRIGHT HOLDER OR 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. */ package org.x4o.sax3; import java.io.Closeable; import java.io.IOException; import java.util.Objects; import org.x4o.sax3.io.ContentCloseable; import org.x4o.sax3.io.ContentWriter; import org.x4o.sax3.io.SAX3XMLConstants; import org.xml.sax.Attributes; import org.xml.sax.SAXException; import org.xml.sax.helpers.AttributesImpl; /** * ContentWriterXmlTag can write enum based xml events. * * @author Willem Cazander * @version 1.0 May 3, 2013 * @param The enum for the XML tag values. * @param The tag writer to output to. */ public class SAX3WriterEnum,TAG_WRITER extends ContentWriter> implements SAX3WriterEnumHammer, Closeable { private final Attributes EMPTY_ATTRIBUTES = new AttributesImpl(); private final TAG_WRITER contentWriter; private final String tagNamespaceUri; private final String tagNamespacePrefix; public SAX3WriterEnum(TAG_WRITER contentWriter) { this(contentWriter, SAX3XMLConstants.NULL_NS_URI, SAX3XMLConstants.NULL_NS_URI); } public SAX3WriterEnum(TAG_WRITER contentWriter, String tagNamespaceUri, String tagNamespacePrefix) { this.contentWriter = Objects.requireNonNull(contentWriter, "Can't create wrapper on null ContentWriter"); this.tagNamespaceUri = Objects.requireNonNull(tagNamespaceUri, "Can't create wrapper with null tagNamespaceUri"); this.tagNamespacePrefix = Objects.requireNonNull(tagNamespacePrefix, "Can't create wrapper with null tagNamespacePrefix"); } @Override public void close() throws IOException { contentWriter.close(); } public TAG_WRITER getContentWriterWrapped() { return contentWriter; } public String getTagNamespaceUri() { return tagNamespaceUri; } public void startDocument() throws IOException { try { contentWriter.startDocument(); contentWriter.startPrefixMapping(tagNamespacePrefix, getTagNamespaceUri()); } catch (SAXException e) { throw new IOException(e); } } public void endDocument() throws IOException { try { contentWriter.endDocument(); } catch (SAXException e) { throw new IOException(e); } } public ContentCloseable printTag(TAG tag) throws IOException { return printTag(tag, EMPTY_ATTRIBUTES); } public ContentCloseable printTag(TAG tag, Attributes atts) throws IOException { printTagStart(tag, atts); return () -> printTagEnd(tag); } public void printTagStartEnd(TAG tag, Attributes atts) throws IOException { printTagStart(tag, atts); printTagEnd(tag); } public void printTagStartEnd(TAG tag) throws IOException { printTagStart(tag); printTagEnd(tag); } public void printTagStart(TAG tag) throws IOException { printTagStart(tag, EMPTY_ATTRIBUTES); } public void printTagStart(TAG tag, Attributes atts) throws IOException { try { contentWriter.startElement(getTagNamespaceUri(), toTagString(tag), "", atts); } catch (SAXException e) { throw new IOException(e); } } public void printTagEnd(TAG tag) throws IOException { try { contentWriter.endElement(getTagNamespaceUri(),toTagString(tag) , ""); } catch (SAXException e) { throw new IOException(e); } } private String toTagString(TAG tag) { String result = tag.name(); if (result.startsWith("_")) { result = result.substring(1); // remove _ } return result; } public void printTagCharacters(TAG tag, String text) throws IOException { printTagStart(tag); if (text == null) { text = " "; } printCharacters(text); printTagEnd(tag); } public void printCharacters(String text) throws IOException { try { contentWriter.characters(text); } catch (SAXException e) { throw new IOException(e); } } public void printComment(String text) throws IOException { try { contentWriter.comment(text); } catch (SAXException e) { throw new IOException(e); } } }