diff --git a/src/main/org/apache/tools/ant/taskdefs/XSLTLiaison.java b/src/main/org/apache/tools/ant/taskdefs/XSLTLiaison.java index b155fbaf3..cff58f509 100644 --- a/src/main/org/apache/tools/ant/taskdefs/XSLTLiaison.java +++ b/src/main/org/apache/tools/ant/taskdefs/XSLTLiaison.java @@ -65,6 +65,8 @@ public interface XSLTLiaison { public void setStylesheet(String fileName) throws Exception; + public void addParam(String name, String expression) 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 index f528109d8..2101f5a7d 100644 --- a/src/main/org/apache/tools/ant/taskdefs/XSLTProcess.java +++ b/src/main/org/apache/tools/ant/taskdefs/XSLTProcess.java @@ -95,6 +95,11 @@ public class XSLTProcess extends MatchingTask { private File xslFile = null; private String targetExtension = ".html"; + private Vector params = new Vector(); + + private File inFile = null; + + private File outFile = null; private XSLTLiaison liaison; @@ -113,8 +118,10 @@ public class XSLTProcess extends MatchingTask { String[] list; String[] dirs; - if (baseDir == null) + if (baseDir == null) { baseDir = project.resolveFile("."); + } + //-- make sure Source directory exists... if (destDir == null ) { String msg = "destdir attributes must be set!"; @@ -147,12 +154,22 @@ public class XSLTProcess extends MatchingTask { styleSheetLastModified = file.lastModified(); log( "Loading stylesheet " + file, Project.MSG_INFO); liaison.setStylesheet( file.toString() ); + for(Enumeration e = params.elements();e.hasMoreElements();) { + Param p = (Param)e.nextElement(); + liaison.addParam( p.getName(), p.getExpression() ); + } } catch (Exception ex) { log("Failed to read stylesheet " + xslFile, Project.MSG_INFO); throw new BuildException(ex); } } + // if we have an in file and out then process them + if (inFile != null && outFile != null) { + process(inFile, outFile, styleSheetLastModified); + return; + } + // Process all the files marked for styling list = scanner.getIncludedFiles(); for (int i = 0;i < list.length; ++i) { @@ -218,74 +235,19 @@ public class XSLTProcess extends MatchingTask { } - /* - private void process(File sourceDir, File destDir) - throws BuildException - { + /** + * Sets an out file + */ + public void setOut(File outFile){ + this.outFile = outFile; + } - - 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) - */ + /** + * Sets an input xml file to be styled + */ + public void setIn(File inFile){ + this.inFile = inFile; + } /** * Processes the given input XML file and stores the result @@ -301,12 +263,16 @@ public class XSLTProcess extends MatchingTask { try { inFile = new File(baseDir,xmlFile); - outFile = new File(destDir,xmlFile.substring(0,xmlFile.lastIndexOf('.'))+fileExt); + int dotPos = xmlFile.lastIndexOf('.'); + if(dotPos>0){ + outFile = new File(destDir,xmlFile.substring(0,xmlFile.lastIndexOf('.'))+fileExt); + }else{ + outFile = new File(destDir,xmlFile+fileExt); + } if (inFile.lastModified() > outFile.lastModified() || styleSheetLastModified > outFile.lastModified()) { ensureDirectoryFor( outFile ); - //-- command line status - log("Processing " + xmlFile + " to " + outFile, Project.MSG_VERBOSE); + log("Transforming into "+destDir); liaison.transform(inFile.toString(), outFile.toString()); } @@ -315,12 +281,33 @@ public class XSLTProcess extends MatchingTask { // If failed to process document, must delete target document, // or it will not attempt to process it the second time log("Failed to process " + inFile, Project.MSG_INFO); - outFile.delete(); + if (outFile != null) { + outFile.delete(); + } + throw new BuildException(ex); } } //-- processXML + private void process(File inFile, File outFile, long styleSheetLastModified) throws BuildException { + try{ + log("In file "+inFile+" time: " + inFile.lastModified() , Project.MSG_DEBUG); + log("Out file "+outFile+" time: " + outFile.lastModified() , Project.MSG_DEBUG); + log("Style file "+xslFile+" time: " + styleSheetLastModified , Project.MSG_DEBUG); + if (inFile.lastModified() > outFile.lastModified() || + styleSheetLastModified > outFile.lastModified()) { + ensureDirectoryFor( outFile ); + log("Processing " + inFile + " to " + outFile, Project.MSG_INFO); + liaison.transform(inFile.toString(), outFile.toString()); + } + }catch (Exception ex) { + log("Failed to process " + inFile, Project.MSG_INFO); + if(outFile!=null)outFile.delete(); + throw new BuildException(ex); + } + } + private void ensureDirectoryFor( File targetFile ) throws BuildException { File directory = new File( targetFile.getParent() ); if (!directory.exists()) { @@ -330,4 +317,33 @@ public class XSLTProcess extends MatchingTask { } } } + + public Param createParam() { + Param p = new Param(); + params.addElement(p); + return p; + } + + public class Param { + private String name=null; + private String expression=null; + + public void setName(String name){ + this.name = name; + } + + public void setExpression(String expression){ + this.expression = expression; + } + + public String getName() throws BuildException{ + if(name==null)throw new BuildException("Name attribute is missing."); + return name; + } + + public String getExpression() throws BuildException{ + if(expression==null)throw new BuildException("Expression attribute is missing."); + return expression; + } + } } //-- XSLTProcess diff --git a/src/main/org/apache/tools/ant/taskdefs/optional/XalanLiaison.java b/src/main/org/apache/tools/ant/taskdefs/optional/XalanLiaison.java index 5f05f4275..575015bc5 100644 --- a/src/main/org/apache/tools/ant/taskdefs/optional/XalanLiaison.java +++ b/src/main/org/apache/tools/ant/taskdefs/optional/XalanLiaison.java @@ -92,4 +92,8 @@ public class XalanLiaison implements XSLTLiaison { } return fileName; } + + public void addParam(String name, String value){ + processor.setStylesheetParam(name, value); + } } //-- 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 index b9dbad22d..393498ab1 100644 --- a/src/main/org/apache/tools/ant/taskdefs/optional/XslpLiaison.java +++ b/src/main/org/apache/tools/ant/taskdefs/optional/XslpLiaison.java @@ -85,4 +85,8 @@ public class XslpLiaison implements XSLTLiaison { processor.process(infile, xslSheet, new FileWriter(outfile)); } + public void addParam(String name, String expression){ + processor.setProperty(name, expression); + } + } //-- XSLPLiaison