/*
* Copyright 2009 Google Inc.
*
* Licensed 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 com.google.template.soy;
import static java.nio.charset.StandardCharsets.UTF_8;
import com.google.common.collect.ImmutableMap;
import com.google.common.io.Files;
import com.google.template.soy.base.internal.BaseUtils;
import java.io.File;
import java.io.IOException;
import java.util.Map;
import org.kohsuke.args4j.Option;
/**
* Executable for generating Java classes containing Soy parse info.
*
* <p>The command-line arguments should contain command-line flags and the list of paths to the Soy
* files.
*
*/
public final class SoyParseInfoGenerator extends AbstractSoyCompiler {
@Option(
name = "--allowExternalCalls",
usage =
"Whether to allow external calls. New projects should set this to false, and"
+ " existing projects should remove existing external calls and then set this"
+ " to false. It will save you a lot of headaches. Currently defaults to true"
+ " for backward compatibility."
)
private boolean allowExternalCalls = true;
@Option(
name = "--outputDirectory",
required = true,
usage =
"[Required] The path to the output directory. If files with the same names"
+ " already exist at this location, they will be overwritten."
)
private String outputDirectory = "";
@Option(
name = "--javaPackage",
required = true,
usage = "[Required] The Java package name to use for the generated classes."
)
private String javaPackage = "";
@Option(
name = "--javaClassNameSource",
required = true,
usage =
"[Required] The source for the generated class names. Valid values are"
+ " \"filename\", \"namespace\", and \"generic\". Option \"filename\" turns"
+ " a Soy file name AaaBbb.soy or aaa_bbb.soy into AaaBbbSoyInfo. Option"
+ " \"namespace\" turns a namespace aaa.bbb.cccDdd into CccDddSoyInfo (note"
+ " it only uses the last part of the namespace). Option \"generic\" generates"
+ " class names such as File1SoyInfo, File2SoyInfo."
)
private String javaClassNameSource = "";
/**
* Generates Java classes containing Soy parse info.
*
* <p>If syntax errors are encountered, no output is generated and the process terminates with a
* non-zero exit status. On successful parse, the process terminates with a zero exit status.
*
* @param args Should contain command-line flags and the list of paths to the Soy files.
* @throws IOException If there are problems reading the input files or writing the output file.
*/
public static void main(final String[] args) throws IOException {
new SoyParseInfoGenerator().runMain(args);
}
@Override
void validateFlags() {
if (outputDirectory.length() == 0) {
exitWithError("Must provide output directory.");
}
if (javaPackage.length() == 0) {
exitWithError("Must provide Java package.");
}
if (javaClassNameSource.length() == 0) {
exitWithError("Must provide Java class name source.");
}
}
@Override
void compile(SoyFileSet.Builder sfsBuilder) throws IOException {
sfsBuilder.setAllowExternalCalls(allowExternalCalls);
SoyFileSet sfs = sfsBuilder.build();
ImmutableMap<String, String> parseInfo =
sfs.generateParseInfo(javaPackage, javaClassNameSource);
for (Map.Entry<String, String> entry : parseInfo.entrySet()) {
File outputFile = new File(outputDirectory, entry.getKey());
BaseUtils.ensureDirsExistInPath(outputFile.getPath());
Files.write(entry.getValue(), outputFile, UTF_8);
}
}
}