Search in sources :

Example 1 with IgLoader

use of org.hl7.fhir.validation.IgLoader in project org.hl7.fhir.core by hapifhir.

the class IgLoader method loadContent.

/**
 * @param source
 * @param opName
 * @param asIg
 * @return
 * @throws FHIRException
 * @throws IOException
 *
 *    * @see IgLoader#loadIgSource(String, boolean, boolean) loadIgSource for detailed description of the src parameter
 */
public Content loadContent(String source, String opName, boolean asIg) throws FHIRException, IOException {
    Map<String, byte[]> s = loadIgSource(source, false, asIg);
    Content res = new Content();
    if (s.size() != 1)
        throw new FHIRException("Unable to find resource " + source + " to " + opName);
    for (Map.Entry<String, byte[]> t : s.entrySet()) {
        res.focus = t.getValue();
        if (t.getKey().endsWith(".json"))
            res.cntType = Manager.FhirFormat.JSON;
        else if (t.getKey().endsWith(".xml"))
            res.cntType = Manager.FhirFormat.XML;
        else if (t.getKey().endsWith(".ttl"))
            res.cntType = Manager.FhirFormat.TURTLE;
        else if (t.getKey().endsWith(".shc"))
            res.cntType = Manager.FhirFormat.SHC;
        else if (t.getKey().endsWith(".txt") || t.getKey().endsWith(".map"))
            res.cntType = Manager.FhirFormat.TEXT;
        else
            throw new FHIRException("Todo: Determining resource type is not yet done");
    }
    return res;
}
Also used : FHIRException(org.hl7.fhir.exceptions.FHIRException) HashMap(java.util.HashMap) Map(java.util.Map)

Example 2 with IgLoader

use of org.hl7.fhir.validation.IgLoader in project org.hl7.fhir.core by hapifhir.

the class ValidationEngine method loadCoreDefinitions.

/**
 * @param src
 * @param recursive
 * @param terminologyCachePath
 * @param userAgent
 * @param tt
 * @param loggingService
 * @throws FHIRException
 * @throws IOException
 *
 * @see IgLoader#loadIgSource(String, boolean, boolean) loadIgSource for detailed description of the src parameter
 */
private void loadCoreDefinitions(String src, boolean recursive, String terminologyCachePath, String userAgent, TimeTracker tt, IWorkerContext.ILoggingService loggingService) throws FHIRException, IOException {
    NpmPackage npm = getPcm().loadPackage(src, null);
    if (npm != null) {
        version = npm.fhirVersion();
        SimpleWorkerContext.SimpleWorkerContextBuilder contextBuilder = new SimpleWorkerContext.SimpleWorkerContextBuilder().withLoggingService(loggingService);
        if (terminologyCachePath != null)
            contextBuilder = contextBuilder.withTerminologyCachePath(terminologyCachePath);
        if (userAgent != null) {
            contextBuilder.withUserAgent(userAgent);
        }
        context = contextBuilder.fromPackage(npm, ValidatorUtils.loaderForVersion(version));
    } else {
        Map<String, byte[]> source = igLoader.loadIgSource(src, recursive, true);
        if (version == null) {
            version = getVersionFromPack(source);
        }
        SimpleWorkerContext.SimpleWorkerContextBuilder contextBuilder = new SimpleWorkerContext.SimpleWorkerContextBuilder();
        if (terminologyCachePath != null)
            contextBuilder = contextBuilder.withTerminologyCachePath(terminologyCachePath);
        if (userAgent != null) {
            contextBuilder.withUserAgent(userAgent);
        }
        context = contextBuilder.fromDefinitions(source, ValidatorUtils.loaderForVersion(version), new PackageVersion(src, new Date()));
        ValidatorUtils.grabNatives(getBinaries(), source, "http://hl7.org/fhir");
    }
    // on https://chat.fhir.org/#narrow/stream/179167-hapi
    try {
        ClassLoader classLoader = ValidationEngine.class.getClassLoader();
        InputStream ue = classLoader.getResourceAsStream("ucum-essence.xml");
        context.setUcumService(new UcumEssenceService(ue));
    } catch (Exception e) {
        throw new FHIRException("Error loading UCUM from embedded ucum-essence.xml: " + e.getMessage(), e);
    }
    initContext(tt);
}
Also used : SimpleWorkerContext(org.hl7.fhir.r5.context.SimpleWorkerContext) PackageVersion(org.hl7.fhir.r5.context.IWorkerContext.PackageVersion) FHIRException(org.hl7.fhir.exceptions.FHIRException) URISyntaxException(java.net.URISyntaxException) SAXException(org.xml.sax.SAXException) DefinitionException(org.hl7.fhir.exceptions.DefinitionException) FHIRException(org.hl7.fhir.exceptions.FHIRException) UcumEssenceService(org.fhir.ucum.UcumEssenceService) NpmPackage(org.hl7.fhir.utilities.npm.NpmPackage)

