Search in sources :

Example 36 with ImplementationGuide

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

the class FilesystemPackageCacheManager method loadFromBuildServer.

private void loadFromBuildServer() throws IOException {
    SimpleHTTPClient http = new SimpleHTTPClient();
    http.trustAllhosts();
    HTTPResult res = http.get("https://build.fhir.org/ig/qas.json?nocache=" + System.currentTimeMillis());
    res.checkThrowException();
    buildInfo = (JsonArray) new com.google.gson.JsonParser().parse(TextFile.bytesToString(res.getContent()));
    List<BuildRecord> builds = new ArrayList<>();
    for (JsonElement n : buildInfo) {
        JsonObject o = (JsonObject) n;
        if (o.has("url") && o.has("package-id") && o.get("package-id").getAsString().contains(".")) {
            String u = o.get("url").getAsString();
            if (u.contains("/ImplementationGuide/"))
                u = u.substring(0, u.indexOf("/ImplementationGuide/"));
            builds.add(new BuildRecord(u, o.get("package-id").getAsString(), getRepo(o.get("repo").getAsString()), readDate(o.get("date").getAsString())));
        }
    }
    Collections.sort(builds, new BuildRecordSorter());
    for (BuildRecord bld : builds) {
        if (!ciList.containsKey(bld.getPackageId())) {
            ciList.put(bld.getPackageId(), "https://build.fhir.org/ig/" + bld.getRepo());
        }
    }
    // whether it succeeds or not
    buildLoaded = true;
}
Also used : HTTPResult(org.hl7.fhir.utilities.SimpleHTTPClient.HTTPResult) SimpleHTTPClient(org.hl7.fhir.utilities.SimpleHTTPClient) JsonElement(com.google.gson.JsonElement) JsonObject(com.google.gson.JsonObject)

Example 37 with ImplementationGuide

use of org.hl7.fhir.r4b.model.ImplementationGuide 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 38 with ImplementationGuide

use of org.hl7.fhir.r4b.model.ImplementationGuide in project kindling by HL7.

the class SpecNPMPackageGenerator method generate.

// 
// public static void main(String[] args) throws Exception {
// //    generateForVersion("F:\\fhir\\web\\DSTU2", "http://hl7.org/fhir/DSTU2");
// generateForVersion("E:\\fhir\\web\\2016May", "http://hl7.org/fhir/2016May", new Date());
// //    generateForVersion("F:\\fhir\\web\\STU3", "http://hl7.org/fhir/2016STU3");
// System.out.println("Done");
// }
// private static void generateForVersion(String folder, String url, Date genDate) throws Exception {
// SpecNPMPackageGenerator self = new SpecNPMPackageGenerator();
// self.generate(folder, url, false, genDate);
// }
// 
public void generate(String folder, String url, boolean forWeb, Date genDate, String pidRoot) throws Exception {
    System.out.println("Generate Package for " + folder);
    Map<String, byte[]> files = loadZip(new FileInputStream(Utilities.path(folder, "igpack.zip")));
    FHIRVersion version = determineVersion(files);
    System.out.println(" .. Loading v" + version);
    SpecMapManager spm = new SpecMapManager(files.get("spec.internals"), version.toCode());
    System.out.println(" .. Conformance Resources");
    List<ResourceEntry> reslist = makeResourceList(files, version.toCode());
    System.out.println(" .. Other Resources");
    addToResList(folder, reslist, version.toCode());
    System.out.println(" .. building IG");
    ImplementationGuide ig = new ImplementationGuide();
    ig.setId("fhir");
    ig.setUrl("http://hl7.org/fhir/ImplementationGuide/fhir");
    ig.setVersion(version.toCode());
    ig.addFhirVersion(version);
    ig.setLicense(SPDXLicense.CC01_0);
    ig.setTitle("FHIR Core package");
    ig.setDescription("FHIR Core package - the NPM package that contains all the definitions for the base FHIR specification");
    ig.setPublisher("HL7 Inc");
    ig.getContactFirstRep().getTelecomFirstRep().setSystem(ContactPointSystem.URL).setValue("http://hl7.org/fhir");
    ig.setPackageId(pidRoot + ".core");
    ig.getManifest().setRendering(url);
    for (ResourceEntry e : reslist) {
        ManifestResourceComponent r = ig.getManifest().addResource();
        r.setReference(new Reference(e.type + "/" + e.id));
        if (e.conf)
            r.setExample(new BooleanType(true));
        r.setRelativePath(spm.getPath(e.canonical, null));
    }
    for (String k : files.keySet()) {
        if (k.endsWith(".png") || k.endsWith(".gif"))
            ig.getManifest().addImage(k);
        else if (k.endsWith(".css"))
            ig.getManifest().addOther(k);
    }
    Map<String, ManifestPageComponent> map = new HashMap<String, ManifestPageComponent>();
    for (String k : spm.getPages()) {
        ManifestPageComponent pp = ig.getManifest().addPage();
        pp.setName(k).setTitle(spm.getPage(k));
        map.put(pp.getName(), pp);
    }
    for (String k : spm.getTargets()) {
        String n = null;
        String f = null;
        if (k.contains("#")) {
            n = k.substring(0, k.indexOf("#"));
            f = k.substring(k.indexOf("#") + 1);
        } else
            n = k;
        ManifestPageComponent p = map.get(n);
        if (p == null) {
            p = ig.getManifest().addPage();
            p.setName(n);
            map.put(p.getName(), p);
        }
        if (f != null)
            p.addAnchor(f);
    }
    // ok ig is full loaded...
    System.out.println(" .. Building NPM Package");
    NPMPackageGenerator npm = new NPMPackageGenerator(Utilities.path(folder, pidRoot + ".core.tgz"), "http://hl7.org/fhir", url, PackageType.CORE, ig, genDate, true);
    ByteArrayOutputStream bs = new ByteArrayOutputStream();
    new org.hl7.fhir.r5.formats.JsonParser().setOutputStyle(OutputStyle.NORMAL).compose(bs, ig);
    // npm.addFile(Category.RESOURCE, "ig-r4.json", bs.toByteArray());
    addConvertedIg(npm, ig, version.toCode());
    for (ResourceEntry e : reslist) {
        npm.addFile(Category.RESOURCE, e.type + "-" + e.id + ".json", e.json);
    }
    for (String k : files.keySet()) {
        if (k.endsWith(".png") || k.endsWith(".css") || k.endsWith(".template") || k.endsWith(".zip") || k.endsWith(".gif") || k.equals("spec.internals") || k.equals("mappingSpaces.details"))
            npm.addFile(Category.OTHER, k, files.get(k));
    }
    for (String fn : new File(folder).list()) {
        if (fn.endsWith(".schema.json") || fn.endsWith(".openapi.json")) {
            byte[] b = TextFile.fileToBytes(Utilities.path(folder, fn));
            npm.addFile(Category.OPENAPI, fn, b);
        }
        if (fn.endsWith(".xsd") || fn.endsWith(".sch")) {
            byte[] b = TextFile.fileToBytes(Utilities.path(folder, fn));
            npm.addFile(Category.SCHEMATRON, fn, b);
        }
    }
    npm.finish();
    System.out.println(" .. Built");
    System.out.println(" .. Building NPM Package (xml)");
    ig.setId("fhir-xml");
    ig.setUrl("http://hl7.org/fhir/ImplementationGuide/fhir-xml");
    ig.setTitle("FHIR Core package (XML Conformance files)");
    ig.setDescription("FHIR Core package - the NPM package that contains all the definitions for the base FHIR specification (XML)");
    ig.setPackageId(pidRoot + ".corexml");
    npm = new NPMPackageGenerator(Utilities.path(folder, pidRoot + ".corexml.tgz"), "http://hl7.org/fhir", url, PackageType.CORE, ig, genDate, true);
    bs = new ByteArrayOutputStream();
    new org.hl7.fhir.r5.formats.XmlParser().setOutputStyle(OutputStyle.NORMAL).compose(bs, ig);
    npm.addFile(Category.RESOURCE, "ig-r4.json", bs.toByteArray());
    addConvertedIgX(npm, ig, version.toCode());
    for (ResourceEntry e : reslist) {
        if (e.xml != null)
            npm.addFile(Category.RESOURCE, e.type + "-" + e.id + ".xml", e.xml);
    }
    npm.finish();
    System.out.println(" .. Built");
}
Also used : SpecMapManager(org.hl7.fhir.tools.publisher.SpecMapManager) XmlParser(org.hl7.fhir.r5.formats.XmlParser) ImplementationGuide(org.hl7.fhir.r5.model.ImplementationGuide) HashMap(java.util.HashMap) Reference(org.hl7.fhir.r5.model.Reference) BooleanType(org.hl7.fhir.r5.model.BooleanType) NPMPackageGenerator(org.hl7.fhir.r5.utils.NPMPackageGenerator) ByteArrayOutputStream(java.io.ByteArrayOutputStream) FileInputStream(java.io.FileInputStream) FHIRVersion(org.hl7.fhir.r5.model.Enumerations.FHIRVersion) ManifestResourceComponent(org.hl7.fhir.r5.model.ImplementationGuide.ManifestResourceComponent) ManifestPageComponent(org.hl7.fhir.r5.model.ImplementationGuide.ManifestPageComponent) File(java.io.File) IniFile(org.hl7.fhir.utilities.IniFile) TextFile(org.hl7.fhir.utilities.TextFile) JsonParser(org.hl7.fhir.r5.formats.JsonParser)

Example 39 with ImplementationGuide

use of org.hl7.fhir.r4b.model.ImplementationGuide in project kindling by HL7.

the class ValueSetFinder method checkSearchParams.

private static void checkSearchParams(File f) throws Exception {
    String folder = Utilities.getDirectoryForFile(f.getAbsolutePath());
    System.out.println(f.getName());
    try {
        Set<String> s = new HashSet<>();
        for (File fsp : new File(folder).listFiles()) {
            if (fsp.getName().startsWith("searchparameter-")) {
                SearchParameter sp = (SearchParameter) new XmlParser().parseAndClose(new FileInputStream(fsp));
                s.add(sp.getId());
            }
        }
        for (File fig : new File(folder).listFiles()) {
            if (fig.getName().startsWith("implementationguide-")) {
                ImplementationGuide ig = (ImplementationGuide) new XmlParser().parseAndClose(new FileInputStream(fig));
                ig.getDefinition().getResource().removeIf(res -> res.getReference().getReference().startsWith("SearchParameter/") && !s.contains(res.getReference().getReference().substring(res.getReference().getReference().indexOf("/") + 1)));
                if (ig.getDefinition().getResource().isEmpty()) {
                    fig.delete();
                } else {
                    new XmlParser().setOutputStyle(OutputStyle.PRETTY).compose(new FileOutputStream(fig), ig);
                }
            }
        }
    } catch (Exception e) {
        System.out.println("  " + e.getMessage());
    }
}
Also used : XmlParser(org.hl7.fhir.r5.formats.XmlParser) XLSXmlParser(org.hl7.fhir.utilities.xls.XLSXmlParser) ImplementationGuide(org.hl7.fhir.r5.model.ImplementationGuide) FileOutputStream(java.io.FileOutputStream) SearchParameter(org.hl7.fhir.r5.model.SearchParameter) File(java.io.File) FileInputStream(java.io.FileInputStream) FileNotFoundException(java.io.FileNotFoundException) FHIRException(org.hl7.fhir.exceptions.FHIRException) HashSet(java.util.HashSet)

Example 40 with ImplementationGuide

use of org.hl7.fhir.r4b.model.ImplementationGuide in project kindling by HL7.

the class IgParser method load.

public void load(String rootDir, ImplementationGuideDefn igd, List<ValidationMessage> issues, Set<String> loadedIgs) throws Exception {
    logger.log(" ..." + igd.getName(), LogMessageType.Process);
    // first: parse the IG, then use it
    String myRoot = Utilities.path(rootDir, "guides", igd.getCode());
    CSFile file = new CSFile(Utilities.path(rootDir, igd.getSource()));
    ImplementationGuide ig = (ImplementationGuide) new XmlParser().parse(new FileInputStream(file));
    if (// for things published in the hl7.org/fhir namespace...
    !ig.getUrl().startsWith("http://hl7.org/fhir/"))
        throw new Exception("Illegal namespace");
    if (!ig.getUrl().equals("http://hl7.org/fhir/" + ig.getId()))
        throw new Exception("Illegal URL");
    if (!ig.hasName())
        throw new Exception("no name on IG");
    ig.setDateElement(new DateTimeType(genDate));
    igd.setName(ig.getName());
    igd.setIg(ig);
    Map<String, Resource> resources = new HashMap<String, Resource>();
    for (ImplementationGuideDependsOnComponent d : ig.getDependsOn()) {
        if (!loadedIgs.contains(d.getUri()))
            throw new Exception("Dependency on " + ig.getName() + " not satisfied: " + d.getUri());
    }
    loadedIgs.add(ig.getUrl());
    // for (UriType bin : ig.getBinary()) {
    // if (!new File(Utilities.path(myRoot, bin.getValue())).exists())
    // throw new Exception("Binary dependency in "+ig.getName()+" not found: "+bin.getValue());
    // igd.getImageList().add(bin.getValue());
    // }
    processPage(ig.getDefinition().getPage(), igd);
    List<Example> exr = new ArrayList<Example>();
    // first pass - verify the resources can be loaded
    for (ImplementationGuideDefinitionResourceComponent r : ig.getDefinition().getResource()) {
        if (!r.hasReference())
            throw new Exception("no source on resource in IG " + ig.getName());
        CSFile fn = new CSFile(Utilities.path(myRoot, r.getReference().getReference()));
        if (!fn.exists())
            throw new Exception("Source " + r.getReference().getReference() + " resource in IG " + ig.getName() + " could not be located @ " + fn.getAbsolutePath());
        String id = Utilities.changeFileExt(fn.getName(), "");
        // we're going to try and load the resource directly.
        // if that fails, then we'll treat it as an example.
        boolean isExample = r.hasExample();
        ResourceType rt = null;
        try {
            rt = new XmlParser().parse(new FileInputStream(fn)).getResourceType();
        } catch (Exception e) {
            rt = null;
            isExample = true;
        }
        if (isExample) {
            if (// which means that non conformance resources must be named
            !r.hasName())
                throw new Exception("no name on resource in IG " + ig.getName());
            Example example = new Example(r.getName(), id, r.getDescription(), fn, false, ExampleType.XmlFile, false);
            example.setIg(igd.getCode());
            if (r.hasExampleCanonicalType()) {
                example.setExampleFor(r.getExampleCanonicalType().asStringValue());
                example.setRegistered(true);
                exr.add(example);
            }
            igd.getExamples().add(example);
            r.setUserData(ToolResourceUtilities.NAME_RES_EXAMPLE, example);
            r.setReference(new Reference(example.getId() + ".html"));
        } else if (rt == ResourceType.ValueSet) {
            ValueSet vs = (ValueSet) new XmlParser().parse(new FileInputStream(fn));
            if (id.startsWith("valueset-"))
                id = id.substring(9);
            vs.setId(id);
            if (vs.getUrl() == null) {
                // Asserting this all the time causes issues for non-HL7 URL value sets
                vs.setUrl("http://hl7.org/fhir/ValueSet/" + id);
            }
            vs.setUserData(ToolResourceUtilities.NAME_RES_IG, igd);
            vs.setUserData("path", igd.getPath() + "valueset-" + id + ".html");
            vs.setUserData("filename", "valueset-" + id);
            if (committee != null) {
                if (!vs.hasExtension(ToolingExtensions.EXT_WORKGROUP)) {
                    vs.addExtension().setUrl(ToolingExtensions.EXT_WORKGROUP).setValue(new CodeType(committee.getCode()));
                } else {
                    String ec = ToolingExtensions.readStringExtension(vs, ToolingExtensions.EXT_WORKGROUP);
                    if (!ec.equals(committee.getCode()))
                        System.out.println("ValueSet " + vs.getUrl() + " WG mismatch 2: is " + ec + ", want to set to " + committee);
                }
            }
            new CodeSystemConvertor(codeSystems).convert(new XmlParser(), vs, fn.getAbsolutePath(), packageInfo);
            // if (id.contains(File.separator))
            igd.getValueSets().add(vs);
            if (!r.hasName())
                r.setName(vs.getName());
            if (!r.hasDescription())
                r.setDescription(vs.getDescription());
            r.setUserData(ToolResourceUtilities.RES_ACTUAL_RESOURCE, vs);
            r.setReference(new Reference(fn.getName()));
        } else if (rt == ResourceType.StructureDefinition) {
            StructureDefinition sd;
            sd = (StructureDefinition) new XmlParser().parse(new CSFileInputStream(fn));
            new ProfileUtilities(context, null, pkp).setIds(sd, false);
            if (sd.getKind() == StructureDefinitionKind.LOGICAL) {
                fn = new CSFile(Utilities.path(myRoot, r.getReference().getReference()));
                LogicalModel lm = new LogicalModel(sd);
                lm.setSource(fn.getAbsolutePath());
                lm.setId(sd.getId());
                igd.getLogicalModels().add(lm);
            } else if ("Extension".equals(sd.getType())) {
                sd.setId(tail(sd.getUrl()));
                sd.setUserData(ToolResourceUtilities.NAME_RES_IG, igd.getCode());
                ToolResourceUtilities.updateUsage(sd, igd.getCode());
                this.context.cacheResource(sd);
            } else {
                Profile pr = new Profile(igd.getCode());
                pr.setSource(fn.getAbsolutePath());
                pr.setTitle(sd.getName());
                if (!sd.hasId())
                    sd.setId(tail(sd.getUrl()));
                // Lloyd: This causes issues for profiles & extensions defined outside of HL7
                // sd.setUrl("http://hl7.org/fhir/StructureDefinition/"+sd.getId());
                pr.forceMetadata("id", sd.getId() + "-profile");
                pr.setSourceType(ConformancePackageSourceType.StructureDefinition);
                ConstraintStructure cs = new ConstraintStructure(sd, igd, wg(sd), fmm(sd), sd.getExperimental());
                pr.getProfiles().add(cs);
                igd.getProfiles().add(pr);
            }
        } else if (rt == ResourceType.Bundle) {
            Dictionary d = new Dictionary(id, r.getName(), igd.getCode(), fn.getAbsolutePath(), igd);
            igd.getDictionaries().add(d);
        } else
            logger.log("Implementation Guides do not yet support " + rt.toString(), LogMessageType.Process);
    // throw new Error("Not implemented yet - type = "+rt.toString());
    // if (r.hasExampleFor()) {
    // if (!resources.containsKey(r.getExampleFor().getReference()))
    // throw new Exception("Unable to resolve example-for reference to "+r.getExampleFor().getReference());
    // }
    }
    // second pass: load the spreadsheets
    for (ImplementationGuideDefinitionGroupingComponent p : ig.getDefinition().getGrouping()) {
        if (!p.hasName())
            throw new Exception("no name on package in IG " + ig.getName());
        for (Extension ex : p.getExtension()) {
            if (ex.getUrl().equals(ToolResourceUtilities.EXT_PROFILE_SPREADSHEET)) {
                String s = ((UriType) ex.getValue()).getValue();
                File fn = new File(Utilities.path(myRoot, s));
                if (!fn.exists())
                    throw new Exception("Spreadsheet " + s + " in package " + p.getName() + " in IG " + ig.getName() + " could not be located");
                Profile pr = new Profile(igd.getCode());
                ex.setUserData(ToolResourceUtilities.NAME_RES_PROFILE, pr);
                pr.setSource(fn.getAbsolutePath());
                pr.setSourceType(ConformancePackageSourceType.Spreadsheet);
                OldSpreadsheetParser sparser = new OldSpreadsheetParser(pr.getCategory(), new CSFileInputStream(pr.getSource()), Utilities.noString(pr.getId()) ? pr.getSource() : pr.getId(), pr.getSource(), igd, rootDir, logger, registry, FHIRVersion.fromCode(context.getVersion()), context, genDate, false, pkp, false, committee, mappings, profileIds, codeSystems, maps, workgroups, exceptionIfExcelNotNormalised);
                sparser.getBindings().putAll(commonBindings);
                sparser.setFolder(Utilities.getDirectoryForFile(pr.getSource()));
                sparser.parseConformancePackage(pr, null, Utilities.getDirectoryForFile(pr.getSource()), pr.getCategory(), issues, null);
                // System.out.println("load "+pr.getId()+" from "+s);
                igd.getProfiles().add(pr);
                // what remains to be done now is to update the package with the loaded resources, but we need to wait for all the profiles to generated, so we'll do that later
                for (BindingSpecification bs : sparser.getBindings().values()) {
                    if (!commonBindings.containsValue(bs) && bs.getValueSet() != null) {
                        ValueSet vs = bs.getValueSet();
                        String path = vs.getUserString("path");
                        path = path.substring(path.lastIndexOf("/") + 1);
                        ig.getDefinition().addResource().setName(vs.getName()).setDescription(vs.getDescription()).setReference(new Reference(path)).setUserData(ToolResourceUtilities.RES_ACTUAL_RESOURCE, vs);
                    }
                }
                // now, register resources for all the things in the spreadsheet
                for (ValueSet vs : sparser.getValuesets()) ig.getDefinition().addResource().setExample(new BooleanType(false)).setName(vs.getName()).setDescription(vs.getDescription()).setReference(new Reference("valueset-" + vs.getId() + ".html")).setUserData(ToolResourceUtilities.RES_ACTUAL_RESOURCE, vs);
                for (StructureDefinition exd : pr.getExtensions()) ig.getDefinition().addResource().setExample(new BooleanType(false)).setName(exd.getName()).setDescription(exd.getDescription()).setReference(new Reference("extension-" + exd.getId().toLowerCase() + ".html")).setUserData(ToolResourceUtilities.RES_ACTUAL_RESOURCE, exd);
                for (ConstraintStructure cs : pr.getProfiles()) {
                    cs.setResourceInfo(ig.getDefinition().addResource());
                    cs.getResourceInfo().setExample(new BooleanType(false)).setName(cs.getDefn().getName()).setDescription(cs.getDefn().getDefinition()).setReference(new Reference(cs.getId().toLowerCase() + ".html"));
                }
            }
            if (ex.getUrl().equals(ToolResourceUtilities.EXT_LOGICAL_SPREADSHEET)) {
                File fn = new CSFile(Utilities.path(myRoot, ((UriType) ex.getValue()).getValue()));
                // String source = Utilities.path(file.getParent(), e.getAttribute("source"));
                String s = fn.getName();
                if (s.endsWith("-spreadsheet.xml"))
                    s = s.substring(0, s.length() - 16);
                String id = igd.getCode() + "-" + s;
                OldSpreadsheetParser sparser = new OldSpreadsheetParser(igd.getCode(), new CSFileInputStream(fn), id, fn.getAbsolutePath(), igd, rootDir, logger, registry, FHIRVersion.fromCode(context.getVersion()), context, genDate, false, pkp, false, committee, mappings, profileIds, codeSystems, maps, workgroups, exceptionIfExcelNotNormalised);
                sparser.getBindings().putAll(commonBindings);
                sparser.setFolder(Utilities.getDirectoryForFile(fn.getAbsolutePath()));
                LogicalModel lm = sparser.parseLogicalModel();
                lm.setId(id);
                lm.setSource(fn.getAbsolutePath());
                lm.getResource().setName(lm.getId());
                igd.getLogicalModels().add(lm);
            }
        }
        ToolingExtensions.removeExtension(p, ToolResourceUtilities.EXT_PROFILE_SPREADSHEET);
        ToolingExtensions.removeExtension(p, ToolResourceUtilities.EXT_LOGICAL_SPREADSHEET);
    }
    for (Example ex : exr) {
        Profile tp = null;
        for (Profile pr : igd.getProfiles()) {
            if (("StructureDefinition/" + pr.getId()).equals(ex.getExampleFor())) {
                tp = pr;
                break;
            } else
                for (ConstraintStructure cc : pr.getProfiles()) {
                    if (("StructureDefinition/" + cc.getId()).equals(ex.getExampleFor())) {
                        tp = pr;
                        break;
                    }
                }
        }
        if (tp != null)
            tp.getExamples().add(ex);
        else
            throw new Exception("no profile found matching exampleFor = " + ex.getExampleFor());
    }
    igd.numberPages();
// // second, parse the old ig, and use that. This is being phased out
// CSFile file = new CSFile(Utilities.path(rootDir, igd.getSource()));
// DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
// factory.setNamespaceAware(true);
// DocumentBuilder builder = factory.newDocumentBuilder();
// Document xdoc = builder.parse(new CSFileInputStream(file));
// Element root = xdoc.getDocumentElement();
// if (!root.getNodeName().equals("ig"))
// throw new Exception("wrong base node");
// Element e = XMLUtil.getFirstChild(root);
// while (e != null) {
// if (e.getNodeName().equals("dependsOn")) {
// // we ignore this for now
// } else if (e.getNodeName().equals("publishing")) {
// //        if (e.hasAttribute("homepage"))
// //          igd.setPage(e.getAttribute("homepage"));
// } else if (e.getNodeName().equals("page")) {
// //        igd.getPageList().add(e.getAttribute("source"));
// } else if (e.getNodeName().equals("image")) {
// //        moved above igd.getImageList().add(e.getAttribute("source"));
// } else if (e.getNodeName().equals("valueset")) {
// //        XmlParser xml = new XmlParser();
// //        ValueSet vs = (ValueSet) xml.parse(new CSFileInputStream(Utilities.path(file.getParent(), e.getAttribute("source"))));
// //        String id = Utilities.changeFileExt(new File(Utilities.path(file.getParent(), e.getAttribute("source"))).getName(), "");
// //        if (id.startsWith("valueset-"))
// //          id = id.substring(9);
// //        if (!vs.hasId() || !vs.hasUrl()) {
// //          vs.setId(id);
// //          vs.setUrl("http://hl7.org/fhir/ValueSet/"+vs.getId());
// //        }
// //        vs.setUserData(ToolResourceUtilities.NAME_RES_IG, igd);
// //        vs.setUserData("path", igd.getCode()+File.separator+"valueset-"+vs.getId()+".html");
// //        vs.setUserData("filename", "valueset-"+vs.getId());
// //        vs.setUserData("committee", committee);
// //        igd.getValueSets().add(vs);
// } else if (e.getNodeName().equals("acronym")) {
// igd.getTlas().put(e.getAttribute("target"), e.getAttribute("id"));
// } else if (e.getNodeName().equals("example")) {
// //        String filename = e.getAttribute("source");
// //        File efile = new File(Utilities.path(file.getParent(), filename));
// //        Example example = new Example(e.getAttribute("name"), Utilities.changeFileExt(efile.getName(), ""), e.getAttribute("name"), efile, false, ExampleType.XmlFile, false);
// //        example.setIg(igd.getCode());
// //        igd.getExamples().add(example);
// } else if (e.getNodeName().equals("profile")) {
// //        moved above
// //        Profile p = new Profile(igd.getCode());
// //        p.setSource(Utilities.path(file.getParent(), e.getAttribute("source")));
// //        if ("spreadsheet".equals(e.getAttribute("type"))) {
// //          p.setSourceType(ConformancePackageSourceType.Spreadsheet);
// //          SpreadsheetParser sparser = new SpreadsheetParser(p.getCategory(), new CSFileInputStream(p.getSource()), Utilities.noString(p.getId()) ? p.getSource() : p.getId(), igd,
// //              rootDir, logger, null, context.getVersion(), context, genDate, false, igd.getExtensions(), pkp, false, committee, mappings);
// //          sparser.getBindings().putAll(commonBindings);
// //          sparser.setFolder(Utilities.getDirectoryForFile(p.getSource()));
// //          sparser.parseConformancePackage(p, null, Utilities.getDirectoryForFile(p.getSource()), p.getCategory(), issues);
// //          for (BindingSpecification bs : sparser.getBindings().values()) {
// //            if (!commonBindings.containsValue(bs) && bs.getValueSet() != null) {
// //              ValueSet vs  = bs.getValueSet();
// //              String path = vs.getUserString("filename")+".xml";
// //              ig.getPackage().get(0).addResource().setName(vs.getName()).setDescription(vs.getDescription()).setSource(new UriType(path)).setUserData(ToolResourceUtilities.RES_ACTUAL_RESOURCE, vs);
// //            }
// //          }
// //        } else {
// //          throw new Exception("Unknown profile type in IG : "+e.getNodeName());
// //          // parseConformanceDocument(p, p.getId(), new File(p.getSource()), p.getCategory());
// //        }
// //
// //        String id = e.getAttribute("id");
// //        if (Utilities.noString(id))
// //          id = Utilities.changeFileExt(e.getAttribute("source"), "");
// //        igd.getProfiles().add(p);
// //        Element ex = XMLUtil.getFirstChild(e);
// //        while (ex != null) {
// //          if (ex.getNodeName().equals("example")) {
// //            String filename = ex.getAttribute("source");
// //            Example example = new Example(ex.getAttribute("name"), Utilities.changeFileExt(Utilities.getFileNameForName(filename), ""), ex.getAttribute("name"), new File(Utilities.path(file.getParent(), filename)), false, ExampleType.XmlFile, false);
// //            p.getExamples().add(example);
// //          } else
// //            throw new Exception("Unknown element name in IG: "+ex.getNodeName());
// //          ex = XMLUtil.getNextSibling(ex);
// //        }
// } else if (e.getNodeName().equals("dictionary")) {
// //        Dictionary d = new Dictionary(e.getAttribute("id"), e.getAttribute("name"), igd.getCode(), Utilities.path(Utilities.path(file.getParent(), e.getAttribute("source"))), igd);
// //        igd.getDictionaries().add(d);
// } else if (e.getNodeName().equals("logicalModel")) {
// //        String source = Utilities.path(file.getParent(), e.getAttribute("source"));
// //        String id = igd.getCode()+"-"+e.getAttribute("id");
// //        SpreadsheetParser sparser = new SpreadsheetParser(igd.getCode(), new CSFileInputStream(source), id, igd, rootDir, logger, null, context.getVersion(), context, genDate, false, igd.getExtensions(), pkp, false, committee, mappings);
// //        sparser.getBindings().putAll(commonBindings);
// //        sparser.setFolder(Utilities.getDirectoryForFile(source));
// //        LogicalModel lm = sparser.parseLogicalModel(source);
// //        lm.setId(id);
// //        lm.setSource(source);
// //        lm.getResource().setName(lm.getId());
// //        igd.getLogicalModels().add(lm);
// } else
// throw new Exception("Unknown element name in IG: "+e.getNodeName());
// e = XMLUtil.getNextSibling(e);
// }
}
Also used : Dictionary(org.hl7.fhir.definitions.model.Dictionary) ImplementationGuide(org.hl7.fhir.r5.model.ImplementationGuide) HashMap(java.util.HashMap) ArrayList(java.util.ArrayList) CSFile(org.hl7.fhir.utilities.CSFile) Profile(org.hl7.fhir.definitions.model.Profile) UriType(org.hl7.fhir.r5.model.UriType) LogicalModel(org.hl7.fhir.definitions.model.LogicalModel) StructureDefinition(org.hl7.fhir.r5.model.StructureDefinition) Example(org.hl7.fhir.definitions.model.Example) BindingSpecification(org.hl7.fhir.definitions.model.BindingSpecification) ConstraintStructure(org.hl7.fhir.definitions.model.ConstraintStructure) ValueSet(org.hl7.fhir.r5.model.ValueSet) ImplementationGuideDefinitionGroupingComponent(org.hl7.fhir.r5.model.ImplementationGuide.ImplementationGuideDefinitionGroupingComponent) XmlParser(org.hl7.fhir.r5.formats.XmlParser) Reference(org.hl7.fhir.r5.model.Reference) Resource(org.hl7.fhir.r5.model.Resource) BooleanType(org.hl7.fhir.r5.model.BooleanType) ResourceType(org.hl7.fhir.r5.model.ResourceType) CSFileInputStream(org.hl7.fhir.utilities.CSFileInputStream) FileInputStream(java.io.FileInputStream) Extension(org.hl7.fhir.r5.model.Extension) DateTimeType(org.hl7.fhir.r5.model.DateTimeType) ImplementationGuideDependsOnComponent(org.hl7.fhir.r5.model.ImplementationGuide.ImplementationGuideDependsOnComponent) ProfileUtilities(org.hl7.fhir.r5.conformance.ProfileUtilities) CodeType(org.hl7.fhir.r5.model.CodeType) OldSpreadsheetParser(org.hl7.fhir.definitions.parsers.spreadsheets.OldSpreadsheetParser) ImplementationGuideDefinitionResourceComponent(org.hl7.fhir.r5.model.ImplementationGuide.ImplementationGuideDefinitionResourceComponent) CSFile(org.hl7.fhir.utilities.CSFile) File(java.io.File) CSFileInputStream(org.hl7.fhir.utilities.CSFileInputStream)

