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}