Search in sources :

Example 11 with Invariant

use of org.hl7.fhir.definitions.model.Invariant in project kindling by HL7.

the class ProfileGenerator method convertElements.

public void convertElements(ElementDefn src, StructureDefinition ed, String path) throws Exception {
    ElementDefinition dst = new ElementDefinition();
    if (!ed.hasDifferential())
        ed.setDifferential(new StructureDefinitionDifferentialComponent());
    ed.getDifferential().getElement().add(dst);
    String thisPath = path == null ? "Extension" : path;
    dst.setId(thisPath);
    dst.setPath(thisPath);
    if (!Utilities.noString(src.getProfileName()))
        dst.setSliceName(src.getProfileName());
    dst.setShort(src.getShortDefn());
    dst.setDefinition(preProcessMarkdown(src.getDefinition(), "Element Definition"));
    dst.setComment(preProcessMarkdown(src.getComments(), "Element Comments"));
    if (src.getMaxCardinality() != null) {
        if (src.getMaxCardinality() == Integer.MAX_VALUE)
            dst.setMax("*");
        else
            dst.setMax(src.getMaxCardinality().toString());
    }
    if (src.getMinCardinality() != null)
        dst.setMin(src.getMinCardinality());
    if (src.getFixed() != null)
        dst.setFixed(src.getFixed());
    if (src.hasMustSupport())
        dst.setMustSupport(src.isMustSupport());
    if (src.hasModifier())
        dst.setIsModifier(src.isModifier());
    if (dst.getIsModifier())
        dst.setIsModifierReason(src.getModifierReason());
    if (src.hasSummaryItem() && dst.getPath().contains("."))
        dst.setIsSummaryElement(Factory.newBoolean(src.isSummary()));
    for (Invariant id : src.getStatedInvariants()) dst.addCondition(id.getId());
    // dDst.
    for (TypeRef t : src.getTypes()) {
        if (t.hasParams()) {
            for (String tp : t.getParams()) {
                if (definitions.hasLogicalModel(tp)) {
                    for (String tpn : definitions.getLogicalModel(tp).getImplementations()) {
                        ElementDefinition.TypeRefComponent type = dst.getType(t.getName());
                        String pr = "http://hl7.org/fhir/StructureDefinition/" + tpn;
                        type.addTargetProfile(pr);
                    }
                } else {
                    ElementDefinition.TypeRefComponent type = dst.getType(t.getName());
                    String pr = t.hasProfile() ? t.getProfile() : // this should only happen if t.getParams().size() == 1
                    "http://hl7.org/fhir/StructureDefinition/" + (tp.equals("Any") ? "Resource" : tp);
                    if (type.getWorkingCode().equals("Reference") || type.getWorkingCode().equals("canonical") || type.getWorkingCode().equals("CodeableReference"))
                        type.addTargetProfile(pr);
                    else
                        type.addProfile(pr);
                }
            }
        } else if (t.isWildcardType()) {
            for (String n : TypesUtilities.wildcardTypes(version.toString())) dst.getType(n);
        } else {
            if (definitions != null && definitions.getConstraints().containsKey(t.getName())) {
                ProfiledType ct = definitions.getConstraints().get(t.getName());
                ElementDefinition.TypeRefComponent type = dst.getType(ct.getBaseType());
                type.addProfile("http://hl7.org/fhir/StructureDefinition/" + ct.getName());
            } else if ("Extension.url".equals(path)) {
            // juat don't populate it
            // ElementDefinition.TypeRefComponent tt = dst.addType();
            // tt.setCodeElement(new UriType());
            // tt.getFormatCommentsPre().add("Note: special primitive values do not have an assigned type. e.g. this is compiler magic. XML, JSON and RDF types provided by extension");
            // ToolingExtensions.addStringExtension(tt.getCodeElement(), ToolingExtensions.EXT_JSON_TYPE, "string");
            // ToolingExtensions.addStringExtension(tt.getCodeElement(), ToolingExtensions.EXT_XML_TYPE, "xs:anyURI");
            // ToolingExtensions.addStringExtension(tt.getCodeElement(), ToolingExtensions.EXT_RDF_TYPE, "xs:anyURI");
            } else {
                ElementDefinition.TypeRefComponent type = dst.getType(t.getName());
                if (t.hasProfile())
                    if (type.getWorkingCode().equals("Reference") || type.getWorkingCode().equals("CodeableReference"))
                        type.addTargetProfile(t.getProfile());
                    else
                        type.addProfile(t.getProfile());
            }
        }
    }
    if (definitions != null) {
        // igtodo - catch this
        for (String mu : definitions.getMapTypes().keySet()) {
            if (src.hasMapping(mu)) {
                addMapping(ed, dst, mu, src.getMapping(mu), null);
            }
        }
    }
    for (String in : src.getInvariants().keySet()) {
        ElementDefinitionConstraintComponent con = new ElementDefinitionConstraintComponent();
        Invariant inv = src.getInvariants().get(in);
        con.setKey(inv.getId());
        if (!con.hasKey()) {
            extensionCounter++;
            con.setKey("exd-" + Integer.toString(extensionCounter));
        }
        con.setRequirements(inv.getRequirements());
        if (Utilities.noString(inv.getSeverity()))
            con.setSeverity(ConstraintSeverity.ERROR);
        else
            con.setSeverity(ConstraintSeverity.fromCode(inv.getSeverity()));
        con.setHuman(inv.getEnglish());
        con.setXpath(inv.getXpath());
        if (!"n/a".equals(inv.getExpression()))
            con.setExpression(inv.getExpression());
        dst.getConstraint().add(con);
    }
    if (src.hasBinding())
        dst.setBinding(generateBinding(src.getBinding()));
    if (src.getElements().isEmpty()) {
        if (path == null)
            throw new Exception("?error parsing extension");
    } else {
        ElementDefn url = src.getElements().get(0);
        if (!url.getName().equals("url"))
            throw new Exception("first child of extension should be 'url', not " + url.getName() + " for structure definition " + ed.getUrl());
        convertElements(url, ed, thisPath + ".url");
        // this pair might leave elements out of order, but we're going to sort them later
        if (!hasValue(src)) {
            ElementDefn value = new ElementDefn();
            value.setName("value[x]");
            value.setMinCardinality(0);
            value.setMaxCardinality(0);
            convertElements(value, ed, thisPath + ".value[x]");
        } else {
            ElementDefn ext = new ElementDefn();
            // can't have an extension if you have a value
            ext.setName("extension");
            ext.setMaxCardinality(0);
            convertElements(ext, ed, thisPath + ".extension");
        }
        if (src.getElements().size() == 2 && src.getElements().get(0).getName().equals("url") && src.getElements().get(1).getName().equals("value[x]")) {
            ElementDefn value = src.getElements().get(1);
            value.setMinCardinality(1);
            convertElements(value, ed, thisPath + ".value[x]");
        } else {
            for (ElementDefn child : src.getElements()) {
                if (child != url) {
                    if (child.getName().startsWith("value") && !child.getName().startsWith("valueSet"))
                        convertElements(child, ed, thisPath + "." + child.getName());
                    else {
                        if (child.getElements().size() == 0 || !child.getElements().get(0).getName().equals("url")) {
                            ElementDefn childUrl = new ElementDefn();
                            childUrl.setName("url");
                            childUrl.setXmlAttribute(true);
                            childUrl.getTypes().add(new TypeRef("uri"));
                            childUrl.setFixed(new UriType(child.getName()));
                            child.getElements().add(0, childUrl);
                        }
                        if (!hasValue(child)) {
                            ElementDefn value = new ElementDefn();
                            value.setName("value[x]");
                            value.setMinCardinality(0);
                            value.setMaxCardinality(0);
                            child.getElements().add(value);
                        }
                        convertElements(child, ed, thisPath + ".extension");
                    }
                }
            }
        }
    }
}
Also used : Invariant(org.hl7.fhir.definitions.model.Invariant) ProfiledType(org.hl7.fhir.definitions.model.ProfiledType) TypeRefComponent(org.hl7.fhir.r5.model.ElementDefinition.TypeRefComponent) TypeRef(org.hl7.fhir.definitions.model.TypeRef) StructureDefinitionDifferentialComponent(org.hl7.fhir.r5.model.StructureDefinition.StructureDefinitionDifferentialComponent) ElementDefn(org.hl7.fhir.definitions.model.ElementDefn) ElementDefinition(org.hl7.fhir.r5.model.ElementDefinition) TypeRefComponent(org.hl7.fhir.r5.model.ElementDefinition.TypeRefComponent) ElementDefinitionConstraintComponent(org.hl7.fhir.r5.model.ElementDefinition.ElementDefinitionConstraintComponent) FHIRException(org.hl7.fhir.exceptions.FHIRException) URISyntaxException(java.net.URISyntaxException) UriType(org.hl7.fhir.r5.model.UriType)