Example 3 with IgLoader

use of org.hl7.fhir.validation.IgLoader in project org.hl7.fhir.core by hapifhir.

the class IgLoaderTests method testFailIfInvalidFHIRVersion.

@Test
public void testFailIfInvalidFHIRVersion() throws IOException {
    IgLoader igLoader = Mockito.spy(new IgLoader(filesystemPackageCacheManager, simpleWorkerContext, "4.0.1"));
    Exception exception = assertThrows(FHIRException.class, () -> {
        List<ImplementationGuide> igs = Collections.emptyList();
        igLoader.loadIg(igs, Collections.emptyMap(), "[0.1.2]" + DUMMY_PATH, false);
    });
    assertLinesMatch(Arrays.asList(".*Unsupported FHIR Version.*"), Arrays.asList(exception.getMessage()));
}
Also used : ImplementationGuide(org.hl7.fhir.r5.model.ImplementationGuide) IOException(java.io.IOException) FHIRException(org.hl7.fhir.exceptions.FHIRException) Test(org.junit.jupiter.api.Test) ParameterizedTest(org.junit.jupiter.params.ParameterizedTest)

Example 4 with IgLoader

use of org.hl7.fhir.validation.IgLoader in project org.hl7.fhir.core by hapifhir.

the class ValidationTests method test.

