Skip to content

Commit 6f995e1

Browse files
Merge pull request #1676 from FirelyTeam/feature/1653-IncludeMandatoryToElements-stu3
Optional include of mandatory elements to the list of provided elements during serialization
2 parents bc0ff25 + 8e3fe74 commit 6f995e1

File tree

5 files changed

+53
-30
lines changed

5 files changed

+53
-30
lines changed

common

src/Hl7.Fhir.Core.Tests/Serialization/SerializationTests.cs

Lines changed: 32 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -6,18 +6,17 @@
66
* available at https://raw.githubusercontent.com/FirelyTeam/firely-net-sdk/master/LICENSE
77
*/
88

9-
using Microsoft.VisualStudio.TestTools.UnitTesting;
9+
using Hl7.Fhir.Introspection;
1010
using Hl7.Fhir.Model;
1111
using Hl7.Fhir.Serialization;
1212
using Hl7.Fhir.Utility;
13-
using Hl7.Fhir.Introspection;
13+
using Microsoft.VisualStudio.TestTools.UnitTesting;
1414
using Newtonsoft.Json.Linq;
1515
using System;
1616
using System.Collections.Generic;
1717
using System.Globalization;
1818
using System.Linq;
1919
using System.Text;
20-
using Hl7.Fhir.ElementModel;
2120

2221
namespace Hl7.Fhir.Tests.Serialization
2322
{
@@ -57,9 +56,9 @@ public void ParseMetaXml()
5756
public void ParsePatientXmlNullType()
5857
{
5958
string xmlPacientTest = TestDataHelper.ReadTestData("TestPatient.xml");
60-
59+
6160
var poco = new FhirXmlParser().Parse(xmlPacientTest);
62-
61+
6362
Assert.AreEqual(((Patient)poco).Id, "pat1");
6463
Assert.AreEqual(((Patient)poco).Contained.First().Id, "1");
6564
Assert.AreEqual(((Patient)poco).Name.First().Family, "Donald");
@@ -195,7 +194,7 @@ public void TestDecimalPrecisionSerializationInJson()
195194
var ext = new FhirDecimal(dec6);
196195
var obs = new Observation();
197196
obs.AddExtension("http://example.org/DecimalPrecision", ext);
198-
197+
199198
var json = FhirJsonSerializer.SerializeToString(obs);
200199
var obs2 = FhirJsonParser.Parse<Observation>(json);
201200

@@ -230,7 +229,7 @@ public void TestParseUnkownPolymorphPropertyInJson()
230229
{
231230
var dec6 = 6m;
232231
var ext = new FhirDecimal(dec6);
233-
var obs = new Observation{ Value = new FhirDecimal(dec6) };
232+
var obs = new Observation { Value = new FhirDecimal(dec6) };
234233
var json = FhirJsonSerializer.SerializeToString(obs);
235234
try
236235
{
@@ -275,7 +274,7 @@ public void TryScriptInject()
275274

276275
var xml = FhirXmlSerializer.SerializeToString(x);
277276
Assert.IsFalse(xml.Contains("<script"));
278-
}
277+
}
279278

280279

281280
[TestMethod]
@@ -368,7 +367,7 @@ public void SerializeJsonWithPlainDiv()
368367

369368
string json = TestDataHelper.ReadTestData(@"valueset-v2-0717.json");
370369
Assert.IsNotNull(json);
371-
var parser = new FhirJsonParser { Settings = { PermissiveParsing = true} };
370+
var parser = new FhirJsonParser { Settings = { PermissiveParsing = true } };
372371
var vs = parser.Parse<ValueSet>(json);
373372
Assert.IsNotNull(vs);
374373

@@ -556,7 +555,7 @@ public void DateTimeOffsetAccuracyTest()
556555
Assert.IsTrue(patient.IsExactly(res), "1");
557556

558557
// Is the parsing still correct without milliseconds?
559-
patient = new Patient { Meta = new Meta { LastUpdated = new DateTimeOffset(2018, 8, 13, 13, 41, 56, TimeSpan.Zero)} };
558+
patient = new Patient { Meta = new Meta { LastUpdated = new DateTimeOffset(2018, 8, 13, 13, 41, 56, TimeSpan.Zero) } };
560559
json = "{\"resourceType\":\"Patient\",\"meta\":{\"lastUpdated\":\"2018-08-13T13:41:56+00:00\"}}";
561560
res = new FhirJsonParser().Parse<Patient>(json);
562561
Assert.IsTrue(patient.IsExactly(res), "2");
@@ -594,5 +593,28 @@ public void SerializerHandlesEmptyChildObjects()
594593

595594
Assert.AreEqual(1, newPoco.Name.Count);
596595
}
596+
597+
[TestMethod]
598+
public void IncludeMandatoryInElementsSummaryTest()
599+
{
600+
Observation obs = new()
601+
{
602+
Status = ObservationStatus.Final,
603+
Issued = DateTimeOffset.Now
604+
};
605+
606+
// default behavior
607+
var json = new FhirJsonSerializer().SerializeToDocument(obs, elements: new[] { "issued" });
608+
609+
Assert.IsTrue(json.ContainsKey("issued"));
610+
Assert.IsFalse(json.ContainsKey("status"));
611+
612+
// Adding mandatory elements to the set of elements
613+
json = new FhirJsonSerializer(new SerializerSettings() { IncludeMandatoryInElementsSummary = true })
614+
.SerializeToDocument(obs, elements: new[] { "issued" });
615+
616+
Assert.IsTrue(json.ContainsKey("issued"));
617+
Assert.IsTrue(json.ContainsKey("status"));
618+
}
597619
}
598620
}

