blob: b725704aa1fb80e081cd8b87459c6e5c2dcde6be [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.wave.pst;
import com.google.common.base.Function;
import com.google.common.collect.ImmutableMap;
import com.google.common.collect.Iterables;
import org.apache.commons.cli.CommandLine;
import org.apache.commons.cli.DefaultParser;
import org.apache.commons.cli.HelpFormatter;
import org.apache.commons.cli.Options;
import org.apache.commons.cli.ParseException;
import org.apache.wave.pst.style.PstStyler;
import org.apache.wave.pst.style.Styler;
import java.io.File;
import java.util.Map;
/**
* Encapsulates the command line options to protobuf-stringtemplate.
*
* @author kalman@google.com (Benjamin Kalman)
*/
public final class PstCommandLine {
private static final String DEFAULT_OUTPUT_DIR = ".";
private static final String DEFAULT_PROTO_PATH = ".";
private static final Map<String, Styler> STYLERS = ImmutableMap.<String, Styler> builder()
.put("none", Styler.EMPTY)
.put("pst", new PstStyler())
.build();
private final CommandLine cl;
public PstCommandLine(String... args) throws ParseException {
cl = new DefaultParser().parse(getOptions(), args);
checkArgs();
}
private void checkArgs() throws ParseException {
if (!hasFile()) {
throw new ParseException("Must specify file");
}
if (cl.getArgList().isEmpty()) {
throw new ParseException("Must specify at least one template");
}
}
private static Options getOptions() {
Options options = new Options();
options.addOption("h", "help", false, "Show this help");
options.addOption("f", "file", true, "The protobuf specification file to use");
options.addOption("d", "dir", true, String.format(
"The base directory to output generated files to (default: %s)", DEFAULT_OUTPUT_DIR));
options.addOption("s", "styler", true, "The styler to use, if any (default: none). " +
"Available options: " + STYLERS.keySet());
options.addOption("i", "save_pre_styled", false, "Save the intermediate pre-styled files");
options.addOption("j", "save_java", false, "Save the protoc-generated Java file, if any");
options.addOption("I", "proto_path", true, "Extra path to search for proto extensions. "
+ "This needs to be specified if the target file is a .proto file with any of the PST-"
+ "specific extensions, in which case the path should include both PST source "
+ "base and the protoc source base; i.e., /PATH/TO/PST/src:/PATH/TO/PROTOC/src");
options.addOption("t", "int52", true,
"Specifies if pst should store 64-bit integers should be serialized to"
+ "doubles which will use 52-bit precision. It's useful "
+ "when data is meant to be serialized/deserialized in JavaScript, since it doesn't "
+ "support 64-bit integers (default: false).");
return options;
}
public boolean hasHelp() {
return cl.hasOption('h');
}
// NOTE: private because it's always true, checked in checkArgs().
private boolean hasFile() {
return cl.hasOption('f');
}
public static void printHelp() {
new HelpFormatter().printHelp(
PstMain.class.getSimpleName() + " [options] templates...", getOptions());
}
public File getProtoFile() {
return new File(cl.getOptionValue('f'));
}
@SuppressWarnings("unchecked")
public Iterable<File> getTemplateFiles() {
return Iterables.transform(cl.getArgList(), new Function<String, File>() {
@Override public File apply(String filename) {
return new File(filename);
}
});
}
public File getOutputDir() {
return new File(cl.hasOption('d') ? cl.getOptionValue('d') : DEFAULT_OUTPUT_DIR);
}
public File getProtoPath() {
return new File(cl.hasOption('I') ? cl.getOptionValue('I') : DEFAULT_PROTO_PATH);
}
public Styler getStyler() {
if (cl.hasOption('s')) {
String stylerName = cl.getOptionValue('s');
if (STYLERS.containsKey(stylerName)) {
return STYLERS.get(stylerName);
} else {
System.err.println("WARNING: unrecognised styler: " + stylerName + ", using none");
return Styler.EMPTY;
}
} else {
return Styler.EMPTY;
}
}
public boolean shouldSavePreStyled() {
return cl.hasOption('p');
}
public boolean shouldSaveJava() {
return cl.hasOption('j');
}
public boolean shouldUseInt52() {
return !cl.hasOption('t') //
|| (cl.hasOption('t') && "true".equals(cl.getOptionValue('t')));
}
}