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