From 435baa8edfb4cf4d6662d63fafc346ef1448c38b Mon Sep 17 00:00:00 2001 From: Adrian Cumiskey Date: Fri, 23 Oct 2009 11:22:53 +0000 Subject: Added support for xmlfile and xsltfile parameters in FOP's Ant Task. git-svn-id: https://svn.apache.org/repos/asf/xmlgraphics/fop/trunk@828999 13f79535-47bb-0310-9956-ffa450edef68 --- src/documentation/content/xdocs/trunk/anttask.xml | 35 ++++++ src/java/org/apache/fop/tools/anttasks/Fop.java | 138 +++++++++++++++++++--- 2 files changed, 157 insertions(+), 16 deletions(-) (limited to 'src') diff --git a/src/documentation/content/xdocs/trunk/anttask.xml b/src/documentation/content/xdocs/trunk/anttask.xml index 9dd508ad1..a543a5623 100644 --- a/src/documentation/content/xdocs/trunk/anttask.xml +++ b/src/documentation/content/xdocs/trunk/anttask.xml @@ -68,6 +68,16 @@ XSL-FO file to be rendered Yes, if no fileset nested element is used + + xmlfile + XML input file + Yes, if no fofile is specified + + + xsltfile + XSLT input file + Yes, if no fofile is specified + outfile Output filename @@ -194,6 +204,31 @@ + + ]]> +

+ The following example transforms and converts a single XML and XSLT file to an AFP document: +

+ + + + ]]> +

+ This example transforms and converts all XML files within an entire directory to PostScript: +

