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