From c260bece21f9d6d935f5e90791d9ac87f98cc2b7 Mon Sep 17 00:00:00 2001 From: dotasek Date: Fri, 30 Aug 2024 09:44:33 -0400 Subject: [PATCH 01/13] Check for null fetcher (#1728) --- .../instance/type/ConceptMapValidator.java | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/org.hl7.fhir.validation/src/main/java/org/hl7/fhir/validation/instance/type/ConceptMapValidator.java b/org.hl7.fhir.validation/src/main/java/org/hl7/fhir/validation/instance/type/ConceptMapValidator.java index 0d6892c17..b3aeb1c4c 100644 --- a/org.hl7.fhir.validation/src/main/java/org/hl7/fhir/validation/instance/type/ConceptMapValidator.java +++ b/org.hl7.fhir.validation/src/main/java/org/hl7/fhir/validation/instance/type/ConceptMapValidator.java @@ -34,9 +34,9 @@ public class ConceptMapValidator extends BaseValidator { private static final int TOO_MANY_CODES_TO_VALIDATE = 500; public static class PropertyDefinition { - private String type; - private String system; - private CodeSystem cs; + private final String type; + private final String system; + private final CodeSystem cs; protected PropertyDefinition(String type, String system, CodeSystem cs) { super(); this.type = type; @@ -94,7 +94,7 @@ public class ConceptMapValidator extends BaseValidator { public class CMCodingValidationRequest extends CodingValidationRequest { - private NodeStack stack; + private final NodeStack stack; public CMCodingValidationRequest(NodeStack stack, Coding code, ValueSet vs) { super(code, vs); @@ -106,7 +106,7 @@ public class ConceptMapValidator extends BaseValidator { } } - private List batch = new ArrayList<>(); + private final List batch = new ArrayList<>(); public ConceptMapValidator(BaseValidator parent) { super(parent); @@ -237,7 +237,7 @@ public class ConceptMapValidator extends BaseValidator { } else { warning(errors, "2023-03-05", IssueType.NOTFOUND, grp.line(), grp.col(), stack.push(e, -1, null, null).getLiteralPath(), sourceScope != null, I18nConstants.CONCEPTMAP_GROUP_SOURCE_UNKNOWN, e.getValue()); } - if (ctxt.source.version == null && ctxt.source.cs != null && !CodeSystemUtilities.isExemptFromMultipleVersionChecking(ctxt.source.url)) { + if (ctxt.source.version == null && ctxt.source.cs != null && !CodeSystemUtilities.isExemptFromMultipleVersionChecking(ctxt.source.url) && fetcher != null) { Set possibleVersions = fetcher.fetchCanonicalResourceVersions(null, valContext.getAppContext(), ctxt.source.url); warning(errors, NO_RULE_DATE, IssueType.INVALID, grp.line(), grp.col(), stack.getLiteralPath(), possibleVersions.size() <= 1, I18nConstants.TYPE_SPECIFIC_CHECKS_DT_CANONICAL_MULTIPLE_POSSIBLE_VERSIONS, ctxt.source.url, ctxt.source.cs.getVersion(), CommaSeparatedStringBuilder.join(", ", Utilities.sorted(possibleVersions))); From 385b40cd4e88cdaa552a3add12862120a1198b9b Mon Sep 17 00:00:00 2001 From: dotasek Date: Fri, 30 Aug 2024 13:36:13 -0400 Subject: [PATCH 02/13] Update staging plugin (#1730) --- org.hl7.fhir.report/pom.xml | 2 +- org.hl7.fhir.validation.cli/pom.xml | 2 +- pom.xml | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/org.hl7.fhir.report/pom.xml b/org.hl7.fhir.report/pom.xml index 14605cc43..7889e540c 100644 --- a/org.hl7.fhir.report/pom.xml +++ b/org.hl7.fhir.report/pom.xml @@ -89,7 +89,7 @@ org.sonatype.plugins nexus-staging-maven-plugin - true + true diff --git a/org.hl7.fhir.validation.cli/pom.xml b/org.hl7.fhir.validation.cli/pom.xml index e6da91b3d..f0907cd29 100644 --- a/org.hl7.fhir.validation.cli/pom.xml +++ b/org.hl7.fhir.validation.cli/pom.xml @@ -405,7 +405,7 @@ org.sonatype.plugins nexus-staging-maven-plugin - true + true diff --git a/pom.xml b/pom.xml index 23be8b3a6..645efd4c4 100644 --- a/pom.xml +++ b/pom.xml @@ -717,7 +717,7 @@ org.sonatype.plugins nexus-staging-maven-plugin - 1.6.13 + 1.7.0 true ossrh From 8e908da1aba78fa48c83c81aeb2c4de7179889ef Mon Sep 17 00:00:00 2001 From: Gjergj Sheldija Date: Tue, 3 Sep 2024 13:50:54 +0200 Subject: [PATCH 03/13] unit tests to check the concurrency bug --- .../r5/elementmodel/LanguageUtilsTest.java | 37 +++++++++++++++++++ .../languageUtils/CodeSystem-answer.json | 33 +++++++++++++++++ .../languageUtils/CodeSystem-answer.po | 37 +++++++++++++++++++ 3 files changed, 107 insertions(+) create mode 100644 org.hl7.fhir.r5/src/test/java/org/hl7/fhir/r5/elementmodel/LanguageUtilsTest.java create mode 100644 org.hl7.fhir.r5/src/test/resources/languageUtils/CodeSystem-answer.json create mode 100644 org.hl7.fhir.r5/src/test/resources/languageUtils/CodeSystem-answer.po diff --git a/org.hl7.fhir.r5/src/test/java/org/hl7/fhir/r5/elementmodel/LanguageUtilsTest.java b/org.hl7.fhir.r5/src/test/java/org/hl7/fhir/r5/elementmodel/LanguageUtilsTest.java new file mode 100644 index 000000000..58de58105 --- /dev/null +++ b/org.hl7.fhir.r5/src/test/java/org/hl7/fhir/r5/elementmodel/LanguageUtilsTest.java @@ -0,0 +1,37 @@ +package org.hl7.fhir.r5.elementmodel; + +import org.hl7.fhir.r5.context.IWorkerContext; +import org.hl7.fhir.r5.test.utils.TestingUtilities; +import org.hl7.fhir.utilities.i18n.LanguageFileProducer; +import org.hl7.fhir.utilities.i18n.PoGetTextProducer; +import org.hl7.fhir.utilities.tests.ResourceLoaderTests; +import org.junit.jupiter.api.Test; + +import java.io.InputStream; +import java.util.ArrayList; +import java.util.List; + + +class LanguageUtilsTest implements ResourceLoaderTests { + + @Test + void importFromTranslations() throws Exception { + + IWorkerContext context = TestingUtilities.getSharedWorkerContext(); + + org.hl7.fhir.r5.elementmodel.JsonParser jp = new org.hl7.fhir.r5.elementmodel.JsonParser(context); + InputStream resource = getResourceAsInputStream("languageUtils", "CodeSystem-answer.json"); + Element element = jp.parseSingle(resource, null); + + PoGetTextProducer lp = new PoGetTextProducer(); + List res = new ArrayList<>(); + res.addAll(lp.loadSource(getResourceAsInputStream("languageUtils", "CodeSystem-answer.po"))); + + LanguageUtils languageUtils = new LanguageUtils(context); + int result = languageUtils.importFromTranslations(element, res, null); + + assert result == 3; + + } + +} \ No newline at end of file diff --git a/org.hl7.fhir.r5/src/test/resources/languageUtils/CodeSystem-answer.json b/org.hl7.fhir.r5/src/test/resources/languageUtils/CodeSystem-answer.json new file mode 100644 index 000000000..550bd355c --- /dev/null +++ b/org.hl7.fhir.r5/src/test/resources/languageUtils/CodeSystem-answer.json @@ -0,0 +1,33 @@ +{ + "resourceType": "CodeSystem", + "status": "active", + "content": "complete", + "name": "BasicAnswer", + "id": "basic-answer", + "title": "Administration-Method", + "description": "Basic answers for any kind of questions.", + "url": "https://example.com/CodeSystem/basic-answer", + "concept": [ + { + "code": "ok", + "display": "OK", + "definition": "KO" + }, + { + "code": "yes", + "display": "Yes", + "definition": "seY" + }, + { + "code": "no", + "display": "No", + "definition": "oN" + } + ], + "language": "en", + "version": "0.1.0", + "date": "2024-04-07", + "publisher": "Sample", + "caseSensitive": false, + "count": 3 +} diff --git a/org.hl7.fhir.r5/src/test/resources/languageUtils/CodeSystem-answer.po b/org.hl7.fhir.r5/src/test/resources/languageUtils/CodeSystem-answer.po new file mode 100644 index 000000000..becb6026b --- /dev/null +++ b/org.hl7.fhir.r5/src/test/resources/languageUtils/CodeSystem-answer.po @@ -0,0 +1,37 @@ +# en -> it + +#: CanonicalResource.name +#. A natural language name identifying the code system. This name should be usable as an identifier for the module by machine processing applications such as code generation. +msgid "BasicAnswer" +msgstr "" + +#: CanonicalResource.title +#. A short, descriptive, user-friendly title for the code system. +msgid "Administration-Method" +msgstr "" + +#: CanonicalResource.publisher +#. The name of the organization or individual that published the code system. +msgid "Example Publisher" +msgstr "" + +#: CanonicalResource.description +#. A free text natural language description of the code system from a consumer's perspective. +msgid "Basic answers for any kind of questions." +msgstr "" + +#: CodeSystem.concept.display +#. A human readable string that is the recommended default way to present this concept to a user. +msgid "OK" +msgstr "OK" + +#: CodeSystem.concept.display +#. A human readable string that is the recommended default way to present this concept to a user. +msgid "Yes" +msgstr "Si" + +#: CodeSystem.concept.display +#. A human readable string that is the recommended default way to present this concept to a user. +msgid "No" +msgstr "No" + From 00f4f0998f914e1d7f4cc22159023dfcd2e3fc8a Mon Sep 17 00:00:00 2001 From: Grahame Grieve Date: Tue, 3 Sep 2024 21:26:17 +0800 Subject: [PATCH 04/13] Improve message for when elements are out of order --- .../hl7/fhir/r5/conformance/profile/ProfileUtilities.java | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/org.hl7.fhir.r5/src/main/java/org/hl7/fhir/r5/conformance/profile/ProfileUtilities.java b/org.hl7.fhir.r5/src/main/java/org/hl7/fhir/r5/conformance/profile/ProfileUtilities.java index 468430552..79d668b36 100644 --- a/org.hl7.fhir.r5/src/main/java/org/hl7/fhir/r5/conformance/profile/ProfileUtilities.java +++ b/org.hl7.fhir.r5/src/main/java/org/hl7/fhir/r5/conformance/profile/ProfileUtilities.java @@ -3463,6 +3463,11 @@ public class ProfileUtilities { public void sortDifferential(StructureDefinition base, StructureDefinition diff, String name, List errors, boolean errorIfChanges) throws FHIRException { + int index = 0; + for (ElementDefinition ed : diff.getDifferential().getElement()) { + ed.setUserData("ed.index", Integer.toString(index)); + index++; + } List original = new ArrayList<>(); original.addAll(diff.getDifferential().getElement()); final List diffList = diff.getDifferential().getElement(); @@ -3520,7 +3525,7 @@ public class ProfileUtilities { ElementDefinition e = diffList.get(i); ElementDefinition n = newDiff.get(i); if (!n.getPath().equals(e.getPath())) { - errors.add("The element "+e.getPath()+" is out of order (and maybe others after it)"); + errors.add("The element "+(e.hasId() ? e.getId() : e.getPath())+" @diff["+e.getUserString("ed.index")+"] is out of order (and maybe others after it)"); return; } } From 83daa93fbc68cd024eec3a98681dbb4779fd0fe3 Mon Sep 17 00:00:00 2001 From: Grahame Grieve Date: Tue, 3 Sep 2024 21:26:35 +0800 Subject: [PATCH 05/13] fix concurrent modification error processing language translations --- .../org/hl7/fhir/r5/elementmodel/LanguageUtils.java | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/org.hl7.fhir.r5/src/main/java/org/hl7/fhir/r5/elementmodel/LanguageUtils.java b/org.hl7.fhir.r5/src/main/java/org/hl7/fhir/r5/elementmodel/LanguageUtils.java index fa957c861..0e762dede 100644 --- a/org.hl7.fhir.r5/src/main/java/org/hl7/fhir/r5/elementmodel/LanguageUtils.java +++ b/org.hl7.fhir.r5/src/main/java/org/hl7/fhir/r5/elementmodel/LanguageUtils.java @@ -166,7 +166,9 @@ public class LanguageUtils { } for (TranslationUnit t : translations) { if (!usedUnits.contains(t)) { - messages.add(new ValidationMessage(Source.Publisher, IssueType.INFORMATIONAL, t.getId(), "Unused '"+t.getLanguage()+"' translation '"+t.getSrcText()+"' -> '"+t.getTgtText()+"'", IssueSeverity.INFORMATION)); + if (messages != null) { + messages.add(new ValidationMessage(Source.Publisher, IssueType.INFORMATIONAL, t.getId(), "Unused '"+t.getLanguage()+"' translation '"+t.getSrcText()+"' -> '"+t.getTgtText()+"'", IssueSeverity.INFORMATION)); + } } } return r; @@ -182,7 +184,9 @@ public class LanguageUtils { } for (TranslationUnit t : translations) { if (!usedUnits.contains(t)) { - messages.add(new ValidationMessage(Source.Publisher, IssueType.INFORMATIONAL, t.getId(), "Unused '"+t.getLanguage()+"' translation '"+t.getSrcText()+"' -> '"+t.getTgtText()+"'", IssueSeverity.INFORMATION)); + if (messages != null) { + messages.add(new ValidationMessage(Source.Publisher, IssueType.INFORMATIONAL, t.getId(), "Unused '"+t.getLanguage()+"' translation '"+t.getSrcText()+"' -> '"+t.getTgtText()+"'", IssueSeverity.INFORMATION)); + } } } return r; @@ -296,7 +300,9 @@ public class LanguageUtils { } } } - for (Element c : element.getChildren()) { + List cl = new ArrayList(); + cl.addAll(element.getChildren()); + for (Element c : cl) { if (!c.getName().equals("designation")) { t = t + importFromTranslations(element, c, translations, usedUnits); } From 7e5014c6d7b45d21466ea27d9dd24363fc9862ed Mon Sep 17 00:00:00 2001 From: Grahame Grieve Date: Tue, 3 Sep 2024 21:26:53 +0800 Subject: [PATCH 06/13] Fix problem generating value set spreadsheets --- .../spreadsheets/SpreadsheetGenerator.java | 3 ++- .../ValueSetSpreadsheetGenerator.java | 21 +++++++++++-------- 2 files changed, 14 insertions(+), 10 deletions(-) diff --git a/org.hl7.fhir.r5/src/main/java/org/hl7/fhir/r5/renderers/spreadsheets/SpreadsheetGenerator.java b/org.hl7.fhir.r5/src/main/java/org/hl7/fhir/r5/renderers/spreadsheets/SpreadsheetGenerator.java index 18a7e22cf..ab82995d8 100644 --- a/org.hl7.fhir.r5/src/main/java/org/hl7/fhir/r5/renderers/spreadsheets/SpreadsheetGenerator.java +++ b/org.hl7.fhir.r5/src/main/java/org/hl7/fhir/r5/renderers/spreadsheets/SpreadsheetGenerator.java @@ -100,7 +100,8 @@ public class SpreadsheetGenerator { if (name.length() > MAX_SENSITIVE_SHEET_NAME_LEN - 2) { name = name.substring(0, MAX_SENSITIVE_SHEET_NAME_LEN - 2); } - String s = fixSheetNameChars(name); + name = fixSheetNameChars(name); + String s = name; if (sheetNames.containsKey(s)) { int i = 1; do { diff --git a/org.hl7.fhir.r5/src/main/java/org/hl7/fhir/r5/renderers/spreadsheets/ValueSetSpreadsheetGenerator.java b/org.hl7.fhir.r5/src/main/java/org/hl7/fhir/r5/renderers/spreadsheets/ValueSetSpreadsheetGenerator.java index 106a581e2..99bd4cb68 100644 --- a/org.hl7.fhir.r5/src/main/java/org/hl7/fhir/r5/renderers/spreadsheets/ValueSetSpreadsheetGenerator.java +++ b/org.hl7.fhir.r5/src/main/java/org/hl7/fhir/r5/renderers/spreadsheets/ValueSetSpreadsheetGenerator.java @@ -19,6 +19,7 @@ import org.hl7.fhir.r5.model.ValueSet.ConceptSetFilterComponent; import org.hl7.fhir.r5.model.ValueSet.ValueSetExpansionContainsComponent; import org.hl7.fhir.r5.model.ValueSet.ValueSetExpansionParameterComponent; import org.hl7.fhir.r5.model.StructureDefinition.StructureDefinitionMappingComponent; +import org.hl7.fhir.utilities.DebugUtilities; import org.hl7.fhir.utilities.i18n.I18nConstants; public class ValueSetSpreadsheetGenerator extends CanonicalSpreadsheetGenerator { @@ -36,11 +37,12 @@ public class ValueSetSpreadsheetGenerator extends CanonicalSpreadsheetGenerator System.out.println("no valueset!"); } addValueSetMetadata(renderCanonicalResource(vs, false), vs); + int i = 0; for (ConceptSetComponent inc : vs.getCompose().getInclude()) { - genInclude(vs, inc, "Include"); + genInclude(vs, inc, "Include", i++); } for (ConceptSetComponent exc : vs.getCompose().getExclude()) { - genInclude(vs, exc, "Exclude"); + genInclude(vs, exc, "Exclude", i++); } if (vs.hasExpansion()) { if (vs.getExpansion().hasParameter()) { @@ -82,11 +84,11 @@ public class ValueSetSpreadsheetGenerator extends CanonicalSpreadsheetGenerator return value ? "" : "false"; } - private void genInclude(ValueSet vs, ConceptSetComponent inc, String mode) { + private void genInclude(ValueSet vs, ConceptSetComponent inc, String mode, int count) { if (inc.hasSystem()) { - genIncludeSystem(vs, inc, mode); + genIncludeSystem(vs, inc, mode, count); } else { - genIncludeValueSets(vs, inc, mode); + genIncludeValueSets(vs, inc, mode, count); } // String subname = inc.hasSystem() ? : "ValueSets"; // @@ -107,14 +109,15 @@ public class ValueSetSpreadsheetGenerator extends CanonicalSpreadsheetGenerator // configureSheet(sheet, sd); } - private void genIncludeValueSets(ValueSet vs, ConceptSetComponent inc, String mode) { - Sheet sheet = makeSheet(mode+" ValueSets"); + private void genIncludeValueSets(ValueSet vs, ConceptSetComponent inc, String mode, int count) { + Sheet sheet = makeSheet(mode+" ValueSet #"+count); addValueSets(sheet, inc.getValueSet()); configureSheet(sheet); } - private void genIncludeSystem(ValueSet vs, ConceptSetComponent inc, String mode) { - Sheet sheet = makeSheet(mode+" from "+dr.displaySystem(inc.getSystem())); + private void genIncludeSystem(ValueSet vs, ConceptSetComponent inc, String mode, int count) { + DebugUtilities.ln(inc.getSystem()); + Sheet sheet = makeSheet(mode+" #"+count); if (inc.hasValueSet()) { addValueSets(sheet, inc.getValueSet()); } From 63ab904401a7af0bc66e0732f80cdceea5c46752 Mon Sep 17 00:00:00 2001 From: Grahame Grieve Date: Tue, 3 Sep 2024 21:27:28 +0800 Subject: [PATCH 07/13] fix problem where profile rendering had spurious 'slices for' nodes everywhere --- .../renderers/StructureDefinitionRenderer.java | 16 +++++++++++++--- .../fhir/r5/test/NarrativeGenerationTests.java | 8 ++++---- 2 files changed, 17 insertions(+), 7 deletions(-) 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 e2276d692..bcb245cc6 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 @@ -897,7 +897,7 @@ public class StructureDefinitionRenderer extends ResourceRenderer { Row parent = null; if (child.hasSliceName()) { // ok, we're a slice - if (slicer == null || !slicer.getId().equals(child.getPath())) { + if (slicer == null || !noTail(slicer.getId()).equals(child.getPath())) { parent = gen.new Row(); String anchorE = child.getPath(); anchorE = makeAnchorUnique(anchorE); @@ -906,7 +906,7 @@ public class StructureDefinitionRenderer extends ResourceRenderer { parent.setColor(context.getProfileUtilities().getRowColor(child, isConstraintMode)); parent.setLineColor(1); parent.setIcon("icon_slice.png", context.formatPhrase(RenderingContext.TEXT_ICON_SLICE)); - parent.getCells().add(gen.new Cell(null, null, "Slices for "+ child.getName(), "", null)); + parent.getCells().add(gen.new Cell(null, null, context.formatPhrase(RenderingContext.STRUC_DEF_SLICE_FOR, child.getName()), "", null)); switch (context.getStructureMode()) { case BINDINGS: case OBLIGATIONS: @@ -947,6 +947,16 @@ public class StructureDefinitionRenderer extends ResourceRenderer { return slicingRow; } + private String noTail(String id) { + if (id.contains(".")) { + String t = id.substring(id.lastIndexOf(".")+1); + if (Utilities.isInteger(t)) { + return id.substring(0, id.lastIndexOf(".")); + } + } + return id; + } + private String makeAnchorUnique(String anchor) { if (anchors.containsKey(anchor)) { int c = anchors.get(anchor)+1; @@ -1063,7 +1073,7 @@ public class StructureDefinitionRenderer extends ResourceRenderer { hint = checkAdd(hint, !hasDef ? null : gt(element.getDefinitionElement())); } if (element.hasSlicing() && slicesExist(elements, element)) { // some elements set up slicing but don't actually slice, so we don't augment the name - sName = context.formatPhrase(RenderingContext.STRUC_DEF_SLICE_FOR, sName); + sName = context.formatPhrase(RenderingContext.STRUC_DEF_SLICE_FOR, sName); } Cell left = gen.new Cell(null, ref, sName, hint, null); row.getCells().add(left); diff --git a/org.hl7.fhir.r5/src/test/java/org/hl7/fhir/r5/test/NarrativeGenerationTests.java b/org.hl7.fhir.r5/src/test/java/org/hl7/fhir/r5/test/NarrativeGenerationTests.java index 2372a130d..cab59327e 100644 --- a/org.hl7.fhir.r5/src/test/java/org/hl7/fhir/r5/test/NarrativeGenerationTests.java +++ b/org.hl7.fhir.r5/src/test/java/org/hl7/fhir/r5/test/NarrativeGenerationTests.java @@ -84,12 +84,12 @@ public class NarrativeGenerationTests { @Override public String getLinkFor(String corePath, String typeSimple) { - throw new NotImplementedException(); + return "http://test/link"; } @Override public BindingResolution resolveBinding(StructureDefinition def, ElementDefinitionBindingComponent binding, String path) throws FHIRException { - throw new NotImplementedException(); + return new BindingResolution("test", "http://test"); } @Override @@ -102,7 +102,7 @@ public class NarrativeGenerationTests { return new BindingResolution(vs.present(), "valueset-"+vs.getIdBase()+".html"); } } - throw new NotImplementedException(); + return new BindingResolution("test", "http://test/ns"); } @Override @@ -120,7 +120,7 @@ public class NarrativeGenerationTests { @Override public String getLinkForUrl(String corePath, String s) { - throw new NotImplementedException(); + return "http://test/link/url"; } @Override From 96485e6175c951433a4308c7522997d75cc9769a Mon Sep 17 00:00:00 2001 From: Grahame Grieve Date: Tue, 3 Sep 2024 21:27:41 +0800 Subject: [PATCH 08/13] updates --- .../hl7/fhir/utilities/npm/PackageHacker.java | 103 ++++++++++-------- .../xhtml/HierarchicalTableGenerator.java | 1 - 2 files changed, 55 insertions(+), 49 deletions(-) diff --git a/org.hl7.fhir.utilities/src/main/java/org/hl7/fhir/utilities/npm/PackageHacker.java b/org.hl7.fhir.utilities/src/main/java/org/hl7/fhir/utilities/npm/PackageHacker.java index 6aba70e60..62fed54cc 100644 --- a/org.hl7.fhir.utilities/src/main/java/org/hl7/fhir/utilities/npm/PackageHacker.java +++ b/org.hl7.fhir.utilities/src/main/java/org/hl7/fhir/utilities/npm/PackageHacker.java @@ -30,55 +30,55 @@ public class PackageHacker { private static boolean useSecureReferences = false; public static void main(String[] args) throws FileNotFoundException, IOException { - new PackageHacker().massEdit(new File("/Users/grahamegrieve/web/hl7.org/fhir")); - // new PackageHacker().edit("/Users/grahamegrieve/web/hl7.org/fhir/us/vitals/2020Sep/package.tgz"); +// new PackageHacker().massEdit(new File("/Users/grahamegrieve/web/hl7.org/fhir")); + new PackageHacker().edit(args[0]); } - private void massEdit(File dir) throws IOException { - System.out.println("process "+dir.getAbsolutePath()); - for (File f : dir.listFiles()) { - if (f.isDirectory()) { - massEdit(f); - } else if (f.getName().equals("package.tgz")) { - try { - FileInputStream fs = ManagedFileAccess.inStream(f); - NpmPackage pck = NpmPackage.fromPackage(fs); - if ("fhir.core".equals(pck.getNpm().str("type"))) { - System.out.println("!!change "+f.getAbsolutePath()); - pck.getNpm().remove("type"); - pck.getNpm().set("type", "Core"); - FileOutputStream fso = ManagedFileAccess.outStream(f); - try { - pck.save(fso); - } finally { - fso.close(); - } - } - } catch (Exception e) { - System.out.println("!!Error: "+e.getMessage()); - } - } else if (f.getName().startsWith("hl7.fhir.r") && f.getName().endsWith(".examples.tgz")) { - try { - FileInputStream fs = ManagedFileAccess.inStream(f); - NpmPackage pck = NpmPackage.fromPackage(fs); - if ("fhir.examples".equals(pck.getNpm().str("type"))) { - System.out.println("!!change "+f.getAbsolutePath()); - pck.getNpm().remove("type"); - pck.getNpm().set("type", "Examples"); - FileOutputStream fso = ManagedFileAccess.outStream(f); - try { - pck.save(fso); - } finally { - fso.close(); - } - } - } catch (Exception e) { - System.out.println("!!Error: "+e.getMessage()); - } - - } - } - } +// private void massEdit(File dir) throws IOException { +// System.out.println("process "+dir.getAbsolutePath()); +// for (File f : dir.listFiles()) { +// if (f.isDirectory()) { +// massEdit(f); +// } else if (f.getName().equals("package.tgz")) { +// try { +// FileInputStream fs = ManagedFileAccess.inStream(f); +// NpmPackage pck = NpmPackage.fromPackage(fs); +// if ("fhir.core".equals(pck.getNpm().str("type"))) { +// System.out.println("!!change "+f.getAbsolutePath()); +// pck.getNpm().remove("type"); +// pck.getNpm().set("type", "Core"); +// FileOutputStream fso = ManagedFileAccess.outStream(f); +// try { +// pck.save(fso); +// } finally { +// fso.close(); +// } +// } +// } catch (Exception e) { +// System.out.println("!!Error: "+e.getMessage()); +// } +// } else if (f.getName().startsWith("hl7.fhir.r") && f.getName().endsWith(".examples.tgz")) { +// try { +// FileInputStream fs = ManagedFileAccess.inStream(f); +// NpmPackage pck = NpmPackage.fromPackage(fs); +// if ("fhir.examples".equals(pck.getNpm().str("type"))) { +// System.out.println("!!change "+f.getAbsolutePath()); +// pck.getNpm().remove("type"); +// pck.getNpm().set("type", "Examples"); +// FileOutputStream fso = ManagedFileAccess.outStream(f); +// try { +// pck.save(fso); +// } finally { +// fso.close(); +// } +// } +// } catch (Exception e) { +// System.out.println("!!Error: "+e.getMessage()); +// } +// +// } +// } +// } private void edit(String name) throws FileNotFoundException, IOException { File f = ManagedFileAccess.file(name); @@ -132,7 +132,14 @@ public class PackageHacker { private void change(JsonObject npm) throws FileNotFoundException, IOException { // fixVersions(npm, ver); npm.remove("notForPublication"); - npm.set("name", "hl7.fhir.us.vitals"); + npm.set("name", "hl7.fhir.us.core.v700"); + npm.set("version", "7.0.0"); + npm.set("canonical", "http://hl7.org/fhir/us/core/v700"); + npm.set("url", "http://hl7.org/fhir/us/core/v700"); + npm.remove("dependencies"); + JsonObject dep = new JsonObject(); + npm.add("dependencies", dep); + dep.add("hl7.fhir.us.core", "7.0.0"); } private void fixVersionInContent(Map content) { diff --git a/org.hl7.fhir.utilities/src/main/java/org/hl7/fhir/utilities/xhtml/HierarchicalTableGenerator.java b/org.hl7.fhir.utilities/src/main/java/org/hl7/fhir/utilities/xhtml/HierarchicalTableGenerator.java index 9fc5f29ff..b4cb4bc5d 100644 --- a/org.hl7.fhir.utilities/src/main/java/org/hl7/fhir/utilities/xhtml/HierarchicalTableGenerator.java +++ b/org.hl7.fhir.utilities/src/main/java/org/hl7/fhir/utilities/xhtml/HierarchicalTableGenerator.java @@ -560,7 +560,6 @@ public class HierarchicalTableGenerator { } return b.toString(); } - } public class TableModel { From 973ab9e56f9a1d6cd7e81d116feb84b25ee0ffc5 Mon Sep 17 00:00:00 2001 From: Gjergj Sheldija Date: Tue, 3 Sep 2024 15:41:58 +0200 Subject: [PATCH 09/13] possible fix --- .../fhir/r5/elementmodel/LanguageUtils.java | 5 ++- .../r5/elementmodel/LanguageUtilsTest.java | 22 ++++++++++- .../CodeSystem-answer-translated.json | 38 +++++++++++++++++++ .../languageUtils/CodeSystem-answer.json | 9 ++--- 4 files changed, 65 insertions(+), 9 deletions(-) create mode 100644 org.hl7.fhir.r5/src/test/resources/languageUtils/CodeSystem-answer-translated.json diff --git a/org.hl7.fhir.r5/src/main/java/org/hl7/fhir/r5/elementmodel/LanguageUtils.java b/org.hl7.fhir.r5/src/main/java/org/hl7/fhir/r5/elementmodel/LanguageUtils.java index fa957c861..c5b26b2db 100644 --- a/org.hl7.fhir.r5/src/main/java/org/hl7/fhir/r5/elementmodel/LanguageUtils.java +++ b/org.hl7.fhir.r5/src/main/java/org/hl7/fhir/r5/elementmodel/LanguageUtils.java @@ -296,7 +296,10 @@ public class LanguageUtils { } } } - for (Element c : element.getChildren()) { + + // Create a copy of the children collection before iterating + List childrenCopy = new ArrayList<>(element.getChildren()); + for (Element c : childrenCopy) { if (!c.getName().equals("designation")) { t = t + importFromTranslations(element, c, translations, usedUnits); } diff --git a/org.hl7.fhir.r5/src/test/java/org/hl7/fhir/r5/elementmodel/LanguageUtilsTest.java b/org.hl7.fhir.r5/src/test/java/org/hl7/fhir/r5/elementmodel/LanguageUtilsTest.java index 58de58105..631731b27 100644 --- a/org.hl7.fhir.r5/src/test/java/org/hl7/fhir/r5/elementmodel/LanguageUtilsTest.java +++ b/org.hl7.fhir.r5/src/test/java/org/hl7/fhir/r5/elementmodel/LanguageUtilsTest.java @@ -1,15 +1,20 @@ package org.hl7.fhir.r5.elementmodel; import org.hl7.fhir.r5.context.IWorkerContext; +import org.hl7.fhir.r5.formats.JsonCreatorDirect; +import org.hl7.fhir.r5.test.utils.CompareUtilities; import org.hl7.fhir.r5.test.utils.TestingUtilities; import org.hl7.fhir.utilities.i18n.LanguageFileProducer; import org.hl7.fhir.utilities.i18n.PoGetTextProducer; import org.hl7.fhir.utilities.tests.ResourceLoaderTests; +import org.hl7.fhir.utilities.validation.ValidationMessage; +import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test; -import java.io.InputStream; +import java.io.*; import java.util.ArrayList; import java.util.List; +import java.util.stream.Collectors; class LanguageUtilsTest implements ResourceLoaderTests { @@ -27,11 +32,24 @@ class LanguageUtilsTest implements ResourceLoaderTests { List res = new ArrayList<>(); res.addAll(lp.loadSource(getResourceAsInputStream("languageUtils", "CodeSystem-answer.po"))); + List lvm = new ArrayList<>(); + lvm.add(new ValidationMessage()); LanguageUtils languageUtils = new LanguageUtils(context); - int result = languageUtils.importFromTranslations(element, res, null); + int result = languageUtils.importFromTranslations(element, res, lvm); + + Writer generatedResource = new StringWriter(); + jp.compose(element, new JsonCreatorDirect(generatedResource, false, false)); assert result == 3; + InputStream translatedResource = getResourceAsInputStream("languageUtils", "CodeSystem-answer-translated.json"); + String text = new BufferedReader(new InputStreamReader(translatedResource)) + .lines() + .collect(Collectors.joining("\n")); + + String msg = CompareUtilities.checkJsonSrcIsSame("", generatedResource.toString(),text, null); + Assertions.assertNull(msg); + } } \ No newline at end of file diff --git a/org.hl7.fhir.r5/src/test/resources/languageUtils/CodeSystem-answer-translated.json b/org.hl7.fhir.r5/src/test/resources/languageUtils/CodeSystem-answer-translated.json new file mode 100644 index 000000000..06f059bde --- /dev/null +++ b/org.hl7.fhir.r5/src/test/resources/languageUtils/CodeSystem-answer-translated.json @@ -0,0 +1,38 @@ +{ + "resourceType" : "CodeSystem", + "id" : "basic-answer", + "language" : "en", + "url" : "https://example.com/CodeSystem/basic-answer", + "version" : "0.1.0", + "name" : "BasicAnswer", + "title" : "Administration-Method", + "status" : "active", + "date" : "2024-04-07", + "publisher" : "Sample", + "description" : "Basic answers for any kind of questions.", + "caseSensitive" : false, + "content" : "complete", + "count" : 3, + "concept" : [ { + "code" : "ok", + "display" : "OK", + "designation" : [ { + "language" : "it", + "value" : "OK" + } ] + }, { + "code" : "yes", + "display" : "Yes", + "designation" : [ { + "language" : "it", + "value" : "Si" + } ] + }, { + "code" : "no", + "display" : "No", + "designation" : [ { + "language" : "it", + "value" : "No" + } ] + } ] +} \ No newline at end of file diff --git a/org.hl7.fhir.r5/src/test/resources/languageUtils/CodeSystem-answer.json b/org.hl7.fhir.r5/src/test/resources/languageUtils/CodeSystem-answer.json index 550bd355c..fe6f0d690 100644 --- a/org.hl7.fhir.r5/src/test/resources/languageUtils/CodeSystem-answer.json +++ b/org.hl7.fhir.r5/src/test/resources/languageUtils/CodeSystem-answer.json @@ -10,18 +10,15 @@ "concept": [ { "code": "ok", - "display": "OK", - "definition": "KO" + "display": "OK" }, { "code": "yes", - "display": "Yes", - "definition": "seY" + "display": "Yes" }, { "code": "no", - "display": "No", - "definition": "oN" + "display": "No" } ], "language": "en", From 9c74e94e6885720b343fcd498c79465565d91999 Mon Sep 17 00:00:00 2001 From: Grahame Grieve Date: Wed, 4 Sep 2024 08:59:11 +0800 Subject: [PATCH 10/13] test case dependency --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 645efd4c4..be5e3727d 100644 --- a/pom.xml +++ b/pom.xml @@ -21,7 +21,7 @@ 1.26.0 32.0.1-jre 6.4.1 - 1.5.20 + 1.5.21-SNAPSHOT 2.17.0 5.9.2 1.8.2 From 51ad87c7151425706b7c61f7b1ed44d7dcac9b4e Mon Sep 17 00:00:00 2001 From: Gjergj Sheldija Date: Wed, 4 Sep 2024 08:16:03 +0200 Subject: [PATCH 11/13] PR comment --- .../main/java/org/hl7/fhir/r5/elementmodel/LanguageUtils.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/org.hl7.fhir.r5/src/main/java/org/hl7/fhir/r5/elementmodel/LanguageUtils.java b/org.hl7.fhir.r5/src/main/java/org/hl7/fhir/r5/elementmodel/LanguageUtils.java index c5b26b2db..383531be4 100644 --- a/org.hl7.fhir.r5/src/main/java/org/hl7/fhir/r5/elementmodel/LanguageUtils.java +++ b/org.hl7.fhir.r5/src/main/java/org/hl7/fhir/r5/elementmodel/LanguageUtils.java @@ -298,7 +298,7 @@ public class LanguageUtils { } // Create a copy of the children collection before iterating - List childrenCopy = new ArrayList<>(element.getChildren()); + List childrenCopy = List.copyOf(element.getChildren()); for (Element c : childrenCopy) { if (!c.getName().equals("designation")) { t = t + importFromTranslations(element, c, translations, usedUnits); From 515bead90d0748c516e9e02efa3af5af04ccc3f5 Mon Sep 17 00:00:00 2001 From: Grahame Grieve Date: Wed, 4 Sep 2024 21:59:01 +0800 Subject: [PATCH 12/13] compile fix --- .../ValueSetSpreadsheetGenerator.java | 8 ---- .../hl7/fhir/utilities/npm/PackageHacker.java | 41 +++++++++++-------- 2 files changed, 25 insertions(+), 24 deletions(-) diff --git a/org.hl7.fhir.r5/src/main/java/org/hl7/fhir/r5/renderers/spreadsheets/ValueSetSpreadsheetGenerator.java b/org.hl7.fhir.r5/src/main/java/org/hl7/fhir/r5/renderers/spreadsheets/ValueSetSpreadsheetGenerator.java index 99bd4cb68..86e749117 100644 --- a/org.hl7.fhir.r5/src/main/java/org/hl7/fhir/r5/renderers/spreadsheets/ValueSetSpreadsheetGenerator.java +++ b/org.hl7.fhir.r5/src/main/java/org/hl7/fhir/r5/renderers/spreadsheets/ValueSetSpreadsheetGenerator.java @@ -1,26 +1,18 @@ package org.hl7.fhir.r5.renderers.spreadsheets; -import java.io.FileOutputStream; import java.io.IOException; -import java.io.OutputStream; import java.util.List; -import org.apache.poi.ss.usermodel.Row; import org.apache.poi.ss.usermodel.Sheet; -import org.hl7.fhir.exceptions.DefinitionException; import org.hl7.fhir.r5.context.IWorkerContext; -import org.hl7.fhir.r5.context.SimpleWorkerContext; import org.hl7.fhir.r5.model.CanonicalType; -import org.hl7.fhir.r5.model.ElementDefinition; import org.hl7.fhir.r5.model.ValueSet; import org.hl7.fhir.r5.model.ValueSet.ConceptReferenceComponent; import org.hl7.fhir.r5.model.ValueSet.ConceptSetComponent; import org.hl7.fhir.r5.model.ValueSet.ConceptSetFilterComponent; import org.hl7.fhir.r5.model.ValueSet.ValueSetExpansionContainsComponent; import org.hl7.fhir.r5.model.ValueSet.ValueSetExpansionParameterComponent; -import org.hl7.fhir.r5.model.StructureDefinition.StructureDefinitionMappingComponent; import org.hl7.fhir.utilities.DebugUtilities; -import org.hl7.fhir.utilities.i18n.I18nConstants; public class ValueSetSpreadsheetGenerator extends CanonicalSpreadsheetGenerator { diff --git a/org.hl7.fhir.utilities/src/main/java/org/hl7/fhir/utilities/npm/PackageHacker.java b/org.hl7.fhir.utilities/src/main/java/org/hl7/fhir/utilities/npm/PackageHacker.java index 62fed54cc..2e9a45283 100644 --- a/org.hl7.fhir.utilities/src/main/java/org/hl7/fhir/utilities/npm/PackageHacker.java +++ b/org.hl7.fhir.utilities/src/main/java/org/hl7/fhir/utilities/npm/PackageHacker.java @@ -31,7 +31,18 @@ public class PackageHacker { public static void main(String[] args) throws FileNotFoundException, IOException { // new PackageHacker().massEdit(new File("/Users/grahamegrieve/web/hl7.org/fhir")); - new PackageHacker().edit(args[0]); + new PackageHacker().edit("/Users/grahamegrieve/web/hl7.org/fhir/6.0.0-ballot1/hl7.fhir.r6.core.tgz"); + new PackageHacker().edit("/Users/grahamegrieve/web/hl7.org/fhir/6.0.0-ballot1/hl7.fhir.r6.corexml.tgz"); + new PackageHacker().edit("/Users/grahamegrieve/web/hl7.org/fhir/6.0.0-ballot1/hl7.fhir.r6.examples.tgz"); + new PackageHacker().edit("/Users/grahamegrieve/web/hl7.org/fhir/6.0.0-ballot1/hl7.fhir.r6.expansions.tgz"); + new PackageHacker().edit("/Users/grahamegrieve/web/hl7.org/fhir/6.0.0-ballot1/hl7.fhir.r6.search.tgz"); + new PackageHacker().edit("/Users/grahamegrieve/web/hl7.org/fhir/6.0.0-ballot2/hl7.fhir.r6.core.tgz"); + new PackageHacker().edit("/Users/grahamegrieve/web/hl7.org/fhir/6.0.0-ballot2/hl7.fhir.r6.corexml.tgz"); + new PackageHacker().edit("/Users/grahamegrieve/web/hl7.org/fhir/6.0.0-ballot2/hl7.fhir.r6.examples.tgz"); + new PackageHacker().edit("/Users/grahamegrieve/web/hl7.org/fhir/6.0.0-ballot2/hl7.fhir.r6.expansions.tgz"); + new PackageHacker().edit("/Users/grahamegrieve/web/hl7.org/fhir/6.0.0-ballot2/hl7.fhir.r6.search.tgz"); + +// new PackageHacker().edit(args[0]); } // private void massEdit(File dir) throws IOException { @@ -85,6 +96,7 @@ public class PackageHacker { if (!f.exists()) throw new Error("Unable to find "+f.getAbsolutePath()); + System.out.println("Loading Package "+f.getAbsolutePath()); NpmPackage pck = null; FileInputStream fs = ManagedFileAccess.inStream(f); try { @@ -95,15 +107,15 @@ public class PackageHacker { System.out.println("Altering Package "+f.getAbsolutePath()); System.out.println(nice(pck.getNpm())); - change(pck.getNpm()); + if (change(pck.getNpm())) { System.out.println("Revised Package"); System.out.println("======================="); System.out.println(nice(pck.getNpm())); System.out.println("======================="); - System.out.print("save? y/n: "); - int r = System.in.read(); - if (r == 'y') { +// System.out.print("save? y/n: "); +// int r = System.in.read(); +// if (r == 'y') { f.renameTo(ManagedFileAccess.file(Utilities.changeFileExt(name, ".tgz.bak"))); FileOutputStream fso = ManagedFileAccess.outStream(f); try { @@ -111,7 +123,8 @@ public class PackageHacker { } finally { fso.close(); } - } +// } + } } private void fixExampleContent(Map content) { @@ -129,17 +142,13 @@ public class PackageHacker { return JsonParser.compose(json, true); } - private void change(JsonObject npm) throws FileNotFoundException, IOException { + private boolean change(JsonObject npm) throws FileNotFoundException, IOException { // fixVersions(npm, ver); - npm.remove("notForPublication"); - npm.set("name", "hl7.fhir.us.core.v700"); - npm.set("version", "7.0.0"); - npm.set("canonical", "http://hl7.org/fhir/us/core/v700"); - npm.set("url", "http://hl7.org/fhir/us/core/v700"); - npm.remove("dependencies"); - JsonObject dep = new JsonObject(); - npm.add("dependencies", dep); - dep.add("hl7.fhir.us.core", "7.0.0"); + if (npm.has("notForPublication")) { + npm.remove("notForPublication"); + return true; + } + return false; } private void fixVersionInContent(Map content) { From 4603b3ac3c18e58ce0c3109d61013afc2f13de1a Mon Sep 17 00:00:00 2001 From: Grahame Grieve Date: Wed, 4 Sep 2024 23:25:28 +0800 Subject: [PATCH 13/13] compile fix --- .../r5/renderers/spreadsheets/ValueSetSpreadsheetGenerator.java | 2 -- 1 file changed, 2 deletions(-) diff --git a/org.hl7.fhir.r5/src/main/java/org/hl7/fhir/r5/renderers/spreadsheets/ValueSetSpreadsheetGenerator.java b/org.hl7.fhir.r5/src/main/java/org/hl7/fhir/r5/renderers/spreadsheets/ValueSetSpreadsheetGenerator.java index 86e749117..942c43eb6 100644 --- a/org.hl7.fhir.r5/src/main/java/org/hl7/fhir/r5/renderers/spreadsheets/ValueSetSpreadsheetGenerator.java +++ b/org.hl7.fhir.r5/src/main/java/org/hl7/fhir/r5/renderers/spreadsheets/ValueSetSpreadsheetGenerator.java @@ -12,7 +12,6 @@ import org.hl7.fhir.r5.model.ValueSet.ConceptSetComponent; import org.hl7.fhir.r5.model.ValueSet.ConceptSetFilterComponent; import org.hl7.fhir.r5.model.ValueSet.ValueSetExpansionContainsComponent; import org.hl7.fhir.r5.model.ValueSet.ValueSetExpansionParameterComponent; -import org.hl7.fhir.utilities.DebugUtilities; public class ValueSetSpreadsheetGenerator extends CanonicalSpreadsheetGenerator { @@ -108,7 +107,6 @@ public class ValueSetSpreadsheetGenerator extends CanonicalSpreadsheetGenerator } private void genIncludeSystem(ValueSet vs, ConceptSetComponent inc, String mode, int count) { - DebugUtilities.ln(inc.getSystem()); Sheet sheet = makeSheet(mode+" #"+count); if (inc.hasValueSet()) { addValueSets(sheet, inc.getValueSet());