From fc652e452c965b0be444508e3aae05312d8abb0a Mon Sep 17 00:00:00 2001 From: Lloyd McKenzie Date: Tue, 1 Aug 2023 09:40:45 -0600 Subject: [PATCH] Added support for ExampleScenario rendering --- .../hl7/fhir/igtools/publisher/Publisher.java | 71 +++++-------------- .../renderers/ExampleScenarioRenderer.java | 68 ++++++++++++++++++ .../hl7/fhir/igtools/templates/Template.java | 2 +- 3 files changed, 87 insertions(+), 54 deletions(-) create mode 100644 org.hl7.fhir.publisher.core/src/main/java/org/hl7/fhir/igtools/renderers/ExampleScenarioRenderer.java diff --git a/org.hl7.fhir.publisher.core/src/main/java/org/hl7/fhir/igtools/publisher/Publisher.java b/org.hl7.fhir.publisher.core/src/main/java/org/hl7/fhir/igtools/publisher/Publisher.java index 8ae768e1d..2191ad4eb 100644 --- a/org.hl7.fhir.publisher.core/src/main/java/org/hl7/fhir/igtools/publisher/Publisher.java +++ b/org.hl7.fhir.publisher.core/src/main/java/org/hl7/fhir/igtools/publisher/Publisher.java @@ -115,6 +115,7 @@ import org.hl7.fhir.igtools.renderers.MappingSummaryRenderer; import org.hl7.fhir.igtools.renderers.OperationDefinitionRenderer; import org.hl7.fhir.igtools.renderers.PublicationChecker; +import org.hl7.fhir.igtools.renderers.ExampleScenarioRenderer; import org.hl7.fhir.igtools.renderers.QuestionnaireRenderer; import org.hl7.fhir.igtools.renderers.QuestionnaireResponseRenderer; import org.hl7.fhir.igtools.renderers.StatusRenderer; @@ -158,16 +159,9 @@ import org.hl7.fhir.r5.formats.JsonParser; import org.hl7.fhir.r5.formats.RdfParser; import org.hl7.fhir.r5.formats.XmlParser; -import org.hl7.fhir.r5.model.ActivityDefinition; -import org.hl7.fhir.r5.model.Attachment; -import org.hl7.fhir.r5.model.Base; -import org.hl7.fhir.r5.model.Binary; -import org.hl7.fhir.r5.model.Bundle; +import org.hl7.fhir.r5.model.*; import org.hl7.fhir.r5.model.Bundle.BundleEntryComponent; import org.hl7.fhir.r5.model.Bundle.BundleType; -import org.hl7.fhir.r5.model.CanonicalResource; -import org.hl7.fhir.r5.model.CanonicalType; -import org.hl7.fhir.r5.model.CapabilityStatement; import org.hl7.fhir.r5.model.CapabilityStatement.CapabilityStatementDocumentComponent; import org.hl7.fhir.r5.model.CapabilityStatement.CapabilityStatementMessagingComponent; import org.hl7.fhir.r5.model.CapabilityStatement.CapabilityStatementMessagingSupportedMessageComponent; @@ -175,34 +169,15 @@ import org.hl7.fhir.r5.model.CapabilityStatement.CapabilityStatementRestResourceComponent; import org.hl7.fhir.r5.model.CapabilityStatement.CapabilityStatementRestResourceOperationComponent; import org.hl7.fhir.r5.model.CapabilityStatement.CapabilityStatementRestResourceSearchParamComponent; -import org.hl7.fhir.r5.model.CodeSystem; import org.hl7.fhir.r5.model.CodeSystem.ConceptDefinitionComponent; -import org.hl7.fhir.r5.model.CodeType; -import org.hl7.fhir.r5.model.CodeableConcept; -import org.hl7.fhir.r5.model.Coding; -import org.hl7.fhir.r5.model.ConceptMap; import org.hl7.fhir.r5.model.ConceptMap.ConceptMapGroupComponent; -import org.hl7.fhir.r5.model.Constants; -import org.hl7.fhir.r5.model.ContactDetail; -import org.hl7.fhir.r5.model.ContactPoint; import org.hl7.fhir.r5.model.ContactPoint.ContactPointSystem; -import org.hl7.fhir.r5.model.DataType; -import org.hl7.fhir.r5.model.DateTimeType; -import org.hl7.fhir.r5.model.DomainResource; -import org.hl7.fhir.r5.model.ElementDefinition; import org.hl7.fhir.r5.model.ElementDefinition.ElementDefinitionConstraintComponent; import org.hl7.fhir.r5.model.ElementDefinition.TypeRefComponent; -import org.hl7.fhir.r5.model.Enumeration; import org.hl7.fhir.r5.model.Enumerations.CodeSystemContentMode; import org.hl7.fhir.r5.model.Enumerations.FHIRVersion; import org.hl7.fhir.r5.model.Enumerations.PublicationStatus; -import org.hl7.fhir.r5.model.ExpressionNode; -import org.hl7.fhir.r5.model.Extension; -import org.hl7.fhir.r5.model.GraphDefinition; -import org.hl7.fhir.r5.model.IdType; -import org.hl7.fhir.r5.model.Identifier; import org.hl7.fhir.r5.model.Identifier.IdentifierUse; -import org.hl7.fhir.r5.model.ImplementationGuide; import org.hl7.fhir.r5.model.ImplementationGuide.GuidePageGeneration; import org.hl7.fhir.r5.model.ImplementationGuide.ImplementationGuideDefinitionGroupingComponent; import org.hl7.fhir.r5.model.ImplementationGuide.ImplementationGuideDefinitionPageComponent; @@ -211,47 +186,21 @@ import org.hl7.fhir.r5.model.ImplementationGuide.ImplementationGuideDependsOnComponent; import org.hl7.fhir.r5.model.ImplementationGuide.ImplementationGuideGlobalComponent; import org.hl7.fhir.r5.model.ImplementationGuide.SPDXLicense; -import org.hl7.fhir.r5.model.IntegerType; -import org.hl7.fhir.r5.model.Library; -import org.hl7.fhir.r5.model.ListResource; import org.hl7.fhir.r5.model.ListResource.ListResourceEntryComponent; -import org.hl7.fhir.r5.model.MarkdownType; -import org.hl7.fhir.r5.model.Measure; -import org.hl7.fhir.r5.model.MessageDefinition; import org.hl7.fhir.r5.model.MessageDefinition.MessageDefinitionAllowedResponseComponent; import org.hl7.fhir.r5.model.MessageDefinition.MessageDefinitionFocusComponent; -import org.hl7.fhir.r5.model.OperationDefinition; import org.hl7.fhir.r5.model.OperationDefinition.OperationDefinitionParameterComponent; -import org.hl7.fhir.r5.model.OperationOutcome; -import org.hl7.fhir.r5.model.PackageInformation; -import org.hl7.fhir.r5.model.Parameters; -import org.hl7.fhir.r5.model.PlanDefinition; import org.hl7.fhir.r5.model.PlanDefinition.PlanDefinitionActionComponent; -import org.hl7.fhir.r5.model.Property; -import org.hl7.fhir.r5.model.Provenance; import org.hl7.fhir.r5.model.Provenance.ProvenanceAgentComponent; -import org.hl7.fhir.r5.model.Questionnaire; import org.hl7.fhir.r5.model.Questionnaire.QuestionnaireItemAnswerOptionComponent; import org.hl7.fhir.r5.model.Questionnaire.QuestionnaireItemComponent; import org.hl7.fhir.r5.model.Questionnaire.QuestionnaireItemInitialComponent; -import org.hl7.fhir.r5.model.QuestionnaireResponse; -import org.hl7.fhir.r5.model.Reference; -import org.hl7.fhir.r5.model.Resource; -import org.hl7.fhir.r5.model.ResourceFactory; -import org.hl7.fhir.r5.model.SearchParameter; import org.hl7.fhir.r5.model.SearchParameter.SearchParameterComponentComponent; -import org.hl7.fhir.r5.model.StringType; -import org.hl7.fhir.r5.model.StructureDefinition; import org.hl7.fhir.r5.model.StructureDefinition.StructureDefinitionContextComponent; import org.hl7.fhir.r5.model.StructureDefinition.StructureDefinitionKind; import org.hl7.fhir.r5.model.StructureDefinition.TypeDerivationRule; -import org.hl7.fhir.r5.model.StructureMap; import org.hl7.fhir.r5.model.StructureMap.StructureMapModelMode; import org.hl7.fhir.r5.model.StructureMap.StructureMapStructureComponent; -import org.hl7.fhir.r5.model.TypeDetails; -import org.hl7.fhir.r5.model.UriType; -import org.hl7.fhir.r5.model.UsageContext; -import org.hl7.fhir.r5.model.ValueSet; import org.hl7.fhir.r5.model.ValueSet.ConceptSetComponent; import org.hl7.fhir.r5.model.ValueSet.ValueSetExpansionContainsComponent; import org.hl7.fhir.r5.openapi.OpenApiGenerator; @@ -272,6 +221,7 @@ import org.hl7.fhir.r5.renderers.utils.RenderingContext.GenerationRules; import org.hl7.fhir.r5.renderers.utils.RenderingContext.ITypeParser; import org.hl7.fhir.r5.renderers.utils.RenderingContext.KnownLinkType; +import org.hl7.fhir.r5.renderers.utils.RenderingContext.ExampleScenarioRendererMode; import org.hl7.fhir.r5.renderers.utils.RenderingContext.QuestionnaireRendererMode; import org.hl7.fhir.r5.renderers.utils.RenderingContext.ResourceRendererMode; import org.hl7.fhir.r5.renderers.utils.RenderingContext.StructureDefinitionRendererMode; @@ -9737,6 +9687,9 @@ public boolean generateResourceHtml(FetchedFile f, boolean regen, FetchedResourc case Library: generateOutputsLibrary(f, r, (Library) res, vars, prefixForContainer); break; + case ExampleScenario: + generateOutputsExampleScenario(f, r, (ExampleScenario) res, vars, prefixForContainer); + break; default: if (res instanceof CanonicalResource) { generateOutputsCanonical(f, r, (CanonicalResource) res, vars, prefixForContainer); @@ -10922,6 +10875,18 @@ private void generateOutputsLibrary(FetchedFile f, FetchedResource r, Library li } } + private void generateOutputsExampleScenario(FetchedFile f, FetchedResource r, ExampleScenario scen, Map vars, String prefixForContainer) throws Exception { + ExampleScenarioRenderer er = new ExampleScenarioRenderer(context, checkAppendSlash(specPath), scen, Utilities.path(tempDir), igpkp, specMaps, pageTargets(), markdownEngine, packge, rc.copy().setDefinitionsTarget(igpkp.getDefinitionsName(r))); + if (igpkp.wantGen(r, "actor-table")) + fragment("ExampleScenario-"+prefixForContainer+scen.getId()+"-actor-table", er.render(ExampleScenarioRendererMode.ACTORS), f.getOutputNames(), r, vars, null); + if (igpkp.wantGen(r, "instance-table")) + fragment("ExampleScenario-"+prefixForContainer+scen.getId()+"-instance-table", er.render(ExampleScenarioRendererMode.INSTANCES), f.getOutputNames(), r, vars, null); + if (igpkp.wantGen(r, "processes")) + fragment("ExampleScenario-"+prefixForContainer+scen.getId()+"-processes", er.render(ExampleScenarioRendererMode.PROCESSES), f.getOutputNames(), r, vars, null); + if (igpkp.wantGen(r, "process-diagram")) + fragment("ExampleScenario-"+prefixForContainer+scen.getId()+"-process-diagram", er.renderDiagram(), f.getOutputNames(), r, vars, null); + } + private void generateOutputsQuestionnaire(FetchedFile f, FetchedResource r, Questionnaire q, Map vars, String prefixForContainer) throws Exception { QuestionnaireRenderer qr = new QuestionnaireRenderer(context, checkAppendSlash(specPath), q, Utilities.path(tempDir), igpkp, specMaps, pageTargets(), markdownEngine, packge, rc.copy().setDefinitionsTarget(igpkp.getDefinitionsName(r))); if (igpkp.wantGen(r, "summary")) diff --git a/org.hl7.fhir.publisher.core/src/main/java/org/hl7/fhir/igtools/renderers/ExampleScenarioRenderer.java b/org.hl7.fhir.publisher.core/src/main/java/org/hl7/fhir/igtools/renderers/ExampleScenarioRenderer.java new file mode 100644 index 000000000..c82f69f91 --- /dev/null +++ b/org.hl7.fhir.publisher.core/src/main/java/org/hl7/fhir/igtools/renderers/ExampleScenarioRenderer.java @@ -0,0 +1,68 @@ +package org.hl7.fhir.igtools.renderers; + +/*- + * #%L + * org.hl7.fhir.publisher.core + * %% + * Copyright (C) 2014 - 2019 Health Level 7 + * %% + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * #L% + */ + + +import org.hl7.fhir.exceptions.DefinitionException; +import org.hl7.fhir.exceptions.FHIRException; +import org.hl7.fhir.exceptions.FHIRFormatError; +import org.hl7.fhir.igtools.publisher.IGKnowledgeProvider; +import org.hl7.fhir.igtools.publisher.SpecMapManager; +import org.hl7.fhir.r5.context.IWorkerContext; +import org.hl7.fhir.r5.model.ExampleScenario; +import org.hl7.fhir.r5.renderers.utils.RenderingContext; +import org.hl7.fhir.r5.renderers.utils.RenderingContext.ExampleScenarioRendererMode; +import org.hl7.fhir.r5.utils.EOperationOutcome; +import org.hl7.fhir.utilities.MarkDownProcessor; +import org.hl7.fhir.utilities.npm.NpmPackage; +import org.hl7.fhir.utilities.xhtml.XhtmlComposer; + +import java.io.IOException; +import java.util.List; +import java.util.Set; + +public class ExampleScenarioRenderer extends CanonicalRenderer { + + + private ExampleScenario scen; + private String destDir; + + public ExampleScenarioRenderer(IWorkerContext context, String corePath, ExampleScenario scen, String destDir, IGKnowledgeProvider igp, List maps, Set allTargets, MarkDownProcessor markdownEngine, NpmPackage packge, RenderingContext gen) { + super(context, corePath, scen, destDir, igp, maps, allTargets, markdownEngine, packge, gen); + this.scen = scen; + this.destDir = destDir; + } + + @Override + protected void genSummaryRowsSpecific(StringBuilder b, Set rows) { + } + + public String render(ExampleScenarioRendererMode mode) throws IOException, FHIRFormatError, DefinitionException, FHIRException, EOperationOutcome { + org.hl7.fhir.r5.renderers.ExampleScenarioRenderer sr = new org.hl7.fhir.r5.renderers.ExampleScenarioRenderer(gen); + gen.setScenarioMode(mode); + return new XhtmlComposer(XhtmlComposer.HTML).compose(sr.build(scen)); + } + + public String renderDiagram() throws IOException, FHIRFormatError, DefinitionException, FHIRException, EOperationOutcome { + org.hl7.fhir.r5.renderers.ExampleScenarioRenderer sr = new org.hl7.fhir.r5.renderers.ExampleScenarioRenderer(gen); + return sr.renderDiagram(scen); + } +} diff --git a/org.hl7.fhir.publisher.core/src/main/java/org/hl7/fhir/igtools/templates/Template.java b/org.hl7.fhir.publisher.core/src/main/java/org/hl7/fhir/igtools/templates/Template.java index a7b7b3598..e65d58088 100644 --- a/org.hl7.fhir.publisher.core/src/main/java/org/hl7/fhir/igtools/templates/Template.java +++ b/org.hl7.fhir.publisher.core/src/main/java/org/hl7/fhir/igtools/templates/Template.java @@ -282,7 +282,7 @@ private void loadModifiedIg(ImplementationGuide modIg, ImplementationGuide ig) t int oc = ig.getDefinition().getResource().size(); int nc = modIg.getDefinition().getResource().size(); if (oc != nc) - throw new FHIRException("Ths template is not allowed to modify the resources ("+oc+"/"+nc+")"); + throw new FHIRException("This template is not allowed to modify the resources ("+oc+"/"+nc+")"); for (ImplementationGuideDefinitionResourceComponent or : ig.getDefinition().getResource()) { ImplementationGuideDefinitionResourceComponent nr = getMatchingResource(modIg, or.getReference()); if (nr == null)