/* * Copyright © 2014-2015 Cask Data, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); you may not * use this file except in compliance with the License. You may obtain a copy of * the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the * License for the specific language governing permissions and limitations under * the License. */ package co.cask.cdap.cli; import com.google.common.base.Objects; import com.google.common.collect.Lists; import org.apache.commons.cli.Options; import java.util.Arrays; import java.util.List; /** * Represents the command line arguments for {@link CLIMain}. */ public class CLIMainArgs { private final String[] optionTokens; private final String[] commandTokens; public CLIMainArgs(String[] optionTokens, String[] commandTokens) { this.optionTokens = optionTokens; this.commandTokens = commandTokens; } public String[] getOptionTokens() { return optionTokens; } public String[] getCommandTokens() { return commandTokens; } @Override public int hashCode() { return Objects.hashCode(Arrays.hashCode(optionTokens), Arrays.hashCode(commandTokens)); } @Override public boolean equals(Object obj) { if (this == obj) { return true; } if (obj == null || getClass() != obj.getClass()) { return false; } final CLIMainArgs other = (CLIMainArgs) obj; return Arrays.equals(this.optionTokens, other.optionTokens) && Arrays.equals(this.commandTokens, other.commandTokens); } @Override public String toString() { return Objects.toStringHelper(this).add("optionTokens", Arrays.toString(optionTokens)) .add("commandTokens", Arrays.toString(commandTokens)).toString(); } public static CLIMainArgs parse(String[] args, Options options) { List<String> optionsPart = Lists.newArrayList(); List<String> commandPart = Lists.newArrayList(); boolean inOptionsPart = true; for (int i = 0; i < args.length; i++) { String token = args[i]; if (inOptionsPart) { if (!token.startsWith("-")) { inOptionsPart = false; } else if (!options.hasOption(token)) { inOptionsPart = true; } else if (!options.getOption(token).hasArg()) { inOptionsPart = true; } else if (options.getOption(token).hasArg() && i + 1 < args.length) { inOptionsPart = true; // add the option and option value optionsPart.add(token); optionsPart.add(args[++i]); continue; } else { inOptionsPart = false; } } if (inOptionsPart) { optionsPart.add(token); } else { commandPart.add(token); } } return new CLIMainArgs(optionsPart.toArray(new String[optionsPart.size()]), commandPart.toArray(new String[commandPart.size()])); } }