Aggregations

ImplementationGuide (org.hl7.fhir.r5.model.ImplementationGuide)16 Complex (org.hl7.fhir.r4.utils.formats.Turtle.Complex)13 StructureDefinition (org.hl7.fhir.r5.model.StructureDefinition)12 FHIRException (org.hl7.fhir.exceptions.FHIRException)11 DefinitionException (org.hl7.fhir.exceptions.DefinitionException)9 File (java.io.File)8 JsonObject (com.google.gson.JsonObject)7 Complex (org.hl7.fhir.dstu2016may.formats.RdfGenerator.Complex)7 Complex (org.hl7.fhir.dstu3.utils.formats.Turtle.Complex)7 XmlParser (org.hl7.fhir.r5.formats.XmlParser)6 SearchParameter (org.hl7.fhir.r5.model.SearchParameter)5 Gson (com.google.gson.Gson)4 GsonBuilder (com.google.gson.GsonBuilder)4 JsonArray (com.google.gson.JsonArray)4 FileInputStream (java.io.FileInputStream)4 FileOutputStream (java.io.FileOutputStream)4 IOException (java.io.IOException)4 ArrayList (java.util.ArrayList)4 CanonicalResource (org.hl7.fhir.r5.model.CanonicalResource)4 ValueSet (org.hl7.fhir.r5.model.ValueSet)4