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.PrintWriter;
15d850ed49b22d2a0c84a3b317acec8df7e7159016Marc R. Hoffmannimport java.io.StringWriter;
16d850ed49b22d2a0c84a3b317acec8df7e7159016Marc R. Hoffmann
17d850ed49b22d2a0c84a3b317acec8df7e7159016Marc R. Hoffmannimport org.kohsuke.args4j.Option;
18d850ed49b22d2a0c84a3b317acec8df7e7159016Marc R. Hoffmann
19d850ed49b22d2a0c84a3b317acec8df7e7159016Marc R. Hoffmann/**
20d850ed49b22d2a0c84a3b317acec8df7e7159016Marc R. Hoffmann * Common interface for all commands.
21d850ed49b22d2a0c84a3b317acec8df7e7159016Marc R. Hoffmann */
22d850ed49b22d2a0c84a3b317acec8df7e7159016Marc R. Hoffmannpublic abstract class Command {
23d850ed49b22d2a0c84a3b317acec8df7e7159016Marc R. Hoffmann
24d850ed49b22d2a0c84a3b317acec8df7e7159016Marc R. Hoffmann	/**
25d850ed49b22d2a0c84a3b317acec8df7e7159016Marc R. Hoffmann	 * Common command line prefix.
26d850ed49b22d2a0c84a3b317acec8df7e7159016Marc R. Hoffmann	 */
27d850ed49b22d2a0c84a3b317acec8df7e7159016Marc R. Hoffmann	public static final String JAVACMD = "java -jar jacococli.jar ";
28d850ed49b22d2a0c84a3b317acec8df7e7159016Marc R. Hoffmann
29d850ed49b22d2a0c84a3b317acec8df7e7159016Marc R. Hoffmann	/**
30d850ed49b22d2a0c84a3b317acec8df7e7159016Marc R. Hoffmann	 * Flag whether help should be printed for this command.
31d850ed49b22d2a0c84a3b317acec8df7e7159016Marc R. Hoffmann	 */
32d850ed49b22d2a0c84a3b317acec8df7e7159016Marc R. Hoffmann	@Option(name = "-help", usage = "show help", help = true)
33d850ed49b22d2a0c84a3b317acec8df7e7159016Marc R. Hoffmann	public boolean help = false;
34d850ed49b22d2a0c84a3b317acec8df7e7159016Marc R. Hoffmann
35d850ed49b22d2a0c84a3b317acec8df7e7159016Marc R. Hoffmann	/**
3659b2f363c5b69712662c6e129f78230d350eeb5aMarc R. Hoffmann	 * Flag whether output to stdout should be suppressed.
3759b2f363c5b69712662c6e129f78230d350eeb5aMarc R. Hoffmann	 */
3859b2f363c5b69712662c6e129f78230d350eeb5aMarc R. Hoffmann	@Option(name = "-quiet", usage = "suppress all output on stdout")
3959b2f363c5b69712662c6e129f78230d350eeb5aMarc R. Hoffmann	public boolean quiet = false;
4059b2f363c5b69712662c6e129f78230d350eeb5aMarc R. Hoffmann
4159b2f363c5b69712662c6e129f78230d350eeb5aMarc R. Hoffmann	/**
42d850ed49b22d2a0c84a3b317acec8df7e7159016Marc R. Hoffmann	 * @return Short description of the command.
43d850ed49b22d2a0c84a3b317acec8df7e7159016Marc R. Hoffmann	 */
44d850ed49b22d2a0c84a3b317acec8df7e7159016Marc R. Hoffmann	public abstract String description();
45d850ed49b22d2a0c84a3b317acec8df7e7159016Marc R. Hoffmann
46d850ed49b22d2a0c84a3b317acec8df7e7159016Marc R. Hoffmann	/**
47d850ed49b22d2a0c84a3b317acec8df7e7159016Marc R. Hoffmann	 * @return name of the command
48d850ed49b22d2a0c84a3b317acec8df7e7159016Marc R. Hoffmann	 */
49d850ed49b22d2a0c84a3b317acec8df7e7159016Marc R. Hoffmann	public String name() {
50d850ed49b22d2a0c84a3b317acec8df7e7159016Marc R. Hoffmann		return getClass().getSimpleName().toLowerCase();
51d850ed49b22d2a0c84a3b317acec8df7e7159016Marc R. Hoffmann	}
52d850ed49b22d2a0c84a3b317acec8df7e7159016Marc R. Hoffmann
53d850ed49b22d2a0c84a3b317acec8df7e7159016Marc R. Hoffmann	/**
54d850ed49b22d2a0c84a3b317acec8df7e7159016Marc R. Hoffmann	 * @param parser
55d850ed49b22d2a0c84a3b317acec8df7e7159016Marc R. Hoffmann	 *            parser for this command
56d850ed49b22d2a0c84a3b317acec8df7e7159016Marc R. Hoffmann	 * @return usage string displayed for help
57d850ed49b22d2a0c84a3b317acec8df7e7159016Marc R. Hoffmann	 */
58d850ed49b22d2a0c84a3b317acec8df7e7159016Marc R. Hoffmann	public String usage(final CommandParser parser) {
59d850ed49b22d2a0c84a3b317acec8df7e7159016Marc R. Hoffmann		final StringWriter writer = new StringWriter();
60d850ed49b22d2a0c84a3b317acec8df7e7159016Marc R. Hoffmann		parser.printSingleLineUsage(writer, null);
61d850ed49b22d2a0c84a3b317acec8df7e7159016Marc R. Hoffmann		return JAVACMD + name() + writer;
62d850ed49b22d2a0c84a3b317acec8df7e7159016Marc R. Hoffmann	}
63d850ed49b22d2a0c84a3b317acec8df7e7159016Marc R. Hoffmann
64d850ed49b22d2a0c84a3b317acec8df7e7159016Marc R. Hoffmann	/**
65d850ed49b22d2a0c84a3b317acec8df7e7159016Marc R. Hoffmann	 * Executes the given command.
66d850ed49b22d2a0c84a3b317acec8df7e7159016Marc R. Hoffmann	 *
67d850ed49b22d2a0c84a3b317acec8df7e7159016Marc R. Hoffmann	 * @param out
68d850ed49b22d2a0c84a3b317acec8df7e7159016Marc R. Hoffmann	 *            std out
69d850ed49b22d2a0c84a3b317acec8df7e7159016Marc R. Hoffmann	 * @param err
70d850ed49b22d2a0c84a3b317acec8df7e7159016Marc R. Hoffmann	 *            std err
71d850ed49b22d2a0c84a3b317acec8df7e7159016Marc R. Hoffmann	 * @return exit code, should be 0 for normal operation
72d850ed49b22d2a0c84a3b317acec8df7e7159016Marc R. Hoffmann	 * @throws Exception
73d850ed49b22d2a0c84a3b317acec8df7e7159016Marc R. Hoffmann	 *             any exception that my occur during execution
74d850ed49b22d2a0c84a3b317acec8df7e7159016Marc R. Hoffmann	 */
75d850ed49b22d2a0c84a3b317acec8df7e7159016Marc R. Hoffmann	public abstract int execute(PrintWriter out, PrintWriter err)
76d850ed49b22d2a0c84a3b317acec8df7e7159016Marc R. Hoffmann			throws Exception;
77d850ed49b22d2a0c84a3b317acec8df7e7159016Marc R. Hoffmann
78d850ed49b22d2a0c84a3b317acec8df7e7159016Marc R. Hoffmann	/**
79d850ed49b22d2a0c84a3b317acec8df7e7159016Marc R. Hoffmann	 * Prints textual help for this command.
80d850ed49b22d2a0c84a3b317acec8df7e7159016Marc R. Hoffmann	 *
81d850ed49b22d2a0c84a3b317acec8df7e7159016Marc R. Hoffmann	 * @param writer
82d850ed49b22d2a0c84a3b317acec8df7e7159016Marc R. Hoffmann	 *            output destination
83d850ed49b22d2a0c84a3b317acec8df7e7159016Marc R. Hoffmann	 */
84d850ed49b22d2a0c84a3b317acec8df7e7159016Marc R. Hoffmann	protected void printHelp(final PrintWriter writer) {
85d850ed49b22d2a0c84a3b317acec8df7e7159016Marc R. Hoffmann		final CommandParser parser = new CommandParser(this);
86d850ed49b22d2a0c84a3b317acec8df7e7159016Marc R. Hoffmann		writer.println("Usage: " + parser.getCommand().usage(parser));
87d850ed49b22d2a0c84a3b317acec8df7e7159016Marc R. Hoffmann		writer.println(description());
88d850ed49b22d2a0c84a3b317acec8df7e7159016Marc R. Hoffmann		parser.printUsage(writer, null);
89d850ed49b22d2a0c84a3b317acec8df7e7159016Marc R. Hoffmann	}
90d850ed49b22d2a0c84a3b317acec8df7e7159016Marc R. Hoffmann
91d850ed49b22d2a0c84a3b317acec8df7e7159016Marc R. Hoffmann}
92