diff --git a/pom.xml b/pom.xml index 4fc7a67..7fd38b6 100644 --- a/pom.xml +++ b/pom.xml @@ -20,6 +20,7 @@ hapi-fhir-jpaserver-starter + 2.5.2 8 diff --git a/src/main/java/ca/uhn/fhir/jpa/starter/Application.java b/src/main/java/ca/uhn/fhir/jpa/starter/Application.java index ea46049..e823d5f 100644 --- a/src/main/java/ca/uhn/fhir/jpa/starter/Application.java +++ b/src/main/java/ca/uhn/fhir/jpa/starter/Application.java @@ -1,6 +1,6 @@ package ca.uhn.fhir.jpa.starter; -import ca.uhn.fhir.jpa.mdm.MdmConfig; +import ca.uhn.fhir.jpa.starter.mdm.MdmConfig; import ca.uhn.fhir.jpa.starter.annotations.OnEitherVersion; import ca.uhn.fhir.jpa.subscription.channel.config.SubscriptionChannelConfig; import ca.uhn.fhir.jpa.subscription.match.config.SubscriptionProcessorConfig; @@ -29,6 +29,15 @@ public class Application extends SpringBootServletInitializer { public static void main(String[] args) { + /* + * https://github.com/hapifhir/hapi-fhir-jpaserver-starter/issues/246 + * This will be allowed for a short period until we know how MDM should be configured + * or don't have multiple equal bean instantiations. + * + * This will require changes in the main project as stated in the Github comment + * */ + System.setProperty("spring.main.allow-bean-definition-overriding","true"); + System.setProperty("spring.batch.job.enabled", "false"); SpringApplication.run(Application.class, args); 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 68f84e8..dc16873 100644 --- a/src/main/java/ca/uhn/fhir/jpa/starter/BaseJpaRestfulServer.java +++ b/src/main/java/ca/uhn/fhir/jpa/starter/BaseJpaRestfulServer.java @@ -24,6 +24,7 @@ import ca.uhn.fhir.jpa.provider.TerminologyUploaderProvider; import ca.uhn.fhir.jpa.provider.dstu3.JpaConformanceProviderDstu3; import ca.uhn.fhir.jpa.search.DatabaseBackedPagingProvider; import ca.uhn.fhir.jpa.subscription.util.SubscriptionDebugLogInterceptor; +import ca.uhn.fhir.mdm.provider.MdmProviderLoader; import ca.uhn.fhir.narrative.DefaultThymeleafNarrativeGenerator; import ca.uhn.fhir.narrative.INarrativeGenerator; import ca.uhn.fhir.narrative2.NullNarrativeGenerator; @@ -46,19 +47,18 @@ import ca.uhn.fhir.validation.IValidatorModule; import ca.uhn.fhir.validation.ResultSeverityEnum; import com.google.common.base.Strings; import com.google.common.collect.ImmutableList; -import org.hl7.fhir.r4.model.Bundle.BundleType; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.context.ApplicationContext; -import org.springframework.http.HttpHeaders; -import org.springframework.web.cors.CorsConfiguration; - -import javax.servlet.ServletException; import java.util.Arrays; import java.util.Collections; import java.util.List; import java.util.Map; import java.util.Optional; import java.util.stream.Collectors; +import javax.servlet.ServletException; +import org.hl7.fhir.r4.model.Bundle.BundleType; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.ApplicationContext; +import org.springframework.http.HttpHeaders; +import org.springframework.web.cors.CorsConfiguration; public class BaseJpaRestfulServer extends RestfulServer { private static final org.slf4j.Logger ourLog = org.slf4j.LoggerFactory.getLogger(BaseJpaRestfulServer.class); @@ -73,7 +73,7 @@ public class BaseJpaRestfulServer extends RestfulServer { @Autowired IFhirSystemDao fhirSystemDao; @Autowired - ResourceProviderFactory resourceProviders; + ResourceProviderFactory resourceProviderFactory; @Autowired IJpaSystemProvider jpaSystemProvider; @Autowired @@ -101,9 +101,13 @@ public class BaseJpaRestfulServer extends RestfulServer { @Autowired(required = false) IRepositoryValidationInterceptorFactory factory; // These are set only if the features are enabled - private CqlProviderLoader cqlProviderLoader; - @Autowired - private IValidationSupport myValidationSupport; + @Autowired + Optional cqlProviderLoader; + @Autowired + Optional mdmProviderProvider; + + @Autowired + private IValidationSupport myValidationSupport; public BaseJpaRestfulServer() { } @@ -127,7 +131,14 @@ public class BaseJpaRestfulServer extends RestfulServer { setFhirContext(fhirSystemDao.getContext()); - registerProviders(resourceProviders.createProviders()); + /* + * Order matters - the MDM provider registers itself on the resourceProviderFactory - hence the loading must be done + * ahead of provider registration + */ + if(appProperties.getMdm_enabled()) + mdmProviderProvider.get().loadProvider(); + + registerProviders(resourceProviderFactory.createProviders()); registerProvider(jpaSystemProvider); /* diff --git a/src/main/java/ca/uhn/fhir/jpa/starter/FhirServerConfigDstu3.java b/src/main/java/ca/uhn/fhir/jpa/starter/FhirServerConfigDstu3.java index a10ecb4..367c0ec 100644 --- a/src/main/java/ca/uhn/fhir/jpa/starter/FhirServerConfigDstu3.java +++ b/src/main/java/ca/uhn/fhir/jpa/starter/FhirServerConfigDstu3.java @@ -5,18 +5,23 @@ import ca.uhn.fhir.jpa.config.BaseJavaConfigDstu3; import ca.uhn.fhir.jpa.search.DatabaseBackedPagingProvider; import ca.uhn.fhir.jpa.search.lastn.ElasticsearchSvcImpl; import ca.uhn.fhir.jpa.starter.annotations.OnDSTU3Condition; +import ca.uhn.fhir.jpa.starter.cql.StarterCqlDstu3Config; +import javax.annotation.PostConstruct; +import javax.persistence.EntityManagerFactory; +import javax.sql.DataSource; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.context.annotation.*; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Conditional; +import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.Import; +import org.springframework.context.annotation.Primary; import org.springframework.core.env.ConfigurableEnvironment; import org.springframework.orm.jpa.JpaTransactionManager; import org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean; -import javax.annotation.PostConstruct; -import javax.persistence.EntityManagerFactory; -import javax.sql.DataSource; - @Configuration @Conditional(OnDSTU3Condition.class) +@Import(StarterCqlDstu3Config.class) public class FhirServerConfigDstu3 extends BaseJavaConfigDstu3 { @Autowired diff --git a/src/main/java/ca/uhn/fhir/jpa/mdm/MdmConfig.java b/src/main/java/ca/uhn/fhir/jpa/starter/mdm/MdmConfig.java similarity index 89% rename from src/main/java/ca/uhn/fhir/jpa/mdm/MdmConfig.java rename to src/main/java/ca/uhn/fhir/jpa/starter/mdm/MdmConfig.java index be17571..301c883 100644 --- a/src/main/java/ca/uhn/fhir/jpa/mdm/MdmConfig.java +++ b/src/main/java/ca/uhn/fhir/jpa/starter/mdm/MdmConfig.java @@ -1,4 +1,4 @@ -package ca.uhn.fhir.jpa.mdm; +package ca.uhn.fhir.jpa.starter.mdm; import ca.uhn.fhir.context.FhirContext; import ca.uhn.fhir.jpa.mdm.config.MdmConsumerConfig; @@ -9,6 +9,7 @@ import ca.uhn.fhir.mdm.rules.config.MdmRuleValidator; import ca.uhn.fhir.mdm.rules.config.MdmSettings; import ca.uhn.fhir.rest.server.util.ISearchParamRegistry; import com.google.common.base.Charsets; +import java.io.IOException; import org.apache.commons.io.IOUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Bean; @@ -18,12 +19,6 @@ import org.springframework.context.annotation.Import; import org.springframework.core.io.DefaultResourceLoader; import org.springframework.core.io.Resource; -import java.io.IOException; - -/** - * TODO: Move this to package "ca.uhn.fhir.jpa.starter" in HAPI FHIR 5.2.0+. The lousy component scan - * in 5.1.0 picks this up even if MDM is disabled currently. - */ @Configuration @Conditional(MdmConfigCondition.class) @Import({MdmConsumerConfig.class, MdmSubmitterConfig.class}) diff --git a/src/main/java/ca/uhn/fhir/jpa/mdm/MdmConfigCondition.java b/src/main/java/ca/uhn/fhir/jpa/starter/mdm/MdmConfigCondition.java similarity index 92% rename from src/main/java/ca/uhn/fhir/jpa/mdm/MdmConfigCondition.java rename to src/main/java/ca/uhn/fhir/jpa/starter/mdm/MdmConfigCondition.java index fd2b7bb..a5c7de0 100644 --- a/src/main/java/ca/uhn/fhir/jpa/mdm/MdmConfigCondition.java +++ b/src/main/java/ca/uhn/fhir/jpa/starter/mdm/MdmConfigCondition.java @@ -1,4 +1,4 @@ -package ca.uhn.fhir.jpa.mdm; +package ca.uhn.fhir.jpa.starter.mdm; import org.springframework.context.annotation.Condition; import org.springframework.context.annotation.ConditionContext; diff --git a/src/main/resources/application.yaml b/src/main/resources/application.yaml index 005ccb9..1ff811a 100644 --- a/src/main/resources/application.yaml +++ b/src/main/resources/application.yaml @@ -81,6 +81,7 @@ hapi: # filter_search_enabled: true # graphql_enabled: true # narrative_enabled: true +# mdm_enabled: true # partitioning: # allow_references_across_partitions: false # partitioning_include_in_search_hashes: false @@ -125,7 +126,7 @@ hapi: # binary_storage_enabled: true # bulk_export_enabled: true # subscription: -# resthook_enabled: false +# resthook_enabled: true # websocket_enabled: false # email: # from: some@test.com