All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.htmlunit.cyberneko.xerces.util.ErrorHandlerWrapper Maven / Gradle / Ivy

/*
 * Copyright (c) 2017-2024 Ronald Brill
 *
 * Licensed 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
 * https://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.
 */
package org.htmlunit.cyberneko.xerces.util;

import org.htmlunit.cyberneko.xerces.xni.XMLLocator;
import org.htmlunit.cyberneko.xerces.xni.XNIException;
import org.htmlunit.cyberneko.xerces.xni.parser.XMLErrorHandler;
import org.htmlunit.cyberneko.xerces.xni.parser.XMLParseException;
import org.xml.sax.ErrorHandler;
import org.xml.sax.SAXException;
import org.xml.sax.SAXParseException;

/**
 * This class wraps a SAX error handler in an XNI error handler.
 *
 * @see ErrorHandler
 *
 * @author Andy Clark, IBM
 */
public class ErrorHandlerWrapper implements XMLErrorHandler {

    /** The SAX error handler. */
    private ErrorHandler fErrorHandler_;

    // Wraps the specified SAX error handler.
    public ErrorHandlerWrapper(final ErrorHandler errorHandler) {
        setErrorHandler(errorHandler);
    }

    // Sets the SAX error handler.
    public void setErrorHandler(final ErrorHandler errorHandler) {
        fErrorHandler_ = errorHandler;
    }

    /** @return the SAX error handler. */
    public ErrorHandler getErrorHandler() {
        return fErrorHandler_;
    }

    /**
     * Reports a warning. Warnings are non-fatal and can be safely ignored by most
     * applications.
     *
     * @param domain    The domain of the warning. The domain can be any string but
     *                  is suggested to be a valid URI. The domain can be used to
     *                  conveniently specify a web site location of the relevent
     *                  specification or document pertaining to this warning.
     * @param key       The warning key. This key can be any string and is
     *                  implementation dependent.
     * @param exception Exception.
     *
     * @throws XNIException Thrown to signal that the parser should stop parsing the
     *                      document.
     */
    @Override
    public void warning(final String domain, final String key, final XMLParseException exception) throws XNIException {

        if (fErrorHandler_ != null) {
            final SAXParseException saxException = createSAXParseException(exception);

            try {
                fErrorHandler_.warning(saxException);
            }
            catch (final SAXParseException e) {
                throw createXMLParseException(e);
            }
            catch (final SAXException e) {
                throw createXNIException(e);
            }
        }

    }

    /**
     * Reports an error. Errors are non-fatal and usually signify that the document
     * is invalid with respect to its grammar(s).
     *
     * @param domain    The domain of the error. The domain can be any string but is
     *                  suggested to be a valid URI. The domain can be used to
     *                  conveniently specify a web site location of the relevent
     *                  specification or document pertaining to this error.
     * @param key       The error key. This key can be any string and is
     *                  implementation dependent.
     * @param exception Exception.
     *
     * @throws XNIException Thrown to signal that the parser should stop parsing the
     *                      document.
     */
    @Override
    public void error(final String domain, final String key, final XMLParseException exception) throws XNIException {

        if (fErrorHandler_ != null) {
            final SAXParseException saxException = createSAXParseException(exception);

            try {
                fErrorHandler_.error(saxException);
            }
            catch (final SAXParseException e) {
                throw createXMLParseException(e);
            }
            catch (final SAXException e) {
                throw createXNIException(e);
            }
        }

    }

    /**
     * Report a fatal error. Fatal errors usually occur when the document is not
     * well-formed and signifies that the parser cannot continue normal operation.
     * 

* Note: The error handler should always throw an * XNIException from this method. This exception can either be the * same exception that is passed as a parameter to the method or a new XNI * exception object. If the registered error handler fails to throw an * exception, the continuing operation of the parser is undetermined. * * @param domain The domain of the fatal error. The domain can be any string * but is suggested to be a valid URI. The domain can be used * to conveniently specify a web site location of the relevent * specification or document pertaining to this fatal error. * @param key The fatal error key. This key can be any string and is * implementation dependent. * @param exception Exception. * * @throws XNIException Thrown to signal that the parser should stop parsing the * document. */ @Override public void fatalError(final String domain, final String key, final XMLParseException exception) throws XNIException { if (fErrorHandler_ != null) { final SAXParseException saxException = createSAXParseException(exception); try { fErrorHandler_.fatalError(saxException); } catch (final SAXParseException e) { throw createXMLParseException(e); } catch (final SAXException e) { throw createXNIException(e); } } } // Creates a SAXParseException from an XMLParseException. protected static SAXParseException createSAXParseException(final XMLParseException exception) { return new SAXParseException(exception.getMessage(), exception.getPublicId(), exception.getExpandedSystemId(), exception.getLineNumber(), exception.getColumnNumber(), exception.getException()); } // Creates an XMLParseException from a SAXParseException. */ protected static XMLParseException createXMLParseException(final SAXParseException exception) { final String fPublicId = exception.getPublicId(); final String fExpandedSystemId = exception.getSystemId(); final int fLineNumber = exception.getLineNumber(); final int fColumnNumber = exception.getColumnNumber(); final XMLLocator location = new XMLLocator() { @Override public String getPublicId() { return fPublicId; } @Override public String getExpandedSystemId() { return fExpandedSystemId; } @Override public String getBaseSystemId() { return null; } @Override public String getLiteralSystemId() { return null; } @Override public int getColumnNumber() { return fColumnNumber; } @Override public int getLineNumber() { return fLineNumber; } @Override public int getCharacterOffset() { return -1; } @Override public String getEncoding() { return null; } @Override public String getXMLVersion() { return null; } }; return new XMLParseException(location, exception.getMessage(), exception); } // Creates an XNIException from a SAXException. // NOTE: care should be taken *not* to call this with a SAXParseException; this // will lose information!!! */ protected static XNIException createXNIException(final SAXException exception) { return new XNIException(exception.getMessage(), exception); } }





© 2015 - 2024 Weber Informatics LLC | Privacy Policy