From eb553df2dfa0211bc3455077c2844a127fa65adb Mon Sep 17 00:00:00 2001 From: Grahame Grieve Date: Fri, 12 Apr 2024 22:11:14 +1000 Subject: [PATCH] fix problems rendering Binary files in IGs --- .../hl7/fhir/r5/renderers/BinaryRenderer.java | 92 ++++++++++++------- 1 file changed, 59 insertions(+), 33 deletions(-) diff --git a/org.hl7.fhir.r5/src/main/java/org/hl7/fhir/r5/renderers/BinaryRenderer.java b/org.hl7.fhir.r5/src/main/java/org/hl7/fhir/r5/renderers/BinaryRenderer.java index 6d538d207..b8c85e531 100644 --- a/org.hl7.fhir.r5/src/main/java/org/hl7/fhir/r5/renderers/BinaryRenderer.java +++ b/org.hl7.fhir.r5/src/main/java/org/hl7/fhir/r5/renderers/BinaryRenderer.java @@ -3,8 +3,10 @@ package org.hl7.fhir.r5.renderers; import java.io.IOException; import java.nio.charset.StandardCharsets; import java.util.ArrayList; +import java.util.Base64; import java.util.List; +import org.hl7.fhir.r5.elementmodel.Element; import org.hl7.fhir.r5.model.Binary; import org.hl7.fhir.utilities.TextFile; import org.hl7.fhir.utilities.Utilities; @@ -30,9 +32,9 @@ public class BinaryRenderer { return filenames; } - public static String getBinContentAsString(Binary bin) { + public static String getBinContentAsString(byte[] bin) { // for now, assume UTF8. To do: extract character encoding from mime type if possible (charset) - return new String(bin.getContent(), StandardCharsets.UTF_8); + return new String(bin, StandardCharsets.UTF_8); } public String display(Binary bin) throws IOException { @@ -40,47 +42,71 @@ public class BinaryRenderer { render(div, bin); return new XhtmlComposer(false, true).compose(div); } - - + + public String display(Element bin) throws IOException { + XhtmlNode div = new XhtmlNode(NodeType.Element, "div"); + render(div, bin); + return new XhtmlComposer(false, true).compose(div); + } + + public String display(String id, String ct, byte[] cnt) throws IOException { + XhtmlNode div = new XhtmlNode(NodeType.Element, "div"); + render(div, id, ct, cnt); + return new XhtmlComposer(false, true).compose(div); + } + public void render(XhtmlNode x, Binary bin) throws IOException { + String ct = bin.getContentType(); + byte[] cnt = bin.getContent(); + render(x, bin.getId(), ct, cnt); + } + + public void render(XhtmlNode x, Element bin) throws IOException { + String ct = bin.getNamedChildValue("contentType"); + String id = bin.getNamedChildValue("id"); + byte[] cnt = Base64.getMimeDecoder().decode(bin.getNamedChildValue("data")); + render(x, id, ct, cnt); + } + + public void render(XhtmlNode x, String id, String ct, byte[] cnt) throws IOException { filenames.clear(); - if (!bin.hasContentType()) { + if (ct == null) { error(x, /*!#*/"No Content Type"); - } else if (bin.getContentType().startsWith("image/")) { - image(x, bin); - } else if (isXml(bin.getContentType())) { - xml(x, bin); - } else if (isJson(bin.getContentType())) { - json(x, bin); - } else if (isTtl(bin.getContentType())) { - ttl(x, bin); - } else if (isText(bin.getContentType())) { - text(x, bin); + } else if (ct.startsWith("image/")) { + image(x, id, ct, cnt); + } else if (isXml(ct)) { + xml(x, cnt); + } else if (isJson(ct)) { + json(x, cnt); + } else if (isTtl(ct)) { + ttl(x, cnt); + } else if (isText(ct)) { + text(x, cnt); } else { - error(x, "The Content Type '"+bin.getContentType()+"' is not rendered in this context"); + error(x, "The Content Type '"+ct+"' is not rendered in this context"); } } - private void image(XhtmlNode x, Binary bin) throws IOException { + private void image(XhtmlNode x, String id, String ct, byte[] cnt) throws IOException { String ext = null; - if (bin.getContentType().startsWith("image/png")) { + if (ct.startsWith("image/png")) { ext = ".png"; - } else if (bin.getContentType().startsWith("image/jpeg")) { + } else if (ct.startsWith("image/jpeg")) { ext = ".jpg"; - } else if (bin.getContentType().startsWith("image/gif")) { + } else if (ct.startsWith("image/gif")) { ext = ".gif"; - } else if (bin.getContentType().startsWith("image/svg")) { + } else if (ct.startsWith("image/svg")) { ext = ".svg"; } if (ext == null) { - error(x, /*!#*/"The Image Type '"+bin.getContentType()+"' is not rendered in this context"); + error(x, /*!#*/"The Image Type '"+ct+"' is not rendered in this context"); } else { - String fn = "Binary-Native-"+bin.getId()+ext; - TextFile.bytesToFile(bin.getContent(), Utilities.path(folder, fn)); + String fn = "Binary-Native-"+id+ext; + TextFile.bytesToFile(cnt, Utilities.path(folder, fn)); filenames.add(fn); - x.img("Binary-Native-"+bin.getId()+ext, "binary"); + x.img("Binary-Native-"+id+ext, "binary"); } } @@ -92,8 +118,8 @@ public class BinaryRenderer { return ct.startsWith("text/xml") || ct.startsWith("application/xml") || ct.contains("+xml"); } - private void xml(XhtmlNode x, Binary bin) { - String content = "\r\n"+getBinContentAsString(bin); + private void xml(XhtmlNode x, byte[] cnt) { + String content = "\r\n"+getBinContentAsString(cnt); XhtmlNode pre = x.pre("xml"); pre.code(content); } @@ -102,8 +128,8 @@ public class BinaryRenderer { return ct.startsWith("text/json") || ct.startsWith("application/json") || ct.contains("+json"); } - private void json(XhtmlNode x, Binary bin) { - String content = "\r\n"+getBinContentAsString(bin); + private void json(XhtmlNode x, byte[] cnt) { + String content = "\r\n"+getBinContentAsString(cnt); XhtmlNode pre = x.pre("json"); pre.code(content); } @@ -112,8 +138,8 @@ public class BinaryRenderer { return ct.startsWith("text/rdf") || ct.contains("+turtle"); } - private void ttl(XhtmlNode x, Binary bin) { - String content = "\r\n"+getBinContentAsString(bin); + private void ttl(XhtmlNode x, byte[] cnt) { + String content = "\r\n"+getBinContentAsString(cnt); XhtmlNode pre = x.pre("rdf language-turtle"); pre.code(content); } @@ -123,8 +149,8 @@ public class BinaryRenderer { return ct.startsWith("text/"); } - private void text(XhtmlNode x, Binary bin) { - String content = "\r\n"+getBinContentAsString(bin); + private void text(XhtmlNode x, byte[] cnt) { + String content = "\r\n"+getBinContentAsString(cnt); XhtmlNode pre = x.pre(); pre.code(content); }