diff --git a/proposal/myrmidon/src/main/org/apache/tools/ant/taskdefs/optional/TraXLiaison.java b/proposal/myrmidon/src/java/org/apache/antlib/xml/TraXLiaison.java similarity index 90% rename from proposal/myrmidon/src/main/org/apache/tools/ant/taskdefs/optional/TraXLiaison.java rename to proposal/myrmidon/src/java/org/apache/antlib/xml/TraXLiaison.java index ddcbdc34f..bafba0593 100644 --- a/proposal/myrmidon/src/main/org/apache/tools/ant/taskdefs/optional/TraXLiaison.java +++ b/proposal/myrmidon/src/java/org/apache/antlib/xml/TraXLiaison.java @@ -5,7 +5,7 @@ * version 1.1, a copy of which has been included with this distribution in * the LICENSE file. */ -package org.apache.tools.ant.taskdefs.optional; +package org.apache.antlib.xml; import java.io.File; import java.io.FileInputStream; @@ -19,9 +19,8 @@ import javax.xml.transform.TransformerException; import javax.xml.transform.TransformerFactory; import javax.xml.transform.stream.StreamResult; import javax.xml.transform.stream.StreamSource; -import org.apache.tools.ant.taskdefs.XSLTLiaison; -import org.apache.tools.ant.taskdefs.XSLTLogger; -import org.apache.tools.ant.taskdefs.XSLTLoggerAware; +import org.apache.avalon.framework.logger.AbstractLogEnabled; +import org.apache.avalon.framework.logger.LogEnabled; /** * Concrete liaison for XSLT processor implementing TraX. (ie JAXP 1.1) @@ -30,30 +29,29 @@ import org.apache.tools.ant.taskdefs.XSLTLoggerAware; * @author Davanum Srinivas * @author Stephane Bailliez */ -public class TraXLiaison implements XSLTLiaison, ErrorListener, XSLTLoggerAware +public class TraXLiaison + extends AbstractLogEnabled + implements XSLTLiaison, ErrorListener { - /** * The trax TransformerFactory */ - private TransformerFactory tfactory = null; + private TransformerFactory tfactory; /** * stylesheet stream, close it asap */ - private FileInputStream xslStream = null; + private FileInputStream xslStream; /** * Stylesheet template */ - private Templates templates = null; + private Templates templates; /** * transformer */ - private Transformer transformer = null; - - private XSLTLogger logger; + private Transformer transformer; public TraXLiaison() throws Exception @@ -62,11 +60,6 @@ public class TraXLiaison implements XSLTLiaison, ErrorListener, XSLTLoggerAware tfactory.setErrorListener( this ); } - public void setLogger( XSLTLogger l ) - { - logger = l; - } - public void setOutputtype( String type ) throws Exception { @@ -214,7 +207,7 @@ public class TraXLiaison implements XSLTLiaison, ErrorListener, XSLTLoggerAware msg.append( " Cause: " + e.getCause() ); } - logger.log( msg.toString() ); + getLogger().info( msg.toString() ); } }//-- TraXLiaison diff --git a/proposal/myrmidon/src/main/org/apache/tools/ant/taskdefs/optional/XMLValidateTask.java b/proposal/myrmidon/src/java/org/apache/antlib/xml/XMLValidateTask.java similarity index 99% rename from proposal/myrmidon/src/main/org/apache/tools/ant/taskdefs/optional/XMLValidateTask.java rename to proposal/myrmidon/src/java/org/apache/antlib/xml/XMLValidateTask.java index c0658a2b9..c5eb6c354 100644 --- a/proposal/myrmidon/src/main/org/apache/tools/ant/taskdefs/optional/XMLValidateTask.java +++ b/proposal/myrmidon/src/java/org/apache/antlib/xml/XMLValidateTask.java @@ -5,7 +5,7 @@ * version 1.1, a copy of which has been included with this distribution in * the LICENSE file. */ -package org.apache.tools.ant.taskdefs.optional; +package org.apache.antlib.xml; import java.io.File; import java.io.FileInputStream; @@ -44,9 +44,9 @@ import org.xml.sax.helpers.ParserAdapter; * @author Raphael Pierquin * raphael.pierquin@agisphere.com */ -public class XMLValidateTask extends Task +public class XMLValidateTask + extends Task { - /** * The default implementation parser classname used by the task to process * validation. @@ -591,7 +591,7 @@ public class XMLValidateTask extends Task urlDTDs.put( publicId, urldtd ); } } - catch( java.net.MalformedURLException e ) + catch( MalformedURLException e ) { //ignored } diff --git a/proposal/myrmidon/src/main/org/apache/tools/ant/taskdefs/XSLTLiaison.java b/proposal/myrmidon/src/java/org/apache/antlib/xml/XSLTLiaison.java similarity index 98% rename from proposal/myrmidon/src/main/org/apache/tools/ant/taskdefs/XSLTLiaison.java rename to proposal/myrmidon/src/java/org/apache/antlib/xml/XSLTLiaison.java index 4a64f3f54..df3fc0ac1 100644 --- a/proposal/myrmidon/src/main/org/apache/tools/ant/taskdefs/XSLTLiaison.java +++ b/proposal/myrmidon/src/java/org/apache/antlib/xml/XSLTLiaison.java @@ -5,7 +5,7 @@ * version 1.1, a copy of which has been included with this distribution in * the LICENSE file. */ -package org.apache.tools.ant.taskdefs; +package org.apache.antlib.xml; import java.io.File; @@ -18,7 +18,6 @@ import java.io.File; */ public interface XSLTLiaison { - /** * the file protocol prefix for systemid. This file protocol must be * appended to an absolute path. Typically: FILE_PROTOCOL_PREFIX + diff --git a/proposal/myrmidon/src/java/org/apache/antlib/xml/XSLTParam.java b/proposal/myrmidon/src/java/org/apache/antlib/xml/XSLTParam.java new file mode 100644 index 000000000..766bd69d4 --- /dev/null +++ b/proposal/myrmidon/src/java/org/apache/antlib/xml/XSLTParam.java @@ -0,0 +1,46 @@ +/* + * Copyright (C) The Apache Software Foundation. All rights reserved. + * + * This software is published under the terms of the Apache Software License + * version 1.1, a copy of which has been included with this distribution in + * the LICENSE.txt file. + */ +package org.apache.antlib.xml; + +import org.apache.myrmidon.api.TaskException; + +public class XSLTParam +{ + private String m_name; + private String m_expression; + + public void setExpression( String expression ) + { + m_expression = expression; + } + + public void setName( String name ) + { + m_name = name; + } + + public String getExpression() + throws TaskException + { + if( m_expression == null ) + { + throw new TaskException( "Expression attribute is missing." ); + } + return m_expression; + } + + public String getName() + throws TaskException + { + if( m_name == null ) + { + throw new TaskException( "Name attribute is missing." ); + } + return m_name; + } +} diff --git a/proposal/myrmidon/src/todo/org/apache/tools/ant/taskdefs/XSLTProcess.java b/proposal/myrmidon/src/java/org/apache/antlib/xml/XSLTProcess.java similarity index 71% rename from proposal/myrmidon/src/todo/org/apache/tools/ant/taskdefs/XSLTProcess.java rename to proposal/myrmidon/src/java/org/apache/antlib/xml/XSLTProcess.java index c539945e9..e0eaed248 100644 --- a/proposal/myrmidon/src/todo/org/apache/tools/ant/taskdefs/XSLTProcess.java +++ b/proposal/myrmidon/src/java/org/apache/antlib/xml/XSLTProcess.java @@ -5,15 +5,18 @@ * version 1.1, a copy of which has been included with this distribution in * the LICENSE file. */ -package org.apache.tools.ant.taskdefs; +package org.apache.antlib.xml; import java.io.File; import java.util.Enumeration; import java.util.Vector; +import java.util.ArrayList; +import java.util.Iterator; import org.apache.myrmidon.api.TaskException; import org.apache.tools.ant.AntClassLoader; import org.apache.tools.ant.DirectoryScanner; import org.apache.tools.ant.Project; +import org.apache.tools.ant.taskdefs.MatchingTask; import org.apache.tools.ant.types.Path; import org.apache.tools.ant.types.Reference; import org.apache.tools.ant.util.FileUtils; @@ -41,44 +44,28 @@ import org.apache.tools.ant.util.FileUtils; */ public class XSLTProcess extends MatchingTask - implements XSLTLogger { - - private File destDir = null; - - private File baseDir = null; - - private String xslFile = null; - - private String targetExtension = ".html"; - private Vector params = new Vector(); - - private File inFile = null; - - private File outFile = null; - private Path classpath = null; - private boolean stylesheetLoaded = false; - - private boolean force = false; - - private String outputtype = null; - - private FileUtils fileUtils; - private XSLTLiaison liaison; - - private String processor; - - public void log( String msg ) - { - getLogger().info( msg ); - } + private File m_destDir; + private File m_baseDir; + private String m_xslFile; + private String m_targetExtension = ".html"; + private ArrayList m_params = new ArrayList(); + private File m_inFile; + private File m_outFile; + private Path m_classpath; + private boolean m_stylesheetLoaded; + private boolean m_force; + private String m_outputtype; + private FileUtils m_fileUtils; + private XSLTLiaison m_liaison; + private String m_processor; /** * Creates a new XSLTProcess Task. */ public XSLTProcess() { - fileUtils = FileUtils.newFileUtils(); + m_fileUtils = FileUtils.newFileUtils(); }//-- setForce /** @@ -88,7 +75,7 @@ public class XSLTProcess */ public void setBasedir( File dir ) { - baseDir = dir; + m_baseDir = dir; } /** @@ -112,7 +99,7 @@ public class XSLTProcess throws TaskException { createClasspath().setRefid( r ); - }//-- setSourceDir + } /** * Set the destination directory into which the XSL result files should be @@ -122,8 +109,8 @@ public class XSLTProcess */ public void setDestdir( File dir ) { - destDir = dir; - }//-- setDestDir + m_destDir = dir; + } /** * Set the desired file extension to be used for the target @@ -132,8 +119,8 @@ public class XSLTProcess */ public void setExtension( String name ) { - targetExtension = name; - }//-- execute + m_targetExtension = name; + } /** * Set whether to check dependencies, or always generate. @@ -142,7 +129,7 @@ public class XSLTProcess */ public void setForce( boolean force ) { - this.force = force; + this.m_force = force; } /** @@ -152,7 +139,7 @@ public class XSLTProcess */ public void setIn( File inFile ) { - this.inFile = inFile; + this.m_inFile = inFile; } /** @@ -162,7 +149,7 @@ public class XSLTProcess */ public void setOut( File outFile ) { - this.outFile = outFile; + this.m_outFile = outFile; } /** @@ -174,12 +161,12 @@ public class XSLTProcess */ public void setOutputtype( String type ) { - this.outputtype = type; + this.m_outputtype = type; } public void setProcessor( String processor ) { - this.processor = processor; + this.m_processor = processor; }//-- setDestDir /** @@ -190,7 +177,7 @@ public class XSLTProcess */ public void setStyle( String xslFile ) { - this.xslFile = xslFile; + this.m_xslFile = xslFile; } /** @@ -201,17 +188,17 @@ public class XSLTProcess public Path createClasspath() throws TaskException { - if( classpath == null ) + if( m_classpath == null ) { - classpath = new Path( project ); + m_classpath = new Path( project ); } - return classpath.createPath(); + return m_classpath.createPath(); } - public Param createParam() + public XSLTParam createParam() { - Param p = new Param(); - params.addElement( p ); + XSLTParam p = new XSLTParam(); + m_params.add( p ); return p; }//-- XSLTProcess @@ -228,32 +215,28 @@ public class XSLTProcess String[] list; String[] dirs; - if( xslFile == null ) + if( m_xslFile == null ) { throw new TaskException( "no stylesheet specified" ); } - if( baseDir == null ) + if( m_baseDir == null ) { - baseDir = getBaseDirectory(); + m_baseDir = getBaseDirectory(); } - liaison = getLiaison(); + m_liaison = getLiaison(); // check if liaison wants to log errors using us as logger - if( liaison instanceof XSLTLoggerAware ) - { - ( (XSLTLoggerAware)liaison ).setLogger( this ); - } - - log( "Using " + liaison.getClass().toString(), Project.MSG_VERBOSE ); + setupLogger( m_liaison ); - File stylesheet = resolveFile( xslFile ); + log( "Using " + m_liaison.getClass().toString(), Project.MSG_VERBOSE ); + File stylesheet = resolveFile( m_xslFile ); // if we have an in file and out then process them - if( inFile != null && outFile != null ) + if( m_inFile != null && m_outFile != null ) { - process( inFile, outFile, stylesheet ); + process( m_inFile, m_outFile, stylesheet ); return; } @@ -262,28 +245,28 @@ public class XSLTProcess * in batch processing mode. */ //-- make sure Source directory exists... - if( destDir == null ) + if( m_destDir == null ) { String msg = "destdir attributes must be set!"; throw new TaskException( msg ); } - scanner = getDirectoryScanner( baseDir ); - log( "Transforming into " + destDir, Project.MSG_INFO ); + scanner = getDirectoryScanner( m_baseDir ); + log( "Transforming into " + m_destDir, Project.MSG_INFO ); // Process all the files marked for styling list = scanner.getIncludedFiles(); for( int i = 0; i < list.length; ++i ) { - process( baseDir, list[ i ], destDir, stylesheet ); + process( m_baseDir, list[ i ], m_destDir, stylesheet ); } // 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(); + list = new File( m_baseDir, dirs[ j ] ).list(); for( int i = 0; i < list.length; ++i ) - process( baseDir, list[ i ], destDir, stylesheet ); + process( m_baseDir, list[ i ], m_destDir, stylesheet ); } } @@ -292,13 +275,13 @@ public class XSLTProcess { // if processor wasn't specified, see if TraX is available. If not, // default it to xslp or xalan, depending on which is in the classpath - if( liaison == null ) + if( m_liaison == null ) { - if( processor != null ) + if( m_processor != null ) { try { - resolveProcessor( processor ); + resolveProcessor( m_processor ); } catch( Exception e ) { @@ -341,7 +324,7 @@ public class XSLTProcess } } } - return liaison; + return m_liaison; } /** @@ -353,26 +336,27 @@ public class XSLTProcess protected void configureLiaison( File stylesheet ) throws TaskException { - if( stylesheetLoaded ) + if( m_stylesheetLoaded ) { return; } - stylesheetLoaded = true; + m_stylesheetLoaded = true; try { - log( "Loading stylesheet " + stylesheet, Project.MSG_INFO ); - liaison.setStylesheet( stylesheet ); - for( Enumeration e = params.elements(); e.hasMoreElements(); ) + getLogger().info( "Loading stylesheet " + stylesheet ); + m_liaison.setStylesheet( stylesheet ); + final Iterator params = m_params.iterator(); + while( params.hasNext() ) { - Param p = (Param)e.nextElement(); - liaison.addParam( p.getName(), p.getExpression() ); + final XSLTParam param = (XSLTParam)params.next(); + m_liaison.addParam( param.getName(), param.getExpression() ); } } - catch( Exception ex ) + catch( final Exception e ) { - log( "Failed to read stylesheet " + stylesheet, Project.MSG_INFO ); - throw new TaskException( "Error", ex ); + getLogger().info( "Failed to read stylesheet " + stylesheet ); + throw new TaskException( "Error", e ); } } @@ -401,13 +385,13 @@ public class XSLTProcess private Class loadClass( String classname ) throws Exception { - if( classpath == null ) + if( m_classpath == null ) { return Class.forName( classname ); } else { - AntClassLoader al = new AntClassLoader( project, classpath ); + AntClassLoader al = new AntClassLoader( project, m_classpath ); Class c = al.loadClass( classname ); AntClassLoader.initializeClass( c ); return c; @@ -429,7 +413,7 @@ public class XSLTProcess throws TaskException { - String fileExt = targetExtension; + String fileExt = m_targetExtension; File outFile = null; File inFile = null; @@ -446,7 +430,7 @@ public class XSLTProcess { outFile = new File( destDir, xmlFile + fileExt ); } - if( force || + if( m_force || inFile.lastModified() > outFile.lastModified() || styleSheetLastModified > outFile.lastModified() ) { @@ -454,14 +438,14 @@ public class XSLTProcess getLogger().info( "Processing " + inFile + " to " + outFile ); configureLiaison( stylesheet ); - liaison.transform( inFile, outFile ); + m_liaison.transform( inFile, outFile ); } } catch( Exception ex ) { // 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 ); + getLogger().info( "Failed to process " + inFile ); if( outFile != null ) { outFile.delete(); @@ -477,23 +461,24 @@ public class XSLTProcess { 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 ); - if( force || + final long styleSheetLastModified = stylesheet.lastModified(); + getLogger().debug( "In file " + inFile + " time: " + inFile.lastModified() ); + getLogger().debug( "Out file " + outFile + " time: " + outFile.lastModified() ); + getLogger().debug( "Style file " + m_xslFile + " time: " + styleSheetLastModified ); + + if( m_force || inFile.lastModified() > outFile.lastModified() || styleSheetLastModified > outFile.lastModified() ) { ensureDirectoryFor( outFile ); - log( "Processing " + inFile + " to " + outFile, Project.MSG_INFO ); + getLogger().info( "Processing " + inFile + " to " + outFile ); configureLiaison( stylesheet ); - liaison.transform( inFile, outFile ); + m_liaison.transform( inFile, outFile ); } } catch( Exception ex ) { - log( "Failed to process " + inFile, Project.MSG_INFO ); + getLogger().info( "Failed to process " + inFile ); if( outFile != null ) outFile.delete(); throw new TaskException( "Error", ex ); @@ -514,50 +499,18 @@ public class XSLTProcess { final Class clazz = loadClass( "org.apache.tools.ant.taskdefs.optional.TraXLiaison" ); - liaison = (XSLTLiaison)clazz.newInstance(); + m_liaison = (XSLTLiaison)clazz.newInstance(); } else if( proc.equals( "xalan" ) ) { final Class clazz = loadClass( "org.apache.tools.ant.taskdefs.optional.XalanLiaison" ); - liaison = (XSLTLiaison)clazz.newInstance(); + m_liaison = (XSLTLiaison)clazz.newInstance(); } else { - liaison = (XSLTLiaison)loadClass( proc ).newInstance(); - } - } - - public class Param - { - private String name = null; - private String expression = null; - - public void setExpression( String expression ) - { - this.expression = expression; - } - - public void setName( String name ) - { - this.name = name; - } - - public String getExpression() - throws TaskException - { - if( expression == null ) - throw new TaskException( "Expression attribute is missing." ); - return expression; - } - - public String getName() - throws TaskException - { - if( name == null ) - throw new TaskException( "Name attribute is missing." ); - return name; + m_liaison = (XSLTLiaison)loadClass( proc ).newInstance(); } } -}//-- XSLTProcess +} diff --git a/proposal/myrmidon/src/main/org/apache/tools/ant/taskdefs/optional/XalanLiaison.java b/proposal/myrmidon/src/java/org/apache/antlib/xml/XalanLiaison.java similarity index 93% rename from proposal/myrmidon/src/main/org/apache/tools/ant/taskdefs/optional/XalanLiaison.java rename to proposal/myrmidon/src/java/org/apache/antlib/xml/XalanLiaison.java index beab0e881..6fd900ce3 100644 --- a/proposal/myrmidon/src/main/org/apache/tools/ant/taskdefs/optional/XalanLiaison.java +++ b/proposal/myrmidon/src/java/org/apache/antlib/xml/XalanLiaison.java @@ -5,14 +5,13 @@ * version 1.1, a copy of which has been included with this distribution in * the LICENSE file. */ -package org.apache.tools.ant.taskdefs.optional; +package org.apache.antlib.xml; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import org.apache.myrmidon.api.TaskException; -import org.apache.tools.ant.taskdefs.XSLTLiaison; import org.apache.xalan.xslt.XSLTInputSource; import org.apache.xalan.xslt.XSLTProcessor; import org.apache.xalan.xslt.XSLTProcessorFactory; @@ -24,11 +23,11 @@ import org.apache.xalan.xslt.XSLTResultTarget; * @author Sam Ruby * @author Stephane Bailliez */ -public class XalanLiaison implements XSLTLiaison +public class XalanLiaison + implements XSLTLiaison { - - protected XSLTProcessor processor; - protected File stylesheet; + private XSLTProcessor processor; + private File stylesheet; public XalanLiaison() throws Exception diff --git a/proposal/myrmidon/src/main/org/apache/tools/ant/taskdefs/XSLTLogger.java b/proposal/myrmidon/src/main/org/apache/tools/ant/taskdefs/XSLTLogger.java deleted file mode 100644 index 4579d4085..000000000 --- a/proposal/myrmidon/src/main/org/apache/tools/ant/taskdefs/XSLTLogger.java +++ /dev/null @@ -1,18 +0,0 @@ -/* - * Copyright (C) The Apache Software Foundation. All rights reserved. - * - * This software is published under the terms of the Apache Software License - * version 1.1, a copy of which has been included with this distribution in - * the LICENSE file. - */ -package org.apache.tools.ant.taskdefs; - -public interface XSLTLogger -{ - /** - * Log a message. - * - * @param msg Description of Parameter - */ - void log( String msg ); -} diff --git a/proposal/myrmidon/src/main/org/apache/tools/ant/taskdefs/XSLTLoggerAware.java b/proposal/myrmidon/src/main/org/apache/tools/ant/taskdefs/XSLTLoggerAware.java deleted file mode 100644 index ae2051ae0..000000000 --- a/proposal/myrmidon/src/main/org/apache/tools/ant/taskdefs/XSLTLoggerAware.java +++ /dev/null @@ -1,13 +0,0 @@ -/* - * Copyright (C) The Apache Software Foundation. All rights reserved. - * - * This software is published under the terms of the Apache Software License - * version 1.1, a copy of which has been included with this distribution in - * the LICENSE file. - */ -package org.apache.tools.ant.taskdefs; - -public interface XSLTLoggerAware -{ - void setLogger( XSLTLogger l ); -} diff --git a/proposal/myrmidon/src/main/org/apache/tools/ant/taskdefs/XSLTProcess.java b/proposal/myrmidon/src/main/org/apache/tools/ant/taskdefs/XSLTProcess.java deleted file mode 100644 index c539945e9..000000000 --- a/proposal/myrmidon/src/main/org/apache/tools/ant/taskdefs/XSLTProcess.java +++ /dev/null @@ -1,563 +0,0 @@ -/* - * Copyright (C) The Apache Software Foundation. All rights reserved. - * - * This software is published under the terms of the Apache Software License - * version 1.1, a copy of which has been included with this distribution in - * the LICENSE file. - */ -package org.apache.tools.ant.taskdefs; - -import java.io.File; -import java.util.Enumeration; -import java.util.Vector; -import org.apache.myrmidon.api.TaskException; -import org.apache.tools.ant.AntClassLoader; -import org.apache.tools.ant.DirectoryScanner; -import org.apache.tools.ant.Project; -import org.apache.tools.ant.types.Path; -import org.apache.tools.ant.types.Reference; -import org.apache.tools.ant.util.FileUtils; - -/** - * A Task to process via XSLT a set of XML documents. This is useful for - * building views of XML based documentation. arguments: - * - * 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 - * @author Russell Gold - * @author Stefan Bodewig - */ -public class XSLTProcess - extends MatchingTask - implements XSLTLogger -{ - - private File destDir = null; - - private File baseDir = null; - - private String xslFile = null; - - private String targetExtension = ".html"; - private Vector params = new Vector(); - - private File inFile = null; - - private File outFile = null; - private Path classpath = null; - private boolean stylesheetLoaded = false; - - private boolean force = false; - - private String outputtype = null; - - private FileUtils fileUtils; - private XSLTLiaison liaison; - - private String processor; - - public void log( String msg ) - { - getLogger().info( msg ); - } - - /** - * Creates a new XSLTProcess Task. - */ - public XSLTProcess() - { - fileUtils = FileUtils.newFileUtils(); - }//-- setForce - - /** - * Set the base directory. - * - * @param dir The new Basedir value - */ - public void setBasedir( File dir ) - { - baseDir = dir; - } - - /** - * Set the classpath to load the Processor through (attribute). - * - * @param classpath The new Classpath value - */ - public void setClasspath( Path classpath ) - throws TaskException - { - createClasspath().append( classpath ); - } - - /** - * Set the classpath to load the Processor through via reference - * (attribute). - * - * @param r The new ClasspathRef value - */ - public void setClasspathRef( Reference r ) - throws TaskException - { - createClasspath().setRefid( r ); - }//-- setSourceDir - - /** - * Set the destination directory into which the XSL result files should be - * copied to - * - * @param dir The new Destdir value - */ - public void setDestdir( File dir ) - { - destDir = dir; - }//-- 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; - }//-- execute - - /** - * Set whether to check dependencies, or always generate. - * - * @param force The new Force value - */ - public void setForce( boolean force ) - { - this.force = force; - } - - /** - * Sets an input xml file to be styled - * - * @param inFile The new In value - */ - public void setIn( File inFile ) - { - this.inFile = inFile; - } - - /** - * Sets an out file - * - * @param outFile The new Out value - */ - public void setOut( File outFile ) - { - this.outFile = outFile; - } - - /** - * Set the output type to use for the transformation. Only "xml" (the - * default) is guaranteed to work for all parsers. Xalan2 also supports - * "html" and "text". - * - * @param type the output method to use - */ - public void setOutputtype( String type ) - { - this.outputtype = type; - } - - public void setProcessor( String processor ) - { - this.processor = processor; - }//-- setDestDir - - /** - * Sets the file to use for styling relative to the base directory of this - * task. - * - * @param xslFile The new Style value - */ - public void setStyle( String xslFile ) - { - this.xslFile = xslFile; - } - - /** - * Set the classpath to load the Processor through (nested element). - * - * @return Description of the Returned Value - */ - public Path createClasspath() - throws TaskException - { - if( classpath == null ) - { - classpath = new Path( project ); - } - return classpath.createPath(); - } - - public Param createParam() - { - Param p = new Param(); - params.addElement( p ); - return p; - }//-- XSLTProcess - - /** - * Executes the task. - * - * @exception TaskException Description of Exception - */ - - public void execute() - throws TaskException - { - DirectoryScanner scanner; - String[] list; - String[] dirs; - - if( xslFile == null ) - { - throw new TaskException( "no stylesheet specified" ); - } - - if( baseDir == null ) - { - baseDir = getBaseDirectory(); - } - - liaison = getLiaison(); - - // check if liaison wants to log errors using us as logger - if( liaison instanceof XSLTLoggerAware ) - { - ( (XSLTLoggerAware)liaison ).setLogger( this ); - } - - log( "Using " + liaison.getClass().toString(), Project.MSG_VERBOSE ); - - File stylesheet = resolveFile( xslFile ); - - // if we have an in file and out then process them - if( inFile != null && outFile != null ) - { - process( inFile, outFile, stylesheet ); - return; - } - - /* - * if we get here, in and out have not been specified, we are - * in batch processing mode. - */ - //-- make sure Source directory exists... - if( destDir == null ) - { - String msg = "destdir attributes must be set!"; - throw new TaskException( msg ); - } - scanner = getDirectoryScanner( baseDir ); - log( "Transforming into " + destDir, Project.MSG_INFO ); - - // Process all the files marked for styling - list = scanner.getIncludedFiles(); - for( int i = 0; i < list.length; ++i ) - { - process( baseDir, list[ i ], destDir, stylesheet ); - } - - // 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, stylesheet ); - } - } - - protected XSLTLiaison getLiaison() - throws TaskException - { - // if processor wasn't specified, see if TraX is available. If not, - // default it to xslp or xalan, depending on which is in the classpath - if( liaison == null ) - { - if( processor != null ) - { - try - { - resolveProcessor( processor ); - } - catch( Exception e ) - { - throw new TaskException( "Error", e ); - } - } - else - { - try - { - resolveProcessor( "trax" ); - } - catch( Throwable e1 ) - { - try - { - resolveProcessor( "xalan" ); - } - catch( Throwable e2 ) - { - try - { - resolveProcessor( "adaptx" ); - } - catch( Throwable e3 ) - { - try - { - resolveProcessor( "xslp" ); - } - catch( Throwable e4 ) - { - e4.printStackTrace(); - e3.printStackTrace(); - e2.printStackTrace(); - throw new TaskException( "Error", e1 ); - } - } - } - } - } - } - return liaison; - } - - /** - * Loads the stylesheet and set xsl:param parameters. - * - * @param stylesheet Description of Parameter - * @exception TaskException Description of Exception - */ - protected void configureLiaison( File stylesheet ) - throws TaskException - { - if( stylesheetLoaded ) - { - return; - } - stylesheetLoaded = true; - - try - { - log( "Loading stylesheet " + stylesheet, Project.MSG_INFO ); - liaison.setStylesheet( stylesheet ); - 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 TaskException( "Error", ex ); - } - } - - private void ensureDirectoryFor( File targetFile ) - throws TaskException - { - File directory = new File( targetFile.getParent() ); - if( !directory.exists() ) - { - if( !directory.mkdirs() ) - { - throw new TaskException( "Unable to create directory: " - + directory.getAbsolutePath() ); - } - } - } - - /** - * Load named class either via the system classloader or a given custom - * classloader. - * - * @param classname Description of Parameter - * @return Description of the Returned Value - * @exception Exception Description of Exception - */ - private Class loadClass( String classname ) - throws Exception - { - if( classpath == null ) - { - return Class.forName( classname ); - } - else - { - AntClassLoader al = new AntClassLoader( project, classpath ); - Class c = al.loadClass( classname ); - AntClassLoader.initializeClass( c ); - return c; - } - } - - /** - * Processes the given input XML file and stores the result in the given - * resultFile. - * - * @param baseDir Description of Parameter - * @param xmlFile Description of Parameter - * @param destDir Description of Parameter - * @param stylesheet Description of Parameter - * @exception TaskException Description of Exception - */ - private void process( File baseDir, String xmlFile, File destDir, - File stylesheet ) - throws TaskException - { - - 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 ) - { - outFile = new File( destDir, xmlFile.substring( 0, xmlFile.lastIndexOf( '.' ) ) + fileExt ); - } - else - { - outFile = new File( destDir, xmlFile + fileExt ); - } - if( force || - inFile.lastModified() > outFile.lastModified() || - styleSheetLastModified > outFile.lastModified() ) - { - ensureDirectoryFor( outFile ); - getLogger().info( "Processing " + inFile + " to " + outFile ); - - configureLiaison( stylesheet ); - liaison.transform( inFile, outFile ); - } - } - catch( Exception ex ) - { - // 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 ); - if( outFile != null ) - { - outFile.delete(); - } - - throw new TaskException( "Error", ex ); - } - - }//-- processXML - - private void process( File inFile, File outFile, File stylesheet ) - throws TaskException - { - 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 ); - if( force || - inFile.lastModified() > outFile.lastModified() || - styleSheetLastModified > outFile.lastModified() ) - { - ensureDirectoryFor( outFile ); - log( "Processing " + inFile + " to " + outFile, Project.MSG_INFO ); - configureLiaison( stylesheet ); - liaison.transform( inFile, outFile ); - } - } - catch( Exception ex ) - { - log( "Failed to process " + inFile, Project.MSG_INFO ); - if( outFile != null ) - outFile.delete(); - throw new TaskException( "Error", ex ); - } - } - - /** - * Load processor here instead of in setProcessor - this will be called from - * within execute, so we have access to the latest classpath. - * - * @param proc Description of Parameter - * @exception Exception Description of Exception - */ - private void resolveProcessor( String proc ) - throws Exception - { - if( proc.equals( "trax" ) ) - { - final Class clazz = - loadClass( "org.apache.tools.ant.taskdefs.optional.TraXLiaison" ); - liaison = (XSLTLiaison)clazz.newInstance(); - } - else if( proc.equals( "xalan" ) ) - { - final Class clazz = - loadClass( "org.apache.tools.ant.taskdefs.optional.XalanLiaison" ); - liaison = (XSLTLiaison)clazz.newInstance(); - } - else - { - liaison = (XSLTLiaison)loadClass( proc ).newInstance(); - } - } - - public class Param - { - private String name = null; - private String expression = null; - - public void setExpression( String expression ) - { - this.expression = expression; - } - - public void setName( String name ) - { - this.name = name; - } - - public String getExpression() - throws TaskException - { - if( expression == null ) - throw new TaskException( "Expression attribute is missing." ); - return expression; - } - - public String getName() - throws TaskException - { - if( name == null ) - throw new TaskException( "Name attribute is missing." ); - return name; - } - } - -}//-- XSLTProcess diff --git a/proposal/myrmidon/src/todo/org/apache/tools/ant/taskdefs/XSLTLiaison.java b/proposal/myrmidon/src/todo/org/apache/tools/ant/taskdefs/XSLTLiaison.java deleted file mode 100644 index 4a64f3f54..000000000 --- a/proposal/myrmidon/src/todo/org/apache/tools/ant/taskdefs/XSLTLiaison.java +++ /dev/null @@ -1,75 +0,0 @@ -/* - * Copyright (C) The Apache Software Foundation. All rights reserved. - * - * This software is published under the terms of the Apache Software License - * version 1.1, a copy of which has been included with this distribution in - * the LICENSE file. - */ -package org.apache.tools.ant.taskdefs; - -import java.io.File; - -/** - * Proxy interface for XSLT processors. - * - * @author Sam Ruby - * @author Stephane Bailliez - * @see XSLTProcess - */ -public interface XSLTLiaison -{ - - /** - * the file protocol prefix for systemid. This file protocol must be - * appended to an absolute path. Typically: FILE_PROTOCOL_PREFIX + - * file.getAbsolutePath() This is not correct in specification terms - * since an absolute url in Unix is file:// + file.getAbsolutePath() while - * it is file:/// + file.getAbsolutePath() under Windows. Whatever, it - * should not be a problem to put file:/// in every case since most parsers - * for now incorrectly makes no difference between it.. and users also have - * problem with that :) - */ - String FILE_PROTOCOL_PREFIX = "file:///"; - - /** - * set the stylesheet to use for the transformation. - * - * @param stylesheet the stylesheet to be used for transformation. - * @exception Exception Description of Exception - */ - void setStylesheet( File stylesheet ) - throws Exception; - - /** - * Add a parameter to be set during the XSL transformation. - * - * @param name the parameter name. - * @param expression the parameter value as an expression string. - * @throws Exception thrown if any problems happens. - */ - void addParam( String name, String expression ) - throws Exception; - - /** - * set the output type to use for the transformation. Only "xml" (the - * default) is guaranteed to work for all parsers. Xalan2 also supports - * "html" and "text". - * - * @param type the output method to use - * @exception Exception Description of Exception - */ - void setOutputtype( String type ) - throws Exception; - - /** - * Perform the transformation of a file into another. - * - * @param infile the input file, probably an XML one. :-) - * @param outfile the output file resulting from the transformation - * @see #setStylesheet(File) - * @throws Exception thrown if any problems happens. - */ - void transform( File infile, File outfile ) - throws Exception; - -}//-- XSLTLiaison diff --git a/proposal/myrmidon/src/todo/org/apache/tools/ant/taskdefs/XSLTLogger.java b/proposal/myrmidon/src/todo/org/apache/tools/ant/taskdefs/XSLTLogger.java deleted file mode 100644 index 4579d4085..000000000 --- a/proposal/myrmidon/src/todo/org/apache/tools/ant/taskdefs/XSLTLogger.java +++ /dev/null @@ -1,18 +0,0 @@ -/* - * Copyright (C) The Apache Software Foundation. All rights reserved. - * - * This software is published under the terms of the Apache Software License - * version 1.1, a copy of which has been included with this distribution in - * the LICENSE file. - */ -package org.apache.tools.ant.taskdefs; - -public interface XSLTLogger -{ - /** - * Log a message. - * - * @param msg Description of Parameter - */ - void log( String msg ); -} diff --git a/proposal/myrmidon/src/todo/org/apache/tools/ant/taskdefs/XSLTLoggerAware.java b/proposal/myrmidon/src/todo/org/apache/tools/ant/taskdefs/XSLTLoggerAware.java deleted file mode 100644 index ae2051ae0..000000000 --- a/proposal/myrmidon/src/todo/org/apache/tools/ant/taskdefs/XSLTLoggerAware.java +++ /dev/null @@ -1,13 +0,0 @@ -/* - * Copyright (C) The Apache Software Foundation. All rights reserved. - * - * This software is published under the terms of the Apache Software License - * version 1.1, a copy of which has been included with this distribution in - * the LICENSE file. - */ -package org.apache.tools.ant.taskdefs; - -public interface XSLTLoggerAware -{ - void setLogger( XSLTLogger l ); -} diff --git a/proposal/myrmidon/src/todo/org/apache/tools/ant/taskdefs/optional/TraXLiaison.java b/proposal/myrmidon/src/todo/org/apache/tools/ant/taskdefs/optional/TraXLiaison.java deleted file mode 100644 index ddcbdc34f..000000000 --- a/proposal/myrmidon/src/todo/org/apache/tools/ant/taskdefs/optional/TraXLiaison.java +++ /dev/null @@ -1,220 +0,0 @@ -/* - * Copyright (C) The Apache Software Foundation. All rights reserved. - * - * This software is published under the terms of the Apache Software License - * version 1.1, a copy of which has been included with this distribution in - * the LICENSE file. - */ -package org.apache.tools.ant.taskdefs.optional; - -import java.io.File; -import java.io.FileInputStream; -import java.io.FileOutputStream; -import java.io.IOException; -import javax.xml.transform.ErrorListener; -import javax.xml.transform.OutputKeys; -import javax.xml.transform.Templates; -import javax.xml.transform.Transformer; -import javax.xml.transform.TransformerException; -import javax.xml.transform.TransformerFactory; -import javax.xml.transform.stream.StreamResult; -import javax.xml.transform.stream.StreamSource; -import org.apache.tools.ant.taskdefs.XSLTLiaison; -import org.apache.tools.ant.taskdefs.XSLTLogger; -import org.apache.tools.ant.taskdefs.XSLTLoggerAware; - -/** - * Concrete liaison for XSLT processor implementing TraX. (ie JAXP 1.1) - * - * @author Sam Ruby - * @author Davanum Srinivas - * @author Stephane Bailliez - */ -public class TraXLiaison implements XSLTLiaison, ErrorListener, XSLTLoggerAware -{ - - /** - * The trax TransformerFactory - */ - private TransformerFactory tfactory = null; - - /** - * stylesheet stream, close it asap - */ - private FileInputStream xslStream = null; - - /** - * Stylesheet template - */ - private Templates templates = null; - - /** - * transformer - */ - private Transformer transformer = null; - - private XSLTLogger logger; - - public TraXLiaison() - throws Exception - { - tfactory = TransformerFactory.newInstance(); - tfactory.setErrorListener( this ); - } - - public void setLogger( XSLTLogger l ) - { - logger = l; - } - - public void setOutputtype( String type ) - throws Exception - { - transformer.setOutputProperty( OutputKeys.METHOD, type ); - } - - //------------------- IMPORTANT - // 1) Don't use the StreamSource(File) ctor. It won't work with - // xalan prior to 2.2 because of systemid bugs. - - // 2) Use a stream so that you can close it yourself quickly - // and avoid keeping the handle until the object is garbaged. - // (always keep control), otherwise you won't be able to delete - // the file quickly on windows. - - // 3) Always set the systemid to the source for imports, includes... - // in xsl and xml... - - public void setStylesheet( File stylesheet ) - throws Exception - { - xslStream = new FileInputStream( stylesheet ); - StreamSource src = new StreamSource( xslStream ); - src.setSystemId( getSystemId( stylesheet ) ); - templates = tfactory.newTemplates( src ); - transformer = templates.newTransformer(); - transformer.setErrorListener( this ); - } - - public void addParam( String name, String value ) - { - transformer.setParameter( name, value ); - } - - public void error( TransformerException e ) - { - logError( e, "Error" ); - } - - public void fatalError( TransformerException e ) - { - logError( e, "Fatal Error" ); - } - - public void transform( File infile, File outfile ) - throws Exception - { - FileInputStream fis = null; - FileOutputStream fos = null; - try - { - fis = new FileInputStream( infile ); - fos = new FileOutputStream( outfile ); - StreamSource src = new StreamSource( fis ); - src.setSystemId( getSystemId( infile ) ); - StreamResult res = new StreamResult( fos ); - // not sure what could be the need of this... - res.setSystemId( getSystemId( outfile ) ); - - transformer.transform( src, res ); - } - finally - { - // make sure to close all handles, otherwise the garbage - // collector will close them...whenever possible and - // Windows may complain about not being able to delete files. - try - { - if( xslStream != null ) - { - xslStream.close(); - } - } - catch( IOException ignored ) - { - } - try - { - if( fis != null ) - { - fis.close(); - } - } - catch( IOException ignored ) - { - } - try - { - if( fos != null ) - { - fos.close(); - } - } - catch( IOException ignored ) - { - } - } - } - - public void warning( TransformerException e ) - { - logError( e, "Warning" ); - } - - // make sure that the systemid is made of '/' and not '\' otherwise - // crimson will complain that it cannot resolve relative entities - // because it grabs the base uri via lastIndexOf('/') without - // making sure it is really a /'ed path - protected String getSystemId( File file ) - { - String path = file.getAbsolutePath(); - path = path.replace( '\\', '/' ); - return FILE_PROTOCOL_PREFIX + path; - } - - private void logError( TransformerException e, String type ) - { - StringBuffer msg = new StringBuffer(); - if( e.getLocator() != null ) - { - if( e.getLocator().getSystemId() != null ) - { - String url = e.getLocator().getSystemId(); - if( url.startsWith( "file:///" ) ) - url = url.substring( 8 ); - msg.append( url ); - } - else - { - msg.append( "Unknown file" ); - } - if( e.getLocator().getLineNumber() != -1 ) - { - msg.append( ":" + e.getLocator().getLineNumber() ); - if( e.getLocator().getColumnNumber() != -1 ) - { - msg.append( ":" + e.getLocator().getColumnNumber() ); - } - } - } - msg.append( ": " + type + "! " ); - msg.append( e.getMessage() ); - if( e.getCause() != null ) - { - msg.append( " Cause: " + e.getCause() ); - } - - logger.log( msg.toString() ); - } - -}//-- TraXLiaison diff --git a/proposal/myrmidon/src/todo/org/apache/tools/ant/taskdefs/optional/XMLValidateTask.java b/proposal/myrmidon/src/todo/org/apache/tools/ant/taskdefs/optional/XMLValidateTask.java deleted file mode 100644 index c0658a2b9..000000000 --- a/proposal/myrmidon/src/todo/org/apache/tools/ant/taskdefs/optional/XMLValidateTask.java +++ /dev/null @@ -1,654 +0,0 @@ -/* - * Copyright (C) The Apache Software Foundation. All rights reserved. - * - * This software is published under the terms of the Apache Software License - * version 1.1, a copy of which has been included with this distribution in - * the LICENSE file. - */ -package org.apache.tools.ant.taskdefs.optional; - -import java.io.File; -import java.io.FileInputStream; -import java.io.FileNotFoundException; -import java.io.FileReader; -import java.io.IOException; -import java.io.InputStream; -import java.net.MalformedURLException; -import java.net.URL; -import java.util.Enumeration; -import java.util.Hashtable; -import java.util.Vector; -import org.apache.myrmidon.api.TaskException; -import org.apache.tools.ant.AntClassLoader; -import org.apache.tools.ant.DirectoryScanner; -import org.apache.tools.ant.Project; -import org.apache.tools.ant.Task; -import org.apache.tools.ant.types.FileSet; -import org.apache.tools.ant.types.Path; -import org.apache.tools.ant.types.Reference; -import org.xml.sax.EntityResolver; -import org.xml.sax.ErrorHandler; -import org.xml.sax.InputSource; -import org.xml.sax.Parser; -import org.xml.sax.SAXException; -import org.xml.sax.SAXNotRecognizedException; -import org.xml.sax.SAXNotSupportedException; -import org.xml.sax.SAXParseException; -import org.xml.sax.XMLReader; -import org.xml.sax.helpers.ParserAdapter; - -/** - * The XMLValidateTask checks that an XML document is valid, with a - * SAX validating parser. - * - * @author Raphael Pierquin - * raphael.pierquin@agisphere.com - */ -public class XMLValidateTask extends Task -{ - - /** - * The default implementation parser classname used by the task to process - * validation. - */ - // The crimson implementation is shipped with ant. - public static String DEFAULT_XML_READER_CLASSNAME = "org.apache.crimson.parser.XMLReaderImpl"; - - protected static String INIT_FAILED_MSG = "Could not start xml validation: "; - - // ant task properties - // defaults - protected boolean failOnError = true; - protected boolean warn = true; - protected boolean lenient = false; - protected String readerClassName = DEFAULT_XML_READER_CLASSNAME; - - protected File file = null;// file to be validated - protected Vector filesets = new Vector(); - - /** - * the parser is viewed as a SAX2 XMLReader. If a SAX1 parser is specified, - * it's wrapped in an adapter that make it behave as a XMLReader. a more - * 'standard' way of doing this would be to use the JAXP1.1 SAXParser - * interface. - */ - protected XMLReader xmlReader = null;// XMLReader used to validation process - protected ValidatorErrorHandler errorHandler - = new ValidatorErrorHandler();// to report sax parsing errors - protected Hashtable features = new Hashtable(); - - /** - * The list of configured DTD locations - */ - public Vector dtdLocations = new Vector();// sets of file to be validated - protected Path classpath; - - /** - * Specify the class name of the SAX parser to be used. (optional) - * - * @param className should be an implementation of SAX2 org.xml.sax.XMLReader - * or SAX2 org.xml.sax.Parser.

