diff --git a/build.xml b/build.xml index 2cc238f7f..8ba141bc5 100644 --- a/build.xml +++ b/build.xml @@ -37,6 +37,10 @@ + + @@ -60,6 +64,8 @@ optimize="on" > + + diff --git a/docs/index.html b/docs/index.html index c029c4de7..8bd0e04a2 100644 --- a/docs/index.html +++ b/docs/index.html @@ -493,6 +493,7 @@ If you do not want these default excludes applied, you may disable them with the
  • Tar
  • Taskdef
  • Tstamp
  • +
  • Style
  • Untar
  • Zip
  • @@ -2287,6 +2288,67 @@ initialization target.

    Examples

      <tstamp/>

    +

    Style

    +

    Description

    +

    Process a set of documents via XSLT.

    +

    This is useful for building views of XML based documentation, +or in generating code.

    +

    It is possible to refine the set of files that are being copied. This can be +done with the includes, excludes and defaultexcludes +attributes. With the includes attribute you specify the files you want to +have included by using patterns. The exclude attribute is used to specify +the files you want to have excluded. This is also done with patterns. And +finally with the defaultexcludes attribute, you can specify whether you +want to use default exclusions or not. See the section on directory based tasks, on how the +inclusion/exclusion of files works, and how to write patterns. The patterns are +relative to the basedir directory.

    +

    Parameters

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    AttributeDescriptionRequired
    basedirwhere to find the source xml file.Yes
    destdirdirectory where to store the results.Yes
    extentiondesired file extension to be used for the targets. + If not specified, the default is "html".No
    stylename of the stylesheet to use.Yes
    processorname of the XSLT processor to use. Permissable +values are "xslp" for the XSL:P processor, "xalan" for the Apache XML Xalan +processor, or the name of an arbitrary XSLTLiaison class. +Defaults to xslp or xalan (in that order), if one is found in your +class pathNo
    +

    Examples

    +
    +

    +<style basedir="doc" destdir="build/doc"
    +       extension="html" style="style/apache.xml"/>
    +

    +
    +

    Untar

    Description

    Untars a tarfile.

    diff --git a/src/main/org/apache/tools/ant/taskdefs/XSLTLiaison.java b/src/main/org/apache/tools/ant/taskdefs/XSLTLiaison.java new file mode 100644 index 000000000..b155fbaf3 --- /dev/null +++ b/src/main/org/apache/tools/ant/taskdefs/XSLTLiaison.java @@ -0,0 +1,70 @@ +/* + * The Apache Software License, Version 1.1 + * + * Copyright (c) 1999 The Apache Software Foundation. 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 acknowlegement: + * "This product includes software developed by the + * Apache Software Foundation (http://www.apache.org/)." + * Alternately, this acknowlegement may appear in the software itself, + * if and wherever such third-party acknowlegements normally appear. + * + * 4. The names "The Jakarta Project", "Tomcat", and "Apache Software + * Foundation" must not be used to endorse or promote products derived + * from this software without prior written permission. For written + * permission, please contact apache@apache.org. + * + * 5. Products derived from this software may not be called "Apache" + * nor may "Apache" appear in their names without prior written + * permission of the Apache Group. + * + * 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 APACHE SOFTWARE FOUNDATION 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 Apache Software Foundation. For more + * information on the Apache Software Foundation, please see + * . + */ + +package org.apache.tools.ant.taskdefs; + +import org.apache.tools.ant.*; + +/** + * + * @author Sam Ruby + * @version $Revision$ $Date$ + */ +public interface XSLTLiaison { + + public void setStylesheet(String fileName) throws Exception; + + public void transform(String infile, String outfile) throws Exception; + +} //-- XSLTLiaison diff --git a/src/main/org/apache/tools/ant/taskdefs/XSLTProcess.java b/src/main/org/apache/tools/ant/taskdefs/XSLTProcess.java new file mode 100644 index 000000000..40df8748e --- /dev/null +++ b/src/main/org/apache/tools/ant/taskdefs/XSLTProcess.java @@ -0,0 +1,310 @@ +/* + * The Apache Software License, Version 1.1 + * + * Copyright (c) 1999 The Apache Software Foundation. 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 acknowlegement: + * "This product includes software developed by the + * Apache Software Foundation (http://www.apache.org/)." + * Alternately, this acknowlegement may appear in the software itself, + * if and wherever such third-party acknowlegements normally appear. + * + * 4. The names "The Jakarta Project", "Tomcat", and "Apache Software + * Foundation" must not be used to endorse or promote products derived + * from this software without prior written permission. For written + * permission, please contact apache@apache.org. + * + * 5. Products derived from this software may not be called "Apache" + * nor may "Apache" appear in their names without prior written + * permission of the Apache Group. + * + * 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 APACHE SOFTWARE FOUNDATION 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 Apache Software Foundation. For more + * information on the Apache Software Foundation, please see + * . + */ + +package org.apache.tools.ant.taskdefs; + +import org.apache.tools.ant.*; + +import java.io.*; +import java.util.Enumeration; +import java.util.Hashtable; +import java.util.StringTokenizer; +import java.util.Vector; + + +/** + * A Task to process via XSLT a set of XML documents. This is + * useful for building views of XML based documentation. + * arguments: + *
      + *
    • basedir + *
    • destdir + *
    • style + *
    • includes + *
    • excludes + *
    + * Of these arguments, the sourcedir and destdir are required. + *

    + * This task will recursively scan the sourcedir and destdir + * looking for XML documents to process via XSLT. Any other files, + * such as images, or html files in the source directory will be + * copied into the destination directory. + * + * @author Keith Visco + * @author Sam Ruby + * @version $Revision$ $Date$ + */ +public class XSLTProcess extends MatchingTask { + + private File destDir = null; + + private File baseDir = null; + + private File xslFile = null; + + private String targetExtension = "html"; + + private XSLTLiaison liaison; + + /** + * Creates a new XSLTProcess Task. + **/ + public XSLTProcess() { + } //-- XSLTProcess + + /** + * Executes the task. + */ + + public void execute() throws BuildException { + DirectoryScanner scanner; + String[] list; + String[] dirs; + + if (baseDir == null) + baseDir = project.resolveFile("."); + //-- make sure Source directory exists... + if (destDir == null ) { + String msg = "destdir attributes must be set!"; + throw new BuildException(msg); + } + scanner = getDirectoryScanner(baseDir); + project.log("Transforming into "+destDir,project.MSG_INFO); + + try { + // Create a new XSL processor with the specified stylesheet + if (xslFile != null) { + project.log("Loading stylesheet " + xslFile, project.MSG_INFO); + liaison.setStylesheet( new File(baseDir,xslFile.toString()).toString() ); + } + } catch (Exception ex) { + project.log("Failed to read stylesheet " + xslFile,project.MSG_INFO); + throw new BuildException(ex); + } + + // Process all the files marked for styling + list = scanner.getIncludedFiles(); + for (int i = 0;i < list.length; ++i) { + process(baseDir,list[i],destDir); + } + + // Process all the directoried marked for styling + dirs = scanner.getIncludedDirectories(); + for (int j = 0;j < dirs.length;++j){ + list=new File(baseDir,dirs[j]).list(); + for (int i = 0;i < list.length;++i) + process(baseDir,list[i],destDir); + } + } //-- execute + + /** + * Set the base directory. + **/ + public void setBasedir(String dirName) { + baseDir = project.resolveFile(dirName); + } //-- setSourceDir + + /** + * Set the destination directory into which the XSL result + * files should be copied to + * @param dirName the name of the destination directory + **/ + public void setDestdir(String dirName) { + destDir = project.resolveFile(dirName); + } //-- setDestDir + + /** + * Set the desired file extension to be used for the target + * @param name the extension to use + **/ + public void setExtension(String name) { + targetExtension = name; + } //-- setDestDir + + /** + * Sets the file to use for styling relative to the base directory. + */ + public void setStyle(String xslFile) { + this.xslFile = new File(xslFile); + } + + /** + * Sets the file to use for styling relative to the base directory. + */ + public void setProcessor(String processor) throws Exception { + if (processor.equals("xslp")) { + liaison = (XSLTLiaison) Class.forName("org.apache.tools.ant.taskdefs.optional.XslpLiaison").newInstance(); + } if (processor.equals("xalan")) { + liaison = (XSLTLiaison) Class.forName("org.apache.tools.ant.taskdefs.optional.XalanLiaison").newInstance(); + } else { + liaison = (XSLTLiaison) Class.forName(processor).newInstance(); + } + + } + + /* + private void process(File sourceDir, File destDir) + throws BuildException + { + + + // if processor wasn't specified, default it to xslp or xalan, + // depending on which is in the classpath + if (liaison == null) + try { + setProcessor("xslp"); + } catch (Exception e) { + try { + setProcessor("xalan"); + } catch (Exception e) { + throw new BuildException(e); + } + } + } + + if (!sourceDir.isDirectory()) { + throw new BuildException(sourceDir.getName() + + " is not a directory!"); + } + else if (!destDir.isDirectory()) { + throw new BuildException(destDir.getName() + + " is not a directory!"); + } + + String[] list = sourceDir.list(new DesirableFilter()); + + if (list == null) { + return; //-- nothing to do + } + + for (int i = 0; i < list.length; i++) { + + String filename = list[i]; + + File inFile = new File(sourceDir, filename); + + //-- if inFile is a directory, recursively process it + if (inFile.isDirectory()) { + if (!excluded(filename)) { + new File(destDir, filename).mkdir(); + process(inFile, new File(destDir, filename)); + } + } + //-- process XML files + else if (hasXMLFileExtension(filename) && ! excluded(filename)) { + + //-- replace extension with the target extension + int idx = filename.lastIndexOf('.'); + + File outFile = new File(destDir, + filename.substring(0,idx) + targetExt); + + if ((inFile.lastModified() > outFile.lastModified()) || + (xslFile != null && xslFile.lastModified() > outFile.lastModified())) + { + processXML(inFile, outFile); + } + } + else { + File outFile = new File(destDir, filename); + if (inFile.lastModified() > outFile.lastModified()) { + try { + copyFile(inFile, outFile); + } + catch(java.io.IOException ex) { + String err = "error copying file: "; + err += inFile.getAbsolutePath(); + err += "; " + ex.getMessage(); + throw new BuildException(err, ex); + } + //filecopyList.put(srcFile.getAbsolutePath(), + //destFile.getAbsolutePath()); + } + } + } //-- + } //-- process(File, File) + */ + + /** + * Processes the given input XML file and stores the result + * in the given resultFile. + **/ + private void process(File baseDir,String xmlFile,File destDir) + throws BuildException + { + String fileExt=".html"; + File outFile=null; + File inFile=null; + + try { + inFile = new File(baseDir,xmlFile); + outFile = new File(destDir,xmlFile.substring(0,xmlFile.lastIndexOf('.'))+fileExt); + if (inFile.lastModified() > outFile.lastModified()) { + //-- command line status + project.log("Processing " + xmlFile + " to " + outFile,project.MSG_VERBOSE); + + liaison.transform(inFile.toString(), outFile.toString()); + } + } + catch (Exception ex) { + // If failed to process document, must delete target document, + // or it will not attempt to process it the second time + project.log("Failed to process " + inFile,project.MSG_INFO); + outFile.delete(); + throw new BuildException(ex); + } + + } //-- processXML + +} //-- XSLTProcess diff --git a/src/main/org/apache/tools/ant/taskdefs/defaults.properties b/src/main/org/apache/tools/ant/taskdefs/defaults.properties index d9fffa6b9..8093640c7 100644 --- a/src/main/org/apache/tools/ant/taskdefs/defaults.properties +++ b/src/main/org/apache/tools/ant/taskdefs/defaults.properties @@ -31,6 +31,7 @@ fixcrlf=org.apache.tools.ant.taskdefs.FixCRLF rename=org.apache.tools.ant.taskdefs.Rename patch=org.apache.tools.ant.taskdefs.Patch compileTask=org.apache.tools.ant.taskdefs.CompileTask +style=org.apache.tools.ant.taskdefs.XSLTProcess # optional tasks script=org.apache.tools.ant.taskdefs.optional.Script diff --git a/src/main/org/apache/tools/ant/taskdefs/optional/XalanLiaison.java b/src/main/org/apache/tools/ant/taskdefs/optional/XalanLiaison.java new file mode 100644 index 000000000..0babef7fa --- /dev/null +++ b/src/main/org/apache/tools/ant/taskdefs/optional/XalanLiaison.java @@ -0,0 +1,84 @@ +/* + * The Apache Software License, Version 1.1 + * + * Copyright (c) 1999 The Apache Software Foundation. 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 acknowlegement: + * "This product includes software developed by the + * Apache Software Foundation (http://www.apache.org/)." + * Alternately, this acknowlegement may appear in the software itself, + * if and wherever such third-party acknowlegements normally appear. + * + * 4. The names "The Jakarta Project", "Tomcat", and "Apache Software + * Foundation" must not be used to endorse or promote products derived + * from this software without prior written permission. For written + * permission, please contact apache@apache.org. + * + * 5. Products derived from this software may not be called "Apache" + * nor may "Apache" appear in their names without prior written + * permission of the Apache Group. + * + * 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 APACHE SOFTWARE FOUNDATION 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 Apache Software Foundation. For more + * information on the Apache Software Foundation, please see + * . + */ + +package org.apache.tools.ant.taskdefs.optional; + +import org.apache.tools.ant.taskdefs.XSLTLiaison; + +import org.apache.xalan.xslt.XSLTProcessorFactory; +import org.apache.xalan.xslt.XSLTProcessor; +import org.apache.xalan.xslt.XSLTInputSource; +import org.apache.xalan.xslt.XSLTResultTarget; + +/** + * + * @author Sam Ruby + * @version $Revision$ $Date$ + */ +public class XalanLiaison implements XSLTLiaison { + + XSLTProcessor processor; + XSLTInputSource xslSheet; + + public void setStylesheet(String fileName) throws Exception { + xslSheet = new XSLTInputSource (fileName); + }; + + public void transform(String infile, String outfile) throws Exception { + if (processor == null) processor = XSLTProcessorFactory.getProcessor(); + processor.process(new XSLTInputSource(infile), xslSheet, + new XSLTResultTarget(outfile)); + } + +} //-- XalanLiaison diff --git a/src/main/org/apache/tools/ant/taskdefs/optional/XslpLiaison.java b/src/main/org/apache/tools/ant/taskdefs/optional/XslpLiaison.java new file mode 100644 index 000000000..f321bf75e --- /dev/null +++ b/src/main/org/apache/tools/ant/taskdefs/optional/XslpLiaison.java @@ -0,0 +1,85 @@ +/* + * The Apache Software License, Version 1.1 + * + * Copyright (c) 1999 The Apache Software Foundation. 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 acknowlegement: + * "This product includes software developed by the + * Apache Software Foundation (http://www.apache.org/)." + * Alternately, this acknowlegement may appear in the software itself, + * if and wherever such third-party acknowlegements normally appear. + * + * 4. The names "The Jakarta Project", "Tomcat", and "Apache Software + * Foundation" must not be used to endorse or promote products derived + * from this software without prior written permission. For written + * permission, please contact apache@apache.org. + * + * 5. Products derived from this software may not be called "Apache" + * nor may "Apache" appear in their names without prior written + * permission of the Apache Group. + * + * 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 APACHE SOFTWARE FOUNDATION 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 Apache Software Foundation. For more + * information on the Apache Software Foundation, please see + * . + */ + +package org.apache.tools.ant.taskdefs.optional; + +import java.io.FileWriter; + +import org.apache.tools.ant.taskdefs.XSLTLiaison; + +import com.kvisco.xsl.XSLProcessor; +import com.kvisco.xsl.XSLReader; +import com.kvisco.xsl.XSLStylesheet; + +/** + * + * @author Sam Ruby + * @version $Revision$ $Date$ + */ +public class XslpLiaison implements XSLTLiaison { + + XSLProcessor processor; + XSLStylesheet xslSheet; + + public void setStylesheet(String fileName) throws Exception { + XSLReader xslReader = new XSLReader(); + xslSheet = xslReader.read( fileName ); + }; + + public void transform(String infile, String outfile) throws Exception { + if (processor == null) processor = new XSLProcessor(); + processor.process(infile, xslSheet, new FileWriter(outfile)); + } + +} //-- XSLPLiaison