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.model.Parameters;
011import org.hl7.fhir.r5.model.Parameters.ParametersParameterComponent;
012import org.hl7.fhir.r5.model.Resource;
013import org.hl7.fhir.r5.renderers.utils.BaseWrappers.BaseWrapper;
014import org.hl7.fhir.r5.renderers.utils.BaseWrappers.PropertyWrapper;
015import org.hl7.fhir.r5.renderers.utils.BaseWrappers.ResourceWrapper;
016import org.hl7.fhir.r5.renderers.utils.RenderingContext;
017import org.hl7.fhir.r5.renderers.utils.Resolver.ResourceContext;
018import org.hl7.fhir.r5.utils.EOperationOutcome;
019import org.hl7.fhir.utilities.xhtml.NodeType;
020import org.hl7.fhir.utilities.xhtml.XhtmlNode;
021
022public class ParametersRenderer extends ResourceRenderer {
023  
024  public ParametersRenderer(RenderingContext context) {
025    super(context);
026  }
027
028  public ParametersRenderer(RenderingContext context, ResourceContext rcontext) {
029    super(context, rcontext);
030  }
031
032  @Override
033  public boolean render(XhtmlNode x, Resource r) throws FHIRFormatError, DefinitionException, IOException, FHIRException, EOperationOutcome {
034    x.h2().tx("Parameters");
035    XhtmlNode tbl = x.table("grid");
036    params(tbl, ((Parameters) r).getParameter(), 0);
037    return false;
038  }
039
040  @Override
041  public String display(Resource r) throws UnsupportedEncodingException, IOException {
042    return null;
043  }
044
045  @Override
046  public String display(ResourceWrapper r) throws UnsupportedEncodingException, IOException {
047    return null;
048  }
049
050  @Override
051  public boolean render(XhtmlNode x, ResourceWrapper params) throws FHIRFormatError, DefinitionException, IOException, FHIRException, EOperationOutcome {
052    x.h2().tx("Parameters");
053    XhtmlNode tbl = x.table("grid");
054    PropertyWrapper pw = getProperty(params, "parameter");
055    if (valued(pw)) {
056      paramsW(tbl, pw.getValues(), 0);
057    }
058    return false;
059  }
060 
061  private void paramsW(XhtmlNode tbl, List<BaseWrapper> list, int indent) throws FHIRFormatError, DefinitionException, FHIRException, IOException, EOperationOutcome {
062    for (BaseWrapper p : list) {
063      XhtmlNode tr = tbl.tr();
064      XhtmlNode td = tr.td();
065      for (int i = 0; i < indent; i++) {
066        td.tx(XhtmlNode.NBSP);        
067      }
068      if (p.has("name")) {
069        td.tx(p.get("name").primitiveValue());
070      } else {
071        td.tx("???");
072      }
073      if (p.has("value")) {
074        renderBase(tr.td(), p.get("value"));
075      } else if (p.has("resource")) {
076        ResourceWrapper rw = p.getChildByName("resource").getAsResource();
077        td = tr.td();
078        XhtmlNode para = td.para();
079        para.tx(rw.fhirType()+"/"+rw.getId());
080        para.an(rw.fhirType()+"_"+rw.getId()).tx(" ");
081        XhtmlNode x = rw.getNarrative();
082        if (x != null) {
083          td.addChildren(x);
084        } else {
085          ResourceRenderer rr = RendererFactory.factory(rw, context, rcontext);
086          rr.render(td, rw);
087        }
088      } else if (p.has("part")) {
089        tr.td();
090        PropertyWrapper pw = getProperty(p, "part");
091        paramsW(tbl, pw.getValues(), 1);
092      }
093    }
094  }
095  
096  public XhtmlNode render(Parameters params) throws FHIRFormatError, DefinitionException, IOException, FHIRException, EOperationOutcome {
097    XhtmlNode div = new XhtmlNode(NodeType.Element, "div");
098    div.h2().tx("Parameters");
099    XhtmlNode tbl = div.table("grid");
100    params(tbl, params.getParameter(), 0);
101    return div;
102  }
103
104  private void params(XhtmlNode tbl, List<ParametersParameterComponent> list, int indent) throws FHIRFormatError, DefinitionException, FHIRException, IOException, EOperationOutcome {
105    for (ParametersParameterComponent p : list) {
106      XhtmlNode tr = tbl.tr();
107      XhtmlNode td = tr.td();
108      for (int i = 0; i < indent; i++) {
109        td.tx(XhtmlNode.NBSP);        
110      }
111      td.tx(p.getName());
112      if (p.hasValue()) {
113        render(tr.td(), p.getValue());
114      } else if (p.hasResource()) {
115        Resource r = p.getResource();
116        td = tr.td();
117        XhtmlNode para = td.para();
118        para.tx(r.fhirType()+"/"+r.getId());
119        para.an(r.fhirType()+"_"+r.getId()).tx(" ");
120        ResourceRenderer rr = RendererFactory.factory(r, context);
121        rr.render(td, r);
122      } else if (p.hasPart()) {
123        tr.td();
124        params(tbl, p.getPart(), 1);
125      }
126    }
127  }
128
129}