blob: 0ddb1000dfd153547f829415a6c3ec229aa2fb75 [file] [log] [blame]
// SAX exception class.
// http://www.saxproject.org
// No warranty; no copyright -- use this as you will.
// $Id: SAXParseException.java,v 1.11 2004/04/21 13:05:02 dmegginson Exp $
using System;
#if FEATURE_SERIALIZABLE_EXCEPTIONS
using System.ComponentModel;
using System.Runtime.Serialization;
#endif
#if FEATURE_CODE_ACCESS_SECURITY
using System.Security.Permissions;
#endif
namespace Sax
{
/// <summary>
/// Encapsulate an XML parse error or warning.
/// </summary>
/// <remarks>
/// <em>This module, both source code and documentation, is in the
/// Public Domain, and comes with<strong> NO WARRANTY</strong>.</em>
/// See<a href='http://www.saxproject.org'>http://www.saxproject.org</a>
/// for further information.
/// <para/>
/// This exception may include information for locating the error
/// in the original XML document, as if it came from a <see cref="ILocator"/>
/// object. Note that although the application
/// will receive a SAXParseException as the argument to the handlers
/// in the <see cref="IErrorHandler"/> 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.
/// <para/>
/// Since this exception is a subclass of <see cref="SAXException"/>,
/// it inherits the ability to wrap another exception.
/// </remarks>
/// <since>SAX 1.0</since>
/// <author>David Megginson</author>
/// <version>2.0.1 (sax2r2)</version>
/// <seealso cref="SAXException"/>
/// <seealso cref="ILocator"/>
/// <seealso cref="IErrorHandler"/>
// LUCENENET: It is no longer good practice to use binary serialization.
// See: https://github.com/dotnet/corefx/issues/23584#issuecomment-325724568
#if FEATURE_SERIALIZABLE_EXCEPTIONS
[Serializable]
#endif
public class SAXParseException : SAXException
{
//////////////////////////////////////////////////////////////////////
// Constructors.
//////////////////////////////////////////////////////////////////////
/// <summary>
/// Create a new <see cref="SAXParseException"/> from a message and a <see cref="ILocator"/>.
/// </summary>
/// <remarks>
/// This constructor is especially useful when an application is
/// creating its own exception from within a <see cref="IContentHandler"/>
/// callback.
/// </remarks>
/// <param name="message">The error or warning message.</param>
/// <param name="locator">The locator object for the error or warning (may be null).</param>
/// <seealso cref="ILocator"/>
public SAXParseException(string message, ILocator locator)
: base(message)
{
if (locator != null)
{
Init(locator.PublicId, locator.SystemId,
locator.LineNumber, locator.ColumnNumber);
}
else
{
Init(null, null, -1, -1);
}
}
/// <summary>
/// Wrap an existing exception in a SAXParseException.
/// </summary>
/// <remarks>
/// This constructor is especially useful when an application is
/// creating its own exception from within a <see cref="IContentHandler"/>
/// callback, and needs to wrap an existing exception that is not a
/// subclass of <see cref="SAXException"/>.
/// </remarks>
/// <param name="message">The error or warning message, or null to
/// use the message from the embedded exception.</param>
/// <param name="locator">The locator object for the error or warning (may be
/// null).</param>
/// <param name="e">Any exception.</param>
/// <seealso cref="ILocator"/>
public SAXParseException(string message, ILocator locator,
Exception e)
: base(message, e)
{
if (locator != null)
{
Init(locator.PublicId, locator.SystemId,
locator.LineNumber, locator.ColumnNumber);
}
else
{
Init(null, null, -1, -1);
}
}
/// <summary>
/// Create a new SAXParseException.
/// </summary>
/// <remarks>
/// This constructor is most useful for parser writers.
/// <para/>
/// All parameters except the message are as if
/// they were provided by a <see cref="ILocator"/>. For example, if the
/// system identifier is a URL (including relative filename), the
/// caller must resolve it fully before creating the exception.
/// </remarks>
/// <param name="message">The error or warning message.</param>
/// <param name="publicId">The public identifier of the entity that generated the error or warning.</param>
/// <param name="systemId">The system identifier of the entity that generated the error or warning.</param>
/// <param name="lineNumber">The line number of the end of the text that caused the error or warning.</param>
/// <param name="columnNumber">The column number of the end of the text that cause the error or warning.</param>
public SAXParseException(string message, string publicId, string systemId,
int lineNumber, int columnNumber)
: base(message)
{
Init(publicId, systemId, lineNumber, columnNumber);
}
/// <summary>
/// Create a new <see cref="SAXParseException"/> with an embedded exception.
/// </summary>
/// <remarks>
/// This constructor is most useful for parser writers who
/// need to wrap an exception that is not a subclass of
/// <see cref="SAXException"/>.
/// <para/>
/// All parameters except the message and exception are as if
/// they were provided by a <see cref="ILocator"/>. For example, if the
/// system identifier is a URL (including relative filename), the
/// caller must resolve it fully before creating the exception.
/// </remarks>
/// <param name="message">The error or warning message, or null to use the message from the embedded exception.</param>
/// <param name="publicId">The public identifier of the entity that generated the error or warning.</param>
/// <param name="systemId">The system identifier of the entity that generated the error or warning.</param>
/// <param name="lineNumber">The line number of the end of the text that caused the error or warning.</param>
/// <param name="columnNumber">The column number of the end of the text that cause the error or warning.</param>
/// <param name="e">Another exception to embed in this one.</param>
public SAXParseException(string message, string publicId, string systemId,
int lineNumber, int columnNumber, Exception e)
: base(message, e)
{
Init(publicId, systemId, lineNumber, columnNumber);
}
/// <summary>
/// Construct a new exception with no message.
/// </summary>
// LUCENENET: For testing purposes
internal SAXParseException(string message)
: base(message)
{
}
#if FEATURE_SERIALIZABLE_EXCEPTIONS
/// <summary>
/// Initializes a new instance of this class with serialized data.
/// </summary>
/// <param name="info">The <see cref="SerializationInfo"/> that holds the serialized object data about the exception being thrown.</param>
/// <param name="context">The <see cref="StreamingContext"/> that contains contextual information about the source or destination.</param>
[Obsolete("This API supports obsolete formatter-based serialization. It should not be called or extended by application code.")]
[EditorBrowsable(EditorBrowsableState.Never)]
protected SAXParseException(SerializationInfo info, StreamingContext context)
: base(info, context)
{
publicId = info.GetString("publicId");
systemId = info.GetString("systemId");
lineNumber = info.GetInt32("lineNumber");
columnNumber = info.GetInt32("columnNumber");
}
#if FEATURE_CODE_ACCESS_SECURITY
[SecurityPermission(SecurityAction.Demand, SerializationFormatter = true)]
#endif
[Obsolete("This API supports obsolete formatter-based serialization. It should not be called or extended by application code.")]
[EditorBrowsable(EditorBrowsableState.Never)]
#pragma warning disable CS0809 // Obsolete member overrides non-obsolete member
public override void GetObjectData(SerializationInfo info, StreamingContext context)
#pragma warning restore CS0809 // Obsolete member overrides non-obsolete member
{
base.GetObjectData(info, context);
info.AddValue("publicId", publicId, typeof(string));
info.AddValue("systemId", systemId, typeof(string));
info.AddValue("lineNumber", lineNumber, typeof(int));
info.AddValue("columnNumber", columnNumber, typeof(int));
}
#endif
/// <summary>
/// Internal initialization method.
/// </summary>
/// <param name="publicId">The public identifier of the entity which generated the exception, or null.</param>
/// <param name="systemId">The system identifier of the entity which generated the exception, or null.</param>
/// <param name="lineNumber">The line number of the error, or -1.</param>
/// <param name="columnNumber">The column number of the error, or -1.</param>
private void Init(string publicId, string systemId,
int lineNumber, int columnNumber)
{
this.publicId = publicId;
this.systemId = systemId;
this.lineNumber = lineNumber;
this.columnNumber = columnNumber;
}
/// <summary>
/// Get the public identifier of the entity where the exception occurred.
/// Returns a string containing the public identifier, or null if none is available.
/// </summary>
/// <seealso cref="ILocator.PublicId"/>
public string PublicId => this.publicId;
/// <summary>
/// Get the system identifier of the entity where the exception occurred.
/// <para/>
/// If the system identifier is a URL, it will have been resolved fully.
/// <para/>
/// A string containing the system identifier, or null if none is available.
/// </summary>
/// <seealso cref="ILocator.SystemId"/>
public string SystemId => this.systemId;
/// <summary>
/// The line number of the end of the text where the exception occurred.
/// <para/>
/// The first line is line 1.
/// <para/>
/// An integer representing the line number, or -1 if none is available.
/// </summary>
/// <seealso cref="ILocator.LineNumber"/>
public int LineNumber => this.lineNumber;
/// <summary>
/// The column number of the end of the text where the exception occurred.
/// <para/>
/// The first column in a line is position 1.
/// <para/>
/// An integer representing the column number, or -1
/// if none is available.
/// </summary>
/// <seealso cref="ILocator.ColumnNumber"/>
public int ColumnNumber => this.columnNumber;
//////////////////////////////////////////////////////////////////////
// Internal state.
//////////////////////////////////////////////////////////////////////
/// <summary>
/// The public identifier, or null.
/// </summary>
/// <seealso cref="PublicId"/>
private string publicId;
/// <summary>
/// The system identifier, or null.
/// </summary>
/// <seealso cref="SystemId"/>
private string systemId;
/// <summary>
/// The line number, or -1.
/// </summary>
/// <seealso cref="LineNumber"/>
private int lineNumber;
/// <summary>
/// The column number, or -1.
/// </summary>
/// <seealso cref="ColumnNumber"/>
private int columnNumber;
}
}