XMLFormatter.java revision 57225d5996f653cf9dd7ef95a62d8829832d219a
1/*******************************************************************************
2 * Copyright (c) 2009, 2010 Mountainminds GmbH & Co. KG and Contributors
3 * All rights reserved. This program and the accompanying materials
4 * are made available under the terms of the Eclipse Public License v1.0
5 * which accompanies this distribution, and is available at
6 * http://www.eclipse.org/legal/epl-v10.html
7 *
8 * Contributors:
9 *    Brock Janiczak -initial API and implementation
10 *
11 * $Id: $
12 *******************************************************************************/
13package org.jacoco.report.xml;
14
15import java.io.IOException;
16import java.util.Collection;
17import java.util.List;
18
19import org.jacoco.core.analysis.ICoverageNode;
20import org.jacoco.core.data.ExecutionData;
21import org.jacoco.core.data.SessionInfo;
22import org.jacoco.report.IReportFormatter;
23import org.jacoco.report.IReportVisitor;
24import org.jacoco.report.ISingleReportOutput;
25
26/**
27 * Report formatter that creates a single XML file for a coverage session
28 *
29 * @author Brock Janiczak
30 * @version $Revision: $
31 */
32public class XMLFormatter implements IReportFormatter {
33
34	private static final String PUBID = "-//JACOCO//DTD Report 1.0//EN";
35
36	private static final String SYSTEM = "report.dtd";
37
38	private ISingleReportOutput output;
39
40	private String outputEncoding = "UTF-8";
41
42	public IReportVisitor createReportVisitor(final ICoverageNode rootNode,
43			final List<SessionInfo> sessionInfos,
44			final Collection<ExecutionData> executionData) throws IOException {
45
46		if (output == null) {
47			throw new IllegalStateException("No report output set.");
48		}
49		final XMLElement root = new XMLDocument("report", PUBID, SYSTEM,
50				outputEncoding, true, output.createFile());
51		return new XMLReportNodeHandler(root, rootNode) {
52			@Override
53			protected void insertElementsBefore(final XMLElement element)
54					throws IOException {
55				writeSessionInfos(element, sessionInfos);
56			}
57		};
58	}
59
60	private void writeSessionInfos(final XMLElement root,
61			final List<SessionInfo> infos) throws IOException {
62		for (final SessionInfo i : infos) {
63			final XMLElement sessioninfo = root.element("sessioninfo");
64			sessioninfo.attr("id", i.getId());
65			sessioninfo.attr("start", i.getStartTimeStamp());
66			sessioninfo.attr("dump", i.getDumpTimeStamp());
67		}
68	}
69
70	/**
71	 * Sets the report output callback for this report formatter. This is a
72	 * mandatory property.
73	 *
74	 * @param output
75	 *            report output
76	 */
77	public void setReportOutput(final ISingleReportOutput output) {
78		this.output = output;
79	}
80
81	/**
82	 * Sets the encoding used for generated XML document. Default is UTF-8.
83	 *
84	 * @param outputEncoding
85	 *            XML output encoding
86	 */
87	public void setOutputEncoding(final String outputEncoding) {
88		this.outputEncoding = outputEncoding;
89	}
90
91}
92