• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*******************************************************************************
2  * Copyright (c) 2009, 2021 Mountainminds GmbH & Co. KG and Contributors
3  * This program and the accompanying materials are made available under
4  * the terms of the Eclipse Public License 2.0 which is available at
5  * http://www.eclipse.org/legal/epl-2.0
6  *
7  * SPDX-License-Identifier: EPL-2.0
8  *
9  * Contributors:
10  *    Marc R. Hoffmann - initial API and implementation
11  *
12  *******************************************************************************/
13 package org.jacoco.cli.internal;
14 
15 import java.util.AbstractList;
16 
17 import org.jacoco.cli.internal.commands.AllCommands;
18 import org.kohsuke.args4j.CmdLineException;
19 import org.kohsuke.args4j.CmdLineParser;
20 import org.kohsuke.args4j.OptionDef;
21 import org.kohsuke.args4j.spi.Messages;
22 import org.kohsuke.args4j.spi.OptionHandler;
23 import org.kohsuke.args4j.spi.Parameters;
24 import org.kohsuke.args4j.spi.Setter;
25 
26 /**
27  * {@link OptionHandler} which uses {@link CommandParser} internally to provide
28  * help context also for sub-commands.
29  */
30 public class CommandHandler extends OptionHandler<Command> {
31 
32 	/**
33 	 * This constructor is required by the args4j framework.
34 	 *
35 	 * @param parser
36 	 * @param option
37 	 * @param setter
38 	 */
CommandHandler(final CmdLineParser parser, final OptionDef option, final Setter<Object> setter)39 	public CommandHandler(final CmdLineParser parser, final OptionDef option,
40 			final Setter<Object> setter) {
41 		super(parser,
42 				new OptionDef(AllCommands.names(), "<command>",
43 						option.required(), option.help(), option.hidden(),
44 						CommandHandler.class, option.isMultiValued()) {
45 				}, setter);
46 	}
47 
48 	@Override
parseArguments(final Parameters params)49 	public int parseArguments(final Parameters params) throws CmdLineException {
50 		final String subCmd = params.getParameter(0);
51 
52 		for (final Command c : AllCommands.get()) {
53 			if (c.name().equals(subCmd)) {
54 				parseSubArguments(c, params);
55 				setter.addValue(c);
56 				return params.size(); // consume all the remaining tokens
57 			}
58 		}
59 
60 		throw new CmdLineException(owner,
61 				Messages.ILLEGAL_OPERAND.format(option.toString(), subCmd));
62 	}
63 
parseSubArguments(final Command c, final Parameters params)64 	private void parseSubArguments(final Command c, final Parameters params)
65 			throws CmdLineException {
66 		final CmdLineParser p = new CommandParser(c);
67 		p.parseArgument(new AbstractList<String>() {
68 			@Override
69 			public String get(final int index) {
70 				try {
71 					return params.getParameter(index + 1);
72 				} catch (final CmdLineException e) {
73 					// invalid index was accessed.
74 					throw new IndexOutOfBoundsException();
75 				}
76 			}
77 
78 			@Override
79 			public int size() {
80 				return params.size() - 1;
81 			}
82 		});
83 	}
84 
85 	@Override
getDefaultMetaVariable()86 	public String getDefaultMetaVariable() {
87 		return "<command>";
88 	}
89 
90 }
91