Merge branch 'hapi3_refactor' of github.com:jamesagnew/hapi-fhir into hapi3_refactor
This commit is contained in:
commit
34ec6b8807
|
@ -92,34 +92,6 @@
|
||||||
<optional>true</optional>
|
<optional>true</optional>
|
||||||
</dependency>
|
</dependency>
|
||||||
|
|
||||||
<dependency>
|
|
||||||
<groupId>org.springframework</groupId>
|
|
||||||
<artifactId>spring-beans</artifactId>
|
|
||||||
<optional>true</optional>
|
|
||||||
<exclusions>
|
|
||||||
<exclusion>
|
|
||||||
<artifactId>commons-logging</artifactId>
|
|
||||||
<groupId>commons-logging</groupId>
|
|
||||||
</exclusion>
|
|
||||||
</exclusions>
|
|
||||||
</dependency>
|
|
||||||
<dependency>
|
|
||||||
<groupId>org.springframework</groupId>
|
|
||||||
<artifactId>spring-web</artifactId>
|
|
||||||
<optional>true</optional>
|
|
||||||
<exclusions>
|
|
||||||
<exclusion>
|
|
||||||
<artifactId>commons-logging</artifactId>
|
|
||||||
<groupId>commons-logging</groupId>
|
|
||||||
</exclusion>
|
|
||||||
</exclusions>
|
|
||||||
</dependency>
|
|
||||||
<dependency>
|
|
||||||
<groupId>org.springframework</groupId>
|
|
||||||
<artifactId>spring-test</artifactId>
|
|
||||||
<scope>test</scope>
|
|
||||||
</dependency>
|
|
||||||
|
|
||||||
</dependencies>
|
</dependencies>
|
||||||
|
|
||||||
<build>
|
<build>
|
||||||
|
|
|
@ -23,14 +23,9 @@ package ca.uhn.fhir.model.api;
|
||||||
import java.io.InputStream;
|
import java.io.InputStream;
|
||||||
import java.util.Date;
|
import java.util.Date;
|
||||||
|
|
||||||
import org.hl7.fhir.instance.model.api.IBase;
|
import org.hl7.fhir.instance.model.api.*;
|
||||||
import org.hl7.fhir.instance.model.api.IBaseResource;
|
|
||||||
import org.hl7.fhir.instance.model.api.IIdType;
|
|
||||||
import org.hl7.fhir.instance.model.api.IPrimitiveType;
|
|
||||||
|
|
||||||
import ca.uhn.fhir.context.FhirContext;
|
import ca.uhn.fhir.context.*;
|
||||||
import ca.uhn.fhir.context.FhirVersionEnum;
|
|
||||||
import ca.uhn.fhir.context.RuntimeResourceDefinition;
|
|
||||||
import ca.uhn.fhir.context.support.IContextValidationSupport;
|
import ca.uhn.fhir.context.support.IContextValidationSupport;
|
||||||
import ca.uhn.fhir.fluentpath.IFluentPath;
|
import ca.uhn.fhir.fluentpath.IFluentPath;
|
||||||
import ca.uhn.fhir.rest.api.IVersionSpecificBundleFactory;
|
import ca.uhn.fhir.rest.api.IVersionSpecificBundleFactory;
|
||||||
|
@ -68,4 +63,11 @@ public interface IFhirVersion {
|
||||||
|
|
||||||
IIdType newIdType();
|
IIdType newIdType();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns an instance of <code>IFhirVersionServer<code> for this version.
|
||||||
|
* Note that this method may only be called if the <code>hapi-fhir-server</code>
|
||||||
|
* JAR is on the classpath. Otherwise it will result in a {@link ClassNotFoundException}
|
||||||
|
*/
|
||||||
|
Object getServerVersion();
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -38,7 +38,7 @@ public interface IVersionSpecificBundleFactory {
|
||||||
|
|
||||||
void addResourcesToBundle(List<IBaseResource> theResult, BundleTypeEnum theBundleType, String theServerBase, BundleInclusionRule theBundleInclusionRule, Set<Include> theIncludes);
|
void addResourcesToBundle(List<IBaseResource> theResult, BundleTypeEnum theBundleType, String theServerBase, BundleInclusionRule theBundleInclusionRule, Set<Include> theIncludes);
|
||||||
|
|
||||||
void addRootPropertiesToBundle(String theAuthor, String theServerBase, String theCompleteUrl, Integer theTotalResults, BundleTypeEnum theBundleType, IPrimitiveType<Date> theLastUpdated);
|
void addRootPropertiesToBundle(String theAuthor, String theServerBase, String theLinkSelf, String theLinkPrev, String theLinkNext, Integer theTotalResults, BundleTypeEnum theBundleType, IPrimitiveType<Date> theLastUpdated);
|
||||||
|
|
||||||
// void initializeBundleFromBundleProvider(IRestfulServer<?> theServer, IBundleProvider theResult, EncodingEnum theResponseEncoding, String theServerBase, String theCompleteUrl, boolean thePrettyPrint,
|
// void initializeBundleFromBundleProvider(IRestfulServer<?> theServer, IBundleProvider theResult, EncodingEnum theResponseEncoding, String theServerBase, String theCompleteUrl, boolean thePrettyPrint,
|
||||||
// int theOffset, Integer theCount, String theSearchId, BundleTypeEnum theBundleType, Set<Include> theIncludes);
|
// int theOffset, Integer theCount, String theSearchId, BundleTypeEnum theBundleType, Set<Include> theIncludes);
|
||||||
|
|
|
@ -1,5 +1,7 @@
|
||||||
package ca.uhn.fhir.rest.param;
|
package ca.uhn.fhir.rest.param;
|
||||||
|
|
||||||
|
import static org.apache.commons.lang3.StringUtils.isBlank;
|
||||||
|
|
||||||
import java.lang.annotation.Annotation;
|
import java.lang.annotation.Annotation;
|
||||||
import java.lang.reflect.Method;
|
import java.lang.reflect.Method;
|
||||||
/*
|
/*
|
||||||
|
@ -27,14 +29,22 @@ 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;
|
||||||
|
import ca.uhn.fhir.model.api.*;
|
||||||
import ca.uhn.fhir.model.primitive.IdDt;
|
import ca.uhn.fhir.model.primitive.IdDt;
|
||||||
import ca.uhn.fhir.model.primitive.IntegerDt;
|
import ca.uhn.fhir.model.primitive.IntegerDt;
|
||||||
import ca.uhn.fhir.rest.annotation.*;
|
import ca.uhn.fhir.rest.annotation.*;
|
||||||
|
import ca.uhn.fhir.rest.api.Constants;
|
||||||
|
import ca.uhn.fhir.rest.api.QualifiedParamList;
|
||||||
|
import ca.uhn.fhir.util.ReflectionUtil;
|
||||||
import ca.uhn.fhir.util.UrlUtil;
|
import ca.uhn.fhir.util.UrlUtil;
|
||||||
|
|
||||||
public class ParameterUtil {
|
public class ParameterUtil {
|
||||||
|
|
||||||
private static final Set<Class<?>> BINDABLE_INTEGER_TYPES;
|
private static final Set<Class<?>> BINDABLE_INTEGER_TYPES;
|
||||||
|
private static final String LABEL = "label=\"";
|
||||||
|
private static final org.slf4j.Logger ourLog = org.slf4j.LoggerFactory.getLogger(ParameterUtil.class);
|
||||||
|
|
||||||
|
private static final String SCHEME = "scheme=\"";
|
||||||
|
|
||||||
static {
|
static {
|
||||||
HashSet<Class<?>> intTypes = new HashSet<Class<?>>();
|
HashSet<Class<?>> intTypes = new HashSet<Class<?>>();
|
||||||
|
@ -44,9 +54,15 @@ public class ParameterUtil {
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// public static Integer findSinceParameterIndex(Method theMethod) {
|
@SuppressWarnings("unchecked")
|
||||||
// return findParamIndex(theMethod, Since.class);
|
public static <T extends IIdType> T convertIdToType(IIdType value, Class<T> theIdParamType) {
|
||||||
// }
|
if (value != null && !theIdParamType.isAssignableFrom(value.getClass())) {
|
||||||
|
IIdType newValue = ReflectionUtil.newInstance(theIdParamType);
|
||||||
|
newValue.setValue(value.getValue());
|
||||||
|
value = newValue;
|
||||||
|
}
|
||||||
|
return (T) value;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Escapes a string according to the rules for parameter escaping specified in the <a href="http://www.hl7.org/implement/standards/fhir/search.html#escaping">FHIR Specification Escaping
|
* Escapes a string according to the rules for parameter escaping specified in the <a href="http://www.hl7.org/implement/standards/fhir/search.html#escaping">FHIR Specification Escaping
|
||||||
|
@ -61,14 +77,14 @@ public class ParameterUtil {
|
||||||
for (int i = 0; i < theValue.length(); i++) {
|
for (int i = 0; i < theValue.length(); i++) {
|
||||||
char next = theValue.charAt(i);
|
char next = theValue.charAt(i);
|
||||||
switch (next) {
|
switch (next) {
|
||||||
case '$':
|
case '$':
|
||||||
case ',':
|
case ',':
|
||||||
case '|':
|
case '|':
|
||||||
case '\\':
|
case '\\':
|
||||||
b.append('\\');
|
b.append('\\');
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
b.append(next);
|
b.append(next);
|
||||||
}
|
}
|
||||||
|
@ -116,6 +132,10 @@ public class ParameterUtil {
|
||||||
return index;
|
return index;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// public static Integer findSinceParameterIndex(Method theMethod) {
|
||||||
|
// return findParamIndex(theMethod, Since.class);
|
||||||
|
// }
|
||||||
|
|
||||||
public static Integer findParamAnnotationIndex(Method theMethod, Class<?> toFind) {
|
public static Integer findParamAnnotationIndex(Method theMethod, Class<?> toFind) {
|
||||||
int paramIndex = 0;
|
int paramIndex = 0;
|
||||||
for (Annotation[] annotations : theMethod.getParameterAnnotations()) {
|
for (Annotation[] annotations : theMethod.getParameterAnnotations()) {
|
||||||
|
@ -170,6 +190,134 @@ public class ParameterUtil {
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static String parseETagValue(String value) {
|
||||||
|
String eTagVersion;
|
||||||
|
value = value.trim();
|
||||||
|
if (value.length() > 1) {
|
||||||
|
if (value.charAt(value.length() - 1) == '"') {
|
||||||
|
if (value.charAt(0) == '"') {
|
||||||
|
eTagVersion = value.substring(1, value.length() - 1);
|
||||||
|
} else if (value.length() > 3 && value.charAt(0) == 'W' && value.charAt(1) == '/'
|
||||||
|
&& value.charAt(2) == '"') {
|
||||||
|
eTagVersion = value.substring(3, value.length() - 1);
|
||||||
|
} else {
|
||||||
|
eTagVersion = value;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
eTagVersion = value;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
eTagVersion = value;
|
||||||
|
}
|
||||||
|
return eTagVersion;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Deprecated
|
||||||
|
public static void parseTagValue(TagList tagList, String nextTagComplete) {
|
||||||
|
StringBuilder next = new StringBuilder(nextTagComplete);
|
||||||
|
parseTagValue(tagList, nextTagComplete, next);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Deprecated
|
||||||
|
private static void parseTagValue(TagList theTagList, String theCompleteHeaderValue, StringBuilder theBuffer) {
|
||||||
|
int firstSemicolon = theBuffer.indexOf(";");
|
||||||
|
int deleteTo;
|
||||||
|
if (firstSemicolon == -1) {
|
||||||
|
firstSemicolon = theBuffer.indexOf(",");
|
||||||
|
if (firstSemicolon == -1) {
|
||||||
|
firstSemicolon = theBuffer.length();
|
||||||
|
deleteTo = theBuffer.length();
|
||||||
|
} else {
|
||||||
|
deleteTo = firstSemicolon;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
deleteTo = firstSemicolon + 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
String term = theBuffer.substring(0, firstSemicolon);
|
||||||
|
String scheme = null;
|
||||||
|
String label = null;
|
||||||
|
if (isBlank(term)) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
theBuffer.delete(0, deleteTo);
|
||||||
|
while (theBuffer.length() > 0 && theBuffer.charAt(0) == ' ') {
|
||||||
|
theBuffer.deleteCharAt(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
while (theBuffer.length() > 0) {
|
||||||
|
boolean foundSomething = false;
|
||||||
|
if (theBuffer.length() > SCHEME.length() && theBuffer.substring(0, SCHEME.length()).equals(SCHEME)) {
|
||||||
|
int closeIdx = theBuffer.indexOf("\"", SCHEME.length());
|
||||||
|
scheme = theBuffer.substring(SCHEME.length(), closeIdx);
|
||||||
|
theBuffer.delete(0, closeIdx + 1);
|
||||||
|
foundSomething = true;
|
||||||
|
}
|
||||||
|
if (theBuffer.length() > LABEL.length() && theBuffer.substring(0, LABEL.length()).equals(LABEL)) {
|
||||||
|
int closeIdx = theBuffer.indexOf("\"", LABEL.length());
|
||||||
|
label = theBuffer.substring(LABEL.length(), closeIdx);
|
||||||
|
theBuffer.delete(0, closeIdx + 1);
|
||||||
|
foundSomething = true;
|
||||||
|
}
|
||||||
|
// TODO: support enc2231-string as described in
|
||||||
|
// http://tools.ietf.org/html/draft-johnston-http-category-header-02
|
||||||
|
// TODO: support multiple tags in one header as described in
|
||||||
|
// http://hl7.org/implement/standards/fhir/http.html#tags
|
||||||
|
|
||||||
|
while (theBuffer.length() > 0 && (theBuffer.charAt(0) == ' ' || theBuffer.charAt(0) == ';')) {
|
||||||
|
theBuffer.deleteCharAt(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!foundSomething) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (theBuffer.length() > 0 && theBuffer.charAt(0) == ',') {
|
||||||
|
theBuffer.deleteCharAt(0);
|
||||||
|
while (theBuffer.length() > 0 && theBuffer.charAt(0) == ' ') {
|
||||||
|
theBuffer.deleteCharAt(0);
|
||||||
|
}
|
||||||
|
theTagList.add(new Tag(scheme, term, label));
|
||||||
|
parseTagValue(theTagList, theCompleteHeaderValue, theBuffer);
|
||||||
|
} else {
|
||||||
|
theTagList.add(new Tag(scheme, term, label));
|
||||||
|
}
|
||||||
|
|
||||||
|
if (theBuffer.length() > 0) {
|
||||||
|
ourLog.warn("Ignoring extra text at the end of " + Constants.HEADER_CATEGORY + " tag '"
|
||||||
|
+ theBuffer.toString() + "' - Complete tag value was: " + theCompleteHeaderValue);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public static IQueryParameterOr<?> singleton(final IQueryParameterType theParam, final String theParamName) {
|
||||||
|
return new IQueryParameterOr<IQueryParameterType>() {
|
||||||
|
|
||||||
|
private static final long serialVersionUID = 1L;
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public List<IQueryParameterType> getValuesAsQueryTokens() {
|
||||||
|
return Collections.singletonList(theParam);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void setValuesAsQueryTokens(FhirContext theContext, String theParamName,
|
||||||
|
QualifiedParamList theParameters) {
|
||||||
|
if (theParameters.isEmpty()) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (theParameters.size() > 1) {
|
||||||
|
throw new IllegalArgumentException(
|
||||||
|
"Type " + theParam.getClass().getCanonicalName() + " does not support multiple values");
|
||||||
|
}
|
||||||
|
theParam.setValueAsQueryToken(theContext, theParamName, theParameters.getQualifier(),
|
||||||
|
theParameters.get(0));
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
static List<String> splitParameterString(String theInput, boolean theUnescapeComponents) {
|
static List<String> splitParameterString(String theInput, boolean theUnescapeComponents) {
|
||||||
return splitParameterString(theInput, ',', theUnescapeComponents);
|
return splitParameterString(theInput, ',', theUnescapeComponents);
|
||||||
}
|
}
|
||||||
|
@ -245,13 +393,13 @@ public class ParameterUtil {
|
||||||
b.append(next);
|
b.append(next);
|
||||||
} else {
|
} else {
|
||||||
switch (theValue.charAt(i + 1)) {
|
switch (theValue.charAt(i + 1)) {
|
||||||
case '$':
|
case '$':
|
||||||
case ',':
|
case ',':
|
||||||
case '|':
|
case '|':
|
||||||
case '\\':
|
case '\\':
|
||||||
continue;
|
continue;
|
||||||
default:
|
default:
|
||||||
b.append(next);
|
b.append(next);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
|
|
|
@ -10,7 +10,7 @@ package ca.uhn.fhir.util;
|
||||||
* you may not use this file except in compliance with the License.
|
* you may not use this file except in compliance with the License.
|
||||||
* You may obtain a copy of the License at
|
* You may obtain a copy of the License at
|
||||||
*
|
*
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
*
|
*
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
@ -22,14 +22,18 @@ package ca.uhn.fhir.util;
|
||||||
import java.lang.reflect.*;
|
import java.lang.reflect.*;
|
||||||
import java.util.LinkedHashSet;
|
import java.util.LinkedHashSet;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
import java.util.concurrent.ConcurrentHashMap;
|
||||||
|
|
||||||
import org.apache.commons.lang3.Validate;
|
import org.apache.commons.lang3.Validate;
|
||||||
|
|
||||||
import ca.uhn.fhir.context.ConfigurationException;
|
import ca.uhn.fhir.context.ConfigurationException;
|
||||||
|
import ca.uhn.fhir.model.api.IFhirVersion;
|
||||||
import javassist.Modifier;
|
import javassist.Modifier;
|
||||||
|
|
||||||
public class ReflectionUtil {
|
public class ReflectionUtil {
|
||||||
|
|
||||||
|
private static final ConcurrentHashMap<String, Object> ourFhirServerVersions = new ConcurrentHashMap<String, Object>();
|
||||||
|
|
||||||
private static final org.slf4j.Logger ourLog = org.slf4j.LoggerFactory.getLogger(ReflectionUtil.class);
|
private static final org.slf4j.Logger ourLog = org.slf4j.LoggerFactory.getLogger(ReflectionUtil.class);
|
||||||
|
|
||||||
public static LinkedHashSet<Method> getDeclaredMethods(Class<?> theClazz) {
|
public static LinkedHashSet<Method> getDeclaredMethods(Class<?> theClazz) {
|
||||||
|
@ -67,7 +71,7 @@ public class ReflectionUtil {
|
||||||
if (!List.class.isAssignableFrom(next.getType())) {
|
if (!List.class.isAssignableFrom(next.getType())) {
|
||||||
return getGenericCollectionTypeOfField(next);
|
return getGenericCollectionTypeOfField(next);
|
||||||
}
|
}
|
||||||
|
|
||||||
Class<?> type;
|
Class<?> type;
|
||||||
ParameterizedType collectionType = (ParameterizedType) next.getGenericType();
|
ParameterizedType collectionType = (ParameterizedType) next.getGenericType();
|
||||||
Type firstArg = collectionType.getActualTypeArguments()[0];
|
Type firstArg = collectionType.getActualTypeArguments()[0];
|
||||||
|
@ -125,16 +129,6 @@ public class ReflectionUtil {
|
||||||
return !theType.isInterface() && !Modifier.isAbstract(theType.getModifiers());
|
return !theType.isInterface() && !Modifier.isAbstract(theType.getModifiers());
|
||||||
}
|
}
|
||||||
|
|
||||||
public static <T> T newInstance(Class<T> theType, Class<?> theArgumentType, Object theArgument) {
|
|
||||||
Validate.notNull(theType, "theType must not be null");
|
|
||||||
try {
|
|
||||||
Constructor<T> constructor = theType.getConstructor(theArgumentType);
|
|
||||||
return constructor.newInstance(theArgument);
|
|
||||||
} catch (Exception e) {
|
|
||||||
throw new ConfigurationException("Failed to instantiate " + theType.getName(), e);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Instantiate a class by no-arg constructor, throw {@link ConfigurationException} if we fail to do so
|
* Instantiate a class by no-arg constructor, throw {@link ConfigurationException} if we fail to do so
|
||||||
*/
|
*/
|
||||||
|
@ -148,6 +142,33 @@ public class ReflectionUtil {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static <T> T newInstance(Class<T> theType, Class<?> theArgumentType, Object theArgument) {
|
||||||
|
Validate.notNull(theType, "theType must not be null");
|
||||||
|
try {
|
||||||
|
Constructor<T> constructor = theType.getConstructor(theArgumentType);
|
||||||
|
return constructor.newInstance(theArgument);
|
||||||
|
} catch (Exception e) {
|
||||||
|
throw new ConfigurationException("Failed to instantiate " + theType.getName(), e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public static Object newInstanceOfFhirServerType(String theType) {
|
||||||
|
Object fhirServerVersion = ourFhirServerVersions.get(theType);
|
||||||
|
if (fhirServerVersion == null) {
|
||||||
|
try {
|
||||||
|
Class<?> type = Class.forName(theType);
|
||||||
|
Validate.isTrue(IFhirVersion.class.isAssignableFrom(type));
|
||||||
|
fhirServerVersion = type.newInstance();
|
||||||
|
} catch (Exception e) {
|
||||||
|
throw new ConfigurationException("Unable to instantiate server framework. Please make sure that hapi-fhir-server library is on your classpath!", e);
|
||||||
|
}
|
||||||
|
|
||||||
|
ourFhirServerVersions.put(theType, fhirServerVersion);
|
||||||
|
}
|
||||||
|
|
||||||
|
return fhirServerVersion;
|
||||||
|
}
|
||||||
|
|
||||||
@SuppressWarnings("unchecked")
|
@SuppressWarnings("unchecked")
|
||||||
public static <T> T newInstanceOrReturnNull(String theClassName, Class<T> theType) {
|
public static <T> T newInstanceOrReturnNull(String theClassName, Class<T> theType) {
|
||||||
try {
|
try {
|
||||||
|
|
|
@ -78,7 +78,7 @@ public abstract class BaseClient implements IRestfulClient {
|
||||||
* as it may change at any time. If you want to capture responses in a reliable
|
* as it may change at any time. If you want to capture responses in a reliable
|
||||||
* way in your own code, just use client interceptors
|
* way in your own code, just use client interceptors
|
||||||
*/
|
*/
|
||||||
static final String HAPI_CLIENT_KEEPRESPONSES = "hapi.client.keepresponses";
|
public static final String HAPI_CLIENT_KEEPRESPONSES = "hapi.client.keepresponses";
|
||||||
|
|
||||||
private static final org.slf4j.Logger ourLog = org.slf4j.LoggerFactory.getLogger(BaseClient.class);
|
private static final org.slf4j.Logger ourLog = org.slf4j.LoggerFactory.getLogger(BaseClient.class);
|
||||||
|
|
||||||
|
|
|
@ -28,6 +28,7 @@ import java.util.List;
|
||||||
import ca.uhn.fhir.context.FhirContext;
|
import ca.uhn.fhir.context.FhirContext;
|
||||||
import ca.uhn.fhir.model.api.IQueryParameterOr;
|
import ca.uhn.fhir.model.api.IQueryParameterOr;
|
||||||
import ca.uhn.fhir.rest.api.QualifiedParamList;
|
import ca.uhn.fhir.rest.api.QualifiedParamList;
|
||||||
|
import ca.uhn.fhir.rest.param.ParameterUtil;
|
||||||
import ca.uhn.fhir.rest.param.StringParam;
|
import ca.uhn.fhir.rest.param.StringParam;
|
||||||
import ca.uhn.fhir.rest.server.exceptions.InternalErrorException;
|
import ca.uhn.fhir.rest.server.exceptions.InternalErrorException;
|
||||||
import ca.uhn.fhir.rest.server.exceptions.InvalidRequestException;
|
import ca.uhn.fhir.rest.server.exceptions.InvalidRequestException;
|
||||||
|
@ -49,7 +50,7 @@ abstract class BaseJavaPrimitiveBinder<T>implements IParamBinder<T> {
|
||||||
if (isBlank(retVal)) {
|
if (isBlank(retVal)) {
|
||||||
return Collections.emptyList();
|
return Collections.emptyList();
|
||||||
}
|
}
|
||||||
List<?> retValList = Collections.singletonList(MethodUtil.singleton(new StringParam(retVal), null));
|
List<?> retValList = Collections.singletonList(ParameterUtil.singleton(new StringParam(retVal), null));
|
||||||
return (List<IQueryParameterOr<?>>) retValList;
|
return (List<IQueryParameterOr<?>>) retValList;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1,6 +1,5 @@
|
||||||
package ca.uhn.fhir.rest.client.method;
|
package ca.uhn.fhir.rest.client.method;
|
||||||
|
|
||||||
import static org.apache.commons.lang3.StringUtils.isBlank;
|
|
||||||
import static org.apache.commons.lang3.StringUtils.isNotBlank;
|
import static org.apache.commons.lang3.StringUtils.isNotBlank;
|
||||||
|
|
||||||
import java.io.*;
|
import java.io.*;
|
||||||
|
@ -49,12 +48,10 @@ import ca.uhn.fhir.util.*;
|
||||||
@SuppressWarnings("deprecation")
|
@SuppressWarnings("deprecation")
|
||||||
public class MethodUtil {
|
public class MethodUtil {
|
||||||
|
|
||||||
private static final String LABEL = "label=\"";
|
|
||||||
|
|
||||||
private static final org.slf4j.Logger ourLog = org.slf4j.LoggerFactory.getLogger(MethodUtil.class);
|
private static final org.slf4j.Logger ourLog = org.slf4j.LoggerFactory.getLogger(MethodUtil.class);
|
||||||
private static final Set<String> ourServletRequestTypes = new HashSet<String>();
|
private static final Set<String> ourServletRequestTypes = new HashSet<String>();
|
||||||
private static final Set<String> ourServletResponseTypes = new HashSet<String>();
|
private static final Set<String> ourServletResponseTypes = new HashSet<String>();
|
||||||
private static final String SCHEME = "scheme=\"";
|
|
||||||
static {
|
static {
|
||||||
ourServletRequestTypes.add("javax.servlet.ServletRequest");
|
ourServletRequestTypes.add("javax.servlet.ServletRequest");
|
||||||
ourServletResponseTypes.add("javax.servlet.ServletResponse");
|
ourServletResponseTypes.add("javax.servlet.ServletResponse");
|
||||||
|
@ -80,16 +77,6 @@ public class MethodUtil {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@SuppressWarnings("unchecked")
|
|
||||||
public static <T extends IIdType> T convertIdToType(IIdType value, Class<T> theIdParamType) {
|
|
||||||
if (value != null && !theIdParamType.isAssignableFrom(value.getClass())) {
|
|
||||||
IIdType newValue = ReflectionUtil.newInstance(theIdParamType);
|
|
||||||
newValue.setValue(value.getValue());
|
|
||||||
value = newValue;
|
|
||||||
}
|
|
||||||
return (T) value;
|
|
||||||
}
|
|
||||||
|
|
||||||
public static HttpGetClientInvocation createConformanceInvocation(FhirContext theContext) {
|
public static HttpGetClientInvocation createConformanceInvocation(FhirContext theContext) {
|
||||||
return new HttpGetClientInvocation(theContext, "metadata");
|
return new HttpGetClientInvocation(theContext, "metadata");
|
||||||
}
|
}
|
||||||
|
@ -98,7 +85,8 @@ public class MethodUtil {
|
||||||
return createCreateInvocation(theResource, null, null, theContext);
|
return createCreateInvocation(theResource, null, null, theContext);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static HttpPostClientInvocation createCreateInvocation(IBaseResource theResource, String theResourceBody, String theId, FhirContext theContext) {
|
public static HttpPostClientInvocation createCreateInvocation(IBaseResource theResource, String theResourceBody,
|
||||||
|
String theId, FhirContext theContext) {
|
||||||
RuntimeResourceDefinition def = theContext.getResourceDefinition(theResource);
|
RuntimeResourceDefinition def = theContext.getResourceDefinition(theResource);
|
||||||
String resourceName = def.getName();
|
String resourceName = def.getName();
|
||||||
|
|
||||||
|
@ -132,32 +120,38 @@ public class MethodUtil {
|
||||||
return retVal;
|
return retVal;
|
||||||
}
|
}
|
||||||
|
|
||||||
public static HttpPostClientInvocation createCreateInvocation(IBaseResource theResource, String theResourceBody, String theId, FhirContext theContext,
|
public static HttpPostClientInvocation createCreateInvocation(IBaseResource theResource, String theResourceBody,
|
||||||
Map<String, List<String>> theIfNoneExistParams) {
|
String theId, FhirContext theContext, Map<String, List<String>> theIfNoneExistParams) {
|
||||||
HttpPostClientInvocation retVal = createCreateInvocation(theResource, theResourceBody, theId, theContext);
|
HttpPostClientInvocation retVal = createCreateInvocation(theResource, theResourceBody, theId, theContext);
|
||||||
retVal.setIfNoneExistParams(theIfNoneExistParams);
|
retVal.setIfNoneExistParams(theIfNoneExistParams);
|
||||||
return retVal;
|
return retVal;
|
||||||
}
|
}
|
||||||
|
|
||||||
public static HttpPostClientInvocation createCreateInvocation(IBaseResource theResource, String theResourceBody, String theId, FhirContext theContext, String theIfNoneExistUrl) {
|
public static HttpPostClientInvocation createCreateInvocation(IBaseResource theResource, String theResourceBody,
|
||||||
|
String theId, FhirContext theContext, String theIfNoneExistUrl) {
|
||||||
HttpPostClientInvocation retVal = createCreateInvocation(theResource, theResourceBody, theId, theContext);
|
HttpPostClientInvocation retVal = createCreateInvocation(theResource, theResourceBody, theId, theContext);
|
||||||
retVal.setIfNoneExistString(theIfNoneExistUrl);
|
retVal.setIfNoneExistString(theIfNoneExistUrl);
|
||||||
return retVal;
|
return retVal;
|
||||||
}
|
}
|
||||||
|
|
||||||
public static HttpPatchClientInvocation createPatchInvocation(FhirContext theContext, IIdType theId, PatchTypeEnum thePatchType, String theBody) {
|
public static HttpPatchClientInvocation createPatchInvocation(FhirContext theContext, IIdType theId,
|
||||||
|
PatchTypeEnum thePatchType, String theBody) {
|
||||||
return PatchMethodBinding.createPatchInvocation(theContext, theId, thePatchType, theBody);
|
return PatchMethodBinding.createPatchInvocation(theContext, theId, thePatchType, theBody);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static HttpPatchClientInvocation createPatchInvocation(FhirContext theContext, String theUrl, PatchTypeEnum thePatchType, String theBody) {
|
public static HttpPatchClientInvocation createPatchInvocation(FhirContext theContext, String theUrl,
|
||||||
|
PatchTypeEnum thePatchType, String theBody) {
|
||||||
return PatchMethodBinding.createPatchInvocation(theContext, theUrl, thePatchType, theBody);
|
return PatchMethodBinding.createPatchInvocation(theContext, theUrl, thePatchType, theBody);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static HttpPatchClientInvocation createPatchInvocation(FhirContext theContext, PatchTypeEnum thePatchType, String theBody, String theResourceType, Map<String, List<String>> theMatchParams) {
|
public static HttpPatchClientInvocation createPatchInvocation(FhirContext theContext, PatchTypeEnum thePatchType,
|
||||||
return PatchMethodBinding.createPatchInvocation(theContext, thePatchType, theBody, theResourceType, theMatchParams);
|
String theBody, String theResourceType, Map<String, List<String>> theMatchParams) {
|
||||||
|
return PatchMethodBinding.createPatchInvocation(theContext, thePatchType, theBody, theResourceType,
|
||||||
|
theMatchParams);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static HttpPutClientInvocation createUpdateInvocation(FhirContext theContext, IBaseResource theResource, String theResourceBody, Map<String, List<String>> theMatchParams) {
|
public static HttpPutClientInvocation createUpdateInvocation(FhirContext theContext, IBaseResource theResource,
|
||||||
|
String theResourceBody, Map<String, List<String>> theMatchParams) {
|
||||||
String resourceType = theContext.getResourceDefinition(theResource).getName();
|
String resourceType = theContext.getResourceDefinition(theResource).getName();
|
||||||
|
|
||||||
StringBuilder b = createUrl(resourceType, theMatchParams);
|
StringBuilder b = createUrl(resourceType, theMatchParams);
|
||||||
|
@ -192,7 +186,8 @@ public class MethodUtil {
|
||||||
return b;
|
return b;
|
||||||
}
|
}
|
||||||
|
|
||||||
public static HttpPutClientInvocation createUpdateInvocation(FhirContext theContext, IBaseResource theResource, String theResourceBody, String theMatchUrl) {
|
public static HttpPutClientInvocation createUpdateInvocation(FhirContext theContext, IBaseResource theResource,
|
||||||
|
String theResourceBody, String theMatchUrl) {
|
||||||
HttpPutClientInvocation retVal;
|
HttpPutClientInvocation retVal;
|
||||||
if (StringUtils.isBlank(theResourceBody)) {
|
if (StringUtils.isBlank(theResourceBody)) {
|
||||||
retVal = new HttpPutClientInvocation(theContext, theResource, theMatchUrl);
|
retVal = new HttpPutClientInvocation(theContext, theResource, theMatchUrl);
|
||||||
|
@ -205,7 +200,8 @@ public class MethodUtil {
|
||||||
return retVal;
|
return retVal;
|
||||||
}
|
}
|
||||||
|
|
||||||
public static HttpPutClientInvocation createUpdateInvocation(IBaseResource theResource, String theResourceBody, IIdType theId, FhirContext theContext) {
|
public static HttpPutClientInvocation createUpdateInvocation(IBaseResource theResource, String theResourceBody,
|
||||||
|
IIdType theId, FhirContext theContext) {
|
||||||
String resourceName = theContext.getResourceDefinition(theResource).getName();
|
String resourceName = theContext.getResourceDefinition(theResource).getName();
|
||||||
StringBuilder urlBuilder = new StringBuilder();
|
StringBuilder urlBuilder = new StringBuilder();
|
||||||
urlBuilder.append(resourceName);
|
urlBuilder.append(resourceName);
|
||||||
|
@ -257,7 +253,8 @@ public class MethodUtil {
|
||||||
}
|
}
|
||||||
|
|
||||||
@SuppressWarnings("unchecked")
|
@SuppressWarnings("unchecked")
|
||||||
public static List<IParameter> getResourceParameters(final FhirContext theContext, Method theMethod, Object theProvider, RestOperationTypeEnum theRestfulOperationTypeEnum) {
|
public static List<IParameter> getResourceParameters(final FhirContext theContext, Method theMethod,
|
||||||
|
Object theProvider, RestOperationTypeEnum theRestfulOperationTypeEnum) {
|
||||||
List<IParameter> parameters = new ArrayList<IParameter>();
|
List<IParameter> parameters = new ArrayList<IParameter>();
|
||||||
|
|
||||||
Class<?>[] parameterTypes = theMethod.getParameterTypes();
|
Class<?>[] parameterTypes = theMethod.getParameterTypes();
|
||||||
|
@ -282,7 +279,8 @@ public class MethodUtil {
|
||||||
parameterType = ReflectionUtil.getGenericCollectionTypeOfMethodParameter(theMethod, paramIndex);
|
parameterType = ReflectionUtil.getGenericCollectionTypeOfMethodParameter(theMethod, paramIndex);
|
||||||
}
|
}
|
||||||
if (Collection.class.isAssignableFrom(parameterType)) {
|
if (Collection.class.isAssignableFrom(parameterType)) {
|
||||||
throw new ConfigurationException("Argument #" + paramIndex + " of Method '" + theMethod.getName() + "' in type '" + theMethod.getDeclaringClass().getCanonicalName()
|
throw new ConfigurationException("Argument #" + paramIndex + " of Method '" + theMethod.getName()
|
||||||
|
+ "' in type '" + theMethod.getDeclaringClass().getCanonicalName()
|
||||||
+ "' is of an invalid generic type (can not be a collection of a collection of a collection)");
|
+ "' is of an invalid generic type (can not be a collection of a collection of a collection)");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -301,7 +299,8 @@ public class MethodUtil {
|
||||||
parameter.setRequired(true);
|
parameter.setRequired(true);
|
||||||
parameter.setDeclaredTypes(((RequiredParam) nextAnnotation).targetTypes());
|
parameter.setDeclaredTypes(((RequiredParam) nextAnnotation).targetTypes());
|
||||||
parameter.setCompositeTypes(((RequiredParam) nextAnnotation).compositeTypes());
|
parameter.setCompositeTypes(((RequiredParam) nextAnnotation).compositeTypes());
|
||||||
parameter.setChainlists(((RequiredParam) nextAnnotation).chainWhitelist(), ((RequiredParam) nextAnnotation).chainBlacklist());
|
parameter.setChainlists(((RequiredParam) nextAnnotation).chainWhitelist(),
|
||||||
|
((RequiredParam) nextAnnotation).chainBlacklist());
|
||||||
parameter.setType(theContext, parameterType, innerCollectionType, outerCollectionType);
|
parameter.setType(theContext, parameterType, innerCollectionType, outerCollectionType);
|
||||||
MethodUtil.extractDescription(parameter, annotations);
|
MethodUtil.extractDescription(parameter, annotations);
|
||||||
param = parameter;
|
param = parameter;
|
||||||
|
@ -311,7 +310,8 @@ public class MethodUtil {
|
||||||
parameter.setRequired(false);
|
parameter.setRequired(false);
|
||||||
parameter.setDeclaredTypes(((OptionalParam) nextAnnotation).targetTypes());
|
parameter.setDeclaredTypes(((OptionalParam) nextAnnotation).targetTypes());
|
||||||
parameter.setCompositeTypes(((OptionalParam) nextAnnotation).compositeTypes());
|
parameter.setCompositeTypes(((OptionalParam) nextAnnotation).compositeTypes());
|
||||||
parameter.setChainlists(((OptionalParam) nextAnnotation).chainWhitelist(), ((OptionalParam) nextAnnotation).chainBlacklist());
|
parameter.setChainlists(((OptionalParam) nextAnnotation).chainWhitelist(),
|
||||||
|
((OptionalParam) nextAnnotation).chainBlacklist());
|
||||||
parameter.setType(theContext, parameterType, innerCollectionType, outerCollectionType);
|
parameter.setType(theContext, parameterType, innerCollectionType, outerCollectionType);
|
||||||
MethodUtil.extractDescription(parameter, annotations);
|
MethodUtil.extractDescription(parameter, annotations);
|
||||||
param = parameter;
|
param = parameter;
|
||||||
|
@ -324,15 +324,20 @@ public class MethodUtil {
|
||||||
if (parameterType == String.class) {
|
if (parameterType == String.class) {
|
||||||
instantiableCollectionType = null;
|
instantiableCollectionType = null;
|
||||||
specType = String.class;
|
specType = String.class;
|
||||||
} else if ((parameterType != Include.class) || innerCollectionType == null || outerCollectionType != null) {
|
} else if ((parameterType != Include.class) || innerCollectionType == null
|
||||||
throw new ConfigurationException("Method '" + theMethod.getName() + "' is annotated with @" + IncludeParam.class.getSimpleName() + " but has a type other than Collection<"
|
|| outerCollectionType != null) {
|
||||||
|
throw new ConfigurationException("Method '" + theMethod.getName() + "' is annotated with @"
|
||||||
|
+ IncludeParam.class.getSimpleName() + " but has a type other than Collection<"
|
||||||
+ Include.class.getSimpleName() + ">");
|
+ Include.class.getSimpleName() + ">");
|
||||||
} else {
|
} else {
|
||||||
instantiableCollectionType = (Class<? extends Collection<Include>>) CollectionBinder.getInstantiableCollectionType(innerCollectionType, "Method '" + theMethod.getName() + "'");
|
instantiableCollectionType = (Class<? extends Collection<Include>>) CollectionBinder
|
||||||
|
.getInstantiableCollectionType(innerCollectionType,
|
||||||
|
"Method '" + theMethod.getName() + "'");
|
||||||
specType = parameterType;
|
specType = parameterType;
|
||||||
}
|
}
|
||||||
|
|
||||||
param = new IncludeParameter((IncludeParam) nextAnnotation, instantiableCollectionType, specType);
|
param = new IncludeParameter((IncludeParam) nextAnnotation, instantiableCollectionType,
|
||||||
|
specType);
|
||||||
} else if (nextAnnotation instanceof ResourceParam) {
|
} else if (nextAnnotation instanceof ResourceParam) {
|
||||||
if (IBaseResource.class.isAssignableFrom(parameterType)) {
|
if (IBaseResource.class.isAssignableFrom(parameterType)) {
|
||||||
// good
|
// good
|
||||||
|
@ -362,10 +367,12 @@ public class MethodUtil {
|
||||||
param = new ElementsParameter();
|
param = new ElementsParameter();
|
||||||
} else if (nextAnnotation instanceof Since) {
|
} else if (nextAnnotation instanceof Since) {
|
||||||
param = new SinceParameter();
|
param = new SinceParameter();
|
||||||
((SinceParameter) param).setType(theContext, parameterType, innerCollectionType, outerCollectionType);
|
((SinceParameter) param).setType(theContext, parameterType, innerCollectionType,
|
||||||
|
outerCollectionType);
|
||||||
} else if (nextAnnotation instanceof At) {
|
} else if (nextAnnotation instanceof At) {
|
||||||
param = new AtParameter();
|
param = new AtParameter();
|
||||||
((AtParameter) param).setType(theContext, parameterType, innerCollectionType, outerCollectionType);
|
((AtParameter) param).setType(theContext, parameterType, innerCollectionType,
|
||||||
|
outerCollectionType);
|
||||||
} else if (nextAnnotation instanceof Count) {
|
} else if (nextAnnotation instanceof Count) {
|
||||||
param = new CountParameter();
|
param = new CountParameter();
|
||||||
} else if (nextAnnotation instanceof Sort) {
|
} else if (nextAnnotation instanceof Sort) {
|
||||||
|
@ -373,49 +380,56 @@ public class MethodUtil {
|
||||||
} else if (nextAnnotation instanceof TransactionParam) {
|
} else if (nextAnnotation instanceof TransactionParam) {
|
||||||
param = new TransactionParameter(theContext);
|
param = new TransactionParameter(theContext);
|
||||||
} else if (nextAnnotation instanceof ConditionalUrlParam) {
|
} else if (nextAnnotation instanceof ConditionalUrlParam) {
|
||||||
param = new ConditionalParamBinder(theRestfulOperationTypeEnum, ((ConditionalUrlParam) nextAnnotation).supportsMultiple());
|
param = new ConditionalParamBinder(theRestfulOperationTypeEnum,
|
||||||
|
((ConditionalUrlParam) nextAnnotation).supportsMultiple());
|
||||||
} else if (nextAnnotation instanceof OperationParam) {
|
} else if (nextAnnotation instanceof OperationParam) {
|
||||||
Operation op = theMethod.getAnnotation(Operation.class);
|
Operation op = theMethod.getAnnotation(Operation.class);
|
||||||
param = new OperationParameter(theContext, op.name(), ((OperationParam) nextAnnotation));
|
param = new OperationParameter(theContext, op.name(), ((OperationParam) nextAnnotation));
|
||||||
} else if (nextAnnotation instanceof Validate.Mode) {
|
} else if (nextAnnotation instanceof Validate.Mode) {
|
||||||
if (parameterType.equals(ValidationModeEnum.class) == false) {
|
if (parameterType.equals(ValidationModeEnum.class) == false) {
|
||||||
throw new ConfigurationException(
|
throw new ConfigurationException("Parameter annotated with @"
|
||||||
"Parameter annotated with @" + Validate.class.getSimpleName() + "." + Validate.Mode.class.getSimpleName() + " must be of type " + ValidationModeEnum.class.getName());
|
+ Validate.class.getSimpleName() + "." + Validate.Mode.class.getSimpleName()
|
||||||
|
+ " must be of type " + ValidationModeEnum.class.getName());
|
||||||
}
|
}
|
||||||
param = new OperationParameter(theContext, Constants.EXTOP_VALIDATE, Constants.EXTOP_VALIDATE_MODE, 0, 1).setConverter(new IOperationParamConverter() {
|
param = new OperationParameter(theContext, Constants.EXTOP_VALIDATE,
|
||||||
@Override
|
Constants.EXTOP_VALIDATE_MODE, 0, 1).setConverter(new IOperationParamConverter() {
|
||||||
public Object incomingServer(Object theObject) {
|
@Override
|
||||||
if (isNotBlank(theObject.toString())) {
|
public Object incomingServer(Object theObject) {
|
||||||
ValidationModeEnum retVal = ValidationModeEnum.forCode(theObject.toString());
|
if (isNotBlank(theObject.toString())) {
|
||||||
if (retVal == null) {
|
ValidationModeEnum retVal = ValidationModeEnum
|
||||||
OperationParameter.throwInvalidMode(theObject.toString());
|
.forCode(theObject.toString());
|
||||||
|
if (retVal == null) {
|
||||||
|
OperationParameter.throwInvalidMode(theObject.toString());
|
||||||
|
}
|
||||||
|
return retVal;
|
||||||
|
}
|
||||||
|
return null;
|
||||||
}
|
}
|
||||||
return retVal;
|
|
||||||
}
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Object outgoingClient(Object theObject) {
|
public Object outgoingClient(Object theObject) {
|
||||||
return ParametersUtil.createString(theContext, ((ValidationModeEnum) theObject).getCode());
|
return ParametersUtil.createString(theContext,
|
||||||
}
|
((ValidationModeEnum) theObject).getCode());
|
||||||
});
|
}
|
||||||
|
});
|
||||||
} else if (nextAnnotation instanceof Validate.Profile) {
|
} else if (nextAnnotation instanceof Validate.Profile) {
|
||||||
if (parameterType.equals(String.class) == false) {
|
if (parameterType.equals(String.class) == false) {
|
||||||
throw new ConfigurationException(
|
throw new ConfigurationException("Parameter annotated with @"
|
||||||
"Parameter annotated with @" + Validate.class.getSimpleName() + "." + Validate.Profile.class.getSimpleName() + " must be of type " + String.class.getName());
|
+ Validate.class.getSimpleName() + "." + Validate.Profile.class.getSimpleName()
|
||||||
|
+ " must be of type " + String.class.getName());
|
||||||
}
|
}
|
||||||
param = new OperationParameter(theContext, Constants.EXTOP_VALIDATE, Constants.EXTOP_VALIDATE_PROFILE, 0, 1).setConverter(new IOperationParamConverter() {
|
param = new OperationParameter(theContext, Constants.EXTOP_VALIDATE,
|
||||||
@Override
|
Constants.EXTOP_VALIDATE_PROFILE, 0, 1).setConverter(new IOperationParamConverter() {
|
||||||
public Object incomingServer(Object theObject) {
|
@Override
|
||||||
return theObject.toString();
|
public Object incomingServer(Object theObject) {
|
||||||
}
|
return theObject.toString();
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Object outgoingClient(Object theObject) {
|
public Object outgoingClient(Object theObject) {
|
||||||
return ParametersUtil.createString(theContext, theObject.toString());
|
return ParametersUtil.createString(theContext, theObject.toString());
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
} else {
|
} else {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
@ -425,9 +439,10 @@ public class MethodUtil {
|
||||||
}
|
}
|
||||||
|
|
||||||
if (param == null) {
|
if (param == null) {
|
||||||
throw new ConfigurationException(
|
throw new ConfigurationException("Parameter #" + ((paramIndex + 1)) + "/" + (parameterTypes.length)
|
||||||
"Parameter #" + ((paramIndex + 1)) + "/" + (parameterTypes.length) + " of method '" + theMethod.getName() + "' on type '" + theMethod.getDeclaringClass().getCanonicalName()
|
+ " of method '" + theMethod.getName() + "' on type '"
|
||||||
+ "' has no recognized FHIR interface parameter annotations. Don't know how to handle this parameter");
|
+ theMethod.getDeclaringClass().getCanonicalName()
|
||||||
|
+ "' has no recognized FHIR interface parameter annotations. Don't know how to handle this parameter");
|
||||||
}
|
}
|
||||||
|
|
||||||
param.initializeTypes(theMethod, outerCollectionType, innerCollectionType, parameterType);
|
param.initializeTypes(theMethod, outerCollectionType, innerCollectionType, parameterType);
|
||||||
|
@ -438,7 +453,8 @@ public class MethodUtil {
|
||||||
return parameters;
|
return parameters;
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void parseClientRequestResourceHeaders(IIdType theRequestedId, Map<String, List<String>> theHeaders, IBaseResource resource) {
|
public static void parseClientRequestResourceHeaders(IIdType theRequestedId, Map<String, List<String>> theHeaders,
|
||||||
|
IBaseResource resource) {
|
||||||
List<String> lmHeaders = theHeaders.get(Constants.HEADER_LAST_MODIFIED_LOWERCASE);
|
List<String> lmHeaders = theHeaders.get(Constants.HEADER_LAST_MODIFIED_LOWERCASE);
|
||||||
if (lmHeaders != null && lmHeaders.size() > 0 && StringUtils.isNotBlank(lmHeaders.get(0))) {
|
if (lmHeaders != null && lmHeaders.size() > 0 && StringUtils.isNotBlank(lmHeaders.get(0))) {
|
||||||
String headerValue = lmHeaders.get(0);
|
String headerValue = lmHeaders.get(0);
|
||||||
|
@ -484,7 +500,7 @@ public class MethodUtil {
|
||||||
List<String> eTagHeaders = theHeaders.get(Constants.HEADER_ETAG_LC);
|
List<String> eTagHeaders = theHeaders.get(Constants.HEADER_ETAG_LC);
|
||||||
String eTagVersion = null;
|
String eTagVersion = null;
|
||||||
if (eTagHeaders != null && eTagHeaders.size() > 0) {
|
if (eTagHeaders != null && eTagHeaders.size() > 0) {
|
||||||
eTagVersion = parseETagValue(eTagHeaders.get(0));
|
eTagVersion = ParameterUtil.parseETagValue(eTagHeaders.get(0));
|
||||||
}
|
}
|
||||||
if (isNotBlank(eTagVersion)) {
|
if (isNotBlank(eTagVersion)) {
|
||||||
if (existing == null || existing.isEmpty()) {
|
if (existing == null || existing.isEmpty()) {
|
||||||
|
@ -504,7 +520,7 @@ public class MethodUtil {
|
||||||
if (categoryHeaders != null && categoryHeaders.size() > 0 && StringUtils.isNotBlank(categoryHeaders.get(0))) {
|
if (categoryHeaders != null && categoryHeaders.size() > 0 && StringUtils.isNotBlank(categoryHeaders.get(0))) {
|
||||||
TagList tagList = new TagList();
|
TagList tagList = new TagList();
|
||||||
for (String header : categoryHeaders) {
|
for (String header : categoryHeaders) {
|
||||||
parseTagValue(tagList, header);
|
ParameterUtil.parseTagValue(tagList, header);
|
||||||
}
|
}
|
||||||
if (resource instanceof IResource) {
|
if (resource instanceof IResource) {
|
||||||
ResourceMetadataKeyEnum.TAG_LIST.put((IResource) resource, tagList);
|
ResourceMetadataKeyEnum.TAG_LIST.put((IResource) resource, tagList);
|
||||||
|
@ -517,31 +533,11 @@ public class MethodUtil {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public static String parseETagValue(String value) {
|
|
||||||
String eTagVersion;
|
|
||||||
value = value.trim();
|
|
||||||
if (value.length() > 1) {
|
|
||||||
if (value.charAt(value.length() - 1) == '"') {
|
|
||||||
if (value.charAt(0) == '"') {
|
|
||||||
eTagVersion = value.substring(1, value.length() - 1);
|
|
||||||
} else if (value.length() > 3 && value.charAt(0) == 'W' && value.charAt(1) == '/' && value.charAt(2) == '"') {
|
|
||||||
eTagVersion = value.substring(3, value.length() - 1);
|
|
||||||
} else {
|
|
||||||
eTagVersion = value;
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
eTagVersion = value;
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
eTagVersion = value;
|
|
||||||
}
|
|
||||||
return eTagVersion;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* This is a utility method intended provided to help the JPA module.
|
* This is a utility method intended provided to help the JPA module.
|
||||||
*/
|
*/
|
||||||
public static IQueryParameterAnd<?> parseQueryParams(FhirContext theContext, RuntimeSearchParam theParamDef, String theUnqualifiedParamName, List<QualifiedParamList> theParameters) {
|
public static IQueryParameterAnd<?> parseQueryParams(FhirContext theContext, RuntimeSearchParam theParamDef,
|
||||||
|
String theUnqualifiedParamName, List<QualifiedParamList> theParameters) {
|
||||||
RestSearchParameterTypeEnum paramType = theParamDef.getParamType();
|
RestSearchParameterTypeEnum paramType = theParamDef.getParamType();
|
||||||
return parseQueryParams(theContext, paramType, theUnqualifiedParamName, theParameters);
|
return parseQueryParams(theContext, paramType, theUnqualifiedParamName, theParameters);
|
||||||
}
|
}
|
||||||
|
@ -549,119 +545,52 @@ public class MethodUtil {
|
||||||
/**
|
/**
|
||||||
* This is a utility method intended provided to help the JPA module.
|
* This is a utility method intended provided to help the JPA module.
|
||||||
*/
|
*/
|
||||||
public static IQueryParameterAnd<?> parseQueryParams(FhirContext theContext, RestSearchParameterTypeEnum paramType, String theUnqualifiedParamName, List<QualifiedParamList> theParameters) {
|
public static IQueryParameterAnd<?> parseQueryParams(FhirContext theContext, RestSearchParameterTypeEnum paramType,
|
||||||
|
String theUnqualifiedParamName, List<QualifiedParamList> theParameters) {
|
||||||
QueryParameterAndBinder binder = null;
|
QueryParameterAndBinder binder = null;
|
||||||
switch (paramType) {
|
switch (paramType) {
|
||||||
case COMPOSITE:
|
case COMPOSITE:
|
||||||
throw new UnsupportedOperationException();
|
throw new UnsupportedOperationException();
|
||||||
case DATE:
|
case DATE:
|
||||||
binder = new QueryParameterAndBinder(DateAndListParam.class, Collections.<Class<? extends IQueryParameterType>> emptyList());
|
binder = new QueryParameterAndBinder(DateAndListParam.class,
|
||||||
break;
|
Collections.<Class<? extends IQueryParameterType>> emptyList());
|
||||||
case NUMBER:
|
break;
|
||||||
binder = new QueryParameterAndBinder(NumberAndListParam.class, Collections.<Class<? extends IQueryParameterType>> emptyList());
|
case NUMBER:
|
||||||
break;
|
binder = new QueryParameterAndBinder(NumberAndListParam.class,
|
||||||
case QUANTITY:
|
Collections.<Class<? extends IQueryParameterType>> emptyList());
|
||||||
binder = new QueryParameterAndBinder(QuantityAndListParam.class, Collections.<Class<? extends IQueryParameterType>> emptyList());
|
break;
|
||||||
break;
|
case QUANTITY:
|
||||||
case REFERENCE:
|
binder = new QueryParameterAndBinder(QuantityAndListParam.class,
|
||||||
binder = new QueryParameterAndBinder(ReferenceAndListParam.class, Collections.<Class<? extends IQueryParameterType>> emptyList());
|
Collections.<Class<? extends IQueryParameterType>> emptyList());
|
||||||
break;
|
break;
|
||||||
case STRING:
|
case REFERENCE:
|
||||||
binder = new QueryParameterAndBinder(StringAndListParam.class, Collections.<Class<? extends IQueryParameterType>> emptyList());
|
binder = new QueryParameterAndBinder(ReferenceAndListParam.class,
|
||||||
break;
|
Collections.<Class<? extends IQueryParameterType>> emptyList());
|
||||||
case TOKEN:
|
break;
|
||||||
binder = new QueryParameterAndBinder(TokenAndListParam.class, Collections.<Class<? extends IQueryParameterType>> emptyList());
|
case STRING:
|
||||||
break;
|
binder = new QueryParameterAndBinder(StringAndListParam.class,
|
||||||
case URI:
|
Collections.<Class<? extends IQueryParameterType>> emptyList());
|
||||||
binder = new QueryParameterAndBinder(UriAndListParam.class, Collections.<Class<? extends IQueryParameterType>> emptyList());
|
break;
|
||||||
break;
|
case TOKEN:
|
||||||
case HAS:
|
binder = new QueryParameterAndBinder(TokenAndListParam.class,
|
||||||
binder = new QueryParameterAndBinder(HasAndListParam.class, Collections.<Class<? extends IQueryParameterType>> emptyList());
|
Collections.<Class<? extends IQueryParameterType>> emptyList());
|
||||||
break;
|
break;
|
||||||
|
case URI:
|
||||||
|
binder = new QueryParameterAndBinder(UriAndListParam.class,
|
||||||
|
Collections.<Class<? extends IQueryParameterType>> emptyList());
|
||||||
|
break;
|
||||||
|
case HAS:
|
||||||
|
binder = new QueryParameterAndBinder(HasAndListParam.class,
|
||||||
|
Collections.<Class<? extends IQueryParameterType>> emptyList());
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
// FIXME null access
|
// FIXME null access
|
||||||
return binder.parse(theContext, theUnqualifiedParamName, theParameters);
|
return binder.parse(theContext, theUnqualifiedParamName, theParameters);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void parseTagValue(TagList tagList, String nextTagComplete) {
|
public static MethodOutcome process2xxResponse(FhirContext theContext, int theResponseStatusCode,
|
||||||
StringBuilder next = new StringBuilder(nextTagComplete);
|
String theResponseMimeType, Reader theResponseReader, Map<String, List<String>> theHeaders) {
|
||||||
parseTagValue(tagList, nextTagComplete, next);
|
|
||||||
}
|
|
||||||
|
|
||||||
private static void parseTagValue(TagList theTagList, String theCompleteHeaderValue, StringBuilder theBuffer) {
|
|
||||||
int firstSemicolon = theBuffer.indexOf(";");
|
|
||||||
int deleteTo;
|
|
||||||
if (firstSemicolon == -1) {
|
|
||||||
firstSemicolon = theBuffer.indexOf(",");
|
|
||||||
if (firstSemicolon == -1) {
|
|
||||||
firstSemicolon = theBuffer.length();
|
|
||||||
deleteTo = theBuffer.length();
|
|
||||||
} else {
|
|
||||||
deleteTo = firstSemicolon;
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
deleteTo = firstSemicolon + 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
String term = theBuffer.substring(0, firstSemicolon);
|
|
||||||
String scheme = null;
|
|
||||||
String label = null;
|
|
||||||
if (isBlank(term)) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
theBuffer.delete(0, deleteTo);
|
|
||||||
while (theBuffer.length() > 0 && theBuffer.charAt(0) == ' ') {
|
|
||||||
theBuffer.deleteCharAt(0);
|
|
||||||
}
|
|
||||||
|
|
||||||
while (theBuffer.length() > 0) {
|
|
||||||
boolean foundSomething = false;
|
|
||||||
if (theBuffer.length() > SCHEME.length() && theBuffer.substring(0, SCHEME.length()).equals(SCHEME)) {
|
|
||||||
int closeIdx = theBuffer.indexOf("\"", SCHEME.length());
|
|
||||||
scheme = theBuffer.substring(SCHEME.length(), closeIdx);
|
|
||||||
theBuffer.delete(0, closeIdx + 1);
|
|
||||||
foundSomething = true;
|
|
||||||
}
|
|
||||||
if (theBuffer.length() > LABEL.length() && theBuffer.substring(0, LABEL.length()).equals(LABEL)) {
|
|
||||||
int closeIdx = theBuffer.indexOf("\"", LABEL.length());
|
|
||||||
label = theBuffer.substring(LABEL.length(), closeIdx);
|
|
||||||
theBuffer.delete(0, closeIdx + 1);
|
|
||||||
foundSomething = true;
|
|
||||||
}
|
|
||||||
// TODO: support enc2231-string as described in
|
|
||||||
// http://tools.ietf.org/html/draft-johnston-http-category-header-02
|
|
||||||
// TODO: support multiple tags in one header as described in
|
|
||||||
// http://hl7.org/implement/standards/fhir/http.html#tags
|
|
||||||
|
|
||||||
while (theBuffer.length() > 0 && (theBuffer.charAt(0) == ' ' || theBuffer.charAt(0) == ';')) {
|
|
||||||
theBuffer.deleteCharAt(0);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!foundSomething) {
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (theBuffer.length() > 0 && theBuffer.charAt(0) == ',') {
|
|
||||||
theBuffer.deleteCharAt(0);
|
|
||||||
while (theBuffer.length() > 0 && theBuffer.charAt(0) == ' ') {
|
|
||||||
theBuffer.deleteCharAt(0);
|
|
||||||
}
|
|
||||||
theTagList.add(new Tag(scheme, term, label));
|
|
||||||
parseTagValue(theTagList, theCompleteHeaderValue, theBuffer);
|
|
||||||
} else {
|
|
||||||
theTagList.add(new Tag(scheme, term, label));
|
|
||||||
}
|
|
||||||
|
|
||||||
if (theBuffer.length() > 0) {
|
|
||||||
ourLog.warn("Ignoring extra text at the end of " + Constants.HEADER_CATEGORY + " tag '" + theBuffer.toString() + "' - Complete tag value was: " + theCompleteHeaderValue);
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
public static MethodOutcome process2xxResponse(FhirContext theContext, int theResponseStatusCode, String theResponseMimeType, Reader theResponseReader, Map<String, List<String>> theHeaders) {
|
|
||||||
List<String> locationHeaders = new ArrayList<String>();
|
List<String> locationHeaders = new ArrayList<String>();
|
||||||
List<String> lh = theHeaders.get(Constants.HEADER_LOCATION_LC);
|
List<String> lh = theHeaders.get(Constants.HEADER_LOCATION_LC);
|
||||||
if (lh != null) {
|
if (lh != null) {
|
||||||
|
@ -706,34 +635,16 @@ public class MethodUtil {
|
||||||
}
|
}
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
BaseOutcomeReturningMethodBinding.ourLog.debug("Ignoring response content of type: {}", theResponseMimeType);
|
BaseOutcomeReturningMethodBinding.ourLog.debug("Ignoring response content of type: {}",
|
||||||
|
theResponseMimeType);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return retVal;
|
return retVal;
|
||||||
}
|
}
|
||||||
|
|
||||||
public static IQueryParameterOr<?> singleton(final IQueryParameterType theParam, final String theParamName) {
|
|
||||||
return new IQueryParameterOr<IQueryParameterType>() {
|
|
||||||
|
|
||||||
@Override
|
public static void addAcceptHeaderToRequest(EncodingEnum theEncoding, IHttpRequest theHttpRequest,
|
||||||
public List<IQueryParameterType> getValuesAsQueryTokens() {
|
FhirContext theContext) {
|
||||||
return Collections.singletonList(theParam);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void setValuesAsQueryTokens(FhirContext theContext, String theParamName, QualifiedParamList theParameters) {
|
|
||||||
if (theParameters.isEmpty()) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
if (theParameters.size() > 1) {
|
|
||||||
throw new IllegalArgumentException("Type " + theParam.getClass().getCanonicalName() + " does not support multiple values");
|
|
||||||
}
|
|
||||||
theParam.setValueAsQueryToken(theContext, theParamName, theParameters.getQualifier(), theParameters.get(0));
|
|
||||||
}
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
public static void addAcceptHeaderToRequest(EncodingEnum theEncoding, IHttpRequest theHttpRequest, FhirContext theContext) {
|
|
||||||
if (theEncoding == null) {
|
if (theEncoding == null) {
|
||||||
if (theContext.getVersion().getVersion().isNewerThan(FhirVersionEnum.DSTU2_1) == false) {
|
if (theContext.getVersion().getVersion().isNewerThan(FhirVersionEnum.DSTU2_1) == false) {
|
||||||
theHttpRequest.addHeader(Constants.HEADER_ACCEPT, Constants.HEADER_ACCEPT_VALUE_XML_OR_JSON_LEGACY);
|
theHttpRequest.addHeader(Constants.HEADER_ACCEPT, Constants.HEADER_ACCEPT_VALUE_XML_OR_JSON_LEGACY);
|
||||||
|
|
|
@ -29,6 +29,7 @@ import ca.uhn.fhir.context.FhirContext;
|
||||||
import ca.uhn.fhir.model.api.IQueryParameterOr;
|
import ca.uhn.fhir.model.api.IQueryParameterOr;
|
||||||
import ca.uhn.fhir.model.api.IQueryParameterType;
|
import ca.uhn.fhir.model.api.IQueryParameterType;
|
||||||
import ca.uhn.fhir.rest.api.QualifiedParamList;
|
import ca.uhn.fhir.rest.api.QualifiedParamList;
|
||||||
|
import ca.uhn.fhir.rest.param.ParameterUtil;
|
||||||
import ca.uhn.fhir.rest.server.exceptions.InternalErrorException;
|
import ca.uhn.fhir.rest.server.exceptions.InternalErrorException;
|
||||||
import ca.uhn.fhir.rest.server.exceptions.InvalidRequestException;
|
import ca.uhn.fhir.rest.server.exceptions.InvalidRequestException;
|
||||||
|
|
||||||
|
@ -42,7 +43,7 @@ final class QueryParameterTypeBinder extends BaseBinder<IQueryParameterType> imp
|
||||||
@Override
|
@Override
|
||||||
public List<IQueryParameterOr<?>> encode(FhirContext theContext, IQueryParameterType theValue) throws InternalErrorException {
|
public List<IQueryParameterOr<?>> encode(FhirContext theContext, IQueryParameterType theValue) throws InternalErrorException {
|
||||||
IQueryParameterType param = theValue;
|
IQueryParameterType param = theValue;
|
||||||
List<?> retVal = Collections.singletonList(MethodUtil.singleton(param, null));
|
List<?> retVal = Collections.singletonList(ParameterUtil.singleton(param, null));
|
||||||
return (List<IQueryParameterOr<?>>) retVal;
|
return (List<IQueryParameterOr<?>>) retVal;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -23,11 +23,16 @@ package ca.uhn.fhir.rest.client.method;
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.io.InputStream;
|
import java.io.InputStream;
|
||||||
import java.lang.reflect.Method;
|
import java.lang.reflect.Method;
|
||||||
import java.util.*;
|
import java.util.ArrayList;
|
||||||
|
import java.util.Collections;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
import org.apache.commons.io.IOUtils;
|
import org.apache.commons.io.IOUtils;
|
||||||
import org.apache.commons.lang3.Validate;
|
import org.apache.commons.lang3.Validate;
|
||||||
import org.hl7.fhir.instance.model.api.*;
|
import org.hl7.fhir.instance.model.api.IBaseBinary;
|
||||||
|
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;
|
||||||
|
@ -35,7 +40,9 @@ import ca.uhn.fhir.model.api.Bundle;
|
||||||
import ca.uhn.fhir.model.api.IResource;
|
import ca.uhn.fhir.model.api.IResource;
|
||||||
import ca.uhn.fhir.model.primitive.IdDt;
|
import ca.uhn.fhir.model.primitive.IdDt;
|
||||||
import ca.uhn.fhir.model.valueset.BundleTypeEnum;
|
import ca.uhn.fhir.model.valueset.BundleTypeEnum;
|
||||||
import ca.uhn.fhir.rest.annotation.*;
|
import ca.uhn.fhir.rest.annotation.Elements;
|
||||||
|
import ca.uhn.fhir.rest.annotation.IdParam;
|
||||||
|
import ca.uhn.fhir.rest.annotation.Read;
|
||||||
import ca.uhn.fhir.rest.api.RestOperationTypeEnum;
|
import ca.uhn.fhir.rest.api.RestOperationTypeEnum;
|
||||||
import ca.uhn.fhir.rest.param.ParameterUtil;
|
import ca.uhn.fhir.rest.param.ParameterUtil;
|
||||||
import ca.uhn.fhir.rest.server.exceptions.BaseServerResponseException;
|
import ca.uhn.fhir.rest.server.exceptions.BaseServerResponseException;
|
||||||
|
|
|
@ -23,7 +23,10 @@ import static org.apache.commons.lang3.StringUtils.isBlank;
|
||||||
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.*;
|
import java.util.Collections;
|
||||||
|
import java.util.LinkedHashMap;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Map;
|
||||||
import java.util.Map.Entry;
|
import java.util.Map.Entry;
|
||||||
|
|
||||||
import org.apache.commons.lang3.StringUtils;
|
import org.apache.commons.lang3.StringUtils;
|
||||||
|
@ -35,7 +38,9 @@ import ca.uhn.fhir.model.api.annotation.Description;
|
||||||
import ca.uhn.fhir.model.primitive.IdDt;
|
import ca.uhn.fhir.model.primitive.IdDt;
|
||||||
import ca.uhn.fhir.model.valueset.BundleTypeEnum;
|
import ca.uhn.fhir.model.valueset.BundleTypeEnum;
|
||||||
import ca.uhn.fhir.rest.annotation.Search;
|
import ca.uhn.fhir.rest.annotation.Search;
|
||||||
import ca.uhn.fhir.rest.api.*;
|
import ca.uhn.fhir.rest.api.Constants;
|
||||||
|
import ca.uhn.fhir.rest.api.RestOperationTypeEnum;
|
||||||
|
import ca.uhn.fhir.rest.api.SearchStyleEnum;
|
||||||
import ca.uhn.fhir.rest.client.impl.BaseHttpClientInvocation;
|
import ca.uhn.fhir.rest.client.impl.BaseHttpClientInvocation;
|
||||||
import ca.uhn.fhir.rest.param.ParameterUtil;
|
import ca.uhn.fhir.rest.param.ParameterUtil;
|
||||||
import ca.uhn.fhir.rest.server.exceptions.InternalErrorException;
|
import ca.uhn.fhir.rest.server.exceptions.InternalErrorException;
|
||||||
|
|
|
@ -30,7 +30,9 @@ import ca.uhn.fhir.context.FhirContext;
|
||||||
import ca.uhn.fhir.model.api.IResource;
|
import ca.uhn.fhir.model.api.IResource;
|
||||||
import ca.uhn.fhir.model.primitive.IdDt;
|
import ca.uhn.fhir.model.primitive.IdDt;
|
||||||
import ca.uhn.fhir.rest.annotation.Validate;
|
import ca.uhn.fhir.rest.annotation.Validate;
|
||||||
import ca.uhn.fhir.rest.api.*;
|
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.client.impl.BaseHttpClientInvocation;
|
import ca.uhn.fhir.rest.client.impl.BaseHttpClientInvocation;
|
||||||
import ca.uhn.fhir.rest.param.ParameterUtil;
|
import ca.uhn.fhir.rest.param.ParameterUtil;
|
||||||
|
|
||||||
|
|
|
@ -54,6 +54,11 @@
|
||||||
</exclusion>
|
</exclusion>
|
||||||
</exclusions>
|
</exclusions>
|
||||||
</dependency>
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>ca.uhn.hapi.fhir</groupId>
|
||||||
|
<artifactId>hapi-fhir-server</artifactId>
|
||||||
|
<version>${project.version}</version>
|
||||||
|
</dependency>
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>ca.uhn.hapi.fhir</groupId>
|
<groupId>ca.uhn.hapi.fhir</groupId>
|
||||||
<artifactId>hapi-fhir-structures-dstu</artifactId>
|
<artifactId>hapi-fhir-structures-dstu</artifactId>
|
||||||
|
|
|
@ -27,6 +27,39 @@
|
||||||
<scope>provided</scope>
|
<scope>provided</scope>
|
||||||
</dependency>
|
</dependency>
|
||||||
|
|
||||||
|
<!--
|
||||||
|
Spring is added as an optional dependency just so that it
|
||||||
|
can be used for CORS
|
||||||
|
-->
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.springframework</groupId>
|
||||||
|
<artifactId>spring-beans</artifactId>
|
||||||
|
<optional>true</optional>
|
||||||
|
<exclusions>
|
||||||
|
<exclusion>
|
||||||
|
<artifactId>commons-logging</artifactId>
|
||||||
|
<groupId>commons-logging</groupId>
|
||||||
|
</exclusion>
|
||||||
|
</exclusions>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.springframework</groupId>
|
||||||
|
<artifactId>spring-web</artifactId>
|
||||||
|
<optional>true</optional>
|
||||||
|
<exclusions>
|
||||||
|
<exclusion>
|
||||||
|
<artifactId>commons-logging</artifactId>
|
||||||
|
<groupId>commons-logging</groupId>
|
||||||
|
</exclusion>
|
||||||
|
</exclusions>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.springframework</groupId>
|
||||||
|
<artifactId>spring-test</artifactId>
|
||||||
|
<scope>test</scope>
|
||||||
|
</dependency>
|
||||||
|
|
||||||
|
|
||||||
</dependencies>
|
</dependencies>
|
||||||
|
|
||||||
<build>
|
<build>
|
||||||
|
|
|
@ -3,7 +3,6 @@ package ca.uhn.fhir.rest.api.server;
|
||||||
import ca.uhn.fhir.context.api.BundleInclusionRule;
|
import ca.uhn.fhir.context.api.BundleInclusionRule;
|
||||||
import ca.uhn.fhir.rest.server.IPagingProvider;
|
import ca.uhn.fhir.rest.server.IPagingProvider;
|
||||||
import ca.uhn.fhir.rest.server.IRestfulServerDefaults;
|
import ca.uhn.fhir.rest.server.IRestfulServerDefaults;
|
||||||
import ca.uhn.fhir.rest.server.method.RequestDetails;
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* #%L
|
* #%L
|
||||||
|
@ -26,6 +25,7 @@ import ca.uhn.fhir.rest.server.method.RequestDetails;
|
||||||
*/
|
*/
|
||||||
public interface IRestfulServer<T extends RequestDetails> extends IRestfulServerDefaults {
|
public interface IRestfulServer<T extends RequestDetails> extends IRestfulServerDefaults {
|
||||||
|
|
||||||
|
@Override
|
||||||
IPagingProvider getPagingProvider();
|
IPagingProvider getPagingProvider();
|
||||||
|
|
||||||
BundleInclusionRule getBundleInclusionRule();
|
BundleInclusionRule getBundleInclusionRule();
|
||||||
|
|
|
@ -2,9 +2,11 @@ package ca.uhn.fhir.rest.api.server;
|
||||||
|
|
||||||
import static org.apache.commons.lang3.StringUtils.isBlank;
|
import static org.apache.commons.lang3.StringUtils.isBlank;
|
||||||
|
|
||||||
import java.io.*;
|
import java.io.IOException;
|
||||||
|
import java.io.InputStream;
|
||||||
|
import java.io.Reader;
|
||||||
|
import java.io.UnsupportedEncodingException;
|
||||||
import java.nio.charset.Charset;
|
import java.nio.charset.Charset;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* #%L
|
* #%L
|
||||||
* HAPI FHIR - Core Library
|
* HAPI FHIR - Core Library
|
||||||
|
@ -24,18 +26,101 @@ import java.nio.charset.Charset;
|
||||||
* limitations under the License.
|
* limitations under the License.
|
||||||
* #L%
|
* #L%
|
||||||
*/
|
*/
|
||||||
import java.util.*;
|
import java.util.ArrayList;
|
||||||
|
import java.util.Collection;
|
||||||
|
import java.util.Collections;
|
||||||
|
import java.util.HashMap;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
import org.hl7.fhir.instance.model.api.IBaseResource;
|
import org.hl7.fhir.instance.model.api.IBaseResource;
|
||||||
import org.hl7.fhir.instance.model.api.IIdType;
|
import org.hl7.fhir.instance.model.api.IIdType;
|
||||||
|
|
||||||
import ca.uhn.fhir.rest.api.*;
|
import ca.uhn.fhir.context.FhirContext;
|
||||||
|
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.server.IRestfulServerDefaults;
|
import ca.uhn.fhir.rest.server.IRestfulServerDefaults;
|
||||||
import ca.uhn.fhir.rest.server.interceptor.IServerInterceptor;
|
import ca.uhn.fhir.rest.server.interceptor.IServerInterceptor;
|
||||||
import ca.uhn.fhir.rest.server.interceptor.IServerOperationInterceptor;
|
import ca.uhn.fhir.rest.server.interceptor.IServerOperationInterceptor;
|
||||||
|
|
||||||
public abstract class RequestDetails implements IRequestDetails {
|
public abstract class RequestDetails {
|
||||||
|
|
||||||
|
private class RequestOperationCallback implements IRequestOperationCallback {
|
||||||
|
|
||||||
|
private List<IServerInterceptor> getInterceptors() {
|
||||||
|
if (getServer() == null) {
|
||||||
|
return Collections.emptyList();
|
||||||
|
}
|
||||||
|
return getServer().getInterceptors();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void resourceCreated(IBaseResource theResource) {
|
||||||
|
for (IServerInterceptor next : getInterceptors()) {
|
||||||
|
if (next instanceof IServerOperationInterceptor) {
|
||||||
|
((IServerOperationInterceptor) next).resourceCreated(RequestDetails.this, theResource);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void resourceDeleted(IBaseResource theResource) {
|
||||||
|
for (IServerInterceptor next : getInterceptors()) {
|
||||||
|
if (next instanceof IServerOperationInterceptor) {
|
||||||
|
((IServerOperationInterceptor) next).resourceDeleted(RequestDetails.this, theResource);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void resourcesCreated(Collection<? extends IBaseResource> theResource) {
|
||||||
|
for (IBaseResource next : theResource) {
|
||||||
|
resourceCreated(next);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void resourcesDeleted(Collection<? extends IBaseResource> theResource) {
|
||||||
|
for (IBaseResource next : theResource) {
|
||||||
|
resourceDeleted(next);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @deprecated Deprecated in HAPI FHIR 2.6 - Use {@link IRequestOperationCallback#resourceUpdated(IBaseResource, IBaseResource)} instead
|
||||||
|
*/
|
||||||
|
@Deprecated
|
||||||
|
public void resourcesUpdated(Collection<? extends IBaseResource> theResource) {
|
||||||
|
for (IBaseResource next : theResource) {
|
||||||
|
resourceUpdated(next);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @deprecated Deprecated in HAPI FHIR 2.6 - Use {@link IRequestOperationCallback#resourceUpdated(IBaseResource, IBaseResource)} instead
|
||||||
|
*/
|
||||||
|
@Deprecated
|
||||||
|
@Override
|
||||||
|
public void resourceUpdated(IBaseResource theResource) {
|
||||||
|
for (IServerInterceptor next : getInterceptors()) {
|
||||||
|
if (next instanceof IServerOperationInterceptor) {
|
||||||
|
((IServerOperationInterceptor) next).resourceUpdated(RequestDetails.this, theResource);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void resourceUpdated(IBaseResource theOldResource, IBaseResource theNewResource) {
|
||||||
|
for (IServerInterceptor next : getInterceptors()) {
|
||||||
|
if (next instanceof IServerOperationInterceptor) {
|
||||||
|
((IServerOperationInterceptor) next).resourceUpdated(RequestDetails.this, theOldResource, theNewResource);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
private String myCompartmentName;
|
private String myCompartmentName;
|
||||||
private String myCompleteUrl;
|
private String myCompleteUrl;
|
||||||
private String myFhirServerBase;
|
private String myFhirServerBase;
|
||||||
|
@ -54,8 +139,9 @@ public abstract class RequestDetails implements IRequestDetails {
|
||||||
private boolean mySubRequest;
|
private boolean mySubRequest;
|
||||||
private Map<String, List<String>> myUnqualifiedToQualifiedNames;
|
private Map<String, List<String>> myUnqualifiedToQualifiedNames;
|
||||||
private Map<Object, Object> myUserData;
|
private Map<Object, Object> myUserData;
|
||||||
protected abstract byte[] getByteStreamRequestContents();
|
|
||||||
|
|
||||||
|
protected abstract byte[] getByteStreamRequestContents();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Return the charset as defined by the header contenttype. Return null if it is not set.
|
* Return the charset as defined by the header contenttype. Return null if it is not set.
|
||||||
*/
|
*/
|
||||||
|
@ -64,10 +150,10 @@ public abstract class RequestDetails implements IRequestDetails {
|
||||||
public String getCompartmentName() {
|
public String getCompartmentName() {
|
||||||
return myCompartmentName;
|
return myCompartmentName;
|
||||||
}
|
}
|
||||||
|
|
||||||
public String getCompleteUrl() {
|
public String getCompleteUrl() {
|
||||||
return myCompleteUrl;
|
return myCompleteUrl;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns the <b>conditional URL</b> if this request has one, or <code>null</code> otherwise. For an
|
* Returns the <b>conditional URL</b> if this request has one, or <code>null</code> otherwise. For an
|
||||||
* update or delete method, this is the part of the URL after the <code>?</code>. For a create, this
|
* update or delete method, this is the part of the URL after the <code>?</code>. For a create, this
|
||||||
|
@ -102,6 +188,11 @@ public abstract class RequestDetails implements IRequestDetails {
|
||||||
return this.getResourceName() + this.getCompleteUrl().substring(questionMarkIndex);
|
return this.getResourceName() + this.getCompleteUrl().substring(questionMarkIndex);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the HAPI FHIR Context associated with this request
|
||||||
|
*/
|
||||||
|
public abstract FhirContext getFhirContext();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The fhir server base url, independant of the query being executed
|
* The fhir server base url, independant of the query being executed
|
||||||
*
|
*
|
||||||
|
@ -325,7 +416,7 @@ public abstract class RequestDetails implements IRequestDetails {
|
||||||
public void setResponse(IRestfulResponse theResponse) {
|
public void setResponse(IRestfulResponse theResponse) {
|
||||||
this.myResponse = theResponse;
|
this.myResponse = theResponse;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setRestOperationType(RestOperationTypeEnum theRestOperationType) {
|
public void setRestOperationType(RestOperationTypeEnum theRestOperationType) {
|
||||||
myRestOperationType = theRestOperationType;
|
myRestOperationType = theRestOperationType;
|
||||||
}
|
}
|
||||||
|
@ -333,7 +424,7 @@ public abstract class RequestDetails implements IRequestDetails {
|
||||||
public void setSecondaryOperation(String theSecondaryOperation) {
|
public void setSecondaryOperation(String theSecondaryOperation) {
|
||||||
mySecondaryOperation = theSecondaryOperation;
|
mySecondaryOperation = theSecondaryOperation;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Is this request a sub-request (i.e. a request within a batch or transaction)? This
|
* Is this request a sub-request (i.e. a request within a batch or transaction)? This
|
||||||
* flag is used internally by hapi-fhir-jpaserver-base, but not used in the plain server
|
* flag is used internally by hapi-fhir-jpaserver-base, but not used in the plain server
|
||||||
|
@ -347,80 +438,4 @@ public abstract class RequestDetails implements IRequestDetails {
|
||||||
mySubRequest = theSubRequest;
|
mySubRequest = theSubRequest;
|
||||||
}
|
}
|
||||||
|
|
||||||
private class RequestOperationCallback implements IRequestOperationCallback {
|
|
||||||
|
|
||||||
private List<IServerInterceptor> getInterceptors() {
|
|
||||||
if (getServer() == null) {
|
|
||||||
return Collections.emptyList();
|
|
||||||
}
|
|
||||||
return getServer().getInterceptors();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void resourceCreated(IBaseResource theResource) {
|
|
||||||
for (IServerInterceptor next : getInterceptors()) {
|
|
||||||
if (next instanceof IServerOperationInterceptor) {
|
|
||||||
((IServerOperationInterceptor) next).resourceCreated(RequestDetails.this, theResource);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void resourceDeleted(IBaseResource theResource) {
|
|
||||||
for (IServerInterceptor next : getInterceptors()) {
|
|
||||||
if (next instanceof IServerOperationInterceptor) {
|
|
||||||
((IServerOperationInterceptor) next).resourceDeleted(RequestDetails.this, theResource);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void resourcesCreated(Collection<? extends IBaseResource> theResource) {
|
|
||||||
for (IBaseResource next : theResource) {
|
|
||||||
resourceCreated(next);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void resourcesDeleted(Collection<? extends IBaseResource> theResource) {
|
|
||||||
for (IBaseResource next : theResource) {
|
|
||||||
resourceDeleted(next);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @deprecated Deprecated in HAPI FHIR 2.6 - Use {@link IRequestOperationCallback#resourceUpdated(IBaseResource, IBaseResource)} instead
|
|
||||||
*/
|
|
||||||
@Deprecated
|
|
||||||
public void resourcesUpdated(Collection<? extends IBaseResource> theResource) {
|
|
||||||
for (IBaseResource next : theResource) {
|
|
||||||
resourceUpdated(next);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @deprecated Deprecated in HAPI FHIR 2.6 - Use {@link IRequestOperationCallback#resourceUpdated(IBaseResource, IBaseResource)} instead
|
|
||||||
*/
|
|
||||||
@Deprecated
|
|
||||||
@Override
|
|
||||||
public void resourceUpdated(IBaseResource theResource) {
|
|
||||||
for (IServerInterceptor next : getInterceptors()) {
|
|
||||||
if (next instanceof IServerOperationInterceptor) {
|
|
||||||
((IServerOperationInterceptor) next).resourceUpdated(RequestDetails.this, theResource);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void resourceUpdated(IBaseResource theOldResource, IBaseResource theNewResource) {
|
|
||||||
for (IServerInterceptor next : getInterceptors()) {
|
|
||||||
if (next instanceof IServerOperationInterceptor) {
|
|
||||||
((IServerOperationInterceptor) next).resourceUpdated(RequestDetails.this, theOldResource, theNewResource);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -485,7 +485,8 @@ public class RestfulServer extends HttpServlet implements IRestfulServer<Servlet
|
||||||
}
|
}
|
||||||
|
|
||||||
public IResourceProvider getServerProfilesProvider() {
|
public IResourceProvider getServerProfilesProvider() {
|
||||||
return getFhirContext().getVersion().createServerProfilesProvider(this);
|
IFhirVersionServer versionServer = (IFhirVersionServer) getFhirContext().getVersion().getServerVersion();
|
||||||
|
return versionServer.createServerProfilesProvider(this);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -762,7 +763,8 @@ public class RestfulServer extends HttpServlet implements IRestfulServer<Servlet
|
||||||
|
|
||||||
confProvider = getServerConformanceProvider();
|
confProvider = getServerConformanceProvider();
|
||||||
if (confProvider == null) {
|
if (confProvider == null) {
|
||||||
confProvider = getFhirContext().getVersion().createServerConformanceProvider(this);
|
IFhirVersionServer versionServer = (IFhirVersionServer) getFhirContext().getVersion().getServerVersion();
|
||||||
|
confProvider = versionServer.createServerConformanceProvider(this);
|
||||||
}
|
}
|
||||||
// findSystemMethods(confProvider);
|
// findSystemMethods(confProvider);
|
||||||
findResourceMethods(confProvider);
|
findResourceMethods(confProvider);
|
||||||
|
|
|
@ -22,24 +22,47 @@ package ca.uhn.fhir.rest.server;
|
||||||
import static org.apache.commons.lang3.StringUtils.isBlank;
|
import static org.apache.commons.lang3.StringUtils.isBlank;
|
||||||
import static org.apache.commons.lang3.StringUtils.isNotBlank;
|
import static org.apache.commons.lang3.StringUtils.isNotBlank;
|
||||||
|
|
||||||
import java.io.*;
|
import java.io.IOException;
|
||||||
|
import java.io.UnsupportedEncodingException;
|
||||||
|
import java.io.Writer;
|
||||||
import java.net.URLEncoder;
|
import java.net.URLEncoder;
|
||||||
import java.util.*;
|
import java.util.Arrays;
|
||||||
|
import java.util.Collections;
|
||||||
|
import java.util.Date;
|
||||||
|
import java.util.Enumeration;
|
||||||
|
import java.util.HashSet;
|
||||||
|
import java.util.Iterator;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Map;
|
||||||
|
import java.util.Set;
|
||||||
|
import java.util.StringTokenizer;
|
||||||
import java.util.regex.Matcher;
|
import java.util.regex.Matcher;
|
||||||
import java.util.regex.Pattern;
|
import java.util.regex.Pattern;
|
||||||
|
|
||||||
import javax.servlet.http.HttpServletRequest;
|
import javax.servlet.http.HttpServletRequest;
|
||||||
|
|
||||||
import org.apache.commons.lang3.StringUtils;
|
import org.apache.commons.lang3.StringUtils;
|
||||||
import org.hl7.fhir.instance.model.api.*;
|
import org.hl7.fhir.instance.model.api.IAnyResource;
|
||||||
|
import org.hl7.fhir.instance.model.api.IBaseBinary;
|
||||||
|
import org.hl7.fhir.instance.model.api.IBaseResource;
|
||||||
|
import org.hl7.fhir.instance.model.api.IIdType;
|
||||||
|
import org.hl7.fhir.instance.model.api.IPrimitiveType;
|
||||||
|
|
||||||
import ca.uhn.fhir.context.FhirContext;
|
import ca.uhn.fhir.context.FhirContext;
|
||||||
import ca.uhn.fhir.context.FhirVersionEnum;
|
import ca.uhn.fhir.context.FhirVersionEnum;
|
||||||
import ca.uhn.fhir.model.api.*;
|
import ca.uhn.fhir.model.api.Bundle;
|
||||||
|
import ca.uhn.fhir.model.api.IResource;
|
||||||
|
import ca.uhn.fhir.model.api.Include;
|
||||||
|
import ca.uhn.fhir.model.api.ResourceMetadataKeyEnum;
|
||||||
|
import ca.uhn.fhir.model.api.Tag;
|
||||||
|
import ca.uhn.fhir.model.api.TagList;
|
||||||
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.parser.IParser;
|
import ca.uhn.fhir.parser.IParser;
|
||||||
import ca.uhn.fhir.rest.api.*;
|
import ca.uhn.fhir.rest.api.Constants;
|
||||||
|
import ca.uhn.fhir.rest.api.EncodingEnum;
|
||||||
|
import ca.uhn.fhir.rest.api.PreferReturnEnum;
|
||||||
|
import ca.uhn.fhir.rest.api.SummaryEnum;
|
||||||
import ca.uhn.fhir.rest.api.server.IRestfulResponse;
|
import ca.uhn.fhir.rest.api.server.IRestfulResponse;
|
||||||
import ca.uhn.fhir.rest.api.server.RequestDetails;
|
import ca.uhn.fhir.rest.api.server.RequestDetails;
|
||||||
import ca.uhn.fhir.rest.server.exceptions.InternalErrorException;
|
import ca.uhn.fhir.rest.server.exceptions.InternalErrorException;
|
||||||
|
|
|
@ -1,5 +1,7 @@
|
||||||
package ca.uhn.fhir.rest.server.method;
|
package ca.uhn.fhir.rest.server.method;
|
||||||
|
|
||||||
|
import java.io.IOException;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* #%L
|
* #%L
|
||||||
* HAPI FHIR - Core Library
|
* HAPI FHIR - Core Library
|
||||||
|
@ -25,6 +27,9 @@ import java.lang.reflect.Method;
|
||||||
import ca.uhn.fhir.context.FhirContext;
|
import ca.uhn.fhir.context.FhirContext;
|
||||||
import ca.uhn.fhir.rest.annotation.AddTags;
|
import ca.uhn.fhir.rest.annotation.AddTags;
|
||||||
import ca.uhn.fhir.rest.api.RestOperationTypeEnum;
|
import ca.uhn.fhir.rest.api.RestOperationTypeEnum;
|
||||||
|
import ca.uhn.fhir.rest.api.server.IRestfulServer;
|
||||||
|
import ca.uhn.fhir.rest.api.server.RequestDetails;
|
||||||
|
import ca.uhn.fhir.rest.server.exceptions.BaseServerResponseException;
|
||||||
|
|
||||||
class AddTagsMethodBinding extends BaseAddOrDeleteTagsMethodBinding {
|
class AddTagsMethodBinding extends BaseAddOrDeleteTagsMethodBinding {
|
||||||
|
|
||||||
|
@ -42,4 +47,9 @@ class AddTagsMethodBinding extends BaseAddOrDeleteTagsMethodBinding {
|
||||||
return RestOperationTypeEnum.ADD_TAGS;
|
return RestOperationTypeEnum.ADD_TAGS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Object invokeServer(IRestfulServer<?> theServer, RequestDetails theRequest) throws BaseServerResponseException, IOException {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -28,6 +28,7 @@ import java.util.List;
|
||||||
import ca.uhn.fhir.context.FhirContext;
|
import ca.uhn.fhir.context.FhirContext;
|
||||||
import ca.uhn.fhir.model.api.IQueryParameterOr;
|
import ca.uhn.fhir.model.api.IQueryParameterOr;
|
||||||
import ca.uhn.fhir.rest.api.QualifiedParamList;
|
import ca.uhn.fhir.rest.api.QualifiedParamList;
|
||||||
|
import ca.uhn.fhir.rest.param.ParameterUtil;
|
||||||
import ca.uhn.fhir.rest.param.StringParam;
|
import ca.uhn.fhir.rest.param.StringParam;
|
||||||
import ca.uhn.fhir.rest.server.exceptions.InternalErrorException;
|
import ca.uhn.fhir.rest.server.exceptions.InternalErrorException;
|
||||||
import ca.uhn.fhir.rest.server.exceptions.InvalidRequestException;
|
import ca.uhn.fhir.rest.server.exceptions.InvalidRequestException;
|
||||||
|
@ -49,7 +50,7 @@ abstract class BaseJavaPrimitiveBinder<T>implements IParamBinder<T> {
|
||||||
if (isBlank(retVal)) {
|
if (isBlank(retVal)) {
|
||||||
return Collections.emptyList();
|
return Collections.emptyList();
|
||||||
}
|
}
|
||||||
List<?> retValList = Collections.singletonList(MethodUtil.singleton(new StringParam(retVal), null));
|
List<?> retValList = Collections.singletonList(ParameterUtil.singleton(new StringParam(retVal), null));
|
||||||
return (List<IQueryParameterOr<?>>) retValList;
|
return (List<IQueryParameterOr<?>>) retValList;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -46,13 +46,32 @@ import ca.uhn.fhir.model.api.Include;
|
||||||
import ca.uhn.fhir.model.api.TagList;
|
import ca.uhn.fhir.model.api.TagList;
|
||||||
import ca.uhn.fhir.model.base.resource.BaseOperationOutcome;
|
import ca.uhn.fhir.model.base.resource.BaseOperationOutcome;
|
||||||
import ca.uhn.fhir.parser.IParser;
|
import ca.uhn.fhir.parser.IParser;
|
||||||
import ca.uhn.fhir.rest.annotation.*;
|
import ca.uhn.fhir.rest.annotation.AddTags;
|
||||||
import ca.uhn.fhir.rest.api.*;
|
import ca.uhn.fhir.rest.annotation.Create;
|
||||||
import ca.uhn.fhir.rest.api.server.*;
|
import ca.uhn.fhir.rest.annotation.Delete;
|
||||||
|
import ca.uhn.fhir.rest.annotation.DeleteTags;
|
||||||
|
import ca.uhn.fhir.rest.annotation.GetPage;
|
||||||
|
import ca.uhn.fhir.rest.annotation.GetTags;
|
||||||
|
import ca.uhn.fhir.rest.annotation.History;
|
||||||
|
import ca.uhn.fhir.rest.annotation.Metadata;
|
||||||
|
import ca.uhn.fhir.rest.annotation.Operation;
|
||||||
|
import ca.uhn.fhir.rest.annotation.Patch;
|
||||||
|
import ca.uhn.fhir.rest.annotation.Read;
|
||||||
|
import ca.uhn.fhir.rest.annotation.Search;
|
||||||
|
import ca.uhn.fhir.rest.annotation.Transaction;
|
||||||
|
import ca.uhn.fhir.rest.annotation.Update;
|
||||||
|
import ca.uhn.fhir.rest.annotation.Validate;
|
||||||
|
import ca.uhn.fhir.rest.api.Constants;
|
||||||
|
import ca.uhn.fhir.rest.api.EncodingEnum;
|
||||||
|
import ca.uhn.fhir.rest.api.MethodOutcome;
|
||||||
|
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.client.exceptions.NonFhirResponseException;
|
import ca.uhn.fhir.rest.client.exceptions.NonFhirResponseException;
|
||||||
import ca.uhn.fhir.rest.client.impl.BaseHttpClientInvocation;
|
import ca.uhn.fhir.rest.server.BundleProviders;
|
||||||
import ca.uhn.fhir.rest.param.IParameter;
|
import ca.uhn.fhir.rest.server.IDynamicSearchResourceProvider;
|
||||||
import ca.uhn.fhir.rest.server.*;
|
import ca.uhn.fhir.rest.server.IResourceProvider;
|
||||||
import ca.uhn.fhir.rest.server.exceptions.BaseServerResponseException;
|
import ca.uhn.fhir.rest.server.exceptions.BaseServerResponseException;
|
||||||
import ca.uhn.fhir.rest.server.exceptions.InternalErrorException;
|
import ca.uhn.fhir.rest.server.exceptions.InternalErrorException;
|
||||||
import ca.uhn.fhir.rest.server.exceptions.InvalidRequestException;
|
import ca.uhn.fhir.rest.server.exceptions.InvalidRequestException;
|
||||||
|
@ -67,7 +86,7 @@ import ca.uhn.fhir.rest.server.interceptor.IServerInterceptor.ActionRequestDetai
|
||||||
import ca.uhn.fhir.rest.server.servlet.ServletRequestDetails;
|
import ca.uhn.fhir.rest.server.servlet.ServletRequestDetails;
|
||||||
import ca.uhn.fhir.util.ReflectionUtil;
|
import ca.uhn.fhir.util.ReflectionUtil;
|
||||||
|
|
||||||
public abstract class BaseMethodBinding<T> implements IClientResponseHandler<T>, IServerMethodBinding {
|
public abstract class BaseMethodBinding<T> {
|
||||||
|
|
||||||
private static final org.slf4j.Logger ourLog = org.slf4j.LoggerFactory.getLogger(BaseMethodBinding.class);
|
private static final org.slf4j.Logger ourLog = org.slf4j.LoggerFactory.getLogger(BaseMethodBinding.class);
|
||||||
private FhirContext myContext;
|
private FhirContext myContext;
|
||||||
|
@ -232,8 +251,6 @@ public abstract class BaseMethodBinding<T> implements IClientResponseHandler<T>,
|
||||||
|
|
||||||
public abstract boolean incomingServerRequestMatchesMethod(RequestDetails theRequest);
|
public abstract boolean incomingServerRequestMatchesMethod(RequestDetails theRequest);
|
||||||
|
|
||||||
public abstract BaseHttpClientInvocation invokeClient(Object[] theArgs) throws InternalErrorException;
|
|
||||||
|
|
||||||
public abstract Object invokeServer(IRestfulServer<?> theServer, RequestDetails theRequest) throws BaseServerResponseException, IOException;
|
public abstract Object invokeServer(IRestfulServer<?> theServer, RequestDetails theRequest) throws BaseServerResponseException, IOException;
|
||||||
|
|
||||||
protected final Object invokeServerMethod(IRestfulServer<?> theServer, RequestDetails theRequest, Object[] theMethodParams) {
|
protected final Object invokeServerMethod(IRestfulServer<?> theServer, RequestDetails theRequest, Object[] theMethodParams) {
|
||||||
|
|
|
@ -21,13 +21,10 @@ package ca.uhn.fhir.rest.server.method;
|
||||||
*/
|
*/
|
||||||
|
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.io.Reader;
|
|
||||||
import java.io.Writer;
|
import java.io.Writer;
|
||||||
import java.lang.reflect.Method;
|
import java.lang.reflect.Method;
|
||||||
import java.util.Collections;
|
import java.util.Collections;
|
||||||
import java.util.EnumSet;
|
import java.util.EnumSet;
|
||||||
import java.util.List;
|
|
||||||
import java.util.Map;
|
|
||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
|
|
||||||
import javax.servlet.http.HttpServletResponse;
|
import javax.servlet.http.HttpServletResponse;
|
||||||
|
@ -39,12 +36,19 @@ 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;
|
||||||
import ca.uhn.fhir.model.api.IResource;
|
|
||||||
import ca.uhn.fhir.parser.IParser;
|
import ca.uhn.fhir.parser.IParser;
|
||||||
import ca.uhn.fhir.rest.api.*;
|
import ca.uhn.fhir.rest.api.Constants;
|
||||||
import ca.uhn.fhir.rest.api.server.*;
|
import ca.uhn.fhir.rest.api.EncodingEnum;
|
||||||
import ca.uhn.fhir.rest.client.impl.BaseHttpClientInvocation;
|
import ca.uhn.fhir.rest.api.MethodOutcome;
|
||||||
import ca.uhn.fhir.rest.server.*;
|
import ca.uhn.fhir.rest.api.PreferReturnEnum;
|
||||||
|
import ca.uhn.fhir.rest.api.RequestTypeEnum;
|
||||||
|
import ca.uhn.fhir.rest.api.RestOperationTypeEnum;
|
||||||
|
import ca.uhn.fhir.rest.api.SummaryEnum;
|
||||||
|
import ca.uhn.fhir.rest.api.server.IRestfulResponse;
|
||||||
|
import ca.uhn.fhir.rest.api.server.IRestfulServer;
|
||||||
|
import ca.uhn.fhir.rest.api.server.RequestDetails;
|
||||||
|
import ca.uhn.fhir.rest.server.RestfulServer;
|
||||||
|
import ca.uhn.fhir.rest.server.RestfulServerUtils;
|
||||||
import ca.uhn.fhir.rest.server.exceptions.BaseServerResponseException;
|
import ca.uhn.fhir.rest.server.exceptions.BaseServerResponseException;
|
||||||
import ca.uhn.fhir.rest.server.exceptions.InternalErrorException;
|
import ca.uhn.fhir.rest.server.exceptions.InternalErrorException;
|
||||||
import ca.uhn.fhir.rest.server.interceptor.IServerInterceptor;
|
import ca.uhn.fhir.rest.server.interceptor.IServerInterceptor;
|
||||||
|
@ -77,8 +81,6 @@ abstract class BaseOutcomeReturningMethodBinding extends BaseMethodBinding<Metho
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
protected abstract BaseHttpClientInvocation createClientInvocation(Object[] theArgs, IResource resource);
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* For servers, this method will match only incoming requests that match the given operation, or which have no
|
* For servers, this method will match only incoming requests that match the given operation, or which have no
|
||||||
* operation in the URL if this method returns null.
|
* operation in the URL if this method returns null.
|
||||||
|
@ -148,18 +150,6 @@ abstract class BaseOutcomeReturningMethodBinding extends BaseMethodBinding<Metho
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
public MethodOutcome invokeClient(String theResponseMimeType, Reader theResponseReader, int theResponseStatusCode, Map<String, List<String>> theHeaders) throws BaseServerResponseException {
|
|
||||||
if (theResponseStatusCode >= 200 && theResponseStatusCode < 300) {
|
|
||||||
if (myReturnVoid) {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
MethodOutcome retVal = MethodUtil.process2xxResponse(getContext(), theResponseStatusCode, theResponseMimeType, theResponseReader, theHeaders);
|
|
||||||
return retVal;
|
|
||||||
}
|
|
||||||
throw processNon2xxResponseAndReturnExceptionToThrow(theResponseStatusCode, theResponseMimeType, theResponseReader);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Object invokeServer(IRestfulServer<?> theServer, RequestDetails theRequest) throws BaseServerResponseException, IOException {
|
public Object invokeServer(IRestfulServer<?> theServer, RequestDetails theRequest) throws BaseServerResponseException, IOException {
|
||||||
|
|
||||||
|
|
|
@ -24,13 +24,10 @@ import java.lang.reflect.Method;
|
||||||
|
|
||||||
import org.hl7.fhir.instance.model.api.IBaseResource;
|
import org.hl7.fhir.instance.model.api.IBaseResource;
|
||||||
|
|
||||||
import ca.uhn.fhir.context.ConfigurationException;
|
import ca.uhn.fhir.context.*;
|
||||||
import ca.uhn.fhir.context.FhirContext;
|
|
||||||
import ca.uhn.fhir.context.RuntimeResourceDefinition;
|
|
||||||
import ca.uhn.fhir.rest.annotation.Delete;
|
|
||||||
import ca.uhn.fhir.rest.annotation.IdParam;
|
|
||||||
//TODO Use of a deprecated method should be resolved
|
//TODO Use of a deprecated method should be resolved
|
||||||
import ca.uhn.fhir.rest.annotation.VersionIdParam;
|
import ca.uhn.fhir.rest.annotation.*;
|
||||||
|
import ca.uhn.fhir.rest.param.ParameterUtil;
|
||||||
import ca.uhn.fhir.rest.server.IResourceProvider;
|
import ca.uhn.fhir.rest.server.IResourceProvider;
|
||||||
|
|
||||||
public abstract class BaseOutcomeReturningMethodBindingWithResourceIdButNoResourceBody extends BaseOutcomeReturningMethodBinding {
|
public abstract class BaseOutcomeReturningMethodBindingWithResourceIdButNoResourceBody extends BaseOutcomeReturningMethodBinding {
|
||||||
|
@ -55,12 +52,12 @@ public abstract class BaseOutcomeReturningMethodBindingWithResourceIdButNoResour
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
myIdParameterIndex = MethodUtil.findIdParameterIndex(theMethod, getContext());
|
myIdParameterIndex = ParameterUtil.findIdParameterIndex(theMethod, getContext());
|
||||||
if (myIdParameterIndex == null) {
|
if (myIdParameterIndex == null) {
|
||||||
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 = MethodUtil.findVersionIdParameterIndex(theMethod);
|
Integer versionIdParameterIndex = ParameterUtil.findVersionIdParameterIndex(theMethod);
|
||||||
if (versionIdParameterIndex != null) {
|
if (versionIdParameterIndex != null) {
|
||||||
//TODO Use of a deprecated method should be resolved
|
//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");
|
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");
|
||||||
|
|
|
@ -31,13 +31,10 @@ 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;
|
||||||
import ca.uhn.fhir.context.FhirVersionEnum;
|
import ca.uhn.fhir.context.FhirVersionEnum;
|
||||||
import ca.uhn.fhir.model.api.IResource;
|
|
||||||
import ca.uhn.fhir.rest.annotation.ResourceParam;
|
import ca.uhn.fhir.rest.annotation.ResourceParam;
|
||||||
import ca.uhn.fhir.rest.api.server.RequestDetails;
|
import ca.uhn.fhir.rest.api.server.RequestDetails;
|
||||||
import ca.uhn.fhir.rest.client.impl.BaseHttpClientInvocation;
|
import ca.uhn.fhir.rest.param.ParameterUtil;
|
||||||
import ca.uhn.fhir.rest.param.IParameter;
|
|
||||||
import ca.uhn.fhir.rest.server.IResourceProvider;
|
import ca.uhn.fhir.rest.server.IResourceProvider;
|
||||||
import ca.uhn.fhir.rest.server.exceptions.InternalErrorException;
|
|
||||||
import ca.uhn.fhir.rest.server.interceptor.IServerInterceptor.ActionRequestDetails;
|
import ca.uhn.fhir.rest.server.interceptor.IServerInterceptor.ActionRequestDetails;
|
||||||
|
|
||||||
abstract class BaseOutcomeReturningMethodBindingWithResourceParam extends BaseOutcomeReturningMethodBinding {
|
abstract class BaseOutcomeReturningMethodBindingWithResourceParam extends BaseOutcomeReturningMethodBinding {
|
||||||
|
@ -82,7 +79,7 @@ abstract class BaseOutcomeReturningMethodBindingWithResourceParam extends BaseOu
|
||||||
}
|
}
|
||||||
|
|
||||||
myResourceName = theContext.getResourceDefinition(myResourceType).getName();
|
myResourceName = theContext.getResourceDefinition(myResourceType).getName();
|
||||||
myIdParamIndex = MethodUtil.findIdParameterIndex(theMethod, getContext());
|
myIdParamIndex = ParameterUtil.findIdParameterIndex(theMethod, getContext());
|
||||||
if (myIdParamIndex != null) {
|
if (myIdParamIndex != null) {
|
||||||
myIdParamType = (Class<? extends IIdType>) theMethod.getParameterTypes()[myIdParamIndex];
|
myIdParamType = (Class<? extends IIdType>) theMethod.getParameterTypes()[myIdParamIndex];
|
||||||
}
|
}
|
||||||
|
@ -96,7 +93,7 @@ abstract class BaseOutcomeReturningMethodBindingWithResourceParam extends BaseOu
|
||||||
@Override
|
@Override
|
||||||
protected void addParametersForServerRequest(RequestDetails theRequest, Object[] theParams) {
|
protected void addParametersForServerRequest(RequestDetails theRequest, Object[] theParams) {
|
||||||
if (myIdParamIndex != null) {
|
if (myIdParamIndex != null) {
|
||||||
theParams[myIdParamIndex] = MethodUtil.convertIdToType(theRequest.getId(), myIdParamType);
|
theParams[myIdParamIndex] = ParameterUtil.convertIdToType(theRequest.getId(), myIdParamType);
|
||||||
}
|
}
|
||||||
if (myResourceParameterIndex != -1) {
|
if (myResourceParameterIndex != -1) {
|
||||||
IBaseResource resource = ((IBaseResource) theParams[myResourceParameterIndex]);
|
IBaseResource resource = ((IBaseResource) theParams[myResourceParameterIndex]);
|
||||||
|
@ -124,17 +121,6 @@ abstract class BaseOutcomeReturningMethodBindingWithResourceParam extends BaseOu
|
||||||
return myResourceName;
|
return myResourceName;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
public BaseHttpClientInvocation invokeClient(Object[] theArgs) throws InternalErrorException {
|
|
||||||
IResource resource = (IResource) theArgs[myResourceParameterIndex]; // TODO: use IBaseResource
|
|
||||||
if (resource == null) {
|
|
||||||
throw new NullPointerException("Resource can not be null");
|
|
||||||
}
|
|
||||||
|
|
||||||
BaseHttpClientInvocation retVal = createClientInvocation(theArgs, resource);
|
|
||||||
return retVal;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected void populateActionRequestDetailsForInterceptor(RequestDetails theRequestDetails, ActionRequestDetails theDetails, Object[] theMethodParams) {
|
protected void populateActionRequestDetailsForInterceptor(RequestDetails theRequestDetails, ActionRequestDetails theDetails, Object[] theMethodParams) {
|
||||||
super.populateActionRequestDetailsForInterceptor(theRequestDetails, theDetails, theMethodParams);
|
super.populateActionRequestDetailsForInterceptor(theRequestDetails, theDetails, theMethodParams);
|
||||||
|
|
|
@ -1,7 +1,5 @@
|
||||||
package ca.uhn.fhir.rest.server.method;
|
package ca.uhn.fhir.rest.server.method;
|
||||||
|
|
||||||
import static org.apache.commons.lang3.StringUtils.isNotBlank;
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* #%L
|
* #%L
|
||||||
* HAPI FHIR - Core Library
|
* HAPI FHIR - Core Library
|
||||||
|
@ -23,15 +21,17 @@ import static org.apache.commons.lang3.StringUtils.isNotBlank;
|
||||||
*/
|
*/
|
||||||
|
|
||||||
import java.lang.reflect.Method;
|
import java.lang.reflect.Method;
|
||||||
import java.util.*;
|
import java.util.ArrayList;
|
||||||
|
import java.util.Collection;
|
||||||
import org.hl7.fhir.instance.model.api.IBaseResource;
|
import java.util.List;
|
||||||
|
import java.util.Set;
|
||||||
|
|
||||||
import ca.uhn.fhir.context.FhirContext;
|
import ca.uhn.fhir.context.FhirContext;
|
||||||
import ca.uhn.fhir.rest.api.QualifiedParamList;
|
import ca.uhn.fhir.rest.api.QualifiedParamList;
|
||||||
import ca.uhn.fhir.rest.api.RestSearchParameterTypeEnum;
|
import ca.uhn.fhir.rest.api.RestSearchParameterTypeEnum;
|
||||||
import ca.uhn.fhir.rest.api.server.IRequestDetails;
|
import ca.uhn.fhir.rest.api.server.IRequestDetails;
|
||||||
import ca.uhn.fhir.rest.api.server.IServerMethodBinding;
|
import ca.uhn.fhir.rest.api.server.RequestDetails;
|
||||||
|
import ca.uhn.fhir.rest.param.QualifierDetails;
|
||||||
import ca.uhn.fhir.rest.server.exceptions.InternalErrorException;
|
import ca.uhn.fhir.rest.server.exceptions.InternalErrorException;
|
||||||
import ca.uhn.fhir.rest.server.exceptions.InvalidRequestException;
|
import ca.uhn.fhir.rest.server.exceptions.InvalidRequestException;
|
||||||
|
|
||||||
|
@ -74,7 +74,7 @@ public abstract class BaseQueryParameter implements IParameter {
|
||||||
|
|
||||||
public abstract Object parse(FhirContext theContext, List<QualifiedParamList> theString) throws InternalErrorException, InvalidRequestException;
|
public abstract Object parse(FhirContext theContext, List<QualifiedParamList> theString) throws InternalErrorException, InvalidRequestException;
|
||||||
|
|
||||||
private void parseParams(IRequestDetails theRequest, List<QualifiedParamList> paramList, String theQualifiedParamName, String theQualifier) {
|
private void parseParams(RequestDetails theRequest, List<QualifiedParamList> paramList, String theQualifiedParamName, String theQualifier) {
|
||||||
QualifierDetails qualifiers = QualifierDetails.extractQualifiersFromParameterName(theQualifier);
|
QualifierDetails qualifiers = QualifierDetails.extractQualifiersFromParameterName(theQualifier);
|
||||||
if (!qualifiers.passes(getQualifierWhitelist(), getQualifierBlacklist())) {
|
if (!qualifiers.passes(getQualifierWhitelist(), getQualifierBlacklist())) {
|
||||||
return;
|
return;
|
||||||
|
@ -92,40 +92,9 @@ public abstract class BaseQueryParameter implements IParameter {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
public void translateClientArgumentIntoQueryArgument(FhirContext theContext, Object theSourceClientArgument, Map<String, List<String>> theTargetQueryArguments, IBaseResource theTargetResource) throws InternalErrorException {
|
|
||||||
if (theSourceClientArgument == null) {
|
|
||||||
if (isRequired()) {
|
|
||||||
throw new NullPointerException("SearchParameter '" + getName() + "' is required and may not be null");
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
List<QualifiedParamList> value = encode(theContext, theSourceClientArgument);
|
|
||||||
|
|
||||||
for (QualifiedParamList nextParamEntry : value) {
|
|
||||||
StringBuilder b = new StringBuilder();
|
|
||||||
for (String str : nextParamEntry) {
|
|
||||||
if (b.length() > 0) {
|
|
||||||
b.append(",");
|
|
||||||
}
|
|
||||||
b.append(str);
|
|
||||||
}
|
|
||||||
|
|
||||||
String qualifier = nextParamEntry.getQualifier();
|
|
||||||
String paramName = isNotBlank(qualifier) ? getName() + qualifier : getName();
|
|
||||||
List<String> paramValues = theTargetQueryArguments.get(paramName);
|
|
||||||
if (paramValues == null) {
|
|
||||||
paramValues = new ArrayList<String>(value.size());
|
|
||||||
theTargetQueryArguments.put(paramName, paramValues);
|
|
||||||
}
|
|
||||||
|
|
||||||
paramValues.add(b.toString());
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Object translateQueryParametersIntoServerArgument(IRequestDetails theRequest, IServerMethodBinding theMethodBinding) throws InternalErrorException, InvalidRequestException {
|
public Object translateQueryParametersIntoServerArgument(RequestDetails theRequest, BaseMethodBinding<?> theMethodBinding) throws InternalErrorException, InvalidRequestException {
|
||||||
|
|
||||||
List<QualifiedParamList> paramList = new ArrayList<QualifiedParamList>();
|
List<QualifiedParamList> paramList = new ArrayList<QualifiedParamList>();
|
||||||
String name = getName();
|
String name = getName();
|
||||||
|
|
|
@ -1,5 +1,6 @@
|
||||||
package ca.uhn.fhir.rest.server.method;
|
package ca.uhn.fhir.rest.server.method;
|
||||||
|
|
||||||
|
import static org.apache.commons.lang3.StringUtils.isBlank;
|
||||||
/*
|
/*
|
||||||
* #%L
|
* #%L
|
||||||
* HAPI FHIR - Core Library
|
* HAPI FHIR - Core Library
|
||||||
|
@ -22,37 +23,26 @@ 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.io.IOException;
|
import java.io.IOException;
|
||||||
import java.io.Reader;
|
|
||||||
import java.lang.reflect.Method;
|
import java.lang.reflect.Method;
|
||||||
import java.lang.reflect.Modifier;
|
import java.lang.reflect.Modifier;
|
||||||
import java.util.*;
|
import java.util.*;
|
||||||
|
|
||||||
import org.hl7.fhir.instance.model.api.IBaseBundle;
|
|
||||||
import org.hl7.fhir.instance.model.api.IBaseOperationOutcome;
|
|
||||||
import org.hl7.fhir.instance.model.api.IBaseResource;
|
import org.hl7.fhir.instance.model.api.IBaseResource;
|
||||||
import org.hl7.fhir.instance.model.api.IPrimitiveType;
|
import org.hl7.fhir.instance.model.api.IPrimitiveType;
|
||||||
|
|
||||||
import ca.uhn.fhir.context.ConfigurationException;
|
import ca.uhn.fhir.context.ConfigurationException;
|
||||||
import ca.uhn.fhir.context.FhirContext;
|
import ca.uhn.fhir.context.FhirContext;
|
||||||
import ca.uhn.fhir.context.FhirVersionEnum;
|
import ca.uhn.fhir.model.api.*;
|
||||||
import ca.uhn.fhir.model.api.Bundle;
|
import ca.uhn.fhir.model.base.resource.BaseOperationOutcome;
|
||||||
import ca.uhn.fhir.model.api.IResource;
|
|
||||||
import ca.uhn.fhir.model.api.Include;
|
|
||||||
import ca.uhn.fhir.model.valueset.BundleTypeEnum;
|
import ca.uhn.fhir.model.valueset.BundleTypeEnum;
|
||||||
import ca.uhn.fhir.parser.IParser;
|
|
||||||
import ca.uhn.fhir.rest.api.*;
|
import ca.uhn.fhir.rest.api.*;
|
||||||
import ca.uhn.fhir.rest.api.server.*;
|
import ca.uhn.fhir.rest.api.server.*;
|
||||||
import ca.uhn.fhir.rest.client.exceptions.InvalidResponseException;
|
import ca.uhn.fhir.rest.server.IPagingProvider;
|
||||||
import ca.uhn.fhir.rest.param.IParameter;
|
import ca.uhn.fhir.rest.server.RestfulServerUtils;
|
||||||
import ca.uhn.fhir.rest.server.*;
|
|
||||||
import ca.uhn.fhir.rest.server.RestfulServerUtils.ResponseEncoding;
|
import ca.uhn.fhir.rest.server.RestfulServerUtils.ResponseEncoding;
|
||||||
import ca.uhn.fhir.rest.server.exceptions.BaseServerResponseException;
|
import ca.uhn.fhir.rest.server.exceptions.*;
|
||||||
import ca.uhn.fhir.rest.server.exceptions.InternalErrorException;
|
|
||||||
import ca.uhn.fhir.rest.server.exceptions.InvalidRequestException;
|
|
||||||
import ca.uhn.fhir.rest.server.exceptions.ResourceNotFoundException;
|
|
||||||
import ca.uhn.fhir.rest.server.interceptor.IServerInterceptor;
|
import ca.uhn.fhir.rest.server.interceptor.IServerInterceptor;
|
||||||
import ca.uhn.fhir.rest.server.interceptor.ResponseHighlighterInterceptor;
|
import ca.uhn.fhir.rest.server.interceptor.ResponseHighlighterInterceptor;
|
||||||
import ca.uhn.fhir.util.BundleUtil;
|
|
||||||
import ca.uhn.fhir.util.ReflectionUtil;
|
import ca.uhn.fhir.util.ReflectionUtil;
|
||||||
import ca.uhn.fhir.util.UrlUtil;
|
import ca.uhn.fhir.util.UrlUtil;
|
||||||
|
|
||||||
|
@ -76,10 +66,8 @@ public abstract class BaseResourceReturningMethodBinding extends BaseMethodBindi
|
||||||
}
|
}
|
||||||
|
|
||||||
private MethodReturnTypeEnum myMethodReturnType;
|
private MethodReturnTypeEnum myMethodReturnType;
|
||||||
private Class<?> myResourceListCollectionType;
|
|
||||||
private String myResourceName;
|
private String myResourceName;
|
||||||
private Class<? extends IBaseResource> myResourceType;
|
private Class<? extends IBaseResource> myResourceType;
|
||||||
private List<Class<? extends IBaseResource>> myPreferTypesList;
|
|
||||||
|
|
||||||
@SuppressWarnings("unchecked")
|
@SuppressWarnings("unchecked")
|
||||||
public BaseResourceReturningMethodBinding(Class<?> theReturnResourceType, Method theMethod, FhirContext theContext, Object theProvider) {
|
public BaseResourceReturningMethodBinding(Class<?> theReturnResourceType, Method theMethod, FhirContext theContext, Object theProvider) {
|
||||||
|
@ -96,7 +84,6 @@ public abstract class BaseResourceReturningMethodBinding extends BaseMethodBindi
|
||||||
"Method " + theMethod.getDeclaringClass().getSimpleName() + "#" + theMethod.getName() + " returns an invalid collection generic type: " + collectionType);
|
"Method " + theMethod.getDeclaringClass().getSimpleName() + "#" + theMethod.getName() + " returns an invalid collection generic type: " + collectionType);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
myResourceListCollectionType = collectionType;
|
|
||||||
|
|
||||||
} else if (IBaseResource.class.isAssignableFrom(methodReturnType)) {
|
} else if (IBaseResource.class.isAssignableFrom(methodReturnType)) {
|
||||||
if (Modifier.isAbstract(methodReturnType.getModifiers()) == false && theContext.getResourceDefinition((Class<? extends IBaseResource>) methodReturnType).isBundle()) {
|
if (Modifier.isAbstract(methodReturnType.getModifiers()) == false && theContext.getResourceDefinition((Class<? extends IBaseResource>) methodReturnType).isBundle()) {
|
||||||
|
@ -126,7 +113,6 @@ public abstract class BaseResourceReturningMethodBinding extends BaseMethodBindi
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
myPreferTypesList = createPreferTypesList();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public MethodReturnTypeEnum getMethodReturnType() {
|
public MethodReturnTypeEnum getMethodReturnType() {
|
||||||
|
@ -145,30 +131,16 @@ public abstract class BaseResourceReturningMethodBinding extends BaseMethodBindi
|
||||||
|
|
||||||
public abstract ReturnTypeEnum getReturnType();
|
public abstract ReturnTypeEnum getReturnType();
|
||||||
|
|
||||||
@SuppressWarnings("unchecked")
|
|
||||||
private List<Class<? extends IBaseResource>> createPreferTypesList() {
|
|
||||||
List<Class<? extends IBaseResource>> preferTypes = null;
|
|
||||||
if (myResourceListCollectionType != null && IBaseResource.class.isAssignableFrom(myResourceListCollectionType)) {
|
|
||||||
preferTypes = new ArrayList<Class<? extends IBaseResource>>(1);
|
|
||||||
preferTypes.add((Class<? extends IBaseResource>) myResourceListCollectionType);
|
|
||||||
// } else if (myResourceType != null) {
|
|
||||||
// preferTypes = new ArrayList<Class<? extends IBaseResource>>(1);
|
|
||||||
// preferTypes.add((Class<? extends IBaseResource>) myResourceListCollectionType);
|
|
||||||
}
|
|
||||||
return preferTypes;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Object invokeServer(IRestfulServer<?> theServer, RequestDetails theRequest) throws BaseServerResponseException, IOException {
|
public Object invokeServer(IRestfulServer<?> theServer, RequestDetails theRequest) throws BaseServerResponseException, IOException {
|
||||||
|
|
||||||
final ResourceOrDstu1Bundle responseObject = doInvokeServer(theServer, theRequest);
|
IBaseResource response = doInvokeServer(theServer, theRequest);
|
||||||
|
|
||||||
Set<SummaryEnum> summaryMode = RestfulServerUtils.determineSummaryMode(theRequest);
|
Set<SummaryEnum> summaryMode = RestfulServerUtils.determineSummaryMode(theRequest);
|
||||||
if (responseObject.getResource() != null) {
|
|
||||||
|
|
||||||
for (int i = theServer.getInterceptors().size() - 1; i >= 0; i--) {
|
for (int i = theServer.getInterceptors().size() - 1; i >= 0; i--) {
|
||||||
IServerInterceptor next = theServer.getInterceptors().get(i);
|
IServerInterceptor next = theServer.getInterceptors().get(i);
|
||||||
boolean continueProcessing = next.outgoingResponse(theRequest, responseObject.getResource());
|
boolean continueProcessing = next.outgoingResponse(theRequest, response);
|
||||||
if (!continueProcessing) {
|
if (!continueProcessing) {
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
@ -176,30 +148,30 @@ public abstract class BaseResourceReturningMethodBinding extends BaseMethodBindi
|
||||||
|
|
||||||
boolean prettyPrint = RestfulServerUtils.prettyPrintResponse(theServer, theRequest);
|
boolean prettyPrint = RestfulServerUtils.prettyPrintResponse(theServer, theRequest);
|
||||||
|
|
||||||
return theRequest.getResponse().streamResponseAsResource(responseObject.getResource(), prettyPrint, summaryMode, Constants.STATUS_HTTP_200_OK, null, theRequest.isRespondGzip(),
|
return theRequest.getResponse().streamResponseAsResource(response, prettyPrint, summaryMode, Constants.STATUS_HTTP_200_OK, null, theRequest.isRespondGzip(), isAddContentLocationHeader());
|
||||||
isAddContentLocationHeader());
|
|
||||||
|
|
||||||
}
|
|
||||||
// Is this request coming from a browser
|
|
||||||
String uaHeader = theRequest.getHeader("user-agent");
|
|
||||||
boolean requestIsBrowser = false;
|
|
||||||
if (uaHeader != null && uaHeader.contains("Mozilla")) {
|
|
||||||
requestIsBrowser = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
for (int i = theServer.getInterceptors().size() - 1; i >= 0; i--) {
|
// DSTU1 Bundle
|
||||||
IServerInterceptor next = theServer.getInterceptors().get(i);
|
// // Is this request coming from a browser
|
||||||
boolean continueProcessing = next.outgoingResponse(theRequest, responseObject.getDstu1Bundle());
|
// String uaHeader = theRequest.getHeader("user-agent");
|
||||||
if (!continueProcessing) {
|
// boolean requestIsBrowser = false;
|
||||||
ourLog.debug("Interceptor {} returned false, not continuing processing");
|
// if (uaHeader != null && uaHeader.contains("Mozilla")) {
|
||||||
return null;
|
// requestIsBrowser = true;
|
||||||
}
|
// }
|
||||||
}
|
//
|
||||||
|
// for (int i = theServer.getInterceptors().size() - 1; i >= 0; i--) {
|
||||||
return theRequest.getResponse().streamResponseAsBundle(responseObject.getDstu1Bundle(), summaryMode, theRequest.isRespondGzip(), requestIsBrowser);
|
// IServerInterceptor next = theServer.getInterceptors().get(i);
|
||||||
|
// boolean continueProcessing = next.outgoingResponse(theRequest, responseObject.getDstu1Bundle());
|
||||||
|
// if (!continueProcessing) {
|
||||||
|
// ourLog.debug("Interceptor {} returned false, not continuing processing");
|
||||||
|
// return null;
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
//
|
||||||
|
// return theRequest.getResponse().streamResponseAsBundle(responseObject.getDstu1Bundle(), summaryMode, theRequest.isRespondGzip(), requestIsBrowser);
|
||||||
}
|
}
|
||||||
|
|
||||||
public ResourceOrDstu1Bundle doInvokeServer(IRestfulServer<?> theServer, RequestDetails theRequest) {
|
public IBaseResource doInvokeServer(IRestfulServer<?> theServer, RequestDetails theRequest) {
|
||||||
// Method params
|
// Method params
|
||||||
Object[] params = new Object[getParameters().size()];
|
Object[] params = new Object[getParameters().size()];
|
||||||
for (int i = 0; i < getParameters().size(); i++) {
|
for (int i = 0; i < getParameters().size(); i++) {
|
||||||
|
@ -213,7 +185,7 @@ public abstract class BaseResourceReturningMethodBinding extends BaseMethodBindi
|
||||||
|
|
||||||
Integer count = RestfulServerUtils.extractCountParameter(theRequest);
|
Integer count = RestfulServerUtils.extractCountParameter(theRequest);
|
||||||
|
|
||||||
final ResourceOrDstu1Bundle responseObject;
|
final IBaseResource responseObject;
|
||||||
|
|
||||||
switch (getReturnType()) {
|
switch (getReturnType()) {
|
||||||
case BUNDLE: {
|
case BUNDLE: {
|
||||||
|
@ -266,9 +238,9 @@ public abstract class BaseResourceReturningMethodBinding extends BaseMethodBindi
|
||||||
*/
|
*/
|
||||||
IVersionSpecificBundleFactory bundleFactory = theServer.getFhirContext().newBundleFactory();
|
IVersionSpecificBundleFactory bundleFactory = theServer.getFhirContext().newBundleFactory();
|
||||||
bundleFactory.initializeWithBundleResource(resource);
|
bundleFactory.initializeWithBundleResource(resource);
|
||||||
bundleFactory.addRootPropertiesToBundle(null, theRequest.getFhirServerBase(), linkSelf, count, getResponseBundleType(), lastUpdated);
|
bundleFactory.addRootPropertiesToBundle(null, theRequest.getFhirServerBase(), linkSelf, null, null, count, getResponseBundleType(), lastUpdated);
|
||||||
|
|
||||||
responseObject = new ResourceOrDstu1Bundle(resource);
|
responseObject = resource;
|
||||||
} else {
|
} else {
|
||||||
Set<Include> includes = getRequestIncludesFromParams(params);
|
Set<Include> includes = getRequestIncludesFromParams(params);
|
||||||
|
|
||||||
|
@ -290,21 +262,10 @@ public abstract class BaseResourceReturningMethodBinding extends BaseMethodBindi
|
||||||
start = offsetI;
|
start = offsetI;
|
||||||
}
|
}
|
||||||
|
|
||||||
IVersionSpecificBundleFactory bundleFactory = theServer.getFhirContext().newBundleFactory();
|
|
||||||
|
|
||||||
ResponseEncoding responseEncoding = RestfulServerUtils.determineResponseEncodingNoDefault(theRequest, theServer.getDefaultResponseEncoding());
|
ResponseEncoding responseEncoding = RestfulServerUtils.determineResponseEncodingNoDefault(theRequest, theServer.getDefaultResponseEncoding());
|
||||||
EncodingEnum linkEncoding = theRequest.getParameters().containsKey(Constants.PARAM_FORMAT) && responseEncoding != null ? responseEncoding.getEncoding() : null;
|
EncodingEnum linkEncoding = theRequest.getParameters().containsKey(Constants.PARAM_FORMAT) && responseEncoding != null ? responseEncoding.getEncoding() : null;
|
||||||
|
|
||||||
boolean prettyPrint = RestfulServerUtils.prettyPrintResponse(theServer, theRequest);
|
responseObject = createBundleFromBundleProvider(theServer, theRequest, count, linkSelf, includes, result, start, getResponseBundleType(), linkEncoding, null);
|
||||||
bundleFactory.initializeBundleFromBundleProvider(theServer, result, linkEncoding, theRequest.getFhirServerBase(), linkSelf, prettyPrint, start, count, null, getResponseBundleType(),
|
|
||||||
includes);
|
|
||||||
Bundle bundle = bundleFactory.getDstu1Bundle();
|
|
||||||
if (bundle != null) {
|
|
||||||
responseObject = new ResourceOrDstu1Bundle(bundle);
|
|
||||||
} else {
|
|
||||||
IBaseResource resBundle = bundleFactory.getResourceBundle();
|
|
||||||
responseObject = new ResourceOrDstu1Bundle(resBundle);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@ -317,13 +278,105 @@ public abstract class BaseResourceReturningMethodBinding extends BaseMethodBindi
|
||||||
}
|
}
|
||||||
|
|
||||||
IBaseResource resource = result.getResources(0, 1).get(0);
|
IBaseResource resource = result.getResources(0, 1).get(0);
|
||||||
responseObject = new ResourceOrDstu1Bundle(resource);
|
responseObject = resource;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
default:
|
default:
|
||||||
throw new IllegalStateException(); // should not happen
|
throw new IllegalStateException(); // should not happen
|
||||||
}
|
}
|
||||||
return responseObject;
|
return responseObject;
|
||||||
|
}
|
||||||
|
|
||||||
|
protected IBaseResource createBundleFromBundleProvider(IRestfulServer<?> theServer, RequestDetails theRequest, Integer theLimit, String theLinkSelf, Set<Include> theIncludes, IBundleProvider theResult, int theOffset, BundleTypeEnum theBundleType, EncodingEnum theLinkEncoding, String theSearchId) {
|
||||||
|
IVersionSpecificBundleFactory bundleFactory = theServer.getFhirContext().newBundleFactory();
|
||||||
|
|
||||||
|
int numToReturn;
|
||||||
|
String searchId = null;
|
||||||
|
List<IBaseResource> resourceList;
|
||||||
|
Integer numTotalResults = theResult.size();
|
||||||
|
if (theServer.getPagingProvider() == null) {
|
||||||
|
numToReturn = numTotalResults;
|
||||||
|
if (numToReturn > 0) {
|
||||||
|
resourceList = theResult.getResources(0, numToReturn);
|
||||||
|
} else {
|
||||||
|
resourceList = Collections.emptyList();
|
||||||
|
}
|
||||||
|
RestfulServerUtils.validateResourceListNotNull(resourceList);
|
||||||
|
|
||||||
|
} else {
|
||||||
|
IPagingProvider pagingProvider = theServer.getPagingProvider();
|
||||||
|
if (theLimit == null || theLimit.equals(Integer.valueOf(0))) {
|
||||||
|
numToReturn = pagingProvider.getDefaultPageSize();
|
||||||
|
} else {
|
||||||
|
numToReturn = Math.min(pagingProvider.getMaximumPageSize(), theLimit);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (numTotalResults != null) {
|
||||||
|
numToReturn = Math.min(numToReturn, numTotalResults - theOffset);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (numToReturn > 0) {
|
||||||
|
resourceList = theResult.getResources(theOffset, numToReturn + theOffset);
|
||||||
|
} else {
|
||||||
|
resourceList = Collections.emptyList();
|
||||||
|
}
|
||||||
|
RestfulServerUtils.validateResourceListNotNull(resourceList);
|
||||||
|
|
||||||
|
if (theSearchId != null) {
|
||||||
|
searchId = theSearchId;
|
||||||
|
} else {
|
||||||
|
if (numTotalResults == null || numTotalResults > numToReturn) {
|
||||||
|
searchId = pagingProvider.storeResultList(theResult);
|
||||||
|
if (isBlank(searchId)) {
|
||||||
|
ourLog.info("Found {} results but paging provider did not provide an ID to use for paging", numTotalResults);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
for (IBaseResource next : resourceList) {
|
||||||
|
if (next.getIdElement() == null || next.getIdElement().isEmpty()) {
|
||||||
|
if (!(next instanceof BaseOperationOutcome)) {
|
||||||
|
throw new InternalErrorException("Server method returned resource of type[" + next.getClass().getSimpleName() + "] with no ID specified (IResource#setId(IdDt) must be called)");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
String serverBase = theRequest.getFhirServerBase();
|
||||||
|
boolean prettyPrint = RestfulServerUtils.prettyPrintResponse(theServer, theRequest);
|
||||||
|
|
||||||
|
String linkPrev= null;
|
||||||
|
String linkNext = null;
|
||||||
|
if (searchId != null) {
|
||||||
|
if (numTotalResults == null || theOffset + numToReturn < numTotalResults) {
|
||||||
|
linkNext = (RestfulServerUtils.createPagingLink(theIncludes, serverBase, searchId, theOffset + numToReturn, numToReturn, theLinkEncoding, prettyPrint, theBundleType));
|
||||||
|
}
|
||||||
|
if (theOffset > 0) {
|
||||||
|
int start = Math.max(0, theOffset - theLimit);
|
||||||
|
linkPrev = RestfulServerUtils.createPagingLink(theIncludes, serverBase, searchId, start, theLimit, theLinkEncoding, prettyPrint, theBundleType);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
bundleFactory.addResourcesToBundle(new ArrayList<IBaseResource>(resourceList), theBundleType, serverBase, theServer.getBundleInclusionRule(), theIncludes);
|
||||||
|
bundleFactory.addRootPropertiesToBundle(null, serverBase, theLinkSelf, linkPrev, linkNext, theResult.size(), theBundleType, theResult.getPublished());
|
||||||
|
|
||||||
|
if (theServer.getPagingProvider() != null) {
|
||||||
|
int limit;
|
||||||
|
limit = theLimit != null ? theLimit : theServer.getPagingProvider().getDefaultPageSize();
|
||||||
|
limit = Math.min(limit, theServer.getPagingProvider().getMaximumPageSize());
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
return bundleFactory.getResourceBundle();
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public abstract Object invokeServer(IRestfulServer<?> theServer, RequestDetails theRequest, Object[] theMethodParams) throws InvalidRequestException, InternalErrorException;
|
public abstract Object invokeServer(IRestfulServer<?> theServer, RequestDetails theRequest, Object[] theMethodParams) throws InvalidRequestException, InternalErrorException;
|
||||||
|
@ -343,31 +396,7 @@ public abstract class BaseResourceReturningMethodBinding extends BaseMethodBindi
|
||||||
BUNDLE, BUNDLE_PROVIDER, BUNDLE_RESOURCE, LIST_OF_RESOURCES, METHOD_OUTCOME, RESOURCE
|
BUNDLE, BUNDLE_PROVIDER, BUNDLE_RESOURCE, LIST_OF_RESOURCES, METHOD_OUTCOME, RESOURCE
|
||||||
}
|
}
|
||||||
|
|
||||||
public static class ResourceOrDstu1Bundle {
|
|
||||||
|
|
||||||
private final Bundle myDstu1Bundle;
|
|
||||||
private final IBaseResource myResource;
|
|
||||||
|
|
||||||
public ResourceOrDstu1Bundle(Bundle theBundle) {
|
|
||||||
myDstu1Bundle = theBundle;
|
|
||||||
myResource = null;
|
|
||||||
}
|
|
||||||
|
|
||||||
public ResourceOrDstu1Bundle(IBaseResource theResource) {
|
|
||||||
myResource = theResource;
|
|
||||||
myDstu1Bundle = null;
|
|
||||||
}
|
|
||||||
|
|
||||||
public Bundle getDstu1Bundle() {
|
|
||||||
return myDstu1Bundle;
|
|
||||||
}
|
|
||||||
|
|
||||||
public IBaseResource getResource() {
|
|
||||||
return myResource;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
public enum ReturnTypeEnum {
|
public enum ReturnTypeEnum {
|
||||||
BUNDLE, RESOURCE
|
BUNDLE, RESOURCE
|
||||||
}
|
}
|
||||||
|
|
|
@ -10,7 +10,7 @@ package ca.uhn.fhir.rest.server.method;
|
||||||
* you may not use this file except in compliance with the License.
|
* you may not use this file except in compliance with the License.
|
||||||
* You may obtain a copy of the License at
|
* You may obtain a copy of the License at
|
||||||
*
|
*
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
*
|
*
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
@ -22,18 +22,13 @@ package ca.uhn.fhir.rest.server.method;
|
||||||
|
|
||||||
import java.lang.reflect.Method;
|
import java.lang.reflect.Method;
|
||||||
import java.util.Collection;
|
import java.util.Collection;
|
||||||
import java.util.List;
|
|
||||||
import java.util.Map;
|
|
||||||
|
|
||||||
import org.apache.commons.lang3.Validate;
|
import org.apache.commons.lang3.Validate;
|
||||||
import org.hl7.fhir.instance.model.api.IBaseResource;
|
|
||||||
|
|
||||||
import ca.uhn.fhir.context.ConfigurationException;
|
import ca.uhn.fhir.context.ConfigurationException;
|
||||||
import ca.uhn.fhir.context.FhirContext;
|
|
||||||
import ca.uhn.fhir.rest.annotation.ConditionalUrlParam;
|
import ca.uhn.fhir.rest.annotation.ConditionalUrlParam;
|
||||||
import ca.uhn.fhir.rest.api.RestOperationTypeEnum;
|
import ca.uhn.fhir.rest.api.RestOperationTypeEnum;
|
||||||
import ca.uhn.fhir.rest.api.server.RequestDetails;
|
import ca.uhn.fhir.rest.api.server.RequestDetails;
|
||||||
import ca.uhn.fhir.rest.param.IParameter;
|
|
||||||
import ca.uhn.fhir.rest.server.exceptions.InternalErrorException;
|
import ca.uhn.fhir.rest.server.exceptions.InternalErrorException;
|
||||||
import ca.uhn.fhir.rest.server.exceptions.InvalidRequestException;
|
import ca.uhn.fhir.rest.server.exceptions.InvalidRequestException;
|
||||||
|
|
||||||
|
@ -51,7 +46,8 @@ class ConditionalParamBinder implements IParameter {
|
||||||
@Override
|
@Override
|
||||||
public void initializeTypes(Method theMethod, Class<? extends Collection<?>> theOuterCollectionType, Class<? extends Collection<?>> theInnerCollectionType, Class<?> theParameterType) {
|
public void initializeTypes(Method theMethod, Class<? extends Collection<?>> theOuterCollectionType, Class<? extends Collection<?>> theInnerCollectionType, Class<?> theParameterType) {
|
||||||
if (theOuterCollectionType != null || theInnerCollectionType != null || theParameterType.equals(String.class) == false) {
|
if (theOuterCollectionType != null || theInnerCollectionType != null || theParameterType.equals(String.class) == false) {
|
||||||
throw new ConfigurationException("Parameters annotated with @" + ConditionalUrlParam.class.getSimpleName() + " must be of type String, found incorrect parameteter in method \"" + theMethod + "\"");
|
throw new ConfigurationException(
|
||||||
|
"Parameters annotated with @" + ConditionalUrlParam.class.getSimpleName() + " must be of type String, found incorrect parameteter in method \"" + theMethod + "\"");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -59,11 +55,6 @@ class ConditionalParamBinder implements IParameter {
|
||||||
return mySupportsMultiple;
|
return mySupportsMultiple;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
public void translateClientArgumentIntoQueryArgument(FhirContext theContext, Object theSourceClientArgument, Map<String, List<String>> theTargetQueryArguments, IBaseResource theTargetResource) throws InternalErrorException {
|
|
||||||
throw new UnsupportedOperationException("Can not use @" + getClass().getName() + " annotated parameters in client");
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Object translateQueryParametersIntoServerArgument(RequestDetails theRequest, BaseMethodBinding<?> theMethodBinding) throws InternalErrorException, InvalidRequestException {
|
public Object translateQueryParametersIntoServerArgument(RequestDetails theRequest, BaseMethodBinding<?> theMethodBinding) throws InternalErrorException, InvalidRequestException {
|
||||||
return theRequest.getConditionalUrl(myOperationType);
|
return theRequest.getConditionalUrl(myOperationType);
|
||||||
|
|
|
@ -10,7 +10,7 @@ package ca.uhn.fhir.rest.server.method;
|
||||||
* you may not use this file except in compliance with the License.
|
* you may not use this file except in compliance with the License.
|
||||||
* You may obtain a copy of the License at
|
* You may obtain a copy of the License at
|
||||||
*
|
*
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
*
|
*
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
@ -28,12 +28,13 @@ import org.hl7.fhir.instance.model.api.IBaseResource;
|
||||||
import ca.uhn.fhir.context.ConfigurationException;
|
import ca.uhn.fhir.context.ConfigurationException;
|
||||||
import ca.uhn.fhir.context.FhirContext;
|
import ca.uhn.fhir.context.FhirContext;
|
||||||
import ca.uhn.fhir.model.valueset.BundleTypeEnum;
|
import ca.uhn.fhir.model.valueset.BundleTypeEnum;
|
||||||
import ca.uhn.fhir.rest.api.*;
|
import ca.uhn.fhir.rest.api.RequestTypeEnum;
|
||||||
import ca.uhn.fhir.rest.api.server.*;
|
import ca.uhn.fhir.rest.api.RestOperationTypeEnum;
|
||||||
import ca.uhn.fhir.rest.param.IParameter;
|
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.server.SimpleBundleProvider;
|
import ca.uhn.fhir.rest.server.SimpleBundleProvider;
|
||||||
import ca.uhn.fhir.rest.server.exceptions.BaseServerResponseException;
|
import ca.uhn.fhir.rest.server.exceptions.BaseServerResponseException;
|
||||||
import ca.uhn.fhir.rest.server.exceptions.InternalErrorException;
|
|
||||||
import ca.uhn.fhir.rest.server.exceptions.MethodNotAllowedException;
|
import ca.uhn.fhir.rest.server.exceptions.MethodNotAllowedException;
|
||||||
|
|
||||||
public class ConformanceMethodBinding extends BaseResourceReturningMethodBinding {
|
public class ConformanceMethodBinding extends BaseResourceReturningMethodBinding {
|
||||||
|
@ -41,9 +42,9 @@ public class ConformanceMethodBinding extends BaseResourceReturningMethodBinding
|
||||||
public ConformanceMethodBinding(Method theMethod, FhirContext theContext, Object theProvider) {
|
public ConformanceMethodBinding(Method theMethod, FhirContext theContext, Object theProvider) {
|
||||||
super(theMethod.getReturnType(), theMethod, theContext, theProvider);
|
super(theMethod.getReturnType(), theMethod, theContext, theProvider);
|
||||||
|
|
||||||
// if (Modifier.isAbstract(theMethod.getReturnType().getModifiers())) {
|
// if (Modifier.isAbstract(theMethod.getReturnType().getModifiers())) {
|
||||||
// throw new ConfigurationException("Conformance resource provider method '" + theMethod.getName() + "' must not be abstract");
|
// throw new ConfigurationException("Conformance resource provider method '" + theMethod.getName() + "' must not be abstract");
|
||||||
// }
|
// }
|
||||||
MethodReturnTypeEnum methodReturnType = getMethodReturnType();
|
MethodReturnTypeEnum methodReturnType = getMethodReturnType();
|
||||||
Class<?> genericReturnType = (Class<?>) theMethod.getGenericReturnType();
|
Class<?> genericReturnType = (Class<?>) theMethod.getGenericReturnType();
|
||||||
if (methodReturnType != MethodReturnTypeEnum.RESOURCE || !IBaseConformance.class.isAssignableFrom(genericReturnType)) {
|
if (methodReturnType != MethodReturnTypeEnum.RESOURCE || !IBaseConformance.class.isAssignableFrom(genericReturnType)) {
|
||||||
|
@ -57,20 +58,6 @@ public class ConformanceMethodBinding extends BaseResourceReturningMethodBinding
|
||||||
return ReturnTypeEnum.RESOURCE;
|
return ReturnTypeEnum.RESOURCE;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
public HttpGetClientInvocation invokeClient(Object[] theArgs) throws InternalErrorException {
|
|
||||||
HttpGetClientInvocation retVal = MethodUtil.createConformanceInvocation(getContext());
|
|
||||||
|
|
||||||
if (theArgs != null) {
|
|
||||||
for (int idx = 0; idx < theArgs.length; idx++) {
|
|
||||||
IParameter nextParam = getParameters().get(idx);
|
|
||||||
nextParam.translateClientArgumentIntoQueryArgument(getContext(), theArgs[idx], null, null);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return retVal;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public IBundleProvider invokeServer(IRestfulServer<?> theServer, RequestDetails theRequest, Object[] theMethodParams) throws BaseServerResponseException {
|
public IBundleProvider invokeServer(IRestfulServer<?> theServer, RequestDetails theRequest, Object[] theMethodParams) throws BaseServerResponseException {
|
||||||
IBaseResource conf = (IBaseResource) invokeServerMethod(theServer, theRequest, theMethodParams);
|
IBaseResource conf = (IBaseResource) invokeServerMethod(theServer, theRequest, theMethodParams);
|
||||||
|
@ -88,7 +75,7 @@ public class ConformanceMethodBinding extends BaseResourceReturningMethodBinding
|
||||||
if (theRequest.getResourceName() != null) {
|
if (theRequest.getResourceName() != null) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
if ("metadata".equals(theRequest.getOperation())) {
|
if ("metadata".equals(theRequest.getOperation())) {
|
||||||
if (theRequest.getRequestType() == RequestTypeEnum.GET) {
|
if (theRequest.getRequestType() == RequestTypeEnum.GET) {
|
||||||
return true;
|
return true;
|
||||||
|
|
|
@ -22,21 +22,15 @@ package ca.uhn.fhir.rest.server.method;
|
||||||
|
|
||||||
import java.lang.reflect.Method;
|
import java.lang.reflect.Method;
|
||||||
import java.util.Collection;
|
import java.util.Collection;
|
||||||
import java.util.Collections;
|
|
||||||
import java.util.List;
|
|
||||||
import java.util.Map;
|
|
||||||
|
|
||||||
import org.apache.commons.lang3.StringUtils;
|
import org.apache.commons.lang3.StringUtils;
|
||||||
import org.hl7.fhir.instance.model.api.IBaseResource;
|
|
||||||
|
|
||||||
import ca.uhn.fhir.context.ConfigurationException;
|
import ca.uhn.fhir.context.ConfigurationException;
|
||||||
import ca.uhn.fhir.context.FhirContext;
|
|
||||||
import ca.uhn.fhir.model.primitive.IntegerDt;
|
import ca.uhn.fhir.model.primitive.IntegerDt;
|
||||||
import ca.uhn.fhir.parser.DataFormatException;
|
import ca.uhn.fhir.parser.DataFormatException;
|
||||||
import ca.uhn.fhir.rest.annotation.Since;
|
import ca.uhn.fhir.rest.annotation.Since;
|
||||||
import ca.uhn.fhir.rest.api.Constants;
|
import ca.uhn.fhir.rest.api.Constants;
|
||||||
import ca.uhn.fhir.rest.api.server.RequestDetails;
|
import ca.uhn.fhir.rest.api.server.RequestDetails;
|
||||||
import ca.uhn.fhir.rest.param.IParameter;
|
|
||||||
import ca.uhn.fhir.rest.param.ParameterUtil;
|
import ca.uhn.fhir.rest.param.ParameterUtil;
|
||||||
import ca.uhn.fhir.rest.server.exceptions.InternalErrorException;
|
import ca.uhn.fhir.rest.server.exceptions.InternalErrorException;
|
||||||
import ca.uhn.fhir.rest.server.exceptions.InvalidRequestException;
|
import ca.uhn.fhir.rest.server.exceptions.InvalidRequestException;
|
||||||
|
@ -45,16 +39,6 @@ public class CountParameter implements IParameter {
|
||||||
|
|
||||||
private Class<?> myType;
|
private Class<?> myType;
|
||||||
|
|
||||||
@Override
|
|
||||||
public void translateClientArgumentIntoQueryArgument(FhirContext theContext, Object theSourceClientArgument, Map<String, List<String>> theTargetQueryArguments, IBaseResource theTargetResource) throws InternalErrorException {
|
|
||||||
if (theSourceClientArgument != null) {
|
|
||||||
IntegerDt since = ParameterUtil.toInteger(theSourceClientArgument);
|
|
||||||
if (since.isEmpty() == false) {
|
|
||||||
theTargetQueryArguments.put(Constants.PARAM_COUNT, Collections.singletonList(since.getValueAsString()));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Object translateQueryParametersIntoServerArgument(RequestDetails theRequest, BaseMethodBinding<?> theMethodBinding) throws InternalErrorException, InvalidRequestException {
|
public Object translateQueryParametersIntoServerArgument(RequestDetails theRequest, BaseMethodBinding<?> theMethodBinding) throws InternalErrorException, InvalidRequestException {
|
||||||
String[] sinceParams = theRequest.getParameters().get(Constants.PARAM_COUNT);
|
String[] sinceParams = theRequest.getParameters().get(Constants.PARAM_COUNT);
|
||||||
|
|
|
@ -31,12 +31,9 @@ import org.hl7.fhir.instance.model.api.IIdType;
|
||||||
|
|
||||||
import ca.uhn.fhir.context.FhirContext;
|
import ca.uhn.fhir.context.FhirContext;
|
||||||
import ca.uhn.fhir.context.FhirVersionEnum;
|
import ca.uhn.fhir.context.FhirVersionEnum;
|
||||||
import ca.uhn.fhir.model.api.IResource;
|
|
||||||
import ca.uhn.fhir.rest.annotation.Create;
|
import ca.uhn.fhir.rest.annotation.Create;
|
||||||
import ca.uhn.fhir.rest.api.RequestTypeEnum;
|
import ca.uhn.fhir.rest.api.RequestTypeEnum;
|
||||||
import ca.uhn.fhir.rest.api.RestOperationTypeEnum;
|
import ca.uhn.fhir.rest.api.RestOperationTypeEnum;
|
||||||
import ca.uhn.fhir.rest.client.impl.BaseHttpClientInvocation;
|
|
||||||
import ca.uhn.fhir.rest.param.IParameter;
|
|
||||||
import ca.uhn.fhir.rest.server.exceptions.InvalidRequestException;
|
import ca.uhn.fhir.rest.server.exceptions.InvalidRequestException;
|
||||||
|
|
||||||
public class CreateMethodBinding extends BaseOutcomeReturningMethodBindingWithResourceParam {
|
public class CreateMethodBinding extends BaseOutcomeReturningMethodBindingWithResourceParam {
|
||||||
|
@ -45,22 +42,6 @@ public class CreateMethodBinding extends BaseOutcomeReturningMethodBindingWithRe
|
||||||
super(theMethod, theContext, Create.class, theProvider);
|
super(theMethod, theContext, Create.class, theProvider);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
protected BaseHttpClientInvocation createClientInvocation(Object[] theArgs, IResource theResource) {
|
|
||||||
FhirContext context = getContext();
|
|
||||||
|
|
||||||
BaseHttpClientInvocation retVal = MethodUtil.createCreateInvocation(theResource, context);
|
|
||||||
|
|
||||||
if (theArgs != null) {
|
|
||||||
for (int idx = 0; idx < theArgs.length; idx++) {
|
|
||||||
IParameter nextParam = getParameters().get(idx);
|
|
||||||
nextParam.translateClientArgumentIntoQueryArgument(getContext(), theArgs[idx], null, null);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return retVal;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected String getMatchingOperation() {
|
protected String getMatchingOperation() {
|
||||||
return null;
|
return null;
|
||||||
|
@ -77,18 +58,21 @@ public class CreateMethodBinding extends BaseOutcomeReturningMethodBindingWithRe
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected void validateResourceIdAndUrlIdForNonConditionalOperation(IBaseResource theResource, String theResourceId, String theUrlId, String theMatchUrl) {
|
protected void validateResourceIdAndUrlIdForNonConditionalOperation(IBaseResource theResource, String theResourceId,
|
||||||
|
String theUrlId, String theMatchUrl) {
|
||||||
if (isNotBlank(theUrlId)) {
|
if (isNotBlank(theUrlId)) {
|
||||||
String msg = getContext().getLocalizer().getMessage(BaseOutcomeReturningMethodBindingWithResourceParam.class, "idInUrlForCreate", theUrlId);
|
String msg = getContext().getLocalizer()
|
||||||
|
.getMessage(BaseOutcomeReturningMethodBindingWithResourceParam.class, "idInUrlForCreate", theUrlId);
|
||||||
throw new InvalidRequestException(msg);
|
throw new InvalidRequestException(msg);
|
||||||
}
|
}
|
||||||
if (getContext().getVersion().getVersion().isOlderThan(FhirVersionEnum.DSTU3)) {
|
if (getContext().getVersion().getVersion().isOlderThan(FhirVersionEnum.DSTU3)) {
|
||||||
if (isNotBlank(theResourceId)) {
|
if (isNotBlank(theResourceId)) {
|
||||||
String msg = getContext().getLocalizer().getMessage(BaseOutcomeReturningMethodBindingWithResourceParam.class, "idInBodyForCreate", theResourceId);
|
String msg = getContext().getLocalizer().getMessage(
|
||||||
|
BaseOutcomeReturningMethodBindingWithResourceParam.class, "idInBodyForCreate", theResourceId);
|
||||||
throw new InvalidRequestException(msg);
|
throw new InvalidRequestException(msg);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
theResource.setId((IIdType)null);
|
theResource.setId((IIdType) null);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -22,21 +22,13 @@ package ca.uhn.fhir.rest.server.method;
|
||||||
|
|
||||||
import java.lang.reflect.Method;
|
import java.lang.reflect.Method;
|
||||||
import java.util.Collections;
|
import java.util.Collections;
|
||||||
import java.util.List;
|
|
||||||
import java.util.Map;
|
|
||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
|
|
||||||
import org.hl7.fhir.instance.model.api.IIdType;
|
|
||||||
|
|
||||||
import ca.uhn.fhir.context.FhirContext;
|
import ca.uhn.fhir.context.FhirContext;
|
||||||
import ca.uhn.fhir.model.api.IResource;
|
|
||||||
import ca.uhn.fhir.rest.annotation.Delete;
|
import ca.uhn.fhir.rest.annotation.Delete;
|
||||||
import ca.uhn.fhir.rest.api.*;
|
import ca.uhn.fhir.rest.api.RequestTypeEnum;
|
||||||
|
import ca.uhn.fhir.rest.api.RestOperationTypeEnum;
|
||||||
import ca.uhn.fhir.rest.api.server.RequestDetails;
|
import ca.uhn.fhir.rest.api.server.RequestDetails;
|
||||||
import ca.uhn.fhir.rest.client.impl.BaseHttpClientInvocation;
|
|
||||||
import ca.uhn.fhir.rest.param.IParameter;
|
|
||||||
import ca.uhn.fhir.rest.server.exceptions.InternalErrorException;
|
|
||||||
import ca.uhn.fhir.rest.server.exceptions.InvalidRequestException;
|
|
||||||
|
|
||||||
public class DeleteMethodBinding extends BaseOutcomeReturningMethodBindingWithResourceIdButNoResourceBody {
|
public class DeleteMethodBinding extends BaseOutcomeReturningMethodBindingWithResourceIdButNoResourceBody {
|
||||||
|
|
||||||
|
@ -54,47 +46,11 @@ public class DeleteMethodBinding extends BaseOutcomeReturningMethodBindingWithRe
|
||||||
return Collections.singleton(RequestTypeEnum.DELETE);
|
return Collections.singleton(RequestTypeEnum.DELETE);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
protected BaseHttpClientInvocation createClientInvocation(Object[] theArgs, IResource theResource) {
|
|
||||||
StringBuilder urlExtension = new StringBuilder();
|
|
||||||
urlExtension.append(getContext().getResourceDefinition(theResource).getName());
|
|
||||||
|
|
||||||
return new HttpPostClientInvocation(getContext(), theResource, urlExtension.toString());
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected boolean allowVoidReturnType() {
|
protected boolean allowVoidReturnType() {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
public BaseHttpClientInvocation invokeClient(Object[] theArgs) throws InternalErrorException {
|
|
||||||
IIdType idDt = (IIdType) theArgs[getIdParameterIndex()];
|
|
||||||
if (idDt == null) {
|
|
||||||
throw new NullPointerException("ID can not be null");
|
|
||||||
}
|
|
||||||
|
|
||||||
if (idDt.hasResourceType() == false) {
|
|
||||||
idDt = idDt.withResourceType(getResourceName());
|
|
||||||
} else if (getResourceName().equals(idDt.getResourceType()) == false) {
|
|
||||||
throw new InvalidRequestException("ID parameter has the wrong resource type, expected '" + getResourceName() + "', found: " + idDt.getResourceType());
|
|
||||||
}
|
|
||||||
|
|
||||||
HttpDeleteClientInvocation retVal = createDeleteInvocation(getContext(), idDt);
|
|
||||||
|
|
||||||
for (int idx = 0; idx < theArgs.length; idx++) {
|
|
||||||
IParameter nextParam = getParameters().get(idx);
|
|
||||||
nextParam.translateClientArgumentIntoQueryArgument(getContext(), theArgs[idx], null, null);
|
|
||||||
}
|
|
||||||
|
|
||||||
return retVal;
|
|
||||||
}
|
|
||||||
|
|
||||||
public static HttpDeleteClientInvocation createDeleteInvocation(FhirContext theContext, IIdType theId) {
|
|
||||||
HttpDeleteClientInvocation retVal = new HttpDeleteClientInvocation(theContext, theId);
|
|
||||||
return retVal;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected void addParametersForServerRequest(RequestDetails theRequest, Object[] theParams) {
|
protected void addParametersForServerRequest(RequestDetails theRequest, Object[] theParams) {
|
||||||
theParams[getIdParameterIndex()] = theRequest.getId();
|
theParams[getIdParameterIndex()] = theRequest.getId();
|
||||||
|
@ -105,13 +61,4 @@ public class DeleteMethodBinding extends BaseOutcomeReturningMethodBindingWithRe
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
public static HttpDeleteClientInvocation createDeleteInvocation(FhirContext theContext, String theSearchUrl) {
|
|
||||||
HttpDeleteClientInvocation retVal = new HttpDeleteClientInvocation(theContext, theSearchUrl);
|
|
||||||
return retVal;
|
|
||||||
}
|
|
||||||
|
|
||||||
public static HttpDeleteClientInvocation createDeleteInvocation(FhirContext theContext, String theResourceType, Map<String, List<String>> theParams) {
|
|
||||||
return new HttpDeleteClientInvocation(theContext, theResourceType, theParams);
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,5 +1,7 @@
|
||||||
package ca.uhn.fhir.rest.server.method;
|
package ca.uhn.fhir.rest.server.method;
|
||||||
|
|
||||||
|
import java.io.IOException;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* #%L
|
* #%L
|
||||||
* HAPI FHIR - Core Library
|
* HAPI FHIR - Core Library
|
||||||
|
@ -25,6 +27,9 @@ import java.lang.reflect.Method;
|
||||||
import ca.uhn.fhir.context.FhirContext;
|
import ca.uhn.fhir.context.FhirContext;
|
||||||
import ca.uhn.fhir.rest.annotation.DeleteTags;
|
import ca.uhn.fhir.rest.annotation.DeleteTags;
|
||||||
import ca.uhn.fhir.rest.api.RestOperationTypeEnum;
|
import ca.uhn.fhir.rest.api.RestOperationTypeEnum;
|
||||||
|
import ca.uhn.fhir.rest.api.server.IRestfulServer;
|
||||||
|
import ca.uhn.fhir.rest.api.server.RequestDetails;
|
||||||
|
import ca.uhn.fhir.rest.server.exceptions.BaseServerResponseException;
|
||||||
|
|
||||||
public class DeleteTagsMethodBinding extends BaseAddOrDeleteTagsMethodBinding {
|
public class DeleteTagsMethodBinding extends BaseAddOrDeleteTagsMethodBinding {
|
||||||
|
|
||||||
|
@ -42,4 +47,9 @@ public class DeleteTagsMethodBinding extends BaseAddOrDeleteTagsMethodBinding {
|
||||||
return RestOperationTypeEnum.DELETE_TAGS;
|
return RestOperationTypeEnum.DELETE_TAGS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Object invokeServer(IRestfulServer<?> theServer, RequestDetails theRequest) throws BaseServerResponseException, IOException {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -10,7 +10,7 @@ package ca.uhn.fhir.rest.server.method;
|
||||||
* you may not use this file except in compliance with the License.
|
* you may not use this file except in compliance with the License.
|
||||||
* You may obtain a copy of the License at
|
* You may obtain a copy of the License at
|
||||||
*
|
*
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
*
|
*
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
@ -31,20 +31,25 @@ import org.hl7.fhir.instance.model.api.IBaseResource;
|
||||||
import ca.uhn.fhir.context.FhirContext;
|
import ca.uhn.fhir.context.FhirContext;
|
||||||
import ca.uhn.fhir.context.RuntimeSearchParam;
|
import ca.uhn.fhir.context.RuntimeSearchParam;
|
||||||
import ca.uhn.fhir.model.valueset.BundleTypeEnum;
|
import ca.uhn.fhir.model.valueset.BundleTypeEnum;
|
||||||
import ca.uhn.fhir.rest.api.*;
|
import ca.uhn.fhir.rest.api.Constants;
|
||||||
import ca.uhn.fhir.rest.api.server.*;
|
import ca.uhn.fhir.rest.api.RequestTypeEnum;
|
||||||
import ca.uhn.fhir.rest.client.impl.BaseHttpClientInvocation;
|
import ca.uhn.fhir.rest.api.RestOperationTypeEnum;
|
||||||
import ca.uhn.fhir.rest.param.IParameter;
|
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.server.IDynamicSearchResourceProvider;
|
import ca.uhn.fhir.rest.server.IDynamicSearchResourceProvider;
|
||||||
import ca.uhn.fhir.rest.server.exceptions.InternalErrorException;
|
import ca.uhn.fhir.rest.server.exceptions.InternalErrorException;
|
||||||
import ca.uhn.fhir.rest.server.exceptions.InvalidRequestException;
|
import ca.uhn.fhir.rest.server.exceptions.InvalidRequestException;
|
||||||
|
|
||||||
public class DynamicSearchMethodBinding extends BaseResourceReturningMethodBinding {
|
public class DynamicSearchMethodBinding extends BaseResourceReturningMethodBinding {
|
||||||
|
|
||||||
private IDynamicSearchResourceProvider myProvider;
|
private static final org.slf4j.Logger ourLog = org.slf4j.LoggerFactory.getLogger(DynamicSearchMethodBinding.class);
|
||||||
private List<RuntimeSearchParam> mySearchParameters;
|
|
||||||
private HashSet<String> myParamNames;
|
|
||||||
private Integer myIdParamIndex;
|
private Integer myIdParamIndex;
|
||||||
|
private HashSet<String> myParamNames;
|
||||||
|
private IDynamicSearchResourceProvider myProvider;
|
||||||
|
|
||||||
|
private List<RuntimeSearchParam> mySearchParameters;
|
||||||
|
|
||||||
public DynamicSearchMethodBinding(Class<? extends IBaseResource> theReturnResourceType, Method theMethod, FhirContext theContext, IDynamicSearchResourceProvider theProvider) {
|
public DynamicSearchMethodBinding(Class<? extends IBaseResource> theReturnResourceType, Method theMethod, FhirContext theContext, IDynamicSearchResourceProvider theProvider) {
|
||||||
super(theReturnResourceType, theMethod, theContext, theProvider);
|
super(theReturnResourceType, theMethod, theContext, theProvider);
|
||||||
|
@ -57,25 +62,29 @@ public class DynamicSearchMethodBinding extends BaseResourceReturningMethodBindi
|
||||||
myParamNames.add(next.getName());
|
myParamNames.add(next.getName());
|
||||||
}
|
}
|
||||||
|
|
||||||
myIdParamIndex = MethodUtil.findIdParameterIndex(theMethod, getContext());
|
myIdParamIndex = ParameterUtil.findIdParameterIndex(theMethod, getContext());
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public List<IParameter> getParameters() {
|
||||||
|
List<IParameter> retVal = new ArrayList<IParameter>(super.getParameters());
|
||||||
|
|
||||||
|
for (RuntimeSearchParam next : mySearchParameters) {
|
||||||
|
// TODO: what is this?
|
||||||
|
}
|
||||||
|
|
||||||
|
return retVal;
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected BundleTypeEnum getResponseBundleType() {
|
protected BundleTypeEnum getResponseBundleType() {
|
||||||
return BundleTypeEnum.SEARCHSET;
|
return BundleTypeEnum.SEARCHSET;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public List<IParameter> getParameters() {
|
public RestOperationTypeEnum getRestOperationType() {
|
||||||
List<IParameter> retVal = new ArrayList<IParameter>(super.getParameters());
|
return RestOperationTypeEnum.SEARCH_TYPE;
|
||||||
|
|
||||||
for (RuntimeSearchParam next : mySearchParameters) {
|
|
||||||
// TODO: what is this?
|
|
||||||
}
|
|
||||||
|
|
||||||
return retVal;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -83,27 +92,14 @@ public class DynamicSearchMethodBinding extends BaseResourceReturningMethodBindi
|
||||||
return ReturnTypeEnum.BUNDLE;
|
return ReturnTypeEnum.BUNDLE;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
public Collection<? extends RuntimeSearchParam> getSearchParams() {
|
||||||
public IBundleProvider invokeServer(IRestfulServer<?> theServer, RequestDetails theRequest, Object[] theMethodParams) throws InvalidRequestException, InternalErrorException {
|
return mySearchParameters;
|
||||||
if (myIdParamIndex != null) {
|
|
||||||
theMethodParams[myIdParamIndex] = theRequest.getId();
|
|
||||||
}
|
|
||||||
|
|
||||||
Object response = invokeServerMethod(theServer, theRequest, theMethodParams);
|
|
||||||
return toResourceList(response);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
public RestOperationTypeEnum getRestOperationType() {
|
|
||||||
return RestOperationTypeEnum.SEARCH_TYPE;
|
|
||||||
}
|
|
||||||
|
|
||||||
private static final org.slf4j.Logger ourLog = org.slf4j.LoggerFactory.getLogger(DynamicSearchMethodBinding.class);
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean incomingServerRequestMatchesMethod(RequestDetails theRequest) {
|
public boolean incomingServerRequestMatchesMethod(RequestDetails theRequest) {
|
||||||
if (!theRequest.getResourceName().equals(getResourceName())) {
|
if (!theRequest.getResourceName().equals(getResourceName())) {
|
||||||
ourLog.trace("Method {} doesn't match because resource name {} != {}", new Object[] { getMethod().getName(), theRequest.getResourceName(), getResourceName() } );
|
ourLog.trace("Method {} doesn't match because resource name {} != {}", new Object[] { getMethod().getName(), theRequest.getResourceName(), getResourceName() });
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
if (theRequest.getId() != null && myIdParamIndex == null) {
|
if (theRequest.getId() != null && myIdParamIndex == null) {
|
||||||
|
@ -153,13 +149,13 @@ public class DynamicSearchMethodBinding extends BaseResourceReturningMethodBindi
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public BaseHttpClientInvocation invokeClient(Object[] theArgs) throws InternalErrorException {
|
public IBundleProvider invokeServer(IRestfulServer<?> theServer, RequestDetails theRequest, Object[] theMethodParams) throws InvalidRequestException, InternalErrorException {
|
||||||
// there should be no way to call this....
|
if (myIdParamIndex != null) {
|
||||||
throw new UnsupportedOperationException("Dynamic search methods are only used for server implementations");
|
theMethodParams[myIdParamIndex] = theRequest.getId();
|
||||||
}
|
}
|
||||||
|
|
||||||
public Collection<? extends RuntimeSearchParam> getSearchParams() {
|
Object response = invokeServerMethod(theServer, theRequest, theMethodParams);
|
||||||
return mySearchParameters;
|
return toResourceList(response);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -49,11 +49,6 @@ public class DynamicSearchParameter implements IParameter {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
public void translateClientArgumentIntoQueryArgument(FhirContext theContext, Object theSourceClientArgument, Map<String, List<String>> theTargetQueryArguments, IBaseResource theTargetResource) throws InternalErrorException {
|
|
||||||
throw new UnsupportedOperationException("Dynamic search is not supported in client mode (use fluent client for dynamic-like searches)");
|
|
||||||
}
|
|
||||||
|
|
||||||
@SuppressWarnings("unchecked")
|
@SuppressWarnings("unchecked")
|
||||||
@Override
|
@Override
|
||||||
public Object translateQueryParametersIntoServerArgument(RequestDetails theRequest, BaseMethodBinding<?> theMethodBinding) throws InternalErrorException, InvalidRequestException {
|
public Object translateQueryParametersIntoServerArgument(RequestDetails theRequest, BaseMethodBinding<?> theMethodBinding) throws InternalErrorException, InvalidRequestException {
|
||||||
|
|
|
@ -10,7 +10,7 @@ package ca.uhn.fhir.rest.server.method;
|
||||||
* you may not use this file except in compliance with the License.
|
* you may not use this file except in compliance with the License.
|
||||||
* You may obtain a copy of the License at
|
* You may obtain a copy of the License at
|
||||||
*
|
*
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
*
|
*
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
@ -22,23 +22,15 @@ 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.Collection;
|
import java.util.*;
|
||||||
import java.util.Collections;
|
|
||||||
import java.util.HashSet;
|
|
||||||
import java.util.List;
|
|
||||||
import java.util.Map;
|
|
||||||
import java.util.Set;
|
|
||||||
import java.util.StringTokenizer;
|
|
||||||
|
|
||||||
import org.apache.commons.lang3.StringUtils;
|
import org.apache.commons.lang3.StringUtils;
|
||||||
import org.hl7.fhir.instance.model.api.IBaseResource;
|
|
||||||
|
|
||||||
import ca.uhn.fhir.context.ConfigurationException;
|
import ca.uhn.fhir.context.ConfigurationException;
|
||||||
import ca.uhn.fhir.context.FhirContext;
|
import ca.uhn.fhir.rest.api.Constants;
|
||||||
import ca.uhn.fhir.rest.api.*;
|
import ca.uhn.fhir.rest.api.SummaryEnum;
|
||||||
import ca.uhn.fhir.rest.api.server.RequestDetails;
|
import ca.uhn.fhir.rest.api.server.RequestDetails;
|
||||||
import ca.uhn.fhir.rest.param.CollectionBinder;
|
import ca.uhn.fhir.rest.param.CollectionBinder;
|
||||||
import ca.uhn.fhir.rest.param.IParameter;
|
|
||||||
import ca.uhn.fhir.rest.server.exceptions.InternalErrorException;
|
import ca.uhn.fhir.rest.server.exceptions.InternalErrorException;
|
||||||
import ca.uhn.fhir.rest.server.exceptions.InvalidRequestException;
|
import ca.uhn.fhir.rest.server.exceptions.InvalidRequestException;
|
||||||
|
|
||||||
|
@ -47,28 +39,6 @@ public class ElementsParameter implements IParameter {
|
||||||
@SuppressWarnings("rawtypes")
|
@SuppressWarnings("rawtypes")
|
||||||
private Class<? extends Collection> myInnerCollectionType;
|
private Class<? extends Collection> myInnerCollectionType;
|
||||||
|
|
||||||
@SuppressWarnings("unchecked")
|
|
||||||
@Override
|
|
||||||
public void translateClientArgumentIntoQueryArgument(FhirContext theContext, Object theSourceClientArgument, Map<String, List<String>> theTargetQueryArguments, IBaseResource theTargetResource) throws InternalErrorException {
|
|
||||||
if (theSourceClientArgument instanceof Collection) {
|
|
||||||
StringBuilder values = new StringBuilder();
|
|
||||||
for (String next : (Collection<String>) theSourceClientArgument) {
|
|
||||||
if (isNotBlank(next)) {
|
|
||||||
if (values.length() > 0) {
|
|
||||||
values.append(',');
|
|
||||||
}
|
|
||||||
values.append(next);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
theTargetQueryArguments.put(Constants.PARAM_ELEMENTS, Collections.singletonList(values.toString()));
|
|
||||||
} else {
|
|
||||||
String elements = (String) theSourceClientArgument;
|
|
||||||
if (elements != null) {
|
|
||||||
theTargetQueryArguments.put(Constants.PARAM_ELEMENTS, Collections.singletonList(elements));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@SuppressWarnings({ "rawtypes", "unchecked" })
|
@SuppressWarnings({ "rawtypes", "unchecked" })
|
||||||
public Object translateQueryParametersIntoServerArgument(RequestDetails theRequest, BaseMethodBinding<?> theMethodBinding) throws InternalErrorException, InvalidRequestException {
|
public Object translateQueryParametersIntoServerArgument(RequestDetails theRequest, BaseMethodBinding<?> theMethodBinding) throws InternalErrorException, InvalidRequestException {
|
||||||
|
@ -109,10 +79,10 @@ public class ElementsParameter implements IParameter {
|
||||||
if (retVal.isEmpty()) {
|
if (retVal.isEmpty()) {
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Always include the meta element even for subsetted values
|
// Always include the meta element even for subsetted values
|
||||||
retVal.add("meta");
|
retVal.add("meta");
|
||||||
|
|
||||||
return retVal;
|
return retVal;
|
||||||
}
|
}
|
||||||
return null;
|
return null;
|
||||||
|
@ -121,7 +91,8 @@ public class ElementsParameter implements IParameter {
|
||||||
@Override
|
@Override
|
||||||
public void initializeTypes(Method theMethod, Class<? extends Collection<?>> theOuterCollectionType, Class<? extends Collection<?>> theInnerCollectionType, Class<?> theParameterType) {
|
public void initializeTypes(Method theMethod, Class<? extends Collection<?>> theOuterCollectionType, Class<? extends Collection<?>> theInnerCollectionType, Class<?> theParameterType) {
|
||||||
if (theOuterCollectionType != null) {
|
if (theOuterCollectionType != null) {
|
||||||
throw new ConfigurationException("Method '" + theMethod.getName() + "' in type '" + theMethod.getDeclaringClass().getCanonicalName() + "' is of type " + SummaryEnum.class + " but can not be a collection of collections");
|
throw new ConfigurationException("Method '" + theMethod.getName() + "' in type '" + theMethod.getDeclaringClass().getCanonicalName() + "' is of type " + SummaryEnum.class
|
||||||
|
+ " but can not be a collection of collections");
|
||||||
}
|
}
|
||||||
if (theInnerCollectionType != null) {
|
if (theInnerCollectionType != null) {
|
||||||
myInnerCollectionType = CollectionBinder.getInstantiableCollectionType(theInnerCollectionType, SummaryEnum.class.getSimpleName());
|
myInnerCollectionType = CollectionBinder.getInstantiableCollectionType(theInnerCollectionType, SummaryEnum.class.getSimpleName());
|
||||||
|
|
|
@ -10,7 +10,7 @@ package ca.uhn.fhir.rest.server.method;
|
||||||
* you may not use this file except in compliance with the License.
|
* you may not use this file except in compliance with the License.
|
||||||
* You may obtain a copy of the License at
|
* You may obtain a copy of the License at
|
||||||
*
|
*
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
*
|
*
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
@ -21,11 +21,8 @@ package ca.uhn.fhir.rest.server.method;
|
||||||
*/
|
*/
|
||||||
|
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.io.Reader;
|
|
||||||
import java.lang.reflect.Method;
|
import java.lang.reflect.Method;
|
||||||
import java.lang.reflect.Modifier;
|
import java.lang.reflect.Modifier;
|
||||||
import java.util.List;
|
|
||||||
import java.util.Map;
|
|
||||||
|
|
||||||
import org.hl7.fhir.instance.model.api.IBaseResource;
|
import org.hl7.fhir.instance.model.api.IBaseResource;
|
||||||
|
|
||||||
|
@ -33,17 +30,17 @@ import ca.uhn.fhir.context.ConfigurationException;
|
||||||
import ca.uhn.fhir.context.FhirContext;
|
import ca.uhn.fhir.context.FhirContext;
|
||||||
import ca.uhn.fhir.model.api.IResource;
|
import ca.uhn.fhir.model.api.IResource;
|
||||||
import ca.uhn.fhir.model.api.TagList;
|
import ca.uhn.fhir.model.api.TagList;
|
||||||
import ca.uhn.fhir.model.primitive.IdDt;
|
|
||||||
import ca.uhn.fhir.parser.IParser;
|
|
||||||
import ca.uhn.fhir.rest.annotation.GetTags;
|
import ca.uhn.fhir.rest.annotation.GetTags;
|
||||||
import ca.uhn.fhir.rest.annotation.IdParam;
|
import ca.uhn.fhir.rest.annotation.IdParam;
|
||||||
import ca.uhn.fhir.rest.api.*;
|
import ca.uhn.fhir.rest.api.Constants;
|
||||||
import ca.uhn.fhir.rest.api.server.*;
|
import ca.uhn.fhir.rest.api.RequestTypeEnum;
|
||||||
import ca.uhn.fhir.rest.client.impl.BaseHttpClientInvocation;
|
import ca.uhn.fhir.rest.api.RestOperationTypeEnum;
|
||||||
import ca.uhn.fhir.rest.param.IParameter;
|
import ca.uhn.fhir.rest.api.server.IRestfulServer;
|
||||||
|
import ca.uhn.fhir.rest.api.server.ParseAction;
|
||||||
|
import ca.uhn.fhir.rest.api.server.RequestDetails;
|
||||||
|
import ca.uhn.fhir.rest.param.ParameterUtil;
|
||||||
import ca.uhn.fhir.rest.server.IResourceProvider;
|
import ca.uhn.fhir.rest.server.IResourceProvider;
|
||||||
import ca.uhn.fhir.rest.server.exceptions.BaseServerResponseException;
|
import ca.uhn.fhir.rest.server.exceptions.BaseServerResponseException;
|
||||||
import ca.uhn.fhir.rest.server.exceptions.InternalErrorException;
|
|
||||||
import ca.uhn.fhir.rest.server.interceptor.IServerInterceptor;
|
import ca.uhn.fhir.rest.server.interceptor.IServerInterceptor;
|
||||||
|
|
||||||
public class GetTagsMethodBinding extends BaseMethodBinding<TagList> {
|
public class GetTagsMethodBinding extends BaseMethodBinding<TagList> {
|
||||||
|
@ -66,8 +63,8 @@ public class GetTagsMethodBinding extends BaseMethodBinding<TagList> {
|
||||||
myResourceName = theContext.getResourceDefinition(myType).getName();
|
myResourceName = theContext.getResourceDefinition(myType).getName();
|
||||||
}
|
}
|
||||||
|
|
||||||
myIdParamIndex = MethodUtil.findIdParameterIndex(theMethod, getContext());
|
myIdParamIndex = ParameterUtil.findIdParameterIndex(theMethod, getContext());
|
||||||
myVersionIdParamIndex = MethodUtil.findVersionIdParameterIndex(theMethod);
|
myVersionIdParamIndex = ParameterUtil.findVersionIdParameterIndex(theMethod);
|
||||||
|
|
||||||
if (myIdParamIndex != null && myType.equals(IResource.class)) {
|
if (myIdParamIndex != null && myType.equals(IResource.class)) {
|
||||||
throw new ConfigurationException("Method '" + theMethod.getName() + "' does not specify a resource type, but has an @" + IdParam.class.getSimpleName()
|
throw new ConfigurationException("Method '" + theMethod.getName() + "' does not specify a resource type, but has an @" + IdParam.class.getSimpleName()
|
||||||
|
@ -104,60 +101,9 @@ public class GetTagsMethodBinding extends BaseMethodBinding<TagList> {
|
||||||
if ((myIdParamIndex != null) != (theRequest.getId() != null)) {
|
if ((myIdParamIndex != null) != (theRequest.getId() != null)) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
// if ((myVersionIdParamIndex != null) != (theRequest.getVersionId() != null)) {
|
|
||||||
// return false;
|
|
||||||
// }
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
public BaseHttpClientInvocation invokeClient(Object[] theArgs) throws InternalErrorException {
|
|
||||||
HttpGetClientInvocation retVal;
|
|
||||||
|
|
||||||
IdDt id = null;
|
|
||||||
IdDt versionId = null;
|
|
||||||
if (myIdParamIndex != null) {
|
|
||||||
id = (IdDt) theArgs[myIdParamIndex];
|
|
||||||
if (myVersionIdParamIndex != null) {
|
|
||||||
versionId = (IdDt) theArgs[myVersionIdParamIndex];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (myType != IResource.class) {
|
|
||||||
if (id != null) {
|
|
||||||
if (versionId != null) {
|
|
||||||
retVal = new HttpGetClientInvocation(getContext(), getResourceName(), id.getIdPart(), Constants.PARAM_HISTORY, versionId.getValue(), Constants.PARAM_TAGS);
|
|
||||||
} else if (id.hasVersionIdPart()) {
|
|
||||||
retVal = new HttpGetClientInvocation(getContext(), getResourceName(), id.getIdPart(), Constants.PARAM_HISTORY, id.getVersionIdPart(), Constants.PARAM_TAGS);
|
|
||||||
} else {
|
|
||||||
retVal = new HttpGetClientInvocation(getContext(), getResourceName(), id.getIdPart(), Constants.PARAM_TAGS);
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
retVal = new HttpGetClientInvocation(getContext(), getResourceName(), Constants.PARAM_TAGS);
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
retVal = new HttpGetClientInvocation(getContext(), Constants.PARAM_TAGS);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (theArgs != null) {
|
|
||||||
for (int idx = 0; idx < theArgs.length; idx++) {
|
|
||||||
IParameter nextParam = getParameters().get(idx);
|
|
||||||
nextParam.translateClientArgumentIntoQueryArgument(getContext(), theArgs[idx], null, null);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return retVal;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public TagList invokeClient(String theResponseMimeType, Reader theResponseReader, int theResponseStatusCode, Map<String, List<String>> theHeaders) throws BaseServerResponseException {
|
|
||||||
if (theResponseStatusCode == Constants.STATUS_HTTP_200_OK) {
|
|
||||||
IParser parser = createAppropriateParserForParsingResponse(theResponseMimeType, theResponseReader, theResponseStatusCode, null);
|
|
||||||
TagList retVal = parser.parseTagList(theResponseReader);
|
|
||||||
return retVal;
|
|
||||||
}
|
|
||||||
throw processNon2xxResponseAndReturnExceptionToThrow(theResponseStatusCode, theResponseMimeType, theResponseReader);
|
|
||||||
}
|
|
||||||
@Override
|
@Override
|
||||||
public Object invokeServer(IRestfulServer<?> theServer, RequestDetails theRequest) throws BaseServerResponseException, IOException {
|
public Object invokeServer(IRestfulServer<?> theServer, RequestDetails theRequest) throws BaseServerResponseException, IOException {
|
||||||
Object[] params = createParametersForServerRequest(theRequest);
|
Object[] params = createParametersForServerRequest(theRequest);
|
||||||
|
|
|
@ -20,7 +20,6 @@ package ca.uhn.fhir.rest.server.method;
|
||||||
* #L%
|
* #L%
|
||||||
*/
|
*/
|
||||||
import static org.apache.commons.lang3.StringUtils.isBlank;
|
import static org.apache.commons.lang3.StringUtils.isBlank;
|
||||||
import static org.apache.commons.lang3.StringUtils.isNotBlank;
|
|
||||||
|
|
||||||
import java.lang.reflect.Method;
|
import java.lang.reflect.Method;
|
||||||
import java.lang.reflect.Modifier;
|
import java.lang.reflect.Modifier;
|
||||||
|
@ -37,11 +36,13 @@ 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.valueset.BundleTypeEnum;
|
import ca.uhn.fhir.model.valueset.BundleTypeEnum;
|
||||||
import ca.uhn.fhir.rest.annotation.History;
|
import ca.uhn.fhir.rest.annotation.History;
|
||||||
import ca.uhn.fhir.rest.api.*;
|
import ca.uhn.fhir.rest.api.Constants;
|
||||||
import ca.uhn.fhir.rest.api.server.*;
|
import ca.uhn.fhir.rest.api.RestOperationTypeEnum;
|
||||||
import ca.uhn.fhir.rest.client.impl.BaseHttpClientInvocation;
|
import ca.uhn.fhir.rest.api.server.IBundleProvider;
|
||||||
import ca.uhn.fhir.rest.param.IParameter;
|
import ca.uhn.fhir.rest.api.server.IRestfulServer;
|
||||||
import ca.uhn.fhir.rest.server.*;
|
import ca.uhn.fhir.rest.api.server.RequestDetails;
|
||||||
|
import ca.uhn.fhir.rest.param.ParameterUtil;
|
||||||
|
import ca.uhn.fhir.rest.server.IResourceProvider;
|
||||||
import ca.uhn.fhir.rest.server.exceptions.InternalErrorException;
|
import ca.uhn.fhir.rest.server.exceptions.InternalErrorException;
|
||||||
import ca.uhn.fhir.rest.server.exceptions.InvalidRequestException;
|
import ca.uhn.fhir.rest.server.exceptions.InvalidRequestException;
|
||||||
|
|
||||||
|
@ -54,7 +55,7 @@ public class HistoryMethodBinding extends BaseResourceReturningMethodBinding {
|
||||||
public HistoryMethodBinding(Method theMethod, FhirContext theContext, Object theProvider) {
|
public HistoryMethodBinding(Method theMethod, FhirContext theContext, Object theProvider) {
|
||||||
super(toReturnType(theMethod, theProvider), theMethod, theContext, theProvider);
|
super(toReturnType(theMethod, theProvider), theMethod, theContext, theProvider);
|
||||||
|
|
||||||
myIdParamIndex = MethodUtil.findIdParameterIndex(theMethod, getContext());
|
myIdParamIndex = ParameterUtil.findIdParameterIndex(theMethod, getContext());
|
||||||
|
|
||||||
History historyAnnotation = theMethod.getAnnotation(History.class);
|
History historyAnnotation = theMethod.getAnnotation(History.class);
|
||||||
Class<? extends IBaseResource> type = historyAnnotation.type();
|
Class<? extends IBaseResource> type = historyAnnotation.type();
|
||||||
|
@ -128,29 +129,6 @@ public class HistoryMethodBinding extends BaseResourceReturningMethodBinding {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
public BaseHttpClientInvocation invokeClient(Object[] theArgs) throws InternalErrorException {
|
|
||||||
IdDt id = null;
|
|
||||||
String resourceName = myResourceName;
|
|
||||||
if (myIdParamIndex != null) {
|
|
||||||
id = (IdDt) theArgs[myIdParamIndex];
|
|
||||||
if (id == null || isBlank(id.getValue())) {
|
|
||||||
throw new NullPointerException("ID can not be null");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
String historyId = id != null ? id.getIdPart() : null;
|
|
||||||
HttpGetClientInvocation retVal = createHistoryInvocation(getContext(), resourceName, historyId, null, null);
|
|
||||||
|
|
||||||
if (theArgs != null) {
|
|
||||||
for (int idx = 0; idx < theArgs.length; idx++) {
|
|
||||||
IParameter nextParam = getParameters().get(idx);
|
|
||||||
nextParam.translateClientArgumentIntoQueryArgument(getContext(), theArgs[idx], retVal.getParameters(), null);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return retVal;
|
|
||||||
}
|
|
||||||
|
|
||||||
@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 {
|
||||||
|
@ -210,34 +188,6 @@ public class HistoryMethodBinding extends BaseResourceReturningMethodBinding {
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
public static HttpGetClientInvocation createHistoryInvocation(FhirContext theContext, String theResourceName, String theId, IPrimitiveType<Date> theSince, Integer theLimit) {
|
|
||||||
StringBuilder b = new StringBuilder();
|
|
||||||
if (theResourceName != null) {
|
|
||||||
b.append(theResourceName);
|
|
||||||
if (isNotBlank(theId)) {
|
|
||||||
b.append('/');
|
|
||||||
b.append(theId);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (b.length() > 0) {
|
|
||||||
b.append('/');
|
|
||||||
}
|
|
||||||
b.append(Constants.PARAM_HISTORY);
|
|
||||||
|
|
||||||
boolean haveParam = false;
|
|
||||||
if (theSince != null && !theSince.isEmpty()) {
|
|
||||||
haveParam = true;
|
|
||||||
b.append('?').append(Constants.PARAM_SINCE).append('=').append(theSince.getValueAsString());
|
|
||||||
}
|
|
||||||
if (theLimit != null) {
|
|
||||||
b.append(haveParam ? '&' : '?');
|
|
||||||
b.append(Constants.PARAM_COUNT).append('=').append(theLimit);
|
|
||||||
}
|
|
||||||
|
|
||||||
HttpGetClientInvocation retVal = new HttpGetClientInvocation(theContext, b.toString());
|
|
||||||
return retVal;
|
|
||||||
}
|
|
||||||
|
|
||||||
private static Class<? extends IBaseResource> toReturnType(Method theMethod, Object theProvider) {
|
private static Class<? extends IBaseResource> toReturnType(Method theMethod, Object theProvider) {
|
||||||
if (theProvider instanceof IResourceProvider) {
|
if (theProvider instanceof IResourceProvider) {
|
||||||
return ((IResourceProvider) theProvider).getResourceType();
|
return ((IResourceProvider) theProvider).getResourceType();
|
||||||
|
|
|
@ -24,8 +24,7 @@ import java.lang.reflect.Method;
|
||||||
import java.util.Collection;
|
import java.util.Collection;
|
||||||
|
|
||||||
import ca.uhn.fhir.model.api.IResource;
|
import ca.uhn.fhir.model.api.IResource;
|
||||||
import ca.uhn.fhir.rest.api.server.IRequestDetails;
|
import ca.uhn.fhir.rest.api.server.RequestDetails;
|
||||||
import ca.uhn.fhir.rest.api.server.IServerMethodBinding;
|
|
||||||
import ca.uhn.fhir.rest.server.exceptions.InternalErrorException;
|
import ca.uhn.fhir.rest.server.exceptions.InternalErrorException;
|
||||||
import ca.uhn.fhir.rest.server.exceptions.InvalidRequestException;
|
import ca.uhn.fhir.rest.server.exceptions.InvalidRequestException;
|
||||||
|
|
||||||
|
@ -42,7 +41,7 @@ public interface IParameter {
|
||||||
* @param theMethodBinding TODO
|
* @param theMethodBinding TODO
|
||||||
* @return Returns the argument object as it will be passed to the IResourceProvider method.
|
* @return Returns the argument object as it will be passed to the IResourceProvider method.
|
||||||
*/
|
*/
|
||||||
Object translateQueryParametersIntoServerArgument(IRequestDetails theRequest, IServerMethodBinding theMethodBinding) throws InternalErrorException, InvalidRequestException;
|
Object translateQueryParametersIntoServerArgument(RequestDetails theRequest, BaseMethodBinding<?> theMethodBinding) throws InternalErrorException, InvalidRequestException;
|
||||||
|
|
||||||
void initializeTypes(Method theMethod, Class<? extends Collection<?>> theOuterCollectionType, Class<? extends Collection<?>> theInnerCollectionType, Class<?> theParameterType);
|
void initializeTypes(Method theMethod, Class<? extends Collection<?>> theOuterCollectionType, Class<? extends Collection<?>> theInnerCollectionType, Class<?> theParameterType);
|
||||||
|
|
||||||
|
|
|
@ -32,8 +32,9 @@ import ca.uhn.fhir.context.ConfigurationException;
|
||||||
import ca.uhn.fhir.context.FhirContext;
|
import ca.uhn.fhir.context.FhirContext;
|
||||||
import ca.uhn.fhir.model.api.Include;
|
import ca.uhn.fhir.model.api.Include;
|
||||||
import ca.uhn.fhir.rest.annotation.IncludeParam;
|
import ca.uhn.fhir.rest.annotation.IncludeParam;
|
||||||
import ca.uhn.fhir.rest.api.*;
|
import ca.uhn.fhir.rest.api.Constants;
|
||||||
import ca.uhn.fhir.rest.param.BaseQueryParameter;
|
import ca.uhn.fhir.rest.api.QualifiedParamList;
|
||||||
|
import ca.uhn.fhir.rest.api.RestSearchParameterTypeEnum;
|
||||||
import ca.uhn.fhir.rest.server.exceptions.InternalErrorException;
|
import ca.uhn.fhir.rest.server.exceptions.InternalErrorException;
|
||||||
import ca.uhn.fhir.rest.server.exceptions.InvalidRequestException;
|
import ca.uhn.fhir.rest.server.exceptions.InvalidRequestException;
|
||||||
|
|
||||||
|
|
|
@ -22,23 +22,13 @@ package ca.uhn.fhir.rest.server.method;
|
||||||
|
|
||||||
import java.lang.reflect.Method;
|
import java.lang.reflect.Method;
|
||||||
import java.util.Collection;
|
import java.util.Collection;
|
||||||
import java.util.List;
|
|
||||||
import java.util.Map;
|
|
||||||
|
|
||||||
import org.hl7.fhir.instance.model.api.IBaseResource;
|
|
||||||
|
|
||||||
import ca.uhn.fhir.context.FhirContext;
|
|
||||||
import ca.uhn.fhir.rest.api.server.RequestDetails;
|
import ca.uhn.fhir.rest.api.server.RequestDetails;
|
||||||
import ca.uhn.fhir.rest.param.IParameter;
|
|
||||||
import ca.uhn.fhir.rest.server.exceptions.InternalErrorException;
|
import ca.uhn.fhir.rest.server.exceptions.InternalErrorException;
|
||||||
import ca.uhn.fhir.rest.server.exceptions.InvalidRequestException;
|
import ca.uhn.fhir.rest.server.exceptions.InvalidRequestException;
|
||||||
|
|
||||||
class NullParameter implements IParameter {
|
class NullParameter implements IParameter {
|
||||||
|
|
||||||
@Override
|
|
||||||
public void translateClientArgumentIntoQueryArgument(FhirContext theContext, Object theSourceClientArgument, Map<String, List<String>> theTargetQueryArguments, IBaseResource theTargetResource) throws InternalErrorException {
|
|
||||||
//nothing
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Object translateQueryParametersIntoServerArgument(RequestDetails theRequest, BaseMethodBinding<?> theMethodBinding) throws InternalErrorException, InvalidRequestException {
|
public Object translateQueryParametersIntoServerArgument(RequestDetails theRequest, BaseMethodBinding<?> theMethodBinding) throws InternalErrorException, InvalidRequestException {
|
||||||
|
|
|
@ -28,17 +28,10 @@ import java.lang.reflect.Method;
|
||||||
import java.lang.reflect.Modifier;
|
import java.lang.reflect.Modifier;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.Collections;
|
import java.util.Collections;
|
||||||
import java.util.LinkedHashMap;
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Map;
|
|
||||||
|
|
||||||
import org.hl7.fhir.instance.model.api.IBase;
|
import org.hl7.fhir.instance.model.api.IBase;
|
||||||
import org.hl7.fhir.instance.model.api.IBaseBundle;
|
|
||||||
import org.hl7.fhir.instance.model.api.IBaseDatatype;
|
|
||||||
import org.hl7.fhir.instance.model.api.IBaseParameters;
|
|
||||||
import org.hl7.fhir.instance.model.api.IBaseResource;
|
import org.hl7.fhir.instance.model.api.IBaseResource;
|
||||||
import org.hl7.fhir.instance.model.api.IIdType;
|
|
||||||
import org.hl7.fhir.instance.model.api.IPrimitiveType;
|
|
||||||
|
|
||||||
import ca.uhn.fhir.context.ConfigurationException;
|
import ca.uhn.fhir.context.ConfigurationException;
|
||||||
import ca.uhn.fhir.context.FhirContext;
|
import ca.uhn.fhir.context.FhirContext;
|
||||||
|
@ -49,15 +42,15 @@ import ca.uhn.fhir.model.valueset.BundleTypeEnum;
|
||||||
import ca.uhn.fhir.rest.annotation.IdParam;
|
import ca.uhn.fhir.rest.annotation.IdParam;
|
||||||
import ca.uhn.fhir.rest.annotation.Operation;
|
import ca.uhn.fhir.rest.annotation.Operation;
|
||||||
import ca.uhn.fhir.rest.annotation.OperationParam;
|
import ca.uhn.fhir.rest.annotation.OperationParam;
|
||||||
import ca.uhn.fhir.rest.api.*;
|
import ca.uhn.fhir.rest.api.RequestTypeEnum;
|
||||||
import ca.uhn.fhir.rest.api.server.*;
|
import ca.uhn.fhir.rest.api.RestOperationTypeEnum;
|
||||||
import ca.uhn.fhir.rest.client.impl.BaseHttpClientInvocation;
|
import ca.uhn.fhir.rest.api.server.IBundleProvider;
|
||||||
import ca.uhn.fhir.rest.param.IParameter;
|
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.server.exceptions.BaseServerResponseException;
|
import ca.uhn.fhir.rest.server.exceptions.BaseServerResponseException;
|
||||||
import ca.uhn.fhir.rest.server.exceptions.InternalErrorException;
|
|
||||||
import ca.uhn.fhir.rest.server.exceptions.MethodNotAllowedException;
|
import ca.uhn.fhir.rest.server.exceptions.MethodNotAllowedException;
|
||||||
import ca.uhn.fhir.rest.server.interceptor.IServerInterceptor.ActionRequestDetails;
|
import ca.uhn.fhir.rest.server.interceptor.IServerInterceptor.ActionRequestDetails;
|
||||||
import ca.uhn.fhir.util.FhirTerser;
|
|
||||||
|
|
||||||
public class OperationMethodBinding extends BaseResourceReturningMethodBinding {
|
public class OperationMethodBinding extends BaseResourceReturningMethodBinding {
|
||||||
|
|
||||||
|
@ -81,7 +74,7 @@ public class OperationMethodBinding extends BaseResourceReturningMethodBinding {
|
||||||
|
|
||||||
myBundleType = theBundleType;
|
myBundleType = theBundleType;
|
||||||
myIdempotent = theIdempotent;
|
myIdempotent = theIdempotent;
|
||||||
myIdParamIndex = MethodUtil.findIdParameterIndex(theMethod, getContext());
|
myIdParamIndex = ParameterUtil.findIdParameterIndex(theMethod, getContext());
|
||||||
if (myIdParamIndex != null) {
|
if (myIdParamIndex != null) {
|
||||||
for (Annotation next : theMethod.getParameterAnnotations()[myIdParamIndex]) {
|
for (Annotation next : theMethod.getParameterAnnotations()[myIdParamIndex]) {
|
||||||
if (next instanceof IdParam) {
|
if (next instanceof IdParam) {
|
||||||
|
@ -245,24 +238,6 @@ public class OperationMethodBinding extends BaseResourceReturningMethodBinding {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
public BaseHttpClientInvocation invokeClient(Object[] theArgs) throws InternalErrorException {
|
|
||||||
String id = null;
|
|
||||||
if (myIdParamIndex != null) {
|
|
||||||
IIdType idDt = (IIdType) theArgs[myIdParamIndex];
|
|
||||||
id = idDt.getValue();
|
|
||||||
}
|
|
||||||
IBaseParameters parameters = (IBaseParameters) getContext().getResourceDefinition("Parameters").newInstance();
|
|
||||||
|
|
||||||
if (theArgs != null) {
|
|
||||||
for (int idx = 0; idx < theArgs.length; idx++) {
|
|
||||||
IParameter nextParam = getParameters().get(idx);
|
|
||||||
nextParam.translateClientArgumentIntoQueryArgument(getContext(), theArgs[idx], null, parameters);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return createOperationInvocation(getContext(), getResourceName(), id, myName, parameters, false);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Object invokeServer(IRestfulServer<?> theServer, RequestDetails theRequest) throws BaseServerResponseException, IOException {
|
public Object invokeServer(IRestfulServer<?> theServer, RequestDetails theRequest) throws BaseServerResponseException, IOException {
|
||||||
|
|
|
@ -24,43 +24,21 @@ import static org.apache.commons.lang3.StringUtils.isNotBlank;
|
||||||
|
|
||||||
import java.lang.reflect.Method;
|
import java.lang.reflect.Method;
|
||||||
import java.lang.reflect.Modifier;
|
import java.lang.reflect.Modifier;
|
||||||
import java.util.ArrayList;
|
import java.util.*;
|
||||||
import java.util.Arrays;
|
|
||||||
import java.util.Collection;
|
|
||||||
import java.util.Collections;
|
|
||||||
import java.util.List;
|
|
||||||
import java.util.Map;
|
|
||||||
|
|
||||||
import org.apache.commons.lang3.Validate;
|
import org.apache.commons.lang3.Validate;
|
||||||
import org.hl7.fhir.instance.model.api.IBase;
|
import org.hl7.fhir.instance.model.api.*;
|
||||||
import org.hl7.fhir.instance.model.api.IBaseDatatype;
|
|
||||||
import org.hl7.fhir.instance.model.api.IBaseResource;
|
|
||||||
import org.hl7.fhir.instance.model.api.IPrimitiveType;
|
|
||||||
|
|
||||||
import ca.uhn.fhir.context.BaseRuntimeChildDefinition;
|
import ca.uhn.fhir.context.*;
|
||||||
import ca.uhn.fhir.context.BaseRuntimeChildDefinition.IAccessor;
|
import ca.uhn.fhir.context.BaseRuntimeChildDefinition.IAccessor;
|
||||||
import ca.uhn.fhir.context.BaseRuntimeElementCompositeDefinition;
|
|
||||||
import ca.uhn.fhir.context.BaseRuntimeElementDefinition;
|
|
||||||
import ca.uhn.fhir.context.ConfigurationException;
|
|
||||||
import ca.uhn.fhir.context.FhirContext;
|
|
||||||
import ca.uhn.fhir.context.IRuntimeDatatypeDefinition;
|
|
||||||
import ca.uhn.fhir.context.RuntimeChildPrimitiveDatatypeDefinition;
|
|
||||||
import ca.uhn.fhir.context.RuntimePrimitiveDatatypeDefinition;
|
|
||||||
import ca.uhn.fhir.context.RuntimeResourceDefinition;
|
|
||||||
import ca.uhn.fhir.i18n.HapiLocalizer;
|
import ca.uhn.fhir.i18n.HapiLocalizer;
|
||||||
import ca.uhn.fhir.model.api.IDatatype;
|
import ca.uhn.fhir.model.api.*;
|
||||||
import ca.uhn.fhir.model.api.IQueryParameterAnd;
|
|
||||||
import ca.uhn.fhir.model.api.IQueryParameterOr;
|
|
||||||
import ca.uhn.fhir.model.api.IQueryParameterType;
|
|
||||||
import ca.uhn.fhir.rest.annotation.OperationParam;
|
import ca.uhn.fhir.rest.annotation.OperationParam;
|
||||||
import ca.uhn.fhir.rest.api.*;
|
import ca.uhn.fhir.rest.api.*;
|
||||||
import ca.uhn.fhir.rest.api.server.RequestDetails;
|
import ca.uhn.fhir.rest.api.server.RequestDetails;
|
||||||
import ca.uhn.fhir.rest.param.*;
|
import ca.uhn.fhir.rest.param.*;
|
||||||
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.MethodNotAllowedException;
|
|
||||||
import ca.uhn.fhir.util.FhirTerser;
|
import ca.uhn.fhir.util.FhirTerser;
|
||||||
import ca.uhn.fhir.util.ParametersUtil;
|
|
||||||
import ca.uhn.fhir.util.ReflectionUtil;
|
import ca.uhn.fhir.util.ReflectionUtil;
|
||||||
|
|
||||||
public class OperationParameter implements IParameter {
|
public class OperationParameter implements IParameter {
|
||||||
|
@ -219,21 +197,6 @@ public class OperationParameter implements IParameter {
|
||||||
throw new InvalidRequestException("Request has parameter " + myName + " of type " + nextValue.getClass().getSimpleName() + " but method expects type " + myParameterType.getSimpleName());
|
throw new InvalidRequestException("Request has parameter " + myName + " of type " + nextValue.getClass().getSimpleName() + " but method expects type " + myParameterType.getSimpleName());
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
public void translateClientArgumentIntoQueryArgument(FhirContext theContext, Object theSourceClientArgument, Map<String, List<String>> theTargetQueryArguments, IBaseResource theTargetResource) throws InternalErrorException {
|
|
||||||
assert theTargetResource != null;
|
|
||||||
Object sourceClientArgument = theSourceClientArgument;
|
|
||||||
if (sourceClientArgument == null) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (myConverter != null) {
|
|
||||||
sourceClientArgument = myConverter.outgoingClient(sourceClientArgument);
|
|
||||||
}
|
|
||||||
|
|
||||||
ParametersUtil.addParameterToParameters(theContext, theTargetResource, sourceClientArgument, myName);
|
|
||||||
}
|
|
||||||
|
|
||||||
@SuppressWarnings("unchecked")
|
@SuppressWarnings("unchecked")
|
||||||
@Override
|
@Override
|
||||||
public Object translateQueryParametersIntoServerArgument(RequestDetails theRequest, BaseMethodBinding<?> theMethodBinding) throws InternalErrorException, InvalidRequestException {
|
public Object translateQueryParametersIntoServerArgument(RequestDetails theRequest, BaseMethodBinding<?> theMethodBinding) throws InternalErrorException, InvalidRequestException {
|
||||||
|
|
|
@ -26,22 +26,17 @@ import java.lang.reflect.Method;
|
||||||
import java.util.HashSet;
|
import java.util.HashSet;
|
||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
|
|
||||||
import org.hl7.fhir.instance.model.api.IBase;
|
|
||||||
import org.hl7.fhir.instance.model.api.IBaseResource;
|
import org.hl7.fhir.instance.model.api.IBaseResource;
|
||||||
|
|
||||||
import ca.uhn.fhir.context.FhirContext;
|
import ca.uhn.fhir.context.FhirContext;
|
||||||
import ca.uhn.fhir.model.api.Bundle;
|
|
||||||
import ca.uhn.fhir.model.api.Include;
|
import ca.uhn.fhir.model.api.Include;
|
||||||
import ca.uhn.fhir.model.valueset.BundleTypeEnum;
|
import ca.uhn.fhir.model.valueset.BundleTypeEnum;
|
||||||
import ca.uhn.fhir.rest.api.*;
|
import ca.uhn.fhir.rest.api.*;
|
||||||
import ca.uhn.fhir.rest.api.server.*;
|
import ca.uhn.fhir.rest.api.server.*;
|
||||||
import ca.uhn.fhir.rest.client.impl.BaseHttpClientInvocation;
|
import ca.uhn.fhir.rest.server.IPagingProvider;
|
||||||
import ca.uhn.fhir.rest.server.*;
|
import ca.uhn.fhir.rest.server.RestfulServerUtils;
|
||||||
import ca.uhn.fhir.rest.server.RestfulServerUtils.ResponseEncoding;
|
import ca.uhn.fhir.rest.server.RestfulServerUtils.ResponseEncoding;
|
||||||
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.ResourceGoneException;
|
|
||||||
import ca.uhn.fhir.util.CoverageIgnore;
|
|
||||||
|
|
||||||
public class PageMethodBinding extends BaseResourceReturningMethodBinding {
|
public class PageMethodBinding extends BaseResourceReturningMethodBinding {
|
||||||
|
|
||||||
|
@ -71,15 +66,11 @@ public class PageMethodBinding extends BaseResourceReturningMethodBinding {
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public ResourceOrDstu1Bundle doInvokeServer(IRestfulServer<?> theServer, RequestDetails theRequest) {
|
public IBaseResource doInvokeServer(IRestfulServer<?> theServer, RequestDetails theRequest) {
|
||||||
IBase bundle = handlePagingRequest(theServer, theRequest, theRequest.getParameters().get(Constants.PARAM_PAGINGACTION)[0]);
|
return handlePagingRequest(theServer, theRequest, theRequest.getParameters().get(Constants.PARAM_PAGINGACTION)[0]);
|
||||||
if (bundle instanceof Bundle) {
|
|
||||||
return new ResourceOrDstu1Bundle((Bundle) bundle);
|
|
||||||
}
|
|
||||||
return new ResourceOrDstu1Bundle((IBaseResource) bundle);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private IBase handlePagingRequest(IRestfulServer<?> theServer, RequestDetails theRequest, String thePagingAction) {
|
private IBaseResource handlePagingRequest(IRestfulServer<?> theServer, RequestDetails theRequest, String thePagingAction) {
|
||||||
IPagingProvider pagingProvider = theServer.getPagingProvider();
|
IPagingProvider pagingProvider = theServer.getPagingProvider();
|
||||||
if (pagingProvider == null) {
|
if (pagingProvider == null) {
|
||||||
throw new InvalidRequestException("This server does not support paging");
|
throw new InvalidRequestException("This server does not support paging");
|
||||||
|
@ -110,9 +101,6 @@ public class PageMethodBinding extends BaseResourceReturningMethodBinding {
|
||||||
}
|
}
|
||||||
|
|
||||||
ResponseEncoding responseEncoding = RestfulServerUtils.determineResponseEncodingNoDefault(theRequest, theServer.getDefaultResponseEncoding());
|
ResponseEncoding responseEncoding = RestfulServerUtils.determineResponseEncodingNoDefault(theRequest, theServer.getDefaultResponseEncoding());
|
||||||
boolean prettyPrint = RestfulServerUtils.prettyPrintResponse(theServer, theRequest);
|
|
||||||
|
|
||||||
IVersionSpecificBundleFactory bundleFactory = theServer.getFhirContext().newBundleFactory();
|
|
||||||
|
|
||||||
Set<Include> includes = new HashSet<Include>();
|
Set<Include> includes = new HashSet<Include>();
|
||||||
String[] reqIncludes = theRequest.getParameters().get(Constants.PARAM_INCLUDE);
|
String[] reqIncludes = theRequest.getParameters().get(Constants.PARAM_INCLUDE);
|
||||||
|
@ -137,38 +125,8 @@ public class PageMethodBinding extends BaseResourceReturningMethodBinding {
|
||||||
if (responseEncoding != null) {
|
if (responseEncoding != null) {
|
||||||
encodingEnum = responseEncoding.getEncoding();
|
encodingEnum = responseEncoding.getEncoding();
|
||||||
}
|
}
|
||||||
bundleFactory.initializeBundleFromBundleProvider(theServer, resultList, encodingEnum, theRequest.getFhirServerBase(), linkSelf, prettyPrint, start, count, thePagingAction, bundleType, includes);
|
|
||||||
|
return createBundleFromBundleProvider(theServer, theRequest, count, linkSelf, includes, resultList, start, bundleType, encodingEnum, thePagingAction);
|
||||||
Bundle bundle = bundleFactory.getDstu1Bundle();
|
|
||||||
if (bundle != null) {
|
|
||||||
return bundle;
|
|
||||||
}
|
|
||||||
return bundleFactory.getResourceBundle();
|
|
||||||
// if (bundle != null) {
|
|
||||||
// for (int i = getInterceptors().size() - 1; i >= 0; i--) {
|
|
||||||
// IServerInterceptor next = getInterceptors().get(i);
|
|
||||||
// boolean continueProcessing = next.outgoingResponse(theRequest, bundle, theRequest.getServletRequest(),
|
|
||||||
// theRequest.getServletResponse());
|
|
||||||
// if (!continueProcessing) {
|
|
||||||
// ourLog.debug("Interceptor {} returned false, not continuing processing");
|
|
||||||
// return;
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
// theRequest.getResponse().streamResponseAsBundle(bundle, summaryMode, respondGzip, requestIsBrowser);
|
|
||||||
// } else {
|
|
||||||
// IBaseResource resBundle = bundleFactory.getResourceBundle();
|
|
||||||
// for (int i = getInterceptors().size() - 1; i >= 0; i--) {
|
|
||||||
// IServerInterceptor next = getInterceptors().get(i);
|
|
||||||
// boolean continueProcessing = next.outgoingResponse(theRequest, resBundle, theRequest.getServletRequest(),
|
|
||||||
// theRequest.getServletResponse());
|
|
||||||
// if (!continueProcessing) {
|
|
||||||
// ourLog.debug("Interceptor {} returned false, not continuing processing");
|
|
||||||
// return;
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
// theRequest.getResponse().streamResponseAsResource(resBundle, prettyPrint, summaryMode,
|
|
||||||
// Constants.STATUS_HTTP_200_OK, theRequest.isRespondGzip(), false);
|
|
||||||
// }
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -188,10 +146,5 @@ public class PageMethodBinding extends BaseResourceReturningMethodBinding {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@CoverageIgnore
|
|
||||||
@Override
|
|
||||||
public BaseHttpClientInvocation invokeClient(Object[] theArgs) throws InternalErrorException {
|
|
||||||
throw new UnsupportedOperationException();
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -22,21 +22,21 @@ package ca.uhn.fhir.rest.server.method;
|
||||||
|
|
||||||
import java.lang.annotation.Annotation;
|
import java.lang.annotation.Annotation;
|
||||||
import java.lang.reflect.Method;
|
import java.lang.reflect.Method;
|
||||||
import java.util.*;
|
import java.util.Arrays;
|
||||||
|
import java.util.Collections;
|
||||||
|
import java.util.ListIterator;
|
||||||
|
import java.util.Set;
|
||||||
|
|
||||||
import org.hl7.fhir.instance.model.api.IIdType;
|
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;
|
||||||
import ca.uhn.fhir.model.api.IResource;
|
|
||||||
import ca.uhn.fhir.rest.annotation.Patch;
|
import ca.uhn.fhir.rest.annotation.Patch;
|
||||||
import ca.uhn.fhir.rest.annotation.ResourceParam;
|
import ca.uhn.fhir.rest.annotation.ResourceParam;
|
||||||
import ca.uhn.fhir.rest.api.*;
|
import ca.uhn.fhir.rest.api.PatchTypeEnum;
|
||||||
|
import ca.uhn.fhir.rest.api.RequestTypeEnum;
|
||||||
|
import ca.uhn.fhir.rest.api.RestOperationTypeEnum;
|
||||||
import ca.uhn.fhir.rest.api.server.RequestDetails;
|
import ca.uhn.fhir.rest.api.server.RequestDetails;
|
||||||
import ca.uhn.fhir.rest.client.impl.BaseHttpClientInvocation;
|
|
||||||
import ca.uhn.fhir.rest.param.IParameter;
|
|
||||||
import ca.uhn.fhir.rest.server.exceptions.InternalErrorException;
|
|
||||||
import ca.uhn.fhir.rest.server.exceptions.InvalidRequestException;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Base class for an operation that has a resource type but not a resource body in the
|
* Base class for an operation that has a resource type but not a resource body in the
|
||||||
|
@ -91,54 +91,7 @@ public class PatchMethodBinding extends BaseOutcomeReturningMethodBindingWithRes
|
||||||
return Collections.singleton(RequestTypeEnum.PATCH);
|
return Collections.singleton(RequestTypeEnum.PATCH);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
protected BaseHttpClientInvocation createClientInvocation(Object[] theArgs, IResource theResource) {
|
|
||||||
StringBuilder urlExtension = new StringBuilder();
|
|
||||||
urlExtension.append(getContext().getResourceDefinition(theResource).getName());
|
|
||||||
|
|
||||||
return new HttpPostClientInvocation(getContext(), theResource, urlExtension.toString());
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected boolean allowVoidReturnType() {
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public BaseHttpClientInvocation invokeClient(Object[] theArgs) throws InternalErrorException {
|
|
||||||
IIdType idDt = (IIdType) theArgs[getIdParameterIndex()];
|
|
||||||
if (idDt == null) {
|
|
||||||
throw new NullPointerException("ID can not be null");
|
|
||||||
}
|
|
||||||
|
|
||||||
if (idDt.hasResourceType() == false) {
|
|
||||||
idDt = idDt.withResourceType(getResourceName());
|
|
||||||
} else if (getResourceName().equals(idDt.getResourceType()) == false) {
|
|
||||||
throw new InvalidRequestException("ID parameter has the wrong resource type, expected '" + getResourceName() + "', found: " + idDt.getResourceType());
|
|
||||||
}
|
|
||||||
|
|
||||||
PatchTypeEnum patchType = (PatchTypeEnum) theArgs[myPatchTypeParameterIndex];
|
|
||||||
String body = (String) theArgs[myResourceParamIndex];
|
|
||||||
|
|
||||||
HttpPatchClientInvocation retVal = createPatchInvocation(getContext(), idDt, patchType, body);
|
|
||||||
|
|
||||||
for (int idx = 0; idx < theArgs.length; idx++) {
|
|
||||||
IParameter nextParam = getParameters().get(idx);
|
|
||||||
nextParam.translateClientArgumentIntoQueryArgument(getContext(), theArgs[idx], null, null);
|
|
||||||
}
|
|
||||||
|
|
||||||
return retVal;
|
|
||||||
}
|
|
||||||
|
|
||||||
public static HttpPatchClientInvocation createPatchInvocation(FhirContext theContext, IIdType theId, PatchTypeEnum thePatchType, String theBody) {
|
|
||||||
HttpPatchClientInvocation retVal = new HttpPatchClientInvocation(theContext, theId, thePatchType.getContentType(), theBody);
|
|
||||||
return retVal;
|
|
||||||
}
|
|
||||||
|
|
||||||
public static HttpPatchClientInvocation createPatchInvocation(FhirContext theContext, String theUrlPath, PatchTypeEnum thePatchType, String theBody) {
|
|
||||||
HttpPatchClientInvocation retVal = new HttpPatchClientInvocation(theContext, theUrlPath, thePatchType.getContentType(), theBody);
|
|
||||||
return retVal;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected void addParametersForServerRequest(RequestDetails theRequest, Object[] theParams) {
|
protected void addParametersForServerRequest(RequestDetails theRequest, Object[] theParams) {
|
||||||
|
@ -152,11 +105,5 @@ public class PatchMethodBinding extends BaseOutcomeReturningMethodBindingWithRes
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
public static HttpPatchClientInvocation createPatchInvocation(FhirContext theContext, PatchTypeEnum thePatchType, String theBody, String theResourceType, Map<String, List<String>> theMatchParams) {
|
|
||||||
StringBuilder urlBuilder = MethodUtil.createUrl(theResourceType, theMatchParams);
|
|
||||||
String url = urlBuilder.toString();
|
|
||||||
HttpPatchClientInvocation retVal = new HttpPatchClientInvocation(theContext, url, thePatchType.getContentType(), theBody);
|
|
||||||
return retVal;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -24,23 +24,14 @@ import static org.apache.commons.lang3.StringUtils.defaultString;
|
||||||
|
|
||||||
import java.lang.reflect.Method;
|
import java.lang.reflect.Method;
|
||||||
import java.util.Collection;
|
import java.util.Collection;
|
||||||
import java.util.List;
|
|
||||||
import java.util.Map;
|
|
||||||
|
|
||||||
import org.hl7.fhir.instance.model.api.IBaseResource;
|
import ca.uhn.fhir.rest.api.Constants;
|
||||||
|
import ca.uhn.fhir.rest.api.PatchTypeEnum;
|
||||||
import ca.uhn.fhir.context.FhirContext;
|
|
||||||
import ca.uhn.fhir.rest.api.*;
|
|
||||||
import ca.uhn.fhir.rest.api.server.RequestDetails;
|
import ca.uhn.fhir.rest.api.server.RequestDetails;
|
||||||
import ca.uhn.fhir.rest.param.IParameter;
|
|
||||||
import ca.uhn.fhir.rest.server.exceptions.InternalErrorException;
|
import ca.uhn.fhir.rest.server.exceptions.InternalErrorException;
|
||||||
import ca.uhn.fhir.rest.server.exceptions.InvalidRequestException;
|
import ca.uhn.fhir.rest.server.exceptions.InvalidRequestException;
|
||||||
|
|
||||||
class PatchTypeParameter implements IParameter {
|
class PatchTypeParameter implements IParameter {
|
||||||
@Override
|
|
||||||
public void translateClientArgumentIntoQueryArgument(FhirContext theContext, Object theSourceClientArgument, Map<String, List<String>> theTargetQueryArguments, IBaseResource theTargetResource) throws InternalErrorException {
|
|
||||||
// nothing
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Object translateQueryParametersIntoServerArgument(RequestDetails theRequest, BaseMethodBinding<?> theMethodBinding) throws InternalErrorException, InvalidRequestException {
|
public Object translateQueryParametersIntoServerArgument(RequestDetails theRequest, BaseMethodBinding<?> theMethodBinding) throws InternalErrorException, InvalidRequestException {
|
||||||
|
|
|
@ -29,6 +29,7 @@ import ca.uhn.fhir.context.FhirContext;
|
||||||
import ca.uhn.fhir.model.api.IQueryParameterOr;
|
import ca.uhn.fhir.model.api.IQueryParameterOr;
|
||||||
import ca.uhn.fhir.model.api.IQueryParameterType;
|
import ca.uhn.fhir.model.api.IQueryParameterType;
|
||||||
import ca.uhn.fhir.rest.api.QualifiedParamList;
|
import ca.uhn.fhir.rest.api.QualifiedParamList;
|
||||||
|
import ca.uhn.fhir.rest.param.ParameterUtil;
|
||||||
import ca.uhn.fhir.rest.server.exceptions.InternalErrorException;
|
import ca.uhn.fhir.rest.server.exceptions.InternalErrorException;
|
||||||
import ca.uhn.fhir.rest.server.exceptions.InvalidRequestException;
|
import ca.uhn.fhir.rest.server.exceptions.InvalidRequestException;
|
||||||
|
|
||||||
|
@ -42,7 +43,7 @@ final class QueryParameterTypeBinder extends BaseBinder<IQueryParameterType> imp
|
||||||
@Override
|
@Override
|
||||||
public List<IQueryParameterOr<?>> encode(FhirContext theContext, IQueryParameterType theValue) throws InternalErrorException {
|
public List<IQueryParameterOr<?>> encode(FhirContext theContext, IQueryParameterType theValue) throws InternalErrorException {
|
||||||
IQueryParameterType param = theValue;
|
IQueryParameterType param = theValue;
|
||||||
List<?> retVal = Collections.singletonList(MethodUtil.singleton(param, null));
|
List<?> retVal = Collections.singletonList(ParameterUtil.singleton(param, null));
|
||||||
return (List<IQueryParameterOr<?>>) retVal;
|
return (List<IQueryParameterOr<?>>) retVal;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -28,15 +28,12 @@ import java.util.List;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
|
||||||
import org.apache.commons.lang3.Validate;
|
import org.apache.commons.lang3.Validate;
|
||||||
import org.hl7.fhir.instance.model.api.IBaseResource;
|
|
||||||
|
|
||||||
import ca.uhn.fhir.context.FhirContext;
|
|
||||||
import ca.uhn.fhir.rest.annotation.RawParam;
|
import ca.uhn.fhir.rest.annotation.RawParam;
|
||||||
import ca.uhn.fhir.rest.api.server.RequestDetails;
|
import ca.uhn.fhir.rest.api.server.RequestDetails;
|
||||||
import ca.uhn.fhir.rest.param.IParameter;
|
import ca.uhn.fhir.rest.param.QualifierDetails;
|
||||||
import ca.uhn.fhir.rest.server.exceptions.InternalErrorException;
|
import ca.uhn.fhir.rest.server.exceptions.InternalErrorException;
|
||||||
import ca.uhn.fhir.rest.server.exceptions.InvalidRequestException;
|
import ca.uhn.fhir.rest.server.exceptions.InvalidRequestException;
|
||||||
import ca.uhn.fhir.rest.server.method.SearchMethodBinding.QualifierDetails;
|
|
||||||
|
|
||||||
public class RawParamsParmeter implements IParameter {
|
public class RawParamsParmeter implements IParameter {
|
||||||
|
|
||||||
|
@ -46,12 +43,7 @@ public class RawParamsParmeter implements IParameter {
|
||||||
myAllMethodParameters = theParameters;
|
myAllMethodParameters = theParameters;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
public void translateClientArgumentIntoQueryArgument(FhirContext theContext, Object theSourceClientArgument, Map<String, List<String>> theTargetQueryArguments, IBaseResource theTargetResource)
|
|
||||||
throws InternalErrorException {
|
|
||||||
// not supported on client for now
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Object translateQueryParametersIntoServerArgument(RequestDetails theRequest, BaseMethodBinding<?> theMethodBinding) throws InternalErrorException, InvalidRequestException {
|
public Object translateQueryParametersIntoServerArgument(RequestDetails theRequest, BaseMethodBinding<?> theMethodBinding) throws InternalErrorException, InvalidRequestException {
|
||||||
HashMap<String, List<String>> retVal = null;
|
HashMap<String, List<String>> retVal = null;
|
||||||
|
|
|
@ -2,51 +2,41 @@ package ca.uhn.fhir.rest.server.method;
|
||||||
|
|
||||||
import static org.apache.commons.lang3.StringUtils.isNotBlank;
|
import static org.apache.commons.lang3.StringUtils.isNotBlank;
|
||||||
|
|
||||||
/*
|
|
||||||
* #%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.io.IOException;
|
|
||||||
import java.io.InputStream;
|
|
||||||
import java.lang.reflect.Method;
|
import java.lang.reflect.Method;
|
||||||
import java.util.*;
|
import java.util.ArrayList;
|
||||||
|
import java.util.Date;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
import org.apache.commons.io.IOUtils;
|
|
||||||
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.*;
|
import org.hl7.fhir.instance.model.api.IAnyResource;
|
||||||
|
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;
|
||||||
import ca.uhn.fhir.model.api.*;
|
import ca.uhn.fhir.model.api.IResource;
|
||||||
|
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.*;
|
import ca.uhn.fhir.rest.annotation.Elements;
|
||||||
import ca.uhn.fhir.rest.api.*;
|
import ca.uhn.fhir.rest.annotation.IdParam;
|
||||||
import ca.uhn.fhir.rest.api.server.*;
|
import ca.uhn.fhir.rest.annotation.Read;
|
||||||
import ca.uhn.fhir.rest.param.IParameter;
|
import ca.uhn.fhir.rest.api.Constants;
|
||||||
import ca.uhn.fhir.rest.server.*;
|
import ca.uhn.fhir.rest.api.RequestTypeEnum;
|
||||||
import ca.uhn.fhir.rest.server.exceptions.*;
|
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.server.ETagSupportEnum;
|
||||||
|
import ca.uhn.fhir.rest.server.exceptions.InternalErrorException;
|
||||||
|
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 implements IClientResponseHandlerHandlesBinary<Object> {
|
public class ReadMethodBinding extends BaseResourceReturningMethodBinding {
|
||||||
private static final org.slf4j.Logger ourLog = org.slf4j.LoggerFactory.getLogger(ReadMethodBinding.class);
|
private static final org.slf4j.Logger ourLog = org.slf4j.LoggerFactory.getLogger(ReadMethodBinding.class);
|
||||||
|
|
||||||
private Integer myIdIndex;
|
private Integer myIdIndex;
|
||||||
|
@ -60,8 +50,8 @@ public class ReadMethodBinding extends BaseResourceReturningMethodBinding implem
|
||||||
|
|
||||||
Validate.notNull(theMethod, "Method must not be null");
|
Validate.notNull(theMethod, "Method must not be null");
|
||||||
|
|
||||||
Integer idIndex = MethodUtil.findIdParameterIndex(theMethod, getContext());
|
Integer idIndex = ParameterUtil.findIdParameterIndex(theMethod, getContext());
|
||||||
Integer versionIdIndex = MethodUtil.findVersionIdParameterIndex(theMethod);
|
Integer versionIdIndex = ParameterUtil.findVersionIdParameterIndex(theMethod);
|
||||||
|
|
||||||
Class<?>[] parameterTypes = theMethod.getParameterTypes();
|
Class<?>[] parameterTypes = theMethod.getParameterTypes();
|
||||||
|
|
||||||
|
@ -147,60 +137,10 @@ public class ReadMethodBinding extends BaseResourceReturningMethodBinding implem
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
public HttpGetClientInvocation invokeClient(Object[] theArgs) {
|
|
||||||
HttpGetClientInvocation retVal;
|
|
||||||
IIdType id = ((IIdType) theArgs[myIdIndex]);
|
|
||||||
if (myVersionIdIndex == null) {
|
|
||||||
String resourceName = getResourceName();
|
|
||||||
if (id.hasVersionIdPart()) {
|
|
||||||
retVal = createVReadInvocation(getContext(), new IdDt(resourceName, id.getIdPart(), id.getVersionIdPart()), resourceName);
|
|
||||||
} else {
|
|
||||||
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++) {
|
|
||||||
IParameter nextParam = getParameters().get(idx);
|
|
||||||
nextParam.translateClientArgumentIntoQueryArgument(getContext(), theArgs[idx], null, null);
|
|
||||||
}
|
|
||||||
|
|
||||||
return retVal;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public Object invokeClient(String theResponseMimeType, InputStream theResponseReader, int theResponseStatusCode, Map<String, List<String>> theHeaders) throws IOException, BaseServerResponseException {
|
|
||||||
byte[] contents = IOUtils.toByteArray(theResponseReader);
|
|
||||||
|
|
||||||
IBaseBinary resource = (IBaseBinary) getContext().getResourceDefinition("Binary").newInstance();
|
|
||||||
resource.setContentType(theResponseMimeType);
|
|
||||||
resource.setContent(contents);
|
|
||||||
|
|
||||||
switch (getMethodReturnType()) {
|
|
||||||
case BUNDLE:
|
|
||||||
return Bundle.withSingleResource((IResource) resource);
|
|
||||||
case LIST_OF_RESOURCES:
|
|
||||||
return Collections.singletonList(resource);
|
|
||||||
case RESOURCE:
|
|
||||||
return resource;
|
|
||||||
case BUNDLE_PROVIDER:
|
|
||||||
return new SimpleBundleProvider(resource);
|
|
||||||
case BUNDLE_RESOURCE:
|
|
||||||
case METHOD_OUTCOME:
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
throw new IllegalStateException("" + getMethodReturnType()); // should not happen
|
|
||||||
}
|
|
||||||
|
|
||||||
@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] = MethodUtil.convertIdToType(theRequest.getId(), myIdParameterType);
|
theMethodParams[myIdIndex] = ParameterUtil.convertIdToType(theRequest.getId(), myIdParameterType);
|
||||||
if (myVersionIdIndex != null) {
|
if (myVersionIdIndex != null) {
|
||||||
theMethodParams[myVersionIdIndex] = new IdDt(theRequest.getId().getVersionIdPart());
|
theMethodParams[myVersionIdIndex] = new IdDt(theRequest.getId().getVersionIdPart());
|
||||||
}
|
}
|
||||||
|
@ -217,7 +157,7 @@ public class ReadMethodBinding extends BaseResourceReturningMethodBinding implem
|
||||||
if (theRequest.getServer().getETagSupport() == ETagSupportEnum.ENABLED) {
|
if (theRequest.getServer().getETagSupport() == ETagSupportEnum.ENABLED) {
|
||||||
String ifNoneMatch = theRequest.getHeader(Constants.HEADER_IF_NONE_MATCH_LC);
|
String ifNoneMatch = theRequest.getHeader(Constants.HEADER_IF_NONE_MATCH_LC);
|
||||||
if (StringUtils.isNotBlank(ifNoneMatch)) {
|
if (StringUtils.isNotBlank(ifNoneMatch)) {
|
||||||
ifNoneMatch = MethodUtil.parseETagValue(ifNoneMatch);
|
ifNoneMatch = ParameterUtil.parseETagValue(ifNoneMatch);
|
||||||
if (responseResource.getIdElement() != null && responseResource.getIdElement().hasVersionIdPart()) {
|
if (responseResource.getIdElement() != null && responseResource.getIdElement().hasVersionIdPart()) {
|
||||||
if (responseResource.getIdElement().getVersionIdPart().equals(ifNoneMatch)) {
|
if (responseResource.getIdElement().getVersionIdPart().equals(ifNoneMatch)) {
|
||||||
ourLog.debug("Returning HTTP 301 because request specified {}={}", Constants.HEADER_IF_NONE_MATCH, ifNoneMatch);
|
ourLog.debug("Returning HTTP 301 because request specified {}={}", Constants.HEADER_IF_NONE_MATCH, ifNoneMatch);
|
||||||
|
@ -253,31 +193,15 @@ public class ReadMethodBinding extends BaseResourceReturningMethodBinding implem
|
||||||
return retVal;
|
return retVal;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
// @Override
|
||||||
public boolean isBinary() {
|
// public boolean isBinary() {
|
||||||
return "Binary".equals(getResourceName());
|
// return "Binary".equals(getResourceName());
|
||||||
}
|
// }
|
||||||
|
|
||||||
public boolean isVread() {
|
public boolean isVread() {
|
||||||
return mySupportsVersion || myVersionIdIndex != null;
|
return mySupportsVersion || myVersionIdIndex != null;
|
||||||
}
|
}
|
||||||
|
|
||||||
public static HttpGetClientInvocation createAbsoluteReadInvocation(FhirContext theContext, IIdType theId) {
|
|
||||||
return new HttpGetClientInvocation(theContext, theId.toVersionless().getValue());
|
|
||||||
}
|
|
||||||
|
|
||||||
public static HttpGetClientInvocation createAbsoluteVReadInvocation(FhirContext theContext, IIdType theId) {
|
|
||||||
return new HttpGetClientInvocation(theContext, theId.getValue());
|
|
||||||
}
|
|
||||||
|
|
||||||
public static HttpGetClientInvocation createReadInvocation(FhirContext theContext, IIdType theId, String theResourceName) {
|
|
||||||
return new HttpGetClientInvocation(theContext, new IdDt(theResourceName, theId.getIdPart()).getValue());
|
|
||||||
}
|
|
||||||
|
|
||||||
public static HttpGetClientInvocation createVReadInvocation(FhirContext theContext, IIdType theId, String theResourceName) {
|
|
||||||
return new HttpGetClientInvocation(theContext, new IdDt(theResourceName, theId.getIdPart(), theId.getVersionIdPart()).getValue());
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected BundleTypeEnum getResponseBundleType() {
|
protected BundleTypeEnum getResponseBundleType() {
|
||||||
return null;
|
return null;
|
||||||
|
|
|
@ -22,27 +22,14 @@ package ca.uhn.fhir.rest.server.method;
|
||||||
|
|
||||||
import java.lang.reflect.Method;
|
import java.lang.reflect.Method;
|
||||||
import java.util.Collection;
|
import java.util.Collection;
|
||||||
import java.util.List;
|
|
||||||
import java.util.Map;
|
|
||||||
|
|
||||||
import org.hl7.fhir.instance.model.api.IBaseResource;
|
|
||||||
|
|
||||||
import ca.uhn.fhir.context.FhirContext;
|
|
||||||
import ca.uhn.fhir.rest.api.server.RequestDetails;
|
import ca.uhn.fhir.rest.api.server.RequestDetails;
|
||||||
import ca.uhn.fhir.rest.param.IParameter;
|
|
||||||
import ca.uhn.fhir.rest.server.exceptions.InternalErrorException;
|
import ca.uhn.fhir.rest.server.exceptions.InternalErrorException;
|
||||||
import ca.uhn.fhir.rest.server.exceptions.InvalidRequestException;
|
import ca.uhn.fhir.rest.server.exceptions.InvalidRequestException;
|
||||||
|
|
||||||
public class RequestDetailsParameter implements IParameter {
|
public class RequestDetailsParameter implements IParameter {
|
||||||
private static final org.slf4j.Logger ourLog = org.slf4j.LoggerFactory.getLogger(RequestDetailsParameter.class);
|
private static final org.slf4j.Logger ourLog = org.slf4j.LoggerFactory.getLogger(RequestDetailsParameter.class);
|
||||||
|
|
||||||
@Override
|
|
||||||
public void translateClientArgumentIntoQueryArgument(FhirContext theContext, Object theSourceClientArgument, Map<String, List<String>> theTargetQueryArguments, IBaseResource theTargetResource) throws InternalErrorException {
|
|
||||||
/*
|
|
||||||
* Does nothing, since we just ignore HttpServletRequest arguments
|
|
||||||
*/
|
|
||||||
ourLog.trace("Ignoring RequestDetailsParameter argument: {}", theSourceClientArgument);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Object translateQueryParametersIntoServerArgument(RequestDetails theRequest, BaseMethodBinding<?> theMethodBinding) throws InternalErrorException, InvalidRequestException {
|
public Object translateQueryParametersIntoServerArgument(RequestDetails theRequest, BaseMethodBinding<?> theMethodBinding) throws InternalErrorException, InvalidRequestException {
|
||||||
|
|
|
@ -10,7 +10,7 @@ package ca.uhn.fhir.rest.server.method;
|
||||||
* you may not use this file except in compliance with the License.
|
* you may not use this file except in compliance with the License.
|
||||||
* You may obtain a copy of the License at
|
* You may obtain a copy of the License at
|
||||||
*
|
*
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
*
|
*
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
@ -22,26 +22,12 @@ package ca.uhn.fhir.rest.server.method;
|
||||||
|
|
||||||
import java.lang.reflect.Method;
|
import java.lang.reflect.Method;
|
||||||
import java.util.Collection;
|
import java.util.Collection;
|
||||||
import java.util.List;
|
|
||||||
import java.util.Map;
|
|
||||||
|
|
||||||
import org.hl7.fhir.instance.model.api.IBaseResource;
|
|
||||||
|
|
||||||
import ca.uhn.fhir.context.FhirContext;
|
|
||||||
import ca.uhn.fhir.rest.api.server.RequestDetails;
|
import ca.uhn.fhir.rest.api.server.RequestDetails;
|
||||||
import ca.uhn.fhir.rest.param.IParameter;
|
|
||||||
import ca.uhn.fhir.rest.server.exceptions.InternalErrorException;
|
import ca.uhn.fhir.rest.server.exceptions.InternalErrorException;
|
||||||
import ca.uhn.fhir.rest.server.exceptions.InvalidRequestException;
|
import ca.uhn.fhir.rest.server.exceptions.InvalidRequestException;
|
||||||
import ca.uhn.fhir.util.CoverageIgnore;
|
|
||||||
|
|
||||||
class RequestOperationCallbackParameter implements IParameter {
|
class RequestOperationCallbackParameter implements IParameter {
|
||||||
// private static final org.slf4j.Logger ourLog = org.slf4j.LoggerFactory.getLogger(ServletRequestParameter.class);
|
|
||||||
|
|
||||||
@CoverageIgnore
|
|
||||||
@Override
|
|
||||||
public void translateClientArgumentIntoQueryArgument(FhirContext theContext, Object theSourceClientArgument, Map<String, List<String>> theTargetQueryArguments, IBaseResource theTargetResource) throws InternalErrorException {
|
|
||||||
// nothing
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Object translateQueryParametersIntoServerArgument(RequestDetails theRequest, BaseMethodBinding<?> theMethodBinding) throws InternalErrorException, InvalidRequestException {
|
public Object translateQueryParametersIntoServerArgument(RequestDetails theRequest, BaseMethodBinding<?> theMethodBinding) throws InternalErrorException, InvalidRequestException {
|
||||||
|
|
|
@ -21,7 +21,10 @@ package ca.uhn.fhir.rest.server.method;
|
||||||
*/
|
*/
|
||||||
import static org.apache.commons.lang3.StringUtils.isBlank;
|
import static org.apache.commons.lang3.StringUtils.isBlank;
|
||||||
|
|
||||||
import java.io.*;
|
import java.io.ByteArrayInputStream;
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.io.InputStreamReader;
|
||||||
|
import java.io.Reader;
|
||||||
import java.lang.reflect.Method;
|
import java.lang.reflect.Method;
|
||||||
import java.lang.reflect.Modifier;
|
import java.lang.reflect.Modifier;
|
||||||
import java.nio.charset.Charset;
|
import java.nio.charset.Charset;
|
||||||
|
@ -34,11 +37,16 @@ import org.hl7.fhir.instance.model.api.IBaseResource;
|
||||||
|
|
||||||
import ca.uhn.fhir.context.FhirContext;
|
import ca.uhn.fhir.context.FhirContext;
|
||||||
import ca.uhn.fhir.context.FhirVersionEnum;
|
import ca.uhn.fhir.context.FhirVersionEnum;
|
||||||
import ca.uhn.fhir.model.api.*;
|
import ca.uhn.fhir.model.api.IResource;
|
||||||
|
import ca.uhn.fhir.model.api.ResourceMetadataKeyEnum;
|
||||||
|
import ca.uhn.fhir.model.api.TagList;
|
||||||
import ca.uhn.fhir.parser.DataFormatException;
|
import ca.uhn.fhir.parser.DataFormatException;
|
||||||
import ca.uhn.fhir.parser.IParser;
|
import ca.uhn.fhir.parser.IParser;
|
||||||
import ca.uhn.fhir.rest.api.*;
|
import ca.uhn.fhir.rest.api.Constants;
|
||||||
import ca.uhn.fhir.rest.api.server.*;
|
import ca.uhn.fhir.rest.api.EncodingEnum;
|
||||||
|
import ca.uhn.fhir.rest.api.RestOperationTypeEnum;
|
||||||
|
import ca.uhn.fhir.rest.api.server.RequestDetails;
|
||||||
|
import ca.uhn.fhir.rest.param.ParameterUtil;
|
||||||
import ca.uhn.fhir.rest.server.IResourceProvider;
|
import ca.uhn.fhir.rest.server.IResourceProvider;
|
||||||
import ca.uhn.fhir.rest.server.RestfulServerUtils;
|
import ca.uhn.fhir.rest.server.RestfulServerUtils;
|
||||||
import ca.uhn.fhir.rest.server.exceptions.InternalErrorException;
|
import ca.uhn.fhir.rest.server.exceptions.InternalErrorException;
|
||||||
|
@ -49,7 +57,7 @@ public class ResourceParameter implements IParameter {
|
||||||
private Mode myMode;
|
private Mode myMode;
|
||||||
private Class<? extends IBaseResource> myResourceType;
|
private Class<? extends IBaseResource> myResourceType;
|
||||||
|
|
||||||
public ResourceParameter(Class<? extends IResource> theParameterType, Object theProvider, Mode theMode) {
|
public ResourceParameter(Class<? extends IBaseResource> theParameterType, Object theProvider, Mode theMode) {
|
||||||
Validate.notNull(theParameterType, "theParameterType can not be null");
|
Validate.notNull(theParameterType, "theParameterType can not be null");
|
||||||
Validate.notNull(theMode, "theMode can not be null");
|
Validate.notNull(theMode, "theMode can not be null");
|
||||||
|
|
||||||
|
@ -82,7 +90,7 @@ public class ResourceParameter implements IParameter {
|
||||||
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Object translateQueryParametersIntoServerArgument(IRequestDetails theRequest, IServerMethodBinding theMethodBinding) throws InternalErrorException, InvalidRequestException {
|
public Object translateQueryParametersIntoServerArgument(RequestDetails theRequest, BaseMethodBinding<?> theMethodBinding) throws InternalErrorException, InvalidRequestException {
|
||||||
switch (myMode) {
|
switch (myMode) {
|
||||||
case BODY:
|
case BODY:
|
||||||
try {
|
try {
|
||||||
|
@ -178,7 +186,7 @@ public class ResourceParameter implements IParameter {
|
||||||
if (theRequest.getServer().getFhirContext().getVersion().getVersion().equals(FhirVersionEnum.DSTU1)) {
|
if (theRequest.getServer().getFhirContext().getVersion().getVersion().equals(FhirVersionEnum.DSTU1)) {
|
||||||
TagList tagList = new TagList();
|
TagList tagList = new TagList();
|
||||||
for (String nextTagComplete : theRequest.getHeaders(Constants.HEADER_CATEGORY)) {
|
for (String nextTagComplete : theRequest.getHeaders(Constants.HEADER_CATEGORY)) {
|
||||||
MethodUtil.parseTagValue(tagList, nextTagComplete);
|
ParameterUtil.parseTagValue(tagList, nextTagComplete);
|
||||||
}
|
}
|
||||||
if (tagList.isEmpty() == false) {
|
if (tagList.isEmpty() == false) {
|
||||||
((IResource) retVal).getResourceMetadata().put(ResourceMetadataKeyEnum.TAG_LIST, tagList);
|
((IResource) retVal).getResourceMetadata().put(ResourceMetadataKeyEnum.TAG_LIST, tagList);
|
||||||
|
|
|
@ -24,12 +24,8 @@ 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.ArrayList;
|
||||||
import java.util.Collections;
|
|
||||||
import java.util.HashSet;
|
import java.util.HashSet;
|
||||||
import java.util.LinkedHashMap;
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Map;
|
|
||||||
import java.util.Map.Entry;
|
|
||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
|
|
||||||
import org.apache.commons.lang3.StringUtils;
|
import org.apache.commons.lang3.StringUtils;
|
||||||
|
@ -38,14 +34,16 @@ import org.hl7.fhir.instance.model.api.IBaseResource;
|
||||||
import ca.uhn.fhir.context.ConfigurationException;
|
import ca.uhn.fhir.context.ConfigurationException;
|
||||||
import ca.uhn.fhir.context.FhirContext;
|
import ca.uhn.fhir.context.FhirContext;
|
||||||
import ca.uhn.fhir.model.api.annotation.Description;
|
import ca.uhn.fhir.model.api.annotation.Description;
|
||||||
import ca.uhn.fhir.model.primitive.IdDt;
|
|
||||||
import ca.uhn.fhir.model.valueset.BundleTypeEnum;
|
import ca.uhn.fhir.model.valueset.BundleTypeEnum;
|
||||||
import ca.uhn.fhir.rest.annotation.Search;
|
import ca.uhn.fhir.rest.annotation.Search;
|
||||||
import ca.uhn.fhir.rest.api.*;
|
import ca.uhn.fhir.rest.api.Constants;
|
||||||
import ca.uhn.fhir.rest.api.server.*;
|
import ca.uhn.fhir.rest.api.RequestTypeEnum;
|
||||||
import ca.uhn.fhir.rest.client.impl.BaseHttpClientInvocation;
|
import ca.uhn.fhir.rest.api.RestOperationTypeEnum;
|
||||||
import ca.uhn.fhir.rest.param.BaseQueryParameter;
|
import ca.uhn.fhir.rest.api.server.IBundleProvider;
|
||||||
import ca.uhn.fhir.rest.param.IParameter;
|
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.QualifierDetails;
|
||||||
import ca.uhn.fhir.rest.server.exceptions.InternalErrorException;
|
import ca.uhn.fhir.rest.server.exceptions.InternalErrorException;
|
||||||
import ca.uhn.fhir.rest.server.exceptions.InvalidRequestException;
|
import ca.uhn.fhir.rest.server.exceptions.InvalidRequestException;
|
||||||
|
|
||||||
|
@ -63,7 +61,7 @@ public class SearchMethodBinding extends BaseResourceReturningMethodBinding {
|
||||||
Search search = theMethod.getAnnotation(Search.class);
|
Search search = theMethod.getAnnotation(Search.class);
|
||||||
this.myQueryName = StringUtils.defaultIfBlank(search.queryName(), null);
|
this.myQueryName = StringUtils.defaultIfBlank(search.queryName(), null);
|
||||||
this.myCompartmentName = StringUtils.defaultIfBlank(search.compartmentName(), null);
|
this.myCompartmentName = StringUtils.defaultIfBlank(search.compartmentName(), null);
|
||||||
this.myIdParamIndex = MethodUtil.findIdParameterIndex(theMethod, getContext());
|
this.myIdParamIndex = ParameterUtil.findIdParameterIndex(theMethod, getContext());
|
||||||
this.myAllowUnknownParams = search.allowUnknownParams();
|
this.myAllowUnknownParams = search.allowUnknownParams();
|
||||||
|
|
||||||
Description desc = theMethod.getAnnotation(Description.class);
|
Description desc = theMethod.getAnnotation(Description.class);
|
||||||
|
@ -255,30 +253,6 @@ public class SearchMethodBinding extends BaseResourceReturningMethodBinding {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
public BaseHttpClientInvocation invokeClient(Object[] theArgs) throws InternalErrorException {
|
|
||||||
assert (myQueryName == null || ((theArgs != null ? theArgs.length : 0) == getParameters().size())) : "Wrong number of arguments: " + (theArgs != null ? theArgs.length : "null");
|
|
||||||
|
|
||||||
Map<String, List<String>> queryStringArgs = new LinkedHashMap<String, List<String>>();
|
|
||||||
|
|
||||||
if (myQueryName != null) {
|
|
||||||
queryStringArgs.put(Constants.PARAM_QUERY, Collections.singletonList(myQueryName));
|
|
||||||
}
|
|
||||||
|
|
||||||
IdDt id = (IdDt) (myIdParamIndex != null ? theArgs[myIdParamIndex] : null);
|
|
||||||
|
|
||||||
String resourceName = getResourceName();
|
|
||||||
if (theArgs != null) {
|
|
||||||
for (int idx = 0; idx < theArgs.length; idx++) {
|
|
||||||
IParameter nextParam = getParameters().get(idx);
|
|
||||||
nextParam.translateClientArgumentIntoQueryArgument(getContext(), theArgs[idx], queryStringArgs, null);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
BaseHttpClientInvocation retVal = createSearchInvocation(getContext(), resourceName, queryStringArgs, id, myCompartmentName, null);
|
|
||||||
|
|
||||||
return retVal;
|
|
||||||
}
|
|
||||||
|
|
||||||
@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 {
|
||||||
|
@ -316,70 +290,52 @@ public class SearchMethodBinding extends BaseResourceReturningMethodBinding {
|
||||||
public String toString() {
|
public String toString() {
|
||||||
return getMethod().toString();
|
return getMethod().toString();
|
||||||
}
|
}
|
||||||
|
public static QualifierDetails extractQualifiersFromParameterName(String theParamName) {
|
||||||
|
QualifierDetails retVal = new QualifierDetails();
|
||||||
|
if (theParamName == null || theParamName.length() == 0) {
|
||||||
|
return retVal;
|
||||||
|
}
|
||||||
|
|
||||||
public static BaseHttpClientInvocation createSearchInvocation(FhirContext theContext, String theResourceName, Map<String, List<String>> theParameters, IdDt theId, String theCompartmentName,
|
int dotIdx = -1;
|
||||||
SearchStyleEnum theSearchStyle) {
|
int colonIdx = -1;
|
||||||
SearchStyleEnum searchStyle = theSearchStyle;
|
for (int idx = 0; idx < theParamName.length(); idx++) {
|
||||||
if (searchStyle == null) {
|
char nextChar = theParamName.charAt(idx);
|
||||||
int length = 0;
|
if (nextChar == '.' && dotIdx == -1) {
|
||||||
for (Entry<String, List<String>> nextEntry : theParameters.entrySet()) {
|
dotIdx = idx;
|
||||||
length += nextEntry.getKey().length();
|
} else if (nextChar == ':' && colonIdx == -1) {
|
||||||
for (String next : nextEntry.getValue()) {
|
colonIdx = idx;
|
||||||
length += next.length();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (length < 5000) {
|
|
||||||
searchStyle = SearchStyleEnum.GET;
|
|
||||||
} else {
|
|
||||||
searchStyle = SearchStyleEnum.POST;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
BaseHttpClientInvocation invocation;
|
if (dotIdx != -1 && colonIdx != -1) {
|
||||||
|
if (dotIdx < colonIdx) {
|
||||||
boolean compartmentSearch = false;
|
retVal.setDotQualifier(theParamName.substring(dotIdx, colonIdx));
|
||||||
if (theCompartmentName != null) {
|
retVal.setColonQualifier(theParamName.substring(colonIdx));
|
||||||
if (theId == null || !theId.hasIdPart()) {
|
retVal.setParamName(theParamName.substring(0, dotIdx));
|
||||||
String msg = theContext.getLocalizer().getMessage(SearchMethodBinding.class.getName() + ".idNullForCompartmentSearch");
|
retVal.setWholeQualifier(theParamName.substring(dotIdx));
|
||||||
throw new InvalidRequestException(msg);
|
} else {
|
||||||
|
retVal.setColonQualifier(theParamName.substring(colonIdx, dotIdx));
|
||||||
|
retVal.setDotQualifier(theParamName.substring(dotIdx));
|
||||||
|
retVal.setParamName(theParamName.substring(0, colonIdx));
|
||||||
|
retVal.setWholeQualifier(theParamName.substring(colonIdx));
|
||||||
}
|
}
|
||||||
compartmentSearch = true;
|
} else if (dotIdx != -1) {
|
||||||
|
retVal.setDotQualifier(theParamName.substring(dotIdx));
|
||||||
|
retVal.setParamName(theParamName.substring(0, dotIdx));
|
||||||
|
retVal.setWholeQualifier(theParamName.substring(dotIdx));
|
||||||
|
} else if (colonIdx != -1) {
|
||||||
|
retVal.setColonQualifier(theParamName.substring(colonIdx));
|
||||||
|
retVal.setParamName(theParamName.substring(0, colonIdx));
|
||||||
|
retVal.setWholeQualifier(theParamName.substring(colonIdx));
|
||||||
|
} else {
|
||||||
|
retVal.setParamName(theParamName);
|
||||||
|
retVal.setColonQualifier(null);
|
||||||
|
retVal.setDotQualifier(null);
|
||||||
|
retVal.setWholeQualifier(null);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
return retVal;
|
||||||
* Are we doing a get (GET [base]/Patient?name=foo) or a get with search (GET [base]/Patient/_search?name=foo) or a post (POST [base]/Patient with parameters in the POST body)
|
|
||||||
*/
|
|
||||||
switch (searchStyle) {
|
|
||||||
case GET:
|
|
||||||
default:
|
|
||||||
if (compartmentSearch) {
|
|
||||||
invocation = new HttpGetClientInvocation(theContext, theParameters, theResourceName, theId.getIdPart(), theCompartmentName);
|
|
||||||
} else {
|
|
||||||
invocation = new HttpGetClientInvocation(theContext, theParameters, theResourceName);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case GET_WITH_SEARCH:
|
|
||||||
if (compartmentSearch) {
|
|
||||||
invocation = new HttpGetClientInvocation(theContext, theParameters, theResourceName, theId.getIdPart(), theCompartmentName, Constants.PARAM_SEARCH);
|
|
||||||
} else {
|
|
||||||
invocation = new HttpGetClientInvocation(theContext, theParameters, theResourceName, Constants.PARAM_SEARCH);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case POST:
|
|
||||||
if (compartmentSearch) {
|
|
||||||
invocation = new HttpPostClientInvocation(theContext, theParameters, theResourceName, theId.getIdPart(), theCompartmentName, Constants.PARAM_SEARCH);
|
|
||||||
} else {
|
|
||||||
invocation = new HttpPostClientInvocation(theContext, theParameters, theResourceName, Constants.PARAM_SEARCH);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return invocation;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
public static BaseHttpClientInvocation createSearchInvocation(FhirContext theContext, String theSearchUrl, Map<String, List<String>> theParams) {
|
|
||||||
return new HttpGetClientInvocation(theContext, theParams, theSearchUrl);
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -22,27 +22,12 @@ package ca.uhn.fhir.rest.server.method;
|
||||||
|
|
||||||
import java.lang.reflect.Method;
|
import java.lang.reflect.Method;
|
||||||
import java.util.Collection;
|
import java.util.Collection;
|
||||||
import java.util.List;
|
|
||||||
import java.util.Map;
|
|
||||||
|
|
||||||
import org.hl7.fhir.instance.model.api.IBaseResource;
|
|
||||||
|
|
||||||
import ca.uhn.fhir.context.FhirContext;
|
|
||||||
import ca.uhn.fhir.rest.api.server.RequestDetails;
|
import ca.uhn.fhir.rest.api.server.RequestDetails;
|
||||||
import ca.uhn.fhir.rest.param.IParameter;
|
|
||||||
import ca.uhn.fhir.rest.server.exceptions.InternalErrorException;
|
import ca.uhn.fhir.rest.server.exceptions.InternalErrorException;
|
||||||
import ca.uhn.fhir.rest.server.exceptions.InvalidRequestException;
|
import ca.uhn.fhir.rest.server.exceptions.InvalidRequestException;
|
||||||
|
|
||||||
class ServerBaseParamBinder implements IParameter {
|
class ServerBaseParamBinder implements IParameter {
|
||||||
private static final org.slf4j.Logger ourLog = org.slf4j.LoggerFactory.getLogger(ServerBaseParamBinder.class);
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void translateClientArgumentIntoQueryArgument(FhirContext theContext, Object theSourceClientArgument, Map<String, List<String>> theTargetQueryArguments, IBaseResource theTargetResource) throws InternalErrorException {
|
|
||||||
/*
|
|
||||||
* Does nothing, since we just ignore serverbase arguments
|
|
||||||
*/
|
|
||||||
ourLog.trace("Ignoring server base argument: {}", theSourceClientArgument);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Object translateQueryParametersIntoServerArgument(RequestDetails theRequest, BaseMethodBinding<?> theMethodBinding) throws InternalErrorException, InvalidRequestException {
|
public Object translateQueryParametersIntoServerArgument(RequestDetails theRequest, BaseMethodBinding<?> theMethodBinding) throws InternalErrorException, InvalidRequestException {
|
||||||
|
|
|
@ -22,14 +22,8 @@ package ca.uhn.fhir.rest.server.method;
|
||||||
|
|
||||||
import java.lang.reflect.Method;
|
import java.lang.reflect.Method;
|
||||||
import java.util.Collection;
|
import java.util.Collection;
|
||||||
import java.util.List;
|
|
||||||
import java.util.Map;
|
|
||||||
|
|
||||||
import org.hl7.fhir.instance.model.api.IBaseResource;
|
|
||||||
|
|
||||||
import ca.uhn.fhir.context.FhirContext;
|
|
||||||
import ca.uhn.fhir.rest.api.server.RequestDetails;
|
import ca.uhn.fhir.rest.api.server.RequestDetails;
|
||||||
import ca.uhn.fhir.rest.param.IParameter;
|
|
||||||
import ca.uhn.fhir.rest.server.exceptions.InternalErrorException;
|
import ca.uhn.fhir.rest.server.exceptions.InternalErrorException;
|
||||||
import ca.uhn.fhir.rest.server.exceptions.InvalidRequestException;
|
import ca.uhn.fhir.rest.server.exceptions.InvalidRequestException;
|
||||||
import ca.uhn.fhir.rest.server.servlet.ServletRequestDetails;
|
import ca.uhn.fhir.rest.server.servlet.ServletRequestDetails;
|
||||||
|
@ -41,14 +35,6 @@ class ServletRequestParameter implements IParameter {
|
||||||
super();
|
super();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
public void translateClientArgumentIntoQueryArgument(FhirContext theContext, Object theSourceClientArgument, Map<String, List<String>> theTargetQueryArguments, IBaseResource theTargetResource) throws InternalErrorException {
|
|
||||||
/*
|
|
||||||
* Does nothing, since we just ignore HttpServletRequest arguments
|
|
||||||
*/
|
|
||||||
ourLog.trace("Ignoring HttpServletRequest argument: {}", theSourceClientArgument);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Object translateQueryParametersIntoServerArgument(RequestDetails theRequest, BaseMethodBinding<?> theMethodBinding) throws InternalErrorException, InvalidRequestException {
|
public Object translateQueryParametersIntoServerArgument(RequestDetails theRequest, BaseMethodBinding<?> theMethodBinding) throws InternalErrorException, InvalidRequestException {
|
||||||
return ((ServletRequestDetails) theRequest).getServletRequest();
|
return ((ServletRequestDetails) theRequest).getServletRequest();
|
||||||
|
|
|
@ -10,7 +10,7 @@ package ca.uhn.fhir.rest.server.method;
|
||||||
* you may not use this file except in compliance with the License.
|
* you may not use this file except in compliance with the License.
|
||||||
* You may obtain a copy of the License at
|
* You may obtain a copy of the License at
|
||||||
*
|
*
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
*
|
*
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
@ -22,14 +22,8 @@ package ca.uhn.fhir.rest.server.method;
|
||||||
|
|
||||||
import java.lang.reflect.Method;
|
import java.lang.reflect.Method;
|
||||||
import java.util.Collection;
|
import java.util.Collection;
|
||||||
import java.util.List;
|
|
||||||
import java.util.Map;
|
|
||||||
|
|
||||||
import org.hl7.fhir.instance.model.api.IBaseResource;
|
|
||||||
|
|
||||||
import ca.uhn.fhir.context.FhirContext;
|
|
||||||
import ca.uhn.fhir.rest.api.server.RequestDetails;
|
import ca.uhn.fhir.rest.api.server.RequestDetails;
|
||||||
import ca.uhn.fhir.rest.param.IParameter;
|
|
||||||
import ca.uhn.fhir.rest.server.exceptions.InternalErrorException;
|
import ca.uhn.fhir.rest.server.exceptions.InternalErrorException;
|
||||||
import ca.uhn.fhir.rest.server.exceptions.InvalidRequestException;
|
import ca.uhn.fhir.rest.server.exceptions.InvalidRequestException;
|
||||||
import ca.uhn.fhir.rest.server.servlet.ServletRequestDetails;
|
import ca.uhn.fhir.rest.server.servlet.ServletRequestDetails;
|
||||||
|
@ -37,20 +31,11 @@ import ca.uhn.fhir.rest.server.servlet.ServletRequestDetails;
|
||||||
class ServletResponseParameter implements IParameter {
|
class ServletResponseParameter implements IParameter {
|
||||||
private static final org.slf4j.Logger ourLog = org.slf4j.LoggerFactory.getLogger(ServletResponseParameter.class);
|
private static final org.slf4j.Logger ourLog = org.slf4j.LoggerFactory.getLogger(ServletResponseParameter.class);
|
||||||
|
|
||||||
@Override
|
|
||||||
public void translateClientArgumentIntoQueryArgument(FhirContext theContext, Object theSourceClientArgument, Map<String, List<String>> theTargetQueryArguments, IBaseResource theTargetResource) throws InternalErrorException {
|
|
||||||
/*
|
|
||||||
* Does nothing, since we just ignore HttpServletResponse arguments
|
|
||||||
*/
|
|
||||||
ourLog.trace("Ignoring HttpServletResponse argument: {}", theSourceClientArgument);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Object translateQueryParametersIntoServerArgument(RequestDetails theRequest, BaseMethodBinding<?> theMethodBinding) throws InternalErrorException, InvalidRequestException {
|
public Object translateQueryParametersIntoServerArgument(RequestDetails theRequest, BaseMethodBinding<?> theMethodBinding) throws InternalErrorException, InvalidRequestException {
|
||||||
return ((ServletRequestDetails) theRequest).getServletResponse();
|
return ((ServletRequestDetails) theRequest).getServletResponse();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void initializeTypes(Method theMethod, Class<? extends Collection<?>> theOuterCollectionType, Class<? extends Collection<?>> theInnerCollectionType, Class<?> theParameterType) {
|
public void initializeTypes(Method theMethod, Class<? extends Collection<?>> theOuterCollectionType, Class<? extends Collection<?>> theInnerCollectionType, Class<?> theParameterType) {
|
||||||
// ignore
|
// ignore
|
||||||
|
|
|
@ -10,7 +10,7 @@ package ca.uhn.fhir.rest.server.method;
|
||||||
* you may not use this file except in compliance with the License.
|
* you may not use this file except in compliance with the License.
|
||||||
* You may obtain a copy of the License at
|
* You may obtain a copy of the License at
|
||||||
*
|
*
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
*
|
*
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
@ -22,21 +22,13 @@ 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.Collection;
|
import java.util.Collection;
|
||||||
import java.util.List;
|
|
||||||
import java.util.Map;
|
|
||||||
import java.util.StringTokenizer;
|
import java.util.StringTokenizer;
|
||||||
|
|
||||||
import org.hl7.fhir.instance.model.api.IBaseResource;
|
import ca.uhn.fhir.context.*;
|
||||||
|
|
||||||
import ca.uhn.fhir.context.ConfigurationException;
|
|
||||||
import ca.uhn.fhir.context.FhirContext;
|
|
||||||
import ca.uhn.fhir.context.FhirVersionEnum;
|
|
||||||
import ca.uhn.fhir.rest.annotation.Sort;
|
import ca.uhn.fhir.rest.annotation.Sort;
|
||||||
import ca.uhn.fhir.rest.api.*;
|
import ca.uhn.fhir.rest.api.*;
|
||||||
import ca.uhn.fhir.rest.api.server.RequestDetails;
|
import ca.uhn.fhir.rest.api.server.RequestDetails;
|
||||||
import ca.uhn.fhir.rest.param.IParameter;
|
|
||||||
import ca.uhn.fhir.rest.param.ParameterUtil;
|
import ca.uhn.fhir.rest.param.ParameterUtil;
|
||||||
import ca.uhn.fhir.rest.server.exceptions.InternalErrorException;
|
import ca.uhn.fhir.rest.server.exceptions.InternalErrorException;
|
||||||
import ca.uhn.fhir.rest.server.exceptions.InvalidRequestException;
|
import ca.uhn.fhir.rest.server.exceptions.InvalidRequestException;
|
||||||
|
@ -52,51 +44,16 @@ public class SortParameter implements IParameter {
|
||||||
@Override
|
@Override
|
||||||
public void initializeTypes(Method theMethod, Class<? extends Collection<?>> theOuterCollectionType, Class<? extends Collection<?>> theInnerCollectionType, Class<?> theParameterType) {
|
public void initializeTypes(Method theMethod, Class<? extends Collection<?>> theOuterCollectionType, Class<? extends Collection<?>> theInnerCollectionType, Class<?> theParameterType) {
|
||||||
if (theOuterCollectionType != null || theInnerCollectionType != null) {
|
if (theOuterCollectionType != null || theInnerCollectionType != null) {
|
||||||
throw new ConfigurationException("Method '" + theMethod.getName() + "' in type '" + theMethod.getDeclaringClass().getCanonicalName() + "' is annotated with @" + Sort.class.getName() + " but can not be of collection type");
|
throw new ConfigurationException("Method '" + theMethod.getName() + "' in type '" + theMethod.getDeclaringClass().getCanonicalName() + "' is annotated with @" + Sort.class.getName()
|
||||||
|
+ " but can not be of collection type");
|
||||||
}
|
}
|
||||||
if (!theParameterType.equals(SortSpec.class)) {
|
if (!theParameterType.equals(SortSpec.class)) {
|
||||||
throw new ConfigurationException("Method '" + theMethod.getName() + "' in type '" + theMethod.getDeclaringClass().getCanonicalName() + "' is annotated with @" + Sort.class.getName() + " but is an invalid type, must be: " + SortSpec.class.getCanonicalName());
|
throw new ConfigurationException("Method '" + theMethod.getName() + "' in type '" + theMethod.getDeclaringClass().getCanonicalName() + "' is annotated with @" + Sort.class.getName()
|
||||||
|
+ " but is an invalid type, must be: " + SortSpec.class.getCanonicalName());
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
public void translateClientArgumentIntoQueryArgument(FhirContext theContext, Object theSourceClientArgument, Map<String, List<String>> theTargetQueryArguments, IBaseResource theTargetResource) throws InternalErrorException {
|
|
||||||
SortSpec ss = (SortSpec) theSourceClientArgument;
|
|
||||||
|
|
||||||
if (myContext.getVersion().getVersion().isNewerThan(FhirVersionEnum.DSTU2)) {
|
|
||||||
String string = createSortStringDstu3(ss);
|
|
||||||
if (string.length() > 0) {
|
|
||||||
if (!theTargetQueryArguments.containsKey(Constants.PARAM_SORT)) {
|
|
||||||
theTargetQueryArguments.put(Constants.PARAM_SORT, new ArrayList<String>());
|
|
||||||
}
|
|
||||||
theTargetQueryArguments.get(Constants.PARAM_SORT).add(string);
|
|
||||||
}
|
|
||||||
|
|
||||||
} else {
|
|
||||||
|
|
||||||
while (ss != null) {
|
|
||||||
String name;
|
|
||||||
if (ss.getOrder() == null) {
|
|
||||||
name = Constants.PARAM_SORT;
|
|
||||||
} else if (ss.getOrder() == SortOrderEnum.ASC) {
|
|
||||||
name = Constants.PARAM_SORT_ASC;
|
|
||||||
} else {
|
|
||||||
name = Constants.PARAM_SORT_DESC;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (ss.getParamName() != null) {
|
|
||||||
if (!theTargetQueryArguments.containsKey(name)) {
|
|
||||||
theTargetQueryArguments.put(name, new ArrayList<String>());
|
|
||||||
}
|
|
||||||
|
|
||||||
theTargetQueryArguments.get(name).add(ss.getParamName());
|
|
||||||
}
|
|
||||||
ss = ss.getChain();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Object translateQueryParametersIntoServerArgument(RequestDetails theRequest, BaseMethodBinding<?> theMethodBinding) throws InternalErrorException, InvalidRequestException {
|
public Object translateQueryParametersIntoServerArgument(RequestDetails theRequest, BaseMethodBinding<?> theMethodBinding) throws InternalErrorException, InvalidRequestException {
|
||||||
if (!theRequest.getParameters().containsKey(Constants.PARAM_SORT)) {
|
if (!theRequest.getParameters().containsKey(Constants.PARAM_SORT)) {
|
||||||
|
|
|
@ -22,22 +22,13 @@ package ca.uhn.fhir.rest.server.method;
|
||||||
import static org.apache.commons.lang3.StringUtils.isBlank;
|
import static org.apache.commons.lang3.StringUtils.isBlank;
|
||||||
|
|
||||||
import java.lang.reflect.Method;
|
import java.lang.reflect.Method;
|
||||||
import java.util.ArrayList;
|
import java.util.*;
|
||||||
import java.util.Collection;
|
|
||||||
import java.util.Collections;
|
|
||||||
import java.util.HashSet;
|
|
||||||
import java.util.List;
|
|
||||||
import java.util.Map;
|
|
||||||
import java.util.Set;
|
|
||||||
|
|
||||||
import org.hl7.fhir.instance.model.api.IBaseResource;
|
|
||||||
|
|
||||||
import ca.uhn.fhir.context.ConfigurationException;
|
import ca.uhn.fhir.context.ConfigurationException;
|
||||||
import ca.uhn.fhir.context.FhirContext;
|
import ca.uhn.fhir.rest.api.Constants;
|
||||||
import ca.uhn.fhir.rest.api.*;
|
import ca.uhn.fhir.rest.api.SummaryEnum;
|
||||||
import ca.uhn.fhir.rest.api.server.RequestDetails;
|
import ca.uhn.fhir.rest.api.server.RequestDetails;
|
||||||
import ca.uhn.fhir.rest.param.CollectionBinder;
|
import ca.uhn.fhir.rest.param.CollectionBinder;
|
||||||
import ca.uhn.fhir.rest.param.IParameter;
|
|
||||||
import ca.uhn.fhir.rest.server.exceptions.InternalErrorException;
|
import ca.uhn.fhir.rest.server.exceptions.InternalErrorException;
|
||||||
import ca.uhn.fhir.rest.server.exceptions.InvalidRequestException;
|
import ca.uhn.fhir.rest.server.exceptions.InvalidRequestException;
|
||||||
|
|
||||||
|
@ -46,24 +37,6 @@ public class SummaryEnumParameter implements IParameter {
|
||||||
@SuppressWarnings("rawtypes")
|
@SuppressWarnings("rawtypes")
|
||||||
private Class<? extends Collection> myInnerCollectionType;
|
private Class<? extends Collection> myInnerCollectionType;
|
||||||
|
|
||||||
@SuppressWarnings("unchecked")
|
|
||||||
@Override
|
|
||||||
public void translateClientArgumentIntoQueryArgument(FhirContext theContext, Object theSourceClientArgument, Map<String, List<String>> theTargetQueryArguments, IBaseResource theTargetResource) throws InternalErrorException {
|
|
||||||
if (theSourceClientArgument instanceof Collection) {
|
|
||||||
List<String> values = new ArrayList<String>();
|
|
||||||
for (SummaryEnum next : (Collection<SummaryEnum>) theSourceClientArgument) {
|
|
||||||
if (next != null) {
|
|
||||||
values.add(next.getCode());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
theTargetQueryArguments.put(Constants.PARAM_SUMMARY, values);
|
|
||||||
} else {
|
|
||||||
SummaryEnum ss = (SummaryEnum) theSourceClientArgument;
|
|
||||||
if (ss != null) {
|
|
||||||
theTargetQueryArguments.put(Constants.PARAM_SUMMARY, Collections.singletonList(ss.getCode()));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@SuppressWarnings({ "rawtypes", "unchecked" })
|
@SuppressWarnings({ "rawtypes", "unchecked" })
|
||||||
|
|
|
@ -10,7 +10,7 @@ package ca.uhn.fhir.rest.server.method;
|
||||||
* you may not use this file except in compliance with the License.
|
* you may not use this file except in compliance with the License.
|
||||||
* You may obtain a copy of the License at
|
* You may obtain a copy of the License at
|
||||||
*
|
*
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
*
|
*
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
@ -25,7 +25,6 @@ import java.lang.reflect.Method;
|
||||||
import java.util.IdentityHashMap;
|
import java.util.IdentityHashMap;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
import org.hl7.fhir.instance.model.api.IBaseBundle;
|
|
||||||
import org.hl7.fhir.instance.model.api.IBaseResource;
|
import org.hl7.fhir.instance.model.api.IBaseResource;
|
||||||
|
|
||||||
import ca.uhn.fhir.context.ConfigurationException;
|
import ca.uhn.fhir.context.ConfigurationException;
|
||||||
|
@ -38,10 +37,11 @@ import ca.uhn.fhir.model.primitive.IdDt;
|
||||||
import ca.uhn.fhir.model.valueset.BundleTypeEnum;
|
import ca.uhn.fhir.model.valueset.BundleTypeEnum;
|
||||||
import ca.uhn.fhir.rest.annotation.Transaction;
|
import ca.uhn.fhir.rest.annotation.Transaction;
|
||||||
import ca.uhn.fhir.rest.annotation.TransactionParam;
|
import ca.uhn.fhir.rest.annotation.TransactionParam;
|
||||||
import ca.uhn.fhir.rest.api.*;
|
import ca.uhn.fhir.rest.api.RequestTypeEnum;
|
||||||
import ca.uhn.fhir.rest.api.server.*;
|
import ca.uhn.fhir.rest.api.RestOperationTypeEnum;
|
||||||
import ca.uhn.fhir.rest.client.impl.BaseHttpClientInvocation;
|
import ca.uhn.fhir.rest.api.server.IBundleProvider;
|
||||||
import ca.uhn.fhir.rest.param.*;
|
import ca.uhn.fhir.rest.api.server.IRestfulServer;
|
||||||
|
import ca.uhn.fhir.rest.api.server.RequestDetails;
|
||||||
import ca.uhn.fhir.rest.server.exceptions.InternalErrorException;
|
import ca.uhn.fhir.rest.server.exceptions.InternalErrorException;
|
||||||
import ca.uhn.fhir.rest.server.exceptions.InvalidRequestException;
|
import ca.uhn.fhir.rest.server.exceptions.InvalidRequestException;
|
||||||
import ca.uhn.fhir.rest.server.interceptor.IServerInterceptor.ActionRequestDetails;
|
import ca.uhn.fhir.rest.server.interceptor.IServerInterceptor.ActionRequestDetails;
|
||||||
|
@ -60,7 +60,8 @@ public class TransactionMethodBinding extends BaseResourceReturningMethodBinding
|
||||||
for (IParameter next : getParameters()) {
|
for (IParameter next : getParameters()) {
|
||||||
if (next instanceof TransactionParameter) {
|
if (next instanceof TransactionParameter) {
|
||||||
if (myTransactionParamIndex != -1) {
|
if (myTransactionParamIndex != -1) {
|
||||||
throw new ConfigurationException("Method '" + theMethod.getName() + "' in type " + theMethod.getDeclaringClass().getCanonicalName() + " has multiple parameters annotated with the @" + TransactionParam.class + " annotation, exactly one is required for @" + Transaction.class
|
throw new ConfigurationException("Method '" + theMethod.getName() + "' in type " + theMethod.getDeclaringClass().getCanonicalName() + " has multiple parameters annotated with the @"
|
||||||
|
+ TransactionParam.class + " annotation, exactly one is required for @" + Transaction.class
|
||||||
+ " methods");
|
+ " methods");
|
||||||
}
|
}
|
||||||
myTransactionParamIndex = index;
|
myTransactionParamIndex = index;
|
||||||
|
@ -70,7 +71,8 @@ public class TransactionMethodBinding extends BaseResourceReturningMethodBinding
|
||||||
}
|
}
|
||||||
|
|
||||||
if (myTransactionParamIndex == -1) {
|
if (myTransactionParamIndex == -1) {
|
||||||
throw new ConfigurationException("Method '" + theMethod.getName() + "' in type " + theMethod.getDeclaringClass().getCanonicalName() + " does not have a parameter annotated with the @" + TransactionParam.class + " annotation");
|
throw new ConfigurationException("Method '" + theMethod.getName() + "' in type " + theMethod.getDeclaringClass().getCanonicalName() + " does not have a parameter annotated with the @"
|
||||||
|
+ TransactionParam.class + " annotation");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -103,18 +105,6 @@ public class TransactionMethodBinding extends BaseResourceReturningMethodBinding
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
public BaseHttpClientInvocation invokeClient(Object[] theArgs) throws InternalErrorException {
|
|
||||||
FhirContext context = getContext();
|
|
||||||
if (theArgs[myTransactionParamIndex] instanceof Bundle) {
|
|
||||||
Bundle bundle = (Bundle) theArgs[myTransactionParamIndex];
|
|
||||||
return createTransactionInvocation(bundle, context);
|
|
||||||
}
|
|
||||||
@SuppressWarnings("unchecked")
|
|
||||||
List<IBaseResource> resources = (List<IBaseResource>) theArgs[myTransactionParamIndex];
|
|
||||||
return createTransactionInvocation(resources, context);
|
|
||||||
}
|
|
||||||
|
|
||||||
@SuppressWarnings("unchecked")
|
@SuppressWarnings("unchecked")
|
||||||
@Override
|
@Override
|
||||||
public Object invokeServer(IRestfulServer<?> theServer, RequestDetails theRequest, Object[] theMethodParams) throws InvalidRequestException, InternalErrorException {
|
public Object invokeServer(IRestfulServer<?> theServer, RequestDetails theRequest, Object[] theMethodParams) throws InvalidRequestException, InternalErrorException {
|
||||||
|
@ -166,7 +156,7 @@ public class TransactionMethodBinding extends BaseResourceReturningMethodBinding
|
||||||
|
|
||||||
if (oldId != null && !oldId.isEmpty()) {
|
if (oldId != null && !oldId.isEmpty()) {
|
||||||
if (!oldId.equals(newRes.getIdElement()) && newRes instanceof IResource) {
|
if (!oldId.equals(newRes.getIdElement()) && newRes instanceof IResource) {
|
||||||
((IResource)newRes).getResourceMetadata().put(ResourceMetadataKeyEnum.PREVIOUS_ID, oldId);
|
((IResource) newRes).getResourceMetadata().put(ResourceMetadataKeyEnum.PREVIOUS_ID, oldId);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -174,11 +164,10 @@ public class TransactionMethodBinding extends BaseResourceReturningMethodBinding
|
||||||
return retVal;
|
return retVal;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected void populateActionRequestDetailsForInterceptor(RequestDetails theRequestDetails, ActionRequestDetails theDetails, Object[] theMethodParams) {
|
protected void populateActionRequestDetailsForInterceptor(RequestDetails theRequestDetails, ActionRequestDetails theDetails, Object[] theMethodParams) {
|
||||||
super.populateActionRequestDetailsForInterceptor(theRequestDetails, theDetails, theMethodParams);
|
super.populateActionRequestDetailsForInterceptor(theRequestDetails, theDetails, theMethodParams);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* If the method has no parsed resource parameter, we parse here in order to have something for the interceptor.
|
* If the method has no parsed resource parameter, we parse here in order to have something for the interceptor.
|
||||||
*/
|
*/
|
||||||
|
@ -191,20 +180,4 @@ public class TransactionMethodBinding extends BaseResourceReturningMethodBinding
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public static BaseHttpClientInvocation createTransactionInvocation(Bundle theBundle, FhirContext theContext) {
|
|
||||||
return new HttpPostClientInvocation(theContext, theBundle);
|
|
||||||
}
|
|
||||||
|
|
||||||
public static BaseHttpClientInvocation createTransactionInvocation(IBaseBundle theBundle, FhirContext theContext) {
|
|
||||||
return new HttpPostClientInvocation(theContext, theBundle);
|
|
||||||
}
|
|
||||||
|
|
||||||
public static BaseHttpClientInvocation createTransactionInvocation(List<? extends IBaseResource> theResources, FhirContext theContext) {
|
|
||||||
return new HttpPostClientInvocation(theContext, theResources, BundleTypeEnum.TRANSACTION);
|
|
||||||
}
|
|
||||||
|
|
||||||
public static BaseHttpClientInvocation createTransactionInvocation(String theRawBundle, FhirContext theContext) {
|
|
||||||
return new HttpPostClientInvocation(theContext, theRawBundle, true, "");
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -38,10 +38,8 @@ import ca.uhn.fhir.model.api.BundleEntry;
|
||||||
import ca.uhn.fhir.model.api.IResource;
|
import ca.uhn.fhir.model.api.IResource;
|
||||||
import ca.uhn.fhir.parser.IParser;
|
import ca.uhn.fhir.parser.IParser;
|
||||||
import ca.uhn.fhir.rest.annotation.TransactionParam;
|
import ca.uhn.fhir.rest.annotation.TransactionParam;
|
||||||
import ca.uhn.fhir.rest.method.BaseMethodBinding;
|
import ca.uhn.fhir.rest.api.EncodingEnum;
|
||||||
import ca.uhn.fhir.rest.method.IParameter;
|
import ca.uhn.fhir.rest.api.server.RequestDetails;
|
||||||
import ca.uhn.fhir.rest.method.RequestDetails;
|
|
||||||
import ca.uhn.fhir.rest.server.EncodingEnum;
|
|
||||||
import ca.uhn.fhir.rest.server.RestfulServerUtils;
|
import ca.uhn.fhir.rest.server.RestfulServerUtils;
|
||||||
import ca.uhn.fhir.rest.server.exceptions.InternalErrorException;
|
import ca.uhn.fhir.rest.server.exceptions.InternalErrorException;
|
||||||
import ca.uhn.fhir.rest.server.exceptions.InvalidRequestException;
|
import ca.uhn.fhir.rest.server.exceptions.InvalidRequestException;
|
||||||
|
@ -92,11 +90,6 @@ public class TransactionParameter implements IParameter {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
public void translateClientArgumentIntoQueryArgument(FhirContext theContext, Object theSourceClientArgument, Map<String, List<String>> theTargetQueryArguments, IBaseResource theTargetResource) throws InternalErrorException {
|
|
||||||
// nothing
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Object translateQueryParametersIntoServerArgument(RequestDetails theRequest, BaseMethodBinding<?> theMethodBinding) throws InternalErrorException, InvalidRequestException {
|
public Object translateQueryParametersIntoServerArgument(RequestDetails theRequest, BaseMethodBinding<?> theMethodBinding) throws InternalErrorException, InvalidRequestException {
|
||||||
|
|
|
@ -30,23 +30,19 @@ import org.hl7.fhir.instance.model.api.IBaseResource;
|
||||||
import org.hl7.fhir.instance.model.api.IIdType;
|
import org.hl7.fhir.instance.model.api.IIdType;
|
||||||
|
|
||||||
import ca.uhn.fhir.context.FhirContext;
|
import ca.uhn.fhir.context.FhirContext;
|
||||||
import ca.uhn.fhir.model.api.IResource;
|
|
||||||
import ca.uhn.fhir.model.primitive.IdDt;
|
|
||||||
import ca.uhn.fhir.rest.annotation.Update;
|
import ca.uhn.fhir.rest.annotation.Update;
|
||||||
import ca.uhn.fhir.rest.api.*;
|
import ca.uhn.fhir.rest.api.Constants;
|
||||||
|
import ca.uhn.fhir.rest.api.MethodOutcome;
|
||||||
|
import ca.uhn.fhir.rest.api.RequestTypeEnum;
|
||||||
|
import ca.uhn.fhir.rest.api.RestOperationTypeEnum;
|
||||||
import ca.uhn.fhir.rest.api.server.RequestDetails;
|
import ca.uhn.fhir.rest.api.server.RequestDetails;
|
||||||
import ca.uhn.fhir.rest.client.impl.BaseHttpClientInvocation;
|
import ca.uhn.fhir.rest.param.ParameterUtil;
|
||||||
import ca.uhn.fhir.rest.param.IParameter;
|
|
||||||
import ca.uhn.fhir.rest.server.exceptions.InvalidRequestException;
|
import ca.uhn.fhir.rest.server.exceptions.InvalidRequestException;
|
||||||
|
|
||||||
public class UpdateMethodBinding extends BaseOutcomeReturningMethodBindingWithResourceParam {
|
public class UpdateMethodBinding extends BaseOutcomeReturningMethodBindingWithResourceParam {
|
||||||
|
|
||||||
private Integer myIdParameterIndex;
|
|
||||||
|
|
||||||
public UpdateMethodBinding(Method theMethod, FhirContext theContext, Object theProvider) {
|
public UpdateMethodBinding(Method theMethod, FhirContext theContext, Object theProvider) {
|
||||||
super(theMethod, theContext, Update.class, theProvider);
|
super(theMethod, theContext, Update.class, theProvider);
|
||||||
|
|
||||||
myIdParameterIndex = MethodUtil.findIdParameterIndex(theMethod, getContext());
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -89,7 +85,7 @@ public class UpdateMethodBinding extends BaseOutcomeReturningMethodBindingWithRe
|
||||||
public static IIdType applyETagAsVersion(RequestDetails theRequest, IIdType id) {
|
public static IIdType applyETagAsVersion(RequestDetails theRequest, IIdType id) {
|
||||||
String ifMatchValue = theRequest.getHeader(Constants.HEADER_IF_MATCH);
|
String ifMatchValue = theRequest.getHeader(Constants.HEADER_IF_MATCH);
|
||||||
if (isNotBlank(ifMatchValue)) {
|
if (isNotBlank(ifMatchValue)) {
|
||||||
ifMatchValue = MethodUtil.parseETagValue(ifMatchValue);
|
ifMatchValue = ParameterUtil.parseETagValue(ifMatchValue);
|
||||||
if (id != null && id.hasVersionIdPart() == false) {
|
if (id != null && id.hasVersionIdPart() == false) {
|
||||||
id = id.withVersion(ifMatchValue);
|
id = id.withVersion(ifMatchValue);
|
||||||
}
|
}
|
||||||
|
@ -97,25 +93,6 @@ public class UpdateMethodBinding extends BaseOutcomeReturningMethodBindingWithRe
|
||||||
return id;
|
return id;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
protected BaseHttpClientInvocation createClientInvocation(Object[] theArgs, IResource theResource) {
|
|
||||||
IdDt idDt = (IdDt) theArgs[myIdParameterIndex];
|
|
||||||
if (idDt == null) {
|
|
||||||
throw new NullPointerException("ID can not be null");
|
|
||||||
}
|
|
||||||
|
|
||||||
FhirContext context = getContext();
|
|
||||||
|
|
||||||
HttpPutClientInvocation retVal = MethodUtil.createUpdateInvocation(theResource, null, idDt, context);
|
|
||||||
|
|
||||||
for (int idx = 0; idx < theArgs.length; idx++) {
|
|
||||||
IParameter nextParam = getParameters().get(idx);
|
|
||||||
nextParam.translateClientArgumentIntoQueryArgument(getContext(), theArgs[idx], null, null);
|
|
||||||
}
|
|
||||||
|
|
||||||
return retVal;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected String getMatchingOperation() {
|
protected String getMatchingOperation() {
|
||||||
return null;
|
return null;
|
||||||
|
@ -154,8 +131,8 @@ public class UpdateMethodBinding extends BaseOutcomeReturningMethodBindingWithRe
|
||||||
throw new InvalidRequestException(msg);
|
throw new InvalidRequestException(msg);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
theResource.setId((IIdType)null);
|
theResource.setId((IIdType) null);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -24,16 +24,13 @@ import java.lang.reflect.Method;
|
||||||
import java.util.Collections;
|
import java.util.Collections;
|
||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
|
|
||||||
import org.hl7.fhir.instance.model.api.IBaseResource;
|
|
||||||
|
|
||||||
import ca.uhn.fhir.context.FhirContext;
|
import ca.uhn.fhir.context.FhirContext;
|
||||||
import ca.uhn.fhir.model.api.IResource;
|
|
||||||
import ca.uhn.fhir.model.primitive.IdDt;
|
|
||||||
import ca.uhn.fhir.rest.annotation.Validate;
|
import ca.uhn.fhir.rest.annotation.Validate;
|
||||||
import ca.uhn.fhir.rest.api.*;
|
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.RequestDetails;
|
import ca.uhn.fhir.rest.api.server.RequestDetails;
|
||||||
import ca.uhn.fhir.rest.client.impl.BaseHttpClientInvocation;
|
import ca.uhn.fhir.rest.param.ParameterUtil;
|
||||||
import ca.uhn.fhir.rest.param.IParameter;
|
|
||||||
|
|
||||||
public class ValidateMethodBindingDstu1 extends BaseOutcomeReturningMethodBindingWithResourceParam {
|
public class ValidateMethodBindingDstu1 extends BaseOutcomeReturningMethodBindingWithResourceParam {
|
||||||
|
|
||||||
|
@ -42,7 +39,7 @@ public class ValidateMethodBindingDstu1 extends BaseOutcomeReturningMethodBindin
|
||||||
public ValidateMethodBindingDstu1(Method theMethod, FhirContext theContext, Object theProvider) {
|
public ValidateMethodBindingDstu1(Method theMethod, FhirContext theContext, Object theProvider) {
|
||||||
super(theMethod, theContext, Validate.class, theProvider);
|
super(theMethod, theContext, Validate.class, theProvider);
|
||||||
|
|
||||||
myIdParameterIndex = MethodUtil.findIdParameterIndex(theMethod, getContext());
|
myIdParameterIndex = ParameterUtil.findIdParameterIndex(theMethod, getContext());
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -57,40 +54,6 @@ public class ValidateMethodBindingDstu1 extends BaseOutcomeReturningMethodBindin
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
protected BaseHttpClientInvocation createClientInvocation(Object[] theArgs, IResource theResource) {
|
|
||||||
FhirContext context = getContext();
|
|
||||||
|
|
||||||
IdDt idDt=null;
|
|
||||||
if (myIdParameterIndex != null) {
|
|
||||||
idDt = (IdDt) theArgs[myIdParameterIndex];
|
|
||||||
}
|
|
||||||
|
|
||||||
HttpPostClientInvocation retVal = createValidateInvocation(theResource, idDt, context);
|
|
||||||
|
|
||||||
for (int idx = 0; idx < theArgs.length; idx++) {
|
|
||||||
IParameter nextParam = getParameters().get(idx);
|
|
||||||
nextParam.translateClientArgumentIntoQueryArgument(getContext(), theArgs[idx], null, null);
|
|
||||||
}
|
|
||||||
|
|
||||||
return retVal;
|
|
||||||
}
|
|
||||||
|
|
||||||
public static HttpPostClientInvocation createValidateInvocation(IBaseResource theResource, IdDt theId, FhirContext theContext) {
|
|
||||||
StringBuilder urlExtension = new StringBuilder();
|
|
||||||
urlExtension.append(theContext.getResourceDefinition(theResource).getName());
|
|
||||||
urlExtension.append('/');
|
|
||||||
urlExtension.append(Constants.PARAM_VALIDATE);
|
|
||||||
|
|
||||||
if (theId != null && theId.isEmpty() == false) {
|
|
||||||
String id = theId.getValue();
|
|
||||||
urlExtension.append('/');
|
|
||||||
urlExtension.append(id);
|
|
||||||
}
|
|
||||||
// TODO: is post correct here?
|
|
||||||
HttpPostClientInvocation retVal = new HttpPostClientInvocation(theContext, theResource, urlExtension.toString());
|
|
||||||
return retVal;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|
|
@ -10,7 +10,7 @@ package ca.uhn.fhir.rest.server.method;
|
||||||
* you may not use this file except in compliance with the License.
|
* you may not use this file except in compliance with the License.
|
||||||
* You may obtain a copy of the License at
|
* You may obtain a copy of the License at
|
||||||
*
|
*
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
*
|
*
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
@ -24,7 +24,6 @@ import java.lang.reflect.Method;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
import org.hl7.fhir.instance.model.api.IBaseParameters;
|
|
||||||
import org.hl7.fhir.instance.model.api.IBaseResource;
|
import org.hl7.fhir.instance.model.api.IBaseResource;
|
||||||
|
|
||||||
import ca.uhn.fhir.context.FhirContext;
|
import ca.uhn.fhir.context.FhirContext;
|
||||||
|
@ -33,9 +32,6 @@ import ca.uhn.fhir.rest.annotation.OperationParam;
|
||||||
import ca.uhn.fhir.rest.annotation.Validate;
|
import ca.uhn.fhir.rest.annotation.Validate;
|
||||||
import ca.uhn.fhir.rest.api.Constants;
|
import ca.uhn.fhir.rest.api.Constants;
|
||||||
import ca.uhn.fhir.rest.api.EncodingEnum;
|
import ca.uhn.fhir.rest.api.EncodingEnum;
|
||||||
import ca.uhn.fhir.rest.client.impl.BaseHttpClientInvocation;
|
|
||||||
import ca.uhn.fhir.rest.param.IParameter;
|
|
||||||
import ca.uhn.fhir.util.ParametersUtil;
|
|
||||||
|
|
||||||
public class ValidateMethodBindingDstu2Plus extends OperationMethodBinding {
|
public class ValidateMethodBindingDstu2Plus extends OperationMethodBinding {
|
||||||
|
|
||||||
|
@ -67,18 +63,5 @@ public class ValidateMethodBindingDstu2Plus extends OperationMethodBinding {
|
||||||
setParameters(newParams);
|
setParameters(newParams);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
public static BaseHttpClientInvocation createValidateInvocation(FhirContext theContext, IBaseResource theResource) {
|
|
||||||
IBaseParameters parameters = (IBaseParameters) theContext.getResourceDefinition("Parameters").newInstance();
|
|
||||||
ParametersUtil.addParameterToParameters(theContext, parameters, theResource, "resource");
|
|
||||||
|
|
||||||
String resourceName = theContext.getResourceDefinition(theResource).getName();
|
|
||||||
String resourceId = theResource.getIdElement().getIdPart();
|
|
||||||
|
|
||||||
BaseHttpClientInvocation retVal = createOperationInvocation(theContext, resourceName, resourceId, Constants.EXTOP_VALIDATE, parameters, false);
|
|
||||||
return retVal;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -21,23 +21,18 @@ package ca.uhn.fhir.rest.server.servlet;
|
||||||
*/
|
*/
|
||||||
import static org.apache.commons.lang3.StringUtils.isNotBlank;
|
import static org.apache.commons.lang3.StringUtils.isNotBlank;
|
||||||
|
|
||||||
import java.io.ByteArrayInputStream;
|
import java.io.*;
|
||||||
import java.io.IOException;
|
|
||||||
import java.io.InputStream;
|
|
||||||
import java.io.Reader;
|
|
||||||
import java.nio.charset.Charset;
|
import java.nio.charset.Charset;
|
||||||
import java.util.Collections;
|
import java.util.*;
|
||||||
import java.util.Enumeration;
|
|
||||||
import java.util.List;
|
|
||||||
import java.util.zip.GZIPInputStream;
|
import java.util.zip.GZIPInputStream;
|
||||||
|
|
||||||
import javax.servlet.http.HttpServletRequest;
|
import javax.servlet.http.HttpServletRequest;
|
||||||
import javax.servlet.http.HttpServletResponse;
|
import javax.servlet.http.HttpServletResponse;
|
||||||
|
|
||||||
import org.apache.commons.io.IOUtils;
|
import org.apache.commons.io.IOUtils;
|
||||||
import org.apache.http.entity.ContentType;
|
|
||||||
|
|
||||||
import ca.uhn.fhir.context.ConfigurationException;
|
import ca.uhn.fhir.context.ConfigurationException;
|
||||||
|
import ca.uhn.fhir.context.FhirContext;
|
||||||
import ca.uhn.fhir.rest.api.Constants;
|
import ca.uhn.fhir.rest.api.Constants;
|
||||||
import ca.uhn.fhir.rest.api.server.RequestDetails;
|
import ca.uhn.fhir.rest.api.server.RequestDetails;
|
||||||
import ca.uhn.fhir.rest.server.RestfulServer;
|
import ca.uhn.fhir.rest.server.RestfulServer;
|
||||||
|
@ -166,14 +161,26 @@ public class ServletRequestDetails extends RequestDetails {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Charset getCharset() {
|
public Charset getCharset() {
|
||||||
String ct = getHeader(Constants.HEADER_CONTENT_TYPE);
|
|
||||||
|
|
||||||
Charset charset = null;
|
Charset charset = null;
|
||||||
if (isNotBlank(ct)) {
|
|
||||||
ContentType parsedCt = ContentType.parse(ct);
|
String charsetString = myServletResponse.getCharacterEncoding();
|
||||||
charset = parsedCt.getCharset();
|
if (isNotBlank(charsetString)) {
|
||||||
|
charset = Charset.forName(charsetString);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// String ct = getHeader(Constants.HEADER_CONTENT_TYPE);
|
||||||
|
//
|
||||||
|
// if (isNotBlank(ct)) {
|
||||||
|
// ContentType parsedCt = ContentType.parse(ct);
|
||||||
|
// charset = parsedCt.getCharset();
|
||||||
|
// }
|
||||||
|
|
||||||
return charset;
|
return charset;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public FhirContext getFhirContext() {
|
||||||
|
return getServer().getFhirContext();
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -21,12 +21,27 @@
|
||||||
<version>${project.version}</version>
|
<version>${project.version}</version>
|
||||||
</dependency>
|
</dependency>
|
||||||
|
|
||||||
|
<!--
|
||||||
|
Test dependencies on other optional parts of HAPI
|
||||||
|
-->
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>ca.uhn.hapi.fhir</groupId>
|
<groupId>ca.uhn.hapi.fhir</groupId>
|
||||||
<artifactId>hapi-fhir-validation-resources-dstu2.1</artifactId>
|
<artifactId>hapi-fhir-validation-resources-dstu2.1</artifactId>
|
||||||
<version>${project.version}</version>
|
<version>${project.version}</version>
|
||||||
<scope>test</scope>
|
<scope>test</scope>
|
||||||
</dependency>
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>ca.uhn.hapi.fhir</groupId>
|
||||||
|
<artifactId>hapi-fhir-client</artifactId>
|
||||||
|
<version>${project.version}</version>
|
||||||
|
<scope>test</scope>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>ca.uhn.hapi.fhir</groupId>
|
||||||
|
<artifactId>hapi-fhir-server</artifactId>
|
||||||
|
<version>${project.version}</version>
|
||||||
|
<scope>test</scope>
|
||||||
|
</dependency>
|
||||||
|
|
||||||
<!--
|
<!--
|
||||||
The JPA project uses a newer API but we'll try to hold to this version
|
The JPA project uses a newer API but we'll try to hold to this version
|
||||||
|
|
|
@ -10,7 +10,7 @@ package org.hl7.fhir.dstu2016may.hapi.ctx;
|
||||||
* you may not use this file except in compliance with the License.
|
* you may not use this file except in compliance with the License.
|
||||||
* You may obtain a copy of the License at
|
* You may obtain a copy of the License at
|
||||||
*
|
*
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
*
|
*
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
@ -26,31 +26,16 @@ import java.util.List;
|
||||||
|
|
||||||
import org.apache.commons.lang3.StringUtils;
|
import org.apache.commons.lang3.StringUtils;
|
||||||
import org.hl7.fhir.dstu2016may.hapi.rest.server.Dstu2_1BundleFactory;
|
import org.hl7.fhir.dstu2016may.hapi.rest.server.Dstu2_1BundleFactory;
|
||||||
import org.hl7.fhir.dstu2016may.hapi.rest.server.ServerConformanceProvider;
|
import org.hl7.fhir.dstu2016may.model.*;
|
||||||
import org.hl7.fhir.dstu2016may.hapi.rest.server.ServerProfileProvider;
|
import org.hl7.fhir.instance.model.api.*;
|
||||||
import org.hl7.fhir.dstu2016may.model.Coding;
|
|
||||||
import org.hl7.fhir.dstu2016may.model.Constants;
|
|
||||||
import org.hl7.fhir.dstu2016may.model.IdType;
|
|
||||||
import org.hl7.fhir.dstu2016may.model.Reference;
|
|
||||||
import org.hl7.fhir.dstu2016may.model.Resource;
|
|
||||||
import org.hl7.fhir.dstu2016may.model.StructureDefinition;
|
|
||||||
import org.hl7.fhir.instance.model.api.IBaseCoding;
|
|
||||||
import org.hl7.fhir.instance.model.api.IBaseReference;
|
|
||||||
import org.hl7.fhir.instance.model.api.IBaseResource;
|
|
||||||
import org.hl7.fhir.instance.model.api.IIdType;
|
|
||||||
import org.hl7.fhir.instance.model.api.IPrimitiveType;
|
|
||||||
|
|
||||||
import ca.uhn.fhir.context.ConfigurationException;
|
import ca.uhn.fhir.context.*;
|
||||||
import ca.uhn.fhir.context.FhirContext;
|
|
||||||
import ca.uhn.fhir.context.FhirVersionEnum;
|
|
||||||
import ca.uhn.fhir.context.RuntimeResourceDefinition;
|
|
||||||
import ca.uhn.fhir.context.support.IContextValidationSupport;
|
import ca.uhn.fhir.context.support.IContextValidationSupport;
|
||||||
import ca.uhn.fhir.fluentpath.IFluentPath;
|
import ca.uhn.fhir.fluentpath.IFluentPath;
|
||||||
import ca.uhn.fhir.model.api.IFhirVersion;
|
import ca.uhn.fhir.model.api.IFhirVersion;
|
||||||
import ca.uhn.fhir.model.primitive.IdDt;
|
import ca.uhn.fhir.model.primitive.IdDt;
|
||||||
import ca.uhn.fhir.rest.server.IResourceProvider;
|
import ca.uhn.fhir.rest.api.IVersionSpecificBundleFactory;
|
||||||
import ca.uhn.fhir.rest.server.IVersionSpecificBundleFactory;
|
import ca.uhn.fhir.util.ReflectionUtil;
|
||||||
import ca.uhn.fhir.rest.server.RestfulServer;
|
|
||||||
|
|
||||||
public class FhirDstu2_1 implements IFhirVersion {
|
public class FhirDstu2_1 implements IFhirVersion {
|
||||||
|
|
||||||
|
@ -61,16 +46,6 @@ public class FhirDstu2_1 implements IFhirVersion {
|
||||||
throw new UnsupportedOperationException("FluentPath is not supported in DSTU2 contexts");
|
throw new UnsupportedOperationException("FluentPath is not supported in DSTU2 contexts");
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
public ServerConformanceProvider createServerConformanceProvider(RestfulServer theServer) {
|
|
||||||
return new ServerConformanceProvider(theServer);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public IResourceProvider createServerProfilesProvider(RestfulServer theRestfulServer) {
|
|
||||||
return new ServerProfileProvider(theRestfulServer);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public IContextValidationSupport<?, ?, ?, ?, ?, ?> createValidationSupport() {
|
public IContextValidationSupport<?, ?, ?, ?, ?, ?> createValidationSupport() {
|
||||||
throw new UnsupportedOperationException("Validation is not supported in DSTU2.1 contexts");
|
throw new UnsupportedOperationException("Validation is not supported in DSTU2.1 contexts");
|
||||||
|
@ -113,7 +88,7 @@ public class FhirDstu2_1 implements IFhirVersion {
|
||||||
public IPrimitiveType<Date> getLastUpdated(IBaseResource theResource) {
|
public IPrimitiveType<Date> getLastUpdated(IBaseResource theResource) {
|
||||||
return ((Resource) theResource).getMeta().getLastUpdatedElement();
|
return ((Resource) theResource).getMeta().getLastUpdatedElement();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public String getPathToSchemaDefinitions() {
|
public String getPathToSchemaDefinitions() {
|
||||||
return "/org/hl7/fhir/dstu2016may/schema";
|
return "/org/hl7/fhir/dstu2016may/schema";
|
||||||
|
@ -144,4 +119,9 @@ public class FhirDstu2_1 implements IFhirVersion {
|
||||||
return new IdType();
|
return new IdType();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Object getServerVersion() {
|
||||||
|
return ReflectionUtil.newInstanceOfFhirServerType("org.hl7.fhir.dstu2016may.hapi.ctx.FhirServerDstu2_1");
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,22 @@
|
||||||
|
package org.hl7.fhir.dstu2016may.hapi.ctx;
|
||||||
|
|
||||||
|
import org.hl7.fhir.dstu2016may.hapi.rest.server.ServerConformanceProvider;
|
||||||
|
import org.hl7.fhir.dstu2016may.hapi.rest.server.ServerProfileProvider;
|
||||||
|
|
||||||
|
import ca.uhn.fhir.rest.api.server.IFhirVersionServer;
|
||||||
|
import ca.uhn.fhir.rest.server.IResourceProvider;
|
||||||
|
import ca.uhn.fhir.rest.server.RestfulServer;
|
||||||
|
|
||||||
|
public class FhirServerDstu2_1 implements IFhirVersionServer {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public ServerConformanceProvider createServerConformanceProvider(RestfulServer theServer) {
|
||||||
|
return new ServerConformanceProvider(theServer);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public IResourceProvider createServerProfilesProvider(RestfulServer theRestfulServer) {
|
||||||
|
return new ServerProfileProvider(theRestfulServer);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -21,43 +21,19 @@ package org.hl7.fhir.dstu2016may.hapi.rest.server;
|
||||||
*/
|
*/
|
||||||
import static org.apache.commons.lang3.StringUtils.isNotBlank;
|
import static org.apache.commons.lang3.StringUtils.isNotBlank;
|
||||||
|
|
||||||
import java.util.ArrayList;
|
import java.util.*;
|
||||||
import java.util.Collections;
|
|
||||||
import java.util.Date;
|
|
||||||
import java.util.HashSet;
|
|
||||||
import java.util.List;
|
|
||||||
import java.util.Set;
|
|
||||||
import java.util.UUID;
|
|
||||||
|
|
||||||
import org.apache.commons.lang3.Validate;
|
import org.hl7.fhir.dstu2016may.model.*;
|
||||||
import org.hl7.fhir.dstu2016may.model.Bundle;
|
import org.hl7.fhir.dstu2016may.model.Bundle.*;
|
||||||
import org.hl7.fhir.dstu2016may.model.Bundle.BundleEntryComponent;
|
import org.hl7.fhir.instance.model.api.*;
|
||||||
import org.hl7.fhir.dstu2016may.model.Bundle.BundleLinkComponent;
|
|
||||||
import org.hl7.fhir.dstu2016may.model.Bundle.HTTPVerb;
|
|
||||||
import org.hl7.fhir.dstu2016may.model.Bundle.SearchEntryMode;
|
|
||||||
import org.hl7.fhir.dstu2016may.model.DomainResource;
|
|
||||||
import org.hl7.fhir.dstu2016may.model.IdType;
|
|
||||||
import org.hl7.fhir.dstu2016may.model.Resource;
|
|
||||||
import org.hl7.fhir.instance.model.api.IAnyResource;
|
|
||||||
import org.hl7.fhir.instance.model.api.IBaseReference;
|
|
||||||
import org.hl7.fhir.instance.model.api.IBaseResource;
|
|
||||||
import org.hl7.fhir.instance.model.api.IIdType;
|
|
||||||
import org.hl7.fhir.instance.model.api.IPrimitiveType;
|
|
||||||
|
|
||||||
import ca.uhn.fhir.context.FhirContext;
|
import ca.uhn.fhir.context.FhirContext;
|
||||||
|
import ca.uhn.fhir.context.api.BundleInclusionRule;
|
||||||
import ca.uhn.fhir.model.api.Include;
|
import ca.uhn.fhir.model.api.Include;
|
||||||
import ca.uhn.fhir.model.api.ResourceMetadataKeyEnum;
|
import ca.uhn.fhir.model.api.ResourceMetadataKeyEnum;
|
||||||
import ca.uhn.fhir.model.base.resource.BaseOperationOutcome;
|
|
||||||
import ca.uhn.fhir.model.valueset.BundleTypeEnum;
|
import ca.uhn.fhir.model.valueset.BundleTypeEnum;
|
||||||
import ca.uhn.fhir.rest.server.BundleInclusionRule;
|
import ca.uhn.fhir.rest.api.Constants;
|
||||||
import ca.uhn.fhir.rest.server.Constants;
|
import ca.uhn.fhir.rest.api.IVersionSpecificBundleFactory;
|
||||||
import ca.uhn.fhir.rest.server.EncodingEnum;
|
|
||||||
import ca.uhn.fhir.rest.server.IBundleProvider;
|
|
||||||
import ca.uhn.fhir.rest.server.IPagingProvider;
|
|
||||||
import ca.uhn.fhir.rest.server.IRestfulServer;
|
|
||||||
import ca.uhn.fhir.rest.server.IVersionSpecificBundleFactory;
|
|
||||||
import ca.uhn.fhir.rest.server.RestfulServerUtils;
|
|
||||||
import ca.uhn.fhir.rest.server.exceptions.InternalErrorException;
|
|
||||||
import ca.uhn.fhir.util.ResourceReferenceInfo;
|
import ca.uhn.fhir.util.ResourceReferenceInfo;
|
||||||
|
|
||||||
public class Dstu2_1BundleFactory implements IVersionSpecificBundleFactory {
|
public class Dstu2_1BundleFactory implements IVersionSpecificBundleFactory {
|
||||||
|
@ -267,7 +243,7 @@ public class Dstu2_1BundleFactory implements IVersionSpecificBundleFactory {
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void addRootPropertiesToBundle(String theAuthor, String theServerBase, String theCompleteUrl, Integer theTotalResults, BundleTypeEnum theBundleType, IPrimitiveType<Date> theLastUpdated) {
|
public void addRootPropertiesToBundle(String theAuthor, String theServerBase, String theLinkSelf, String theLinkPrev, String theLinkNext, Integer theTotalResults, BundleTypeEnum theBundleType, IPrimitiveType<Date> theLastUpdated) {
|
||||||
|
|
||||||
myBase = theServerBase;
|
myBase = theServerBase;
|
||||||
|
|
||||||
|
@ -279,8 +255,14 @@ public class Dstu2_1BundleFactory implements IVersionSpecificBundleFactory {
|
||||||
myBundle.getMeta().getLastUpdatedElement().setValueAsString(theLastUpdated.getValueAsString());
|
myBundle.getMeta().getLastUpdatedElement().setValueAsString(theLastUpdated.getValueAsString());
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!hasLink(Constants.LINK_SELF, myBundle) && isNotBlank(theCompleteUrl)) {
|
if (!hasLink(Constants.LINK_SELF, myBundle) && isNotBlank(theLinkSelf)) {
|
||||||
myBundle.addLink().setRelation("self").setUrl(theCompleteUrl);
|
myBundle.addLink().setRelation(Constants.LINK_SELF).setUrl(theLinkSelf);
|
||||||
|
}
|
||||||
|
if (!hasLink(Constants.LINK_NEXT, myBundle) && isNotBlank(theLinkNext)) {
|
||||||
|
myBundle.addLink().setRelation(Constants.LINK_NEXT).setUrl(theLinkNext);
|
||||||
|
}
|
||||||
|
if (!hasLink(Constants.LINK_PREVIOUS, myBundle) && isNotBlank(theLinkPrev)) {
|
||||||
|
myBundle.addLink().setRelation(Constants.LINK_PREVIOUS).setUrl(theLinkPrev);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (myBundle.getTypeElement().isEmpty() && theBundleType != null) {
|
if (myBundle.getTypeElement().isEmpty() && theBundleType != null) {
|
||||||
|
@ -311,78 +293,6 @@ public class Dstu2_1BundleFactory implements IVersionSpecificBundleFactory {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
public void initializeBundleFromBundleProvider(IRestfulServer<?> theServer, IBundleProvider theResult, EncodingEnum theResponseEncoding, String theServerBase, String theCompleteUrl,
|
|
||||||
boolean thePrettyPrint, int theOffset, Integer theLimit, String theSearchId, BundleTypeEnum theBundleType, Set<Include> theIncludes) {
|
|
||||||
myBase = theServerBase;
|
|
||||||
|
|
||||||
int numToReturn;
|
|
||||||
String searchId = null;
|
|
||||||
List<IBaseResource> resourceList;
|
|
||||||
if (theServer.getPagingProvider() == null) {
|
|
||||||
numToReturn = theResult.size();
|
|
||||||
if (numToReturn > 0) {
|
|
||||||
resourceList = theResult.getResources(0, numToReturn);
|
|
||||||
} else {
|
|
||||||
resourceList = Collections.emptyList();
|
|
||||||
}
|
|
||||||
RestfulServerUtils.validateResourceListNotNull(resourceList);
|
|
||||||
|
|
||||||
} else {
|
|
||||||
IPagingProvider pagingProvider = theServer.getPagingProvider();
|
|
||||||
if (theLimit == null) {
|
|
||||||
numToReturn = pagingProvider.getDefaultPageSize();
|
|
||||||
} else {
|
|
||||||
numToReturn = Math.min(pagingProvider.getMaximumPageSize(), theLimit);
|
|
||||||
}
|
|
||||||
|
|
||||||
numToReturn = Math.min(numToReturn, theResult.size() - theOffset);
|
|
||||||
if (numToReturn > 0) {
|
|
||||||
resourceList = theResult.getResources(theOffset, numToReturn + theOffset);
|
|
||||||
} else {
|
|
||||||
resourceList = Collections.emptyList();
|
|
||||||
}
|
|
||||||
RestfulServerUtils.validateResourceListNotNull(resourceList);
|
|
||||||
|
|
||||||
if (theSearchId != null) {
|
|
||||||
searchId = theSearchId;
|
|
||||||
} else {
|
|
||||||
if (theResult.size() > numToReturn) {
|
|
||||||
searchId = pagingProvider.storeResultList(theResult);
|
|
||||||
Validate.notNull(searchId, "Paging provider returned null searchId");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
for (IBaseResource next : resourceList) {
|
|
||||||
if (next.getIdElement() == null || next.getIdElement().isEmpty()) {
|
|
||||||
if (!(next instanceof BaseOperationOutcome)) {
|
|
||||||
throw new InternalErrorException("Server method returned resource of type[" + next.getClass().getSimpleName() + "] with no ID specified (IResource#setId(IdDt) must be called)");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
addResourcesToBundle(new ArrayList<IBaseResource>(resourceList), theBundleType, theServerBase, theServer.getBundleInclusionRule(), theIncludes);
|
|
||||||
addRootPropertiesToBundle(null, theServerBase, theCompleteUrl, theResult.size(), theBundleType, theResult.getPublished());
|
|
||||||
|
|
||||||
if (theServer.getPagingProvider() != null) {
|
|
||||||
int limit;
|
|
||||||
limit = theLimit != null ? theLimit : theServer.getPagingProvider().getDefaultPageSize();
|
|
||||||
limit = Math.min(limit, theServer.getPagingProvider().getMaximumPageSize());
|
|
||||||
|
|
||||||
if (searchId != null) {
|
|
||||||
if (theOffset + numToReturn < theResult.size()) {
|
|
||||||
myBundle.addLink().setRelation(Constants.LINK_NEXT)
|
|
||||||
.setUrl(RestfulServerUtils.createPagingLink(theIncludes, theServerBase, searchId, theOffset + numToReturn, numToReturn, theResponseEncoding, thePrettyPrint, theBundleType));
|
|
||||||
}
|
|
||||||
if (theOffset > 0) {
|
|
||||||
int start = Math.max(0, theOffset - limit);
|
|
||||||
myBundle.addLink().setRelation(Constants.LINK_PREVIOUS)
|
|
||||||
.setUrl(RestfulServerUtils.createPagingLink(theIncludes, theServerBase, searchId, start, limit, theResponseEncoding, thePrettyPrint, theBundleType));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void initializeBundleFromResourceList(String theAuthor, List<? extends IBaseResource> theResources, String theServerBase, String theCompleteUrl, int theTotalResults,
|
public void initializeBundleFromResourceList(String theAuthor, List<? extends IBaseResource> theResources, String theServerBase, String theCompleteUrl, int theTotalResults,
|
||||||
|
|
|
@ -22,69 +22,31 @@ import static org.apache.commons.lang3.StringUtils.isBlank;
|
||||||
*/
|
*/
|
||||||
import static org.apache.commons.lang3.StringUtils.isNotBlank;
|
import static org.apache.commons.lang3.StringUtils.isNotBlank;
|
||||||
|
|
||||||
import java.util.ArrayList;
|
import java.util.*;
|
||||||
import java.util.Collections;
|
|
||||||
import java.util.Comparator;
|
|
||||||
import java.util.HashMap;
|
|
||||||
import java.util.HashSet;
|
|
||||||
import java.util.IdentityHashMap;
|
|
||||||
import java.util.List;
|
|
||||||
import java.util.Map;
|
|
||||||
import java.util.Map.Entry;
|
import java.util.Map.Entry;
|
||||||
import java.util.Set;
|
|
||||||
import java.util.TreeMap;
|
|
||||||
import java.util.TreeSet;
|
|
||||||
|
|
||||||
import javax.servlet.ServletContext;
|
import javax.servlet.ServletContext;
|
||||||
import javax.servlet.http.HttpServletRequest;
|
import javax.servlet.http.HttpServletRequest;
|
||||||
|
|
||||||
import org.apache.commons.lang3.StringUtils;
|
import org.apache.commons.lang3.StringUtils;
|
||||||
import org.hl7.fhir.dstu2016may.model.Conformance;
|
import org.hl7.fhir.dstu2016may.model.*;
|
||||||
import org.hl7.fhir.dstu2016may.model.Conformance.ConditionalDeleteStatus;
|
import org.hl7.fhir.dstu2016may.model.Conformance.*;
|
||||||
import org.hl7.fhir.dstu2016may.model.Conformance.ConformanceRestComponent;
|
|
||||||
import org.hl7.fhir.dstu2016may.model.Conformance.ConformanceRestResourceComponent;
|
|
||||||
import org.hl7.fhir.dstu2016may.model.Conformance.ConformanceRestResourceSearchParamComponent;
|
|
||||||
import org.hl7.fhir.dstu2016may.model.Conformance.ConformanceStatementKind;
|
|
||||||
import org.hl7.fhir.dstu2016may.model.Conformance.ResourceInteractionComponent;
|
|
||||||
import org.hl7.fhir.dstu2016may.model.Conformance.RestfulConformanceMode;
|
|
||||||
import org.hl7.fhir.dstu2016may.model.Conformance.SystemRestfulInteraction;
|
|
||||||
import org.hl7.fhir.dstu2016may.model.Conformance.TypeRestfulInteraction;
|
|
||||||
import org.hl7.fhir.dstu2016may.model.Conformance.UnknownContentCode;
|
|
||||||
import org.hl7.fhir.dstu2016may.model.DateTimeType;
|
|
||||||
import org.hl7.fhir.dstu2016may.model.Enumerations.ConformanceResourceStatus;
|
import org.hl7.fhir.dstu2016may.model.Enumerations.ConformanceResourceStatus;
|
||||||
import org.hl7.fhir.dstu2016may.model.Enumerations.ResourceType;
|
import org.hl7.fhir.dstu2016may.model.Enumerations.ResourceType;
|
||||||
import org.hl7.fhir.dstu2016may.model.IdType;
|
import org.hl7.fhir.dstu2016may.model.OperationDefinition.*;
|
||||||
import org.hl7.fhir.dstu2016may.model.OperationDefinition;
|
|
||||||
import org.hl7.fhir.dstu2016may.model.OperationDefinition.OperationDefinitionParameterComponent;
|
|
||||||
import org.hl7.fhir.dstu2016may.model.OperationDefinition.OperationKind;
|
|
||||||
import org.hl7.fhir.dstu2016may.model.OperationDefinition.OperationParameterUse;
|
|
||||||
import org.hl7.fhir.dstu2016may.model.Reference;
|
|
||||||
import org.hl7.fhir.exceptions.FHIRException;
|
import org.hl7.fhir.exceptions.FHIRException;
|
||||||
import org.hl7.fhir.instance.model.api.IBaseResource;
|
import org.hl7.fhir.instance.model.api.IBaseResource;
|
||||||
|
|
||||||
import ca.uhn.fhir.context.FhirVersionEnum;
|
import ca.uhn.fhir.context.*;
|
||||||
import ca.uhn.fhir.context.RuntimeResourceDefinition;
|
|
||||||
import ca.uhn.fhir.context.RuntimeSearchParam;
|
|
||||||
import ca.uhn.fhir.parser.DataFormatException;
|
import ca.uhn.fhir.parser.DataFormatException;
|
||||||
import ca.uhn.fhir.rest.annotation.IdParam;
|
import ca.uhn.fhir.rest.annotation.*;
|
||||||
import ca.uhn.fhir.rest.annotation.Initialize;
|
import ca.uhn.fhir.rest.api.Constants;
|
||||||
import ca.uhn.fhir.rest.annotation.Metadata;
|
import ca.uhn.fhir.rest.api.RestSearchParameterTypeEnum;
|
||||||
import ca.uhn.fhir.rest.annotation.Read;
|
import ca.uhn.fhir.rest.server.*;
|
||||||
import ca.uhn.fhir.rest.method.BaseMethodBinding;
|
|
||||||
import ca.uhn.fhir.rest.method.DynamicSearchMethodBinding;
|
|
||||||
import ca.uhn.fhir.rest.method.IParameter;
|
|
||||||
import ca.uhn.fhir.rest.method.OperationMethodBinding;
|
|
||||||
import ca.uhn.fhir.rest.method.OperationMethodBinding.ReturnType;
|
|
||||||
import ca.uhn.fhir.rest.method.OperationParameter;
|
|
||||||
import ca.uhn.fhir.rest.method.RestSearchParameterTypeEnum;
|
|
||||||
import ca.uhn.fhir.rest.method.SearchMethodBinding;
|
|
||||||
import ca.uhn.fhir.rest.method.SearchParameter;
|
|
||||||
import ca.uhn.fhir.rest.server.Constants;
|
|
||||||
import ca.uhn.fhir.rest.server.IServerConformanceProvider;
|
|
||||||
import ca.uhn.fhir.rest.server.ResourceBinding;
|
|
||||||
import ca.uhn.fhir.rest.server.RestfulServer;
|
|
||||||
import ca.uhn.fhir.rest.server.RestulfulServerConfiguration;
|
|
||||||
import ca.uhn.fhir.rest.server.exceptions.ResourceNotFoundException;
|
import ca.uhn.fhir.rest.server.exceptions.ResourceNotFoundException;
|
||||||
|
import ca.uhn.fhir.rest.server.method.*;
|
||||||
|
import ca.uhn.fhir.rest.server.method.OperationMethodBinding.ReturnType;
|
||||||
|
import ca.uhn.fhir.rest.server.method.SearchParameter;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Server FHIR Provider which serves the conformance statement for a RESTful server implementation
|
* Server FHIR Provider which serves the conformance statement for a RESTful server implementation
|
||||||
|
|
|
@ -1,9 +1,7 @@
|
||||||
package org.hl7.fhir.dstu2016may.hapi.validation;
|
package org.hl7.fhir.dstu2016may.hapi.validation;
|
||||||
|
|
||||||
import java.io.StringReader;
|
import java.io.StringReader;
|
||||||
import java.util.ArrayList;
|
import java.util.*;
|
||||||
import java.util.Collections;
|
|
||||||
import java.util.List;
|
|
||||||
|
|
||||||
import javax.xml.parsers.DocumentBuilder;
|
import javax.xml.parsers.DocumentBuilder;
|
||||||
import javax.xml.parsers.DocumentBuilderFactory;
|
import javax.xml.parsers.DocumentBuilderFactory;
|
||||||
|
@ -11,22 +9,16 @@ import javax.xml.parsers.DocumentBuilderFactory;
|
||||||
import org.apache.commons.lang3.Validate;
|
import org.apache.commons.lang3.Validate;
|
||||||
import org.hl7.fhir.dstu2016may.model.OperationOutcome.IssueSeverity;
|
import org.hl7.fhir.dstu2016may.model.OperationOutcome.IssueSeverity;
|
||||||
import org.hl7.fhir.dstu2016may.model.StructureDefinition;
|
import org.hl7.fhir.dstu2016may.model.StructureDefinition;
|
||||||
import org.hl7.fhir.dstu2016may.validation.IResourceValidator;
|
import org.hl7.fhir.dstu2016may.validation.*;
|
||||||
import org.hl7.fhir.dstu2016may.validation.IResourceValidator.BestPracticeWarningLevel;
|
import org.hl7.fhir.dstu2016may.validation.IResourceValidator.BestPracticeWarningLevel;
|
||||||
import org.hl7.fhir.dstu2016may.validation.InstanceValidator;
|
import org.w3c.dom.*;
|
||||||
import org.hl7.fhir.dstu2016may.validation.ValidationMessage;
|
|
||||||
import org.w3c.dom.Document;
|
|
||||||
import org.w3c.dom.Element;
|
|
||||||
import org.w3c.dom.NodeList;
|
|
||||||
import org.xml.sax.InputSource;
|
import org.xml.sax.InputSource;
|
||||||
|
|
||||||
import com.google.gson.Gson;
|
import com.google.gson.*;
|
||||||
import com.google.gson.GsonBuilder;
|
|
||||||
import com.google.gson.JsonObject;
|
|
||||||
|
|
||||||
import ca.uhn.fhir.context.ConfigurationException;
|
import ca.uhn.fhir.context.ConfigurationException;
|
||||||
import ca.uhn.fhir.context.FhirContext;
|
import ca.uhn.fhir.context.FhirContext;
|
||||||
import ca.uhn.fhir.rest.server.EncodingEnum;
|
import ca.uhn.fhir.rest.api.EncodingEnum;
|
||||||
import ca.uhn.fhir.rest.server.exceptions.InternalErrorException;
|
import ca.uhn.fhir.rest.server.exceptions.InternalErrorException;
|
||||||
import ca.uhn.fhir.validation.IValidationContext;
|
import ca.uhn.fhir.validation.IValidationContext;
|
||||||
import ca.uhn.fhir.validation.IValidatorModule;
|
import ca.uhn.fhir.validation.IValidatorModule;
|
||||||
|
|
|
@ -10,27 +10,17 @@ import static org.junit.Assert.assertThat;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
import org.hl7.fhir.dstu2016may.model.Bundle;
|
import org.hl7.fhir.dstu2016may.model.*;
|
||||||
import org.hl7.fhir.dstu2016may.model.DateTimeType;
|
|
||||||
import org.hl7.fhir.dstu2016may.model.Extension;
|
import org.hl7.fhir.dstu2016may.model.Extension;
|
||||||
import org.hl7.fhir.dstu2016may.model.Medication;
|
|
||||||
import org.hl7.fhir.dstu2016may.model.Patient;
|
|
||||||
import org.hl7.fhir.dstu2016may.model.Quantity;
|
|
||||||
import org.hl7.fhir.dstu2016may.model.StringType;
|
|
||||||
import org.hl7.fhir.dstu2016may.model.MedicationOrder;
|
|
||||||
import org.hl7.fhir.instance.model.api.IBase;
|
import org.hl7.fhir.instance.model.api.IBase;
|
||||||
import org.junit.AfterClass;
|
import org.junit.*;
|
||||||
import org.junit.Before;
|
|
||||||
import org.junit.Test;
|
|
||||||
|
|
||||||
import ca.uhn.fhir.context.FhirContext;
|
import ca.uhn.fhir.context.FhirContext;
|
||||||
import ca.uhn.fhir.model.api.annotation.Child;
|
import ca.uhn.fhir.context.api.AddProfileTagEnum;
|
||||||
import ca.uhn.fhir.model.api.annotation.Description;
|
import ca.uhn.fhir.model.api.annotation.*;
|
||||||
import ca.uhn.fhir.model.api.annotation.ResourceDef;
|
|
||||||
import ca.uhn.fhir.model.primitive.DateTimeDt;
|
import ca.uhn.fhir.model.primitive.DateTimeDt;
|
||||||
import ca.uhn.fhir.model.primitive.StringDt;
|
import ca.uhn.fhir.model.primitive.StringDt;
|
||||||
import ca.uhn.fhir.parser.CustomResource364Dstu21.CustomResource364CustomDate;
|
import ca.uhn.fhir.parser.CustomResource364Dstu21.CustomResource364CustomDate;
|
||||||
import ca.uhn.fhir.rest.server.AddProfileTagEnum;
|
|
||||||
import ca.uhn.fhir.util.ElementUtil;
|
import ca.uhn.fhir.util.ElementUtil;
|
||||||
import ca.uhn.fhir.util.TestUtil;
|
import ca.uhn.fhir.util.TestUtil;
|
||||||
|
|
||||||
|
|
|
@ -49,11 +49,8 @@ import ca.uhn.fhir.narrative.DefaultThymeleafNarrativeGenerator;
|
||||||
import ca.uhn.fhir.parser.IParserErrorHandler.IParseLocation;
|
import ca.uhn.fhir.parser.IParserErrorHandler.IParseLocation;
|
||||||
import ca.uhn.fhir.parser.PatientWithExtendedContactDstu3.CustomContactComponent;
|
import ca.uhn.fhir.parser.PatientWithExtendedContactDstu3.CustomContactComponent;
|
||||||
import ca.uhn.fhir.parser.XmlParserDstu2_1Test.TestPatientFor327;
|
import ca.uhn.fhir.parser.XmlParserDstu2_1Test.TestPatientFor327;
|
||||||
import ca.uhn.fhir.rest.server.Constants;
|
|
||||||
import ca.uhn.fhir.util.TestUtil;
|
import ca.uhn.fhir.util.TestUtil;
|
||||||
import net.sf.json.JSON;
|
import net.sf.json.*;
|
||||||
import net.sf.json.JSONSerializer;
|
|
||||||
import net.sf.json.JsonConfig;
|
|
||||||
|
|
||||||
public class JsonParserDstu2_1Test {
|
public class JsonParserDstu2_1Test {
|
||||||
private static FhirContext ourCtx = FhirContext.forDstu2_1();
|
private static FhirContext ourCtx = FhirContext.forDstu2_1();
|
||||||
|
@ -805,7 +802,7 @@ public class JsonParserDstu2_1Test {
|
||||||
ourLog.info(encoded);
|
ourLog.info(encoded);
|
||||||
|
|
||||||
assertThat(encoded, containsString("Patient"));
|
assertThat(encoded, containsString("Patient"));
|
||||||
assertThat(encoded, stringContainsInOrder(Constants.TAG_SUBSETTED_SYSTEM, Constants.TAG_SUBSETTED_CODE));
|
assertThat(encoded, stringContainsInOrder(ca.uhn.fhir.rest.api.Constants.TAG_SUBSETTED_SYSTEM, ca.uhn.fhir.rest.api.Constants.TAG_SUBSETTED_CODE));
|
||||||
assertThat(encoded, not(containsString("text")));
|
assertThat(encoded, not(containsString("text")));
|
||||||
assertThat(encoded, not(containsString("THE DIV")));
|
assertThat(encoded, not(containsString("THE DIV")));
|
||||||
assertThat(encoded, containsString("family"));
|
assertThat(encoded, containsString("family"));
|
||||||
|
@ -839,7 +836,7 @@ public class JsonParserDstu2_1Test {
|
||||||
ourLog.info(encoded);
|
ourLog.info(encoded);
|
||||||
|
|
||||||
assertThat(encoded, containsString("Patient"));
|
assertThat(encoded, containsString("Patient"));
|
||||||
assertThat(encoded, stringContainsInOrder("\"tag\"", "\"system\": \"" + Constants.TAG_SUBSETTED_SYSTEM + "\",", "\"code\": \"" + Constants.TAG_SUBSETTED_CODE + "\""));
|
assertThat(encoded, stringContainsInOrder("\"tag\"", "\"system\": \"" + ca.uhn.fhir.rest.api.Constants.TAG_SUBSETTED_SYSTEM + "\",", "\"code\": \"" + ca.uhn.fhir.rest.api.Constants.TAG_SUBSETTED_CODE + "\""));
|
||||||
assertThat(encoded, not(containsString("THE DIV")));
|
assertThat(encoded, not(containsString("THE DIV")));
|
||||||
assertThat(encoded, containsString("family"));
|
assertThat(encoded, containsString("family"));
|
||||||
assertThat(encoded, not(containsString("maritalStatus")));
|
assertThat(encoded, not(containsString("maritalStatus")));
|
||||||
|
@ -859,8 +856,8 @@ public class JsonParserDstu2_1Test {
|
||||||
ourLog.info(encoded);
|
ourLog.info(encoded);
|
||||||
|
|
||||||
assertThat(encoded, containsString("Patient"));
|
assertThat(encoded, containsString("Patient"));
|
||||||
assertThat(encoded, stringContainsInOrder("\"tag\"", "\"system\": \"foo\",", "\"code\": \"bar\"", "\"system\": \"" + Constants.TAG_SUBSETTED_SYSTEM + "\"",
|
assertThat(encoded, stringContainsInOrder("\"tag\"", "\"system\": \"foo\",", "\"code\": \"bar\"", "\"system\": \"" + ca.uhn.fhir.rest.api.Constants.TAG_SUBSETTED_SYSTEM + "\"",
|
||||||
"\"code\": \"" + Constants.TAG_SUBSETTED_CODE + "\""));
|
"\"code\": \"" + ca.uhn.fhir.rest.api.Constants.TAG_SUBSETTED_CODE + "\""));
|
||||||
assertThat(encoded, not(containsString("THE DIV")));
|
assertThat(encoded, not(containsString("THE DIV")));
|
||||||
assertThat(encoded, containsString("family"));
|
assertThat(encoded, containsString("family"));
|
||||||
assertThat(encoded, not(containsString("maritalStatus")));
|
assertThat(encoded, not(containsString("maritalStatus")));
|
||||||
|
|
|
@ -4,7 +4,6 @@ import static org.hamcrest.Matchers.contains;
|
||||||
import static org.hamcrest.Matchers.containsString;
|
import static org.hamcrest.Matchers.containsString;
|
||||||
import static org.hamcrest.Matchers.empty;
|
import static org.hamcrest.Matchers.empty;
|
||||||
import static org.hamcrest.Matchers.not;
|
import static org.hamcrest.Matchers.not;
|
||||||
import static org.hamcrest.Matchers.startsWith;
|
|
||||||
import static org.hamcrest.Matchers.stringContainsInOrder;
|
import static org.hamcrest.Matchers.stringContainsInOrder;
|
||||||
import static org.junit.Assert.assertArrayEquals;
|
import static org.junit.Assert.assertArrayEquals;
|
||||||
import static org.junit.Assert.assertEquals;
|
import static org.junit.Assert.assertEquals;
|
||||||
|
@ -23,15 +22,7 @@ import static org.mockito.Mockito.verify;
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.io.StringReader;
|
import java.io.StringReader;
|
||||||
import java.nio.charset.StandardCharsets;
|
import java.nio.charset.StandardCharsets;
|
||||||
import java.text.Annotation;
|
import java.util.*;
|
||||||
import java.text.SimpleDateFormat;
|
|
||||||
import java.util.ArrayList;
|
|
||||||
import java.util.Arrays;
|
|
||||||
import java.util.Date;
|
|
||||||
import java.util.Enumeration;
|
|
||||||
import java.util.HashSet;
|
|
||||||
import java.util.List;
|
|
||||||
import java.util.UUID;
|
|
||||||
|
|
||||||
import org.apache.commons.io.IOUtils;
|
import org.apache.commons.io.IOUtils;
|
||||||
import org.custommonkey.xmlunit.Diff;
|
import org.custommonkey.xmlunit.Diff;
|
||||||
|
@ -39,70 +30,21 @@ import org.custommonkey.xmlunit.XMLUnit;
|
||||||
import org.hamcrest.collection.IsEmptyCollection;
|
import org.hamcrest.collection.IsEmptyCollection;
|
||||||
import org.hamcrest.core.StringContains;
|
import org.hamcrest.core.StringContains;
|
||||||
import org.hamcrest.text.StringContainsInOrder;
|
import org.hamcrest.text.StringContainsInOrder;
|
||||||
|
import org.hl7.fhir.dstu2016may.model.*;
|
||||||
import org.hl7.fhir.dstu2016may.model.Address.AddressUse;
|
import org.hl7.fhir.dstu2016may.model.Address.AddressUse;
|
||||||
import org.hl7.fhir.dstu2016may.model.Address.AddressUseEnumFactory;
|
|
||||||
import org.hl7.fhir.dstu2016may.model.AllergyIntolerance;
|
|
||||||
import org.hl7.fhir.dstu2016may.model.Appointment;
|
|
||||||
import org.hl7.fhir.dstu2016may.model.AuditEvent;
|
|
||||||
import org.hl7.fhir.dstu2016may.model.Binary;
|
|
||||||
import org.hl7.fhir.dstu2016may.model.Bundle;
|
|
||||||
import org.hl7.fhir.dstu2016may.model.Bundle.BundleEntryComponent;
|
import org.hl7.fhir.dstu2016may.model.Bundle.BundleEntryComponent;
|
||||||
import org.hl7.fhir.dstu2016may.model.Bundle.BundleLinkComponent;
|
|
||||||
import org.hl7.fhir.dstu2016may.model.Bundle.BundleType;
|
import org.hl7.fhir.dstu2016may.model.Bundle.BundleType;
|
||||||
import org.hl7.fhir.dstu2016may.model.CodeType;
|
|
||||||
import org.hl7.fhir.dstu2016may.model.CodeableConcept;
|
|
||||||
import org.hl7.fhir.dstu2016may.model.Coding;
|
|
||||||
import org.hl7.fhir.dstu2016may.model.Composition;
|
|
||||||
import org.hl7.fhir.dstu2016may.model.ConceptMap;
|
|
||||||
import org.hl7.fhir.dstu2016may.model.Condition;
|
|
||||||
import org.hl7.fhir.dstu2016may.model.ContactPoint.ContactPointSystem;
|
import org.hl7.fhir.dstu2016may.model.ContactPoint.ContactPointSystem;
|
||||||
import org.hl7.fhir.dstu2016may.model.DateTimeType;
|
|
||||||
import org.hl7.fhir.dstu2016may.model.DateType;
|
|
||||||
import org.hl7.fhir.dstu2016may.model.DiagnosticReport;
|
|
||||||
import org.hl7.fhir.dstu2016may.model.DiagnosticReport.DiagnosticReportStatus;
|
import org.hl7.fhir.dstu2016may.model.DiagnosticReport.DiagnosticReportStatus;
|
||||||
import org.hl7.fhir.dstu2016may.model.DocumentManifest;
|
|
||||||
import org.hl7.fhir.dstu2016may.model.Duration;
|
|
||||||
import org.hl7.fhir.dstu2016may.model.ElementDefinition;
|
|
||||||
import org.hl7.fhir.dstu2016may.model.ElementDefinition.ElementDefinitionBindingComponent;
|
|
||||||
import org.hl7.fhir.dstu2016may.model.Encounter;
|
|
||||||
import org.hl7.fhir.dstu2016may.model.EnumFactory;
|
|
||||||
import org.hl7.fhir.dstu2016may.model.Enumerations.AdministrativeGender;
|
import org.hl7.fhir.dstu2016may.model.Enumerations.AdministrativeGender;
|
||||||
import org.hl7.fhir.dstu2016may.model.Enumerations.DocumentReferenceStatus;
|
import org.hl7.fhir.dstu2016may.model.Enumerations.DocumentReferenceStatus;
|
||||||
import org.hl7.fhir.dstu2016may.model.Extension;
|
|
||||||
import org.hl7.fhir.dstu2016may.model.GuidanceResponse;
|
|
||||||
import org.hl7.fhir.dstu2016may.model.HumanName;
|
|
||||||
import org.hl7.fhir.dstu2016may.model.HumanName.NameUse;
|
import org.hl7.fhir.dstu2016may.model.HumanName.NameUse;
|
||||||
import org.hl7.fhir.dstu2016may.model.IdType;
|
|
||||||
import org.hl7.fhir.dstu2016may.model.Identifier;
|
|
||||||
import org.hl7.fhir.dstu2016may.model.Identifier.IdentifierUse;
|
import org.hl7.fhir.dstu2016may.model.Identifier.IdentifierUse;
|
||||||
import org.hl7.fhir.dstu2016may.model.InstantType;
|
|
||||||
import org.hl7.fhir.dstu2016may.model.Location;
|
|
||||||
import org.hl7.fhir.dstu2016may.model.Medication;
|
|
||||||
import org.hl7.fhir.dstu2016may.model.MedicationOrder;
|
|
||||||
import org.hl7.fhir.dstu2016may.model.MedicationStatement;
|
|
||||||
import org.hl7.fhir.dstu2016may.model.Observation;
|
|
||||||
import org.hl7.fhir.dstu2016may.model.Observation.ObservationRelationshipType;
|
import org.hl7.fhir.dstu2016may.model.Observation.ObservationRelationshipType;
|
||||||
import org.hl7.fhir.dstu2016may.model.Observation.ObservationStatus;
|
import org.hl7.fhir.dstu2016may.model.Observation.ObservationStatus;
|
||||||
import org.hl7.fhir.dstu2016may.model.Organization;
|
|
||||||
import org.hl7.fhir.dstu2016may.model.Patient;
|
|
||||||
import org.hl7.fhir.dstu2016may.model.Practitioner;
|
|
||||||
import org.hl7.fhir.dstu2016may.model.PrimitiveType;
|
|
||||||
import org.hl7.fhir.dstu2016may.model.ProcedureRequest;
|
|
||||||
import org.hl7.fhir.dstu2016may.model.Quantity;
|
|
||||||
import org.hl7.fhir.dstu2016may.model.Reference;
|
|
||||||
import org.hl7.fhir.dstu2016may.model.Resource;
|
|
||||||
import org.hl7.fhir.dstu2016may.model.SampledData;
|
|
||||||
import org.hl7.fhir.dstu2016may.model.SimpleQuantity;
|
|
||||||
import org.hl7.fhir.dstu2016may.model.StringType;
|
|
||||||
import org.hl7.fhir.dstu2016may.model.UriType;
|
|
||||||
import org.hl7.fhir.dstu2016may.model.ValueSet;
|
|
||||||
import org.hl7.fhir.instance.model.api.IBaseResource;
|
import org.hl7.fhir.instance.model.api.IBaseResource;
|
||||||
import org.hl7.fhir.instance.model.api.IIdType;
|
import org.hl7.fhir.instance.model.api.IIdType;
|
||||||
import org.junit.After;
|
import org.junit.*;
|
||||||
import org.junit.AfterClass;
|
|
||||||
import org.junit.BeforeClass;
|
|
||||||
import org.junit.Ignore;
|
|
||||||
import org.junit.Test;
|
|
||||||
import org.mockito.ArgumentCaptor;
|
import org.mockito.ArgumentCaptor;
|
||||||
|
|
||||||
import com.google.common.collect.Sets;
|
import com.google.common.collect.Sets;
|
||||||
|
@ -114,10 +56,9 @@ import ca.uhn.fhir.narrative.DefaultThymeleafNarrativeGenerator;
|
||||||
import ca.uhn.fhir.parser.FooMessageHeaderWithExplicitField.FooMessageSourceComponent;
|
import ca.uhn.fhir.parser.FooMessageHeaderWithExplicitField.FooMessageSourceComponent;
|
||||||
import ca.uhn.fhir.parser.IParserErrorHandler.IParseLocation;
|
import ca.uhn.fhir.parser.IParserErrorHandler.IParseLocation;
|
||||||
import ca.uhn.fhir.parser.PatientWithCustomCompositeExtension.FooParentExtension;
|
import ca.uhn.fhir.parser.PatientWithCustomCompositeExtension.FooParentExtension;
|
||||||
import ca.uhn.fhir.rest.client.IGenericClient;
|
import ca.uhn.fhir.rest.api.Constants;
|
||||||
import ca.uhn.fhir.rest.server.Constants;
|
import ca.uhn.fhir.rest.client.api.IGenericClient;
|
||||||
import ca.uhn.fhir.util.TestUtil;
|
import ca.uhn.fhir.util.TestUtil;
|
||||||
import net.sf.saxon.style.DataElement;
|
|
||||||
|
|
||||||
public class XmlParserDstu2_1Test {
|
public class XmlParserDstu2_1Test {
|
||||||
private static FhirContext ourCtx = FhirContext.forDstu2_1();
|
private static FhirContext ourCtx = FhirContext.forDstu2_1();
|
||||||
|
|
|
@ -17,10 +17,7 @@ import org.apache.http.client.methods.HttpEntityEnclosingRequestBase;
|
||||||
import org.apache.http.client.methods.HttpUriRequest;
|
import org.apache.http.client.methods.HttpUriRequest;
|
||||||
import org.apache.http.message.BasicHeader;
|
import org.apache.http.message.BasicHeader;
|
||||||
import org.apache.http.message.BasicStatusLine;
|
import org.apache.http.message.BasicStatusLine;
|
||||||
import org.junit.AfterClass;
|
import org.junit.*;
|
||||||
import org.junit.Before;
|
|
||||||
import org.junit.BeforeClass;
|
|
||||||
import org.junit.Test;
|
|
||||||
import org.mockito.ArgumentCaptor;
|
import org.mockito.ArgumentCaptor;
|
||||||
import org.mockito.internal.stubbing.defaultanswers.ReturnsDeepStubs;
|
import org.mockito.internal.stubbing.defaultanswers.ReturnsDeepStubs;
|
||||||
import org.mockito.invocation.InvocationOnMock;
|
import org.mockito.invocation.InvocationOnMock;
|
||||||
|
@ -28,7 +25,9 @@ import org.mockito.stubbing.Answer;
|
||||||
|
|
||||||
import ca.uhn.fhir.context.FhirContext;
|
import ca.uhn.fhir.context.FhirContext;
|
||||||
import ca.uhn.fhir.parser.IParser;
|
import ca.uhn.fhir.parser.IParser;
|
||||||
import ca.uhn.fhir.rest.server.Constants;
|
import ca.uhn.fhir.rest.api.Constants;
|
||||||
|
import ca.uhn.fhir.rest.client.api.IGenericClient;
|
||||||
|
import ca.uhn.fhir.rest.client.api.ServerValidationModeEnum;
|
||||||
import ca.uhn.fhir.util.TestUtil;
|
import ca.uhn.fhir.util.TestUtil;
|
||||||
|
|
||||||
public class ClientWithCustomTypeDstu2_1Test {
|
public class ClientWithCustomTypeDstu2_1Test {
|
||||||
|
|
|
@ -12,45 +12,23 @@ import static org.junit.Assert.fail;
|
||||||
import static org.mockito.Mockito.mock;
|
import static org.mockito.Mockito.mock;
|
||||||
import static org.mockito.Mockito.when;
|
import static org.mockito.Mockito.when;
|
||||||
|
|
||||||
import java.io.IOException;
|
import java.io.*;
|
||||||
import java.io.InputStream;
|
|
||||||
import java.io.StringReader;
|
|
||||||
import java.nio.charset.Charset;
|
import java.nio.charset.Charset;
|
||||||
import java.nio.charset.StandardCharsets;
|
import java.nio.charset.StandardCharsets;
|
||||||
import java.util.ArrayList;
|
import java.util.*;
|
||||||
import java.util.Arrays;
|
|
||||||
import java.util.Collection;
|
|
||||||
import java.util.Date;
|
|
||||||
import java.util.List;
|
|
||||||
|
|
||||||
import org.apache.commons.io.IOUtils;
|
import org.apache.commons.io.IOUtils;
|
||||||
import org.apache.commons.io.input.ReaderInputStream;
|
import org.apache.commons.io.input.ReaderInputStream;
|
||||||
import org.apache.http.Header;
|
import org.apache.http.*;
|
||||||
import org.apache.http.HttpResponse;
|
|
||||||
import org.apache.http.ProtocolVersion;
|
|
||||||
import org.apache.http.client.ClientProtocolException;
|
import org.apache.http.client.ClientProtocolException;
|
||||||
import org.apache.http.client.HttpClient;
|
import org.apache.http.client.HttpClient;
|
||||||
import org.apache.http.client.methods.HttpEntityEnclosingRequestBase;
|
import org.apache.http.client.methods.*;
|
||||||
import org.apache.http.client.methods.HttpPut;
|
|
||||||
import org.apache.http.client.methods.HttpUriRequest;
|
|
||||||
import org.apache.http.message.BasicHeader;
|
import org.apache.http.message.BasicHeader;
|
||||||
import org.apache.http.message.BasicStatusLine;
|
import org.apache.http.message.BasicStatusLine;
|
||||||
import org.hl7.fhir.dstu2016may.model.Binary;
|
import org.hl7.fhir.dstu2016may.model.*;
|
||||||
import org.hl7.fhir.dstu2016may.model.Bundle;
|
|
||||||
import org.hl7.fhir.dstu2016may.model.Bundle.BundleType;
|
import org.hl7.fhir.dstu2016may.model.Bundle.BundleType;
|
||||||
import org.hl7.fhir.dstu2016may.model.Conformance;
|
|
||||||
import org.hl7.fhir.dstu2016may.model.Device;
|
|
||||||
import org.hl7.fhir.dstu2016may.model.Encounter;
|
|
||||||
import org.hl7.fhir.dstu2016may.model.IdType;
|
|
||||||
import org.hl7.fhir.dstu2016may.model.Observation;
|
|
||||||
import org.hl7.fhir.dstu2016may.model.OperationOutcome;
|
|
||||||
import org.hl7.fhir.dstu2016may.model.Parameters;
|
|
||||||
import org.hl7.fhir.dstu2016may.model.Patient;
|
|
||||||
import org.hl7.fhir.instance.model.api.IBaseResource;
|
import org.hl7.fhir.instance.model.api.IBaseResource;
|
||||||
import org.junit.AfterClass;
|
import org.junit.*;
|
||||||
import org.junit.Before;
|
|
||||||
import org.junit.BeforeClass;
|
|
||||||
import org.junit.Test;
|
|
||||||
import org.mockito.ArgumentCaptor;
|
import org.mockito.ArgumentCaptor;
|
||||||
import org.mockito.internal.stubbing.defaultanswers.ReturnsDeepStubs;
|
import org.mockito.internal.stubbing.defaultanswers.ReturnsDeepStubs;
|
||||||
import org.mockito.invocation.InvocationOnMock;
|
import org.mockito.invocation.InvocationOnMock;
|
||||||
|
@ -63,26 +41,23 @@ import ca.uhn.fhir.context.FhirContext;
|
||||||
import ca.uhn.fhir.context.FhirVersionEnum;
|
import ca.uhn.fhir.context.FhirVersionEnum;
|
||||||
import ca.uhn.fhir.model.api.TemporalPrecisionEnum;
|
import ca.uhn.fhir.model.api.TemporalPrecisionEnum;
|
||||||
import ca.uhn.fhir.model.dstu.valueset.QuantityCompararatorEnum;
|
import ca.uhn.fhir.model.dstu.valueset.QuantityCompararatorEnum;
|
||||||
import ca.uhn.fhir.model.primitive.DateTimeDt;
|
import ca.uhn.fhir.model.primitive.*;
|
||||||
import ca.uhn.fhir.model.primitive.StringDt;
|
|
||||||
import ca.uhn.fhir.model.primitive.UriDt;
|
|
||||||
import ca.uhn.fhir.parser.CustomTypeDstu2_1Test;
|
import ca.uhn.fhir.parser.CustomTypeDstu2_1Test;
|
||||||
import ca.uhn.fhir.parser.CustomTypeDstu2_1Test.MyCustomPatient;
|
import ca.uhn.fhir.parser.CustomTypeDstu2_1Test.MyCustomPatient;
|
||||||
import ca.uhn.fhir.parser.IParser;
|
import ca.uhn.fhir.parser.IParser;
|
||||||
import ca.uhn.fhir.rest.api.MethodOutcome;
|
import ca.uhn.fhir.rest.api.*;
|
||||||
import ca.uhn.fhir.rest.api.PreferReturnEnum;
|
import ca.uhn.fhir.rest.api.Constants;
|
||||||
|
import ca.uhn.fhir.rest.client.api.IGenericClient;
|
||||||
|
import ca.uhn.fhir.rest.client.api.ServerValidationModeEnum;
|
||||||
import ca.uhn.fhir.rest.client.exceptions.FhirClientConnectionException;
|
import ca.uhn.fhir.rest.client.exceptions.FhirClientConnectionException;
|
||||||
import ca.uhn.fhir.rest.client.exceptions.NonFhirResponseException;
|
import ca.uhn.fhir.rest.client.exceptions.NonFhirResponseException;
|
||||||
|
import ca.uhn.fhir.rest.client.impl.BaseClient;
|
||||||
import ca.uhn.fhir.rest.client.interceptor.CookieInterceptor;
|
import ca.uhn.fhir.rest.client.interceptor.CookieInterceptor;
|
||||||
import ca.uhn.fhir.rest.client.interceptor.UserInfoInterceptor;
|
import ca.uhn.fhir.rest.client.interceptor.UserInfoInterceptor;
|
||||||
import ca.uhn.fhir.rest.param.ParamPrefixEnum;
|
import ca.uhn.fhir.rest.param.ParamPrefixEnum;
|
||||||
import ca.uhn.fhir.rest.server.Constants;
|
|
||||||
import ca.uhn.fhir.rest.server.EncodingEnum;
|
|
||||||
import ca.uhn.fhir.rest.server.exceptions.NotImplementedOperationException;
|
import ca.uhn.fhir.rest.server.exceptions.NotImplementedOperationException;
|
||||||
import ca.uhn.fhir.rest.server.exceptions.UnclassifiedServerFailureException;
|
import ca.uhn.fhir.rest.server.exceptions.UnclassifiedServerFailureException;
|
||||||
import ca.uhn.fhir.util.TestUtil;
|
import ca.uhn.fhir.util.*;
|
||||||
import ca.uhn.fhir.util.UrlUtil;
|
|
||||||
import ca.uhn.fhir.util.VersionUtil;
|
|
||||||
|
|
||||||
public class GenericClientDstu2_1Test {
|
public class GenericClientDstu2_1Test {
|
||||||
private static FhirContext ourCtx;
|
private static FhirContext ourCtx;
|
||||||
|
|
|
@ -18,15 +18,9 @@ import org.apache.http.client.methods.HttpEntityEnclosingRequestBase;
|
||||||
import org.apache.http.client.methods.HttpUriRequest;
|
import org.apache.http.client.methods.HttpUriRequest;
|
||||||
import org.apache.http.message.BasicHeader;
|
import org.apache.http.message.BasicHeader;
|
||||||
import org.apache.http.message.BasicStatusLine;
|
import org.apache.http.message.BasicStatusLine;
|
||||||
import org.hl7.fhir.dstu2016may.model.Bundle;
|
import org.hl7.fhir.dstu2016may.model.*;
|
||||||
import org.hl7.fhir.dstu2016may.model.IdType;
|
|
||||||
import org.hl7.fhir.dstu2016may.model.OperationOutcome;
|
|
||||||
import org.hl7.fhir.dstu2016may.model.Patient;
|
|
||||||
import org.hl7.fhir.instance.model.api.IBaseResource;
|
import org.hl7.fhir.instance.model.api.IBaseResource;
|
||||||
import org.junit.AfterClass;
|
import org.junit.*;
|
||||||
import org.junit.Before;
|
|
||||||
import org.junit.BeforeClass;
|
|
||||||
import org.junit.Test;
|
|
||||||
import org.mockito.ArgumentCaptor;
|
import org.mockito.ArgumentCaptor;
|
||||||
import org.mockito.internal.stubbing.defaultanswers.ReturnsDeepStubs;
|
import org.mockito.internal.stubbing.defaultanswers.ReturnsDeepStubs;
|
||||||
import org.mockito.invocation.InvocationOnMock;
|
import org.mockito.invocation.InvocationOnMock;
|
||||||
|
@ -34,15 +28,13 @@ import org.mockito.stubbing.Answer;
|
||||||
|
|
||||||
import ca.uhn.fhir.context.FhirContext;
|
import ca.uhn.fhir.context.FhirContext;
|
||||||
import ca.uhn.fhir.parser.IParser;
|
import ca.uhn.fhir.parser.IParser;
|
||||||
import ca.uhn.fhir.rest.annotation.IdParam;
|
import ca.uhn.fhir.rest.annotation.*;
|
||||||
import ca.uhn.fhir.rest.annotation.Read;
|
import ca.uhn.fhir.rest.api.Constants;
|
||||||
import ca.uhn.fhir.rest.annotation.ResourceParam;
|
|
||||||
import ca.uhn.fhir.rest.annotation.Search;
|
|
||||||
import ca.uhn.fhir.rest.annotation.Validate;
|
|
||||||
import ca.uhn.fhir.rest.api.MethodOutcome;
|
import ca.uhn.fhir.rest.api.MethodOutcome;
|
||||||
import ca.uhn.fhir.rest.api.ValidationModeEnum;
|
import ca.uhn.fhir.rest.api.ValidationModeEnum;
|
||||||
import ca.uhn.fhir.rest.client.api.IRestfulClient;
|
import ca.uhn.fhir.rest.client.api.IRestfulClient;
|
||||||
import ca.uhn.fhir.rest.server.Constants;
|
import ca.uhn.fhir.rest.client.api.ServerValidationModeEnum;
|
||||||
|
import ca.uhn.fhir.rest.client.impl.BaseClient;
|
||||||
import ca.uhn.fhir.util.TestUtil;
|
import ca.uhn.fhir.util.TestUtil;
|
||||||
|
|
||||||
public class NonGenericClientDstu2_1Test {
|
public class NonGenericClientDstu2_1Test {
|
||||||
|
|
|
@ -14,16 +14,12 @@ import org.apache.commons.io.input.ReaderInputStream;
|
||||||
import org.apache.http.HttpResponse;
|
import org.apache.http.HttpResponse;
|
||||||
import org.apache.http.ProtocolVersion;
|
import org.apache.http.ProtocolVersion;
|
||||||
import org.apache.http.client.HttpClient;
|
import org.apache.http.client.HttpClient;
|
||||||
import org.apache.http.client.methods.HttpGet;
|
import org.apache.http.client.methods.*;
|
||||||
import org.apache.http.client.methods.HttpPost;
|
|
||||||
import org.apache.http.client.methods.HttpUriRequest;
|
|
||||||
import org.apache.http.message.BasicHeader;
|
import org.apache.http.message.BasicHeader;
|
||||||
import org.apache.http.message.BasicStatusLine;
|
import org.apache.http.message.BasicStatusLine;
|
||||||
import org.hl7.fhir.dstu2016may.model.Parameters;
|
import org.hl7.fhir.dstu2016may.model.Parameters;
|
||||||
import org.hl7.fhir.dstu2016may.model.StringType;
|
import org.hl7.fhir.dstu2016may.model.StringType;
|
||||||
import org.junit.AfterClass;
|
import org.junit.*;
|
||||||
import org.junit.Before;
|
|
||||||
import org.junit.Test;
|
|
||||||
import org.mockito.ArgumentCaptor;
|
import org.mockito.ArgumentCaptor;
|
||||||
import org.mockito.internal.stubbing.defaultanswers.ReturnsDeepStubs;
|
import org.mockito.internal.stubbing.defaultanswers.ReturnsDeepStubs;
|
||||||
import org.mockito.invocation.InvocationOnMock;
|
import org.mockito.invocation.InvocationOnMock;
|
||||||
|
@ -32,14 +28,9 @@ import org.mockito.stubbing.Answer;
|
||||||
import ca.uhn.fhir.context.FhirContext;
|
import ca.uhn.fhir.context.FhirContext;
|
||||||
import ca.uhn.fhir.rest.annotation.Operation;
|
import ca.uhn.fhir.rest.annotation.Operation;
|
||||||
import ca.uhn.fhir.rest.annotation.OperationParam;
|
import ca.uhn.fhir.rest.annotation.OperationParam;
|
||||||
import ca.uhn.fhir.rest.client.api.IBasicClient;
|
import ca.uhn.fhir.rest.api.Constants;
|
||||||
import ca.uhn.fhir.rest.param.StringAndListParam;
|
import ca.uhn.fhir.rest.client.api.*;
|
||||||
import ca.uhn.fhir.rest.param.StringOrListParam;
|
import ca.uhn.fhir.rest.param.*;
|
||||||
import ca.uhn.fhir.rest.param.StringParam;
|
|
||||||
import ca.uhn.fhir.rest.param.TokenAndListParam;
|
|
||||||
import ca.uhn.fhir.rest.param.TokenOrListParam;
|
|
||||||
import ca.uhn.fhir.rest.param.TokenParam;
|
|
||||||
import ca.uhn.fhir.rest.server.Constants;
|
|
||||||
import ca.uhn.fhir.util.TestUtil;
|
import ca.uhn.fhir.util.TestUtil;
|
||||||
|
|
||||||
public class OperationClientDstu2_1Test {
|
public class OperationClientDstu2_1Test {
|
||||||
|
|
|
@ -18,14 +18,8 @@ import org.apache.http.client.methods.HttpEntityEnclosingRequestBase;
|
||||||
import org.apache.http.client.methods.HttpUriRequest;
|
import org.apache.http.client.methods.HttpUriRequest;
|
||||||
import org.apache.http.message.BasicHeader;
|
import org.apache.http.message.BasicHeader;
|
||||||
import org.apache.http.message.BasicStatusLine;
|
import org.apache.http.message.BasicStatusLine;
|
||||||
import org.hl7.fhir.dstu2016may.model.IdType;
|
import org.hl7.fhir.dstu2016may.model.*;
|
||||||
import org.hl7.fhir.dstu2016may.model.OperationOutcome;
|
import org.junit.*;
|
||||||
import org.hl7.fhir.dstu2016may.model.Patient;
|
|
||||||
import org.junit.AfterClass;
|
|
||||||
import org.junit.Before;
|
|
||||||
import org.junit.BeforeClass;
|
|
||||||
import org.junit.Ignore;
|
|
||||||
import org.junit.Test;
|
|
||||||
import org.mockito.ArgumentCaptor;
|
import org.mockito.ArgumentCaptor;
|
||||||
import org.mockito.internal.stubbing.defaultanswers.ReturnsDeepStubs;
|
import org.mockito.internal.stubbing.defaultanswers.ReturnsDeepStubs;
|
||||||
import org.mockito.invocation.InvocationOnMock;
|
import org.mockito.invocation.InvocationOnMock;
|
||||||
|
@ -33,13 +27,11 @@ import org.mockito.stubbing.Answer;
|
||||||
|
|
||||||
import ca.uhn.fhir.context.FhirContext;
|
import ca.uhn.fhir.context.FhirContext;
|
||||||
import ca.uhn.fhir.parser.IParser;
|
import ca.uhn.fhir.parser.IParser;
|
||||||
import ca.uhn.fhir.rest.annotation.IdParam;
|
import ca.uhn.fhir.rest.annotation.*;
|
||||||
import ca.uhn.fhir.rest.annotation.Patch;
|
import ca.uhn.fhir.rest.api.Constants;
|
||||||
import ca.uhn.fhir.rest.annotation.ResourceParam;
|
|
||||||
import ca.uhn.fhir.rest.api.MethodOutcome;
|
import ca.uhn.fhir.rest.api.MethodOutcome;
|
||||||
import ca.uhn.fhir.rest.api.PatchTypeEnum;
|
import ca.uhn.fhir.rest.api.PatchTypeEnum;
|
||||||
import ca.uhn.fhir.rest.client.api.IRestfulClient;
|
import ca.uhn.fhir.rest.client.api.*;
|
||||||
import ca.uhn.fhir.rest.server.Constants;
|
|
||||||
import ca.uhn.fhir.util.TestUtil;
|
import ca.uhn.fhir.util.TestUtil;
|
||||||
|
|
||||||
public class PatchClientDstu2_1Test {
|
public class PatchClientDstu2_1Test {
|
||||||
|
|
|
@ -16,12 +16,11 @@ import org.mockito.Mockito;
|
||||||
import ca.uhn.fhir.context.FhirContext;
|
import ca.uhn.fhir.context.FhirContext;
|
||||||
import ca.uhn.fhir.context.FhirVersionEnum;
|
import ca.uhn.fhir.context.FhirVersionEnum;
|
||||||
import ca.uhn.fhir.parser.DataFormatException;
|
import ca.uhn.fhir.parser.DataFormatException;
|
||||||
|
import ca.uhn.fhir.rest.api.EncodingEnum;
|
||||||
import ca.uhn.fhir.rest.api.RequestTypeEnum;
|
import ca.uhn.fhir.rest.api.RequestTypeEnum;
|
||||||
import ca.uhn.fhir.rest.client.apache.ApacheRestfulClientFactory;
|
import ca.uhn.fhir.rest.client.apache.ApacheRestfulClientFactory;
|
||||||
import ca.uhn.fhir.rest.client.api.IHttpClient;
|
import ca.uhn.fhir.rest.client.api.*;
|
||||||
import ca.uhn.fhir.rest.client.api.IHttpRequest;
|
import ca.uhn.fhir.rest.client.impl.BaseClient;
|
||||||
import ca.uhn.fhir.rest.client.api.IHttpResponse;
|
|
||||||
import ca.uhn.fhir.rest.server.EncodingEnum;
|
|
||||||
import ca.uhn.fhir.rest.server.exceptions.ResourceNotFoundException;
|
import ca.uhn.fhir.rest.server.exceptions.ResourceNotFoundException;
|
||||||
import ca.uhn.fhir.util.TestUtil;
|
import ca.uhn.fhir.util.TestUtil;
|
||||||
|
|
||||||
|
|
|
@ -7,11 +7,7 @@ import static org.mockito.Mockito.when;
|
||||||
import java.io.InputStream;
|
import java.io.InputStream;
|
||||||
import java.io.StringReader;
|
import java.io.StringReader;
|
||||||
import java.nio.charset.Charset;
|
import java.nio.charset.Charset;
|
||||||
import java.util.Calendar;
|
import java.util.*;
|
||||||
import java.util.Date;
|
|
||||||
import java.util.GregorianCalendar;
|
|
||||||
import java.util.List;
|
|
||||||
import java.util.TimeZone;
|
|
||||||
|
|
||||||
import org.apache.commons.io.input.ReaderInputStream;
|
import org.apache.commons.io.input.ReaderInputStream;
|
||||||
import org.apache.http.HttpResponse;
|
import org.apache.http.HttpResponse;
|
||||||
|
@ -21,30 +17,23 @@ import org.apache.http.client.methods.HttpGet;
|
||||||
import org.apache.http.client.methods.HttpUriRequest;
|
import org.apache.http.client.methods.HttpUriRequest;
|
||||||
import org.apache.http.message.BasicHeader;
|
import org.apache.http.message.BasicHeader;
|
||||||
import org.apache.http.message.BasicStatusLine;
|
import org.apache.http.message.BasicStatusLine;
|
||||||
import org.hl7.fhir.dstu2016may.model.Bundle;
|
import org.hl7.fhir.dstu2016may.model.*;
|
||||||
import org.hl7.fhir.dstu2016may.model.Bundle.BundleEntryComponent;
|
import org.hl7.fhir.dstu2016may.model.Bundle.BundleEntryComponent;
|
||||||
import org.hl7.fhir.dstu2016may.model.Extension;
|
import org.junit.*;
|
||||||
import org.hl7.fhir.dstu2016may.model.Location;
|
|
||||||
import org.hl7.fhir.dstu2016may.model.StringType;
|
|
||||||
import org.junit.AfterClass;
|
|
||||||
import org.junit.Before;
|
|
||||||
import org.junit.Test;
|
|
||||||
import org.mockito.ArgumentCaptor;
|
import org.mockito.ArgumentCaptor;
|
||||||
import org.mockito.internal.stubbing.defaultanswers.ReturnsDeepStubs;
|
import org.mockito.internal.stubbing.defaultanswers.ReturnsDeepStubs;
|
||||||
import org.mockito.invocation.InvocationOnMock;
|
import org.mockito.invocation.InvocationOnMock;
|
||||||
import org.mockito.stubbing.Answer;
|
import org.mockito.stubbing.Answer;
|
||||||
|
|
||||||
import ca.uhn.fhir.context.FhirContext;
|
import ca.uhn.fhir.context.FhirContext;
|
||||||
|
import ca.uhn.fhir.rest.annotation.*;
|
||||||
import ca.uhn.fhir.rest.annotation.Count;
|
import ca.uhn.fhir.rest.annotation.Count;
|
||||||
import ca.uhn.fhir.rest.annotation.OptionalParam;
|
import ca.uhn.fhir.rest.api.Constants;
|
||||||
import ca.uhn.fhir.rest.annotation.RequiredParam;
|
|
||||||
import ca.uhn.fhir.rest.annotation.Search;
|
|
||||||
import ca.uhn.fhir.rest.annotation.Sort;
|
|
||||||
import ca.uhn.fhir.rest.api.SortOrderEnum;
|
import ca.uhn.fhir.rest.api.SortOrderEnum;
|
||||||
import ca.uhn.fhir.rest.api.SortSpec;
|
import ca.uhn.fhir.rest.api.SortSpec;
|
||||||
import ca.uhn.fhir.rest.client.api.IRestfulClient;
|
import ca.uhn.fhir.rest.client.api.IRestfulClient;
|
||||||
|
import ca.uhn.fhir.rest.client.api.ServerValidationModeEnum;
|
||||||
import ca.uhn.fhir.rest.param.StringParam;
|
import ca.uhn.fhir.rest.param.StringParam;
|
||||||
import ca.uhn.fhir.rest.server.Constants;
|
|
||||||
import ca.uhn.fhir.util.TestUtil;
|
import ca.uhn.fhir.util.TestUtil;
|
||||||
import ca.uhn.fhir.util.UrlUtil;
|
import ca.uhn.fhir.util.UrlUtil;
|
||||||
|
|
||||||
|
|
|
@ -17,18 +17,14 @@ import org.apache.http.impl.conn.PoolingHttpClientConnectionManager;
|
||||||
import org.eclipse.jetty.server.Server;
|
import org.eclipse.jetty.server.Server;
|
||||||
import org.eclipse.jetty.servlet.ServletHandler;
|
import org.eclipse.jetty.servlet.ServletHandler;
|
||||||
import org.eclipse.jetty.servlet.ServletHolder;
|
import org.eclipse.jetty.servlet.ServletHolder;
|
||||||
import org.hl7.fhir.dstu2016may.model.Binary;
|
import org.hl7.fhir.dstu2016may.model.*;
|
||||||
import org.hl7.fhir.dstu2016may.model.IdType;
|
|
||||||
import org.hl7.fhir.dstu2016may.model.Patient;
|
|
||||||
import org.hl7.fhir.instance.model.api.IBaseResource;
|
import org.hl7.fhir.instance.model.api.IBaseResource;
|
||||||
import org.junit.AfterClass;
|
import org.junit.*;
|
||||||
import org.junit.Before;
|
|
||||||
import org.junit.BeforeClass;
|
|
||||||
import org.junit.Test;
|
|
||||||
|
|
||||||
import ca.uhn.fhir.context.FhirContext;
|
import ca.uhn.fhir.context.FhirContext;
|
||||||
import ca.uhn.fhir.rest.annotation.Create;
|
import ca.uhn.fhir.rest.annotation.Create;
|
||||||
import ca.uhn.fhir.rest.annotation.ResourceParam;
|
import ca.uhn.fhir.rest.annotation.ResourceParam;
|
||||||
|
import ca.uhn.fhir.rest.api.Constants;
|
||||||
import ca.uhn.fhir.rest.api.MethodOutcome;
|
import ca.uhn.fhir.rest.api.MethodOutcome;
|
||||||
import ca.uhn.fhir.util.PortUtil;
|
import ca.uhn.fhir.util.PortUtil;
|
||||||
import ca.uhn.fhir.util.TestUtil;
|
import ca.uhn.fhir.util.TestUtil;
|
||||||
|
|
|
@ -23,24 +23,15 @@ import org.apache.http.impl.conn.PoolingHttpClientConnectionManager;
|
||||||
import org.eclipse.jetty.server.Server;
|
import org.eclipse.jetty.server.Server;
|
||||||
import org.eclipse.jetty.servlet.ServletHandler;
|
import org.eclipse.jetty.servlet.ServletHandler;
|
||||||
import org.eclipse.jetty.servlet.ServletHolder;
|
import org.eclipse.jetty.servlet.ServletHolder;
|
||||||
import org.hl7.fhir.dstu2016may.model.DateType;
|
import org.hl7.fhir.dstu2016may.model.*;
|
||||||
import org.hl7.fhir.dstu2016may.model.IdType;
|
|
||||||
import org.hl7.fhir.dstu2016may.model.OperationOutcome;
|
|
||||||
import org.hl7.fhir.dstu2016may.model.OperationOutcome.OperationOutcomeIssueComponent;
|
import org.hl7.fhir.dstu2016may.model.OperationOutcome.OperationOutcomeIssueComponent;
|
||||||
import org.hl7.fhir.dstu2016may.model.Patient;
|
|
||||||
import org.hl7.fhir.instance.model.api.IBaseOperationOutcome;
|
import org.hl7.fhir.instance.model.api.IBaseOperationOutcome;
|
||||||
import org.hl7.fhir.instance.model.api.IBaseResource;
|
import org.hl7.fhir.instance.model.api.IBaseResource;
|
||||||
import org.junit.AfterClass;
|
import org.junit.*;
|
||||||
import org.junit.Before;
|
|
||||||
import org.junit.BeforeClass;
|
|
||||||
import org.junit.Test;
|
|
||||||
|
|
||||||
import ca.uhn.fhir.context.FhirContext;
|
import ca.uhn.fhir.context.FhirContext;
|
||||||
import ca.uhn.fhir.rest.annotation.Create;
|
import ca.uhn.fhir.rest.annotation.*;
|
||||||
import ca.uhn.fhir.rest.annotation.IdParam;
|
import ca.uhn.fhir.rest.api.Constants;
|
||||||
import ca.uhn.fhir.rest.annotation.Read;
|
|
||||||
import ca.uhn.fhir.rest.annotation.ResourceParam;
|
|
||||||
import ca.uhn.fhir.rest.annotation.Search;
|
|
||||||
import ca.uhn.fhir.rest.api.MethodOutcome;
|
import ca.uhn.fhir.rest.api.MethodOutcome;
|
||||||
import ca.uhn.fhir.rest.client.MyPatientWithExtensions;
|
import ca.uhn.fhir.rest.client.MyPatientWithExtensions;
|
||||||
import ca.uhn.fhir.util.PortUtil;
|
import ca.uhn.fhir.util.PortUtil;
|
||||||
|
|
|
@ -18,23 +18,14 @@ import org.apache.http.impl.conn.PoolingHttpClientConnectionManager;
|
||||||
import org.eclipse.jetty.server.Server;
|
import org.eclipse.jetty.server.Server;
|
||||||
import org.eclipse.jetty.servlet.ServletHandler;
|
import org.eclipse.jetty.servlet.ServletHandler;
|
||||||
import org.eclipse.jetty.servlet.ServletHolder;
|
import org.eclipse.jetty.servlet.ServletHolder;
|
||||||
import org.hl7.fhir.dstu2016may.model.IdType;
|
import org.hl7.fhir.dstu2016may.model.*;
|
||||||
import org.hl7.fhir.dstu2016may.model.OperationOutcome;
|
import org.junit.*;
|
||||||
import org.hl7.fhir.dstu2016may.model.Patient;
|
|
||||||
import org.junit.AfterClass;
|
|
||||||
import org.junit.Before;
|
|
||||||
import org.junit.BeforeClass;
|
|
||||||
import org.junit.Test;
|
|
||||||
|
|
||||||
import ca.uhn.fhir.context.FhirContext;
|
import ca.uhn.fhir.context.FhirContext;
|
||||||
import ca.uhn.fhir.model.api.IResource;
|
import ca.uhn.fhir.model.api.IResource;
|
||||||
import ca.uhn.fhir.model.primitive.StringDt;
|
import ca.uhn.fhir.model.primitive.StringDt;
|
||||||
import ca.uhn.fhir.rest.annotation.ConditionalUrlParam;
|
import ca.uhn.fhir.rest.annotation.*;
|
||||||
import ca.uhn.fhir.rest.annotation.Create;
|
import ca.uhn.fhir.rest.api.Constants;
|
||||||
import ca.uhn.fhir.rest.annotation.IdParam;
|
|
||||||
import ca.uhn.fhir.rest.annotation.OptionalParam;
|
|
||||||
import ca.uhn.fhir.rest.annotation.ResourceParam;
|
|
||||||
import ca.uhn.fhir.rest.annotation.Search;
|
|
||||||
import ca.uhn.fhir.rest.api.MethodOutcome;
|
import ca.uhn.fhir.rest.api.MethodOutcome;
|
||||||
import ca.uhn.fhir.util.PortUtil;
|
import ca.uhn.fhir.util.PortUtil;
|
||||||
import ca.uhn.fhir.util.TestUtil;
|
import ca.uhn.fhir.util.TestUtil;
|
||||||
|
|
|
@ -14,17 +14,12 @@ import org.eclipse.jetty.servlet.ServletHolder;
|
||||||
import org.hl7.fhir.dstu2016may.model.IdType;
|
import org.hl7.fhir.dstu2016may.model.IdType;
|
||||||
import org.hl7.fhir.dstu2016may.model.Patient;
|
import org.hl7.fhir.dstu2016may.model.Patient;
|
||||||
import org.hl7.fhir.instance.model.api.IBaseResource;
|
import org.hl7.fhir.instance.model.api.IBaseResource;
|
||||||
import org.junit.AfterClass;
|
import org.junit.*;
|
||||||
import org.junit.Before;
|
|
||||||
import org.junit.BeforeClass;
|
|
||||||
import org.junit.Test;
|
|
||||||
|
|
||||||
import ca.uhn.fhir.context.FhirContext;
|
import ca.uhn.fhir.context.FhirContext;
|
||||||
import ca.uhn.fhir.rest.annotation.ConditionalUrlParam;
|
import ca.uhn.fhir.rest.annotation.*;
|
||||||
import ca.uhn.fhir.rest.annotation.Delete;
|
|
||||||
import ca.uhn.fhir.rest.annotation.IdParam;
|
|
||||||
import ca.uhn.fhir.rest.api.MethodOutcome;
|
import ca.uhn.fhir.rest.api.MethodOutcome;
|
||||||
import ca.uhn.fhir.rest.client.IGenericClient;
|
import ca.uhn.fhir.rest.client.api.IGenericClient;
|
||||||
import ca.uhn.fhir.rest.client.interceptor.LoggingInterceptor;
|
import ca.uhn.fhir.rest.client.interceptor.LoggingInterceptor;
|
||||||
import ca.uhn.fhir.util.PortUtil;
|
import ca.uhn.fhir.util.PortUtil;
|
||||||
import ca.uhn.fhir.util.TestUtil;
|
import ca.uhn.fhir.util.TestUtil;
|
||||||
|
|
|
@ -15,14 +15,13 @@ import org.eclipse.jetty.servlet.ServletHandler;
|
||||||
import org.eclipse.jetty.servlet.ServletHolder;
|
import org.eclipse.jetty.servlet.ServletHolder;
|
||||||
import org.hl7.fhir.dstu2016may.model.IdType;
|
import org.hl7.fhir.dstu2016may.model.IdType;
|
||||||
import org.hl7.fhir.dstu2016may.model.Patient;
|
import org.hl7.fhir.dstu2016may.model.Patient;
|
||||||
import org.junit.AfterClass;
|
import org.junit.*;
|
||||||
import org.junit.BeforeClass;
|
|
||||||
import org.junit.Test;
|
|
||||||
|
|
||||||
import ca.uhn.fhir.context.FhirContext;
|
import ca.uhn.fhir.context.FhirContext;
|
||||||
import ca.uhn.fhir.model.api.annotation.ResourceDef;
|
import ca.uhn.fhir.model.api.annotation.ResourceDef;
|
||||||
import ca.uhn.fhir.rest.annotation.IdParam;
|
import ca.uhn.fhir.rest.annotation.IdParam;
|
||||||
import ca.uhn.fhir.rest.annotation.Read;
|
import ca.uhn.fhir.rest.annotation.Read;
|
||||||
|
import ca.uhn.fhir.rest.api.EncodingEnum;
|
||||||
import ca.uhn.fhir.util.PortUtil;
|
import ca.uhn.fhir.util.PortUtil;
|
||||||
import ca.uhn.fhir.util.TestUtil;
|
import ca.uhn.fhir.util.TestUtil;
|
||||||
|
|
||||||
|
|
|
@ -27,11 +27,7 @@ import org.eclipse.jetty.server.Server;
|
||||||
import org.eclipse.jetty.servlet.ServletHandler;
|
import org.eclipse.jetty.servlet.ServletHandler;
|
||||||
import org.eclipse.jetty.servlet.ServletHolder;
|
import org.eclipse.jetty.servlet.ServletHolder;
|
||||||
import org.hl7.fhir.dstu2016may.model.Patient;
|
import org.hl7.fhir.dstu2016may.model.Patient;
|
||||||
import org.junit.After;
|
import org.junit.*;
|
||||||
import org.junit.AfterClass;
|
|
||||||
import org.junit.Before;
|
|
||||||
import org.junit.BeforeClass;
|
|
||||||
import org.junit.Test;
|
|
||||||
import org.mockito.ArgumentCaptor;
|
import org.mockito.ArgumentCaptor;
|
||||||
import org.mockito.InOrder;
|
import org.mockito.InOrder;
|
||||||
|
|
||||||
|
@ -39,9 +35,8 @@ import ca.uhn.fhir.context.FhirContext;
|
||||||
import ca.uhn.fhir.model.api.IResource;
|
import ca.uhn.fhir.model.api.IResource;
|
||||||
import ca.uhn.fhir.rest.annotation.ResourceParam;
|
import ca.uhn.fhir.rest.annotation.ResourceParam;
|
||||||
import ca.uhn.fhir.rest.annotation.Validate;
|
import ca.uhn.fhir.rest.annotation.Validate;
|
||||||
import ca.uhn.fhir.rest.api.MethodOutcome;
|
import ca.uhn.fhir.rest.api.*;
|
||||||
import ca.uhn.fhir.rest.api.RestOperationTypeEnum;
|
import ca.uhn.fhir.rest.api.server.RequestDetails;
|
||||||
import ca.uhn.fhir.rest.method.RequestDetails;
|
|
||||||
import ca.uhn.fhir.rest.server.interceptor.IServerInterceptor;
|
import ca.uhn.fhir.rest.server.interceptor.IServerInterceptor;
|
||||||
import ca.uhn.fhir.rest.server.interceptor.IServerInterceptor.ActionRequestDetails;
|
import ca.uhn.fhir.rest.server.interceptor.IServerInterceptor.ActionRequestDetails;
|
||||||
import ca.uhn.fhir.rest.server.servlet.ServletRequestDetails;
|
import ca.uhn.fhir.rest.server.servlet.ServletRequestDetails;
|
||||||
|
|
|
@ -15,9 +15,7 @@ import java.util.concurrent.TimeUnit;
|
||||||
|
|
||||||
import org.apache.commons.io.IOUtils;
|
import org.apache.commons.io.IOUtils;
|
||||||
import org.apache.http.HttpResponse;
|
import org.apache.http.HttpResponse;
|
||||||
import org.apache.http.client.methods.CloseableHttpResponse;
|
import org.apache.http.client.methods.*;
|
||||||
import org.apache.http.client.methods.HttpGet;
|
|
||||||
import org.apache.http.client.methods.HttpPost;
|
|
||||||
import org.apache.http.entity.ContentType;
|
import org.apache.http.entity.ContentType;
|
||||||
import org.apache.http.entity.StringEntity;
|
import org.apache.http.entity.StringEntity;
|
||||||
import org.apache.http.impl.client.CloseableHttpClient;
|
import org.apache.http.impl.client.CloseableHttpClient;
|
||||||
|
@ -26,31 +24,17 @@ import org.apache.http.impl.conn.PoolingHttpClientConnectionManager;
|
||||||
import org.eclipse.jetty.server.Server;
|
import org.eclipse.jetty.server.Server;
|
||||||
import org.eclipse.jetty.servlet.ServletHandler;
|
import org.eclipse.jetty.servlet.ServletHandler;
|
||||||
import org.eclipse.jetty.servlet.ServletHolder;
|
import org.eclipse.jetty.servlet.ServletHolder;
|
||||||
import org.hl7.fhir.dstu2016may.model.Bundle;
|
import org.hl7.fhir.dstu2016may.model.*;
|
||||||
import org.hl7.fhir.dstu2016may.model.Conformance;
|
|
||||||
import org.hl7.fhir.dstu2016may.model.Conformance.ConformanceRestOperationComponent;
|
import org.hl7.fhir.dstu2016may.model.Conformance.ConformanceRestOperationComponent;
|
||||||
import org.hl7.fhir.dstu2016may.model.DateTimeType;
|
|
||||||
import org.hl7.fhir.dstu2016may.model.IdType;
|
|
||||||
import org.hl7.fhir.dstu2016may.model.IntegerType;
|
|
||||||
import org.hl7.fhir.dstu2016may.model.Money;
|
|
||||||
import org.hl7.fhir.dstu2016may.model.OperationDefinition;
|
|
||||||
import org.hl7.fhir.dstu2016may.model.OperationDefinition.OperationParameterUse;
|
import org.hl7.fhir.dstu2016may.model.OperationDefinition.OperationParameterUse;
|
||||||
import org.hl7.fhir.dstu2016may.model.Parameters;
|
|
||||||
import org.hl7.fhir.dstu2016may.model.Patient;
|
|
||||||
import org.hl7.fhir.dstu2016may.model.StringType;
|
|
||||||
import org.hl7.fhir.dstu2016may.model.UnsignedIntType;
|
|
||||||
import org.hl7.fhir.instance.model.api.IBaseResource;
|
import org.hl7.fhir.instance.model.api.IBaseResource;
|
||||||
import org.junit.AfterClass;
|
import org.junit.*;
|
||||||
import org.junit.Before;
|
|
||||||
import org.junit.BeforeClass;
|
|
||||||
import org.junit.Test;
|
|
||||||
|
|
||||||
import ca.uhn.fhir.context.FhirContext;
|
import ca.uhn.fhir.context.FhirContext;
|
||||||
import ca.uhn.fhir.rest.annotation.IdParam;
|
import ca.uhn.fhir.rest.annotation.*;
|
||||||
import ca.uhn.fhir.rest.annotation.Operation;
|
import ca.uhn.fhir.rest.api.Constants;
|
||||||
import ca.uhn.fhir.rest.annotation.OperationParam;
|
import ca.uhn.fhir.rest.api.server.IBundleProvider;
|
||||||
import ca.uhn.fhir.rest.annotation.Read;
|
import ca.uhn.fhir.rest.client.api.IGenericClient;
|
||||||
import ca.uhn.fhir.rest.client.IGenericClient;
|
|
||||||
import ca.uhn.fhir.rest.client.interceptor.LoggingInterceptor;
|
import ca.uhn.fhir.rest.client.interceptor.LoggingInterceptor;
|
||||||
import ca.uhn.fhir.util.PortUtil;
|
import ca.uhn.fhir.util.PortUtil;
|
||||||
import ca.uhn.fhir.util.TestUtil;
|
import ca.uhn.fhir.util.TestUtil;
|
||||||
|
|
|
@ -27,31 +27,16 @@ import org.eclipse.jetty.server.Server;
|
||||||
import org.eclipse.jetty.servlet.ServletHandler;
|
import org.eclipse.jetty.servlet.ServletHandler;
|
||||||
import org.eclipse.jetty.servlet.ServletHolder;
|
import org.eclipse.jetty.servlet.ServletHolder;
|
||||||
import org.hl7.fhir.dstu2016may.hapi.rest.server.ServerConformanceProvider;
|
import org.hl7.fhir.dstu2016may.hapi.rest.server.ServerConformanceProvider;
|
||||||
import org.hl7.fhir.dstu2016may.model.Conformance;
|
import org.hl7.fhir.dstu2016may.model.*;
|
||||||
import org.hl7.fhir.dstu2016may.model.IdType;
|
|
||||||
import org.hl7.fhir.dstu2016may.model.OperationDefinition;
|
|
||||||
import org.hl7.fhir.dstu2016may.model.Parameters;
|
|
||||||
import org.hl7.fhir.dstu2016may.model.Patient;
|
|
||||||
import org.hl7.fhir.dstu2016may.model.StringType;
|
|
||||||
import org.hl7.fhir.instance.model.api.IBaseResource;
|
import org.hl7.fhir.instance.model.api.IBaseResource;
|
||||||
import org.junit.AfterClass;
|
import org.junit.*;
|
||||||
import org.junit.Before;
|
|
||||||
import org.junit.BeforeClass;
|
|
||||||
import org.junit.Test;
|
|
||||||
|
|
||||||
import ca.uhn.fhir.context.FhirContext;
|
import ca.uhn.fhir.context.FhirContext;
|
||||||
import ca.uhn.fhir.rest.annotation.Operation;
|
import ca.uhn.fhir.rest.annotation.Operation;
|
||||||
import ca.uhn.fhir.rest.annotation.OperationParam;
|
import ca.uhn.fhir.rest.annotation.OperationParam;
|
||||||
import ca.uhn.fhir.rest.param.StringAndListParam;
|
import ca.uhn.fhir.rest.api.Constants;
|
||||||
import ca.uhn.fhir.rest.param.StringOrListParam;
|
import ca.uhn.fhir.rest.param.*;
|
||||||
import ca.uhn.fhir.rest.param.StringParam;
|
import ca.uhn.fhir.util.*;
|
||||||
import ca.uhn.fhir.rest.param.TokenAndListParam;
|
|
||||||
import ca.uhn.fhir.rest.param.TokenOrListParam;
|
|
||||||
import ca.uhn.fhir.rest.param.TokenParam;
|
|
||||||
import ca.uhn.fhir.rest.param.TokenParamModifier;
|
|
||||||
import ca.uhn.fhir.util.PortUtil;
|
|
||||||
import ca.uhn.fhir.util.TestUtil;
|
|
||||||
import ca.uhn.fhir.util.UrlUtil;
|
|
||||||
|
|
||||||
public class OperationServerWithSearchParamTypesDstu2_1Test {
|
public class OperationServerWithSearchParamTypesDstu2_1Test {
|
||||||
private static CloseableHttpClient ourClient;
|
private static CloseableHttpClient ourClient;
|
||||||
|
|
|
@ -16,19 +16,13 @@ import org.apache.http.impl.conn.PoolingHttpClientConnectionManager;
|
||||||
import org.eclipse.jetty.server.Server;
|
import org.eclipse.jetty.server.Server;
|
||||||
import org.eclipse.jetty.servlet.ServletHandler;
|
import org.eclipse.jetty.servlet.ServletHandler;
|
||||||
import org.eclipse.jetty.servlet.ServletHolder;
|
import org.eclipse.jetty.servlet.ServletHolder;
|
||||||
import org.hl7.fhir.dstu2016may.model.IdType;
|
import org.hl7.fhir.dstu2016may.model.*;
|
||||||
import org.hl7.fhir.dstu2016may.model.OperationOutcome;
|
|
||||||
import org.hl7.fhir.dstu2016may.model.Patient;
|
|
||||||
import org.hl7.fhir.instance.model.api.IBaseResource;
|
import org.hl7.fhir.instance.model.api.IBaseResource;
|
||||||
import org.junit.AfterClass;
|
import org.junit.*;
|
||||||
import org.junit.Before;
|
|
||||||
import org.junit.BeforeClass;
|
|
||||||
import org.junit.Test;
|
|
||||||
|
|
||||||
import ca.uhn.fhir.context.FhirContext;
|
import ca.uhn.fhir.context.FhirContext;
|
||||||
import ca.uhn.fhir.rest.annotation.IdParam;
|
import ca.uhn.fhir.rest.annotation.*;
|
||||||
import ca.uhn.fhir.rest.annotation.Patch;
|
import ca.uhn.fhir.rest.api.Constants;
|
||||||
import ca.uhn.fhir.rest.annotation.ResourceParam;
|
|
||||||
import ca.uhn.fhir.rest.api.PatchTypeEnum;
|
import ca.uhn.fhir.rest.api.PatchTypeEnum;
|
||||||
import ca.uhn.fhir.util.PortUtil;
|
import ca.uhn.fhir.util.PortUtil;
|
||||||
import ca.uhn.fhir.util.TestUtil;
|
import ca.uhn.fhir.util.TestUtil;
|
||||||
|
|
|
@ -16,16 +16,13 @@ import org.apache.http.impl.conn.PoolingHttpClientConnectionManager;
|
||||||
import org.eclipse.jetty.server.Server;
|
import org.eclipse.jetty.server.Server;
|
||||||
import org.eclipse.jetty.servlet.ServletHandler;
|
import org.eclipse.jetty.servlet.ServletHandler;
|
||||||
import org.eclipse.jetty.servlet.ServletHolder;
|
import org.eclipse.jetty.servlet.ServletHolder;
|
||||||
import org.hl7.fhir.dstu2016may.model.DateType;
|
import org.hl7.fhir.dstu2016may.model.*;
|
||||||
import org.hl7.fhir.dstu2016may.model.IdType;
|
import org.junit.*;
|
||||||
import org.hl7.fhir.dstu2016may.model.Patient;
|
|
||||||
import org.junit.AfterClass;
|
|
||||||
import org.junit.BeforeClass;
|
|
||||||
import org.junit.Test;
|
|
||||||
|
|
||||||
import ca.uhn.fhir.context.FhirContext;
|
import ca.uhn.fhir.context.FhirContext;
|
||||||
import ca.uhn.fhir.rest.annotation.IdParam;
|
import ca.uhn.fhir.rest.annotation.IdParam;
|
||||||
import ca.uhn.fhir.rest.annotation.Read;
|
import ca.uhn.fhir.rest.annotation.Read;
|
||||||
|
import ca.uhn.fhir.rest.api.Constants;
|
||||||
import ca.uhn.fhir.rest.client.MyPatientWithExtensions;
|
import ca.uhn.fhir.rest.client.MyPatientWithExtensions;
|
||||||
import ca.uhn.fhir.util.PortUtil;
|
import ca.uhn.fhir.util.PortUtil;
|
||||||
import ca.uhn.fhir.util.TestUtil;
|
import ca.uhn.fhir.util.TestUtil;
|
||||||
|
|
|
@ -25,18 +25,13 @@ import org.eclipse.jetty.servlet.ServletHolder;
|
||||||
import org.hl7.fhir.dstu2016may.model.HumanName;
|
import org.hl7.fhir.dstu2016may.model.HumanName;
|
||||||
import org.hl7.fhir.dstu2016may.model.Patient;
|
import org.hl7.fhir.dstu2016may.model.Patient;
|
||||||
import org.hl7.fhir.instance.model.api.IBaseResource;
|
import org.hl7.fhir.instance.model.api.IBaseResource;
|
||||||
import org.junit.AfterClass;
|
import org.junit.*;
|
||||||
import org.junit.Before;
|
|
||||||
import org.junit.BeforeClass;
|
|
||||||
import org.junit.Test;
|
|
||||||
|
|
||||||
import com.google.common.collect.Lists;
|
import com.google.common.collect.Lists;
|
||||||
|
|
||||||
import ca.uhn.fhir.context.FhirContext;
|
import ca.uhn.fhir.context.FhirContext;
|
||||||
import ca.uhn.fhir.rest.annotation.OptionalParam;
|
import ca.uhn.fhir.rest.annotation.*;
|
||||||
import ca.uhn.fhir.rest.annotation.Search;
|
import ca.uhn.fhir.rest.api.*;
|
||||||
import ca.uhn.fhir.rest.annotation.Sort;
|
|
||||||
import ca.uhn.fhir.rest.api.SortSpec;
|
|
||||||
import ca.uhn.fhir.rest.param.StringAndListParam;
|
import ca.uhn.fhir.rest.param.StringAndListParam;
|
||||||
import ca.uhn.fhir.rest.server.interceptor.IServerInterceptor;
|
import ca.uhn.fhir.rest.server.interceptor.IServerInterceptor;
|
||||||
import ca.uhn.fhir.rest.server.interceptor.InterceptorAdapter;
|
import ca.uhn.fhir.rest.server.interceptor.InterceptorAdapter;
|
||||||
|
|
|
@ -14,11 +14,7 @@ import java.util.concurrent.TimeUnit;
|
||||||
|
|
||||||
import org.apache.commons.io.IOUtils;
|
import org.apache.commons.io.IOUtils;
|
||||||
import org.apache.http.HttpResponse;
|
import org.apache.http.HttpResponse;
|
||||||
import org.apache.http.client.methods.CloseableHttpResponse;
|
import org.apache.http.client.methods.*;
|
||||||
import org.apache.http.client.methods.HttpGet;
|
|
||||||
import org.apache.http.client.methods.HttpPost;
|
|
||||||
import org.apache.http.client.methods.HttpRequestBase;
|
|
||||||
import org.apache.http.client.methods.HttpTrace;
|
|
||||||
import org.apache.http.entity.ContentType;
|
import org.apache.http.entity.ContentType;
|
||||||
import org.apache.http.entity.StringEntity;
|
import org.apache.http.entity.StringEntity;
|
||||||
import org.apache.http.impl.client.CloseableHttpClient;
|
import org.apache.http.impl.client.CloseableHttpClient;
|
||||||
|
@ -27,23 +23,13 @@ import org.apache.http.impl.conn.PoolingHttpClientConnectionManager;
|
||||||
import org.eclipse.jetty.server.Server;
|
import org.eclipse.jetty.server.Server;
|
||||||
import org.eclipse.jetty.servlet.ServletHandler;
|
import org.eclipse.jetty.servlet.ServletHandler;
|
||||||
import org.eclipse.jetty.servlet.ServletHolder;
|
import org.eclipse.jetty.servlet.ServletHolder;
|
||||||
import org.hl7.fhir.dstu2016may.model.CodeType;
|
import org.hl7.fhir.dstu2016may.model.*;
|
||||||
import org.hl7.fhir.dstu2016may.model.Conformance;
|
|
||||||
import org.hl7.fhir.dstu2016may.model.DateType;
|
|
||||||
import org.hl7.fhir.dstu2016may.model.IdType;
|
|
||||||
import org.hl7.fhir.dstu2016may.model.OperationOutcome;
|
|
||||||
import org.hl7.fhir.dstu2016may.model.Patient;
|
|
||||||
import org.hl7.fhir.instance.model.api.IBaseResource;
|
import org.hl7.fhir.instance.model.api.IBaseResource;
|
||||||
import org.junit.AfterClass;
|
import org.junit.*;
|
||||||
import org.junit.BeforeClass;
|
|
||||||
import org.junit.Test;
|
|
||||||
|
|
||||||
import ca.uhn.fhir.context.FhirContext;
|
import ca.uhn.fhir.context.FhirContext;
|
||||||
import ca.uhn.fhir.rest.annotation.Create;
|
import ca.uhn.fhir.rest.annotation.*;
|
||||||
import ca.uhn.fhir.rest.annotation.IdParam;
|
import ca.uhn.fhir.rest.api.Constants;
|
||||||
import ca.uhn.fhir.rest.annotation.Read;
|
|
||||||
import ca.uhn.fhir.rest.annotation.ResourceParam;
|
|
||||||
import ca.uhn.fhir.rest.annotation.Search;
|
|
||||||
import ca.uhn.fhir.rest.api.MethodOutcome;
|
import ca.uhn.fhir.rest.api.MethodOutcome;
|
||||||
import ca.uhn.fhir.rest.client.MyPatientWithExtensions;
|
import ca.uhn.fhir.rest.client.MyPatientWithExtensions;
|
||||||
import ca.uhn.fhir.util.PortUtil;
|
import ca.uhn.fhir.util.PortUtil;
|
||||||
|
|
|
@ -20,19 +20,12 @@ import org.apache.http.impl.conn.PoolingHttpClientConnectionManager;
|
||||||
import org.eclipse.jetty.server.Server;
|
import org.eclipse.jetty.server.Server;
|
||||||
import org.eclipse.jetty.servlet.ServletHandler;
|
import org.eclipse.jetty.servlet.ServletHandler;
|
||||||
import org.eclipse.jetty.servlet.ServletHolder;
|
import org.eclipse.jetty.servlet.ServletHolder;
|
||||||
import org.hl7.fhir.dstu2016may.model.IdType;
|
import org.hl7.fhir.dstu2016may.model.*;
|
||||||
import org.hl7.fhir.dstu2016may.model.OperationOutcome;
|
import org.junit.*;
|
||||||
import org.hl7.fhir.dstu2016may.model.Patient;
|
|
||||||
import org.junit.AfterClass;
|
|
||||||
import org.junit.Before;
|
|
||||||
import org.junit.BeforeClass;
|
|
||||||
import org.junit.Test;
|
|
||||||
|
|
||||||
import ca.uhn.fhir.context.FhirContext;
|
import ca.uhn.fhir.context.FhirContext;
|
||||||
import ca.uhn.fhir.rest.annotation.ConditionalUrlParam;
|
import ca.uhn.fhir.rest.annotation.*;
|
||||||
import ca.uhn.fhir.rest.annotation.IdParam;
|
import ca.uhn.fhir.rest.api.Constants;
|
||||||
import ca.uhn.fhir.rest.annotation.ResourceParam;
|
|
||||||
import ca.uhn.fhir.rest.annotation.Update;
|
|
||||||
import ca.uhn.fhir.rest.api.MethodOutcome;
|
import ca.uhn.fhir.rest.api.MethodOutcome;
|
||||||
import ca.uhn.fhir.util.PortUtil;
|
import ca.uhn.fhir.util.PortUtil;
|
||||||
import ca.uhn.fhir.util.TestUtil;
|
import ca.uhn.fhir.util.TestUtil;
|
||||||
|
|
|
@ -18,24 +18,13 @@ import org.apache.http.impl.conn.PoolingHttpClientConnectionManager;
|
||||||
import org.eclipse.jetty.server.Server;
|
import org.eclipse.jetty.server.Server;
|
||||||
import org.eclipse.jetty.servlet.ServletHandler;
|
import org.eclipse.jetty.servlet.ServletHandler;
|
||||||
import org.eclipse.jetty.servlet.ServletHolder;
|
import org.eclipse.jetty.servlet.ServletHolder;
|
||||||
import org.hl7.fhir.dstu2016may.model.CodeType;
|
import org.hl7.fhir.dstu2016may.model.*;
|
||||||
import org.hl7.fhir.dstu2016may.model.IdType;
|
import org.junit.*;
|
||||||
import org.hl7.fhir.dstu2016may.model.OperationOutcome;
|
|
||||||
import org.hl7.fhir.dstu2016may.model.Organization;
|
|
||||||
import org.hl7.fhir.dstu2016may.model.Parameters;
|
|
||||||
import org.hl7.fhir.dstu2016may.model.Patient;
|
|
||||||
import org.hl7.fhir.dstu2016may.model.StringType;
|
|
||||||
import org.junit.AfterClass;
|
|
||||||
import org.junit.Before;
|
|
||||||
import org.junit.BeforeClass;
|
|
||||||
import org.junit.Test;
|
|
||||||
|
|
||||||
import ca.uhn.fhir.context.FhirContext;
|
import ca.uhn.fhir.context.FhirContext;
|
||||||
import ca.uhn.fhir.rest.annotation.IdParam;
|
import ca.uhn.fhir.rest.annotation.*;
|
||||||
import ca.uhn.fhir.rest.annotation.ResourceParam;
|
import ca.uhn.fhir.rest.api.*;
|
||||||
import ca.uhn.fhir.rest.annotation.Validate;
|
import ca.uhn.fhir.rest.api.Constants;
|
||||||
import ca.uhn.fhir.rest.api.MethodOutcome;
|
|
||||||
import ca.uhn.fhir.rest.api.ValidationModeEnum;
|
|
||||||
import ca.uhn.fhir.util.PortUtil;
|
import ca.uhn.fhir.util.PortUtil;
|
||||||
import ca.uhn.fhir.util.TestUtil;
|
import ca.uhn.fhir.util.TestUtil;
|
||||||
|
|
||||||
|
|
|
@ -20,12 +20,21 @@
|
||||||
<version>${project.version}</version>
|
<version>${project.version}</version>
|
||||||
</dependency>
|
</dependency>
|
||||||
|
|
||||||
|
<!--
|
||||||
|
Test dependencies on other optional parts of HAPI
|
||||||
|
-->
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>ca.uhn.hapi.fhir</groupId>
|
<groupId>ca.uhn.hapi.fhir</groupId>
|
||||||
<artifactId>hapi-fhir-validation-resources-dstu2</artifactId>
|
<artifactId>hapi-fhir-validation-resources-dstu2</artifactId>
|
||||||
<version>${project.version}</version>
|
<version>${project.version}</version>
|
||||||
<scope>test</scope>
|
<scope>test</scope>
|
||||||
</dependency>
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>ca.uhn.hapi.fhir</groupId>
|
||||||
|
<artifactId>hapi-fhir-server</artifactId>
|
||||||
|
<version>${project.version}</version>
|
||||||
|
<scope>test</scope>
|
||||||
|
</dependency>
|
||||||
|
|
||||||
<!-- The JPA project uses a newer API but we'll try to hold to this version as much as possible. See #283. -->
|
<!-- The JPA project uses a newer API but we'll try to hold to this version as much as possible. See #283. -->
|
||||||
<dependency>
|
<dependency>
|
||||||
|
|
|
@ -20,23 +20,41 @@
|
||||||
<artifactId>hapi-fhir-base</artifactId>
|
<artifactId>hapi-fhir-base</artifactId>
|
||||||
<version>${project.version}</version>
|
<version>${project.version}</version>
|
||||||
</dependency>
|
</dependency>
|
||||||
|
|
||||||
|
<!--
|
||||||
|
Test dependencies on other optional parts of HAPI
|
||||||
|
-->
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>ca.uhn.hapi.fhir</groupId>
|
<groupId>ca.uhn.hapi.fhir</groupId>
|
||||||
<artifactId>hapi-fhir-validation-resources-dstu3</artifactId>
|
<artifactId>hapi-fhir-validation-resources-dstu3</artifactId>
|
||||||
<version>${project.version}</version>
|
<version>${project.version}</version>
|
||||||
<scope>test</scope>
|
<scope>test</scope>
|
||||||
</dependency>
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>ca.uhn.hapi.fhir</groupId>
|
||||||
|
<artifactId>hapi-fhir-client</artifactId>
|
||||||
|
<version>${project.version}</version>
|
||||||
|
<scope>test</scope>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>ca.uhn.hapi.fhir</groupId>
|
||||||
|
<artifactId>hapi-fhir-server</artifactId>
|
||||||
|
<version>${project.version}</version>
|
||||||
|
<scope>test</scope>
|
||||||
|
</dependency>
|
||||||
|
|
||||||
<!--
|
<!--
|
||||||
The JPA project uses a newer API but we'll try to hold to this version
|
The JPA project uses a newer API but we'll try to hold to this version
|
||||||
as much as possible. See #283.
|
as much as possible. See #283.
|
||||||
-->
|
-->
|
||||||
|
<!--
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>javax.servlet</groupId>
|
<groupId>javax.servlet</groupId>
|
||||||
<artifactId>servlet-api</artifactId>
|
<artifactId>servlet-api</artifactId>
|
||||||
<version>2.5</version>
|
<version>2.5</version>
|
||||||
<scope>provided</scope>
|
<scope>provided</scope>
|
||||||
</dependency>
|
</dependency>
|
||||||
|
-->
|
||||||
|
|
||||||
<!--
|
<!--
|
||||||
Android includes an old version of commons-codec, so
|
Android includes an old version of commons-codec, so
|
||||||
|
|
|
@ -10,7 +10,7 @@ package org.hl7.fhir.dstu3.hapi.ctx;
|
||||||
* you may not use this file except in compliance with the License.
|
* you may not use this file except in compliance with the License.
|
||||||
* You may obtain a copy of the License at
|
* You may obtain a copy of the License at
|
||||||
*
|
*
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
*
|
*
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
@ -27,123 +27,103 @@ import java.util.List;
|
||||||
import org.apache.commons.lang3.StringUtils;
|
import org.apache.commons.lang3.StringUtils;
|
||||||
import org.hl7.fhir.dstu3.hapi.fluentpath.FluentPathDstu3;
|
import org.hl7.fhir.dstu3.hapi.fluentpath.FluentPathDstu3;
|
||||||
import org.hl7.fhir.dstu3.hapi.rest.server.Dstu3BundleFactory;
|
import org.hl7.fhir.dstu3.hapi.rest.server.Dstu3BundleFactory;
|
||||||
import org.hl7.fhir.dstu3.hapi.rest.server.ServerCapabilityStatementProvider;
|
|
||||||
import org.hl7.fhir.dstu3.hapi.rest.server.ServerProfileProvider;
|
|
||||||
import org.hl7.fhir.dstu3.hapi.validation.DefaultProfileValidationSupport;
|
import org.hl7.fhir.dstu3.hapi.validation.DefaultProfileValidationSupport;
|
||||||
import org.hl7.fhir.dstu3.model.Coding;
|
import org.hl7.fhir.dstu3.model.*;
|
||||||
import org.hl7.fhir.dstu3.model.Constants;
|
import org.hl7.fhir.instance.model.api.*;
|
||||||
import org.hl7.fhir.dstu3.model.IdType;
|
|
||||||
import org.hl7.fhir.dstu3.model.Reference;
|
|
||||||
import org.hl7.fhir.dstu3.model.Resource;
|
|
||||||
import org.hl7.fhir.dstu3.model.StructureDefinition;
|
|
||||||
import org.hl7.fhir.instance.model.api.IBaseCoding;
|
|
||||||
import org.hl7.fhir.instance.model.api.IBaseReference;
|
|
||||||
import org.hl7.fhir.instance.model.api.IBaseResource;
|
|
||||||
import org.hl7.fhir.instance.model.api.IIdType;
|
|
||||||
import org.hl7.fhir.instance.model.api.IPrimitiveType;
|
|
||||||
|
|
||||||
import ca.uhn.fhir.context.ConfigurationException;
|
import ca.uhn.fhir.context.*;
|
||||||
import ca.uhn.fhir.context.FhirContext;
|
|
||||||
import ca.uhn.fhir.context.FhirVersionEnum;
|
|
||||||
import ca.uhn.fhir.context.RuntimeResourceDefinition;
|
|
||||||
import ca.uhn.fhir.context.support.IContextValidationSupport;
|
import ca.uhn.fhir.context.support.IContextValidationSupport;
|
||||||
import ca.uhn.fhir.fluentpath.IFluentPath;
|
import ca.uhn.fhir.fluentpath.IFluentPath;
|
||||||
import ca.uhn.fhir.model.api.IFhirVersion;
|
import ca.uhn.fhir.model.api.IFhirVersion;
|
||||||
import ca.uhn.fhir.model.primitive.IdDt;
|
import ca.uhn.fhir.model.primitive.IdDt;
|
||||||
import ca.uhn.fhir.rest.server.IResourceProvider;
|
import ca.uhn.fhir.rest.api.IVersionSpecificBundleFactory;
|
||||||
import ca.uhn.fhir.rest.server.IVersionSpecificBundleFactory;
|
import ca.uhn.fhir.util.ReflectionUtil;
|
||||||
import ca.uhn.fhir.rest.server.RestfulServer;
|
|
||||||
|
|
||||||
public class FhirDstu3 implements IFhirVersion {
|
public class FhirDstu3 implements IFhirVersion {
|
||||||
|
|
||||||
private String myId;
|
private String myId;
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public IFluentPath createFluentPathExecutor(FhirContext theFhirContext) {
|
public IFluentPath createFluentPathExecutor(FhirContext theFhirContext) {
|
||||||
return new FluentPathDstu3(theFhirContext);
|
return new FluentPathDstu3(theFhirContext);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public ServerCapabilityStatementProvider createServerConformanceProvider(RestfulServer theServer) {
|
public IContextValidationSupport<?, ?, ?, ?, ?, ?> createValidationSupport() {
|
||||||
return new ServerCapabilityStatementProvider(theServer);
|
return new DefaultProfileValidationSupport();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public IResourceProvider createServerProfilesProvider(RestfulServer theRestfulServer) {
|
public IBaseResource generateProfile(RuntimeResourceDefinition theRuntimeResourceDefinition, String theServerBase) {
|
||||||
return new ServerProfileProvider(theRestfulServer);
|
StructureDefinition retVal = new StructureDefinition();
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
RuntimeResourceDefinition def = theRuntimeResourceDefinition;
|
||||||
public IContextValidationSupport<?, ?, ?, ?, ?, ?> createValidationSupport() {
|
|
||||||
return new DefaultProfileValidationSupport();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
myId = def.getId();
|
||||||
public IBaseResource generateProfile(RuntimeResourceDefinition theRuntimeResourceDefinition, String theServerBase) {
|
if (StringUtils.isBlank(myId)) {
|
||||||
StructureDefinition retVal = new StructureDefinition();
|
myId = theRuntimeResourceDefinition.getName().toLowerCase();
|
||||||
|
}
|
||||||
|
|
||||||
RuntimeResourceDefinition def = theRuntimeResourceDefinition;
|
retVal.setId(new IdDt(myId));
|
||||||
|
return retVal;
|
||||||
|
}
|
||||||
|
|
||||||
myId = def.getId();
|
@SuppressWarnings("rawtypes")
|
||||||
if (StringUtils.isBlank(myId)) {
|
@Override
|
||||||
myId = theRuntimeResourceDefinition.getName().toLowerCase();
|
public Class<List> getContainedType() {
|
||||||
}
|
return List.class;
|
||||||
|
}
|
||||||
|
|
||||||
retVal.setId(new IdDt(myId));
|
@Override
|
||||||
return retVal;
|
public InputStream getFhirVersionPropertiesFile() {
|
||||||
}
|
InputStream str = FhirDstu3.class.getResourceAsStream("/org/hl7/fhir/dstu3/model/fhirversion.properties");
|
||||||
|
if (str == null) {
|
||||||
|
str = FhirDstu3.class.getResourceAsStream("/org/hl7/fhir/dstu3/model/fhirversion.properties");
|
||||||
|
}
|
||||||
|
if (str == null) {
|
||||||
|
throw new ConfigurationException("Can not find model property file on classpath: " + "/ca/uhn/fhir/model/dstu3/fhirversion.properties");
|
||||||
|
}
|
||||||
|
return str;
|
||||||
|
}
|
||||||
|
|
||||||
@SuppressWarnings("rawtypes")
|
@Override
|
||||||
@Override
|
public IPrimitiveType<Date> getLastUpdated(IBaseResource theResource) {
|
||||||
public Class<List> getContainedType() {
|
return ((Resource) theResource).getMeta().getLastUpdatedElement();
|
||||||
return List.class;
|
}
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public InputStream getFhirVersionPropertiesFile() {
|
public String getPathToSchemaDefinitions() {
|
||||||
InputStream str = FhirDstu3.class.getResourceAsStream("/org/hl7/fhir/dstu3/model/fhirversion.properties");
|
return "/org/hl7/fhir/instance/model/dstu3/schema";
|
||||||
if (str == null) {
|
}
|
||||||
str = FhirDstu3.class.getResourceAsStream("/org/hl7/fhir/dstu3/model/fhirversion.properties");
|
|
||||||
}
|
|
||||||
if (str == null) {
|
|
||||||
throw new ConfigurationException("Can not find model property file on classpath: " + "/ca/uhn/fhir/model/dstu3/fhirversion.properties");
|
|
||||||
}
|
|
||||||
return str;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public IPrimitiveType<Date> getLastUpdated(IBaseResource theResource) {
|
public Class<? extends IBaseReference> getResourceReferenceType() {
|
||||||
return ((Resource) theResource).getMeta().getLastUpdatedElement();
|
return Reference.class;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
public String getPathToSchemaDefinitions() {
|
|
||||||
return "/org/hl7/fhir/instance/model/dstu3/schema";
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Class<? extends IBaseReference> getResourceReferenceType() {
|
public Object getServerVersion() {
|
||||||
return Reference.class;
|
return ReflectionUtil.newInstanceOfFhirServerType("org.hl7.fhir.dstu3.hapi.ctx.FhirServerDstu3");
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public FhirVersionEnum getVersion() {
|
public FhirVersionEnum getVersion() {
|
||||||
return FhirVersionEnum.DSTU3;
|
return FhirVersionEnum.DSTU3;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public IVersionSpecificBundleFactory newBundleFactory(FhirContext theContext) {
|
public IVersionSpecificBundleFactory newBundleFactory(FhirContext theContext) {
|
||||||
return new Dstu3BundleFactory(theContext);
|
return new Dstu3BundleFactory(theContext);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public IBaseCoding newCodingDt() {
|
public IBaseCoding newCodingDt() {
|
||||||
return new Coding();
|
return new Coding();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public IIdType newIdType() {
|
public IIdType newIdType() {
|
||||||
return new IdType();
|
return new IdType();
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,21 @@
|
||||||
|
package org.hl7.fhir.dstu3.hapi.ctx;
|
||||||
|
|
||||||
|
import org.hl7.fhir.dstu3.hapi.rest.server.ServerCapabilityStatementProvider;
|
||||||
|
import org.hl7.fhir.dstu3.hapi.rest.server.ServerProfileProvider;
|
||||||
|
|
||||||
|
import ca.uhn.fhir.rest.api.server.IFhirVersionServer;
|
||||||
|
import ca.uhn.fhir.rest.server.IResourceProvider;
|
||||||
|
import ca.uhn.fhir.rest.server.RestfulServer;
|
||||||
|
|
||||||
|
public class FhirServerDstu3 implements IFhirVersionServer {
|
||||||
|
@Override
|
||||||
|
public ServerCapabilityStatementProvider createServerConformanceProvider(RestfulServer theServer) {
|
||||||
|
return new ServerCapabilityStatementProvider(theServer);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public IResourceProvider createServerProfilesProvider(RestfulServer theRestfulServer) {
|
||||||
|
return new ServerProfileProvider(theRestfulServer);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -1,6 +1,5 @@
|
||||||
package org.hl7.fhir.dstu3.hapi.rest.server;
|
package org.hl7.fhir.dstu3.hapi.rest.server;
|
||||||
|
|
||||||
import static org.apache.commons.lang3.StringUtils.isBlank;
|
|
||||||
/*
|
/*
|
||||||
* #%L
|
* #%L
|
||||||
* HAPI FHIR Structures - DSTU2 (FHIR v1.0.0)
|
* HAPI FHIR Structures - DSTU2 (FHIR v1.0.0)
|
||||||
|
@ -24,24 +23,17 @@ import static org.apache.commons.lang3.StringUtils.isNotBlank;
|
||||||
|
|
||||||
import java.util.*;
|
import java.util.*;
|
||||||
|
|
||||||
import org.apache.commons.lang3.Validate;
|
import org.hl7.fhir.dstu3.model.*;
|
||||||
import org.hl7.fhir.dstu3.model.Bundle;
|
import org.hl7.fhir.dstu3.model.Bundle.*;
|
||||||
import org.hl7.fhir.dstu3.model.Bundle.BundleEntryComponent;
|
|
||||||
import org.hl7.fhir.dstu3.model.Bundle.BundleLinkComponent;
|
|
||||||
import org.hl7.fhir.dstu3.model.Bundle.HTTPVerb;
|
|
||||||
import org.hl7.fhir.dstu3.model.Bundle.SearchEntryMode;
|
|
||||||
import org.hl7.fhir.dstu3.model.DomainResource;
|
|
||||||
import org.hl7.fhir.dstu3.model.IdType;
|
|
||||||
import org.hl7.fhir.dstu3.model.Resource;
|
|
||||||
import org.hl7.fhir.instance.model.api.*;
|
import org.hl7.fhir.instance.model.api.*;
|
||||||
|
|
||||||
import ca.uhn.fhir.context.FhirContext;
|
import ca.uhn.fhir.context.FhirContext;
|
||||||
|
import ca.uhn.fhir.context.api.BundleInclusionRule;
|
||||||
import ca.uhn.fhir.model.api.Include;
|
import ca.uhn.fhir.model.api.Include;
|
||||||
import ca.uhn.fhir.model.api.ResourceMetadataKeyEnum;
|
import ca.uhn.fhir.model.api.ResourceMetadataKeyEnum;
|
||||||
import ca.uhn.fhir.model.base.resource.BaseOperationOutcome;
|
|
||||||
import ca.uhn.fhir.model.valueset.BundleTypeEnum;
|
import ca.uhn.fhir.model.valueset.BundleTypeEnum;
|
||||||
import ca.uhn.fhir.rest.server.*;
|
import ca.uhn.fhir.rest.api.Constants;
|
||||||
import ca.uhn.fhir.rest.server.exceptions.InternalErrorException;
|
import ca.uhn.fhir.rest.api.IVersionSpecificBundleFactory;
|
||||||
import ca.uhn.fhir.util.ResourceReferenceInfo;
|
import ca.uhn.fhir.util.ResourceReferenceInfo;
|
||||||
|
|
||||||
public class Dstu3BundleFactory implements IVersionSpecificBundleFactory {
|
public class Dstu3BundleFactory implements IVersionSpecificBundleFactory {
|
||||||
|
@ -251,7 +243,7 @@ public class Dstu3BundleFactory implements IVersionSpecificBundleFactory {
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void addRootPropertiesToBundle(String theAuthor, String theServerBase, String theCompleteUrl, Integer theTotalResults, BundleTypeEnum theBundleType, IPrimitiveType<Date> theLastUpdated) {
|
public void addRootPropertiesToBundle(String theAuthor, String theServerBase, String theLinkSelf, String theLinkPrev, String theLinkNext, Integer theTotalResults, BundleTypeEnum theBundleType, IPrimitiveType<Date> theLastUpdated) {
|
||||||
|
|
||||||
myBase = theServerBase;
|
myBase = theServerBase;
|
||||||
|
|
||||||
|
@ -263,8 +255,14 @@ public class Dstu3BundleFactory implements IVersionSpecificBundleFactory {
|
||||||
myBundle.getMeta().getLastUpdatedElement().setValueAsString(theLastUpdated.getValueAsString());
|
myBundle.getMeta().getLastUpdatedElement().setValueAsString(theLastUpdated.getValueAsString());
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!hasLink(Constants.LINK_SELF, myBundle) && isNotBlank(theCompleteUrl)) {
|
if (!hasLink(Constants.LINK_SELF, myBundle) && isNotBlank(theLinkSelf)) {
|
||||||
myBundle.addLink().setRelation("self").setUrl(theCompleteUrl);
|
myBundle.addLink().setRelation(Constants.LINK_SELF).setUrl(theLinkSelf);
|
||||||
|
}
|
||||||
|
if (!hasLink(Constants.LINK_NEXT, myBundle) && isNotBlank(theLinkNext)) {
|
||||||
|
myBundle.addLink().setRelation(Constants.LINK_NEXT).setUrl(theLinkNext);
|
||||||
|
}
|
||||||
|
if (!hasLink(Constants.LINK_PREVIOUS, myBundle) && isNotBlank(theLinkPrev)) {
|
||||||
|
myBundle.addLink().setRelation(Constants.LINK_PREVIOUS).setUrl(theLinkPrev);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (myBundle.getTypeElement().isEmpty() && theBundleType != null) {
|
if (myBundle.getTypeElement().isEmpty() && theBundleType != null) {
|
||||||
|
@ -295,84 +293,6 @@ public class Dstu3BundleFactory implements IVersionSpecificBundleFactory {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
public void initializeBundleFromBundleProvider(IRestfulServer<?> theServer, IBundleProvider theResult, EncodingEnum theResponseEncoding, String theServerBase, String theCompleteUrl,
|
|
||||||
boolean thePrettyPrint, int theOffset, Integer theLimit, String theSearchId, BundleTypeEnum theBundleType, Set<Include> theIncludes) {
|
|
||||||
myBase = theServerBase;
|
|
||||||
|
|
||||||
int numToReturn;
|
|
||||||
String searchId = null;
|
|
||||||
List<IBaseResource> resourceList;
|
|
||||||
Integer numTotalResults = theResult.size();
|
|
||||||
if (theServer.getPagingProvider() == null) {
|
|
||||||
numToReturn = numTotalResults;
|
|
||||||
if (numToReturn > 0) {
|
|
||||||
resourceList = theResult.getResources(0, numToReturn);
|
|
||||||
} else {
|
|
||||||
resourceList = Collections.emptyList();
|
|
||||||
}
|
|
||||||
RestfulServerUtils.validateResourceListNotNull(resourceList);
|
|
||||||
|
|
||||||
} else {
|
|
||||||
IPagingProvider pagingProvider = theServer.getPagingProvider();
|
|
||||||
if (theLimit == null || theLimit.equals(Integer.valueOf(0))) {
|
|
||||||
numToReturn = pagingProvider.getDefaultPageSize();
|
|
||||||
} else {
|
|
||||||
numToReturn = Math.min(pagingProvider.getMaximumPageSize(), theLimit);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (numTotalResults != null) {
|
|
||||||
numToReturn = Math.min(numToReturn, numTotalResults - theOffset);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (numToReturn > 0) {
|
|
||||||
resourceList = theResult.getResources(theOffset, numToReturn + theOffset);
|
|
||||||
} else {
|
|
||||||
resourceList = Collections.emptyList();
|
|
||||||
}
|
|
||||||
RestfulServerUtils.validateResourceListNotNull(resourceList);
|
|
||||||
|
|
||||||
if (theSearchId != null) {
|
|
||||||
searchId = theSearchId;
|
|
||||||
} else {
|
|
||||||
if (numTotalResults == null || numTotalResults > numToReturn) {
|
|
||||||
searchId = pagingProvider.storeResultList(theResult);
|
|
||||||
if (isBlank(searchId)) {
|
|
||||||
ourLog.info("Found {} results but paging provider did not provide an ID to use for paging", numTotalResults);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
for (IBaseResource next : resourceList) {
|
|
||||||
if (next.getIdElement() == null || next.getIdElement().isEmpty()) {
|
|
||||||
if (!(next instanceof BaseOperationOutcome)) {
|
|
||||||
throw new InternalErrorException("Server method returned resource of type[" + next.getClass().getSimpleName() + "] with no ID specified (IResource#setId(IdDt) must be called)");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
addResourcesToBundle(new ArrayList<IBaseResource>(resourceList), theBundleType, theServerBase, theServer.getBundleInclusionRule(), theIncludes);
|
|
||||||
addRootPropertiesToBundle(null, theServerBase, theCompleteUrl, theResult.size(), theBundleType, theResult.getPublished());
|
|
||||||
|
|
||||||
if (theServer.getPagingProvider() != null) {
|
|
||||||
int limit;
|
|
||||||
limit = theLimit != null ? theLimit : theServer.getPagingProvider().getDefaultPageSize();
|
|
||||||
limit = Math.min(limit, theServer.getPagingProvider().getMaximumPageSize());
|
|
||||||
|
|
||||||
if (searchId != null) {
|
|
||||||
if (numTotalResults == null || theOffset + numToReturn < numTotalResults) {
|
|
||||||
myBundle.addLink().setRelation(Constants.LINK_NEXT)
|
|
||||||
.setUrl(RestfulServerUtils.createPagingLink(theIncludes, theServerBase, searchId, theOffset + numToReturn, numToReturn, theResponseEncoding, thePrettyPrint, theBundleType));
|
|
||||||
}
|
|
||||||
if (theOffset > 0) {
|
|
||||||
int start = Math.max(0, theOffset - limit);
|
|
||||||
myBundle.addLink().setRelation(Constants.LINK_PREVIOUS)
|
|
||||||
.setUrl(RestfulServerUtils.createPagingLink(theIncludes, theServerBase, searchId, start, limit, theResponseEncoding, thePrettyPrint, theBundleType));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void initializeBundleFromResourceList(String theAuthor, List<? extends IBaseResource> theResources, String theServerBase, String theCompleteUrl, int theTotalResults,
|
public void initializeBundleFromResourceList(String theAuthor, List<? extends IBaseResource> theResources, String theServerBase, String theCompleteUrl, int theTotalResults,
|
||||||
|
|
|
@ -22,69 +22,29 @@ import static org.apache.commons.lang3.StringUtils.isBlank;
|
||||||
*/
|
*/
|
||||||
import static org.apache.commons.lang3.StringUtils.isNotBlank;
|
import static org.apache.commons.lang3.StringUtils.isNotBlank;
|
||||||
|
|
||||||
import java.util.ArrayList;
|
import java.util.*;
|
||||||
import java.util.Collections;
|
|
||||||
import java.util.Comparator;
|
|
||||||
import java.util.HashMap;
|
|
||||||
import java.util.HashSet;
|
|
||||||
import java.util.IdentityHashMap;
|
|
||||||
import java.util.List;
|
|
||||||
import java.util.Map;
|
|
||||||
import java.util.Map.Entry;
|
import java.util.Map.Entry;
|
||||||
import java.util.Set;
|
|
||||||
import java.util.TreeMap;
|
|
||||||
import java.util.TreeSet;
|
|
||||||
|
|
||||||
import javax.servlet.ServletContext;
|
import javax.servlet.ServletContext;
|
||||||
import javax.servlet.http.HttpServletRequest;
|
import javax.servlet.http.HttpServletRequest;
|
||||||
|
|
||||||
import org.apache.commons.lang3.StringUtils;
|
import org.apache.commons.lang3.StringUtils;
|
||||||
import org.hl7.fhir.dstu3.model.CapabilityStatement;
|
import org.hl7.fhir.dstu3.model.*;
|
||||||
import org.hl7.fhir.dstu3.model.CapabilityStatement.CapabilityStatementKind;
|
import org.hl7.fhir.dstu3.model.CapabilityStatement.*;
|
||||||
import org.hl7.fhir.dstu3.model.CapabilityStatement.CapabilityStatementRestComponent;
|
|
||||||
import org.hl7.fhir.dstu3.model.CapabilityStatement.CapabilityStatementRestResourceComponent;
|
|
||||||
import org.hl7.fhir.dstu3.model.CapabilityStatement.CapabilityStatementRestResourceSearchParamComponent;
|
|
||||||
import org.hl7.fhir.dstu3.model.CapabilityStatement.ConditionalDeleteStatus;
|
|
||||||
import org.hl7.fhir.dstu3.model.CapabilityStatement.ResourceInteractionComponent;
|
|
||||||
import org.hl7.fhir.dstu3.model.CapabilityStatement.RestfulCapabilityMode;
|
|
||||||
import org.hl7.fhir.dstu3.model.CapabilityStatement.SystemRestfulInteraction;
|
|
||||||
import org.hl7.fhir.dstu3.model.CapabilityStatement.TypeRestfulInteraction;
|
|
||||||
import org.hl7.fhir.dstu3.model.CapabilityStatement.UnknownContentCode;
|
|
||||||
import org.hl7.fhir.dstu3.model.DateTimeType;
|
|
||||||
import org.hl7.fhir.dstu3.model.Enumerations.PublicationStatus;
|
import org.hl7.fhir.dstu3.model.Enumerations.PublicationStatus;
|
||||||
import org.hl7.fhir.dstu3.model.IdType;
|
import org.hl7.fhir.dstu3.model.OperationDefinition.*;
|
||||||
import org.hl7.fhir.dstu3.model.OperationDefinition;
|
|
||||||
import org.hl7.fhir.dstu3.model.OperationDefinition.OperationDefinitionParameterComponent;
|
|
||||||
import org.hl7.fhir.dstu3.model.OperationDefinition.OperationKind;
|
|
||||||
import org.hl7.fhir.dstu3.model.OperationDefinition.OperationParameterUse;
|
|
||||||
import org.hl7.fhir.dstu3.model.Reference;
|
|
||||||
import org.hl7.fhir.dstu3.model.ResourceType;
|
|
||||||
import org.hl7.fhir.exceptions.FHIRException;
|
import org.hl7.fhir.exceptions.FHIRException;
|
||||||
import org.hl7.fhir.instance.model.api.IBaseResource;
|
import org.hl7.fhir.instance.model.api.IBaseResource;
|
||||||
|
|
||||||
import ca.uhn.fhir.context.FhirVersionEnum;
|
import ca.uhn.fhir.context.*;
|
||||||
import ca.uhn.fhir.context.RuntimeResourceDefinition;
|
|
||||||
import ca.uhn.fhir.context.RuntimeSearchParam;
|
|
||||||
import ca.uhn.fhir.parser.DataFormatException;
|
import ca.uhn.fhir.parser.DataFormatException;
|
||||||
import ca.uhn.fhir.rest.annotation.IdParam;
|
import ca.uhn.fhir.rest.annotation.*;
|
||||||
import ca.uhn.fhir.rest.annotation.Initialize;
|
import ca.uhn.fhir.rest.api.Constants;
|
||||||
import ca.uhn.fhir.rest.annotation.Metadata;
|
import ca.uhn.fhir.rest.server.*;
|
||||||
import ca.uhn.fhir.rest.annotation.Read;
|
|
||||||
import ca.uhn.fhir.rest.method.BaseMethodBinding;
|
|
||||||
import ca.uhn.fhir.rest.method.DynamicSearchMethodBinding;
|
|
||||||
import ca.uhn.fhir.rest.method.IParameter;
|
|
||||||
import ca.uhn.fhir.rest.method.OperationMethodBinding;
|
|
||||||
import ca.uhn.fhir.rest.method.OperationMethodBinding.ReturnType;
|
|
||||||
import ca.uhn.fhir.rest.method.OperationParameter;
|
|
||||||
import ca.uhn.fhir.rest.method.RestSearchParameterTypeEnum;
|
|
||||||
import ca.uhn.fhir.rest.method.SearchMethodBinding;
|
|
||||||
import ca.uhn.fhir.rest.method.SearchParameter;
|
|
||||||
import ca.uhn.fhir.rest.server.Constants;
|
|
||||||
import ca.uhn.fhir.rest.server.IServerConformanceProvider;
|
|
||||||
import ca.uhn.fhir.rest.server.ResourceBinding;
|
|
||||||
import ca.uhn.fhir.rest.server.RestfulServer;
|
|
||||||
import ca.uhn.fhir.rest.server.RestulfulServerConfiguration;
|
|
||||||
import ca.uhn.fhir.rest.server.exceptions.ResourceNotFoundException;
|
import ca.uhn.fhir.rest.server.exceptions.ResourceNotFoundException;
|
||||||
|
import ca.uhn.fhir.rest.server.method.*;
|
||||||
|
import ca.uhn.fhir.rest.server.method.OperationMethodBinding.ReturnType;
|
||||||
|
import ca.uhn.fhir.rest.server.method.SearchParameter;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Server FHIR Provider which serves the conformance statement for a RESTful server implementation
|
* Server FHIR Provider which serves the conformance statement for a RESTful server implementation
|
||||||
|
|
|
@ -1,17 +1,13 @@
|
||||||
package org.hl7.fhir.dstu3.hapi.validation;
|
package org.hl7.fhir.dstu3.hapi.validation;
|
||||||
|
|
||||||
import java.io.StringReader;
|
import java.io.StringReader;
|
||||||
import java.util.ArrayList;
|
import java.util.*;
|
||||||
import java.util.Collections;
|
|
||||||
import java.util.List;
|
|
||||||
|
|
||||||
import javax.xml.parsers.DocumentBuilder;
|
import javax.xml.parsers.DocumentBuilder;
|
||||||
import javax.xml.parsers.DocumentBuilderFactory;
|
import javax.xml.parsers.DocumentBuilderFactory;
|
||||||
|
|
||||||
import org.apache.commons.lang3.Validate;
|
import org.apache.commons.lang3.Validate;
|
||||||
import org.hl7.fhir.dstu3.model.Base;
|
import org.hl7.fhir.dstu3.model.*;
|
||||||
import org.hl7.fhir.dstu3.model.StructureDefinition;
|
|
||||||
import org.hl7.fhir.dstu3.model.TypeDetails;
|
|
||||||
import org.hl7.fhir.dstu3.utils.FHIRPathEngine.IEvaluationContext;
|
import org.hl7.fhir.dstu3.utils.FHIRPathEngine.IEvaluationContext;
|
||||||
import org.hl7.fhir.dstu3.utils.IResourceValidator.BestPracticeWarningLevel;
|
import org.hl7.fhir.dstu3.utils.IResourceValidator.BestPracticeWarningLevel;
|
||||||
import org.hl7.fhir.dstu3.utils.IResourceValidator.IdStatus;
|
import org.hl7.fhir.dstu3.utils.IResourceValidator.IdStatus;
|
||||||
|
@ -24,13 +20,11 @@ import org.w3c.dom.Element;
|
||||||
import org.w3c.dom.NodeList;
|
import org.w3c.dom.NodeList;
|
||||||
import org.xml.sax.InputSource;
|
import org.xml.sax.InputSource;
|
||||||
|
|
||||||
import com.google.gson.Gson;
|
import com.google.gson.*;
|
||||||
import com.google.gson.GsonBuilder;
|
|
||||||
import com.google.gson.JsonObject;
|
|
||||||
|
|
||||||
import ca.uhn.fhir.context.ConfigurationException;
|
import ca.uhn.fhir.context.ConfigurationException;
|
||||||
import ca.uhn.fhir.context.FhirContext;
|
import ca.uhn.fhir.context.FhirContext;
|
||||||
import ca.uhn.fhir.rest.server.EncodingEnum;
|
import ca.uhn.fhir.rest.api.EncodingEnum;
|
||||||
import ca.uhn.fhir.rest.server.exceptions.InternalErrorException;
|
import ca.uhn.fhir.rest.server.exceptions.InternalErrorException;
|
||||||
import ca.uhn.fhir.validation.IValidationContext;
|
import ca.uhn.fhir.validation.IValidationContext;
|
||||||
import ca.uhn.fhir.validation.IValidatorModule;
|
import ca.uhn.fhir.validation.IValidatorModule;
|
||||||
|
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue