package org.exist.util.serializer; import org.exist.storage.serializers.EXistOutputKeys; import org.exist.util.serializer.json.JSONWriter; import javax.xml.transform.OutputKeys; import java.io.Writer; import java.util.Properties; /** * Common base for {@link org.exist.util.serializer.SAXSerializer} and {@link org.exist.util.serializer.DOMSerializer}. */ public abstract class AbstractSerializer { protected final static int XML_WRITER = 0; protected final static int XHTML_WRITER = 1; protected final static int TEXT_WRITER = 2; protected final static int JSON_WRITER = 3; protected final static int XHTML5_WRITER = 4; protected final static int MICRO_XML_WRITER = 5; protected final static int HTML5_WRITER = 6; protected XMLWriter writers[] = { new IndentingXMLWriter(), new XHTMLWriter(), new TEXTWriter(), new JSONWriter(), new XHTML5Writer(), new MicroXmlWriter(), new HTML5Writer() }; private final static Properties defaultProperties = new Properties(); static { defaultProperties.setProperty(OutputKeys.ENCODING, "UTF-8"); defaultProperties.setProperty(OutputKeys.INDENT, "false"); } protected Properties outputProperties; protected XMLWriter receiver; public AbstractSerializer() { super(); receiver = getDefaultWriter(); } protected XMLWriter getDefaultWriter() { return writers[XML_WRITER]; } public void setOutput(Writer writer, Properties properties) { if (properties == null) { outputProperties = defaultProperties; } else { outputProperties = properties; } final String method = outputProperties.getProperty(OutputKeys.METHOD, "xml"); final String htmlVersionProp = outputProperties.getProperty(EXistOutputKeys.HTML_VERSION, "1.0"); double htmlVersion; try { htmlVersion = Double.parseDouble(htmlVersionProp); } catch (NumberFormatException e) { htmlVersion = 1.0; } if ("xhtml".equalsIgnoreCase(method)) { if (htmlVersion < 5.0) { receiver = writers[XHTML_WRITER]; } else { receiver = writers[XHTML5_WRITER]; } } else if ("html".equals(method)) { if (htmlVersion < 5.0) { receiver = writers[XHTML_WRITER]; } else { receiver = writers[HTML5_WRITER]; } } else if("text".equalsIgnoreCase(method)) { receiver = writers[TEXT_WRITER]; } else if ("json".equalsIgnoreCase(method)) { receiver = writers[JSON_WRITER]; } else if ("xhtml5".equalsIgnoreCase(method)) { receiver = writers[XHTML5_WRITER]; } else if ("html5".equalsIgnoreCase(method)) { receiver = writers[HTML5_WRITER]; } else if("microxml".equalsIgnoreCase(method)) { receiver = writers[MICRO_XML_WRITER]; } else { receiver = writers[XML_WRITER]; } receiver.setWriter(writer); receiver.setOutputProperties(outputProperties); } public void reset() { for (XMLWriter writer : writers) { writer.reset(); } } }