📄 freemarkerxmltask.java
字号:
this.templateName = templateName;
}
public void setTemplateDir(File templateDir) throws BuildException {
this.templateDir = templateDir;
try {
cfg.setDirectoryForTemplateLoading(templateDir);
} catch (Exception e) {
throw new BuildException(e);
}
}
/**
* Set the path to the project XML file
*/
public void setProjectfile(String projectAttribute)
{
this.projectAttribute = projectAttribute;
}
/**
* Turn on/off incremental processing. On by default
*/
public void setIncremental(String incremental)
{
this.incremental = !(incremental.equalsIgnoreCase("false") || incremental.equalsIgnoreCase("no") || incremental.equalsIgnoreCase("off"));
}
/**
* Set encoding for generated files. Defaults to platform default encoding.
*/
public void setEncoding(String encoding)
{
this.encoding = encoding;
}
public void setTemplateEncoding(String inputEncoding)
{
this.templateEncoding = inputEncoding;
}
/**
* Sets whether to validate the XML input.
*/
public void setValidation(boolean validation)
{
this.validation = validation;
}
public void setModels(String models)
{
this.models = models;
}
public void execute() throws BuildException
{
DirectoryScanner scanner;
String[] list;
if (baseDir == null)
{
baseDir = getProject().getBaseDir();
}
if (destDir == null )
{
String msg = "destdir attribute must be set!";
throw new BuildException(msg, getLocation());
}
File templateFile = null;
if (templateDir == null) {
if (templateName != null) {
templateFile = new File(templateName);
if (!templateFile.isAbsolute()) {
templateFile = new File(getProject().getBaseDir(), templateName);
}
templateDir = templateFile.getParentFile();
templateName = templateFile.getName();
}
else {
templateDir = baseDir;
}
setTemplateDir(templateDir);
} else if (templateName != null) {
if (new File(templateName).isAbsolute()) {
throw new BuildException("Do not specify an absolute location for the template as well as a templateDir");
}
templateFile = new File(templateDir, templateName);
}
if (templateFile != null) {
templateFileLastModified = templateFile.lastModified();
}
try {
if (templateName != null) {
parsedTemplate = cfg.getTemplate(templateName, templateEncoding);
}
}
catch (IOException ioe) {
throw new BuildException(ioe.toString());
}
// get the last modification of the template
log("Transforming into: " + destDir.getAbsolutePath(), Project.MSG_INFO);
// projectFile relative to baseDir
if (projectAttribute != null && projectAttribute.length() > 0)
{
projectFile = new File(baseDir, projectAttribute);
if (projectFile.isFile())
projectFileLastModified = projectFile.lastModified();
else
{
log ("Project file is defined, but could not be located: " +
projectFile.getAbsolutePath(), Project.MSG_INFO );
projectFile = null;
}
}
generateModels();
// find the files/directories
scanner = getDirectoryScanner(baseDir);
propertiesTemplate = wrapMap(project.getProperties());
userPropertiesTemplate = wrapMap(project.getUserProperties());
builderFactory.setValidating(validation);
try
{
builder = builderFactory.newDocumentBuilder();
}
catch(ParserConfigurationException e)
{
throw new BuildException("Could not create document builder", e, getLocation());
}
// get a list of files to work on
list = scanner.getIncludedFiles();
for (int i = 0;i < list.length; ++i)
{
process(baseDir, list[i], destDir);
}
}
public void addConfiguredJython(JythonAntTask jythonAntTask) {
this.prepareEnvironment = jythonAntTask;
}
public void addConfiguredPrepareModel(JythonAntTask prepareModel) {
this.prepareModel = prepareModel;
}
public void addConfiguredPrepareEnvironment(JythonAntTask prepareEnvironment) {
this.prepareEnvironment = prepareEnvironment;
}
/**
* Process an XML file using FreeMarker
*/
private void process(File baseDir, String xmlFile, File destDir)
throws BuildException
{
File outFile=null;
File inFile=null;
try
{
// the current input file relative to the baseDir
inFile = new File(baseDir,xmlFile);
// the output file relative to basedir
outFile = new File(destDir,
xmlFile.substring(0,
xmlFile.lastIndexOf('.')) + extension);
// only process files that have changed
if (!incremental ||
(inFile.lastModified() > outFile.lastModified() ||
templateFileLastModified > outFile.lastModified() ||
projectFileLastModified > outFile.lastModified()))
{
ensureDirectoryFor(outFile);
//-- command line status
log("Input: " + xmlFile, Project.MSG_INFO );
if (projectTemplate == null && projectFile != null) {
Document doc = builder.parse(projectFile);
projectTemplate = new NodeListModel(builder.parse(projectFile));
projectNode = NodeModel.wrap(doc);
}
// Build the file DOM
Document docNode = builder.parse(inFile);
TemplateModel document = new NodeListModel(docNode);
TemplateNodeModel docNodeModel = NodeModel.wrap(docNode);
HashMap root = new HashMap();
root.put("document", document);
insertDefaults(root);
// Process the template and write out
// the result as the outFile.
Writer writer = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(outFile), encoding));
try
{
if (parsedTemplate == null) {
throw new BuildException("No template file specified in build script or in XML file");
}
if (prepareModel != null) {
Map vars = new HashMap();
vars.put("model", root);
vars.put("doc", docNode);
if (projectNode != null) {
vars.put("project", ((NodeModel) projectNode).getNode());
}
prepareModel.execute(vars);
}
freemarker.core.Environment env = parsedTemplate.createProcessingEnvironment(root, writer);
env.setCurrentVisitorNode(docNodeModel);
if (prepareEnvironment != null) {
Map vars = new HashMap();
vars.put("env", env);
vars.put("doc", docNode);
if (projectNode != null) {
vars.put("project", ((NodeModel) projectNode).getNode());
}
prepareEnvironment.execute(vars);
}
env.process();
writer.flush();
}
finally
{
writer.close();
}
log("Output: " + outFile, Project.MSG_INFO );
}
}
catch (SAXParseException spe)
{
Throwable rootCause = spe;
if (spe.getException() != null)
rootCause = spe.getException();
log("XML parsing error in " + inFile.getAbsolutePath(), Project.MSG_ERR);
log("Line number " + spe.getLineNumber());
log("Column number " + spe.getColumnNumber());
throw new BuildException(rootCause, getLocation());
}
catch (Throwable e)
{
if (outFile != null ) outFile.delete();
e.printStackTrace();
throw new BuildException(e, getLocation());
}
}
private void generateModels()
{
StringTokenizer modelTokenizer = new StringTokenizer(models, ",; ");
while(modelTokenizer.hasMoreTokens())
{
String modelSpec = modelTokenizer.nextToken();
String name = null;
String clazz = null;
int sep = modelSpec.indexOf('=');
if(sep == -1)
{
// No explicit name - use unqualified class name
clazz = modelSpec;
int dot = clazz.lastIndexOf('.');
if(dot == -1)
{
// clazz in the default package
name = clazz;
}
else
{
name = clazz.substring(dot + 1);
}
}
else
{
name = modelSpec.substring(0, sep);
clazz = modelSpec.substring(sep + 1);
}
try
{
modelsMap.put(name, ClassUtil.forName(clazz).newInstance());
}
catch(Exception e)
{
throw new BuildException(e);
}
}
}
/**
* create directories as needed
*/
private void ensureDirectoryFor( File targetFile ) throws BuildException
{
File directory = new File( targetFile.getParent() );
if (!directory.exists())
{
if (!directory.mkdirs())
{
throw new BuildException("Unable to create directory: "
+ directory.getAbsolutePath(), getLocation());
}
}
}
private static TemplateModel wrapMap(Map table)
{
SimpleHash model = new SimpleHash();
for (Iterator it = table.keySet().iterator(); it.hasNext();)
{
Object key = it.next();
Object value = table.get(key);
model.put(key.toString(), new SimpleScalar(value.toString()));
}
return model;
}
protected void insertDefaults(Map root)
{
root.put("properties", propertiesTemplate);
root.put("userProperties", userPropertiesTemplate);
if (projectTemplate != null) {
root.put("project", projectTemplate);
root.put("project_node", projectNode);
}
if(modelsMap.size() > 0)
{
for (Iterator it = modelsMap.entrySet().iterator(); it.hasNext();)
{
Map.Entry entry = (Map.Entry) it.next();
root.put(entry.getKey(), entry.getValue());
}
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -