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
021    if ("CodeSystem".equals(resourceName)) {
022      return new CodeSystemRenderer(context);
023    }
024    if ("ValueSet".equals(resourceName)) {
025      return new ValueSetRenderer(context);
026    }
027    if ("ConceptMap".equals(resourceName)) {
028      return new ConceptMapRenderer(context);
029    }
030
031    if ("CapabilityStatement".equals(resourceName)) {
032      return new CapabilityStatementRenderer(context);
033    }
034    if ("StructureDefinition".equals(resourceName)) {
035      return new StructureDefinitionRenderer(context);
036    }
037    if ("OperationDefinition".equals(resourceName)) {
038      return new OperationDefinitionRenderer(context);
039    }
040    if ("SearchParameter".equals(resourceName)) {
041      return new SearchParameterRenderer(context);
042    }
043    if ("CompartmentDefinition".equals(resourceName)) {
044      return new CompartmentDefinitionRenderer(context);
045    }
046    if ("ImplementationGuide".equals(resourceName)) {
047      return new ImplementationGuideRenderer(context);
048    }
049    if ("NamingSystem".equals(resourceName)) {
050      return new NamingSystemRenderer(context);
051    }
052    if ("Questionnaire".equals(resourceName)) {
053      return new QuestionnaireRenderer(context);
054    }
055
056    if ("QuestionnaireResponse".equals(resourceName)) {
057      return new QuestionnaireResponseRenderer(context);
058    }
059
060    if ("Patient".equals(resourceName)) {
061      return new PatientRenderer(context);
062    }
063    if ("Encounter".equals(resourceName)) {
064      return new EncounterRenderer(context);
065    }
066    if ("Library".equals(resourceName)) {
067      return new LibraryRenderer(context);
068    }
069    if ("List".equals(resourceName)) {
070      return new ListRenderer(context);
071    }
072    if ("DiagnosticReport".equals(resourceName)) {
073      return new DiagnosticReportRenderer(context);
074    }
075
076    if ("Provenance".equals(resourceName)) {
077      return new ProvenanceRenderer(context);
078    }
079    if ("OperationOutcome".equals(resourceName)) {
080      return new OperationOutcomeRenderer(context);
081    }
082    if ("Parameters".equals(resourceName)) {
083      return new ParametersRenderer(context);
084    }
085    if ("Bundle".equals(resourceName)) {
086      return new BundleRenderer(context);
087    }
088    if ("ActorDefinition".equals(resourceName)) {
089      return new ActorDefinitionRenderer(context);
090    }
091    if ("Requirements".equals(resourceName)) {
092      return new RequirementsRenderer(context);
093    }
094    return new ProfileDrivenRenderer(context);    
095  }
096
097  public static ResourceRenderer factory(Resource resource, RenderingContext context) {
098
099    if (context.getTemplateProvider() != null && resource instanceof DomainResource) {
100      String liquidTemplate = context.getTemplateProvider().findTemplate(context, (DomainResource) resource);
101      if (liquidTemplate != null) {
102        return new LiquidRenderer(context, liquidTemplate);
103      }
104    }
105
106    return factory(resource.fhirType(), context);
107  }
108
109
110  public static ResourceRenderer factory(ResourceWrapper resource, RenderingContext context, ResourceContext resourceContext) {
111    if (context.getTemplateProvider() != null) {
112      String liquidTemplate = context.getTemplateProvider().findTemplate(context, resource.getName());
113      if (liquidTemplate != null) {
114        return new LiquidRenderer(context, liquidTemplate);
115      }
116    }
117
118    if ("List".equals(resource.getName())) {
119      return new ListRenderer(context);
120    }
121    if ("Library".equals(resource.getName())) {
122      return new LibraryRenderer(context);
123    }
124    if ("Patient".equals(resource.getName())) {
125      return new PatientRenderer(context);
126    }
127    if ("DiagnosticReport".equals(resource.getName())) {
128      return new DiagnosticReportRenderer(context);
129    }
130    if ("QuestionnaireResponse".equals(resource.getName())) {
131      return new QuestionnaireResponseRenderer(context);
132    }
133
134    return new ProfileDrivenRenderer(context, resourceContext);    
135  }
136
137  public static ResourceRenderer factory(ResourceWrapper rw, RenderingContext lrc) {
138    return factory(rw, lrc, null);
139  }
140
141  public static boolean hasSpecificRenderer(String rt) {
142    
143    return Utilities.existsInList(rt, 
144        "CodeSystem", "ValueSet", "ConceptMap", 
145        "CapabilityStatement", "CompartmentDefinition", "ImplementationGuide", "Library", "NamingSystem", "OperationDefinition", 
146        "Questionnaire", "SearchParameter", "StructureDefinition", "ActorDefinition", "Requirements");
147  }
148
149  /**
150   * This is a list of renderers that return something different in IG mode, and the implementation guide 
151   * publisher will regenerate the narrative for the IG mode 
152   * @param rt
153   * @return
154   */
155  public static boolean hasIGSpecificRenderer(String rt) {
156    
157    return Utilities.existsInList(rt, "ValueSet", "CapabilityStatement", "Questionnaire");
158  }
159  
160
161}