Search in sources :

Example 31 with UnusedTracker

use of org.hl7.fhir.r4b.conformance.ProfileUtilities.UnusedTracker in project org.hl7.fhir.core by hapifhir.

the class ProfileUtilities method genCardinality.

private Cell genCardinality(HierarchicalTableGenerator gen, ElementDefinition definition, Row row, boolean hasDef, UnusedTracker tracker, ElementDefinition fallback) {
    IntegerType min = !hasDef ? new IntegerType() : definition.hasMinElement() ? definition.getMinElement() : new IntegerType();
    StringType max = !hasDef ? new StringType() : definition.hasMaxElement() ? definition.getMaxElement() : new StringType();
    if (min.isEmpty() && definition.getUserData(DERIVATION_POINTER) != null) {
        ElementDefinition base = (ElementDefinition) definition.getUserData(DERIVATION_POINTER);
        if (base.hasMinElement()) {
            min = base.getMinElement().copy();
            min.setUserData(DERIVATION_EQUALS, true);
        }
    }
    if (max.isEmpty() && definition.getUserData(DERIVATION_POINTER) != null) {
        ElementDefinition base = (ElementDefinition) definition.getUserData(DERIVATION_POINTER);
        if (base.hasMaxElement()) {
            max = base.getMaxElement().copy();
            max.setUserData(DERIVATION_EQUALS, true);
        }
    }
    if (min.isEmpty() && fallback != null)
        min = fallback.getMinElement();
    if (max.isEmpty() && fallback != null)
        max = fallback.getMaxElement();
    if (!max.isEmpty())
        tracker.used = !max.getValue().equals("0");
    Cell cell = gen.new Cell(null, null, null, null, null);
    row.getCells().add(cell);
    if (!min.isEmpty() || !max.isEmpty()) {
        cell.addPiece(checkForNoChange(min, gen.new Piece(null, !min.hasValue() ? "" : Integer.toString(min.getValue()), null)));
        cell.addPiece(checkForNoChange(min, max, gen.new Piece(null, "..", null)));
        cell.addPiece(checkForNoChange(max, gen.new Piece(null, !max.hasValue() ? "" : max.getValue(), null)));
    }
    return cell;
}
Also used : IntegerType(org.hl7.fhir.r4b.model.IntegerType) StringType(org.hl7.fhir.r4b.model.StringType) Piece(org.hl7.fhir.utilities.xhtml.HierarchicalTableGenerator.Piece) ElementDefinition(org.hl7.fhir.r4b.model.ElementDefinition) Cell(org.hl7.fhir.utilities.xhtml.HierarchicalTableGenerator.Cell)

Example 32 with UnusedTracker

use of org.hl7.fhir.r4b.conformance.ProfileUtilities.UnusedTracker in project org.hl7.fhir.core by hapifhir.

the class ProfileUtilities method genCardinality.

private void genCardinality(HierarchicalTableGenerator gen, ElementDefinition definition, Row row, boolean hasDef, UnusedTracker tracker, ElementDefinition fallback) {
    IntegerType min = !hasDef ? new IntegerType() : definition.hasMinElement() ? definition.getMinElement() : new IntegerType();
    StringType max = !hasDef ? new StringType() : definition.hasMaxElement() ? definition.getMaxElement() : new StringType();
    if (min.isEmpty() && definition.getUserData(DERIVATION_POINTER) != null) {
        ElementDefinition base = (ElementDefinition) definition.getUserData(DERIVATION_POINTER);
        min = base.getMinElement().copy();
        min.setUserData(DERIVATION_EQUALS, true);
    }
    if (max.isEmpty() && definition.getUserData(DERIVATION_POINTER) != null) {
        ElementDefinition base = (ElementDefinition) definition.getUserData(DERIVATION_POINTER);
        max = base.getMaxElement().copy();
        max.setUserData(DERIVATION_EQUALS, true);
    }
    if (min.isEmpty() && fallback != null)
        min = fallback.getMinElement();
    if (max.isEmpty() && fallback != null)
        max = fallback.getMaxElement();
    if (!max.isEmpty())
        tracker.used = !max.getValue().equals("0");
    Cell cell = gen.new Cell(null, null, null, null, null);
    row.getCells().add(cell);
    if (!min.isEmpty() || !max.isEmpty()) {
        cell.addPiece(checkForNoChange(min, gen.new Piece(null, !min.hasValue() ? "" : Integer.toString(min.getValue()), null)));
        cell.addPiece(checkForNoChange(min, max, gen.new Piece(null, "..", null)));
        cell.addPiece(checkForNoChange(min, gen.new Piece(null, !max.hasValue() ? "" : max.getValue(), null)));
    }
}
Also used : IntegerType(org.hl7.fhir.dstu2.model.IntegerType) StringType(org.hl7.fhir.dstu2.model.StringType) Piece(org.hl7.fhir.utilities.xhtml.HierarchicalTableGenerator.Piece) ElementDefinition(org.hl7.fhir.dstu2.model.ElementDefinition) Cell(org.hl7.fhir.utilities.xhtml.HierarchicalTableGenerator.Cell)