src/Hl7.Fhir.Core/Serialization/BaseFhirSerializer.cs

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,11 +6,11 @@
66
* available at https://raw.githubusercontent.com/FirelyTeam/firely-net-sdk/master/LICENSE
77
*/
88

9+
using Hl7.Fhir.ElementModel;
910
using Hl7.Fhir.Model;
1011
using Hl7.Fhir.Rest;
11-
using Hl7.Fhir.ElementModel;
12-
using System.Linq;
1312
using Hl7.Fhir.Utility;
13+
using System.Linq;
1414

1515
namespace Hl7.Fhir.Serialization
1616
{
@@ -24,6 +24,9 @@ public BaseFhirSerializer(SerializerSettings settings)
2424
}
2525

2626
protected static ITypedElement MakeElementStack(Base instance, SummaryType summary, string[] elements)
27+
=> MakeElementStack(instance, summary, elements, false);
28+
29+
protected static ITypedElement MakeElementStack(Base instance, SummaryType summary, string[] elements, bool includeMandatoryInElementsSummary)
2730
{
2831
if (summary == SummaryType.False && elements == null) return instance.ToTypedElement();
2932

@@ -47,7 +50,7 @@ protected static ITypedElement MakeElementStack(Base instance, SummaryType summa
4750
case SummaryType.Count:
4851
return MaskingNode.ForCount(baseNav);
4952
case SummaryType.False:
50-
return MaskingNode.ForElements(baseNav, elements);
53+
return MaskingNode.ForElements(baseNav, elements, includeMandatoryInElementsSummary);
5154
default:
5255
return baseNav;
5356
}

src/Hl7.Fhir.Core/Serialization/FhirJsonSerializer.cs

Lines changed: 7 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,6 @@
66
* available at https://raw.githubusercontent.com/FirelyTeam/firely-net-sdk/master/LICENSE
77
*/
88

9-
using System;
109
using Hl7.Fhir.Model;
1110
using Hl7.Fhir.Rest;
1211
using Newtonsoft.Json;
@@ -23,16 +22,16 @@ public FhirJsonSerializer(SerializerSettings settings = null) : base(settings)
2322
private FhirJsonSerializationSettings buildFhirJsonWriterSettings() =>
2423
new FhirJsonSerializationSettings { Pretty = Settings.Pretty, AppendNewLine = Settings.AppendNewLine };
2524

26-
public string SerializeToString(Base instance, SummaryType summary = SummaryType.False, string[] elements = null) =>
27-
MakeElementStack(instance, summary, elements).ToJson(buildFhirJsonWriterSettings());
25+
public string SerializeToString(Base instance, SummaryType summary = SummaryType.False, string[] elements = null) =>
26+
MakeElementStack(instance, summary, elements, Settings?.IncludeMandatoryInElementsSummary ?? false).ToJson(buildFhirJsonWriterSettings());
2827

29-
public byte[] SerializeToBytes(Base instance, SummaryType summary = SummaryType.False, string[] elements = null) =>
30-
MakeElementStack(instance, summary, elements).ToJsonBytes(buildFhirJsonWriterSettings());
28+
public byte[] SerializeToBytes(Base instance, SummaryType summary = SummaryType.False, string[] elements = null) =>
29+
MakeElementStack(instance, summary, elements, Settings?.IncludeMandatoryInElementsSummary ?? false).ToJsonBytes(buildFhirJsonWriterSettings());
3130

32-
public JObject SerializeToDocument(Base instance, SummaryType summary = SummaryType.False, string[] elements = null) =>
33-
MakeElementStack(instance, summary, elements).ToJObject(buildFhirJsonWriterSettings());
31+
public JObject SerializeToDocument(Base instance, SummaryType summary = SummaryType.False, string[] elements = null) =>
32+
MakeElementStack(instance, summary, elements, Settings?.IncludeMandatoryInElementsSummary ?? false).ToJObject(buildFhirJsonWriterSettings());
3433

3534
public void Serialize(Base instance, JsonWriter writer, SummaryType summary = SummaryType.False, string[] elements = null) =>
36-
MakeElementStack(instance, summary, elements).WriteTo(writer, buildFhirJsonWriterSettings());
35+
MakeElementStack(instance, summary, elements, Settings?.IncludeMandatoryInElementsSummary ?? false).WriteTo(writer, buildFhirJsonWriterSettings());
3736
}
3837
}

