package ca.uhn.fhir.jpa.starter; import ca.uhn.fhir.context.ConfigurationException; import ca.uhn.fhir.jpa.config.BaseJavaConfigR4; 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 org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.config.ConfigurableListableBeanFactory; import org.springframework.context.annotation.*; 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) public class FhirServerConfigR4 extends BaseJavaConfigR4 { @Autowired private DataSource myDataSource; /** * We override the paging provider definition so that we can 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. */ @Autowired AppProperties appProperties; @PostConstruct public void initSettings() { if(appProperties.getSearch_coord_core_pool_size() != null) { setSearchCoordCorePoolSize(appProperties.getSearch_coord_core_pool_size()); } if(appProperties.getSearch_coord_max_pool_size() != null) { setSearchCoordMaxPoolSize(appProperties.getSearch_coord_max_pool_size()); } if(appProperties.getSearch_coord_queue_capacity() != null) { setSearchCoordQueueCapacity(appProperties.getSearch_coord_queue_capacity()); } } @Override public DatabaseBackedPagingProvider databaseBackedPagingProvider() { DatabaseBackedPagingProvider pagingProvider = super.databaseBackedPagingProvider(); pagingProvider.setDefaultPageSize(appProperties.getDefault_page_size()); pagingProvider.setMaximumPageSize(appProperties.getMax_page_size()); return pagingProvider; } @Autowired private ConfigurableEnvironment configurableEnvironment; @Override @Bean() public LocalContainerEntityManagerFactoryBean entityManagerFactory(ConfigurableListableBeanFactory theBeanFactory) { LocalContainerEntityManagerFactoryBean retVal = super.entityManagerFactory(theBeanFactory); retVal.setPersistenceUnitName("HAPI_PU"); try { retVal.setDataSource(myDataSource); } catch (Exception e) { throw new ConfigurationException("Could not set the data source due to a configuration issue", e); } retVal.setJpaProperties(EnvironmentHelper.getHibernateProperties(configurableEnvironment, theBeanFactory)); return retVal; } @Bean @Primary public JpaTransactionManager hapiTransactionManager(EntityManagerFactory entityManagerFactory) { JpaTransactionManager retVal = new JpaTransactionManager(); retVal.setEntityManagerFactory(entityManagerFactory); return retVal; } @Bean() public ElasticsearchSvcImpl elasticsearchSvc() { if (EnvironmentHelper.isElasticsearchEnabled(configurableEnvironment)) { String elasticsearchUrl = EnvironmentHelper.getElasticsearchServerUrl(configurableEnvironment); if (elasticsearchUrl.startsWith("http")) { elasticsearchUrl =elasticsearchUrl.substring(elasticsearchUrl.indexOf("://") + 3); } String elasticsearchUsername = EnvironmentHelper.getElasticsearchServerUsername(configurableEnvironment); String elasticsearchPassword = EnvironmentHelper.getElasticsearchServerPassword(configurableEnvironment); return new ElasticsearchSvcImpl(elasticsearchUrl, elasticsearchUsername, elasticsearchPassword); } else { return null; } } }