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