Merge remote-tracking branch 'upstream/master'

# Conflicts:
#	src/main/java/ca/uhn/fhir/jpa/starter/JpaRestfulServer.java
#	src/main/resources/hapi.properties
#	src/test/java/ca/uhn/fhir/jpa/starter/ExampleServerR4IT.java
This commit is contained in:
Jessie James Cosare
2019-03-15 23:09:09 +08:00
11 changed files with 317 additions and 91 deletions

View File

@@ -0,0 +1,26 @@
package ca.uhn.fhir.jpa.starter;
import ca.uhn.fhir.context.FhirVersionEnum;
import org.springframework.web.context.support.AnnotationConfigWebApplicationContext;
public class ApplicationContext extends AnnotationConfigWebApplicationContext {
public ApplicationContext() {
FhirVersionEnum fhirVersion = HapiProperties.getFhirVersion();
if (fhirVersion == FhirVersionEnum.DSTU2) {
register(FhirServerConfigDstu2.class, FhirServerConfigCommon.class);
} else if (fhirVersion == FhirVersionEnum.DSTU3) {
register(FhirServerConfigDstu3.class, FhirServerConfigCommon.class);
} else if (fhirVersion == FhirVersionEnum.R4) {
register(FhirServerConfigR4.class, FhirServerConfigCommon.class);
} else {
throw new IllegalStateException();
}
if (HapiProperties.getSubscriptionWebsocketEnabled()) {
register(ca.uhn.fhir.jpa.config.WebsocketDispatcherConfig.class);
}
}
}

View File

@@ -53,18 +53,21 @@ public class FhirServerConfigCommon {
retVal.setFetchSizeDefaultMaximum(maxFetchSize);
ourLog.info("Server configured to have a maximum fetch size of " + (maxFetchSize == Integer.MAX_VALUE? "'unlimited'": maxFetchSize));
// You can enable these if you want to support Subscriptions from your server
// Subscriptions are enabled by channel type
if (HapiProperties.getSubscriptionRestHookEnabled()) {
ourLog.info("Enabling REST-hook subscriptions");
retVal.addSupportedSubscriptionType(Subscription.SubscriptionChannelType.RESTHOOK);
}
if (HapiProperties.getSubscriptionEmailEnabled()) {
ourLog.info("Enabling email subscriptions");
retVal.addSupportedSubscriptionType(Subscription.SubscriptionChannelType.EMAIL);
}
if (HapiProperties.getSubscriptionWebsocketEnabled()) {
ourLog.info("Enabling websocket subscriptions");
retVal.addSupportedSubscriptionType(Subscription.SubscriptionChannelType.WEBSOCKET);
}
return retVal;
return retVal;
}
@Bean

View File

@@ -18,6 +18,7 @@ public class FhirServerConfigR4 extends BaseJavaConfigR4 {
@Autowired
private DataSource myDataSource;
/**
* We override the paging provider definition so that we can customize
* the default/max page sizes for search results. You can set these however

View File

@@ -38,6 +38,7 @@ public class HapiProperties {
static final String SERVER_NAME = "server.name";
static final String SUBSCRIPTION_EMAIL_ENABLED = "subscription.email.enabled";
static final String SUBSCRIPTION_RESTHOOK_ENABLED = "subscription.resthook.enabled";
static final String SUBSCRIPTION_WEBSOCKET_ENABLED = "subscription.websocket.enabled";
static final String TEST_PORT = "test.port";
static final String TESTER_CONFIG_REFUSE_TO_FETCH_THIRD_PARTY_URLS = "tester.config.refuse_to_fetch_third_party_urls";
@@ -235,11 +236,11 @@ public class HapiProperties {
}
public static Boolean getAllowMultipleDelete() {
return HapiProperties.getBooleanProperty(ALLOW_MULTIPLE_DELETE, true);
return HapiProperties.getBooleanProperty(ALLOW_MULTIPLE_DELETE, false);
}
public static Boolean getAllowExternalReferences() {
return HapiProperties.getBooleanProperty(ALLOW_EXTERNAL_REFERENCES, true);
return HapiProperties.getBooleanProperty(ALLOW_EXTERNAL_REFERENCES, false);
}
public static Boolean getExpungeEnabled() {
@@ -271,10 +272,14 @@ public class HapiProperties {
}
public static Boolean getSubscriptionEmailEnabled() {
return HapiProperties.getBooleanProperty(SUBSCRIPTION_EMAIL_ENABLED, true);
return HapiProperties.getBooleanProperty(SUBSCRIPTION_EMAIL_ENABLED, false);
}
public static Boolean getSubscriptionRestHookEnabled() {
return HapiProperties.getBooleanProperty(SUBSCRIPTION_RESTHOOK_ENABLED, true);
return HapiProperties.getBooleanProperty(SUBSCRIPTION_RESTHOOK_ENABLED, false);
}
public static Boolean getSubscriptionWebsocketEnabled() {
return HapiProperties.getBooleanProperty(SUBSCRIPTION_WEBSOCKET_ENABLED, false);
}
}

View File

@@ -5,6 +5,7 @@ import ca.uhn.fhir.context.FhirVersionEnum;
import ca.uhn.fhir.jpa.dao.DaoConfig;
import ca.uhn.fhir.jpa.dao.IFhirSystemDao;
import ca.uhn.fhir.jpa.model.interceptor.executor.InterceptorService;
import ca.uhn.fhir.jpa.model.interceptor.api.IInterceptorRegistry;
import ca.uhn.fhir.jpa.provider.JpaConformanceProviderDstu2;
import ca.uhn.fhir.jpa.provider.JpaSystemProviderDstu2;
import ca.uhn.fhir.jpa.provider.SubscriptionTriggeringProvider;
@@ -17,6 +18,8 @@ import ca.uhn.fhir.jpa.provider.r4.TerminologyUploaderProviderR4;
import ca.uhn.fhir.jpa.search.DatabaseBackedPagingProvider;
import ca.uhn.fhir.jpa.subscription.SubscriptionInterceptorLoader;
import ca.uhn.fhir.jpa.subscription.module.interceptor.SubscriptionDebugLogInterceptor;
import ca.uhn.fhir.jpa.subscription.SubscriptionActivatingInterceptor;
import ca.uhn.fhir.jpa.subscription.SubscriptionMatcherInterceptor;
import ca.uhn.fhir.model.dstu2.composite.MetaDt;
import ca.uhn.fhir.narrative.DefaultThymeleafNarrativeGenerator;
import ca.uhn.fhir.rest.server.HardcodedServerAddressStrategy;
@@ -26,8 +29,8 @@ import ca.uhn.fhir.rest.server.interceptor.CorsInterceptor;
import ca.uhn.fhir.rest.server.interceptor.ResponseHighlighterInterceptor;
import org.hl7.fhir.dstu3.model.Bundle;
import org.hl7.fhir.dstu3.model.Meta;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import org.springframework.web.cors.CorsConfiguration;
import org.springframework.context.ApplicationContext;
import javax.servlet.ServletException;
import java.util.Arrays;
@@ -36,12 +39,6 @@ import java.util.List;
public class JpaRestfulServer extends RestfulServer {
private static final long serialVersionUID = 1L;
private AnnotationConfigApplicationContext appCtx;
@Override
public void destroy() {
appCtx.close();
}
@SuppressWarnings("unchecked")
@Override
@@ -52,34 +49,29 @@ public class JpaRestfulServer extends RestfulServer {
* Create a FhirContext object that uses the version of FHIR
* specified in the properties file.
*/
FhirVersionEnum fhirVersion = HapiProperties.getFhirVersion();
setFhirContext(new FhirContext(fhirVersion));
appCtx = new AnnotationConfigApplicationContext();
ApplicationContext appCtx = (ApplicationContext) getServletContext().getAttribute("org.springframework.web.context.WebApplicationContext.ROOT");
/*
* ResourceProviders are fetched from the Spring context
*/
FhirVersionEnum fhirVersion = HapiProperties.getFhirVersion();
List<IResourceProvider> resourceProviders;
Object systemProvider;
if (fhirVersion == FhirVersionEnum.DSTU2) {
appCtx.register(FhirServerConfigDstu2.class, FhirServerConfigCommon.class);
appCtx.refresh();
resourceProviders = appCtx.getBean("myResourceProvidersDstu2", List.class);
systemProvider = appCtx.getBean("mySystemProviderDstu2", JpaSystemProviderDstu2.class);
} else if (fhirVersion == FhirVersionEnum.DSTU3) {
appCtx.register(FhirServerConfigDstu3.class, FhirServerConfigCommon.class);
appCtx.refresh();
resourceProviders = appCtx.getBean("myResourceProvidersDstu3", List.class);
systemProvider = appCtx.getBean("mySystemProviderDstu3", JpaSystemProviderDstu3.class);
} else if (fhirVersion == FhirVersionEnum.R4) {
appCtx.register(FhirServerConfigR4.class, FhirServerConfigCommon.class);
appCtx.refresh();
resourceProviders = appCtx.getBean("myResourceProvidersR4", List.class);
systemProvider = appCtx.getBean("mySystemProviderR4", JpaSystemProviderR4.class);
} else {
throw new IllegalStateException();
}
setFhirContext(appCtx.getBean(FhirContext.class));
registerProviders(resourceProviders);
registerProvider(systemProvider);
@@ -200,12 +192,23 @@ public class JpaRestfulServer extends RestfulServer {
CorsInterceptor interceptor = new CorsInterceptor(config);
registerInterceptor(interceptor);
// Enable the use of subscriptions
SubscriptionInterceptorLoader subscriptionInterceptorLoader = appCtx.getBean(SubscriptionInterceptorLoader.class);
subscriptionInterceptorLoader.registerInterceptors();
// Subscription debug logging
InterceptorService interceptorService = (InterceptorService) appCtx.getBean("interceptorService");
interceptorService.registerInterceptor(new SubscriptionDebugLogInterceptor());
// If subscriptions are enabled, we want to register the interceptor that
// will activate them and match results against them
if (HapiProperties.getSubscriptionWebsocketEnabled() ||
HapiProperties.getSubscriptionEmailEnabled() ||
HapiProperties.getSubscriptionRestHookEnabled()) {
// Loads subscription interceptors (SubscriptionActivatingInterceptor, SubscriptionMatcherInterceptor)
// with activation of scheduled subscription
SubscriptionInterceptorLoader subscriptionInterceptorLoader = appCtx.getBean(SubscriptionInterceptorLoader.class);
subscriptionInterceptorLoader.registerInterceptors();
// Subscription debug logging
InterceptorService interceptorService = (InterceptorService) appCtx.getBean("interceptorService");
interceptorService.registerInterceptor(new SubscriptionDebugLogInterceptor());
}
}
}