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