Merge branch 'master' into rel_5_7

This commit is contained in:
Tadgh
2022-02-17 17:52:36 -08:00
17 changed files with 214 additions and 128 deletions

View File

@@ -11,10 +11,7 @@ import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.context.annotation.Configuration;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.Objects;
import java.util.*;
@ConfigurationProperties(prefix = "hapi.fhir")
@Configuration
@@ -24,6 +21,7 @@ public class AppProperties {
private Boolean cql_enabled = false;
private Boolean openapi_enabled = false;
private Boolean mdm_enabled = false;
private boolean advanced_lucene_indexing = false;
private Boolean allow_cascading_deletes = false;
private Boolean allow_contains_searches = true;
private Boolean allow_external_references = false;
@@ -68,6 +66,7 @@ public class AppProperties {
private Map<String, ImplementationGuide> implementationGuides = null;
private Boolean lastn_enabled = false;
private boolean store_resource_in_lucene_index_enabled = false;
private NormalizedQuantitySearchLevel normalized_quantity_search_level = NormalizedQuantitySearchLevel.NORMALIZED_QUANTITY_SEARCH_NOT_SUPPORTED;
private Integer search_coord_core_pool_size = 20;
@@ -76,6 +75,10 @@ public class AppProperties {
private Boolean use_apache_address_strategy = false;
private Boolean use_apache_address_strategy_https = false;
private Integer bundle_batch_pool_size = 20;
private Integer bundle_batch_pool_max_size = 100;
private List<String> local_base_urls = new ArrayList<>();
public Boolean getOpenapi_enabled() {
return openapi_enabled;
}
@@ -196,7 +199,11 @@ public class AppProperties {
this.supported_resource_types = supported_resource_types;
}
public Logger getLogger() {
public List<String> getSupported_resource_types(List<String> supported_resource_types) {
return this.supported_resource_types;
}
public Logger getLogger() {
return logger;
}
@@ -213,7 +220,15 @@ public class AppProperties {
this.client_id_strategy = client_id_strategy;
}
public Boolean getAllow_cascading_deletes() {
public boolean getAdvanced_lucene_indexing() {
return this.advanced_lucene_indexing;
}
public void setAdvanced_lucene_indexing(boolean theAdvanced_lucene_indexing) {
advanced_lucene_indexing = theAdvanced_lucene_indexing;
}
public Boolean getAllow_cascading_deletes() {
return allow_cascading_deletes;
}
@@ -455,7 +470,15 @@ public class AppProperties {
this.lastn_enabled = lastn_enabled;
}
public NormalizedQuantitySearchLevel getNormalized_quantity_search_level() {
public boolean getStore_resource_in_lucene_index_enabled() {
return store_resource_in_lucene_index_enabled;
}
public void setStore_resource_in_lucene_index_enabled(Boolean store_resource_in_lucene_index_enabled) {
this.store_resource_in_lucene_index_enabled = store_resource_in_lucene_index_enabled;
}
public NormalizedQuantitySearchLevel getNormalized_quantity_search_level() {
return this.normalized_quantity_search_level;
}
@@ -489,6 +512,26 @@ public class AppProperties {
this.install_transitive_ig_dependencies = install_transitive_ig_dependencies;
}
public Integer getBundle_batch_pool_size() {
return this.bundle_batch_pool_size;
}
public void setBundle_batch_pool_size(Integer bundle_batch_pool_size) {
this.bundle_batch_pool_size = bundle_batch_pool_size;
}
public Integer getBundle_batch_pool_max_size() {
return bundle_batch_pool_max_size;
}
public void setBundle_batch_pool_max_size(Integer bundle_batch_pool_max_size) {
this.bundle_batch_pool_max_size = bundle_batch_pool_max_size;
}
public List<String> getLocal_base_urls() {
return local_base_urls;
}
public static class Cors {
private Boolean allow_Credentials = true;
private List<String> allowed_origin = ImmutableList.of("*");

View File

@@ -384,6 +384,9 @@ public class BaseJpaRestfulServer extends RestfulServer {
daoConfig.setResourceServerIdStrategy(DaoConfig.IdStrategyEnum.UUID);
daoConfig.setResourceClientIdStrategy(appProperties.getClient_id_strategy());
}
//Parallel Batch GET execution settings
daoConfig.setBundleBatchPoolSize(appProperties.getBundle_batch_pool_size());
daoConfig.setBundleBatchPoolSize(appProperties.getBundle_batch_pool_max_size());
if (appProperties.getImplementationGuides() != null) {
Map<String, AppProperties.ImplementationGuide> guides = appProperties.getImplementationGuides();
@@ -410,8 +413,8 @@ public class BaseJpaRestfulServer extends RestfulServer {
daoConfig.setLastNEnabled(true);
}
daoConfig.setStoreResourceInLuceneIndex(appProperties.getStore_resource_in_lucene_index_enabled());
daoConfig.getModelConfig().setNormalizedQuantitySearchLevel(appProperties.getNormalized_quantity_search_level());
daoConfig.getModelConfig().setIndexOnContainedResources(appProperties.getEnable_index_contained_resource());
daoConfig.getModelConfig().setIndexOnContainedResources(appProperties.getEnable_index_contained_resource());
}
}

View File

@@ -0,0 +1,33 @@
package ca.uhn.fhir.jpa.starter;
import ca.uhn.fhir.jpa.search.lastn.ElasticsearchSvcImpl;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.env.ConfigurableEnvironment;
/** Shared configuration for Elasticsearch */
@Configuration
public class ElasticsearchConfig {
private static final org.slf4j.Logger ourLog = org.slf4j.LoggerFactory.getLogger(ElasticsearchConfig.class);
@Autowired
private ConfigurableEnvironment configurableEnvironment;
@Bean()
public ElasticsearchSvcImpl elasticsearchSvc() {
if (EnvironmentHelper.isElasticsearchEnabled(configurableEnvironment)) {
String elasticsearchUrl = EnvironmentHelper.getElasticsearchServerUrl(configurableEnvironment);
if (elasticsearchUrl.startsWith("http")) {
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);
} else {
return null;
}
}
}

View File

@@ -14,6 +14,8 @@ import ca.uhn.fhir.rest.server.mail.IMailSvc;
import ca.uhn.fhir.rest.server.mail.MailConfig;
import ca.uhn.fhir.rest.server.mail.MailSvc;
import com.google.common.base.Strings;
import java.util.HashSet;
import java.util.Optional;
import org.hl7.fhir.dstu2.model.Subscription;
import org.springframework.boot.env.YamlPropertySourceLoader;
import org.springframework.context.annotation.Bean;
@@ -23,8 +25,6 @@ import org.springframework.context.annotation.Primary;
import org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean;
import org.springframework.transaction.annotation.EnableTransactionManagement;
import java.util.Optional;
/**
* This is the primary configuration file for the example server
*/
@@ -65,7 +65,7 @@ public class FhirServerConfigCommon {
if (appProperties.getSubscription().getEmail() != null) {
ourLog.info("Email subscriptions enabled");
}
if (appProperties.getEnable_index_contained_resource() == Boolean.TRUE) {
ourLog.info("Indexed on contained resource enabled");
}
@@ -119,6 +119,8 @@ public class FhirServerConfigCommon {
}
retVal.setFilterParameterEnabled(appProperties.getFilter_search_enabled());
retVal.setAdvancedLuceneIndexing(appProperties.getAdvanced_lucene_indexing());
retVal.setTreatBaseUrlsAsLocal(new HashSet<>(appProperties.getLocal_base_urls()));
return retVal;
}
@@ -139,7 +141,7 @@ public class FhirServerConfigCommon {
if(appProperties.getPartitioning().getAllow_references_across_partitions()) {
retVal.setAllowReferencesAcrossPartitions(CrossPartitionReferenceMode.ALLOWED_UNQUALIFIED);
} else {
retVal.setAllowReferencesAcrossPartitions(CrossPartitionReferenceMode.NOT_ALLOWED);
retVal.setAllowReferencesAcrossPartitions(CrossPartitionReferenceMode.NOT_ALLOWED);
}
}
@@ -154,8 +156,8 @@ public class FhirServerConfigCommon {
}
@Bean
public ModelConfig modelConfig(AppProperties appProperties) {
ModelConfig modelConfig = new ModelConfig();
public ModelConfig modelConfig(AppProperties appProperties, DaoConfig daoConfig) {
ModelConfig modelConfig = daoConfig.getModelConfig();
modelConfig.setAllowContainsSearches(appProperties.getAllow_contains_searches());
modelConfig.setAllowExternalReferences(appProperties.getAllow_external_references());
modelConfig.setDefaultSearchParamsCanBeOverridden(appProperties.getAllow_override_default_search_params());
@@ -172,7 +174,7 @@ public class FhirServerConfigCommon {
}
modelConfig.setNormalizedQuantitySearchLevel(appProperties.getNormalized_quantity_search_level());
modelConfig.setIndexOnContainedResources(appProperties.getEnable_index_contained_resource());
return modelConfig;
}
@@ -222,7 +224,7 @@ public class FhirServerConfigCommon {
IMailSvc mailSvc = new MailSvc(mailConfig);
IEmailSender emailSender = new EmailSenderImpl(mailSvc);
subscriptionDeliveryHandlerFactory.get().setEmailSender(emailSender);
subscriptionDeliveryHandlerFactory.ifPresent(theSubscriptionDeliveryHandlerFactory -> theSubscriptionDeliveryHandlerFactory.setEmailSender(emailSender));
return emailSender;
}

View File

@@ -2,9 +2,7 @@ package ca.uhn.fhir.jpa.starter;
import ca.uhn.fhir.context.ConfigurationException;
import ca.uhn.fhir.jpa.config.BaseJavaConfigDstu3;
import ca.uhn.fhir.jpa.model.config.PartitionSettings;
import ca.uhn.fhir.jpa.search.DatabaseBackedPagingProvider;
import ca.uhn.fhir.jpa.search.lastn.ElasticsearchSvcImpl;
import ca.uhn.fhir.jpa.starter.annotations.OnDSTU3Condition;
import ca.uhn.fhir.jpa.starter.cql.StarterCqlDstu3Config;
import javax.annotation.PostConstruct;
@@ -23,7 +21,7 @@ import org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean;
@Configuration
@Conditional(OnDSTU3Condition.class)
@Import(StarterCqlDstu3Config.class)
@Import({StarterCqlDstu3Config.class, ElasticsearchConfig.class})
public class FhirServerConfigDstu3 extends BaseJavaConfigDstu3 {
@Autowired
@@ -77,6 +75,7 @@ public class FhirServerConfigDstu3 extends BaseJavaConfigDstu3 {
retVal.setJpaProperties(EnvironmentHelper.getHibernateProperties(configurableEnvironment,
myConfigurableListableBeanFactory));
return retVal;
}
@@ -87,26 +86,4 @@ public class FhirServerConfigDstu3 extends BaseJavaConfigDstu3 {
retVal.setEntityManagerFactory(entityManagerFactory);
return retVal;
}
@Bean()
public ElasticsearchSvcImpl elasticsearchSvc(PartitionSettings thePartitionSetings) {
if (Boolean.TRUE.equals(EnvironmentHelper.isElasticsearchEnabled(configurableEnvironment))) {
String elasticsearchUrl = EnvironmentHelper.getElasticsearchServerUrl(configurableEnvironment);
String elasticsearchHost = elasticsearchUrl;
String elasticsearchProtocol = EnvironmentHelper.getElasticsearchServerProtocol(configurableEnvironment);
if (elasticsearchUrl.startsWith("http")) {
elasticsearchProtocol = elasticsearchUrl.split("://")[0];
elasticsearchHost = elasticsearchUrl.split("://")[1];
}else {
elasticsearchProtocol = "http";
elasticsearchHost = elasticsearchUrl;
}
String elasticsearchUsername = EnvironmentHelper.getElasticsearchServerUsername(configurableEnvironment);
String elasticsearchPassword = EnvironmentHelper.getElasticsearchServerPassword(configurableEnvironment);
return new ElasticsearchSvcImpl(thePartitionSetings, elasticsearchProtocol, elasticsearchHost, elasticsearchUsername, elasticsearchPassword);
} else {
return null;
}
}
}

View File

@@ -2,25 +2,26 @@ package ca.uhn.fhir.jpa.starter;
import ca.uhn.fhir.context.ConfigurationException;
import ca.uhn.fhir.jpa.config.BaseJavaConfigR4;
import ca.uhn.fhir.jpa.model.config.PartitionSettings;
import ca.uhn.fhir.jpa.search.DatabaseBackedPagingProvider;
import ca.uhn.fhir.jpa.search.lastn.ElasticsearchSvcImpl;
import ca.uhn.fhir.jpa.starter.annotations.OnR4Condition;
import ca.uhn.fhir.jpa.starter.cql.StarterCqlR4Config;
import javax.annotation.PostConstruct;
import javax.persistence.EntityManagerFactory;
import javax.sql.DataSource;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.config.ConfigurableListableBeanFactory;
import org.springframework.context.annotation.*;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Conditional;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Import;
import org.springframework.context.annotation.Primary;
import org.springframework.core.env.ConfigurableEnvironment;
import org.springframework.orm.jpa.JpaTransactionManager;
import org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean;
import javax.annotation.PostConstruct;
import javax.persistence.EntityManagerFactory;
import javax.sql.DataSource;
@Configuration
@Conditional(OnR4Condition.class)
@Import(StarterCqlR4Config.class)
@Import({StarterCqlR4Config.class, ElasticsearchConfig.class})
public class FhirServerConfigR4 extends BaseJavaConfigR4 {
@Autowired
@@ -84,25 +85,4 @@ public class FhirServerConfigR4 extends BaseJavaConfigR4 {
return retVal;
}
@Bean()
public ElasticsearchSvcImpl elasticsearchSvc(PartitionSettings thePartitionSetings) {
if (Boolean.TRUE.equals(EnvironmentHelper.isElasticsearchEnabled(configurableEnvironment))) {
String elasticsearchUrl = EnvironmentHelper.getElasticsearchServerUrl(configurableEnvironment);
String elasticsearchHost = elasticsearchUrl;
String elasticsearchProtocol = EnvironmentHelper.getElasticsearchServerProtocol(configurableEnvironment);
if (elasticsearchUrl.startsWith("http")) {
elasticsearchProtocol = elasticsearchUrl.split("://")[0];
elasticsearchHost = elasticsearchUrl.split("://")[1];
}else {
elasticsearchProtocol = "http";
elasticsearchHost = elasticsearchUrl;
}
String elasticsearchUsername = EnvironmentHelper.getElasticsearchServerUsername(configurableEnvironment);
String elasticsearchPassword = EnvironmentHelper.getElasticsearchServerPassword(configurableEnvironment);
return new ElasticsearchSvcImpl(thePartitionSetings, elasticsearchProtocol, elasticsearchHost, elasticsearchUsername, elasticsearchPassword);
} else {
return null;
}
}
}

View File

@@ -2,26 +2,25 @@ package ca.uhn.fhir.jpa.starter;
import ca.uhn.fhir.context.ConfigurationException;
import ca.uhn.fhir.jpa.config.BaseJavaConfigR5;
import ca.uhn.fhir.jpa.model.config.PartitionSettings;
import ca.uhn.fhir.jpa.search.DatabaseBackedPagingProvider;
import ca.uhn.fhir.jpa.search.lastn.ElasticsearchSvcImpl;
import ca.uhn.fhir.jpa.starter.annotations.OnR5Condition;
import javax.annotation.PostConstruct;
import javax.persistence.EntityManagerFactory;
import javax.sql.DataSource;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.config.ConfigurableListableBeanFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Conditional;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Import;
import org.springframework.context.annotation.Primary;
import org.springframework.core.env.ConfigurableEnvironment;
import org.springframework.orm.jpa.JpaTransactionManager;
import org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean;
import javax.annotation.PostConstruct;
import javax.persistence.EntityManagerFactory;
import javax.sql.DataSource;
@Configuration
@Conditional(OnR5Condition.class)
@Import({ElasticsearchConfig.class})
public class FhirServerConfigR5 extends BaseJavaConfigR5 {
@Autowired
@@ -85,26 +84,4 @@ public class FhirServerConfigR5 extends BaseJavaConfigR5 {
return retVal;
}
@Bean()
public ElasticsearchSvcImpl elasticsearchSvc(PartitionSettings thePartitionSetings) {
if (Boolean.TRUE.equals(EnvironmentHelper.isElasticsearchEnabled(configurableEnvironment))) {
String elasticsearchUrl = EnvironmentHelper.getElasticsearchServerUrl(configurableEnvironment);
String elasticsearchHost;
String elasticsearchProtocol = EnvironmentHelper.getElasticsearchServerProtocol(configurableEnvironment);
if (elasticsearchUrl.startsWith("http")) {
elasticsearchProtocol = elasticsearchUrl.split("://")[0];
elasticsearchHost = elasticsearchUrl.split("://")[1];
} else {
elasticsearchProtocol = "http";
elasticsearchHost = elasticsearchUrl;
}
String elasticsearchUsername = EnvironmentHelper.getElasticsearchServerUsername(configurableEnvironment);
String elasticsearchPassword = EnvironmentHelper.getElasticsearchServerPassword(configurableEnvironment);
return new ElasticsearchSvcImpl(thePartitionSetings, elasticsearchProtocol, elasticsearchHost, elasticsearchUsername, elasticsearchPassword);
} else {
return null;
}
}
}