001package org.hl7.fhir.r5.renderers; 002 003import org.hl7.fhir.r5.model.DomainResource; 004import org.hl7.fhir.r5.model.Resource; 005import org.hl7.fhir.r5.renderers.utils.BaseWrappers.ResourceWrapper; 006import org.hl7.fhir.r5.renderers.utils.RenderingContext; 007import org.hl7.fhir.r5.renderers.utils.Resolver.ResourceContext; 008import org.hl7.fhir.utilities.Utilities; 009 010public class RendererFactory { 011 012 public static ResourceRenderer factory(String resourceName, RenderingContext context) { 013 014 if (context.getTemplateProvider() != null) { 015 String liquidTemplate = context.getTemplateProvider().findTemplate(context, resourceName); 016 if (liquidTemplate != null) { 017 return new LiquidRenderer(context, liquidTemplate); 018 } 019 } 020 switch (resourceName) { 021 case "ActorDefinition": return new ActorDefinitionRenderer(context); 022 case "Bundle": return new BundleRenderer(context); 023 case "CapabilityStatement": return new CapabilityStatementRenderer(context); 024 case "CodeSystem": return new CodeSystemRenderer(context); 025 case "CompartmentDefinition": return new CompartmentDefinitionRenderer(context); 026 case "ConceptMap": return new ConceptMapRenderer(context); 027 case "DiagnosticReport": return new DiagnosticReportRenderer(context); 028 case "Encounter": return new EncounterRenderer(context); 029 case "ExampleScenario": return new ExampleScenarioRenderer(context); 030 case "ImplementationGuide": return new ImplementationGuideRenderer(context); 031 case "Library": return new LibraryRenderer(context); 032 case "List": return new ListRenderer(context); 033 case "NamingSystem": return new NamingSystemRenderer(context); 034 case "OperationDefinition": return new OperationDefinitionRenderer(context); 035 case "OperationOutcome": return new OperationOutcomeRenderer(context); 036 case "Parameters": return new ParametersRenderer(context); 037 case "Patient": return new PatientRenderer(context); 038 case "Provenance": return new ProvenanceRenderer(context); 039 case "Questionnaire": return new QuestionnaireRenderer(context); 040 case "QuestionnaireResponse": return new QuestionnaireResponseRenderer(context); 041 case "Requirements": return new RequirementsRenderer(context); 042 case "SearchParameter": return new SearchParameterRenderer(context); 043 case "StructureDefinition": return new StructureDefinitionRenderer(context); 044 case "StructureMap": return new StructureMapRenderer(context); 045 case "SubscriptionTopic": return new SubscriptionTopicRenderer(context); 046 case "TestPlan": return new TestPlanRenderer(context); 047 case "ValueSet": return new ValueSetRenderer(context); 048 } 049 return new ProfileDrivenRenderer(context); 050 } 051 052 public static ResourceRenderer factory(Resource resource, RenderingContext context) { 053 054 if (context.getTemplateProvider() != null && resource instanceof DomainResource) { 055 String liquidTemplate = context.getTemplateProvider().findTemplate(context, (DomainResource) resource); 056 if (liquidTemplate != null) { 057 return new LiquidRenderer(context, liquidTemplate); 058 } 059 } 060 061 return factory(resource.fhirType(), context); 062 } 063 064 065 public static ResourceRenderer factory(ResourceWrapper resource, RenderingContext context, ResourceContext resourceContext) { 066 if (context.getTemplateProvider() != null) { 067 String liquidTemplate = context.getTemplateProvider().findTemplate(context, resource.getName()); 068 if (liquidTemplate != null) { 069 return new LiquidRenderer(context, liquidTemplate); 070 } 071 } 072 switch (resource.getName()) { 073 case "DiagnosticReport": return new DiagnosticReportRenderer(context); 074 case "Library": return new LibraryRenderer(context); 075 case "List": return new ListRenderer(context); 076 case "Patient": return new PatientRenderer(context); 077 case "QuestionnaireResponse": return new QuestionnaireResponseRenderer(context); 078 } 079 080 return new ProfileDrivenRenderer(context, resourceContext); 081 } 082 083 public static ResourceRenderer factory(ResourceWrapper rw, RenderingContext lrc) { 084 return factory(rw, lrc, null); 085 } 086 087 public static boolean hasSpecificRenderer(String rt) { 088 089 return Utilities.existsInList(rt, 090 "CodeSystem", "ValueSet", "ConceptMap", 091 "CapabilityStatement", "CompartmentDefinition", "ImplementationGuide", "Library", "NamingSystem", "OperationDefinition", 092 "Questionnaire", "SearchParameter", "StructureDefinition", "ActorDefinition", "Requirements", "TestPlan", "ExampleScenario"); 093 } 094 095 /** 096 * This is a list of renderers that return something different in IG mode, and the implementation guide 097 * publisher will regenerate the narrative for the IG mode 098 * @param rt 099 * @return 100 */ 101 public static boolean hasIGSpecificRenderer(String rt) { 102 103 return Utilities.existsInList(rt, "ValueSet", "CapabilityStatement", "Questionnaire"); 104 } 105 106 107}