Browse Source

Start to move the non-deprecated XML files into new antlib - making sure they are compatible with myrmidon

git-svn-id: https://svn.apache.org/repos/asf/ant/core/trunk@270227 13f79535-47bb-0310-9956-ffa450edef68
master
Peter Donald 23 years ago
parent
commit
c859e9eed3
15 changed files with 153 additions and 1851 deletions
  1. +11
    -18
      proposal/myrmidon/src/java/org/apache/antlib/xml/TraXLiaison.java
  2. +4
    -4
      proposal/myrmidon/src/java/org/apache/antlib/xml/XMLValidateTask.java
  3. +1
    -2
      proposal/myrmidon/src/java/org/apache/antlib/xml/XSLTLiaison.java
  4. +46
    -0
      proposal/myrmidon/src/java/org/apache/antlib/xml/XSLTParam.java
  5. +86
    -133
      proposal/myrmidon/src/java/org/apache/antlib/xml/XSLTProcess.java
  6. +5
    -6
      proposal/myrmidon/src/java/org/apache/antlib/xml/XalanLiaison.java
  7. +0
    -18
      proposal/myrmidon/src/main/org/apache/tools/ant/taskdefs/XSLTLogger.java
  8. +0
    -13
      proposal/myrmidon/src/main/org/apache/tools/ant/taskdefs/XSLTLoggerAware.java
  9. +0
    -563
      proposal/myrmidon/src/main/org/apache/tools/ant/taskdefs/XSLTProcess.java
  10. +0
    -75
      proposal/myrmidon/src/todo/org/apache/tools/ant/taskdefs/XSLTLiaison.java
  11. +0
    -18
      proposal/myrmidon/src/todo/org/apache/tools/ant/taskdefs/XSLTLogger.java
  12. +0
    -13
      proposal/myrmidon/src/todo/org/apache/tools/ant/taskdefs/XSLTLoggerAware.java
  13. +0
    -220
      proposal/myrmidon/src/todo/org/apache/tools/ant/taskdefs/optional/TraXLiaison.java
  14. +0
    -654
      proposal/myrmidon/src/todo/org/apache/tools/ant/taskdefs/optional/XMLValidateTask.java
  15. +0
    -114
      proposal/myrmidon/src/todo/org/apache/tools/ant/taskdefs/optional/XalanLiaison.java

proposal/myrmidon/src/main/org/apache/tools/ant/taskdefs/optional/TraXLiaison.java → proposal/myrmidon/src/java/org/apache/antlib/xml/TraXLiaison.java View File

@@ -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 <a href="mailto:dims@yahoo.com">Davanum Srinivas</a>
* @author <a href="mailto:sbailliez@apache.org">Stephane Bailliez</a>
*/
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

proposal/myrmidon/src/main/org/apache/tools/ant/taskdefs/optional/XMLValidateTask.java → proposal/myrmidon/src/java/org/apache/antlib/xml/XMLValidateTask.java View File

@@ -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 <a href="mailto:raphael.pierquin@agisphere.com">
* raphael.pierquin@agisphere.com</a>
*/
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
}

proposal/myrmidon/src/main/org/apache/tools/ant/taskdefs/XSLTLiaison.java → proposal/myrmidon/src/java/org/apache/antlib/xml/XSLTLiaison.java View File

@@ -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: <tt>FILE_PROTOCOL_PREFIX +

+ 46
- 0
proposal/myrmidon/src/java/org/apache/antlib/xml/XSLTParam.java View File

@@ -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;
}
}

proposal/myrmidon/src/todo/org/apache/tools/ant/taskdefs/XSLTProcess.java → proposal/myrmidon/src/java/org/apache/antlib/xml/XSLTProcess.java View File

@@ -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
}

proposal/myrmidon/src/main/org/apache/tools/ant/taskdefs/optional/XalanLiaison.java → proposal/myrmidon/src/java/org/apache/antlib/xml/XalanLiaison.java View File

