diff --git a/org.hl7.fhir.validation/src/main/java/org/hl7/fhir/validation/IgLoader.java b/org.hl7.fhir.validation/src/main/java/org/hl7/fhir/validation/IgLoader.java index 444e13ff6..925673c4a 100644 --- a/org.hl7.fhir.validation/src/main/java/org/hl7/fhir/validation/IgLoader.java +++ b/org.hl7.fhir.validation/src/main/java/org/hl7/fhir/validation/IgLoader.java @@ -208,6 +208,8 @@ public class IgLoader implements IValidationEngineLoader { res.setFocus(t.getValue()); if (t.getKey().endsWith(".json")) res.setCntType(Manager.FhirFormat.JSON); + else if (t.getKey().endsWith(".ndjson")) + res.setCntType(Manager.FhirFormat.NDJSON); else if (t.getKey().endsWith(".xml")) res.setCntType(Manager.FhirFormat.XML); else if (t.getKey().endsWith(".ttl")) diff --git a/org.hl7.fhir.validation/src/main/java/org/hl7/fhir/validation/instance/type/StructureMapValidator.java b/org.hl7.fhir.validation/src/main/java/org/hl7/fhir/validation/instance/type/StructureMapValidator.java index 9e02eba9c..9b9b16608 100644 --- a/org.hl7.fhir.validation/src/main/java/org/hl7/fhir/validation/instance/type/StructureMapValidator.java +++ b/org.hl7.fhir.validation/src/main/java/org/hl7/fhir/validation/instance/type/StructureMapValidator.java @@ -33,6 +33,7 @@ import org.hl7.fhir.r5.utils.structuremap.ResolvedGroup; import org.hl7.fhir.r5.utils.structuremap.StructureMapUtilities; import org.hl7.fhir.r5.utils.validation.IResourceValidator; import org.hl7.fhir.utilities.CommaSeparatedStringBuilder; +import org.hl7.fhir.utilities.DebugUtilities; import org.hl7.fhir.utilities.Utilities; import org.hl7.fhir.utilities.VersionUtilities; import org.hl7.fhir.utilities.i18n.I18nConstants; @@ -558,8 +559,12 @@ public class StructureMapValidator extends BaseValidator { private boolean validateRule(List errors, Element src, Element group, Element rule, NodeStack stack, VariableSet variables) { String name = rule.getChildValue("name"); + if (name.equals("SetComposition")) { + DebugUtilities.breakpoint(); + } boolean ok = rule(errors, "2023-03-01", IssueType.INVALID, rule.line(), rule.col(), stack.getLiteralPath(), idIsValid(name), I18nConstants.SM_NAME_INVALID, name); + DebugUtilities.ln(name+": "+variables.summary()); RuleInformation ruleInfo = new RuleInformation(); // process the sources VariableSet lvars = variables.copy(); @@ -691,7 +696,61 @@ public class StructureMapValidator extends BaseValidator { private boolean validateRuleTarget(List errors, Element src, Element group, Element rule, Element target, NodeStack stack, VariableSet variables, RuleInformation ruleInfo) { String context = target.getChildValue("context"); if (context == null) { - return true; + // this would be something like + // RNDSEntry -> create('Composition') as IPSComposition + + boolean ok = true; + + VariableDefn vn = null; + String variable = target.getChildValue("variable"); + if (variable != null) { + if (rule(errors, "2023-03-01", IssueType.INVALID, target.line(), target.col(), stack.getLiteralPath(), idIsValid(variable), I18nConstants.SM_NAME_INVALID, variable)) { + vn = variables.add(variable, "target"); // may overwrite + } else { + ok = false; + } + } + String transform = target.getChildValue("transform"); + List params = target.getChildren("parameter"); + String type = null; + switch (transform) { + case "create": + if (rule(errors, "2023-03-01", IssueType.INVALID, target.line(), target.col(), stack.getLiteralPath(), params.size() < 2, I18nConstants.SM_TARGET_TRANSFORM_PARAM_COUNT_RANGE, "create", "0", "1", params.size())) { + if (params.size() == 1) { + type = params.get(0).getChildValue("value"); + // type can be a url, a native type, or an alias + if (!Utilities.isAbsoluteUrl(type)) { + type = resolveType(type, "target", src); + if (!Utilities.isAbsoluteUrl(type)) { + StructureDefinition sdt = this.context.fetchTypeDefinition(type); + if (sdt != null) { + type = sdt.getType(); + } + } + } + warning(errors, "2023-03-01", IssueType.INVALID, target.line(), target.col(), stack.getLiteralPath(),type != null, I18nConstants.SM_TARGET_TRANSFORM_TYPE_UNPROCESSIBLE, "create"); + } else { + // maybe can guess? maybe not ... type = + } + } else { + ok = false; + } + break; + + case "uuid" : + ok = rule(errors, "2023-05-01", IssueType.INVALID, target.line(), target.col(), stack.getLiteralPath(), params.size() == 0, I18nConstants.SM_TARGET_TRANSFORM_MISSING_PARAMS, transform) && ok; + type = "string"; + break; + default: + rule(errors, "2023-03-01", IssueType.INVALID, target.line(), target.col(), stack.getLiteralPath(), false, I18nConstants.SM_TARGET_TRANSFORM_NOT_CHECKED, transform); + ok = false; + } + + if (vn != null && type != null) { + StructureDefinition sdt = this.context.fetchTypeDefinition(type); + vn.setType(ruleInfo.getMaxCount(), sdt, sdt.getSnapshot().getElementFirstRep(), null); // may overwrite + } + return ok; } boolean ok = rule(errors, "2023-03-01", IssueType.INVALID, target.line(), target.col(), stack.getLiteralPath(), idIsValid(context), I18nConstants.SM_NAME_INVALID, context) && rule(errors, "2023-03-01", IssueType.UNKNOWN, target.line(), target.col(), stack.getLiteralPath(), variables.hasVariable(context, TARGET), I18nConstants.SM_TARGET_CONTEXT_UNKNOWN, context); @@ -805,7 +864,7 @@ public class StructureMapValidator extends BaseValidator { case "append" : ok = rule(errors, "2023-05-01", IssueType.INVALID, target.line(), target.col(), stack.getLiteralPath(), params.size() > 0, I18nConstants.SM_TARGET_TRANSFORM_MISSING_PARAMS, transform) && ok; for (int i = 0; i < params.size(); i++) { - ok = checkParamExistsOrPrimitive(errors, params.get(1).getNamedChild("value", false), "cc", "parameter "+i, target, variables, stack, ok, false); + ok = checkParamExistsOrPrimitive(errors, params.get(i).getNamedChild("value", false), "cc", "parameter "+i, target, variables, stack, ok, false); } break; case "uuid" :