/**
 * <copyright>
 * 
 * Copyright (c) 2008-2010 See4sys and others.
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License v2.0
 * which accompanies this distribution, and is available at
 * https://www.eclipse.org/org/documents/epl-2.0/EPL-2.0.html
 * 
 * Contributors: 
 *     See4sys - Initial API and implementation
 * 
 * </copyright>
 */
package org.eclipse.sphinx.emf.resource;

import org.xml.sax.Locator;
import org.xml.sax.SAXParseException;

/**
 * Encapsulate an XML parse error or warning.
 * <p>
 * This exception may include information for locating the error in the original XML document, as if it came from a
 * {@link Locator} object. Note that although the application will receive a {@link XMLWellformednessException} as the
 * argument to the handlers in the {@link org.xml.sax.ErrorHandler ErrorHandler} interface, the application is not
 * actually required to throw the exception; instead, it can simply read the information in it and take a different
 * action.
 * </p>
 * <p>
 * Since this exception is a subclass of {@link org.xml.sax.SAXParseException SAXParseException}, it inherits the
 * ability to wrap another exception.
 * </p>
 * 
 * @since 0.7.0
 * @see org.xml.sax.SAXException
 * @see org.xml.sax.Locator
 * @see org.xml.sax.ErrorHandler
 */
public class XMLWellformednessException extends SAXParseException {

	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;

	/**
	 * Create a new XMLWellformednessException from a message and a Locator.
	 * <p>
	 * This constructor is especially useful when an application is creating its own exception from within a
	 * {@link org.xml.sax.ContentHandler ContentHandler} callback.
	 * </p>
	 * 
	 * @param message
	 *            The error or warning message.
	 * @param locator
	 *            The locator object for the error or warning (may be null).
	 * @see org.xml.sax.Locator
	 */
	public XMLWellformednessException(String message, Locator locator) {
		super(message, locator);
	}

	/**
	 * Wrap an existing exception in a XMLWellformednessException.
	 * <p>
	 * This constructor is especially useful when an application is creating its own exception from within a
	 * {@link org.xml.sax.ContentHandler ContentHandler} callback, and needs to wrap an existing exception that is not a
	 * subclass of {@link org.xml.sax.SAXException SAXException}.
	 * </p>
	 * 
	 * @param message
	 *            The error or warning message, or null to use the message from the embedded exception.
	 * @param locator
	 *            The locator object for the error or warning (may be null).
	 * @param e
	 *            Any exception.
	 * @see org.xml.sax.Locator
	 */
	public XMLWellformednessException(String message, Locator locator, Exception e) {
		super(message, locator, e);
	}

	/**
	 * Create a new XMLWellformednessException.
	 * <p>
	 * This constructor is most useful for parser writers.
	 * </p>
	 * <p>
	 * All parameters except the message are as if they were provided by a {@link Locator}. For example, if the system
	 * identifier is a URL (including relative filename), the caller must resolve it fully before creating the
	 * exception.
	 * </p>
	 * 
	 * @param message
	 *            The error or warning message.
	 * @param publicId
	 *            The public identifier of the entity that generated the error or warning.
	 * @param systemId
	 *            The system identifier of the entity that generated the error or warning.
	 * @param lineNumber
	 *            The line number of the end of the text that caused the error or warning.
	 * @param columnNumber
	 *            The column number of the end of the text that cause the error or warning.
	 */
	public XMLWellformednessException(String message, String publicId, String systemId, int lineNumber, int columnNumber) {
		super(message, publicId, systemId, lineNumber, columnNumber);
	}

	/**
	 * Create a new XMLWellformednessException with an embedded exception.
	 * <p>
	 * This constructor is most useful for parser writers who need to wrap an exception that is not a subclass of
	 * {@link org.xml.sax.SAXException SAXException}.
	 * </p>
	 * <p>
	 * All parameters except the message and exception are as if they were provided by a {@link Locator}. For example,
	 * if the system identifier is a URL (including relative filename), the caller must resolve it fully before creating
	 * the exception.
	 * </p>
	 * 
	 * @param message
	 *            The error or warning message, or null to use the message from the embedded exception.
	 * @param publicId
	 *            The public identifier of the entity that generated the error or warning.
	 * @param systemId
	 *            The system identifier of the entity that generated the error or warning.
	 * @param lineNumber
	 *            The line number of the end of the text that caused the error or warning.
	 * @param columnNumber
	 *            The column number of the end of the text that cause the error or warning.
	 * @param e
	 *            Another exception to embed in this one.
	 */
	public XMLWellformednessException(String message, String publicId, String systemId, int lineNumber, int columnNumber, Exception e) {
		super(message, publicId, systemId, lineNumber, columnNumber, e);
	}

	/*
	 * @see java.lang.Throwable#toString()
	 */
	@Override
	public String toString() {
		String name = getClass().getName();
		String msg = getLocalizedMessage();
		return msg != null ? msg : name;
	}
}
