CDA Tests with FHIRPath, ED datatype handling

This commit is contained in:
Oliver Egger 2019-10-14 22:31:17 +02:00
parent 0cf2cafb62
commit 04ff81682b
5 changed files with 4700 additions and 21 deletions

View File

@ -40,6 +40,7 @@ import javax.xml.transform.sax.SAXSource;
import org.hl7.fhir.exceptions.DefinitionException; import org.hl7.fhir.exceptions.DefinitionException;
import org.hl7.fhir.exceptions.FHIRException; import org.hl7.fhir.exceptions.FHIRException;
import org.hl7.fhir.exceptions.FHIRFormatError; import org.hl7.fhir.exceptions.FHIRFormatError;
import org.hl7.fhir.r5.elementmodel.Element;
import org.hl7.fhir.r5.conformance.ProfileUtilities; import org.hl7.fhir.r5.conformance.ProfileUtilities;
import org.hl7.fhir.r5.context.IWorkerContext; import org.hl7.fhir.r5.context.IWorkerContext;
import org.hl7.fhir.r5.elementmodel.Element.SpecialElement; import org.hl7.fhir.r5.elementmodel.Element.SpecialElement;
@ -244,8 +245,18 @@ public class XmlParser extends ParserBase {
if (!Utilities.noString(text)) { if (!Utilities.noString(text)) {
Property property = getTextProp(properties); Property property = getTextProp(properties);
if (property != null) { if (property != null) {
context.getChildren().add(new Element(property.getName(), property, property.getType(), text).markLocation(line(node), col(node))); if ("ED.data[x]".equals(property.getDefinition().getId())) {
if ("B64".equals(node.getAttribute("representation"))) {
context.getChildren().add(new Element("dataBase64Binary", property, "base64Binary", text).markLocation(line(node), col(node)));
} else { } else {
context.getChildren().add(new Element("dataString", property, "string", text).markLocation(line(node), col(node)));
}
} else {
context.getChildren().add(
new Element(property.getName(), property, property.getType(), text).markLocation(line(node), col(node)));
}
}
else {
logError(line(node), col(node), path, IssueType.STRUCTURE, "Text should not be present", IssueSeverity.ERROR); logError(line(node), col(node), path, IssueType.STRUCTURE, "Text should not be present", IssueSeverity.ERROR);
} }
} }

View File

@ -1,5 +1,8 @@
package org.hl7.fhir.r5.test; package org.hl7.fhir.r5.test;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;
import java.io.FileInputStream; import java.io.FileInputStream;
import java.io.FileNotFoundException; import java.io.FileNotFoundException;
import java.io.FileOutputStream; import java.io.FileOutputStream;
@ -13,27 +16,114 @@ import org.hl7.fhir.r5.elementmodel.Element;
import org.hl7.fhir.r5.elementmodel.Manager; import org.hl7.fhir.r5.elementmodel.Manager;
import org.hl7.fhir.r5.elementmodel.Manager.FhirFormat; import org.hl7.fhir.r5.elementmodel.Manager.FhirFormat;
import org.hl7.fhir.r5.formats.IParser.OutputStyle; import org.hl7.fhir.r5.formats.IParser.OutputStyle;
import org.hl7.fhir.r5.test.utils.TestingUtilities;
import org.hl7.fhir.r5.utils.FHIRPathEngine;
import org.hl7.fhir.utilities.cache.PackageCacheManager; import org.hl7.fhir.utilities.cache.PackageCacheManager;
import org.hl7.fhir.utilities.cache.ToolsVersion; import org.hl7.fhir.utilities.cache.ToolsVersion;
import org.junit.Before; import org.junit.Before;
import org.junit.Ignore;
import org.junit.Test; import org.junit.Test;
public class CDARoundTripTests { public class CDARoundTripTests {
private SimpleWorkerContext context; private SimpleWorkerContext context;
private FHIRPathEngine fp;
@Before @Before
public void setUp() throws Exception { public void setUp() throws Exception {
context = new SimpleWorkerContext(); context = new SimpleWorkerContext();
PackageCacheManager pcm = new PackageCacheManager(true, ToolsVersion.TOOLS_VERSION); PackageCacheManager pcm = new PackageCacheManager(true, ToolsVersion.TOOLS_VERSION);
context.loadFromPackage(pcm.loadPackage("hl7.fhir.core"), null, "StructureDefinition"); context.loadFromPackage(pcm.loadPackage("hl7.fhir.core", "dev"), null, "StructureDefinition");
context.loadFromPackage(pcm.loadPackage("hl7.fhir.cda"), null, "StructureDefinition"); context.loadFromPackage(pcm.loadPackage("hl7.fhir.cda", "dev"), null, "StructureDefinition");
fp = new FHIRPathEngine(context);
} }
@Test @Test
public void testCDA() throws FHIRFormatError, DefinitionException, FileNotFoundException, IOException, FHIRException {
try {
String fileSource = TestingUtilities.resourceNameToFile("cda", "cda-original.xml");
String roundTrip = TestingUtilities.resourceNameToFile("cda", "cda-roundtrip.xml");
String jsonRoundTrip = TestingUtilities.resourceNameToFile("cda", "cda-roundtrip.json");
Element e = Manager.parse(context, new FileInputStream(fileSource), FhirFormat.XML);
Manager.compose(context, e, new FileOutputStream(roundTrip), FhirFormat.XML, OutputStyle.PRETTY, null);
Manager.compose(context, e, new FileOutputStream(jsonRoundTrip), FhirFormat.JSON, OutputStyle.PRETTY, null);
// <typeId root="2.16.840.1.113883.1.3" extension="POCD_HD000040"/>
// assertEquals("POCD_HD000040", fp.evaluateToString(e, "typeId.extension"));
// assertEquals("2.16.840.1.113883.1.3", fp.evaluateToString(e, "typeId.root"));
// <templateId root="2.16.840.1.113883.3.27.1776"/>
// assertEquals("2.16.840.1.113883.3.27.1776", fp.evaluateToString(e, "templateId.root"));
// <id extension="c266" root="2.16.840.1.113883.19.4"/>
assertEquals("2.16.840.1.113883.19.4", fp.evaluateToString(e, "id.root"));
assertEquals("c266", fp.evaluateToString(e, "id.extension"));
// <title>Good Health Clinic Consultation Note</title>
assertEquals("Good Health Clinic Consultation Note", fp.evaluateToString(e, "title.dataString"));
// <effectiveTime value="20000407"/>
assertEquals("2000-04-07", fp.evaluateToString(e, "effectiveTime.value"));
// <confidentialityCode code="N" codeSystem="2.16.840.1.113883.5.25"/>
assertEquals("N", fp.evaluateToString(e, "confidentialityCode.code"));
assertEquals("2.16.840.1.113883.5.25", fp.evaluateToString(e, "confidentialityCode.codeSystem"));
// <languageCode code="en-US"/>
assertEquals("en-US", fp.evaluateToString(e, "languageCode.code"));
// <setId extension="BB35" root="2.16.840.1.113883.19.7"/>
assertEquals("BB35", fp.evaluateToString(e, "setId.extension"));
assertEquals("2.16.840.1.113883.19.7", fp.evaluateToString(e, "setId.root"));
// <versionNumber value="2"/>
assertEquals("2", fp.evaluateToString(e, "versionNumber.value"));
// <recordTarget>
// <patientRole>
// <id extension="12345" root="2.16.840.1.113883.19.5"/>
assertEquals("12345", fp.evaluateToString(e, "recordTarget.patientRole.id.extension"));
assertEquals("2.16.840.1.113883.19.5", fp.evaluateToString(e, "recordTarget.patientRole.id.root"));
// <patient>
// <name>
// <family>Levin</family>
assertEquals("Levin", fp.evaluateToString(e, "recordTarget.patientRole.patient.name.family.dataString"));
// <given>Henry</given>
assertEquals("Henry", fp.evaluateToString(e, "recordTarget.patientRole.patient.name.given.dataString"));
// <suffix>the 7th</suffix>
// </name>
// <administrativeGenderCode code="M" codeSystem="2.16.840.1.113883.5.1"/>
// <birthTime value="19320924"/>
// </patient>
// <providerOrganization>
// <id root="2.16.840.1.113883.19.5"/>
// </providerOrganization>
// </patientRole>
// </recordTarget>
// <component>
// <structuredBody>
// <component>
// <section>
// <component>
// <section>
// <code code="8709-8" codeSystem="2.16.840.1.113883.6.1" codeSystemName="LOINC"/>
// <title>Skin Exam</title>
// <text>Erythematous rash, palmar surface, left index finger.
// <renderMultiMedia referencedObject="MM1"/>
// </text>
assertEquals("Skin Exam", fp.evaluateToString(e, "component.structuredBody.component.section.component.section.where(code.code='8709-8' and code.codeSystem='2.16.840.1.113883.6.1').title.dataString"));
} catch (Exception e) {
System.out.println(e.getMessage());
e.printStackTrace();
throw e;
}
}
@Ignore
public void testDCI() throws FHIRFormatError, DefinitionException, FileNotFoundException, IOException, FHIRException { public void testDCI() throws FHIRFormatError, DefinitionException, FileNotFoundException, IOException, FHIRException {
try { try {
Element e = Manager.parse(context, new FileInputStream("C:\\work\\org.hl7.fhir.us\\ccda-to-fhir-maps\\cda\\IAT2-Discharge_Summary-DCI.xml"), FhirFormat.XML); Element e = Manager.parse(context,
new FileInputStream("C:\\work\\org.hl7.fhir.us\\ccda-to-fhir-maps\\cda\\IAT2-Discharge_Summary-DCI.xml"),
FhirFormat.XML);
Manager.compose(context, e, new FileOutputStream("C:\\temp\\ccda.xml"), FhirFormat.XML, OutputStyle.PRETTY, null); Manager.compose(context, e, new FileOutputStream("C:\\temp\\ccda.xml"), FhirFormat.XML, OutputStyle.PRETTY, null);
// Manager.compose(context, e, new FileOutputStream("C:\\work\\org.hl7.fhir.test\\ccda-to-fhir-maps\\testdocuments\\IAT2-Discharge_Summary-DCI.out.json"), FhirFormat.JSON, OutputStyle.PRETTY, null); // Manager.compose(context, e, new FileOutputStream("C:\\work\\org.hl7.fhir.test\\ccda-to-fhir-maps\\testdocuments\\IAT2-Discharge_Summary-DCI.out.json"), FhirFormat.JSON, OutputStyle.PRETTY, null);
// Manager.compose(context, e, new FileOutputStream("C:\\work\\org.hl7.fhir.test\\ccda-to-fhir-maps\\testdocuments\\IAT2-Discharge_Summary-DCI.out.ttl"), FhirFormat.TURTLE, OutputStyle.PRETTY, null); // Manager.compose(context, e, new FileOutputStream("C:\\work\\org.hl7.fhir.test\\ccda-to-fhir-maps\\testdocuments\\IAT2-Discharge_Summary-DCI.out.ttl"), FhirFormat.TURTLE, OutputStyle.PRETTY, null);
@ -44,20 +134,44 @@ public class CDARoundTripTests {
} }
} }
@Test @Ignore
public void testEpic() throws FHIRFormatError, DefinitionException, FileNotFoundException, IOException, FHIRException { public void testEpic()
Element e = Manager.parse(context, new FileInputStream("C:\\work\\org.hl7.fhir.test\\ccda-to-fhir-maps\\testdocuments\\IAT2-Discharge-Homework-Epic.xml"), FhirFormat.XML); throws FHIRFormatError, DefinitionException, FileNotFoundException, IOException, FHIRException {
Manager.compose(context, e, new FileOutputStream("C:\\work\\org.hl7.fhir.test\\ccda-to-fhir-maps\\testdocuments\\IAT2-Discharge-Homework-Epic.out.xml"), FhirFormat.XML, OutputStyle.PRETTY, null); Element e = Manager.parse(context,
Manager.compose(context, e, new FileOutputStream("C:\\work\\org.hl7.fhir.test\\ccda-to-fhir-maps\\testdocuments\\IAT2-Discharge-Homework-Epic.out.json"), FhirFormat.JSON, OutputStyle.PRETTY, null); new FileInputStream(
Manager.compose(context, e, new FileOutputStream("C:\\work\\org.hl7.fhir.test\\ccda-to-fhir-maps\\testdocuments\\IAT2-Discharge-Homework-Epic.out.ttl"), FhirFormat.TURTLE, OutputStyle.PRETTY, null); "C:\\work\\org.hl7.fhir.test\\ccda-to-fhir-maps\\testdocuments\\IAT2-Discharge-Homework-Epic.xml"),
FhirFormat.XML);
Manager.compose(context, e,
new FileOutputStream(
"C:\\work\\org.hl7.fhir.test\\ccda-to-fhir-maps\\testdocuments\\IAT2-Discharge-Homework-Epic.out.xml"),
FhirFormat.XML, OutputStyle.PRETTY, null);
Manager.compose(context, e,
new FileOutputStream(
"C:\\work\\org.hl7.fhir.test\\ccda-to-fhir-maps\\testdocuments\\IAT2-Discharge-Homework-Epic.out.json"),
FhirFormat.JSON, OutputStyle.PRETTY, null);
Manager.compose(context, e,
new FileOutputStream(
"C:\\work\\org.hl7.fhir.test\\ccda-to-fhir-maps\\testdocuments\\IAT2-Discharge-Homework-Epic.out.ttl"),
FhirFormat.TURTLE, OutputStyle.PRETTY, null);
} }
@Test @Ignore
public void testDHIT() throws FHIRFormatError, DefinitionException, FileNotFoundException, IOException, FHIRException { public void testDHIT()
Element e = Manager.parse(context, new FileInputStream("C:\\work\\org.hl7.fhir.test\\ccda-to-fhir-maps\\testdocuments\\IAT2-DS-Homework-DHIT.xml"), FhirFormat.XML); throws FHIRFormatError, DefinitionException, FileNotFoundException, IOException, FHIRException {
Manager.compose(context, e, new FileOutputStream("C:\\work\\org.hl7.fhir.test\\ccda-to-fhir-maps\\testdocuments\\IAT2-DS-Homework-DHIT.out.xml"), FhirFormat.XML, OutputStyle.PRETTY, null); Element e = Manager.parse(context,
Manager.compose(context, e, new FileOutputStream("C:\\work\\org.hl7.fhir.test\\ccda-to-fhir-maps\\testdocuments\\IAT2-DS-Homework-DHIT.out.json"), FhirFormat.JSON, OutputStyle.PRETTY, null); new FileInputStream("C:\\work\\org.hl7.fhir.test\\ccda-to-fhir-maps\\testdocuments\\IAT2-DS-Homework-DHIT.xml"),
Manager.compose(context, e, new FileOutputStream("C:\\work\\org.hl7.fhir.test\\ccda-to-fhir-maps\\testdocuments\\IAT2-DS-Homework-DHIT.out.ttl"), FhirFormat.TURTLE, OutputStyle.PRETTY, null); FhirFormat.XML);
Manager.compose(context, e,
new FileOutputStream(
"C:\\work\\org.hl7.fhir.test\\ccda-to-fhir-maps\\testdocuments\\IAT2-DS-Homework-DHIT.out.xml"),
FhirFormat.XML, OutputStyle.PRETTY, null);
Manager.compose(context, e,
new FileOutputStream(
"C:\\work\\org.hl7.fhir.test\\ccda-to-fhir-maps\\testdocuments\\IAT2-DS-Homework-DHIT.out.json"),
FhirFormat.JSON, OutputStyle.PRETTY, null);
Manager.compose(context, e,
new FileOutputStream(
"C:\\work\\org.hl7.fhir.test\\ccda-to-fhir-maps\\testdocuments\\IAT2-DS-Homework-DHIT.out.ttl"),
FhirFormat.TURTLE, OutputStyle.PRETTY, null);
} }
} }

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff