From 158d9887386a886ed29d2e37ea1c3758aed175b7 Mon Sep 17 00:00:00 2001 From: Markus Quaritsch <quaritsch@ivt.tugraz.at> Date: Thu, 1 Dec 2022 17:14:59 +0100 Subject: [PATCH] extending xml validator callback and pass on custom error message --- HashingTool/Util/AsyncXMLValidator.cs | 2 +- .../ViewModel/HashComponentDataViewModel.cs | 10 ++++---- .../ViewModel/UserControl/XMLFileSelector.cs | 2 +- VECTO3GUI2020/Helper/XmlHelper.cs | 2 +- VectoCommon/VectoHashingTest/VectoHashTest.cs | 4 ++-- VectoCore/VectoCore/Utils/XMLValidator.cs | 24 +++++++------------ VectoCore/VectoCoreTest/XML/XMLReportTest.cs | 4 ++-- 7 files changed, 21 insertions(+), 27 deletions(-) diff --git a/HashingTool/Util/AsyncXMLValidator.cs b/HashingTool/Util/AsyncXMLValidator.cs index f6e8dded14..59d8254351 100644 --- a/HashingTool/Util/AsyncXMLValidator.cs +++ b/HashingTool/Util/AsyncXMLValidator.cs @@ -41,7 +41,7 @@ namespace HashingTool.Util { private XMLValidator _validator; - public AsyncXMLValidator(XmlReader xml, Action<bool> resultaction, Action<XmlSeverityType, ValidationEvent> validationErrorAction) + public AsyncXMLValidator(XmlReader xml, Action<bool> resultaction, Action<XmlSeverityType, ValidationEvent, string> validationErrorAction) { _validator = new XMLValidator(xml, resultaction, validationErrorAction); } diff --git a/HashingTool/ViewModel/HashComponentDataViewModel.cs b/HashingTool/ViewModel/HashComponentDataViewModel.cs index 01641b3066..f9bdc6b59b 100644 --- a/HashingTool/ViewModel/HashComponentDataViewModel.cs +++ b/HashingTool/ViewModel/HashComponentDataViewModel.cs @@ -154,14 +154,14 @@ namespace HashingTool.ViewModel ms.Seek(0, SeekOrigin.Begin); ComponentDataValid = true; var validator = new AsyncXMLValidator(XmlReader.Create(ms), r => { ComponentDataValid = r; }, - (s, e) => { + (s, e, m) => { Application.Current.Dispatcher.Invoke(() => _xmlFile.LogError( - string.Format("Validation {0} Line {2}: {1}", - s == XmlSeverityType.Warning ? "WARNING" : "ERROR", + string.Format("Validation {0} Line {2}: {1}{3}", + s == XmlSeverityType.Warning ? "WARNING" : "ERROR", e.ValidationEventArgs == null - ? e.Exception.Message + (e.Exception.InnerException != null ? Environment.NewLine + e.Exception.InnerException.Message : "") + ? (e.Exception?.Message ?? "") + (e.Exception?.InnerException != null ? Environment.NewLine + e.Exception.InnerException.Message : "") : e.ValidationEventArgs.Message, - e.ValidationEventArgs?.Exception.LineNumber ?? 0))); + e.ValidationEventArgs?.Exception.LineNumber ?? 0, m))); }); await validator.ValidateXML(XmlDocumentType.DeclarationComponentData); } diff --git a/HashingTool/ViewModel/UserControl/XMLFileSelector.cs b/HashingTool/ViewModel/UserControl/XMLFileSelector.cs index 1bcf23c1cc..d1cecfc098 100644 --- a/HashingTool/ViewModel/UserControl/XMLFileSelector.cs +++ b/HashingTool/ViewModel/UserControl/XMLFileSelector.cs @@ -275,7 +275,7 @@ namespace HashingTool.ViewModel.UserControl var valid = true; try { var validator = new AsyncXMLValidator(xml, r => { valid = r; }, - (s, e) => { + (s, e, m) => { Application.Current.Dispatcher.Invoke( () => { if (e.ValidationEventArgs == null) { diff --git a/VECTO3GUI2020/Helper/XmlHelper.cs b/VECTO3GUI2020/Helper/XmlHelper.cs index af8abe92b4..9401e88606 100644 --- a/VECTO3GUI2020/Helper/XmlHelper.cs +++ b/VECTO3GUI2020/Helper/XmlHelper.cs @@ -36,7 +36,7 @@ namespace VECTO3GUI2020.Helper } public static bool ValidateXDocument(XDocument xDocument, Action<bool> resultAction = null, - Action<XmlSeverityType, ValidationEvent> validationErrorAction = null) + Action<XmlSeverityType, ValidationEvent, string> validationErrorAction = null) { var xmlDocument = xDocument.ToXmlDocument(); if (xmlDocument == null) diff --git a/VectoCommon/VectoHashingTest/VectoHashTest.cs b/VectoCommon/VectoHashingTest/VectoHashTest.cs index ce2fdff3a7..9ac7c5b9ee 100644 --- a/VectoCommon/VectoHashingTest/VectoHashTest.cs +++ b/VectoCommon/VectoHashingTest/VectoHashTest.cs @@ -743,7 +743,7 @@ namespace VectoHashingTest var variationValid = h2.ValidateHash(); Assert.IsTrue(variationValid); - var validatorV = new XMLValidator(xmlDocV, validationErrorAction: (s, ve) => {}); + var validatorV = new XMLValidator(xmlDocV, validationErrorAction: (s, ve, m) => {}); var result = validatorV.ValidateXML(XmlDocumentType.DeclarationComponentData); Assert.IsFalse(result); @@ -799,7 +799,7 @@ namespace VectoHashingTest var h = VectoHash.Load(xmlDoc); var hashed = h.AddHash(); var validator = new XMLValidator(XmlReader.Create(new StringReader(hashed.ToString())), - validationErrorAction: (s, ve) => { }); + validationErrorAction: (s, ve, m) => { }); var result = validator.ValidateXML(XmlDocumentType.DeclarationComponentData); Assert.IsFalse(result); diff --git a/VectoCore/VectoCore/Utils/XMLValidator.cs b/VectoCore/VectoCore/Utils/XMLValidator.cs index 120f525fe3..5dc37bed6a 100644 --- a/VectoCore/VectoCore/Utils/XMLValidator.cs +++ b/VectoCore/VectoCore/Utils/XMLValidator.cs @@ -44,22 +44,22 @@ namespace TUGraz.VectoCore.Utils { public class XMLValidator { - private readonly Action<XmlSeverityType, ValidationEvent> _validationErrorAction; + private readonly Action<XmlSeverityType, ValidationEvent, string> _validationErrorAction; private readonly Action<bool> _resultAction; private bool _valid; private XmlDocument _doc; private List<string> _validationErrors = new List<string>(); - private XMLValidator(Action<bool> resultaction, Action<XmlSeverityType, ValidationEvent> validationErrorAction) + private XMLValidator(Action<bool> resultaction, Action<XmlSeverityType, ValidationEvent, string> validationErrorAction) { - _validationErrorAction = validationErrorAction ?? ((x, y) => { }); + _validationErrorAction = validationErrorAction ?? ((x, y, s) => { }); _resultAction = resultaction ?? (x => { }); _valid = false; } public XMLValidator( XmlReader document, Action<bool> resultaction = null, - Action<XmlSeverityType, ValidationEvent> validationErrorAction = null) : this(resultaction, validationErrorAction) + Action<XmlSeverityType, ValidationEvent, string> validationErrorAction = null) : this(resultaction, validationErrorAction) { _doc = new XmlDocument(); _doc.Load(document); @@ -67,7 +67,7 @@ namespace TUGraz.VectoCore.Utils public XMLValidator( XmlDocument document, Action<bool> resultaction = null, - Action<XmlSeverityType, ValidationEvent> validationErrorAction = null) : this(resultaction, validationErrorAction) + Action<XmlSeverityType, ValidationEvent, string> validationErrorAction = null) : this(resultaction, validationErrorAction) { _doc = document; } @@ -115,22 +115,16 @@ namespace TUGraz.VectoCore.Utils { _resultAction(false); _valid = false; - var validationEvent = new ValidationEvent { ValidationEventArgs = args }; - if (sender == this) { - //validationEvent = new ValidationEvent() { }; - } else { - _validationErrors.Add(args?.Message ?? "no schema found"); - _validationErrorAction(args?.Severity ?? XmlSeverityType.Error, new ValidationEvent { ValidationEventArgs = args }); - } - _validationErrorAction(args?.Severity ?? XmlSeverityType.Error, validationEvent); + _validationErrors.Add(args?.Message ?? "no schema found"); + _validationErrorAction(args?.Severity ?? XmlSeverityType.Error, new ValidationEvent { ValidationEventArgs = args }, ValidationError); } public string ValidationError => _validationErrors.Any() ? _validationErrors.Join(Environment.NewLine) : null; - public static void CallBackExceptionOnError(XmlSeverityType severity, ValidationEvent evt) + public static void CallBackExceptionOnError(XmlSeverityType severity, ValidationEvent evt, string message) { if (severity == XmlSeverityType.Error) { - throw new VectoException("Validation error: {0}", evt?.ValidationEventArgs?.Message ?? "XML schema not known"); + throw new VectoException("Validation error: {0}", evt?.ValidationEventArgs?.Message ?? message ?? "XML schema not known"); } } diff --git a/VectoCore/VectoCoreTest/XML/XMLReportTest.cs b/VectoCore/VectoCoreTest/XML/XMLReportTest.cs index 8d577a78d3..33a12a3d9f 100644 --- a/VectoCore/VectoCoreTest/XML/XMLReportTest.cs +++ b/VectoCore/VectoCoreTest/XML/XMLReportTest.cs @@ -94,13 +94,13 @@ namespace TUGraz.VectoCore.Tests.XML var validationMsg1 = new List<string> {customerRecord} ; - var validator1 = new XMLValidator(XmlReader.Create(customerRecord), validationErrorAction: (s,e) => { + var validator1 = new XMLValidator(XmlReader.Create(customerRecord), validationErrorAction: (s,e, m) => { validationMsg1.Add(e?.ValidationEventArgs?.Message ?? "no schema found?"); }); Assert.IsTrue(validator1.ValidateXML(XmlDocumentType.CustomerReport), validationMsg1.Join("\n")); var validationMsg2 = new List<string> {manufacturerRecord}; - var validator2 = new XMLValidator(XmlReader.Create(manufacturerRecord), validationErrorAction: (s,e) => { + var validator2 = new XMLValidator(XmlReader.Create(manufacturerRecord), validationErrorAction: (s,e, m) => { validationMsg2.Add(e?.ValidationEventArgs?.Message ?? "no schema found"); }); Assert.IsTrue(validator2.ValidateXML(XmlDocumentType.ManufacturerReport), validationMsg2.Join("\n")); -- GitLab