Example 12 with Invariant

use of org.hl7.fhir.definitions.model.Invariant in project kindling by HL7.

the class ProfileGenerator method buildDefinitionFromElement.

private void buildDefinitionFromElement(String path, ElementDefinition ce, ElementDefn e, Profile ap, StructureDefinition p, String inheritedType, boolean isInterface) throws Exception {
    if (!Utilities.noString(e.getComments()))
        ce.setComment(preProcessMarkdown(e.getComments(), "Element Comments"));
    if (!Utilities.noString(e.getShortDefn()))
        ce.setShort(e.getShortDefn());
    if (!Utilities.noString(e.getDefinition())) {
        ce.setDefinition(preProcessMarkdown(e.getDefinition(), "Element Definition"));
        if (!Utilities.noString(e.getShortDefn()))
            ce.setShort(e.getShortDefn());
    }
    if (path.contains(".") && !Utilities.noString(e.getRequirements()))
        ce.setRequirements(preProcessMarkdown(e.getRequirements(), "Element Requirements"));
    if (e.hasMustSupport())
        ce.setMustSupport(e.isMustSupport());
    if (!Utilities.noString(e.getMaxLength()))
        ce.setMaxLength(Integer.parseInt(e.getMaxLength()));
    // no purpose here
    if (e.getMinCardinality() != null)
        ce.setMin(e.getMinCardinality());
    if (e.getMaxCardinality() != null)
        ce.setMax(e.getMaxCardinality() == Integer.MAX_VALUE ? "*" : e.getMaxCardinality().toString());
    // we don't know mustSupport here
    if (e.hasModifier())
        ce.setIsModifier(e.isModifier());
    if (ce.getIsModifier())
        ce.setIsModifierReason(e.getModifierReason());
    // ce.setConformance(getType(e.getConformance()));
    for (Invariant id : e.getStatedInvariants()) {
        ce.addCondition(id.getId());
    }
    ce.setFixed(e.getFixed());
    ce.setPattern(e.getPattern());
    // ce.setDefaultValue(e.getDefaultValue());
    ce.setMeaningWhenMissing(e.getMeaningWhenMissing());
    if (e.getExample() != null)
        ce.addExample().setLabel("General").setValue(e.getExample());
    for (Integer i : e.getOtherExamples().keySet()) {
        Extension ex = ce.addExtension();
        ex.setUrl("http://hl7.org/fhir/StructureDefinition/structuredefinition-example");
        ex.addExtension().setUrl("index").setValue(new StringType(i.toString()));
        ex.addExtension().setUrl("exValue").setValue(e.getOtherExamples().get(i));
    }
    for (String s : e.getAliases()) ce.addAlias(s);
    if (e.hasSummaryItem() && ce.getPath().contains("."))
        ce.setIsSummaryElement(Factory.newBoolean(e.isSummary()));
    for (String n : definitions.getMapTypes().keySet()) {
        addMapping(p, ce, n, e.getMapping(n), null);
    }
    if (ap != null) {
        for (String n : ap.getMappingSpaces().keySet()) {
            addMapping(p, ce, n, e.getMapping(n), ap);
        }
    }
    ToolingExtensions.addDisplayHint(ce, e.getDisplayHint());
    if (!isInterface) {
        convertConstraints(e, ce, inheritedType == null ? p.getUrl() : "http://hl7.org/fhir/StructureDefinition/" + inheritedType);
    }
// we don't have anything to say about constraints on resources
}
Also used : Extension(org.hl7.fhir.r5.model.Extension) Invariant(org.hl7.fhir.definitions.model.Invariant) StringType(org.hl7.fhir.r5.model.StringType)

