diff --git a/hapi-fhir-jpaserver-examples/hapi-fhir-jpaserver-example-postgres/pom.xml b/hapi-fhir-jpaserver-examples/hapi-fhir-jpaserver-example-postgres/pom.xml index f04b5c597ad..e8ad8294b43 100644 --- a/hapi-fhir-jpaserver-examples/hapi-fhir-jpaserver-example-postgres/pom.xml +++ b/hapi-fhir-jpaserver-examples/hapi-fhir-jpaserver-example-postgres/pom.xml @@ -142,6 +142,12 @@ phloc-schematron + + org.postgresql + postgresql + 9.4.1210.jre7 + + diff --git a/hapi-fhir-jpaserver-examples/hapi-fhir-jpaserver-example-postgres/src/main/java/ca/uhn/fhir/jpa/demo/FhirServerConfig.java b/hapi-fhir-jpaserver-examples/hapi-fhir-jpaserver-example-postgres/src/main/java/ca/uhn/fhir/jpa/demo/FhirServerConfig.java index a2e06509102..4a19ef39012 100644 --- a/hapi-fhir-jpaserver-examples/hapi-fhir-jpaserver-example-postgres/src/main/java/ca/uhn/fhir/jpa/demo/FhirServerConfig.java +++ b/hapi-fhir-jpaserver-examples/hapi-fhir-jpaserver-example-postgres/src/main/java/ca/uhn/fhir/jpa/demo/FhirServerConfig.java @@ -15,16 +15,23 @@ import org.springframework.orm.jpa.JpaTransactionManager; import org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean; import org.springframework.transaction.annotation.EnableTransactionManagement; -import ca.uhn.fhir.jpa.config.BaseJavaConfigDstu2; +import ca.uhn.fhir.jpa.config.BaseJavaConfigDstu3; import ca.uhn.fhir.jpa.dao.DaoConfig; -import ca.uhn.fhir.jpa.util.SubscriptionsRequireManualActivationInterceptorDstu2; +import ca.uhn.fhir.jpa.util.SubscriptionsRequireManualActivationInterceptorDstu3; import ca.uhn.fhir.rest.server.interceptor.IServerInterceptor; import ca.uhn.fhir.rest.server.interceptor.LoggingInterceptor; import ca.uhn.fhir.rest.server.interceptor.ResponseHighlighterInterceptor; +/** + * This class isn't used by default by the example, but + * you can use it as a config if you want to support DSTU3 + * instead of DSTU2 in your server. + * + * See https://github.com/jamesagnew/hapi-fhir/issues/278 + */ @Configuration @EnableTransactionManagement() -public class FhirServerConfig extends BaseJavaConfigDstu2 { +public class FhirServerConfig extends BaseJavaConfigDstu3 { /** * Configure FHIR properties around the the JPA server via this bean @@ -48,10 +55,10 @@ public class FhirServerConfig extends BaseJavaConfigDstu2 { @Bean(destroyMethod = "close") public DataSource dataSource() { BasicDataSource retVal = new BasicDataSource(); - retVal.setDriver(new org.apache.derby.jdbc.EmbeddedDriver()); - retVal.setUrl("jdbc:derby:directory:target/jpaserver_derby_files;create=true"); - retVal.setUsername(""); - retVal.setPassword(""); + retVal.setDriver(new org.postgresql.Driver()); + retVal.setUrl("jdbc:postgresql://localhost:5432/hapi"); + retVal.setUsername("hapi"); + retVal.setPassword("mysecretpassword"); return retVal; } @@ -68,7 +75,7 @@ public class FhirServerConfig extends BaseJavaConfigDstu2 { private Properties jpaProperties() { Properties extraProperties = new Properties(); - extraProperties.put("hibernate.dialect", org.hibernate.dialect.DerbyTenSevenDialect.class.getName()); + extraProperties.put("hibernate.dialect", org.hibernate.dialect.PostgreSQL94Dialect.class.getName()); extraProperties.put("hibernate.format_sql", "true"); extraProperties.put("hibernate.show_sql", "false"); extraProperties.put("hibernate.hbm2ddl.auto", "update"); @@ -80,6 +87,7 @@ public class FhirServerConfig extends BaseJavaConfigDstu2 { extraProperties.put("hibernate.search.default.directory_provider", "filesystem"); extraProperties.put("hibernate.search.default.indexBase", "target/lucenefiles"); extraProperties.put("hibernate.search.lucene_version", "LUCENE_CURRENT"); +// extraProperties.put("hibernate.search.default.worker.execution", "async"); return extraProperties; } @@ -107,7 +115,7 @@ public class FhirServerConfig extends BaseJavaConfigDstu2 { @Bean(autowire = Autowire.BY_TYPE) public IServerInterceptor subscriptionSecurityInterceptor() { - SubscriptionsRequireManualActivationInterceptorDstu2 retVal = new SubscriptionsRequireManualActivationInterceptorDstu2(); + SubscriptionsRequireManualActivationInterceptorDstu3 retVal = new SubscriptionsRequireManualActivationInterceptorDstu3(); return retVal; } diff --git a/hapi-fhir-jpaserver-examples/hapi-fhir-jpaserver-example-postgres/src/main/java/ca/uhn/fhir/jpa/demo/FhirServerConfigDstu3.java b/hapi-fhir-jpaserver-examples/hapi-fhir-jpaserver-example-postgres/src/main/java/ca/uhn/fhir/jpa/demo/FhirServerConfigDstu3.java deleted file mode 100644 index cc3fb3679b1..00000000000 --- a/hapi-fhir-jpaserver-examples/hapi-fhir-jpaserver-example-postgres/src/main/java/ca/uhn/fhir/jpa/demo/FhirServerConfigDstu3.java +++ /dev/null @@ -1,129 +0,0 @@ -package ca.uhn.fhir.jpa.demo; - -import java.util.Properties; - -import javax.persistence.EntityManagerFactory; -import javax.sql.DataSource; - -import org.apache.commons.dbcp2.BasicDataSource; -import org.apache.commons.lang3.time.DateUtils; -import org.hibernate.jpa.HibernatePersistenceProvider; -import org.springframework.beans.factory.annotation.Autowire; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; -import org.springframework.orm.jpa.JpaTransactionManager; -import org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean; -import org.springframework.transaction.annotation.EnableTransactionManagement; - -import ca.uhn.fhir.jpa.config.BaseJavaConfigDstu3; -import ca.uhn.fhir.jpa.dao.DaoConfig; -import ca.uhn.fhir.jpa.util.SubscriptionsRequireManualActivationInterceptorDstu3; -import ca.uhn.fhir.rest.server.interceptor.IServerInterceptor; -import ca.uhn.fhir.rest.server.interceptor.LoggingInterceptor; -import ca.uhn.fhir.rest.server.interceptor.ResponseHighlighterInterceptor; - -/** - * This class isn't used by default by the example, but - * you can use it as a config if you want to support DSTU3 - * instead of DSTU2 in your server. - * - * See https://github.com/jamesagnew/hapi-fhir/issues/278 - */ -@Configuration -@EnableTransactionManagement() -public class FhirServerConfigDstu3 extends BaseJavaConfigDstu3 { - - /** - * Configure FHIR properties around the the JPA server via this bean - */ - @Bean() - public DaoConfig daoConfig() { - DaoConfig retVal = new DaoConfig(); - retVal.setSubscriptionEnabled(true); - retVal.setSubscriptionPollDelay(5000); - retVal.setSubscriptionPurgeInactiveAfterMillis(DateUtils.MILLIS_PER_HOUR); - retVal.setAllowMultipleDelete(true); - return retVal; - } - - /** - * The following bean configures the database connection. The 'url' property value of "jdbc:derby:directory:jpaserver_derby_files;create=true" indicates that the server should save resources in a - * directory called "jpaserver_derby_files". - * - * A URL to a remote database could also be placed here, along with login credentials and other properties supported by BasicDataSource. - */ - @Bean(destroyMethod = "close") - public DataSource dataSource() { - BasicDataSource retVal = new BasicDataSource(); - retVal.setDriver(new org.apache.derby.jdbc.EmbeddedDriver()); - retVal.setUrl("jdbc:derby:directory:target/jpaserver_derby_files;create=true"); - retVal.setUsername(""); - retVal.setPassword(""); - return retVal; - } - - @Bean() - public LocalContainerEntityManagerFactoryBean entityManagerFactory() { - LocalContainerEntityManagerFactoryBean retVal = new LocalContainerEntityManagerFactoryBean(); - retVal.setPersistenceUnitName("HAPI_PU"); - retVal.setDataSource(dataSource()); - retVal.setPackagesToScan("ca.uhn.fhir.jpa.entity"); - retVal.setPersistenceProvider(new HibernatePersistenceProvider()); - retVal.setJpaProperties(jpaProperties()); - return retVal; - } - - private Properties jpaProperties() { - Properties extraProperties = new Properties(); - extraProperties.put("hibernate.dialect", org.hibernate.dialect.DerbyTenSevenDialect.class.getName()); - extraProperties.put("hibernate.format_sql", "true"); - extraProperties.put("hibernate.show_sql", "false"); - extraProperties.put("hibernate.hbm2ddl.auto", "update"); - extraProperties.put("hibernate.jdbc.batch_size", "20"); - extraProperties.put("hibernate.cache.use_query_cache", "false"); - extraProperties.put("hibernate.cache.use_second_level_cache", "false"); - extraProperties.put("hibernate.cache.use_structured_entries", "false"); - extraProperties.put("hibernate.cache.use_minimal_puts", "false"); - extraProperties.put("hibernate.search.default.directory_provider", "filesystem"); - extraProperties.put("hibernate.search.default.indexBase", "target/lucenefiles"); - extraProperties.put("hibernate.search.lucene_version", "LUCENE_CURRENT"); -// extraProperties.put("hibernate.search.default.worker.execution", "async"); - return extraProperties; - } - - /** - * Do some fancy logging to create a nice access log that has details about each incoming request. - */ - public IServerInterceptor loggingInterceptor() { - LoggingInterceptor retVal = new LoggingInterceptor(); - retVal.setLoggerName("fhirtest.access"); - retVal.setMessageFormat( - "Path[${servletPath}] Source[${requestHeader.x-forwarded-for}] Operation[${operationType} ${operationName} ${idOrResourceName}] UA[${requestHeader.user-agent}] Params[${requestParameters}] ResponseEncoding[${responseEncodingNoDefault}]"); - retVal.setLogExceptions(true); - retVal.setErrorMessageFormat("ERROR - ${requestVerb} ${requestUrl}"); - return retVal; - } - - /** - * This interceptor adds some pretty syntax highlighting in responses when a browser is detected - */ - @Bean(autowire = Autowire.BY_TYPE) - public IServerInterceptor responseHighlighterInterceptor() { - ResponseHighlighterInterceptor retVal = new ResponseHighlighterInterceptor(); - return retVal; - } - - @Bean(autowire = Autowire.BY_TYPE) - public IServerInterceptor subscriptionSecurityInterceptor() { - SubscriptionsRequireManualActivationInterceptorDstu3 retVal = new SubscriptionsRequireManualActivationInterceptorDstu3(); - return retVal; - } - - @Bean() - public JpaTransactionManager transactionManager(EntityManagerFactory entityManagerFactory) { - JpaTransactionManager retVal = new JpaTransactionManager(); - retVal.setEntityManagerFactory(entityManagerFactory); - return retVal; - } - -} diff --git a/hapi-fhir-jpaserver-examples/hapi-fhir-jpaserver-example-postgres/src/main/java/ca/uhn/fhir/jpa/demo/JpaServerDemo.java b/hapi-fhir-jpaserver-examples/hapi-fhir-jpaserver-example-postgres/src/main/java/ca/uhn/fhir/jpa/demo/JpaServerDemo.java index 92147e542af..08fc79a9723 100644 --- a/hapi-fhir-jpaserver-examples/hapi-fhir-jpaserver-example-postgres/src/main/java/ca/uhn/fhir/jpa/demo/JpaServerDemo.java +++ b/hapi-fhir-jpaserver-examples/hapi-fhir-jpaserver-example-postgres/src/main/java/ca/uhn/fhir/jpa/demo/JpaServerDemo.java @@ -43,76 +43,39 @@ public class JpaServerDemo extends RestfulServer { super.initialize(); /* - * We want to support FHIR DSTU2 format. This means that the server - * will use the DSTU2 bundle format and other DSTU2 encoding changes. + * We want to support FHIR DSTU3 format. This means that the server + * will use the DSTU3 bundle format and other DSTU3 encoding changes. * - * If you want to use DSTU1 instead, change the following line, and change the 2 occurrences of dstu2 in web.xml to dstu1 + * If you want to use DSTU1 instead, change the following line, and change the 3 occurrences of dstu2 in web.xml to dstu1 */ - FhirVersionEnum fhirVersion = FhirVersionEnum.DSTU2; - setFhirContext(new FhirContext(fhirVersion)); + setFhirContext(FhirContext.forDstu3()); // Get the spring context from the web container (it's declared in web.xml) myAppCtx = ContextLoaderListener.getCurrentWebApplicationContext(); /* - * The BaseJavaConfigDstu2.java class is a spring configuration + * The BaseJavaConfigDstu3.java class is a spring configuration * file which is automatically generated as a part of hapi-fhir-jpaserver-base and * contains bean definitions for a resource provider for each resource type */ - String resourceProviderBeanName; - if (fhirVersion == FhirVersionEnum.DSTU1) { - resourceProviderBeanName = "myResourceProvidersDstu1"; - } else if (fhirVersion == FhirVersionEnum.DSTU2) { - resourceProviderBeanName = "myResourceProvidersDstu2"; - } else if (fhirVersion == FhirVersionEnum.DSTU3) { - resourceProviderBeanName = "myResourceProvidersDstu3"; - } else { - throw new IllegalStateException(); - } - List beans = myAppCtx.getBean(resourceProviderBeanName, List.class); + List beans = myAppCtx.getBean("myResourceProvidersDstu3", List.class); setResourceProviders(beans); /* * The system provider implements non-resource-type methods, such as * transaction, and global history. */ - Object systemProvider; - if (fhirVersion == FhirVersionEnum.DSTU1) { - systemProvider = myAppCtx.getBean("mySystemProviderDstu1", JpaSystemProviderDstu1.class); - } else if (fhirVersion == FhirVersionEnum.DSTU2) { - systemProvider = myAppCtx.getBean("mySystemProviderDstu2", JpaSystemProviderDstu2.class); - } else if (fhirVersion == FhirVersionEnum.DSTU3) { - systemProvider = myAppCtx.getBean("mySystemProviderDstu3", JpaSystemProviderDstu3.class); - } else { - throw new IllegalStateException(); - } - setPlainProviders(systemProvider); + setPlainProviders(myAppCtx.getBean("mySystemProviderDstu3", JpaSystemProviderDstu3.class)); /* * The conformance provider exports the supported resources, search parameters, etc for * this server. The JPA version adds resource counts to the exported statement, so it * is a nice addition. */ - if (fhirVersion == FhirVersionEnum.DSTU1) { - IFhirSystemDao, MetaDt> systemDao = myAppCtx.getBean("mySystemDaoDstu1", IFhirSystemDao.class); - JpaConformanceProviderDstu1 confProvider = new JpaConformanceProviderDstu1(this, systemDao); - confProvider.setImplementationDescription("Example Server"); - setServerConformanceProvider(confProvider); - } else if (fhirVersion == FhirVersionEnum.DSTU2) { - IFhirSystemDao systemDao = myAppCtx.getBean("mySystemDaoDstu2", IFhirSystemDao.class); - JpaConformanceProviderDstu2 confProvider = new JpaConformanceProviderDstu2(this, systemDao, - myAppCtx.getBean(DaoConfig.class)); - confProvider.setImplementationDescription("Example Server"); - setServerConformanceProvider(confProvider); - } else if (fhirVersion == FhirVersionEnum.DSTU3) { - IFhirSystemDao systemDao = myAppCtx.getBean("mySystemDaoDstu3", IFhirSystemDao.class); - JpaConformanceProviderDstu3 confProvider = new JpaConformanceProviderDstu3(this, systemDao, - myAppCtx.getBean(DaoConfig.class)); - confProvider.setImplementationDescription("Example Server"); - setServerConformanceProvider(confProvider); - } else { - throw new IllegalStateException(); - } + IFhirSystemDao systemDao = myAppCtx.getBean("mySystemDaoDstu3", IFhirSystemDao.class); + JpaConformanceProviderDstu3 confProvider = new JpaConformanceProviderDstu3(this, systemDao, myAppCtx.getBean(DaoConfig.class)); + confProvider.setImplementationDescription("Example Server"); + setServerConformanceProvider(confProvider); /* * Enable ETag Support (this is already the default) @@ -163,9 +126,7 @@ public class JpaServerDemo extends RestfulServer { * so it is a potential security vulnerability. Consider using an AuthorizationInterceptor * with this feature. */ - //if (fhirVersion == FhirVersionEnum.DSTU3) { - // registerProvider(myAppCtx.getBean(TerminologyUploaderProviderDstu3.class)); - //} + registerProvider(myAppCtx.getBean(TerminologyUploaderProviderDstu3.class)); } } diff --git a/hapi-fhir-jpaserver-examples/hapi-fhir-jpaserver-example-postgres/src/test/java/.keep b/hapi-fhir-jpaserver-examples/hapi-fhir-jpaserver-example-postgres/src/test/java/.keep new file mode 100644 index 00000000000..e69de29bb2d diff --git a/hapi-fhir-jpaserver-examples/hapi-fhir-jpaserver-example-postgres/src/test/java/ca/uhn/fhir/jpa/demo/ExampleServerIT.java b/hapi-fhir-jpaserver-examples/hapi-fhir-jpaserver-example-postgres/src/test/java/ca/uhn/fhir/jpa/demo/ExampleServerIT.java deleted file mode 100644 index 89a6ac2f06e..00000000000 --- a/hapi-fhir-jpaserver-examples/hapi-fhir-jpaserver-example-postgres/src/test/java/ca/uhn/fhir/jpa/demo/ExampleServerIT.java +++ /dev/null @@ -1,81 +0,0 @@ -package ca.uhn.fhir.jpa.demo; - -import static org.junit.Assert.assertEquals; - -import java.io.File; -import java.io.IOException; - -import org.eclipse.jetty.server.Server; -import org.eclipse.jetty.webapp.WebAppContext; -import org.hl7.fhir.instance.model.api.IIdType; -import org.junit.AfterClass; -import org.junit.BeforeClass; -import org.junit.Test; - -import ca.uhn.fhir.context.FhirContext; -import ca.uhn.fhir.model.dstu2.resource.Patient; -import ca.uhn.fhir.rest.client.IGenericClient; -import ca.uhn.fhir.rest.client.ServerValidationModeEnum; -import ca.uhn.fhir.rest.client.interceptor.LoggingInterceptor; - -public class ExampleServerIT { - - private static IGenericClient ourClient; - private static FhirContext ourCtx = FhirContext.forDstu2(); - private static final org.slf4j.Logger ourLog = org.slf4j.LoggerFactory.getLogger(ExampleServerIT.class); - - private static int ourPort; - - private static Server ourServer; - private static String ourServerBase; - - @Test - public void testCreateAndRead() throws IOException { - String methodName = "testCreateResourceConditional"; - - Patient pt = new Patient(); - pt.addName().addFamily(methodName); - IIdType id = ourClient.create().resource(pt).execute().getId(); - - Patient pt2 = ourClient.read().resource(Patient.class).withId(id).execute(); - assertEquals(methodName, pt2.getName().get(0).getFamily().get(0).getValue()); - } - - @AfterClass - public static void afterClass() throws Exception { - ourServer.stop(); - } - - @BeforeClass - public static void beforeClass() throws Exception { - /* - * This runs under maven, and I'm not sure how else to figure out the target directory from code.. - */ - String path = ExampleServerIT.class.getClassLoader().getResource(".keep_hapi-fhir-jpaserver-example").getPath(); - path = new File(path).getParent(); - path = new File(path).getParent(); - path = new File(path).getParent(); - - ourLog.info("Project base path is: {}", path); - - ourPort = RandomServerPortProvider.findFreePort(); - ourServer = new Server(ourPort); - - WebAppContext webAppContext = new WebAppContext(); - webAppContext.setContextPath("/"); - webAppContext.setDescriptor(path + "/src/main/webapp/WEB-INF/web.xml"); - webAppContext.setResourceBase(path + "/target/hapi-fhir-jpaserver-example"); - webAppContext.setParentLoaderPriority(true); - - ourServer.setHandler(webAppContext); - ourServer.start(); - - ourCtx.getRestfulClientFactory().setServerValidationMode(ServerValidationModeEnum.NEVER); - ourCtx.getRestfulClientFactory().setSocketTimeout(1200 * 1000); - ourServerBase = "http://localhost:" + ourPort + "/baseDstu2"; - ourClient = ourCtx.newRestfulGenericClient(ourServerBase); - ourClient.registerInterceptor(new LoggingInterceptor(true)); - - } - -} diff --git a/hapi-fhir-jpaserver-examples/hapi-fhir-jpaserver-example-postgres/src/test/java/ca/uhn/fhir/jpa/demo/RandomServerPortProvider.java b/hapi-fhir-jpaserver-examples/hapi-fhir-jpaserver-example-postgres/src/test/java/ca/uhn/fhir/jpa/demo/RandomServerPortProvider.java deleted file mode 100644 index c8f4e49757d..00000000000 --- a/hapi-fhir-jpaserver-examples/hapi-fhir-jpaserver-example-postgres/src/test/java/ca/uhn/fhir/jpa/demo/RandomServerPortProvider.java +++ /dev/null @@ -1,36 +0,0 @@ -package ca.uhn.fhir.jpa.demo; - -import java.io.IOException; -import java.net.ServerSocket; -import java.util.ArrayList; -import java.util.List; - -/** - * Provides server ports - */ -public class RandomServerPortProvider { - - private static List ourPorts = new ArrayList(); - - public static int findFreePort() { - ServerSocket server; - try { - server = new ServerSocket(0); - int port = server.getLocalPort(); - ourPorts.add(port); - server.close(); - Thread.sleep(500); - return port; - } catch (IOException e) { - throw new Error(e); - } catch (InterruptedException e) { - throw new Error(e); - } - } - - public static List list() { - return ourPorts; - } - -} - \ No newline at end of file