Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
53 changes: 53 additions & 0 deletions src/LogExpert.Core/Classes/Persister/EncodingJsonConverter.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,53 @@
using System.Text;

using Newtonsoft.Json;

namespace LogExpert.Core.Classes.Persister;

/// <summary>
/// Custom JsonConverter for Encoding objects.
/// Serializes the encoding as its name (e.g. "utf-8").
/// </summary>
public class EncodingJsonConverter : JsonConverter
{
public override bool CanConvert (Type objectType)
{
return typeof(Encoding).IsAssignableFrom(objectType);
}

public override void WriteJson (JsonWriter writer, object? value, JsonSerializer serializer)
{
ArgumentNullException.ThrowIfNull(writer);
if (value is not Encoding encoding)
{
writer.WriteNull();
return;
}

writer.WriteValue(encoding.WebName);
}

public override object? ReadJson (JsonReader reader, Type objectType, object? existingValue, JsonSerializer serializer)
{
ArgumentNullException.ThrowIfNull(reader);
if (reader.TokenType == JsonToken.Null)
{
return null;
}

var encodingName = reader.Value?.ToString();
if (string.IsNullOrEmpty(encodingName))
{
return Encoding.Default;
}

try
{
return Encoding.GetEncoding(encodingName);
}
catch (ArgumentException)
{
return Encoding.Default;
}
}
}
3 changes: 3 additions & 0 deletions src/LogExpert.Core/Classes/Persister/PersistenceData.cs
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,8 @@
using LogExpert.Core.Classes.Filter;
using LogExpert.Core.Entities;

using Newtonsoft.Json;

namespace LogExpert.Core.Classes.Persister;

[Serializable]
Expand All @@ -18,6 +20,7 @@ public class PersistenceData

public int CurrentLine { get; set; } = -1;

[JsonConverter(typeof(EncodingJsonConverter))]
public Encoding Encoding { get; set; }

public string FileName { get; set; }
Expand Down
43 changes: 20 additions & 23 deletions src/LogExpert.Core/Classes/Persister/Persister.cs
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,19 @@ public static class Persister

private static readonly Logger _logger = LogManager.GetCurrentClassLogger();

private static readonly JsonSerializerSettings _jsonSettings = new()
{
Converters =
{
new ColumnizerJsonConverter(),
new EncodingJsonConverter()
},
Formatting = Formatting.Indented,
//This is needed for the BookmarkList and the Bookmark Overlay
ReferenceLoopHandling = ReferenceLoopHandling.Serialize,
PreserveReferencesHandling = PreserveReferencesHandling.Objects,
};

#endregion

#region Public methods
Expand Down Expand Up @@ -217,24 +230,16 @@ private static string BuildSessionFileNameFromPath (string logFileName)
/// <param name="persistenceData">The data to be persisted. This cannot be null.</param>
private static void Save (string fileName, PersistenceData persistenceData)
{
var settings = new JsonSerializerSettings
{
Converters =
{
new ColumnizerJsonConverter()
},
Formatting = Formatting.Indented,
};

try
{
var json = JsonConvert.SerializeObject(persistenceData, settings);
var json = JsonConvert.SerializeObject(persistenceData, _jsonSettings);
File.WriteAllText(fileName, json, Encoding.UTF8);
}
catch (Exception ex)
catch (Exception ex) when (ex is JsonSerializationException or
UnauthorizedAccessException or
IOException)
{
_logger.Error(ex, $"Error saving persistence data to {fileName}");
throw;
}
}

Expand All @@ -257,17 +262,8 @@ private static PersistenceData LoadInternal (string fileName)

