package hip.util;
import org.apache.commons.lang3.StringUtils;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.Path;
import java.io.IOException;
import static hip.util.Cli.ArgBuilder;
/**
* Common combinations of CLI options.
*/
public class CliCommonOpts {
public enum IOOptions implements Cli.ArgInfo {
INPUT(true, true, "Input directory for the job."),
OUTPUT(true, true, "Output directory for the job."),
;
private final boolean hasArgument;
private final boolean isRequired;
private final String description;
IOOptions(boolean hasArgument, boolean isRequired, String description) {
this.hasArgument = hasArgument;
this.isRequired = isRequired;
this.description = description;
}
@Override
public String getArgName() {
return name().toLowerCase();
}
@Override
public String getArgDescription() {
return description;
}
@Override
public boolean isRequired() {
return isRequired;
}
@Override
public boolean hasArg() {
return hasArgument;
}
}
public enum InputFileOption implements Cli.ArgInfo {
INPUT(true, true, "Input file"),
;
private final boolean hasArgument;
private final boolean isRequired;
private final String description;
InputFileOption(boolean hasArgument, boolean isRequired, String description) {
this.hasArgument = hasArgument;
this.isRequired = isRequired;
this.description = description;
}
@Override
public String getArgName() {
return name().toLowerCase();
}
@Override
public String getArgDescription() {
return description;
}
@Override
public boolean isRequired() {
return isRequired;
}
@Override
public boolean hasArg() {
return hasArgument;
}
}
public enum OutputFileOption implements Cli.ArgInfo {
OUTPUT(true, true, "Output file"),
;
private final boolean hasArgument;
private final boolean isRequired;
private final String description;
OutputFileOption(boolean hasArgument, boolean isRequired, String description) {
this.hasArgument = hasArgument;
this.isRequired = isRequired;
this.description = description;
}
@Override
public String getArgName() {
return name().toLowerCase();
}
@Override
public String getArgDescription() {
return description;
}
@Override
public boolean isRequired() {
return isRequired;
}
@Override
public boolean hasArg() {
return hasArgument;
}
}
public enum IOFileOpts implements Cli.ArgGetter {
INPUT(ArgBuilder.builder().hasArgument(true).required(true).description("Input file")),
OUTPUT(ArgBuilder.builder().hasArgument(true).required(true).description("Output file"));
private final Cli.ArgInfo argInfo;
IOFileOpts(final ArgBuilder builder) {
this.argInfo = builder.setArgName(name()).build();
}
@Override
public Cli.ArgInfo getArgInfo() {
return argInfo;
}
}
public enum MrIoOpts implements Cli.ArgGetter {
INPUT(ArgBuilder.builder().hasArgument(true).required(true).description("Input file or directory")),
OUTPUT(ArgBuilder.builder().hasArgument(true).required(true).description("HDFS output directory"));
private final Cli.ArgInfo argInfo;
MrIoOpts(final ArgBuilder builder) {
this.argInfo = builder.setArgName(name()).build();
}
@Override
public Cli.ArgInfo getArgInfo() {
return argInfo;
}
}
public enum MrIOpts implements Cli.ArgGetter {
INPUT(ArgBuilder.builder().hasArgument(true).required(true).description("Input file or directory"));
private final Cli.ArgInfo argInfo;
MrIOpts(final ArgBuilder builder) {
this.argInfo = builder.setArgName(name()).build();
}
@Override
public Cli.ArgInfo getArgInfo() {
return argInfo;
}
}
public enum FileOption implements Cli.ArgInfo {
FILE(true, true, "One or more comma-separated files"),
;
private final boolean hasArgument;
private final boolean isRequired;
private final String description;
FileOption(boolean hasArgument, boolean isRequired, String description) {
this.hasArgument = hasArgument;
this.isRequired = isRequired;
this.description = description;
}
@Override
public String getArgName() {
return name().toLowerCase();
}
@Override
public String getArgDescription() {
return description;
}
@Override
public boolean isRequired() {
return isRequired;
}
@Override
public boolean hasArg() {
return hasArgument;
}
}
public static String[] extractFilesFromOpts(Cli cli) {
return StringUtils.split(cli.getArgValueAsString(CliCommonOpts.FileOption.FILE), ",");
}
public static Iterable<Path> extractPathsFromOpts(Configuration conf, Cli cli) throws IOException {
return HdfsIoUtils.stringsToPaths(conf, extractFilesFromOpts(cli));
}
}