1e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov/*******************************************************************************
2398ee59bebad6835dab57b60157eff16d511709eMarc R. Hoffmann * Copyright (c) 2009, 2015 Mountainminds GmbH & Co. KG and Contributors
3e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov * All rights reserved. This program and the accompanying materials
4e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov * are made available under the terms of the Eclipse Public License v1.0
5e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov * which accompanies this distribution, and is available at
6e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov * http://www.eclipse.org/legal/epl-v10.html
7e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov *
8e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov * Contributors:
9e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov *    Brock Janiczak - initial API and implementation
10e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov *    Marc R. Hoffmann - generalized structure, line info
11e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov *
12e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov *******************************************************************************/
13e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikovpackage org.jacoco.report.internal.xml;
14e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov
15e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikovimport java.io.IOException;
16e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov
17e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikovimport org.jacoco.core.analysis.IBundleCoverage;
18e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikovimport org.jacoco.report.ISourceFileLocator;
19e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikovimport org.jacoco.report.internal.AbstractGroupVisitor;
20e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov
21e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov/**
22e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov * A {@link org.jacoco.report.IReportGroupVisitor} that transforms the report
23e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov * structure into XML elements.
24e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov */
25e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikovpublic class XMLGroupVisitor extends AbstractGroupVisitor {
26e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov
27e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov	/** XML element of this group */
28e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov	protected final XMLElement element;
29e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov
30e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov	/**
31e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov	 * New handler for a group with the given name.
32e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov	 *
33e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov	 * @param element
34e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov	 *            XML-Element representing this coverage node. The start tag
35e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov	 *            must not be closed yet to allow adding additional attributes.
36e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov	 * @param name
37e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov	 *            name of the group
38e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov	 * @throws IOException
39e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov	 *             in case of problems with the underlying writer
40e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov	 */
41e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov	public XMLGroupVisitor(final XMLElement element, final String name)
42e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov			throws IOException {
43e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov		super(name);
44e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov		this.element = element;
45e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov	}
46e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov
47e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov	@Override
48e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov	protected void handleBundle(final IBundleCoverage bundle,
49e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov			final ISourceFileLocator locator) throws IOException {
50e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov		final XMLElement child = createChild(bundle.getName());
51e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov		XMLCoverageWriter.writeBundle(bundle, child);
52e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov	}
53e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov
54e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov	@Override
55e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov	protected AbstractGroupVisitor handleGroup(final String name)
56e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov			throws IOException {
57e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov		final XMLElement child = createChild(name);
58e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov		return new XMLGroupVisitor(child, name);
59e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov	}
60e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov
61e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov	@Override
62e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov	protected void handleEnd() throws IOException {
63e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov		XMLCoverageWriter.writeCounters(total, element);
64e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov	}
65e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov
66e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov	private XMLElement createChild(final String name) throws IOException {
67e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov		return XMLCoverageWriter.createChild(element, "group", name);
68e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov	}
69e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov
70e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov}
71