try
{
var settings = new JsonSerializerSettings
{
Converters =
{
new ColumnizerJsonConverter()
},
Formatting = Formatting.Indented,
};

var json = File.ReadAllText(fileName, Encoding.UTF8);
var data = JsonConvert.DeserializeObject<PersistenceData>(json, settings);
var data = JsonConvert.DeserializeObject<PersistenceData>(json, _jsonSettings);
// Call Init on all FilterParams if needed
if (data?.FilterParamsList != null)
{
Expand All @@ -287,7 +283,8 @@ private static PersistenceData LoadInternal (string fileName)

return data;
}
catch (Exception ex) when (ex is UnauthorizedAccessException or
catch (Exception ex) when (ex is JsonSerializationException or
UnauthorizedAccessException or
IOException)
{
_logger.Error(ex, $"Error loading persistence data from {fileName}");
Expand Down
9 changes: 8 additions & 1 deletion src/LogExpert.Core/Classes/Persister/ProjectData.cs
Original file line number Diff line number Diff line change
@@ -1,11 +1,18 @@
namespace LogExpert.Core.Classes.Persister;

[Serializable]
public class ProjectData
{
#region Fields

public List<string> MemberList { get; set; } = [];
/// <summary>
/// Gets or sets the list of members.
/// </summary>
public List<string> FileNames { get; set; } = [];

/// <summary>
/// Gets or sets the XML representation of the tab layout configuration.
/// </summary>
public string TabLayoutXml { get; set; }

#endregion
Expand Down
77 changes: 32 additions & 45 deletions src/LogExpert.Core/Classes/Persister/ProjectPersister.cs
Original file line number Diff line number Diff line change
@@ -1,67 +1,54 @@
using System.Collections.Generic;
using System.Xml;
using System.Text;

using Newtonsoft.Json;

using NLog;

namespace LogExpert.Core.Classes.Persister;

public static class ProjectPersister
{
private static readonly Logger _logger = LogManager.GetCurrentClassLogger();

#region Public methods

public static ProjectData LoadProjectData(string projectFileName)
public static ProjectData LoadProjectData (string projectFileName)
{
ProjectData projectData = new();
XmlDocument xmlDoc = new();
xmlDoc.Load(projectFileName);
var fileList = xmlDoc.GetElementsByTagName("member");
foreach (XmlNode fileNode in fileList)
try
{
var fileElement = fileNode as XmlElement;
var fileName = fileElement.GetAttribute("fileName");
projectData.MemberList.Add(fileName);
}
var settings = new JsonSerializerSettings
{
Formatting = Formatting.Indented,
};

var layoutElements = xmlDoc.GetElementsByTagName("layout");
if (layoutElements.Count > 0)
var json = File.ReadAllText(projectFileName, Encoding.UTF8);
return JsonConvert.DeserializeObject<ProjectData>(json, settings);
}
catch (Exception ex) when (ex is UnauthorizedAccessException or
IOException)
{
projectData.TabLayoutXml = layoutElements[0].InnerXml;
_logger.Error(ex, $"Error loading persistence data from {projectFileName}");
return new ProjectData();
}

return projectData;
}


public static void SaveProjectData(string projectFileName, ProjectData projectData)
public static void SaveProjectData (string projectFileName, ProjectData projectData)
{
XmlDocument xmlDoc = new();
var rootElement = xmlDoc.CreateElement("logexpert");
xmlDoc.AppendChild(rootElement);
var projectElement = xmlDoc.CreateElement("project");
rootElement.AppendChild(projectElement);
var membersElement = xmlDoc.CreateElement("members");
projectElement.AppendChild(membersElement);
SaveProjectMembers(xmlDoc, membersElement, projectData.MemberList);
var settings = new JsonSerializerSettings
{
Formatting = Formatting.Indented,
};

if (projectData.TabLayoutXml != null)
try
{
var layoutElement = xmlDoc.CreateElement("layout");
layoutElement.InnerXml = projectData.TabLayoutXml;
rootElement.AppendChild(layoutElement);
var json = JsonConvert.SerializeObject(projectData, settings);
File.WriteAllText(projectFileName, json, Encoding.UTF8);
}

xmlDoc.Save(projectFileName);
}

#endregion

#region Private Methods

private static void SaveProjectMembers(XmlDocument xmlDoc, XmlNode membersNode, List<string> memberList)
{
foreach (var fileName in memberList)
catch (Exception ex) when (ex is JsonSerializationException or
UnauthorizedAccessException or
IOException)
{
var memberElement = xmlDoc.CreateElement("member");
membersNode.AppendChild(memberElement);
memberElement.SetAttribute("fileName", fileName);
_logger.Error(ex, $"Error saving persistence data to {projectFileName}");
}
}

Expand Down
5 changes: 5 additions & 0 deletions src/LogExpert.Core/Entities/Bookmark.cs
Original file line number Diff line number Diff line change
@@ -1,12 +1,17 @@
using System.Drawing;

using Newtonsoft.Json;

namespace LogExpert.Core.Entities;

[Serializable]
public class Bookmark
{
#region cTor

[JsonConstructor]
public Bookmark () { }

public Bookmark (int lineNum)
{
LineNum = lineNum;
Expand Down
5 changes: 5 additions & 0 deletions src/LogExpert.UI/Controls/LogWindow/LogWindow.cs
Original file line number Diff line number Diff line change
Expand Up @@ -4630,6 +4630,11 @@ private void CheckForFilterDirty ()
[SupportedOSPlatform("windows")]
private bool IsFilterSearchDirty (FilterParams filterParams)
{
if (filterParams == null || filterParams.SearchText == null)
{
return true;
}

if (!filterParams.SearchText.Equals(filterComboBox.Text, StringComparison.Ordinal))
{
return true;
Expand Down
Loading
Loading