| /** |
| * Licensed to the Apache Software Foundation (ASF) under one |
| * or more contributor license agreements. See the NOTICE file |
| * distributed with this work for additional information |
| * regarding copyright ownership. The ASF licenses this file |
| * to you 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 org.apache.hadoop.fs.slive; |
| |
| import org.apache.commons.cli.CommandLine; |
| import org.apache.commons.cli.HelpFormatter; |
| import org.apache.commons.cli.Option; |
| import org.apache.commons.cli.Options; |
| import org.apache.commons.cli.PosixParser; |
| import org.apache.hadoop.fs.slive.Constants.Distribution; |
| import org.apache.hadoop.fs.slive.Constants.OperationType; |
| import org.apache.hadoop.util.StringUtils; |
| |
| /** |
| * Class which abstracts the parsing of command line arguments for slive test |
| */ |
| class ArgumentParser { |
| |
| private Options optList; |
| private String[] argumentList; |
| private ParsedOutput parsed; |
| |
| /** |
| * Result of a parse is the following object |
| */ |
| static class ParsedOutput { |
| private CommandLine parsedData; |
| private ArgumentParser source; |
| private boolean needHelp; |
| |
| ParsedOutput(CommandLine parsedData, ArgumentParser source, |
| boolean needHelp) { |
| this.parsedData = parsedData; |
| this.source = source; |
| this.needHelp = needHelp; |
| } |
| |
| /** |
| * @return whether the calling object should call output help and exit |
| */ |
| boolean shouldOutputHelp() { |
| return needHelp; |
| } |
| |
| /** |
| * Outputs the formatted help to standard out |
| */ |
| void outputHelp() { |
| if (!shouldOutputHelp()) { |
| return; |
| } |
| if (source != null) { |
| HelpFormatter hlp = new HelpFormatter(); |
| hlp.printHelp(Constants.PROG_NAME + " " + Constants.PROG_VERSION, |
| source.getOptionList()); |
| } |
| } |
| |
| /** |
| * @param optName |
| * the option name to get the value for |
| * |
| * @return the option value or null if it does not exist |
| */ |
| String getValue(String optName) { |
| if (parsedData == null) { |
| return null; |
| } |
| return parsedData.getOptionValue(optName); |
| } |
| |
| public String toString() { |
| StringBuilder s = new StringBuilder(); |
| if (parsedData != null) { |
| Option[] ops = parsedData.getOptions(); |
| for (int i = 0; i < ops.length; ++i) { |
| s.append(ops[i].getOpt() + " = " + s.append(ops[i].getValue()) + ","); |
| } |
| } |
| return s.toString(); |
| } |
| |
| } |
| |
| ArgumentParser(String[] args) { |
| optList = getOptions(); |
| if (args == null) { |
| args = new String[] {}; |
| } |
| argumentList = args; |
| parsed = null; |
| } |
| |
| private Options getOptionList() { |
| return optList; |
| } |
| |
| /** |
| * Parses the command line options |
| * |
| * @return false if need to print help output |
| * |
| * @throws Exception |
| * when parsing fails |
| */ |
| ParsedOutput parse() throws Exception { |
| if (parsed == null) { |
| PosixParser parser = new PosixParser(); |
| CommandLine popts = parser.parse(getOptionList(), argumentList, true); |
| if (popts.hasOption(ConfigOption.HELP.getOpt())) { |
| parsed = new ParsedOutput(null, this, true); |
| } else { |
| parsed = new ParsedOutput(popts, this, false); |
| } |
| } |
| return parsed; |
| } |
| |
| /** |
| * @return the option set to be used in command line parsing |
| */ |
| private Options getOptions() { |
| Options cliopt = new Options(); |
| cliopt.addOption(ConfigOption.MAPS); |
| cliopt.addOption(ConfigOption.REDUCES); |
| cliopt.addOption(ConfigOption.PACKET_SIZE); |
| cliopt.addOption(ConfigOption.OPS); |
| cliopt.addOption(ConfigOption.DURATION); |
| cliopt.addOption(ConfigOption.EXIT_ON_ERROR); |
| cliopt.addOption(ConfigOption.SLEEP_TIME); |
| cliopt.addOption(ConfigOption.FILES); |
| cliopt.addOption(ConfigOption.DIR_SIZE); |
| cliopt.addOption(ConfigOption.BASE_DIR); |
| cliopt.addOption(ConfigOption.RESULT_FILE); |
| cliopt.addOption(ConfigOption.CLEANUP); |
| { |
| String distStrs[] = new String[Distribution.values().length]; |
| Distribution distValues[] = Distribution.values(); |
| for (int i = 0; i < distValues.length; ++i) { |
| distStrs[i] = distValues[i].lowerName(); |
| } |
| String opdesc = String.format(Constants.OP_DESCR, StringUtils |
| .arrayToString(distStrs)); |
| for (OperationType type : OperationType.values()) { |
| String opname = type.lowerName(); |
| cliopt.addOption(new Option(opname, true, opdesc)); |
| } |
| } |
| cliopt.addOption(ConfigOption.REPLICATION_AM); |
| cliopt.addOption(ConfigOption.BLOCK_SIZE); |
| cliopt.addOption(ConfigOption.READ_SIZE); |
| cliopt.addOption(ConfigOption.WRITE_SIZE); |
| cliopt.addOption(ConfigOption.APPEND_SIZE); |
| cliopt.addOption(ConfigOption.RANDOM_SEED); |
| cliopt.addOption(ConfigOption.QUEUE_NAME); |
| cliopt.addOption(ConfigOption.HELP); |
| return cliopt; |
| } |
| |
| } |