Example 33 with UnusedTracker

use of org.hl7.fhir.r4b.conformance.ProfileUtilities.UnusedTracker in project org.hl7.fhir.core by hapifhir.

the class ProfileUtilities method describeCardinality.

private String describeCardinality(ElementDefinition definition, ElementDefinition fallback, UnusedTracker tracker) {
    IntegerType min = definition.hasMinElement() ? definition.getMinElement() : new IntegerType();
    StringType max = definition.hasMaxElement() ? definition.getMaxElement() : new StringType();
    if (min.isEmpty() && fallback != null)
        min = fallback.getMinElement();
    if (max.isEmpty() && fallback != null)
        max = fallback.getMaxElement();
    tracker.used = !max.isEmpty() && !max.getValue().equals("0");
    if (min.isEmpty() && max.isEmpty())
        return null;
    else
        return (!min.hasValue() ? "" : Integer.toString(min.getValue())) + ".." + (!max.hasValue() ? "" : max.getValue());
}
Also used : IntegerType(org.hl7.fhir.dstu2016may.model.IntegerType) StringType(org.hl7.fhir.dstu2016may.model.StringType)

Example 34 with UnusedTracker

use of org.hl7.fhir.r4b.conformance.ProfileUtilities.UnusedTracker in project org.hl7.fhir.core by hapifhir.

the class ProfileUtilities method genElement.