Example 13 with Invariant

use of org.hl7.fhir.definitions.model.Invariant in project kindling by HL7.

the class DictHTMLGenerator method invariants.

// 
// 
// for (String id : ids) {
// ElementDefinitionConstraintComponent inv = getConstraint(constraints, id);
// s.append("<tr><td><b title=\"Formal Invariant Identifier\">"+inv.getId()+"</b></td><td>"+presentLevel(inv)+"</td><td>(base)</td><td>"+Utilities.escapeXml(inv.getHuman())+"</td><td><span style=\"font-family: Courier New, monospace\">"+Utilities.escapeXml(inv.getExpression())+"</span>");
// if (inv.hasExtension("http://hl7.org/fhir/StructureDefinition/elementdefinition-bestpractice"))
// s.append("<br/>This is (only) a best practice guideline because: <blockquote>"+page.processMarkdown("best practice guideline", inv.getExtensionString("http://hl7.org/fhir/StructureDefinition/elementdefinition-bestpractice-explanation"), prefix)+"</blockquote>");
// s.append("</td></tr>");
// }
// }
private String invariants(Map<String, Invariant> invariants, List<Invariant> stated) throws Exception {
    List<String> done = new ArrayList<String>();
    StringBuilder s = new StringBuilder();
    if (invariants.size() + stated.size() > 0) {
        s.append("<table class=\"dict\">\r\n");
        if (invariants.size() > 0) {
            s.append("<tr><td colspan=\"4\"><b>Defined on this element</b></td></tr>\r\n");
            List<String> ids = new ArrayList<String>();
            for (String id : invariants.keySet()) ids.add(id);
            Collections.sort(ids, new ConstraintsSorter());
            for (String i : ids) {
                Invariant inv = invariants.get(i);
                done.add(inv.getId());
                s.append("<tr><td width=\"60px\"><b title=\"Formal Invariant Identifier\">" + inv.getId() + "</b></td><td>" + presentLevel(inv) + "</td><td>" + Utilities.escapeXml(inv.getEnglish()) + "</td><td><span style=\"font-family: Courier New, monospace\">" + Utilities.escapeXml(inv.getExpression()) + "</span>");
                if (!Utilities.noString(inv.getExplanation()))
                    s.append("<br/>This is (only) a best practice guideline because: <blockquote>" + page.processMarkdown("best practice guideline", inv.getExplanation(), prefix) + "</blockquote>");
                s.append("</td></tr>");
            }
        }
        if (stated.size() > 0) {
            s.append("<tr><td colspan=\"4\"><b>Affect this element</b></td></tr>\r\n");
            boolean b = false;
            for (Invariant id : stated) {
                if (!done.contains(id.getId())) {
                    s.append("<tr><td width=\"60px\"><b title=\"Formal Invariant Identifier\">" + id.getId() + "</b></td><td>" + presentLevel(id) + "</td><td>" + Utilities.escapeXml(id.getEnglish()) + "</td><td><span style=\"font-family: Courier New, monospace\">" + Utilities.escapeXml(id.getExpression()) + "</span>");
                    if (!Utilities.noString(id.getExplanation()))
                        s.append("<br/>This is (only) a best practice guideline because: <blockquote>" + page.processMarkdown("best practice guideline", id.getExplanation(), prefix) + "</blockquote>");
                    s.append("</td></tr>");
                }
            }
        }
        s.append("</table>\r\n");
    }
    return s.toString();
}
Also used : Invariant(org.hl7.fhir.definitions.model.Invariant) CommaSeparatedStringBuilder(org.hl7.fhir.utilities.CommaSeparatedStringBuilder) ArrayList(java.util.ArrayList)

