001package org.hl7.fhir.r5.renderers; 
002 
003import java.io.IOException; 
004import java.io.UnsupportedEncodingException; 
005 
006import org.hl7.fhir.exceptions.DefinitionException; 
007import org.hl7.fhir.exceptions.FHIRFormatError; 
008import org.hl7.fhir.r5.model.Extension; 
009import org.hl7.fhir.r5.model.ExtensionHelper; 
010import org.hl7.fhir.r5.model.OperationOutcome; 
011import org.hl7.fhir.r5.model.OperationOutcome.IssueSeverity; 
012import org.hl7.fhir.r5.model.OperationOutcome.OperationOutcomeIssueComponent; 
013import org.hl7.fhir.r5.model.Resource; 
014import org.hl7.fhir.r5.model.StringType; 
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.ToolingExtensions; 
019import org.hl7.fhir.utilities.CommaSeparatedStringBuilder; 
020import org.hl7.fhir.utilities.xhtml.XhtmlNode; 
021 
022public class OperationOutcomeRenderer extends ResourceRenderer { 
023 
024  public OperationOutcomeRenderer(RenderingContext context) { 
025    super(context); 
026  } 
027 
028  public OperationOutcomeRenderer(RenderingContext context, ResourceContext rcontext) { 
029    super(context, rcontext); 
030  } 
031   
032  public boolean render(XhtmlNode x, Resource dr) throws FHIRFormatError, DefinitionException, IOException { 
033    return render(x, (OperationOutcome) dr); 
034  } 
035 
036  public boolean render(XhtmlNode x, OperationOutcome op) throws FHIRFormatError, DefinitionException, IOException { 
037    boolean hasSource = false; 
038    boolean success = true; 
039    for (OperationOutcomeIssueComponent i : op.getIssue()) { 
040      success = success && i.getSeverity() == IssueSeverity.INFORMATION; 
041      hasSource = hasSource || ExtensionHelper.hasExtension(i, ToolingExtensions.EXT_ISSUE_SOURCE); 
042    } 
043    if (success) 
044      x.para().tx(context.formatPhrase(RenderingContext.OP_OUT_OK)); 
045    if (op.getIssue().size() > 0) { 
046      XhtmlNode tbl = x.table("grid"); // on the basis that we'll most likely be rendered using the standard fhir css, but it doesn't really matter 
047      XhtmlNode tr = tbl.tr(); 
048      tr.td().b().tx(context.formatPhrase(RenderingContext.OP_OUT_SEV)); 
049      tr.td().b().tx(context.formatPhrase(RenderingContext.GENERAL_LOCATION)); 
050      tr.td().b().tx(context.formatPhrase(RenderingContext.GENERAL_CODE)); 
051      tr.td().b().tx(context.formatPhrase(RenderingContext.GENERAL_DETAILS)); 
052      tr.td().b().tx(context.formatPhrase(RenderingContext.OP_OUT_DIAG)); 
053      if (hasSource) 
054        tr.td().b().tx(context.formatPhrase(RenderingContext.OP_OUT_SRC)); 
055      for (OperationOutcomeIssueComponent i : op.getIssue()) { 
056        tr = tbl.tr(); 
057        tr.td().addText(i.getSeverity().toString()); 
058        XhtmlNode td = tr.td(); 
059        boolean d = false; 
060        for (StringType s : i.hasExpression() ? i.getExpression() : i.getLocation()) { 
061          if (d) 
062            td.tx(", "); 
063          else 
064            d = true; 
065          td.addText(s.getValue()); 
066        } 
067        tr.td().addText(i.getCode().getDisplay()); 
068        tr.td().addText(display(i.getDetails())); 
069        smartAddText(tr.td(), i.getDiagnostics()); 
070        if (hasSource) { 
071          Extension ext = ExtensionHelper.getExtension(i, ToolingExtensions.EXT_ISSUE_SOURCE); 
072          tr.td().addText(ext == null ? "" : display(ext)); 
073        } 
074      } 
075    } 
076    return true; 
077 
078  } 
079 
080  public void describe(XhtmlNode x, OperationOutcome oo) { 
081    x.tx(display(oo)); 
082  } 
083 
084  public String display(OperationOutcome oo) { 
085    return (context.formatPhrase(RenderingContext.GENERAL_TODO)); 
086  } 
087 
088  @Override 
089  public String display(ResourceWrapper r) throws UnsupportedEncodingException, IOException { 
090    return (context.formatPhrase(RenderingContext.GENERAL_TODO)); 
091  } 
092 
093  @Override 
094  public String display(Resource r) throws UnsupportedEncodingException, IOException { 
095    return display((OperationOutcome) r); 
096  } 
097 
098  public static String toString(OperationOutcome oo) { 
099    CommaSeparatedStringBuilder b = new CommaSeparatedStringBuilder(); 
100    for (OperationOutcomeIssueComponent issue : oo.getIssue()) { 
101      b.append(issue.getSeverity().toCode()+": "+issue.getDetails().getText()); 
102    } 
103    return b.toString(); 
104  } 
105}