diff --git a/proposal/myrmidon/src/java/org/apache/antlib/xml/LocalResolver.java b/proposal/myrmidon/src/java/org/apache/antlib/xml/LocalResolver.java new file mode 100644 index 000000000..ba531262a --- /dev/null +++ b/proposal/myrmidon/src/java/org/apache/antlib/xml/LocalResolver.java @@ -0,0 +1,131 @@ +/* + * 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 java.io.File; +import java.io.FileInputStream; +import java.io.FileNotFoundException; +import java.io.IOException; +import java.io.InputStream; +import java.net.MalformedURLException; +import java.net.URL; +import java.util.Hashtable; +import org.apache.avalon.framework.logger.AbstractLogEnabled; +import org.xml.sax.EntityResolver; +import org.xml.sax.InputSource; +import org.xml.sax.SAXException; + +class LocalResolver + extends AbstractLogEnabled + implements EntityResolver +{ + private Hashtable m_fileDTDs = new Hashtable(); + private Hashtable m_resourceDTDs = new Hashtable(); + private Hashtable m_urlDTDs = new Hashtable(); + + public void registerDTD( String publicId, String location ) + { + if( location == null ) + { + return; + } + + File fileDTD = new File( location ); + if( fileDTD.exists() ) + { + if( publicId != null ) + { + m_fileDTDs.put( publicId, fileDTD ); + final String message = "Mapped publicId " + publicId + " to file " + fileDTD; + getLogger().debug( message ); + } + return; + } + + if( LocalResolver.this.getClass().getResource( location ) != null ) + { + if( publicId != null ) + { + m_resourceDTDs.put( publicId, location ); + final String message = "Mapped publicId " + publicId + + " to resource " + location; + getLogger().debug( message ); + } + } + + try + { + if( publicId != null ) + { + URL urldtd = new URL( location ); + m_urlDTDs.put( publicId, urldtd ); + } + } + catch( 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)m_fileDTDs.get( publicId ); + if( dtdFile != null ) + { + try + { + final String message = "Resolved " + publicId + " to local file " + dtdFile; + getLogger().debug( message ); + return new InputSource( new FileInputStream( dtdFile ) ); + } + catch( FileNotFoundException ex ) + { + // ignore + } + } + + String dtdResourceName = (String)m_resourceDTDs.get( publicId ); + if( dtdResourceName != null ) + { + InputStream is = getClass().getResourceAsStream( dtdResourceName ); + if( is != null ) + { + getLogger().debug( "Resolved " + publicId + " to local resource " + dtdResourceName ); + return new InputSource( is ); + } + } + + URL dtdUrl = (URL)m_urlDTDs.get( publicId ); + if( dtdUrl != null ) + { + try + { + InputStream is = dtdUrl.openStream(); + final String message = "Resolved " + publicId + " to url " + dtdUrl; + getLogger().debug( message ); + return new InputSource( is ); + } + catch( IOException ioe ) + { + //ignore + } + } + + final String message = "Could not resolve ( publicId: " + publicId + + ", systemId: " + systemId + ") to a local entity"; + getLogger().info( message ); + + return null; + } +} diff --git a/proposal/myrmidon/src/java/org/apache/antlib/xml/TraXLiaison.java b/proposal/myrmidon/src/java/org/apache/antlib/xml/TraXLiaison.java index 959df1e66..9d2a5a9bc 100644 --- a/proposal/myrmidon/src/java/org/apache/antlib/xml/TraXLiaison.java +++ b/proposal/myrmidon/src/java/org/apache/antlib/xml/TraXLiaison.java @@ -208,5 +208,4 @@ public class TraXLiaison getLogger().info( msg.toString() ); } - -}//-- TraXLiaison +} diff --git a/proposal/myrmidon/src/java/org/apache/antlib/xml/ValidatorErrorHandler.java b/proposal/myrmidon/src/java/org/apache/antlib/xml/ValidatorErrorHandler.java new file mode 100644 index 000000000..37719cd20 --- /dev/null +++ b/proposal/myrmidon/src/java/org/apache/antlib/xml/ValidatorErrorHandler.java @@ -0,0 +1,92 @@ +/* + * 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 java.io.File; +import java.net.MalformedURLException; +import java.net.URL; +import org.apache.avalon.framework.logger.AbstractLogEnabled; +import org.xml.sax.ErrorHandler; +import org.xml.sax.SAXParseException; + +/* + * ValidatorErrorHandler role : + * + */ +final class ValidatorErrorHandler + extends AbstractLogEnabled + implements ErrorHandler +{ + private File m_file; + private String m_lastErrorMessage; + private boolean m_failed; + private final boolean m_warn; + + protected ValidatorErrorHandler( final boolean warn ) + { + m_warn = warn; + } + + public void error( final SAXParseException spe ) + { + m_failed = true; + getLogger().error( getMessage( spe ), spe ); + } + + public void fatalError( final SAXParseException spe ) + { + m_failed = true; + getLogger().error( getMessage( spe ), spe ); + } + + public void warning( final SAXParseException spe ) + { + // depending on implementation, XMLReader can yield hips of warning, + // only output then if user explicitely asked for it + if( m_warn ) + { + getLogger().warn( getMessage( spe ), spe ); + } + } + + protected void init( final File file ) + { + m_file = file; + m_failed = false; + } + + // did an error happen during last parsing ? + protected boolean getFailure() + { + return m_failed; + } + + private String getMessage( final SAXParseException spe ) + { + final String sysID = spe.getSystemId(); + if( sysID != null ) + { + try + { + final int line = spe.getLineNumber(); + final int col = spe.getColumnNumber(); + return new URL( sysID ).getFile() + + ( line == -1 ? "" : ( ":" + line + + ( col == -1 ? "" : ( ":" + col ) ) ) ) + + ": " + spe.getMessage(); + } + catch( MalformedURLException mfue ) + { + } + } + return spe.getMessage(); + } +} diff --git a/proposal/myrmidon/src/java/org/apache/antlib/xml/XMLValidateTask.java b/proposal/myrmidon/src/java/org/apache/antlib/xml/XMLValidateTask.java index 309689d76..a4ee0f0e1 100644 --- a/proposal/myrmidon/src/java/org/apache/antlib/xml/XMLValidateTask.java +++ b/proposal/myrmidon/src/java/org/apache/antlib/xml/XMLValidateTask.java @@ -59,7 +59,6 @@ public class XMLValidateTask private boolean m_warn = true; private boolean m_lenient; private String m_readerClassName = DEFAULT_XML_READER_CLASSNAME; - private File m_file;// file to be validated private ArrayList m_filesets = new ArrayList(); @@ -74,7 +73,7 @@ public class XMLValidateTask /** * to report sax parsing errors */ - private ValidatorErrorHandler m_errorHandler = new ValidatorErrorHandler(); + private ValidatorErrorHandler m_errorHandler; private Hashtable m_features = new Hashtable(); /** @@ -234,9 +233,10 @@ public class XMLValidateTask getLogger().info( message ); } - private EntityResolver getEntityResolver() + private EntityResolver buildEntityResolver() { final LocalResolver resolver = new LocalResolver(); + setupLogger( resolver ); for( int i = 0; i < m_dtdLocations.size(); i++ ) { @@ -377,7 +377,10 @@ public class XMLValidateTask throw new TaskException( INIT_FAILED_MSG + m_readerClassName, e ); } - m_xmlReader.setEntityResolver( getEntityResolver() ); + m_xmlReader.setEntityResolver( buildEntityResolver() ); + + m_errorHandler = new ValidatorErrorHandler( m_warn ); + setupLogger( m_errorHandler ); m_xmlReader.setErrorHandler( m_errorHandler ); if( !( m_xmlReader instanceof ParserAdapter ) ) @@ -403,175 +406,4 @@ public class XMLValidateTask } } - /* - * ValidatorErrorHandler role : - * - */ - private class ValidatorErrorHandler - implements ErrorHandler - { - private File currentFile; - private String lastErrorMessage; - private boolean failed; - - // did an error happen during last parsing ? - public boolean getFailure() - { - return failed; - } - - public void error( SAXParseException exception ) - { - failed = true; - getLogger().error( getMessage( exception ), exception ); - } - - public void fatalError( SAXParseException exception ) - { - failed = true; - getLogger().error( getMessage( exception ), exception ); - } - - 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( m_warn ) - { - getLogger().warn( getMessage( exception ), exception ); - } - } - - 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 class LocalResolver - implements EntityResolver - { - private Hashtable fileDTDs = new Hashtable(); - private Hashtable resourceDTDs = new Hashtable(); - private Hashtable urlDTDs = new Hashtable(); - - 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 ); - getLogger().debug( "Mapped publicId " + publicId + " to file " + fileDTD ); - } - return; - } - - if( LocalResolver.this.getClass().getResource( location ) != null ) - { - if( publicId != null ) - { - resourceDTDs.put( publicId, location ); - getLogger().debug( "Mapped publicId " + publicId + " to resource " + location ); - } - } - - try - { - if( publicId != null ) - { - URL urldtd = new URL( location ); - urlDTDs.put( publicId, urldtd ); - } - } - catch( 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 - { - getLogger().debug( "Resolved " + publicId + " to local file " + dtdFile ); - return new InputSource( new FileInputStream( dtdFile ) ); - } - catch( FileNotFoundException ex ) - { - // ignore - } - } - - String dtdResourceName = (String)resourceDTDs.get( publicId ); - if( dtdResourceName != null ) - { - InputStream is = getClass().getResourceAsStream( dtdResourceName ); - if( is != null ) - { - getLogger().debug( "Resolved " + publicId + " to local resource " + dtdResourceName ); - return new InputSource( is ); - } - } - - URL dtdUrl = (URL)urlDTDs.get( publicId ); - if( dtdUrl != null ) - { - try - { - InputStream is = dtdUrl.openStream(); - getLogger().debug( "Resolved " + publicId + " to url " + dtdUrl ); - return new InputSource( is ); - } - catch( IOException ioe ) - { - //ignore - } - } - - getLogger().info( "Could not resolve ( publicId: " + publicId + ", systemId: " + systemId + ") to a local entity" ); - - return null; - } - } } diff --git a/proposal/myrmidon/src/java/org/apache/antlib/xml/XSLTParam.java b/proposal/myrmidon/src/java/org/apache/antlib/xml/XSLTParam.java index 766bd69d4..6c1c7f647 100644 --- a/proposal/myrmidon/src/java/org/apache/antlib/xml/XSLTParam.java +++ b/proposal/myrmidon/src/java/org/apache/antlib/xml/XSLTParam.java @@ -9,7 +9,7 @@ package org.apache.antlib.xml; import org.apache.myrmidon.api.TaskException; -public class XSLTParam +public final class XSLTParam { private String m_name; private String m_expression; @@ -24,23 +24,13 @@ public class XSLTParam m_name = name; } - public String getExpression() - throws TaskException + protected String getExpression() { - if( m_expression == null ) - { - throw new TaskException( "Expression attribute is missing." ); - } return m_expression; } - public String getName() - throws TaskException + protected String getName() { - if( m_name == null ) - { - throw new TaskException( "Name attribute is missing." ); - } return m_name; } } diff --git a/proposal/myrmidon/src/java/org/apache/antlib/xml/XSLTProcess.java b/proposal/myrmidon/src/java/org/apache/antlib/xml/XSLTProcess.java index 3177c7dec..a00445f75 100644 --- a/proposal/myrmidon/src/java/org/apache/antlib/xml/XSLTProcess.java +++ b/proposal/myrmidon/src/java/org/apache/antlib/xml/XSLTProcess.java @@ -324,13 +324,26 @@ public class XSLTProcess while( params.hasNext() ) { final XSLTParam param = (XSLTParam)params.next(); - m_liaison.addParam( param.getName(), param.getExpression() ); + + final String expression = param.getExpression(); + if( expression == null ) + { + throw new TaskException( "Expression attribute is missing." ); + } + + final String name = param.getName(); + if( name == null ) + { + throw new TaskException( "Name attribute is missing." ); + } + + m_liaison.addParam( name, expression ); } } catch( final Exception e ) { getLogger().info( "Failed to read stylesheet " + stylesheet ); - throw new TaskException( "Error", e ); + throw new TaskException( e.getMessage(), e ); } } @@ -342,8 +355,8 @@ public class XSLTProcess { if( !directory.mkdirs() ) { - throw new TaskException( "Unable to create directory: " - + directory.getAbsolutePath() ); + throw new TaskException( "Unable to create directory: " + + directory.getAbsolutePath() ); } } }