src/Hl7.Fhir.Core/Serialization/FhirXmlSerializer.cs

Lines changed: 7 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -9,38 +9,37 @@
99
using Hl7.Fhir.Model;
1010
using Hl7.Fhir.Rest;
1111
using Hl7.Fhir.Utility;
12-
using System;
1312
using System.Xml;
1413
using System.Xml.Linq;
1514

1615
namespace Hl7.Fhir.Serialization
1716
{
1817
public class FhirXmlSerializer : BaseFhirSerializer
1918
{
20-
public FhirXmlSerializer(SerializerSettings settings=null) : base(settings)
19+
public FhirXmlSerializer(SerializerSettings settings = null) : base(settings)
2120
{
2221
}
2322

2423
private FhirXmlSerializationSettings buildFhirXmlWriterSettings() =>
2524
new FhirXmlSerializationSettings { Pretty = Settings.Pretty, AppendNewLine = Settings.AppendNewLine, TrimWhitespaces = Settings.TrimWhiteSpacesInXml };
2625

27-
public string SerializeToString(Base instance, SummaryType summary = SummaryType.False, string root = null, string[] elements = null) =>
28-
MakeElementStack(instance, summary, elements)
26+
public string SerializeToString(Base instance, SummaryType summary = SummaryType.False, string root = null, string[] elements = null) =>
27+
MakeElementStack(instance, summary, elements, Settings?.IncludeMandatoryInElementsSummary ?? false)
2928
.Rename(root)
3029
.ToXml(settings: buildFhirXmlWriterSettings());
3130

32-
public byte[] SerializeToBytes(Base instance, SummaryType summary = SummaryType.False, string root = null, string[] elements = null) =>
33-
MakeElementStack(instance, summary, elements)
31+
public byte[] SerializeToBytes(Base instance, SummaryType summary = SummaryType.False, string root = null, string[] elements = null) =>
32+
MakeElementStack(instance, summary, elements, Settings?.IncludeMandatoryInElementsSummary ?? false)
3433
.Rename(root)
3534
.ToXmlBytes(settings: buildFhirXmlWriterSettings());
3635

3736
public XDocument SerializeToDocument(Base instance, SummaryType summary = SummaryType.False, string root = null, string[] elements = null) =>
38-
MakeElementStack(instance, summary, elements)
37+
MakeElementStack(instance, summary, elements, Settings?.IncludeMandatoryInElementsSummary ?? false)
3938
.Rename(root)
4039
.ToXDocument(buildFhirXmlWriterSettings()).Rename(root);
4140

4241
public void Serialize(Base instance, XmlWriter writer, SummaryType summary = SummaryType.False, string root = null, string[] elements = null) =>
43-
MakeElementStack(instance, summary, elements)
42+
MakeElementStack(instance, summary, elements, Settings?.IncludeMandatoryInElementsSummary ?? false)
4443
.Rename(root)
4544
.WriteTo(writer, settings: buildFhirXmlWriterSettings());
4645
}

0 commit comments

Comments
 (0)