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.RenderingContext;
006import org.hl7.fhir.r5.renderers.utils.ResourceWrapper;
007import org.hl7.fhir.utilities.MarkedToMoveToAdjunctPackage;
008import org.hl7.fhir.utilities.Utilities;
009
010@MarkedToMoveToAdjunctPackage
011public class RendererFactory {
012
013  public static ResourceRenderer factory(String resourceName, RenderingContext context) {
014
015    if (context.getTemplateProvider() != null) {
016      String liquidTemplate = context.getTemplateProvider().findTemplate(context, resourceName);
017      if (liquidTemplate != null) {
018        return new LiquidRenderer(context, liquidTemplate);
019      }
020    }
021    switch (resourceName) {
022    case "ActorDefinition": return new ActorDefinitionRenderer(context);
023    case "Bundle": return new BundleRenderer(context);
024    case "CapabilityStatement": return new CapabilityStatementRenderer(context);
025    case "CodeSystem": return new CodeSystemRenderer(context);
026    case "CompartmentDefinition":  return new CompartmentDefinitionRenderer(context);
027    case "ConceptMap": return new ConceptMapRenderer(context);
028    case "DiagnosticReport": return new DiagnosticReportRenderer(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    case "ViewDefinition": return new ViewDefinitionRenderer(context);
049    case "WebTemplate": return new WebTemplateRenderer(context);
050    }
051    return new ProfileDrivenRenderer(context);    
052  }
053
054  public static ResourceRenderer factory(Resource resource, RenderingContext context) {
055
056    if (context.getTemplateProvider() != null && resource instanceof DomainResource) {
057      String liquidTemplate = context.getTemplateProvider().findTemplate(context, (DomainResource) resource);
058      if (liquidTemplate != null) {
059        return new LiquidRenderer(context, liquidTemplate);
060      }
061    }
062
063    return factory(resource.fhirType(), context);
064  }
065
066
067  public static ResourceRenderer factory(ResourceWrapper resource, RenderingContext context) {
068    if (context.getTemplateProvider() != null) {
069      String liquidTemplate = context.getTemplateProvider().findTemplate(context, resource.fhirType());
070      if (liquidTemplate != null) {
071        return new LiquidRenderer(context, liquidTemplate);
072      }
073    }
074    switch (resource.fhirType()) {
075    case "DiagnosticReport": return new DiagnosticReportRenderer(context);
076    case "Library": return new LibraryRenderer(context);
077    case "ViewDefinition": return new ViewDefinitionRenderer(context);
078    case "WebTemplate": return new WebTemplateRenderer(context);
079    case "FeatureDefinition": return new FeatureDefinitionRenderer(context);
080    case "List": return new ListRenderer(context);
081    case "Patient": return new PatientRenderer(context);
082    case "Provenance": return new ProvenanceRenderer(context);
083    case "Parameters": return new ParametersRenderer(context);
084    case "Questionnaire": return new QuestionnaireRenderer(context);
085    case "QuestionnaireResponse": return new QuestionnaireResponseRenderer(context);
086    }
087    if (resource.isDirect()) {
088      switch (resource.fhirType()) {
089
090      case "ActorDefinition": return new ActorDefinitionRenderer(context);
091      case "Bundle": return new BundleRenderer(context);
092      case "CapabilityStatement": return new CapabilityStatementRenderer(context);
093      case "CodeSystem": return new CodeSystemRenderer(context);
094      case "CompartmentDefinition":  return new CompartmentDefinitionRenderer(context);
095      case "ConceptMap": return new ConceptMapRenderer(context);
096      case "ExampleScenario": return new ExampleScenarioRenderer(context);
097      case "ImplementationGuide": return new ImplementationGuideRenderer(context);
098      case "NamingSystem": return new NamingSystemRenderer(context);
099      case "OperationDefinition": return new OperationDefinitionRenderer(context);
100      case "OperationOutcome": return new OperationOutcomeRenderer(context);
101      case "Requirements": return new RequirementsRenderer(context);
102      case "SearchParameter": return new SearchParameterRenderer(context);
103      case "StructureDefinition": return new StructureDefinitionRenderer(context);
104      case "StructureMap": return new StructureMapRenderer(context);
105      case "SubscriptionTopic": return new SubscriptionTopicRenderer(context);
106      case "TestPlan": return new TestPlanRenderer(context);
107      case "ValueSet": return new ValueSetRenderer(context);
108      }
109    }
110
111    return new ProfileDrivenRenderer(context);    
112  }
113
114  public static boolean hasSpecificRenderer(String rt) {
115
116    return Utilities.existsInList(rt, 
117        "CodeSystem", "ValueSet", "ConceptMap", 
118        "CapabilityStatement", "CompartmentDefinition", "ImplementationGuide", "Library", "NamingSystem", "OperationDefinition", 
119        "Questionnaire", "SearchParameter", "StructureDefinition", "ActorDefinition", "Requirements", "TestPlan", "ExampleScenario");
120  }
121
122  /**
123   * This is a list of renderers that return something different in IG mode, and the implementation guide 
124   * publisher will regenerate the narrative for the IG mode 
125   * @param rt
126   * @return
127   */
128  public static boolean hasIGSpecificRenderer(String rt) {
129
130    return Utilities.existsInList(rt, "ValueSet", "CapabilityStatement", "Questionnaire");
131  }
132
133
134}