/** * 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'))); } }