diff --git a/proposal/myrmidon/src/java/org/apache/antlib/xml/TraxErrorListener.java b/proposal/myrmidon/src/java/org/apache/antlib/xml/TraxErrorListener.java new file mode 100644 index 000000000..a6058fb0a --- /dev/null +++ b/proposal/myrmidon/src/java/org/apache/antlib/xml/TraxErrorListener.java @@ -0,0 +1,86 @@ +/* + * 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.net.MalformedURLException; +import java.net.URL; +import javax.xml.transform.ErrorListener; +import javax.xml.transform.SourceLocator; +import javax.xml.transform.TransformerException; +import org.apache.avalon.framework.logger.AbstractLogEnabled; + +final class TraxErrorListener + extends AbstractLogEnabled + implements ErrorListener +{ + private final boolean m_warn; + private boolean m_failed; + + protected TraxErrorListener( final boolean warn ) + { + m_warn = warn; + } + + public void error( final TransformerException te ) + { + m_failed = true; + getLogger().error( getMessage( te ), te ); + } + + public void fatalError( final TransformerException te ) + { + m_failed = true; + getLogger().error( getMessage( te ), te ); + } + + public void warning( final TransformerException te ) + { + // depending on implementation, XMLReader can yield hips of warning, + // only output then if user explicitely asked for it + if( m_warn ) + { + getLogger().warn( getMessage( te ), te ); + } + } + + protected void reset() + { + m_failed = false; + } + + // did an error happen during last parsing ? + protected boolean getFailure() + { + return m_failed; + } + + private String getMessage( final TransformerException te ) + { + final SourceLocator locator = te.getLocator(); + final String systemID = locator.getSystemId(); + if( null != systemID ) + { + final int line = locator.getLineNumber(); + final int column = locator.getColumnNumber(); + + try + { + //Build a message using standard compiler + //error format + return new URL( systemID ).getFile() + + ( line == -1 ? "" : ( ":" + line + + ( column == -1 ? "" : ( ":" + column ) ) ) ) + + ": " + te.getMessage(); + } + catch( final MalformedURLException mue ) + { + } + } + return te.getMessage(); + } +}