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.CommaSeparatedStringBuilder;
014import org.hl7.fhir.utilities.MarkedToMoveToAdjunctPackage;
015import org.hl7.fhir.utilities.xhtml.XhtmlNode;
016
017@MarkedToMoveToAdjunctPackage
018public class ParametersRenderer extends ResourceRenderer {
019
020  public ParametersRenderer(RenderingContext context) { 
021    super(context); 
022  } 
023 
024  
025  @Override
026  public String buildSummary(ResourceWrapper r) throws UnsupportedEncodingException, IOException {
027    List<ResourceWrapper> params = r.children("parameter");
028    if (params.size() < 8) {
029      CommaSeparatedStringBuilder b = new CommaSeparatedStringBuilder();
030      for (ResourceWrapper p : params) {
031        b.append(p.primitiveValue("name"));
032      }
033      return context.formatMessage(RenderingContext.PARS_SUMMARY_LIST, b.toString());
034    } else {
035      return context.formatMessage(RenderingContext.PARS_SUMMARY_SIZE, params.size());
036    }
037  }
038
039  public ParametersRenderer setMultiLangMode(boolean multiLangMode) {
040    this.multiLangMode = multiLangMode;
041    return this;
042  }
043
044  @Override
045  public void buildNarrative(RenderingStatus status, XhtmlNode x, ResourceWrapper r) throws FHIRFormatError, DefinitionException, IOException, FHIRException, EOperationOutcome {
046    renderResourceTechDetails(r, x);
047    x.h2().tx(context.formatPhrase(RenderingContext.GENERAL_PARS));
048    XhtmlNode tbl = x.table("grid", false);
049    params(status, tbl, r.children("parameter"), 0);
050  }
051
052  private void params(RenderingStatus status, XhtmlNode tbl, List<ResourceWrapper> list, int indent) throws FHIRFormatError, DefinitionException, FHIRException, IOException, EOperationOutcome {
053    for (ResourceWrapper p : list) {
054      XhtmlNode tr = tbl.tr();
055      XhtmlNode td = tr.td();
056      for (int i = 0; i < indent; i++) {
057        td.tx(XhtmlNode.NBSP);        
058      }
059      if (p.has("name")) {
060        td.tx(p.primitiveValue("name"));
061      } else {
062        td.tx("???");
063      }
064      if (p.has("value")) {
065        renderDataType(status, tr.td(), p.child("value"));
066      } else if (p.has("resource")) {
067        ResourceWrapper rw = p.child("resource");
068        td = tr.td();
069        XhtmlNode para = td.para();
070        para.tx(rw.fhirType()+"/"+rw.getId());
071        checkAddLink(para, rw.fhirType()+"_"+rw.getId());
072        checkAddLink(para, rw.fhirType()+"_"+rw.getScopedId());
073        checkAddLink(para, "hc"+rw.fhirType()+"_"+rw.getId());
074        checkAddLink(para, "hc"+rw.fhirType()+"_"+rw.getScopedId());
075        if (rw.has("meta")) {
076          ResourceWrapper m = rw.child("meta");
077          String ver = m.primitiveValue("version");
078          if (ver != null) {
079            checkAddLink(para, "hc"+rw.fhirType()+"_"+rw.getId()+"/"+ver);
080            checkAddLink(para, "hc"+rw.fhirType()+"_"+rw.getScopedId()+"/"+ver);            
081          }
082        }
083        XhtmlNode x = rw.getNarrative();
084        if (x != null) {
085          td.addChildren(x);
086        } else {
087          ResourceRenderer rr = RendererFactory.factory(rw, context);
088          rr.buildNarrative(status, td, rw);
089        }
090      } else if (p.has("part")) {
091        tr.td();
092        params(status, tbl, p.children("part"), indent+1);
093      }
094    }
095  }
096
097
098  private void checkAddLink(XhtmlNode para, String anchor) {
099    if (!context.hasAnchor(anchor)) {
100      context.addAnchor(anchor);
101      para.an(context.prefixAnchor(anchor)).tx(" ");
102    }
103
104    
105  }
106
107}