blob: 931eb2b8966c54fc6a070de921f8d37ba0e995f1 [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.parquet.tools;
import java.io.IOException;
import java.io.OutputStream;
import java.io.PrintStream;
import java.io.PrintWriter;
import java.util.Arrays;
import java.util.Collection;
import java.util.Map;
import org.apache.commons.cli.CommandLine;
import org.apache.commons.cli.CommandLineParser;
import org.apache.commons.cli.HelpFormatter;
import org.apache.commons.cli.Option;
import org.apache.commons.cli.OptionBuilder;
import org.apache.commons.cli.Options;
import org.apache.commons.cli.ParseException;
import org.apache.commons.cli.PosixParser;
import org.apache.parquet.tools.command.Command;
import org.apache.parquet.tools.command.Registry;
public class Main {
public static final Options OPTIONS;
public static PrintStream out;
public static PrintStream err;
static {
OPTIONS = new Options();
Option help = OptionBuilder.withLongOpt("help")
.withDescription("Show this help string")
.create('h');
Option ncol = OptionBuilder.withLongOpt("no-color")
.withDescription("Disable color output even if supported")
.create();
Option debg = OptionBuilder.withLongOpt("debug")
.withDescription("Enable debug output")
.create();
OPTIONS.addOption(help);
OPTIONS.addOption(ncol);
OPTIONS.addOption(debg);
}
private static final int WIDTH = 80;
private static final int LEFT_PAD = 4;
private static final int DESC_PAD = 2;
public static void mergeOptionsInto(Options opt, Options opts) {
if (opts == null) {
return;
}
Collection<Option> all = opts.getOptions();
if (all != null && !all.isEmpty()) {
for (Option o : all) {
opt.addOption(o);
}
}
}
public static Options mergeOptions(Options opt, Options... opts) {
Options results = new Options();
mergeOptionsInto(results, opt);
for (Options o : opts) {
mergeOptionsInto(results, o);
}
return results;
}
public static void showUsage(HelpFormatter format, PrintWriter err, String name, Command command) {
Options options = mergeOptions(OPTIONS, command.getOptions());
String[] usage = command.getUsageDescription();
String ustr = name + " [option...]";
if (usage != null && usage.length >= 1) {
ustr = ustr + " " + usage[0];
}
format.printUsage(err, WIDTH, ustr);
format.printWrapped(err, WIDTH, LEFT_PAD, "where option is one of:");
format.printOptions(err, WIDTH, options, LEFT_PAD, DESC_PAD);
if (usage != null && usage.length >= 2) {
for (int i = 1; i < usage.length; ++i) {
format.printWrapped(err, WIDTH, LEFT_PAD, usage[i]);
}
}
}
public static void showUsage(String name, Command command) {
HelpFormatter format = new HelpFormatter();
PrintWriter err = new PrintWriter(Main.err,true);
Options options = command.getOptions();
showUsage(format, err, "parquet-" + name, command);
}
public static void showUsage() {
HelpFormatter format = new HelpFormatter();
PrintWriter err = new PrintWriter(Main.err,true);
Map<String,Command> all = Registry.allCommands();
boolean first = true;
for (Map.Entry<String,Command> entry : all.entrySet()) {
String name = entry.getKey();
Command command = entry.getValue();
if (!first) err.println();
first = false;
showUsage(format, err, "parquet-tools " + name, command);
}
}
public static void die(String message, boolean usage) {
die(message, usage, null, null);
}
public static void die(Throwable th, boolean usage) {
die(th, usage, null, null);
}
public static void die(String message, boolean usage, String name, Command command) {
if (message != null) {
Main.err.println(message);
Main.err.println();
}
if (usage) {
if (name != null && command != null) {
showUsage(name, command);
} else {
showUsage(name, command);
}
}
System.exit(1);
}
public static void die(Throwable th, boolean usage, String name, Command command) {
die(th.getMessage(), usage, name, command);
}
public static void main(String[] args) {
Main.out = System.out;
Main.err = System.err;
PrintStream VoidStream = new PrintStream(new OutputStream() {
@Override
public void write(int b) throws IOException {}
@Override
public void write(byte[] b) throws IOException {}
@Override
public void write(byte[] b, int off, int len) throws IOException {}
@Override
public void flush() throws IOException {}
@Override
public void close() throws IOException {}
});
System.setOut(VoidStream);
System.setErr(VoidStream);
if (args.length == 0) {
die("No command specified", true, null, null);
}
String name = args[0];
if ("-h".equals(name) || "--help".equals(name)) {
showUsage();
System.exit(0);
}
Command command = Registry.getCommandByName(name);
if (command == null) {
die("Unknown command: " + name, true, null, null);
}
boolean debug = false;
Options options = mergeOptions(OPTIONS, command.getOptions());
try {
String[] cargs = Arrays.copyOfRange(args, 1, args.length);
Options opts = mergeOptions(OPTIONS, command.getOptions());
boolean extra = command.supportsExtraArgs();
CommandLineParser parser = new PosixParser();
CommandLine cmd = parser.parse(opts == null ? new Options() : opts, cargs, extra);
if (cmd.hasOption('h')) {
showUsage(name, command);
System.exit(0);
}
if (cmd.hasOption("no-color")) {
System.setProperty("DISABLE_COLORS", "true");
}
debug = cmd.hasOption("debug");
command.execute(cmd);
} catch (ParseException ex) {
if (debug) ex.printStackTrace(Main.err);
die("Invalid arguments: " + ex.getMessage(), true, name, command);
} catch (Throwable th) {
if (debug) th.printStackTrace(Main.err);
die(th, false, name, command);
}
}
}