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