Example 14 with Invariant

use of org.hl7.fhir.definitions.model.Invariant in project synthea by synthetichealth.

the class FHIRSTU3ExporterTest method testFHIRSTU3Export.

@Test
public void testFHIRSTU3Export() throws Exception {
    TestHelper.loadTestProperties();
    Generator.DEFAULT_STATE = Config.get("test_state.default", "Massachusetts");
    Config.set("exporter.baseDirectory", tempFolder.newFolder().toString());
    FhirContext ctx = FhirStu3.getContext();
    IParser parser = ctx.newJsonParser().setPrettyPrint(true);
    FhirValidator validator = ctx.newValidator();
    validator.setValidateAgainstStandardSchema(true);
    validator.setValidateAgainstStandardSchematron(true);
    ValidationResources validationResources = new ValidationResources();
    List<String> errors = ParallelTestingService.runInParallel((person) -> {
        List<String> validationErrors = new ArrayList<String>();
        TestHelper.exportOff();
        Config.set("exporter.fhir_stu3.export", "true");
        Config.set("exporter.fhir.use_shr_extensions", "true");
        FhirStu3.TRANSACTION_BUNDLE = person.randBoolean();
        String fhirJson = FhirStu3.convertToFHIRJson(person, System.currentTimeMillis());
        // (these should have been converted into URIs)
        if (fhirJson.contains("SNOMED-CT")) {
            validationErrors.add("JSON contains unconverted references to 'SNOMED-CT' (should be URIs)");
        }
        // let's crack open the Bundle and validate
        // each individual entry.resource to get context-sensitive error
        // messages...
        Bundle bundle = parser.parseResource(Bundle.class, fhirJson);
        for (BundleEntryComponent entry : bundle.getEntry()) {
            ValidationResult eresult = validator.validateWithResult(entry.getResource());
            if (!eresult.isSuccessful()) {
                for (SingleValidationMessage emessage : eresult.getMessages()) {
                    boolean valid = false;
                    if (emessage.getMessage().contains("@ Observation obs-7")) {
                        /*
               * The obs-7 invariant basically says that Observations should have values, unless
               * they are made of components. This test replaces an invalid XPath expression
               * that was causing correct instances to fail validation.
               */
                        valid = validateObs7((Observation) entry.getResource());
                    } else if (emessage.getMessage().contains("@ Condition con-4")) {
                        /*
               * The con-4 invariant says "If condition is abated, then clinicalStatus must be
               * either inactive, resolved, or remission" which is very clear and sensical.
               * However, the XPath expression does not evaluate correctly for valid instances,
               * so we must manually validate.
               */
                        valid = validateCon4((Condition) entry.getResource());
                    } else if (emessage.getMessage().contains("@ MedicationRequest mps-1")) {
                        /*
               * The mps-1 invariant says MedicationRequest.requester.onBehalfOf can only be
               * specified if MedicationRequest.requester.agent is practitioner or device.
               * But the invariant is poorly written and does not correctly handle references
               * starting with "urn:uuid"
               */
                        // ignore this error
                        valid = true;
                    } else if (emessage.getMessage().contains("per-1: If present, start SHALL have a lower value than end")) {
                        /*
               * The per-1 invariant does not account for daylight savings time... so, if the
               * daylight savings switch happens between the start and end, the validation
               * fails, even if it is valid.
               */
                        // ignore this error
                        valid = true;
                    }
                    if (!valid) {
                        System.out.println(parser.encodeResourceToString(entry.getResource()));
                        System.out.println("ERROR: " + emessage.getMessage());
                        validationErrors.add(emessage.getMessage());
                    }
                }
            }
            // Check ExplanationOfBenefit Resources against BlueButton
            if (entry.getResource().fhirType().equals("ExplanationOfBenefit")) {
                ValidationResult bbResult = validationResources.validateSTU3(entry.getResource());
                for (SingleValidationMessage message : bbResult.getMessages()) {
                    if (message.getMessage().contains("extension https://bluebutton.cms.gov/assets")) {
                        /*
               * The instance validator complains about the BlueButton extensions, ignore
               */
                        continue;
                    } else if (message.getSeverity() == ResultSeverityEnum.ERROR) {
                        if (!(message.getMessage().contains("Element 'ExplanationOfBenefit.id': minimum required = 1, but only found 0") || message.getMessage().contains("Could not verify slice for profile"))) {
                            // For some reason the validator is not detecting the IDs on the resources,
                            // even though they appear to be present while debugging and during normal
                            // operations.
                            System.out.println(message.getSeverity() + ": " + message.getMessage());
                            Assert.fail(message.getSeverity() + ": " + message.getMessage());
                        }
                    }
                }
            }
        }
        if (!validationErrors.isEmpty()) {
            FailedExportHelper.dumpInfo("FHIRSTU3", fhirJson, validationErrors, person);
        }
        return validationErrors;
    });
    assertTrue("Validation of exported FHIR bundle failed: " + String.join("|", errors), errors.size() == 0);
}
Also used : FhirContext(ca.uhn.fhir.context.FhirContext) SingleValidationMessage(ca.uhn.fhir.validation.SingleValidationMessage) Bundle(org.hl7.fhir.dstu3.model.Bundle) ArrayList(java.util.ArrayList) FhirValidator(ca.uhn.fhir.validation.FhirValidator) ValidationResult(ca.uhn.fhir.validation.ValidationResult) BundleEntryComponent(org.hl7.fhir.dstu3.model.Bundle.BundleEntryComponent) Observation(org.hl7.fhir.dstu3.model.Observation) IParser(ca.uhn.fhir.parser.IParser) Test(org.junit.Test)

