Search in sources :

Example 16 with SourceElementComponent

use of org.hl7.fhir.r4b.model.ConceptMap.SourceElementComponent in project org.hl7.fhir.core by hapifhir.

the class ConceptMapSpreadsheetGenerator method renderGroup.

private void renderGroup(ConceptMapGroupComponent grp, int i) {
    Sheet sheet = makeSheet("Mapping Table " + Integer.toString(i));
    addHeaders(sheet, "Source", "Display", "Relationship", "Target", "Display");
    addRow(sheet, grp.getSource(), "", "", grp.getTarget(), "");
    for (SourceElementComponent s : grp.getElement()) {
        for (TargetElementComponent t : s.getTarget()) {
            addRow(sheet, s.getCode(), s.getDisplay(), t.getEquivalenceElement().asStringValue(), t.getCode(), t.getDisplay());
        }
    }
}
Also used : TargetElementComponent(org.hl7.fhir.r4b.model.ConceptMap.TargetElementComponent) Sheet(org.apache.poi.ss.usermodel.Sheet) SourceElementComponent(org.hl7.fhir.r4b.model.ConceptMap.SourceElementComponent)

Example 17 with SourceElementComponent

use of org.hl7.fhir.r4b.model.ConceptMap.SourceElementComponent in project org.hl7.fhir.core by hapifhir.

the class ConceptMapRenderer method render.