@SuppressWarnings("deprecation")
@Test
public void test() throws Exception {
    CacheVerificationLogger logger = new CacheVerificationLogger();
    long setup = System.nanoTime();
    this.name = name;
    System.out.println("---- " + name + " ----------------------------------------------------------------");
    System.out.println("** Core: ");
    String txLog = null;
    if (content.has("txLog")) {
        txLog = content.get("txLog").getAsString();
    }
    version = "5.0";
    List<ValidationMessage> messages = new ArrayList<ValidationMessage>();
    if (content.has("version")) {
        version = content.get("version").getAsString();
    }
    version = VersionUtilities.getMajMin(version);
    if (!ve.containsKey(version)) {
        if (version.startsWith("5.0"))
            ve.put(version, TestUtilities.getValidationEngine("hl7.fhir.r5.core#4.5.0", ValidationEngineTests.DEF_TX, txLog, FhirPublication.R5, true, "4.5.0"));
        else if (version.startsWith("4.3"))
            ve.put(version, TestUtilities.getValidationEngine("hl7.fhir.r4b.core#4.3.0", ValidationEngineTests.DEF_TX, txLog, FhirPublication.R4B, true, "4.3.0"));
        else if (version.startsWith("4.0"))
            ve.put(version, TestUtilities.getValidationEngine("hl7.fhir.r4.core#4.0.1", ValidationEngineTests.DEF_TX, txLog, FhirPublication.R4, true, "4.0.1"));
        else if (version.startsWith("3.0"))
            ve.put(version, TestUtilities.getValidationEngine("hl7.fhir.r3.core#3.0.2", ValidationEngineTests.DEF_TX, txLog, FhirPublication.STU3, true, "3.0.2"));
        else if (version.startsWith("1.4"))
            ve.put(version, TestUtilities.getValidationEngine("hl7.fhir.r2b.core#1.4.0", ValidationEngineTests.DEF_TX, txLog, FhirPublication.DSTU2016May, true, "1.4.0"));
        else if (version.startsWith("1.0"))
            ve.put(version, TestUtilities.getValidationEngine("hl7.fhir.r2.core#1.0.2", ValidationEngineTests.DEF_TX, txLog, FhirPublication.DSTU2, true, "1.0.2"));
        else
            throw new Exception("unknown version " + version);
    }
    vCurr = ve.get(version);
    vCurr.getContext().getTxClient().setLogger(logger);
    igLoader = new IgLoader(vCurr.getPcm(), vCurr.getContext(), vCurr.getVersion(), true);
    if (TestingUtilities.fcontexts == null) {
        TestingUtilities.fcontexts = new HashMap<>();
    }
    TestingUtilities.fcontexts.put(version, vCurr.getContext());
    if (content.has("use-test") && !content.get("use-test").getAsBoolean())
        return;
    byte[] testCaseContent = TestingUtilities.loadTestResource("validator", JSONUtil.str(content, "file")).getBytes(StandardCharsets.UTF_8);
    // load and process content
    FhirFormat fmt = determineFormat(content, testCaseContent);
    InstanceValidator val = vCurr.getValidator(fmt);
    val.setWantCheckSnapshotUnchanged(true);
    val.getContext().setClientRetryCount(4);
    val.setDebug(false);
    if (content.has("fetcher") && "standalone".equals(JSONUtil.str(content, "fetcher"))) {
        val.setFetcher(vCurr);
        vCurr.setFetcher(new StandAloneValidatorFetcher(vCurr.getPcm(), vCurr.getContext(), vCurr));
    } else {
        val.setFetcher(this);
    }
    val.setPolicyAdvisor(this);
    if (content.has("allowed-extension-domain"))
        val.getExtensionDomains().add(content.get("allowed-extension-domain").getAsString());
    if (content.has("allowed-extension-domains"))
        for (JsonElement a : content.getAsJsonArray("allowed-extension-domains")) val.getExtensionDomains().add(a.getAsString());
    if (content.has("language"))
        val.setValidationLanguage(content.get("language").getAsString());
    else
        val.setValidationLanguage(null);
    if (content.has("default-version")) {
        val.setBaseOptions(val.getBaseOptions().setVersionFlexible(content.get("default-version").getAsBoolean()));
    } else {
        val.setBaseOptions(val.getBaseOptions().setVersionFlexible(false));
    }
    if (content.has("packages")) {
        for (JsonElement e : content.getAsJsonArray("packages")) {
            String n = e.getAsString();
            InputStream cnt = n.endsWith(".tgz") ? TestingUtilities.loadTestResourceStream("validator", n) : null;
            if (cnt != null) {
                igLoader.loadPackage(NpmPackage.fromPackage(cnt));
            } else {
                igLoader.loadIg(vCurr.getIgs(), vCurr.getBinaries(), n, true);
            }
        }
    }
    if (content.has("crumb-trail")) {
        val.setCrumbTrails(content.get("crumb-trail").getAsBoolean());
    }
    if (content.has("supporting")) {
        for (JsonElement e : content.getAsJsonArray("supporting")) {
            String filename = e.getAsString();
            String contents = TestingUtilities.loadTestResource("validator", filename);
            CanonicalResource mr = (CanonicalResource) loadResource(filename, contents);
            val.getContext().cacheResource(mr);
            if (mr instanceof ImplementationGuide) {
                val.getImplementationGuides().add((ImplementationGuide) mr);
            }
        }
    }
    val.getBundleValidationRules().clear();
    if (content.has("bundle-param")) {
        val.getBundleValidationRules().add(new BundleValidationRule(content.getAsJsonObject("bundle-param").get("rule").getAsString(), content.getAsJsonObject("bundle-param").get("profile").getAsString()));
    }
    if (content.has("profiles")) {
        for (JsonElement je : content.getAsJsonArray("profiles")) {
            String filename = je.getAsString();
            String contents = TestingUtilities.loadTestResource("validator", filename);
            StructureDefinition sd = loadProfile(filename, contents, messages, val.isDebug());
            val.getContext().cacheResource(sd);
        }
    }
    List<ValidationMessage> errors = new ArrayList<ValidationMessage>();
    if (content.getAsJsonObject("java").has("debug")) {
        val.setDebug(content.getAsJsonObject("java").get("debug").getAsBoolean());
    } else {
        val.setDebug(false);
    }
    if (content.has("best-practice")) {
        val.setBestPracticeWarningLevel(BestPracticeWarningLevel.valueOf(content.get("best-practice").getAsString()));
    }
    if (content.has("examples")) {
        val.setAllowExamples(content.get("examples").getAsBoolean());
    } else {
        val.setAllowExamples(true);
    }
    if (content.has("security-checks")) {
        val.setSecurityChecks(content.get("security-checks").getAsBoolean());
    }
    if (content.has("logical") == false) {
        val.setAssumeValidRestReferences(content.has("assumeValidRestReferences") ? content.get("assumeValidRestReferences").getAsBoolean() : false);
        System.out.println(String.format("Start Validating (%d to set up)", (System.nanoTime() - setup) / 1000000));
        val.validate(null, errors, new ByteArrayInputStream(testCaseContent), fmt);
        System.out.println(val.reportTimes());
        checkOutcomes(errors, content, null, name);
    }
    if (content.has("profile")) {
        System.out.print("** Profile: ");
        JsonObject profile = content.getAsJsonObject("profile");
        if (profile.has("packages")) {
            for (JsonElement e : profile.getAsJsonArray("packages")) {
                igLoader.loadIg(vCurr.getIgs(), vCurr.getBinaries(), e.getAsString(), true);
            }
        }
        if (profile.getAsJsonObject("java").has("debug")) {
            val.setDebug(profile.getAsJsonObject("java").get("debug").getAsBoolean());
        }
        if (profile.has("supporting")) {
            for (JsonElement e : profile.getAsJsonArray("supporting")) {
                String filename = e.getAsString();
                String contents = TestingUtilities.loadTestResource("validator", filename);
                CanonicalResource mr = (CanonicalResource) loadResource(filename, contents);
                val.getContext().cacheResource(mr);
                if (mr instanceof ImplementationGuide) {
                    val.getImplementationGuides().add((ImplementationGuide) mr);
                }
            }
        }
        StructureDefinition sd = null;
        String filename = profile.get("source").getAsString();
        if (Utilities.isAbsoluteUrl(filename)) {
            sd = val.getContext().fetchResource(StructureDefinition.class, filename);
        } else {
            String contents = TestingUtilities.loadTestResource("validator", filename);
            System.out.println("Name: " + name + " - profile : " + profile.get("source").getAsString());
            version = content.has("version") ? content.get("version").getAsString() : Constants.VERSION;
            sd = loadProfile(filename, contents, messages, val.isDebug());
            val.getContext().cacheResource(sd);
        }
        val.setAssumeValidRestReferences(profile.has("assumeValidRestReferences") ? profile.get("assumeValidRestReferences").getAsBoolean() : false);
        List<ValidationMessage> errorsProfile = new ArrayList<ValidationMessage>();
        val.validate(null, errorsProfile, new ByteArrayInputStream(testCaseContent), fmt, asSdList(sd));
        System.out.println(val.reportTimes());
        checkOutcomes(errorsProfile, profile, filename, name);
    }
    if (content.has("logical")) {
        System.out.print("** Logical: ");
        JsonObject logical = content.getAsJsonObject("logical");
        if (logical.has("supporting")) {
            for (JsonElement e : logical.getAsJsonArray("supporting")) {
                String filename = e.getAsString();
                String contents = TestingUtilities.loadTestResource("validator", filename);
                CanonicalResource mr = (CanonicalResource) loadResource(filename, contents);
                if (mr instanceof StructureDefinition) {
                    val.getContext().generateSnapshot((StructureDefinition) mr, true);
                }
                val.getContext().cacheResource(mr);
            }
        }
        if (logical.has("packages")) {
            for (JsonElement e : logical.getAsJsonArray("packages")) {
                igLoader.loadIg(vCurr.getIgs(), vCurr.getBinaries(), e.getAsString(), true);
            }
        }
        List<ValidationMessage> errorsLogical = new ArrayList<ValidationMessage>();
        Element le = val.validate(null, errorsLogical, new ByteArrayInputStream(testCaseContent), fmt);
        if (logical.has("expressions")) {
            FHIRPathEngine fp = new FHIRPathEngine(val.getContext());
            for (JsonElement e : logical.getAsJsonArray("expressions")) {
                String exp = e.getAsString();
                Assert.assertTrue(fp.evaluateToBoolean(null, le, le, le, fp.parse(exp)));
            }
        }
        checkOutcomes(errorsLogical, logical, "logical", name);
    }
    logger.verifyHasNoRequests();
}
Also used : IgLoader(org.hl7.fhir.validation.IgLoader) BundleValidationRule(org.hl7.fhir.r5.utils.validation.BundleValidationRule) InstanceValidator(org.hl7.fhir.validation.instance.InstanceValidator) ValidationMessage(org.hl7.fhir.utilities.validation.ValidationMessage) ImplementationGuide(org.hl7.fhir.r5.model.ImplementationGuide) FHIRPathEngine(org.hl7.fhir.r5.utils.FHIRPathEngine) ByteArrayInputStream(java.io.ByteArrayInputStream) InputStream(java.io.InputStream) JsonElement(com.google.gson.JsonElement) Element(org.hl7.fhir.r5.elementmodel.Element) ArrayList(java.util.ArrayList) JsonObject(com.google.gson.JsonObject) FhirFormat(org.hl7.fhir.r5.elementmodel.Manager.FhirFormat) FileNotFoundException(java.io.FileNotFoundException) NotImplementedException(org.apache.commons.lang3.NotImplementedException) DefinitionException(org.hl7.fhir.exceptions.DefinitionException) PathEngineException(org.hl7.fhir.exceptions.PathEngineException) MalformedURLException(java.net.MalformedURLException) IOException(java.io.IOException) FHIRException(org.hl7.fhir.exceptions.FHIRException) StructureDefinition(org.hl7.fhir.r5.model.StructureDefinition) ByteArrayInputStream(java.io.ByteArrayInputStream) CacheVerificationLogger(org.hl7.fhir.utilities.tests.CacheVerificationLogger) JsonElement(com.google.gson.JsonElement) CanonicalResource(org.hl7.fhir.r5.model.CanonicalResource) StandAloneValidatorFetcher(org.hl7.fhir.validation.cli.services.StandAloneValidatorFetcher) Test(org.junit.Test)

