use of org.hl7.fhir.r4.terminologies.ValueSetExpander.ValueSetExpansionOutcome in project kindling by HL7.
the class Publisher method produceSpec.
private void produceSpec() throws Exception {
for (ImplementationGuideDefn ig : page.getDefinitions().getSortedIgs()) {
for (LogicalModel lm : ig.getLogicalModels()) {
page.log(" ...logical model " + lm.getId(), LogMessageType.Process);
produceLogicalModel(lm, ig);
}
}
for (StructureDefinition ed : page.getWorkerContext().getExtensionDefinitions()) {
String filename = "extension-" + (ed.getUrl().startsWith("http://fhir-registry.smarthealthit.org/StructureDefinition/") ? ed.getUrl().substring(59).toLowerCase() : ed.getUrl().substring(40).toLowerCase());
ed.setUserData("filename", filename);
ImplementationGuideDefn ig = page.getDefinitions().getIgs().get(ed.getUserString(ToolResourceUtilities.NAME_RES_IG));
if (ig == null) {
ig = page.getDefinitions().getIgs().get("core");
}
ed.setUserData("path", (ig.isCore() ? "" : ig.getCode() + File.separator) + filename + ".html");
}
page.updateDiffEngineDefinitions();
loadValueSets2();
page.log(" ...extensions", LogMessageType.Process);
for (StructureDefinition ae : page.getWorkerContext().getExtensionDefinitions()) produceExtensionDefinition(ae);
checkAllOk();
page.log(" ...resource identities", LogMessageType.Process);
for (String rname : page.getDefinitions().getBaseResources().keySet()) {
ResourceDefn r = page.getDefinitions().getBaseResources().get(rname);
produceResource1(r, r.isAbstract());
}
for (String rname : page.getDefinitions().sortedResourceNames()) {
if (!rname.equals("ValueSet") && !rname.equals("CodeSystem") && wantBuild(rname)) {
ResourceDefn r = page.getDefinitions().getResources().get(rname);
produceResource1(r, false);
}
}
if (buildFlags.get("all")) {
page.log(" ...base profiles", LogMessageType.Process);
produceBaseProfile();
}
for (String rname : page.getDefinitions().getBaseResources().keySet()) {
ResourceDefn r = page.getDefinitions().getBaseResources().get(rname);
page.log(" ...resource " + r.getName(), LogMessageType.Process);
produceResource2(r, !rname.equals("Parameters"), rname.equals("Resource") ? "Meta" : null, false);
}
for (String rname : page.getDefinitions().sortedResourceNames()) {
if (!rname.equals("ValueSet") && !rname.equals("CodeSystem") && wantBuild(rname)) {
ResourceDefn r = page.getDefinitions().getResources().get(rname);
page.log(" ...resource " + r.getName(), LogMessageType.Process);
produceResource2(r, false, null, false);
}
}
for (Compartment c : page.getDefinitions().getCompartments()) {
if (buildFlags.get("all")) {
page.log(" ...compartment " + c.getName(), LogMessageType.Process);
produceCompartment(c);
}
}
Regenerator regen = new Regenerator(page.getFolders().srcDir, page.getDefinitions(), page.getWorkerContext());
regen.generate();
Bundle searchParamsFeed = new Bundle();
searchParamsFeed.setId("searchParams");
searchParamsFeed.setType(BundleType.COLLECTION);
searchParamsFeed.setMeta(new Meta().setLastUpdated(page.getResourceBundle().getMeta().getLastUpdated()));
Set<String> uris = new HashSet<String>();
for (ResourceDefn rd : page.getDefinitions().getBaseResources().values()) addSearchParams(uris, searchParamsFeed, rd);
for (String n : page.getDefinitions().sortedResourceNames()) {
ResourceDefn rd = page.getDefinitions().getResources().get(n);
addSearchParams(uris, searchParamsFeed, rd);
}
for (Profile cp : page.getDefinitions().getPackList()) {
addSearchParams(uris, searchParamsFeed, cp);
}
checkBundleURLs(searchParamsFeed);
for (String n : page.getIni().getPropertyNames("pages")) {
if (buildFlags.get("all") || buildFlags.get("page-" + n.toLowerCase())) {
page.log(" ...page " + n, LogMessageType.Process);
producePage(n, page.getIni().getStringProperty("pages", n));
}
}
for (ImplementationGuideDefn ig : page.getDefinitions().getSortedIgs()) {
for (String n : ig.getPageList()) {
page.log(" ...ig page " + n, LogMessageType.Process);
produceIgPage(n, ig);
}
for (ImplementationGuideDefinitionPageComponent page : ig.getSpecialPages()) {
produceIgPage(ig, page);
}
for (Profile p : ig.getProfiles()) {
if (!p.getOperations().isEmpty()) {
produceIgOperations(ig, p);
}
}
}
if (page.getIni().getPropertyNames("ig-pages") != null) {
for (String n : page.getIni().getPropertyNames("ig-pages")) {
page.log(" ...page " + n, LogMessageType.Process);
for (ImplementationGuideDefn ig : page.getDefinitions().getSortedIgs()) {
if (!ig.isCore())
produceIgPage(n, ig, page.getIni().getStringProperty("ig-pages", n));
}
}
}
for (String n : page.getDefinitions().getDictionaries().keySet()) {
if (buildFlags.get("all")) {
// || buildFlags.get("dict-" + n.toLowerCase())) {
page.log(" ...dictionary " + n, LogMessageType.Process);
produceDictionary(page.getDefinitions().getDictionaries().get(n));
}
}
int i = 0;
for (String n : page.getIni().getPropertyNames("sid")) {
page.log(" ...sid " + n, LogMessageType.Process);
produceSid(i, n, page.getIni().getStringProperty("sid", n));
i++;
}
if (buildFlags.get("all")) {
page.log(" ...check Fragments", LogMessageType.Process);
checkFragments();
for (Profile p : page.getDefinitions().getPackList()) {
// if (!n.startsWith("http://")) {
page.log(" ...Profile " + p.getId(), LogMessageType.Process);
produceConformancePackage(null, p, null);
// }
}
produceUml();
page.getVsValidator().checkDuplicates(page.getValidationErrors());
if (buildFlags.get("all")) {
// if (page.getToc().containsKey("1.1"))
// throw new Exception("Duplicate DOC Entry "+"1.1");
page.getToc().put("1.1", new TocEntry("1.1", "Table Of Contents", "toc.html", false));
page.log(" ...page toc.html", LogMessageType.Process);
producePage("toc.html", null);
}
checkAllOk();
page.log(" ...collections ", LogMessageType.Process);
com.google.gson.JsonObject diff = new com.google.gson.JsonObject();
page.getDiffEngine().getDiffAsJson(diff);
Gson gson = new GsonBuilder().setPrettyPrinting().create();
String json = gson.toJson(diff);
TextFile.stringToFile(json, Utilities.path(page.getFolders().dstDir, "fhir.diff.json"));
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = dbf.newDocumentBuilder();
Document doc = builder.newDocument();
Element element = doc.createElement("difference");
doc.appendChild(element);
page.getDiffEngine().getDiffAsXml(doc, element);
prettyPrint(doc, Utilities.path(page.getFolders().dstDir, "fhir.diff.xml"));
checkBundleURLs(page.getResourceBundle());
checkStructureDefinitions(page.getResourceBundle());
page.getResourceBundle().getEntry().sort(new ProfileBundleSorter());
FileOutputStream s = new FileOutputStream(page.getFolders().dstDir + "profiles-resources.xml");
new XmlParser().setOutputStyle(OutputStyle.PRETTY).compose(s, page.getResourceBundle());
s.close();
s = new FileOutputStream(page.getFolders().dstDir + "profiles-resources.json");
new JsonParser().setOutputStyle(OutputStyle.PRETTY).compose(s, page.getResourceBundle());
s.close();
checkBundleURLs(page.getTypeBundle());
checkStructureDefinitions(page.getTypeBundle());
page.getTypeBundle().getEntry().sort(new ProfileBundleSorter());
s = new FileOutputStream(page.getFolders().dstDir + "profiles-types.xml");
new XmlParser().setOutputStyle(OutputStyle.PRETTY).compose(s, page.getTypeBundle());
s.close();
s = new FileOutputStream(page.getFolders().dstDir + "profiles-types.json");
new JsonParser().setOutputStyle(OutputStyle.PRETTY).compose(s, page.getTypeBundle());
s.close();
Bundle extensionsFeed = new Bundle();
extensionsFeed.setId("extensions");
extensionsFeed.setType(BundleType.COLLECTION);
extensionsFeed.setMeta(new Meta().setLastUpdated(page.getResourceBundle().getMeta().getLastUpdated()));
Set<String> urls = new HashSet<String>();
for (StructureDefinition ed : page.getWorkerContext().getExtensionDefinitions()) {
if (!urls.contains(ed.getUrl())) {
urls.add(ed.getUrl());
extensionsFeed.getEntry().add(new BundleEntryComponent().setResource(ed).setFullUrl("http://hl7.org/fhir/" + ed.fhirType() + "/" + ed.getId()));
}
}
checkBundleURLs(extensionsFeed);
checkStructureDefinitions(extensionsFeed);
s = new FileOutputStream(page.getFolders().dstDir + "extension-definitions.xml");
new XmlParser().setOutputStyle(OutputStyle.PRETTY).compose(s, extensionsFeed);
s.close();
s = new FileOutputStream(page.getFolders().dstDir + "extension-definitions.json");
new JsonParser().setOutputStyle(OutputStyle.PRETTY).compose(s, extensionsFeed);
s.close();
Utilities.copyFile(page.getFolders().dstDir + "extension-definitions.xml", page.getFolders().dstDir + "examples" + File.separator + "extension-definitions.xml");
s = new FileOutputStream(page.getFolders().dstDir + "search-parameters.xml");
new XmlParser().setOutputStyle(OutputStyle.PRETTY).compose(s, searchParamsFeed);
s.close();
s = new FileOutputStream(page.getFolders().dstDir + "search-parameters.json");
new JsonParser().setOutputStyle(OutputStyle.PRETTY).compose(s, searchParamsFeed);
s.close();
Utilities.copyFile(page.getFolders().dstDir + "search-parameters.xml", page.getFolders().dstDir + "examples" + File.separator + "search-parameters.xml");
for (ResourceDefn rd : page.getDefinitions().getResources().values()) addOtherProfiles(profileBundle, rd);
for (Profile cp : page.getDefinitions().getPackList()) {
addOtherProfiles(profileBundle, cp);
}
checkBundleURLs(profileBundle);
checkStructureDefinitions(profileBundle);
s = new FileOutputStream(page.getFolders().dstDir + "profiles-others.xml");
new XmlParser().setOutputStyle(OutputStyle.PRETTY).compose(s, profileBundle);
s.close();
s = new FileOutputStream(page.getFolders().dstDir + "profiles-others.json");
new JsonParser().setOutputStyle(OutputStyle.PRETTY).compose(s, profileBundle);
s.close();
Utilities.copyFile(page.getFolders().dstDir + "profiles-others.xml", page.getFolders().dstDir + "examples" + File.separator + "profiles-others.xml");
// todo-bundle - should this be checked?
// int ec = 0;
// for (Resource e : valueSetsFeed.getItem()) {
// ValueSet vs = (ValueSet) e;
// if (!vs.getUrl().equals(e.getId())) {
// ec++;
// page.log("Valueset id mismatch: atom entry has '"+e.getId()+"', but value set is '"+vs.getUrl()+"'", LogMessageType.Error);
// }
// }
// if (ec > 0)
// throw new Exception("Cannot continue due to value set mis-identification");
checkBundleURLs(dataElements);
s = new FileOutputStream(page.getFolders().dstDir + "dataelements.xml");
new XmlParser().setOutputStyle(OutputStyle.PRETTY).compose(s, dataElements);
s.close();
Utilities.copyFile(page.getFolders().dstDir + "dataelements.xml", page.getFolders().dstDir + "examples" + File.separator + "dataelements.xml");
s = new FileOutputStream(page.getFolders().dstDir + "dataelements.json");
new JsonParser().setOutputStyle(OutputStyle.PRETTY).compose(s, dataElements);
s.close();
checkBundleURLs(valueSetsFeed);
s = new FileOutputStream(page.getFolders().dstDir + "valuesets.xml");
new XmlParser().setOutputStyle(OutputStyle.PRETTY).compose(s, valueSetsFeed);
s.close();
Utilities.copyFile(page.getFolders().dstDir + "valuesets.xml", page.getFolders().dstDir + "examples" + File.separator + "valuesets.xml");
s = new FileOutputStream(page.getFolders().dstDir + "valuesets.json");
new JsonParser().setOutputStyle(OutputStyle.PRETTY).compose(s, valueSetsFeed);
s.close();
checkBundleURLs(conceptMapsFeed);
s = new FileOutputStream(page.getFolders().dstDir + "conceptmaps.xml");
new XmlParser().setOutputStyle(OutputStyle.PRETTY).compose(s, conceptMapsFeed);
s.close();
Utilities.copyFile(page.getFolders().dstDir + "conceptmaps.xml", page.getFolders().dstDir + "examples" + File.separator + "conceptmaps.xml");
s = new FileOutputStream(page.getFolders().dstDir + "conceptmaps.json");
new JsonParser().setOutputStyle(OutputStyle.PRETTY).compose(s, conceptMapsFeed);
s.close();
checkBundleURLs(externals);
s = new FileOutputStream(page.getFolders().dstDir + "external-resources.xml");
new XmlParser().setOutputStyle(OutputStyle.PRETTY).compose(s, externals);
s.close();
Utilities.copyFile(page.getFolders().dstDir + "external-resources.xml", page.getFolders().dstDir + "examples" + File.separator + "external-resources.xml");
s = new FileOutputStream(page.getFolders().dstDir + "external-resources.json");
new JsonParser().setOutputStyle(OutputStyle.PRETTY).compose(s, externals);
s.close();
ImplementationGuide expIg = new ImplementationGuide();
expIg.addFhirVersion(page.getVersion());
expIg.setPackageId(pidRoot() + ".expansions");
expIg.setVersion(page.getVersion().toCode());
expIg.setLicense(ImplementationGuide.SPDXLicense.CC01_0);
expIg.setTitle("FHIR " + page.getVersion().getDisplay() + " package : Expansions");
expIg.setDescription("Expansions for the " + page.getVersion().getDisplay() + " version of the FHIR standard");
NPMPackageGenerator npm = new NPMPackageGenerator(Utilities.path(page.getFolders().dstDir, pidRoot() + ".expansions.tgz"), "http://hl7.org/fhir", "http://hl7.org/fhir", PackageType.CORE, expIg, page.getGenDate().getTime(), true);
Bundle expansionFeed = new Bundle();
Set<String> urlset = new HashSet<>();
expansionFeed.setId("valueset-expansions");
expansionFeed.setType(BundleType.COLLECTION);
expansionFeed.setMeta(new Meta().setLastUpdated(page.getGenDate().getTime()));
expansionFeed.getFormatCommentsPre().add("This collection contains expansions for all the value sets that are used on an element of type \r\n" + "'code', to help with code generation (saves the code generator having to figure out how to \r\n" + "do the expansions or find a terminology server that supports the same version of the value sets");
for (ValueSet vs : page.getValueSets().getList()) {
if (!urlset.contains(vs.getUrl())) {
urlset.add(vs.getUrl());
if (vs.getUserData(ToolResourceUtilities.NAME_VS_USE_MARKER) != null) {
ValueSet evs = null;
if (vs.hasUserData("expansion"))
evs = (ValueSet) vs.getUserData("expansion");
else {
ValueSetExpansionOutcome vse = page.getWorkerContext().expandVS(vs, true, false);
if (vse.getValueset() != null) {
evs = vse.getValueset();
vs.setUserData("expansion", evs);
}
}
if (evs != null) {
ValueSet vsc = vs.copy();
vsc.setText(null);
vsc.setExpansion(evs.getExpansion());
expansionFeed.addEntry().setFullUrl("http://hl7.org/fhir/" + vsc.fhirType() + "/" + vsc.getId()).setResource(vsc);
npm.addFile(Category.RESOURCE, "ValueSet-" + vsc.getId() + ".json", new JsonParser().composeBytes(vsc));
}
}
}
}
npm.finish();
if (!isCIBuild) {
String id = pidRoot() + ".expansions";
new FilesystemPackageCacheManager(true, ToolsVersion.TOOLS_VERSION).addPackageToCache(id, "current", new FileInputStream(Utilities.path(page.getFolders().dstDir, id + ".tgz")), Utilities.path(page.getFolders().dstDir, id + ".tgz"));
}
s = new FileOutputStream(page.getFolders().dstDir + "expansions.xml");
new XmlParser().setOutputStyle(OutputStyle.PRETTY).compose(s, expansionFeed);
s.close();
s = new FileOutputStream(page.getFolders().dstDir + "expansions.json");
new JsonParser().setOutputStyle(OutputStyle.PRETTY).compose(s, expansionFeed);
s.close();
produceComparisons();
produceSpecMap();
processRDF();
page.log("....version maps", LogMessageType.Process);
ZipGenerator zip = new ZipGenerator(page.getFolders().dstDir + "r3r4maps.zip");
zip.addFiles(Utilities.path(page.getFolders().rootDir, "implementations", "r3maps", "R3toR4", ""), "r3/", null, null);
zip.addFiles(Utilities.path(page.getFolders().rootDir, "implementations", "r3maps", "R4toR3", ""), "r4/", null, null);
zip.close();
page.log("....definitions", LogMessageType.Process);
zip = new ZipGenerator(page.getFolders().dstDir + "definitions.xml.zip");
zip.addFileName("version.info", page.getFolders().dstDir + "version.info", false);
zip.addFileName("profiles-types.xml", page.getFolders().dstDir + "profiles-types.xml", false);
zip.addFileName("profiles-resources.xml", page.getFolders().dstDir + "profiles-resources.xml", false);
zip.addFileName("profiles-others.xml", page.getFolders().dstDir + "profiles-others.xml", false);
zip.addFileName("extension-definitions.xml", page.getFolders().dstDir + "extension-definitions.xml", false);
zip.addFileName("search-parameters.xml", page.getFolders().dstDir + "search-parameters.xml", false);
zip.addFileName("valuesets.xml", page.getFolders().dstDir + "valuesets.xml", false);
zip.addFileName("conceptmaps.xml", page.getFolders().dstDir + "conceptmaps.xml", false);
zip.addFileName("dataelements.xml", page.getFolders().dstDir + "dataelements.xml", false);
zip.addFileName("fhir-all-xsd.zip", page.getFolders().dstDir + "fhir-all-xsd.zip", false);
zip.close();
zip = new ZipGenerator(page.getFolders().dstDir + "definitions.json.zip");
zip.addFileName("version.info", page.getFolders().dstDir + "version.info", false);
zip.addFileName("profiles-types.json", page.getFolders().dstDir + "profiles-types.json", false);
zip.addFileName("profiles-resources.json", page.getFolders().dstDir + "profiles-resources.json", false);
zip.addFileName("profiles-others.json", page.getFolders().dstDir + "profiles-others.json", false);
zip.addFileName("extension-definitions.json", page.getFolders().dstDir + "extension-definitions.json", false);
zip.addFileName("search-parameters.json", page.getFolders().dstDir + "search-parameters.json", false);
zip.addFileName("valuesets.json", page.getFolders().dstDir + "valuesets.json", false);
zip.addFileName("conceptmaps.json", page.getFolders().dstDir + "conceptmaps.json", false);
zip.addFileName("dataelements.json", page.getFolders().dstDir + "dataelements.json", false);
zip.addFileName("fhir.schema.json.zip", page.getFolders().dstDir + "fhir.schema.json.zip", false);
zip.close();
zip = new ZipGenerator(page.getFolders().dstDir + "definitions.xlsx.zip");
for (String rn : page.getDefinitions().sortedResourceNames()) {
zip.addFileName(rn.toLowerCase() + ".xlsx", page.getFolders().dstDir + rn.toLowerCase() + ".xlsx", false);
}
zip.close();
// this is the actual package used by the validator.
zip = new ZipGenerator(page.getFolders().dstDir + "validator.pack");
// conformance resources
zip.addFileName("profiles-types.json", page.getFolders().dstDir + "profiles-types.json", false);
zip.addFileName("profiles-resources.json", page.getFolders().dstDir + "profiles-resources.json", false);
zip.addFileName("profiles-others.json", page.getFolders().dstDir + "profiles-others.json", false);
zip.addFileName("extension-definitions.json", page.getFolders().dstDir + "extension-definitions.json", false);
zip.addFileName("valuesets.json", page.getFolders().dstDir + "valuesets.json", false);
zip.addFileName("conceptmaps.json", page.getFolders().dstDir + "conceptmaps.json", false);
// native schema
zip.addFileName("fhir-all-xsd.zip", page.getFolders().dstDir + "fhir-all-xsd.zip", false);
zip.addFileName("fhir.schema.json.zip", page.getFolders().dstDir + "fhir.schema.json.zip", false);
zip.addFileName("fhir.shex", page.getFolders().dstDir + "fhir.shex", false);
zip.close();
page.log("....dstu3 format (xml)", LogMessageType.Process);
DSTU3ValidationConvertor dstu3 = new DSTU3ValidationConvertor();
dstu3.convert(page.getFolders().dstDir + "profiles-types.xml", page.getFolders().tmpDir + "profiles-types-r3.xml");
dstu3.convert(page.getFolders().dstDir + "profiles-resources.xml", page.getFolders().tmpDir + "profiles-resources-r3.xml");
dstu3.convert(page.getFolders().dstDir + "profiles-others.xml", page.getFolders().tmpDir + "profiles-others-r3.xml");
dstu3.convert(page.getFolders().dstDir + "extension-definitions.xml", page.getFolders().tmpDir + "extension-definitions-r3.xml");
dstu3.convert(page.getFolders().dstDir + "search-parameters.xml", page.getFolders().tmpDir + "search-parameters-r3.xml");
dstu3.convert(page.getFolders().dstDir + "valuesets.xml", page.getFolders().tmpDir + "valuesets-r3.xml");
dstu3.convert(page.getFolders().dstDir + "conceptmaps.xml", page.getFolders().tmpDir + "conceptmaps-r3.xml");
dstu3.convert(page.getFolders().dstDir + "dataelements.xml", page.getFolders().tmpDir + "dataelements-r3.xml");
zip = new ZipGenerator(page.getFolders().dstDir + "definitions-r3.xml.zip");
zip.addFileName("profiles-types.xml", page.getFolders().tmpDir + "profiles-types-r3.xml", false);
zip.addFileName("profiles-resources.xml", page.getFolders().tmpDir + "profiles-resources-r3.xml", false);
zip.addFileName("profiles-others.xml", page.getFolders().tmpDir + "profiles-others-r3.xml", false);
zip.addFileName("extension-definitions.xml", page.getFolders().tmpDir + "extension-definitions-r3.xml", false);
zip.addFileName("search-parameters.xml", page.getFolders().tmpDir + "search-parameters-r3.xml", false);
zip.addFileName("valuesets.xml", page.getFolders().tmpDir + "valuesets-r3.xml", false);
zip.addFileName("conceptmaps.xml", page.getFolders().tmpDir + "conceptmaps-r3.xml", false);
zip.addFileName("dataelements.xml", page.getFolders().tmpDir + "dataelements-r3.xml", false);
zip.close();
page.log("....dstu3 format (json)", LogMessageType.Process);
dstu3.convertJ(page.getFolders().dstDir + "profiles-types.xml", page.getFolders().tmpDir + "profiles-types-r3.json");
dstu3.convertJ(page.getFolders().dstDir + "profiles-resources.xml", page.getFolders().tmpDir + "profiles-resources-r3.json");
dstu3.convertJ(page.getFolders().dstDir + "profiles-others.xml", page.getFolders().tmpDir + "profiles-others-r3.json");
dstu3.convertJ(page.getFolders().dstDir + "extension-definitions.xml", page.getFolders().tmpDir + "extension-definitions-r3.json");
dstu3.convertJ(page.getFolders().dstDir + "search-parameters.xml", page.getFolders().tmpDir + "search-parameters-r3.json");
dstu3.convertJ(page.getFolders().dstDir + "valuesets.xml", page.getFolders().tmpDir + "valuesets-r3.json");
dstu3.convertJ(page.getFolders().dstDir + "conceptmaps.xml", page.getFolders().tmpDir + "conceptmaps-r3.json");
dstu3.convertJ(page.getFolders().dstDir + "dataelements.xml", page.getFolders().tmpDir + "dataelements-r3.json");
zip = new ZipGenerator(page.getFolders().dstDir + "definitions-r3.json.zip");
zip.addFileName("profiles-types.json", page.getFolders().tmpDir + "profiles-types-r3.json", false);
zip.addFileName("profiles-resources.json", page.getFolders().tmpDir + "profiles-resources-r3.json", false);
zip.addFileName("profiles-others.json", page.getFolders().tmpDir + "profiles-others-r3.json", false);
zip.addFileName("extension-definitions.json", page.getFolders().tmpDir + "extension-definitions-r3.json", false);
zip.addFileName("search-parameters.json", page.getFolders().tmpDir + "search-parameters-r3.json", false);
zip.addFileName("valuesets.json", page.getFolders().tmpDir + "valuesets-r3.json", false);
zip.addFileName("conceptmaps.json", page.getFolders().tmpDir + "conceptmaps-r3.json", false);
zip.addFileName("dataelements.json", page.getFolders().tmpDir + "dataelements-r3.json", false);
zip.close();
System.gc();
page.log("....r4 in r5 format", LogMessageType.Process);
zip = new ZipGenerator(page.getFolders().dstDir + "definitions-r2asr3.xml.zip");
page.getDiffEngine().saveR4AsR5(zip, FhirFormat.XML);
zip.close();
zip = new ZipGenerator(page.getFolders().dstDir + "definitions-r2asr3.json.zip");
page.getDiffEngine().saveR4AsR5(zip, FhirFormat.JSON);
zip.close();
zip = new ZipGenerator(page.getFolders().dstDir + "all-valuesets.zip");
zip.addFileName("valuesets.xml", page.getFolders().dstDir + "valuesets.xml", false);
zip.addFileName("valuesets.json", page.getFolders().dstDir + "valuesets.json", false);
zip.addFileName("conceptmaps.xml", page.getFolders().dstDir + "conceptmaps.xml", false);
zip.addFileName("conceptmaps.json", page.getFolders().dstDir + "conceptmaps.json", false);
zip.close();
page.log("....IG Builder Resources", LogMessageType.Process);
zip = new ZipGenerator(page.getFolders().tmpDir + "ig-template.zip");
zip.addFolder(Utilities.path(page.getFolders().rootDir, "tools", "ig"), "", false, null);
zip.close();
zip = new ZipGenerator(page.getFolders().dstDir + "igpack.zip");
zip.addFileName("fhir.css", page.getFolders().dstDir + "fhir.css", false);
zip.addFileName("spec.internals", page.getFolders().dstDir + "spec.internals", false);
zip.addFileName("profiles-types.xml", page.getFolders().dstDir + "profiles-types.xml", false);
zip.addFileName("profiles-resources.xml", page.getFolders().dstDir + "profiles-resources.xml", false);
zip.addFileName("profiles-others.xml", page.getFolders().dstDir + "profiles-others.xml", false);
zip.addFileName("extension-definitions.xml", page.getFolders().dstDir + "extension-definitions.xml", false);
zip.addFileName("search-parameters.xml", page.getFolders().dstDir + "search-parameters.xml", false);
zip.addFileName("valuesets.xml", page.getFolders().dstDir + "valuesets.xml", false);
zip.addFileName("conceptmaps.xml", page.getFolders().dstDir + "conceptmaps.xml", false);
zip.addFileName("dataelements.xml", page.getFolders().dstDir + "dataelements.xml", false);
zip.addFileName("version.info", page.getFolders().dstDir + "version.info", false);
zip.addFileName("mappingSpaces.details", page.getFolders().srcDir + "mappingSpaces.xml", false);
zip.addFileName("redirect.asp.template", page.getFolders().srcDir + "redirect.asp", false);
zip.addFileName("redirect.cgi.template", page.getFolders().srcDir + "redirect.cgi", false);
zip.addFileName("redirect.php.template", page.getFolders().srcDir + "redirect.php", false);
zip.addFileName("ig-template.zip", Utilities.path(page.getFolders().tmpDir, "ig-template.zip"), false);
zip.addFiles(Utilities.path(page.getFolders().rootDir, "publish", ""), "", ".png", null);
zip.addFiles(Utilities.path(page.getFolders().rootDir, "publish", ""), "", ".gif", null);
zip.close();
page.log("....IG Builder (2)", LogMessageType.Process);
SpecNPMPackageGenerator self = new SpecNPMPackageGenerator();
self.generate(page.getFolders().dstDir, page.getBaseURL(), false, page.getGenDate().getTime(), pidRoot());
if (!isCIBuild) {
new FilesystemPackageCacheManager(true, ToolsVersion.TOOLS_VERSION).addPackageToCache(pidRoot() + ".core", "current", new FileInputStream(Utilities.path(page.getFolders().dstDir, pidRoot() + ".core.tgz")), Utilities.path(page.getFolders().dstDir, pidRoot() + ".core.tgz"));
}
page.log(" ...zips", LogMessageType.Process);
zip = new ZipGenerator(page.getFolders().dstDir + "examples.zip");
zip.addFiles(page.getFolders().dstDir + "examples" + File.separator, "", null, "expansions.xml");
zip.close();
zip = new ZipGenerator(page.getFolders().dstDir + "examples-json.zip");
gson = new GsonBuilder().setPrettyPrinting().create();
File f = new CSFile(page.getFolders().dstDir);
File[] files = f.listFiles();
String[] noExt = new String[] { ".schema.json", ".canonical.json", ".diff.json", "expansions.json", "package.json", "choice-elements.json", "backbone-elements.json" };
for (int fi = 0; fi < files.length; fi++) {
if (files[fi].isFile() && (files[fi].getName().endsWith(".json"))) {
boolean ok = true;
for (String n : noExt) {
ok = ok && !files[fi].getName().endsWith(n);
}
if (ok) {
JsonObject jr = JSONUtil.parse(TextFile.fileToString(files[fi]));
if (!jr.has("url")) {
JsonObject meta = JSONUtil.forceObject(jr, "meta");
JsonArray labels = JSONUtil.forceArray(meta, "tag");
JsonObject label = JSONUtil.addObj(labels);
label.addProperty("system", "http://terminology.hl7.org/CodeSystem/v3-ActReason");
label.addProperty("code", "HTEST");
label.addProperty("display", "test health data");
}
String jrs = gson.toJson(jr);
zip.addBytes(files[fi].getName(), jrs.getBytes(Charsets.UTF_8), true);
}
}
}
zip.close();
NDJsonWriter ndjson = new NDJsonWriter(page.getFolders().dstDir + "examples-ndjson.zip", page.getFolders().tmpDir);
ndjson.addFilesFiltered(page.getFolders().dstDir, ".json", new String[] { ".schema.json", ".canonical.json", ".diff.json", "expansions.json", "package.json" });
ndjson.close();
zip = new ZipGenerator(page.getFolders().dstDir + "examples-ttl.zip");
zip.addFilesFiltered(page.getFolders().dstDir, "", ".ttl", new String[0]);
zip.close();
page.log("Check HTML Links", LogMessageType.Process);
page.getHTMLChecker().produce();
checkAllOk();
} else
page.log("Partial Build - terminating now", LogMessageType.Error);
}
use of org.hl7.fhir.r4.terminologies.ValueSetExpander.ValueSetExpansionOutcome in project kindling by HL7.
the class PageProcessor method updateDiffEngineDefinitions.
public void updateDiffEngineDefinitions() {
for (BundleEntryComponent be : typeBundle.getEntry()) {
if (be.getResource() instanceof StructureDefinition) {
StructureDefinition sd = (StructureDefinition) be.getResource();
if (!diffEngine.getRevision().getTypes().containsKey(sd.getName()))
diffEngine.getRevision().getTypes().put(sd.getName(), sd);
}
}
for (BundleEntryComponent be : resourceBundle.getEntry()) {
if (be.getResource() instanceof StructureDefinition) {
StructureDefinition sd = (StructureDefinition) be.getResource();
if (!diffEngine.getRevision().getResources().containsKey(sd.getName()))
diffEngine.getRevision().getResources().put(sd.getName(), sd);
}
}
for (ValueSet vs : getValueSets().getList()) {
if (!diffEngine.getRevision().getValuesets().containsKey(vs.getUrl()))
diffEngine.getRevision().getValuesets().put(vs.getUrl(), vs);
if (vs.getUserData(ToolResourceUtilities.NAME_VS_USE_MARKER) != null) {
ValueSet evs = null;
if (vs.hasUserData("expansion"))
evs = (ValueSet) vs.getUserData("expansion");
else {
ValueSetExpansionOutcome vse = getWorkerContext().expandVS(vs, true, false);
if (vse.getValueset() != null) {
evs = vse.getValueset();
vs.setUserData("expansion", evs);
}
}
if (evs != null && !diffEngine.getRevision().getExpansions().containsKey(evs.getUrl())) {
diffEngine.getRevision().getExpansions().put(evs.getUrl(), evs);
}
}
}
}
use of org.hl7.fhir.r4.terminologies.ValueSetExpander.ValueSetExpansionOutcome in project org.hl7.fhir.core by hapifhir.
the class ProfileComparer method compareBindings.
private boolean compareBindings(ProfileComparison outcome, ElementDefinition subset, ElementDefinition superset, String path, ElementDefinition lDef, ElementDefinition rDef) throws FHIRFormatError {
assert (lDef.hasBinding() || rDef.hasBinding());
if (!lDef.hasBinding()) {
subset.setBinding(rDef.getBinding());
// technically, the super set is unbound, but that's not very useful - so we use the provided on as an example
superset.setBinding(rDef.getBinding().copy());
superset.getBinding().setStrength(BindingStrength.EXAMPLE);
return true;
}
if (!rDef.hasBinding()) {
subset.setBinding(lDef.getBinding());
superset.setBinding(lDef.getBinding().copy());
superset.getBinding().setStrength(BindingStrength.EXAMPLE);
return true;
}
ElementDefinitionBindingComponent left = lDef.getBinding();
ElementDefinitionBindingComponent right = rDef.getBinding();
if (Base.compareDeep(left, right, false)) {
subset.setBinding(left);
superset.setBinding(right);
}
// superset:
if (isPreferredOrExample(left) && isPreferredOrExample(right)) {
if (right.getStrength() == BindingStrength.PREFERRED && left.getStrength() == BindingStrength.EXAMPLE && !Base.compareDeep(left.getValueSet(), right.getValueSet(), false)) {
outcome.messages.add(new ValidationMessage(Source.ProfileComparer, ValidationMessage.IssueType.STRUCTURE, path, "Example/preferred bindings differ at " + path + " using binding from " + outcome.rightName(), ValidationMessage.IssueSeverity.INFORMATION));
status(subset, ProfileUtilities.STATUS_HINT);
subset.setBinding(right);
superset.setBinding(unionBindings(superset, outcome, path, left, right));
} else {
if ((right.getStrength() != BindingStrength.EXAMPLE || left.getStrength() != BindingStrength.EXAMPLE) && !Base.compareDeep(left.getValueSet(), right.getValueSet(), false)) {
outcome.messages.add(new ValidationMessage(Source.ProfileComparer, ValidationMessage.IssueType.STRUCTURE, path, "Example/preferred bindings differ at " + path + " using binding from " + outcome.leftName(), ValidationMessage.IssueSeverity.INFORMATION));
status(subset, ProfileUtilities.STATUS_HINT);
}
subset.setBinding(left);
superset.setBinding(unionBindings(superset, outcome, path, left, right));
}
return true;
}
// if either of them are extensible/required, then it wins
if (isPreferredOrExample(left)) {
subset.setBinding(right);
superset.setBinding(unionBindings(superset, outcome, path, left, right));
return true;
}
if (isPreferredOrExample(right)) {
subset.setBinding(left);
superset.setBinding(unionBindings(superset, outcome, path, left, right));
return true;
}
// ok, both are extensible or required.
ElementDefinitionBindingComponent subBinding = new ElementDefinitionBindingComponent();
subset.setBinding(subBinding);
ElementDefinitionBindingComponent superBinding = new ElementDefinitionBindingComponent();
superset.setBinding(superBinding);
subBinding.setDescription(mergeText(subset, outcome, path, "description", left.getDescription(), right.getDescription()));
superBinding.setDescription(mergeText(subset, outcome, null, "description", left.getDescription(), right.getDescription()));
if (left.getStrength() == BindingStrength.REQUIRED || right.getStrength() == BindingStrength.REQUIRED)
subBinding.setStrength(BindingStrength.REQUIRED);
else
subBinding.setStrength(BindingStrength.EXTENSIBLE);
if (left.getStrength() == BindingStrength.EXTENSIBLE || right.getStrength() == BindingStrength.EXTENSIBLE)
superBinding.setStrength(BindingStrength.EXTENSIBLE);
else
superBinding.setStrength(BindingStrength.REQUIRED);
if (Base.compareDeep(left.getValueSet(), right.getValueSet(), false)) {
subBinding.setValueSet(left.getValueSet());
superBinding.setValueSet(left.getValueSet());
return true;
} else if (!left.hasValueSet()) {
outcome.messages.add(new ValidationMessage(Source.ProfileComparer, ValidationMessage.IssueType.STRUCTURE, path, "No left Value set at " + path, ValidationMessage.IssueSeverity.ERROR));
return true;
} else if (!right.hasValueSet()) {
outcome.messages.add(new ValidationMessage(Source.ProfileComparer, ValidationMessage.IssueType.STRUCTURE, path, "No right Value set at " + path, ValidationMessage.IssueSeverity.ERROR));
return true;
} else {
// ok, now we compare the value sets. This may be unresolvable.
ValueSet lvs = resolveVS(outcome.left, left.getValueSet());
ValueSet rvs = resolveVS(outcome.right, right.getValueSet());
if (lvs == null) {
outcome.messages.add(new ValidationMessage(Source.ProfileComparer, ValidationMessage.IssueType.STRUCTURE, path, "Unable to resolve left value set " + left.getValueSet().toString() + " at " + path, ValidationMessage.IssueSeverity.ERROR));
return true;
} else if (rvs == null) {
outcome.messages.add(new ValidationMessage(Source.ProfileComparer, ValidationMessage.IssueType.STRUCTURE, path, "Unable to resolve right value set " + right.getValueSet().toString() + " at " + path, ValidationMessage.IssueSeverity.ERROR));
return true;
} else {
// first, we'll try to do it by definition
ValueSet cvs = intersectByDefinition(lvs, rvs);
if (cvs == null) {
// if that didn't work, we'll do it by expansion
ValueSetExpansionOutcome le;
ValueSetExpansionOutcome re;
try {
le = context.expandVS(lvs, true, false);
re = context.expandVS(rvs, true, false);
if (!closed(le.getValueset()) || !closed(re.getValueset()))
throw new DefinitionException("unclosed value sets are not handled yet");
cvs = intersectByExpansion(lvs, rvs);
if (!cvs.getCompose().hasInclude()) {
outcome.messages.add(new ValidationMessage(Source.ProfileComparer, ValidationMessage.IssueType.STRUCTURE, path, "The value sets " + lvs.getUrl() + " and " + rvs.getUrl() + " do not intersect", ValidationMessage.IssueSeverity.ERROR));
status(subset, ProfileUtilities.STATUS_ERROR);
return false;
}
} catch (Exception e) {
outcome.messages.add(new ValidationMessage(Source.ProfileComparer, ValidationMessage.IssueType.STRUCTURE, path, "Unable to expand or process value sets " + lvs.getUrl() + " and " + rvs.getUrl() + ": " + e.getMessage(), ValidationMessage.IssueSeverity.ERROR));
status(subset, ProfileUtilities.STATUS_ERROR);
return false;
}
}
subBinding.setValueSet("#" + addValueSet(cvs));
superBinding.setValueSet("#" + addValueSet(unite(superset, outcome, path, lvs, rvs)));
}
}
return false;
}
use of org.hl7.fhir.r4.terminologies.ValueSetExpander.ValueSetExpansionOutcome in project org.hl7.fhir.core by hapifhir.
the class BaseWorkerContext method expandVS.
@Override
public ValueSetExpansionOutcome expandVS(ElementDefinitionBindingComponent binding, boolean cacheOk, boolean heirarchical) throws FHIRException {
ValueSet vs = null;
vs = fetchResource(ValueSet.class, binding.getValueSet());
if (vs == null)
throw new FHIRException("Unable to resolve value Set " + binding.getValueSet());
return expandVS(vs, cacheOk, heirarchical);
}
use of org.hl7.fhir.r4.terminologies.ValueSetExpander.ValueSetExpansionOutcome in project org.hl7.fhir.core by hapifhir.
the class Element method getAsICoding.
public ICoding getAsICoding() throws FHIRException {
if ("code".equals(fhirType())) {
if (property.getDefinition().getBinding().getStrength() != BindingStrength.REQUIRED)
return null;
ICodingImpl c = new ICodingImpl(true, true, false, false);
c.code = primitiveValue();
ValueSetExpansionOutcome vse = property.getContext().expandVS(property.getDefinition().getBinding(), true, false);
if (vse.getValueset() == null)
return null;
for (ValueSetExpansionContainsComponent cc : vse.getValueset().getExpansion().getContains()) {
if (cc.getCode().equals(c.code)) {
c.system = cc.getSystem();
if (cc.hasVersion()) {
c.doesVersion = true;
c.version = cc.getVersion();
}
if (cc.hasDisplay()) {
c.doesDisplay = true;
c.display = cc.getDisplay();
}
}
}
if (c.system == null)
return null;
return c;
} else if ("Coding".equals(fhirType())) {
ICodingImpl c = new ICodingImpl(true, true, true, true);
c.system = getNamedChildValue("system");
c.code = getNamedChildValue("code");
c.display = getNamedChildValue("display");
c.version = getNamedChildValue("version");
return c;
} else if ("Quantity".equals(fhirType())) {
ICodingImpl c = new ICodingImpl(true, true, false, false);
c.system = getNamedChildValue("system");
c.code = getNamedChildValue("code");
return c;
} else
return null;
}
Aggregations