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}