You are viewing a plain text version of this content. The canonical link for it is here.
Posted to user@velocity.apache.org by Varsha Kadam <va...@rediffmail.com> on 2007/10/20 21:41:29 UTC
Problem working witth AnakiaTask
Hi,
I am trying to transform a xml file into text file using anakia,but getting error(NullPointerException) for directory scenning.I tried to fix the problem but could not do it.....
Please help me.
Exception description:
Transforming into: C:\SonaliFolder\Sonali\Workspace\MyAnakia\..\MyAnakia\index.txt
java.lang.NullPointerException
at org.apache.tools.ant.types.AbstractFileSet.setupDirectoryScanner(AbstractFileSet.java:464)
at org.apache.tools.ant.types.AbstractFileSet.getDirectoryScanner(AbstractFileSet.java:430)
at org.apache.tools.ant.taskdefs.MatchingTask.getDirectoryScanner(MatchingTask.java:192)
at org.apache.anakia.AnakiaTask.execute(AnakiaTask.java:322)
at org.apache.anakia.AnakiaTask.main(AnakiaTask.java:696)
Modified AnakiaTask class:
package org.apache.anakia;
/*
* 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.
*/
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.io.StringWriter;
import java.io.Writer;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;
import java.util.StringTokenizer;
import org.apache.commons.collections.ExtendedProperties;
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 org.apache.velocity.Template;
import org.apache.velocity.VelocityContext;
import org.apache.velocity.app.Velocity;
import org.apache.velocity.app.VelocityEngine;
import org.apache.velocity.runtime.RuntimeConstants;
import org.apache.velocity.util.StringUtils;
import org.jdom.Document;
import org.jdom.JDOMException;
import org.jdom.input.SAXBuilder;
import org.jdom.output.Format;
import org.xml.sax.SAXParseException;
/**
* The purpose of this Ant Task is to allow you to use
* Velocity as an XML transformation tool like XSLT is.
* So, instead of using XSLT, you will be able to use this
* class instead to do your transformations. It works very
* similar in concept to Ant's <style> task.
* <p>
* You can find more documentation about this class on the
* Velocity
* <a href="http://velocity.apache.org/engine/devel/docs/anakia.html">Website</a>.
*
* @author <a href="mailto:jon@latchkey.com">Jon S. Stevens</a>
* @author <a href="mailto:szegedia@freemail.hu">Attila Szegedi</a>
* @version $Id: AnakiaTask.java 524478 2007-03-31 20:51:49Z wglass $
*/
public class AnakiaTask extends MatchingTask
{
/** <code>{@link SAXBuilder}</code> instance to use */
SAXBuilder builder;
/** the destination directory */
private File destDir = null;
/** the base directory */
File baseDir = null;
/** the style= attribute */
private String style = null;
/** last modified of the style sheet */
private long styleSheetLastModified = 0;
/** the projectFile= attribute */
private String projectAttribute = null;
/** the File for the project.xml file */
private File projectFile = null;
/** 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 lastModifiedCheck = true;
/** the default output extension is .html */
private String extension = ".html";
/** the template path */
private String templatePath = null;
/** the file to get the velocity properties file */
private File velocityPropertiesFile = null;
/** the VelocityEngine instance to use */
private VelocityEngine ve = new VelocityEngine();
/** the Velocity subcontexts */
private List contexts = new LinkedList();
/**
* Constructor creates the SAXBuilder.
*/
public AnakiaTask()
{
builder = new SAXBuilder();
builder.setFactory(new AnakiaJDOMFactory());
}
/**
* Set the base directory.
* @param dir
*/
public void setBasedir(File dir)
{
baseDir = dir;
}
/**
* Set the destination directory into which the VSL result
* files should be copied to
* @param dir the name of the destination directory
*/
public void setDestdir(File dir)
{
destDir = dir;
}
/**
* Allow people to set the default output file extension
* @param extension
*/
public void setExtension(String extension)
{
this.extension = extension;
}
/**
* Allow people to set the path to the .vsl file
* @param style
*/
public void setStyle(String style)
{
this.style = style;
}
/**
* Allow people to set the path to the project.xml file
* @param projectAttribute
*/
public void setProjectFile(String projectAttribute)
{
this.projectAttribute = projectAttribute;
}
/**
* Set the path to the templates.
* The way it works is this:
* If you have a Velocity.properties file defined, this method
* will <strong>override</strong> whatever is set in the
* Velocity.properties file. This allows one to not have to define
* a Velocity.properties file, therefore using Velocity's defaults
* only.
* @param templatePath
*/
public void setTemplatePath(File templatePath)
{
try
{
this.templatePath = templatePath.getCanonicalPath();
System.out.println("template path is "+templatePath);
}
catch (java.io.IOException ioe)
{
throw new BuildException(ioe);
}
}
/**
* Allow people to set the path to the velocity.properties file
* This file is found relative to the path where the JVM was run.
* For example, if build.sh was executed in the ./build directory,
* then the path would be relative to this directory.
* This is optional based on the setting of setTemplatePath().
* @param velocityPropertiesFile
*/
public void setVelocityPropertiesFile(File velocityPropertiesFile)
{
this.velocityPropertiesFile = velocityPropertiesFile;
}
/**
* Turn on/off last modified checking. by default, it is on.
* @param lastmod
*/
public void setLastModifiedCheck(String lastmod)
{
if (lastmod.equalsIgnoreCase("false") || lastmod.equalsIgnoreCase("no")
|| lastmod.equalsIgnoreCase("off"))
{
this.lastModifiedCheck = false;
}
}
/**
* Main body of the application
* @throws BuildException
*/
public void execute () throws BuildException
{
DirectoryScanner scanner;
String[] list;
if (baseDir == null)
{
baseDir = project.resolveFile(".");
}
if (destDir == null )
{
String msg = "destdir attribute must be set!";
throw new BuildException(msg);
}
if (style == null)
{
throw new BuildException("style attribute must be set!");
}
if (velocityPropertiesFile == null)
{
velocityPropertiesFile = new File("velocity.properties");
}
/*
* If the props file doesn't exist AND a templatePath hasn't
* been defined, then throw the exception.
*/
if ( !velocityPropertiesFile.exists() && templatePath == null )
{
throw new BuildException ("No template path and could not " +
"locate velocity.properties file: " +
velocityPropertiesFile.getAbsolutePath());
}
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.exists())
{
projectFileLastModified = projectFile.lastModified();
}
else
{
log ("Project file is defined, but could not be located: " +
projectFile.getAbsolutePath(), Project.MSG_INFO );
projectFile = null;
}
}
Document projectDocument = null;
try
{
if ( velocityPropertiesFile.exists() )
{
String file = velocityPropertiesFile.getAbsolutePath();
System.out.println("velocityPropertiesFile.getAbsolutePath()"+file);
ExtendedProperties config = new ExtendedProperties(file);
ve.setExtendedProperties(config);
}
// override the templatePath if it exists
if (templatePath != null && templatePath.length() > 0)
{
System.out.println("teplate path and runtime constant is"+templatePath+RuntimeConstants.FILE_RESOURCE_LOADER_PATH);
ve.setProperty( RuntimeConstants.FILE_RESOURCE_LOADER_PATH,
templatePath);
System.out.println("RuntimeConstants.FILE_RESOURCE_LOADER_PATH"+RuntimeConstants.FILE_RESOURCE_LOADER_PATH);
System.out.println("templatePath"+templatePath);
}
//VelocityEngine vx=new VelocityEngine();
ve.init();
//vx.init();
//VelocityContext context = new VelocityContext();
//File f=new File("c:\\Files\\site.vsl");
// context.put("root",f);
// get the last modification of the VSL stylesheet
System.out.println("stylr is"+style);
Template template = ve.getTemplate(style);
System.out.println("template found here is"+template);
//template.merge(context, writer);
styleSheetLastModified = ve.getTemplate("site.vsl").getLastModified();
// Build the Project file document
if (projectFile != null)
{
projectDocument = builder.build(projectFile);
}
}
catch (Exception e)
{
log("Error: " + e.toString(), Project.MSG_INFO);
System.out.println("cause of exception is"+e.getCause()+e.getMessage());
Object ex=e.getClass();
System.out.println("Object is"+ex.toString()+ex.getClass());
throw new BuildException(e);
}
// find the files/directories
System.out.println("base dir"+baseDir);
scanner = getDirectoryScanner(baseDir);
System.out.println("scanner"+scanner);
// get a list of files to work on
list = scanner.getIncludedFiles();
for (int i = 0;i < list.length; ++i)
{
process(list[i], projectDocument );
}
}
/**
* Process an XML file using Velocity
*/
private void process(String xmlFile, Document projectDocument)
throws BuildException
{
File outFile=null;
File inFile=null;
Writer writer = 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 (lastModifiedCheck == false ||
(inFile.lastModified() > outFile.lastModified() ||
styleSheetLastModified > outFile.lastModified() ||
projectFileLastModified > outFile.lastModified() ||
userContextsModifed(outFile.lastModified())))
{
ensureDirectoryFor( outFile );
//-- command line status
log("Input: " + xmlFile, Project.MSG_INFO );
// Build the JDOM Document
Document root = builder.build(inFile);
// Shove things into the Context
VelocityContext context = new VelocityContext();
/*
* get the property TEMPLATE_ENCODING
* we know it's a string...
*/
String encoding = (String) ve.getProperty( RuntimeConstants.OUTPUT_ENCODING );
if (encoding == null || encoding.length() == 0
|| encoding.equals("8859-1") || encoding.equals("8859_1"))
{
encoding = "ISO-8859-1";
}
Format f = Format.getRawFormat();
f.setEncoding(encoding);
OutputWrapper ow = new OutputWrapper(f);
context.put ("root", root.getRootElement());
context.put ("xmlout", ow );
context.put ("relativePath", getRelativePath(xmlFile));
context.put ("treeWalk", new TreeWalker());
context.put ("xpath", new XPathTool() );
context.put ("escape", new Escape() );
context.put ("date", new java.util.Date() );
/**
* only put this into the context if it exists.
*/
if (projectDocument != null)
{
context.put ("project", projectDocument.getRootElement());
System.out.println("context has put project ef with->"+projectDocument.getRootElement());
}
/**
* Add the user subcontexts to the to context
*/
for (Iterator iter = contexts.iterator(); iter.hasNext();)
{
Context subContext = (Context) iter.next();
if (subContext == null)
{
throw new BuildException("Found an undefined SubContext!");
}
if (subContext.getContextDocument() == null)
{
throw new BuildException("Could not build a subContext for " + subContext.getName());
}
context.put(subContext.getName(), subContext
.getContextDocument().getRootElement());
}
/**
* Process the VSL template with the context and write out
* the result as the outFile.
*/
writer = new BufferedWriter(new OutputStreamWriter(
new FileOutputStream(outFile),
encoding));
/**
* get the template to process
*/
Template template = ve.getTemplate(style);
System.out.println("template found here is"+template);
template.merge(context, writer);
log("Output: " + outFile, Project.MSG_INFO );
}
}
catch (JDOMException e)
{
outFile.delete();
if (e.getCause() != null)
{
Throwable rootCause = e.getCause();
if (rootCause instanceof SAXParseException)
{
System.out.println("");
System.out.println("Error: " + rootCause.getMessage());
System.out.println(
" Line: " +
((SAXParseException)rootCause).getLineNumber() +
" Column: " +
((SAXParseException)rootCause).getColumnNumber());
System.out.println("");
}
else
{
rootCause.printStackTrace();
}
}
else
{
e.printStackTrace();
}
}
catch (Throwable e)
{
if (outFile != null)
{
outFile.delete();
}
e.printStackTrace();
}
finally
{
if (writer != null)
{
try
{
writer.flush();
}
catch (IOException e)
{
// Do nothing
}
try
{
writer.close();
}
catch (IOException e)
{
// Do nothing
}
}
}
}
/**
* Hacky method to figure out the relative path
* that we are currently in. This is good for getting
* the relative path for images and anchor's.
*/
private String getRelativePath(String file)
{
if (file == null || file.length()==0)
return "";
StringTokenizer st = new StringTokenizer(file, "/\\");
// needs to be -1 cause ST returns 1 even if there are no matches. huh?
int slashCount = st.countTokens() - 1;
StringBuffer sb = new StringBuffer();
for (int i=0;i<slashCount ;i++ )
{
sb.append ("../");
}
if (sb.toString().length() > 0)
{
return StringUtils.chop(sb.toString(), 1);
}
return ".";
}
/**
* 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() );
}
}
}
/**
* Check to see if user context is modified.
*/
private boolean userContextsModifed(long lastModified)
{
for (Iterator iter = contexts.iterator(); iter.hasNext();)
{
AnakiaTask.Context ctx = (AnakiaTask.Context) iter.next();
if(ctx.getLastModified() > lastModified)
{
return true;
}
}
return false;
}
/**
* Create a new context.
* @return A new context.
*/
public Context createContext()
{
Context context = new Context();
contexts.add(context);
return context;
}
/**
* A context implementation that loads all values from an XML file.
*/
public class Context
{
private String name;
private Document contextDoc = null;
private String file;
/**
* Public constructor.
*/
public Context()
{
}
/**
* Get the name of the context.
* @return The name of the context.
*/
public String getName()
{
return name;
}
/**
* Set the name of the context.
* @param name
*
* @throws IllegalArgumentException if a reserved word is used as a
* name, specifically any of "relativePath", "treeWalk", "xpath",
* "escape", "date", or "project"
*/
public void setName(String name)
{
if (name.equals("relativePath") ||
name.equals("treeWalk") ||
name.equals("xpath") ||
name.equals("escape") ||
name.equals("date") ||
name.equals("project"))
{
throw new IllegalArgumentException("Context name '" + name
+ "' is reserved by Anakia");
}
this.name = name;
}
/**
* Build the context based on a file path.
* @param file
*/
public void setFile(String file)
{
this.file = file;
}
/**
* Retrieve the time the source file was last modified.
* @return The time the source file was last modified.
*/
public long getLastModified()
{
return new File(baseDir, file).lastModified();
}
/**
* Retrieve the context document object.
* @return The context document object.
*/
public Document getContextDocument()
{
if (contextDoc == null)
{
File contextFile = new File(baseDir, file);
try
{
contextDoc = builder.build(contextFile);
}
catch (Exception e)
{
throw new BuildException(e);
}
}
return contextDoc;
}
}
public static void main(String args[])
{
try{
VelocityEngine vx=new VelocityEngine();
vx.init();
StringWriter w = new StringWriter();
//VelocityContext context = new VelocityContext();
// Velocity.mergeTemplate("site.vsl", "ISO-8859-1", context, w );
Template t= vx.getTemplate("//site.vsl");
System.out.println("tnnnnnnnnnn is"+t);
AnakiaTask at = new AnakiaTask();
File finput=new File("../MyAnakia");//C:\\SonaliFolder\\Sonali\\velocity-1.5\\velocity-1.5\\examples\\anakia\\xdocs\\stylesheets");
at.setBasedir(finput);
File foutput=new File("../MyAnakia/index.txt");
at.setDestdir(foutput);
at.setExtension(".txt");
at.setLastModifiedCheck("off");
at.setProjectFile("project.xml");
at.setStyle("//site.vsl");
//System.out.println("Absolutue path is " +x.getAbsolutePath() );
// File ftemplate=new File("c:\\Files\\");
File ftemplate=new File("../MyAnakia");
//"//MyTemplate.vm");
at.setTemplatePath(ftemplate);
at.execute();
}
catch(Exception e){
System.out.println("exception in main is"+e.getMessage()+e.getCause()+e.getStackTrace());
e.printStackTrace();
}
}
}
Thanks
Varsha.
Re: Problem working witth AnakiaTask
Posted by Will Glass-Husain <wg...@gmail.com>.
Hi Varsha,
What version of ant are you running? What version of Anakia? (1.0?)
Can you make a simple version of what you are trying to do?
WILL
On 20 Oct 2007 19:41:29 -0000, Varsha Kadam <va...@rediffmail.com>
wrote:
>
>
> Hi,
>
> I am trying to transform axml file into text file using anakia,but getting
> error(NullPointerException) for directory scenning.I tried to fix the
> problem but could not do it.....
>
> Please help me.
>
> Exception description:
>
> Transforming into:
> C:\SonaliFolder\Sonali\Workspace\MyAnakia\..\MyAnakia\index.txt
>
> java.lang.NullPointerException
> at
> org.apache.tools.ant.types.AbstractFileSet.setupDirectoryScanner(
> AbstractFileSet.java:464)
> at org.apache.tools.ant.types.AbstractFileSet.getDirectoryScanner(
> AbstractFileSet.java:430)
> at org.apache.tools.ant.taskdefs.MatchingTask.getDirectoryScanner(
> MatchingTask.java:192)
> at org.apache.anakia.AnakiaTask.execute(AnakiaTask.java:322)
> at org.apache.anakia.AnakiaTask.main(AnakiaTask.java:696)
>
>
> Modified AnakiaTask class:
>
> package org.apache.anakia;
>
> /*
> * 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.
> */
>
> import java.io.BufferedWriter;
> import java.io.File;
> import java.io.FileOutputStream;
> import java.io.IOException;
> import java.io.OutputStreamWriter;
> import java.io.StringWriter;
> import java.io.Writer;
> import java.util.Iterator;
> import java.util.LinkedList;
> import java.util.List;
> import java.util.StringTokenizer;
>
> import org.apache.commons.collections.ExtendedProperties;
> 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 org.apache.velocity.Template;
> import org.apache.velocity.VelocityContext;
> import org.apache.velocity.app.Velocity;
> import org.apache.velocity.app.VelocityEngine;
> import org.apache.velocity.runtime.RuntimeConstants;
> import org.apache.velocity.util.StringUtils;
> import org.jdom.Document;
> import org.jdom.JDOMException;
> import org.jdom.input.SAXBuilder;
> import org.jdom.output.Format;
> import org.xml.sax.SAXParseException;
>
> /**
> * The purpose of this Ant Task is to allow you to use
> * Velocity as an XML transformation tool like XSLT is.
> * So, instead of using XSLT, you will be able to use this
> * class instead to do your transformations. It works very
> * similar in concept to Ant's <style> task.
> * <p>
> * You can find more documentation about this class on the
> * Velocity
> * <a href="http://velocity.apache.org/engine/devel/docs/anakia.html
> ">Website</a>.
> *
> * @author <a href="mailto:jon@latchkey.com">Jon S. Stevens</a>
> * @author <a href="mailto:szegedia@freemail.hu">Attila Szegedi</a>
> * @version $Id: AnakiaTask.java 524478 2007-03-31 20:51:49Z wglass $
> */
> public class AnakiaTask extends MatchingTask
> {
> /** <code>{@link SAXBuilder}</code> instance to use */
> SAXBuilder builder;
>
> /** the destination directory */
> private File destDir = null;
>
> /** the base directory */
> File baseDir = null;
>
> /** the style= attribute */
> private String style = null;
>
> /** last modified of the style sheet */
> private long styleSheetLastModified = 0;
>
> /** the projectFile= attribute */
> private String projectAttribute = null;
>
> /** the File for the project.xml file */
> private File projectFile = null;
>
> /** 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 lastModifiedCheck = true;
>
> /** the default output extension is .html */
> private String extension = ".html";
>
> /** the template path */
> private String templatePath = null;
>
> /** the file to get the velocity properties file */
> private File velocityPropertiesFile = null;
>
> /** the VelocityEngine instance to use */
> private VelocityEngine ve = new VelocityEngine();
>
> /** the Velocity subcontexts */
> private List contexts = new LinkedList();
>
> /**
> * Constructor creates the SAXBuilder.
> */
> public AnakiaTask()
> {
> builder = new SAXBuilder();
> builder.setFactory(new AnakiaJDOMFactory());
> }
>
> /**
> * Set the base directory.
> * @param dir
> */
> public void setBasedir(File dir)
> {
> baseDir = dir;
> }
>
> /**
> * Set the destination directory into which the VSL result
> * files should be copied to
> * @param dir the name of the destination directory
> */
> public void setDestdir(File dir)
> {
> destDir = dir;
> }
>
> /**
> * Allow people to set the default output file extension
> * @param extension
> */
> public void setExtension(String extension)
> {
> this.extension = extension;
> }
>
> /**
> * Allow people to set the path to the .vsl file
> * @param style
> */
> public void setStyle(String style)
> {
> this.style = style;
> }
>
> /**
> * Allow people to set the path to the project.xml file
> * @param projectAttribute
> */
> public void setProjectFile(String projectAttribute)
> {
> this.projectAttribute = projectAttribute;
> }
>
> /**
> * Set the path to the templates.
> * The way it works is this:
> * If you have a Velocity.properties file defined, this method
> * will <strong>override</strong> whatever is set in the
> * Velocity.properties file. This allows one to not have to define
> * a Velocity.properties file, therefore using Velocity's defaults
> * only.
> * @param templatePath
> */
>
> public void setTemplatePath(File templatePath)
> {
> try
> {
> this.templatePath = templatePath.getCanonicalPath();
> System.out.println("template path is "+templatePath);
> }
> catch (java.io.IOException ioe)
> {
> throw new BuildException(ioe);
> }
> }
>
> /**
> * Allow people to set the path to the velocity.properties file
> * This file is found relative to the path where the JVM was run.
> * For example, if build.sh was executed in the ./build directory,
> * then the path would be relative to this directory.
> * This is optional based on the setting of setTemplatePath().
> * @param velocityPropertiesFile
> */
> public void setVelocityPropertiesFile(File velocityPropertiesFile)
> {
> this.velocityPropertiesFile = velocityPropertiesFile;
> }
>
> /**
> * Turn on/off last modified checking. by default, it is on.
> * @param lastmod
> */
> public void setLastModifiedCheck(String lastmod)
> {
> if (lastmod.equalsIgnoreCase("false") || lastmod.equalsIgnoreCase
> ("no")
> || lastmod.equalsIgnoreCase("off"))
> {
> this.lastModifiedCheck = false;
> }
> }
>
> /**
> * Main body of the application
> * @throws BuildException
> */
> public void execute () throws BuildException
> {
> DirectoryScanner scanner;
> String[] list;
>
> if (baseDir == null)
> {
> baseDir = project.resolveFile(".");
> }
> if (destDir == null )
> {
> String msg = "destdir attribute must be set!";
> throw new BuildException(msg);
> }
> if (style == null)
> {
> throw new BuildException("style attribute must be set!");
> }
>
> if (velocityPropertiesFile == null)
> {
> velocityPropertiesFile = new File("velocity.properties");
> }
>
> /*
> * If the props file doesn't exist AND a templatePath hasn't
> * been defined, then throw the exception.
> */
> if ( !velocityPropertiesFile.exists() && templatePath == null )
> {
> throw new BuildException ("No template path and could not " +
> "locate velocity.properties file: " +
> velocityPropertiesFile.getAbsolutePath());
> }
>
> 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.exists())
> {
> projectFileLastModified = projectFile.lastModified();
> }
> else
> {
> log ("Project file is defined, but could not be located: "
> +
> projectFile.getAbsolutePath(), Project.MSG_INFO );
> projectFile = null;
> }
> }
>
> Document projectDocument = null;
> try
> {
> if ( velocityPropertiesFile.exists() )
> {
> String file = velocityPropertiesFile.getAbsolutePath();
> System.out.println("velocityPropertiesFile.getAbsolutePath
> ()"+file);
> ExtendedProperties config = new ExtendedProperties(file);
> ve.setExtendedProperties(config);
> }
>
> // override the templatePath if it exists
> if (templatePath != null && templatePath.length() > 0)
> {
> System.out.println("teplate path and runtime constant
> is"+templatePath+RuntimeConstants.FILE_RESOURCE_LOADER_PATH);
> ve.setProperty( RuntimeConstants.FILE_RESOURCE_LOADER_PATH,
> templatePath);
> System.out.println("
> RuntimeConstants.FILE_RESOURCE_LOADER_PATH
> "+RuntimeConstants.FILE_RESOURCE_LOADER_PATH);
> System.out.println("templatePath"+templatePath);
> }
> //VelocityEngine vx=new VelocityEngine();
> ve.init();
> //vx.init();
> //VelocityContext context = new VelocityContext();
> //File f=new File("c:\\Files\\site.vsl");
> // context.put("root",f);
> // get the last modification of the VSL stylesheet
> System.out.println("stylr is"+style);
> Template template = ve.getTemplate(style);
> System.out.println("template found here is"+template);
> //template.merge(context, writer);
> styleSheetLastModified = ve.getTemplate("site.vsl
> ").getLastModified();
>
> // Build the Project file document
> if (projectFile != null)
> {
> projectDocument = builder.build(projectFile);
> }
> }
> catch (Exception e)
> {
> log("Error: " + e.toString(), Project.MSG_INFO);
> System.out.println("cause of exception
> is"+e.getCause()+e.getMessage());
> Object ex=e.getClass();
> System.out.println("Object is"+ex.toString()+ex.getClass());
> throw new BuildException(e);
> }
>
> // find the files/directories
> System.out.println("base dir"+baseDir);
> scanner = getDirectoryScanner(baseDir);
> System.out.println("scanner"+scanner);
>
> // get a list of files to work on
> list = scanner.getIncludedFiles();
> for (int i = 0;i < list.length; ++i)
> {
> process(list[i], projectDocument );
> }
>
> }
>
> /**
> * Process an XML file using Velocity
> */
> private void process(String xmlFile, Document projectDocument)
> throws BuildException
> {
> File outFile=null;
> File inFile=null;
> Writer writer = 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 (lastModifiedCheck == false ||
> (inFile.lastModified() > outFile.lastModified() ||
> styleSheetLastModified > outFile.lastModified() ||
> projectFileLastModified > outFile.lastModified() ||
> userContextsModifed(outFile.lastModified())))
> {
> ensureDirectoryFor( outFile );
>
> //-- command line status
> log("Input: " + xmlFile, Project.MSG_INFO );
>
> // Build the JDOM Document
> Document root = builder.build(inFile);
>
> // Shove things into the Context
> VelocityContext context = new VelocityContext();
>
> /*
> * get the property TEMPLATE_ENCODING
> * we know it's a string...
> */
> String encoding = (String) ve.getProperty(
> RuntimeConstants.OUTPUT_ENCODING );
> if (encoding == null || encoding.length() == 0
> || encoding.equals("8859-1") || encoding.equals
> ("8859_1"))
> {
> encoding = "ISO-8859-1";
> }
>
> Format f = Format.getRawFormat();
> f.setEncoding(encoding);
>
> OutputWrapper ow = new OutputWrapper(f);
>
> context.put ("root", root.getRootElement());
> context.put ("xmlout", ow );
> context.put ("relativePath", getRelativePath(xmlFile));
> context.put ("treeWalk", new TreeWalker());
> context.put ("xpath", new XPathTool() );
> context.put ("escape", new Escape() );
> context.put ("date", new java.util.Date() );
>
> /**
> * only put this into the context if it exists.
> */
> if (projectDocument != null)
> {
> context.put ("project", projectDocument.getRootElement
> ());
> System.out.println("context has put project ef
> with->"+projectDocument.getRootElement());
> }
>
> /**
> * Add the user subcontexts to the to context
> */
> for (Iterator iter = contexts.iterator(); iter.hasNext();)
> {
> Context subContext = (Context) iter.next();
> if (subContext == null)
> {
> throw new BuildException("Found an undefined
> SubContext!");
> }
>
> if (subContext.getContextDocument() == null)
> {
> throw new BuildException("Could not build a
> subContext for " + subContext.getName());
> }
>
> context.put(subContext.getName(), subContext
> .getContextDocument().getRootElement());
> }
>
> /**
> * Process the VSL template with the context and write out
> * the result as the outFile.
> */
> writer = new BufferedWriter(new OutputStreamWriter(
> new FileOutputStream(outFile),
> encoding));
>
> /**
> * get the template to process
> */
> Template template = ve.getTemplate(style);
> System.out.println("template found here is"+template);
> template.merge(context, writer);
>
> log("Output: " + outFile, Project.MSG_INFO );
> }
> }
> catch (JDOMException e)
> {
> outFile.delete();
>
> if (e.getCause() != null)
> {
> Throwable rootCause = e.getCause();
> if (rootCause instanceof SAXParseException)
> {
> System.out.println("");
> System.out.println("Error: " + rootCause.getMessage
> ());
> System.out.println(
> " Line: " +
> ((SAXParseException)rootCause).getLineNumber()
> +
> " Column: " +
>
> ((SAXParseException)rootCause).getColumnNumber());
> System.out.println("");
> }
> else
> {
> rootCause.printStackTrace();
> }
> }
> else
> {
> e.printStackTrace();
> }
> }
> catch (Throwable e)
> {
> if (outFile != null)
> {
> outFile.delete();
> }
> e.printStackTrace();
> }
> finally
> {
> if (writer != null)
> {
> try
> {
> writer.flush();
> }
> catch (IOException e)
> {
> // Do nothing
> }
>
> try
> {
> writer.close();
> }
> catch (IOException e)
> {
> // Do nothing
> }
> }
> }
> }
>
> /**
> * Hacky method to figure out the relative path
> * that we are currently in. This is good for getting
> * the relative path for images and anchor's.
> */
> private String getRelativePath(String file)
> {
> if (file == null || file.length()==0)
> return "";
> StringTokenizer st = new StringTokenizer(file, "/\\");
> // needs to be -1 cause ST returns 1 even if there are no matches.
> huh?
> int slashCount = st.countTokens() - 1;
> StringBuffer sb = new StringBuffer();
> for (int i=0;i<slashCount ;i++ )
> {
> sb.append ("../");
> }
>
> if (sb.toString().length() > 0)
> {
> return StringUtils.chop(sb.toString(), 1);
> }
>
> return ".";
> }
>
> /**
> * 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() );
> }
> }
> }
>
>
> /**
> * Check to see if user context is modified.
> */
> private boolean userContextsModifed(long lastModified)
> {
> for (Iterator iter = contexts.iterator(); iter.hasNext();)
> {
> AnakiaTask.Context ctx = (AnakiaTask.Context) iter.next();
> if(ctx.getLastModified() > lastModified)
> {
> return true;
> }
> }
> return false;
> }
>
> /**
> * Create a new context.
> * @return A new context.
> */
> public Context createContext()
> {
> Context context = new Context();
> contexts.add(context);
> return context;
> }
>
>
> /**
> * A context implementation that loads all values from an XML file.
> */
> public class Context
> {
>
> private String name;
> private Document contextDoc = null;
> private String file;
>
> /**
> * Public constructor.
> */
> public Context()
> {
> }
>
> /**
> * Get the name of the context.
> * @return The name of the context.
> */
> public String getName()
> {
> return name;
> }
>
> /**
> * Set the name of the context.
> * @param name
> *
> * @throws IllegalArgumentException if a reserved word is used as
> a
> * name, specifically any of "relativePath", "treeWalk", "xpath",
> * "escape", "date", or "project"
> */
> public void setName(String name)
> {
> if (name.equals("relativePath") ||
> name.equals("treeWalk") ||
> name.equals("xpath") ||
> name.equals("escape") ||
> name.equals("date") ||
> name.equals("project"))
> {
>
> throw new IllegalArgumentException("Context name '" +
> name
> + "' is reserved by Anakia");
> }
>
> this.name = name;
> }
>
> /**
> * Build the context based on a file path.
> * @param file
> */
> public void setFile(String file)
> {
> this.file = file;
> }
>
> /**
> * Retrieve the time the source file was last modified.
> * @return The time the source file was last modified.
> */
> public long getLastModified()
> {
> return new File(baseDir, file).lastModified();
> }
>
> /**
> * Retrieve the context document object.
> * @return The context document object.
> */
> public Document getContextDocument()
> {
> if (contextDoc == null)
> {
> File contextFile = new File(baseDir, file);
>
> try
> {
> contextDoc = builder.build(contextFile);
> }
> catch (Exception e)
> {
> throw new BuildException(e);
> }
> }
> return contextDoc;
> }
> }
>
> public static void main(String args[])
> {
> try{
> VelocityEngine vx=new VelocityEngine();
> vx.init();
> StringWriter w = new StringWriter();
> //VelocityContext context = new VelocityContext();
>
> // Velocity.mergeTemplate("site.vsl", "ISO-8859-1", context, w
> );
> Template t= vx.getTemplate("//site.vsl");
> System.out.println("tnnnnnnnnnn is"+t);
> AnakiaTask at = new AnakiaTask();
> File finput=new
> File("../MyAnakia");//C:\\SonaliFolder\\Sonali\\velocity-
> 1.5\\velocity-1.5\\examples\\anakia\\xdocs\\stylesheets");
> at.setBasedir(finput);
>
> File foutput=new File("../MyAnakia/index.txt");
> at.setDestdir(foutput);
> at.setExtension(".txt");
> at.setLastModifiedCheck("off");
> at.setProjectFile("project.xml");
>
>
> at.setStyle("//site.vsl");
>
>
>
> //System.out.println("Absolutue path is " +x.getAbsolutePath() );
> // File ftemplate=new File("c:\\Files\\");
> File ftemplate=new File("../MyAnakia");
> //"//MyTemplate.vm");
> at.setTemplatePath(ftemplate);
> at.execute();
> }
> catch(Exception e){
> System.out.println("exception in main
> is"+e.getMessage()+e.getCause()+e.getStackTrace());
> e.printStackTrace();
> }
> }
> }
>
> Thanks
> Varsha.
--
Forio Business Simulations
Will Glass-Husain
wglass@forio.com
www.forio.com