using System;
using System.Text;
using System.Xml;
using System.Diagnostics.CodeAnalysis;
namespace Wayne.Lib.Log
{
///
/// An generic entry to be logged containing details regarding what to log,
/// the datetime and who was performing the logging etc.
///
/// This class is inherited by DebugLogEntry, EventLogEntry and ErrorLogEntry
/// which adds on more specific properties.
///
public class LogEntry
{
#region Fields
private readonly EntityCategory entityCategory;
private readonly DateTime dateTime;
private readonly UInt64 logEntryIndex;
private readonly object logObject;
#endregion
#region Constructors
///
/// Constructor.
///
/// The entity that performed the logging.
/// The object to log.
internal LogEntry(IIdentifiableEntity entity, object logObject)
: this(entity, logObject, string.Empty)
{
}
///
/// Constructor.
///
/// The entity that performed the logging.
/// The object to log.
/// The category of the log object.
internal LogEntry(IIdentifiableEntity entity, object logObject, object category)
{
dateTime = DateTime.Now;
if (Logger.GlobalLogEntryCounter != null)
logEntryIndex = Logger.GlobalLogEntryCounter.GetNextValue();
this.logObject = logObject;
if (Logger.IsClosed || Logger.DebugConfig == null)
{
entityCategory = new EntityCategory(entity, category);
}
else
{
entityCategory = Logger.DebugConfig.GetEntityCategory(entity, category);
}
}
///
/// Deserialization constructor.
///
///
[SuppressMessage("Microsoft.Design", "CA1059:MembersShouldNotExposeCertainConcreteTypes", MessageId = "System.Xml.XmlNode")]
internal protected LogEntry(XmlElement logEntryNode)
{
//Deserialize the dateTime
dateTime = XmlConvert.ToDateTime(logEntryNode.Attributes["DateTime"].Value, XmlDateTimeSerializationMode.Unspecified);
logEntryIndex = XmlConvert.ToUInt64(logEntryNode.Attributes["LogEntryIndex"].Value);
//Create the entity category
string category = logEntryNode.Attributes["Category"].Value;
IIdentifiableEntity entity = null;
if (logEntryNode["Entity", EventLogXml.Ns] != null)
{
entity = new InternalEntity(logEntryNode["Entity", EventLogXml.Ns]);
}
entityCategory = Logger.DebugConfig.GetEntityCategory(entity, category);
//Create the log object as a sting...
logObject = logEntryNode["LogObjectString", EventLogXml.Ns].InnerText;
}
#endregion
#region Properties
///
/// The EntityCategory that performed the logging.
///
public EntityCategory EntityCategory
{
get { return entityCategory; }
}
///
/// The object to log.
///
public object LogObject
{
get { return logObject; }
}
///
/// The date time of the logging.
///
public DateTime DateTime
{
get { return dateTime; }
}
#endregion
#region Methods: AppendTextToStringBuilder
///
/// Appends the object to log to a StringBuilder-output.
///
/// The logwriter to be used for logging.
/// The StringBuilder.
/// The indent to be used if many lines.
/// Is this the first line to log?
/// A string holding a generated indent-text (=a number of spaces). Use AppendIndent() to append the indent.
internal virtual void AppendToStringBuilder(LogWriter logWriter, StringBuilder output,
int indentLength, ref bool isFirstLine, ref string indent)
{
StringLogObject.AppendObjectToStringBuilder(logObject, output, logWriter, indentLength, ref isFirstLine, ref indent);
}
///
/// Returns the datetime as a string, using the given date time format.
///
/// The requested date time format.
///
public string GetDateTimeString(string dateTimeFormat)
{
return Logger.DateTimeToString(dateTime, dateTimeFormat, logEntryIndex);
}
#endregion
#region Debug methods
///
/// Presents the class as a string.
///
///
public virtual string ToString(string format, IFormatProvider provider)
{
return string.Concat("LogEntry EntityCategory=", entityCategory, ", LogObject=", (logObject != null) ? logObject.ToString() : "null");
}
///
/// Presents the class as a string using the specified culture-specific format information.
///
///
public virtual string ToString(IFormatProvider provider)
{
return ToString(string.Empty, provider);
}
///
/// Presents the class as a string using a format string.
///
///
public virtual string ToString(string format)
{
return ToString(format, System.Globalization.CultureInfo.InvariantCulture);
}
///
/// Presents the class as a string using a format string and the specified culture-specific format information.
///
///
public override string ToString()
{
return ToString(string.Empty, System.Globalization.CultureInfo.InvariantCulture);
}
#endregion
#region XML
///
/// Serializes this object into the specified xmlWriter.
///
///
///
public void WriteXml(XmlWriter xmlWriter, string prefix)
{
xmlWriter.WriteStartElement(prefix, "LogEntry", EventLogXml.Ns);
xmlWriter.WriteAttributeString("Category", this.entityCategory.CategoryString);
xmlWriter.WriteAttributeString("DateTime", XmlConvert.ToString(dateTime, XmlDateTimeSerializationMode.Unspecified));
xmlWriter.WriteAttributeString("LogEntryIndex", XmlConvert.ToString(logEntryIndex));
WriteInternalEntity(xmlWriter, prefix, this.entityCategory.Entity);
string logObjectString;
if (logObject != null)
logObjectString = logObject.ToString();
else
logObjectString = string.Empty;
xmlWriter.WriteElementString(prefix, "LogObjectString", EventLogXml.Ns, logObjectString);
xmlWriter.WriteStartElement(prefix, "LogData", EventLogXml.Ns);
WriteLogObjectData(xmlWriter);
xmlWriter.WriteEndElement(); //LogData
xmlWriter.WriteEndElement(); //EventLogEntry
}
///
///
///
///
protected virtual void WriteLogObjectData(XmlWriter xmlWriter)
{
}
private static void WriteInternalEntity(XmlWriter xmlWriter, string prefix, IIdentifiableEntity entity)
{
if (entity == null)
return;
xmlWriter.WriteStartElement(prefix, "Entity", EventLogXml.Ns);
xmlWriter.WriteAttributeString("EntityType", entity.EntityType);
xmlWriter.WriteAttributeString("EntitySubType", entity.EntitySubType);
xmlWriter.WriteAttributeString("Id", XmlConvert.ToString(entity.Id));
xmlWriter.WriteStartElement(prefix, "Parent", EventLogXml.Ns);
if (entity.ParentEntity != null)
WriteInternalEntity(xmlWriter, prefix, entity.ParentEntity);//Write the parent entities recursively.
xmlWriter.WriteEndElement(); //Parent
xmlWriter.WriteEndElement(); //Entity
}
#endregion
}
}