blob: 19a55ff9bda4da2f8881bc6e71e196a76412d1d4 [file] [log] [blame]
/**
* 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;
}
}