diff --git a/org.hl7.fhir.r5/src/main/java/org/hl7/fhir/r5/terminologies/client/TerminologyClientManager.java b/org.hl7.fhir.r5/src/main/java/org/hl7/fhir/r5/terminologies/client/TerminologyClientManager.java index 5add4914a..00897c519 100644 --- a/org.hl7.fhir.r5/src/main/java/org/hl7/fhir/r5/terminologies/client/TerminologyClientManager.java +++ b/org.hl7.fhir.r5/src/main/java/org/hl7/fhir/r5/terminologies/client/TerminologyClientManager.java @@ -331,7 +331,7 @@ public class TerminologyClientManager { private String host() throws MalformedURLException { URL url = new URL(getMasterClient().getAddress()); - if (url.getPort() != 0) { + if (url.getPort() > 0) { return url.getHost()+":"+url.getPort(); } else { return url.getHost(); diff --git a/org.hl7.fhir.r5/src/main/java/org/hl7/fhir/r5/utils/BaseJsonWrapper.java b/org.hl7.fhir.r5/src/main/java/org/hl7/fhir/r5/utils/BaseJsonWrapper.java new file mode 100644 index 000000000..f4a719af3 --- /dev/null +++ b/org.hl7.fhir.r5/src/main/java/org/hl7/fhir/r5/utils/BaseJsonWrapper.java @@ -0,0 +1,87 @@ +package org.hl7.fhir.r5.utils; + +import org.hl7.fhir.exceptions.FHIRException; +import org.hl7.fhir.r5.model.Base; +import org.hl7.fhir.utilities.FhirPublication; +import org.hl7.fhir.utilities.json.model.JsonArray; +import org.hl7.fhir.utilities.json.model.JsonElement; + +// this class exists to allow the Liquid Engine to be used against raw JSON + +public class BaseJsonWrapper extends Base { + + private static final long serialVersionUID = 1L; + private JsonElement j; + + public BaseJsonWrapper(JsonElement j) { + super(); + this.j = j; + } + + @Override + public String fhirType() { + switch (j.type()) { + case BOOLEAN: return "boolean"; + case NUMBER: return "decimal"; + case OBJECT: return "Object"; + case STRING: return "string"; + default: + throw new Error("Shouldn't get here"); + } + } + + @Override + public String getIdBase() { + if (j.isJsonObject()) { + return j.asJsonObject().asString("id"); + } else { + return null; + } + } + + @Override + public void setIdBase(String value) { + throw new Error("BaseJsonWrapper is read only"); + } + + @Override + public Base copy() { + throw new Error("BaseJsonWrapper is read only"); + } + + @Override + public FhirPublication getFHIRPublicationVersion() { + return FhirPublication.R5; + } + + public Base[] getProperty(int hash, String name, boolean checkValid) throws FHIRException { + if (j.isJsonObject() && j.asJsonObject().has(name)) { + JsonElement e = j.asJsonObject().get(name); + if (e.isJsonArray()) { + JsonArray a = e.asJsonArray(); + Base[] l = new Base[a.size()]; + for (int i = 0; i < a.size(); i++) { + l[i] = new BaseJsonWrapper(a.get(i)); + } + return l; + } else { + Base[] l = new Base[1]; + l[0] = new BaseJsonWrapper(e); + return l; + } + } else { + return super.getProperty(hash, name, checkValid); + } + } + + @Override + public String toString() { + if (j.isJsonPrimitive()) { + return j.asString(); + } else { + return super.toString(); + } + } + + +} diff --git a/org.hl7.fhir.r5/src/main/java/org/hl7/fhir/r5/utils/LiquidEngine.java b/org.hl7.fhir.r5/src/main/java/org/hl7/fhir/r5/utils/LiquidEngine.java index fb7574ec9..48229cb96 100644 --- a/org.hl7.fhir.r5/src/main/java/org/hl7/fhir/r5/utils/LiquidEngine.java +++ b/org.hl7.fhir.r5/src/main/java/org/hl7/fhir/r5/utils/LiquidEngine.java @@ -49,7 +49,9 @@ import org.hl7.fhir.r5.fhirpath.FHIRPathUtilityClasses.FunctionDetails; import org.hl7.fhir.r5.model.Base; import org.hl7.fhir.r5.model.Tuple; import org.hl7.fhir.r5.model.ValueSet; +import org.hl7.fhir.utilities.MarkDownProcessor; import org.hl7.fhir.utilities.Utilities; +import org.hl7.fhir.utilities.MarkDownProcessor.Dialect; import org.hl7.fhir.utilities.i18n.I18nConstants; import org.hl7.fhir.utilities.xhtml.NodeType; import org.hl7.fhir.utilities.xhtml.XhtmlNode; @@ -68,7 +70,8 @@ public class LiquidEngine implements IEvaluationContext { private FHIRPathEngine engine; private ILiquidEngineIncludeResolver includeResolver; private ILiquidRenderingSupport renderingSupport; - + private MarkDownProcessor processor = new MarkDownProcessor(Dialect.COMMON_MARK); + private class LiquidEngineContext { private Object externalContext; private Map loopVars = new HashMap<>(); @@ -162,12 +165,24 @@ public class LiquidEngine implements IEvaluationContext { } private enum LiquidFilter { - PREPEND; + PREPEND, + MARKDOWNIFY, + UPCASE, + DOWNCASE; public static LiquidFilter fromCode(String code) { if ("prepend".equals(code)) { return PREPEND; } + if ("markdownify".equals(code)) { + return MARKDOWNIFY; + } + if ("upcase".equals(code)) { + return UPCASE; + } + if ("downcase".equals(code)) { + return DOWNCASE; + } return null; } } @@ -221,12 +236,25 @@ public class LiquidEngine implements IEvaluationContext { } else switch (i.filter) { case PREPEND: t = stmtToString(ctxt, engine.evaluate(ctxt, resource, resource, resource, i.expression)) + t; + break; + case MARKDOWNIFY: + t = processMarkdown(t); + break; + case UPCASE: + t = t.toUpperCase(); + break; + case DOWNCASE: + t = t.toLowerCase(); break; } } b.append(t); } + private String processMarkdown(String t) { + return processor.process(t, "liquid"); + } + private String stmtToString(LiquidEngineContext ctxt, List items) { StringBuilder b = new StringBuilder(); boolean first = true; @@ -489,6 +517,9 @@ public class LiquidEngine implements IEvaluationContext { public LiquidParser(String source) { this.source = source; + if (source == null) { + throw new FHIRException("No Liquid source to parse"); + } cursor = 0; }