diff --git a/pom.xml b/pom.xml index 5858d6b6ca2..3ad764de1f2 100644 --- a/pom.xml +++ b/pom.xml @@ -11,7 +11,7 @@ ca.uhn.hapi.fhir hapi-fhir - 4.1.0 + 4.2.0 hapi-fhir-jpaserver-starter @@ -276,7 +276,7 @@ org.eclipse.jetty jetty-maven-plugin - 9.4.22.v20191022 + ${jetty_version} /hapi-fhir-jpaserver diff --git a/src/main/java/ca/uhn/fhir/jpa/starter/FhirServerConfigCommon.java b/src/main/java/ca/uhn/fhir/jpa/starter/FhirServerConfigCommon.java index b8ae9d20d57..70bfb4d6bd3 100644 --- a/src/main/java/ca/uhn/fhir/jpa/starter/FhirServerConfigCommon.java +++ b/src/main/java/ca/uhn/fhir/jpa/starter/FhirServerConfigCommon.java @@ -173,7 +173,13 @@ public BasicDataSource dataSource() throws ClassNotFoundException, NoSuchMethodE @Lazy @Bean public IBinaryStorageSvc binaryStorageSvc() { - return new DatabaseBlobBinaryStorageSvcImpl(); + DatabaseBlobBinaryStorageSvcImpl binaryStorageSvc = new DatabaseBlobBinaryStorageSvcImpl(); + + if (HapiProperties.getMaxBinarySize() != null) { + binaryStorageSvc.setMaximumBinarySize(HapiProperties.getMaxBinarySize()); + } + + return binaryStorageSvc; } @Bean() diff --git a/src/main/java/ca/uhn/fhir/jpa/starter/HapiProperties.java b/src/main/java/ca/uhn/fhir/jpa/starter/HapiProperties.java index 517ebff3775..5be55f49999 100644 --- a/src/main/java/ca/uhn/fhir/jpa/starter/HapiProperties.java +++ b/src/main/java/ca/uhn/fhir/jpa/starter/HapiProperties.java @@ -19,452 +19,471 @@ import java.util.Set; import java.util.stream.Collectors; -import static org.apache.commons.lang3.StringUtils.*; +import static org.apache.commons.lang3.StringUtils.defaultString; +import static org.apache.commons.lang3.StringUtils.isNotBlank; +import static org.apache.commons.lang3.StringUtils.trim; public class HapiProperties { static final String ENABLE_INDEX_MISSING_FIELDS = "enable_index_missing_fields"; - static final String AUTO_CREATE_PLACEHOLDER_REFERENCE_TARGETS = "auto_create_placeholder_reference_targets"; - static final String ENFORCE_REFERENTIAL_INTEGRITY_ON_WRITE = "enforce_referential_integrity_on_write"; - static final String ENFORCE_REFERENTIAL_INTEGRITY_ON_DELETE = "enforce_referential_integrity_on_delete"; - static final String BINARY_STORAGE_ENABLED = "binary_storage.enabled"; - static final String ALLOW_EXTERNAL_REFERENCES = "allow_external_references"; - static final String ALLOW_MULTIPLE_DELETE = "allow_multiple_delete"; - static final String ALLOW_PLACEHOLDER_REFERENCES = "allow_placeholder_references"; - static final String REUSE_CACHED_SEARCH_RESULTS_MILLIS = "reuse_cached_search_results_millis"; - static final String DATASOURCE_DRIVER = "datasource.driver"; - static final String DATASOURCE_MAX_POOL_SIZE = "datasource.max_pool_size"; - static final String DATASOURCE_PASSWORD = "datasource.password"; - static final String DATASOURCE_URL = "datasource.url"; - static final String DATASOURCE_USERNAME = "datasource.username"; - static final String DEFAULT_ENCODING = "default_encoding"; - static final String DEFAULT_PAGE_SIZE = "default_page_size"; - static final String DEFAULT_PRETTY_PRINT = "default_pretty_print"; - static final String ETAG_SUPPORT = "etag_support"; - static final String FHIR_VERSION = "fhir_version"; - static final String ALLOW_CASCADING_DELETES = "allow_cascading_deletes"; - static final String HAPI_PROPERTIES = "hapi.properties"; - static final String LOGGER_ERROR_FORMAT = "logger.error_format"; - static final String LOGGER_FORMAT = "logger.format"; - static final String LOGGER_LOG_EXCEPTIONS = "logger.log_exceptions"; - static final String LOGGER_NAME = "logger.name"; - static final String MAX_FETCH_SIZE = "max_fetch_size"; - static final String MAX_PAGE_SIZE = "max_page_size"; - static final String SERVER_ADDRESS = "server_address"; - static final String SERVER_ID = "server.id"; - static final String SERVER_NAME = "server.name"; - static final String SUBSCRIPTION_EMAIL_ENABLED = "subscription.email.enabled"; - static final String SUBSCRIPTION_RESTHOOK_ENABLED = "subscription.resthook.enabled"; - static final String SUBSCRIPTION_WEBSOCKET_ENABLED = "subscription.websocket.enabled"; - static final String ALLOWED_BUNDLE_TYPES = "allowed_bundle_types"; - static final String TEST_PORT = "test.port"; - static final String TESTER_CONFIG_REFUSE_TO_FETCH_THIRD_PARTY_URLS = "tester.config.refuse_to_fetch_third_party_urls"; - static final String CORS_ENABLED = "cors.enabled"; - static final String CORS_ALLOWED_ORIGIN = "cors.allowed_origin"; - static final String CORS_ALLOW_CREDENTIALS = "cors.allowCredentials"; - static final String ALLOW_CONTAINS_SEARCHES = "allow_contains_searches"; - static final String ALLOW_OVERRIDE_DEFAULT_SEARCH_PARAMS = "allow_override_default_search_params"; - static final String EMAIL_FROM = "email.from"; - private static final String VALIDATE_REQUESTS_ENABLED = "validation.requests.enabled"; - private static final String VALIDATE_RESPONSES_ENABLED = "validation.responses.enabled"; - private static final String FILTER_SEARCH_ENABLED = "filter_search.enabled"; - private static final String GRAPHQL_ENABLED = "graphql.enabled"; - private static final String BULK_EXPORT_ENABLED = "bulk.export.enabled"; - public static final String EXPIRE_SEARCH_RESULTS_AFTER_MINS = "retain_cached_searches_mins"; + static final String AUTO_CREATE_PLACEHOLDER_REFERENCE_TARGETS = "auto_create_placeholder_reference_targets"; + static final String ENFORCE_REFERENTIAL_INTEGRITY_ON_WRITE = "enforce_referential_integrity_on_write"; + static final String ENFORCE_REFERENTIAL_INTEGRITY_ON_DELETE = "enforce_referential_integrity_on_delete"; + static final String BINARY_STORAGE_ENABLED = "binary_storage.enabled"; + static final String ALLOW_EXTERNAL_REFERENCES = "allow_external_references"; + static final String ALLOW_MULTIPLE_DELETE = "allow_multiple_delete"; + static final String ALLOW_PLACEHOLDER_REFERENCES = "allow_placeholder_references"; + static final String REUSE_CACHED_SEARCH_RESULTS_MILLIS = "reuse_cached_search_results_millis"; + static final String DATASOURCE_DRIVER = "datasource.driver"; + static final String DATASOURCE_MAX_POOL_SIZE = "datasource.max_pool_size"; + static final String DATASOURCE_PASSWORD = "datasource.password"; + static final String DATASOURCE_URL = "datasource.url"; + static final String DATASOURCE_USERNAME = "datasource.username"; + static final String DEFAULT_ENCODING = "default_encoding"; + static final String DEFAULT_PAGE_SIZE = "default_page_size"; + static final String DEFAULT_PRETTY_PRINT = "default_pretty_print"; + static final String ETAG_SUPPORT = "etag_support"; + static final String FHIR_VERSION = "fhir_version"; + static final String ALLOW_CASCADING_DELETES = "allow_cascading_deletes"; + static final String HAPI_PROPERTIES = "hapi.properties"; + static final String LOGGER_ERROR_FORMAT = "logger.error_format"; + static final String LOGGER_FORMAT = "logger.format"; + static final String LOGGER_LOG_EXCEPTIONS = "logger.log_exceptions"; + static final String LOGGER_NAME = "logger.name"; + static final String MAX_FETCH_SIZE = "max_fetch_size"; + static final String MAX_PAGE_SIZE = "max_page_size"; + static final String SERVER_ADDRESS = "server_address"; + static final String SERVER_ID = "server.id"; + static final String SERVER_NAME = "server.name"; + static final String SUBSCRIPTION_EMAIL_ENABLED = "subscription.email.enabled"; + static final String SUBSCRIPTION_RESTHOOK_ENABLED = "subscription.resthook.enabled"; + static final String SUBSCRIPTION_WEBSOCKET_ENABLED = "subscription.websocket.enabled"; + static final String ALLOWED_BUNDLE_TYPES = "allowed_bundle_types"; + static final String TEST_PORT = "test.port"; + static final String TESTER_CONFIG_REFUSE_TO_FETCH_THIRD_PARTY_URLS = "tester.config.refuse_to_fetch_third_party_urls"; + static final String CORS_ENABLED = "cors.enabled"; + static final String CORS_ALLOWED_ORIGIN = "cors.allowed_origin"; + static final String CORS_ALLOW_CREDENTIALS = "cors.allowCredentials"; + static final String ALLOW_CONTAINS_SEARCHES = "allow_contains_searches"; + static final String ALLOW_OVERRIDE_DEFAULT_SEARCH_PARAMS = "allow_override_default_search_params"; + static final String EMAIL_FROM = "email.from"; + static final String VALIDATE_REQUESTS_ENABLED = "validation.requests.enabled"; + static final String VALIDATE_RESPONSES_ENABLED = "validation.responses.enabled"; + static final String FILTER_SEARCH_ENABLED = "filter_search.enabled"; + static final String GRAPHQL_ENABLED = "graphql.enabled"; + static final String BULK_EXPORT_ENABLED = "bulk.export.enabled"; + static final String EXPIRE_SEARCH_RESULTS_AFTER_MINS = "retain_cached_searches_mins"; + static final String MAX_BINARY_SIZE = "max_binary_size"; private static Properties ourProperties; - public static boolean isElasticSearchEnabled() { - return HapiProperties.getPropertyBoolean("elasticsearch.enabled", false); - } - - /* - * Force the configuration to be reloaded - */ - public static void forceReload() { - ourProperties = null; - getProperties(); - } + public static boolean isElasticSearchEnabled() { + return HapiProperties.getPropertyBoolean("elasticsearch.enabled", false); + } + + /* + * Force the configuration to be reloaded + */ + public static void forceReload() { + ourProperties = null; + getProperties(); + } + + /** + * This is mostly here for unit tests. Use the actual properties file + * to set values + */ + @VisibleForTesting + public static void setProperty(String theKey, String theValue) { + getProperties().setProperty(theKey, theValue); + } - /** - * This is mostly here for unit tests. Use the actual properties file - * to set values - */ - @VisibleForTesting - public static void setProperty(String theKey, String theValue) { - getProperties().setProperty(theKey, theValue); - } + public static Properties getJpaProperties() { + Properties retVal = loadProperties(); - public static Properties getJpaProperties() { - Properties retVal = loadProperties(); - - if (isElasticSearchEnabled()) { - ElasticsearchHibernatePropertiesBuilder builder = new ElasticsearchHibernatePropertiesBuilder(); - builder.setRequiredIndexStatus(getPropertyEnum("elasticsearch.required_index_status", ElasticsearchIndexStatus.class, ElasticsearchIndexStatus.YELLOW)); - builder.setRestUrl(getProperty("elasticsearch.rest_url")); - builder.setUsername(getProperty("elasticsearch.username")); - builder.setPassword(getProperty("elasticsearch.password")); - builder.setIndexSchemaManagementStrategy(getPropertyEnum("elasticsearch.schema_management_strategy", IndexSchemaManagementStrategy.class, IndexSchemaManagementStrategy.CREATE)); - builder.setDebugRefreshAfterWrite(getPropertyBoolean("elasticsearch.debug.refresh_after_write", false)); - builder.setDebugPrettyPrintJsonLog(getPropertyBoolean("elasticsearch.debug.pretty_print_json_log", false)); - builder.apply(retVal); - } - - return retVal; + if (isElasticSearchEnabled()) { + ElasticsearchHibernatePropertiesBuilder builder = new ElasticsearchHibernatePropertiesBuilder(); + builder.setRequiredIndexStatus(getPropertyEnum("elasticsearch.required_index_status", ElasticsearchIndexStatus.class, ElasticsearchIndexStatus.YELLOW)); + builder.setRestUrl(getProperty("elasticsearch.rest_url")); + builder.setUsername(getProperty("elasticsearch.username")); + builder.setPassword(getProperty("elasticsearch.password")); + builder.setIndexSchemaManagementStrategy(getPropertyEnum("elasticsearch.schema_management_strategy", IndexSchemaManagementStrategy.class, IndexSchemaManagementStrategy.CREATE)); + builder.setDebugRefreshAfterWrite(getPropertyBoolean("elasticsearch.debug.refresh_after_write", false)); + builder.setDebugPrettyPrintJsonLog(getPropertyBoolean("elasticsearch.debug.pretty_print_json_log", false)); + builder.apply(retVal); } - private static Properties getProperties() { - if (ourProperties == null) { - Properties properties = loadProperties(); - HapiProperties.ourProperties = properties; - } + return retVal; + } - return ourProperties; + private static Properties getProperties() { + if (ourProperties == null) { + Properties properties = loadProperties(); + HapiProperties.ourProperties = properties; } - @NotNull - private static Properties loadProperties() { - // Load the configurable properties file - Properties properties; - try (InputStream in = HapiProperties.class.getClassLoader().getResourceAsStream(HAPI_PROPERTIES)) { - properties = new Properties(); - properties.load(in); - } catch (Exception e) { - throw new ConfigurationException("Could not load HAPI properties", e); - } - - Properties overrideProps = loadOverrideProperties(); - if (overrideProps != null) { - properties.putAll(overrideProps); - } - return properties; - } + return ourProperties; + } - /** - * If a configuration file path is explicitly specified via -Dhapi.properties=, the properties there will - * be used to override the entries in the default hapi.properties file (currently under WEB-INF/classes) - * - * @return properties loaded from the explicitly specified configuraiton file if there is one, or null otherwise. - */ - private static Properties loadOverrideProperties() { - String confFile = System.getProperty(HAPI_PROPERTIES); - if (confFile != null) { - try { - Properties props = new Properties(); - props.load(new FileInputStream(confFile)); - return props; - } catch (Exception e) { - throw new ConfigurationException("Could not load HAPI properties file: " + confFile, e); - } - } - - return null; + @NotNull + private static Properties loadProperties() { + // Load the configurable properties file + Properties properties; + try (InputStream in = HapiProperties.class.getClassLoader().getResourceAsStream(HAPI_PROPERTIES)) { + properties = new Properties(); + properties.load(in); + } catch (Exception e) { + throw new ConfigurationException("Could not load HAPI properties", e); } - private static String getProperty(String propertyName) { - String env = "HAPI_" + propertyName.toUpperCase(Locale.US); - env = env.replace(".", "_"); - env = env.replace("-", "_"); - - String propertyValue = System.getenv(env); - if (propertyValue != null) { - return propertyValue; - } - - Properties properties = HapiProperties.getProperties(); - if (properties != null) { - propertyValue = properties.getProperty(propertyName); - } - - return propertyValue; + Properties overrideProps = loadOverrideProperties(); + if (overrideProps != null) { + properties.putAll(overrideProps); } + return properties; + } - private static String getProperty(String propertyName, String defaultValue) { - String value = getProperty(propertyName); - - if (value != null && value.length() > 0) { - return value; - } - - return defaultValue; + /** + * If a configuration file path is explicitly specified via -Dhapi.properties=, the properties there will + * be used to override the entries in the default hapi.properties file (currently under WEB-INF/classes) + * + * @return properties loaded from the explicitly specified configuraiton file if there is one, or null otherwise. + */ + private static Properties loadOverrideProperties() { + String confFile = System.getProperty(HAPI_PROPERTIES); + if (confFile != null) { + try { + Properties props = new Properties(); + props.load(new FileInputStream(confFile)); + return props; + } catch (Exception e) { + throw new ConfigurationException("Could not load HAPI properties file: " + confFile, e); + } } - private static Boolean getBooleanProperty(String propertyName, Boolean defaultValue) { - String value = HapiProperties.getProperty(propertyName); + return null; + } - if (value == null || value.length() == 0) { - return defaultValue; - } + private static String getProperty(String propertyName) { + String env = "HAPI_" + propertyName.toUpperCase(Locale.US); + env = env.replace(".", "_"); + env = env.replace("-", "_"); - return Boolean.parseBoolean(value); + String propertyValue = System.getenv(env); + if (propertyValue != null) { + return propertyValue; } - private static boolean getBooleanProperty(String propertyName, boolean defaultValue) { - return getBooleanProperty(propertyName, Boolean.valueOf(defaultValue)); + Properties properties = HapiProperties.getProperties(); + if (properties != null) { + propertyValue = properties.getProperty(propertyName); } - private static Integer getIntegerProperty(String propertyName, Integer defaultValue) { - String value = HapiProperties.getProperty(propertyName); + return propertyValue; + } - if (value == null || value.length() == 0) { - return defaultValue; - } + private static String getProperty(String propertyName, String defaultValue) { + String value = getProperty(propertyName); - return Integer.parseInt(value); + if (value != null && value.length() > 0) { + return value; } - public static FhirVersionEnum getFhirVersion() { - String fhirVersionString = HapiProperties.getProperty(FHIR_VERSION); + return defaultValue; + } - if (fhirVersionString != null && fhirVersionString.length() > 0) { - return FhirVersionEnum.valueOf(fhirVersionString); - } + private static Boolean getBooleanProperty(String propertyName, Boolean defaultValue) { + String value = HapiProperties.getProperty(propertyName); - return FhirVersionEnum.DSTU3; + if (value == null || value.length() == 0) { + return defaultValue; } - public static boolean isBinaryStorageEnabled() { - return HapiProperties.getBooleanProperty(BINARY_STORAGE_ENABLED, true); - } + return Boolean.parseBoolean(value); + } - public static ETagSupportEnum getEtagSupport() { - String etagSupportString = HapiProperties.getProperty(ETAG_SUPPORT); + private static boolean getBooleanProperty(String propertyName, boolean defaultValue) { + return getBooleanProperty(propertyName, Boolean.valueOf(defaultValue)); + } - if (etagSupportString != null && etagSupportString.length() > 0) { - return ETagSupportEnum.valueOf(etagSupportString); - } + private static Integer getIntegerProperty(String propertyName, Integer defaultValue) { + String value = HapiProperties.getProperty(propertyName); - return ETagSupportEnum.ENABLED; + if (value == null || value.length() == 0) { + return defaultValue; } - public static EncodingEnum getDefaultEncoding() { - String defaultEncodingString = HapiProperties.getProperty(DEFAULT_ENCODING); + return Integer.parseInt(value); + } - if (defaultEncodingString != null && defaultEncodingString.length() > 0) { - return EncodingEnum.valueOf(defaultEncodingString); - } + public static FhirVersionEnum getFhirVersion() { + String fhirVersionString = HapiProperties.getProperty(FHIR_VERSION); - return EncodingEnum.JSON; + if (fhirVersionString != null && fhirVersionString.length() > 0) { + return FhirVersionEnum.valueOf(fhirVersionString); } - public static Boolean getDefaultPrettyPrint() { - return HapiProperties.getBooleanProperty(DEFAULT_PRETTY_PRINT, true); - } + return FhirVersionEnum.DSTU3; + } - public static String getServerAddress() { - return HapiProperties.getProperty(SERVER_ADDRESS); - } + public static boolean isBinaryStorageEnabled() { + return HapiProperties.getBooleanProperty(BINARY_STORAGE_ENABLED, true); + } - public static Integer getDefaultPageSize() { - return HapiProperties.getIntegerProperty(DEFAULT_PAGE_SIZE, 20); - } + public static ETagSupportEnum getEtagSupport() { + String etagSupportString = HapiProperties.getProperty(ETAG_SUPPORT); - public static Integer getMaximumPageSize() { - return HapiProperties.getIntegerProperty(MAX_PAGE_SIZE, 200); + if (etagSupportString != null && etagSupportString.length() > 0) { + return ETagSupportEnum.valueOf(etagSupportString); } - public static Integer getMaximumFetchSize() { - return HapiProperties.getIntegerProperty(MAX_FETCH_SIZE, Integer.MAX_VALUE); - } + return ETagSupportEnum.ENABLED; + } - public static String getLoggerName() { - return HapiProperties.getProperty(LOGGER_NAME, "fhirtest.access"); - } + public static EncodingEnum getDefaultEncoding() { + String defaultEncodingString = HapiProperties.getProperty(DEFAULT_ENCODING); - public static String getLoggerFormat() { - return HapiProperties.getProperty(LOGGER_FORMAT, "Path[${servletPath}] Source[${requestHeader.x-forwarded-for}] Operation[${operationType} ${operationName} ${idOrResourceName}] UA[${requestHeader.user-agent}] Params[${requestParameters}] ResponseEncoding[${responseEncodingNoDefault}]"); + if (defaultEncodingString != null && defaultEncodingString.length() > 0) { + return EncodingEnum.valueOf(defaultEncodingString); } - public static String getLoggerErrorFormat() { - return HapiProperties.getProperty(LOGGER_ERROR_FORMAT, "ERROR - ${requestVerb} ${requestUrl}"); - } + return EncodingEnum.JSON; + } - public static Boolean getLoggerLogExceptions() { - return HapiProperties.getBooleanProperty(LOGGER_LOG_EXCEPTIONS, true); - } + public static Boolean getDefaultPrettyPrint() { + return HapiProperties.getBooleanProperty(DEFAULT_PRETTY_PRINT, true); + } - public static String getDataSourceDriver() { - return HapiProperties.getProperty(DATASOURCE_DRIVER, "org.apache.derby.jdbc.EmbeddedDriver"); - } + public static String getServerAddress() { + return HapiProperties.getProperty(SERVER_ADDRESS); + } - public static Integer getDataSourceMaxPoolSize() { - return HapiProperties.getIntegerProperty(DATASOURCE_MAX_POOL_SIZE, 10); - } + public static Integer getDefaultPageSize() { + return HapiProperties.getIntegerProperty(DEFAULT_PAGE_SIZE, 20); + } - public static String getDataSourceUrl() { - return HapiProperties.getProperty(DATASOURCE_URL, "jdbc:derby:directory:target/jpaserver_derby_files;create=true"); - } + public static Integer getMaximumPageSize() { + return HapiProperties.getIntegerProperty(MAX_PAGE_SIZE, 200); + } - public static String getDataSourceUsername() { - return HapiProperties.getProperty(DATASOURCE_USERNAME); - } + public static Integer getMaximumFetchSize() { + return HapiProperties.getIntegerProperty(MAX_FETCH_SIZE, Integer.MAX_VALUE); + } - public static String getDataSourcePassword() { - return HapiProperties.getProperty(DATASOURCE_PASSWORD); - } + public static String getLoggerName() { + return HapiProperties.getProperty(LOGGER_NAME, "fhirtest.access"); + } - public static Boolean getAllowMultipleDelete() { - return HapiProperties.getBooleanProperty(ALLOW_MULTIPLE_DELETE, false); - } + public static String getLoggerFormat() { + return HapiProperties.getProperty(LOGGER_FORMAT, "Path[${servletPath}] Source[${requestHeader.x-forwarded-for}] Operation[${operationType} ${operationName} ${idOrResourceName}] UA[${requestHeader.user-agent}] Params[${requestParameters}] ResponseEncoding[${responseEncodingNoDefault}]"); + } - public static Boolean getAllowCascadingDeletes() { - return HapiProperties.getBooleanProperty(ALLOW_CASCADING_DELETES, false); - } + public static String getLoggerErrorFormat() { + return HapiProperties.getProperty(LOGGER_ERROR_FORMAT, "ERROR - ${requestVerb} ${requestUrl}"); + } - public static Boolean getAllowExternalReferences() { - return HapiProperties.getBooleanProperty(ALLOW_EXTERNAL_REFERENCES, false); - } + public static Boolean getLoggerLogExceptions() { + return HapiProperties.getBooleanProperty(LOGGER_LOG_EXCEPTIONS, true); + } - public static Boolean getExpungeEnabled() { - return HapiProperties.getBooleanProperty("expunge_enabled", true); - } + public static String getDataSourceDriver() { + return HapiProperties.getProperty(DATASOURCE_DRIVER, "org.apache.derby.jdbc.EmbeddedDriver"); + } - public static Integer getTestPort() { - return HapiProperties.getIntegerProperty(TEST_PORT, 0); - } + public static Integer getDataSourceMaxPoolSize() { + return HapiProperties.getIntegerProperty(DATASOURCE_MAX_POOL_SIZE, 10); + } - public static Boolean getTesterConfigRefustToFetchThirdPartyUrls() { - return HapiProperties.getBooleanProperty(TESTER_CONFIG_REFUSE_TO_FETCH_THIRD_PARTY_URLS, false); - } + public static String getDataSourceUrl() { + return HapiProperties.getProperty(DATASOURCE_URL, "jdbc:derby:directory:target/jpaserver_derby_files;create=true"); + } - public static Boolean getCorsEnabled() { - return HapiProperties.getBooleanProperty(CORS_ENABLED, true); - } + public static String getDataSourceUsername() { + return HapiProperties.getProperty(DATASOURCE_USERNAME); + } - public static String getCorsAllowedOrigin() { - return HapiProperties.getProperty(CORS_ALLOWED_ORIGIN, "*"); - } + public static String getDataSourcePassword() { + return HapiProperties.getProperty(DATASOURCE_PASSWORD); + } - public static String getAllowedBundleTypes() { - return HapiProperties.getProperty(ALLOWED_BUNDLE_TYPES, ""); - } + public static Boolean getAllowMultipleDelete() { + return HapiProperties.getBooleanProperty(ALLOW_MULTIPLE_DELETE, false); + } - @Nonnull - public static Set getSupportedResourceTypes() { - String[] types = defaultString(getProperty("supported_resource_types")).split(","); - return Arrays.stream(types) - .map(t -> trim(t)) - .filter(t -> isNotBlank(t)) - .collect(Collectors.toSet()); - } + public static Boolean getAllowCascadingDeletes() { + return HapiProperties.getBooleanProperty(ALLOW_CASCADING_DELETES, false); + } - public static String getServerName() { - return HapiProperties.getProperty(SERVER_NAME, "Local Tester"); - } + public static Boolean getAllowExternalReferences() { + return HapiProperties.getBooleanProperty(ALLOW_EXTERNAL_REFERENCES, false); + } - public static String getServerId() { - return HapiProperties.getProperty(SERVER_ID, "home"); - } + public static Boolean getExpungeEnabled() { + return HapiProperties.getBooleanProperty("expunge_enabled", true); + } - public static Boolean getAllowPlaceholderReferences() { - return HapiProperties.getBooleanProperty(ALLOW_PLACEHOLDER_REFERENCES, true); - } + public static Integer getTestPort() { + return HapiProperties.getIntegerProperty(TEST_PORT, 0); + } - public static Boolean getSubscriptionEmailEnabled() { - return HapiProperties.getBooleanProperty(SUBSCRIPTION_EMAIL_ENABLED, false); - } + public static Boolean getTesterConfigRefustToFetchThirdPartyUrls() { + return HapiProperties.getBooleanProperty(TESTER_CONFIG_REFUSE_TO_FETCH_THIRD_PARTY_URLS, false); + } - public static Boolean getSubscriptionRestHookEnabled() { - return HapiProperties.getBooleanProperty(SUBSCRIPTION_RESTHOOK_ENABLED, false); - } + public static Boolean getCorsEnabled() { + return HapiProperties.getBooleanProperty(CORS_ENABLED, true); + } - public static Boolean getSubscriptionWebsocketEnabled() { - return HapiProperties.getBooleanProperty(SUBSCRIPTION_WEBSOCKET_ENABLED, false); - } + public static String getCorsAllowedOrigin() { + return HapiProperties.getProperty(CORS_ALLOWED_ORIGIN, "*"); + } - public static Boolean getAllowContainsSearches() { - return HapiProperties.getBooleanProperty(ALLOW_CONTAINS_SEARCHES, true); - } + public static String getAllowedBundleTypes() { + return HapiProperties.getProperty(ALLOWED_BUNDLE_TYPES, ""); + } - public static Boolean getAllowOverrideDefaultSearchParams() { - return HapiProperties.getBooleanProperty(ALLOW_OVERRIDE_DEFAULT_SEARCH_PARAMS, true); - } - - public static String getEmailFrom() { - return HapiProperties.getProperty(EMAIL_FROM, "some@test.com"); - } - - public static Boolean getEmailEnabled() { - return HapiProperties.getBooleanProperty("email.enabled", false); - } - - public static String getEmailHost() { - return HapiProperties.getProperty("email.host"); - } - - public static Integer getEmailPort() { - return HapiProperties.getIntegerProperty("email.port", 0); - } - - public static String getEmailUsername() { - return HapiProperties.getProperty("email.username"); - } - - public static String getEmailPassword() { - return HapiProperties.getProperty("email.password"); - } - - // Defaults from https://javaee.github.io/javamail/docs/api/com/sun/mail/smtp/package-summary.html - public static Boolean getEmailAuth() { return HapiProperties.getBooleanProperty("email.auth", false); } - public static Boolean getEmailStartTlsEnable() { return HapiProperties.getBooleanProperty("email.starttls.enable", false); } - public static Boolean getEmailStartTlsRequired() { return HapiProperties.getBooleanProperty("email.starttls.required", false); } - public static Boolean getEmailQuitWait() { return HapiProperties.getBooleanProperty("email.quitwait", true); } - - public static Long getReuseCachedSearchResultsMillis() { - String value = HapiProperties.getProperty(REUSE_CACHED_SEARCH_RESULTS_MILLIS, "60000"); - return Long.valueOf(value); - } - - public static Long getExpireSearchResultsAfterMins() { - String value = HapiProperties.getProperty(EXPIRE_SEARCH_RESULTS_AFTER_MINS, "60"); - return Long.valueOf(value); - } - - public static Boolean getCorsAllowedCredentials() { - return HapiProperties.getBooleanProperty(CORS_ALLOW_CREDENTIALS, false); - } - - public static boolean getValidateRequestsEnabled() { - return HapiProperties.getBooleanProperty(VALIDATE_REQUESTS_ENABLED, false); - } - - public static boolean getValidateResponsesEnabled() { - return HapiProperties.getBooleanProperty(VALIDATE_RESPONSES_ENABLED, false); - } - - public static boolean getFilterSearchEnabled() { - return HapiProperties.getBooleanProperty(FILTER_SEARCH_ENABLED, true); - } - - public static boolean getGraphqlEnabled() { - return HapiProperties.getBooleanProperty(GRAPHQL_ENABLED, true); - } - - public static boolean getEnforceReferentialIntegrityOnDelete() { - return HapiProperties.getBooleanProperty(ENFORCE_REFERENTIAL_INTEGRITY_ON_DELETE, true); - } - - public static boolean getEnforceReferentialIntegrityOnWrite() { - return HapiProperties.getBooleanProperty(ENFORCE_REFERENTIAL_INTEGRITY_ON_WRITE, true); - } - - public static boolean getAutoCreatePlaceholderReferenceTargets() { - return HapiProperties.getBooleanProperty(AUTO_CREATE_PLACEHOLDER_REFERENCE_TARGETS, true); - } - - public static boolean getEnableIndexMissingFields() { - return HapiProperties.getBooleanProperty(ENABLE_INDEX_MISSING_FIELDS, false); - } - private static boolean getPropertyBoolean(String thePropertyName, boolean theDefaultValue) { - String value = getProperty(thePropertyName, Boolean.toString(theDefaultValue)); - return Boolean.parseBoolean(value); - } - - private static T getPropertyEnum(String thePropertyName, Class theEnumType, T theDefaultValue) { - String value = getProperty(thePropertyName, theDefaultValue.name()); - return (T) Enum.valueOf(theEnumType, value); - } - - public static boolean getBulkExportEnabled() { - return HapiProperties.getBooleanProperty(BULK_EXPORT_ENABLED, true); - } + @Nonnull + public static Set getSupportedResourceTypes() { + String[] types = defaultString(getProperty("supported_resource_types")).split(","); + return Arrays.stream(types) + .map(t -> trim(t)) + .filter(t -> isNotBlank(t)) + .collect(Collectors.toSet()); + } + + public static String getServerName() { + return HapiProperties.getProperty(SERVER_NAME, "Local Tester"); + } + + public static String getServerId() { + return HapiProperties.getProperty(SERVER_ID, "home"); + } + + public static Boolean getAllowPlaceholderReferences() { + return HapiProperties.getBooleanProperty(ALLOW_PLACEHOLDER_REFERENCES, true); + } + + public static Boolean getSubscriptionEmailEnabled() { + return HapiProperties.getBooleanProperty(SUBSCRIPTION_EMAIL_ENABLED, false); + } + + public static Boolean getSubscriptionRestHookEnabled() { + return HapiProperties.getBooleanProperty(SUBSCRIPTION_RESTHOOK_ENABLED, false); + } + + public static Boolean getSubscriptionWebsocketEnabled() { + return HapiProperties.getBooleanProperty(SUBSCRIPTION_WEBSOCKET_ENABLED, false); + } + + public static Boolean getAllowContainsSearches() { + return HapiProperties.getBooleanProperty(ALLOW_CONTAINS_SEARCHES, true); + } + + public static Boolean getAllowOverrideDefaultSearchParams() { + return HapiProperties.getBooleanProperty(ALLOW_OVERRIDE_DEFAULT_SEARCH_PARAMS, true); + } + + public static String getEmailFrom() { + return HapiProperties.getProperty(EMAIL_FROM, "some@test.com"); + } + + public static Boolean getEmailEnabled() { + return HapiProperties.getBooleanProperty("email.enabled", false); + } + + public static String getEmailHost() { + return HapiProperties.getProperty("email.host"); + } + + public static Integer getEmailPort() { + return HapiProperties.getIntegerProperty("email.port", 0); + } + + public static String getEmailUsername() { + return HapiProperties.getProperty("email.username"); + } + + public static String getEmailPassword() { + return HapiProperties.getProperty("email.password"); + } + + // Defaults from https://javaee.github.io/javamail/docs/api/com/sun/mail/smtp/package-summary.html + public static Boolean getEmailAuth() { + return HapiProperties.getBooleanProperty("email.auth", false); + } + + public static Boolean getEmailStartTlsEnable() { + return HapiProperties.getBooleanProperty("email.starttls.enable", false); + } + + public static Boolean getEmailStartTlsRequired() { + return HapiProperties.getBooleanProperty("email.starttls.required", false); + } + + public static Boolean getEmailQuitWait() { + return HapiProperties.getBooleanProperty("email.quitwait", true); + } + + public static Long getReuseCachedSearchResultsMillis() { + String value = HapiProperties.getProperty(REUSE_CACHED_SEARCH_RESULTS_MILLIS, "60000"); + return Long.valueOf(value); + } + + public static Long getExpireSearchResultsAfterMins() { + String value = HapiProperties.getProperty(EXPIRE_SEARCH_RESULTS_AFTER_MINS, "60"); + return Long.valueOf(value); + } + + public static Boolean getCorsAllowedCredentials() { + return HapiProperties.getBooleanProperty(CORS_ALLOW_CREDENTIALS, false); + } + + public static boolean getValidateRequestsEnabled() { + return HapiProperties.getBooleanProperty(VALIDATE_REQUESTS_ENABLED, false); + } + + public static boolean getValidateResponsesEnabled() { + return HapiProperties.getBooleanProperty(VALIDATE_RESPONSES_ENABLED, false); + } + + public static boolean getFilterSearchEnabled() { + return HapiProperties.getBooleanProperty(FILTER_SEARCH_ENABLED, true); + } + + public static boolean getGraphqlEnabled() { + return HapiProperties.getBooleanProperty(GRAPHQL_ENABLED, true); + } + + public static boolean getEnforceReferentialIntegrityOnDelete() { + return HapiProperties.getBooleanProperty(ENFORCE_REFERENTIAL_INTEGRITY_ON_DELETE, true); + } + + public static boolean getEnforceReferentialIntegrityOnWrite() { + return HapiProperties.getBooleanProperty(ENFORCE_REFERENTIAL_INTEGRITY_ON_WRITE, true); + } + + public static boolean getAutoCreatePlaceholderReferenceTargets() { + return HapiProperties.getBooleanProperty(AUTO_CREATE_PLACEHOLDER_REFERENCE_TARGETS, true); + } + + public static boolean getEnableIndexMissingFields() { + return HapiProperties.getBooleanProperty(ENABLE_INDEX_MISSING_FIELDS, false); + } + + public static Integer getMaxBinarySize() { + return getIntegerProperty(MAX_BINARY_SIZE, null); + } + + private static boolean getPropertyBoolean(String thePropertyName, boolean theDefaultValue) { + String value = getProperty(thePropertyName, Boolean.toString(theDefaultValue)); + return Boolean.parseBoolean(value); + } + + private static T getPropertyEnum(String thePropertyName, Class theEnumType, T theDefaultValue) { + String value = getProperty(thePropertyName, theDefaultValue.name()); + return (T) Enum.valueOf(theEnumType, value); + } + + public static boolean getBulkExportEnabled() { + return HapiProperties.getBooleanProperty(BULK_EXPORT_ENABLED, true); + } } diff --git a/src/main/resources/hapi.properties b/src/main/resources/hapi.properties index 17f8a1ce322..991bd28febe 100644 --- a/src/main/resources/hapi.properties +++ b/src/main/resources/hapi.properties @@ -43,6 +43,11 @@ server.name=Local Tester server.id=home test.port= +################################################### +# Binary Storage (104857600 = 100mb) +################################################### +max_binary_size=104857600 + ################################################### # Validation ################################################### diff --git a/src/test/java/ca/uhn/fhir/jpa/starter/ExampleServerDstu3IT.java b/src/test/java/ca/uhn/fhir/jpa/starter/ExampleServerDstu3IT.java index 7507bfb66e4..f1c26172edf 100644 --- a/src/test/java/ca/uhn/fhir/jpa/starter/ExampleServerDstu3IT.java +++ b/src/test/java/ca/uhn/fhir/jpa/starter/ExampleServerDstu3IT.java @@ -43,6 +43,8 @@ public class ExampleServerDstu3IT { HapiProperties.setProperty(HapiProperties.FHIR_VERSION, "DSTU3"); HapiProperties.setProperty(HapiProperties.DATASOURCE_URL, "jdbc:h2:mem:dbr3"); HapiProperties.setProperty(HapiProperties.SUBSCRIPTION_WEBSOCKET_ENABLED, "true"); + HapiProperties.setProperty(HapiProperties.ALLOW_EXTERNAL_REFERENCES, "true"); + HapiProperties.setProperty(HapiProperties.ALLOW_PLACEHOLDER_REFERENCES, "true"); ourCtx = FhirContext.forDstu3(); } diff --git a/src/test/java/ca/uhn/fhir/jpa/starter/ExampleServerR5IT.java b/src/test/java/ca/uhn/fhir/jpa/starter/ExampleServerR5IT.java index 7eff8b0d00f..80f7a20aa86 100644 --- a/src/test/java/ca/uhn/fhir/jpa/starter/ExampleServerR5IT.java +++ b/src/test/java/ca/uhn/fhir/jpa/starter/ExampleServerR5IT.java @@ -14,12 +14,7 @@ import org.eclipse.jetty.websocket.client.ClientUpgradeRequest; import org.eclipse.jetty.websocket.client.WebSocketClient; import org.hl7.fhir.instance.model.api.IIdType; -import org.hl7.fhir.r5.model.Bundle; -import org.hl7.fhir.r5.model.Observation; -import org.hl7.fhir.r5.model.Patient; -import org.hl7.fhir.r5.model.Subscription; -import org.hl7.fhir.r5.model.Topic; -import org.hl7.fhir.r5.model.codesystems.SubscriptionChannelType; +import org.hl7.fhir.r5.model.*; import org.junit.AfterClass; import org.junit.BeforeClass; import org.junit.Test; @@ -80,8 +75,8 @@ public void testWebsocketSubscription() throws Exception { Subscription.SubscriptionChannelComponent channel = new Subscription.SubscriptionChannelComponent(); channel.getType().addCoding() - .setSystem(SubscriptionChannelType.WEBSOCKET.getSystem()) - .setCode(SubscriptionChannelType.WEBSOCKET.toCode()); + .setSystem("http://terminology.hl7.org/CodeSystem/subscription-channel-type") + .setCode("websocket"); channel.getPayload().setContentType("application/json"); subscription.setChannel(channel); @@ -111,7 +106,7 @@ public void testWebsocketSubscription() throws Exception { * Create a matching resource */ Observation obs = new Observation(); - obs.setStatus(Observation.ObservationStatus.FINAL); + obs.setStatus(Enumerations.ObservationStatus.FINAL); ourClient.create().resource(obs).execute(); // Give some time for the subscription to deliver