001package org.hl7.fhir.r5.renderers;
002
003import java.io.IOException;
004import java.io.UnsupportedEncodingException;
005
006import org.hl7.fhir.r5.model.CodeableConcept;
007import org.hl7.fhir.r5.model.DomainResource;
008import org.hl7.fhir.r5.model.Provenance;
009import org.hl7.fhir.r5.model.Provenance.ProvenanceAgentComponent;
010import org.hl7.fhir.r5.model.Reference;
011import org.hl7.fhir.r5.model.Resource;
012import org.hl7.fhir.r5.model.UriType;
013import org.hl7.fhir.r5.renderers.utils.RenderingContext;
014import org.hl7.fhir.r5.renderers.utils.BaseWrappers.ResourceWrapper;
015import org.hl7.fhir.utilities.xhtml.XhtmlNode;
016
017public class ProvenanceRenderer extends ResourceRenderer {
018  
019  public ProvenanceRenderer(RenderingContext context) {
020    super(context);
021  }
022
023  public boolean render(XhtmlNode x, Resource prv) throws UnsupportedEncodingException, IOException {
024    return render(x, (Provenance) prv);
025  }
026  
027  public boolean render(XhtmlNode x, Provenance prv) throws UnsupportedEncodingException, IOException {
028    boolean hasExtensions = false;
029
030    if (!prv.getTarget().isEmpty()) {
031      if (prv.getTarget().size() == 1) {
032        XhtmlNode p = x.para();
033        p.tx("Provenance for ");
034        renderReference(prv, p, prv.getTargetFirstRep());
035      } else {
036        x.para().tx("Provenance for:");
037        XhtmlNode ul = x.ul();
038        for (Reference ref : prv.getTarget()) {
039          renderReference(prv, ul.li(), ref);
040        }
041      }
042    }
043    // summary table
044    x.para().tx("Summary");
045    XhtmlNode t = x.table("grid");
046    XhtmlNode tr;
047    if (prv.hasOccurred()) {
048      tr = t.tr();
049      tr.td().tx("Occurrence");
050      if (prv.hasOccurredPeriod()) {
051        renderPeriod(tr.td(), prv.getOccurredPeriod());
052      } else {
053        renderDateTime(tr.td(), prv.getOccurredDateTimeType());        
054      }
055    }
056    if (prv.hasRecorded()) {
057      tr = t.tr();
058      tr.td().tx("Recorded");
059      tr.td().addText(prv.getRecordedElement().toHumanDisplay());
060    }
061    if (prv.hasPolicy()) {
062      tr = t.tr();
063      tr.td().tx("Policy");
064      if (prv.getPolicy().size() == 1) {
065        renderUri(tr.td(), prv.getPolicy().get(0));
066      } else {
067        XhtmlNode ul = tr.td().ul();
068        for (UriType u : prv.getPolicy()) {
069          renderUri(ul.li(), u);
070        }
071      }
072    }
073    if (prv.hasLocation()) {
074      tr = t.tr();
075      tr.td().tx("Location");
076      renderReference(prv, tr.td(), prv.getLocation());      
077    }
078    if (prv.hasActivity()) {
079      tr = t.tr();
080      tr.td().tx("Activity");
081      renderCodeableConcept(tr.td(), prv.getActivity(), false);
082    }
083
084    boolean hasType = false;
085    boolean hasRole = false;
086    boolean hasOnBehalfOf = false;
087    for (ProvenanceAgentComponent a : prv.getAgent()) {
088      hasType = hasType || a.hasType(); 
089      hasRole = hasRole || a.hasRole(); 
090      hasOnBehalfOf = hasOnBehalfOf || a.hasOnBehalfOf(); 
091    }    
092    x.para().b().tx("Agents");
093    t = x.table("grid");
094    tr = t.tr();
095    if (hasType) {
096      tr.td().b().tx("Type");
097    }
098    if (hasRole) {
099      tr.td().b().tx("Role");
100    }
101    tr.td().b().tx("who");
102    if (hasOnBehalfOf) {
103      tr.td().b().tx("On Behalf Of");
104    }
105    for (ProvenanceAgentComponent a : prv.getAgent()) {
106      tr = t.tr();
107      if (hasType) {
108        if (a.hasType()) {
109          renderCodeableConcept(tr.td(), a.getType(), false);         
110        } else {
111          tr.td();
112        }
113      }        
114      if (hasRole) {
115        if (a.hasRole()) {
116          if (a.getRole().size() == 1) {
117            renderCodeableConcept(tr.td(), a.getType(), false);
118          } else {
119            XhtmlNode ul = tr.td().ul();
120            for (CodeableConcept cc : a.getRole()) {
121              renderCodeableConcept(ul.li(), cc, false);
122            }
123          }
124        } else {
125          tr.td();
126        }
127      }
128      if (a.hasWho()) {
129        renderReference(prv, tr.td(), a.getWho());         
130      } else {
131        tr.td();
132      }
133      if (hasOnBehalfOf) {
134        if (a.hasOnBehalfOf()) {
135          renderReference(prv, tr.td(), a.getOnBehalfOf());         
136        } else {
137          tr.td();
138        }
139      }
140    }
141    // agent table
142
143    return hasExtensions; 
144  }
145
146  public String display(Resource dr) throws UnsupportedEncodingException, IOException {
147    return display((Provenance) dr);
148  }
149
150  public String display(Provenance prv) throws UnsupportedEncodingException, IOException {
151    return "Provenance for "+displayReference(prv, prv.getTargetFirstRep());
152  }
153 
154  @Override
155  public String display(ResourceWrapper r) throws UnsupportedEncodingException, IOException {
156    return "Not done yet";
157  }
158
159}