diff --git a/src/NHapi.Base/Parser/ParserOptions.cs b/src/NHapi.Base/Parser/ParserOptions.cs index 57ea1e756..5f76e6596 100644 --- a/src/NHapi.Base/Parser/ParserOptions.cs +++ b/src/NHapi.Base/Parser/ParserOptions.cs @@ -12,6 +12,7 @@ public ParserOptions() InvalidObx2Type = null; UnexpectedSegmentBehaviour = UnexpectedSegmentBehaviour.AddInline; NonGreedyMode = false; + IncludeLongNameInEncodedXml = false; DisableWhitespaceTrimmingOnAllXmlNodes = false; XmlNodeNamesToDisableWhitespaceTrimming = new HashSet(StringComparer.Ordinal); PrettyPrintEncodedXml = true; @@ -129,6 +130,20 @@ public ParserOptions() /// public bool NonGreedyMode { get; set; } + /// + /// Gets or Sets flag which allows the Description attribute [LongName] to be added in encoded xml with counter position. + /// + /// + /// + /// 1 + /// 2 + /// ]]> + /// + /// + /// The default value is . + public bool IncludeLongNameInEncodedXml { get; set; } + /// /// /// If set to , the is configured to treat all whitespace diff --git a/src/NHapi.Base/Parser/XMLParser.cs b/src/NHapi.Base/Parser/XMLParser.cs index 795500864..f9169ddfb 100644 --- a/src/NHapi.Base/Parser/XMLParser.cs +++ b/src/NHapi.Base/Parser/XMLParser.cs @@ -371,6 +371,11 @@ public virtual bool Encode(ISegment segmentObject, XmlElement segmentElement, Pa continue; } + if (parserOptions.IncludeLongNameInEncodedXml && reps[j] is AbstractType rep) + { + newNode.SetAttribute("LongName", rep.Description); + } + try { segmentElement.AppendChild(newNode); @@ -731,17 +736,17 @@ private bool Encode(IType datatypeObject, XmlElement datatypeElement, ParserOpti var hasData = false; // TODO: consider using a switch statement - if (datatypeObject is Varies) + if (datatypeObject is Varies varies) { - hasData = EncodeVaries((Varies)datatypeObject, datatypeElement, parserOptions); + hasData = EncodeVaries(varies, datatypeElement, parserOptions); } - else if (datatypeObject is IPrimitive) + else if (datatypeObject is IPrimitive primitive) { - hasData = EncodePrimitive((IPrimitive)datatypeObject, datatypeElement); + hasData = EncodePrimitive(primitive, datatypeElement); } - else if (datatypeObject is IComposite) + else if (datatypeObject is IComposite composite) { - hasData = EncodeComposite((IComposite)datatypeObject, datatypeElement, parserOptions); + hasData = EncodeComposite(composite, datatypeElement, parserOptions); } return hasData; @@ -859,20 +864,28 @@ private bool EncodeComposite(IComposite datatypeObject, XmlElement datatypeEleme { var name = MakeElementName(datatypeObject, i + 1); var newNode = datatypeElement.OwnerDocument.CreateElement(name, NameSpace); + var componentHasValue = Encode(components[i], newNode, parserOptions); - if (componentHasValue) + if (!componentHasValue) { - try - { - datatypeElement.AppendChild(newNode); - } - catch (Exception e) - { - throw new DataTypeException("DOMException encoding Composite: ", e); - } + continue; + } - hasValue = true; + if (parserOptions.IncludeLongNameInEncodedXml && components[i] is AbstractType component) + { + newNode.SetAttribute("LongName", component.Description); } + + try + { + datatypeElement.AppendChild(newNode); + } + catch (Exception e) + { + throw new DataTypeException("DOMException encoding Composite: ", e); + } + + hasValue = true; } return hasValue; diff --git a/tests/NHapi.NUnit/Parser/XMLParserTests.cs b/tests/NHapi.NUnit/Parser/XMLParserTests.cs index c8056098b..952b9b267 100644 --- a/tests/NHapi.NUnit/Parser/XMLParserTests.cs +++ b/tests/NHapi.NUnit/Parser/XMLParserTests.cs @@ -229,6 +229,27 @@ public void Parse_EncodedMessageIsModifiedWithEscapeSequence_IsParsedCorrectly() Assert.AreEqual($"\\H\\{obx5Value}\\.br\\{obx5Value}\\N\\", parsedObx5Value); } + [Test] + public void Parse_MessageContainsLongNameAttributes_ParsedAsExpected() + { + // Arrange + var message = "|^~\\&MILLEMRYMQEMRY20150619155451ADTA08Q2043855220T2330403781X928163P2.38859/1A08201506191554511935307EUH MRNMRNEH0125106376TEC MRN1781893CLH MRN935307EUH MRN5938067EMPI1167766CPI NBREXTERNAL90509411HNASYSID10341880HNASYSID50627780HNASYSID5938067MSG_CERNPHRPatientTestTestCur_Name19400101FWHI123 ENDOFTHE RDUNIT 123ATLANTAGA40000USAHOME5555555555HOME6666666666YAHOO@YAHOO.COMEMAIL6666666666BUSENGMOTH12345665161EUH FINFIN NBREH01123454103GA123450071Non-Hispanic0\"\"\"\"\"\"N"; + var expectedMessageControlId = "Q2043855220T2330403781X928163"; + var expectedDob = "19400101"; + + var parser = new DefaultXMLParser(); + + // Act + var parsed = parser.Parse(message); + + var adtA01 = parsed as ADT_A01; // a08 is mapped to a01 + + // Assert + Assert.IsNotNull(adtA01); + Assert.AreEqual(expectedMessageControlId, adtA01.MSH.MessageControlID.Value); + Assert.AreEqual(expectedDob, adtA01.PID.DateOfBirth.TimeOfAnEvent.Value); + } + [Test] public void Encode_OmdO03_CorrectlyHandlesEscaping() { @@ -345,6 +366,7 @@ public void Encode_GenericMessage_WorksAsExpected(string version) // Arrange var xmlParser = new DefaultXMLParser(); var type = GenericMessage.GetGenericMessageClass(version); + var expectedElementName = $"GenericMessageV{version.Replace(".", string.Empty)}"; var constructor = type.GetConstructor(new[] { typeof(IModelClassFactory) }); var message = (IMessage)constructor?.Invoke(new object[] { new DefaultModelClassFactory() }); @@ -354,7 +376,7 @@ public void Encode_GenericMessage_WorksAsExpected(string version) // Assert Assert.IsNotNull(document); - Assert.AreEqual($"GenericMessageV{version.Replace(".", string.Empty)}", document.DocumentElement?.LocalName); + Assert.AreEqual(expectedElementName, document.DocumentElement?.LocalName); Assert.IsNotNull(xmlParser.Encode(message)); } @@ -374,6 +396,28 @@ public void Encode_AdtA01_CanBeParsedAgain() Console.WriteLine(decodedMessage.ToString()); } + [Test] + public void Encode_WithParserOption_IncludeLongNameInEncodedXMLIsTrue_ResultContainsLongNameAttribute() + { + // Arrange + var message = "MSH|^~\\&|KISsystem|ZTM|NIDAklinikserver|HL7Proxy|201902271130||ADT^A01|68371142|P|2.3\r" + + "EVN|A01|201902271130|201902271130"; + + var expectedEncodedMessage = @"|^~\&KISsystemZTMNIDAklinikserverHL7Proxy201902271130ADTA0168371142P2.3A01201902271130201902271130"; + + var parser = new PipeParser(); + var xmlParser = new DefaultXMLParser(); + var options = new ParserOptions { IncludeLongNameInEncodedXml = true, PrettyPrintEncodedXml = false }; + + var parsed = parser.Parse(message); + + // Act + var encodedMessage = xmlParser.Encode(parsed, options); + + // Assert + Assert.AreEqual(expectedEncodedMessage, encodedMessage); + } + private static void SetMessageHeader(IMessage msg, string messageCode, string messageTriggerEvent, string processingId) { var msh = (ISegment)msg.GetStructure("MSH");