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