diff --git a/src/main/org/apache/tools/ant/taskdefs/XSLTProcess.java b/src/main/org/apache/tools/ant/taskdefs/XSLTProcess.java
index e70e3c2d8..5128a44fb 100644
--- a/src/main/org/apache/tools/ant/taskdefs/XSLTProcess.java
+++ b/src/main/org/apache/tools/ant/taskdefs/XSLTProcess.java
@@ -84,6 +84,7 @@ import org.apache.tools.ant.*;
* @author Keith Visco
* @author Sam Ruby
* @author Russell Gold
+ * @author Stefan Bodewig
* @version $Revision$ $Date$
*/
public class XSLTProcess extends MatchingTask {
@@ -102,6 +103,7 @@ public class XSLTProcess extends MatchingTask {
private File outFile = null;
private XSLTLiaison liaison;
+ private boolean stylesheetLoaded = false;
/**
* Creates a new XSLTProcess Task.
@@ -118,6 +120,10 @@ public class XSLTProcess extends MatchingTask {
String[] list;
String[] dirs;
+ if (xslFile == null) {
+ throw new BuildException("no stylesheet specified", location);
+ }
+
if (baseDir == null) {
baseDir = project.resolveFile(".");
}
@@ -125,40 +131,22 @@ public class XSLTProcess extends MatchingTask {
liaison = getLiaison();
log("Using "+liaison.getClass().toString(), Project.MSG_VERBOSE);
- long styleSheetLastModified = 0;
- if (xslFile != null) {
- try {
- File file = project.resolveFile(xslFile, project.getBaseDir());
-
- if (!file.exists()) {
- file = project.resolveFile(xslFile, baseDir);
- /*
- * shouldn't throw out deprectaion warnings before we know,
- * the wrong version has been used.
- */
- if (file.exists()) {
- log("DEPRECATED - the style attribute should be relative to the project\'s");
- log(" basedir, not the tasks\'s basedir.");
- }
- }
-
- // Create a new XSL processor with the specified stylesheet
- 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);
+ File stylesheet = project.resolveFile(xslFile, project.getBaseDir());
+ if (!stylesheet.exists()) {
+ stylesheet = project.resolveFile(xslFile, baseDir);
+ /*
+ * shouldn't throw out deprecation warnings before we know,
+ * the wrong version has been used.
+ */
+ if (stylesheet.exists()) {
+ log("DEPRECATED - the style attribute should be relative to the project\'s");
+ log(" basedir, not the tasks\'s basedir.");
}
}
// if we have an in file and out then process them
if (inFile != null && outFile != null) {
- process(inFile, outFile, styleSheetLastModified);
+ process(inFile, outFile, stylesheet);
return;
}
@@ -178,7 +166,7 @@ public class XSLTProcess extends MatchingTask {
// Process all the files marked for styling
list = scanner.getIncludedFiles();
for (int i = 0;i < list.length; ++i) {
- process( baseDir, list[i], destDir, styleSheetLastModified );
+ process( baseDir, list[i], destDir, stylesheet );
}
// Process all the directoried marked for styling
@@ -186,7 +174,7 @@ public class XSLTProcess extends MatchingTask {
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, styleSheetLastModified );
+ process( baseDir, list[i], destDir, stylesheet );
}
} //-- execute
@@ -211,7 +199,7 @@ public class XSLTProcess extends MatchingTask {
* @param name the extension to use
**/
public void setExtension(String name) {
- targetExtension = name;
+ targetExtension = name;
} //-- setDestDir
/**
@@ -261,14 +249,15 @@ public class XSLTProcess extends MatchingTask {
* in the given resultFile.
**/
private void process(File baseDir, String xmlFile, File destDir,
- long styleSheetLastModified)
+ File stylesheet)
throws BuildException {
String fileExt=targetExtension;
File outFile=null;
File inFile=null;
-
+
try {
+ long styleSheetLastModified = stylesheet.lastModified();
inFile = new File(baseDir,xmlFile);
int dotPos = xmlFile.lastIndexOf('.');
if(dotPos>0){
@@ -281,6 +270,7 @@ public class XSLTProcess extends MatchingTask {
ensureDirectoryFor( outFile );
log("Transforming into "+destDir);
+ configureLiaison(stylesheet);
liaison.transform(inFile.toString(), outFile.toString());
}
}
@@ -297,8 +287,9 @@ public class XSLTProcess extends MatchingTask {
} //-- processXML
- private void process(File inFile, File outFile, long styleSheetLastModified) throws BuildException {
+ private void process(File inFile, File outFile, File stylesheet) throws BuildException {
try{
+ long styleSheetLastModified = stylesheet.lastModified();
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);
@@ -306,6 +297,7 @@ public class XSLTProcess extends MatchingTask {
styleSheetLastModified > outFile.lastModified()) {
ensureDirectoryFor( outFile );
log("Processing " + inFile + " to " + outFile, Project.MSG_INFO);
+ configureLiaison(stylesheet);
liaison.transform(inFile.toString(), outFile.toString());
}
}catch (Exception ex) {
@@ -374,4 +366,27 @@ public class XSLTProcess extends MatchingTask {
return expression;
}
}
+
+ /**
+ * Loads the stylesheet and set xsl:param parameters.
+ */
+ protected void configureLiaison(File stylesheet) throws BuildException {
+ if (stylesheetLoaded) {
+ return;
+ }
+ stylesheetLoaded = true;
+
+ try {
+ log( "Loading stylesheet " + stylesheet, Project.MSG_INFO);
+ liaison.setStylesheet( stylesheet.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 " + stylesheet, Project.MSG_INFO);
+ throw new BuildException(ex);
+ }
+ }
+
} //-- XSLTProcess