Example 5 with IgLoader

use of org.hl7.fhir.validation.IgLoader in project org.hl7.fhir.core by hapifhir.

the class LoadIgTests method testPackage.

@Test
public void testPackage() {
    String id = "hl7.fhir.r4.core";
    String version = "4.0.1";
    int DO_TIMES = 3;
    try {
        final String fhirSpecVersion = "4.0";
        final String definitions = VersionUtilities.packageForVersion(fhirSpecVersion) + "#" + VersionUtilities.getCurrentVersion(fhirSpecVersion);
        ValidationEngine hl7Validator = new ValidationEngine.ValidationEngineBuilder().fromSource(definitions);
        hl7Validator.setDoNative(false);
        hl7Validator.setAnyExtensionsAllowed(true);
        hl7Validator.prepare();
        IgLoader igLoader = new IgLoader(hl7Validator.getPcm(), hl7Validator.getContext(), hl7Validator.getVersion(), true);
        for (int i = 0; i < DO_TIMES; i++) {
            System.gc();
            System.out.print("loading: allocated memory " + getUsedMemoryAsMbs() + " MB, ");
            System.out.print("free memory " + getFreeMemoryAsMbs() + " MB, ");
            System.out.println("max memory " + getTotalMemoryAsMbs() + " MB");
            // The method under test:
            igLoader.loadIg(hl7Validator.getIgs(), hl7Validator.getBinaries(), id + (version != null ? "#" + version : ""), true);
        }
    } catch (Exception e) {
        e.printStackTrace();
    }
// loadResourceByVersion
}
Also used : IgLoader(org.hl7.fhir.validation.IgLoader) ValidationEngine(org.hl7.fhir.validation.ValidationEngine) Test(org.junit.Test)

Aggregations

IgLoader (org.hl7.fhir.validation.IgLoader)6 FHIRException (org.hl7.fhir.exceptions.FHIRException)5 ValidationEngine (org.hl7.fhir.validation.ValidationEngine)4 ImplementationGuide (org.hl7.fhir.r5.model.ImplementationGuide)3 Test (org.junit.Test)3 IOException (java.io.IOException)2 ArrayList (java.util.ArrayList)2 HashMap (java.util.HashMap)2 Map (java.util.Map)2 DefinitionException (org.hl7.fhir.exceptions.DefinitionException)2 NpmPackage (org.hl7.fhir.utilities.npm.NpmPackage)2 CacheVerificationLogger (org.hl7.fhir.utilities.tests.CacheVerificationLogger)2 Test (org.junit.jupiter.api.Test)2 JsonElement (com.google.gson.JsonElement)1 JsonObject (com.google.gson.JsonObject)1 ByteArrayInputStream (java.io.ByteArrayInputStream)1 FileNotFoundException (java.io.FileNotFoundException)1 InputStream (java.io.InputStream)1 MalformedURLException (java.net.MalformedURLException)1 URISyntaxException (java.net.URISyntaxException)1