From af4a5f9d6bbbba00b064dd0f91609de823dc4b1a Mon Sep 17 00:00:00 2001 From: Jonathan Percival Date: Wed, 14 Jun 2023 10:38:14 -0600 Subject: [PATCH] Post init provider registerer --- .../ca/uhn/fhir/jpa/starter/Application.java | 94 ++--- .../common/FhirServerConfigCommon.java | 349 +++++++++--------- .../starter/cr/CrOperationProviderLoader.java | 5 +- .../cr/PostInitProviderRegisterer.java | 51 +++ .../jpa/starter/cr/StarterCrDstu3Config.java | 13 +- .../jpa/starter/cr/StarterCrR4Config.java | 14 +- 6 files changed, 308 insertions(+), 218 deletions(-) create mode 100644 src/main/java/ca/uhn/fhir/jpa/starter/cr/PostInitProviderRegisterer.java diff --git a/src/main/java/ca/uhn/fhir/jpa/starter/Application.java b/src/main/java/ca/uhn/fhir/jpa/starter/Application.java index e122d38..5a33baa 100644 --- a/src/main/java/ca/uhn/fhir/jpa/starter/Application.java +++ b/src/main/java/ca/uhn/fhir/jpa/starter/Application.java @@ -28,66 +28,66 @@ import org.springframework.context.annotation.Import; import org.springframework.web.context.support.AnnotationConfigWebApplicationContext; import org.springframework.web.servlet.DispatcherServlet; -@ServletComponentScan(basePackageClasses = {RestfulServer.class}) -@SpringBootApplication(exclude = {ElasticsearchRestClientAutoConfiguration.class, ThymeleafAutoConfiguration.class}) +@ServletComponentScan(basePackageClasses = { RestfulServer.class }) +@SpringBootApplication(exclude = { ElasticsearchRestClientAutoConfiguration.class, ThymeleafAutoConfiguration.class }) @Import({ - SubscriptionSubmitterConfig.class, - SubscriptionProcessorConfig.class, - SubscriptionChannelConfig.class, - WebsocketDispatcherConfig.class, - MdmConfig.class, - JpaBatch2Config.class, - Batch2JobsConfig.class, - StarterCrR4Config.class, - StarterCrDstu3Config.class + StarterCrR4Config.class, + StarterCrDstu3Config.class, + SubscriptionSubmitterConfig.class, + SubscriptionProcessorConfig.class, + SubscriptionChannelConfig.class, + WebsocketDispatcherConfig.class, + MdmConfig.class, + JpaBatch2Config.class, + Batch2JobsConfig.class }) public class Application extends SpringBootServletInitializer { - public static void main(String[] args) { + public static void main(String[] args) { - SpringApplication.run(Application.class, args); + SpringApplication.run(Application.class, args); - //Server is now accessible at eg. http://localhost:8080/fhir/metadata - //UI is now accessible at http://localhost:8080/ - } + // Server is now accessible at eg. http://localhost:8080/fhir/metadata + // UI is now accessible at http://localhost:8080/ + } - @Override - protected SpringApplicationBuilder configure( - SpringApplicationBuilder builder) { - return builder.sources(Application.class); - } + @Override + protected SpringApplicationBuilder configure( + SpringApplicationBuilder builder) { + return builder.sources(Application.class); + } - @Autowired - AutowireCapableBeanFactory beanFactory; + @Autowired + AutowireCapableBeanFactory beanFactory; - @Bean - @Conditional(OnEitherVersion.class) - public ServletRegistrationBean hapiServletRegistration(RestfulServer restfulServer) { - ServletRegistrationBean servletRegistrationBean = new ServletRegistrationBean(); - beanFactory.autowireBean(restfulServer); - servletRegistrationBean.setServlet(restfulServer); - servletRegistrationBean.addUrlMappings("/fhir/*"); - servletRegistrationBean.setLoadOnStartup(1); + @Bean + @Conditional(OnEitherVersion.class) + public ServletRegistrationBean hapiServletRegistration(RestfulServer restfulServer) { + ServletRegistrationBean servletRegistrationBean = new ServletRegistrationBean(); + beanFactory.autowireBean(restfulServer); + servletRegistrationBean.setServlet(restfulServer); + servletRegistrationBean.addUrlMappings("/fhir/*"); + servletRegistrationBean.setLoadOnStartup(1); - return servletRegistrationBean; - } + return servletRegistrationBean; + } - @Bean - public ServletRegistrationBean overlayRegistrationBean() { + @Bean + public ServletRegistrationBean overlayRegistrationBean() { - AnnotationConfigWebApplicationContext annotationConfigWebApplicationContext = new AnnotationConfigWebApplicationContext(); - annotationConfigWebApplicationContext.register(FhirTesterConfig.class); + AnnotationConfigWebApplicationContext annotationConfigWebApplicationContext = new AnnotationConfigWebApplicationContext(); + annotationConfigWebApplicationContext.register(FhirTesterConfig.class); - DispatcherServlet dispatcherServlet = new DispatcherServlet( - annotationConfigWebApplicationContext); - dispatcherServlet.setContextClass(AnnotationConfigWebApplicationContext.class); - dispatcherServlet.setContextConfigLocation(FhirTesterConfig.class.getName()); + DispatcherServlet dispatcherServlet = new DispatcherServlet( + annotationConfigWebApplicationContext); + dispatcherServlet.setContextClass(AnnotationConfigWebApplicationContext.class); + dispatcherServlet.setContextConfigLocation(FhirTesterConfig.class.getName()); - ServletRegistrationBean registrationBean = new ServletRegistrationBean(); - registrationBean.setServlet(dispatcherServlet); - registrationBean.addUrlMappings("/*"); - registrationBean.setLoadOnStartup(1); - return registrationBean; + ServletRegistrationBean registrationBean = new ServletRegistrationBean(); + registrationBean.setServlet(dispatcherServlet); + registrationBean.addUrlMappings("/*"); + registrationBean.setLoadOnStartup(1); + return registrationBean; - } + } } diff --git a/src/main/java/ca/uhn/fhir/jpa/starter/common/FhirServerConfigCommon.java b/src/main/java/ca/uhn/fhir/jpa/starter/common/FhirServerConfigCommon.java index ba78ccc..6352ba8 100644 --- a/src/main/java/ca/uhn/fhir/jpa/starter/common/FhirServerConfigCommon.java +++ b/src/main/java/ca/uhn/fhir/jpa/starter/common/FhirServerConfigCommon.java @@ -14,9 +14,11 @@ import ca.uhn.fhir.jpa.subscription.match.deliver.email.IEmailSender; 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 ca.uhn.fhir.rest.server.provider.ResourceProviderFactory; + import com.google.common.base.Strings; 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; @@ -36,206 +38,221 @@ import java.util.stream.Collectors; @EnableTransactionManagement public class FhirServerConfigCommon { - private static final org.slf4j.Logger ourLog = org.slf4j.LoggerFactory.getLogger(FhirServerConfigCommon.class); + 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"); - 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"); + 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()); + ourLog.info("Server will use '" + email.getFrom() + "' as the from email address"); - 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()); - ourLog.info("Server will use '" + email.getFrom() + "' as the from email address"); + if (!Strings.isNullOrEmpty(email.getUsername())) { + ourLog.info("Server is configured to use username '" + email.getUsername() + "' for email"); + } - if (!Strings.isNullOrEmpty(email.getUsername())) { - ourLog.info("Server is configured to use username '" + email.getUsername() + "' for email"); - } + if (!Strings.isNullOrEmpty(email.getPassword())) { + ourLog.info("Server is configured to use a password for email"); + } + } - if (!Strings.isNullOrEmpty(email.getPassword())) { - ourLog.info("Server is configured to use a password for email"); - } - } + if (appProperties.getSubscription().getResthook_enabled()) { + ourLog.info("REST-hook subscriptions enabled"); + } - if (appProperties.getSubscription().getResthook_enabled()) { - ourLog.info("REST-hook subscriptions enabled"); - } + if (appProperties.getSubscription().getEmail() != null) { + ourLog.info("Email subscriptions enabled"); + } - 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"); + } + } - if (appProperties.getEnable_index_contained_resource() == Boolean.TRUE) { - ourLog.info("Indexed on contained resource enabled"); - } - } + /** + * Configure FHIR properties around the the JPA server via this bean + */ + @Bean + public JpaStorageSettings jpaStorageSettings(AppProperties appProperties) { + JpaStorageSettings jpaStorageSettings = new JpaStorageSettings(); - /** - * Configure FHIR properties around the the JPA server via this bean - */ - @Bean - public JpaStorageSettings jpaStorageSettings(AppProperties appProperties) { - JpaStorageSettings jpaStorageSettings = new JpaStorageSettings(); + jpaStorageSettings.setIndexMissingFields( + appProperties.getEnable_index_missing_fields() ? JpaStorageSettings.IndexEnabledEnum.ENABLED + : JpaStorageSettings.IndexEnabledEnum.DISABLED); + jpaStorageSettings + .setAutoCreatePlaceholderReferenceTargets(appProperties.getAuto_create_placeholder_reference_targets()); + 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() ? JpaStorageSettings.IndexEnabledEnum.ENABLED : JpaStorageSettings.IndexEnabledEnum.DISABLED); - jpaStorageSettings.setAutoCreatePlaceholderReferenceTargets(appProperties.getAuto_create_placeholder_reference_targets()); - 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); + ourLog.info("Server configured to have a maximum fetch size of " + + (maxFetchSize == Integer.MAX_VALUE ? "'unlimited'" : maxFetchSize)); - Integer maxFetchSize = appProperties.getMax_page_size(); - jpaStorageSettings.setFetchSizeDefaultMaximum(maxFetchSize); - ourLog.info("Server configured to have a maximum fetch size of " + (maxFetchSize == Integer.MAX_VALUE ? "'unlimited'" : maxFetchSize)); + Long reuseCachedSearchResultsMillis = appProperties.getReuse_cached_search_results_millis(); + jpaStorageSettings.setReuseCachedSearchResultsForMillis(reuseCachedSearchResultsMillis); + ourLog.info("Server configured to cache search results for {} milliseconds", reuseCachedSearchResultsMillis); - Long reuseCachedSearchResultsMillis = appProperties.getReuse_cached_search_results_millis(); - jpaStorageSettings.setReuseCachedSearchResultsForMillis(reuseCachedSearchResultsMillis); - ourLog.info("Server configured to cache search results for {} milliseconds", reuseCachedSearchResultsMillis); + Long retainCachedSearchesMinutes = appProperties.getRetain_cached_searches_mins(); + jpaStorageSettings.setExpireSearchResultsAfterMillis(retainCachedSearchesMinutes * 60 * 1000); + if (appProperties.getSubscription() != null) { + // 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); + } + if (appProperties.getSubscription().getEmail() != null) { + ourLog.info("Enabling email subscriptions"); + jpaStorageSettings + .addSupportedSubscriptionType(org.hl7.fhir.dstu2.model.Subscription.SubscriptionChannelType.EMAIL); + } + if (appProperties.getSubscription().getWebsocket_enabled()) { + ourLog.info("Enabling websocket subscriptions"); + jpaStorageSettings.addSupportedSubscriptionType( + org.hl7.fhir.dstu2.model.Subscription.SubscriptionChannelType.WEBSOCKET); + } + } - Long retainCachedSearchesMinutes = appProperties.getRetain_cached_searches_mins(); - jpaStorageSettings.setExpireSearchResultsAfterMillis(retainCachedSearchesMinutes * 60 * 1000); + jpaStorageSettings.setFilterParameterEnabled(appProperties.getFilter_search_enabled()); + jpaStorageSettings.setAdvancedHSearchIndexing(appProperties.getAdvanced_lucene_indexing()); + jpaStorageSettings.setTreatBaseUrlsAsLocal(new HashSet<>(appProperties.getLocal_base_urls())); - if(appProperties.getSubscription() != null) { - // 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); - } - if (appProperties.getSubscription().getEmail() != null) { - ourLog.info("Enabling email subscriptions"); - jpaStorageSettings.addSupportedSubscriptionType(org.hl7.fhir.dstu2.model.Subscription.SubscriptionChannelType.EMAIL); - } - if (appProperties.getSubscription().getWebsocket_enabled()) { - ourLog.info("Enabling websocket subscriptions"); - jpaStorageSettings.addSupportedSubscriptionType(org.hl7.fhir.dstu2.model.Subscription.SubscriptionChannelType.WEBSOCKET); - } - } + if (appProperties.getLastn_enabled()) { + jpaStorageSettings.setLastNEnabled(true); + } - jpaStorageSettings.setFilterParameterEnabled(appProperties.getFilter_search_enabled()); - jpaStorageSettings.setAdvancedHSearchIndexing(appProperties.getAdvanced_lucene_indexing()); - jpaStorageSettings.setTreatBaseUrlsAsLocal(new HashSet<>(appProperties.getLocal_base_urls())); + if (appProperties.getInline_resource_storage_below_size() != 0) { + jpaStorageSettings.setInlineResourceTextBelowSize(appProperties.getInline_resource_storage_below_size()); + } - if (appProperties.getLastn_enabled()) { - jpaStorageSettings.setLastNEnabled(true); - } + 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.getInline_resource_storage_below_size() != 0){ - jpaStorageSettings.setInlineResourceTextBelowSize(appProperties.getInline_resource_storage_below_size()); - } + if (appProperties.getAllowed_bundle_types() != null) { + jpaStorageSettings.setBundleTypesAllowedForStorage( + appProperties.getAllowed_bundle_types().stream().map(BundleType::toCode).collect(Collectors.toSet())); + } - jpaStorageSettings.setStoreResourceInHSearchIndex(appProperties.getStore_resource_in_lucene_index_enabled()); - jpaStorageSettings.setNormalizedQuantitySearchLevel(appProperties.getNormalized_quantity_search_level()); - jpaStorageSettings.setIndexOnContainedResources(appProperties.getEnable_index_contained_resource()); + jpaStorageSettings + .setDeferIndexingForCodesystemsOfSize(appProperties.getDefer_indexing_for_codesystems_of_size()); + 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()); + storageSettings(appProperties, jpaStorageSettings); + return jpaStorageSettings; + } - if (appProperties.getAllowed_bundle_types() != null) { - jpaStorageSettings.setBundleTypesAllowedForStorage(appProperties.getAllowed_bundle_types().stream().map(BundleType::toCode).collect(Collectors.toSet())); - } + @Bean + public YamlPropertySourceLoader yamlPropertySourceLoader() { + return new YamlPropertySourceLoader(); + } - jpaStorageSettings.setDeferIndexingForCodesystemsOfSize(appProperties.getDefer_indexing_for_codesystems_of_size()); + @Bean + public PartitionSettings partitionSettings(AppProperties appProperties) { + PartitionSettings retVal = new PartitionSettings(); + // 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); + } + } - 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()); + return retVal; + } - storageSettings(appProperties, jpaStorageSettings); - return jpaStorageSettings; - } + @Primary + @Bean + public HibernatePropertiesProvider jpaStarterDialectProvider( + LocalContainerEntityManagerFactoryBean myEntityManagerFactory) { + return new JpaHibernatePropertiesProvider(myEntityManagerFactory); + } - @Bean - public YamlPropertySourceLoader yamlPropertySourceLoader() { - return new YamlPropertySourceLoader(); - } + 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()); - @Bean - public PartitionSettings partitionSettings(AppProperties appProperties) { - PartitionSettings retVal = new PartitionSettings(); + jpaStorageSettings.setNormalizedQuantitySearchLevel(appProperties.getNormalized_quantity_search_level()); - // 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); - } - } + jpaStorageSettings.setIndexOnContainedResources(appProperties.getEnable_index_contained_resource()); + jpaStorageSettings.setIndexIdentifierOfType(appProperties.getEnable_index_of_type()); + return jpaStorageSettings; + } - return retVal; - } + @Lazy + @Bean + public IBinaryStorageSvc binaryStorageSvc(AppProperties appProperties) { + DatabaseBlobBinaryStorageSvcImpl binaryStorageSvc = new DatabaseBlobBinaryStorageSvcImpl(); + if (appProperties.getMax_binary_size() != null) { + binaryStorageSvc.setMaximumBinarySize(appProperties.getMax_binary_size()); + } - @Primary - @Bean - public HibernatePropertiesProvider jpaStarterDialectProvider(LocalContainerEntityManagerFactoryBean myEntityManagerFactory) { - return new JpaHibernatePropertiesProvider(myEntityManagerFactory); - } + return binaryStorageSvc; + } + @Bean + public IEmailSender emailSender(AppProperties appProperties) { + if (appProperties.getSubscription() != null && appProperties.getSubscription().getEmail() != null) { + MailConfig mailConfig = new MailConfig(); - 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()); + AppProperties.Subscription.Email email = appProperties.getSubscription().getEmail(); + mailConfig.setSmtpHostname(email.getHost()); + mailConfig.setSmtpPort(email.getPort()); + mailConfig.setSmtpUsername(email.getUsername()); + mailConfig.setSmtpPassword(email.getPassword()); + mailConfig.setSmtpUseStartTLS(email.getStartTlsEnable()); - jpaStorageSettings.setNormalizedQuantitySearchLevel(appProperties.getNormalized_quantity_search_level()); + IMailSvc mailSvc = new MailSvc(mailConfig); + IEmailSender emailSender = new EmailSenderImpl(mailSvc); - jpaStorageSettings.setIndexOnContainedResources(appProperties.getEnable_index_contained_resource()); - jpaStorageSettings.setIndexIdentifierOfType(appProperties.getEnable_index_of_type()); - return jpaStorageSettings; - } + return emailSender; + } - @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) { - MailConfig mailConfig = new MailConfig(); - - AppProperties.Subscription.Email email = appProperties.getSubscription().getEmail(); - mailConfig.setSmtpHostname(email.getHost()); - mailConfig.setSmtpPort(email.getPort()); - mailConfig.setSmtpUsername(email.getUsername()); - mailConfig.setSmtpPassword(email.getPassword()); - mailConfig.setSmtpUseStartTLS(email.getStartTlsEnable()); - - IMailSvc mailSvc = new MailSvc(mailConfig); - IEmailSender emailSender = new EmailSenderImpl(mailSvc); - - return emailSender; - } - - return null; - } + return null; + } } diff --git a/src/main/java/ca/uhn/fhir/jpa/starter/cr/CrOperationProviderLoader.java b/src/main/java/ca/uhn/fhir/jpa/starter/cr/CrOperationProviderLoader.java index fe23311..4cc568d 100644 --- a/src/main/java/ca/uhn/fhir/jpa/starter/cr/CrOperationProviderLoader.java +++ b/src/main/java/ca/uhn/fhir/jpa/starter/cr/CrOperationProviderLoader.java @@ -15,11 +15,14 @@ public class CrOperationProviderLoader { private final ResourceProviderFactory myResourceProviderFactory; private final CrOperationProviderFactory myCrProviderFactory; + private final PostInitProviderRegisterer myPostInitProviderRegister; + public CrOperationProviderLoader(FhirContext theFhirContext, ResourceProviderFactory theResourceProviderFactory, - CrOperationProviderFactory theCrProviderFactory) { + CrOperationProviderFactory theCrProviderFactory, PostInitProviderRegisterer thePostInitProviderRegister) { myFhirContext = theFhirContext; myResourceProviderFactory = theResourceProviderFactory; myCrProviderFactory = theCrProviderFactory; + myPostInitProviderRegister = thePostInitProviderRegister; loadProvider(); } diff --git a/src/main/java/ca/uhn/fhir/jpa/starter/cr/PostInitProviderRegisterer.java b/src/main/java/ca/uhn/fhir/jpa/starter/cr/PostInitProviderRegisterer.java new file mode 100644 index 0000000..55e7e8f --- /dev/null +++ b/src/main/java/ca/uhn/fhir/jpa/starter/cr/PostInitProviderRegisterer.java @@ -0,0 +1,51 @@ +package ca.uhn.fhir.jpa.starter.cr; + +import java.util.function.Supplier; + +import ca.uhn.fhir.rest.server.RestfulServer; +import ca.uhn.fhir.rest.server.provider.IResourceProviderFactoryObserver; +import ca.uhn.fhir.rest.server.provider.ResourceProviderFactory; + +public class PostInitProviderRegisterer { + public PostInitProviderRegisterer(RestfulServer restfulServer, + ResourceProviderFactory resourceProviderFactory) { + resourceProviderFactory.attach(new Observer(restfulServer)); + } + + private class Observer implements IResourceProviderFactoryObserver { + private RestfulServer restfulServer; + + public Observer(RestfulServer restfulServer) { + this.restfulServer = restfulServer; + } + + public void update(Supplier theSupplier) { + if (theSupplier == null) { + return; + } + + var provider = theSupplier.get(); + if (provider == null) { + return; + } + + this.restfulServer.registerProvider(provider); + + } + + public void remove(Supplier theSupplier) { + if (theSupplier == null) { + return; + } + + var provider = theSupplier.get(); + if (provider == null) { + return; + } + + this.restfulServer.unregisterProvider(provider); + } + + } + +} diff --git a/src/main/java/ca/uhn/fhir/jpa/starter/cr/StarterCrDstu3Config.java b/src/main/java/ca/uhn/fhir/jpa/starter/cr/StarterCrDstu3Config.java index 8b918f1..1a15f07 100644 --- a/src/main/java/ca/uhn/fhir/jpa/starter/cr/StarterCrDstu3Config.java +++ b/src/main/java/ca/uhn/fhir/jpa/starter/cr/StarterCrDstu3Config.java @@ -30,6 +30,13 @@ import org.springframework.context.annotation.Import; @Conditional({ OnDSTU3Condition.class, CrConfigCondition.class }) @Import({ CrDstu3Config.class }) public class StarterCrDstu3Config { + + @Bean + public PostInitProviderRegisterer postInitProviderRegisterer(RestfulServer theRestfulServer, + ResourceProviderFactory theResourceProviderFactory) { + return new PostInitProviderRegisterer(theRestfulServer, theResourceProviderFactory); + } + @Bean public CrOperationProviderFactory crOperationProviderFactory() { return new CrOperationProviderFactory(); @@ -38,8 +45,10 @@ public class StarterCrDstu3Config { @Bean public CrOperationProviderLoader crOperationProviderLoader(FhirContext theFhirContext, ResourceProviderFactory theResourceProviderFactory, - CrOperationProviderFactory theCrlProviderFactory) { - return new CrOperationProviderLoader(theFhirContext, theResourceProviderFactory, theCrlProviderFactory); + CrOperationProviderFactory theCrOperationProviderFactory, + PostInitProviderRegisterer thePostInitProviderRegister) { + return new CrOperationProviderLoader(theFhirContext, theResourceProviderFactory, theCrOperationProviderFactory, + thePostInitProviderRegister); } @Bean diff --git a/src/main/java/ca/uhn/fhir/jpa/starter/cr/StarterCrR4Config.java b/src/main/java/ca/uhn/fhir/jpa/starter/cr/StarterCrR4Config.java index 83e7fa3..8bcb42f 100644 --- a/src/main/java/ca/uhn/fhir/jpa/starter/cr/StarterCrR4Config.java +++ b/src/main/java/ca/uhn/fhir/jpa/starter/cr/StarterCrR4Config.java @@ -1,5 +1,6 @@ package ca.uhn.fhir.jpa.starter.cr; +import ca.uhn.fhir.IHapiBootOrder; import ca.uhn.fhir.context.FhirContext; import ca.uhn.fhir.cr.common.IRepositoryFactory; import ca.uhn.fhir.cr.config.CrR4Config; @@ -30,6 +31,13 @@ import org.springframework.context.annotation.Import; @Conditional({ OnR4Condition.class, CrConfigCondition.class }) @Import({ CrR4Config.class }) public class StarterCrR4Config { + + @Bean + public PostInitProviderRegisterer postInitProviderRegisterer(RestfulServer theRestfulServer, + ResourceProviderFactory theResourceProviderFactory) { + return new PostInitProviderRegisterer(theRestfulServer, theResourceProviderFactory); + } + @Bean public CrOperationProviderFactory crOperationProviderFactory() { return new CrOperationProviderFactory(); @@ -38,8 +46,10 @@ public class StarterCrR4Config { @Bean public CrOperationProviderLoader crOperationProviderLoader(FhirContext theFhirContext, ResourceProviderFactory theResourceProviderFactory, - CrOperationProviderFactory theCrlProviderFactory) { - return new CrOperationProviderLoader(theFhirContext, theResourceProviderFactory, theCrlProviderFactory); + CrOperationProviderFactory theCrOperationProviderFactory, + PostInitProviderRegisterer thePostInitProviderRegister) { + return new CrOperationProviderLoader(theFhirContext, theResourceProviderFactory, theCrOperationProviderFactory, + thePostInitProviderRegister); } @Bean