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