- * - * if className is an implementation of org.xml.sax.Parser - * , {@link #setLenient(boolean)}, will be ignored.

- * - * if not set, the default {@link #DEFAULT_XML_READER_CLASSNAME} will - * be used. - * @see org.xml.sax.XMLReader - * @see org.xml.sax.Parser - */ - public void setClassName( String className ) - { - - readerClassName = className; - } - - /** - * Specify the classpath to be searched to load the parser (optional) - * - * @param classpath The new Classpath value - */ - public void setClasspath( Path classpath ) - throws TaskException - { - if( this.classpath == null ) - { - this.classpath = classpath; - } - else - { - this.classpath.append( classpath ); - } - } - - /** - * @param r The new ClasspathRef value - * @see #setClasspath - */ - public void setClasspathRef( Reference r ) - throws TaskException - { - createClasspath().setRefid( r ); - } - - /** - * Specify how parser error are to be handled.

- * - * If set to true (default), throw a TaskException if the - * parser yields an error. - * - * @param fail The new FailOnError value - */ - public void setFailOnError( boolean fail ) - { - - failOnError = fail; - } - - /** - * specifify the file to be checked - * - * @param file The new File value - */ - public void setFile( File file ) - { - this.file = file; - } - - /** - * Specify whether the parser should be validating. Default is true - * .

- * - * If set to false, the validation will fail only if the parsed document is - * not well formed XML.

- * - * this option is ignored if the specified class with {@link - * #setClassName(String)} is not a SAX2 XMLReader. - * - * @param bool The new Lenient value - */ - public void setLenient( boolean bool ) - { - - lenient = bool; - } - - /** - * Specify how parser error are to be handled.

- * - * If set to true - * - *(default), log a warn message for each SAX warn event. - * - * @param bool The new Warn value - */ - public void setWarn( boolean bool ) - { - - warn = bool; - } - - /** - * specifify a set of file to be checked - * - * @param set The feature to be added to the Fileset attribute - */ - public void addFileset( FileSet set ) - { - filesets.addElement( set ); - } - - /** - * @return Description of the Returned Value - * @see #setClasspath - */ - public Path createClasspath() - throws TaskException - { - if( this.classpath == null ) - { - this.classpath = new Path( project ); - } - return this.classpath.createPath(); - } - - /** - * Create a DTD location record. This stores the location of a DTD. The DTD - * is identified by its public Id. The location may either be a file - * location or a resource location. - * - * @return Description of the Returned Value - */ - public DTDLocation createDTD() - { - DTDLocation dtdLocation = new DTDLocation(); - dtdLocations.addElement( dtdLocation ); - - return dtdLocation; - } - - public void execute() - throws TaskException - { - - int fileProcessed = 0; - if( file == null && ( filesets.size() == 0 ) ) - { - throw new TaskException( "Specify at least one source - a file or a fileset." ); - } - - initValidator(); - - if( file != null ) - { - if( file.exists() && file.canRead() && file.isFile() ) - { - doValidate( file ); - fileProcessed++; - } - else - { - String errorMsg = "File " + file + " cannot be read"; - if( failOnError ) - throw new TaskException( errorMsg ); - else - log( errorMsg, Project.MSG_ERR ); - } - } - - for( int i = 0; i < filesets.size(); i++ ) - { - - FileSet fs = (FileSet)filesets.elementAt( i ); - DirectoryScanner ds = fs.getDirectoryScanner( project ); - String[] files = ds.getIncludedFiles(); - - for( int j = 0; j < files.length; j++ ) - { - File srcFile = new File( fs.getDir( project ), files[ j ] ); - doValidate( srcFile ); - fileProcessed++; - } - } - getLogger().info( fileProcessed + " file(s) have been successfully validated." ); - } - - protected EntityResolver getEntityResolver() - { - LocalResolver resolver = new LocalResolver(); - - for( Enumeration i = dtdLocations.elements(); i.hasMoreElements(); ) - { - DTDLocation location = (DTDLocation)i.nextElement(); - resolver.registerDTD( location ); - } - return resolver; - } - - /* - * set a feature on the parser. - * TODO: find a way to set any feature from build.xml - */ - private boolean setFeature( String feature, boolean value, boolean warn ) - { - - boolean toReturn = false; - try - { - xmlReader.setFeature( feature, value ); - toReturn = true; - } - catch( SAXNotRecognizedException e ) - { - if( warn ) - log( "Could not set feature '" - + feature - + "' because the parser doesn't recognize it", - Project.MSG_WARN ); - } - catch( SAXNotSupportedException e ) - { - if( warn ) - log( "Could not set feature '" - + feature - + "' because the parser doesn't support it", - Project.MSG_WARN ); - } - return toReturn; - } - - /* - * parse the file - */ - private void doValidate( File afile ) - throws TaskException - { - try - { - log( "Validating " + afile.getName() + "... ", Project.MSG_VERBOSE ); - errorHandler.init( afile ); - InputSource is = new InputSource( new FileReader( afile ) ); - String uri = "file:" + afile.getAbsolutePath().replace( '\\', '/' ); - for( int index = uri.indexOf( '#' ); index != -1; - index = uri.indexOf( '#' ) ) - { - uri = uri.substring( 0, index ) + "%23" + uri.substring( index + 1 ); - } - is.setSystemId( uri ); - xmlReader.parse( is ); - } - catch( SAXException ex ) - { - if( failOnError ) - throw new TaskException( "Could not validate document " + afile ); - } - catch( IOException ex ) - { - throw new TaskException( "Could not validate document " + afile, ex ); - } - - if( errorHandler.getFailure() ) - { - if( failOnError ) - throw new TaskException( afile + " is not a valid XML document." ); - else - log( afile + " is not a valid XML document", Project.MSG_ERR ); - } - } - - /** - * init the parser : load the parser class, and set features if necessary - */ - private void initValidator() - throws TaskException - { - - try - { - // load the parser class - // with JAXP, we would use a SAXParser factory - Class readerClass = null; - //Class readerImpl = null; - //Class parserImpl = null; - if( classpath != null ) - { - AntClassLoader loader = new AntClassLoader( project, classpath ); - // loader.addSystemPackageRoot("org.xml"); // needed to avoid conflict - readerClass = loader.loadClass( readerClassName ); - AntClassLoader.initializeClass( readerClass ); - } - else - readerClass = Class.forName( readerClassName ); - - // then check it implements XMLReader - if( XMLReader.class.isAssignableFrom( readerClass ) ) - { - - xmlReader = (XMLReader)readerClass.newInstance(); - log( "Using SAX2 reader " + readerClassName, Project.MSG_VERBOSE ); - } - else - { - - // see if it is a SAX1 Parser - if( Parser.class.isAssignableFrom( readerClass ) ) - { - Parser parser = (Parser)readerClass.newInstance(); - xmlReader = new ParserAdapter( parser ); - log( "Using SAX1 parser " + readerClassName, Project.MSG_VERBOSE ); - } - else - { - throw new TaskException( INIT_FAILED_MSG - + readerClassName - + " implements nor SAX1 Parser nor SAX2 XMLReader." ); - } - } - } - catch( ClassNotFoundException e ) - { - throw new TaskException( INIT_FAILED_MSG + readerClassName, e ); - } - catch( InstantiationException e ) - { - throw new TaskException( INIT_FAILED_MSG + readerClassName, e ); - } - catch( IllegalAccessException e ) - { - throw new TaskException( INIT_FAILED_MSG + readerClassName, e ); - } - - xmlReader.setEntityResolver( getEntityResolver() ); - xmlReader.setErrorHandler( errorHandler ); - - if( !( xmlReader instanceof ParserAdapter ) ) - { - // turn validation on - if( !lenient ) - { - boolean ok = setFeature( "http://xml.org/sax/features/validation", true, true ); - if( !ok ) - { - throw new TaskException( INIT_FAILED_MSG - + readerClassName - + " doesn't provide validation" ); - } - } - // set other features - Enumeration enum = features.keys(); - while( enum.hasMoreElements() ) - { - String featureId = (String)enum.nextElement(); - setFeature( featureId, ( (Boolean)features.get( featureId ) ).booleanValue(), true ); - } - } - } - - public static class DTDLocation - { - private String publicId = null; - private String location = null; - - public void setLocation( String location ) - { - this.location = location; - } - - public void setPublicId( String publicId ) - { - this.publicId = publicId; - } - - public String getLocation() - { - return location; - } - - public String getPublicId() - { - return publicId; - } - } - - /* - * ValidatorErrorHandler role : - *

- */ - protected class ValidatorErrorHandler implements ErrorHandler - { - - protected File currentFile = null; - protected String lastErrorMessage = null; - protected boolean failed = false; - - // did an error happen during last parsing ? - public boolean getFailure() - { - - return failed; - } - - public void error( SAXParseException exception ) - { - failed = true; - doLog( exception, Project.MSG_ERR ); - } - - public void fatalError( SAXParseException exception ) - { - failed = true; - doLog( exception, Project.MSG_ERR ); - } - - public void init( File file ) - { - currentFile = file; - failed = false; - } - - public void warning( SAXParseException exception ) - { - // depending on implementation, XMLReader can yield hips of warning, - // only output then if user explicitely asked for it - if( warn ) - doLog( exception, Project.MSG_WARN ); - } - - private String getMessage( SAXParseException e ) - { - String sysID = e.getSystemId(); - if( sysID != null ) - { - try - { - int line = e.getLineNumber(); - int col = e.getColumnNumber(); - return new URL( sysID ).getFile() + - ( line == -1 ? "" : ( ":" + line + - ( col == -1 ? "" : ( ":" + col ) ) ) ) + - ": " + e.getMessage(); - } - catch( MalformedURLException mfue ) - { - } - } - return e.getMessage(); - } - - private void doLog( SAXParseException e, int logLevel ) - { - - log( getMessage( e ), logLevel ); - } - } - - private class LocalResolver - implements EntityResolver - { - private Hashtable fileDTDs = new Hashtable(); - private Hashtable resourceDTDs = new Hashtable(); - private Hashtable urlDTDs = new Hashtable(); - - public LocalResolver() - { - } - - public void registerDTD( String publicId, String location ) - { - if( location == null ) - { - return; - } - - File fileDTD = new File( location ); - if( fileDTD.exists() ) - { - if( publicId != null ) - { - fileDTDs.put( publicId, fileDTD ); - log( "Mapped publicId " + publicId + " to file " + fileDTD, Project.MSG_VERBOSE ); - } - return; - } - - if( LocalResolver.this.getClass().getResource( location ) != null ) - { - if( publicId != null ) - { - resourceDTDs.put( publicId, location ); - log( "Mapped publicId " + publicId + " to resource " + location, Project.MSG_VERBOSE ); - } - } - - try - { - if( publicId != null ) - { - URL urldtd = new URL( location ); - urlDTDs.put( publicId, urldtd ); - } - } - catch( java.net.MalformedURLException e ) - { - //ignored - } - } - - public void registerDTD( DTDLocation location ) - { - registerDTD( location.getPublicId(), location.getLocation() ); - } - - public InputSource resolveEntity( String publicId, String systemId ) - throws SAXException - { - File dtdFile = (File)fileDTDs.get( publicId ); - if( dtdFile != null ) - { - try - { - log( "Resolved " + publicId + " to local file " + dtdFile, Project.MSG_VERBOSE ); - return new InputSource( new FileInputStream( dtdFile ) ); - } - catch( FileNotFoundException ex ) - { - // ignore - } - } - - String dtdResourceName = (String)resourceDTDs.get( publicId ); - if( dtdResourceName != null ) - { - InputStream is = this.getClass().getResourceAsStream( dtdResourceName ); - if( is != null ) - { - log( "Resolved " + publicId + " to local resource " + dtdResourceName, Project.MSG_VERBOSE ); - return new InputSource( is ); - } - } - - URL dtdUrl = (URL)urlDTDs.get( publicId ); - if( dtdUrl != null ) - { - try - { - InputStream is = dtdUrl.openStream(); - log( "Resolved " + publicId + " to url " + dtdUrl, Project.MSG_VERBOSE ); - return new InputSource( is ); - } - catch( IOException ioe ) - { - //ignore - } - } - - log( "Could not resolve ( publicId: " + publicId + ", systemId: " + systemId + ") to a local entity", - Project.MSG_INFO ); - - return null; - } - } -} diff --git a/proposal/myrmidon/src/todo/org/apache/tools/ant/taskdefs/optional/XalanLiaison.java b/proposal/myrmidon/src/todo/org/apache/tools/ant/taskdefs/optional/XalanLiaison.java deleted file mode 100644 index beab0e881..000000000 --- a/proposal/myrmidon/src/todo/org/apache/tools/ant/taskdefs/optional/XalanLiaison.java +++ /dev/null @@ -1,114 +0,0 @@ -/* - * Copyright (C) The Apache Software Foundation. All rights reserved. - * - * This software is published under the terms of the Apache Software License - * version 1.1, a copy of which has been included with this distribution in - * the LICENSE file. - */ -package org.apache.tools.ant.taskdefs.optional; - -import java.io.File; -import java.io.FileInputStream; -import java.io.FileOutputStream; -import java.io.IOException; -import org.apache.myrmidon.api.TaskException; -import org.apache.tools.ant.taskdefs.XSLTLiaison; -import org.apache.xalan.xslt.XSLTInputSource; -import org.apache.xalan.xslt.XSLTProcessor; -import org.apache.xalan.xslt.XSLTProcessorFactory; -import org.apache.xalan.xslt.XSLTResultTarget; - -/** - * Concrete liaison for Xalan 1.x API. - * - * @author Sam Ruby - * @author Stephane Bailliez - */ -public class XalanLiaison implements XSLTLiaison -{ - - protected XSLTProcessor processor; - protected File stylesheet; - - public XalanLiaison() - throws Exception - { - processor = XSLTProcessorFactory.getProcessor(); - } - - public void setOutputtype( String type ) - throws Exception - { - if( !type.equals( "xml" ) ) - throw new TaskException( "Unsupported output type: " + type ); - } - - public void setStylesheet( File stylesheet ) - throws Exception - { - this.stylesheet = stylesheet; - } - - public void addParam( String name, String value ) - { - processor.setStylesheetParam( name, value ); - } - - public void transform( File infile, File outfile ) - throws Exception - { - FileInputStream fis = null; - FileOutputStream fos = null; - FileInputStream xslStream = null; - try - { - xslStream = new FileInputStream( stylesheet ); - fis = new FileInputStream( infile ); - fos = new FileOutputStream( outfile ); - // systemid such as file:/// + getAbsolutePath() are considered - // invalid here... - XSLTInputSource xslSheet = new XSLTInputSource( xslStream ); - xslSheet.setSystemId( stylesheet.getAbsolutePath() ); - XSLTInputSource src = new XSLTInputSource( fis ); - src.setSystemId( infile.getAbsolutePath() ); - XSLTResultTarget res = new XSLTResultTarget( fos ); - processor.process( src, xslSheet, res ); - } - finally - { - // make sure to close all handles, otherwise the garbage - // collector will close them...whenever possible and - // Windows may complain about not being able to delete files. - try - { - if( xslStream != null ) - { - xslStream.close(); - } - } - catch( IOException ignored ) - { - } - try - { - if( fis != null ) - { - fis.close(); - } - } - catch( IOException ignored ) - { - } - try - { - if( fos != null ) - { - fos.close(); - } - } - catch( IOException ignored ) - { - } - } - } -}//-- XalanLiaison