package com.fasterxml.aalto;

import javax.xml.stream.Location;
import javax.xml.stream.XMLStreamException;

import org.codehaus.stax2.validation.XMLValidationException;
import org.codehaus.stax2.validation.XMLValidationProblem;

Specific exception thrown when document has validation (DTD, W3C Schema) errors; things that are not well-formedness problems.

The current implementation does not add much beyond basic XMLValidationException, except for fixing some problems that underlying XMLStreamException has.

Note that some of the code is shared with other sub-classes. Unfortunately it is not possible to extend it, since they extend XMLStreamException, not XMLValidationException.

/** * Specific exception thrown when document has validation (DTD, W3C Schema) * errors; things that are not well-formedness problems. *<p> * The current implementation does not add much beyond basic * {@link XMLValidationException}, except for fixing some problems that * underlying {@link XMLStreamException} has. *<p> * Note that some of the code is shared with other sub-classes. * Unfortunately it is not possible to extend it, since they extend * {@link XMLStreamException}, not {@link XMLValidationException}. */
@SuppressWarnings("serial") public class ValidationException extends XMLValidationException { protected ValidationException(XMLValidationProblem cause, String msg) { super(cause, msg); } protected ValidationException(XMLValidationProblem cause, String msg, Location loc) { super(cause, msg, loc); } public static ValidationException create(XMLValidationProblem cause) { // Should always get a message Location loc = cause.getLocation(); if (loc == null) { return new ValidationException(cause, cause.getMessage()); } return new ValidationException(cause, cause.getMessage(), loc); } /* ///////////////////////////////////////////////////////// // Overridden methods from XMLStreamException ///////////////////////////////////////////////////////// */
Method is overridden for two main reasons: first, default method does not display public/system id information, even if it exists, and second, default implementation can not handle nested Location information.
/** * Method is overridden for two main reasons: first, default method * does not display public/system id information, even if it exists, and * second, default implementation can not handle nested Location * information. */
@Override public String getMessage() { String locMsg = getLocationDesc(); /* Better not use super's message if we do have location information, * since parent's message contains (part of) Location * info; something we can regenerate better... */ if (locMsg == null) { return super.getMessage(); } String msg = getValidationProblem().getMessage(); StringBuilder sb = new StringBuilder(msg.length() + locMsg.length() + 20); sb.append(msg); sb.append('\n'); sb.append(" at "); sb.append(locMsg); return sb.toString(); } @Override public String toString() { return getClass().getName()+": "+getMessage(); } /* //////////////////////////////////////////////////////// // Internal methods: //////////////////////////////////////////////////////// */ protected String getLocationDesc() { Location loc = getLocation(); return (loc == null) ? null : loc.toString(); } }