001package org.hl7.fhir.r5.renderers;
002
003import java.io.IOException;
004import java.io.UnsupportedEncodingException;
005import java.util.List;
006
007import org.hl7.fhir.exceptions.DefinitionException;
008import org.hl7.fhir.exceptions.FHIRException;
009import org.hl7.fhir.exceptions.FHIRFormatError;
010import org.hl7.fhir.r5.renderers.utils.RenderingContext;
011import org.hl7.fhir.r5.renderers.utils.ResourceWrapper;
012import org.hl7.fhir.r5.utils.EOperationOutcome;
013import org.hl7.fhir.utilities.xhtml.XhtmlNode;
014
015public class ProvenanceRenderer extends ResourceRenderer {
016
017  public ProvenanceRenderer(RenderingContext context) { 
018    super(context); 
019  } 
020 
021  @Override
022  public String buildSummary(ResourceWrapper prv) throws UnsupportedEncodingException, IOException {
023    return (context.formatPhrase(RenderingContext.PROV_FOR, displayReference(prv.firstChild("target")))+" ");
024  }
025
026  @Override
027  public void buildNarrative(RenderingStatus status, XhtmlNode x, ResourceWrapper prv) throws FHIRFormatError, DefinitionException, IOException, FHIRException, EOperationOutcome {
028    renderResourceTechDetails(prv, x);
029
030    if (prv.has("target")) {
031      List<ResourceWrapper> tl = prv.children("target");
032      if (tl.size() == 1) {
033        XhtmlNode p = x.para();
034        p.tx(context.formatPhrase(RenderingContext.PROV_PROV)+" ");
035        renderReference(status, p, tl.get(0));
036      } else {
037        x.para().tx(context.formatPhrase(RenderingContext.PROV_PROVE)+" ");
038        XhtmlNode ul = x.ul();
039        for (ResourceWrapper ref : tl) {
040          renderReference(status, ul.li(), ref);
041        }
042      }
043    }
044    // summary table
045    x.para().tx(context.formatPhrase(RenderingContext.GENERAL_SUMM));
046    XhtmlNode t = x.table("grid");
047    XhtmlNode tr;
048    if (prv.has("occurred")) {
049      tr = t.tr();
050      tr.td().tx(context.formatPhrase(RenderingContext.PROV_OCC));
051      renderDataType(status, tr.td(), prv.child("occurred"));
052    }
053    if (prv.has("recorded")) {
054      tr = t.tr();
055      tr.td().tx(context.formatPhrase(RenderingContext.PROV_REC));
056      renderDataType(status, tr.td(), prv.child("recorded"));
057    }
058    if (prv.has("policy")) {
059      List<ResourceWrapper> tl = prv.children("policy");
060      tr = t.tr();
061      tr.td().tx(context.formatPhrase(RenderingContext.PROV_POL));
062      if (tl.size() == 1) {
063        renderDataType(status, tr.td(), tl.get(0));
064      } else {
065        XhtmlNode ul = tr.td().ul();
066        for (ResourceWrapper u : tl) {
067          renderDataType(status, ul.li(), u);
068        }
069      }
070    }
071    if (prv.has("location")) {
072      tr = t.tr();
073      tr.td().tx(context.formatPhrase(RenderingContext.GENERAL_LOCATION));
074      renderDataType(status, tr.td(), prv.child("location"));
075    }
076    if (prv.has("activity")) {
077      tr = t.tr();
078      tr.td().tx(context.formatPhrase(RenderingContext.PROV_ACT));
079      renderDataType(status, tr.td(), prv.child("activity"));
080    }
081
082    boolean hasType = false;
083    boolean hasRole = false;
084    boolean hasOnBehalfOf = false;
085    for (ResourceWrapper a : prv.children("agent")) {
086      hasType = hasType || a.has("type"); 
087      hasRole = hasRole || a.has("role"); 
088      hasOnBehalfOf = hasOnBehalfOf || a.has("onBehalfOf"); 
089    }    
090    x.para().b().tx(context.formatPhrase(RenderingContext.PROV_AGE));
091    t = x.table("grid");
092    tr = t.tr();
093    if (hasType) {
094      tr.td().b().tx(context.formatPhrase(RenderingContext.GENERAL_TYPE));
095    }
096    if (hasRole) {
097      tr.td().b().tx(context.formatPhrase(RenderingContext.PROV_ROLE));
098    }
099    tr.td().b().tx(context.formatPhrase(RenderingContext.PROV_WHO));
100    if (hasOnBehalfOf) {
101      tr.td().b().tx(context.formatPhrase(RenderingContext.PROV_BEHALF));
102    }
103    for (ResourceWrapper a : prv.children("agent")) {
104      tr = t.tr();
105      if (hasType) {
106        if (a.has("type")) {
107          renderDataType(status, tr.td(), a.child("type"));         
108        } else {
109          tr.td();
110        }
111      }        
112      if (hasRole) {
113        List<ResourceWrapper> tl = prv.children("role");        
114        if (tl.size() == 0) {
115          tr.td();
116        } else if (tl.size() == 1) {
117          renderCodeableConcept(status, tr.td(), tl.get(0));
118        } else {
119          XhtmlNode ul = tr.td().ul();
120          for (ResourceWrapper cc : tl) {
121            renderCodeableConcept(status, ul.li(), cc);
122          }
123        }
124      }
125      if (a.has("who")) {
126        renderReference(status, tr.td(), a.child("who"));         
127      } else {
128        tr.td();
129      }
130      if (hasOnBehalfOf) {
131        if (a.has("onBehalfOf")) {
132          renderReference(status, tr.td(), a.child("onBehalfOf"));         
133        } else {
134          tr.td();
135        }
136      }
137    }
138    // agent table
139
140  }
141
142
143}