From 0ec2dfab78ca4029efd21f845a6488ac66bf1b0d Mon Sep 17 00:00:00 2001 From: Grahame Grieve Date: Wed, 24 May 2023 16:57:09 +1000 Subject: [PATCH] Add support for SubscriptionTopic in R4 IGs --- .../resources40_50/Resource40_50.java | 4 + .../SubscriptionTopic40_50.java | 476 ++++++++++++++++++ .../conv40_50/SubscriptionTopic40_50Test.java | 42 ++ .../r5/conformance/R5ExtensionsLoader.java | 80 ++- .../fhir/r5/context/SimpleWorkerContext.java | 3 +- .../hl7/fhir/r5/renderers/DataRenderer.java | 15 +- .../fhir/r5/renderers/RendererFactory.java | 3 + .../fhir/r5/renderers/ResourceRenderer.java | 95 ++++ .../renderers/SubscriptionTopicRenderer.java | 171 +++++++ .../hl7/fhir/utilities/xhtml/XhtmlNode.java | 4 + 10 files changed, 864 insertions(+), 29 deletions(-) create mode 100644 org.hl7.fhir.convertors/src/main/java/org/hl7/fhir/convertors/conv40_50/resources40_50/SubscriptionTopic40_50.java create mode 100644 org.hl7.fhir.convertors/src/test/java/org/hl7/fhir/convertors/conv40_50/SubscriptionTopic40_50Test.java create mode 100644 org.hl7.fhir.r5/src/main/java/org/hl7/fhir/r5/renderers/SubscriptionTopicRenderer.java diff --git a/org.hl7.fhir.convertors/src/main/java/org/hl7/fhir/convertors/conv40_50/resources40_50/Resource40_50.java b/org.hl7.fhir.convertors/src/main/java/org/hl7/fhir/convertors/conv40_50/resources40_50/Resource40_50.java index 56455fc73..f4602e4c9 100644 --- a/org.hl7.fhir.convertors/src/main/java/org/hl7/fhir/convertors/conv40_50/resources40_50/Resource40_50.java +++ b/org.hl7.fhir.convertors/src/main/java/org/hl7/fhir/convertors/conv40_50/resources40_50/Resource40_50.java @@ -59,6 +59,8 @@ public class Resource40_50 { return Requirements40_50.convertRequirements((org.hl7.fhir.r4.model.Basic) src); } else if (basic.getCode().hasCoding("http://hl7.org/fhir/fhir-types", "TestPlan")) { return TestPlan40_50.convertTestPlan((org.hl7.fhir.r4.model.Basic) src); + } else if (basic.getCode().hasCoding("http://hl7.org/fhir/fhir-types", "SubscriptionTopic")) { + return SubscriptionTopic40_50.convertSubscriptionTopic((org.hl7.fhir.r4.model.Basic) src); } else { return Basic40_50.convertBasic((org.hl7.fhir.r4.model.Basic) src); } @@ -493,6 +495,8 @@ public class Resource40_50 { return StructureDefinition40_50.convertStructureDefinition((org.hl7.fhir.r5.model.StructureDefinition) src); if (src instanceof org.hl7.fhir.r5.model.StructureMap) return StructureMap40_50.convertStructureMap((org.hl7.fhir.r5.model.StructureMap) src); + if (src instanceof org.hl7.fhir.r5.model.SubscriptionTopic) + return SubscriptionTopic40_50.convertSubscriptionTopic((org.hl7.fhir.r5.model.SubscriptionTopic) src); if (src instanceof org.hl7.fhir.r5.model.Substance) return Substance40_50.convertSubstance((org.hl7.fhir.r5.model.Substance) src); if (src instanceof org.hl7.fhir.r5.model.SubstanceNucleicAcid) diff --git a/org.hl7.fhir.convertors/src/main/java/org/hl7/fhir/convertors/conv40_50/resources40_50/SubscriptionTopic40_50.java b/org.hl7.fhir.convertors/src/main/java/org/hl7/fhir/convertors/conv40_50/resources40_50/SubscriptionTopic40_50.java new file mode 100644 index 000000000..2446c53bb --- /dev/null +++ b/org.hl7.fhir.convertors/src/main/java/org/hl7/fhir/convertors/conv40_50/resources40_50/SubscriptionTopic40_50.java @@ -0,0 +1,476 @@ +package org.hl7.fhir.convertors.conv40_50.resources40_50; + +import org.hl7.fhir.convertors.context.ConversionContext40_50; +import org.hl7.fhir.convertors.conv40_50.datatypes40_50.general40_50.CodeableConcept40_50; +import org.hl7.fhir.convertors.conv40_50.datatypes40_50.general40_50.Identifier40_50; +import org.hl7.fhir.convertors.conv40_50.datatypes40_50.metadata40_50.ContactDetail40_50; +import org.hl7.fhir.convertors.conv40_50.datatypes40_50.metadata40_50.UsageContext40_50; +import org.hl7.fhir.convertors.conv40_50.datatypes40_50.primitive40_50.Boolean40_50; +import org.hl7.fhir.convertors.conv40_50.datatypes40_50.primitive40_50.Canonical40_50; +import org.hl7.fhir.convertors.conv40_50.datatypes40_50.primitive40_50.DateTime40_50; +import org.hl7.fhir.convertors.conv40_50.datatypes40_50.primitive40_50.MarkDown40_50; +import org.hl7.fhir.convertors.conv40_50.datatypes40_50.primitive40_50.String40_50; +import org.hl7.fhir.convertors.conv40_50.datatypes40_50.primitive40_50.Uri40_50; +import org.hl7.fhir.exceptions.FHIRException; +import org.hl7.fhir.r4.model.BooleanType; +import org.hl7.fhir.r4.model.Extension; +import org.hl7.fhir.r4.model.MarkdownType; +import org.hl7.fhir.r4.model.UriType; +import org.hl7.fhir.r5.model.CanonicalType; +import org.hl7.fhir.r5.model.CodeableConcept; +import org.hl7.fhir.r5.model.ContactDetail; +import org.hl7.fhir.r5.model.Enumeration; +import org.hl7.fhir.r5.model.Enumerations.PublicationStatus; +import org.hl7.fhir.r5.model.Enumerations.SearchComparator; +import org.hl7.fhir.r5.model.Enumerations.SearchModifierCode; +import org.hl7.fhir.r5.model.StringType; +import org.hl7.fhir.r5.model.SubscriptionTopic.InteractionTrigger; +import org.hl7.fhir.r5.model.SubscriptionTopic.SubscriptionTopicCanFilterByComponent; +import org.hl7.fhir.r5.model.SubscriptionTopic.SubscriptionTopicEventTriggerComponent; +import org.hl7.fhir.r5.model.SubscriptionTopic.SubscriptionTopicNotificationShapeComponent; +import org.hl7.fhir.r5.model.SubscriptionTopic.SubscriptionTopicResourceTriggerComponent; +import org.hl7.fhir.r5.model.SubscriptionTopic.SubscriptionTopicResourceTriggerQueryCriteriaComponent; +import org.hl7.fhir.r5.model.UsageContext; + +/* + Copyright (c) 2011+, HL7, Inc. + All rights reserved. + + Redistribution and use in source and binary forms, with or without modification, + are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + * Neither the name of HL7 nor the names of its contributors may be used to + endorse or promote products derived from this software without specific + prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. + IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, + INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + POSSIBILITY OF SUCH DAMAGE. + +*/ +// Generated on Sun, Feb 24, 2019 11:37+1100 for FHIR v4.0.0 +public class SubscriptionTopic40_50 { + + public static final String URL_EXTENSION_URL = "http://hl7.org/fhir/5.0/StructureDefinition/extension-SubscriptionTopic.url"; + public static final String VERSION_EXTENSION_URL = "http://hl7.org/fhir/5.0/StructureDefinition/extension-SubscriptionTopic.version"; + public static final String NAME_EXTENSION_URL = "http://hl7.org/fhir/5.0/StructureDefinition/extension-SubscriptionTopic.name"; + public static final String TITLE_EXTENSION_URL = "http://hl7.org/fhir/5.0/StructureDefinition/extension-SubscriptionTopic.title"; + public static final String STATUS_EXTENSION_URL = "http://hl7.org/fhir/5.0/StructureDefinition/extension-SubscriptionTopic.status"; + public static final String EXPERIMENTAL_EXTENSION_URL = "http://hl7.org/fhir/5.0/StructureDefinition/extension-SubscriptionTopic.experimental"; + public static final String DATE_EXTENSION_URL = "http://hl7.org/fhir/5.0/StructureDefinition/extension-SubscriptionTopic.date"; + public static final String PUBLISHER_EXTENSION_URL = "http://hl7.org/fhir/5.0/StructureDefinition/extension-SubscriptionTopic.publisher"; + public static final String CONTACT_EXTENSION_URL = "http://hl7.org/fhir/5.0/StructureDefinition/extension-SubscriptionTopic.contact"; + public static final String DESCRIPTION_EXTENSION_URL = "http://hl7.org/fhir/5.0/StructureDefinition/extension-SubscriptionTopic.description"; + public static final String USE_CONTEXT_EXTENSION_URL = "http://hl7.org/fhir/5.0/StructureDefinition/extension-SubscriptionTopic.useContext"; + public static final String JURISDICTION_EXTENSION_URL = "http://hl7.org/fhir/5.0/StructureDefinition/extension-SubscriptionTopic.jurisdiction"; + public static final String PURPOSE_EXTENSION_URL = "http://hl7.org/fhir/5.0/StructureDefinition/extension-SubscriptionTopic.purpose"; + public static final String COPYRIGHT_EXTENSION_URL = "http://hl7.org/fhir/5.0/StructureDefinition/extension-SubscriptionTopic.copyright"; + public static final String COPYRIGHT_LABEL_EXTENSION_URL = "http://hl7.org/fhir/5.0/StructureDefinition/extension-SubscriptionTopic.copyrightLabel"; + public static final String APPROVAL_DATE_EXTENSION_URL = "http://hl7.org/fhir/5.0/StructureDefinition/extension-SubscriptionTopic.approvalDate"; + public static final String LAST_REVIEW_EXTENSION_URL = "http://hl7.org/fhir/5.0/StructureDefinition/extension-SubscriptionTopic.lastReviewDate"; + public static final String EFFECTIVE_PERIOD_EXTENSION_URL = "http://hl7.org/fhir/5.0/StructureDefinition/extension-SubscriptionTopic.effectivePeriod"; + public static final String DERIVED_FROM_EXTENSION_URL = "http://hl7.org/fhir/5.0/StructureDefinition/extension-SubscriptionTopic.derivedFrom"; + + public static final String RESOURCE_TRIGGER_EXTENSION_URL = "http://hl7.org/fhir/5.0/StructureDefinition/extension-SubscriptionTopic.resourceTrigger"; + public static final String RESOURCE_TRIGGER_DESCRIPTION_EXTENSION_URL = /*http://hl7.org/fhir/5.0/StructureDefinition/extension-SubscriptionTopic.resourceTrigger.*/"description"; + public static final String RESOURCE_TRIGGER_RESOURCE_EXTENSION_URL = /*http://hl7.org/fhir/5.0/StructureDefinition/extension-SubscriptionTopic.resourceTrigger.*/"resource"; + public static final String RESOURCE_TRIGGER_SUPPORTED_INTERACTION_EXTENSION_URL = /*http://hl7.org/fhir/5.0/StructureDefinition/extension-SubscriptionTopic.resourceTrigger.*/"supportedInteraction"; + public static final String RESOURCE_TRIGGER_QUERY_CRITERIA_EXTENSION_URL = /*http://hl7.org/fhir/5.0/StructureDefinition/extension-SubscriptionTopic.resourceTrigger.*/"queryCriteria"; + public static final String RESOURCE_TRIGGER_QUERY_CRITERIA_PREVIOUS_EXTENSION_URL = /*http://hl7.org/fhir/5.0/StructureDefinition/extension-SubscriptionTopic.resourceTrigger.queryCriteria.*/"previous"; + public static final String RESOURCE_TRIGGER_QUERY_CRITERIA_RESULT_FOR_CREATE_EXTENSION_URL = /*http://hl7.org/fhir/5.0/StructureDefinition/extension-SubscriptionTopic.resourceTrigger.queryCriteria.*/"resultForCreate"; + public static final String RESOURCE_TRIGGER_QUERY_CRITERIA_CURRENT_EXTENSION_URL = /*http://hl7.org/fhir/5.0/StructureDefinition/extension-SubscriptionTopic.resourceTrigger.queryCriteria.*/"current"; + public static final String RESOURCE_TRIGGER_QUERY_CRITERIA_RESULT_FOR_DELETE_EXTENSION_URL = /*http://hl7.org/fhir/5.0/StructureDefinition/extension-SubscriptionTopic.resourceTrigger.queryCriteria.*/"resultForDelete"; + public static final String RESOURCE_TRIGGER_QUERY_CRITERIA_REQUIRE_BOTH_EXTENSION_URL = /*http://hl7.org/fhir/5.0/StructureDefinition/extension-SubscriptionTopic.resourceTrigger.queryCriteria.*/"requireBoth"; + public static final String RESOURCE_TRIGGER_FHIRPATH_CRITERIA_EXTENSION_URL = /*http://hl7.org/fhir/5.0/StructureDefinition/extension-SubscriptionTopic.resourceTrigger.*/"fhirPathCriteria"; + + public static final String EVENT_TRIGGER_EXTENSION_URL = "http://hl7.org/fhir/5.0/StructureDefinition/extension-SubscriptionTopic.eventTrigger"; + public static final String EVENT_TRIGGER_DESCRIPTION_EXTENSION_URL = /*"http://hl7.org/fhir/5.0/StructureDefinition/extension-SubscriptionTopic.eventTrigger.*/"description"; + public static final String EVENT_TRIGGER_EVENT_EXTENSION_URL = /*"http://hl7.org/fhir/5.0/StructureDefinition/extension-SubscriptionTopic.eventTrigger.*/"event"; + public static final String EVENT_TRIGGER_RESOURCE_EXTENSION_URL = /*"http://hl7.org/fhir/5.0/StructureDefinition/extension-SubscriptionTopic.eventTrigger.*/"resource"; + + public static final String CAN_FILTER_BY_EXTENSION_URL = "http://hl7.org/fhir/5.0/StructureDefinition/extension-SubscriptionTopic.canFilterBy"; + public static final String CAN_FILTER_BY_DESCRIPTION_EXTENSION_URL = /*http://hl7.org/fhir/5.0/StructureDefinition/extension-SubscriptionTopic.canFilterBy.*/"description"; + public static final String CAN_FILTER_BY_RESOURCE_EXTENSION_URL = /*http://hl7.org/fhir/5.0/StructureDefinition/extension-SubscriptionTopic.canFilterBy.*/"resource"; + public static final String CAN_FILTER_BY_FILTER_PARMETER_EXTENSION_URL = /*http://hl7.org/fhir/5.0/StructureDefinition/extension-SubscriptionTopic.canFilterBy.*/"filterParameter"; + public static final String CAN_FILTER_BY_FILTER_DEFINITION_EXTENSION_URL = /*http://hl7.org/fhir/5.0/StructureDefinition/extension-SubscriptionTopic.canFilterBy.*/"filterDefinition"; + public static final String CAN_FILTER_BY_COMPARATOR_EXTENSION_URL = /*http://hl7.org/fhir/5.0/StructureDefinition/extension-SubscriptionTopic.canFilterBy.*/"comparator"; + public static final String CAN_FILTER_BY_MODIFIER_EXTENSION_URL = /*http://hl7.org/fhir/5.0/StructureDefinition/extension-SubscriptionTopic.canFilterBy.*/"modifier"; + + public static final String NOTIFICATION_SHAPE_EXTENSION_URL = "http://hl7.org/fhir/5.0/StructureDefinition/extension-SubscriptionTopic.notificationShape"; + public static final String NOTIFICATION_SHAPE_RESOURCE_EXTENSION_URL = /*http://hl7.org/fhir/5.0/StructureDefinition/extension-SubscriptionTopic.notificationShape.*/"resource"; + public static final String NOTIFICATION_SHAPE_INCLUDE_EXTENSION_URL = /*http://hl7.org/fhir/5.0/StructureDefinition/extension-SubscriptionTopic.notificationShape.*/"include"; + public static final String NOTIFICATION_SHAPE_REV_INCLUDE_EXTENSION_URL = /*http://hl7.org/fhir/5.0/StructureDefinition/extension-SubscriptionTopic.notificationShape.*/"revInclude"; + + + private static final String[] IGNORED_EXTENSION_URLS = new String[]{ + URL_EXTENSION_URL, + VERSION_EXTENSION_URL, + NAME_EXTENSION_URL, + TITLE_EXTENSION_URL, + STATUS_EXTENSION_URL, + EXPERIMENTAL_EXTENSION_URL, + DATE_EXTENSION_URL, + PUBLISHER_EXTENSION_URL, + CONTACT_EXTENSION_URL, + DESCRIPTION_EXTENSION_URL, + USE_CONTEXT_EXTENSION_URL, + JURISDICTION_EXTENSION_URL, + PURPOSE_EXTENSION_URL, + COPYRIGHT_EXTENSION_URL, + COPYRIGHT_LABEL_EXTENSION_URL, + RESOURCE_TRIGGER_EXTENSION_URL, + EVENT_TRIGGER_EXTENSION_URL, + CAN_FILTER_BY_EXTENSION_URL, + NOTIFICATION_SHAPE_EXTENSION_URL + }; + + public static org.hl7.fhir.r5.model.SubscriptionTopic convertSubscriptionTopic(org.hl7.fhir.r4.model.Basic src) throws FHIRException { + if (src == null) + return null; + if (!src.getCode().hasCoding("http://hl7.org/fhir/fhir-types", "SubscriptionTopic")) { + throw new FHIRException("Error in logic: this basic resource is not an SubscriptionTopic"); + } + org.hl7.fhir.r5.model.SubscriptionTopic tgt = new org.hl7.fhir.r5.model.SubscriptionTopic(); + + ConversionContext40_50.INSTANCE.getVersionConvertor_40_50().copyDomainResource(src, tgt, IGNORED_EXTENSION_URLS); + + for (org.hl7.fhir.r4.model.Identifier t : src.getIdentifier()) + tgt.addIdentifier(Identifier40_50.convertIdentifier(t)); + + if (src.hasExtension(URL_EXTENSION_URL)) { + tgt.setUrlElement(Uri40_50.convertUri((org.hl7.fhir.r4.model.UriType) src.getExtensionByUrl(URL_EXTENSION_URL).getValue())); + } + if (src.hasExtension(VERSION_EXTENSION_URL)) { + tgt.setVersionElement(String40_50.convertString((org.hl7.fhir.r4.model.StringType) src.getExtensionByUrl(VERSION_EXTENSION_URL).getValue())); + } + if (src.hasExtension(NAME_EXTENSION_URL)) { + tgt.setNameElement(String40_50.convertString((org.hl7.fhir.r4.model.StringType) src.getExtensionByUrl(NAME_EXTENSION_URL).getValue())); + } + if (src.hasExtension(TITLE_EXTENSION_URL)) { + tgt.setTitleElement(String40_50.convertString((org.hl7.fhir.r4.model.StringType) src.getExtensionByUrl(TITLE_EXTENSION_URL).getValue())); + } + if (src.hasExtension(STATUS_EXTENSION_URL)) { + tgt.setStatus(PublicationStatus.fromCode(src.getExtensionByUrl(STATUS_EXTENSION_URL).getValue().primitiveValue())); + } + if (src.hasExtension(EXPERIMENTAL_EXTENSION_URL)) { + tgt.setExperimentalElement(Boolean40_50.convertBoolean((org.hl7.fhir.r4.model.BooleanType) src.getExtensionByUrl(EXPERIMENTAL_EXTENSION_URL).getValue())); + } + if (src.hasExtension(DATE_EXTENSION_URL)) { + tgt.setDateElement(DateTime40_50.convertDateTime((org.hl7.fhir.r4.model.DateTimeType) src.getExtensionByUrl(DATE_EXTENSION_URL).getValue())); + } + if (src.hasExtension(PUBLISHER_EXTENSION_URL)) { + tgt.setPublisherElement(String40_50.convertString((org.hl7.fhir.r4.model.StringType) src.getExtensionByUrl(PUBLISHER_EXTENSION_URL).getValue())); + } + for (org.hl7.fhir.r4.model.Extension ext : src.getExtensionsByUrl(CONTACT_EXTENSION_URL)) { + tgt.addContact(ContactDetail40_50.convertContactDetail((org.hl7.fhir.r4.model.ContactDetail) ext.getValue())); + } + if (src.hasExtension(DESCRIPTION_EXTENSION_URL)) { + tgt.setDescriptionElement(MarkDown40_50.convertMarkdown((org.hl7.fhir.r4.model.MarkdownType) src.getExtensionByUrl(DESCRIPTION_EXTENSION_URL).getValue())); + } + for (org.hl7.fhir.r4.model.Extension ext : src.getExtensionsByUrl(USE_CONTEXT_EXTENSION_URL)) { + tgt.addUseContext(UsageContext40_50.convertUsageContext((org.hl7.fhir.r4.model.UsageContext) ext.getValue())); + } + for (org.hl7.fhir.r4.model.Extension ext : src.getExtensionsByUrl(JURISDICTION_EXTENSION_URL)) { + tgt.addJurisdiction(CodeableConcept40_50.convertCodeableConcept((org.hl7.fhir.r4.model.CodeableConcept) ext.getValue())); + } + if (src.hasExtension(PURPOSE_EXTENSION_URL)) { + tgt.setPurposeElement(MarkDown40_50.convertMarkdown((org.hl7.fhir.r4.model.MarkdownType) src.getExtensionByUrl(PURPOSE_EXTENSION_URL).getValue())); + } + if (src.hasExtension(COPYRIGHT_EXTENSION_URL)) { + tgt.setCopyrightElement(MarkDown40_50.convertMarkdown((org.hl7.fhir.r4.model.MarkdownType) src.getExtensionByUrl(COPYRIGHT_EXTENSION_URL).getValue())); + } + if (src.hasExtension(COPYRIGHT_LABEL_EXTENSION_URL)) { + tgt.setCopyrightLabelElement(String40_50.convertString((org.hl7.fhir.r4.model.StringType) src.getExtensionByUrl(COPYRIGHT_LABEL_EXTENSION_URL).getValue())); + } + for (org.hl7.fhir.r4.model.Extension ext : src.getExtensionsByUrl(DERIVED_FROM_EXTENSION_URL)) { + tgt.getDerivedFrom().add(Canonical40_50.convertCanonical((org.hl7.fhir.r4.model.CanonicalType) ext.getValue())); + } + + for (org.hl7.fhir.r4.model.Extension ext : src.getExtensionsByUrl(RESOURCE_TRIGGER_EXTENSION_URL)) { + convertSubscriptionResourceTrigger(ext, tgt.addResourceTrigger()); + } + for (org.hl7.fhir.r4.model.Extension ext : src.getExtensionsByUrl(EVENT_TRIGGER_EXTENSION_URL)) { + convertSubscriptionEventTrigger(ext, tgt.addEventTrigger()); + } + for (org.hl7.fhir.r4.model.Extension ext : src.getExtensionsByUrl(CAN_FILTER_BY_EXTENSION_URL)) { + convertSubscriptionCanFilterBy(ext, tgt.addCanFilterBy()); + } + for (org.hl7.fhir.r4.model.Extension ext : src.getExtensionsByUrl(NOTIFICATION_SHAPE_EXTENSION_URL)) { + convertSubscriptionNotificationShape(ext, tgt.addNotificationShape()); + } + + return tgt; + } + + + public static org.hl7.fhir.r4.model.Basic convertSubscriptionTopic(org.hl7.fhir.r5.model.SubscriptionTopic src) throws FHIRException { + if (src == null) + return null; + org.hl7.fhir.r4.model.Basic tgt = new org.hl7.fhir.r4.model.Basic(); + ConversionContext40_50.INSTANCE.getVersionConvertor_40_50().copyDomainResource(src, tgt); + tgt.getCode().getCodingFirstRep().setSystem("http://hl7.org/fhir/fhir-types").setCode("SubscriptionTopic"); // note use of R5 type system + + for (org.hl7.fhir.r5.model.Identifier t : src.getIdentifier()) + tgt.addIdentifier(Identifier40_50.convertIdentifier(t)); + if (src.hasUrl()) { + tgt.addExtension(URL_EXTENSION_URL, Uri40_50.convertUri(src.getUrlElement())); + } + if (src.hasVersion()) { + tgt.addExtension(VERSION_EXTENSION_URL, String40_50.convertString(src.getVersionElement())); + } + if (src.hasName()) { + tgt.addExtension(NAME_EXTENSION_URL, String40_50.convertString(src.getNameElement())); + } + if (src.hasTitle()) { + tgt.addExtension(TITLE_EXTENSION_URL, String40_50.convertString(src.getTitleElement())); + } + if (src.hasStatus()) { + tgt.addExtension(STATUS_EXTENSION_URL, new org.hl7.fhir.r4.model.CodeType(src.getStatus().toCode())); + } + if (src.hasExperimental()) { + tgt.addExtension(EXPERIMENTAL_EXTENSION_URL, Boolean40_50.convertBoolean(src.getExperimentalElement())); + } + if (src.hasDate()) { + tgt.addExtension(DATE_EXTENSION_URL, DateTime40_50.convertDateTime(src.getDateElement())); + } + if (src.hasPublisher()) { + tgt.addExtension(PUBLISHER_EXTENSION_URL, String40_50.convertString(src.getPublisherElement())); + } + for (ContactDetail cd : src.getContact()) { + tgt.addExtension(CONTACT_EXTENSION_URL, ContactDetail40_50.convertContactDetail(cd)); + } + if (src.hasDescription()) { + tgt.addExtension(DESCRIPTION_EXTENSION_URL, MarkDown40_50.convertMarkdown(src.getDescriptionElement())); + } + for (UsageContext cd : src.getUseContext()) { + tgt.addExtension(USE_CONTEXT_EXTENSION_URL, UsageContext40_50.convertUsageContext(cd)); + } + for (CodeableConcept cd : src.getJurisdiction()) { + tgt.addExtension(JURISDICTION_EXTENSION_URL, CodeableConcept40_50.convertCodeableConcept(cd)); + } + if (src.hasPurpose()) { + tgt.addExtension(PURPOSE_EXTENSION_URL, MarkDown40_50.convertMarkdown(src.getPurposeElement())); + } + if (src.hasCopyright()) { + tgt.addExtension(COPYRIGHT_EXTENSION_URL, MarkDown40_50.convertMarkdown(src.getCopyrightElement())); + } + if (src.hasCopyrightLabel()) { + tgt.addExtension(COPYRIGHT_LABEL_EXTENSION_URL, String40_50.convertString(src.getCopyrightLabelElement())); + } + for (CanonicalType ref : src.getDerivedFrom()) { + tgt.addExtension(DERIVED_FROM_EXTENSION_URL, Canonical40_50.convertCanonical(ref)); + } + + for (SubscriptionTopicResourceTriggerComponent ref : src.getResourceTrigger()) { + org.hl7.fhir.r4.model.Extension tgte = new org.hl7.fhir.r4.model.Extension(RESOURCE_TRIGGER_EXTENSION_URL); + tgt.addExtension(tgte); + convertSubscriptionResourceTrigger(ref, tgte); + } + for (SubscriptionTopicEventTriggerComponent ref : src.getEventTrigger()) { + org.hl7.fhir.r4.model.Extension tgte = new org.hl7.fhir.r4.model.Extension(EVENT_TRIGGER_EXTENSION_URL); + tgt.addExtension(tgte); + convertSubscriptionEventTrigger(ref, tgte); + } + for (SubscriptionTopicCanFilterByComponent ref : src.getCanFilterBy()) { + org.hl7.fhir.r4.model.Extension tgte = new org.hl7.fhir.r4.model.Extension(CAN_FILTER_BY_EXTENSION_URL); + tgt.addExtension(tgte); + convertSubscriptionCanFilterBy(ref, tgte); + } + for (SubscriptionTopicNotificationShapeComponent ref : src.getNotificationShape()) { + org.hl7.fhir.r4.model.Extension tgte = new org.hl7.fhir.r4.model.Extension(NOTIFICATION_SHAPE_EXTENSION_URL); + tgt.addExtension(tgte); + convertSubscriptionNotificationShape(ref, tgte); + } + + return tgt; + } + + private static void convertSubscriptionResourceTrigger(SubscriptionTopicResourceTriggerComponent src, Extension tgt) { + ConversionContext40_50.INSTANCE.getVersionConvertor_40_50().copyElement(src, tgt); + if (src.hasDescription()) { + tgt.addExtension(RESOURCE_TRIGGER_DESCRIPTION_EXTENSION_URL, MarkDown40_50.convertMarkdown(src.getDescriptionElement())); + } + if (src.hasResource()) { + tgt.addExtension(RESOURCE_TRIGGER_RESOURCE_EXTENSION_URL, Uri40_50.convertUri(src.getResourceElement())); + } + for (Enumeration t : src.getSupportedInteraction()) { + tgt.addExtension(RESOURCE_TRIGGER_SUPPORTED_INTERACTION_EXTENSION_URL, new org.hl7.fhir.r4.model.CodeType(t.getCode())); + } + if (src.hasQueryCriteria()) { + Extension tgtQF = new Extension(RESOURCE_TRIGGER_QUERY_CRITERIA_EXTENSION_URL); + tgt.addExtension(tgtQF); + if (src.getQueryCriteria().hasPrevious()) { + tgtQF.addExtension(RESOURCE_TRIGGER_QUERY_CRITERIA_PREVIOUS_EXTENSION_URL, String40_50.convertString(src.getQueryCriteria().getPreviousElement())); + } + if (src.getQueryCriteria().hasResultForCreate()) { + tgtQF.addExtension(RESOURCE_TRIGGER_QUERY_CRITERIA_RESULT_FOR_CREATE_EXTENSION_URL, new org.hl7.fhir.r4.model.CodeType(src.getQueryCriteria().getResultForCreate().toCode())); + } + if (src.getQueryCriteria().hasCurrent()) { + tgtQF.addExtension(RESOURCE_TRIGGER_QUERY_CRITERIA_CURRENT_EXTENSION_URL, String40_50.convertString(src.getQueryCriteria().getCurrentElement())); + } + if (src.getQueryCriteria().hasResultForDelete()) { + tgtQF.addExtension(RESOURCE_TRIGGER_QUERY_CRITERIA_RESULT_FOR_DELETE_EXTENSION_URL, new org.hl7.fhir.r4.model.CodeType(src.getQueryCriteria().getResultForDelete().toCode())); + } + if (src.getQueryCriteria().hasRequireBoth()) { + tgtQF.addExtension(RESOURCE_TRIGGER_QUERY_CRITERIA_REQUIRE_BOTH_EXTENSION_URL, Boolean40_50.convertBoolean(src.getQueryCriteria().getRequireBothElement())); + } + } + if (src.hasFhirPathCriteria()) { + tgt.addExtension(RESOURCE_TRIGGER_FHIRPATH_CRITERIA_EXTENSION_URL, String40_50.convertString(src.getFhirPathCriteriaElement())); + } + } + + private static void convertSubscriptionResourceTrigger(Extension src, SubscriptionTopicResourceTriggerComponent tgt) { + ConversionContext40_50.INSTANCE.getVersionConvertor_40_50().copyElement(src, tgt, + RESOURCE_TRIGGER_DESCRIPTION_EXTENSION_URL, RESOURCE_TRIGGER_RESOURCE_EXTENSION_URL, RESOURCE_TRIGGER_QUERY_CRITERIA_EXTENSION_URL, + RESOURCE_TRIGGER_SUPPORTED_INTERACTION_EXTENSION_URL, RESOURCE_TRIGGER_FHIRPATH_CRITERIA_EXTENSION_URL); + if (src.hasExtension(RESOURCE_TRIGGER_DESCRIPTION_EXTENSION_URL)) { + tgt.setDescriptionElement(MarkDown40_50.convertMarkdown((MarkdownType) src.getExtensionByUrl(RESOURCE_TRIGGER_DESCRIPTION_EXTENSION_URL).getValue())); + } + if (src.hasExtension(RESOURCE_TRIGGER_RESOURCE_EXTENSION_URL)) { + tgt.setResourceElement(Uri40_50.convertUri((UriType) src.getExtensionByUrl(RESOURCE_TRIGGER_RESOURCE_EXTENSION_URL).getValue())); + } + for (Extension ext : src.getExtensionsByUrl(RESOURCE_TRIGGER_SUPPORTED_INTERACTION_EXTENSION_URL)) { + tgt.addSupportedInteractionElement().setValueAsString(ext.getValue().primitiveValue()); + } + if (src.hasExtension(RESOURCE_TRIGGER_QUERY_CRITERIA_EXTENSION_URL)) { + Extension srcQF = src.getExtensionByUrl(RESOURCE_TRIGGER_QUERY_CRITERIA_EXTENSION_URL); + SubscriptionTopicResourceTriggerQueryCriteriaComponent tgtQF = tgt.getQueryCriteria(); + if (srcQF.hasExtension(RESOURCE_TRIGGER_QUERY_CRITERIA_PREVIOUS_EXTENSION_URL)) { + tgtQF.setPreviousElement(String40_50.convertString((org.hl7.fhir.r4.model.StringType) srcQF.getExtensionByUrl(RESOURCE_TRIGGER_QUERY_CRITERIA_PREVIOUS_EXTENSION_URL).getValue())); + } + if (srcQF.hasExtension(RESOURCE_TRIGGER_QUERY_CRITERIA_RESULT_FOR_CREATE_EXTENSION_URL)) { + tgtQF.getResultForCreateElement().setValueAsString(srcQF.getExtensionByUrl(RESOURCE_TRIGGER_QUERY_CRITERIA_RESULT_FOR_CREATE_EXTENSION_URL).getValue().primitiveValue()); + } + if (srcQF.hasExtension(RESOURCE_TRIGGER_QUERY_CRITERIA_CURRENT_EXTENSION_URL)) { + tgtQF.setCurrentElement(String40_50.convertString((org.hl7.fhir.r4.model.StringType) srcQF.getExtensionByUrl(RESOURCE_TRIGGER_QUERY_CRITERIA_CURRENT_EXTENSION_URL).getValue())); + } + if (srcQF.hasExtension(RESOURCE_TRIGGER_QUERY_CRITERIA_RESULT_FOR_DELETE_EXTENSION_URL)) { + tgtQF.getResultForDeleteElement().setValueAsString(srcQF.getExtensionByUrl(RESOURCE_TRIGGER_QUERY_CRITERIA_RESULT_FOR_DELETE_EXTENSION_URL).getValue().primitiveValue()); + } + if (srcQF.hasExtension(RESOURCE_TRIGGER_QUERY_CRITERIA_REQUIRE_BOTH_EXTENSION_URL)) { + tgtQF.setRequireBothElement(Boolean40_50.convertBoolean((BooleanType) srcQF.getExtensionByUrl(RESOURCE_TRIGGER_QUERY_CRITERIA_REQUIRE_BOTH_EXTENSION_URL).getValue())); + } + } + if (src.hasExtension(RESOURCE_TRIGGER_FHIRPATH_CRITERIA_EXTENSION_URL)) { + tgt.setFhirPathCriteriaElement(String40_50.convertString((org.hl7.fhir.r4.model.StringType) src.getExtensionByUrl(RESOURCE_TRIGGER_FHIRPATH_CRITERIA_EXTENSION_URL).getValue())); + } + } + + private static void convertSubscriptionEventTrigger(SubscriptionTopicEventTriggerComponent src, Extension tgt) { + ConversionContext40_50.INSTANCE.getVersionConvertor_40_50().copyElement(src, tgt); + if (src.hasDescription()) { + tgt.addExtension(EVENT_TRIGGER_DESCRIPTION_EXTENSION_URL, MarkDown40_50.convertMarkdown(src.getDescriptionElement())); + } + if (src.hasResource()) { + tgt.addExtension(EVENT_TRIGGER_RESOURCE_EXTENSION_URL, Uri40_50.convertUri(src.getResourceElement())); + } + if (src.hasEvent()) { + tgt.addExtension(EVENT_TRIGGER_EVENT_EXTENSION_URL, CodeableConcept40_50.convertCodeableConcept(src.getEvent())); + } + } + + private static void convertSubscriptionEventTrigger(Extension src, SubscriptionTopicEventTriggerComponent tgt) { + ConversionContext40_50.INSTANCE.getVersionConvertor_40_50().copyElement(src, tgt, EVENT_TRIGGER_DESCRIPTION_EXTENSION_URL, EVENT_TRIGGER_RESOURCE_EXTENSION_URL, EVENT_TRIGGER_EVENT_EXTENSION_URL); + if (src.hasExtension(EVENT_TRIGGER_DESCRIPTION_EXTENSION_URL)) { + tgt.setDescriptionElement(MarkDown40_50.convertMarkdown((MarkdownType) src.getExtensionByUrl(EVENT_TRIGGER_DESCRIPTION_EXTENSION_URL).getValue())); + } + if (src.hasExtension(EVENT_TRIGGER_RESOURCE_EXTENSION_URL)) { + tgt.setResourceElement(Uri40_50.convertUri((UriType) src.getExtensionByUrl(EVENT_TRIGGER_RESOURCE_EXTENSION_URL).getValue())); + } + if (src.hasExtension(EVENT_TRIGGER_EVENT_EXTENSION_URL)) { + tgt.setEvent(CodeableConcept40_50.convertCodeableConcept((org.hl7.fhir.r4.model.CodeableConcept) src.getExtensionByUrl(EVENT_TRIGGER_EVENT_EXTENSION_URL).getValue())); + } + } + + private static void convertSubscriptionCanFilterBy(SubscriptionTopicCanFilterByComponent src, Extension tgt) { + ConversionContext40_50.INSTANCE.getVersionConvertor_40_50().copyElement(src, tgt); + if (src.hasDescription()) { + tgt.addExtension(CAN_FILTER_BY_DESCRIPTION_EXTENSION_URL, MarkDown40_50.convertMarkdown(src.getDescriptionElement())); + } + if (src.hasResource()) { + tgt.addExtension(CAN_FILTER_BY_RESOURCE_EXTENSION_URL, Uri40_50.convertUri(src.getResourceElement())); + } + if (src.hasFilterParameter()) { + tgt.addExtension(CAN_FILTER_BY_FILTER_PARMETER_EXTENSION_URL, String40_50.convertString(src.getFilterParameterElement())); + } + if (src.hasFilterDefinition()) { + tgt.addExtension(CAN_FILTER_BY_FILTER_DEFINITION_EXTENSION_URL, Uri40_50.convertUri(src.getFilterDefinitionElement())); + } + + for (Enumeration t : src.getComparator()) { + tgt.addExtension(CAN_FILTER_BY_COMPARATOR_EXTENSION_URL, new org.hl7.fhir.r4.model.CodeType(t.getCode())); + } + for (Enumeration t : src.getModifier()) { + tgt.addExtension(CAN_FILTER_BY_MODIFIER_EXTENSION_URL, new org.hl7.fhir.r4.model.CodeType(t.getCode())); + } + } + + private static void convertSubscriptionCanFilterBy(Extension src, SubscriptionTopicCanFilterByComponent tgt) { + ConversionContext40_50.INSTANCE.getVersionConvertor_40_50().copyElement(src, tgt, + CAN_FILTER_BY_DESCRIPTION_EXTENSION_URL, CAN_FILTER_BY_RESOURCE_EXTENSION_URL, CAN_FILTER_BY_FILTER_PARMETER_EXTENSION_URL, + CAN_FILTER_BY_FILTER_DEFINITION_EXTENSION_URL, CAN_FILTER_BY_COMPARATOR_EXTENSION_URL, CAN_FILTER_BY_MODIFIER_EXTENSION_URL); + + if (src.hasExtension(CAN_FILTER_BY_DESCRIPTION_EXTENSION_URL)) { + tgt.setDescriptionElement(MarkDown40_50.convertMarkdown((MarkdownType) src.getExtensionByUrl(CAN_FILTER_BY_DESCRIPTION_EXTENSION_URL).getValue())); + } + if (src.hasExtension(CAN_FILTER_BY_RESOURCE_EXTENSION_URL)) { + tgt.setResourceElement(Uri40_50.convertUri((UriType) src.getExtensionByUrl(CAN_FILTER_BY_RESOURCE_EXTENSION_URL).getValue())); + } + if (src.hasExtension(CAN_FILTER_BY_FILTER_PARMETER_EXTENSION_URL)) { + tgt.setFilterParameterElement(String40_50.convertString((org.hl7.fhir.r4.model.StringType) src.getExtensionByUrl(CAN_FILTER_BY_FILTER_PARMETER_EXTENSION_URL).getValue())); + } + if (src.hasExtension(CAN_FILTER_BY_FILTER_DEFINITION_EXTENSION_URL)) { + tgt.setFilterDefinitionElement(Uri40_50.convertUri((UriType) src.getExtensionByUrl(CAN_FILTER_BY_FILTER_DEFINITION_EXTENSION_URL).getValue())); + } + + for (Extension ext : src.getExtensionsByUrl(CAN_FILTER_BY_COMPARATOR_EXTENSION_URL)) { + tgt.addComparatorElement().setValueAsString(ext.getValue().primitiveValue()); + } + for (Extension ext : src.getExtensionsByUrl(CAN_FILTER_BY_MODIFIER_EXTENSION_URL)) { + tgt.addModifierElement().setValueAsString(ext.getValue().primitiveValue()); + } + } + + + private static void convertSubscriptionNotificationShape(SubscriptionTopicNotificationShapeComponent src, Extension tgt) { + ConversionContext40_50.INSTANCE.getVersionConvertor_40_50().copyElement(src, tgt); + if (src.hasResource()) { + tgt.addExtension(NOTIFICATION_SHAPE_RESOURCE_EXTENSION_URL, Uri40_50.convertUri(src.getResourceElement())); + } + + for (StringType t : src.getInclude()) { + tgt.addExtension(NOTIFICATION_SHAPE_INCLUDE_EXTENSION_URL, String40_50.convertString(t)); + } + for (StringType t : src.getRevInclude()) { + tgt.addExtension(NOTIFICATION_SHAPE_REV_INCLUDE_EXTENSION_URL, String40_50.convertString(t)); + } + } + + + private static void convertSubscriptionNotificationShape(Extension src, SubscriptionTopicNotificationShapeComponent tgt) { + ConversionContext40_50.INSTANCE.getVersionConvertor_40_50().copyElement(src, tgt, NOTIFICATION_SHAPE_RESOURCE_EXTENSION_URL, NOTIFICATION_SHAPE_INCLUDE_EXTENSION_URL, NOTIFICATION_SHAPE_REV_INCLUDE_EXTENSION_URL); + if (src.hasExtension(NOTIFICATION_SHAPE_RESOURCE_EXTENSION_URL)) { + tgt.setResourceElement(Uri40_50.convertUri((UriType) src.getExtensionByUrl(NOTIFICATION_SHAPE_RESOURCE_EXTENSION_URL).getValue())); + } + for (Extension ext : src.getExtensionsByUrl(NOTIFICATION_SHAPE_INCLUDE_EXTENSION_URL)) { + tgt.addIncludeElement().setValueAsString(ext.getValue().primitiveValue()); + } + for (Extension ext : src.getExtensionsByUrl(NOTIFICATION_SHAPE_REV_INCLUDE_EXTENSION_URL)) { + tgt.addRevIncludeElement().setValueAsString(ext.getValue().primitiveValue()); + } + } + +} \ No newline at end of file diff --git a/org.hl7.fhir.convertors/src/test/java/org/hl7/fhir/convertors/conv40_50/SubscriptionTopic40_50Test.java b/org.hl7.fhir.convertors/src/test/java/org/hl7/fhir/convertors/conv40_50/SubscriptionTopic40_50Test.java new file mode 100644 index 000000000..3714bb9b4 --- /dev/null +++ b/org.hl7.fhir.convertors/src/test/java/org/hl7/fhir/convertors/conv40_50/SubscriptionTopic40_50Test.java @@ -0,0 +1,42 @@ +package org.hl7.fhir.convertors.conv40_50; + +import static org.junit.jupiter.api.Assertions.assertTrue; + +import java.io.FileOutputStream; +import java.io.ByteArrayInputStream; +import java.io.ByteArrayOutputStream; +import java.io.IOException; +import java.io.InputStream; + +import org.hl7.fhir.convertors.factory.VersionConvertorFactory_40_50; +import org.hl7.fhir.r5.formats.IParser.OutputStyle; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; + +public class SubscriptionTopic40_50Test { + + + @Test + @DisplayName("Test r5 -> r4 SubscriptionTopic conversion.") + public void testR5_R4() throws IOException { + InputStream r5_input = this.getClass().getResourceAsStream("/subscription_topic_50.json"); + + org.hl7.fhir.r5.model.SubscriptionTopic r5_actual = (org.hl7.fhir.r5.model.SubscriptionTopic) new org.hl7.fhir.r5.formats.JsonParser().parse(r5_input); + org.hl7.fhir.r4.model.Resource r4_conv = VersionConvertorFactory_40_50.convertResource(r5_actual); + + org.hl7.fhir.r4.formats.XmlParser r4_parser = new org.hl7.fhir.r4.formats.XmlParser(); + + ByteArrayOutputStream stream = new ByteArrayOutputStream(); + r4_parser.compose(stream, r4_conv); + + org.hl7.fhir.r4.model.Resource r4_streamed = (org.hl7.fhir.r4.model.Basic) new org.hl7.fhir.r4.formats.XmlParser().parse(new ByteArrayInputStream(stream.toByteArray())); + org.hl7.fhir.r5.model.Resource r5_conv = VersionConvertorFactory_40_50.convertResource(r4_streamed); + + org.hl7.fhir.r5.formats.JsonParser r5_parser = new org.hl7.fhir.r5.formats.JsonParser(); + r5_parser.setOutputStyle(OutputStyle.PRETTY).compose(new FileOutputStream("/tmp/source.json"), r5_actual); + r5_parser.setOutputStyle(OutputStyle.PRETTY).compose(new FileOutputStream("/tmp/output.json"), r5_conv); + + assertTrue(r5_actual.equalsDeep(r5_conv), "should be the same"); + } + +} diff --git a/org.hl7.fhir.r5/src/main/java/org/hl7/fhir/r5/conformance/R5ExtensionsLoader.java b/org.hl7.fhir.r5/src/main/java/org/hl7/fhir/r5/conformance/R5ExtensionsLoader.java index 45b098321..c44cd301f 100644 --- a/org.hl7.fhir.r5/src/main/java/org/hl7/fhir/r5/conformance/R5ExtensionsLoader.java +++ b/org.hl7.fhir.r5/src/main/java/org/hl7/fhir/r5/conformance/R5ExtensionsLoader.java @@ -62,7 +62,6 @@ public class R5ExtensionsLoader { private BasePackageCacheManager pcm; private int count; private NpmPackage pckCore; - private NpmPackage pckExt; private Map> valueSets; private Map> codeSystems; private List> structures; @@ -82,8 +81,6 @@ public class R5ExtensionsLoader { public void load() throws FHIRException, IOException { pckCore = pcm.loadPackage("hl7.fhir.r5.core", "5.0.0"); loadDetails(pckCore); - pckExt = pcm.loadPackage("hl7.fhir.uv.extensions", "1.0.0"); - loadDetails(pckExt); } private void loadDetails(NpmPackage pck) throws IOException { @@ -103,35 +100,71 @@ public class R5ExtensionsLoader { } } - public void loadR5Extensions() throws FHIRException, IOException { - count = 0; - List typeNames = new ContextUtilities(context).getTypeNames(); - for (Loadable lsd : structures) { - if (lsd.info.getStatedType().equals("Extension") && !context.hasResource(StructureDefinition.class, lsd.info.getUrl())) { - StructureDefinition sd = lsd.getResource(); - if (sd.getDerivation() == TypeDerivationRule.CONSTRAINT) { - if (survivesStrippingTypes(sd, context, typeNames)) { - count++; - sd.setWebPath(Utilities.pathURL(pckExt.getWebLocation(), "extension-"+sd.getId().toLowerCase()+".html")); - registerTerminologies(sd); - context.cacheResourceFromPackage(sd, new PackageInformation(lsd.source)); - } - } - } - } - } +// public void loadR5Extensions() throws FHIRException, IOException { +// count = 0; +// List typeNames = new ContextUtilities(context).getTypeNames(); +// for (Loadable lsd : structures) { +// if (lsd.info.getStatedType().equals("Extension") && !context.hasResource(StructureDefinition.class, lsd.info.getUrl())) { +// StructureDefinition sd = lsd.getResource(); +// if (sd.getDerivation() == TypeDerivationRule.CONSTRAINT) { +// if (survivesStrippingTypes(sd, context, typeNames)) { +// count++; +// sd.setWebPath(Utilities.pathURL(pckExt.getWebLocation(), "extension-"+sd.getId().toLowerCase()+".html")); +// registerTerminologies(sd); +// context.cacheResourceFromPackage(sd, new PackageInformation(lsd.source)); +// } +// } +// } +// } +// } public void loadR5SpecialTypes(List types) throws FHIRException, IOException { for (Loadable lsd : structures) { - StructureDefinition sd = lsd.getResource(); - if (Utilities.existsInList(sd.getType(), types)) { + if (Utilities.existsInList(lsd.info.getId(), types)) { + StructureDefinition sd = lsd.getResource(); count++; + for (ElementDefinition ed : sd.getDifferential().getElement()) { + if (!stripTypes(ed, sd, types)) { + System.out.println("A problem..."); + } + } + for (ElementDefinition ed : sd.getSnapshot().getElement()) { + if (!stripTypes(ed, sd, types)) { + System.out.println("A problem..."); + } + } sd.setWebPath(Utilities.pathURL(lsd.source.getWebLocation(), sd.getId().toLowerCase()+".html")); registerTerminologies(sd); context.cacheResourceFromPackage(sd, new PackageInformation(lsd.source)); } } } + + private boolean stripTypes(ElementDefinition ed, StructureDefinition sd, List types) { + if (!ed.getPath().contains(".") || !ed.hasType()) { + return true; + } + ed.getType().removeIf(tr -> context.fetchTypeDefinition(tr.getWorkingCode()) == null); + if (!ed.hasType()) { + return false; + } + for (TypeRefComponent tr : ed.getType()) { + if (tr.hasTargetProfile()) { + tr.getTargetProfile().removeIf(n -> !context.hasResource(StructureDefinition.class, n.asStringValue()) && !n.asStringValue().equals(sd.getUrl()) && !types.contains(tail(n.asStringValue()))); + if (!tr.hasTargetProfile()) { + return false; + } + } + } + return true; + } + + private Object tail(String s) { + if (s == null || !s.contains("/")) { + return s; + } + return s.substring(s.lastIndexOf("/")+1); + } private void registerTerminologies(StructureDefinition sd) throws FHIRFormatError, FileNotFoundException, IOException { for (ElementDefinition ed : sd.getSnapshot().getElement()) { @@ -217,9 +250,6 @@ public class R5ExtensionsLoader { return pckCore; } - public NpmPackage getPckExt() { - return pckExt; - } diff --git a/org.hl7.fhir.r5/src/main/java/org/hl7/fhir/r5/context/SimpleWorkerContext.java b/org.hl7.fhir.r5/src/main/java/org/hl7/fhir/r5/context/SimpleWorkerContext.java index 2aa6360dc..bd2ab70d3 100644 --- a/org.hl7.fhir.r5/src/main/java/org/hl7/fhir/r5/context/SimpleWorkerContext.java +++ b/org.hl7.fhir.r5/src/main/java/org/hl7/fhir/r5/context/SimpleWorkerContext.java @@ -244,7 +244,8 @@ public class SimpleWorkerContext extends BaseWorkerContext implements IWorkerCon public SimpleWorkerContext fromPackage(NpmPackage pi, IContextResourceLoader loader) throws IOException, FHIRException { SimpleWorkerContext context = getSimpleWorkerContextInstance(); - context.setAllowLoadingDuplicates(allowLoadingDuplicates); context.version = pi.getNpm().asString("version"); + context.setAllowLoadingDuplicates(allowLoadingDuplicates); + context.version = pi.getNpm().asString("version"); context.loadFromPackage(pi, loader); context.finishLoading(); return build(context); 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 3a28f75bc..c56b75702 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 @@ -765,10 +765,19 @@ public class DataRenderer extends Renderer implements CodeResolver { protected void renderUri(XhtmlNode x, UriType uri) { if (uri.getValue().startsWith("mailto:")) { x.ah(uri.getValue()).addText(uri.getValue().substring(7)); - } else if (Utilities.isAbsoluteUrlLinkable(uri.getValue()) && !(uri instanceof IdType)) { - x.ah(uri.getValue()).addText(uri.getValue()); } else { - x.addText(uri.getValue()); + Resource r = context.getContext().fetchResource(Resource.class, uri.getValue()); + if (r != null) { + if (r instanceof CanonicalResource) { + x.ah(r.getWebPath()).addText(((CanonicalResource) r).present()); + } else { + x.ah(r.getWebPath()).addText(uri.getValue()); + } + } else if (Utilities.isAbsoluteUrlLinkable(uri.getValue()) && !(uri instanceof IdType)) { + x.ah(uri.getValue()).addText(uri.getValue()); + } else { + x.addText(uri.getValue()); + } } } diff --git a/org.hl7.fhir.r5/src/main/java/org/hl7/fhir/r5/renderers/RendererFactory.java b/org.hl7.fhir.r5/src/main/java/org/hl7/fhir/r5/renderers/RendererFactory.java index db7bc2854..2e12c38e0 100644 --- a/org.hl7.fhir.r5/src/main/java/org/hl7/fhir/r5/renderers/RendererFactory.java +++ b/org.hl7.fhir.r5/src/main/java/org/hl7/fhir/r5/renderers/RendererFactory.java @@ -91,6 +91,9 @@ public class RendererFactory { if ("Requirements".equals(resourceName)) { return new RequirementsRenderer(context); } + if ("SubscriptionTopic".equals(resourceName)) { + return new SubscriptionTopicRenderer(context); + } if ("StructureMap".equals(resourceName)) { return new StructureMapRenderer(context); } diff --git a/org.hl7.fhir.r5/src/main/java/org/hl7/fhir/r5/renderers/ResourceRenderer.java b/org.hl7.fhir.r5/src/main/java/org/hl7/fhir/r5/renderers/ResourceRenderer.java index cdc4fda7f..0004fae57 100644 --- a/org.hl7.fhir.r5/src/main/java/org/hl7/fhir/r5/renderers/ResourceRenderer.java +++ b/org.hl7.fhir.r5/src/main/java/org/hl7/fhir/r5/renderers/ResourceRenderer.java @@ -1,5 +1,9 @@ package org.hl7.fhir.r5.renderers; +import java.util.List; +import java.util.Map; +import java.util.HashMap; +import java.util.ArrayList; import java.io.IOException; import java.io.UnsupportedEncodingException; @@ -577,4 +581,95 @@ public abstract class ResourceRenderer extends DataRenderer { public RendererType getRendererType() { return RendererType.NATIVE; } + + public class TableRowData { + private Map> cols = new HashMap<>(); + private TableData data; + + public void value(String name, DataType value) { + if (!cols.containsKey(name)) { + cols.put(name, new ArrayList<>()); + } + if (!data.columns.contains(name)) { + data.columns.add(name); + } + cols.get(name).add(value); + } + + public boolean hasCol(String name) { + return cols.containsKey(name); + } + + public List get(String name) { + return cols.get(name); + } + + } + public class TableData { + private String title; + private List columns = new ArrayList<>(); + private List rows = new ArrayList<>(); + public TableData(String title) { + this.title = title; + } + public String getTitle() { + return title; + } + public List getColumns() { + return columns; + } + public List getRows() { + return rows; + } + public void addColumn(String name) { + columns.add(name); + } + public TableRowData addRow() { + TableRowData res = new TableRowData(); + rows.add(res); + res.data = this; + return res; + } + } + + + public void renderTable(TableData provider, XhtmlNode x) throws FHIRFormatError, DefinitionException, IOException { + List columns = new ArrayList<>(); + for (String name : provider.getColumns()) { + boolean hasData = false; + for (TableRowData row : provider.getRows()) { + if (row.hasCol(name)) { + hasData = true; + } + } + if (hasData) { + columns.add(name); + } + } + if (columns.size() > 0) { + XhtmlNode table = x.table("grid"); + + if (provider.getTitle() != null) { + table.tr().td().colspan(columns.size()).b().tx(provider.getTitle()); + } + XhtmlNode tr = table.tr(); + for (String col : columns) { + tr.th().b().tx(col); + } + for (TableRowData row : provider.getRows()) { + tr = table.tr(); + for (String col : columns) { + XhtmlNode td = tr.td(); + boolean first = true; + List list = row.get(col); + if (list != null) { + for (DataType value : list) { + if (first) first = false; else td.tx(", "); + render(td, value); + } + } + } + } + } + } } \ No newline at end of file diff --git a/org.hl7.fhir.r5/src/main/java/org/hl7/fhir/r5/renderers/SubscriptionTopicRenderer.java b/org.hl7.fhir.r5/src/main/java/org/hl7/fhir/r5/renderers/SubscriptionTopicRenderer.java new file mode 100644 index 000000000..235f3a090 --- /dev/null +++ b/org.hl7.fhir.r5/src/main/java/org/hl7/fhir/r5/renderers/SubscriptionTopicRenderer.java @@ -0,0 +1,171 @@ +package org.hl7.fhir.r5.renderers; + +import java.io.IOException; +import java.io.UnsupportedEncodingException; + +import org.hl7.fhir.exceptions.DefinitionException; +import org.hl7.fhir.exceptions.FHIRFormatError; +import org.hl7.fhir.r5.model.Enumeration; +import org.hl7.fhir.r5.model.Enumerations.SearchComparator; +import org.hl7.fhir.r5.model.Enumerations.SearchModifierCode; +import org.hl7.fhir.r5.model.Library; +import org.hl7.fhir.r5.model.MarkdownType; +import org.hl7.fhir.r5.model.Requirements; +import org.hl7.fhir.r5.model.Resource; +import org.hl7.fhir.r5.model.StringType; +import org.hl7.fhir.r5.model.SubscriptionTopic; +import org.hl7.fhir.r5.model.SubscriptionTopic.InteractionTrigger; +import org.hl7.fhir.r5.model.SubscriptionTopic.SubscriptionTopicCanFilterByComponent; +import org.hl7.fhir.r5.model.SubscriptionTopic.SubscriptionTopicEventTriggerComponent; +import org.hl7.fhir.r5.model.SubscriptionTopic.SubscriptionTopicNotificationShapeComponent; +import org.hl7.fhir.r5.model.SubscriptionTopic.SubscriptionTopicResourceTriggerComponent; +import org.hl7.fhir.r5.renderers.utils.BaseWrappers.ResourceWrapper; +import org.hl7.fhir.r5.renderers.utils.RenderingContext; +import org.hl7.fhir.r5.renderers.utils.Resolver.ResourceContext; +import org.hl7.fhir.utilities.xhtml.XhtmlNode; + +public class SubscriptionTopicRenderer extends ResourceRenderer { + + public SubscriptionTopicRenderer(RenderingContext context) { + super(context); + } + + public SubscriptionTopicRenderer(RenderingContext context, ResourceContext rcontext) { + super(context, rcontext); + } + + public boolean render(XhtmlNode x, Resource dr) throws FHIRFormatError, DefinitionException, IOException { + return render(x, (SubscriptionTopic) dr); + } + + public boolean render(XhtmlNode x, SubscriptionTopic st) throws FHIRFormatError, DefinitionException, IOException { + + if (context.isHeader()) { + XhtmlNode h = x.h2(); + h.addText(st.hasTitle() ? st.getTitle() : st.getName()); + addMarkdown(x, st.getDescription()); + if (st.hasCopyright()) + generateCopyright(x, st); + } + + if (st.hasResourceTrigger()) { + TableData td = new TableData("Resource Triggers"); + for (SubscriptionTopicResourceTriggerComponent rt : st.getResourceTrigger()) { + TableRowData tr = td.addRow(); + if (rt.hasResource()) { + tr.value("Resource", rt.getResourceElement()); + } + for (Enumeration t : rt.getSupportedInteraction()) { + tr.value("Interactions", t); + } + if (rt.hasQueryCriteria()) { + StringBuilder md = new StringBuilder(); + if (rt.getQueryCriteria().hasPrevious()) { + md.append("* previous = "+rt.getQueryCriteria().getPrevious()+"\r\n"); + } + if (rt.getQueryCriteria().hasResultForCreate()) { + md.append("* create result = "+rt.getQueryCriteria().getResultForCreate()+"\r\n"); + } + if (rt.getQueryCriteria().hasCurrent()) { + md.append("* create result = "+rt.getQueryCriteria().getCurrent()+"\r\n"); + } + if (rt.getQueryCriteria().hasPrevious()) { + md.append("* delete result = "+rt.getQueryCriteria().getResultForDelete()+"\r\n"); + } + if (rt.getQueryCriteria().hasRequireBoth()) { + md.append("* require both = "+rt.getQueryCriteria().getRequireBoth()+"\r\n"); + } + tr.value("Criteria", new MarkdownType(md.toString())); + } + if (rt.hasFhirPathCriteriaElement()) { + tr.value("FHIR Path", rt.getFhirPathCriteriaElement()); + } + if (rt.hasDescription()) { + tr.value("Description", rt.getDescriptionElement()); + } + } + renderTable(td, x); + } + + if (st.hasResourceTrigger()) { + TableData td = new TableData("Event Triggers"); + for (SubscriptionTopicEventTriggerComponent rt : st.getEventTrigger()) { + TableRowData tr = td.addRow(); + if (rt.hasResource()) { + tr.value("Resource", rt.getResourceElement()); + } + if (rt.hasEvent()) { + tr.value("Event", rt.getEvent()); + } + if (rt.hasDescription()) { + tr.value("Description", rt.getDescriptionElement()); + } + } + renderTable(td, x); + } + + if (st.hasCanFilterBy()) { + TableData td = new TableData("Can Filter By"); + for (SubscriptionTopicCanFilterByComponent rt : st.getCanFilterBy()) { + TableRowData tr = td.addRow(); + if (rt.hasResource()) { + tr.value("Resource", rt.getResourceElement()); + } + if (rt.hasFilterParameter()) { + tr.value("Filter Parameter", rt.getFilterParameterElement()); + } + if (rt.hasFilterDefinition()) { + tr.value("Filter Definition", rt.getFilterDefinitionElement()); + } + for (Enumeration t : rt.getComparator()) { + tr.value("Comparators", t); + } + for (Enumeration t : rt.getModifier()) { + tr.value("Modifiers", t); + } + } + renderTable(td, x); + } + + if (st.hasNotificationShape()) { + TableData td = new TableData("Notification Shapes"); + for (SubscriptionTopicNotificationShapeComponent rt : st.getNotificationShape()) { + TableRowData tr = td.addRow(); + if (rt.hasResource()) { + tr.value("Resource", rt.getResourceElement()); + } + for (StringType t : rt.getInclude()) { + tr.value("Includes", t); + } + for (StringType t : rt.getRevInclude()) { + tr.value("Reverse Includes", t); + } + } + renderTable(td, x); + } + + return false; + } + + public void describe(XhtmlNode x, Library lib) { + x.tx(display(lib)); + } + + public String display(Library lib) { + return lib.present(); + } + + @Override + public String display(Resource r) throws UnsupportedEncodingException, IOException { + return ((Library) r).present(); + } + + @Override + public String display(ResourceWrapper r) throws UnsupportedEncodingException, IOException { + if (r.has("title")) { + return r.children("title").get(0).getBase().primitiveValue(); + } + return "??"; + } + +} diff --git a/org.hl7.fhir.utilities/src/main/java/org/hl7/fhir/utilities/xhtml/XhtmlNode.java b/org.hl7.fhir.utilities/src/main/java/org/hl7/fhir/utilities/xhtml/XhtmlNode.java index e08257375..3f83632e6 100644 --- a/org.hl7.fhir.utilities/src/main/java/org/hl7/fhir/utilities/xhtml/XhtmlNode.java +++ b/org.hl7.fhir.utilities/src/main/java/org/hl7/fhir/utilities/xhtml/XhtmlNode.java @@ -754,6 +754,10 @@ public class XhtmlNode extends XhtmlFluent implements IBaseXhtml { return setAttribute("colspan", n); } + public XhtmlNode colspan(int n) { + return setAttribute("colspan", Integer.toString(n)); + } + // differs from tx because it returns the owner node, not the created text public XhtmlNode txN(String cnt) { addText(cnt);