Add -fhir-settings param to Validator CLI (#1203)

* Start work

* Tests for new Param

* More tests, add param, refactor

* Rename + JsonProperty annotations

* Logging for API keys

* WIP rename search parameter + add settings object for serialization

* Switch to JSON based settings file.

* Rename FHIRSettings and remove ToolGlobalSettings

* Update default path for settings file + expand test

* Only allow single instantiation with explicitFilePath

* Move and expand tests

* Fix failing test

* Add test for FhirSettings param precedence

* Refactor to only call getInstance() internally in FhirSettings
This commit is contained in:
dotasek 2023-04-19 17:18:29 -04:00 committed by GitHub
parent 237a9c99f0
commit 9b4b1ae2cc
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
26 changed files with 582 additions and 221 deletions

View File

@ -86,9 +86,10 @@ import org.hl7.fhir.dstu2.model.Resource;
import org.hl7.fhir.dstu2.model.ResourceType;
import org.hl7.fhir.dstu2.utils.ResourceUtilities;
import org.hl7.fhir.exceptions.FHIRException;
import org.hl7.fhir.utilities.ToolGlobalSettings;
import org.hl7.fhir.utilities.ToolingClientLogger;
import org.hl7.fhir.utilities.Utilities;
import org.hl7.fhir.utilities.settings.FhirSettings;
/**
* Helper class handling lower level HTTP transport concerns.
@ -142,7 +143,7 @@ public class ClientUtils {
}
public <T extends Resource> ResourceRequest<T> issueOptionsRequest(URI optionsUri, String resourceFormat, int timeoutLoading) {
if (ToolGlobalSettings.isNoNetwork()) {
if (FhirSettings.isProhibitNetworkAccess()) {
throw new FHIRException("Network Access is prohibited in this context");
}
@ -151,7 +152,7 @@ public class ClientUtils {
}
public <T extends Resource> ResourceRequest<T> issueGetResourceRequest(URI resourceUri, String resourceFormat, int timeoutLoading) {
if (ToolGlobalSettings.isNoNetwork()) {
if (FhirSettings.isProhibitNetworkAccess()) {
throw new FHIRException("Network Access is prohibited in this context");
}
HttpGet httpget = new HttpGet(resourceUri);
@ -159,7 +160,7 @@ public class ClientUtils {
}
public <T extends Resource> ResourceRequest<T> issuePutRequest(URI resourceUri, byte[] payload, String resourceFormat, List<Header> headers, int timeoutLoading) {
if (ToolGlobalSettings.isNoNetwork()) {
if (FhirSettings.isProhibitNetworkAccess()) {
throw new FHIRException("Network Access is prohibited in this context");
}
HttpPut httpPut = new HttpPut(resourceUri);
@ -167,7 +168,7 @@ public class ClientUtils {
}
public <T extends Resource> ResourceRequest<T> issuePutRequest(URI resourceUri, byte[] payload, String resourceFormat, int timeoutLoading) {
if (ToolGlobalSettings.isNoNetwork()) {
if (FhirSettings.isProhibitNetworkAccess()) {
throw new FHIRException("Network Access is prohibited in this context");
}
HttpPut httpPut = new HttpPut(resourceUri);
@ -175,7 +176,7 @@ public class ClientUtils {
}
public <T extends Resource> ResourceRequest<T> issuePostRequest(URI resourceUri, byte[] payload, String resourceFormat, List<Header> headers, int timeoutLoading) {
if (ToolGlobalSettings.isNoNetwork()) {
if (FhirSettings.isProhibitNetworkAccess()) {
throw new FHIRException("Network Access is prohibited in this context");
}
HttpPost httpPost = new HttpPost(resourceUri);
@ -188,7 +189,7 @@ public class ClientUtils {
}
public Bundle issueGetFeedRequest(URI resourceUri, String resourceFormat) {
if (ToolGlobalSettings.isNoNetwork()) {
if (FhirSettings.isProhibitNetworkAccess()) {
throw new FHIRException("Network Access is prohibited in this context");
}
HttpGet httpget = new HttpGet(resourceUri);
@ -209,7 +210,7 @@ public class ClientUtils {
}
public Bundle postBatchRequest(URI resourceUri, byte[] payload, String resourceFormat, int timeoutLoading) {
if (ToolGlobalSettings.isNoNetwork()) {
if (FhirSettings.isProhibitNetworkAccess()) {
throw new FHIRException("Network Access is prohibited in this context");
}
HttpPost httpPost = new HttpPost(resourceUri);
@ -219,7 +220,7 @@ public class ClientUtils {
}
public boolean issueDeleteRequest(URI resourceUri) {
if (ToolGlobalSettings.isNoNetwork()) {
if (FhirSettings.isProhibitNetworkAccess()) {
throw new FHIRException("Network Access is prohibited in this context");
}
HttpDelete deleteRequest = new HttpDelete(resourceUri);
@ -255,7 +256,7 @@ public class ClientUtils {
* @return
*/
protected <T extends Resource> ResourceRequest<T> issueResourceRequest(String resourceFormat, HttpUriRequest request, byte[] payload, List<Header> headers, int timeoutLoading) {
if (ToolGlobalSettings.isNoNetwork()) {
if (FhirSettings.isProhibitNetworkAccess()) {
throw new FHIRException("Network Access is prohibited in this context");
}
configureFhirRequest(request, resourceFormat, headers);
@ -315,7 +316,7 @@ public class ClientUtils {
*/
@SuppressWarnings({ "resource", "deprecation" })
protected HttpResponse sendPayload(HttpEntityEnclosingRequestBase request, byte[] payload, HttpHost proxy, int timeoutLoading) {
if (ToolGlobalSettings.isNoNetwork()) {
if (FhirSettings.isProhibitNetworkAccess()) {
throw new FHIRException("Network Access is prohibited in this context");
}
HttpResponse response = null;
@ -356,7 +357,7 @@ public class ClientUtils {
* @return
*/
protected HttpResponse sendRequest(HttpUriRequest request) {
if (ToolGlobalSettings.isNoNetwork()) {
if (FhirSettings.isProhibitNetworkAccess()) {
throw new FHIRException("Network Access is prohibited in this context");
}
HttpResponse response = null;
@ -466,7 +467,7 @@ public class ClientUtils {
* ***************************************************************/
public HttpURLConnection buildConnection(URI baseServiceUri, String tail) {
if (ToolGlobalSettings.isNoNetwork()) {
if (FhirSettings.isProhibitNetworkAccess()) {
throw new FHIRException("Network Access is prohibited in this context");
}

View File

@ -12,8 +12,9 @@ import org.hl7.fhir.dstu3.utils.ResourceUtilities;
import org.hl7.fhir.dstu3.utils.client.EFhirClientException;
import org.hl7.fhir.dstu3.utils.client.ResourceFormat;
import org.hl7.fhir.exceptions.FHIRException;
import org.hl7.fhir.utilities.ToolGlobalSettings;
import org.hl7.fhir.utilities.ToolingClientLogger;
import org.hl7.fhir.utilities.settings.FhirSettings;
import javax.annotation.Nonnull;
import java.io.IOException;
@ -152,7 +153,7 @@ public class FhirRequestBuilder {
* @return {@link OkHttpClient} instance
*/
protected OkHttpClient getHttpClient() {
if (ToolGlobalSettings.isNoNetwork()) {
if (FhirSettings.isProhibitNetworkAccess()) {
throw new FHIRException("Network Access is prohibited in this context");
}

View File

@ -51,12 +51,9 @@ import org.fhir.ucum.UcumEssenceService;
import org.hl7.fhir.r4.context.IWorkerContext;
import org.hl7.fhir.r4.context.SimpleWorkerContext;
import org.hl7.fhir.r4.model.Parameters;
import org.hl7.fhir.utilities.CSFile;
import org.hl7.fhir.utilities.TextFile;
import org.hl7.fhir.utilities.ToolGlobalSettings;
import org.hl7.fhir.utilities.Utilities;
import org.hl7.fhir.utilities.*;
import org.hl7.fhir.utilities.npm.FilesystemPackageCacheManager;
import org.hl7.fhir.utilities.npm.ToolsVersion;
import org.hl7.fhir.utilities.settings.FhirSettings;
import org.hl7.fhir.utilities.tests.BaseTestingUtilities;
import org.hl7.fhir.utilities.tests.ResourceLoaderTests;
import org.hl7.fhir.utilities.tests.TestConfig;
@ -490,8 +487,8 @@ public class TestingUtilities {
*/
String dir = TestConfig.getInstance().getFhirTestCasesDirectory();
if (dir == null && ToolGlobalSettings.hasTestsPath()) {
dir = ToolGlobalSettings.getTestsPath();
if (dir == null && FhirSettings.hasFhirTestCasesPath()) {
dir = FhirSettings.getFhirTestCasesPath();
}
if (dir != null && new CSFile(dir).exists()) {
String n = Utilities.path(dir, Utilities.path(paths));

View File

@ -12,7 +12,8 @@ import org.hl7.fhir.r4.model.Resource;
import org.hl7.fhir.r4.utils.ResourceUtilities;
import org.hl7.fhir.r4.utils.client.EFhirClientException;
import org.hl7.fhir.r4.utils.client.ResourceFormat;
import org.hl7.fhir.utilities.ToolGlobalSettings;
import org.hl7.fhir.utilities.settings.FhirSettings;
import javax.annotation.Nonnull;
import java.io.IOException;
@ -150,7 +151,7 @@ public class FhirRequestBuilder {
* @return {@link OkHttpClient} instance
*/
protected OkHttpClient getHttpClient() {
if (ToolGlobalSettings.isNoNetwork()) {
if (FhirSettings.isProhibitNetworkAccess()) {
throw new FHIRException("Network Access is prohibited in this context");
}

View File

@ -2,12 +2,9 @@ package org.hl7.fhir.r5.test.utils;
import org.apache.commons.codec.binary.Base64;
import org.apache.commons.lang3.StringUtils;
import org.hl7.fhir.r5.model.ValueSet;
import org.hl7.fhir.utilities.CSFile;
import org.hl7.fhir.utilities.TextFile;
import org.hl7.fhir.utilities.ToolGlobalSettings;
import org.hl7.fhir.utilities.Utilities;
import org.hl7.fhir.utilities.*;
import org.hl7.fhir.utilities.settings.FhirSettings;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.NamedNodeMap;
@ -47,7 +44,7 @@ public class CompareUtilities extends BaseTestingUtilities {
public static String checkXMLIsSame(String expected, String actual) throws Exception {
String result = compareXml(expected, actual);
if (result != null && SHOW_DIFF) {
String diff = ToolGlobalSettings.hasComparePath() ? ToolGlobalSettings.getComparePath() : Utilities.path(System.getenv("ProgramFiles"), "WinMerge", "WinMergeU.exe");
String diff = FhirSettings.hasDiffToolPath() ? FhirSettings.getDiffToolPath() : Utilities.path(System.getenv("ProgramFiles"), "WinMerge", "WinMergeU.exe");
if (new File(diff).exists() || Utilities.isToken(diff)) {
Runtime.getRuntime().exec(new String[]{diff, expected, actual});
}

View File

@ -12,7 +12,7 @@ import org.hl7.fhir.r5.model.Resource;
import org.hl7.fhir.r5.utils.ResourceUtilities;
import org.hl7.fhir.r5.utils.client.EFhirClientException;
import org.hl7.fhir.r5.utils.client.ResourceFormat;
import org.hl7.fhir.utilities.ToolGlobalSettings;
import org.hl7.fhir.utilities.settings.FhirSettings;
import javax.annotation.Nonnull;
import java.io.IOException;
@ -150,7 +150,7 @@ public class FhirRequestBuilder {
* @return {@link OkHttpClient} instance
*/
protected OkHttpClient getHttpClient() {
if (ToolGlobalSettings.isNoNetwork()) {
if (FhirSettings.isProhibitNetworkAccess()) {
throw new FHIRException("Network Access is prohibited in this context");
}

View File

@ -6,6 +6,7 @@ import lombok.Getter;
import org.apache.commons.net.ftp.FTP;
import org.apache.commons.net.ftp.FTPReply;
import org.hl7.fhir.exceptions.FHIRException;
import org.hl7.fhir.utilities.settings.FhirSettings;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@ -100,7 +101,7 @@ public class FTPClient {
* Connect to the server, throw an exception if it fails
*/
public void connect() throws IOException {
if (ToolGlobalSettings.isNoNetwork()) {
if (FhirSettings.isProhibitNetworkAccess()) {
throw new FHIRException("Network Access is prohibited in this context");
}

View File

@ -3,6 +3,7 @@ package org.hl7.fhir.utilities;
import lombok.AccessLevel;
import lombok.AllArgsConstructor;
import lombok.With;
import org.hl7.fhir.utilities.settings.FhirSettings;
import java.io.File;
import java.nio.file.Path;
@ -166,8 +167,8 @@ public class PathBuilder {
if ("[tmp]".equals(a)) {
if (hasCTempDir()) {
return Utilities.C_TEMP_DIR;
} else if (ToolGlobalSettings.hasTempPath()) {
return ToolGlobalSettings.getTempPath();
} else if (FhirSettings.hasTempPath()) {
return FhirSettings.getTempPath();
} else {
return System.getProperty("java.io.tmpdir");
}

View File

@ -16,6 +16,7 @@ import org.hl7.fhir.exceptions.FHIRException;
import org.hl7.fhir.utilities.SimpleHTTPClient.HTTPResult;
import org.hl7.fhir.utilities.SimpleHTTPClient.Header;
import org.hl7.fhir.utilities.npm.SSLCertTruster;
import org.hl7.fhir.utilities.settings.FhirSettings;
public class SimpleHTTPClient {
@ -123,7 +124,7 @@ public class SimpleHTTPClient {
}
public HTTPResult get(String url, String accept) throws IOException {
if (ToolGlobalSettings.isNoNetwork()) {
if (FhirSettings.isProhibitNetworkAccess()) {
throw new FHIRException("Network Access is prohibited in this context");
}
@ -185,7 +186,7 @@ public class SimpleHTTPClient {
}
public HTTPResult post(String url, String contentType, byte[] content, String accept) throws IOException {
if (ToolGlobalSettings.isNoNetwork()) {
if (FhirSettings.isProhibitNetworkAccess()) {
throw new FHIRException("Network Access is prohibited in this context");
}
URL u = new URL(url);
@ -205,7 +206,7 @@ public class SimpleHTTPClient {
public HTTPResult put(String url, String contentType, byte[] content, String accept) throws IOException {
if (ToolGlobalSettings.isNoNetwork()) {
if (FhirSettings.isProhibitNetworkAccess()) {
throw new FHIRException("Network Access is prohibited in this context");
}
URL u = new URL(url);

View File

@ -1,101 +0,0 @@
package org.hl7.fhir.utilities;
import java.io.IOException;
public class ToolGlobalSettings {
private static Boolean noNetwork = null;
private static boolean inited = false;
private static String npmPath;
private static String rubyPath;
private static String testsPath;
private static String comparePath;
private static String tempPath;
private static String testIgsPath;
public static String getNpmPath() {
init();
return npmPath;
}
public static String getRubyPath() {
init();
return rubyPath;
}
public static String getTestsPath() {
init();
return testsPath;
}
public static boolean hasNpmPath() {
init();
return npmPath != null;
}
public static boolean hasRubyPath() {
init();
return rubyPath != null;
}
public static boolean hasTestsPath() {
init();
return testsPath != null;
}
public static String getComparePath() {
init();
return comparePath;
}
public static boolean hasComparePath() {
init();
return comparePath != null;
}
public static String getTempPath() {
init();
return tempPath;
}
public static boolean hasTempPath() {
init();
return tempPath != null;
}
public static String getTestIgsPath() {
init();
return testIgsPath;
}
public static boolean hasTestIgsPath() {
init();
return testIgsPath != null;
}
public static boolean isNoNetwork() {
init();
return noNetwork == null ? false : noNetwork;
}
public static void setNoNetwork(boolean value) {
init();
noNetwork = value;
}
private static void init() {
if (!inited) {
inited = true;
IniFile ini;
try {
ini = new IniFile(Utilities.path(Utilities.path(System.getProperty("user.home"), ".fhir", "fhir-tool-settings.conf")));
if (ini.hasSection("paths")) {
npmPath = ini.getStringProperty("paths", "npm");
rubyPath = ini.getStringProperty("paths", "ruby");
testsPath = ini.getStringProperty("paths", "tests");
comparePath = ini.getStringProperty("paths", "compare");
tempPath = ini.getStringProperty("paths", "temp");
testIgsPath = ini.getStringProperty("paths", "test-igs");
noNetwork = ini.getBooleanProperty("network", "no-access");
}
} catch (IOException e) {
}
}
}
}

View File

@ -0,0 +1,176 @@
package org.hl7.fhir.utilities.settings;
import com.fasterxml.jackson.databind.DeserializationFeature;
import com.fasterxml.jackson.databind.ObjectMapper;
import lombok.Getter;
import org.hl7.fhir.utilities.Utilities;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
public class FhirSettings {
public static final String FHIR_SETTINGS_PATH = "fhir.settings.path";
private static String explicitFilePath = null;
public static void setExplicitFilePath(String explicitFilePath) {
if (instance != null) {
throw new IllegalStateException("Attempted to set explicitFilePath after FhirSettings has already been initialized with path: " + instance.filePath);
}
if (FhirSettings.explicitFilePath != null) {
throw new IllegalStateException("Attempted to set explicitFilePath to " + explicitFilePath + " when already set to " + FhirSettings.explicitFilePath);
}
FhirSettings.explicitFilePath = explicitFilePath;
}
private final FhirSettingsPOJO fhirSettings;
public static String getFilePath() {
getInstance();
return instance.filePath;
}
final String filePath;
private FhirSettings(FhirSettingsPOJO fhirSettings, String filePath) {
this.fhirSettings = fhirSettings;
this.filePath = filePath;
}
public static String getApiKey(String key) {
getInstance();
return instance.fhirSettings.getApiKeys() != null
? instance.fhirSettings.getApiKeys().get(key)
: null;
}
public static boolean hasApiKey(String key) {
getInstance();
return instance.fhirSettings.getApiKeys() != null
? instance.fhirSettings.getApiKeys().get(key) != null
: null;
}
public static String getNpmPath() {
getInstance();
return instance.fhirSettings.getNpmPath();
}
public static boolean hasNpmPath() {
getInstance();
return instance.fhirSettings.getNpmPath() != null;
}
public static boolean hasRubyPath() {
getInstance();
return instance.fhirSettings.getRubyPath() != null;
}
public static String getRubyPath() {
getInstance();
return instance.fhirSettings.getRubyPath();
}
public static boolean hasFhirTestCasesPath() {
getInstance();
return instance.fhirSettings.getFhirTestCasesPath() != null;
}
public static String getFhirTestCasesPath() {
getInstance();
return instance.fhirSettings.getFhirTestCasesPath();
}
public static boolean hasDiffToolPath() {
getInstance();
return instance.fhirSettings.getDiffToolPath() != null;
}
public static String getDiffToolPath() {
getInstance();
return instance.fhirSettings.getDiffToolPath();
}
public static boolean hasTempPath() {
getInstance();
return instance.fhirSettings.getTempPath() != null;
}
public static String getTempPath() {
getInstance();
return instance.fhirSettings.getTempPath();
}
public static boolean hasTestIGsPath() {
getInstance();
return instance.fhirSettings.getTestIgsPath() != null;
}
public static String getTestIgsPath() {
getInstance();
return instance.fhirSettings.getTestIgsPath();
}
public static boolean hasProhibitNetworkAccess() {
getInstance();
return instance.fhirSettings.getProhibitNetworkAccess() != null; }
public static boolean isProhibitNetworkAccess() {
getInstance();
return instance.fhirSettings.getProhibitNetworkAccess() == null
? false
: instance.fhirSettings.getProhibitNetworkAccess(); }
private static FhirSettings instance = null;
private static FhirSettings getInstance() {
if (instance == null) {
try {
instance = getInstanceFromPath(explicitFilePath);
} catch (IOException e) {
e.printStackTrace();
instance = new FhirSettings(new FhirSettingsPOJO(), null);
}
}
return instance;
}
protected static FhirSettings getInstanceFromPath(String explicitFilePath) throws IOException {
final String filePath;
filePath = getSettingsFilePath(explicitFilePath);
return new FhirSettings(getFhirSettingsPOJO(filePath), filePath);
}
protected static String getSettingsFilePath(String explicitFilePath) {
final String filePath;
String pathFromSystemProperties;
try {
pathFromSystemProperties = getDefaultSettingsPath();
} catch (IOException e) {
pathFromSystemProperties = null;
}
filePath = explicitFilePath != null ? explicitFilePath :
System.getProperty(FHIR_SETTINGS_PATH, pathFromSystemProperties);
return filePath;
}
static FhirSettingsPOJO getFhirSettingsPOJO(String filePath) throws IOException {
final File file = new File(filePath);
if (!file.exists()) {
return new FhirSettingsPOJO();
}
final ObjectMapper objectMapper = new ObjectMapper();
objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
final InputStream inputStream = new FileInputStream(file);
final FhirSettingsPOJO output = objectMapper.readValue(inputStream, FhirSettingsPOJO.class);
return output;
}
protected static String getDefaultSettingsPath() throws IOException {
return Utilities.path(System.getProperty("user.home"), ".fhir", "fhir-settings.json");
}
}

View File

@ -0,0 +1,42 @@
package org.hl7.fhir.utilities.settings;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.extern.jackson.Jacksonized;
import java.util.Map;
@Data
@Builder
@Jacksonized
@AllArgsConstructor
public class FhirSettingsPOJO {
private String fhirDirectory;
private Map<String, String> apiKeys;
private String npmPath;
private String rubyPath;
private String fhirTestCasesPath;
private String diffToolPath;
private String tempPath;
private String testIgsPath;
private Boolean prohibitNetworkAccess;
protected FhirSettingsPOJO() {
apiKeys = null;
npmPath = null;
rubyPath = null;
fhirTestCasesPath = null;
diffToolPath = null;
tempPath = null;
testIgsPath = null;
}
}

View File

@ -1,10 +1,8 @@
package org.hl7.fhir.utilities.tests;
import org.apache.commons.io.IOUtils;
import org.hl7.fhir.utilities.CSFile;
import org.hl7.fhir.utilities.TextFile;
import org.hl7.fhir.utilities.ToolGlobalSettings;
import org.hl7.fhir.utilities.Utilities;
import org.hl7.fhir.utilities.*;
import org.hl7.fhir.utilities.settings.FhirSettings;
import java.io.*;
import java.nio.file.Path;
@ -25,8 +23,8 @@ public class BaseTestingUtilities {
*/
String dir = TestConfig.getInstance().getFhirTestCasesDirectory();
if (dir == null && ToolGlobalSettings.hasTestsPath()) {
dir = ToolGlobalSettings.getTestsPath();
if (dir == null && FhirSettings.hasFhirTestCasesPath()) {
dir = FhirSettings.getFhirTestCasesPath();
}
if (dir != null && new CSFile(dir).exists()) {
String n = Utilities.path(dir, Utilities.path(paths));
@ -49,8 +47,8 @@ public class BaseTestingUtilities {
public static InputStream loadTestResourceStream(String... paths) throws IOException {
String dir = TestConfig.getInstance().getFhirTestCasesDirectory();
if (dir == null && ToolGlobalSettings.hasTestsPath()) {
dir = ToolGlobalSettings.getTestsPath();
if (dir == null && FhirSettings.hasFhirTestCasesPath()) {
dir = FhirSettings.getFhirTestCasesPath();
}
if (dir != null && new File(dir).exists()) {
String n = Utilities.path(dir, Utilities.path(paths));
@ -67,8 +65,8 @@ public class BaseTestingUtilities {
public static byte[] loadTestResourceBytes(String... paths) throws IOException {
String dir = TestConfig.getInstance().getFhirTestCasesDirectory();
if (dir == null && ToolGlobalSettings.hasTestsPath()) {
dir = ToolGlobalSettings.getTestsPath();
if (dir == null && FhirSettings.hasFhirTestCasesPath()) {
dir = FhirSettings.getFhirTestCasesPath();
}
if (dir != null && new File(dir).exists()) {
String n = Utilities.path(dir, Utilities.path(paths));
@ -85,8 +83,8 @@ public class BaseTestingUtilities {
public static boolean findTestResource(String... paths) throws IOException {
String dir = TestConfig.getInstance().getFhirTestCasesDirectory();
if (dir == null && ToolGlobalSettings.hasTestsPath()) {
dir = ToolGlobalSettings.getTestsPath();
if (dir == null && FhirSettings.hasFhirTestCasesPath()) {
dir = FhirSettings.getFhirTestCasesPath();
}
if (dir != null && new File(dir).exists()) {
String n = Utilities.path(dir, Utilities.path(paths));
@ -108,7 +106,7 @@ public class BaseTestingUtilities {
}
public static String tempFolder(String name) throws IOException {
String path = Utilities.path(ToolGlobalSettings.hasTempPath() ? ToolGlobalSettings.getTempPath() : "[tmp]", name);
String path = Utilities.path(FhirSettings.hasTempPath() ? FhirSettings.getTempPath() : "[tmp]", name);
Utilities.createDirectory(path);
return path;
}

View File

@ -11,6 +11,7 @@ import java.util.Random;
import java.util.stream.Stream;
import org.apache.commons.lang3.SystemUtils;
import org.hl7.fhir.utilities.settings.FhirSettings;
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Test;
@ -45,8 +46,8 @@ class UtilitiesTest {
@Test
@DisplayName("Test Utilities.path maps temp directory correctly")
public void testTempDirPath() throws IOException {
if (ToolGlobalSettings.hasTempPath()) {
assertEquals(Utilities.path("[tmp]", TEST_TXT), ToolGlobalSettings.getTempPath() +File.separator+ TEST_TXT);
if (FhirSettings.hasTempPath()) {
assertEquals(Utilities.path("[tmp]", TEST_TXT), FhirSettings.getTempPath() +File.separator+ TEST_TXT);
} else {
assertEquals(Utilities.path("[tmp]", TEST_TXT), getTempDirectory() + TEST_TXT);
}

View File

@ -0,0 +1,87 @@
package org.hl7.fhir.utilities.settings;
import org.hl7.fhir.utilities.tests.ResourceLoaderTests;
import org.junit.jupiter.api.AfterAll;
import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.BeforeAll;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.parallel.Isolated;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertTrue;
@Isolated
public class FhirSettingsTests implements ResourceLoaderTests {
private static String existingFhirSettingsPath;
@BeforeAll
public static void beforeAll() {
existingFhirSettingsPath = System.getProperty(FhirSettings.FHIR_SETTINGS_PATH);
System.clearProperty(FhirSettings.FHIR_SETTINGS_PATH);
}
@AfterEach
public void afterEach() {
System.clearProperty(FhirSettings.FHIR_SETTINGS_PATH);
}
@AfterAll
public static void afterAll() {
if (existingFhirSettingsPath == null) {
System.clearProperty(FhirSettings.FHIR_SETTINGS_PATH);
} else {
System.setProperty(FhirSettings.FHIR_SETTINGS_PATH, existingFhirSettingsPath);
}
}
@Test
public void testDefaultFhirSettingsPath() throws IOException {
String actualPath = FhirSettings.getSettingsFilePath(null);
assertEquals(FhirSettings.getDefaultSettingsPath(), actualPath);
}
@Test
public void testJavaSystemPropertyFhirSettingsPath() throws IOException {
final String dummyPath = "dummy-path";
System.setProperty(FhirSettings.FHIR_SETTINGS_PATH, dummyPath);
String actualPath = FhirSettings.getSettingsFilePath(null);
assertEquals(dummyPath, actualPath);
}
@Test
public void testExplicitSettingsPathSelected() throws IOException {
final String wrongDummyPath = "wrong-dummy-path";
final String dummyPath = "dummy-path";
System.setProperty(FhirSettings.FHIR_SETTINGS_PATH, wrongDummyPath);
String actualPath = FhirSettings.getSettingsFilePath(dummyPath);
assertEquals(dummyPath, actualPath);
}
@Test
public void testExplicitFhirSettingsPath() throws IOException {
final String dummyPath = "dummy-path";
String actualPath = FhirSettings.getSettingsFilePath(dummyPath);
assertEquals(dummyPath, actualPath);
}
@Test
public void testParseFhirSettings() throws IOException {
Path path = Files.createTempFile("fhir-settings", "json").toAbsolutePath();
copyResourceToFile(path, "settings", "settings-example.json");
FhirSettingsPOJO fhirSettings = FhirSettings.getFhirSettingsPOJO(path.toString());
assertEquals("dummy-npm-path", fhirSettings.getNpmPath());
assertEquals("dummy-ruby-path", fhirSettings.getRubyPath());
assertEquals("dummy-api-key-value", fhirSettings.getApiKeys().get("dummy-api-key"));
assertEquals("dummy-fhir-test-cases-path", fhirSettings.getFhirTestCasesPath());
assertEquals("dummy-diff-tool-path", fhirSettings.getDiffToolPath());
assertEquals("dummy-temp-path", fhirSettings.getTempPath());
assertEquals("dummy-test-igs-path", fhirSettings.getTestIgsPath());
}
}

View File

@ -0,0 +1,15 @@
{
"apiKeys": {
"dummy-api-key": "dummy-api-key-value"
},
"npmPath": "dummy-npm-path",
"rubyPath": "dummy-ruby-path",
"fhirTestCasesPath": "dummy-fhir-test-cases-path",
"diffToolPath": "dummy-diff-tool-path",
"tempPath": "dummy-temp-path",
"testIgsPath": "dummy-test-igs-path",
"unusedField" : "unused",
"unusedData" : {
"unusedDateField" : "unused-data"
}
}

View File

@ -77,19 +77,13 @@ import org.hl7.fhir.r5.utils.validation.constants.CodedContentValidationPolicy;
import org.hl7.fhir.r5.utils.validation.constants.ContainedReferenceValidationPolicy;
import org.hl7.fhir.r5.utils.validation.constants.IdStatus;
import org.hl7.fhir.r5.utils.validation.constants.ReferenceValidationPolicy;
import org.hl7.fhir.utilities.FhirPublication;
import org.hl7.fhir.utilities.IniFile;
import org.hl7.fhir.utilities.SIDUtilities;
import org.hl7.fhir.utilities.SimpleHTTPClient;
import org.hl7.fhir.utilities.*;
import org.hl7.fhir.utilities.SimpleHTTPClient.HTTPResult;
import org.hl7.fhir.utilities.TextFile;
import org.hl7.fhir.utilities.TimeTracker;
import org.hl7.fhir.utilities.Utilities;
import org.hl7.fhir.utilities.VersionUtilities;
import org.hl7.fhir.utilities.npm.CommonPackages;
import org.hl7.fhir.utilities.npm.FilesystemPackageCacheManager;
import org.hl7.fhir.utilities.npm.NpmPackage;
import org.hl7.fhir.utilities.npm.ToolsVersion;
import org.hl7.fhir.utilities.settings.FhirSettings;
import org.hl7.fhir.utilities.validation.ValidationMessage;
import org.hl7.fhir.utilities.xhtml.XhtmlComposer;
import org.hl7.fhir.validation.BaseValidator.ValidationControl;

View File

@ -78,6 +78,7 @@ import org.hl7.fhir.utilities.Utilities;
import org.hl7.fhir.utilities.VersionUtilities;
import org.hl7.fhir.utilities.json.JsonException;
import org.hl7.fhir.utilities.npm.CommonPackages;
import org.hl7.fhir.utilities.settings.FhirSettings;
import org.hl7.fhir.validation.cli.model.CliContext;
import org.hl7.fhir.validation.cli.services.ComparisonService;
import org.hl7.fhir.validation.cli.services.ValidationService;
@ -130,6 +131,11 @@ public class ValidatorCli {
Display.displaySystemInfo();
CliContext cliContext = Params.loadCliContext(args);
if (cliContext.getFhirSettingsFile() != null) {
FhirSettings.setExplicitFilePath(cliContext.getFhirSettingsFile());
}
FileFormat.checkCharsetAndWarnIfNotUTF8(System.out);
if (shouldDisplayHelpToUser(args)) {

View File

@ -131,6 +131,9 @@ public class CliContext {
@JsonProperty("tgtLang")
private String tgtLang = null;
@JsonProperty("fhirSettingsFile")
private String fhirSettingsFile;
@JsonProperty("map")
public String getMap() {
@ -768,4 +771,15 @@ public class CliContext {
", bundleValidationRules=" + bundleValidationRules +
'}';
}
@JsonProperty("fhirSettingsFile")
public CliContext setFhirSettingsFile(String fhirSettingsFile) {
this.fhirSettingsFile = fhirSettingsFile;
return this;
}
@JsonProperty("fhirSettingsFile")
public String getFhirSettingsFile() {
return fhirSettingsFile;
}
}

View File

@ -7,6 +7,7 @@ import java.io.IOException;
import java.io.PrintStream;
import java.lang.management.ManagementFactory;
import java.lang.management.MemoryMXBean;
import java.net.URISyntaxException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
@ -50,7 +51,7 @@ import org.hl7.fhir.utilities.i18n.LanguageFileProducer.LanguageProducerSession;
import org.hl7.fhir.utilities.i18n.PoGetTextProducer;
import org.hl7.fhir.utilities.i18n.XLIFFProducer;
import org.hl7.fhir.utilities.npm.FilesystemPackageCacheManager;
import org.hl7.fhir.utilities.npm.ToolsVersion;
import org.hl7.fhir.utilities.settings.FhirSettings;
import org.hl7.fhir.utilities.validation.ValidationMessage;
import org.hl7.fhir.validation.Content;
import org.hl7.fhir.validation.IgLoader;
@ -71,6 +72,8 @@ import org.hl7.fhir.validation.cli.renderers.ValidationOutputRenderer;
import org.hl7.fhir.validation.cli.utils.EngineMode;
import org.hl7.fhir.validation.cli.utils.VersionSourceInformation;
import javax.annotation.Nonnull;
public class ValidationService {
private final SessionCache sessionCache;
@ -394,70 +397,82 @@ public class ValidationService {
if (sessionId != null) {
System.out.println("No such cached session exists for session id " + sessionId + ", re-instantiating validator.");
}
System.out.print(" Load FHIR v" + cliContext.getSv() + " from " + definitions);
ValidationEngine validator = new ValidationEngine.ValidationEngineBuilder().withTHO(false).withVersion(cliContext.getSv()).withTimeTracker(tt).withUserAgent("fhir/validator").fromSource(definitions);
ValidationEngine validator = buildValidationEngine(cliContext, definitions, tt);
sessionId = sessionCache.cacheSession(validator);
FhirPublication ver = FhirPublication.fromCode(cliContext.getSv());
System.out.println(" - " + validator.getContext().countAllCaches() + " resources (" + tt.milestone() + ")");
IgLoader igLoader = new IgLoader(validator.getPcm(), validator.getContext(), validator.getVersion(), validator.isDebug());
igLoader.loadIg(validator.getIgs(), validator.getBinaries(), "hl7.terminology", false);
if (!VersionUtilities.isR5Ver(validator.getContext().getVersion())) {
igLoader.loadIg(validator.getIgs(), validator.getBinaries(), "hl7.fhir.uv.extensions", false);
}
System.out.print(" Terminology server " + cliContext.getTxServer());
String txver = validator.setTerminologyServer(cliContext.getTxServer(), cliContext.getTxLog(), ver);
System.out.println(" - Version " + txver + " (" + tt.milestone() + ")");
validator.setDebug(cliContext.isDoDebug());
validator.getContext().setLogger(new SystemOutLoggingService(cliContext.isDoDebug()));
for (String src : cliContext.getIgs()) {
igLoader.loadIg(validator.getIgs(), validator.getBinaries(), src, cliContext.isRecursive());
}
System.out.println(" Package Summary: "+validator.getContext().loadedPackageSummary());
System.out.print(" Get set... ");
validator.setQuestionnaireMode(cliContext.getQuestionnaireMode());
validator.setLevel(cliContext.getLevel());
validator.setDoNative(cliContext.isDoNative());
validator.setHintAboutNonMustSupport(cliContext.isHintAboutNonMustSupport());
for (String s : cliContext.getExtensions()) {
if ("any".equals(s)) {
validator.setAnyExtensionsAllowed(true);
} else {
validator.getExtensionDomains().add(s);
}
}
validator.setLanguage(cliContext.getLang());
validator.setLocale(cliContext.getLocale());
validator.setSnomedExtension(cliContext.getSnomedCTCode());
validator.setAssumeValidRestReferences(cliContext.isAssumeValidRestReferences());
validator.setShowMessagesFromReferences(cliContext.isShowMessagesFromReferences());
validator.setDoImplicitFHIRPathStringConversion(cliContext.isDoImplicitFHIRPathStringConversion());
validator.setHtmlInMarkdownCheck(cliContext.getHtmlInMarkdownCheck());
validator.setNoExtensibleBindingMessages(cliContext.isNoExtensibleBindingMessages());
validator.setNoUnicodeBiDiControlChars(cliContext.isNoUnicodeBiDiControlChars());
validator.setNoInvariantChecks(cliContext.isNoInvariants());
validator.setWantInvariantInMessage(cliContext.isWantInvariantsInMessages());
validator.setSecurityChecks(cliContext.isSecurityChecks());
validator.setCrumbTrails(cliContext.isCrumbTrails());
validator.setForPublication(cliContext.isForPublication());
validator.setShowTimes(cliContext.isShowTimes());
validator.setAllowExampleUrls(cliContext.isAllowExampleUrls());
StandAloneValidatorFetcher fetcher = new StandAloneValidatorFetcher(validator.getPcm(), validator.getContext(), validator);
validator.setFetcher(fetcher);
validator.getContext().setLocator(fetcher);
validator.getBundleValidationRules().addAll(cliContext.getBundleValidationRules());
validator.setJurisdiction(CodeSystemUtilities.readCoding(cliContext.getJurisdiction()));
TerminologyCache.setNoCaching(cliContext.isNoInternalCaching());
validator.prepare(); // generate any missing snapshots
System.out.println(" go (" + tt.milestone() + ")");
} else {
System.out.println("Cached session exists for session id " + sessionId + ", returning stored validator session id.");
}
return sessionId;
}
protected ValidationEngine.ValidationEngineBuilder getValidationEngineBuilder() {
return new ValidationEngine.ValidationEngineBuilder();
}
@Nonnull
protected ValidationEngine buildValidationEngine( CliContext cliContext, String definitions, TimeTracker timeTracker) throws IOException, URISyntaxException {
System.out.print(" Load FHIR v" + cliContext.getSv() + " from " + definitions);
ValidationEngine validationEngine = getValidationEngineBuilder().withTHO(false).withVersion(cliContext.getSv()).withTimeTracker(timeTracker).withUserAgent("fhir/validator").fromSource(definitions);
System.out.println(" - " + validationEngine.getContext().countAllCaches() + " resources (" + timeTracker.milestone() + ")");
loadIgsAndExtensions(validationEngine, cliContext, timeTracker);
System.out.print(" Get set... ");
validationEngine.setQuestionnaireMode(cliContext.getQuestionnaireMode());
validationEngine.setLevel(cliContext.getLevel());
validationEngine.setDoNative(cliContext.isDoNative());
validationEngine.setHintAboutNonMustSupport(cliContext.isHintAboutNonMustSupport());
for (String s : cliContext.getExtensions()) {
if ("any".equals(s)) {
validationEngine.setAnyExtensionsAllowed(true);
} else {
validationEngine.getExtensionDomains().add(s);
}
}
validationEngine.setLanguage(cliContext.getLang());
validationEngine.setLocale(cliContext.getLocale());
validationEngine.setSnomedExtension(cliContext.getSnomedCTCode());
validationEngine.setAssumeValidRestReferences(cliContext.isAssumeValidRestReferences());
validationEngine.setShowMessagesFromReferences(cliContext.isShowMessagesFromReferences());
validationEngine.setDoImplicitFHIRPathStringConversion(cliContext.isDoImplicitFHIRPathStringConversion());
validationEngine.setHtmlInMarkdownCheck(cliContext.getHtmlInMarkdownCheck());
validationEngine.setNoExtensibleBindingMessages(cliContext.isNoExtensibleBindingMessages());
validationEngine.setNoUnicodeBiDiControlChars(cliContext.isNoUnicodeBiDiControlChars());
validationEngine.setNoInvariantChecks(cliContext.isNoInvariants());
validationEngine.setWantInvariantInMessage(cliContext.isWantInvariantsInMessages());
validationEngine.setSecurityChecks(cliContext.isSecurityChecks());
validationEngine.setCrumbTrails(cliContext.isCrumbTrails());
validationEngine.setForPublication(cliContext.isForPublication());
validationEngine.setShowTimes(cliContext.isShowTimes());
validationEngine.setAllowExampleUrls(cliContext.isAllowExampleUrls());
StandAloneValidatorFetcher fetcher = new StandAloneValidatorFetcher(validationEngine.getPcm(), validationEngine.getContext(), validationEngine);
validationEngine.setFetcher(fetcher);
validationEngine.getContext().setLocator(fetcher);
validationEngine.getBundleValidationRules().addAll(cliContext.getBundleValidationRules());
validationEngine.setJurisdiction(CodeSystemUtilities.readCoding(cliContext.getJurisdiction()));
TerminologyCache.setNoCaching(cliContext.isNoInternalCaching());
validationEngine.prepare(); // generate any missing snapshots
System.out.println(" go (" + timeTracker.milestone() + ")");
return validationEngine;
}
protected void loadIgsAndExtensions(ValidationEngine validationEngine, CliContext cliContext, TimeTracker timeTracker) throws IOException, URISyntaxException {
FhirPublication ver = FhirPublication.fromCode(cliContext.getSv());
IgLoader igLoader = new IgLoader(validationEngine.getPcm(), validationEngine.getContext(), validationEngine.getVersion(), validationEngine.isDebug());
igLoader.loadIg(validationEngine.getIgs(), validationEngine.getBinaries(), "hl7.terminology", false);
if (!VersionUtilities.isR5Ver(validationEngine.getContext().getVersion())) {
igLoader.loadIg(validationEngine.getIgs(), validationEngine.getBinaries(), "hl7.fhir.uv.extensions", false);
}
System.out.print(" Terminology server " + cliContext.getTxServer());
String txver = validationEngine.setTerminologyServer(cliContext.getTxServer(), cliContext.getTxLog(), ver);
System.out.println(" - Version " + txver + " (" + timeTracker.milestone() + ")");
validationEngine.setDebug(cliContext.isDoDebug());
validationEngine.getContext().setLogger(new SystemOutLoggingService(cliContext.isDoDebug()));
for (String src : cliContext.getIgs()) {
igLoader.loadIg(validationEngine.getIgs(), validationEngine.getBinaries(), src, cliContext.isRecursive());
}
System.out.println(" Package Summary: "+ validationEngine.getContext().loadedPackageSummary());
}
public String determineVersion(CliContext cliContext) throws Exception {

View File

@ -92,6 +92,7 @@ public class Params {
public static final String TARGET = "-target";
public static final String SOURCE = "-source";
public static final String FILTER = "-filter";
private static final String FHIR_SETTINGS_PARAM = "-fhir-settings";
/**
* Checks the list of passed in params to see if it contains the passed in param.
@ -128,6 +129,12 @@ public class Params {
for (int i = 0; i < args.length; i++) {
if (args[i].equals(VERSION)) {
cliContext.setSv(VersionUtilities.getCurrentPackageVersion(args[++i]));
} else if (args[i].equals(FHIR_SETTINGS_PARAM)) {
final String fhirSettingsFilePath = args[++i];
if (! new File(fhirSettingsFilePath).exists()) {
throw new Error("Cannot find fhir-settings file: " + fhirSettingsFilePath);
}
cliContext.setFhirSettingsFile(fhirSettingsFilePath);
} else if (args[i].equals(OUTPUT)) {
if (i + 1 == args.length)
throw new Error("Specified -output without indicating output file");

View File

@ -1,10 +1,12 @@
package org.hl7.fhir.validation.cli.services;
import org.apache.commons.io.IOUtils;
import org.hl7.fhir.r5.context.SimpleWorkerContext;
import org.hl7.fhir.r5.elementmodel.Manager;
import org.hl7.fhir.r5.model.StructureDefinition;
import org.hl7.fhir.r5.test.utils.TestingUtilities;
import org.hl7.fhir.utilities.npm.FilesystemPackageCacheManager;
import org.hl7.fhir.utilities.TimeTracker;
import org.hl7.fhir.utilities.tests.ResourceLoaderTests;
import org.hl7.fhir.validation.ValidationEngine;
import org.hl7.fhir.validation.cli.model.CliContext;
import org.hl7.fhir.validation.cli.model.FileInfo;
@ -15,8 +17,12 @@ import org.junit.jupiter.api.Test;
import org.mockito.ArgumentMatchers;
import org.mockito.Mockito;
import java.io.IOException;
import java.io.InputStream;
import java.net.URISyntaxException;
import java.nio.charset.StandardCharsets;
import java.nio.file.Files;
import java.nio.file.Path;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
@ -29,7 +35,7 @@ import static org.mockito.AdditionalMatchers.and;
import static org.mockito.ArgumentMatchers.*;
import static org.mockito.Mockito.*;
class ValidationServiceTest {
class ValidationServiceTest {
final String DUMMY_SOURCE = "dummySource";
final String DUMMY_SOURCE1 = "dummySource1";
@ -215,4 +221,50 @@ class ValidationServiceTest {
cliContext = new CliContext().setSources(Arrays.asList(DUMMY_SOURCE1, DUMMY_SOURCE2, DUMMY_SOURCE3));
return cliContext;
}
/* This is a particularly long way to test that a single field in ValidationEngine was set.
However, it does provide example code to test other parts of the buildValidationEngine method as well.
*/
@Test
public void buildValidationEngineTest() throws IOException, URISyntaxException {
final org.hl7.fhir.utilities.TimeTracker timeTracker = mock(org.hl7.fhir.utilities.TimeTracker.class);
final SimpleWorkerContext workerContext = mock(SimpleWorkerContext.class);
final ValidationEngine validationEngine = mock(ValidationEngine.class);
when(validationEngine.getContext()).thenReturn(workerContext);
final ValidationService validationService = new ValidationService() {
@Override
protected ValidationEngine.ValidationEngineBuilder getValidationEngineBuilder() {
ValidationEngine.ValidationEngineBuilder validationEngineBuilder = mock(ValidationEngine.ValidationEngineBuilder.class);
when(validationEngineBuilder.withTHO(anyBoolean())).thenReturn(validationEngineBuilder);
when(validationEngineBuilder.withVersion(isNull())).thenReturn(validationEngineBuilder);
when(validationEngineBuilder.withTimeTracker(any())).thenReturn(validationEngineBuilder);
when(validationEngineBuilder.withUserAgent(anyString())).thenReturn(validationEngineBuilder);
try {
when(validationEngineBuilder.fromSource(isNull())).thenReturn(validationEngine);
} catch (IOException e) {
throw new RuntimeException(e);
} catch (URISyntaxException e) {
throw new RuntimeException(e);
}
return validationEngineBuilder;
}
@Override
protected void loadIgsAndExtensions(ValidationEngine validationEngine, CliContext cliContext, TimeTracker timeTracker) throws IOException, URISyntaxException {
//Don't care. Do nothing.
}
};
CliContext cliContext = new CliContext();
validationService.buildValidationEngine(cliContext, null, timeTracker);
}
}

View File

@ -1,8 +1,15 @@
package org.hl7.fhir.validation.cli.utils;
import org.hl7.fhir.validation.cli.model.CliContext;
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.Test;
import java.io.File;
import java.nio.file.Files;
import java.util.Locale;
import static org.hamcrest.MatcherAssert.assertThat;
import static org.hamcrest.Matchers.containsString;
import static org.junit.Assert.assertEquals;
public class ParamsTests {
@ -11,4 +18,20 @@ public class ParamsTests {
CliContext cliContext = Params.loadCliContext(new String[]{"-locale", "de"});
assertEquals(Locale.GERMAN, cliContext.getLocale());
}
@Test
void testFhirSettingsFile() throws Exception {
File tempFile = Files.createTempFile("fhir-settings", "json").toFile();
CliContext cliContext = Params.loadCliContext(new String[]{"-fhir-settings", tempFile.getAbsolutePath()});
assertEquals(tempFile.getAbsolutePath(), cliContext.getFhirSettingsFile());
}
@Test
void testFhirSettingsFileDoesntExist() {
java.lang.Error error = Assertions.assertThrows(java.lang.Error.class, () -> {
CliContext cliContext = Params.loadCliContext(new String[]{"-fhir-settings", "this-does-not-exist.json"});
});
assertThat(error.getMessage(), containsString("this-does-not-exist.json"));
}
}

View File

@ -10,3 +10,14 @@ v: {
"system" : "http://loinc.org"
}
-------------------------------------------------------------------------------------
{"code" : {
"system" : "http://loinc.org",
"code" : "3141-9",
"display" : "Weight Measured"
}, "valueSet" :null, "langs":"[en]", "useServer":"true", "useClient":"true", "guessSystem":"false", "valueSetMode":"ALL_CHECKS", "versionFlexible":"false"}####
v: {
"display" : "Body weight Measured",
"code" : "3141-9",
"system" : "http://loinc.org"
}
-------------------------------------------------------------------------------------

View File

@ -10,3 +10,14 @@ v: {
"system" : "http://snomed.info/sct"
}
-------------------------------------------------------------------------------------
{"code" : {
"system" : "http://snomed.info/sct",
"code" : "27113001",
"display" : "Body weight"
}, "valueSet" :null, "langs":"[en]", "useServer":"true", "useClient":"true", "guessSystem":"false", "valueSetMode":"ALL_CHECKS", "versionFlexible":"false"}####
v: {
"display" : "Body weight",
"code" : "27113001",
"system" : "http://snomed.info/sct"
}
-------------------------------------------------------------------------------------

View File

@ -9,3 +9,13 @@ v: {
"system" : "http://unitsofmeasure.org"
}
-------------------------------------------------------------------------------------
{"code" : {
"system" : "http://unitsofmeasure.org",
"code" : "[lb_av]"
}, "valueSet" :null, "langs":"[en]", "useServer":"true", "useClient":"true", "guessSystem":"false", "valueSetMode":"ALL_CHECKS", "versionFlexible":"false"}####
v: {
"display" : "[lb_av]",
"code" : "[lb_av]",
"system" : "http://unitsofmeasure.org"
}
-------------------------------------------------------------------------------------