diff --git a/org.hl7.fhir.r4b/src/main/java/org/hl7/fhir/r4b/elementmodel/Property.java b/org.hl7.fhir.r4b/src/main/java/org/hl7/fhir/r4b/elementmodel/Property.java index dcc77636b..4eb548934 100644 --- a/org.hl7.fhir.r4b/src/main/java/org/hl7/fhir/r4b/elementmodel/Property.java +++ b/org.hl7.fhir.r4b/src/main/java/org/hl7/fhir/r4b/elementmodel/Property.java @@ -72,9 +72,9 @@ public class Property { } public String getXmlName() { - if (definition.hasExtension("http://hl7.org/fhir/StructureDefinition/elementdefinition-xml-name")) { + if (definition.hasExtension(ToolingExtensions.EXT_XML_NAME)) { return ToolingExtensions.readStringExtension(definition, - "http://hl7.org/fhir/StructureDefinition/elementdefinition-xml-name"); + ToolingExtensions.EXT_XML_NAME); } else { return getName(); } diff --git a/org.hl7.fhir.r5/src/main/java/org/hl7/fhir/r5/elementmodel/ParserBase.java b/org.hl7.fhir.r5/src/main/java/org/hl7/fhir/r5/elementmodel/ParserBase.java index 9b91cee0d..b78b5d7a5 100644 --- a/org.hl7.fhir.r5/src/main/java/org/hl7/fhir/r5/elementmodel/ParserBase.java +++ b/org.hl7.fhir.r5/src/main/java/org/hl7/fhir/r5/elementmodel/ParserBase.java @@ -145,7 +145,7 @@ public abstract class ParserBase { protected StructureDefinition getDefinition(List errors, int line, int col, String ns, String name) throws FHIRFormatError { if (logical != null) { - String expectedName = ToolingExtensions.readStringExtension(logical, "http://hl7.org/fhir/StructureDefinition/elementdefinition-xml-name"); + String expectedName = ToolingExtensions.readStringExtension(logical, ToolingExtensions.EXT_XML_NAME); if (expectedName == null) { expectedName = logical.getType(); if (Utilities.isAbsoluteUrl(expectedName)) { diff --git a/org.hl7.fhir.r5/src/main/java/org/hl7/fhir/r5/fhirpath/FHIRPathEngine.java b/org.hl7.fhir.r5/src/main/java/org/hl7/fhir/r5/fhirpath/FHIRPathEngine.java index dbc5a46ee..9dac12017 100644 --- a/org.hl7.fhir.r5/src/main/java/org/hl7/fhir/r5/fhirpath/FHIRPathEngine.java +++ b/org.hl7.fhir.r5/src/main/java/org/hl7/fhir/r5/fhirpath/FHIRPathEngine.java @@ -6017,7 +6017,7 @@ public class FHIRPathEngine { if (url.startsWith(TypeDetails.FP_NS)) { return; } else { - throw makeException(expr, I18nConstants.FHIRPATH_UNKNOWN_TYPE, url, "getChildTypesByName"); + throw makeException(expr, I18nConstants.FHIRPATH_UNKNOWN_TYPE, url, "getChildTypesByName#1"); } } List sdl = new ArrayList(); @@ -6028,14 +6028,14 @@ public class FHIRPathEngine { if (m.fixedType != null) { StructureDefinition dt = worker.fetchResource(StructureDefinition.class, ProfileUtilities.sdNs(m.fixedType, null), sd); if (dt == null) { - throw makeException(expr, I18nConstants.FHIRPATH_UNKNOWN_TYPE, ProfileUtilities.sdNs(m.fixedType, null), "getChildTypesByName"); + throw makeException(expr, I18nConstants.FHIRPATH_UNKNOWN_TYPE, ProfileUtilities.sdNs(m.fixedType, null), "getChildTypesByName#2"); } sdl.add(dt); } else for (TypeRefComponent t : m.definition.getType()) { StructureDefinition dt = worker.fetchResource(StructureDefinition.class, ProfileUtilities.sdNs(t.getCode(), null)); if (dt == null) { - throw makeException(expr, I18nConstants.FHIRPATH_UNKNOWN_TYPE, ProfileUtilities.sdNs(t.getCode(), null), "getChildTypesByName"); + throw makeException(expr, I18nConstants.FHIRPATH_UNKNOWN_TYPE, ProfileUtilities.sdNs(t.getCode(), null), "getChildTypesByName#3"); } addTypeAndDescendents(sdl, dt, cu.allStructures()); // also add any descendant types 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 4c1e93141..70d5a2f71 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 @@ -1524,6 +1524,19 @@ public class StructureDefinitionRenderer extends ResourceRenderer { c.addPiece(gen.new Piece(null, "Instances of this type are validated using an unknown approach: "+ps, null).addStyle("font-weight:bold")); } } + Extension lc = ToolingExtensions.getExtension(profile, ToolingExtensions.EXT_LOGICAL_CONTAINER); + if (lc != null && lc.hasValueUriType()) { + if (!c.getPieces().isEmpty()) { c.addPiece(gen.new Piece("br")); } + c.getPieces().add(gen.new Piece(null, translate("sd.table", "Logical Container")+": ", "The root class that contains instances of this class").addStyle("font-weight:bold")); + + String uri = lc.getValue().primitiveValue(); + StructureDefinition lct = context.getContext().fetchTypeDefinition(uri); + if (lct != null) { + c.addPiece(gen.new Piece(lct.getWebPath(), lct.present(), null)); + } else { + c.addPiece(gen.new Piece(null, uri, null)); + } + } } } if (definition != null) { @@ -3583,6 +3596,18 @@ public class StructureDefinitionRenderer extends ResourceRenderer { } else { tableRow(tbl, "Logical Model", null, strikethrough, "Instances of this logical model cannot be the target of a Reference"); } + + Extension lc = ToolingExtensions.getExtension(sd, ToolingExtensions.EXT_LOGICAL_CONTAINER); + if (lc != null && lc.hasValueUriType()) { + String uri = lc.getValue().primitiveValue(); + StructureDefinition lct = context.getContext().fetchTypeDefinition(uri); + if (lct != null) { + tableRowLink(tbl, "Logical Container", null, strikethrough, lct.present(), lct.getWebPath()); + } else { + tableRow(tbl, "Logical Container", null, strikethrough, uri); + } + } + String ps = ToolingExtensions.readStringExtension(sd, ToolingExtensions.EXT_PROFILE_STYLE); if (ps != null) { if ("cda".equals(ps)) { @@ -3984,6 +4009,17 @@ public class StructureDefinitionRenderer extends ResourceRenderer { } } + private void tableRowLink(XhtmlNode x, String name, String defRef, boolean strikethrough, String text, String link) throws IOException { + if (!Utilities.noString(text)) { + var tr = x.tr(); + if (strikethrough) { + tr.style("text-decoration: line-through"); + } + addFirstCell(name, defRef, tr); + tr.td().ah(link).tx(text); + } + } + private void addFirstCell(String name, String defRef, XhtmlNode tr) { var td = tr.td(); if (name.length() <= 16) { diff --git a/org.hl7.fhir.r5/src/main/java/org/hl7/fhir/r5/utils/ToolingExtensions.java b/org.hl7.fhir.r5/src/main/java/org/hl7/fhir/r5/utils/ToolingExtensions.java index d9bf4f934..4c3966e91 100644 --- a/org.hl7.fhir.r5/src/main/java/org/hl7/fhir/r5/utils/ToolingExtensions.java +++ b/org.hl7.fhir.r5/src/main/java/org/hl7/fhir/r5/utils/ToolingExtensions.java @@ -143,6 +143,7 @@ public class ToolingExtensions { public static final String EXT_BINDING_STYLE = "http://hl7.org/fhir/tools/StructureDefinition/elementdefinition-binding-style"; public static final String EXT_EXTENSION_STYLE = "http://hl7.org/fhir/tools/StructureDefinition/elementdefinition-extension-style"; public static final String EXT_LOGICAL_TARGET = "http://hl7.org/fhir/tools/StructureDefinition/logical-target"; + public static final String EXT_LOGICAL_CONTAINER = "http://hl7.org/fhir/tools/StructureDefinition/logical-container"; public static final String EXT_PROFILE_MAPPING = "http://hl7.org/fhir/tools/StructureDefinition/profile-mapping"; public static final String EXT_CS_ALTERNATE_USE = "http://hl7.org/fhir/StructureDefinition/alternate-code-use"; public static final String EXT_CS_ALTERNATE_STATUS = "http://hl7.org/fhir/StructureDefinition/alternate-code-status"; diff --git a/org.hl7.fhir.validation/src/main/java/org/hl7/fhir/validation/instance/InstanceValidator.java b/org.hl7.fhir.validation/src/main/java/org/hl7/fhir/validation/instance/InstanceValidator.java index 1fc43d03c..14150aaa9 100644 --- a/org.hl7.fhir.validation/src/main/java/org/hl7/fhir/validation/instance/InstanceValidator.java +++ b/org.hl7.fhir.validation/src/main/java/org/hl7/fhir/validation/instance/InstanceValidator.java @@ -7048,7 +7048,7 @@ public class InstanceValidator extends BaseValidator implements IResourceValidat return true; } if (format == FhirFormat.XML) { - String xn = ToolingExtensions.readStringExtension(defn, "http://hl7.org/fhir/StructureDefinition/elementdefinition-xml-name"); + String xn = ToolingExtensions.readStringExtension(defn, ToolingExtensions.EXT_XML_NAME); if (resourceName.equals(xn)) { return true; } diff --git a/org.hl7.fhir.validation/src/main/java/org/hl7/fhir/validation/instance/type/StructureDefinitionValidator.java b/org.hl7.fhir.validation/src/main/java/org/hl7/fhir/validation/instance/type/StructureDefinitionValidator.java index bf34be42f..f33baa616 100644 --- a/org.hl7.fhir.validation/src/main/java/org/hl7/fhir/validation/instance/type/StructureDefinitionValidator.java +++ b/org.hl7.fhir.validation/src/main/java/org/hl7/fhir/validation/instance/type/StructureDefinitionValidator.java @@ -576,6 +576,9 @@ public class StructureDefinitionValidator extends BaseValidator { StructureDefinition sd = context.fetchTypeDefinition(rootPath); if (sd != null && sd.getKind() == StructureDefinitionKind.RESOURCE) { fpe.checkOnTypes(vc, rootPath, types, fpe.parse(exp), warnings); + } else if (sd != null && sd.getKind() == StructureDefinitionKind.LOGICAL) { + String tn = ToolingExtensions.readStringExtension(sd, ToolingExtensions.EXT_LOGICAL_CONTAINER); + fpe.checkOnTypes(vc, tn == null ? rootPath : tn, types, fpe.parse(exp), warnings); } else { fpe.checkOnTypes(vc, "DomainResource", types, fpe.parse(exp), warnings); } @@ -1078,7 +1081,7 @@ public class StructureDefinitionValidator extends BaseValidator { } } } - if (ToolingExtensions.readBoolExtension(t, "http://hl7.org/fhir/tools/StructureDefinition/logical-target")) { + if (ToolingExtensions.readBoolExtension(t, ToolingExtensions.EXT_LOGICAL_TARGET)) { return true; } return false;