blob: 5df9683203d706b617385b7db2748522cef2a459 [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 freemarker.ext.dom;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.io.Writer;
import java.util.Locale;
import java.util.StringTokenizer;
import freemarker.core.Environment;
import freemarker.template.Configuration;
import freemarker.template.Template;
/**
* A class that contains a main() method for command-line invocation of a FreeMarker XML transformation.
*
* @deprecated Will be removed (main method in a library, often classified as CWE-489 "Leftover Debug Code").
*/
@Deprecated
public class Transform {
private File inputFile, ftlFile, outputFile;
private String encoding;
private Locale locale;
private Configuration cfg;
/**
* @deprecated Will be removed (main method in a library, often classified as CWE-489 "Leftover Debug Code").
*/
@Deprecated
static public void main(String[] args) {
try {
Transform proc = transformFromArgs(args);
proc.transform();
} catch (IllegalArgumentException iae) {
System.err.println(iae.getMessage());
usage();
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* @param inputFile
* The file from which to read the XML input
* @param ftlFile
* The file containing the template
* @param outputFile
* The file to which to output. If this is null, we use stdout.
* @param locale
* The locale to use. If this is null, we use the platform default.
* @param encoding
* The character encoding to use for output, if this is null, we use the platform default
*/
Transform(File inputFile, File ftlFile, File outputFile, Locale locale, String encoding) throws IOException {
if (encoding == null) {
encoding = System.getProperty("file.encoding");
}
if (locale == null) {
locale = Locale.getDefault();
}
this.encoding = encoding;
this.locale = locale;
this.inputFile = inputFile;
this.ftlFile = ftlFile;
this.outputFile = outputFile;
File ftlDirectory = ftlFile.getAbsoluteFile().getParentFile();
cfg = new Configuration();
cfg.setDirectoryForTemplateLoading(ftlDirectory);
}
/**
* Performs the transformation.
*/
void transform() throws Exception {
String templateName = ftlFile.getName();
Template template = cfg.getTemplate(templateName, locale);
NodeModel rootNode = NodeModel.parse(inputFile);
OutputStream outputStream = System.out;
if (outputFile != null) {
outputStream = new FileOutputStream(outputFile);
}
Writer outputWriter = new OutputStreamWriter(outputStream, encoding);
try {
template.process(null, outputWriter, null, rootNode);
} finally {
if (outputFile != null)
outputWriter.close();
}
}
static Transform transformFromArgs(String[] args) throws IOException {
int i = 0;
String input = null, output = null, ftl = null, loc = null, enc = null;
while (i < args.length) {
String dashArg = args[i++];
if (i >= args.length) {
throw new IllegalArgumentException("");
}
String arg = args[i++];
if (dashArg.equals("-in")) {
if (input != null) {
throw new IllegalArgumentException("The input file should only be specified once");
}
input = arg;
} else if (dashArg.equals("-ftl")) {
if (ftl != null) {
throw new IllegalArgumentException("The ftl file should only be specified once");
}
ftl = arg;
} else if (dashArg.equals("-out")) {
if (output != null) {
throw new IllegalArgumentException("The output file should only be specified once");
}
output = arg;
} else if (dashArg.equals("-locale")) {
if (loc != null) {
throw new IllegalArgumentException("The locale should only be specified once");
}
loc = arg;
} else if (dashArg.equals("-encoding")) {
if (enc != null) {
throw new IllegalArgumentException("The encoding should only be specified once");
}
enc = arg;
} else {
throw new IllegalArgumentException("Unknown input argument: " + dashArg);
}
}
if (input == null) {
throw new IllegalArgumentException("No input file specified.");
}
if (ftl == null) {
throw new IllegalArgumentException("No ftl file specified.");
}
File inputFile = new File(input).getAbsoluteFile();
File ftlFile = new File(ftl).getAbsoluteFile();
if (!inputFile.exists()) {
throw new IllegalArgumentException("Input file does not exist: " + input);
}
if (!ftlFile.exists()) {
throw new IllegalArgumentException("FTL file does not exist: " + ftl);
}
if (!inputFile.isFile() || !inputFile.canRead()) {
throw new IllegalArgumentException("Input file must be a readable file: " + input);
}
if (!ftlFile.isFile() || !ftlFile.canRead()) {
throw new IllegalArgumentException("FTL file must be a readable file: " + ftl);
}
File outputFile = null;
if (output != null) {
outputFile = new File(output).getAbsoluteFile();
File outputDirectory = outputFile.getParentFile();
if (!outputDirectory.exists() || !outputDirectory.canWrite()) {
throw new IllegalArgumentException("The output directory must exist and be writable: "
+ outputDirectory);
}
}
Locale locale = Locale.getDefault();
if (loc != null) {
locale = localeFromString(loc);
}
return new Transform(inputFile, ftlFile, outputFile, locale, enc);
}
static Locale localeFromString(String ls) {
if (ls == null) ls = "";
String lang = "", country = "", variant = "";
StringTokenizer st = new StringTokenizer(ls, "_-,");
if (st.hasMoreTokens()) {
lang = st.nextToken();
if (st.hasMoreTokens()) {
country = st.nextToken();
if (st.hasMoreTokens()) {
variant = st.nextToken();
}
}
return new Locale(lang, country, variant);
} else {
return Locale.getDefault();
}
}
static void usage() {
System.err
.println("Usage: java freemarker.ext.dom.Transform -in <xmlfile> -ftl <ftlfile> [-out <outfile>] [-locale <locale>] [-encoding <encoding>]");
// Security: prevents shutting down the container from a template:
if (Environment.getCurrentEnvironment() == null) {
System.exit(-1);
}
}
}