📄 freemarkerxmltask.java
字号:
/*
* Copyright (c) 2003 The Visigoth Software Society. All rights
* reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
*
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
*
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in
* the documentation and/or other materials provided with the
* distribution.
*
* 3. The end-user documentation included with the redistribution, if
* any, must include the following acknowledgement:
* "This product includes software developed by the
* Visigoth Software Society (http://www.visigoths.org/)."
* Alternately, this acknowledgement may appear in the software itself,
* if and wherever such third-party acknowledgements normally appear.
*
* 4. Neither the name "FreeMarker", "Visigoth", nor any of the names of the
* project contributors may be used to endorse or promote products derived
* from this software without prior written permission. For written
* permission, please contact visigoths@visigoths.org.
*
* 5. Products derived from this software may not be called "FreeMarker" or "Visigoth"
* nor may "FreeMarker" or "Visigoth" appear in their names
* without prior written permission of the Visigoth Software Society.
*
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED. IN NO EVENT SHALL THE VISIGOTH SOFTWARE SOCIETY OR
* ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
* USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
* ====================================================================
*
* This software consists of voluntary contributions made by many
* individuals on behalf of the Visigoth Software Society. For more
* information on the Visigoth Software Society, please see
* http://www.visigoths.org/
*/
package freemarker.ext.ant;
import java.io.*;
import java.util.*;
import org.w3c.dom.*;
import org.xml.sax.SAXParseException;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import org.apache.tools.ant.BuildException;
import org.apache.tools.ant.DirectoryScanner;
import org.apache.tools.ant.Project;
import org.apache.tools.ant.taskdefs.MatchingTask;
import freemarker.ext.xml.NodeListModel;
import freemarker.ext.dom.NodeModel;
import freemarker.template.utility.ClassUtil;
import freemarker.template.utility.SecurityUtilities;
import freemarker.template.*;
/**
* <p>This is an <a href="http://jakarta.apache.org/ant/" target="_top">Ant</a> task for transforming
* XML documents using FreeMarker templates. It uses the adapter class
* {@link NodeListModel}. It will read a set of XML documents, and pass them to
* the template for processing, building the corresponding output files in the
* destination directory.</p>
* <p>It makes the following variables available to the template in the data model:</p>
* <ul>
* <li><tt>document</tt>: <em>Deprecated!</em> The DOM tree of the currently processed XML file wrapped
with the legacy {@link freemarker.ext.xml.NodeListModel}.
For new projects you should use the <tt>.node</tt> instead, which initially
contains the DOM Document wrapped with {@link freemarker.ext.dom.NodeModel}.</li>
* <li><tt>properties</tt>: a {@link freemarker.template.SimpleHash} containing
* properties of the project that executes the task</li>
* <li><tt>userProperties</tt>: a {@link freemarker.template.SimpleHash} containing
* user properties of the project that executes the task</li>
* <li><tt>project</tt>: the DOM tree of the XML file specified by the
* <tt>projectfile</tt>. It will not be available if you didn't specify the
* <tt>projectfile</tt> attribute.</li>
* <li>further custom models can be instantiated and made available to the
* templates using the <tt>models</tt> attribute.</li>
* </ul>
* <p>It supports the following attributes:</p>
* <table border="1" cellpadding="2" cellspacing="0">
* <tr>
* <th valign="top" align="left">Attribute</th>
* <th valign="top" align="left">Description</th>
* <th valign="top">Required</th>
* </tr>
* <tr>
* <td valign="top">basedir</td>
* <td valign="top">location of the XML files. Defaults to the project's
* basedir.</td>
* <td align="center" valign="top">No</td>
* </tr>
* <tr>
* <td valign="top">destdir</td>
* <td valign="top">location to store the generated files.</td>
* <td align="center" valign="top">Yes</td>
* </tr>
* <tr>
* <td valign="top">includes</td>
* <td valign="top">comma-separated list of patterns of files that must be
* included; all files are included when omitted.</td>
* <td valign="top" align="center">No</td>
* </tr>
* <tr>
* <td valign="top">includesfile</td>
* <td valign="top">the name of a file that contains
* include patterns.</td>
* <td valign="top" align="center">No</td>
* </tr>
* <tr>
* <td valign="top">excludes</td>
* <td valign="top">comma-separated list of patterns of files that must be
* excluded; no files (except default excludes) are excluded when omitted.</td>
* <td valign="top" align="center">No</td>
* </tr>
* <tr>
* <td valign="top">excludesfile</td>
* <td valign="top">the name of a file that contains
* exclude patterns.</td>
* <td valign="top" align="center">No</td>
* </tr>
* <tr>
* <td valign="top">defaultexcludes</td>
* <td valign="top">indicates whether default excludes should be used
* (<code>yes</code> | <code>no</code>); default excludes are used when omitted.</td>
* <td valign="top" align="center">No</td>
* </tr>
* <tr>
* <td valign="top">extension</td>
* <td valign="top">extension of generated files. Defaults to .html.</td>
* <td valign="top" align="center">No</td>
* </tr>
* <tr>
* <td valign="top">template</td>
* <td valign="top">name of the FreeMarker template file that will be
* applied by default to XML files</td>
* <td valign="top" align="center">No</td>
* </tr>
* <tr>
* <td valign="top">templateDir</td>
* <td valign="top">location of the FreeMarker template(s) to be used, defaults
* to the project's baseDir</td>
* <td valign="top" align="center">No</td>
* </tr>
* <tr>
* <td valign="top">projectfile</td>
* <td valign="top">path to the project file. The poject file must be an XML file.
* If omitted, it will not be available to templates </td>
* <td valign="top" align="center">No</td>
* </tr>
* <tr>
* <td valign="top">incremental</td>
* <td valign="top">indicates whether all files should be regenerated (no), or
* only those that are older than the XML file, the template file, or the
* project file (yes). Defaults to yes. </td>
* <td valign="top" align="center">No</td>
* </tr>
* <tr>
* <td valign="top">encoding</td>
* <td valign="top">The encoding of the output files. Defaults to platform
* default encoding.</td>
* <td valign="top" align="center">No</td>
* </tr>
* <tr>
* <td valign="top">templateEncoding</td>
* <td valign="top">The encoding of the template files. Defaults to platform
* default encoding.</td>
* <td valign="top" align="center">No</td>
* </tr>
* <tr>
* <td valign="top">validation</td>
* <td valign="top">Whether to validate the XML input. Defaults to off.</td>
* <td valign="top" align="center">No</td>
* </tr>
* <tr>
* <td valign="top">models</td>
* <td valign="top">A list of [name=]className pairs separated by spaces,
* commas, or semicolons that specifies further models that should be
* available to templates. If name is omitted, the unqualified class name
* is used as the name. Every class that is specified must implement the
* TemplateModel interface and have a no-args constructor.</td>
* <td valign="top" align="center">No</td>
* </tr>
* </table>
*
* <p>It supports the following nesed elements:</p>
* <table border="1" cellpadding="2" cellspacing="0">
* <tr>
* <th valign="top" align="left">Element</th>
* <th valign="top" align="left">Description</th>
* <th valign="top">Required</th>
* </tr>
* <tr>
* <td valign="top">prepareModel</td>
* <td valign="top">
* This element executes Jython script before the processing of each XML
* files, that you can use to modify the data model.
* You either enter the Jython script directly nested into this
* element, or specify a Jython script file with the <tt>file</tt>
* attribute.
* The following variables are added to the Jython runtime's local
* namespace before the script is invoked:
* <ul>
* <li><tt>model</tt>: The data model as <code>java.util.HashMap</code>.
* You can read and modify the data model with this variable.
* <li><tt>doc</tt>: The XML document as <code>org.w3c.dom.Document</code>.
* <li><tt>project</tt>: The project document (if used) as
* <code>org.w3c.dom.Document</code>.
* </ul>
* <i>If this element is used, Jython classes (tried with Jython 2.1)
* must be available.</i>
* </td>
* <td valign="top" align="center">No</td>
* </tr>
* <tr>
* <td valign="top">prepareEnvironment</td>
* <td valign="top">This element executes Jython script before the processing
* of each XML files, that you can use to modify the freemarker environment
* ({@link freemarker.core.Environment}). The script is executed after the
* <tt>prepareModel</tt> element. The accessible Jython variables are the
* same as with the <tt>prepareModel</tt> element, except that there is no
* <tt>model</tt> variable, but there is <tt>env</tt> variable, which is
* the FreeMarker environment ({@link freemarker.core.Environment}).
* <i>If this element is used, Jython classes (tried with Jython 2.1)
* must be available.</i>
* </td>
* <td valign="top" align="center">No</td>
* </tr>
* </table>
*
* @author Attila Szegedi
* @author Jonathan Revusky, jon@revusky.com
* @deprecated <a href="http://fmpp.sourceforge.net">FMPP</a> is a more complete solution.
* @version $Id: FreemarkerXmlTask.java,v 1.58.2.1 2006/04/26 11:07:58 revusky Exp $
*/
public class FreemarkerXmlTask
extends
MatchingTask
{
private JythonAntTask prepareModel;
private JythonAntTask prepareEnvironment;
private final DocumentBuilderFactory builderFactory;
private DocumentBuilder builder;
/** the {@link Configuration} used by this task. */
private Configuration cfg = new Configuration();
/** the destination directory */
private File destDir;
/** the base directory */
private File baseDir;
//Where the templates live
private File templateDir;
/** the template= attribute */
private String templateName;
/** The template in its parsed form */
private Template parsedTemplate;
/** last modified of the template sheet */
private long templateFileLastModified = 0;
/** the projectFile= attribute */
private String projectAttribute = null;
private File projectFile = null;
/** The DOM tree of the project wrapped into FreeMarker TemplateModel */
private TemplateModel projectTemplate;
// The DOM tree wrapped using the freemarker.ext.dom wrapping.
private TemplateNodeModel projectNode;
private TemplateModel propertiesTemplate;
private TemplateModel userPropertiesTemplate;
/** last modified of the project file if it exists */
private long projectFileLastModified = 0;
/** check the last modified date on files. defaults to true */
private boolean incremental = true;
/** the default output extension is .html */
private String extension = ".html";
private String encoding = SecurityUtilities.getSystemProperty("file.encoding");
private String templateEncoding = encoding;
private boolean validation = false;
private String models = "";
private final Map modelsMap = new HashMap();
/**
* Constructor creates the SAXBuilder.
*/
public FreemarkerXmlTask()
{
builderFactory = DocumentBuilderFactory.newInstance();
builderFactory.setNamespaceAware(true);
}
/**
* Set the base directory. Defaults to <tt>.</tt>
*/
public void setBasedir(File dir)
{
baseDir = dir;
}
/**
* Set the destination directory into which the generated
* files should be copied to
* @param dir the name of the destination directory
*/
public void setDestdir(File dir)
{
destDir = dir;
}
/**
* Set the output file extension. <tt>.html</tt> by default.
*/
public void setExtension(String extension)
{
this.extension = extension;
}
public void setTemplate(String templateName) {
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -