Merge branch 'master' into rel_5_4_0
This commit is contained in:
@@ -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
|
||||
|
||||
|
||||
@@ -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> 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> 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<String> 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<String> 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<String> 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<String> 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<String, AppProperties.ImplementationGuide> guides = appProperties.getImplementationGuides();
|
||||
for (Map.Entry<String, AppProperties.ImplementationGuide> 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<String, AppProperties.ImplementationGuide> guides = appProperties.getImplementationGuides();
|
||||
for (Map.Entry<String, AppProperties.ImplementationGuide> 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());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user