Example 15 with Invariant

use of org.hl7.fhir.definitions.model.Invariant in project kindling by HL7.

the class ProfileGenerator method convertConstraints.

private void convertConstraints(ElementDefn e, ElementDefinition ce, String source) throws FHIRException {
    for (String in : e.getInvariants().keySet()) {
        ElementDefinitionConstraintComponent con = new ElementDefinitionConstraintComponent();
        Invariant inv = e.getInvariants().get(in);
        con.setKey(inv.getId());
        if (!con.hasKey()) {
            profileCounter++;
            con.setKey("prf-" + Integer.toString(profileCounter));
        }
        con.setRequirements(inv.getRequirements());
        if (Utilities.noString(inv.getSeverity()))
            con.setSeverity(ConstraintSeverity.ERROR);
        else if (inv.getSeverity().equals("best-practice")) {
            con.setSeverity(ConstraintSeverity.WARNING);
            ToolingExtensions.addBooleanExtension(con, ToolingExtensions.EXT_BEST_PRACTICE, true);
            if (Utilities.noString(inv.getExplanation()))
                throw new FHIRException("Best Practice Invariants need to have an explanation");
            con.addExtension().setUrl(ToolingExtensions.EXT_BEST_PRACTICE_EXPLANATION).setValue(new MarkdownType(inv.getExplanation()));
        } else
            con.setSeverity(ConstraintSeverity.fromCode(inv.getSeverity()));
        con.setHuman(inv.getEnglish());
        con.setXpath(inv.getXpath());
        if (!Utilities.isAbsoluteUrl(source)) {
            throw new Error("source : " + source);
        }
        con.setSource(source);
        if (!"n/a".equals(inv.getExpression()))
            con.setExpression(inv.getExpression());
        ce.getConstraint().add(con);
    }
}
Also used : Invariant(org.hl7.fhir.definitions.model.Invariant) FHIRFormatError(org.hl7.fhir.exceptions.FHIRFormatError) MarkdownType(org.hl7.fhir.r5.model.MarkdownType) ElementDefinitionConstraintComponent(org.hl7.fhir.r5.model.ElementDefinition.ElementDefinitionConstraintComponent) FHIRException(org.hl7.fhir.exceptions.FHIRException)

