From f79fdb44ecf5de686bae3f7ff5652ed4aba80f8d Mon Sep 17 00:00:00 2001 From: Grahame Grieve Date: Sun, 5 May 2024 18:12:57 +1000 Subject: [PATCH] rendering improvements and remove static use of describeSystem --- .../org/hl7/fhir/r5/model/Parameters.java | 9 ++++ .../hl7/fhir/r5/renderers/DataRenderer.java | 44 +++++++++---------- .../fhir/r5/renderers/LibraryRenderer.java | 10 ++++- .../r5/renderers/QuestionnaireRenderer.java | 2 +- .../StructureDefinitionRenderer.java | 2 +- .../fhir/r5/renderers/ValueSetRenderer.java | 10 ++--- .../structuremap/StructureMapUtilities.java | 2 +- .../validation/special/TxTesterSorters.java | 43 +++++++++++++++++- 8 files changed, 90 insertions(+), 32 deletions(-) diff --git a/org.hl7.fhir.r5/src/main/java/org/hl7/fhir/r5/model/Parameters.java b/org.hl7.fhir.r5/src/main/java/org/hl7/fhir/r5/model/Parameters.java index 27e3b18b6..778594762 100644 --- a/org.hl7.fhir.r5/src/main/java/org/hl7/fhir/r5/model/Parameters.java +++ b/org.hl7.fhir.r5/src/main/java/org/hl7/fhir/r5/model/Parameters.java @@ -1518,6 +1518,15 @@ public String toString() { return hasValue() && getValue() instanceof PrimitiveType; } + public ParametersParameterComponent getPart(String name) { + for (ParametersParameterComponent t : getPart()) { + if (name.equals(t.getName())) { + return t; + } + } + return null; + } + // end addition } 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 0e345d60d..31cfd4900 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 @@ -269,24 +269,24 @@ public class DataRenderer extends Renderer implements CodeResolver { } } - public static String describeSystem(String system) { - if (system == null) - return /*!#*/ "[not stated]"; - if (system.equals("http://loinc.org")) - return /*!#*/ "LOINC"; - if (system.startsWith("http://snomed.info")) - return /*!#*/ "SNOWMED CT"; - if (system.equals("http://www.nlm.nih.gov/research/umls/rxnorm")) - return /*!#*/ "RxNorm"; - if (system.equals("http://hl7.org/fhir/sid/icd-9")) - return /*!#*/ "ICD-9"; - if (system.equals("http://dicom.nema.org/resources/ontology/DCM")) - return /*!#*/ "DICOM"; - if (system.equals("http://unitsofmeasure.org")) - return /*!#*/ "UCUM"; - - return system; - } +// public static String describeSystem(String system) { +// if (system == null) +// return /*!#*/ "[not stated]"; +// if (system.equals("http://loinc.org")) +// return /*!#*/ "LOINC"; +// if (system.startsWith("http://snomed.info")) +// return /*!#*/ "SNOMED CT"; +// if (system.equals("http://www.nlm.nih.gov/research/umls/rxnorm")) +// return /*!#*/ "RxNorm"; +// if (system.equals("http://hl7.org/fhir/sid/icd-9")) +// return /*!#*/ "ICD-9"; +// if (system.equals("http://dicom.nema.org/resources/ontology/DCM")) +// return /*!#*/ "DICOM"; +// if (system.equals("http://unitsofmeasure.org")) +// return /*!#*/ "UCUM"; +// +// return system; +// } public String displaySystem(String system) { if (system == null) @@ -1054,7 +1054,7 @@ public class DataRenderer extends Renderer implements CodeResolver { CodeSystem cs = context.getWorker().fetchCodeSystem(c.getSystem()); systemLink = cs != null ? cs.getWebPath() : null; - systemName = cs != null ? crPresent(cs) : describeSystem(c.getSystem()); + systemName = cs != null ? crPresent(cs) : displaySystem(c.getSystem()); link = getLinkForCode(c.getSystem(), c.getVersion(), c.getCode()); hint = systemName+": "+display+(c.hasVersion() ? " "+/*!#*/"(version = "+c.getVersion()+")" : ""); @@ -1077,7 +1077,7 @@ public class DataRenderer extends Renderer implements CodeResolver { CodeSystem cs = context.getWorker().fetchCodeSystem(c.getSystem()); - String sn = cs != null ? crPresent(cs) : describeSystem(c.getSystem()); + String sn = cs != null ? crPresent(cs) : displaySystem(c.getSystem()); String link = getLinkForCode(c.getSystem(), c.getVersion(), c.getCode()); if (link != null) { x.ah(link).tx(sn); @@ -1107,7 +1107,7 @@ public class DataRenderer extends Renderer implements CodeResolver { s = c.getCode(); if (showCodeDetails) { - x.addText(s+" "+/*!#*/"(Details: "+TerminologyRenderer.describeSystem(c.getSystem())+" code "+c.getCode()+" = '"+lookupCode(c.getSystem(), c.getVersion(), c.getCode())+"', stated as '"+c.getDisplay()+"')"); + x.addText(s+" "+/*!#*/"(Details: "+displaySystem(c.getSystem())+" code "+c.getCode()+" = '"+lookupCode(c.getSystem(), c.getVersion(), c.getCode())+"', stated as '"+c.getDisplay()+"')"); } else x.span(null, "{"+c.getSystem()+" "+c.getCode()+"}").addText(s); } @@ -1596,7 +1596,7 @@ public class DataRenderer extends Renderer implements CodeResolver { x.tx("(unit "+q.getCode()+" from "+q.getSystem()+")"); } if (showCodeDetails && q.hasCode()) { - x.span("background: LightGoldenRodYellow", null).tx(" "+/*!#*/"(Details: "+TerminologyRenderer.describeSystem(q.getSystem())+" code "+q.getCode()+" = '"+lookupCode(q.getSystem(), null, q.getCode())+"')"); + x.span("background: LightGoldenRodYellow", null).tx(" "+/*!#*/"(Details: "+displaySystem(q.getSystem())+" code "+q.getCode()+" = '"+lookupCode(q.getSystem(), null, q.getCode())+"')"); } } diff --git a/org.hl7.fhir.r5/src/main/java/org/hl7/fhir/r5/renderers/LibraryRenderer.java b/org.hl7.fhir.r5/src/main/java/org/hl7/fhir/r5/renderers/LibraryRenderer.java index 23b5147d8..1261fd31b 100644 --- a/org.hl7.fhir.r5/src/main/java/org/hl7/fhir/r5/renderers/LibraryRenderer.java +++ b/org.hl7.fhir.r5/src/main/java/org/hl7/fhir/r5/renderers/LibraryRenderer.java @@ -9,6 +9,7 @@ import org.hl7.fhir.exceptions.DefinitionException; import org.hl7.fhir.exceptions.FHIRException; import org.hl7.fhir.exceptions.FHIRFormatError; import org.hl7.fhir.r5.model.Attachment; +import org.hl7.fhir.r5.model.CanonicalResource; import org.hl7.fhir.r5.model.ContactDetail; import org.hl7.fhir.r5.model.ContactPoint; import org.hl7.fhir.r5.model.DataRequirement; @@ -345,7 +346,14 @@ public class LibraryRenderer extends ResourceRenderer { p.tx(att.getTitle()); p.tx(": "); } - p.code().ah(att.getUrl()).tx(att.getUrl()); + Resource res = context.getContext().fetchResource(Resource.class, att.getUrl()); + if (res == null || !res.hasWebPath()) { + p.code().ah(att.getUrl()).tx(att.getUrl()); + } else if (res instanceof CanonicalResource) { + p.code().ah(res.getWebPath()).tx(((CanonicalResource) res).present()); + } else { + p.code().ah(res.getWebPath()).tx(att.getUrl()); + } p.tx(" ("); p.code().tx(att.getContentType()); p.tx(lang(att)); diff --git a/org.hl7.fhir.r5/src/main/java/org/hl7/fhir/r5/renderers/QuestionnaireRenderer.java b/org.hl7.fhir.r5/src/main/java/org/hl7/fhir/r5/renderers/QuestionnaireRenderer.java index 45b0c09d6..5541531f6 100644 --- a/org.hl7.fhir.r5/src/main/java/org/hl7/fhir/r5/renderers/QuestionnaireRenderer.java +++ b/org.hl7.fhir.r5/src/main/java/org/hl7/fhir/r5/renderers/QuestionnaireRenderer.java @@ -144,7 +144,7 @@ public class QuestionnaireRenderer extends TerminologyRenderer { if (link == null) { li.tx(c.getSystem()+"#"+c.getCode()); } else { - li.ah(link).tx(describeSystem(c.getSystem())); + li.ah(link).tx(displaySystem(c.getSystem())); li.tx(": "+c.getCode()); } if (c.hasDisplay()) { diff --git a/org.hl7.fhir.r5/src/main/java/org/hl7/fhir/r5/renderers/StructureDefinitionRenderer.java b/org.hl7.fhir.r5/src/main/java/org/hl7/fhir/r5/renderers/StructureDefinitionRenderer.java index bf1ccd578..f865b601b 100644 --- a/org.hl7.fhir.r5/src/main/java/org/hl7/fhir/r5/renderers/StructureDefinitionRenderer.java +++ b/org.hl7.fhir.r5/src/main/java/org/hl7/fhir/r5/renderers/StructureDefinitionRenderer.java @@ -2936,7 +2936,7 @@ public class StructureDefinitionRenderer extends ResourceRenderer { private String summarizeCoding(Coding value) { String uri = value.getSystem(); - String system = TerminologyRenderer.describeSystem(uri); + String system = displaySystem(uri); if (Utilities.isURL(system)) { if (system.equals("http://cap.org/protocols")) system = context.formatMessage(RenderingContext.STRUC_DEF_CAP); 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 347e0ad63..f7fd6fe29 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 @@ -519,7 +519,7 @@ public class ValueSetRenderer extends TerminologyRenderer { x.tx(/*!#*/"SNOMED CT "+m+" edition"); } } else { - x.tx(describeSystem(u)+" "+/*!#*/"version "+v); + x.tx(displaySystem(u)+" "+/*!#*/"version "+v); } } else if (u.equals("http://loinc.org")) { String vd = describeLoincVer(v); @@ -534,10 +534,10 @@ public class ValueSetRenderer extends TerminologyRenderer { if (cr.hasWebPath()) { x.ah(cr.getWebPath()).tx(t+" "+cr.present()+" "+/*!#*/"(no version) ("+cr.fhirType()+")"); } else { - x.tx(t+" "+describeSystem(u)+" "+/*!#*/"(no version) ("+cr.fhirType()+")"); + x.tx(t+" "+displaySystem(u)+" "+/*!#*/"(no version) ("+cr.fhirType()+")"); } } else { - x.tx(t+" "+describeSystem(u)+" "+/*!#*/"(no version)"); + x.tx(t+" "+displaySystem(u)+" "+/*!#*/"(no version)"); } } else { CanonicalResource cr = (CanonicalResource) getContext().getWorker().fetchResource(Resource.class, u+"|"+v, source); @@ -545,10 +545,10 @@ public class ValueSetRenderer extends TerminologyRenderer { if (cr.hasWebPath()) { x.ah(cr.getWebPath()).tx(t+" "+cr.present()+" v"+v+" ("+cr.fhirType()+")"); } else { - x.tx(t+" "+describeSystem(u)+" v"+v+" ("+cr.fhirType()+")"); + x.tx(t+" "+displaySystem(u)+" v"+v+" ("+cr.fhirType()+")"); } } else { - x.tx(t+" "+describeSystem(u)+" "+/*!#*/"version "+v); + x.tx(t+" "+displaySystem(u)+" "+/*!#*/"version "+v); } } } diff --git a/org.hl7.fhir.r5/src/main/java/org/hl7/fhir/r5/utils/structuremap/StructureMapUtilities.java b/org.hl7.fhir.r5/src/main/java/org/hl7/fhir/r5/utils/structuremap/StructureMapUtilities.java index 5a5158287..672d6d8ad 100644 --- a/org.hl7.fhir.r5/src/main/java/org/hl7/fhir/r5/utils/structuremap/StructureMapUtilities.java +++ b/org.hl7.fhir.r5/src/main/java/org/hl7/fhir/r5/utils/structuremap/StructureMapUtilities.java @@ -2396,7 +2396,7 @@ public class StructureMapUtilities { if (Utilities.noString(code)) throw new FHIRException("Describe Transform, but the code is blank"); Coding c = buildCoding(uri, code); - return TerminologyRenderer.describeSystem(c.getSystem()) + "#" + c.getCode() + (c.hasDisplay() ? "(" + c.getDisplay() + ")" : ""); + return c.getSystem() + "#" + c.getCode() + (c.hasDisplay() ? "(" + c.getDisplay() + ")" : ""); } diff --git a/org.hl7.fhir.validation/src/main/java/org/hl7/fhir/validation/special/TxTesterSorters.java b/org.hl7.fhir.validation/src/main/java/org/hl7/fhir/validation/special/TxTesterSorters.java index c9531f7fc..12609e7f1 100644 --- a/org.hl7.fhir.validation/src/main/java/org/hl7/fhir/validation/special/TxTesterSorters.java +++ b/org.hl7.fhir.validation/src/main/java/org/hl7/fhir/validation/special/TxTesterSorters.java @@ -1,17 +1,23 @@ package org.hl7.fhir.validation.special; +import java.io.FileInputStream; +import java.io.FileOutputStream; +import java.io.IOException; import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; import java.util.List; import org.hl7.fhir.ParametersParameter; +import org.hl7.fhir.r5.formats.IParser.OutputStyle; +import org.hl7.fhir.r5.formats.JsonParser; import org.hl7.fhir.r5.model.Base; import org.hl7.fhir.r5.model.Extension; import org.hl7.fhir.r5.model.OperationOutcome; import org.hl7.fhir.r5.model.OperationOutcome.OperationOutcomeIssueComponent; import org.hl7.fhir.r5.model.Parameters; import org.hl7.fhir.r5.model.Parameters.ParametersParameterComponent; +import org.hl7.fhir.r5.model.Resource; import org.hl7.fhir.r5.model.StringType; import org.hl7.fhir.r5.model.ValueSet; import org.hl7.fhir.r5.model.ValueSet.ConceptPropertyComponent; @@ -20,10 +26,21 @@ import org.hl7.fhir.r5.model.ValueSet.ValueSetExpansionContainsComponent; import org.hl7.fhir.r5.model.ValueSet.ValueSetExpansionParameterComponent; import org.hl7.fhir.r5.model.ValueSet.ValueSetExpansionPropertyComponent; import org.hl7.fhir.utilities.CommaSeparatedStringBuilder; +import org.hl7.fhir.utilities.json.JsonException; public class TxTesterSorters { - + public static void main(String[] args) throws JsonException, IOException { + Resource r = new JsonParser().parse(new FileInputStream(args[0])); + switch (r.fhirType()) { + case "Parameters" : + sortParameters((Parameters) r); + break; + default: + return; + } + new JsonParser().setOutputStyle(OutputStyle.PRETTY).compose(new FileOutputStream(args[0]), r); + } public static void sortParameters(Parameters po) { Collections.sort(po.getParameter(), new TxTesterSorters.ParameterSorter()); @@ -190,6 +207,30 @@ public class TxTesterSorters { Collections.sort(o2.getExtension(), new ExtensionSorter()); Collections.sort(o1.getPart(), new ParameterSorter()); Collections.sort(o2.getPart(), new ParameterSorter()); + if (o1.getName().equals(o2.getName()) && o1.getName().equals("property")) { + String code1 = o1.getPart("code").getValue().primitiveValue().toLowerCase(); + String code2 = o2.getPart("code").getValue().primitiveValue().toLowerCase(); + if (code1 != null && code2 != null && !code1.equals(code2)) { + return code1.compareTo(code2); + } + String v1 = o1.getPart("value") != null && o1.getPart("value").hasPrimitiveValue() ? o1.getPart("value").getValue().primitiveValue().toLowerCase() : null; + String v2 = o2.getPart("value") != null && o2.getPart("value").hasPrimitiveValue() ? o2.getPart("value").getValue().primitiveValue().toLowerCase() : null; + if (v1 != null && v2 != null && !v1.equals(v2)) { + return v1.compareTo(v2); + } + } + if (o1.getName().equals(o2.getName()) && o1.getName().equals("designation")) { + String code1 = o1.getPart("language").hasValue() ? o1.getPart("language").getValue().primitiveValue().toLowerCase() : ""; + String code2 = o2.getPart("language").hasValue() ? o2.getPart("language").getValue().primitiveValue().toLowerCase() : ""; + if (code1 != null && code2 != null && !code1.equals(code2)) { + return code1.compareTo(code2); + } + String v1 = o1.getPart("value") != null && o1.getPart("value").hasPrimitiveValue() ? o1.getPart("value").getValue().primitiveValue().toLowerCase() : null; + String v2 = o2.getPart("value") != null && o2.getPart("value").hasPrimitiveValue() ? o2.getPart("value").getValue().primitiveValue().toLowerCase() : null; + if (v1 != null && v2 != null && !v1.equals(v2)) { + return v1.compareTo(v2); + } + } return o1.getName().compareTo(o2.getName()); }