diff --git a/.travis.yml b/.travis.yml index 54d387b..c0c0974 100644 --- a/.travis.yml +++ b/.travis.yml @@ -29,7 +29,7 @@ before_script: - sudo chown -R travis:travis "$HOME/.m2/repository"; script: - - mvn -U install + - mvn -B install diff --git a/pom.xml b/pom.xml index 3ad764d..61f82de 100644 --- a/pom.xml +++ b/pom.xml @@ -11,7 +11,7 @@ ca.uhn.hapi.fhir hapi-fhir - 4.2.0 + 5.0.0 hapi-fhir-jpaserver-starter diff --git a/src/main/java/ca/uhn/fhir/jpa/starter/ApplicationContext.java b/src/main/java/ca/uhn/fhir/jpa/starter/ApplicationContext.java index 24b4f79..c177603 100644 --- a/src/main/java/ca/uhn/fhir/jpa/starter/ApplicationContext.java +++ b/src/main/java/ca/uhn/fhir/jpa/starter/ApplicationContext.java @@ -1,28 +1,40 @@ package ca.uhn.fhir.jpa.starter; import ca.uhn.fhir.context.FhirVersionEnum; +import ca.uhn.fhir.jpa.subscription.channel.config.SubscriptionChannelConfig; +import ca.uhn.fhir.jpa.subscription.match.config.SubscriptionProcessorConfig; +import ca.uhn.fhir.jpa.subscription.match.config.WebsocketDispatcherConfig; +import ca.uhn.fhir.jpa.subscription.submit.config.SubscriptionSubmitterConfig; 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 if (fhirVersion == FhirVersionEnum.R5) { - register(FhirServerConfigR5.class, FhirServerConfigCommon.class); - } else { - throw new IllegalStateException(); - } - - if (HapiProperties.getSubscriptionWebsocketEnabled()) { - register(ca.uhn.fhir.jpa.config.WebsocketDispatcherConfig.class); - } - + 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 if (fhirVersion == FhirVersionEnum.R5) { + register(FhirServerConfigR5.class, FhirServerConfigCommon.class); + } else { + throw new IllegalStateException(); } + if (HapiProperties.getSubscriptionWebsocketEnabled()) { + register(WebsocketDispatcherConfig.class); + } + + if (HapiProperties.getSubscriptionEmailEnabled() + || HapiProperties.getSubscriptionRestHookEnabled() + || HapiProperties.getSubscriptionWebsocketEnabled()) { + register(SubscriptionSubmitterConfig.class); + register(SubscriptionProcessorConfig.class); + register(SubscriptionChannelConfig.class); + } + + } + } diff --git a/src/main/java/ca/uhn/fhir/jpa/starter/FhirServerConfigCommon.java b/src/main/java/ca/uhn/fhir/jpa/starter/FhirServerConfigCommon.java index 70bfb4d..74e10d3 100644 --- a/src/main/java/ca/uhn/fhir/jpa/starter/FhirServerConfigCommon.java +++ b/src/main/java/ca/uhn/fhir/jpa/starter/FhirServerConfigCommon.java @@ -1,14 +1,16 @@ package ca.uhn.fhir.jpa.starter; +import ca.uhn.fhir.jpa.api.config.DaoConfig; import ca.uhn.fhir.jpa.binstore.DatabaseBlobBinaryStorageSvcImpl; import ca.uhn.fhir.jpa.binstore.IBinaryStorageSvc; -import ca.uhn.fhir.jpa.dao.DaoConfig; +import ca.uhn.fhir.jpa.model.config.PartitionSettings; import ca.uhn.fhir.jpa.model.entity.ModelConfig; -import ca.uhn.fhir.jpa.subscription.module.channel.SubscriptionDeliveryHandlerFactory; -import ca.uhn.fhir.jpa.subscription.module.subscriber.email.IEmailSender; -import ca.uhn.fhir.jpa.subscription.module.subscriber.email.JavaMailEmailSender; +import ca.uhn.fhir.jpa.subscription.channel.subscription.SubscriptionDeliveryHandlerFactory; +import ca.uhn.fhir.jpa.subscription.match.deliver.email.IEmailSender; +import ca.uhn.fhir.jpa.subscription.match.deliver.email.JavaMailEmailSender; import org.apache.commons.dbcp2.BasicDataSource; import org.hl7.fhir.dstu2.model.Subscription; +import org.springframework.beans.factory.BeanFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @@ -50,9 +52,8 @@ public class FhirServerConfigCommon { private Boolean emailStartTlsEnable = HapiProperties.getEmailStartTlsEnable(); private Boolean emailStartTlsRequired = HapiProperties.getEmailStartTlsRequired(); private Boolean emailQuitWait = HapiProperties.getEmailQuitWait(); - @Autowired - private SubscriptionDeliveryHandlerFactory mySubscriptionDeliveryHandlerFactory; + private ApplicationContext myAppCtx; public FhirServerConfigCommon() { ourLog.info("Server configured to " + (this.allowContainsSearches ? "allow" : "deny") + " contains searches"); @@ -116,15 +117,15 @@ public class FhirServerConfigCommon { // Subscriptions are enabled by channel type if (HapiProperties.getSubscriptionRestHookEnabled()) { ourLog.info("Enabling REST-hook subscriptions"); - retVal.addSupportedSubscriptionType(Subscription.SubscriptionChannelType.RESTHOOK); + retVal.addSupportedSubscriptionType(org.hl7.fhir.dstu2.model.Subscription.SubscriptionChannelType.RESTHOOK); } if (HapiProperties.getSubscriptionEmailEnabled()) { ourLog.info("Enabling email subscriptions"); - retVal.addSupportedSubscriptionType(Subscription.SubscriptionChannelType.EMAIL); + retVal.addSupportedSubscriptionType(org.hl7.fhir.dstu2.model.Subscription.SubscriptionChannelType.EMAIL); } if (HapiProperties.getSubscriptionWebsocketEnabled()) { ourLog.info("Enabling websocket subscriptions"); - retVal.addSupportedSubscriptionType(Subscription.SubscriptionChannelType.WEBSOCKET); + retVal.addSupportedSubscriptionType(org.hl7.fhir.dstu2.model.Subscription.SubscriptionChannelType.WEBSOCKET); } retVal.setFilterParameterEnabled(HapiProperties.getFilterSearchEnabled()); @@ -132,6 +133,12 @@ public class FhirServerConfigCommon { return retVal; } + @Bean + public PartitionSettings partitionSettings() { + return new PartitionSettings(); + } + + @Bean public ModelConfig modelConfig() { ModelConfig modelConfig = new ModelConfig(); @@ -197,8 +204,9 @@ public class FhirServerConfigCommon { // retVal.setStartTlsRequired(this.emailStartTlsRequired); // retVal.setQuitWait(this.emailQuitWait); - Validate.notNull(mySubscriptionDeliveryHandlerFactory, "No subscription delivery handler"); - mySubscriptionDeliveryHandlerFactory.setEmailSender(retVal); + SubscriptionDeliveryHandlerFactory subscriptionDeliveryHandlerFactory = myAppCtx.getBean(SubscriptionDeliveryHandlerFactory.class); + Validate.notNull(subscriptionDeliveryHandlerFactory, "No subscription delivery handler"); + subscriptionDeliveryHandlerFactory.setEmailSender(retVal); return retVal; diff --git a/src/main/java/ca/uhn/fhir/jpa/starter/HapiProperties.java b/src/main/java/ca/uhn/fhir/jpa/starter/HapiProperties.java index 5be55f4..7f7e741 100644 --- a/src/main/java/ca/uhn/fhir/jpa/starter/HapiProperties.java +++ b/src/main/java/ca/uhn/fhir/jpa/starter/HapiProperties.java @@ -485,5 +485,9 @@ public class HapiProperties { public static boolean getBulkExportEnabled() { return HapiProperties.getBooleanProperty(BULK_EXPORT_ENABLED, true); } + + public static boolean isFhirPathFilterInterceptorEnabled() { + return HapiProperties.getBooleanProperty("fhirpath_interceptor.enabled", false); + } } diff --git a/src/main/java/ca/uhn/fhir/jpa/starter/JpaRestfulServer.java b/src/main/java/ca/uhn/fhir/jpa/starter/JpaRestfulServer.java index f5a47f6..d967a70 100644 --- a/src/main/java/ca/uhn/fhir/jpa/starter/JpaRestfulServer.java +++ b/src/main/java/ca/uhn/fhir/jpa/starter/JpaRestfulServer.java @@ -4,11 +4,12 @@ import ca.uhn.fhir.context.FhirContext; import ca.uhn.fhir.context.FhirVersionEnum; import ca.uhn.fhir.interceptor.api.IInterceptorBroadcaster; import ca.uhn.fhir.interceptor.api.IInterceptorService; +import ca.uhn.fhir.jpa.api.config.DaoConfig; +import ca.uhn.fhir.jpa.api.dao.DaoRegistry; +import ca.uhn.fhir.jpa.api.dao.IFhirSystemDao; +import ca.uhn.fhir.jpa.api.rp.ResourceProviderFactory; import ca.uhn.fhir.jpa.binstore.BinaryStorageInterceptor; import ca.uhn.fhir.jpa.bulk.BulkDataExportProvider; -import ca.uhn.fhir.jpa.dao.DaoConfig; -import ca.uhn.fhir.jpa.dao.DaoRegistry; -import ca.uhn.fhir.jpa.dao.IFhirSystemDao; import ca.uhn.fhir.jpa.interceptor.CascadingDeleteInterceptor; import ca.uhn.fhir.jpa.provider.GraphQLProvider; import ca.uhn.fhir.jpa.provider.JpaConformanceProviderDstu2; @@ -22,25 +23,23 @@ import ca.uhn.fhir.jpa.provider.r4.JpaSystemProviderR4; import ca.uhn.fhir.jpa.provider.r5.JpaConformanceProviderR5; import ca.uhn.fhir.jpa.provider.r5.JpaSystemProviderR5; 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.util.ResourceProviderFactory; +import ca.uhn.fhir.jpa.searchparam.registry.ISearchParamRegistry; +import ca.uhn.fhir.jpa.subscription.util.SubscriptionDebugLogInterceptor; import ca.uhn.fhir.model.dstu2.composite.MetaDt; import ca.uhn.fhir.narrative.DefaultThymeleafNarrativeGenerator; import ca.uhn.fhir.rest.server.HardcodedServerAddressStrategy; import ca.uhn.fhir.rest.server.RestfulServer; import ca.uhn.fhir.rest.server.interceptor.CorsInterceptor; +import ca.uhn.fhir.rest.server.interceptor.FhirPathFilterInterceptor; import ca.uhn.fhir.rest.server.interceptor.LoggingInterceptor; import ca.uhn.fhir.rest.server.interceptor.RequestValidatingInterceptor; import ca.uhn.fhir.rest.server.interceptor.ResponseHighlighterInterceptor; import ca.uhn.fhir.rest.server.interceptor.ResponseValidatingInterceptor; import ca.uhn.fhir.validation.IValidatorModule; import ca.uhn.fhir.validation.ResultSeverityEnum; -import java.util.HashSet; -import java.util.TreeSet; import org.hl7.fhir.dstu3.model.Bundle; -import org.hl7.fhir.r4.model.Bundle.BundleType; import org.hl7.fhir.dstu3.model.Meta; +import org.hl7.fhir.r4.model.Bundle.BundleType; import org.springframework.context.ApplicationContext; import org.springframework.http.HttpHeaders; import org.springframework.web.cors.CorsConfiguration; @@ -48,7 +47,9 @@ import org.springframework.web.cors.CorsConfiguration; import javax.servlet.ServletException; import java.util.Arrays; import java.util.Collections; +import java.util.HashSet; import java.util.Set; +import java.util.TreeSet; public class JpaRestfulServer extends RestfulServer { @@ -64,12 +65,12 @@ public class JpaRestfulServer extends RestfulServer { * specified in the properties file. */ ApplicationContext appCtx = (ApplicationContext) getServletContext() - .getAttribute("org.springframework.web.context.WebApplicationContext.ROOT"); + .getAttribute("org.springframework.web.context.WebApplicationContext.ROOT"); // Customize supported resource types Set supportedResourceTypes = HapiProperties.getSupportedResourceTypes(); if (!supportedResourceTypes.isEmpty() && !supportedResourceTypes.contains("SearchParameter")) { - supportedResourceTypes.add("SearchParameter"); + supportedResourceTypes.add("SearchParameter"); } if (!supportedResourceTypes.isEmpty()) { @@ -112,36 +113,32 @@ public class JpaRestfulServer extends RestfulServer { * You can also create your own subclass of the conformance provider if you need to * provide further customization of your server's CapabilityStatement */ + DaoConfig daoConfig = appCtx.getBean(DaoConfig.class); + ISearchParamRegistry searchParamRegistry = appCtx.getBean(ISearchParamRegistry.class); if (fhirVersion == FhirVersionEnum.DSTU2) { - IFhirSystemDao systemDao = appCtx - .getBean("mySystemDaoDstu2", IFhirSystemDao.class); - JpaConformanceProviderDstu2 confProvider = new JpaConformanceProviderDstu2(this, systemDao, - appCtx.getBean(DaoConfig.class)); + IFhirSystemDao systemDao = appCtx.getBean("mySystemDaoDstu2", IFhirSystemDao.class); + JpaConformanceProviderDstu2 confProvider = new JpaConformanceProviderDstu2(this, systemDao, daoConfig); confProvider.setImplementationDescription("HAPI FHIR DSTU2 Server"); setServerConformanceProvider(confProvider); - } else if (fhirVersion == FhirVersionEnum.DSTU3) { - IFhirSystemDao systemDao = appCtx - .getBean("mySystemDaoDstu3", IFhirSystemDao.class); - JpaConformanceProviderDstu3 confProvider = new JpaConformanceProviderDstu3(this, systemDao, - appCtx.getBean(DaoConfig.class)); - confProvider.setImplementationDescription("HAPI FHIR DSTU3 Server"); - setServerConformanceProvider(confProvider); - } else if (fhirVersion == FhirVersionEnum.R4) { - IFhirSystemDao systemDao = appCtx - .getBean("mySystemDaoR4", IFhirSystemDao.class); - JpaConformanceProviderR4 confProvider = new JpaConformanceProviderR4(this, systemDao, - appCtx.getBean(DaoConfig.class)); - confProvider.setImplementationDescription("HAPI FHIR R4 Server"); - setServerConformanceProvider(confProvider); - } else if (fhirVersion == FhirVersionEnum.R5) { - IFhirSystemDao systemDao = appCtx - .getBean("mySystemDaoR5", IFhirSystemDao.class); - JpaConformanceProviderR5 confProvider = new JpaConformanceProviderR5(this, systemDao, - appCtx.getBean(DaoConfig.class)); - confProvider.setImplementationDescription("HAPI FHIR R5 Server"); - setServerConformanceProvider(confProvider); } else { - throw new IllegalStateException(); + if (fhirVersion == FhirVersionEnum.DSTU3) { + IFhirSystemDao systemDao = appCtx.getBean("mySystemDaoDstu3", IFhirSystemDao.class); + JpaConformanceProviderDstu3 confProvider = new JpaConformanceProviderDstu3(this, systemDao, daoConfig, searchParamRegistry); + confProvider.setImplementationDescription("HAPI FHIR DSTU3 Server"); + setServerConformanceProvider(confProvider); + } else if (fhirVersion == FhirVersionEnum.R4) { + IFhirSystemDao systemDao = appCtx.getBean("mySystemDaoR4", IFhirSystemDao.class); + JpaConformanceProviderR4 confProvider = new JpaConformanceProviderR4(this, systemDao, daoConfig, searchParamRegistry); + confProvider.setImplementationDescription("HAPI FHIR R4 Server"); + setServerConformanceProvider(confProvider); + } else if (fhirVersion == FhirVersionEnum.R5) { + IFhirSystemDao systemDao = appCtx.getBean("mySystemDaoR5", IFhirSystemDao.class); + JpaConformanceProviderR5 confProvider = new JpaConformanceProviderR5(this, systemDao, daoConfig, searchParamRegistry); + confProvider.setImplementationDescription("HAPI FHIR R5 Server"); + setServerConformanceProvider(confProvider); + } else { + throw new IllegalStateException(); + } } /* @@ -179,9 +176,12 @@ public class JpaRestfulServer extends RestfulServer { * browser. */ ResponseHighlighterInterceptor responseHighlighterInterceptor = new ResponseHighlighterInterceptor(); - ; this.registerInterceptor(responseHighlighterInterceptor); + if (HapiProperties.isFhirPathFilterInterceptorEnabled()) { + registerInterceptor(new FhirPathFilterInterceptor()); + } + /* * Add some logging for each request */ @@ -218,7 +218,7 @@ public class JpaRestfulServer extends RestfulServer { // manual triggering of a subscription delivery, enable this provider if (false) { // <-- DISABLED RIGHT NOW SubscriptionTriggeringProvider retriggeringProvider = appCtx - .getBean(SubscriptionTriggeringProvider.class); + .getBean(SubscriptionTriggeringProvider.class); registerProvider(retriggeringProvider); } @@ -244,7 +244,7 @@ public class JpaRestfulServer extends RestfulServer { config.addExposedHeader("Location"); config.addExposedHeader("Content-Location"); config.setAllowedMethods( - Arrays.asList("GET", "POST", "PUT", "DELETE", "OPTIONS", "PATCH", "HEAD")); + Arrays.asList("GET", "POST", "PUT", "DELETE", "OPTIONS", "PATCH", "HEAD")); config.setAllowCredentials(HapiProperties.getCorsAllowedCredentials()); // Create the interceptor and register it @@ -255,14 +255,8 @@ public class JpaRestfulServer extends RestfulServer { // 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(); - + HapiProperties.getSubscriptionEmailEnabled() || + HapiProperties.getSubscriptionRestHookEnabled()) { // Subscription debug logging IInterceptorService interceptorService = appCtx.getBean(IInterceptorService.class); interceptorService.registerInterceptor(new SubscriptionDebugLogInterceptor()); @@ -272,40 +266,19 @@ public class JpaRestfulServer extends RestfulServer { DaoRegistry daoRegistry = appCtx.getBean(DaoRegistry.class); IInterceptorBroadcaster interceptorBroadcaster = appCtx.getBean(IInterceptorBroadcaster.class); if (HapiProperties.getAllowCascadingDeletes()) { - CascadingDeleteInterceptor cascadingDeleteInterceptor = new CascadingDeleteInterceptor( - daoRegistry, interceptorBroadcaster); + CascadingDeleteInterceptor cascadingDeleteInterceptor = new CascadingDeleteInterceptor(ctx, daoRegistry, interceptorBroadcaster); getInterceptorService().registerInterceptor(cascadingDeleteInterceptor); } // Binary Storage if (HapiProperties.isBinaryStorageEnabled()) { BinaryStorageInterceptor binaryStorageInterceptor = appCtx - .getBean(BinaryStorageInterceptor.class); + .getBean(BinaryStorageInterceptor.class); getInterceptorService().registerInterceptor(binaryStorageInterceptor); } // Validation - IValidatorModule validatorModule; - switch (fhirVersion) { - case DSTU2: - validatorModule = appCtx.getBean("myInstanceValidatorDstu2", IValidatorModule.class); - break; - case DSTU3: - validatorModule = appCtx.getBean("myInstanceValidatorDstu3", IValidatorModule.class); - break; - case R4: - validatorModule = appCtx.getBean("myInstanceValidatorR4", IValidatorModule.class); - break; - case R5: - validatorModule = appCtx.getBean("myInstanceValidatorR5", IValidatorModule.class); - break; - // These versions are not supported by HAPI FHIR JPA - case DSTU2_HL7ORG: - case DSTU2_1: - default: - validatorModule = null; - break; - } + IValidatorModule validatorModule = appCtx.getBean(IValidatorModule.class); if (validatorModule != null) { if (HapiProperties.getValidateRequestsEnabled()) { RequestValidatingInterceptor interceptor = new RequestValidatingInterceptor(); @@ -335,16 +308,16 @@ public class JpaRestfulServer extends RestfulServer { BundleType type = BundleType.valueOf(o); allowedBundleTypes.add(type.toCode()); }); - DaoConfig config = appCtx.getBean(DaoConfig.class); + DaoConfig config = (DaoConfig) daoConfig; config.setBundleTypesAllowedForStorage( - Collections.unmodifiableSet(new TreeSet<>(allowedBundleTypes))); + Collections.unmodifiableSet(new TreeSet<>(allowedBundleTypes))); } - - // Bulk Export - if (HapiProperties.getBulkExportEnabled()) { - registerProvider(appCtx.getBean(BulkDataExportProvider.class)); - } + // Bulk Export + if (HapiProperties.getBulkExportEnabled()) { + registerProvider(appCtx.getBean(BulkDataExportProvider.class)); } + } + } diff --git a/src/main/resources/hapi.properties b/src/main/resources/hapi.properties index 991bd28..44736f5 100644 --- a/src/main/resources/hapi.properties +++ b/src/main/resources/hapi.properties @@ -61,6 +61,8 @@ validation.responses.enabled=false ################################################### filter_search.enabled=true graphql.enabled=true +# See FhirPathFilterInterceptor +fhirpath_interceptor.enabled=false ################################################### # Supported Resources diff --git a/src/test/java/ca/uhn/fhir/jpa/starter/ExampleServerR5IT.java b/src/test/java/ca/uhn/fhir/jpa/starter/ExampleServerR5IT.java index 80f7a20..3c02375 100644 --- a/src/test/java/ca/uhn/fhir/jpa/starter/ExampleServerR5IT.java +++ b/src/test/java/ca/uhn/fhir/jpa/starter/ExampleServerR5IT.java @@ -14,7 +14,12 @@ import org.eclipse.jetty.websocket.api.Session; import org.eclipse.jetty.websocket.client.ClientUpgradeRequest; import org.eclipse.jetty.websocket.client.WebSocketClient; import org.hl7.fhir.instance.model.api.IIdType; -import org.hl7.fhir.r5.model.*; +import org.hl7.fhir.r5.model.Bundle; +import org.hl7.fhir.r5.model.Enumerations; +import org.hl7.fhir.r5.model.Observation; +import org.hl7.fhir.r5.model.Patient; +import org.hl7.fhir.r5.model.Subscription; +import org.hl7.fhir.r5.model.SubscriptionTopic; import org.junit.AfterClass; import org.junit.BeforeClass; import org.junit.Test; @@ -62,7 +67,7 @@ public class ExampleServerR5IT { /* * Create topic */ - Topic topic = new Topic(); + SubscriptionTopic topic = new SubscriptionTopic(); topic.getResourceTrigger().getQueryCriteria().setCurrent("Observation?status=final"); /* @@ -71,14 +76,11 @@ public class ExampleServerR5IT { Subscription subscription = new Subscription(); subscription.getTopic().setResource(topic); subscription.setReason("Monitor new neonatal function (note, age will be determined by the monitor)"); - subscription.setStatus(Subscription.SubscriptionStatus.REQUESTED); - - Subscription.SubscriptionChannelComponent channel = new Subscription.SubscriptionChannelComponent(); - channel.getType().addCoding() + subscription.setStatus(Enumerations.SubscriptionState.REQUESTED); + subscription.getChannelType() .setSystem("http://terminology.hl7.org/CodeSystem/subscription-channel-type") .setCode("websocket"); - channel.getPayload().setContentType("application/json"); - subscription.setChannel(channel); + subscription.setContentType("application/json"); MethodOutcome methodOutcome = ourClient.create().resource(subscription).execute(); IIdType mySubscriptionId = methodOutcome.getId();