public boolean render(XhtmlNode x, ConceptMap cm) throws FHIRFormatError, DefinitionException, IOException {
    x.h2().addText(cm.getName() + " (" + cm.getUrl() + ")");
    XhtmlNode p = x.para();
    p.tx("Mapping from ");
    if (cm.hasSource())
        AddVsRef(cm.getSource().primitiveValue(), p);
    else
        p.tx("(not specified)");
    p.tx(" to ");
    if (cm.hasTarget())
        AddVsRef(cm.getTarget().primitiveValue(), p);
    else
        p.tx("(not specified)");
    p = x.para();
    if (cm.getExperimental())
        p.addText(Utilities.capitalize(cm.getStatus().toString()) + " (not intended for production usage). ");
    else
        p.addText(Utilities.capitalize(cm.getStatus().toString()) + ". ");
    p.tx("Published on " + (cm.hasDate() ? cm.getDateElement().toHumanDisplay() : "?ngen-10?") + " by " + cm.getPublisher());
    if (!cm.getContact().isEmpty()) {
        p.tx(" (");
        boolean firsti = true;
        for (ContactDetail ci : cm.getContact()) {
            if (firsti)
                firsti = false;
            else
                p.tx(", ");
            if (ci.hasName())
                p.addText(ci.getName() + ": ");
            boolean first = true;
            for (ContactPoint c : ci.getTelecom()) {
                if (first)
                    first = false;
                else
                    p.tx(", ");
                addTelecom(p, c);
            }
        }
        p.tx(")");
    }
    p.tx(". ");
    p.addText(cm.getCopyright());
    if (!Utilities.noString(cm.getDescription()))
        addMarkdown(x, cm.getDescription());
    x.br();
    CodeSystem cs = getContext().getWorker().fetchCodeSystem("http://hl7.org/fhir/concept-map-relationship");
    if (cs == null)
        cs = getContext().getWorker().fetchCodeSystem("http://hl7.org/fhir/concept-map-equivalence");
    String eqpath = cs == null ? null : cs.getUserString("path");
    for (ConceptMapGroupComponent grp : cm.getGroup()) {
        String src = grp.getSource();
        boolean comment = false;
        boolean ok = true;
        Map<String, HashSet<String>> sources = new HashMap<String, HashSet<String>>();
        Map<String, HashSet<String>> targets = new HashMap<String, HashSet<String>>();
        sources.put("code", new HashSet<String>());
        targets.put("code", new HashSet<String>());
        SourceElementComponent cc = grp.getElement().get(0);
        String dst = grp.getTarget();
        sources.get("code").add(grp.getSource());
        targets.get("code").add(grp.getTarget());
        for (SourceElementComponent ccl : grp.getElement()) {
            ok = ok && ccl.getTarget().size() == 1 && ccl.getTarget().get(0).getDependsOn().isEmpty() && ccl.getTarget().get(0).getProduct().isEmpty();
            for (TargetElementComponent ccm : ccl.getTarget()) {
                comment = comment || !Utilities.noString(ccm.getComment());
                for (OtherElementComponent d : ccm.getDependsOn()) {
                    if (!sources.containsKey(d.getProperty()))
                        sources.put(d.getProperty(), new HashSet<String>());
                    sources.get(d.getProperty()).add(d.getSystem());
                }
                for (OtherElementComponent d : ccm.getProduct()) {
                    if (!targets.containsKey(d.getProperty()))
                        targets.put(d.getProperty(), new HashSet<String>());
                    targets.get(d.getProperty()).add(d.getSystem());
                }
            }
        }
        String display;
        if (ok) {
            // simple
            XhtmlNode tbl = x.table("grid");
            XhtmlNode tr = tbl.tr();
            tr.td().b().tx("Source Code");
            tr.td().b().tx("Relationship");
            tr.td().b().tx("Destination Code");
            if (comment)
                tr.td().b().tx("Comment");
            for (SourceElementComponent ccl : grp.getElement()) {
                tr = tbl.tr();
                XhtmlNode td = tr.td();
                td.addText(ccl.getCode());
                display = getDisplayForConcept(systemFromCanonical(grp.getSource()), versionFromCanonical(grp.getSource()), ccl.getCode());
                if (display != null && !isSameCodeAndDisplay(ccl.getCode(), display))
                    td.tx(" (" + display + ")");
                TargetElementComponent ccm = ccl.getTarget().get(0);
                if (!ccm.hasEquivalence())
                    tr.td().tx(":" + "(" + ConceptMapEquivalence.NULL.toCode() + ")");
                else {
                    String code = ccm.getEquivalenceElement().primitiveValue();
                    tr.td().ah(eqpath + "#" + code).tx(presentEquivalenceCode(code));
                }
                td = tr.td();
                td.addText(ccm.getCode());
                display = getDisplayForConcept(systemFromCanonical(grp.getTarget()), versionFromCanonical(grp.getTarget()), ccm.getCode());
                if (display != null && !isSameCodeAndDisplay(ccm.getCode(), display))
                    td.tx(" (" + display + ")");
                if (comment)
                    tr.td().addText(ccm.getComment());
                addUnmapped(tbl, grp);
            }
        } else {
            boolean hasRelationships = false;
            for (int si = 0; si < grp.getElement().size(); si++) {
                SourceElementComponent ccl = grp.getElement().get(si);
                for (int ti = 0; ti < ccl.getTarget().size(); ti++) {
                    TargetElementComponent ccm = ccl.getTarget().get(ti);
                    if (ccm.hasEquivalence()) {
                        hasRelationships = true;
                    }
                }
            }
            XhtmlNode tbl = x.table("grid");
            XhtmlNode tr = tbl.tr();
            XhtmlNode td;
            tr.td().colspan(Integer.toString(1 + sources.size())).b().tx("Source Concept Details");
            if (hasRelationships) {
                tr.td().b().tx("Relationship");
            }
            tr.td().colspan(Integer.toString(1 + targets.size())).b().tx("Destination Concept Details");
            if (comment) {
                tr.td().b().tx("Comment");
            }
            tr = tbl.tr();
            if (sources.get("code").size() == 1) {
                String url = sources.get("code").iterator().next();
                renderCSDetailsLink(tr, url, true);
            } else
                tr.td().b().tx("Code");
            for (String s : sources.keySet()) {
                if (!s.equals("code")) {
                    if (sources.get(s).size() == 1) {
                        String url = sources.get(s).iterator().next();
                        renderCSDetailsLink(tr, url, false);
                    } else
                        tr.td().b().addText(getDescForConcept(s));
                }
            }
            if (hasRelationships) {
                tr.td();
            }
            if (targets.get("code").size() == 1) {
                String url = targets.get("code").iterator().next();
                renderCSDetailsLink(tr, url, true);
            } else
                tr.td().b().tx("Code");
            for (String s : targets.keySet()) {
                if (!s.equals("code")) {
                    if (targets.get(s).size() == 1) {
                        String url = targets.get(s).iterator().next();
                        renderCSDetailsLink(tr, url, false);
                    } else
                        tr.td().b().addText(getDescForConcept(s));
                }
            }
            if (comment)
                tr.td();
            for (int si = 0; si < grp.getElement().size(); si++) {
                SourceElementComponent ccl = grp.getElement().get(si);
                boolean slast = si == grp.getElement().size() - 1;
                boolean first = true;
                if (false) {
                    tr = tbl.tr();
                    td = tr.td().style("border-right-width: 0px");
                    if (!first)
                        td.style("border-top-style: none");
                    else
                        td.style("border-bottom-style: none");
                    if (sources.get("code").size() == 1)
                        td.addText(ccl.getCode());
                    else
                        td.addText(grp.getSource() + " / " + ccl.getCode());
                    display = getDisplayForConcept(systemFromCanonical(grp.getSource()), versionFromCanonical(grp.getSource()), ccl.getCode());
                    tr.td().style("border-left-width: 0px").tx(display == null ? "" : display);
                    tr.td().colspan("4").style("background-color: #efefef").tx("(not mapped)");
                } else {
                    for (int ti = 0; ti < ccl.getTarget().size(); ti++) {
                        TargetElementComponent ccm = ccl.getTarget().get(ti);
                        boolean last = ti == ccl.getTarget().size() - 1;
                        tr = tbl.tr();
                        td = tr.td().style("border-right-width: 0px");
                        if (!first && !last)
                            td.style("border-top-style: none; border-bottom-style: none");
                        else if (!first)
                            td.style("border-top-style: none");
                        else if (!last)
                            td.style("border-bottom-style: none");
                        if (first) {
                            if (sources.get("code").size() == 1)
                                td.addText(ccl.getCode());
                            else
                                td.addText(grp.getSource() + " / " + ccl.getCode());
                            display = ccl.hasDisplay() ? ccl.getDisplay() : getDisplayForConcept(systemFromCanonical(grp.getSource()), versionFromCanonical(grp.getSource()), ccl.getCode());
                            td = tr.td();
                            if (!last)
                                td.style("border-left-width: 0px; border-bottom-style: none");
                            else
                                td.style("border-left-width: 0px");
                            td.tx(display == null ? "" : display);
                        } else {
                            // for display
                            td = tr.td();
                            if (!last)
                                td.style("border-left-width: 0px; border-top-style: none; border-bottom-style: none");
                            else
                                td.style("border-top-style: none; border-left-width: 0px");
                        }
                        for (String s : sources.keySet()) {
                            if (!s.equals("code")) {
                                td = tr.td();
                                if (first) {
                                    td.addText(getValue(ccm.getDependsOn(), s, sources.get(s).size() != 1));
                                    display = getDisplay(ccm.getDependsOn(), s);
                                    if (display != null)
                                        td.tx(" (" + display + ")");
                                }
                            }
                        }
                        first = false;
                        if (hasRelationships) {
                            if (!ccm.hasEquivalence())
                                tr.td();
                            else {
                                String code = ccm.getEquivalenceElement().toString();
                                tr.td().ah(eqpath + "#" + code).tx(presentEquivalenceCode(code));
                            }
                        }
                        td = tr.td().style("border-right-width: 0px");
                        if (targets.get("code").size() == 1)
                            td.addText(ccm.getCode());
                        else
                            td.addText(grp.getTarget() + " / " + ccm.getCode());
                        display = ccm.hasDisplay() ? ccm.getDisplay() : getDisplayForConcept(systemFromCanonical(grp.getTarget()), versionFromCanonical(grp.getTarget()), ccm.getCode());
                        tr.td().style("border-left-width: 0px").tx(display == null ? "" : display);
                        for (String s : targets.keySet()) {
                            if (!s.equals("code")) {
                                td = tr.td();
                                td.addText(getValue(ccm.getProduct(), s, targets.get(s).size() != 1));
                                display = getDisplay(ccm.getProduct(), s);
                                if (display != null)
                                    td.tx(" (" + display + ")");
                            }
                        }
                        if (comment)
                            tr.td().addText(ccm.getComment());
                    }
                }
                addUnmapped(tbl, grp);
            }
        }
    }
    return true;
}
Also used : HashMap(java.util.HashMap) CodeSystem(org.hl7.fhir.r4b.model.CodeSystem) ContactPoint(org.hl7.fhir.r4b.model.ContactPoint) XhtmlNode(org.hl7.fhir.utilities.xhtml.XhtmlNode) ContactDetail(org.hl7.fhir.r4b.model.ContactDetail) ContactPoint(org.hl7.fhir.r4b.model.ContactPoint) OtherElementComponent(org.hl7.fhir.r4b.model.ConceptMap.OtherElementComponent) TargetElementComponent(org.hl7.fhir.r4b.model.ConceptMap.TargetElementComponent) ConceptMapGroupComponent(org.hl7.fhir.r4b.model.ConceptMap.ConceptMapGroupComponent) SourceElementComponent(org.hl7.fhir.r4b.model.ConceptMap.SourceElementComponent) HashSet(java.util.HashSet)