private Row genElement(String defPath, HierarchicalTableGenerator gen, List<Row> rows, ElementDefinition element, List<ElementDefinition> all, List<StructureDefinition> profiles, boolean showMissing, String profileBaseFileName, Boolean extensions, boolean snapshot, String corePath, String imagePath, boolean root, boolean logicalModel, boolean isConstraintMode, boolean allInvariants, Row slicingRow, boolean mustSupport, RenderingContext rc) throws IOException, FHIRException {
    Row originalRow = slicingRow;
    StructureDefinition profile = profiles == null ? null : profiles.get(profiles.size() - 1);
    Row typesRow = null;
    List<ElementDefinition> children = getChildren(all, element);
    if (!onlyInformationIsMapping(all, element)) {
        Row row = gen.new Row();
        row.setAnchor(element.getPath());
        row.setColor(getRowColor(element, isConstraintMode));
        if (element.hasSlicing())
            row.setLineColor(1);
        else if (element.hasSliceName())
            row.setLineColor(2);
        else
            row.setLineColor(0);
        boolean hasDef = element != null;
        boolean ext = false;
        if (tail(element.getPath()).equals("extension")) {
            if (element.hasType() && element.getType().get(0).hasProfile() && extensionIsComplex(element.getType().get(0).getProfile().get(0).getValue()))
                row.setIcon("icon_extension_complex.png", HierarchicalTableGenerator.TEXT_ICON_EXTENSION_COMPLEX);
            else
                row.setIcon("icon_extension_simple.png", HierarchicalTableGenerator.TEXT_ICON_EXTENSION_SIMPLE);
            ext = true;
        } else if (tail(element.getPath()).equals("modifierExtension")) {
            if (element.hasType() && element.getType().get(0).hasProfile() && extensionIsComplex(element.getType().get(0).getProfile().get(0).getValue()))
                row.setIcon("icon_modifier_extension_complex.png", HierarchicalTableGenerator.TEXT_ICON_EXTENSION_COMPLEX);
            else
                row.setIcon("icon_modifier_extension_simple.png", HierarchicalTableGenerator.TEXT_ICON_EXTENSION_SIMPLE);
        } else if (!hasDef || element.getType().size() == 0) {
            if (root && context.getResourceNames().contains(profile.getType())) {
                row.setIcon("icon_resource.png", HierarchicalTableGenerator.TEXT_ICON_RESOURCE);
            } else {
                row.setIcon("icon_element.gif", HierarchicalTableGenerator.TEXT_ICON_ELEMENT);
            }
        } else if (hasDef && element.getType().size() > 1) {
            if (allAreReference(element.getType())) {
                row.setIcon("icon_reference.png", HierarchicalTableGenerator.TEXT_ICON_REFERENCE);
            } else {
                row.setIcon("icon_choice.gif", HierarchicalTableGenerator.TEXT_ICON_CHOICE);
                typesRow = row;
            }
        } else if (hasDef && element.getType().get(0).getWorkingCode() != null && element.getType().get(0).getWorkingCode().startsWith("@")) {
            row.setIcon("icon_reuse.png", HierarchicalTableGenerator.TEXT_ICON_REUSE);
        } else if (hasDef && isPrimitive(element.getType().get(0).getWorkingCode())) {
            row.setIcon("icon_primitive.png", HierarchicalTableGenerator.TEXT_ICON_PRIMITIVE);
        } else if (hasDef && element.getType().get(0).hasTarget()) {
            row.setIcon("icon_reference.png", HierarchicalTableGenerator.TEXT_ICON_REFERENCE);
        } else if (hasDef && isDataType(element.getType().get(0).getWorkingCode())) {
            row.setIcon("icon_datatype.gif", HierarchicalTableGenerator.TEXT_ICON_DATATYPE);
        } else if (hasDef && Utilities.existsInList(element.getType().get(0).getWorkingCode(), "Element", "BackboneElement")) {
            row.setIcon("icon_element.gif", HierarchicalTableGenerator.TEXT_ICON_ELEMENT);
        } else {
            row.setIcon("icon_resource.png", HierarchicalTableGenerator.TEXT_ICON_RESOURCE);
        }
        if (element.hasUserData("render.opaque")) {
            row.setOpacity("0.5");
        }
        UnusedTracker used = new UnusedTracker();
        String ref = defPath == null ? null : defPath + element.getId();
        String sName = tail(element.getPath());
        if (element.hasSliceName())
            sName = sName + ":" + element.getSliceName();
        used.used = true;
        if (logicalModel && element.hasRepresentation(PropertyRepresentation.XMLATTR))
            sName = "@" + sName;
        Cell nc = genElementNameCell(gen, element, profileBaseFileName, snapshot, corePath, imagePath, root, logicalModel, allInvariants, profile, typesRow, row, hasDef, ext, used, ref, sName, all);
        genElementCells(gen, element, profileBaseFileName, snapshot, corePath, imagePath, root, logicalModel, allInvariants, profile, typesRow, row, hasDef, ext, used, ref, sName, nc, mustSupport, true, rc);
        if (element.hasSlicing()) {
            if (standardExtensionSlicing(element)) {
                // doesn't matter whether we have a type, we're used if we're setting up slicing ... element.hasType() && element.getType().get(0).hasProfile();
                used.used = true;
                // ?
                showMissing = false;
            } else {
                row.setIcon("icon_slice.png", HierarchicalTableGenerator.TEXT_ICON_SLICE);
                slicingRow = row;
                for (Cell cell : row.getCells()) for (Piece p : cell.getPieces()) {
                    p.addStyle("font-style: italic");
                }
            }
        } else if (element.hasSliceName()) {
            row.setIcon("icon_slice_item.png", HierarchicalTableGenerator.TEXT_ICON_SLICE_ITEM);
        }
        if (used.used || showMissing)
            rows.add(row);
        if (!used.used && !element.hasSlicing()) {
            for (Cell cell : row.getCells()) for (Piece p : cell.getPieces()) {
                p.setStyle("text-decoration:line-through");
                p.setReference(null);
            }
        } else {
            if (slicingRow != originalRow && !children.isEmpty()) {
                // we've entered a slice; we're going to create a holder row for the slice children
                Row hrow = gen.new Row();
                hrow.setAnchor(element.getPath());
                hrow.setColor(getRowColor(element, isConstraintMode));
                hrow.setLineColor(1);
                hrow.setIcon("icon_element.gif", HierarchicalTableGenerator.TEXT_ICON_ELEMENT);
                hrow.getCells().add(gen.new Cell(null, null, sName + ":All Slices", "", null));
                hrow.getCells().add(gen.new Cell());
                hrow.getCells().add(gen.new Cell());
                hrow.getCells().add(gen.new Cell());
                hrow.getCells().add(gen.new Cell(null, null, "Content/Rules for all slices", "", null));
                row.getSubRows().add(hrow);
                row = hrow;
            }
            if (typesRow != null && !children.isEmpty()) {
                // we've entered a typing slice; we're going to create a holder row for the all types children
                Row hrow = gen.new Row();
                hrow.setAnchor(element.getPath());
                hrow.setColor(getRowColor(element, isConstraintMode));
                hrow.setLineColor(1);
                hrow.setIcon("icon_element.gif", HierarchicalTableGenerator.TEXT_ICON_ELEMENT);
                hrow.getCells().add(gen.new Cell(null, null, sName + ":All Types", "", null));
                hrow.getCells().add(gen.new Cell());
                hrow.getCells().add(gen.new Cell());
                hrow.getCells().add(gen.new Cell());
                hrow.getCells().add(gen.new Cell(null, null, "Content/Rules for all Types", "", null));
                row.getSubRows().add(hrow);
                row = hrow;
            }
            Row currRow = row;
            List<ElementChoiceGroup> groups = readChoices(element, children);
            boolean isExtension = Utilities.existsInList(tail(element.getPath()), "extension", "modifierExtension");
            for (ElementDefinition child : children) {
                if (!child.hasSliceName()) {
                    currRow = row;
                }
                Row childRow = chooseChildRowByGroup(gen, currRow, groups, child, element, isConstraintMode);
                if (logicalModel || !child.getPath().endsWith(".id") || (child.getPath().endsWith(".id") && (profile != null) && (profile.getDerivation() == TypeDerivationRule.CONSTRAINT))) {
                    currRow = genElement(defPath, gen, childRow.getSubRows(), child, all, profiles, showMissing, profileBaseFileName, isExtension, snapshot, corePath, imagePath, false, logicalModel, isConstraintMode, allInvariants, currRow, mustSupport, rc);
                }
            }
        // if (!snapshot && (extensions == null || !extensions))
        // for (ElementDefinition child : children)
        // if (child.getPath().endsWith(".extension") || child.getPath().endsWith(".modifierExtension"))
        // genElement(defPath, gen, row.getSubRows(), child, all, profiles, showMissing, profileBaseFileName, true, false, corePath, imagePath, false, logicalModel, isConstraintMode, allInvariants);
        }
        if (typesRow != null) {
            makeChoiceRows(typesRow.getSubRows(), element, gen, corePath, profileBaseFileName, mustSupport);
        }
    }
    return slicingRow;
}
Also used : StructureDefinition(org.hl7.fhir.r5.model.StructureDefinition) Piece(org.hl7.fhir.utilities.xhtml.HierarchicalTableGenerator.Piece) Row(org.hl7.fhir.utilities.xhtml.HierarchicalTableGenerator.Row) ElementDefinition(org.hl7.fhir.r5.model.ElementDefinition) Cell(org.hl7.fhir.utilities.xhtml.HierarchicalTableGenerator.Cell)

