/******************************************************************************* * Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * * Contributors: * Marc R. Hoffmann - initial API and implementation * *******************************************************************************/ package org.jacoco.report.internal.xml; import static java.lang.String.format; import java.io.IOException; import java.io.OutputStream; import java.io.OutputStreamWriter; import java.io.Writer; /** * Root element of an XML document. Each instance represents a separate output * document. * * @see XMLElement */ public class XMLDocument extends XMLElement { /** XML header template */ private static final String HEADER = "<?xml version=\"1.0\" encoding=\"%s\"?>"; /** XML header template for standalone documents */ private static final String HEADER_STANDALONE = "<?xml version=\"1.0\" encoding=\"%s\" standalone=\"yes\"?>"; /** DOCTYPE declaration template */ private static final String DOCTYPE = "<!DOCTYPE %s PUBLIC \"%s\" \"%s\">"; /** * Writes a new document to the given writer. The document might contain a * document type declaration. * * @param rootnode * name of the root node * @param pubId * optional doctype identifier or <code>null</code> * @param system * system reference, required if doctype is given * @param encoding * encoding that will be specified in the header * @param standalone * <code>true</code> if this is a standalone document * @param writer * writer for content output * @throws IOException * in case of problems with the writer */ public XMLDocument(final String rootnode, final String pubId, final String system, final String encoding, final boolean standalone, final Writer writer) throws IOException { super(writer, rootnode); writeHeader(rootnode, pubId, system, encoding, standalone, writer); beginOpenTag(); } /** * Writes a new document to the given binary stream. The document might * contain a document type declaration. * * @param rootnode * name of the root node * @param pubId * optional doctype identifier or <code>null</code> * @param system * system reference, required if doctype is given * @param encoding * encoding of the XML document * @param standalone * <code>true</code> if this is a standalone document * @param output * output for content output * @throws IOException * in case of problems with the writer */ public XMLDocument(final String rootnode, final String pubId, final String system, final String encoding, final boolean standalone, final OutputStream output) throws IOException { this(rootnode, pubId, system, encoding, standalone, new OutputStreamWriter(output, encoding)); } @Override public void close() throws IOException { super.close(); writer.close(); } private static void writeHeader(final String rootnode, final String pubId, final String system, final String encoding, final boolean standalone, final Writer writer) throws IOException { if (standalone) { writer.write(format(HEADER_STANDALONE, encoding)); } else { writer.write(format(HEADER, encoding)); } if (pubId != null) { writer.write(format(DOCTYPE, rootnode, pubId, system)); } } }