package ca.uhn.fhir.narrative.template;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.antlr.runtime.tree.CommonTree;
import org.hl7.fhir.dstu3.exceptions.FHIRException;
import org.hl7.fhir.dstu3.hapi.validation.DefaultProfileValidationSupport;
import org.hl7.fhir.dstu3.hapi.validation.HapiWorkerContext;
import org.hl7.fhir.dstu3.hapi.validation.IValidationSupport;
import org.hl7.fhir.dstu3.model.Base;
import org.hl7.fhir.dstu3.utils.FluentPathEngine;
import org.hl7.fhir.dstu3.utils.IWorkerContext;
import org.hl7.fhir.instance.model.api.IBaseResource;
import org.hl7.fhir.instance.model.api.INarrative;
import ca.uhn.fhir.context.FhirContext;
import ca.uhn.fhir.narrative.INarrativeGenerator;
import ca.uhn.fhir.rest.server.exceptions.InternalErrorException;
import ca.uhn.fhir.util.FhirTerser;
public class TemplateNarrativeGenerator implements INarrativeGenerator {
private static final org.slf4j.Logger ourLog = org.slf4j.LoggerFactory.getLogger(TemplateNarrativeGenerator.class);
private FhirContext myFhirContext = FhirContext.forDstu3();
private IValidationSupport myValidationSupport = new DefaultProfileValidationSupport();
@Override
public void generateNarrative(FhirContext theContext, IBaseResource theResource, INarrative theNarrative) {
// TODO Auto-generated method stub
}
public String processLiquid(FhirContext theContext, String theTemplate, IBaseResource theResource) {
Template template = Template.parse(theTemplate);
ourLog.info(template.toStringAST());
IWorkerContext ctx = new HapiWorkerContext(myFhirContext, myValidationSupport);
FluentPathEngine fluentPathEngine = new FluentPathEngine(ctx);
FhirTerser terser = new FhirTerser(theContext);
HashMap<String, Object> context = new HashMap<String, Object>();
context.put("context", theResource);
context.put("terser", terser);
context.put("fpEngine", fluentPathEngine);
return template.render(context);
}
class MyContextMap extends HashMap<String, Object> {
private static final long serialVersionUID = 1L;
private List<Base> myContext;
private IBaseResource myResource;
MyContextMap(IBaseResource theResource) {
myResource = theResource;
myContext = null;
}
MyContextMap(Base theContext, IBaseResource theResource) {
myContext = Collections.singletonList(theContext);
myResource=theResource;
}
MyContextMap(List<Base> theContext, IBaseResource theResource) {
myContext = (theContext);
myResource=theResource;
}
@Override
public Object get(Object theKey) {
ourLog.info("Requesting key: {}", theKey);
if (theKey.equals("resource")) {
return new MyContextMap((Base) myResource, myResource);
}
IWorkerContext ctx = new HapiWorkerContext(myFhirContext, myValidationSupport);
try {
FluentPathEngine fluentPathEngine = new FluentPathEngine(ctx);
List<Base> evaluated = new ArrayList<Base>();
for (Base nextContext : myContext) {
evaluated.addAll(fluentPathEngine.evaluate(nextContext, (String)theKey));
}
return new MyContextMap(evaluated, myResource);
} catch (FHIRException e) {
throw new InternalErrorException("Failed to process expression: " + theKey, e);
}
}
}
}