Example 18 with SourceElementComponent

use of org.hl7.fhir.r4b.model.ConceptMap.SourceElementComponent in project org.hl7.fhir.core by hapifhir.

the class ConceptMapRenderer method render.

public boolean render(XhtmlNode x, ConceptMap cm) throws FHIRFormatError, DefinitionException, IOException {
    x.h2().addText(cm.getName() + " (" + cm.getUrl() + ")");
    XhtmlNode p = x.para();
    p.tx("Mapping from ");
    if (cm.hasSource())
        AddVsRef(cm.getSource().primitiveValue(), p);
    else
        p.tx("(not specified)");
    p.tx(" to ");
    if (cm.hasTarget())
        AddVsRef(cm.getTarget().primitiveValue(), p);
    else
        p.tx("(not specified)");
    p = x.para();
    if (cm.getExperimental())
        p.addText(Utilities.capitalize(cm.getStatus().toString()) + " (not intended for production usage). ");
    else
        p.addText(Utilities.capitalize(cm.getStatus().toString()) + ". ");
    p.tx("Published on " + (cm.hasDate() ? display(cm.getDateElement()) : "?ngen-10?") + " by " + cm.getPublisher());
    if (!cm.getContact().isEmpty()) {
        p.tx(" (");
        boolean firsti = true;
        for (ContactDetail ci : cm.getContact()) {
            if (firsti)
                firsti = false;
            else
                p.tx(", ");
            if (ci.hasName())
                p.addText(ci.getName() + ": ");
            boolean first = true;
            for (ContactPoint c : ci.getTelecom()) {
                if (first)
                    first = false;
                else
                    p.tx(", ");
                addTelecom(p, c);
            }
        }
        p.tx(")");
    }
    p.tx(". ");
    p.addText(cm.getCopyright());
    if (!Utilities.noString(cm.getDescription()))
        addMarkdown(x, cm.getDescription());
    x.br();
    CodeSystem cs = getContext().getWorker().fetchCodeSystem("http://hl7.org/fhir/concept-map-relationship");
    if (cs == null)
        cs = getContext().getWorker().fetchCodeSystem("http://hl7.org/fhir/concept-map-equivalence");
    String eqpath = cs == null ? null : cs.getUserString("path");
    for (ConceptMapGroupComponent grp : cm.getGroup()) {
        String src = grp.getSource();
        boolean comment = false;
        boolean ok = true;
        Map<String, HashSet<String>> sources = new HashMap<String, HashSet<String>>();
        Map<String, HashSet<String>> targets = new HashMap<String, HashSet<String>>();
        sources.put("code", new HashSet<String>());
        targets.put("code", new HashSet<String>());
        SourceElementComponent cc = grp.getElement().get(0);
        String dst = grp.getTarget();
        sources.get("code").add(grp.getSource());
        targets.get("code").add(grp.getTarget());
        for (SourceElementComponent ccl : grp.getElement()) {
            ok = ok && ccl.getTarget().size() == 1 && ccl.getTarget().get(0).getDependsOn().isEmpty() && ccl.getTarget().get(0).getProduct().isEmpty();
            for (TargetElementComponent ccm : ccl.getTarget()) {
                comment = comment || !Utilities.noString(ccm.getComment());
                for (OtherElementComponent d : ccm.getDependsOn()) {
                    if (!sources.containsKey(d.getProperty()))
                        sources.put(d.getProperty(), new HashSet<String>());
                    sources.get(d.getProperty()).add(d.getSystem());
                }
                for (OtherElementComponent d : ccm.getProduct()) {
                    if (!targets.containsKey(d.getProperty()))
                        targets.put(d.getProperty(), new HashSet<String>());
                    targets.get(d.getProperty()).add(d.getSystem());
                }
            }
        }
        String display;
        if (ok) {
            // simple
            XhtmlNode tbl = x.table("grid");
            XhtmlNode tr = tbl.tr();
            tr.td().b().tx("Source Code");
            tr.td().b().tx("Relationship");
            tr.td().b().tx("Destination Code");
            if (comment)
                tr.td().b().tx("Comment");
            tr = tbl.tr();
            XhtmlNode td = tr.td().colspan(comment ? "4" : "3");
            td.tx("Mapping from ");
            if (grp.hasSource()) {
                renderCanonical(cm, td, grp.getSource());
            } else {
                td.code("unspecified code system");
            }
            td.tx(" to ");
            if (grp.hasTarget()) {
                renderCanonical(cm, td, grp.getTarget());
            } else {
                td.code("unspecified code system");
            }
            for (SourceElementComponent ccl : grp.getElement()) {
                tr = tbl.tr();
                td = tr.td();
                td.addText(ccl.getCode());
                display = ccl.hasDisplay() ? ccl.getDisplay() : getDisplayForConcept(systemFromCanonical(grp.getSource()), versionFromCanonical(grp.getSource()), ccl.getCode());
                if (display != null && !isSameCodeAndDisplay(ccl.getCode(), display))
                    td.tx(" (" + display + ")");
                TargetElementComponent ccm = ccl.getTarget().get(0);
                if (!ccm.hasRelationship())
                    tr.td().tx(":" + "(" + ConceptMapRelationship.EQUIVALENT.toCode() + ")");
                else {
                    if (ccm.getRelationshipElement().hasExtension(ToolingExtensions.EXT_OLD_CONCEPTMAP_EQUIVALENCE)) {
                        String code = ToolingExtensions.readStringExtension(ccm.getRelationshipElement(), ToolingExtensions.EXT_OLD_CONCEPTMAP_EQUIVALENCE);
                        tr.td().ah(eqpath + "#" + code).tx(presentEquivalenceCode(code));
                    } else {
                        tr.td().ah(eqpath + "#" + ccm.getRelationship().toCode()).tx(presentRelationshipCode(ccm.getRelationship().toCode()));
                    }
                }
                td = tr.td();
                td.addText(ccm.getCode());
                display = ccm.hasDisplay() ? ccm.getDisplay() : getDisplayForConcept(systemFromCanonical(grp.getTarget()), versionFromCanonical(grp.getTarget()), ccm.getCode());
                if (display != null && !isSameCodeAndDisplay(ccm.getCode(), display))
                    td.tx(" (" + display + ")");
                if (comment)
                    tr.td().addText(ccm.getComment());
                addUnmapped(tbl, grp);
            }
        } else {
            boolean hasRelationships = false;
            for (int si = 0; si < grp.getElement().size(); si++) {
                SourceElementComponent ccl = grp.getElement().get(si);
                for (int ti = 0; ti < ccl.getTarget().size(); ti++) {
                    TargetElementComponent ccm = ccl.getTarget().get(ti);
                    if (ccm.hasRelationship()) {
                        hasRelationships = true;
                    }
                }
            }
            XhtmlNode tbl = x.table("grid");
            XhtmlNode tr = tbl.tr();
            XhtmlNode td;
            tr.td().colspan(Integer.toString(1 + sources.size())).b().tx("Source Concept Details");
            if (hasRelationships) {
                tr.td().b().tx("Relationship");
            }
            tr.td().colspan(Integer.toString(1 + targets.size())).b().tx("Destination Concept Details");
            if (comment) {
                tr.td().b().tx("Comment");
            }
            tr = tbl.tr();
            if (sources.get("code").size() == 1) {
                String url = sources.get("code").iterator().next();
                renderCSDetailsLink(tr, url, true);
            } else
                tr.td().b().tx("Code");
            for (String s : sources.keySet()) {
                if (!s.equals("code")) {
                    if (sources.get(s).size() == 1) {
                        String url = sources.get(s).iterator().next();
                        renderCSDetailsLink(tr, url, false);
                    } else
                        tr.td().b().addText(getDescForConcept(s));
                }
            }
            if (hasRelationships) {
                tr.td();
            }
            if (targets.get("code").size() == 1) {
                String url = targets.get("code").iterator().next();
                renderCSDetailsLink(tr, url, true);
            } else
                tr.td().b().tx("Code");
            for (String s : targets.keySet()) {
                if (!s.equals("code")) {
                    if (targets.get(s).size() == 1) {
                        String url = targets.get(s).iterator().next();
                        renderCSDetailsLink(tr, url, false);
                    } else
                        tr.td().b().addText(getDescForConcept(s));
                }
            }
            if (comment)
                tr.td();
            for (int si = 0; si < grp.getElement().size(); si++) {
                SourceElementComponent ccl = grp.getElement().get(si);
                boolean slast = si == grp.getElement().size() - 1;
                boolean first = true;
                if (ccl.hasNoMap() && ccl.getNoMap()) {
                    tr = tbl.tr();
                    td = tr.td().style("border-right-width: 0px");
                    if (!first)
                        td.style("border-top-style: none");
                    else
                        td.style("border-bottom-style: none");
                    if (sources.get("code").size() == 1)
                        td.addText(ccl.getCode());
                    else
                        td.addText(grp.getSource() + " / " + ccl.getCode());
                    display = getDisplayForConcept(systemFromCanonical(grp.getSource()), versionFromCanonical(grp.getSource()), ccl.getCode());
                    tr.td().style("border-left-width: 0px").tx(display == null ? "" : display);
                    tr.td().colspan("4").style("background-color: #efefef").tx("(not mapped)");
                } else {
                    for (int ti = 0; ti < ccl.getTarget().size(); ti++) {
                        TargetElementComponent ccm = ccl.getTarget().get(ti);
                        boolean last = ti == ccl.getTarget().size() - 1;
                        tr = tbl.tr();
                        td = tr.td().style("border-right-width: 0px");
                        if (!first && !last)
                            td.style("border-top-style: none; border-bottom-style: none");
                        else if (!first)
                            td.style("border-top-style: none");
                        else if (!last)
                            td.style("border-bottom-style: none");
                        if (first) {
                            if (sources.get("code").size() == 1)
                                td.addText(ccl.getCode());
                            else
                                td.addText(grp.getSource() + " / " + ccl.getCode());
                            display = ccl.hasDisplay() ? ccl.getDisplay() : getDisplayForConcept(systemFromCanonical(grp.getSource()), versionFromCanonical(grp.getSource()), ccl.getCode());
                            td = tr.td();
                            if (!last)
                                td.style("border-left-width: 0px; border-bottom-style: none");
                            else
                                td.style("border-left-width: 0px");
                            td.tx(display == null ? "" : display);
                        } else {
                            // for display
                            td = tr.td();
                            if (!last)
                                td.style("border-left-width: 0px; border-top-style: none; border-bottom-style: none");
                            else
                                td.style("border-top-style: none; border-left-width: 0px");
                        }
                        for (String s : sources.keySet()) {
                            if (!s.equals("code")) {
                                td = tr.td();
                                if (first) {
                                    td.addText(getValue(ccm.getDependsOn(), s, sources.get(s).size() != 1));
                                    display = getDisplay(ccm.getDependsOn(), s);
                                    if (display != null)
                                        td.tx(" (" + display + ")");
                                }
                            }
                        }
                        first = false;
                        if (hasRelationships) {
                            if (!ccm.hasRelationship())
                                tr.td();
                            else {
                                if (ccm.getRelationshipElement().hasExtension(ToolingExtensions.EXT_OLD_CONCEPTMAP_EQUIVALENCE)) {
                                    String code = ToolingExtensions.readStringExtension(ccm.getRelationshipElement(), ToolingExtensions.EXT_OLD_CONCEPTMAP_EQUIVALENCE);
                                    tr.td().ah(eqpath + "#" + code).tx(presentEquivalenceCode(code));
                                } else {
                                    tr.td().ah(eqpath + "#" + ccm.getRelationship().toCode()).tx(presentRelationshipCode(ccm.getRelationship().toCode()));
                                }
                            }
                        }
                        td = tr.td().style("border-right-width: 0px");
                        if (targets.get("code").size() == 1)
                            td.addText(ccm.getCode());
                        else
                            td.addText(grp.getTarget() + " / " + ccm.getCode());
                        display = ccm.hasDisplay() ? ccm.getDisplay() : getDisplayForConcept(systemFromCanonical(grp.getTarget()), versionFromCanonical(grp.getTarget()), ccm.getCode());
                        tr.td().style("border-left-width: 0px").tx(display == null ? "" : display);
                        for (String s : targets.keySet()) {
                            if (!s.equals("code")) {
                                td = tr.td();
                                td.addText(getValue(ccm.getProduct(), s, targets.get(s).size() != 1));
                                display = getDisplay(ccm.getProduct(), s);
                                if (display != null)
                                    td.tx(" (" + display + ")");
                            }
                        }
                        if (comment)
                            tr.td().addText(ccm.getComment());
                    }
                }
                addUnmapped(tbl, grp);
            }
        }
    }
    return true;
}
Also used : HashMap(java.util.HashMap) CodeSystem(org.hl7.fhir.r5.model.CodeSystem) ContactPoint(org.hl7.fhir.r5.model.ContactPoint) XhtmlNode(org.hl7.fhir.utilities.xhtml.XhtmlNode) ContactDetail(org.hl7.fhir.r5.model.ContactDetail) ContactPoint(org.hl7.fhir.r5.model.ContactPoint) OtherElementComponent(org.hl7.fhir.r5.model.ConceptMap.OtherElementComponent) TargetElementComponent(org.hl7.fhir.r5.model.ConceptMap.TargetElementComponent) ConceptMapGroupComponent(org.hl7.fhir.r5.model.ConceptMap.ConceptMapGroupComponent) SourceElementComponent(org.hl7.fhir.r5.model.ConceptMap.SourceElementComponent) HashSet(java.util.HashSet)

