/*
 * 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.usagegeneral
/** * 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.
/** * 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
/** * Constructor DefaultErrorHandler */
public DefaultErrorHandler(PrintWriter pw) { m_pw = pw; }
Constructor DefaultErrorHandler
/** * Constructor DefaultErrorHandler */
public DefaultErrorHandler(PrintStream pw) { m_pw = new PrintWriter(pw, true); }
Constructor DefaultErrorHandler
/** * Constructor DefaultErrorHandler */
public DefaultErrorHandler() { this(true); }
Constructor DefaultErrorHandler
/** * Constructor DefaultErrorHandler */
public DefaultErrorHandler(boolean throwExceptionOnError) { // Defer creation of a PrintWriter until it's actually needed m_throwExceptionOnError = throwExceptionOnError; }
Retrieve java.io.PrintWriter to which errors are being directed.
Returns:The PrintWriter installed via the constructor or the default PrintWriter
/** * 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.

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.

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.

Params:
  • exception – The warning information encapsulated in a SAX parse exception.
Throws:
  • SAXException – Any SAX exception, possibly wrapping another 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 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.

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.

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.

Params:
  • exception – The error information encapsulated in a SAX parse exception.
Throws:
  • SAXException – Any SAX exception, possibly wrapping another exception.
/** * 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.

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.

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.

Params:
  • exception – The error information encapsulated in a SAX parse exception.
Throws:
  • SAXException – Any SAX exception, possibly wrapping another 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.

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.

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.

Params:
  • exception – The warning information encapsulated in a SAX parse exception.
Throws:
See Also:
/** * 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.

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.

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.

Params:
  • exception – The error information encapsulated in a SAX parse exception.
Throws:
See Also:
/** * 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.

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.

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.

Params:
  • exception – The error information encapsulated in a SAX parse exception.
Throws:
See Also:
/** * 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)+")"); } }