
001package org.hl7.fhir.r4.ips; 002 003import java.io.IOException; 004import java.util.HashMap; 005import java.util.List; 006import java.util.Map; 007 008import org.hl7.fhir.r4.ips.IPSRenderer.InternalTemplateEngine; 009import org.hl7.fhir.r4.model.Bundle; 010import org.hl7.fhir.r4.model.Composition; 011import org.hl7.fhir.r4.model.Composition.SectionComponent; 012import org.hl7.fhir.r4.model.DomainResource; 013import org.hl7.fhir.r4.model.Reference; 014import org.hl7.fhir.r4.terminologies.TerminologyClient; 015import org.hl7.fhir.utilities.MarkedToMoveToAdjunctPackage; 016import org.hl7.fhir.utilities.xhtml.NodeType; 017import org.hl7.fhir.utilities.xhtml.XhtmlComposer; 018import org.hl7.fhir.utilities.xhtml.XhtmlNode; 019 020@MarkedToMoveToAdjunctPackage 021public class IPSRenderer { 022 023 public class InternalTemplateEngine implements ITemplateImplementer { 024 025 @Override 026 public String buildPage(Map<String, String> headers, String content) { 027 // TODO Auto-generated method stub 028 return null; 029 } 030 031 } 032 033 private interface ITemplateImplementer { 034 public String buildPage(Map<String, String> headers, String content); 035 } 036 private TerminologyClient tx; 037 private String folder; // for images etc 038 private Map<String, byte[]> binaries; // from the pubpack 039 private ITemplateImplementer templater; 040 private Map<String, String> headers; 041 042 public IPSRenderer(TerminologyClient tx, String folder, Map<String, byte[]> binaries, ITemplateImplementer templater) { 043 super(); 044 this.tx = tx; 045 this.folder = folder; 046 this.binaries = binaries; 047 this.templater = templater; 048 } 049 050 public IPSRenderer(TerminologyClient tx, String folder, Map<String, byte[]> binaries) { 051 super(); 052 this.tx = tx; 053 this.folder = folder; 054 this.binaries = binaries; 055 this.templater = new InternalTemplateEngine(); 056 } 057 058 public String render(Bundle document) throws IOException { 059 headers = new HashMap<>(); 060 XhtmlNode x = new XhtmlNode(NodeType.Element, "div"); 061 generate(x, document); 062 return templater.buildPage(headers, new XhtmlComposer(false, true).compose(x)); 063 } 064 065 private void generate(XhtmlNode x, Bundle document) { 066 Composition cmp = (Composition) document.getEntryFirstRep().getResource(); 067 int sectionDepth = findSectionDepth(cmp.getSection()); 068 XhtmlNode table = x.table("grid"); 069 070 // row 1: header 071 XhtmlNode tr = table.tr(); 072 XhtmlNode td = tr.td().colspan(1+sectionDepth); 073 td.b().tx("Provided"); 074 td = tr.td().colspan(1+sectionDepth); 075 td.b().tx("Generated"); 076 077 // row 2: Subject 078 DomainResource subject = findResource(document, cmp.getSubject()); 079 tr = table.tr(); 080 td = tr.td().colspan(1+sectionDepth); 081 // genNarrative("subject", subject, td); 082 td = tr.td().colspan(1+sectionDepth); 083 td.b().tx("Generated"); 084 085 086 087 088 } 089 090 private DomainResource findResource(Bundle document, Reference subject) { 091 // TODO Auto-generated method stub 092 return null; 093 } 094 095 private int findSectionDepth(List<SectionComponent> list) { 096 int i = 1; 097 for (SectionComponent sect : list) { 098 i = Integer.max(i, 1+findSectionDepth(sect.getSection())); 099 } 100 return i; 101 } 102}