blob: bcd3860bbbc6c3ec05f1dbd07b271298ea2d2f93 [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
/*
* $Id: DefaultErrorHandler.java 524806 2007-04-02 15:51:39Z zongaro $
*/
package org.apache.xml.utils;
import java.io.PrintStream;
import java.io.PrintWriter;
import javax.xml.transform.ErrorListener;
import javax.xml.transform.SourceLocator;
import javax.xml.transform.TransformerException;
import org.apache.xml.res.XMLErrorResources;
import org.apache.xml.res.XMLMessages;
import org.xml.sax.ErrorHandler;
import org.xml.sax.SAXException;
import org.xml.sax.SAXParseException;
/**
* Implement SAX error handler for default reporting.
* @xsl.usage general
*/
public class DefaultErrorHandler implements ErrorHandler, ErrorListener
{
PrintWriter m_pw;
/**
* if this flag is set to true, we will rethrow the exception on
* the error() and fatalError() methods. If it is false, the errors
* are reported to System.err.
*/
boolean m_throwExceptionOnError = true;
/**
* Constructor DefaultErrorHandler
*/
public DefaultErrorHandler(PrintWriter pw)
{
m_pw = pw;
}
/**
* Constructor DefaultErrorHandler
*/
public DefaultErrorHandler(PrintStream pw)
{
m_pw = new PrintWriter(pw, true);
}
/**
* Constructor DefaultErrorHandler
*/
public DefaultErrorHandler()
{
this(true);
}
/**
* Constructor DefaultErrorHandler
*/
public DefaultErrorHandler(boolean throwExceptionOnError)
{
// Defer creation of a PrintWriter until it's actually needed
m_throwExceptionOnError = throwExceptionOnError;
}
/**
* Retrieve <code>java.io.PrintWriter</code> to which errors are being
* directed.
* @return The <code>PrintWriter</code> installed via the constructor
* or the default <code>PrintWriter</code>
*/
public PrintWriter getErrorWriter() {
// Defer creating the java.io.PrintWriter until an error needs to be
// reported.
if (m_pw == null) {
m_pw = new PrintWriter(System.err, true);
}
return m_pw;
}
/**
* Receive notification of a warning.
*
* <p>SAX parsers will use this method to report conditions that
* are not errors or fatal errors as defined by the XML 1.0
* recommendation. The default behaviour is to take no action.</p>
*
* <p>The SAX parser must continue to provide normal parsing events
* after invoking this method: it should still be possible for the
* application to process the document through to the end.</p>
*
* @param exception The warning information encapsulated in a
* SAX parse exception.
* @throws SAXException Any SAX exception, possibly
* wrapping another exception.
*/
public void warning(SAXParseException exception) throws SAXException
{
PrintWriter pw = getErrorWriter();
printLocation(pw, exception);
pw.println("Parser warning: " + exception.getMessage());
}
/**
* Receive notification of a recoverable error.
*
* <p>This corresponds to the definition of "error" in section 1.2
* of the W3C XML 1.0 Recommendation. For example, a validating
* parser would use this callback to report the violation of a
* validity constraint. The default behaviour is to take no
* action.</p>
*
* <p>The SAX parser must continue to provide normal parsing events
* after invoking this method: it should still be possible for the
* application to process the document through to the end. If the
* application cannot do so, then the parser should report a fatal
* error even if the XML 1.0 recommendation does not require it to
* do so.</p>
*
* @param exception The error information encapsulated in a
* SAX parse exception.
* @throws SAXException Any SAX exception, possibly
* wrapping another exception.
*/
public void error(SAXParseException exception) throws SAXException
{
//printLocation(exception);
// getErrorWriter().println(exception.getMessage());
throw exception;
}
/**
* Receive notification of a non-recoverable error.
*
* <p>This corresponds to the definition of "fatal error" in
* section 1.2 of the W3C XML 1.0 Recommendation. For example, a
* parser would use this callback to report the violation of a
* well-formedness constraint.</p>
*
* <p>The application must assume that the document is unusable
* after the parser has invoked this method, and should continue
* (if at all) only for the sake of collecting addition error
* messages: in fact, SAX parsers are free to stop reporting any
* other events once this method has been invoked.</p>
*
* @param exception The error information encapsulated in a
* SAX parse exception.
* @throws SAXException Any SAX exception, possibly
* wrapping another exception.
*/
public void fatalError(SAXParseException exception) throws SAXException
{
// printLocation(exception);
// getErrorWriter().println(exception.getMessage());
throw exception;
}
/**
* Receive notification of a warning.
*
* <p>SAX parsers will use this method to report conditions that
* are not errors or fatal errors as defined by the XML 1.0
* recommendation. The default behaviour is to take no action.</p>
*
* <p>The SAX parser must continue to provide normal parsing events
* after invoking this method: it should still be possible for the
* application to process the document through to the end.</p>
*
* @param exception The warning information encapsulated in a
* SAX parse exception.
* @throws javax.xml.transform.TransformerException Any SAX exception, possibly
* wrapping another exception.
* @see javax.xml.transform.TransformerException
*/
public void warning(TransformerException exception) throws TransformerException
{
PrintWriter pw = getErrorWriter();
printLocation(pw, exception);
pw.println(exception.getMessage());
}
/**
* Receive notification of a recoverable error.
*
* <p>This corresponds to the definition of "error" in section 1.2
* of the W3C XML 1.0 Recommendation. For example, a validating
* parser would use this callback to report the violation of a
* validity constraint. The default behaviour is to take no
* action.</p>
*
* <p>The SAX parser must continue to provide normal parsing events
* after invoking this method: it should still be possible for the
* application to process the document through to the end. If the
* application cannot do so, then the parser should report a fatal
* error even if the XML 1.0 recommendation does not require it to
* do so.</p>
*
* @param exception The error information encapsulated in a
* SAX parse exception.
* @throws javax.xml.transform.TransformerException Any SAX exception, possibly
* wrapping another exception.
* @see javax.xml.transform.TransformerException
*/
public void error(TransformerException exception) throws TransformerException
{
// If the m_throwExceptionOnError flag is true, rethrow the exception.
// Otherwise report the error to System.err.
if (m_throwExceptionOnError)
throw exception;
else
{
PrintWriter pw = getErrorWriter();
printLocation(pw, exception);
pw.println(exception.getMessage());
}
}
/**
* Receive notification of a non-recoverable error.
*
* <p>This corresponds to the definition of "fatal error" in
* section 1.2 of the W3C XML 1.0 Recommendation. For example, a
* parser would use this callback to report the violation of a
* well-formedness constraint.</p>
*
* <p>The application must assume that the document is unusable
* after the parser has invoked this method, and should continue
* (if at all) only for the sake of collecting addition error
* messages: in fact, SAX parsers are free to stop reporting any
* other events once this method has been invoked.</p>
*
* @param exception The error information encapsulated in a
* SAX parse exception.
* @throws javax.xml.transform.TransformerException Any SAX exception, possibly
* wrapping another exception.
* @see javax.xml.transform.TransformerException
*/
public void fatalError(TransformerException exception) throws TransformerException
{
// If the m_throwExceptionOnError flag is true, rethrow the exception.
// Otherwise report the error to System.err.
if (m_throwExceptionOnError)
throw exception;
else
{
PrintWriter pw = getErrorWriter();
printLocation(pw, exception);
pw.println(exception.getMessage());
}
}
public static void ensureLocationSet(TransformerException exception)
{
// SourceLocator locator = exception.getLocator();
SourceLocator locator = null;
Throwable cause = exception;
// Try to find the locator closest to the cause.
do
{
if(cause instanceof SAXParseException)
{
locator = new SAXSourceLocator((SAXParseException)cause);
}
else if (cause instanceof TransformerException)
{
SourceLocator causeLocator = ((TransformerException)cause).getLocator();
if(null != causeLocator)
locator = causeLocator;
}
if(cause instanceof TransformerException)
cause = ((TransformerException)cause).getCause();
else if(cause instanceof SAXException)
cause = ((SAXException)cause).getException();
else
cause = null;
}
while(null != cause);
exception.setLocator(locator);
}
public static void printLocation(PrintStream pw, TransformerException exception)
{
printLocation(new PrintWriter(pw), exception);
}
public static void printLocation(java.io.PrintStream pw, org.xml.sax.SAXParseException exception)
{
printLocation(new PrintWriter(pw), exception);
}
public static void printLocation(PrintWriter pw, Throwable exception)
{
SourceLocator locator = null;
Throwable cause = exception;
// Try to find the locator closest to the cause.
do
{
if(cause instanceof SAXParseException)
{
locator = new SAXSourceLocator((SAXParseException)cause);
}
else if (cause instanceof TransformerException)
{
SourceLocator causeLocator = ((TransformerException)cause).getLocator();
if(null != causeLocator)
locator = causeLocator;
}
if(cause instanceof TransformerException)
cause = ((TransformerException)cause).getCause();
else if(cause instanceof WrappedRuntimeException)
cause = ((WrappedRuntimeException)cause).getException();
else if(cause instanceof SAXException)
cause = ((SAXException)cause).getException();
else
cause = null;
}
while(null != cause);
if(null != locator)
{
// getErrorWriter().println("Parser fatal error: "+exception.getMessage());
String id = (null != locator.getPublicId() )
? locator.getPublicId()
: (null != locator.getSystemId())
? locator.getSystemId() : XMLMessages.createXMLMessage(XMLErrorResources.ER_SYSTEMID_UNKNOWN, null); //"SystemId Unknown";
pw.print(id + "; " +XMLMessages.createXMLMessage("line", null) + locator.getLineNumber()
+ "; " +XMLMessages.createXMLMessage("column", null) + locator.getColumnNumber()+"; ");
}
else
pw.print("("+XMLMessages.createXMLMessage(XMLErrorResources.ER_LOCATION_UNKNOWN, null)+")");
}
}