Aggregations

Invariant (org.hl7.fhir.definitions.model.Invariant)21 ElementDefn (org.hl7.fhir.definitions.model.ElementDefn)11 FHIRException (org.hl7.fhir.exceptions.FHIRException)10 ArrayList (java.util.ArrayList)7 TypeRef (org.hl7.fhir.definitions.model.TypeRef)6 CommaSeparatedStringBuilder (org.hl7.fhir.utilities.CommaSeparatedStringBuilder)6 ElementDefinitionConstraintComponent (org.hl7.fhir.r5.model.ElementDefinition.ElementDefinitionConstraintComponent)5 Sheet (org.hl7.fhir.utilities.xls.XLSXmlParser.Sheet)5 ResourceDefn (org.hl7.fhir.definitions.model.ResourceDefn)4 ElementDefinition (org.hl7.fhir.r5.model.ElementDefinition)4 ProfiledType (org.hl7.fhir.definitions.model.ProfiledType)3 TypeRefComponent (org.hl7.fhir.r5.model.ElementDefinition.TypeRefComponent)3 StringType (org.hl7.fhir.r5.model.StringType)3 BindingSpecification (org.hl7.fhir.definitions.model.BindingSpecification)2 TypeDefn (org.hl7.fhir.definitions.model.TypeDefn)2 FHIRFormatError (org.hl7.fhir.exceptions.FHIRFormatError)2 StructureDefinitionContextComponent (org.hl7.fhir.r5.model.StructureDefinition.StructureDefinitionContextComponent)2 UriType (org.hl7.fhir.r5.model.UriType)2 StandardsStatus (org.hl7.fhir.utilities.StandardsStatus)2 FhirContext (ca.uhn.fhir.context.FhirContext)1