From dc6d4fc912273c904c87dded3cf0c34638c404ef Mon Sep 17 00:00:00 2001 From: Grahame Grieve Date: Fri, 9 Aug 2024 07:52:15 +0800 Subject: [PATCH] rendering fixes for implementers --- .../hl7/fhir/r5/renderers/BundleRenderer.java | 60 +++++++++++++++---- .../hl7/fhir/r5/renderers/DataRenderer.java | 3 + .../fhir/r5/renderers/ValueSetRenderer.java | 12 +++- 3 files changed, 61 insertions(+), 14 deletions(-) diff --git a/org.hl7.fhir.r5/src/main/java/org/hl7/fhir/r5/renderers/BundleRenderer.java b/org.hl7.fhir.r5/src/main/java/org/hl7/fhir/r5/renderers/BundleRenderer.java index 6ae4b7a89..0b40c7fa7 100644 --- a/org.hl7.fhir.r5/src/main/java/org/hl7/fhir/r5/renderers/BundleRenderer.java +++ b/org.hl7.fhir.r5/src/main/java/org/hl7/fhir/r5/renderers/BundleRenderer.java @@ -2,6 +2,7 @@ package org.hl7.fhir.r5.renderers; import java.io.IOException; import java.io.UnsupportedEncodingException; +import java.util.ArrayList; import java.util.List; import org.hl7.fhir.exceptions.DefinitionException; @@ -154,13 +155,14 @@ public class BundleRenderer extends ResourceRenderer { ResourceWrapper comp = (ResourceWrapper) entries.get(0).child("resource"); XhtmlNode sum = renderResourceTechDetails(b, docSection(x, "Document Details"), comp.primitiveValueMN("title", "name")); + List subjectList = comp.children("subject"); if (sum != null) { XhtmlNode p = sum.para(); p.startScript("doc"); renderDataType(status, p.param("status"), comp.child("status")); renderDataType(status, p.param("date"), comp.child("date")); - renderDataType(status, p.param("author"), comp.child("author")); - renderDataType(status, p.param("subject"), comp.child("subject")); + renderDataTypes(status, p.param("author"), comp.children("author")); + renderDataTypes(status, p.param("subject"), subjectList); if (comp.has("encounter")) { renderDataType(status, p.param("encounter"), comp.child("encounter")); p.paramValue("has-encounter", "true"); @@ -174,19 +176,23 @@ public class BundleRenderer extends ResourceRenderer { x.hr(); } - ResourceWrapper subject = resolveReference(entries, comp.child("subject")); - XhtmlNode sec = docSection(x, "Document Subject"); - if (subject != null) { - if (subject.hasNarrative()) { - sec.addChildren(subject.getNarrative()); + List subjects = resolveReferences(entries, subjectList); + int i = 0; + for (ResourceWrapper subject : subjects) { + XhtmlNode sec = docSection(x, "Document Subject"); + if (subject != null) { + if (subject.hasNarrative()) { + sec.addChildren(subject.getNarrative()); + } else { + RendererFactory.factory(subject, context).buildNarrative(status, sec, subject); + } } else { - RendererFactory.factory(subject, context).buildNarrative(status, sec, subject); + sec.para().b().tx("Unable to resolve subject '"+displayReference(subjects.get(i))+"'"); } - } else { - sec.para().b().tx("Unable to resolve subject '"+displayReference(comp.child("subject"))+"'"); + i++; } x.hr(); - sec = docSection(x, "Document Content"); + XhtmlNode sec = docSection(x, "Document Content"); if (comp.hasNarrative()) { sec.addChildren(comp.getNarrative()); sec.hr(); @@ -197,6 +203,16 @@ public class BundleRenderer extends ResourceRenderer { } } + private void renderDataTypes(RenderingStatus status, XhtmlNode param, List children) throws FHIRFormatError, DefinitionException, IOException { + if (children != null && !children.isEmpty()) { + boolean first = true; + for (ResourceWrapper child : children) { + if (first) {first = false; } else {param.tx(", "); } + renderDataType(status, param, child); + } + } + } + private XhtmlNode docSection(XhtmlNode x, String name) { XhtmlNode div = x.div(); div.style("border: 1px solid maroon; padding: 10px; background-color: #f2faf9; min-height: 160px;"); @@ -231,6 +247,28 @@ public class BundleRenderer extends ResourceRenderer { // children } + private List resolveReferences(List entries, List baselist) throws UnsupportedEncodingException, FHIRException, IOException { + List list = new ArrayList<>(); + if (baselist != null) { + for (ResourceWrapper base : baselist) { + ResourceWrapper res = null; + ResourceWrapper prop = base.child("reference"); + if (prop != null && prop.hasPrimitiveValue()) { + for (ResourceWrapper entry : entries) { + if (entry.has("fullUrl")) { + String fu = entry.primitiveValue("fullUrl"); + if (prop.primitiveValue().equals(fu)) { + res = entry.child("resource"); + } + } + } + list.add(res); + } + } + } + return list; + } + private ResourceWrapper resolveReference(List entries, ResourceWrapper base) throws UnsupportedEncodingException, FHIRException, IOException { if (base == null) { return null; diff --git a/org.hl7.fhir.r5/src/main/java/org/hl7/fhir/r5/renderers/DataRenderer.java b/org.hl7.fhir.r5/src/main/java/org/hl7/fhir/r5/renderers/DataRenderer.java index db365675c..ffb441b6d 100644 --- a/org.hl7.fhir.r5/src/main/java/org/hl7/fhir/r5/renderers/DataRenderer.java +++ b/org.hl7.fhir.r5/src/main/java/org/hl7/fhir/r5/renderers/DataRenderer.java @@ -749,6 +749,9 @@ public class DataRenderer extends Renderer implements CodeResolver { return renderDataType(status, null, x, type); } public boolean renderDataType(RenderingStatus status, XhtmlNode parent, XhtmlNode x, ResourceWrapper type) throws FHIRFormatError, DefinitionException, IOException { + if (type == null) { + return false; + } switch (type.fhirType()) { case "dateTime": case "date" : diff --git a/org.hl7.fhir.r5/src/main/java/org/hl7/fhir/r5/renderers/ValueSetRenderer.java b/org.hl7.fhir.r5/src/main/java/org/hl7/fhir/r5/renderers/ValueSetRenderer.java index a8ec9473a..f4d0277bd 100644 --- a/org.hl7.fhir.r5/src/main/java/org/hl7/fhir/r5/renderers/ValueSetRenderer.java +++ b/org.hl7.fhir.r5/src/main/java/org/hl7/fhir/r5/renderers/ValueSetRenderer.java @@ -743,12 +743,18 @@ public class ValueSetRenderer extends TerminologyRenderer { return "?cs-n?"; } String ref = (String) cs.getUserData("filename"); - if (ref == null) + if (ref == null) { ref = (String) cs.getWebPath(); - if (ref == null) + } + if (ref == null && cs.hasUserData("webroot")) { + ref = (String) cs.getUserData("webroot"); + } + if (ref == null) { return "?ngen-14?.html"; - if (!ref.contains(".html")) + } + if (!ref.contains(".html")) { ref = ref + ".html"; + } return ref.replace("\\", "/"); }