+ + + + + + ]]> diff --git a/src/java/org/apache/fop/tools/anttasks/Fop.java b/src/java/org/apache/fop/tools/anttasks/Fop.java index da25478c3..cfb8c8ade 100644 --- a/src/java/org/apache/fop/tools/anttasks/Fop.java +++ b/src/java/org/apache/fop/tools/anttasks/Fop.java @@ -34,6 +34,7 @@ import java.io.IOException; import java.io.OutputStream; import java.net.MalformedURLException; import java.util.List; +import java.util.Vector; // FOP import org.apache.fop.apps.FOPException; @@ -67,7 +68,10 @@ import org.xml.sax.SAXException; public class Fop extends Task { private File foFile; - private List filesets = new java.util.ArrayList(); + private File xmlFile; + private File xsltFile; + private String xsltParams; + private List/**/ filesets = new java.util.ArrayList/**/(); private File outFile; private File outDir; private String format; //MIME type @@ -111,6 +115,54 @@ public class Fop extends Task { return foFile; } + /** + * Gets the input XML file. + * @return the input XML file. + */ + public File getXmlFile() { + return xmlFile; + } + + /** + * Sets the input XML file. + * @param xmlFile the input XML file. + */ + public void setXmlFile(File xmlFile) { + this.xmlFile = xmlFile; + } + + /** + * Gets the input XSLT file. + * @return the input XSLT file. + */ + public File getXsltFile() { + return xsltFile; + } + + /** + * Sets the input XSLT file. + * @param xsltFile the input XSLT file. + */ + public void setXsltFile(File xsltFile) { + this.xsltFile = xsltFile; + } + + /** + * Gets the XSLT parameters + * @return the XSLT parameters + */ + public String getXsltParams() { + return xsltParams; + } + + /** + * Sets the XSLT parameters + * @param xsltParams the XSLT parameters + */ + public void setXsltParams(String xsltParams) { + this.xsltParams = xsltParams; + } + /** * Adds a set of XSL-FO files (nested fileset attribute). * @param set a fileset @@ -491,10 +543,39 @@ class FOPTaskStarter { skippedcount++; } } + } else if (task.getXmlFile() != null && task.getXsltFile() != null) { + if (task.getXmlFile().exists() && task.getXsltFile().exists()) { + File outf = task.getOutfile(); + if (outf == null) { + throw new BuildException("outfile is required when fofile is used"); + } + if (task.getOutdir() != null) { + outf = new File(task.getOutdir(), outf.getName()); + } + // Render if "force" flag is set OR + // OR output file doesn't exist OR + // output file is older than input file + if (task.getForce() || !outf.exists() + || (task.getXmlFile().lastModified() > outf.lastModified() || + task.getXsltFile().lastModified() > outf.lastModified())) { + render(task.getXmlFile(), task.getXsltFile(), outf, outputFormat); + actioncount++; + } else if (outf.exists() + && (task.getXmlFile().lastModified() <= outf.lastModified() || + task.getXsltFile().lastModified() <= outf.lastModified())) { + skippedcount++; + } + } } GlobPatternMapper mapper = new GlobPatternMapper(); - mapper.setFrom("*.fo"); + + String inputExtension = ".fo"; + File xsltFile = task.getXsltFile(); + if (xsltFile != null) { + inputExtension = ".xml"; + } + mapper.setFrom("*" + inputExtension); mapper.setTo("*" + newExtension); // deal with the filesets @@ -507,16 +588,19 @@ class FOPTaskStarter { File f = new File(fs.getDir(task.getProject()), files[j]); File outf = null; - if (task.getOutdir() != null && files[j].endsWith(".fo")) { + if (task.getOutdir() != null && files[j].endsWith(inputExtension)) { String[] sa = mapper.mapFileName(files[j]); outf = new File(task.getOutdir(), sa[0]); } else { - outf = replaceExtension(f, ".fo", newExtension); + outf = replaceExtension(f, inputExtension, newExtension); if (task.getOutdir() != null) { outf = new File(task.getOutdir(), outf.getName()); } } - + File dir = outf.getParentFile(); + if (!dir.exists()) { + dir.mkdirs(); + } try { if (task.getRelativebase()) { this.baseURL = f.getParentFile().toURI().toURL(). @@ -536,7 +620,11 @@ class FOPTaskStarter { // output file is older than input file if (task.getForce() || !outf.exists() || (f.lastModified() > outf.lastModified() )) { - render(f, outf, outputFormat); + if (xsltFile != null) { + render(f, xsltFile, outf, outputFormat); + } else { + render(f, outf, outputFormat); + } actioncount++; } else if (outf.exists() && (f.lastModified() <= outf.lastModified() )) { skippedcount++; @@ -554,10 +642,7 @@ class FOPTaskStarter { } } - private void render(File foFile, File outFile, - String outputFormat) throws FOPException { - InputHandler inputHandler = new InputHandler(foFile); - + private void renderInputHandler(InputHandler inputHandler, File outFile, String outputFormat) throws Exception { OutputStream out = null; try { out = new java.io.FileOutputStream(outFile); @@ -565,11 +650,6 @@ class FOPTaskStarter { } catch (Exception ex) { throw new BuildException("Failed to open " + outFile, ex); } - - if (task.getLogFiles()) { - task.log(foFile + " -> " + outFile, Project.MSG_INFO); - } - boolean success = false; try { FOUserAgent userAgent = fopFactory.newFOUserAgent(); @@ -580,7 +660,7 @@ class FOPTaskStarter { if (task.getThrowexceptions()) { throw new BuildException(ex); } - logger.error("Error rendering fo file: " + foFile, ex); + throw ex; } finally { try { out.close(); @@ -593,5 +673,31 @@ class FOPTaskStarter { } } + private void render(File foFile, File outFile, + String outputFormat) throws FOPException { + InputHandler inputHandler = new InputHandler(foFile); + try { + renderInputHandler(inputHandler, outFile, outputFormat); + } catch (Exception ex) { + logger.error("Error rendering fo file: " + foFile, ex); + } + if (task.getLogFiles()) { + task.log(foFile + " -> " + outFile, Project.MSG_INFO); + } + } + + private void render(File xmlFile, File xsltFile, File outFile, String outputFormat) { + //TODO: implement support for XSLT params + final Vector xsltParams = null; + InputHandler inputHandler = new InputHandler(xmlFile, xsltFile, xsltParams); + try { + renderInputHandler(inputHandler, outFile, outputFormat); + } catch (Exception ex) { + logger.error("Error rendering xml/xslt files: " + xmlFile + ", " + xsltFile, ex); + } + if (task.getLogFiles()) { + task.log("xml: " + xmlFile + ", xslt: " + xsltFile + " -> " + outFile, Project.MSG_INFO); + } + } } -- cgit v1.2.3