
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}