1d850ed49b22d2a0c84a3b317acec8df7e7159016Marc R. Hoffmann/*******************************************************************************
2d850ed49b22d2a0c84a3b317acec8df7e7159016Marc R. Hoffmann * Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
3d850ed49b22d2a0c84a3b317acec8df7e7159016Marc R. Hoffmann * All rights reserved. This program and the accompanying materials
4d850ed49b22d2a0c84a3b317acec8df7e7159016Marc R. Hoffmann * are made available under the terms of the Eclipse Public License v1.0
5d850ed49b22d2a0c84a3b317acec8df7e7159016Marc R. Hoffmann * which accompanies this distribution, and is available at
6d850ed49b22d2a0c84a3b317acec8df7e7159016Marc R. Hoffmann * http://www.eclipse.org/legal/epl-v10.html
7d850ed49b22d2a0c84a3b317acec8df7e7159016Marc R. Hoffmann *
8d850ed49b22d2a0c84a3b317acec8df7e7159016Marc R. Hoffmann * Contributors:
9d850ed49b22d2a0c84a3b317acec8df7e7159016Marc R. Hoffmann *    Marc R. Hoffmann - initial API and implementation
10d850ed49b22d2a0c84a3b317acec8df7e7159016Marc R. Hoffmann *
11d850ed49b22d2a0c84a3b317acec8df7e7159016Marc R. Hoffmann *******************************************************************************/
12d850ed49b22d2a0c84a3b317acec8df7e7159016Marc R. Hoffmannpackage org.jacoco.cli.internal;
13d850ed49b22d2a0c84a3b317acec8df7e7159016Marc R. Hoffmann
14d850ed49b22d2a0c84a3b317acec8df7e7159016Marc R. Hoffmannimport java.io.File;
15d850ed49b22d2a0c84a3b317acec8df7e7159016Marc R. Hoffmannimport java.io.FileOutputStream;
16d850ed49b22d2a0c84a3b317acec8df7e7159016Marc R. Hoffmannimport java.io.IOException;
17d850ed49b22d2a0c84a3b317acec8df7e7159016Marc R. Hoffmannimport java.util.List;
18d850ed49b22d2a0c84a3b317acec8df7e7159016Marc R. Hoffmann
19d850ed49b22d2a0c84a3b317acec8df7e7159016Marc R. Hoffmannimport org.jacoco.cli.internal.commands.AllCommands;
20d850ed49b22d2a0c84a3b317acec8df7e7159016Marc R. Hoffmannimport org.jacoco.report.internal.xml.XMLDocument;
21d850ed49b22d2a0c84a3b317acec8df7e7159016Marc R. Hoffmannimport org.jacoco.report.internal.xml.XMLElement;
22d850ed49b22d2a0c84a3b317acec8df7e7159016Marc R. Hoffmannimport org.kohsuke.args4j.spi.OptionHandler;
23d850ed49b22d2a0c84a3b317acec8df7e7159016Marc R. Hoffmann
24d850ed49b22d2a0c84a3b317acec8df7e7159016Marc R. Hoffmann/**
25d850ed49b22d2a0c84a3b317acec8df7e7159016Marc R. Hoffmann * Internal utility to dump all command descriptions as XML.
26d850ed49b22d2a0c84a3b317acec8df7e7159016Marc R. Hoffmann */
27f2c89c4f098baddf9ec689a6d839c2d8a8120b84Marc R. Hoffmannpublic final class XmlDocumentation {
28f2c89c4f098baddf9ec689a6d839c2d8a8120b84Marc R. Hoffmann
29f2c89c4f098baddf9ec689a6d839c2d8a8120b84Marc R. Hoffmann	private XmlDocumentation() {
30f2c89c4f098baddf9ec689a6d839c2d8a8120b84Marc R. Hoffmann	}
31d850ed49b22d2a0c84a3b317acec8df7e7159016Marc R. Hoffmann
32d850ed49b22d2a0c84a3b317acec8df7e7159016Marc R. Hoffmann	private static void writeCommand(final Command command,
33d850ed49b22d2a0c84a3b317acec8df7e7159016Marc R. Hoffmann			final XMLElement parent) throws IOException {
34d850ed49b22d2a0c84a3b317acec8df7e7159016Marc R. Hoffmann		final CommandParser parser = new CommandParser(command);
35d850ed49b22d2a0c84a3b317acec8df7e7159016Marc R. Hoffmann		final XMLElement element = parent.element("command");
36d850ed49b22d2a0c84a3b317acec8df7e7159016Marc R. Hoffmann		element.attr("name", command.name());
37d850ed49b22d2a0c84a3b317acec8df7e7159016Marc R. Hoffmann		element.element("usage").text(command.usage(parser));
38d850ed49b22d2a0c84a3b317acec8df7e7159016Marc R. Hoffmann		element.element("description").text(command.description());
39d850ed49b22d2a0c84a3b317acec8df7e7159016Marc R. Hoffmann		writeOptions(element, parser.getArguments());
40d850ed49b22d2a0c84a3b317acec8df7e7159016Marc R. Hoffmann		writeOptions(element, parser.getOptions());
41d850ed49b22d2a0c84a3b317acec8df7e7159016Marc R. Hoffmann	}
42d850ed49b22d2a0c84a3b317acec8df7e7159016Marc R. Hoffmann
43d850ed49b22d2a0c84a3b317acec8df7e7159016Marc R. Hoffmann	private static void writeOptions(final XMLElement parent,
44d850ed49b22d2a0c84a3b317acec8df7e7159016Marc R. Hoffmann			@SuppressWarnings("rawtypes") final List<OptionHandler> list)
45d850ed49b22d2a0c84a3b317acec8df7e7159016Marc R. Hoffmann			throws IOException {
46d850ed49b22d2a0c84a3b317acec8df7e7159016Marc R. Hoffmann		for (final OptionHandler<?> o : list) {
47d850ed49b22d2a0c84a3b317acec8df7e7159016Marc R. Hoffmann			final XMLElement optionNode = parent.element("option");
48d850ed49b22d2a0c84a3b317acec8df7e7159016Marc R. Hoffmann			optionNode.attr("required", String.valueOf(o.option.required()));
491b2859f2e96d7d45c9f43d5a2e3bf91ff595488cMarc R. Hoffmann			optionNode.attr("multiple",
501b2859f2e96d7d45c9f43d5a2e3bf91ff595488cMarc R. Hoffmann					String.valueOf(o.setter.isMultiValued()));
51d850ed49b22d2a0c84a3b317acec8df7e7159016Marc R. Hoffmann			optionNode.element("usage").text(o.getNameAndMeta(null));
52d850ed49b22d2a0c84a3b317acec8df7e7159016Marc R. Hoffmann			optionNode.element("description").text(o.option.usage());
53d850ed49b22d2a0c84a3b317acec8df7e7159016Marc R. Hoffmann		}
54d850ed49b22d2a0c84a3b317acec8df7e7159016Marc R. Hoffmann	}
55d850ed49b22d2a0c84a3b317acec8df7e7159016Marc R. Hoffmann
56d850ed49b22d2a0c84a3b317acec8df7e7159016Marc R. Hoffmann	/**
57d850ed49b22d2a0c84a3b317acec8df7e7159016Marc R. Hoffmann	 * Called during the build process.
58d850ed49b22d2a0c84a3b317acec8df7e7159016Marc R. Hoffmann	 *
59d850ed49b22d2a0c84a3b317acec8df7e7159016Marc R. Hoffmann	 * @param args
60f2c89c4f098baddf9ec689a6d839c2d8a8120b84Marc R. Hoffmann	 *            exactly one argument expected with the target location
61d850ed49b22d2a0c84a3b317acec8df7e7159016Marc R. Hoffmann	 * @throws IOException
62f2c89c4f098baddf9ec689a6d839c2d8a8120b84Marc R. Hoffmann	 *             if XML document cannot be written
63d850ed49b22d2a0c84a3b317acec8df7e7159016Marc R. Hoffmann	 */
64d850ed49b22d2a0c84a3b317acec8df7e7159016Marc R. Hoffmann	public static void main(final String... args) throws IOException {
65d850ed49b22d2a0c84a3b317acec8df7e7159016Marc R. Hoffmann		final File file = new File(args[0]);
66d850ed49b22d2a0c84a3b317acec8df7e7159016Marc R. Hoffmann		file.getParentFile().mkdirs();
67d850ed49b22d2a0c84a3b317acec8df7e7159016Marc R. Hoffmann
68d850ed49b22d2a0c84a3b317acec8df7e7159016Marc R. Hoffmann		final XMLElement root = new XMLDocument("documentation", null, null,
69d850ed49b22d2a0c84a3b317acec8df7e7159016Marc R. Hoffmann				"UTF-8", true, new FileOutputStream(file));
70d850ed49b22d2a0c84a3b317acec8df7e7159016Marc R. Hoffmann
71d850ed49b22d2a0c84a3b317acec8df7e7159016Marc R. Hoffmann		for (final Command c : AllCommands.get()) {
72d850ed49b22d2a0c84a3b317acec8df7e7159016Marc R. Hoffmann			writeCommand(c, root);
73d850ed49b22d2a0c84a3b317acec8df7e7159016Marc R. Hoffmann		}
74d850ed49b22d2a0c84a3b317acec8df7e7159016Marc R. Hoffmann
75d850ed49b22d2a0c84a3b317acec8df7e7159016Marc R. Hoffmann		root.close();
76d850ed49b22d2a0c84a3b317acec8df7e7159016Marc R. Hoffmann	}
77d850ed49b22d2a0c84a3b317acec8df7e7159016Marc R. Hoffmann
78d850ed49b22d2a0c84a3b317acec8df7e7159016Marc R. Hoffmann}
79