Aggregations

Cell (org.hl7.fhir.utilities.xhtml.HierarchicalTableGenerator.Cell)28 Piece (org.hl7.fhir.utilities.xhtml.HierarchicalTableGenerator.Piece)22 Row (org.hl7.fhir.utilities.xhtml.HierarchicalTableGenerator.Row)18 ArrayList (java.util.ArrayList)8 List (java.util.List)6 HierarchicalTableGenerator (org.hl7.fhir.utilities.xhtml.HierarchicalTableGenerator)6 TableModel (org.hl7.fhir.utilities.xhtml.HierarchicalTableGenerator.TableModel)6 FHIRException (org.hl7.fhir.exceptions.FHIRException)5 ElementDefinition (org.hl7.fhir.r4b.model.ElementDefinition)5 ElementDefinition (org.hl7.fhir.r5.model.ElementDefinition)5 ElementDefinition (org.hl7.fhir.dstu3.model.ElementDefinition)4 ElementDefinition (org.hl7.fhir.r4.model.ElementDefinition)4 ElementDefinition (org.hl7.fhir.dstu2.model.ElementDefinition)3 ElementDefinition (org.hl7.fhir.dstu2016may.model.ElementDefinition)3 StructureDefinition (org.hl7.fhir.r4b.model.StructureDefinition)3 StructureDefinition (org.hl7.fhir.r5.model.StructureDefinition)3 IntegerType (org.hl7.fhir.dstu2.model.IntegerType)2 StringType (org.hl7.fhir.dstu2.model.StringType)2 IntegerType (org.hl7.fhir.dstu2016may.model.IntegerType)2 StringType (org.hl7.fhir.dstu2016may.model.StringType)2