spotless apply formatting
This commit is contained in:
@@ -10,18 +10,20 @@ import org.springframework.core.env.ConfigurableEnvironment;
|
||||
@Configuration
|
||||
public class ElasticsearchConfig {
|
||||
private static final org.slf4j.Logger ourLog = org.slf4j.LoggerFactory.getLogger(ElasticsearchConfig.class);
|
||||
|
||||
@Bean
|
||||
public ElasticsearchSvcImpl elasticsearchSvc(ConfigurableEnvironment configurableEnvironment) {
|
||||
if (EnvironmentHelper.isElasticsearchEnabled(configurableEnvironment)) {
|
||||
String elasticsearchUrl = EnvironmentHelper.getElasticsearchServerUrl(configurableEnvironment);
|
||||
if (elasticsearchUrl.startsWith("http")) {
|
||||
elasticsearchUrl =elasticsearchUrl.substring(elasticsearchUrl.indexOf("://") + 3);
|
||||
elasticsearchUrl = elasticsearchUrl.substring(elasticsearchUrl.indexOf("://") + 3);
|
||||
}
|
||||
String elasticsearchProtocol = EnvironmentHelper.getElasticsearchServerProtocol(configurableEnvironment);
|
||||
String elasticsearchUsername = EnvironmentHelper.getElasticsearchServerUsername(configurableEnvironment);
|
||||
String elasticsearchPassword = EnvironmentHelper.getElasticsearchServerPassword(configurableEnvironment);
|
||||
ourLog.info("Configuring elasticsearch {} {}", elasticsearchProtocol, elasticsearchUrl);
|
||||
return new ElasticsearchSvcImpl(elasticsearchProtocol, elasticsearchUrl, elasticsearchUsername, elasticsearchPassword);
|
||||
return new ElasticsearchSvcImpl(
|
||||
elasticsearchProtocol, elasticsearchUrl, elasticsearchUsername, elasticsearchPassword);
|
||||
} else {
|
||||
return null;
|
||||
}
|
||||
|
||||
@@ -13,12 +13,8 @@ import ca.uhn.fhir.jpa.subscription.match.deliver.email.EmailSenderImpl;
|
||||
import ca.uhn.fhir.jpa.subscription.match.deliver.email.IEmailSender;
|
||||
import ca.uhn.fhir.rest.server.mail.MailConfig;
|
||||
import ca.uhn.fhir.rest.server.mail.MailSvc;
|
||||
import ca.uhn.fhir.rest.server.provider.ResourceProviderFactory;
|
||||
|
||||
import com.google.common.base.Strings;
|
||||
import org.cqframework.cql.cql2elm.CqlTranslatorOptions;
|
||||
import org.hl7.fhir.r4.model.Bundle.BundleType;
|
||||
import org.springframework.beans.factory.FactoryBean;
|
||||
import org.springframework.boot.env.YamlPropertySourceLoader;
|
||||
import org.springframework.context.annotation.Bean;
|
||||
import org.springframework.context.annotation.Configuration;
|
||||
@@ -39,21 +35,34 @@ public class FhirServerConfigCommon {
|
||||
|
||||
private static final org.slf4j.Logger ourLog = org.slf4j.LoggerFactory.getLogger(FhirServerConfigCommon.class);
|
||||
|
||||
public FhirServerConfigCommon(AppProperties appProperties) {
|
||||
ourLog.info("Server configured to " + (appProperties.getAllow_contains_searches() ? "allow" : "deny") + " contains searches");
|
||||
ourLog.info("Server configured to " + (appProperties.getAllow_multiple_delete() ? "allow" : "deny") + " multiple deletes");
|
||||
ourLog.info("Server configured to " + (appProperties.getAllow_external_references() ? "allow" : "deny") + " external references");
|
||||
ourLog.info("Server configured to " + (appProperties.getDao_scheduling_enabled() ? "enable" : "disable") + " DAO scheduling");
|
||||
ourLog.info("Server configured to " + (appProperties.getDelete_expunge_enabled() ? "enable" : "disable") + " delete expunges");
|
||||
ourLog.info("Server configured to " + (appProperties.getExpunge_enabled() ? "enable" : "disable") + " expunges");
|
||||
ourLog.info("Server configured to " + (appProperties.getAllow_override_default_search_params() ? "allow" : "deny") + " overriding default search params");
|
||||
ourLog.info("Server configured to " + (appProperties.getAuto_create_placeholder_reference_targets() ? "allow" : "disable") + " auto-creating placeholder references");
|
||||
ourLog.info("Server configured to auto-version references at paths {}", appProperties.getAuto_version_reference_at_paths());
|
||||
public FhirServerConfigCommon(AppProperties appProperties) {
|
||||
ourLog.info("Server configured to " + (appProperties.getAllow_contains_searches() ? "allow" : "deny")
|
||||
+ " contains searches");
|
||||
ourLog.info("Server configured to " + (appProperties.getAllow_multiple_delete() ? "allow" : "deny")
|
||||
+ " multiple deletes");
|
||||
ourLog.info("Server configured to " + (appProperties.getAllow_external_references() ? "allow" : "deny")
|
||||
+ " external references");
|
||||
ourLog.info("Server configured to " + (appProperties.getDao_scheduling_enabled() ? "enable" : "disable")
|
||||
+ " DAO scheduling");
|
||||
ourLog.info("Server configured to " + (appProperties.getDelete_expunge_enabled() ? "enable" : "disable")
|
||||
+ " delete expunges");
|
||||
ourLog.info(
|
||||
"Server configured to " + (appProperties.getExpunge_enabled() ? "enable" : "disable") + " expunges");
|
||||
ourLog.info(
|
||||
"Server configured to " + (appProperties.getAllow_override_default_search_params() ? "allow" : "deny")
|
||||
+ " overriding default search params");
|
||||
ourLog.info("Server configured to "
|
||||
+ (appProperties.getAuto_create_placeholder_reference_targets() ? "allow" : "disable")
|
||||
+ " auto-creating placeholder references");
|
||||
ourLog.info(
|
||||
"Server configured to auto-version references at paths {}",
|
||||
appProperties.getAuto_version_reference_at_paths());
|
||||
|
||||
if (appProperties.getSubscription().getEmail() != null) {
|
||||
AppProperties.Subscription.Email email = appProperties.getSubscription().getEmail();
|
||||
ourLog.info(
|
||||
"Server is configured to enable email with host '" + email.getHost() + "' and port " + email.getPort());
|
||||
AppProperties.Subscription.Email email =
|
||||
appProperties.getSubscription().getEmail();
|
||||
ourLog.info("Server is configured to enable email with host '" + email.getHost() + "' and port "
|
||||
+ email.getPort());
|
||||
ourLog.info("Server will use '" + email.getFrom() + "' as the from email address");
|
||||
|
||||
if (!Strings.isNullOrEmpty(email.getUsername())) {
|
||||
@@ -85,19 +94,27 @@ public class FhirServerConfigCommon {
|
||||
public JpaStorageSettings jpaStorageSettings(AppProperties appProperties) {
|
||||
JpaStorageSettings jpaStorageSettings = new JpaStorageSettings();
|
||||
|
||||
jpaStorageSettings.setIndexMissingFields(appProperties.getEnable_index_missing_fields() ? StorageSettings.IndexEnabledEnum.ENABLED : StorageSettings.IndexEnabledEnum.DISABLED);
|
||||
jpaStorageSettings.setAutoCreatePlaceholderReferenceTargets(appProperties.getAuto_create_placeholder_reference_targets());
|
||||
jpaStorageSettings.setAutoVersionReferenceAtPaths(appProperties.getAuto_version_reference_at_paths());
|
||||
jpaStorageSettings.setEnforceReferentialIntegrityOnWrite(appProperties.getEnforce_referential_integrity_on_write());
|
||||
jpaStorageSettings.setEnforceReferentialIntegrityOnDelete(appProperties.getEnforce_referential_integrity_on_delete());
|
||||
jpaStorageSettings.setAllowContainsSearches(appProperties.getAllow_contains_searches());
|
||||
jpaStorageSettings.setAllowMultipleDelete(appProperties.getAllow_multiple_delete());
|
||||
jpaStorageSettings.setAllowExternalReferences(appProperties.getAllow_external_references());
|
||||
jpaStorageSettings.setSchedulingDisabled(!appProperties.getDao_scheduling_enabled());
|
||||
jpaStorageSettings.setDeleteExpungeEnabled(appProperties.getDelete_expunge_enabled());
|
||||
jpaStorageSettings.setExpungeEnabled(appProperties.getExpunge_enabled());
|
||||
if(appProperties.getSubscription() != null && appProperties.getSubscription().getEmail() != null)
|
||||
jpaStorageSettings.setEmailFromAddress(appProperties.getSubscription().getEmail().getFrom());
|
||||
jpaStorageSettings.setIndexMissingFields(
|
||||
appProperties.getEnable_index_missing_fields()
|
||||
? StorageSettings.IndexEnabledEnum.ENABLED
|
||||
: StorageSettings.IndexEnabledEnum.DISABLED);
|
||||
jpaStorageSettings.setAutoCreatePlaceholderReferenceTargets(
|
||||
appProperties.getAuto_create_placeholder_reference_targets());
|
||||
jpaStorageSettings.setAutoVersionReferenceAtPaths(appProperties.getAuto_version_reference_at_paths());
|
||||
jpaStorageSettings.setEnforceReferentialIntegrityOnWrite(
|
||||
appProperties.getEnforce_referential_integrity_on_write());
|
||||
jpaStorageSettings.setEnforceReferentialIntegrityOnDelete(
|
||||
appProperties.getEnforce_referential_integrity_on_delete());
|
||||
jpaStorageSettings.setAllowContainsSearches(appProperties.getAllow_contains_searches());
|
||||
jpaStorageSettings.setAllowMultipleDelete(appProperties.getAllow_multiple_delete());
|
||||
jpaStorageSettings.setAllowExternalReferences(appProperties.getAllow_external_references());
|
||||
jpaStorageSettings.setSchedulingDisabled(!appProperties.getDao_scheduling_enabled());
|
||||
jpaStorageSettings.setDeleteExpungeEnabled(appProperties.getDelete_expunge_enabled());
|
||||
jpaStorageSettings.setExpungeEnabled(appProperties.getExpunge_enabled());
|
||||
if (appProperties.getSubscription() != null
|
||||
&& appProperties.getSubscription().getEmail() != null)
|
||||
jpaStorageSettings.setEmailFromAddress(
|
||||
appProperties.getSubscription().getEmail().getFrom());
|
||||
|
||||
Integer maxFetchSize = appProperties.getMax_page_size();
|
||||
jpaStorageSettings.setFetchSizeDefaultMaximum(maxFetchSize);
|
||||
@@ -115,13 +132,13 @@ public class FhirServerConfigCommon {
|
||||
// Subscriptions are enabled by channel type
|
||||
if (appProperties.getSubscription().getResthook_enabled()) {
|
||||
ourLog.info("Enabling REST-hook subscriptions");
|
||||
jpaStorageSettings
|
||||
.addSupportedSubscriptionType(org.hl7.fhir.dstu2.model.Subscription.SubscriptionChannelType.RESTHOOK);
|
||||
jpaStorageSettings.addSupportedSubscriptionType(
|
||||
org.hl7.fhir.dstu2.model.Subscription.SubscriptionChannelType.RESTHOOK);
|
||||
}
|
||||
if (appProperties.getSubscription().getEmail() != null) {
|
||||
ourLog.info("Enabling email subscriptions");
|
||||
jpaStorageSettings
|
||||
.addSupportedSubscriptionType(org.hl7.fhir.dstu2.model.Subscription.SubscriptionChannelType.EMAIL);
|
||||
jpaStorageSettings.addSupportedSubscriptionType(
|
||||
org.hl7.fhir.dstu2.model.Subscription.SubscriptionChannelType.EMAIL);
|
||||
}
|
||||
if (appProperties.getSubscription().getWebsocket_enabled()) {
|
||||
ourLog.info("Enabling websocket subscriptions");
|
||||
@@ -130,120 +147,125 @@ public class FhirServerConfigCommon {
|
||||
}
|
||||
}
|
||||
|
||||
jpaStorageSettings.setFilterParameterEnabled(appProperties.getFilter_search_enabled());
|
||||
jpaStorageSettings.setAdvancedHSearchIndexing(appProperties.getAdvanced_lucene_indexing());
|
||||
jpaStorageSettings.setTreatBaseUrlsAsLocal(new HashSet<>(appProperties.getLocal_base_urls()));
|
||||
jpaStorageSettings.setFilterParameterEnabled(appProperties.getFilter_search_enabled());
|
||||
jpaStorageSettings.setAdvancedHSearchIndexing(appProperties.getAdvanced_lucene_indexing());
|
||||
jpaStorageSettings.setTreatBaseUrlsAsLocal(new HashSet<>(appProperties.getLocal_base_urls()));
|
||||
|
||||
if (appProperties.getLastn_enabled()) {
|
||||
jpaStorageSettings.setLastNEnabled(true);
|
||||
}
|
||||
if (appProperties.getLastn_enabled()) {
|
||||
jpaStorageSettings.setLastNEnabled(true);
|
||||
}
|
||||
|
||||
if(appProperties.getInline_resource_storage_below_size() != 0){
|
||||
jpaStorageSettings.setInlineResourceTextBelowSize(appProperties.getInline_resource_storage_below_size());
|
||||
}
|
||||
if (appProperties.getInline_resource_storage_below_size() != 0) {
|
||||
jpaStorageSettings.setInlineResourceTextBelowSize(appProperties.getInline_resource_storage_below_size());
|
||||
}
|
||||
|
||||
jpaStorageSettings.setStoreResourceInHSearchIndex(appProperties.getStore_resource_in_lucene_index_enabled());
|
||||
jpaStorageSettings.setNormalizedQuantitySearchLevel(appProperties.getNormalized_quantity_search_level());
|
||||
jpaStorageSettings.setIndexOnContainedResources(appProperties.getEnable_index_contained_resource());
|
||||
jpaStorageSettings.setStoreResourceInHSearchIndex(appProperties.getStore_resource_in_lucene_index_enabled());
|
||||
jpaStorageSettings.setNormalizedQuantitySearchLevel(appProperties.getNormalized_quantity_search_level());
|
||||
jpaStorageSettings.setIndexOnContainedResources(appProperties.getEnable_index_contained_resource());
|
||||
|
||||
if (appProperties.getAllowed_bundle_types() != null) {
|
||||
jpaStorageSettings.setBundleTypesAllowedForStorage(appProperties.getAllowed_bundle_types().stream()
|
||||
.map(BundleType::toCode)
|
||||
.collect(Collectors.toSet()));
|
||||
}
|
||||
|
||||
jpaStorageSettings.setDeferIndexingForCodesystemsOfSize(
|
||||
appProperties.getDefer_indexing_for_codesystems_of_size());
|
||||
|
||||
if (appProperties.getAllowed_bundle_types() != null) {
|
||||
jpaStorageSettings.setBundleTypesAllowedForStorage(appProperties.getAllowed_bundle_types().stream().map(BundleType::toCode).collect(Collectors.toSet()));
|
||||
}
|
||||
if (appProperties.getClient_id_strategy() == JpaStorageSettings.ClientIdStrategyEnum.ANY) {
|
||||
jpaStorageSettings.setResourceServerIdStrategy(JpaStorageSettings.IdStrategyEnum.UUID);
|
||||
jpaStorageSettings.setResourceClientIdStrategy(appProperties.getClient_id_strategy());
|
||||
}
|
||||
// Parallel Batch GET execution settings
|
||||
jpaStorageSettings.setBundleBatchPoolSize(appProperties.getBundle_batch_pool_size());
|
||||
jpaStorageSettings.setBundleBatchPoolSize(appProperties.getBundle_batch_pool_max_size());
|
||||
|
||||
jpaStorageSettings.setDeferIndexingForCodesystemsOfSize(appProperties.getDefer_indexing_for_codesystems_of_size());
|
||||
storageSettings(appProperties, jpaStorageSettings);
|
||||
return jpaStorageSettings;
|
||||
}
|
||||
|
||||
@Bean
|
||||
public YamlPropertySourceLoader yamlPropertySourceLoader() {
|
||||
return new YamlPropertySourceLoader();
|
||||
}
|
||||
|
||||
if (appProperties.getClient_id_strategy() == JpaStorageSettings.ClientIdStrategyEnum.ANY) {
|
||||
jpaStorageSettings.setResourceServerIdStrategy(JpaStorageSettings.IdStrategyEnum.UUID);
|
||||
jpaStorageSettings.setResourceClientIdStrategy(appProperties.getClient_id_strategy());
|
||||
}
|
||||
//Parallel Batch GET execution settings
|
||||
jpaStorageSettings.setBundleBatchPoolSize(appProperties.getBundle_batch_pool_size());
|
||||
jpaStorageSettings.setBundleBatchPoolSize(appProperties.getBundle_batch_pool_max_size());
|
||||
@Bean
|
||||
public PartitionSettings partitionSettings(AppProperties appProperties) {
|
||||
PartitionSettings retVal = new PartitionSettings();
|
||||
|
||||
storageSettings(appProperties, jpaStorageSettings);
|
||||
return jpaStorageSettings;
|
||||
}
|
||||
// Partitioning
|
||||
if (appProperties.getPartitioning() != null) {
|
||||
retVal.setPartitioningEnabled(true);
|
||||
retVal.setIncludePartitionInSearchHashes(
|
||||
appProperties.getPartitioning().getPartitioning_include_in_search_hashes());
|
||||
if (appProperties.getPartitioning().getAllow_references_across_partitions()) {
|
||||
retVal.setAllowReferencesAcrossPartitions(CrossPartitionReferenceMode.ALLOWED_UNQUALIFIED);
|
||||
} else {
|
||||
retVal.setAllowReferencesAcrossPartitions(CrossPartitionReferenceMode.NOT_ALLOWED);
|
||||
}
|
||||
}
|
||||
|
||||
@Bean
|
||||
public YamlPropertySourceLoader yamlPropertySourceLoader() {
|
||||
return new YamlPropertySourceLoader();
|
||||
}
|
||||
return retVal;
|
||||
}
|
||||
|
||||
@Bean
|
||||
public PartitionSettings partitionSettings(AppProperties appProperties) {
|
||||
PartitionSettings retVal = new PartitionSettings();
|
||||
@Primary
|
||||
@Bean
|
||||
public HibernatePropertiesProvider jpaStarterDialectProvider(
|
||||
LocalContainerEntityManagerFactoryBean myEntityManagerFactory) {
|
||||
return new JpaHibernatePropertiesProvider(myEntityManagerFactory);
|
||||
}
|
||||
|
||||
// Partitioning
|
||||
if (appProperties.getPartitioning() != null) {
|
||||
retVal.setPartitioningEnabled(true);
|
||||
retVal.setIncludePartitionInSearchHashes(appProperties.getPartitioning().getPartitioning_include_in_search_hashes());
|
||||
if(appProperties.getPartitioning().getAllow_references_across_partitions()) {
|
||||
retVal.setAllowReferencesAcrossPartitions(CrossPartitionReferenceMode.ALLOWED_UNQUALIFIED);
|
||||
} else {
|
||||
retVal.setAllowReferencesAcrossPartitions(CrossPartitionReferenceMode.NOT_ALLOWED);
|
||||
}
|
||||
}
|
||||
protected StorageSettings storageSettings(AppProperties appProperties, JpaStorageSettings jpaStorageSettings) {
|
||||
jpaStorageSettings.setAllowContainsSearches(appProperties.getAllow_contains_searches());
|
||||
jpaStorageSettings.setAllowExternalReferences(appProperties.getAllow_external_references());
|
||||
jpaStorageSettings.setDefaultSearchParamsCanBeOverridden(
|
||||
appProperties.getAllow_override_default_search_params());
|
||||
if (appProperties.getSubscription() != null
|
||||
&& appProperties.getSubscription().getEmail() != null)
|
||||
jpaStorageSettings.setEmailFromAddress(
|
||||
appProperties.getSubscription().getEmail().getFrom());
|
||||
|
||||
return retVal;
|
||||
}
|
||||
jpaStorageSettings.setNormalizedQuantitySearchLevel(appProperties.getNormalized_quantity_search_level());
|
||||
|
||||
jpaStorageSettings.setIndexOnContainedResources(appProperties.getEnable_index_contained_resource());
|
||||
jpaStorageSettings.setIndexIdentifierOfType(appProperties.getEnable_index_of_type());
|
||||
return jpaStorageSettings;
|
||||
}
|
||||
|
||||
@Primary
|
||||
@Bean
|
||||
public HibernatePropertiesProvider jpaStarterDialectProvider(LocalContainerEntityManagerFactoryBean myEntityManagerFactory) {
|
||||
return new JpaHibernatePropertiesProvider(myEntityManagerFactory);
|
||||
}
|
||||
@Lazy
|
||||
@Bean
|
||||
public IBinaryStorageSvc binaryStorageSvc(AppProperties appProperties) {
|
||||
DatabaseBlobBinaryStorageSvcImpl binaryStorageSvc = new DatabaseBlobBinaryStorageSvcImpl();
|
||||
|
||||
if (appProperties.getMax_binary_size() != null) {
|
||||
binaryStorageSvc.setMaximumBinarySize(appProperties.getMax_binary_size());
|
||||
}
|
||||
|
||||
protected StorageSettings storageSettings(AppProperties appProperties, JpaStorageSettings jpaStorageSettings) {
|
||||
jpaStorageSettings.setAllowContainsSearches(appProperties.getAllow_contains_searches());
|
||||
jpaStorageSettings.setAllowExternalReferences(appProperties.getAllow_external_references());
|
||||
jpaStorageSettings.setDefaultSearchParamsCanBeOverridden(appProperties.getAllow_override_default_search_params());
|
||||
if(appProperties.getSubscription() != null && appProperties.getSubscription().getEmail() != null)
|
||||
jpaStorageSettings.setEmailFromAddress(appProperties.getSubscription().getEmail().getFrom());
|
||||
return binaryStorageSvc;
|
||||
}
|
||||
|
||||
jpaStorageSettings.setNormalizedQuantitySearchLevel(appProperties.getNormalized_quantity_search_level());
|
||||
@Bean
|
||||
public IEmailSender emailSender(AppProperties appProperties) {
|
||||
if (appProperties.getSubscription() != null
|
||||
&& appProperties.getSubscription().getEmail() != null) {
|
||||
|
||||
jpaStorageSettings.setIndexOnContainedResources(appProperties.getEnable_index_contained_resource());
|
||||
jpaStorageSettings.setIndexIdentifierOfType(appProperties.getEnable_index_of_type());
|
||||
return jpaStorageSettings;
|
||||
}
|
||||
return buildEmailSender(appProperties.getSubscription().getEmail());
|
||||
}
|
||||
|
||||
@Lazy
|
||||
@Bean
|
||||
public IBinaryStorageSvc binaryStorageSvc(AppProperties appProperties) {
|
||||
DatabaseBlobBinaryStorageSvcImpl binaryStorageSvc = new DatabaseBlobBinaryStorageSvcImpl();
|
||||
|
||||
if (appProperties.getMax_binary_size() != null) {
|
||||
binaryStorageSvc.setMaximumBinarySize(appProperties.getMax_binary_size());
|
||||
}
|
||||
|
||||
return binaryStorageSvc;
|
||||
}
|
||||
|
||||
@Bean
|
||||
public IEmailSender emailSender(AppProperties appProperties) {
|
||||
if (appProperties.getSubscription() != null && appProperties.getSubscription().getEmail() != null) {
|
||||
|
||||
return buildEmailSender(appProperties.getSubscription().getEmail());
|
||||
}
|
||||
|
||||
// Return a dummy anonymous function instead of null. Spring does not like null beans.
|
||||
// TODO Get the signature of ca.uhn.fhir.jpa.subscription.channel.subscription.SubscriptionDeliveryHandlerFactory
|
||||
// changed so it does not require an instance of an IEmailSender
|
||||
return theDetails -> {};
|
||||
}
|
||||
// Return a dummy anonymous function instead of null. Spring does not like null beans.
|
||||
// TODO Get the signature of
|
||||
// ca.uhn.fhir.jpa.subscription.channel.subscription.SubscriptionDeliveryHandlerFactory
|
||||
// changed so it does not require an instance of an IEmailSender
|
||||
return theDetails -> {};
|
||||
}
|
||||
|
||||
private static IEmailSender buildEmailSender(AppProperties.Subscription.Email email) {
|
||||
|
||||
return new EmailSenderImpl(new MailSvc(new MailConfig()
|
||||
.setSmtpHostname(email.getHost())
|
||||
.setSmtpPort(email.getPort())
|
||||
.setSmtpUsername(email.getUsername())
|
||||
.setSmtpPassword(email.getPassword())
|
||||
.setSmtpUseStartTLS(email.getStartTlsEnable())));
|
||||
.setSmtpHostname(email.getHost())
|
||||
.setSmtpPort(email.getPort())
|
||||
.setSmtpUsername(email.getUsername())
|
||||
.setSmtpPassword(email.getPassword())
|
||||
.setSmtpUseStartTLS(email.getStartTlsEnable())));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -13,14 +13,11 @@ import org.springframework.context.annotation.Import;
|
||||
|
||||
@Configuration
|
||||
@Conditional(OnDSTU2Condition.class)
|
||||
@Import({
|
||||
JpaDstu2Config.class,
|
||||
StarterJpaConfig.class
|
||||
})
|
||||
@Import({JpaDstu2Config.class, StarterJpaConfig.class})
|
||||
public class FhirServerConfigDstu2 {
|
||||
@Bean
|
||||
public ITermLoaderSvc termLoaderService(ITermDeferredStorageSvc theDeferredStorageSvc, ITermCodeSystemStorageSvc theCodeSystemStorageSvc) {
|
||||
public ITermLoaderSvc termLoaderService(
|
||||
ITermDeferredStorageSvc theDeferredStorageSvc, ITermCodeSystemStorageSvc theCodeSystemStorageSvc) {
|
||||
return new TermLoaderSvcImpl(theDeferredStorageSvc, theCodeSystemStorageSvc);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -9,10 +9,5 @@ import org.springframework.context.annotation.Import;
|
||||
|
||||
@Configuration
|
||||
@Conditional(OnDSTU3Condition.class)
|
||||
@Import({
|
||||
JpaDstu3Config.class,
|
||||
StarterJpaConfig.class,
|
||||
StarterCrDstu3Config.class,
|
||||
ElasticsearchConfig.class})
|
||||
public class FhirServerConfigDstu3 {
|
||||
}
|
||||
@Import({JpaDstu3Config.class, StarterJpaConfig.class, StarterCrDstu3Config.class, ElasticsearchConfig.class})
|
||||
public class FhirServerConfigDstu3 {}
|
||||
|
||||
@@ -4,7 +4,6 @@ import ca.uhn.fhir.jpa.config.r4.JpaR4Config;
|
||||
import ca.uhn.fhir.jpa.starter.annotations.OnR4Condition;
|
||||
import ca.uhn.fhir.jpa.starter.cr.StarterCrR4Config;
|
||||
import ca.uhn.fhir.jpa.starter.ips.StarterIpsConfig;
|
||||
|
||||
import org.springframework.context.annotation.Conditional;
|
||||
import org.springframework.context.annotation.Configuration;
|
||||
import org.springframework.context.annotation.Import;
|
||||
@@ -18,5 +17,4 @@ import org.springframework.context.annotation.Import;
|
||||
ElasticsearchConfig.class,
|
||||
StarterIpsConfig.class
|
||||
})
|
||||
public class FhirServerConfigR4 {
|
||||
}
|
||||
public class FhirServerConfigR4 {}
|
||||
|
||||
@@ -9,11 +9,5 @@ import org.springframework.context.annotation.Import;
|
||||
|
||||
@Configuration
|
||||
@Conditional(OnR4BCondition.class)
|
||||
@Import({
|
||||
JpaR4BConfig.class,
|
||||
SubscriptionTopicConfig.class,
|
||||
StarterJpaConfig.class,
|
||||
ElasticsearchConfig.class
|
||||
})
|
||||
public class FhirServerConfigR4B {
|
||||
}
|
||||
@Import({JpaR4BConfig.class, SubscriptionTopicConfig.class, StarterJpaConfig.class, ElasticsearchConfig.class})
|
||||
public class FhirServerConfigR4B {}
|
||||
|
||||
@@ -9,11 +9,5 @@ import org.springframework.context.annotation.Import;
|
||||
|
||||
@Configuration
|
||||
@Conditional(OnR5Condition.class)
|
||||
@Import({
|
||||
StarterJpaConfig.class,
|
||||
JpaR5Config.class,
|
||||
SubscriptionTopicConfig.class,
|
||||
ElasticsearchConfig.class
|
||||
})
|
||||
public class FhirServerConfigR5 {
|
||||
}
|
||||
@Import({StarterJpaConfig.class, JpaR5Config.class, SubscriptionTopicConfig.class, ElasticsearchConfig.class})
|
||||
public class FhirServerConfigR5 {}
|
||||
|
||||
@@ -4,11 +4,10 @@ import ca.uhn.fhir.jpa.starter.AppProperties;
|
||||
import ca.uhn.fhir.to.FhirTesterMvcConfig;
|
||||
import ca.uhn.fhir.to.TesterConfig;
|
||||
import org.springframework.context.annotation.Bean;
|
||||
import org.springframework.context.annotation.Conditional;
|
||||
import org.springframework.context.annotation.Configuration;
|
||||
import org.springframework.context.annotation.Import;
|
||||
|
||||
//@formatter:off
|
||||
// @formatter:off
|
||||
/**
|
||||
* This spring config file configures the web testing module. It serves two
|
||||
* purposes:
|
||||
@@ -19,7 +18,7 @@ import org.springframework.context.annotation.Import;
|
||||
*/
|
||||
@Configuration
|
||||
@Import(FhirTesterMvcConfig.class)
|
||||
//@Conditional(FhirTesterConfigCondition.class)
|
||||
// @Conditional(FhirTesterConfigCondition.class)
|
||||
public class FhirTesterConfig {
|
||||
|
||||
/**
|
||||
@@ -36,22 +35,18 @@ public class FhirTesterConfig {
|
||||
* deploying your server to a place with a fully qualified domain name,
|
||||
* you might want to use that instead of using the variable.
|
||||
*/
|
||||
@Bean
|
||||
public TesterConfig testerConfig(AppProperties appProperties) {
|
||||
TesterConfig retVal = new TesterConfig();
|
||||
appProperties.getTester().forEach((key, value) -> {
|
||||
retVal
|
||||
.addServer()
|
||||
.withId(key)
|
||||
.withFhirVersion(value.getFhir_version())
|
||||
.withBaseUrl(value.getServer_address())
|
||||
.withName(value.getName());
|
||||
retVal.setRefuseToFetchThirdPartyUrls(
|
||||
value.getRefuse_to_fetch_third_party_urls());
|
||||
|
||||
});
|
||||
return retVal;
|
||||
}
|
||||
|
||||
@Bean
|
||||
public TesterConfig testerConfig(AppProperties appProperties) {
|
||||
TesterConfig retVal = new TesterConfig();
|
||||
appProperties.getTester().forEach((key, value) -> {
|
||||
retVal.addServer()
|
||||
.withId(key)
|
||||
.withFhirVersion(value.getFhir_version())
|
||||
.withBaseUrl(value.getServer_address())
|
||||
.withName(value.getName());
|
||||
retVal.setRefuseToFetchThirdPartyUrls(value.getRefuse_to_fetch_third_party_urls());
|
||||
});
|
||||
return retVal;
|
||||
}
|
||||
}
|
||||
//@formatter:on
|
||||
// @formatter:on
|
||||
|
||||
@@ -9,8 +9,9 @@ import org.springframework.core.type.AnnotatedTypeMetadata;
|
||||
public class FhirTesterConfigCondition implements Condition {
|
||||
@Override
|
||||
public boolean matches(ConditionContext conditionContext, AnnotatedTypeMetadata metadata) {
|
||||
|
||||
var properties = EnvironmentHelper.getPropertiesStartingWith((ConfigurableEnvironment) conditionContext.getEnvironment(), "hapi.fhir.tester");
|
||||
|
||||
var properties = EnvironmentHelper.getPropertiesStartingWith(
|
||||
(ConfigurableEnvironment) conditionContext.getEnvironment(), "hapi.fhir.tester");
|
||||
return !properties.isEmpty();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
package ca.uhn.fhir.jpa.starter.common;
|
||||
|
||||
import ca.uhn.fhir.batch2.coordinator.JobDefinitionRegistry;
|
||||
import ca.uhn.fhir.batch2.jobs.export.BulkDataExportProvider;
|
||||
import ca.uhn.fhir.batch2.jobs.imprt.BulkDataImportProvider;
|
||||
import ca.uhn.fhir.batch2.jobs.reindex.ReindexJobParameters;
|
||||
import ca.uhn.fhir.batch2.jobs.reindex.ReindexProvider;
|
||||
@@ -9,7 +10,6 @@ import ca.uhn.fhir.context.ConfigurationException;
|
||||
import ca.uhn.fhir.context.FhirContext;
|
||||
import ca.uhn.fhir.context.FhirVersionEnum;
|
||||
import ca.uhn.fhir.context.support.IValidationSupport;
|
||||
|
||||
import ca.uhn.fhir.interceptor.api.IInterceptorBroadcaster;
|
||||
import ca.uhn.fhir.jpa.api.IDaoRegistry;
|
||||
import ca.uhn.fhir.jpa.api.config.JpaStorageSettings;
|
||||
@@ -18,7 +18,6 @@ import ca.uhn.fhir.jpa.api.dao.DaoRegistry;
|
||||
import ca.uhn.fhir.jpa.api.dao.IFhirSystemDao;
|
||||
import ca.uhn.fhir.jpa.binary.interceptor.BinaryStorageInterceptor;
|
||||
import ca.uhn.fhir.jpa.binary.provider.BinaryAccessProvider;
|
||||
import ca.uhn.fhir.batch2.jobs.export.BulkDataExportProvider;
|
||||
import ca.uhn.fhir.jpa.config.util.HapiEntityManagerFactoryUtil;
|
||||
import ca.uhn.fhir.jpa.config.util.ResourceCountCacheUtil;
|
||||
import ca.uhn.fhir.jpa.config.util.ValidationSupportConfigUtil;
|
||||
@@ -34,8 +33,8 @@ import ca.uhn.fhir.jpa.ips.provider.IpsOperationProvider;
|
||||
import ca.uhn.fhir.jpa.packages.IPackageInstallerSvc;
|
||||
import ca.uhn.fhir.jpa.packages.PackageInstallationSpec;
|
||||
import ca.uhn.fhir.jpa.partition.PartitionManagementProvider;
|
||||
import ca.uhn.fhir.jpa.provider.*;
|
||||
import ca.uhn.fhir.jpa.provider.dstu3.JpaConformanceProviderDstu3;
|
||||
import ca.uhn.fhir.jpa.provider.*;
|
||||
import ca.uhn.fhir.jpa.search.DatabaseBackedPagingProvider;
|
||||
import ca.uhn.fhir.jpa.search.IStaleSearchDeletingSvc;
|
||||
import ca.uhn.fhir.jpa.search.StaleSearchDeletingSvcImpl;
|
||||
@@ -43,8 +42,8 @@ import ca.uhn.fhir.jpa.starter.AppProperties;
|
||||
import ca.uhn.fhir.jpa.starter.annotations.OnCorsPresent;
|
||||
import ca.uhn.fhir.jpa.starter.annotations.OnImplementationGuidesPresent;
|
||||
import ca.uhn.fhir.jpa.starter.common.validation.IRepositoryValidationInterceptorFactory;
|
||||
import ca.uhn.fhir.jpa.starter.util.EnvironmentHelper;
|
||||
import ca.uhn.fhir.jpa.starter.ig.IImplementationGuideOperationProvider;
|
||||
import ca.uhn.fhir.jpa.starter.util.EnvironmentHelper;
|
||||
import ca.uhn.fhir.jpa.subscription.util.SubscriptionDebugLogInterceptor;
|
||||
import ca.uhn.fhir.jpa.util.ResourceCountCache;
|
||||
import ca.uhn.fhir.jpa.validation.JpaValidationSupportChain;
|
||||
@@ -53,9 +52,9 @@ import ca.uhn.fhir.narrative.DefaultThymeleafNarrativeGenerator;
|
||||
import ca.uhn.fhir.narrative2.NullNarrativeGenerator;
|
||||
import ca.uhn.fhir.rest.api.IResourceSupportedSvc;
|
||||
import ca.uhn.fhir.rest.openapi.OpenApiInterceptor;
|
||||
import ca.uhn.fhir.rest.server.interceptor.partition.RequestTenantPartitionInterceptor;
|
||||
import ca.uhn.fhir.rest.server.*;
|
||||
import ca.uhn.fhir.rest.server.interceptor.*;
|
||||
import ca.uhn.fhir.rest.server.interceptor.partition.RequestTenantPartitionInterceptor;
|
||||
import ca.uhn.fhir.rest.server.provider.ResourceProviderFactory;
|
||||
import ca.uhn.fhir.rest.server.tenant.UrlBaseTenantIdentificationStrategy;
|
||||
import ca.uhn.fhir.rest.server.util.ISearchParamRegistry;
|
||||
@@ -75,18 +74,16 @@ import org.springframework.orm.jpa.JpaTransactionManager;
|
||||
import org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean;
|
||||
import org.springframework.web.cors.CorsConfiguration;
|
||||
|
||||
import java.util.*;
|
||||
import javax.persistence.EntityManagerFactory;
|
||||
import javax.sql.DataSource;
|
||||
import java.util.*;
|
||||
|
||||
import static ca.uhn.fhir.jpa.starter.common.validation.IRepositoryValidationInterceptorFactory.ENABLE_REPOSITORY_VALIDATING_INTERCEPTOR;
|
||||
|
||||
@Configuration
|
||||
//allow users to configure custom packages to scan for additional beans
|
||||
@ComponentScan(basePackages = { "${hapi.fhir.custom-bean-packages:}" })
|
||||
@Import(
|
||||
ThreadPoolFactoryConfig.class
|
||||
)
|
||||
// allow users to configure custom packages to scan for additional beans
|
||||
@ComponentScan(basePackages = {"${hapi.fhir.custom-bean-packages:}"})
|
||||
@Import(ThreadPoolFactoryConfig.class)
|
||||
public class StarterJpaConfig {
|
||||
|
||||
private static final org.slf4j.Logger ourLog = org.slf4j.LoggerFactory.getLogger(StarterJpaConfig.class);
|
||||
@@ -107,12 +104,9 @@ public class StarterJpaConfig {
|
||||
return ValidationSupportConfigUtil.newCachingValidationSupport(theJpaValidationSupportChain);
|
||||
}
|
||||
|
||||
|
||||
@Autowired
|
||||
private ConfigurableEnvironment configurableEnvironment;
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* Customize the default/max page sizes for search results. You can set these however
|
||||
* you want, although very large page sizes will require a lot of RAM.
|
||||
@@ -125,7 +119,6 @@ public class StarterJpaConfig {
|
||||
return pagingProvider;
|
||||
}
|
||||
|
||||
|
||||
@Bean
|
||||
public IResourceSupportedSvc resourceSupportedSvc(IDaoRegistry theDaoRegistry) {
|
||||
return new DaoRegistryResourceSupportedSvc(theDaoRegistry);
|
||||
@@ -138,8 +131,12 @@ public class StarterJpaConfig {
|
||||
|
||||
@Primary
|
||||
@Bean
|
||||
public LocalContainerEntityManagerFactoryBean entityManagerFactory(DataSource myDataSource, ConfigurableListableBeanFactory myConfigurableListableBeanFactory, FhirContext theFhirContext) {
|
||||
LocalContainerEntityManagerFactoryBean retVal = HapiEntityManagerFactoryUtil.newEntityManagerFactory(myConfigurableListableBeanFactory, theFhirContext);
|
||||
public LocalContainerEntityManagerFactoryBean entityManagerFactory(
|
||||
DataSource myDataSource,
|
||||
ConfigurableListableBeanFactory myConfigurableListableBeanFactory,
|
||||
FhirContext theFhirContext) {
|
||||
LocalContainerEntityManagerFactoryBean retVal =
|
||||
HapiEntityManagerFactoryUtil.newEntityManagerFactory(myConfigurableListableBeanFactory, theFhirContext);
|
||||
retVal.setPersistenceUnitName("HAPI_PU");
|
||||
|
||||
try {
|
||||
@@ -147,7 +144,8 @@ public class StarterJpaConfig {
|
||||
} catch (Exception e) {
|
||||
throw new ConfigurationException("Could not set the data source due to a configuration issue", e);
|
||||
}
|
||||
retVal.setJpaProperties(EnvironmentHelper.getHibernateProperties(configurableEnvironment, myConfigurableListableBeanFactory));
|
||||
retVal.setJpaProperties(
|
||||
EnvironmentHelper.getHibernateProperties(configurableEnvironment, myConfigurableListableBeanFactory));
|
||||
return retVal;
|
||||
}
|
||||
|
||||
@@ -164,10 +162,10 @@ public class StarterJpaConfig {
|
||||
return new HSearchSortHelperImpl(mySearchParamRegistry);
|
||||
}
|
||||
|
||||
|
||||
@Bean
|
||||
@ConditionalOnProperty(prefix = "hapi.fhir", name = ENABLE_REPOSITORY_VALIDATING_INTERCEPTOR, havingValue = "true")
|
||||
public RepositoryValidatingInterceptor repositoryValidatingInterceptor(IRepositoryValidationInterceptorFactory factory) {
|
||||
public RepositoryValidatingInterceptor repositoryValidatingInterceptor(
|
||||
IRepositoryValidationInterceptorFactory factory) {
|
||||
return factory.buildUsingStoredStructureDefinitions();
|
||||
}
|
||||
|
||||
@@ -189,8 +187,11 @@ public class StarterJpaConfig {
|
||||
@Bean("packageInstaller")
|
||||
@Primary
|
||||
@Conditional(OnImplementationGuidesPresent.class)
|
||||
public IPackageInstallerSvc packageInstaller(AppProperties appProperties, JobDefinition<ReindexJobParameters> reindexJobParametersJobDefinition, JobDefinitionRegistry jobDefinitionRegistry, IPackageInstallerSvc packageInstallerSvc)
|
||||
{
|
||||
public IPackageInstallerSvc packageInstaller(
|
||||
AppProperties appProperties,
|
||||
JobDefinition<ReindexJobParameters> reindexJobParametersJobDefinition,
|
||||
JobDefinitionRegistry jobDefinitionRegistry,
|
||||
IPackageInstallerSvc packageInstallerSvc) {
|
||||
jobDefinitionRegistry.addJobDefinitionIfNotRegistered(reindexJobParametersJobDefinition);
|
||||
|
||||
if (appProperties.getImplementationGuides() != null) {
|
||||
@@ -199,10 +200,11 @@ public class StarterJpaConfig {
|
||||
PackageInstallationSpec packageInstallationSpec = guidesEntry.getValue();
|
||||
if (appProperties.getInstall_transitive_ig_dependencies()) {
|
||||
|
||||
packageInstallationSpec.addDependencyExclude("hl7.fhir.r2.core")
|
||||
.addDependencyExclude("hl7.fhir.r3.core")
|
||||
.addDependencyExclude("hl7.fhir.r4.core")
|
||||
.addDependencyExclude("hl7.fhir.r5.core");
|
||||
packageInstallationSpec
|
||||
.addDependencyExclude("hl7.fhir.r2.core")
|
||||
.addDependencyExclude("hl7.fhir.r3.core")
|
||||
.addDependencyExclude("hl7.fhir.r4.core")
|
||||
.addDependencyExclude("hl7.fhir.r5.core");
|
||||
}
|
||||
packageInstallerSvc.install(packageInstallationSpec);
|
||||
}
|
||||
@@ -238,11 +240,40 @@ public class StarterJpaConfig {
|
||||
|
||||
// Create the interceptor and register it
|
||||
return new CorsInterceptor(config);
|
||||
|
||||
}
|
||||
|
||||
@Bean
|
||||
public RestfulServer restfulServer(IFhirSystemDao<?, ?> fhirSystemDao, AppProperties appProperties, DaoRegistry daoRegistry, Optional<MdmProviderLoader> mdmProviderProvider, IJpaSystemProvider jpaSystemProvider, ResourceProviderFactory resourceProviderFactory, JpaStorageSettings jpaStorageSettings, ISearchParamRegistry searchParamRegistry, IValidationSupport theValidationSupport, DatabaseBackedPagingProvider databaseBackedPagingProvider, LoggingInterceptor loggingInterceptor, Optional<TerminologyUploaderProvider> terminologyUploaderProvider, Optional<SubscriptionTriggeringProvider> subscriptionTriggeringProvider, Optional<CorsInterceptor> corsInterceptor, IInterceptorBroadcaster interceptorBroadcaster, Optional<BinaryAccessProvider> binaryAccessProvider, BinaryStorageInterceptor binaryStorageInterceptor, IValidatorModule validatorModule, Optional<GraphQLProvider> graphQLProvider, BulkDataExportProvider bulkDataExportProvider, BulkDataImportProvider bulkDataImportProvider, ValueSetOperationProvider theValueSetOperationProvider, ReindexProvider reindexProvider, PartitionManagementProvider partitionManagementProvider, Optional<RepositoryValidatingInterceptor> repositoryValidatingInterceptor, IPackageInstallerSvc packageInstallerSvc, ThreadSafeResourceDeleterSvc theThreadSafeResourceDeleterSvc, ApplicationContext appContext, Optional<IpsOperationProvider> theIpsOperationProvider, Optional<IImplementationGuideOperationProvider> implementationGuideOperationProvider) {
|
||||
public RestfulServer restfulServer(
|
||||
IFhirSystemDao<?, ?> fhirSystemDao,
|
||||
AppProperties appProperties,
|
||||
DaoRegistry daoRegistry,
|
||||
Optional<MdmProviderLoader> mdmProviderProvider,
|
||||
IJpaSystemProvider jpaSystemProvider,
|
||||
ResourceProviderFactory resourceProviderFactory,
|
||||
JpaStorageSettings jpaStorageSettings,
|
||||
ISearchParamRegistry searchParamRegistry,
|
||||
IValidationSupport theValidationSupport,
|
||||
DatabaseBackedPagingProvider databaseBackedPagingProvider,
|
||||
LoggingInterceptor loggingInterceptor,
|
||||
Optional<TerminologyUploaderProvider> terminologyUploaderProvider,
|
||||
Optional<SubscriptionTriggeringProvider> subscriptionTriggeringProvider,
|
||||
Optional<CorsInterceptor> corsInterceptor,
|
||||
IInterceptorBroadcaster interceptorBroadcaster,
|
||||
Optional<BinaryAccessProvider> binaryAccessProvider,
|
||||
BinaryStorageInterceptor binaryStorageInterceptor,
|
||||
IValidatorModule validatorModule,
|
||||
Optional<GraphQLProvider> graphQLProvider,
|
||||
BulkDataExportProvider bulkDataExportProvider,
|
||||
BulkDataImportProvider bulkDataImportProvider,
|
||||
ValueSetOperationProvider theValueSetOperationProvider,
|
||||
ReindexProvider reindexProvider,
|
||||
PartitionManagementProvider partitionManagementProvider,
|
||||
Optional<RepositoryValidatingInterceptor> repositoryValidatingInterceptor,
|
||||
IPackageInstallerSvc packageInstallerSvc,
|
||||
ThreadSafeResourceDeleterSvc theThreadSafeResourceDeleterSvc,
|
||||
ApplicationContext appContext,
|
||||
Optional<IpsOperationProvider> theIpsOperationProvider,
|
||||
Optional<IImplementationGuideOperationProvider> implementationGuideOperationProvider) {
|
||||
RestfulServer fhirServer = new RestfulServer(fhirSystemDao.getContext());
|
||||
|
||||
List<String> supportedResourceTypes = appProperties.getSupported_resource_types();
|
||||
@@ -264,7 +295,8 @@ public class StarterJpaConfig {
|
||||
|
||||
fhirServer.registerProviders(resourceProviderFactory.createProviders());
|
||||
fhirServer.registerProvider(jpaSystemProvider);
|
||||
fhirServer.setServerConformanceProvider(calculateConformanceProvider(fhirSystemDao, fhirServer, jpaStorageSettings, searchParamRegistry, theValidationSupport));
|
||||
fhirServer.setServerConformanceProvider(calculateConformanceProvider(
|
||||
fhirSystemDao, fhirServer, jpaStorageSettings, searchParamRegistry, theValidationSupport));
|
||||
|
||||
/*
|
||||
* ETag Support
|
||||
@@ -272,7 +304,6 @@ public class StarterJpaConfig {
|
||||
|
||||
if (!appProperties.getEtag_support_enabled()) fhirServer.setETagSupport(ETagSupportEnum.DISABLED);
|
||||
|
||||
|
||||
/*
|
||||
* Default to JSON and pretty printing
|
||||
*/
|
||||
@@ -318,7 +349,8 @@ public class StarterJpaConfig {
|
||||
fhirServer.setServerAddressStrategy(new HardcodedServerAddressStrategy(serverAddress));
|
||||
} else if (appProperties.getUse_apache_address_strategy()) {
|
||||
boolean useHttps = appProperties.getUse_apache_address_strategy_https();
|
||||
fhirServer.setServerAddressStrategy(useHttps ? ApacheProxyAddressStrategy.forHttps() : ApacheProxyAddressStrategy.forHttp());
|
||||
fhirServer.setServerAddressStrategy(
|
||||
useHttps ? ApacheProxyAddressStrategy.forHttps() : ApacheProxyAddressStrategy.forHttp());
|
||||
} else {
|
||||
fhirServer.setServerAddressStrategy(new IncomingRequestAddressStrategy());
|
||||
}
|
||||
@@ -330,7 +362,11 @@ public class StarterJpaConfig {
|
||||
* so it is a potential security vulnerability. Consider using an AuthorizationInterceptor
|
||||
* with this feature.
|
||||
*/
|
||||
if (fhirSystemDao.getContext().getVersion().getVersion().isEqualOrNewerThan(FhirVersionEnum.DSTU3)) { // <-- ENABLED RIGHT NOW
|
||||
if (fhirSystemDao
|
||||
.getContext()
|
||||
.getVersion()
|
||||
.getVersion()
|
||||
.isEqualOrNewerThan(FhirVersionEnum.DSTU3)) { // <-- ENABLED RIGHT NOW
|
||||
fhirServer.registerProvider(terminologyUploaderProvider.get());
|
||||
}
|
||||
|
||||
@@ -348,7 +384,8 @@ public class StarterJpaConfig {
|
||||
}
|
||||
|
||||
if (appProperties.getAllow_cascading_deletes()) {
|
||||
CascadingDeleteInterceptor cascadingDeleteInterceptor = new CascadingDeleteInterceptor(fhirSystemDao.getContext(), daoRegistry, interceptorBroadcaster, theThreadSafeResourceDeleterSvc);
|
||||
CascadingDeleteInterceptor cascadingDeleteInterceptor = new CascadingDeleteInterceptor(
|
||||
fhirSystemDao.getContext(), daoRegistry, interceptorBroadcaster, theThreadSafeResourceDeleterSvc);
|
||||
fhirServer.registerInterceptor(cascadingDeleteInterceptor);
|
||||
}
|
||||
|
||||
@@ -391,16 +428,15 @@ public class StarterJpaConfig {
|
||||
fhirServer.registerProvider(bulkDataExportProvider);
|
||||
}
|
||||
|
||||
//Bulk Import
|
||||
// Bulk Import
|
||||
if (appProperties.getBulk_import_enabled()) {
|
||||
fhirServer.registerProvider(bulkDataImportProvider);
|
||||
}
|
||||
|
||||
|
||||
// valueSet Operations i.e $expand
|
||||
fhirServer.registerProvider(theValueSetOperationProvider);
|
||||
|
||||
//reindex Provider $reindex
|
||||
// reindex Provider $reindex
|
||||
fhirServer.registerProvider(reindexProvider);
|
||||
|
||||
// Partitioning
|
||||
@@ -414,8 +450,7 @@ public class StarterJpaConfig {
|
||||
// register custom interceptors
|
||||
registerCustomInterceptors(fhirServer, appContext, appProperties.getCustomInterceptorClasses());
|
||||
|
||||
|
||||
//register the IPS Provider
|
||||
// register the IPS Provider
|
||||
if (!theIpsOperationProvider.isEmpty()) {
|
||||
fhirServer.registerProvider(theIpsOperationProvider.get());
|
||||
}
|
||||
@@ -426,8 +461,9 @@ public class StarterJpaConfig {
|
||||
/**
|
||||
* check the properties for custom interceptor classes and registers them.
|
||||
*/
|
||||
@SuppressWarnings({ "unchecked", "rawtypes" })
|
||||
private void registerCustomInterceptors(RestfulServer fhirServer, ApplicationContext theAppContext, List<String> customInterceptorClasses) {
|
||||
@SuppressWarnings({"unchecked", "rawtypes"})
|
||||
private void registerCustomInterceptors(
|
||||
RestfulServer fhirServer, ApplicationContext theAppContext, List<String> customInterceptorClasses) {
|
||||
|
||||
if (customInterceptorClasses == null) {
|
||||
return;
|
||||
@@ -461,30 +497,40 @@ public class StarterJpaConfig {
|
||||
}
|
||||
}
|
||||
|
||||
public static IServerConformanceProvider<?> calculateConformanceProvider(IFhirSystemDao fhirSystemDao, RestfulServer fhirServer, JpaStorageSettings jpaStorageSettings, ISearchParamRegistry searchParamRegistry, IValidationSupport theValidationSupport) {
|
||||
public static IServerConformanceProvider<?> calculateConformanceProvider(
|
||||
IFhirSystemDao fhirSystemDao,
|
||||
RestfulServer fhirServer,
|
||||
JpaStorageSettings jpaStorageSettings,
|
||||
ISearchParamRegistry searchParamRegistry,
|
||||
IValidationSupport theValidationSupport) {
|
||||
FhirVersionEnum fhirVersion = fhirSystemDao.getContext().getVersion().getVersion();
|
||||
if (fhirVersion == FhirVersionEnum.DSTU2) {
|
||||
JpaConformanceProviderDstu2 confProvider = new JpaConformanceProviderDstu2(fhirServer, fhirSystemDao, jpaStorageSettings);
|
||||
JpaConformanceProviderDstu2 confProvider =
|
||||
new JpaConformanceProviderDstu2(fhirServer, fhirSystemDao, jpaStorageSettings);
|
||||
confProvider.setImplementationDescription("HAPI FHIR DSTU2 Server");
|
||||
return confProvider;
|
||||
} else if (fhirVersion == FhirVersionEnum.DSTU3) {
|
||||
|
||||
JpaConformanceProviderDstu3 confProvider = new JpaConformanceProviderDstu3(fhirServer, fhirSystemDao, jpaStorageSettings, searchParamRegistry);
|
||||
JpaConformanceProviderDstu3 confProvider =
|
||||
new JpaConformanceProviderDstu3(fhirServer, fhirSystemDao, jpaStorageSettings, searchParamRegistry);
|
||||
confProvider.setImplementationDescription("HAPI FHIR DSTU3 Server");
|
||||
return confProvider;
|
||||
} else if (fhirVersion == FhirVersionEnum.R4) {
|
||||
|
||||
JpaCapabilityStatementProvider confProvider = new JpaCapabilityStatementProvider(fhirServer, fhirSystemDao, jpaStorageSettings, searchParamRegistry, theValidationSupport);
|
||||
JpaCapabilityStatementProvider confProvider = new JpaCapabilityStatementProvider(
|
||||
fhirServer, fhirSystemDao, jpaStorageSettings, searchParamRegistry, theValidationSupport);
|
||||
confProvider.setImplementationDescription("HAPI FHIR R4 Server");
|
||||
return confProvider;
|
||||
} else if (fhirVersion == FhirVersionEnum.R4B) {
|
||||
|
||||
JpaCapabilityStatementProvider confProvider = new JpaCapabilityStatementProvider(fhirServer, fhirSystemDao, jpaStorageSettings, searchParamRegistry, theValidationSupport);
|
||||
JpaCapabilityStatementProvider confProvider = new JpaCapabilityStatementProvider(
|
||||
fhirServer, fhirSystemDao, jpaStorageSettings, searchParamRegistry, theValidationSupport);
|
||||
confProvider.setImplementationDescription("HAPI FHIR R4B Server");
|
||||
return confProvider;
|
||||
} else if (fhirVersion == FhirVersionEnum.R5) {
|
||||
|
||||
JpaCapabilityStatementProvider confProvider = new JpaCapabilityStatementProvider(fhirServer, fhirSystemDao, jpaStorageSettings, searchParamRegistry, theValidationSupport);
|
||||
JpaCapabilityStatementProvider confProvider = new JpaCapabilityStatementProvider(
|
||||
fhirServer, fhirSystemDao, jpaStorageSettings, searchParamRegistry, theValidationSupport);
|
||||
confProvider.setImplementationDescription("HAPI FHIR R5 Server");
|
||||
return confProvider;
|
||||
} else {
|
||||
|
||||
@@ -5,6 +5,7 @@ import ca.uhn.fhir.jpa.interceptor.validation.RepositoryValidatingInterceptor;
|
||||
public interface IRepositoryValidationInterceptorFactory {
|
||||
|
||||
String ENABLE_REPOSITORY_VALIDATING_INTERCEPTOR = "enable_repository_validating_interceptor";
|
||||
|
||||
RepositoryValidatingInterceptor buildUsingStoredStructureDefinitions();
|
||||
|
||||
RepositoryValidatingInterceptor build();
|
||||
|
||||
@@ -37,24 +37,28 @@ public class RepositoryValidationInterceptorFactoryDstu3 implements IRepositoryV
|
||||
private final RepositoryValidatingRuleBuilder repositoryValidatingRuleBuilder;
|
||||
private final IFhirResourceDao structureDefinitionResourceProvider;
|
||||
|
||||
public RepositoryValidationInterceptorFactoryDstu3(RepositoryValidatingRuleBuilder repositoryValidatingRuleBuilder, DaoRegistry daoRegistry) {
|
||||
public RepositoryValidationInterceptorFactoryDstu3(
|
||||
RepositoryValidatingRuleBuilder repositoryValidatingRuleBuilder, DaoRegistry daoRegistry) {
|
||||
this.repositoryValidatingRuleBuilder = repositoryValidatingRuleBuilder;
|
||||
this.fhirContext = daoRegistry.getSystemDao().getContext();
|
||||
structureDefinitionResourceProvider = daoRegistry.getResourceDao("StructureDefinition");
|
||||
|
||||
}
|
||||
|
||||
public RepositoryValidatingInterceptor buildUsingStoredStructureDefinitions() {
|
||||
|
||||
IBundleProvider results = structureDefinitionResourceProvider.search(new SearchParameterMap().add(StructureDefinition.SP_KIND, new TokenParam("resource")));
|
||||
Map<String, List<StructureDefinition>> structureDefinitions = results.getResources(0, results.size())
|
||||
.stream()
|
||||
.map(StructureDefinition.class::cast)
|
||||
.collect(Collectors.groupingBy(StructureDefinition::getType));
|
||||
IBundleProvider results = structureDefinitionResourceProvider.search(
|
||||
new SearchParameterMap().add(StructureDefinition.SP_KIND, new TokenParam("resource")));
|
||||
Map<String, List<StructureDefinition>> structureDefinitions = results.getResources(0, results.size()).stream()
|
||||
.map(StructureDefinition.class::cast)
|
||||
.collect(Collectors.groupingBy(StructureDefinition::getType));
|
||||
|
||||
structureDefinitions.forEach((key, value) -> {
|
||||
String[] urls = value.stream().map(StructureDefinition::getUrl).toArray(String[]::new);
|
||||
repositoryValidatingRuleBuilder.forResourcesOfType(key).requireAtLeastOneProfileOf(urls).and().requireValidationToDeclaredProfiles();
|
||||
repositoryValidatingRuleBuilder
|
||||
.forResourcesOfType(key)
|
||||
.requireAtLeastOneProfileOf(urls)
|
||||
.and()
|
||||
.requireValidationToDeclaredProfiles();
|
||||
});
|
||||
|
||||
List<IRepositoryValidatingRule> rules = repositoryValidatingRuleBuilder.build();
|
||||
@@ -65,11 +69,14 @@ public class RepositoryValidationInterceptorFactoryDstu3 implements IRepositoryV
|
||||
|
||||
// Customize the ruleBuilder here to have the rules you want! We will give a simple example
|
||||
// of enabling validation for all Patient resources
|
||||
repositoryValidatingRuleBuilder.forResourcesOfType("Patient").requireAtLeastProfile("http://hl7.org/fhir/us/core/StructureDefinition/us-core-patient").and().requireValidationToDeclaredProfiles();
|
||||
repositoryValidatingRuleBuilder
|
||||
.forResourcesOfType("Patient")
|
||||
.requireAtLeastProfile("http://hl7.org/fhir/us/core/StructureDefinition/us-core-patient")
|
||||
.and()
|
||||
.requireValidationToDeclaredProfiles();
|
||||
|
||||
// Do not customize below this line
|
||||
List<IRepositoryValidatingRule> rules = repositoryValidatingRuleBuilder.build();
|
||||
return new RepositoryValidatingInterceptor(fhirContext, rules);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -37,25 +37,29 @@ public class RepositoryValidationInterceptorFactoryR4 implements IRepositoryVali
|
||||
private final RepositoryValidatingRuleBuilder repositoryValidatingRuleBuilder;
|
||||
private final IFhirResourceDao structureDefinitionResourceProvider;
|
||||
|
||||
public RepositoryValidationInterceptorFactoryR4(RepositoryValidatingRuleBuilder repositoryValidatingRuleBuilder, DaoRegistry daoRegistry) {
|
||||
public RepositoryValidationInterceptorFactoryR4(
|
||||
RepositoryValidatingRuleBuilder repositoryValidatingRuleBuilder, DaoRegistry daoRegistry) {
|
||||
this.repositoryValidatingRuleBuilder = repositoryValidatingRuleBuilder;
|
||||
this.fhirContext = daoRegistry.getSystemDao().getContext();
|
||||
structureDefinitionResourceProvider = daoRegistry.getResourceDao("StructureDefinition");
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public RepositoryValidatingInterceptor buildUsingStoredStructureDefinitions() {
|
||||
|
||||
IBundleProvider results = structureDefinitionResourceProvider.search(new SearchParameterMap().add(StructureDefinition.SP_KIND, new TokenParam("resource")));
|
||||
Map<String, List<StructureDefinition>> structureDefintions = results.getResources(0, results.size())
|
||||
.stream()
|
||||
.map(StructureDefinition.class::cast)
|
||||
.collect(Collectors.groupingBy(StructureDefinition::getType));
|
||||
IBundleProvider results = structureDefinitionResourceProvider.search(
|
||||
new SearchParameterMap().add(StructureDefinition.SP_KIND, new TokenParam("resource")));
|
||||
Map<String, List<StructureDefinition>> structureDefintions = results.getResources(0, results.size()).stream()
|
||||
.map(StructureDefinition.class::cast)
|
||||
.collect(Collectors.groupingBy(StructureDefinition::getType));
|
||||
|
||||
structureDefintions.forEach((key, value) -> {
|
||||
String[] urls = value.stream().map(StructureDefinition::getUrl).toArray(String[]::new);
|
||||
repositoryValidatingRuleBuilder.forResourcesOfType(key).requireAtLeastOneProfileOf(urls).and().requireValidationToDeclaredProfiles();
|
||||
repositoryValidatingRuleBuilder
|
||||
.forResourcesOfType(key)
|
||||
.requireAtLeastOneProfileOf(urls)
|
||||
.and()
|
||||
.requireValidationToDeclaredProfiles();
|
||||
});
|
||||
|
||||
List<IRepositoryValidatingRule> rules = repositoryValidatingRuleBuilder.build();
|
||||
@@ -67,11 +71,14 @@ public class RepositoryValidationInterceptorFactoryR4 implements IRepositoryVali
|
||||
|
||||
// Customize the ruleBuilder here to have the rules you want! We will give a simple example
|
||||
// of enabling validation for all Patient resources
|
||||
repositoryValidatingRuleBuilder.forResourcesOfType("Patient").requireAtLeastProfile("http://hl7.org/fhir/us/core/StructureDefinition/us-core-patient").and().requireValidationToDeclaredProfiles();
|
||||
repositoryValidatingRuleBuilder
|
||||
.forResourcesOfType("Patient")
|
||||
.requireAtLeastProfile("http://hl7.org/fhir/us/core/StructureDefinition/us-core-patient")
|
||||
.and()
|
||||
.requireValidationToDeclaredProfiles();
|
||||
|
||||
// Do not customize below this line
|
||||
List<IRepositoryValidatingRule> rules = repositoryValidatingRuleBuilder.build();
|
||||
return new RepositoryValidatingInterceptor(fhirContext, rules);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -37,25 +37,29 @@ public class RepositoryValidationInterceptorFactoryR4B implements IRepositoryVal
|
||||
private final RepositoryValidatingRuleBuilder repositoryValidatingRuleBuilder;
|
||||
private final IFhirResourceDao structureDefinitionResourceProvider;
|
||||
|
||||
public RepositoryValidationInterceptorFactoryR4B(RepositoryValidatingRuleBuilder repositoryValidatingRuleBuilder, DaoRegistry daoRegistry) {
|
||||
public RepositoryValidationInterceptorFactoryR4B(
|
||||
RepositoryValidatingRuleBuilder repositoryValidatingRuleBuilder, DaoRegistry daoRegistry) {
|
||||
this.repositoryValidatingRuleBuilder = repositoryValidatingRuleBuilder;
|
||||
this.fhirContext = daoRegistry.getSystemDao().getContext();
|
||||
structureDefinitionResourceProvider = daoRegistry.getResourceDao("StructureDefinition");
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public RepositoryValidatingInterceptor buildUsingStoredStructureDefinitions() {
|
||||
|
||||
IBundleProvider results = structureDefinitionResourceProvider.search(new SearchParameterMap().add(StructureDefinition.SP_KIND, new TokenParam("resource")));
|
||||
Map<String, List<StructureDefinition>> structureDefintions = results.getResources(0, results.size())
|
||||
.stream()
|
||||
.map(StructureDefinition.class::cast)
|
||||
.collect(Collectors.groupingBy(StructureDefinition::getType));
|
||||
IBundleProvider results = structureDefinitionResourceProvider.search(
|
||||
new SearchParameterMap().add(StructureDefinition.SP_KIND, new TokenParam("resource")));
|
||||
Map<String, List<StructureDefinition>> structureDefintions = results.getResources(0, results.size()).stream()
|
||||
.map(StructureDefinition.class::cast)
|
||||
.collect(Collectors.groupingBy(StructureDefinition::getType));
|
||||
|
||||
structureDefintions.forEach((key, value) -> {
|
||||
String[] urls = value.stream().map(StructureDefinition::getUrl).toArray(String[]::new);
|
||||
repositoryValidatingRuleBuilder.forResourcesOfType(key).requireAtLeastOneProfileOf(urls).and().requireValidationToDeclaredProfiles();
|
||||
repositoryValidatingRuleBuilder
|
||||
.forResourcesOfType(key)
|
||||
.requireAtLeastOneProfileOf(urls)
|
||||
.and()
|
||||
.requireValidationToDeclaredProfiles();
|
||||
});
|
||||
|
||||
List<IRepositoryValidatingRule> rules = repositoryValidatingRuleBuilder.build();
|
||||
@@ -67,11 +71,14 @@ public class RepositoryValidationInterceptorFactoryR4B implements IRepositoryVal
|
||||
|
||||
// Customize the ruleBuilder here to have the rules you want! We will give a simple example
|
||||
// of enabling validation for all Patient resources
|
||||
repositoryValidatingRuleBuilder.forResourcesOfType("Patient").requireAtLeastProfile("http://hl7.org/fhir/us/core/StructureDefinition/us-core-patient").and().requireValidationToDeclaredProfiles();
|
||||
repositoryValidatingRuleBuilder
|
||||
.forResourcesOfType("Patient")
|
||||
.requireAtLeastProfile("http://hl7.org/fhir/us/core/StructureDefinition/us-core-patient")
|
||||
.and()
|
||||
.requireValidationToDeclaredProfiles();
|
||||
|
||||
// Do not customize below this line
|
||||
List<IRepositoryValidatingRule> rules = repositoryValidatingRuleBuilder.build();
|
||||
return new RepositoryValidatingInterceptor(fhirContext, rules);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -37,24 +37,28 @@ public class RepositoryValidationInterceptorFactoryR5 implements IRepositoryVali
|
||||
private final RepositoryValidatingRuleBuilder repositoryValidatingRuleBuilder;
|
||||
private final IFhirResourceDao structureDefinitionResourceProvider;
|
||||
|
||||
public RepositoryValidationInterceptorFactoryR5(RepositoryValidatingRuleBuilder repositoryValidatingRuleBuilder, DaoRegistry daoRegistry) {
|
||||
public RepositoryValidationInterceptorFactoryR5(
|
||||
RepositoryValidatingRuleBuilder repositoryValidatingRuleBuilder, DaoRegistry daoRegistry) {
|
||||
this.repositoryValidatingRuleBuilder = repositoryValidatingRuleBuilder;
|
||||
this.fhirContext = daoRegistry.getSystemDao().getContext();
|
||||
structureDefinitionResourceProvider = daoRegistry.getResourceDao("StructureDefinition");
|
||||
|
||||
}
|
||||
|
||||
public RepositoryValidatingInterceptor buildUsingStoredStructureDefinitions() {
|
||||
|
||||
IBundleProvider results = structureDefinitionResourceProvider.search(new SearchParameterMap().add(StructureDefinition.SP_KIND, new TokenParam("resource")));
|
||||
Map<String, List<StructureDefinition>> structureDefintions = results.getResources(0, results.size())
|
||||
.stream()
|
||||
.map(StructureDefinition.class::cast)
|
||||
.collect(Collectors.groupingBy(StructureDefinition::getType));
|
||||
IBundleProvider results = structureDefinitionResourceProvider.search(
|
||||
new SearchParameterMap().add(StructureDefinition.SP_KIND, new TokenParam("resource")));
|
||||
Map<String, List<StructureDefinition>> structureDefintions = results.getResources(0, results.size()).stream()
|
||||
.map(StructureDefinition.class::cast)
|
||||
.collect(Collectors.groupingBy(StructureDefinition::getType));
|
||||
|
||||
structureDefintions.forEach((key, value) -> {
|
||||
String[] urls = value.stream().map(StructureDefinition::getUrl).toArray(String[]::new);
|
||||
repositoryValidatingRuleBuilder.forResourcesOfType(key).requireAtLeastOneProfileOf(urls).and().requireValidationToDeclaredProfiles();
|
||||
repositoryValidatingRuleBuilder
|
||||
.forResourcesOfType(key)
|
||||
.requireAtLeastOneProfileOf(urls)
|
||||
.and()
|
||||
.requireValidationToDeclaredProfiles();
|
||||
});
|
||||
|
||||
List<IRepositoryValidatingRule> rules = repositoryValidatingRuleBuilder.build();
|
||||
@@ -65,11 +69,14 @@ public class RepositoryValidationInterceptorFactoryR5 implements IRepositoryVali
|
||||
|
||||
// Customize the ruleBuilder here to have the rules you want! We will give a simple example
|
||||
// of enabling validation for all Patient resources
|
||||
repositoryValidatingRuleBuilder.forResourcesOfType("Patient").requireAtLeastProfile("http://hl7.org/fhir/us/core/StructureDefinition/us-core-patient").and().requireValidationToDeclaredProfiles();
|
||||
repositoryValidatingRuleBuilder
|
||||
.forResourcesOfType("Patient")
|
||||
.requireAtLeastProfile("http://hl7.org/fhir/us/core/StructureDefinition/us-core-patient")
|
||||
.and()
|
||||
.requireValidationToDeclaredProfiles();
|
||||
|
||||
// Do not customize below this line
|
||||
List<IRepositoryValidatingRule> rules = repositoryValidatingRuleBuilder.build();
|
||||
return new RepositoryValidatingInterceptor(fhirContext, rules);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user