//---------------------------------------------------------------------
//
// Copyright (c) Microsoft Corporation. All rights reserved.
//
//
// @owner Microsoft
// @backupOwner Microsoft
//---------------------------------------------------------------------
namespace System.Data.Metadata.Edm
{
using System;
///
/// This class encapsulates the error information for a schema error that was encountered.
///
[System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Naming", "CA1704:IdentifiersShouldBeSpelledCorrectly", MessageId = "Edm")]
[Serializable]
public sealed class EdmSchemaError : EdmError
{
#region Instance Fields
private int _errorCode = 0;
private EdmSchemaErrorSeverity _severity = EdmSchemaErrorSeverity.Warning;
private string _schemaLocation = null;
private int _line = -1;
private int _column = -1;
private string _stackTrace = string.Empty;
#endregion
#region Public Methods
///
/// Constructs a EdmSchemaError object.
///
/// The explanation of the error.
/// The code associated with this error.
/// The severity of the error.
internal EdmSchemaError(string message, int errorCode, EdmSchemaErrorSeverity severity) :
this(message, errorCode, severity, null)
{
}
///
/// Constructs a EdmSchemaError object.
///
/// The explanation of the error.
/// The code associated with this error.
/// The severity of the error.
/// The exception that caused the error to be filed.
internal EdmSchemaError(string message, int errorCode, EdmSchemaErrorSeverity severity, Exception exception)
: base(message)
{
Initialize(errorCode, severity, null, -1, -1, exception);
}
///
/// Constructs a EdmSchemaError object.
///
/// The explanation of the error.
/// The code associated with this error.
/// The severity of the error.
///
///
///
internal EdmSchemaError(string message, int errorCode, EdmSchemaErrorSeverity severity, string schemaLocation, int line, int column)
: this(message, errorCode, severity, schemaLocation, line, column, null)
{
}
///
/// Constructs a EdmSchemaError object.
///
/// The explanation of the error.
/// The code associated with this error.
/// The severity of the error.
///
///
///
/// The exception that caused the error to be filed.
internal EdmSchemaError(string message, int errorCode, EdmSchemaErrorSeverity severity, string schemaLocation, int line, int column, Exception exception)
: base(message)
{
if (severity < EdmSchemaErrorSeverity.Warning || severity > EdmSchemaErrorSeverity.Error)
{
throw new ArgumentOutOfRangeException("severity", severity, System.Data.Entity.Strings.ArgumentOutOfRange(severity));
}
Initialize(errorCode, severity, schemaLocation, line, column, exception);
}
private void Initialize(int errorCode, EdmSchemaErrorSeverity severity, string schemaLocation, int line, int column, Exception exception)
{
if (errorCode < 0)
{
throw new ArgumentOutOfRangeException("errorCode", errorCode, System.Data.Entity.Strings.ArgumentOutOfRangeExpectedPostiveNumber(errorCode));
}
_errorCode = errorCode;
_severity = severity;
_schemaLocation = schemaLocation;
_line = line;
_column = column;
if (exception != null)
{
_stackTrace = exception.StackTrace;
}
}
///
/// Creates a string representation of the error.
///
public override string ToString()
{
string text;
string severity;
switch (Severity)
{
case EdmSchemaErrorSeverity.Error:
severity = System.Data.Entity.Strings.GeneratorErrorSeverityError;
break;
case EdmSchemaErrorSeverity.Warning:
severity = System.Data.Entity.Strings.GeneratorErrorSeverityWarning;
break;
default:
severity = System.Data.Entity.Strings.GeneratorErrorSeverityUnknown;
break;
}
if (String.IsNullOrEmpty(SchemaName) && Line < 0 && Column < 0)
{
text = String.Format(System.Globalization.CultureInfo.CurrentCulture, "{0} {1:0000}: {2}",
severity,
ErrorCode,
Message);
}
else
{
text = String.Format(System.Globalization.CultureInfo.CurrentCulture, "{0}({1},{2}) : {3} {4:0000}: {5}",
(SchemaName == null) ? System.Data.Entity.Strings.SourceUriUnknown : SchemaName,
Line,
Column,
severity,
ErrorCode,
Message);
}
return text;
}
#endregion
#region Public Properties
///
/// Gets the ErrorCode.
///
public int ErrorCode
{
get
{
return _errorCode;
}
}
///
/// Gets the Severity of the error.
///
public EdmSchemaErrorSeverity Severity
{
get
{
return _severity;
}
set
{
_severity = value;
}
}
///
/// Gets the LineNumber that the error occured on.
///
public int Line
{
get
{
return _line;
}
}
///
/// Gets the column that the error occured in.
///
public int Column
{
get
{
return _column;
}
}
///
/// Gets the of the schema that contains the error.
///
public string SchemaLocation
{
get
{
return _schemaLocation;
}
}
///
/// Gets the of the schema that contains the error.
///
public string SchemaName
{
get
{
return GetNameFromSchemaLocation(SchemaLocation);
}
}
///
/// Gets the stack trace of when the error occured.
///
///
public string StackTrace
{
get
{
return _stackTrace;
}
}
#endregion
private static string GetNameFromSchemaLocation(string schemaLocation)
{
if (string.IsNullOrEmpty(schemaLocation))
{
return schemaLocation;
}
int pos = Math.Max(schemaLocation.LastIndexOf('/'), schemaLocation.LastIndexOf('\\'));
int start = pos + 1;
if (pos < 0)
{
return schemaLocation;
}
else if (start >= schemaLocation.Length)
{
return string.Empty;
}
return schemaLocation.Substring(start);
}
}
}