001package org.hl7.fhir.r5.renderers.mappings;
002
003import java.util.ArrayList;
004import java.util.List;
005
006import org.hl7.fhir.r5.model.CodeSystem;
007import org.hl7.fhir.r5.model.ConceptMap;
008import org.hl7.fhir.r5.model.ConceptMap.ConceptMapGroupComponent;
009import org.hl7.fhir.r5.model.ConceptMap.SourceElementComponent;
010import org.hl7.fhir.r5.model.ConceptMap.TargetElementComponent;
011import org.hl7.fhir.r5.model.ElementDefinition;
012import org.hl7.fhir.r5.model.Enumerations.ConceptMapRelationship;
013import org.hl7.fhir.r5.model.StructureDefinition;
014import org.hl7.fhir.r5.renderers.StructureDefinitionRenderer.Column;
015import org.hl7.fhir.r5.renderers.utils.RenderingContext;
016import org.hl7.fhir.utilities.xhtml.XhtmlNode;
017
018public class ConceptMapMappingProvider extends ModelMappingProvider {
019
020  private ConceptMap map;
021  private ConceptMapGroupComponent grp;
022  private Object eqpath;
023
024  public ConceptMapMappingProvider(RenderingContext context, StructureDefinition dest, boolean reverse, ConceptMap map, ConceptMapGroupComponent grp) {
025    super(context, dest, reverse);
026    this.map = map;
027    this.grp = grp;
028
029    CodeSystem cs = context.getWorker().fetchCodeSystem("http://hl7.org/fhir/concept-map-relationship");
030    if (cs == null)
031      cs = context.getWorker().fetchCodeSystem("http://hl7.org/fhir/concept-map-equivalence");
032    eqpath = cs == null ? null : cs.getWebPath();
033  }
034
035  @Override
036  public Column makeColumn(String id) {
037    return new Column(id, map.getName(), dest.present(), map.getWebPath());
038  }
039
040  @Override
041  public void render(ElementDefinition element, XhtmlNode div) {
042    List<TargetElementComponent> list = new ArrayList<>();
043    for (SourceElementComponent t : grp.getElement()) {
044      if (t.hasCode() && t.getCode().equals(element.getId())) {
045        if (t.getNoMap()) {
046          list.add(null);
047        } else {
048          list.addAll(t.getTarget());
049        }
050      }
051    }
052    if (!list.isEmpty()) {
053      if (list.size() == 1) {
054        renderMap(div, list.get(0));
055      } else {
056        XhtmlNode ul = div.ul();
057        for (TargetElementComponent s : list) {
058          renderMap(ul.li(), s);
059        }
060      }
061    }
062  }
063
064  private void renderMap(XhtmlNode x, TargetElementComponent tgt) {
065    if (tgt == null) {
066      x.tx("No Equivalent");
067    } else {
068      x.ahOrNot(eqpath == null ? null : eqpath+"#"+tgt.getRelationship().toCode()).tx(rel(tgt.getRelationship()));
069    }
070    x.tx(" ");
071    x.ah(ref()+"#"+tgt.getCode()).tx(tgt.getCode());
072    if (tgt.hasComment()) {
073      XhtmlNode i = x.i();
074      i.tx(" (");
075      i.tx(tgt.getComment());
076      i.tx(")");
077    }
078  }
079
080  private String rel(ConceptMapRelationship rel) {
081    switch (rel) {
082    case EQUIVALENT: return "Equivalent To";
083    case NOTRELATEDTO: return "Not Related To";
084    case RELATEDTO: return "Related To";
085    case SOURCEISBROADERTHANTARGET: return "Broader than";
086    case SOURCEISNARROWERTHANTARGET: return "Narrower than";
087    default: return "??";
088    }
089  }
090  
091  
092}