More work on getting legacy code cleaned up

This commit is contained in:
James 2017-07-30 19:31:18 -04:00
parent 0b513b0845
commit e5f6c35aea
21 changed files with 233 additions and 154 deletions

View File

@ -61,11 +61,12 @@ public class BuiltJarDstu2ShadeIT {
* Disabled for now - TODO: add the old version of the apache client (the one that * Disabled for now - TODO: add the old version of the apache client (the one that
* android uses) and see if this passes * android uses) and see if this passes
*/ */
@Test
public void testClient() { public void testClient() {
FhirContext ctx = FhirContext.forDstu2(); FhirContext ctx = FhirContext.forDstu2();
try { try {
IGenericClient client = ctx.newRestfulGenericClient("http://127.0.0.1:44442/SomeBase"); IGenericClient client = ctx.newRestfulGenericClient("http://127.0.0.1:44442/SomeBase");
client.capabilities().ofType(Conformance.class).execute() client.capabilities().ofType(Conformance.class).execute();
} catch (FhirClientConnectionException e) { } catch (FhirClientConnectionException e) {
// this is good // this is good
} }

View File

@ -1,36 +0,0 @@
package ca.uhn.fhir.rest.annotation;
/*
* #%L
* HAPI FHIR - Core Library
* %%
* Copyright (C) 2014 - 2017 University Health Network
* %%
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
* #L%
*/
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
/**
* @deprecated IdDt can now hold both an ID and a version ID, so a single parameter with the {@link IdParam} annotation may be used
*/
@Deprecated
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.PARAMETER)
public @interface VersionIdParam {
// just a marker
}

View File

@ -212,10 +212,6 @@ public class ParameterUtil {
return findParamAnnotationIndex(theMethod, TagListParam.class); return findParamAnnotationIndex(theMethod, TagListParam.class);
} }
public static Integer findVersionIdParameterIndex(Method theMethod) {
return findParamAnnotationIndex(theMethod, VersionIdParam.class);
}
public static Object fromInteger(Class<?> theType, IntegerDt theArgument) { public static Object fromInteger(Class<?> theType, IntegerDt theArgument) {
if (theType.equals(IntegerDt.class)) { if (theType.equals(IntegerDt.class)) {
if (theArgument == null) { if (theArgument == null) {

View File

@ -62,6 +62,13 @@
</execution> </execution>
</executions> </executions>
</plugin> </plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<configuration>
<argLine>${argLine} -Dfile.encoding=UTF-8 -Xmx712m</argLine>
</configuration>
</plugin>
</plugins> </plugins>
</build> </build>

View File

@ -51,12 +51,6 @@ public abstract class BaseOutcomeReturningMethodBindingWithResourceIdButNoResour
throw new ConfigurationException("Method '" + theMethod.getName() + "' on type '" + theMethod.getDeclaringClass().getCanonicalName() + "' has no parameter annotated with the @" + IdParam.class.getSimpleName() + " annotation"); throw new ConfigurationException("Method '" + theMethod.getName() + "' on type '" + theMethod.getDeclaringClass().getCanonicalName() + "' has no parameter annotated with the @" + IdParam.class.getSimpleName() + " annotation");
} }
Integer versionIdParameterIndex = ParameterUtil.findVersionIdParameterIndex(theMethod);
if (versionIdParameterIndex != null) {
//TODO Use of a deprecated method should be resolved
throw new ConfigurationException("Method '" + theMethod.getName() + "' on type '" + theMethod.getDeclaringClass().getCanonicalName() + "' has a parameter annotated with the @" + VersionIdParam.class.getSimpleName() + " annotation but delete methods may not have this annotation");
}
} }
@Override @Override

View File

@ -313,7 +313,7 @@ public class MethodUtil {
throw new ConfigurationException(b.toString()); throw new ConfigurationException(b.toString());
} }
param = new ResourceParameter(parameterType); param = new ResourceParameter(parameterType);
} else if (nextAnnotation instanceof IdParam || nextAnnotation instanceof VersionIdParam) { } else if (nextAnnotation instanceof IdParam) {
param = new NullParameter(); param = new NullParameter();
} else if (nextAnnotation instanceof ServerBase) { } else if (nextAnnotation instanceof ServerBase) {
param = new ServerBaseParamBinder(); param = new ServerBaseParamBinder();

View File

@ -41,7 +41,6 @@ import ca.uhn.fhir.rest.server.exceptions.BaseServerResponseException;
public class ReadMethodBinding extends BaseResourceReturningMethodBinding implements IClientResponseHandlerHandlesBinary<Object> { public class ReadMethodBinding extends BaseResourceReturningMethodBinding implements IClientResponseHandlerHandlesBinary<Object> {
private Integer myIdIndex; private Integer myIdIndex;
private boolean mySupportsVersion; private boolean mySupportsVersion;
private Integer myVersionIdIndex;
private Class<? extends IIdType> myIdParameterType; private Class<? extends IIdType> myIdParameterType;
@SuppressWarnings("unchecked") @SuppressWarnings("unchecked")
@ -51,13 +50,11 @@ public class ReadMethodBinding extends BaseResourceReturningMethodBinding implem
Validate.notNull(theMethod, "Method must not be null"); Validate.notNull(theMethod, "Method must not be null");
Integer idIndex = ParameterUtil.findIdParameterIndex(theMethod, getContext()); Integer idIndex = ParameterUtil.findIdParameterIndex(theMethod, getContext());
Integer versionIdIndex = ParameterUtil.findVersionIdParameterIndex(theMethod);
Class<?>[] parameterTypes = theMethod.getParameterTypes(); Class<?>[] parameterTypes = theMethod.getParameterTypes();
mySupportsVersion = theMethod.getAnnotation(Read.class).version(); mySupportsVersion = theMethod.getAnnotation(Read.class).version();
myIdIndex = idIndex; myIdIndex = idIndex;
myVersionIdIndex = versionIdIndex;
if (myIdIndex == null) { if (myIdIndex == null) {
throw new ConfigurationException("@" + Read.class.getSimpleName() + " method " + theMethod.getName() + " on type \"" + theMethod.getDeclaringClass().getName() throw new ConfigurationException("@" + Read.class.getSimpleName() + " method " + theMethod.getName() + " on type \"" + theMethod.getDeclaringClass().getName()
@ -68,9 +65,6 @@ public class ReadMethodBinding extends BaseResourceReturningMethodBinding implem
if (!IIdType.class.isAssignableFrom(myIdParameterType)) { if (!IIdType.class.isAssignableFrom(myIdParameterType)) {
throw new ConfigurationException("ID parameter must be of type IdDt or IdType - Found: " + myIdParameterType); throw new ConfigurationException("ID parameter must be of type IdDt or IdType - Found: " + myIdParameterType);
} }
if (myVersionIdIndex != null && !IdDt.class.equals(parameterTypes[myVersionIdIndex])) {
throw new ConfigurationException("Version ID parameter must be of type: " + IdDt.class.getCanonicalName() + " - Found: " + parameterTypes[myVersionIdIndex]);
}
} }
@ -96,19 +90,12 @@ public class ReadMethodBinding extends BaseResourceReturningMethodBinding implem
public HttpGetClientInvocation invokeClient(Object[] theArgs) { public HttpGetClientInvocation invokeClient(Object[] theArgs) {
HttpGetClientInvocation retVal; HttpGetClientInvocation retVal;
IIdType id = ((IIdType) theArgs[myIdIndex]); IIdType id = ((IIdType) theArgs[myIdIndex]);
if (myVersionIdIndex == null) {
String resourceName = getResourceName(); String resourceName = getResourceName();
if (id.hasVersionIdPart()) { if (id.hasVersionIdPart()) {
retVal = createVReadInvocation(getContext(), new IdDt(resourceName, id.getIdPart(), id.getVersionIdPart()), resourceName); retVal = createVReadInvocation(getContext(), new IdDt(resourceName, id.getIdPart(), id.getVersionIdPart()), resourceName);
} else { } else {
retVal = createReadInvocation(getContext(), id, resourceName); retVal = createReadInvocation(getContext(), id, resourceName);
} }
} else {
IdDt vid = ((IdDt) theArgs[myVersionIdIndex]);
String resourceName = getResourceName();
retVal = createVReadInvocation(getContext(), new IdDt(resourceName, id.getIdPart(), vid.getVersionIdPart()), resourceName);
}
for (int idx = 0; idx < theArgs.length; idx++) { for (int idx = 0; idx < theArgs.length; idx++) {
IParameter nextParam = getParameters().get(idx); IParameter nextParam = getParameters().get(idx);
@ -146,7 +133,7 @@ public class ReadMethodBinding extends BaseResourceReturningMethodBinding implem
} }
public boolean isVread() { public boolean isVread() {
return mySupportsVersion || myVersionIdIndex != null; return mySupportsVersion;
} }
public static HttpGetClientInvocation createAbsoluteReadInvocation(FhirContext theContext, IIdType theId) { public static HttpGetClientInvocation createAbsoluteReadInvocation(FhirContext theContext, IIdType theId) {

View File

@ -21,6 +21,16 @@
<artifactId>hapi-fhir-base</artifactId> <artifactId>hapi-fhir-base</artifactId>
<version>${project.version}</version> <version>${project.version}</version>
</dependency> </dependency>
<dependency>
<groupId>ca.uhn.hapi.fhir</groupId>
<artifactId>hapi-fhir-server</artifactId>
<version>${project.version}</version>
</dependency>
<dependency>
<groupId>ca.uhn.hapi.fhir</groupId>
<artifactId>hapi-fhir-client</artifactId>
<version>${project.version}</version>
</dependency>
<dependency> <dependency>
<groupId>ca.uhn.hapi.fhir</groupId> <groupId>ca.uhn.hapi.fhir</groupId>
<artifactId>hapi-fhir-structures-dstu2</artifactId> <artifactId>hapi-fhir-structures-dstu2</artifactId>
@ -31,6 +41,11 @@
<artifactId>hapi-fhir-structures-dstu3</artifactId> <artifactId>hapi-fhir-structures-dstu3</artifactId>
<version>${project.version}</version> <version>${project.version}</version>
</dependency> </dependency>
<dependency>
<groupId>ca.uhn.hapi.fhir</groupId>
<artifactId>hapi-fhir-structures-r4</artifactId>
<version>${project.version}</version>
</dependency>
<dependency> <dependency>
<groupId>ca.uhn.hapi.fhir</groupId> <groupId>ca.uhn.hapi.fhir</groupId>
<artifactId>hapi-fhir-structures-hl7org-dstu2</artifactId> <artifactId>hapi-fhir-structures-hl7org-dstu2</artifactId>
@ -265,9 +280,11 @@
<include>hapi-fhir-structures-dstu2/target/jacoco.exec</include> <include>hapi-fhir-structures-dstu2/target/jacoco.exec</include>
<include>hapi-fhir-structures-hl7org-dstu2/target/jacoco.exec</include> <include>hapi-fhir-structures-hl7org-dstu2/target/jacoco.exec</include>
<include>hapi-fhir-structures-dstu3/target/jacoco.exec</include> <include>hapi-fhir-structures-dstu3/target/jacoco.exec</include>
<include>hapi-fhir-structures-r4/target/jacoco.exec</include>
<include>hapi-fhir-jpaserver-base/target/jacoco.exec</include> <include>hapi-fhir-jpaserver-base/target/jacoco.exec</include>
<include>hapi-fhir-client-okhttp/target/jacoco.exec</include> <include>hapi-fhir-client-okhttp/target/jacoco.exec</include>
<include>hapi-fhir-android/target/jacoco.exec</include> <include>hapi-fhir-android/target/jacoco.exec</include>
<include>hapi-fhir-validation/target/jacoco.exec</include>
</includes> </includes>
</fileSet> </fileSet>
</fileSets> </fileSets>
@ -290,6 +307,7 @@
<sourceDirectory>../hapi-fhir-structures-dstu2/src/test/java</sourceDirectory> <sourceDirectory>../hapi-fhir-structures-dstu2/src/test/java</sourceDirectory>
<sourceDirectory>../hapi-fhir-structures-hl7org-dstu2/src/test/java</sourceDirectory> <sourceDirectory>../hapi-fhir-structures-hl7org-dstu2/src/test/java</sourceDirectory>
<sourceDirectory>../hapi-fhir-structures-dstu3/src/test/java</sourceDirectory> <sourceDirectory>../hapi-fhir-structures-dstu3/src/test/java</sourceDirectory>
<sourceDirectory>../hapi-fhir-structures-r4/src/test/java</sourceDirectory>
<sourceDirectory>../hapi-fhir-jpaserver-base/src/main/java</sourceDirectory> <sourceDirectory>../hapi-fhir-jpaserver-base/src/main/java</sourceDirectory>
<sourceDirectory>../hapi-fhir-client-okhttp/src/main/java</sourceDirectory> <sourceDirectory>../hapi-fhir-client-okhttp/src/main/java</sourceDirectory>
</sourceDirectories> </sourceDirectories>
@ -359,22 +377,6 @@
</build> </build>
<reporting> <reporting>
<plugins> <plugins>
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>cobertura-maven-plugin</artifactId>
<reportSets>
<reportSet>
<reports>
<report>cobertura</report>
</reports>
<configuration>
<check>
<haltOnFailure>true</haltOnFailure>
</check>
</configuration>
</reportSet>
</reportSets>
</plugin>
<plugin> <plugin>
<groupId>org.apache.maven.plugins</groupId> <groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-project-info-reports-plugin</artifactId> <artifactId>maven-project-info-reports-plugin</artifactId>

View File

@ -239,8 +239,8 @@
<groupId>org.apache.maven.plugins</groupId> <groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId> <artifactId>maven-compiler-plugin</artifactId>
<configuration> <configuration>
<source>1.6</source> <source>1.7</source>
<target>1.6</target> <target>1.7</target>
</configuration> </configuration>
</plugin> </plugin>

View File

@ -56,9 +56,7 @@ public class JpaServerDemoDstu2 extends RestfulServer {
* contains bean definitions for a resource provider for each resource type * contains bean definitions for a resource provider for each resource type
*/ */
String resourceProviderBeanName; String resourceProviderBeanName;
if (fhirVersion == FhirVersionEnum.DSTU1) { if (fhirVersion == FhirVersionEnum.DSTU2) {
resourceProviderBeanName = "myResourceProvidersDstu1";
} else if (fhirVersion == FhirVersionEnum.DSTU2) {
resourceProviderBeanName = "myResourceProvidersDstu2"; resourceProviderBeanName = "myResourceProvidersDstu2";
} else if (fhirVersion == FhirVersionEnum.DSTU3) { } else if (fhirVersion == FhirVersionEnum.DSTU3) {
resourceProviderBeanName = "myResourceProvidersDstu3"; resourceProviderBeanName = "myResourceProvidersDstu3";

View File

@ -15,11 +15,13 @@ import org.springframework.web.cors.CorsConfiguration;
import ca.uhn.fhir.context.FhirContext; import ca.uhn.fhir.context.FhirContext;
import ca.uhn.fhir.jpa.config.WebsocketDstu2DispatcherConfig; import ca.uhn.fhir.jpa.config.WebsocketDstu2DispatcherConfig;
import ca.uhn.fhir.jpa.config.dstu3.WebsocketDstu3DispatcherConfig; import ca.uhn.fhir.jpa.config.dstu3.WebsocketDstu3DispatcherConfig;
import ca.uhn.fhir.jpa.config.r4.WebsocketR4DispatcherConfig;
import ca.uhn.fhir.jpa.dao.DaoConfig; import ca.uhn.fhir.jpa.dao.DaoConfig;
import ca.uhn.fhir.jpa.dao.IFhirSystemDao; import ca.uhn.fhir.jpa.dao.IFhirSystemDao;
import ca.uhn.fhir.jpa.provider.JpaConformanceProviderDstu2; import ca.uhn.fhir.jpa.provider.JpaConformanceProviderDstu2;
import ca.uhn.fhir.jpa.provider.JpaSystemProviderDstu2; import ca.uhn.fhir.jpa.provider.JpaSystemProviderDstu2;
import ca.uhn.fhir.jpa.provider.dstu3.*; import ca.uhn.fhir.jpa.provider.dstu3.*;
import ca.uhn.fhir.jpa.provider.r4.TerminologyUploaderProviderR4;
import ca.uhn.fhir.jpa.search.DatabaseBackedPagingProvider; import ca.uhn.fhir.jpa.search.DatabaseBackedPagingProvider;
import ca.uhn.fhir.narrative.DefaultThymeleafNarrativeGenerator; import ca.uhn.fhir.narrative.DefaultThymeleafNarrativeGenerator;
import ca.uhn.fhir.rest.api.EncodingEnum; import ca.uhn.fhir.rest.api.EncodingEnum;
@ -29,7 +31,7 @@ import ca.uhn.fhirtest.config.*;
public class TestRestfulServer extends RestfulServer { public class TestRestfulServer extends RestfulServer {
public static final String FHIR_BASEURL_DSTU1 = "fhir.baseurl.dstu1"; public static final String FHIR_BASEURL_R4 = "fhir.baseurl.r4";
public static final String FHIR_BASEURL_DSTU2 = "fhir.baseurl.dstu2"; public static final String FHIR_BASEURL_DSTU2 = "fhir.baseurl.dstu2";
public static final String FHIR_BASEURL_DSTU3 = "fhir.baseurl.dstu3"; public static final String FHIR_BASEURL_DSTU3 = "fhir.baseurl.dstu3";
public static final String FHIR_BASEURL_TDL2 = "fhir.baseurl.tdl2"; public static final String FHIR_BASEURL_TDL2 = "fhir.baseurl.tdl2";
@ -114,6 +116,24 @@ public class TestRestfulServer extends RestfulServer {
plainProviders.add(myAppCtx.getBean(TerminologyUploaderProviderDstu3.class)); plainProviders.add(myAppCtx.getBean(TerminologyUploaderProviderDstu3.class));
break; break;
} }
case "R4": {
myAppCtx = new AnnotationConfigWebApplicationContext();
myAppCtx.setServletConfig(getServletConfig());
myAppCtx.setParent(parentAppCtx);
myAppCtx.register(TestR4Config.class, WebsocketR4DispatcherConfig.class);
baseUrlProperty = FHIR_BASEURL_R4;
myAppCtx.refresh();
setFhirContext(FhirContext.forR4());
beans = myAppCtx.getBean("myResourceProvidersR4", List.class);
plainProviders.add(myAppCtx.getBean("mySystemProviderR4", JpaSystemProviderDstu3.class));
systemDao = myAppCtx.getBean("mySystemDaoR4", IFhirSystemDao.class);
etagSupport = ETagSupportEnum.ENABLED;
JpaConformanceProviderDstu3 confProvider = new JpaConformanceProviderDstu3(this, systemDao, myAppCtx.getBean(DaoConfig.class));
confProvider.setImplementationDescription(implDesc);
setServerConformanceProvider(confProvider);
plainProviders.add(myAppCtx.getBean(TerminologyUploaderProviderR4.class));
break;
}
default: default:
throw new ServletException("Unknown FHIR version specified in init-param[FhirVersion]: " + fhirVersionParam); throw new ServletException("Unknown FHIR version specified in init-param[FhirVersion]: " + fhirVersionParam);
} }

View File

@ -1,10 +1,7 @@
package ca.uhn.fhirtest.config; package ca.uhn.fhirtest.config;
import org.springframework.beans.factory.annotation.Autowire; import org.springframework.beans.factory.annotation.Autowire;
import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.*;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Import;
import ca.uhn.fhir.context.FhirVersionEnum; import ca.uhn.fhir.context.FhirVersionEnum;
import ca.uhn.fhir.to.FhirTesterMvcConfig; import ca.uhn.fhir.to.FhirTesterMvcConfig;
@ -56,10 +53,10 @@ public class FhirTesterConfig {
.withBaseUrl("http://fhirtest.uhn.ca/baseDstu2") .withBaseUrl("http://fhirtest.uhn.ca/baseDstu2")
.withName("UHN/HAPI Server (DSTU2 FHIR)") .withName("UHN/HAPI Server (DSTU2 FHIR)")
.addServer() .addServer()
.withId("home") .withId("home_r4")
.withFhirVersion(FhirVersionEnum.DSTU1) .withFhirVersion(FhirVersionEnum.R4)
.withBaseUrl("http://fhirtest.uhn.ca/baseDstu1") .withBaseUrl("http://fhirtest.uhn.ca/baseR4")
.withName("UHN/HAPI Server (DSTU1 FHIR)") .withName("UHN/HAPI Server (R4 FHIR)")
// .addServer() // .addServer()
// .withId("tdl_d2") // .withId("tdl_d2")
// .withFhirVersion(FhirVersionEnum.DSTU2) // .withFhirVersion(FhirVersionEnum.DSTU2)
@ -72,6 +69,11 @@ public class FhirTesterConfig {
// .withBaseUrl("http://fhirtest.uhn.ca/testDataLibraryStu3") // .withBaseUrl("http://fhirtest.uhn.ca/testDataLibraryStu3")
// .withName("Test Data Library (DSTU3 FHIR)") // .withName("Test Data Library (DSTU3 FHIR)")
// .allowsApiKey() // .allowsApiKey()
.addServer()
.withId("hi4")
.withFhirVersion(FhirVersionEnum.DSTU3)
.withBaseUrl("http://test.fhir.org/r4")
.withName("Health Intersections (R4 FHIR)")
.addServer() .addServer()
.withId("hi3") .withId("hi3")
.withFhirVersion(FhirVersionEnum.DSTU3) .withFhirVersion(FhirVersionEnum.DSTU3)

View File

@ -7,7 +7,6 @@ import javax.sql.DataSource;
import org.apache.commons.dbcp2.BasicDataSource; import org.apache.commons.dbcp2.BasicDataSource;
import org.apache.commons.lang3.time.DateUtils; import org.apache.commons.lang3.time.DateUtils;
import org.hibernate.dialect.DerbyTenSevenDialect;
import org.hibernate.dialect.PostgreSQL94Dialect; import org.hibernate.dialect.PostgreSQL94Dialect;
import org.hibernate.jpa.HibernatePersistenceProvider; import org.hibernate.jpa.HibernatePersistenceProvider;
import org.springframework.beans.factory.annotation.Autowire; import org.springframework.beans.factory.annotation.Autowire;
@ -21,7 +20,6 @@ import org.springframework.transaction.annotation.EnableTransactionManagement;
import ca.uhn.fhir.jpa.config.BaseJavaConfigDstu3; import ca.uhn.fhir.jpa.config.BaseJavaConfigDstu3;
import ca.uhn.fhir.jpa.dao.DaoConfig; import ca.uhn.fhir.jpa.dao.DaoConfig;
import ca.uhn.fhir.jpa.search.DatabaseBackedPagingProvider; import ca.uhn.fhir.jpa.search.DatabaseBackedPagingProvider;
import ca.uhn.fhir.jpa.util.SubscriptionsRequireManualActivationInterceptorDstu3;
import ca.uhn.fhir.rest.server.interceptor.IServerInterceptor; import ca.uhn.fhir.rest.server.interceptor.IServerInterceptor;
import ca.uhn.fhir.rest.server.interceptor.RequestValidatingInterceptor; import ca.uhn.fhir.rest.server.interceptor.RequestValidatingInterceptor;
import ca.uhn.fhir.validation.ResultSeverityEnum; import ca.uhn.fhir.validation.ResultSeverityEnum;

View File

@ -0,0 +1,143 @@
package ca.uhn.fhirtest.config;
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.dialect.PostgreSQL95Dialect;
import org.hibernate.jpa.HibernatePersistenceProvider;
import org.springframework.beans.factory.annotation.Autowire;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.*;
import org.springframework.context.support.PropertySourcesPlaceholderConfigurer;
import org.springframework.orm.jpa.JpaTransactionManager;
import org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean;
import org.springframework.transaction.annotation.EnableTransactionManagement;
import ca.uhn.fhir.jpa.config.BaseJavaConfigR4;
import ca.uhn.fhir.jpa.dao.DaoConfig;
import ca.uhn.fhir.jpa.search.DatabaseBackedPagingProvider;
import ca.uhn.fhir.rest.server.interceptor.IServerInterceptor;
import ca.uhn.fhir.rest.server.interceptor.RequestValidatingInterceptor;
import ca.uhn.fhir.validation.ResultSeverityEnum;
import ca.uhn.fhirtest.interceptor.PublicSecurityInterceptor;
@Configuration
@Import(CommonConfig.class)
@EnableTransactionManagement()
public class TestR4Config extends BaseJavaConfigR4 {
public static final String FHIR_DB_USERNAME = "${fhir.db.username}";
public static final String FHIR_DB_PASSWORD = "${fhir.db.password}";
public static final String FHIR_LUCENE_LOCATION_R4 = "${fhir.lucene.location.r4}";
@Value(TestR4Config.FHIR_DB_USERNAME)
private String myDbUsername;
@Value(TestR4Config.FHIR_DB_PASSWORD)
private String myDbPassword;
@Value(FHIR_LUCENE_LOCATION_R4)
private String myFhirLuceneLocation;
@Bean()
public DaoConfig daoConfig() {
DaoConfig retVal = new DaoConfig();
retVal.setSubscriptionEnabled(true);
retVal.setSubscriptionPollDelay(5000);
retVal.setSubscriptionPurgeInactiveAfterMillis(DateUtils.MILLIS_PER_HOUR);
retVal.setAllowMultipleDelete(true);
retVal.setAllowInlineMatchUrlReferences(true);
retVal.setAllowExternalReferences(true);
retVal.getTreatBaseUrlsAsLocal().add("http://fhirtest.uhn.ca/baseR4");
retVal.getTreatBaseUrlsAsLocal().add("https://fhirtest.uhn.ca/baseR4");
return retVal;
}
@Override
@Bean(autowire = Autowire.BY_TYPE)
public DatabaseBackedPagingProvider databaseBackedPagingProvider() {
DatabaseBackedPagingProvider retVal = super.databaseBackedPagingProvider();
retVal.setDefaultPageSize(20);
retVal.setMaximumPageSize(500);
return retVal;
}
@Bean
public IServerInterceptor securityInterceptor() {
return new PublicSecurityInterceptor();
}
@Bean(name = "myPersistenceDataSourceR4", destroyMethod = "close")
public DataSource dataSource() {
BasicDataSource retVal = new BasicDataSource();
retVal.setDriver(new org.postgresql.Driver());
retVal.setUrl("jdbc:postgresql://localhost/fhirtest_r4");
retVal.setUsername(myDbUsername);
retVal.setPassword(myDbPassword);
return retVal;
}
@Bean()
public LocalContainerEntityManagerFactoryBean entityManagerFactory() {
LocalContainerEntityManagerFactoryBean retVal = new LocalContainerEntityManagerFactoryBean();
retVal.setPersistenceUnitName("PU_HapiFhirJpaR4");
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", PostgreSQL95Dialect.class.getName());
extraProperties.put("hibernate.format_sql", "false");
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", myFhirLuceneLocation);
extraProperties.put("hibernate.search.lucene_version", "LUCENE_CURRENT");
return extraProperties;
}
/**
* Bean which validates incoming requests
*/
@Bean
@Lazy
public RequestValidatingInterceptor requestValidatingInterceptor() {
RequestValidatingInterceptor requestValidator = new RequestValidatingInterceptor();
requestValidator.setFailOnSeverity(null);
requestValidator.setAddResponseHeaderOnSeverity(null);
requestValidator.setAddResponseOutcomeHeaderOnSeverity(ResultSeverityEnum.INFORMATION);
requestValidator.addValidatorModule(instanceValidatorR4());
requestValidator.setIgnoreValidatorExceptions(true);
return requestValidator;
}
@Bean()
public JpaTransactionManager transactionManager(EntityManagerFactory entityManagerFactory) {
JpaTransactionManager retVal = new JpaTransactionManager();
retVal.setEntityManagerFactory(entityManagerFactory);
return retVal;
}
/**
* This lets the "@Value" fields reference properties from the properties file
*/
@Bean
public static PropertySourcesPlaceholderConfigurer propertySourcesPlaceholderConfigurer() {
return new PropertySourcesPlaceholderConfigurer();
}
}

View File

@ -19,6 +19,7 @@ import ca.uhn.fhir.to.model.HomeRequest;
public class SubscriptionPlaygroundController extends BaseController { public class SubscriptionPlaygroundController extends BaseController {
private static final org.slf4j.Logger ourLog = org.slf4j.LoggerFactory.getLogger(SubscriptionPlaygroundController.class); private static final org.slf4j.Logger ourLog = org.slf4j.LoggerFactory.getLogger(SubscriptionPlaygroundController.class);
@SuppressWarnings("unchecked")
@RequestMapping(value = { "/subscriptions" }) @RequestMapping(value = { "/subscriptions" })
public String subscriptionsHome(final HttpServletRequest theServletRequest, HomeRequest theRequest, final ModelMap theModel) { public String subscriptionsHome(final HttpServletRequest theServletRequest, HomeRequest theRequest, final ModelMap theModel) {
addCommonParams(theServletRequest, theRequest, theModel); addCommonParams(theServletRequest, theRequest, theModel);
@ -31,8 +32,7 @@ public class SubscriptionPlaygroundController extends BaseController {
CaptureInterceptor interceptor = new CaptureInterceptor(); CaptureInterceptor interceptor = new CaptureInterceptor();
GenericClient client = theRequest.newClient(theServletRequest, getContext(theRequest), myConfig, interceptor); GenericClient client = theRequest.newClient(theServletRequest, getContext(theRequest), myConfig, interceptor);
//@formatter:off Bundle resp = (Bundle) client
Bundle resp = client
.search() .search()
.forResource(Subscription.class) .forResource(Subscription.class)
// .where(Subscription.TYPE.exactly().code(SubscriptionChannelTypeEnum.WEBSOCKET.getCode())) // .where(Subscription.TYPE.exactly().code(SubscriptionChannelTypeEnum.WEBSOCKET.getCode()))
@ -41,7 +41,6 @@ public class SubscriptionPlaygroundController extends BaseController {
.sort().ascending(Subscription.STATUS) .sort().ascending(Subscription.STATUS)
.returnBundle(Bundle.class) .returnBundle(Bundle.class)
.execute(); .execute();
//@formatter:off
List<Subscription> subscriptions = new ArrayList<Subscription>(); List<Subscription> subscriptions = new ArrayList<Subscription>();
for (Entry next : resp.getEntry()) { for (Entry next : resp.getEntry()) {

View File

@ -41,15 +41,15 @@
</servlet> </servlet>
<servlet> <servlet>
<servlet-name>fhirServletDstu1</servlet-name> <servlet-name>fhirServletR4</servlet-name>
<servlet-class>ca.uhn.fhirtest.TestRestfulServer</servlet-class> <servlet-class>ca.uhn.fhirtest.TestRestfulServer</servlet-class>
<init-param> <init-param>
<param-name>ImplementationDescription</param-name> <param-name>ImplementationDescription</param-name>
<param-value>UHN Test Server (DSTU1 Resources)</param-value> <param-value>UHN Test Server (R4 Resources)</param-value>
</init-param> </init-param>
<init-param> <init-param>
<param-name>FhirVersion</param-name> <param-name>FhirVersion</param-name>
<param-value>DSTU1</param-value> <param-value>R4</param-value>
</init-param> </init-param>
<load-on-startup>1</load-on-startup> <load-on-startup>1</load-on-startup>
</servlet> </servlet>
@ -112,13 +112,8 @@
--> -->
<servlet-mapping> <servlet-mapping>
<servlet-name>fhirServletDstu1</servlet-name> <servlet-name>fhirServletR4</servlet-name>
<url-pattern>/base/*</url-pattern> <url-pattern>/baseR4/*</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>fhirServletDstu1</servlet-name>
<url-pattern>/baseDstu1/*</url-pattern>
</servlet-mapping> </servlet-mapping>
<servlet-mapping> <servlet-mapping>

View File

@ -87,6 +87,13 @@
</execution> </execution>
</executions> </executions>
</plugin> </plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<configuration>
<argLine>${argLine} -Dfile.encoding=UTF-8 -Xmx712m</argLine>
</configuration>
</plugin>
</plugins> </plugins>
</build> </build>

View File

@ -19,7 +19,6 @@ abstract class BaseAddOrDeleteTagsMethodBinding extends BaseMethodBinding<Void>
private Class<? extends IBaseResource> myType; private Class<? extends IBaseResource> myType;
private Integer myIdParamIndex; private Integer myIdParamIndex;
private Integer myVersionIdParamIndex;
private String myResourceName; private String myResourceName;
private Integer myTagListParamIndex; private Integer myTagListParamIndex;
@ -40,7 +39,6 @@ abstract class BaseAddOrDeleteTagsMethodBinding extends BaseMethodBinding<Void>
myResourceName = theContext.getResourceDefinition(myType).getName(); myResourceName = theContext.getResourceDefinition(myType).getName();
myIdParamIndex = ParameterUtil.findIdParameterIndex(theMethod, getContext()); myIdParamIndex = ParameterUtil.findIdParameterIndex(theMethod, getContext());
myVersionIdParamIndex = ParameterUtil.findVersionIdParameterIndex(theMethod);
myTagListParamIndex = ParameterUtil.findTagListParameterIndex(theMethod); myTagListParamIndex = ParameterUtil.findTagListParameterIndex(theMethod);
if (myIdParamIndex == null) { if (myIdParamIndex == null) {

View File

@ -57,12 +57,6 @@ public abstract class BaseOutcomeReturningMethodBindingWithResourceIdButNoResour
throw new ConfigurationException("Method '" + theMethod.getName() + "' on type '" + theMethod.getDeclaringClass().getCanonicalName() + "' has no parameter annotated with the @" + IdParam.class.getSimpleName() + " annotation"); throw new ConfigurationException("Method '" + theMethod.getName() + "' on type '" + theMethod.getDeclaringClass().getCanonicalName() + "' has no parameter annotated with the @" + IdParam.class.getSimpleName() + " annotation");
} }
Integer versionIdParameterIndex = ParameterUtil.findVersionIdParameterIndex(theMethod);
if (versionIdParameterIndex != null) {
//TODO Use of a deprecated method should be resolved
throw new ConfigurationException("Method '" + theMethod.getName() + "' on type '" + theMethod.getDeclaringClass().getCanonicalName() + "' has a parameter annotated with the @" + VersionIdParam.class.getSimpleName() + " annotation but delete methods may not have this annotation");
}
} }
@Override @Override

View File

@ -149,7 +149,7 @@ public class MethodUtil {
throw new ConfigurationException(b.toString()); throw new ConfigurationException(b.toString());
} }
param = new ResourceParameter((Class<? extends IBaseResource>) parameterType, theProvider, mode); param = new ResourceParameter((Class<? extends IBaseResource>) parameterType, theProvider, mode);
} else if (nextAnnotation instanceof IdParam || nextAnnotation instanceof VersionIdParam) { } else if (nextAnnotation instanceof IdParam) {
param = new NullParameter(); param = new NullParameter();
} else if (nextAnnotation instanceof ServerBase) { } else if (nextAnnotation instanceof ServerBase) {
param = new ServerBaseParamBinder(); param = new ServerBaseParamBinder();

View File

@ -3,15 +3,11 @@ package ca.uhn.fhir.rest.server.method;
import static org.apache.commons.lang3.StringUtils.isNotBlank; import static org.apache.commons.lang3.StringUtils.isNotBlank;
import java.lang.reflect.Method; import java.lang.reflect.Method;
import java.util.ArrayList; import java.util.*;
import java.util.Date;
import java.util.List;
import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.StringUtils;
import org.apache.commons.lang3.Validate; import org.apache.commons.lang3.Validate;
import org.hl7.fhir.instance.model.api.IAnyResource; import org.hl7.fhir.instance.model.api.*;
import org.hl7.fhir.instance.model.api.IBaseResource;
import org.hl7.fhir.instance.model.api.IIdType;
import ca.uhn.fhir.context.ConfigurationException; import ca.uhn.fhir.context.ConfigurationException;
import ca.uhn.fhir.context.FhirContext; import ca.uhn.fhir.context.FhirContext;
@ -20,20 +16,12 @@ import ca.uhn.fhir.model.api.ResourceMetadataKeyEnum;
import ca.uhn.fhir.model.primitive.IdDt; import ca.uhn.fhir.model.primitive.IdDt;
import ca.uhn.fhir.model.primitive.InstantDt; import ca.uhn.fhir.model.primitive.InstantDt;
import ca.uhn.fhir.model.valueset.BundleTypeEnum; import ca.uhn.fhir.model.valueset.BundleTypeEnum;
import ca.uhn.fhir.rest.annotation.Elements; import ca.uhn.fhir.rest.annotation.*;
import ca.uhn.fhir.rest.annotation.IdParam; import ca.uhn.fhir.rest.api.*;
import ca.uhn.fhir.rest.annotation.Read; import ca.uhn.fhir.rest.api.server.*;
import ca.uhn.fhir.rest.api.Constants;
import ca.uhn.fhir.rest.api.RequestTypeEnum;
import ca.uhn.fhir.rest.api.RestOperationTypeEnum;
import ca.uhn.fhir.rest.api.server.IBundleProvider;
import ca.uhn.fhir.rest.api.server.IRestfulServer;
import ca.uhn.fhir.rest.api.server.RequestDetails;
import ca.uhn.fhir.rest.param.ParameterUtil; import ca.uhn.fhir.rest.param.ParameterUtil;
import ca.uhn.fhir.rest.server.ETagSupportEnum; import ca.uhn.fhir.rest.server.ETagSupportEnum;
import ca.uhn.fhir.rest.server.exceptions.InternalErrorException; import ca.uhn.fhir.rest.server.exceptions.*;
import ca.uhn.fhir.rest.server.exceptions.InvalidRequestException;
import ca.uhn.fhir.rest.server.exceptions.NotModifiedException;
import ca.uhn.fhir.util.DateUtils; import ca.uhn.fhir.util.DateUtils;
public class ReadMethodBinding extends BaseResourceReturningMethodBinding { public class ReadMethodBinding extends BaseResourceReturningMethodBinding {
@ -41,7 +29,6 @@ public class ReadMethodBinding extends BaseResourceReturningMethodBinding {
private Integer myIdIndex; private Integer myIdIndex;
private boolean mySupportsVersion; private boolean mySupportsVersion;
private Integer myVersionIdIndex;
private Class<? extends IIdType> myIdParameterType; private Class<? extends IIdType> myIdParameterType;
@SuppressWarnings("unchecked") @SuppressWarnings("unchecked")
@ -51,13 +38,11 @@ public class ReadMethodBinding extends BaseResourceReturningMethodBinding {
Validate.notNull(theMethod, "Method must not be null"); Validate.notNull(theMethod, "Method must not be null");
Integer idIndex = ParameterUtil.findIdParameterIndex(theMethod, getContext()); Integer idIndex = ParameterUtil.findIdParameterIndex(theMethod, getContext());
Integer versionIdIndex = ParameterUtil.findVersionIdParameterIndex(theMethod);
Class<?>[] parameterTypes = theMethod.getParameterTypes(); Class<?>[] parameterTypes = theMethod.getParameterTypes();
mySupportsVersion = theMethod.getAnnotation(Read.class).version(); mySupportsVersion = theMethod.getAnnotation(Read.class).version();
myIdIndex = idIndex; myIdIndex = idIndex;
myVersionIdIndex = versionIdIndex;
if (myIdIndex == null) { if (myIdIndex == null) {
throw new ConfigurationException("@" + Read.class.getSimpleName() + " method " + theMethod.getName() + " on type \"" + theMethod.getDeclaringClass().getName() + "\" does not have a parameter annotated with @" + IdParam.class.getSimpleName()); throw new ConfigurationException("@" + Read.class.getSimpleName() + " method " + theMethod.getName() + " on type \"" + theMethod.getDeclaringClass().getName() + "\" does not have a parameter annotated with @" + IdParam.class.getSimpleName());
@ -67,9 +52,6 @@ public class ReadMethodBinding extends BaseResourceReturningMethodBinding {
if (!IIdType.class.isAssignableFrom(myIdParameterType)) { if (!IIdType.class.isAssignableFrom(myIdParameterType)) {
throw new ConfigurationException("ID parameter must be of type IdDt or IdType - Found: " + myIdParameterType); throw new ConfigurationException("ID parameter must be of type IdDt or IdType - Found: " + myIdParameterType);
} }
if (myVersionIdIndex != null && !IdDt.class.equals(parameterTypes[myVersionIdIndex])) {
throw new ConfigurationException("Version ID parameter must be of type: " + IdDt.class.getCanonicalName() + " - Found: " + parameterTypes[myVersionIdIndex]);
}
} }
@ -125,7 +107,7 @@ public class ReadMethodBinding extends BaseResourceReturningMethodBinding {
return false; return false;
} }
if (Constants.PARAM_HISTORY.equals(theRequest.getOperation())) { if (Constants.PARAM_HISTORY.equals(theRequest.getOperation())) {
if (mySupportsVersion == false && myVersionIdIndex == null) { if (mySupportsVersion == false) {
return false; return false;
} }
if (theRequest.getId().hasVersionIdPart() == false) { if (theRequest.getId().hasVersionIdPart() == false) {
@ -141,9 +123,6 @@ public class ReadMethodBinding extends BaseResourceReturningMethodBinding {
@Override @Override
public IBundleProvider invokeServer(IRestfulServer<?> theServer, RequestDetails theRequest, Object[] theMethodParams) throws InvalidRequestException, InternalErrorException { public IBundleProvider invokeServer(IRestfulServer<?> theServer, RequestDetails theRequest, Object[] theMethodParams) throws InvalidRequestException, InternalErrorException {
theMethodParams[myIdIndex] = ParameterUtil.convertIdToType(theRequest.getId(), myIdParameterType); theMethodParams[myIdIndex] = ParameterUtil.convertIdToType(theRequest.getId(), myIdParameterType);
if (myVersionIdIndex != null) {
theMethodParams[myVersionIdIndex] = new IdDt(theRequest.getId().getVersionIdPart());
}
Object response = invokeServerMethod(theServer, theRequest, theMethodParams); Object response = invokeServerMethod(theServer, theRequest, theMethodParams);
IBundleProvider retVal = toResourceList(response); IBundleProvider retVal = toResourceList(response);
@ -193,13 +172,8 @@ public class ReadMethodBinding extends BaseResourceReturningMethodBinding {
return retVal; return retVal;
} }
// @Override
// public boolean isBinary() {
// return "Binary".equals(getResourceName());
// }
public boolean isVread() { public boolean isVread() {
return mySupportsVersion || myVersionIdIndex != null; return mySupportsVersion;
} }
@Override @Override