GraphMLValidatorErrorHandler.java

package org.thewonderlemming.c4plantuml.graphml.validation;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.xml.sax.ErrorHandler;
import org.xml.sax.SAXException;
import org.xml.sax.SAXParseException;

/**
 * A custom implementation of {@link ErrorHandler} to log validation errors and warnings, then to throw exceptions if
 * wanted.
 *
 * @author thewonderlemming
 *
 */
public class GraphMLValidatorErrorHandler implements ErrorHandler {

    private final boolean strictValidation;


    /**
     * Default constructor.
     *
     * @param strictValidation throws exceptions on validation errors and warnings if set to {@code true}.
     */
    public GraphMLValidatorErrorHandler(final boolean strictValidation) {
        this.strictValidation = strictValidation;
    }

    /**
     * {@inheritDoc}
     */
    @Override
    public void error(final SAXParseException exception) throws SAXException {
        report(exception, (logger, msg, e) -> logger.error(msg, e));
    }

    /**
     * {@inheritDoc}
     */
    @Override
    public void fatalError(final SAXParseException exception) throws SAXException {
        report(exception, (logger, msg, e) -> logger.error(msg, e));
    }

    /**
     * {@inheritDoc}
     */
    @Override
    public void warning(final SAXParseException exception) throws SAXException {
        report(exception, (logger, msg, e) -> logger.warn(msg, e));
    }

    private Logger getLogger() {
        return LoggerFactory.getLogger(GraphMLValidator.class);
    }

    private void report(final SAXParseException exception, final TripleConsumer<Logger, String, Throwable> logger)
        throws SAXException {

        logger.accept(getLogger(), exception.getMessage(), exception);

        if (strictValidation) {
            throw new ValidationException(exception.getMessage(), exception);
        }
    }
}