Example 19 with SourceElementComponent

use of org.hl7.fhir.r4b.model.ConceptMap.SourceElementComponent in project org.hl7.fhir.core by hapifhir.

the class StructureMapUtilities method produceConceptMap.

private static void produceConceptMap(StringBuilder b, ConceptMap cm) {
    b.append("conceptmap \"");
    b.append(cm.getId());
    b.append("\" {\r\n");
    Map<String, String> prefixesSrc = new HashMap<String, String>();
    Map<String, String> prefixesTgt = new HashMap<String, String>();
    char prefix = 's';
    for (ConceptMapGroupComponent cg : cm.getGroup()) {
        if (!prefixesSrc.containsKey(cg.getSource())) {
            prefixesSrc.put(cg.getSource(), String.valueOf(prefix));
            b.append("  prefix ");
            b.append(prefix);
            b.append(" = \"");
            b.append(cg.getSource());
            b.append("\"\r\n");
            prefix++;
        }
        if (!prefixesTgt.containsKey(cg.getTarget())) {
            prefixesTgt.put(cg.getTarget(), String.valueOf(prefix));
            b.append("  prefix ");
            b.append(prefix);
            b.append(" = \"");
            b.append(cg.getTarget());
            b.append("\"\r\n");
            prefix++;
        }
    }
    b.append("\r\n");
    for (ConceptMapGroupComponent cg : cm.getGroup()) {
        if (cg.hasUnmapped()) {
            b.append("  unmapped for ");
            b.append(prefixesSrc.get(cg.getSource()));
            b.append(" = ");
            b.append(cg.getUnmapped().getMode().toCode());
            b.append("\r\n");
        }
    }
    for (ConceptMapGroupComponent cg : cm.getGroup()) {
        for (SourceElementComponent ce : cg.getElement()) {
            b.append("  ");
            b.append(prefixesSrc.get(cg.getSource()));
            b.append(":");
            if (Utilities.isToken(ce.getCode())) {
                b.append(ce.getCode());
            } else {
                b.append("\"");
                b.append(ce.getCode());
                b.append("\"");
            }
            b.append(" ");
            b.append(getChar(ce.getTargetFirstRep().getRelationship()));
            b.append(" ");
            b.append(prefixesTgt.get(cg.getTarget()));
            b.append(":");
            if (Utilities.isToken(ce.getTargetFirstRep().getCode())) {
                b.append(ce.getTargetFirstRep().getCode());
            } else {
                b.append("\"");
                b.append(ce.getTargetFirstRep().getCode());
                b.append("\"");
            }
            b.append("\r\n");
        }
    }
    b.append("}\r\n\r\n");
}
Also used : ConceptMapGroupComponent(org.hl7.fhir.r5.model.ConceptMap.ConceptMapGroupComponent) SourceElementComponent(org.hl7.fhir.r5.model.ConceptMap.SourceElementComponent)