@@ -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 <a href="mailto:rubys@us.ibm.com">Sam Ruby</a>
* @author <a href="mailto:sbailliez@apache.org">Stephane Bailliez</a>
*/
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

+ 0
- 18
proposal/myrmidon/src/main/org/apache/tools/ant/taskdefs/XSLTLogger.java View File

@@ -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 );
}

+ 0
- 13
proposal/myrmidon/src/main/org/apache/tools/ant/taskdefs/XSLTLoggerAware.java View File

@@ -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 );
}

+ 0
- 563
proposal/myrmidon/src/main/org/apache/tools/ant/taskdefs/XSLTProcess.java View File

@@ -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:
* <ul>
* <li> basedir
* <li> destdir
* <li> style
* <li> includes
* <li> excludes
* </ul>
* Of these arguments, the <b>sourcedir</b> and <b>destdir</b> are required. <p>
*
* 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 <a href="mailto:kvisco@exoffice.com">Keith Visco</a>
* @author <a href="mailto:rubys@us.ibm.com">Sam Ruby</a>
* @author <a href="mailto:russgold@acm.org">Russell Gold</a>
* @author <a href="stefan.bodewig@epost.de">Stefan Bodewig</a>
*/
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

+ 0
- 75
proposal/myrmidon/src/todo/org/apache/tools/ant/taskdefs/XSLTLiaison.java View File

@@ -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 <a href="mailto:rubys@us.ibm.com">Sam Ruby</a>
* @author <a href="mailto:sbailliez@apache.org">Stephane Bailliez</a>
* @see XSLTProcess
*/
public interface XSLTLiaison
{

/**
* the file protocol prefix for systemid. This file protocol must be
* appended to an absolute path. Typically: <tt>FILE_PROTOCOL_PREFIX +
* file.getAbsolutePath()</tt> 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

+ 0
- 18
proposal/myrmidon/src/todo/org/apache/tools/ant/taskdefs/XSLTLogger.java View File

@@ -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 );
}

+ 0
- 13
proposal/myrmidon/src/todo/org/apache/tools/ant/taskdefs/XSLTLoggerAware.java View File

@@ -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 );
}

+ 0
- 220
proposal/myrmidon/src/todo/org/apache/tools/ant/taskdefs/optional/TraXLiaison.java View File

@@ -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 <a href="mailto:rubys@us.ibm.com">Sam Ruby</a>
* @author <a href="mailto:dims@yahoo.com">Davanum Srinivas</a>
* @author <a href="mailto:sbailliez@apache.org">Stephane Bailliez</a>
*/
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

+ 0
- 654
proposal/myrmidon/src/todo/org/apache/tools/ant/taskdefs/optional/XMLValidateTask.java View File

@@ -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 <code>XMLValidateTask</code> checks that an XML document is valid, with a
* SAX validating parser.
*
* @author Raphael Pierquin <a href="mailto:raphael.pierquin@agisphere.com">
* raphael.pierquin@agisphere.com</a>
*/
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 <code>org.xml.sax.XMLReader</code>
* or SAX2 <code>org.xml.sax.Parser</code>. <p>
*
* if className is an implementation of <code>org.xml.sax.Parser</code>
* , {@link #setLenient(boolean)}, will be ignored. <p>
*
* 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. <p>
*
* If set to <code>true</code> (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 <code>true</code>
* . <p>
*
* If set to false, the validation will fail only if the parsed document is
* not well formed XML. <p>
*
* 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. <p>
*
* If set to <code>true
*</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 :
* <ul>
* <li> log SAX parse exceptions,
* <li> remember if an error occured
* </ul>
*/
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;
}
}
}

+ 0
- 114
proposal/myrmidon/src/todo/org/apache/tools/ant/taskdefs/optional/XalanLiaison.java View File

@@ -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 <a href="mailto:rubys@us.ibm.com">Sam Ruby</a>
* @author <a href="mailto:sbailliez@apache.org">Stephane Bailliez</a>
*/
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

Loading…
Cancel
Save