diff --git a/README.md b/README.md index 95edfc7..fecb5e8 100644 --- a/README.md +++ b/README.md @@ -189,6 +189,13 @@ spring: password: admin driverClassName: com.mysql.jdbc.Driver ``` +On some systems, it might be necessary to override hibernate's default naming strategy. The naming strategy must be set using spring.jpa.hibernate.physical_naming_strategy. + +```yaml +spring: + jpa: + hibernate.physical_naming_strategy: NAME_OF_PREFERRED_STRATEGY +``` ### PostgreSQL configuration diff --git a/src/main/java/ca/uhn/fhir/jpa/starter/BaseJpaRestfulServer.java b/src/main/java/ca/uhn/fhir/jpa/starter/BaseJpaRestfulServer.java index 8573130..fd85aee 100644 --- a/src/main/java/ca/uhn/fhir/jpa/starter/BaseJpaRestfulServer.java +++ b/src/main/java/ca/uhn/fhir/jpa/starter/BaseJpaRestfulServer.java @@ -62,324 +62,326 @@ import java.util.stream.Collectors; public class BaseJpaRestfulServer extends RestfulServer { private static final long serialVersionUID = 1L; - @Autowired - DaoRegistry daoRegistry; - @Autowired - DaoConfig daoConfig; - @Autowired - ISearchParamRegistry searchParamRegistry; - @Autowired - IFhirSystemDao fhirSystemDao; - @Autowired - ResourceProviderFactory resourceProviders; - @Autowired - IJpaSystemProvider jpaSystemProvider; - @Autowired - IInterceptorBroadcaster interceptorBroadcaster; - @Autowired - DatabaseBackedPagingProvider databaseBackedPagingProvider; - @Autowired - IInterceptorService interceptorService; - @Autowired - IValidatorModule validatorModule; - @Autowired - Optional graphQLProvider; - @Autowired - BulkDataExportProvider bulkDataExportProvider; - @Autowired - PartitionManagementProvider partitionManagementProvider; - @Autowired - BinaryStorageInterceptor binaryStorageInterceptor; - @Autowired - IPackageInstallerSvc packageInstallerSvc; - @Autowired - AppProperties appProperties; - @Autowired - ApplicationContext myApplicationContext; - @Autowired(required = false) - IRepositoryValidationInterceptorFactory factory; - // These are set only if the features are enabled - private CqlProviderLoader cqlProviderLoader; + @Autowired + DaoRegistry daoRegistry; + @Autowired + DaoConfig daoConfig; + @Autowired + ISearchParamRegistry searchParamRegistry; + @Autowired + IFhirSystemDao fhirSystemDao; + @Autowired + ResourceProviderFactory resourceProviders; + @Autowired + IJpaSystemProvider jpaSystemProvider; + @Autowired + IInterceptorBroadcaster interceptorBroadcaster; + @Autowired + DatabaseBackedPagingProvider databaseBackedPagingProvider; + @Autowired + IInterceptorService interceptorService; + @Autowired + IValidatorModule validatorModule; + @Autowired + Optional graphQLProvider; + @Autowired + BulkDataExportProvider bulkDataExportProvider; + @Autowired + PartitionManagementProvider partitionManagementProvider; + @Autowired + BinaryStorageInterceptor binaryStorageInterceptor; + @Autowired + IPackageInstallerSvc packageInstallerSvc; + @Autowired + AppProperties appProperties; + @Autowired + ApplicationContext myApplicationContext; + @Autowired(required = false) + IRepositoryValidationInterceptorFactory factory; + // These are set only if the features are enabled + private CqlProviderLoader cqlProviderLoader; @Autowired private IValidationSupport myValidationSupport; - public BaseJpaRestfulServer() { - } + public BaseJpaRestfulServer() { + } - @SuppressWarnings("unchecked") - @Override - protected void initialize() throws ServletException { - super.initialize(); + private static final long serialVersionUID = 1L; - /* - * Create a FhirContext object that uses the version of FHIR - * specified in the properties file. - */ - // Customize supported resource types - List supportedResourceTypes = appProperties.getSupported_resource_types(); + @SuppressWarnings("unchecked") + @Override + protected void initialize() throws ServletException { + super.initialize(); - if (!supportedResourceTypes.isEmpty() && !supportedResourceTypes.contains("SearchParameter")) { - supportedResourceTypes.add("SearchParameter"); - daoRegistry.setSupportedResourceTypes(supportedResourceTypes); - } + /* + * Create a FhirContext object that uses the version of FHIR + * specified in the properties file. + */ + // Customize supported resource types + List supportedResourceTypes = appProperties.getSupported_resource_types(); - setFhirContext(fhirSystemDao.getContext()); + if (!supportedResourceTypes.isEmpty() && !supportedResourceTypes.contains("SearchParameter")) { + supportedResourceTypes.add("SearchParameter"); + daoRegistry.setSupportedResourceTypes(supportedResourceTypes); + } - registerProviders(resourceProviders.createProviders()); - registerProvider(jpaSystemProvider); + setFhirContext(fhirSystemDao.getContext()); - /* - * The conformance provider exports the supported resources, search parameters, etc for - * this server. The JPA version adds resourceProviders counts to the exported statement, so it - * is a nice addition. - * - * You can also create your own subclass of the conformance provider if you need to - * provide further customization of your server's CapabilityStatement - */ + registerProviders(resourceProviders.createProviders()); + registerProvider(jpaSystemProvider); - FhirVersionEnum fhirVersion = fhirSystemDao.getContext().getVersion().getVersion(); - if (fhirVersion == FhirVersionEnum.DSTU2) { + /* + * The conformance provider exports the supported resources, search parameters, etc for + * this server. The JPA version adds resourceProviders counts to the exported statement, so it + * is a nice addition. + * + * You can also create your own subclass of the conformance provider if you need to + * provide further customization of your server's CapabilityStatement + */ - JpaConformanceProviderDstu2 confProvider = new JpaConformanceProviderDstu2(this, fhirSystemDao, - daoConfig); - confProvider.setImplementationDescription("HAPI FHIR DSTU2 Server"); - setServerConformanceProvider(confProvider); - } else { - if (fhirVersion == FhirVersionEnum.DSTU3) { + FhirVersionEnum fhirVersion = fhirSystemDao.getContext().getVersion().getVersion(); + if (fhirVersion == FhirVersionEnum.DSTU2) { - JpaConformanceProviderDstu3 confProvider = new JpaConformanceProviderDstu3(this, fhirSystemDao, - daoConfig, searchParamRegistry); - confProvider.setImplementationDescription("HAPI FHIR DSTU3 Server"); - setServerConformanceProvider(confProvider); - } else if (fhirVersion == FhirVersionEnum.R4) { + JpaConformanceProviderDstu2 confProvider = new JpaConformanceProviderDstu2(this, fhirSystemDao, + daoConfig); + confProvider.setImplementationDescription("HAPI FHIR DSTU2 Server"); + setServerConformanceProvider(confProvider); + } else { + if (fhirVersion == FhirVersionEnum.DSTU3) { + + JpaConformanceProviderDstu3 confProvider = new JpaConformanceProviderDstu3(this, fhirSystemDao, + daoConfig, searchParamRegistry); + confProvider.setImplementationDescription("HAPI FHIR DSTU3 Server"); + setServerConformanceProvider(confProvider); + } else if (fhirVersion == FhirVersionEnum.R4) { JpaCapabilityStatementProvider confProvider = new JpaCapabilityStatementProvider(this, fhirSystemDao, daoConfig, searchParamRegistry, myValidationSupport); - confProvider.setImplementationDescription("HAPI FHIR R4 Server"); - setServerConformanceProvider(confProvider); - } else if (fhirVersion == FhirVersionEnum.R5) { + confProvider.setImplementationDescription("HAPI FHIR R4 Server"); + setServerConformanceProvider(confProvider); + } else if (fhirVersion == FhirVersionEnum.R5) { JpaCapabilityStatementProvider confProvider = new JpaCapabilityStatementProvider(this, fhirSystemDao, daoConfig, searchParamRegistry, myValidationSupport); - confProvider.setImplementationDescription("HAPI FHIR R5 Server"); - setServerConformanceProvider(confProvider); - } else { - throw new IllegalStateException(); - } - } + confProvider.setImplementationDescription("HAPI FHIR R5 Server"); + setServerConformanceProvider(confProvider); + } else { + throw new IllegalStateException(); + } + } - /* - * ETag Support - */ + /* + * ETag Support + */ - if (appProperties.getEtag_support_enabled() == false) - setETagSupport(ETagSupportEnum.DISABLED); + if (appProperties.getEtag_support_enabled() == false) + setETagSupport(ETagSupportEnum.DISABLED); - /* - * This server tries to dynamically generate narratives - */ - FhirContext ctx = getFhirContext(); - INarrativeGenerator theNarrativeGenerator = - appProperties.getNarrative_enabled() ? - new DefaultThymeleafNarrativeGenerator() : - new NullNarrativeGenerator(); - ctx.setNarrativeGenerator(theNarrativeGenerator); + /* + * This server tries to dynamically generate narratives + */ + FhirContext ctx = getFhirContext(); + INarrativeGenerator theNarrativeGenerator = + appProperties.getNarrative_enabled() ? + new DefaultThymeleafNarrativeGenerator() : + new NullNarrativeGenerator(); + ctx.setNarrativeGenerator(theNarrativeGenerator); - /* - * Default to JSON and pretty printing - */ - setDefaultPrettyPrint(appProperties.getDefault_pretty_print()); + /* + * Default to JSON and pretty printing + */ + setDefaultPrettyPrint(appProperties.getDefault_pretty_print()); - /* - * Default encoding - */ - setDefaultResponseEncoding(appProperties.getDefault_encoding()); + /* + * Default encoding + */ + setDefaultResponseEncoding(appProperties.getDefault_encoding()); - /* - * This configures the server to page search results to and from - * the database, instead of only paging them to memory. This may mean - * a performance hit when performing searches that return lots of results, - * but makes the server much more scalable. - */ + /* + * This configures the server to page search results to and from + * the database, instead of only paging them to memory. This may mean + * a performance hit when performing searches that return lots of results, + * but makes the server much more scalable. + */ - setPagingProvider(databaseBackedPagingProvider); + setPagingProvider(databaseBackedPagingProvider); - /* - * This interceptor formats the output using nice colourful - * HTML output when the request is detected to come from a - * browser. - */ - ResponseHighlighterInterceptor responseHighlighterInterceptor = new ResponseHighlighterInterceptor(); - this.registerInterceptor(responseHighlighterInterceptor); + /* + * This interceptor formats the output using nice colourful + * HTML output when the request is detected to come from a + * browser. + */ + ResponseHighlighterInterceptor responseHighlighterInterceptor = new ResponseHighlighterInterceptor(); + this.registerInterceptor(responseHighlighterInterceptor); - if (appProperties.getFhirpath_interceptor_enabled()) { - registerInterceptor(new FhirPathFilterInterceptor()); - } + if (appProperties.getFhirpath_interceptor_enabled()) { + registerInterceptor(new FhirPathFilterInterceptor()); + } - /* - * Add some logging for each request - */ - LoggingInterceptor loggingInterceptor = new LoggingInterceptor(); - loggingInterceptor.setLoggerName(appProperties.getLogger().getName()); - loggingInterceptor.setMessageFormat(appProperties.getLogger().getFormat()); - loggingInterceptor.setErrorMessageFormat(appProperties.getLogger().getError_format()); - loggingInterceptor.setLogExceptions(appProperties.getLogger().getLog_exceptions()); - this.registerInterceptor(loggingInterceptor); + /* + * Add some logging for each request + */ + LoggingInterceptor loggingInterceptor = new LoggingInterceptor(); + loggingInterceptor.setLoggerName(appProperties.getLogger().getName()); + loggingInterceptor.setMessageFormat(appProperties.getLogger().getFormat()); + loggingInterceptor.setErrorMessageFormat(appProperties.getLogger().getError_format()); + loggingInterceptor.setLogExceptions(appProperties.getLogger().getLog_exceptions()); + this.registerInterceptor(loggingInterceptor); - /* - * If you are hosting this server at a specific DNS name, the server will try to - * figure out the FHIR base URL based on what the web container tells it, but - * this doesn't always work. If you are setting links in your search bundles that - * just refer to "localhost", you might want to use a server address strategy: - */ - String serverAddress = appProperties.getServer_address(); - if (!Strings.isNullOrEmpty(serverAddress)) { - setServerAddressStrategy(new HardcodedServerAddressStrategy(serverAddress)); - } else if (appProperties.getUse_apache_address_strategy()) { - boolean useHttps = appProperties.getUse_apache_address_strategy_https(); - setServerAddressStrategy(useHttps ? ApacheProxyAddressStrategy.forHttps() : - ApacheProxyAddressStrategy.forHttp()); - } else { - setServerAddressStrategy(new IncomingRequestAddressStrategy()); - } + /* + * If you are hosting this server at a specific DNS name, the server will try to + * figure out the FHIR base URL based on what the web container tells it, but + * this doesn't always work. If you are setting links in your search bundles that + * just refer to "localhost", you might want to use a server address strategy: + */ + String serverAddress = appProperties.getServer_address(); + if (!Strings.isNullOrEmpty(serverAddress)) { + setServerAddressStrategy(new HardcodedServerAddressStrategy(serverAddress)); + } else if (appProperties.getUse_apache_address_strategy()) { + boolean useHttps = appProperties.getUse_apache_address_strategy_https(); + setServerAddressStrategy(useHttps ? ApacheProxyAddressStrategy.forHttps() : + ApacheProxyAddressStrategy.forHttp()); + } else { + setServerAddressStrategy(new IncomingRequestAddressStrategy()); + } - /* - * If you are using DSTU3+, you may want to add a terminology uploader, which allows - * uploading of external terminologies such as Snomed CT. Note that this uploader - * does not have any security attached (any anonymous user may use it by default) - * so it is a potential security vulnerability. Consider using an AuthorizationInterceptor - * with this feature. - */ - if (ctx.getVersion().getVersion().isEqualOrNewerThan(FhirVersionEnum.DSTU3)) { // <-- ENABLED RIGHT NOW - registerProvider(myApplicationContext.getBean(TerminologyUploaderProvider.class)); - } + /* + * If you are using DSTU3+, you may want to add a terminology uploader, which allows + * uploading of external terminologies such as Snomed CT. Note that this uploader + * does not have any security attached (any anonymous user may use it by default) + * so it is a potential security vulnerability. Consider using an AuthorizationInterceptor + * with this feature. + */ + if (ctx.getVersion().getVersion().isEqualOrNewerThan(FhirVersionEnum.DSTU3)) { // <-- ENABLED RIGHT NOW + registerProvider(myApplicationContext.getBean(TerminologyUploaderProvider.class)); + } - // If you want to enable the $trigger-subscription operation to allow - // manual triggering of a subscription delivery, enable this provider - if (true) { // <-- ENABLED RIGHT NOW - registerProvider(myApplicationContext.getBean(SubscriptionTriggeringProvider.class)); - } + // If you want to enable the $trigger-subscription operation to allow + // manual triggering of a subscription delivery, enable this provider + if (true) { // <-- ENABLED RIGHT NOW + registerProvider(myApplicationContext.getBean(SubscriptionTriggeringProvider.class)); + } - // Define your CORS configuration. This is an example - // showing a typical setup. You should customize this - // to your specific needs - if (appProperties.getCors() != null) { - CorsConfiguration config = new CorsConfiguration(); - config.addAllowedHeader(HttpHeaders.ORIGIN); - config.addAllowedHeader(HttpHeaders.ACCEPT); - config.addAllowedHeader(HttpHeaders.CONTENT_TYPE); - config.addAllowedHeader(HttpHeaders.AUTHORIZATION); - config.addAllowedHeader(HttpHeaders.CACHE_CONTROL); - config.addAllowedHeader("x-fhir-starter"); - config.addAllowedHeader("X-Requested-With"); - config.addAllowedHeader("Prefer"); - List allAllowedCORSOrigins = appProperties.getCors().getAllowed_origin(); - allAllowedCORSOrigins.forEach(config::addAllowedOrigin); + // Define your CORS configuration. This is an example + // showing a typical setup. You should customize this + // to your specific needs + if (appProperties.getCors() != null) { + CorsConfiguration config = new CorsConfiguration(); + config.addAllowedHeader(HttpHeaders.ORIGIN); + config.addAllowedHeader(HttpHeaders.ACCEPT); + config.addAllowedHeader(HttpHeaders.CONTENT_TYPE); + config.addAllowedHeader(HttpHeaders.AUTHORIZATION); + config.addAllowedHeader(HttpHeaders.CACHE_CONTROL); + config.addAllowedHeader("x-fhir-starter"); + config.addAllowedHeader("X-Requested-With"); + config.addAllowedHeader("Prefer"); + List allAllowedCORSOrigins = appProperties.getCors().getAllowed_origin(); + allAllowedCORSOrigins.forEach(config::addAllowedOriginPattern); - config.addExposedHeader("Location"); - config.addExposedHeader("Content-Location"); - config.setAllowedMethods( - Arrays.asList("GET", "POST", "PUT", "DELETE", "OPTIONS", "PATCH", "HEAD")); - config.setAllowCredentials(appProperties.getCors().getAllow_Credentials()); + config.addExposedHeader("Location"); + config.addExposedHeader("Content-Location"); + config.setAllowedMethods( + Arrays.asList("GET", "POST", "PUT", "DELETE", "OPTIONS", "PATCH", "HEAD")); + config.setAllowCredentials(appProperties.getCors().getAllow_Credentials()); - // Create the interceptor and register it - CorsInterceptor interceptor = new CorsInterceptor(config); - registerInterceptor(interceptor); - } + // Create the interceptor and register it + CorsInterceptor interceptor = new CorsInterceptor(config); + registerInterceptor(interceptor); + } - // If subscriptions are enabled, we want to register the interceptor that - // will activate them and match results against them - if (appProperties.getSubscription() != null) { - // Subscription debug logging - interceptorService.registerInterceptor(new SubscriptionDebugLogInterceptor()); - } + // If subscriptions are enabled, we want to register the interceptor that + // will activate them and match results against them + if (appProperties.getSubscription() != null) { + // Subscription debug logging + interceptorService.registerInterceptor(new SubscriptionDebugLogInterceptor()); + } - // Cascading deletes + // Cascading deletes - if (appProperties.getAllow_cascading_deletes()) { - CascadingDeleteInterceptor cascadingDeleteInterceptor = new CascadingDeleteInterceptor(ctx, - daoRegistry, interceptorBroadcaster); - getInterceptorService().registerInterceptor(cascadingDeleteInterceptor); - } + if (appProperties.getAllow_cascading_deletes()) { + CascadingDeleteInterceptor cascadingDeleteInterceptor = new CascadingDeleteInterceptor(ctx, + daoRegistry, interceptorBroadcaster); + getInterceptorService().registerInterceptor(cascadingDeleteInterceptor); + } - // Binary Storage - if (appProperties.getBinary_storage_enabled()) { - getInterceptorService().registerInterceptor(binaryStorageInterceptor); - } + // Binary Storage + if (appProperties.getBinary_storage_enabled()) { + getInterceptorService().registerInterceptor(binaryStorageInterceptor); + } - // Validation + // Validation - if (validatorModule != null) { - if (appProperties.getValidation().getRequests_enabled()) { - RequestValidatingInterceptor interceptor = new RequestValidatingInterceptor(); - interceptor.setFailOnSeverity(ResultSeverityEnum.ERROR); - interceptor.setValidatorModules(Collections.singletonList(validatorModule)); - registerInterceptor(interceptor); - } - if (appProperties.getValidation().getResponses_enabled()) { - ResponseValidatingInterceptor interceptor = new ResponseValidatingInterceptor(); - interceptor.setFailOnSeverity(ResultSeverityEnum.ERROR); - interceptor.setValidatorModules(Collections.singletonList(validatorModule)); - registerInterceptor(interceptor); - } - } + if (validatorModule != null) { + if (appProperties.getValidation().getRequests_enabled()) { + RequestValidatingInterceptor interceptor = new RequestValidatingInterceptor(); + interceptor.setFailOnSeverity(ResultSeverityEnum.ERROR); + interceptor.setValidatorModules(Collections.singletonList(validatorModule)); + registerInterceptor(interceptor); + } + if (appProperties.getValidation().getResponses_enabled()) { + ResponseValidatingInterceptor interceptor = new ResponseValidatingInterceptor(); + interceptor.setFailOnSeverity(ResultSeverityEnum.ERROR); + interceptor.setValidatorModules(Collections.singletonList(validatorModule)); + registerInterceptor(interceptor); + } + } - // GraphQL - if (appProperties.getGraphql_enabled()) { - if (fhirVersion.isEqualOrNewerThan(FhirVersionEnum.DSTU3)) { - registerProvider(graphQLProvider.get()); - } - } + // GraphQL + if (appProperties.getGraphql_enabled()) { + if (fhirVersion.isEqualOrNewerThan(FhirVersionEnum.DSTU3)) { + registerProvider(graphQLProvider.get()); + } + } - if (appProperties.getAllowed_bundle_types() != null) { - daoConfig.setBundleTypesAllowedForStorage(appProperties.getAllowed_bundle_types().stream().map(BundleType::toCode).collect(Collectors.toSet())); - } + if (appProperties.getAllowed_bundle_types() != null) { + daoConfig.setBundleTypesAllowedForStorage(appProperties.getAllowed_bundle_types().stream().map(BundleType::toCode).collect(Collectors.toSet())); + } - daoConfig.setDeferIndexingForCodesystemsOfSize(appProperties.getDefer_indexing_for_codesystems_of_size()); + daoConfig.setDeferIndexingForCodesystemsOfSize(appProperties.getDefer_indexing_for_codesystems_of_size()); - // Bulk Export - if (appProperties.getBulk_export_enabled()) { - registerProvider(bulkDataExportProvider); - } + // Bulk Export + if (appProperties.getBulk_export_enabled()) { + registerProvider(bulkDataExportProvider); + } - // Partitioning - if (appProperties.getPartitioning() != null) { - registerInterceptor(new RequestTenantPartitionInterceptor()); - setTenantIdentificationStrategy(new UrlBaseTenantIdentificationStrategy()); - registerProviders(partitionManagementProvider); - } + // Partitioning + if (appProperties.getPartitioning() != null) { + registerInterceptor(new RequestTenantPartitionInterceptor()); + setTenantIdentificationStrategy(new UrlBaseTenantIdentificationStrategy()); + registerProviders(partitionManagementProvider); + } - if (appProperties.getClient_id_strategy() == DaoConfig.ClientIdStrategyEnum.ANY) { - daoConfig.setResourceServerIdStrategy(DaoConfig.IdStrategyEnum.UUID); - daoConfig.setResourceClientIdStrategy(appProperties.getClient_id_strategy()); - } + if (appProperties.getClient_id_strategy() == DaoConfig.ClientIdStrategyEnum.ANY) { + daoConfig.setResourceServerIdStrategy(DaoConfig.IdStrategyEnum.UUID); + daoConfig.setResourceClientIdStrategy(appProperties.getClient_id_strategy()); + } - if (appProperties.getImplementationGuides() != null) { - Map guides = appProperties.getImplementationGuides(); - for (Map.Entry guide : guides.entrySet()) { - packageInstallerSvc.install(new PackageInstallationSpec() - .setPackageUrl(guide.getValue().getUrl()) - .setName(guide.getValue().getName()) - .setVersion(guide.getValue().getVersion()) - .setInstallMode(PackageInstallationSpec.InstallModeEnum.STORE_AND_INSTALL)); + if (appProperties.getImplementationGuides() != null) { + Map guides = appProperties.getImplementationGuides(); + for (Map.Entry guide : guides.entrySet()) { + packageInstallerSvc.install(new PackageInstallationSpec() + .setPackageUrl(guide.getValue().getUrl()) + .setName(guide.getValue().getName()) + .setVersion(guide.getValue().getVersion()) + .setInstallMode(PackageInstallationSpec.InstallModeEnum.STORE_AND_INSTALL)); - } - } + } + } - if (factory != null) { - interceptorService.registerInterceptor(factory.buildUsingStoredStructureDefinitions()); - } + if(factory != null) { + interceptorService.registerInterceptor(factory.buildUsingStoredStructureDefinitions()); + } - if (appProperties.getLastn_enabled()) { - daoConfig.setLastNEnabled(true); - } + if (appProperties.getLastn_enabled()) { + daoConfig.setLastNEnabled(true); + } - daoConfig.getModelConfig().setNormalizedQuantitySearchLevel(appProperties.getNormalized_quantity_search_level()); + daoConfig.getModelConfig().setNormalizedQuantitySearchLevel(appProperties.getNormalized_quantity_search_level()); daoConfig.getModelConfig().setIndexOnContainedResources(appProperties.getEnable_index_contained_resource()); - } + } } diff --git a/src/main/resources/application.yaml b/src/main/resources/application.yaml index f1b021d..c2f6ba2 100644 --- a/src/main/resources/application.yaml +++ b/src/main/resources/application.yaml @@ -21,46 +21,42 @@ spring: # hibernate.cache.use_second_level_cache: false # hibernate.cache.use_structured_entries: false # hibernate.cache.use_minimal_puts: false - - # These settings will enable fulltext search with lucene +### These settings will enable fulltext search with lucene # hibernate.search.enabled: true # hibernate.search.backend.type: lucene # hibernate.search.backend.analysis.configurer: ca.uhn.fhir.jpa.search.HapiLuceneAnalysisConfigurer # hibernate.search.backend.directory.type: local-filesystem # hibernate.search.backend.directory.root: target/lucenefiles # hibernate.search.backend.lucene_version: lucene_current - batch: job: enabled: false - hapi: fhir: - ### enable to use the ApacheProxyAddressStrategy which uses X-Forwarded-* headers - ### to determine the FHIR server address -# use_apache_address_strategy: false - ### forces the use of the https:// protocol for the returned server address. - ### alternatively, it may be set using the X-Forwarded-Proto header. -# use_apache_address_strategy_https: false - ### enable to set the Server URL -# server_address: http://hapi.fhir.org/baseR4 ### This is the FHIR version. Choose between, DSTU2, DSTU3, R4 or R5 fhir_version: R4 +### enable to use the ApacheProxyAddressStrategy which uses X-Forwarded-* headers +### to determine the FHIR server address +# use_apache_address_strategy: false +### forces the use of the https:// protocol for the returned server address. +### alternatively, it may be set using the X-Forwarded-Proto header. +# use_apache_address_strategy_https: false +### enable to set the Server URL +# server_address: http://hapi.fhir.org/baseR4 # defer_indexing_for_codesystems_of_size: 101 - #implementationguides: - #example from registry (packages.fhir.org) - #swiss: - #name: swiss.mednet.fhir - #version: 0.8.0 - #example not from registry - #ips_1_0_0: - #url: https://build.fhir.org/ig/HL7/fhir-ips/package.tgz - #name: hl7.fhir.uv.ips - #version: 1.0.0 - - #supported_resource_types: - # - Patient - # - Observation +# implementationguides: +### example from registry (packages.fhir.org) +# swiss: +# name: swiss.mednet.fhir +# version: 0.8.0 +# example not from registry +# ips_1_0_0: +# url: https://build.fhir.org/ig/HL7/fhir-ips/package.tgz +# name: hl7.fhir.uv.ips +# version: 1.0.0 +# supported_resource_types: +# - Patient +# - Observation # allow_cascading_deletes: true # allow_contains_searches: true # allow_external_references: true @@ -80,19 +76,19 @@ hapi: # etag_support_enabled: true # expunge_enabled: true # daoconfig_client_id_strategy: null +# client_id_strategy: ALPHANUMERIC # fhirpath_interceptor_enabled: false # filter_search_enabled: true # graphql_enabled: true # narrative_enabled: true - #partitioning: - # allow_references_across_partitions: false - # partitioning_include_in_search_hashes: false - #cors: - # allow_Credentials: true - # Supports multiple, comma separated allowed origin entries - # cors.allowed_origin=http://localhost:8080,https://localhost:8080,https://fhirtest.uhn.ca - # allowed_origin: - # - '*' +# partitioning: +# allow_references_across_partitions: false +# partitioning_include_in_search_hashes: false + cors: + allow_Credentials: true + # These are allowed_origin patterns, see: https://docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/web/cors/CorsConfiguration.html#setAllowedOriginPatterns-java.util.List- + allowed_origin: + - '*' # Search coordinator thread pool sizes search-coord-core-pool-size: 20 @@ -113,13 +109,11 @@ hapi: # retain_cached_searches_mins: 60 # reuse_cached_search_results_millis: 60000 tester: - home: name: Local Tester server_address: 'http://localhost:8080/fhir' refuse_to_fetch_third_party_urls: false fhir_version: R4 - global: name: Global Tester server_address: "http://hapi.fhir.org/baseR4" @@ -144,14 +138,11 @@ hapi: # startTlsRequired: # quitWait: # lastn_enabled: true - ### This is configuration for normalized quantity serach level default is 0 - ### 0: NORMALIZED_QUANTITY_SEARCH_NOT_SUPPORTED - default - ### 1: NORMALIZED_QUANTITY_STORAGE_SUPPORTED - ### 2: NORMALIZED_QUANTITY_SEARCH_SUPPORTED +### This is configuration for normalized quantity serach level default is 0 +### 0: NORMALIZED_QUANTITY_SEARCH_NOT_SUPPORTED - default +### 1: NORMALIZED_QUANTITY_STORAGE_SUPPORTED +### 2: NORMALIZED_QUANTITY_SEARCH_SUPPORTED # normalized_quantity_search_level: 2 - - -# #elasticsearch: # debug: # pretty_print_json_log: false