Example 20 with SourceElementComponent

use of org.hl7.fhir.r4b.model.ConceptMap.SourceElementComponent in project org.hl7.fhir.core by hapifhir.

the class NarrativeGenerator method generate.

public boolean generate(ResourceContext rcontext, ConceptMap cm) throws FHIRFormatError, DefinitionException, IOException {
    XhtmlNode x = new XhtmlNode(NodeType.Element, "div");
    x.h2().addText(cm.getName() + " (" + cm.getUrl() + ")");
    XhtmlNode p = x.para();
    if (cm.hasSource() || cm.hasTarget())
        p.tx("Mapping from ");
    if (!cm.hasSource())
        p.tx("(unspecified)");
    else
        AddVsRef(rcontext, cm.getSource() instanceof Reference ? ((Reference) cm.getSource()).getReference() : ((UriType) cm.getSource()).asStringValue(), p);
    p.tx(" to ");
    if (!cm.hasTarget())
        p.tx("(unspecified)");
    else
        AddVsRef(rcontext, cm.getTarget() instanceof Reference ? ((Reference) cm.getTarget()).getReference() : ((UriType) cm.getTarget()).asStringValue(), p);
    p = x.para();
    if (cm.getExperimental())
        p.addText(Utilities.capitalize(cm.getStatus().toString()) + " (not intended for production usage). ");
    else
        p.addText(Utilities.capitalize(cm.getStatus().toString()) + ". ");
    p.tx("Published on " + (cm.hasDate() ? cm.getDateElement().toHumanDisplay() : "??") + " by " + cm.getPublisher());
    if (!cm.getContact().isEmpty()) {
        p.tx(" (");
        boolean firsti = true;
        for (ContactDetail ci : cm.getContact()) {
            if (firsti)
                firsti = false;
            else
                p.tx(", ");
            if (ci.hasName())
                p.addText(ci.getName() + ": ");
            boolean first = true;
            for (ContactPoint c : ci.getTelecom()) {
                if (first)
                    first = false;
                else
                    p.tx(", ");
                addTelecom(p, c);
            }
        }
        p.tx(")");
    }
    p.tx(". ");
    p.addText(cm.getCopyright());
    if (!Utilities.noString(cm.getDescription()))
        addMarkdown(x, cm.getDescription());
    x.br();
    for (ConceptMapGroupComponent grp : cm.getGroup()) {
        String src = grp.getSource();
        boolean comment = false;
        boolean ok = true;
        Map<String, HashSet<String>> sources = new HashMap<String, HashSet<String>>();
        Map<String, HashSet<String>> targets = new HashMap<String, HashSet<String>>();
        sources.put("code", new HashSet<String>());
        targets.put("code", new HashSet<String>());
        SourceElementComponent cc = grp.getElement().get(0);
        String dst = grp.getTarget();
        sources.get("code").add(grp.getSource());
        targets.get("code").add(grp.getTarget());
        for (SourceElementComponent ccl : grp.getElement()) {
            ok = ok && ccl.getTarget().size() == 1 && ccl.getTarget().get(0).getDependsOn().isEmpty() && ccl.getTarget().get(0).getProduct().isEmpty();
            for (TargetElementComponent ccm : ccl.getTarget()) {
                comment = comment || !Utilities.noString(ccm.getComment());
                for (OtherElementComponent d : ccm.getDependsOn()) {
                    if (!sources.containsKey(d.getProperty()))
                        sources.put(d.getProperty(), new HashSet<String>());
                    sources.get(d.getProperty()).add(d.getSystem());
                }
                for (OtherElementComponent d : ccm.getProduct()) {
                    if (!targets.containsKey(d.getProperty()))
                        targets.put(d.getProperty(), new HashSet<String>());
                    targets.get(d.getProperty()).add(d.getSystem());
                }
            }
        }
        String display;
        if (ok) {
            // simple
            XhtmlNode tbl = x.table("grid");
            XhtmlNode tr = tbl.tr();
            tr.td().b().tx("Source Code");
            tr.td().b().tx("Equivalence");
            tr.td().b().tx("Destination Code");
            if (comment)
                tr.td().b().tx("Comment");
            for (SourceElementComponent ccl : grp.getElement()) {
                tr = tbl.tr();
                XhtmlNode td = tr.td();
                td.addText(ccl.getCode());
                display = getDisplayForConcept(grp.getSource(), ccl.getCode());
                if (display != null)
                    td.tx(" (" + display + ")");
                TargetElementComponent ccm = ccl.getTarget().get(0);
                tr.td().addText(!ccm.hasEquivalence() ? "" : ccm.getEquivalence().toCode());
                td = tr.td();
                td.addText(ccm.getCode());
                display = getDisplayForConcept(grp.getTarget(), ccm.getCode());
                if (display != null)
                    td.tx(" (" + display + ")");
                if (comment)
                    tr.td().addText(ccm.getComment());
            }
        } else {
            XhtmlNode tbl = x.table("grid");
            XhtmlNode tr = tbl.tr();
            XhtmlNode td;
            tr.td().colspan(Integer.toString(sources.size())).b().tx("Source Concept");
            tr.td().b().tx("Equivalence");
            tr.td().colspan(Integer.toString(targets.size())).b().tx("Destination Concept");
            if (comment)
                tr.td().b().tx("Comment");
            tr = tbl.tr();
            if (sources.get("code").size() == 1)
                tr.td().b().tx("Code " + sources.get("code").toString() + "");
            else
                tr.td().b().tx("Code");
            for (String s : sources.keySet()) {
                if (!s.equals("code")) {
                    if (sources.get(s).size() == 1)
                        tr.td().b().addText(getDescForConcept(s) + " " + sources.get(s).toString());
                    else
                        tr.td().b().addText(getDescForConcept(s));
                }
            }
            tr.td();
            if (targets.get("code").size() == 1)
                tr.td().b().tx("Code " + targets.get("code").toString());
            else
                tr.td().b().tx("Code");
            for (String s : targets.keySet()) {
                if (!s.equals("code")) {
                    if (targets.get(s).size() == 1)
                        tr.td().b().addText(getDescForConcept(s) + " " + targets.get(s).toString() + "");
                    else
                        tr.td().b().addText(getDescForConcept(s));
                }
            }
            if (comment)
                tr.td();
            for (SourceElementComponent ccl : grp.getElement()) {
                tr = tbl.tr();
                td = tr.td();
                if (sources.get("code").size() == 1)
                    td.addText(ccl.getCode());
                else
                    td.addText(grp.getSource() + " / " + ccl.getCode());
                display = getDisplayForConcept(grp.getSource(), ccl.getCode());
                if (display != null)
                    td.tx(" (" + display + ")");
                TargetElementComponent ccm = ccl.getTarget().get(0);
                for (String s : sources.keySet()) {
                    if (!s.equals("code")) {
                        td = tr.td();
                        td.addText(getCode(ccm.getDependsOn(), s, sources.get(s).size() != 1));
                        display = getDisplay(ccm.getDependsOn(), s);
                        if (display != null)
                            td.tx(" (" + display + ")");
                    }
                }
                if (!ccm.hasEquivalence())
                    tr.td().tx(":" + "(" + ConceptMapEquivalence.EQUIVALENT.toCode() + ")");
                else
                    tr.td().tx(":" + ccm.getEquivalence().toCode());
                td = tr.td();
                if (targets.get("code").size() == 1)
                    td.addText(ccm.getCode());
                else
                    td.addText(grp.getTarget() + " / " + ccm.getCode());
                display = getDisplayForConcept(grp.getTarget(), ccm.getCode());
                if (display != null)
                    td.tx(" (" + display + ")");
                for (String s : targets.keySet()) {
                    if (!s.equals("code")) {
                        td = tr.td();
                        td.addText(getCode(ccm.getProduct(), s, targets.get(s).size() != 1));
                        display = getDisplay(ccm.getProduct(), s);
                        if (display != null)
                            td.tx(" (" + display + ")");
                    }
                }
                if (comment)
                    tr.td().addText(ccm.getComment());
            }
        }
    }
    inject(cm, x, NarrativeStatus.GENERATED);
    return true;
}
Also used : HashMap(java.util.HashMap) Reference(org.hl7.fhir.dstu3.model.Reference) XhtmlNode(org.hl7.fhir.utilities.xhtml.XhtmlNode) ContactDetail(org.hl7.fhir.dstu3.model.ContactDetail) ContactPoint(org.hl7.fhir.dstu3.model.ContactPoint) OtherElementComponent(org.hl7.fhir.dstu3.model.ConceptMap.OtherElementComponent) TargetElementComponent(org.hl7.fhir.dstu3.model.ConceptMap.TargetElementComponent) ConceptMapGroupComponent(org.hl7.fhir.dstu3.model.ConceptMap.ConceptMapGroupComponent) SourceElementComponent(org.hl7.fhir.dstu3.model.ConceptMap.SourceElementComponent) HashSet(java.util.HashSet)

Aggregations

SourceElementComponent (org.hl7.fhir.r5.model.ConceptMap.SourceElementComponent)14 FHIRException (org.hl7.fhir.exceptions.FHIRException)11 ConceptMapGroupComponent (org.hl7.fhir.r5.model.ConceptMap.ConceptMapGroupComponent)11 HashMap (java.util.HashMap)10 ConceptMapGroupComponent (org.hl7.fhir.dstu3.model.ConceptMap.ConceptMapGroupComponent)9 SourceElementComponent (org.hl7.fhir.dstu3.model.ConceptMap.SourceElementComponent)9 TargetElementComponent (org.hl7.fhir.r5.model.ConceptMap.TargetElementComponent)9 ConceptMapGroupComponent (org.hl7.fhir.r4.model.ConceptMap.ConceptMapGroupComponent)8 SourceElementComponent (org.hl7.fhir.r4.model.ConceptMap.SourceElementComponent)8 SourceElementComponent (org.hl7.fhir.r4b.model.ConceptMap.SourceElementComponent)8 ArrayList (java.util.ArrayList)7 TargetElementComponent (org.hl7.fhir.dstu3.model.ConceptMap.TargetElementComponent)6 TargetElementComponent (org.hl7.fhir.r4.model.ConceptMap.TargetElementComponent)6 XhtmlNode (org.hl7.fhir.utilities.xhtml.XhtmlNode)6 HashSet (java.util.HashSet)5 ConceptMap (org.hl7.fhir.r4.model.ConceptMap)5 ConceptMapGroupComponent (org.hl7.fhir.r4b.model.ConceptMap.ConceptMapGroupComponent)5 TargetElementComponent (org.hl7.fhir.r4b.model.ConceptMap.TargetElementComponent)5 Coding (org.hl7.fhir.r4.model.Coding)4 ConceptMap (org.hl7.fhir.r5.model.ConceptMap)4