More cleanup of legacy code

This commit is contained in:
James Agnew 2017-07-30 17:10:01 -04:00
parent 9ae7295705
commit defea69aa3
51 changed files with 2711 additions and 3185 deletions

View File

@ -1,5 +1,6 @@
package ca.uhn.fhir.rest.client.api; package ca.uhn.fhir.rest.client.api;
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.model.primitive.IdDt; import ca.uhn.fhir.model.primitive.IdDt;
@ -121,7 +122,7 @@ public interface IGenericClient extends IRestfulClient {
* and how it should be returned. See the <a href="http://www.hl7.org/fhir/search.html">specification on search</a> * and how it should be returned. See the <a href="http://www.hl7.org/fhir/search.html">specification on search</a>
* for more information. * for more information.
*/ */
IUntypedQuery search(); <T extends IBaseBundle> IUntypedQuery<T> search();
/** /**
* If set to <code>true</code>, the client will log all requests and all responses. This is probably not a good production setting since it will result in a lot of extra logging, but it can be * If set to <code>true</code>, the client will log all requests and all responses. This is probably not a good production setting since it will result in a lot of extra logging, but it can be

View File

@ -1,5 +1,9 @@
package ca.uhn.fhir.rest.gclient; package ca.uhn.fhir.rest.gclient;
import java.util.*;
import ca.uhn.fhir.model.api.IQueryParameterType;
/* /*
* #%L * #%L
* HAPI FHIR - Core Library * HAPI FHIR - Core Library
@ -24,6 +28,8 @@ public interface IBaseQuery<T extends IBaseQuery<?>> {
T where(ICriterion<?> theCriterion); T where(ICriterion<?> theCriterion);
T where(Map<String, List<IQueryParameterType>> theCriterion);
T and(ICriterion<?> theCriterion); T and(ICriterion<?> theCriterion);
} }

View File

@ -27,7 +27,7 @@ import ca.uhn.fhir.rest.api.SummaryEnum;
*/ */
public interface IClientExecutable<T extends IClientExecutable<?,?>, Y> { public interface IClientExecutable<T extends IClientExecutable<?,Y>, Y> {
/** /**
* If set to true, the client will log the request and response to the SLF4J logger. This can be useful for * If set to true, the client will log the request and response to the SLF4J logger. This can be useful for

View File

@ -24,5 +24,5 @@ import org.hl7.fhir.instance.model.api.IBaseMetaType;
public interface IMetaAddOrDeleteSourced { public interface IMetaAddOrDeleteSourced {
<T extends IBaseMetaType> IClientExecutable<IClientExecutable<?, ?>, T> meta(T theMeta); <T extends IBaseMetaType> IClientExecutable<IClientExecutable<?, T>, T> meta(T theMeta);
} }

View File

@ -10,7 +10,7 @@ package ca.uhn.fhir.rest.gclient;
* 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,16 +25,16 @@ import org.hl7.fhir.instance.model.api.IIdType;
public interface IMetaGetUnsourced<T extends IBaseMetaType> { public interface IMetaGetUnsourced<T extends IBaseMetaType> {
IClientExecutable<IClientExecutable<?,?>, T> fromServer(); IClientExecutable<IClientExecutable<?, T>, T> fromServer();
IClientExecutable<IClientExecutable<?,?>, T> fromType(String theResourceName); IClientExecutable<IClientExecutable<?, T>, T> fromType(String theResourceName);
/** /**
* Get the meta from a resource instance by ID. * Get the meta from a resource instance by ID.
* *
* @param theId The ID. Must contain both a resource type and an ID part * @param theId
* The ID. Must contain both a resource type and an ID part
*/ */
IClientExecutable<IClientExecutable<?,?>, T> fromResource(IIdType theId); IClientExecutable<IClientExecutable<?, T>, T> fromResource(IIdType theId);
} }

View File

@ -28,7 +28,7 @@ import ca.uhn.fhir.model.api.Include;
import ca.uhn.fhir.rest.api.SearchStyleEnum; import ca.uhn.fhir.rest.api.SearchStyleEnum;
import ca.uhn.fhir.rest.param.DateRangeParam; import ca.uhn.fhir.rest.param.DateRangeParam;
public interface IQuery extends IBaseQuery<IQuery> { public interface IQuery<Y> extends IBaseQuery<IQuery<Y>>, IClientExecutable<IQuery<Y>, Y> {
/** /**
* Add an "_include" specification or an "_include:recurse" specification. If you are using * Add an "_include" specification or an "_include:recurse" specification. If you are using
@ -39,9 +39,9 @@ public interface IQuery extends IBaseQuery<IQuery> {
* <li><b>No Recurse:</b> <code>.include(Patient.INCLUDE_ORGANIZATION.asNonRecursive())</code> * <li><b>No Recurse:</b> <code>.include(Patient.INCLUDE_ORGANIZATION.asNonRecursive())</code>
* </ul> * </ul>
*/ */
IQuery include(Include theInclude); IQuery<Y> include(Include theInclude);
ISort sort(); ISort<Y> sort();
/** /**
* Specifies the <code>_count</code> parameter, which indicates to the server how many resources should be returned * Specifies the <code>_count</code> parameter, which indicates to the server how many resources should be returned
@ -50,7 +50,7 @@ public interface IQuery extends IBaseQuery<IQuery> {
* @deprecated This parameter is badly named, since FHIR calls this parameter "_count" and not "_limit". Use {@link #count(int)} instead (it also sets the _count parameter) * @deprecated This parameter is badly named, since FHIR calls this parameter "_count" and not "_limit". Use {@link #count(int)} instead (it also sets the _count parameter)
*/ */
@Deprecated @Deprecated
IQuery limitTo(int theLimitTo); IQuery<Y> limitTo(int theLimitTo);
/** /**
* Specifies the <code>_count</code> parameter, which indicates to the server how many resources should be returned * Specifies the <code>_count</code> parameter, which indicates to the server how many resources should be returned
@ -58,7 +58,7 @@ public interface IQuery extends IBaseQuery<IQuery> {
* *
* @since 1.4 * @since 1.4
*/ */
IQuery count(int theCount); IQuery<Y> count(int theCount);
/** /**
* Match only resources where the resource has the given tag. This parameter corresponds to * Match only resources where the resource has the given tag. This parameter corresponds to
@ -66,7 +66,7 @@ public interface IQuery extends IBaseQuery<IQuery> {
* @param theSystem The tag code system, or <code>null</code> to match any code system (this may not be supported on all servers) * @param theSystem The tag code system, or <code>null</code> to match any code system (this may not be supported on all servers)
* @param theCode The tag code. Must not be <code>null</code> or empty. * @param theCode The tag code. Must not be <code>null</code> or empty.
*/ */
IQuery withTag(String theSystem, String theCode); IQuery<Y> withTag(String theSystem, String theCode);
/** /**
* Match only resources where the resource has the given security tag. This parameter corresponds to * Match only resources where the resource has the given security tag. This parameter corresponds to
@ -74,21 +74,21 @@ public interface IQuery extends IBaseQuery<IQuery> {
* @param theSystem The tag code system, or <code>null</code> to match any code system (this may not be supported on all servers) * @param theSystem The tag code system, or <code>null</code> to match any code system (this may not be supported on all servers)
* @param theCode The tag code. Must not be <code>null</code> or empty. * @param theCode The tag code. Must not be <code>null</code> or empty.
*/ */
IQuery withSecurity(String theSystem, String theCode); IQuery<Y> withSecurity(String theSystem, String theCode);
/** /**
* Match only resources where the resource has the given profile declaration. This parameter corresponds to * Match only resources where the resource has the given profile declaration. This parameter corresponds to
* the <code>_profile</code> URL parameter. * the <code>_profile</code> URL parameter.
* @param theProfileUri The URI of a given profile to search for resources which match * @param theProfileUri The URI of a given profile to search for resources which match
*/ */
IQuery withProfile(String theProfileUri); IQuery<Y> withProfile(String theProfileUri);
/** /**
* Matches any of the profiles given as argument. This would result in an OR search for resources matching one or more profiles. * Matches any of the profiles given as argument. This would result in an OR search for resources matching one or more profiles.
* To do an AND search, make multiple calls to {@link #withProfile(String)}. * To do an AND search, make multiple calls to {@link #withProfile(String)}.
* @param theProfileUris The URIs of a given profile to search for resources which match. * @param theProfileUris The URIs of a given profile to search for resources which match.
*/ */
IQuery withAnyProfile(Collection<String> theProfileUris); IQuery<Y> withAnyProfile(Collection<String> theProfileUris);
/** /**
* Forces the query to perform the search using the given method (allowable methods are described in the * Forces the query to perform the search using the given method (allowable methods are described in the
@ -100,44 +100,44 @@ public interface IQuery extends IBaseQuery<IQuery> {
* @see SearchStyleEnum * @see SearchStyleEnum
* @since 0.6 * @since 0.6
*/ */
IQuery usingStyle(SearchStyleEnum theStyle); IQuery<Y> usingStyle(SearchStyleEnum theStyle);
IQuery withIdAndCompartment(String theResourceId, String theCompartmentName); IQuery<Y> withIdAndCompartment(String theResourceId, String theCompartmentName);
/** /**
* Add a "_revinclude" specification * Add a "_revinclude" specification
* *
* @since HAPI FHIR 1.0 - Note that option was added to FHIR itself in DSTU2 * @since HAPI FHIR 1.0 - Note that option was added to FHIR itself in DSTU2
*/ */
IQuery revInclude(Include theIncludeTarget); IQuery<Y> revInclude(Include theIncludeTarget);
/** /**
* Add a "_lastUpdated" specification * Add a "_lastUpdated" specification
* *
* @since HAPI FHIR 1.1 - Note that option was added to FHIR itself in DSTU2 * @since HAPI FHIR 1.1 - Note that option was added to FHIR itself in DSTU2
*/ */
IQuery lastUpdated(DateRangeParam theLastUpdated); IQuery<Y> lastUpdated(DateRangeParam theLastUpdated);
/** /**
* Request that the client return the specified bundle type, e.g. <code>org.hl7.fhir.instance.model.Bundle.class</code> * Request that the client return the specified bundle type, e.g. <code>org.hl7.fhir.instance.model.Bundle.class</code>
* or <code>ca.uhn.fhir.model.dstu2.resource.Bundle.class</code> * or <code>ca.uhn.fhir.model.dstu2.resource.Bundle.class</code>
*/ */
<B extends IBaseBundle> IQueryTyped<B> returnBundle(Class<B> theClass); <B extends IBaseBundle> IQuery<B> returnBundle(Class<B> theClass);
/** /**
* {@inheritDoc} * {@inheritDoc}
*/ */
// This is here as an overridden method to allow mocking clients with Mockito to work // This is here as an overridden method to allow mocking clients with Mockito to work
@Override @Override
IQuery where(ICriterion<?> theCriterion); IQuery<Y> where(ICriterion<?> theCriterion);
/** /**
* {@inheritDoc} * {@inheritDoc}
*/ */
// This is here as an overridden method to allow mocking clients with Mockito to work // This is here as an overridden method to allow mocking clients with Mockito to work
@Override @Override
IQuery and(ICriterion<?> theCriterion); IQuery<Y> and(ICriterion<?> theCriterion);
// <T extends IBaseBundle> T execute(); // Y execute();
} }

View File

@ -1,7 +0,0 @@
package ca.uhn.fhir.rest.gclient;
import org.hl7.fhir.instance.model.api.IBaseBundle;
public interface IQueryTyped<T extends IBaseBundle> extends IQuery, IClientExecutable<IClientExecutable<?,?>, T> {
}

View File

@ -20,19 +20,19 @@ package ca.uhn.fhir.rest.gclient;
* #L% * #L%
*/ */
public interface ISort { public interface ISort<T> {
/** /**
* Sort ascending * Sort ascending
*/ */
IQuery ascending(IParam theParam); IQuery<T> ascending(IParam theParam);
/** /**
* Sort ascending * Sort ascending
* *
* @param theParam The param name, e.g. "address" * @param theParam The param name, e.g. "address"
*/ */
IQuery ascending(String theParam); IQuery<T> ascending(String theParam);
/** /**
* Sort by the default order. Note that as of STU3, there is no longer * Sort by the default order. Note that as of STU3, there is no longer
@ -40,7 +40,7 @@ public interface ISort {
* technically implies "ascending" but it makes more sense to use * technically implies "ascending" but it makes more sense to use
* {@link #ascending(IParam)} * {@link #ascending(IParam)}
*/ */
IQuery defaultOrder(IParam theParam); IQuery<T> defaultOrder(IParam theParam);
/** /**
* Sort descending * Sort descending
@ -48,13 +48,13 @@ public interface ISort {
* @param theParam A query param - Could be a constant such as <code>Patient.ADDRESS</code> or a custom * @param theParam A query param - Could be a constant such as <code>Patient.ADDRESS</code> or a custom
* param such as <code>new StringClientParam("foo")</code> * param such as <code>new StringClientParam("foo")</code>
*/ */
IQuery descending(IParam theParam); IQuery<T> descending(IParam theParam);
/** /**
* Sort ascending * Sort ascending
* *
* @param theParam The param name, e.g. "address" * @param theParam The param name, e.g. "address"
*/ */
IQuery descending(String theParam); IQuery<T> descending(String theParam);
} }

View File

@ -22,13 +22,13 @@ package ca.uhn.fhir.rest.gclient;
import org.hl7.fhir.instance.model.api.IBaseResource; import org.hl7.fhir.instance.model.api.IBaseResource;
public interface IUntypedQuery { public interface IUntypedQuery<T> {
IQuery forAllResources(); IQuery<T> forAllResources();
IQuery forResource(String theResourceName); IQuery<T> forResource(String theResourceName);
IQuery forResource(Class<? extends IBaseResource> theClass); IQuery<T> forResource(Class<? extends IBaseResource> theClass);
/** /**
* Perform a search directly by URL. It is usually better to construct the URL using the {@link #forAllResources()}, {@link #forResource(Class)} etc, but sometimes it is useful to simply search by * Perform a search directly by URL. It is usually better to construct the URL using the {@link #forAllResources()}, {@link #forResource(Class)} etc, but sometimes it is useful to simply search by
@ -38,6 +38,6 @@ public interface IUntypedQuery {
* The URL to search for. Note that this URL may be complete (e.g. "http://example.com/base/Patient?name=foo") in which case the client's base URL will be ignored. Or it can be relative * The URL to search for. Note that this URL may be complete (e.g. "http://example.com/base/Patient?name=foo") in which case the client's base URL will be ignored. Or it can be relative
* (e.g. "Patient?name=foo") in which case the client's base URL will be used. * (e.g. "Patient?name=foo") in which case the client's base URL will be used.
*/ */
IQuery byUrl(String theSearchUrl); IQuery<T> byUrl(String theSearchUrl);
} }

View File

@ -1,8 +1,11 @@
package ca.uhn.fhir.rest.param; package ca.uhn.fhir.rest.param;
import static org.apache.commons.lang3.StringUtils.isBlank;
public abstract class BaseParamWithPrefix<T extends BaseParam> extends BaseParam { public abstract class BaseParamWithPrefix<T extends BaseParam> extends BaseParam {
private static final long serialVersionUID = 1L; private static final long serialVersionUID = 1L;
private static final org.slf4j.Logger ourLog = org.slf4j.LoggerFactory.getLogger(BaseParamWithPrefix.class);
private ParamPrefixEnum myPrefix; private ParamPrefixEnum myPrefix;
@ -32,8 +35,40 @@ public abstract class BaseParamWithPrefix<T extends BaseParam> extends BaseParam
} }
String prefix = theString.substring(0, offset); String prefix = theString.substring(0, offset);
myPrefix = ParamPrefixEnum.forValue(prefix); if (!isBlank(prefix)) {
myPrefix = ParamPrefixEnum.forValue(prefix);
if (myPrefix == null) {
switch (prefix) {
case ">=":
myPrefix = ParamPrefixEnum.GREATERTHAN_OR_EQUALS;
break;
case ">":
myPrefix = ParamPrefixEnum.GREATERTHAN;
break;
case "<=":
myPrefix = ParamPrefixEnum.LESSTHAN_OR_EQUALS;
break;
case "<":
myPrefix = ParamPrefixEnum.LESSTHAN;
break;
case "~":
myPrefix = ParamPrefixEnum.APPROXIMATE;
break;
default :
ourLog.warn("Invalid prefix being ignored: {}", prefix);
break;
}
if (myPrefix != null) {
ourLog.warn("Date parameter has legacy prefix '{}' which has been removed from FHIR. This should be replaced with '{}'", prefix, myPrefix);
}
}
}
return theString.substring(offset); return theString.substring(offset);
} }

View File

@ -143,8 +143,9 @@ public class BundleUtil {
/** /**
* Extract all of the resources of a given type from a given bundle * Extract all of the resources of a given type from a given bundle
*/ */
public static List<IBaseResource> toListOfResourcesOfType(FhirContext theContext, IBaseBundle theBundle, Class<? extends IBaseResource> theTypeToInclude) { @SuppressWarnings("unchecked")
List<IBaseResource> retVal = new ArrayList<IBaseResource>(); public static <T extends IBaseResource> List<T> toListOfResourcesOfType(FhirContext theContext, IBaseBundle theBundle, Class<T> theTypeToInclude) {
List<T> retVal = new ArrayList<T>();
RuntimeResourceDefinition def = theContext.getResourceDefinition(theBundle); RuntimeResourceDefinition def = theContext.getResourceDefinition(theBundle);
BaseRuntimeChildDefinition entryChild = def.getChildByName("entry"); BaseRuntimeChildDefinition entryChild = def.getChildByName("entry");
@ -157,7 +158,7 @@ public class BundleUtil {
if (theTypeToInclude != null && !theTypeToInclude.isAssignableFrom(next.getClass())) { if (theTypeToInclude != null && !theTypeToInclude.isAssignableFrom(next.getClass())) {
continue; continue;
} }
retVal.add((IBaseResource) next); retVal.add((T) next);
} }
} }

View File

@ -29,10 +29,15 @@ import ca.uhn.fhir.util.ObjectUtil;
abstract class BaseValidationContext<T> implements IValidationContext<T> { abstract class BaseValidationContext<T> implements IValidationContext<T> {
protected final FhirContext myFhirContext; protected final FhirContext myFhirContext;
private List<SingleValidationMessage> myMessages = new ArrayList<SingleValidationMessage>();
private List<SingleValidationMessage> myMessages;
BaseValidationContext(FhirContext theFhirContext) { BaseValidationContext(FhirContext theFhirContext) {
this(theFhirContext, new ArrayList<SingleValidationMessage>());
}
BaseValidationContext(FhirContext theFhirContext, List<SingleValidationMessage> theMessages) {
myFhirContext = theFhirContext; myFhirContext = theFhirContext;
myMessages = theMessages;
} }
@Override @Override
@ -46,6 +51,11 @@ abstract class BaseValidationContext<T> implements IValidationContext<T> {
return myFhirContext; return myFhirContext;
} }
@Override
public List<SingleValidationMessage> getMessages() {
return myMessages;
}
@Override @Override
public ValidationResult toResult() { public ValidationResult toResult() {
return new ValidationResult(myFhirContext, myMessages); return new ValidationResult(myFhirContext, myMessages);

View File

@ -1,5 +1,7 @@
package ca.uhn.fhir.validation; package ca.uhn.fhir.validation;
import java.util.List;
/* /*
* #%L * #%L
* HAPI FHIR - Core Library * HAPI FHIR - Core Library
@ -35,6 +37,8 @@ public interface IValidationContext<T> {
void addValidationMessage(SingleValidationMessage theMessage); void addValidationMessage(SingleValidationMessage theMessage);
List<SingleValidationMessage> getMessages();
ValidationResult toResult(); ValidationResult toResult();
} }

View File

@ -1,5 +1,8 @@
package ca.uhn.fhir.validation; package ca.uhn.fhir.validation;
import java.util.ArrayList;
import java.util.List;
/* /*
* #%L * #%L
* HAPI FHIR - Core Library * HAPI FHIR - Core Library
@ -37,7 +40,11 @@ public class ValidationContext<T> extends BaseValidationContext<T> implements IV
private final EncodingEnum myResourceAsStringEncoding; private final EncodingEnum myResourceAsStringEncoding;
private ValidationContext(FhirContext theContext, T theResource, IEncoder theEncoder) { private ValidationContext(FhirContext theContext, T theResource, IEncoder theEncoder) {
super(theContext); this(theContext, theResource, theEncoder, new ArrayList<SingleValidationMessage>());
}
private ValidationContext(FhirContext theContext, T theResource, IEncoder theEncoder, List<SingleValidationMessage> theMessages) {
super(theContext, theMessages);
myResource = theResource; myResource = theResource;
myEncoder = theEncoder; myEncoder = theEncoder;
if (theEncoder != null) { if (theEncoder != null) {
@ -123,4 +130,18 @@ public class ValidationContext<T> extends BaseValidationContext<T> implements IV
}; };
} }
public static IValidationContext<IBaseResource> subContext(final IValidationContext<IBaseResource> theCtx, final IBaseResource theResource) {
return new ValidationContext<IBaseResource>(theCtx.getFhirContext(), theResource, new IEncoder() {
@Override
public String encode() {
return theCtx.getFhirContext().newXmlParser().encodeResourceToString(theResource);
}
@Override
public EncodingEnum getEncoding() {
return EncodingEnum.XML;
}
}, theCtx.getMessages());
}
} }

View File

@ -27,6 +27,7 @@ import java.util.*;
import javax.xml.transform.stream.StreamSource; import javax.xml.transform.stream.StreamSource;
import org.apache.commons.io.IOUtils; import org.apache.commons.io.IOUtils;
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 org.oclc.purl.dsdl.svrl.SchematronOutputType; import org.oclc.purl.dsdl.svrl.SchematronOutputType;
@ -39,6 +40,7 @@ import com.phloc.schematron.xslt.SchematronResourceSCH;
import ca.uhn.fhir.context.FhirContext; import ca.uhn.fhir.context.FhirContext;
import ca.uhn.fhir.rest.api.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.util.BundleUtil;
import ca.uhn.fhir.validation.*; import ca.uhn.fhir.validation.*;
/** /**
@ -57,6 +59,14 @@ public class SchematronBaseValidator implements IValidatorModule {
@Override @Override
public void validateResource(IValidationContext<IBaseResource> theCtx) { public void validateResource(IValidationContext<IBaseResource> theCtx) {
if (theCtx.getResource() instanceof IBaseBundle) {
IBaseBundle bundle = (IBaseBundle) theCtx.getResource();
List<IBaseResource> subResources = BundleUtil.toListOfResources(myCtx, bundle);
for (IBaseResource nextSubResource : subResources) {
validateResource(ValidationContext.subContext(theCtx, nextSubResource));
}
}
ISchematronResource sch = getSchematron(theCtx); ISchematronResource sch = getSchematron(theCtx);
String resourceAsString; String resourceAsString;
if (theCtx.getResourceAsStringEncoding() == EncodingEnum.XML) { if (theCtx.getResourceAsStringEncoding() == EncodingEnum.XML) {

View File

@ -25,6 +25,7 @@ import static org.apache.commons.lang3.StringUtils.isNotBlank;
import java.io.IOException; import java.io.IOException;
import java.io.Reader; import java.io.Reader;
import java.util.*; import java.util.*;
import java.util.Map.Entry;
import org.apache.commons.io.IOUtils; import org.apache.commons.io.IOUtils;
import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.StringUtils;
@ -75,13 +76,11 @@ public class GenericClient extends BaseClient implements IGenericClient {
return new CreateInternal(); return new CreateInternal();
} }
@Override @Override
public IDelete delete() { public IDelete delete() {
return new DeleteInternal(); return new DeleteInternal();
} }
private <T extends IBaseResource> T doReadOrVRead(final Class<T> theType, IIdType theId, boolean theVRead, ICallable<T> theNotModifiedHandler, String theIfVersionMatches, Boolean thePrettyPrint, private <T extends IBaseResource> T doReadOrVRead(final Class<T> theType, IIdType theId, boolean theVRead, ICallable<T> theNotModifiedHandler, String theIfVersionMatches, Boolean thePrettyPrint,
SummaryEnum theSummary, EncodingEnum theEncoding, Set<String> theSubsetElements) { SummaryEnum theSummary, EncodingEnum theEncoding, Set<String> theSubsetElements) {
String resName = toResourceName(theType); String resName = toResourceName(theType);
@ -165,15 +164,11 @@ public class GenericClient extends BaseClient implements IGenericClient {
return theResource.getIdElement().getIdPart(); return theResource.getIdElement().getIdPart();
} }
@Override @Override
public IHistory history() { public IHistory history() {
return new HistoryInternal(); return new HistoryInternal();
} }
// @Override // @Override
// public <T extends IBaseResource> T read(final Class<T> theType, IdDt theId) { // public <T extends IBaseResource> T read(final Class<T> theType, IdDt theId) {
// return doReadOrVRead(theType, theId, false, null, null); // return doReadOrVRead(theType, theId, false, null, null);
@ -204,6 +199,11 @@ public class GenericClient extends BaseClient implements IGenericClient {
return new OperationInternal(); return new OperationInternal();
} }
@Override
public IPatch patch() {
return new PatchInternal();
}
@Override @Override
public IRead read() { public IRead read() {
return new ReadInternal(); return new ReadInternal();
@ -234,12 +234,12 @@ public class GenericClient extends BaseClient implements IGenericClient {
return read(def.getImplementingClass(), id); return read(def.getImplementingClass(), id);
} }
@SuppressWarnings({ "rawtypes", "unchecked" })
@Override @Override
public IUntypedQuery search() { public IUntypedQuery search() {
return new SearchInternal(); return new SearchInternal();
} }
/** /**
* For now, this is a part of the internal API of HAPI - Use with caution as this method may change! * For now, this is a part of the internal API of HAPI - Use with caution as this method may change!
*/ */
@ -262,12 +262,6 @@ public class GenericClient extends BaseClient implements IGenericClient {
return new TransactionInternal(); return new TransactionInternal();
} }
@Override
public IPatch patch() {
return new PatchInternal();
}
@Override @Override
public IUpdate update() { public IUpdate update() {
return new UpdateInternal(); return new UpdateInternal();
@ -366,18 +360,13 @@ public class GenericClient extends BaseClient implements IGenericClient {
return b.toString(); return b.toString();
} }
private abstract class BaseClientExecutable<T extends IClientExecutable<?, ?>, Y> implements IClientExecutable<T, Y> { private abstract class BaseClientExecutable<T extends IClientExecutable<?, Y>, Y> implements IClientExecutable<T, Y> {
protected EncodingEnum myParamEncoding; protected EncodingEnum myParamEncoding;
private List<Class<? extends IBaseResource>> myPreferResponseTypes; private List<Class<? extends IBaseResource>> myPreferResponseTypes;
protected Boolean myPrettyPrint; protected Boolean myPrettyPrint;
private boolean myQueryLogRequestAndResponse; private boolean myQueryLogRequestAndResponse;
private HashSet<String> mySubsetElements; private HashSet<String> mySubsetElements;
protected SummaryEnum mySummaryMode; protected SummaryEnum mySummaryMode;
@Deprecated // override deprecated method @Deprecated // override deprecated method
@ -491,25 +480,61 @@ public class GenericClient extends BaseClient implements IGenericClient {
} }
private abstract class BaseSearch<EXEC extends IClientExecutable<?, OUTPUT>, QUERY extends IBaseQuery<QUERY>, OUTPUT> extends BaseClientExecutable<EXEC, OUTPUT> implements IBaseQuery<QUERY> {
private class CreateInternal extends BaseClientExecutable<ICreateTyped, MethodOutcome> implements ICreate, ICreateTyped, ICreateWithQuery, ICreateWithQueryTyped { private Map<String, List<String>> myParams = new LinkedHashMap<>();
private CriterionList myCriterionList; @Override
public QUERY and(ICriterion<?> theCriterion) {
return where(theCriterion);
}
public Map<String, List<String>> getParamMap() {
return myParams;
}
@SuppressWarnings("unchecked")
@Override
public QUERY where(ICriterion<?> theCriterion) {
ICriterionInternal criterion = (ICriterionInternal) theCriterion;
String parameterName = criterion.getParameterName();
String parameterValue = criterion.getParameterValue(myContext);
if (isNotBlank(parameterValue)) {
addParam(myParams, parameterName, parameterValue);
}
return (QUERY) this;
}
@SuppressWarnings("unchecked")
@Override
public QUERY where(Map<String, List<IQueryParameterType>> theCriterion) {
Validate.notNull(theCriterion, "theCriterion must not be null");
for (Entry<String, List<IQueryParameterType>> nextEntry : theCriterion.entrySet()) {
String nextKey = nextEntry.getKey();
List<IQueryParameterType> nextValues = nextEntry.getValue();
for (IQueryParameterType nextValue : nextValues) {
addParam(myParams, nextKey, nextValue.getValueAsQueryToken(myContext));
}
}
return (QUERY) this;
}
}
private class CreateInternal extends BaseSearch<ICreateTyped, ICreateWithQueryTyped, MethodOutcome> implements ICreate, ICreateTyped, ICreateWithQuery, ICreateWithQueryTyped {
private boolean myConditional;
private String myId; private String myId;
private PreferReturnEnum myPrefer; private PreferReturnEnum myPrefer;
private IBaseResource myResource; private IBaseResource myResource;
private String myResourceBody; private String myResourceBody;
private String mySearchUrl; private String mySearchUrl;
@Override
public ICreateWithQueryTyped and(ICriterion<?> theCriterion) {
myCriterionList.add((ICriterionInternal) theCriterion);
return this;
}
@Override @Override
public ICreateWithQuery conditional() { public ICreateWithQuery conditional() {
myCriterionList = new CriterionList(); myConditional = true;
return this; return this;
} }
@ -534,8 +559,8 @@ public class GenericClient extends BaseClient implements IGenericClient {
BaseHttpClientInvocation invocation; BaseHttpClientInvocation invocation;
if (mySearchUrl != null) { if (mySearchUrl != null) {
invocation = MethodUtil.createCreateInvocation(myResource, myResourceBody, myId, myContext, mySearchUrl); invocation = MethodUtil.createCreateInvocation(myResource, myResourceBody, myId, myContext, mySearchUrl);
} else if (myCriterionList != null) { } else if (myConditional) {
invocation = MethodUtil.createCreateInvocation(myResource, myResourceBody, myId, myContext, myCriterionList.toParamList()); invocation = MethodUtil.createCreateInvocation(myResource, myResourceBody, myId, myContext, getParamMap());
} else { } else {
invocation = MethodUtil.createCreateInvocation(myResource, myResourceBody, myId, myContext); invocation = MethodUtil.createCreateInvocation(myResource, myResourceBody, myId, myContext);
} }
@ -569,12 +594,6 @@ public class GenericClient extends BaseClient implements IGenericClient {
return this; return this;
} }
@Override
public ICreateWithQueryTyped where(ICriterion<?> theCriterion) {
myCriterionList.add((ICriterionInternal) theCriterion);
return this;
}
@Override @Override
public CreateInternal withId(IdDt theId) { public CreateInternal withId(IdDt theId) {
myId = theId.getIdPart(); myId = theId.getIdPart();
@ -589,49 +608,20 @@ public class GenericClient extends BaseClient implements IGenericClient {
} }
private class CriterionList extends ArrayList<ICriterionInternal> { private class DeleteInternal extends BaseSearch<IDeleteTyped, IDeleteWithQueryTyped, IBaseOperationOutcome> implements IDelete, IDeleteTyped, IDeleteWithQuery, IDeleteWithQueryTyped {
private static final long serialVersionUID = 1L; private boolean myConditional;
public void populateParamList(Map<String, List<String>> theParams) {
for (ICriterionInternal next : this) {
String parameterName = next.getParameterName();
String parameterValue = next.getParameterValue(myContext);
if (isNotBlank(parameterValue)) {
addParam(theParams, parameterName, parameterValue);
}
}
}
public Map<String, List<String>> toParamList() {
LinkedHashMap<String, List<String>> retVal = new LinkedHashMap<String, List<String>>();
populateParamList(retVal);
return retVal;
}
}
private class DeleteInternal extends BaseClientExecutable<IDeleteTyped, IBaseOperationOutcome> implements IDelete, IDeleteTyped, IDeleteWithQuery, IDeleteWithQueryTyped {
private CriterionList myCriterionList;
private IIdType myId; private IIdType myId;
private String myResourceType; private String myResourceType;
private String mySearchUrl; private String mySearchUrl;
@Override
public IDeleteWithQueryTyped and(ICriterion<?> theCriterion) {
myCriterionList.add((ICriterionInternal) theCriterion);
return this;
}
@Override @Override
public IBaseOperationOutcome execute() { public IBaseOperationOutcome execute() {
HttpDeleteClientInvocation invocation; HttpDeleteClientInvocation invocation;
if (myId != null) { if (myId != null) {
invocation = DeleteMethodBinding.createDeleteInvocation(getFhirContext(), myId); invocation = DeleteMethodBinding.createDeleteInvocation(getFhirContext(), myId);
} else if (myCriterionList != null) { } else if (myConditional) {
Map<String, List<String>> params = myCriterionList.toParamList(); invocation = DeleteMethodBinding.createDeleteInvocation(getFhirContext(), myResourceType, getParamMap());
invocation = DeleteMethodBinding.createDeleteInvocation(getFhirContext(), myResourceType, params);
} else { } else {
invocation = DeleteMethodBinding.createDeleteInvocation(getFhirContext(), mySearchUrl); invocation = DeleteMethodBinding.createDeleteInvocation(getFhirContext(), mySearchUrl);
} }
@ -679,7 +669,7 @@ public class GenericClient extends BaseClient implements IGenericClient {
@Override @Override
public IDeleteWithQuery resourceConditionalByType(Class<? extends IBaseResource> theResourceType) { public IDeleteWithQuery resourceConditionalByType(Class<? extends IBaseResource> theResourceType) {
Validate.notNull(theResourceType, "theResourceType can not be null"); Validate.notNull(theResourceType, "theResourceType can not be null");
myCriterionList = new CriterionList(); myConditional = true;
myResourceType = myContext.getResourceDefinition(theResourceType).getName(); myResourceType = myContext.getResourceDefinition(theResourceType).getName();
return this; return this;
} }
@ -691,7 +681,7 @@ public class GenericClient extends BaseClient implements IGenericClient {
throw new IllegalArgumentException("Unknown resource type: " + theResourceType); throw new IllegalArgumentException("Unknown resource type: " + theResourceType);
} }
myResourceType = theResourceType; myResourceType = theResourceType;
myCriterionList = new CriterionList(); myConditional = true;
return this; return this;
} }
@ -701,11 +691,6 @@ public class GenericClient extends BaseClient implements IGenericClient {
return this; return this;
} }
@Override
public IDeleteWithQueryTyped where(ICriterion<?> theCriterion) {
myCriterionList.add((ICriterionInternal) theCriterion);
return this;
}
} }
@SuppressWarnings({ "rawtypes", "unchecked" }) @SuppressWarnings({ "rawtypes", "unchecked" })
@ -755,7 +740,6 @@ public class GenericClient extends BaseClient implements IGenericClient {
} }
@SuppressWarnings("rawtypes") @SuppressWarnings("rawtypes")
private class HistoryInternal extends BaseClientExecutable implements IHistory, IHistoryUntyped, IHistoryTyped { private class HistoryInternal extends BaseClientExecutable implements IHistory, IHistoryUntyped, IHistoryTyped {
@ -854,7 +838,6 @@ public class GenericClient extends BaseClient implements IGenericClient {
return new GetPageInternal(myPageUrl, theBundleType); return new GetPageInternal(myPageUrl, theBundleType);
} }
@Override @Override
public IGetPageUntyped byUrl(String thePageUrl) { public IGetPageUntyped byUrl(String thePageUrl) {
if (isBlank(thePageUrl)) { if (isBlank(thePageUrl)) {
@ -864,7 +847,6 @@ public class GenericClient extends BaseClient implements IGenericClient {
return this; return this;
} }
@Override @Override
public <T extends IBaseBundle> IGetPageTyped<T> next(T theBundle) { public <T extends IBaseBundle> IGetPageTyped<T> next(T theBundle) {
return nextOrPrevious("next", theBundle); return nextOrPrevious("next", theBundle);
@ -898,13 +880,11 @@ public class GenericClient extends BaseClient implements IGenericClient {
throw new IllegalArgumentException(myContext.getLocalizer().getMessage(GenericClient.class, "noPagingLinkFoundInBundle", theWantRel)); throw new IllegalArgumentException(myContext.getLocalizer().getMessage(GenericClient.class, "noPagingLinkFoundInBundle", theWantRel));
} }
@Override @Override
public <T extends IBaseBundle> IGetPageTyped<T> previous(T theBundle) { public <T extends IBaseBundle> IGetPageTyped<T> previous(T theBundle) {
return nextOrPrevious(PREVIOUS, theBundle); return nextOrPrevious(PREVIOUS, theBundle);
} }
} }
@SuppressWarnings("rawtypes") @SuppressWarnings("rawtypes")
@ -993,7 +973,7 @@ public class GenericClient extends BaseClient implements IGenericClient {
@SuppressWarnings("unchecked") @SuppressWarnings("unchecked")
@Override @Override
public <T extends IBaseMetaType> IClientExecutable<IClientExecutable<?, ?>, T> meta(T theMeta) { public <T extends IBaseMetaType> IClientExecutable<IClientExecutable<?, T>, T> meta(T theMeta) {
Validate.notNull(theMeta, "theMeta must not be null"); Validate.notNull(theMeta, "theMeta must not be null");
myMeta = theMeta; myMeta = theMeta;
myMetaType = myMeta.getClass(); myMetaType = myMeta.getClass();
@ -1062,56 +1042,15 @@ public class GenericClient extends BaseClient implements IGenericClient {
implements IOperation, IOperationUnnamed, IOperationUntyped, IOperationUntypedWithInput, IOperationUntypedWithInputAndPartialOutput, IOperationProcessMsg, IOperationProcessMsgMode { implements IOperation, IOperationUnnamed, IOperationUntyped, IOperationUntypedWithInput, IOperationUntypedWithInputAndPartialOutput, IOperationProcessMsg, IOperationProcessMsgMode {
private IIdType myId; private IIdType myId;
private Boolean myIsAsync;
private IBaseBundle myMsgBundle;
private String myOperationName; private String myOperationName;
private IBaseParameters myParameters; private IBaseParameters myParameters;
private RuntimeResourceDefinition myParametersDef; private RuntimeResourceDefinition myParametersDef;
private String myResponseUrl;
private Class myReturnResourceType;
private Class<? extends IBaseResource> myType; private Class<? extends IBaseResource> myType;
private boolean myUseHttpGet; private boolean myUseHttpGet;
private Class myReturnResourceType;
private IBaseBundle myMsgBundle;
private String myResponseUrl;
private Boolean myIsAsync;
@SuppressWarnings("unchecked")
@Override
public IOperationProcessMsgMode setMessageBundle(IBaseBundle theMsgBundle) {
Validate.notNull(theMsgBundle, "theMsgBundle must not be null");
/*
* Validate.isTrue(theMsgBundle.getType().getValueAsEnum() == BundleTypeEnum.MESSAGE);
* Validate.isTrue(theMsgBundle.getEntries().size() > 0);
* Validate.notNull(theMsgBundle.getEntries().get(0).getResource(), "Message Bundle first entry must be a MessageHeader resource");
* Validate.isTrue(theMsgBundle.getEntries().get(0).getResource().getResourceName().equals("MessageHeader"), "Message Bundle first entry must be a MessageHeader resource");
*/
myMsgBundle = theMsgBundle;
return this;
}
@Override
public IOperationProcessMsg setResponseUrlParam(String responseUrl) {
Validate.notEmpty(responseUrl, "responseUrl must not be null");
Validate.matchesPattern(responseUrl, "^(https?)://[-a-zA-Z0-9+&@#/%?=~_|!:,.;]*[-a-zA-Z0-9+&@#/%=~_|]", "responseUrl must be a valid URL");
myResponseUrl = responseUrl;
return this;
}
@Override
public IOperationProcessMsgMode asynchronous(Class theResponseClass) {
myIsAsync = true;
Validate.notNull(theResponseClass, "theReturnType must not be null");
Validate.isTrue(IBaseResource.class.isAssignableFrom(theResponseClass), "theReturnType must be a class which extends from IBaseResource");
myReturnResourceType = theResponseClass;
return this;
}
@Override
public IOperationProcessMsgMode synchronous(Class theResponseClass) {
myIsAsync = false;
Validate.notNull(theResponseClass, "theReturnType must not be null");
Validate.isTrue(IBaseResource.class.isAssignableFrom(theResponseClass), "theReturnType must be a class which extends from IBaseResource");
myReturnResourceType = theResponseClass;
return this;
}
@SuppressWarnings("unchecked") @SuppressWarnings("unchecked")
private void addParam(String theName, IBase theValue) { private void addParam(String theName, IBase theValue) {
@ -1143,12 +1082,6 @@ public class GenericClient extends BaseClient implements IGenericClient {
} }
} }
@Override
public IOperationProcessMsg processMessage() {
myOperationName = Constants.EXTOP_PROCESS_MESSAGE;
return this;
}
private void addParam(String theName, IQueryParameterType theValue) { private void addParam(String theName, IQueryParameterType theValue) {
IPrimitiveType<?> stringType = ParametersUtil.createString(myContext, theValue.getValueAsQueryToken(myContext)); IPrimitiveType<?> stringType = ParametersUtil.createString(myContext, theValue.getValueAsQueryToken(myContext));
addParam(theName, stringType); addParam(theName, stringType);
@ -1169,6 +1102,15 @@ public class GenericClient extends BaseClient implements IGenericClient {
return this; return this;
} }
@Override
public IOperationProcessMsgMode asynchronous(Class theResponseClass) {
myIsAsync = true;
Validate.notNull(theResponseClass, "theReturnType must not be null");
Validate.isTrue(IBaseResource.class.isAssignableFrom(theResponseClass), "theReturnType must be a class which extends from IBaseResource");
myReturnResourceType = theResponseClass;
return this;
}
@SuppressWarnings("unchecked") @SuppressWarnings("unchecked")
@Override @Override
public Object execute() { public Object execute() {
@ -1259,6 +1201,52 @@ public class GenericClient extends BaseClient implements IGenericClient {
return this; return this;
} }
@Override
public IOperationProcessMsg processMessage() {
myOperationName = Constants.EXTOP_PROCESS_MESSAGE;
return this;
}
@Override
public IOperationUntypedWithInput returnResourceType(Class theReturnType) {
Validate.notNull(theReturnType, "theReturnType must not be null");
Validate.isTrue(IBaseResource.class.isAssignableFrom(theReturnType), "theReturnType must be a class which extends from IBaseResource");
myReturnResourceType = theReturnType;
return this;
}
@SuppressWarnings("unchecked")
@Override
public IOperationProcessMsgMode setMessageBundle(IBaseBundle theMsgBundle) {
Validate.notNull(theMsgBundle, "theMsgBundle must not be null");
/*
* Validate.isTrue(theMsgBundle.getType().getValueAsEnum() == BundleTypeEnum.MESSAGE);
* Validate.isTrue(theMsgBundle.getEntries().size() > 0);
* Validate.notNull(theMsgBundle.getEntries().get(0).getResource(), "Message Bundle first entry must be a MessageHeader resource");
* Validate.isTrue(theMsgBundle.getEntries().get(0).getResource().getResourceName().equals("MessageHeader"), "Message Bundle first entry must be a MessageHeader resource");
*/
myMsgBundle = theMsgBundle;
return this;
}
@Override
public IOperationProcessMsg setResponseUrlParam(String responseUrl) {
Validate.notEmpty(responseUrl, "responseUrl must not be null");
Validate.matchesPattern(responseUrl, "^(https?)://[-a-zA-Z0-9+&@#/%?=~_|!:,.;]*[-a-zA-Z0-9+&@#/%=~_|]", "responseUrl must be a valid URL");
myResponseUrl = responseUrl;
return this;
}
@Override
public IOperationProcessMsgMode synchronous(Class theResponseClass) {
myIsAsync = false;
Validate.notNull(theResponseClass, "theReturnType must not be null");
Validate.isTrue(IBaseResource.class.isAssignableFrom(theResponseClass), "theReturnType must be a class which extends from IBaseResource");
myReturnResourceType = theResponseClass;
return this;
}
@Override @Override
public IOperationUntypedWithInput useHttpGet() { public IOperationUntypedWithInput useHttpGet() {
myUseHttpGet = true; myUseHttpGet = true;
@ -1319,14 +1307,6 @@ public class GenericClient extends BaseClient implements IGenericClient {
return this; return this;
} }
@Override
public IOperationUntypedWithInput returnResourceType(Class theReturnType) {
Validate.notNull(theReturnType, "theReturnType must not be null");
Validate.isTrue(IBaseResource.class.isAssignableFrom(theReturnType), "theReturnType must be a class which extends from IBaseResource");
myReturnResourceType = theReturnType;
return this;
}
} }
private final class OperationOutcomeResponseHandler implements IClientResponseHandler<IBaseOperationOutcome> { private final class OperationOutcomeResponseHandler implements IClientResponseHandler<IBaseOperationOutcome> {
@ -1386,6 +1366,119 @@ public class GenericClient extends BaseClient implements IGenericClient {
} }
} }
private class PatchInternal extends BaseSearch<IPatchExecutable, IPatchWithQueryTyped, MethodOutcome> implements IPatch, IPatchWithBody, IPatchExecutable, IPatchWithQuery, IPatchWithQueryTyped {
private boolean myConditional;
private IIdType myId;
private String myPatchBody;
private PatchTypeEnum myPatchType;
private PreferReturnEnum myPrefer;
private String myResourceType;
private String mySearchUrl;
@Override
public IPatchWithQuery conditional(Class<? extends IBaseResource> theClass) {
Validate.notNull(theClass, "theClass must not be null");
String resourceType = myContext.getResourceDefinition(theClass).getName();
return conditional(resourceType);
}
@Override
public IPatchWithQuery conditional(String theResourceType) {
Validate.notBlank(theResourceType, "theResourceType must not be null");
myResourceType = theResourceType;
myConditional = true;
return this;
}
// TODO: This is not longer used.. Deprecate it or just remove it?
@Override
public IPatchWithBody conditionalByUrl(String theSearchUrl) {
mySearchUrl = validateAndEscapeConditionalUrl(theSearchUrl);
return this;
}
@Override
public MethodOutcome execute() {
if (myPatchType == null) {
throw new InvalidRequestException("No patch type supplied, cannot invoke server");
}
if (myPatchBody == null) {
throw new InvalidRequestException("No patch body supplied, cannot invoke server");
}
BaseHttpClientInvocation invocation;
if (isNotBlank(mySearchUrl)) {
invocation = MethodUtil.createPatchInvocation(myContext, mySearchUrl, myPatchType, myPatchBody);
} else if (myConditional) {
invocation = MethodUtil.createPatchInvocation(myContext, myPatchType, myPatchBody, myResourceType, getParamMap());
} else {
if (myId == null || myId.hasIdPart() == false) {
throw new InvalidRequestException("No ID supplied for resource to patch, can not invoke server");
}
invocation = MethodUtil.createPatchInvocation(myContext, myId, myPatchType, myPatchBody);
}
addPreferHeader(myPrefer, invocation);
OutcomeResponseHandler binding = new OutcomeResponseHandler(myPrefer);
Map<String, List<String>> params = new HashMap<String, List<String>>();
return invoke(params, binding, invocation);
}
@Override
public IPatchExecutable prefer(PreferReturnEnum theReturn) {
myPrefer = theReturn;
return this;
}
@Override
public IPatchWithBody withBody(String thePatchBody) {
Validate.notBlank(thePatchBody, "thePatchBody must not be blank");
myPatchBody = thePatchBody;
EncodingEnum encoding = EncodingEnum.detectEncodingNoDefault(thePatchBody);
if (encoding == EncodingEnum.XML) {
myPatchType = PatchTypeEnum.XML_PATCH;
} else if (encoding == EncodingEnum.JSON) {
myPatchType = PatchTypeEnum.JSON_PATCH;
} else {
throw new IllegalArgumentException("Unable to determine encoding of patch");
}
return this;
}
@Override
public IPatchExecutable withId(IIdType theId) {
if (theId == null) {
throw new NullPointerException("theId can not be null");
}
if (theId.hasIdPart() == false) {
throw new NullPointerException("theId must not be blank and must contain an ID, found: " + theId.getValue());
}
myId = theId;
return this;
}
@Override
public IPatchExecutable withId(String theId) {
if (theId == null) {
throw new NullPointerException("theId can not be null");
}
if (isBlank(theId)) {
throw new NullPointerException("theId must not be blank and must contain an ID, found: " + theId);
}
myId = new IdDt(theId);
return this;
}
}
@SuppressWarnings({ "rawtypes", "unchecked" }) @SuppressWarnings({ "rawtypes", "unchecked" })
private class ReadInternal extends BaseClientExecutable implements IRead, IReadTyped, IReadExecutable { private class ReadInternal extends BaseClientExecutable implements IRead, IReadTyped, IReadExecutable {
private IIdType myId; private IIdType myId;
@ -1533,10 +1626,9 @@ public class GenericClient extends BaseClient implements IGenericClient {
} }
@SuppressWarnings({ "rawtypes", "unchecked" }) @SuppressWarnings({ "rawtypes", "unchecked" })
private class SearchInternal extends BaseClientExecutable implements IQuery, IUntypedQuery, IQueryTyped { private class SearchInternal<OUTPUT> extends BaseSearch<IQuery<OUTPUT>, IQuery<OUTPUT>, OUTPUT> implements IQuery<OUTPUT>, IUntypedQuery<IQuery<OUTPUT>> {
private String myCompartmentName; private String myCompartmentName;
private CriterionList myCriterion = new CriterionList();
private List<Include> myInclude = new ArrayList<Include>(); private List<Include> myInclude = new ArrayList<Include>();
private DateRangeParam myLastUpdated; private DateRangeParam myLastUpdated;
private Integer myParamLimit; private Integer myParamLimit;
@ -1558,12 +1650,6 @@ public class GenericClient extends BaseClient implements IGenericClient {
mySearchUrl = null; mySearchUrl = null;
} }
@Override
public IQuery and(ICriterion<?> theCriterion) {
myCriterion.add((ICriterionInternal) theCriterion);
return this;
}
@Override @Override
public IQuery byUrl(String theSearchUrl) { public IQuery byUrl(String theSearchUrl) {
Validate.notBlank(theSearchUrl, "theSearchUrl must not be blank/null"); Validate.notBlank(theSearchUrl, "theSearchUrl must not be blank/null");
@ -1603,15 +1689,9 @@ public class GenericClient extends BaseClient implements IGenericClient {
} }
@Override @Override
public Object execute() { public OUTPUT execute() {
Map<String, List<String>> params = new LinkedHashMap<String, List<String>>(); Map<String, List<String>> params = getParamMap();
// Map<String, List<String>> initial = createExtraParams();
// if (initial != null) {
// params.putAll(initial);
// }
myCriterion.populateParamList(params);
for (TokenParam next : myTags) { for (TokenParam next : myTags) {
addParam(params, Constants.PARAM_TAG, next.getValueAsQueryToken(myContext)); addParam(params, Constants.PARAM_TAG, next.getValueAsQueryToken(myContext));
@ -1701,7 +1781,7 @@ public class GenericClient extends BaseClient implements IGenericClient {
invocation = SearchMethodBinding.createSearchInvocation(myContext, myResourceName, params, resourceId, myCompartmentName, mySearchStyle); invocation = SearchMethodBinding.createSearchInvocation(myContext, myResourceName, params, resourceId, myCompartmentName, mySearchStyle);
} }
return invoke(params, binding, invocation); return (OUTPUT) invoke(params, binding, invocation);
} }
@ -1711,7 +1791,7 @@ public class GenericClient extends BaseClient implements IGenericClient {
} }
@Override @Override
public IQuery forResource(Class<? extends IBaseResource> theResourceType) { public IQuery forResource(Class theResourceType) {
setType(theResourceType); setType(theResourceType);
return this; return this;
} }
@ -1741,7 +1821,7 @@ public class GenericClient extends BaseClient implements IGenericClient {
} }
@Override @Override
public IQueryTyped returnBundle(Class theClass) { public IQuery returnBundle(Class theClass) {
if (theClass == null) { if (theClass == null) {
throw new NullPointerException("theClass must not be null"); throw new NullPointerException("theClass must not be null");
} }
@ -1780,8 +1860,9 @@ public class GenericClient extends BaseClient implements IGenericClient {
} }
@Override @Override
public IQuery where(ICriterion<?> theCriterion) { public IQuery withAnyProfile(Collection theProfileUris) {
myCriterion.add((ICriterionInternal) theCriterion); Validate.notEmpty(theProfileUris, "theProfileUris must not be null or empty");
myProfiles.add(theProfileUris);
return this; return this;
} }
@ -1799,13 +1880,6 @@ public class GenericClient extends BaseClient implements IGenericClient {
return this; return this;
} }
@Override
public IQuery withAnyProfile(Collection<String> theProfileUris) {
Validate.notEmpty(theProfileUris, "theProfileUris must not be null or empty");
myProfiles.add(theProfileUris);
return this;
}
@Override @Override
public IQuery withSecurity(String theSystem, String theCode) { public IQuery withSecurity(String theSystem, String theCode) {
Validate.notBlank(theCode, "theCode must not be null or empty"); Validate.notBlank(theCode, "theCode must not be null or empty");
@ -1822,12 +1896,13 @@ public class GenericClient extends BaseClient implements IGenericClient {
} }
@SuppressWarnings("rawtypes")
private static class SortInternal implements ISort { private static class SortInternal implements ISort {
private SortOrderEnum myDirection;
private SearchInternal myFor; private SearchInternal myFor;
private String myParamName; private String myParamName;
private String myParamValue; private String myParamValue;
private SortOrderEnum myDirection;
public SortInternal(SearchInternal theFor) { public SortInternal(SearchInternal theFor) {
myFor = theFor; myFor = theFor;
@ -1896,7 +1971,6 @@ public class GenericClient extends BaseClient implements IGenericClient {
} }
} }
private final class TransactionExecutable<T> extends BaseClientExecutable<ITransactionTyped<T>, T> implements ITransactionTyped<T> { private final class TransactionExecutable<T> extends BaseClientExecutable<ITransactionTyped<T>, T> implements ITransactionTyped<T> {
private IBaseBundle myBaseBundle; private IBaseBundle myBaseBundle;
@ -1932,7 +2006,7 @@ public class GenericClient extends BaseClient implements IGenericClient {
ResourceResponseHandler binding = new ResourceResponseHandler(myBaseBundle.getClass(), getPreferResponseTypes()); ResourceResponseHandler binding = new ResourceResponseHandler(myBaseBundle.getClass(), getPreferResponseTypes());
BaseHttpClientInvocation invocation = TransactionMethodBinding.createTransactionInvocation(myBaseBundle, myContext); BaseHttpClientInvocation invocation = TransactionMethodBinding.createTransactionInvocation(myBaseBundle, myContext);
return (T) invoke(params, binding, invocation); return (T) invoke(params, binding, invocation);
// } else if (myRawBundle != null) { // } else if (myRawBundle != null) {
} else { } else {
StringResponseHandler binding = new StringResponseHandler(); StringResponseHandler binding = new StringResponseHandler();
/* /*
@ -1953,7 +2027,6 @@ public class GenericClient extends BaseClient implements IGenericClient {
private final class TransactionInternal implements ITransaction { private final class TransactionInternal implements ITransaction {
@Override @Override
public ITransactionTyped<String> withBundle(String theBundle) { public ITransactionTyped<String> withBundle(String theBundle) {
Validate.notBlank(theBundle, "theBundle must not be null"); Validate.notBlank(theBundle, "theBundle must not be null");
@ -1974,149 +2047,19 @@ public class GenericClient extends BaseClient implements IGenericClient {
} }
private class PatchInternal extends BaseClientExecutable<IPatchExecutable, MethodOutcome> implements IPatch, IPatchWithBody, IPatchExecutable, IPatchWithQuery, IPatchWithQueryTyped { private class UpdateInternal extends BaseSearch<IUpdateExecutable, IUpdateWithQueryTyped, MethodOutcome>
implements IUpdate, IUpdateTyped, IUpdateExecutable, IUpdateWithQuery, IUpdateWithQueryTyped {
private CriterionList myCriterionList; private boolean myConditional;
private IIdType myId;
private PreferReturnEnum myPrefer;
private PatchTypeEnum myPatchType;
private String myPatchBody;
private String mySearchUrl;
private String myResourceType;
@Override
public IPatchWithQueryTyped and(ICriterion<?> theCriterion) {
myCriterionList.add((ICriterionInternal) theCriterion);
return this;
}
@Override
public IPatchWithQuery conditional(String theResourceType) {
Validate.notBlank(theResourceType, "theResourceType must not be null");
myResourceType = theResourceType;
myCriterionList = new CriterionList();
return this;
}
// TODO: This is not longer used.. Deprecate it or just remove it?
@Override
public IPatchWithBody conditionalByUrl(String theSearchUrl) {
mySearchUrl = validateAndEscapeConditionalUrl(theSearchUrl);
return this;
}
@Override
public MethodOutcome execute() {
if (myPatchType == null) {
throw new InvalidRequestException("No patch type supplied, cannot invoke server");
}
if (myPatchBody == null) {
throw new InvalidRequestException("No patch body supplied, cannot invoke server");
}
BaseHttpClientInvocation invocation;
if (isNotBlank(mySearchUrl)) {
invocation = MethodUtil.createPatchInvocation(myContext, mySearchUrl, myPatchType, myPatchBody);
} else if (myCriterionList != null) {
invocation = MethodUtil.createPatchInvocation(myContext, myPatchType, myPatchBody, myResourceType, myCriterionList.toParamList());
} else {
if (myId == null || myId.hasIdPart() == false) {
throw new InvalidRequestException("No ID supplied for resource to patch, can not invoke server");
}
invocation = MethodUtil.createPatchInvocation(myContext, myId, myPatchType, myPatchBody);
}
addPreferHeader(myPrefer, invocation);
OutcomeResponseHandler binding = new OutcomeResponseHandler(myPrefer);
Map<String, List<String>> params = new HashMap<String, List<String>>();
return invoke(params, binding, invocation);
}
@Override
public IPatchExecutable prefer(PreferReturnEnum theReturn) {
myPrefer = theReturn;
return this;
}
@Override
public IPatchWithQueryTyped where(ICriterion<?> theCriterion) {
myCriterionList.add((ICriterionInternal) theCriterion);
return this;
}
@Override
public IPatchExecutable withId(IIdType theId) {
if (theId == null) {
throw new NullPointerException("theId can not be null");
}
if (theId.hasIdPart() == false) {
throw new NullPointerException("theId must not be blank and must contain an ID, found: " + theId.getValue());
}
myId = theId;
return this;
}
@Override
public IPatchExecutable withId(String theId) {
if (theId == null) {
throw new NullPointerException("theId can not be null");
}
if (isBlank(theId)) {
throw new NullPointerException("theId must not be blank and must contain an ID, found: " + theId);
}
myId = new IdDt(theId);
return this;
}
@Override
public IPatchWithBody withBody(String thePatchBody) {
Validate.notBlank(thePatchBody, "thePatchBody must not be blank");
myPatchBody = thePatchBody;
EncodingEnum encoding = EncodingEnum.detectEncodingNoDefault(thePatchBody);
if (encoding == EncodingEnum.XML) {
myPatchType = PatchTypeEnum.XML_PATCH;
} else if (encoding == EncodingEnum.JSON) {
myPatchType = PatchTypeEnum.JSON_PATCH;
} else {
throw new IllegalArgumentException("Unable to determine encoding of patch");
}
return this;
}
@Override
public IPatchWithQuery conditional(Class<? extends IBaseResource> theClass) {
Validate.notNull(theClass, "theClass must not be null");
String resourceType = myContext.getResourceDefinition(theClass).getName();
return conditional(resourceType);
}
}
private class UpdateInternal extends BaseClientExecutable<IUpdateExecutable, MethodOutcome> implements IUpdate, IUpdateTyped, IUpdateExecutable, IUpdateWithQuery, IUpdateWithQueryTyped {
private CriterionList myCriterionList;
private IIdType myId; private IIdType myId;
private PreferReturnEnum myPrefer; private PreferReturnEnum myPrefer;
private IBaseResource myResource; private IBaseResource myResource;
private String myResourceBody; private String myResourceBody;
private String mySearchUrl; private String mySearchUrl;
@Override
public IUpdateWithQueryTyped and(ICriterion<?> theCriterion) {
myCriterionList.add((ICriterionInternal) theCriterion);
return this;
}
@Override @Override
public IUpdateWithQuery conditional() { public IUpdateWithQuery conditional() {
myCriterionList = new CriterionList(); myConditional = true;
return this; return this;
} }
@ -2140,8 +2083,8 @@ public class GenericClient extends BaseClient implements IGenericClient {
BaseHttpClientInvocation invocation; BaseHttpClientInvocation invocation;
if (mySearchUrl != null) { if (mySearchUrl != null) {
invocation = MethodUtil.createUpdateInvocation(myContext, myResource, myResourceBody, mySearchUrl); invocation = MethodUtil.createUpdateInvocation(myContext, myResource, myResourceBody, mySearchUrl);
} else if (myCriterionList != null) { } else if (myConditional) {
invocation = MethodUtil.createUpdateInvocation(myContext, myResource, myResourceBody, myCriterionList.toParamList()); invocation = MethodUtil.createUpdateInvocation(myContext, myResource, myResourceBody, getParamMap());
} else { } else {
if (myId == null) { if (myId == null) {
myId = myResource.getIdElement(); myId = myResource.getIdElement();
@ -2182,12 +2125,6 @@ public class GenericClient extends BaseClient implements IGenericClient {
return this; return this;
} }
@Override
public IUpdateWithQueryTyped where(ICriterion<?> theCriterion) {
myCriterionList.add((ICriterionInternal) theCriterion);
return this;
}
@Override @Override
public IUpdateExecutable withId(IIdType theId) { public IUpdateExecutable withId(IIdType theId) {
if (theId == null) { if (theId == null) {

View File

@ -13,7 +13,8 @@ import ca.uhn.fhir.context.RuntimeResourceDefinition;
import ca.uhn.fhir.context.RuntimeSearchParam; import ca.uhn.fhir.context.RuntimeSearchParam;
import ca.uhn.fhir.jpa.entity.ResourceTable; import ca.uhn.fhir.jpa.entity.ResourceTable;
import ca.uhn.fhir.jpa.util.DeleteConflict; import ca.uhn.fhir.jpa.util.DeleteConflict;
import ca.uhn.fhir.model.api.*; import ca.uhn.fhir.model.api.IResource;
import ca.uhn.fhir.model.api.Include;
import ca.uhn.fhir.model.base.composite.BaseResourceReferenceDt; import ca.uhn.fhir.model.base.composite.BaseResourceReferenceDt;
import ca.uhn.fhir.model.dstu2.resource.OperationOutcome; import ca.uhn.fhir.model.dstu2.resource.OperationOutcome;
import ca.uhn.fhir.model.dstu2.valueset.IssueSeverityEnum; import ca.uhn.fhir.model.dstu2.valueset.IssueSeverityEnum;
@ -22,7 +23,6 @@ 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.server.exceptions.*; import ca.uhn.fhir.rest.server.exceptions.*;
import ca.uhn.fhir.rest.server.interceptor.IServerInterceptor.ActionRequestDetails; import ca.uhn.fhir.rest.server.interceptor.IServerInterceptor.ActionRequestDetails;
import ca.uhn.fhir.util.CoverageIgnore;
import ca.uhn.fhir.util.FhirTerser; import ca.uhn.fhir.util.FhirTerser;
import ca.uhn.fhir.validation.*; import ca.uhn.fhir.validation.*;
@ -36,7 +36,7 @@ import ca.uhn.fhir.validation.*;
* 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,
@ -55,7 +55,7 @@ public class FhirResourceDaoDstu2<T extends IResource> extends BaseHapiFhirResou
@Autowired() @Autowired()
@Qualifier("myInstanceValidatorDstu2") @Qualifier("myInstanceValidatorDstu2")
private IValidatorModule myInstanceValidator; private IValidatorModule myInstanceValidator;
@Override @Override
protected List<Object> getIncludeValues(FhirTerser theTerser, Include theInclude, IBaseResource theResource, RuntimeResourceDefinition theResourceDef) { protected List<Object> getIncludeValues(FhirTerser theTerser, Include theInclude, IBaseResource theResource, RuntimeResourceDefinition theResourceDef) {
List<Object> values; List<Object> values;
@ -100,7 +100,7 @@ public class FhirResourceDaoDstu2<T extends IResource> extends BaseHapiFhirResou
List<DeleteConflict> deleteConflicts = new ArrayList<DeleteConflict>(); List<DeleteConflict> deleteConflicts = new ArrayList<DeleteConflict>();
validateOkToDelete(deleteConflicts, entity); validateOkToDelete(deleteConflicts, entity);
validateDeleteConflictsEmptyOrThrowException(deleteConflicts); validateDeleteConflictsEmptyOrThrowException(deleteConflicts);
OperationOutcome oo = new OperationOutcome(); OperationOutcome oo = new OperationOutcome();
oo.addIssue().setSeverity(IssueSeverityEnum.INFORMATION).setDiagnostics("Ok to delete"); oo.addIssue().setSeverity(IssueSeverityEnum.INFORMATION).setDiagnostics("Ok to delete");
return new MethodOutcome(new IdDt(theId.getValue()), oo); return new MethodOutcome(new IdDt(theId.getValue()), oo);
@ -155,12 +155,6 @@ public class FhirResourceDaoDstu2<T extends IResource> extends BaseHapiFhirResou
} }
@CoverageIgnore
@Override
public void validateBundle(IValidationContext<Bundle> theContext) {
throw new UnsupportedOperationException();
}
} }
} }

View File

@ -10,7 +10,7 @@ package ca.uhn.fhir.jpa.dao.dstu3;
* 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,
@ -33,19 +33,18 @@ import org.hl7.fhir.instance.model.api.*;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.beans.factory.annotation.Qualifier;
import ca.uhn.fhir.context.*; import ca.uhn.fhir.context.RuntimeResourceDefinition;
import ca.uhn.fhir.context.RuntimeSearchParam;
import ca.uhn.fhir.jpa.dao.BaseHapiFhirResourceDao; import ca.uhn.fhir.jpa.dao.BaseHapiFhirResourceDao;
import ca.uhn.fhir.jpa.dao.IFhirResourceDao; import ca.uhn.fhir.jpa.dao.IFhirResourceDao;
import ca.uhn.fhir.jpa.entity.ResourceTable; import ca.uhn.fhir.jpa.entity.ResourceTable;
import ca.uhn.fhir.jpa.util.DeleteConflict; import ca.uhn.fhir.jpa.util.DeleteConflict;
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.base.composite.BaseResourceReferenceDt; import ca.uhn.fhir.model.base.composite.BaseResourceReferenceDt;
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.server.exceptions.*; import ca.uhn.fhir.rest.server.exceptions.*;
import ca.uhn.fhir.rest.server.interceptor.IServerInterceptor.ActionRequestDetails; import ca.uhn.fhir.rest.server.interceptor.IServerInterceptor.ActionRequestDetails;
import ca.uhn.fhir.util.CoverageIgnore;
import ca.uhn.fhir.util.FhirTerser; import ca.uhn.fhir.util.FhirTerser;
import ca.uhn.fhir.validation.*; import ca.uhn.fhir.validation.*;
@ -57,9 +56,6 @@ public class FhirResourceDaoDstu3<T extends IAnyResource> extends BaseHapiFhirRe
@Qualifier("myInstanceValidatorDstu3") @Qualifier("myInstanceValidatorDstu3")
private IValidatorModule myInstanceValidator; private IValidatorModule myInstanceValidator;
@Autowired
private FhirContext fhirContext;
@Override @Override
protected IBaseOperationOutcome createOperationOutcome(String theSeverity, String theMessage, String theCode) { protected IBaseOperationOutcome createOperationOutcome(String theSeverity, String theMessage, String theCode) {
OperationOutcome oo = new OperationOutcome(); OperationOutcome oo = new OperationOutcome();
@ -127,7 +123,7 @@ public class FhirResourceDaoDstu3<T extends IAnyResource> extends BaseHapiFhirRe
IFhirResourceDao<? extends IBaseResource> dao = getDao(type); IFhirResourceDao<? extends IBaseResource> dao = getDao(type);
resourceToValidateById = dao.read(theId, theRequestDetails); resourceToValidateById = dao.read(theId, theRequestDetails);
} }
ValidationResult result; ValidationResult result;
if (theResource == null) { if (theResource == null) {
if (resourceToValidateById != null) { if (resourceToValidateById != null) {
@ -160,12 +156,6 @@ public class FhirResourceDaoDstu3<T extends IAnyResource> extends BaseHapiFhirRe
myMode = theMode; myMode = theMode;
} }
@CoverageIgnore
@Override
public void validateBundle(IValidationContext<Bundle> theContext) {
throw new UnsupportedOperationException();
}
@Override @Override
public void validateResource(IValidationContext<IBaseResource> theCtx) { public void validateResource(IValidationContext<IBaseResource> theCtx) {
boolean hasId = theCtx.getResource().getIdElement().hasIdPart(); boolean hasId = theCtx.getResource().getIdElement().hasIdPart();

View File

@ -24,28 +24,27 @@ import static org.apache.commons.lang3.StringUtils.isNotBlank;
import java.util.*; import java.util.*;
import org.hl7.fhir.exceptions.FHIRException;
import org.hl7.fhir.instance.model.api.*;
import org.hl7.fhir.r4.model.IdType; import org.hl7.fhir.r4.model.IdType;
import org.hl7.fhir.r4.model.OperationOutcome; import org.hl7.fhir.r4.model.OperationOutcome;
import org.hl7.fhir.r4.model.OperationOutcome.IssueSeverity; import org.hl7.fhir.r4.model.OperationOutcome.IssueSeverity;
import org.hl7.fhir.r4.model.OperationOutcome.OperationOutcomeIssueComponent; import org.hl7.fhir.r4.model.OperationOutcome.OperationOutcomeIssueComponent;
import org.hl7.fhir.exceptions.FHIRException;
import org.hl7.fhir.instance.model.api.*;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.beans.factory.annotation.Qualifier;
import ca.uhn.fhir.context.*; import ca.uhn.fhir.context.RuntimeResourceDefinition;
import ca.uhn.fhir.context.RuntimeSearchParam;
import ca.uhn.fhir.jpa.dao.BaseHapiFhirResourceDao; import ca.uhn.fhir.jpa.dao.BaseHapiFhirResourceDao;
import ca.uhn.fhir.jpa.dao.IFhirResourceDao; import ca.uhn.fhir.jpa.dao.IFhirResourceDao;
import ca.uhn.fhir.jpa.entity.ResourceTable; import ca.uhn.fhir.jpa.entity.ResourceTable;
import ca.uhn.fhir.jpa.util.DeleteConflict; import ca.uhn.fhir.jpa.util.DeleteConflict;
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.base.composite.BaseResourceReferenceDt; import ca.uhn.fhir.model.base.composite.BaseResourceReferenceDt;
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.server.exceptions.*; import ca.uhn.fhir.rest.server.exceptions.*;
import ca.uhn.fhir.rest.server.interceptor.IServerInterceptor.ActionRequestDetails; import ca.uhn.fhir.rest.server.interceptor.IServerInterceptor.ActionRequestDetails;
import ca.uhn.fhir.util.CoverageIgnore;
import ca.uhn.fhir.util.FhirTerser; import ca.uhn.fhir.util.FhirTerser;
import ca.uhn.fhir.validation.*; import ca.uhn.fhir.validation.*;
@ -57,9 +56,6 @@ public class FhirResourceDaoR4<T extends IAnyResource> extends BaseHapiFhirResou
@Qualifier("myInstanceValidatorDstu3") @Qualifier("myInstanceValidatorDstu3")
private IValidatorModule myInstanceValidator; private IValidatorModule myInstanceValidator;
@Autowired
private FhirContext fhirContext;
@Override @Override
protected IBaseOperationOutcome createOperationOutcome(String theSeverity, String theMessage, String theCode) { protected IBaseOperationOutcome createOperationOutcome(String theSeverity, String theMessage, String theCode) {
OperationOutcome oo = new OperationOutcome(); OperationOutcome oo = new OperationOutcome();
@ -160,12 +156,6 @@ public class FhirResourceDaoR4<T extends IAnyResource> extends BaseHapiFhirResou
myMode = theMode; myMode = theMode;
} }
@CoverageIgnore
@Override
public void validateBundle(IValidationContext<Bundle> theContext) {
throw new UnsupportedOperationException();
}
@Override @Override
public void validateResource(IValidationContext<IBaseResource> theCtx) { public void validateResource(IValidationContext<IBaseResource> theCtx) {
boolean hasId = theCtx.getResource().getIdElement().hasIdPart(); boolean hasId = theCtx.getResource().getIdElement().hasIdPart();

View File

@ -10,7 +10,7 @@ package ca.uhn.fhir.jpa.provider;
* 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,
@ -30,7 +30,6 @@ import org.springframework.beans.factory.annotation.Required;
import ca.uhn.fhir.jpa.dao.DaoMethodOutcome; import ca.uhn.fhir.jpa.dao.DaoMethodOutcome;
import ca.uhn.fhir.jpa.dao.IFhirResourceDao; import ca.uhn.fhir.jpa.dao.IFhirResourceDao;
import ca.uhn.fhir.model.api.TagList;
import ca.uhn.fhir.rest.annotation.*; import ca.uhn.fhir.rest.annotation.*;
import ca.uhn.fhir.rest.api.PatchTypeEnum; import ca.uhn.fhir.rest.api.PatchTypeEnum;
import ca.uhn.fhir.rest.api.server.IBundleProvider; import ca.uhn.fhir.rest.api.server.IBundleProvider;
@ -65,7 +64,7 @@ public abstract class BaseJpaResourceProvider<T extends IBaseResource> extends B
@At DateRangeParam theAt, @At DateRangeParam theAt,
RequestDetails theRequestDetails) { RequestDetails theRequestDetails) {
//@formatter:on //@formatter:on
startRequest(theRequest); startRequest(theRequest);
try { try {
DateRangeParam sinceOrAt = processSinceOrAt(theSince, theAt); DateRangeParam sinceOrAt = processSinceOrAt(theSince, theAt);
@ -77,9 +76,9 @@ public abstract class BaseJpaResourceProvider<T extends IBaseResource> extends B
@History @History
public IBundleProvider getHistoryForResourceType( public IBundleProvider getHistoryForResourceType(
HttpServletRequest theRequest, HttpServletRequest theRequest,
@Since Date theSince, @Since Date theSince,
@At DateRangeParam theAt, @At DateRangeParam theAt,
RequestDetails theRequestDetails) { RequestDetails theRequestDetails) {
startRequest(theRequest); startRequest(theRequest);
try { try {
@ -95,26 +94,6 @@ public abstract class BaseJpaResourceProvider<T extends IBaseResource> extends B
return myDao.getResourceType(); return myDao.getResourceType();
} }
@GetTags
public TagList getTagsForResourceInstance(HttpServletRequest theRequest, @IdParam IIdType theResourceId, RequestDetails theRequestDetails) {
startRequest(theRequest);
try {
return myDao.getTags(theResourceId, theRequestDetails);
} finally {
endRequest(theRequest);
}
}
@GetTags
public TagList getTagsForResourceType(HttpServletRequest theRequest, RequestDetails theRequestDetails) {
startRequest(theRequest);
try {
return myDao.getAllResourceTags(theRequestDetails);
} finally {
endRequest(theRequest);
}
}
@Read(version = true) @Read(version = true)
public T read(HttpServletRequest theRequest, @IdParam IIdType theId, RequestDetails theRequestDetails) { public T read(HttpServletRequest theRequest, @IdParam IIdType theId, RequestDetails theRequestDetails) {
startRequest(theRequest); startRequest(theRequest);

View File

@ -10,7 +10,7 @@ package ca.uhn.fhir.jpa.provider;
* 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,7 +27,6 @@ import javax.servlet.http.HttpServletRequest;
import org.springframework.beans.factory.annotation.Required; import org.springframework.beans.factory.annotation.Required;
import ca.uhn.fhir.jpa.dao.IFhirSystemDao; import ca.uhn.fhir.jpa.dao.IFhirSystemDao;
import ca.uhn.fhir.model.api.TagList;
import ca.uhn.fhir.rest.annotation.*; import ca.uhn.fhir.rest.annotation.*;
import ca.uhn.fhir.rest.api.server.IBundleProvider; import ca.uhn.fhir.rest.api.server.IBundleProvider;
import ca.uhn.fhir.rest.api.server.RequestDetails; import ca.uhn.fhir.rest.api.server.RequestDetails;
@ -36,23 +35,13 @@ import ca.uhn.fhir.rest.param.DateRangeParam;
public class BaseJpaSystemProvider<T, MT> extends BaseJpaProvider { public class BaseJpaSystemProvider<T, MT> extends BaseJpaProvider {
public static final String MARK_ALL_RESOURCES_FOR_REINDEXING = "$mark-all-resources-for-reindexing"; public static final String MARK_ALL_RESOURCES_FOR_REINDEXING = "$mark-all-resources-for-reindexing";
private IFhirSystemDao<T, MT> myDao; private IFhirSystemDao<T, MT> myDao;
public BaseJpaSystemProvider() { public BaseJpaSystemProvider() {
// nothing // nothing
} }
@GetTags
public TagList getAllTagsOnServer(HttpServletRequest theRequest, RequestDetails theRequestDetails) {
startRequest(theRequest);
try {
return myDao.getAllTags(theRequestDetails);
} finally {
endRequest(theRequest);
}
}
protected IFhirSystemDao<T, MT> getDao() { protected IFhirSystemDao<T, MT> getDao() {
return myDao; return myDao;
} }

View File

@ -1,7 +1,23 @@
package ca.uhn.fhir.jpa.provider; package ca.uhn.fhir.jpa.provider;
import static org.hamcrest.Matchers.*; import static org.hamcrest.Matchers.contains;
import static org.junit.Assert.*; import static org.hamcrest.Matchers.containsInAnyOrder;
import static org.hamcrest.Matchers.containsInRelativeOrder;
import static org.hamcrest.Matchers.containsString;
import static org.hamcrest.Matchers.empty;
import static org.hamcrest.Matchers.emptyString;
import static org.hamcrest.Matchers.greaterThan;
import static org.hamcrest.Matchers.hasItems;
import static org.hamcrest.Matchers.not;
import static org.hamcrest.Matchers.startsWith;
import static org.hamcrest.Matchers.stringContainsInOrder;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertNotEquals;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertThat;
import static org.junit.Assert.assertTrue;
import static org.junit.Assert.fail;
import java.io.*; import java.io.*;
import java.net.*; import java.net.*;
@ -34,7 +50,6 @@ 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.*;
import ca.uhn.fhir.rest.client.api.IGenericClient; import ca.uhn.fhir.rest.client.api.IGenericClient;
import ca.uhn.fhir.rest.gclient.*;
import ca.uhn.fhir.rest.param.*; import ca.uhn.fhir.rest.param.*;
import ca.uhn.fhir.rest.server.exceptions.*; import ca.uhn.fhir.rest.server.exceptions.*;
import ca.uhn.fhir.util.*; import ca.uhn.fhir.util.*;
@ -457,6 +472,7 @@ public class ResourceProviderDstu2Test extends BaseResourceProviderDstu2Test {
.forResource(Organization.class) .forResource(Organization.class)
.where(Organization.NAME.matches().value("rpdstu2_testCountParam_01")) .where(Organization.NAME.matches().value("rpdstu2_testCountParam_01"))
.count(10) .count(10)
.returnBundle(Bundle.class)
.execute(); .execute();
assertEquals(100, found.getTotalElement().getValue().intValue()); assertEquals(100, found.getTotalElement().getValue().intValue());
assertEquals(10, found.getEntry().size()); assertEquals(10, found.getEntry().size());
@ -466,6 +482,7 @@ public class ResourceProviderDstu2Test extends BaseResourceProviderDstu2Test {
.forResource(Organization.class) .forResource(Organization.class)
.where(Organization.NAME.matches().value("rpdstu2_testCountParam_01")) .where(Organization.NAME.matches().value("rpdstu2_testCountParam_01"))
.count(999) .count(999)
.returnBundle(Bundle.class)
.execute(); .execute();
assertEquals(100, found.getTotalElement().getValue().intValue()); assertEquals(100, found.getTotalElement().getValue().intValue());
assertEquals(50, found.getEntry().size()); assertEquals(50, found.getEntry().size());
@ -704,6 +721,7 @@ public class ResourceProviderDstu2Test extends BaseResourceProviderDstu2Test {
.where(Encounter.IDENTIFIER.exactly().systemAndCode("urn:foo", "testDeepChainingE1")) .where(Encounter.IDENTIFIER.exactly().systemAndCode("urn:foo", "testDeepChainingE1"))
.include(Encounter.INCLUDE_LOCATION.asRecursive()) .include(Encounter.INCLUDE_LOCATION.asRecursive())
.include(Location.INCLUDE_PARTOF.asRecursive()) .include(Location.INCLUDE_PARTOF.asRecursive())
.returnBundle(Bundle.class)
.execute(); .execute();
assertEquals(3, res.getEntry().size()); assertEquals(3, res.getEntry().size());
@ -1581,15 +1599,6 @@ public class ResourceProviderDstu2Test extends BaseResourceProviderDstu2Test {
pat = new Patient(); pat = new Patient();
pat.addIdentifier().setSystem("urn:system").setValue("testReadAllInstancesOfType_02"); pat.addIdentifier().setSystem("urn:system").setValue("testReadAllInstancesOfType_02");
ourClient.create().resource(pat).prettyPrint().encodedXml().execute().getId(); ourClient.create().resource(pat).prettyPrint().encodedXml().execute().getId();
{
IQuery a = ourClient
.search()
.forResource(Patient.class);
IQueryTyped<Bundle> b = a.returnBundle(Bundle.class);
IClientExecutable<?, ?> x = b.encodedXml();
x.execute();
}
{ {
Bundle returned = ourClient Bundle returned = ourClient
.search() .search()
@ -1598,10 +1607,15 @@ public class ResourceProviderDstu2Test extends BaseResourceProviderDstu2Test {
.encodedXml() .encodedXml()
.execute(); .execute();
assertThat(returned.getEntry().size(), greaterThan(1)); assertThat(returned.getEntry().size(), greaterThan(1));
assertEquals(BundleTypeEnum.SEARCHSET, returned.getType().getValueAsEnum()); assertEquals(BundleTypeEnum.SEARCHSET, returned.getTypeElement().getValueAsEnum());
} }
{ {
Bundle returned = ourClient.search().forResource(Patient.class).encodedJson().execute(); Bundle returned = ourClient
.search()
.forResource(Patient.class)
.encodedJson()
.returnBundle(Bundle.class)
.execute();
assertThat(returned.getEntry().size(), greaterThan(1)); assertThat(returned.getEntry().size(), greaterThan(1));
} }
} }
@ -1648,7 +1662,13 @@ public class ResourceProviderDstu2Test extends BaseResourceProviderDstu2Test {
assertEquals(1, actual.getContained().getContainedResources().size()); assertEquals(1, actual.getContained().getContainedResources().size());
assertThat(actual.getText().getDiv().getValueAsString(), containsString("<td>Identifier</td><td>testSaveAndRetrieveWithContained01</td>")); assertThat(actual.getText().getDiv().getValueAsString(), containsString("<td>Identifier</td><td>testSaveAndRetrieveWithContained01</td>"));
Bundle b = ourClient.search().forResource("Patient").where(Patient.IDENTIFIER.exactly().systemAndCode("urn:system:rpdstu2", "testSaveAndRetrieveWithContained01")).prettyPrint().execute(); Bundle b = ourClient
.search()
.forResource("Patient")
.where(Patient.IDENTIFIER.exactly().systemAndCode("urn:system:rpdstu2", "testSaveAndRetrieveWithContained01"))
.prettyPrint()
.returnBundle(Bundle.class)
.execute();
assertEquals(1, b.getEntry().size()); assertEquals(1, b.getEntry().size());
} }
@ -1714,7 +1734,13 @@ public class ResourceProviderDstu2Test extends BaseResourceProviderDstu2Test {
p1.addIdentifier().setValue("testSearchByIdentifierWithoutSystem01"); p1.addIdentifier().setValue("testSearchByIdentifierWithoutSystem01");
IdDt p1Id = (IdDt) ourClient.create().resource(p1).execute().getId(); IdDt p1Id = (IdDt) ourClient.create().resource(p1).execute().getId();
Bundle actual = ourClient.search().forResource(Patient.class).where(Patient.IDENTIFIER.exactly().systemAndCode(null, "testSearchByIdentifierWithoutSystem01")).encodedJson().prettyPrint() Bundle actual = ourClient
.search()
.forResource(Patient.class)
.where(Patient.IDENTIFIER.exactly().systemAndCode(null, "testSearchByIdentifierWithoutSystem01"))
.encodedJson()
.prettyPrint()
.returnBundle(Bundle.class)
.execute(); .execute();
assertEquals(1, actual.getEntry().size()); assertEquals(1, actual.getEntry().size());
assertEquals(p1Id.getIdPart(), actual.getEntry().get(0).getResource().getId().getIdPart()); assertEquals(p1Id.getIdPart(), actual.getEntry().get(0).getResource().getId().getIdPart());
@ -1736,14 +1762,13 @@ public class ResourceProviderDstu2Test extends BaseResourceProviderDstu2Test {
id2 = myPatientDao.create(patient, mySrd).getId().toUnqualifiedVersionless(); id2 = myPatientDao.create(patient, mySrd).getId().toUnqualifiedVersionless();
} }
//@formatter:off
Bundle found = ourClient Bundle found = ourClient
.search() .search()
.forResource(Patient.class) .forResource(Patient.class)
.where(BaseResource.RES_ID.matches().values(id1.getIdPart(), id2.getIdPart())) .where(BaseResource.RES_ID.matches().values(id1.getIdPart(), id2.getIdPart()))
.and(BaseResource.RES_ID.matches().value(id1.getIdPart())) .and(BaseResource.RES_ID.matches().value(id1.getIdPart()))
.returnBundle(Bundle.class)
.execute(); .execute();
//@formatter:on
assertThat(toIdListUnqualifiedVersionless(found), containsInAnyOrder(id1)); assertThat(toIdListUnqualifiedVersionless(found), containsInAnyOrder(id1));
} }
@ -1761,21 +1786,24 @@ public class ResourceProviderDstu2Test extends BaseResourceProviderDstu2Test {
p1.setManagingOrganization(new ResourceReferenceDt(o1id.toUnqualifiedVersionless())); p1.setManagingOrganization(new ResourceReferenceDt(o1id.toUnqualifiedVersionless()));
IdDt p1Id = (IdDt) ourClient.create().resource(p1).execute().getId(); IdDt p1Id = (IdDt) ourClient.create().resource(p1).execute().getId();
//@formatter:off
Bundle actual = ourClient.search() Bundle actual = ourClient.search()
.forResource(Patient.class) .forResource(Patient.class)
.where(Patient.ORGANIZATION.hasId(o1id.getIdPart())) .where(Patient.ORGANIZATION.hasId(o1id.getIdPart()))
.encodedJson().prettyPrint().execute(); .encodedJson()
//@formatter:on .prettyPrint()
.returnBundle(Bundle.class)
.execute();
assertEquals(1, actual.getEntry().size()); assertEquals(1, actual.getEntry().size());
assertEquals(p1Id.getIdPart(), actual.getEntry().get(0).getResource().getId().getIdPart()); assertEquals(p1Id.getIdPart(), actual.getEntry().get(0).getResource().getId().getIdPart());
//@formatter:off actual = ourClient
actual = ourClient.search() .search()
.forResource(Patient.class) .forResource(Patient.class)
.where(Patient.ORGANIZATION.hasId(o1id.getValue())) .where(Patient.ORGANIZATION.hasId(o1id.getValue()))
.encodedJson().prettyPrint().execute(); .encodedJson()
//@formatter:on .prettyPrint()
.returnBundle(Bundle.class)
.execute();
assertEquals(1, actual.getEntry().size()); assertEquals(1, actual.getEntry().size());
assertEquals(p1Id.getIdPart(), actual.getEntry().get(0).getResource().getId().getIdPart()); assertEquals(p1Id.getIdPart(), actual.getEntry().get(0).getResource().getId().getIdPart());
@ -1802,17 +1830,19 @@ public class ResourceProviderDstu2Test extends BaseResourceProviderDstu2Test {
p2.setManagingOrganization(new ResourceReferenceDt(o2id.toUnqualifiedVersionless())); p2.setManagingOrganization(new ResourceReferenceDt(o2id.toUnqualifiedVersionless()));
IdDt p2Id = (IdDt) ourClient.create().resource(p2).execute().getId(); IdDt p2Id = (IdDt) ourClient.create().resource(p2).execute().getId();
//@formatter:off
Bundle actual = ourClient.search() Bundle actual = ourClient.search()
.forResource(Patient.class) .forResource(Patient.class)
.where(Patient.ORGANIZATION.hasAnyOfIds(Arrays.asList(o1id.getIdPart(), o2id.getIdPart()))) .where(Patient.ORGANIZATION.hasAnyOfIds(Arrays.asList(o1id.getIdPart(), o2id.getIdPart())))
.encodedJson().prettyPrint().execute(); .encodedJson()
//@formatter:on .prettyPrint()
.returnBundle(Bundle.class)
.execute();
Set<String> expectedIds = new HashSet<String>(); Set<String> expectedIds = new HashSet<String>();
expectedIds.add(p1Id.getIdPart()); expectedIds.add(p1Id.getIdPart());
expectedIds.add(p2Id.getIdPart()); expectedIds.add(p2Id.getIdPart());
Set<String> actualIds = new HashSet<String>(); Set<String> actualIds = new HashSet<String>();
for (BundleEntry ele : actual.getEntry()) { for (Entry ele : actual.getEntry()) {
actualIds.add(ele.getResource().getId().getIdPart()); actualIds.add(ele.getResource().getId().getIdPart());
} }
assertEquals("Expects to retrieve the 2 patients which reference the two different organizations", expectedIds, actualIds); assertEquals("Expects to retrieve the 2 patients which reference the two different organizations", expectedIds, actualIds);
@ -1828,40 +1858,49 @@ public class ResourceProviderDstu2Test extends BaseResourceProviderDstu2Test {
o2.setName("testSearchByResourceChainName02"); o2.setName("testSearchByResourceChainName02");
o2.getMeta().addProfile("http://profile1").addProfile("http://profile3"); o2.getMeta().addProfile("http://profile1").addProfile("http://profile3");
IdDt o2id = (IdDt) ourClient.create().resource(o2).execute().getId().toUnqualifiedVersionless(); IdDt o2id = (IdDt) ourClient.create().resource(o2).execute().getId().toUnqualifiedVersionless();
//@formatter:off
Bundle actual = ourClient.search() Bundle actual = ourClient.search()
.forResource(Organization.class) .forResource(Organization.class)
.withProfile("http://profile1") .withProfile("http://profile1")
.withProfile("http://profileX") .withProfile("http://profileX")
.encodedJson().prettyPrint().execute(); .encodedJson()
//@formatter:on .prettyPrint()
.returnBundle(Bundle.class)
.execute();
assertEquals("nothing matches profile x", Collections.emptyList(), actual.getEntry()); assertEquals("nothing matches profile x", Collections.emptyList(), actual.getEntry());
//@formatter:off
actual = ourClient.search() actual = ourClient.search()
.forResource(Organization.class) .forResource(Organization.class)
.withProfile("http://profile1") .withProfile("http://profile1")
.withProfile("http://profile2") .withProfile("http://profile2")
.encodedJson().prettyPrint().execute(); .returnBundle(Bundle.class)
//@formatter:on .encodedJson()
.prettyPrint()
.execute();
Set<String> expectedIds = new HashSet<String>(); Set<String> expectedIds = new HashSet<String>();
expectedIds.add(o1id.getIdPart()); expectedIds.add(o1id.getIdPart());
Set<String> actualIds = new HashSet<String>(); Set<String> actualIds = new HashSet<String>();
for (BundleEntry ele : actual.getEntry()) { for (Entry ele : actual.getEntry()) {
actualIds.add(ele.getResource().getId().getIdPart()); actualIds.add(ele.getResource().getId().getIdPart());
} }
assertEquals("Expects to retrieve the 1 orgination matching on Org1's profiles", expectedIds, actualIds); assertEquals("Expects to retrieve the 1 orgination matching on Org1's profiles", expectedIds, actualIds);
//@formatter:off
actual = ourClient.search() actual = ourClient.search()
.forResource(Organization.class) .forResource(Organization.class)
.withProfile("http://profile1") .withProfile("http://profile1")
.withAnyProfile(Arrays.asList("http://profile3", "http://profile2")) .withAnyProfile(Arrays.asList("http://profile3", "http://profile2"))
.encodedJson().prettyPrint().execute(); .encodedJson()
//@formatter:on .prettyPrint()
.returnBundle(Bundle.class)
.execute();
expectedIds = new HashSet<String>(); expectedIds = new HashSet<String>();
expectedIds.add(o1id.getIdPart()); expectedIds.add(o1id.getIdPart());
expectedIds.add(o2id.getIdPart()); expectedIds.add(o2id.getIdPart());
actualIds = new HashSet<String>(); actualIds = new HashSet<String>();
for (BundleEntry ele : actual.getEntry()) { for (Entry ele : actual.getEntry()) {
actualIds.add(ele.getResource().getId().getIdPart()); actualIds.add(ele.getResource().getId().getIdPart());
} }
assertEquals("Expects to retrieve the 2 orginations, since we match on (the common profile AND (Org1's second profile OR org2's second profile))", expectedIds, actualIds); assertEquals("Expects to retrieve the 2 orginations, since we match on (the common profile AND (Org1's second profile OR org2's second profile))", expectedIds, actualIds);
@ -1905,60 +1944,58 @@ public class ResourceProviderDstu2Test extends BaseResourceProviderDstu2Test {
ourLog.info("Before: {}", beforeAny.getValue()); ourLog.info("Before: {}", beforeAny.getValue());
{ {
//@formatter:off Bundle found = ourClient
Bundle found = ourClient.search() .search()
.forResource(Patient.class) .forResource(Patient.class)
.where(Patient.NAME.matches().value("testSearchLastUpdatedParamRp")) .where(Patient.NAME.matches().value("testSearchLastUpdatedParamRp"))
.lastUpdated(new DateRangeParam(beforeAny, null)) .lastUpdated(new DateRangeParam(beforeAny, null))
.returnBundle(Bundle.class)
.execute(); .execute();
//@formatter:on
List<IdDt> patients = toIdListUnqualifiedVersionless(found); List<IdDt> patients = toIdListUnqualifiedVersionless(found);
assertThat(patients, hasItems(id1a, id1b, id2)); assertThat(patients, hasItems(id1a, id1b, id2));
} }
{ {
//@formatter:off
Bundle found = ourClient.search() Bundle found = ourClient.search()
.forResource(Patient.class) .forResource(Patient.class)
.where(Patient.NAME.matches().value("testSearchLastUpdatedParamRp")) .where(Patient.NAME.matches().value("testSearchLastUpdatedParamRp"))
.returnBundle(Bundle.class)
.execute(); .execute();
//@formatter:on
List<IdDt> patients = toIdListUnqualifiedVersionless(found); List<IdDt> patients = toIdListUnqualifiedVersionless(found);
assertThat(patients, hasItems(id1a, id1b, id2)); assertThat(patients, hasItems(id1a, id1b, id2));
} }
{ {
//@formatter:off
Bundle found = ourClient.search() Bundle found = ourClient.search()
.forResource(Patient.class) .forResource(Patient.class)
.where(Patient.NAME.matches().value("testSearchLastUpdatedParamRp")) .where(Patient.NAME.matches().value("testSearchLastUpdatedParamRp"))
.lastUpdated(new DateRangeParam(beforeR2, null)) .lastUpdated(new DateRangeParam(beforeR2, null))
.returnBundle(Bundle.class)
.execute(); .execute();
//@formatter:on
List<IdDt> patients = toIdListUnqualifiedVersionless(found); List<IdDt> patients = toIdListUnqualifiedVersionless(found);
assertThat(patients, hasItems(id2)); assertThat(patients, hasItems(id2));
assertThat(patients, not(hasItems(id1a, id1b))); assertThat(patients, not(hasItems(id1a, id1b)));
} }
{ {
//@formatter:off
Bundle found = ourClient.search() Bundle found = ourClient.search()
.forResource(Patient.class) .forResource(Patient.class)
.where(Patient.NAME.matches().value("testSearchLastUpdatedParamRp")) .where(Patient.NAME.matches().value("testSearchLastUpdatedParamRp"))
.lastUpdated(new DateRangeParam(beforeAny, beforeR2)) .lastUpdated(new DateRangeParam(beforeAny, beforeR2))
.returnBundle(Bundle.class)
.execute(); .execute();
//@formatter:on
List<IdDt> patients = toIdListUnqualifiedVersionless(found); List<IdDt> patients = toIdListUnqualifiedVersionless(found);
assertThat(patients.toString(), patients, not(hasItems(id2))); assertThat(patients.toString(), patients, not(hasItems(id2)));
assertThat(patients.toString(), patients, (hasItems(id1a, id1b))); assertThat(patients.toString(), patients, (hasItems(id1a, id1b)));
} }
{ {
//@formatter:off
Bundle found = ourClient.search() Bundle found = ourClient.search()
.forResource(Patient.class) .forResource(Patient.class)
.where(Patient.NAME.matches().value("testSearchLastUpdatedParamRp")) .where(Patient.NAME.matches().value("testSearchLastUpdatedParamRp"))
.lastUpdated(new DateRangeParam(null, beforeR2)) .lastUpdated(new DateRangeParam(null, beforeR2))
.returnBundle(Bundle.class)
.execute(); .execute();
//@formatter:on
List<IdDt> patients = toIdListUnqualifiedVersionless(found); List<IdDt> patients = toIdListUnqualifiedVersionless(found);
assertThat(patients, (hasItems(id1a, id1b))); assertThat(patients, (hasItems(id1a, id1b)));
assertThat(patients, not(hasItems(id2))); assertThat(patients, not(hasItems(id2)));
@ -1985,14 +2022,12 @@ public class ResourceProviderDstu2Test extends BaseResourceProviderDstu2Test {
Date before = new Date(); Date before = new Date();
Thread.sleep(100); Thread.sleep(100);
//@formatter:off
ca.uhn.fhir.model.dstu2.resource.Bundle found = ourClient ca.uhn.fhir.model.dstu2.resource.Bundle found = ourClient
.search() .search()
.forResource(Patient.class) .forResource(Patient.class)
.prettyPrint() .prettyPrint()
.returnBundle(ca.uhn.fhir.model.dstu2.resource.Bundle.class) .returnBundle(ca.uhn.fhir.model.dstu2.resource.Bundle.class)
.execute(); .execute();
//@formatter:on
Thread.sleep(100); Thread.sleep(100);
Date after = new Date(); Date after = new Date();
@ -2018,23 +2053,22 @@ public class ResourceProviderDstu2Test extends BaseResourceProviderDstu2Test {
pat.getManagingOrganization().setReference(orgId.toUnqualifiedVersionless()); pat.getManagingOrganization().setReference(orgId.toUnqualifiedVersionless());
ourClient.create().resource(pat).prettyPrint().encodedXml().execute().getId(); ourClient.create().resource(pat).prettyPrint().encodedXml().execute().getId();
//@formatter:off
Bundle found = ourClient Bundle found = ourClient
.search() .search()
.forResource(Patient.class) .forResource(Patient.class)
.where(Patient.IDENTIFIER.exactly().systemAndIdentifier("urn:system:rpdstu2","testSearchWithInclude02")) .where(Patient.IDENTIFIER.exactly().systemAndIdentifier("urn:system:rpdstu2","testSearchWithInclude02"))
.include(Patient.INCLUDE_ORGANIZATION) .include(Patient.INCLUDE_ORGANIZATION)
.prettyPrint() .prettyPrint()
.returnBundle(Bundle.class)
.execute(); .execute();
//@formatter:on
assertEquals(2, found.getEntry().size()); assertEquals(2, found.getEntry().size());
assertEquals(Patient.class, found.getEntry().get(0).getResource().getClass()); assertEquals(Patient.class, found.getEntry().get(0).getResource().getClass());
assertEquals(BundleEntrySearchModeEnum.MATCH, found.getEntry().get(0).getSearchMode().getValueAsEnum()); assertEquals(BundleEntrySearchModeEnum.MATCH, found.getEntry().get(0).getSearch().getModeElement().getValueAsEnum());
assertEquals(BundleEntrySearchModeEnum.MATCH, found.getEntry().get(0).getResource().getResourceMetadata().get(ResourceMetadataKeyEnum.ENTRY_SEARCH_MODE)); assertEquals(BundleEntrySearchModeEnum.MATCH, found.getEntry().get(0).getResource().getResourceMetadata().get(ResourceMetadataKeyEnum.ENTRY_SEARCH_MODE));
assertThat(found.getEntry().get(0).getResource().getText().getDiv().getValueAsString(), containsString("<table class=\"hapiPropertyTable")); assertThat(found.getEntry().get(0).getResource().getText().getDiv().getValueAsString(), containsString("<table class=\"hapiPropertyTable"));
assertEquals(Organization.class, found.getEntry().get(1).getResource().getClass()); assertEquals(Organization.class, found.getEntry().get(1).getResource().getClass());
assertEquals(BundleEntrySearchModeEnum.INCLUDE, found.getEntry().get(1).getSearchMode().getValueAsEnum()); assertEquals(BundleEntrySearchModeEnum.INCLUDE, found.getEntry().get(1).getSearch().getModeElement().getValueAsEnum());
assertEquals(BundleEntrySearchModeEnum.INCLUDE, found.getEntry().get(1).getResource().getResourceMetadata().get(ResourceMetadataKeyEnum.ENTRY_SEARCH_MODE)); assertEquals(BundleEntrySearchModeEnum.INCLUDE, found.getEntry().get(1).getResource().getResourceMetadata().get(ResourceMetadataKeyEnum.ENTRY_SEARCH_MODE));
} }
@ -2043,14 +2077,12 @@ public class ResourceProviderDstu2Test extends BaseResourceProviderDstu2Test {
Observation o = new Observation(); Observation o = new Observation();
o.getCode().setText("testSearchWithInvalidSort"); o.getCode().setText("testSearchWithInvalidSort");
myObservationDao.create(o, mySrd); myObservationDao.create(o, mySrd);
//@formatter:off
ourClient ourClient
.search() .search()
.forResource(Observation.class) .forResource(Observation.class)
.sort().ascending(Observation.CODE_VALUE_QUANTITY) // composite sort not supported yet .sort().ascending(Observation.CODE_VALUE_QUANTITY) // composite sort not supported yet
.prettyPrint() .prettyPrint()
.execute(); .execute();
//@formatter:on
} }
@Test @Test
@ -2086,15 +2118,14 @@ public class ResourceProviderDstu2Test extends BaseResourceProviderDstu2Test {
IdDt orgMissing = (IdDt) ourClient.create().resource(org).prettyPrint().encodedXml().execute().getId().toUnqualifiedVersionless(); IdDt orgMissing = (IdDt) ourClient.create().resource(org).prettyPrint().encodedXml().execute().getId().toUnqualifiedVersionless();
{ {
//@formatter:off
Bundle found = ourClient Bundle found = ourClient
.search() .search()
.forResource(Organization.class) .forResource(Organization.class)
.where(Organization.NAME.isMissing(false)) .where(Organization.NAME.isMissing(false))
.count(100) .count(100)
.prettyPrint() .prettyPrint()
.returnBundle(Bundle.class)
.execute(); .execute();
//@formatter:on
List<IdDt> list = toIdListUnqualifiedVersionless(found); List<IdDt> list = toIdListUnqualifiedVersionless(found);
ourLog.info(methodName + ": " + list.toString()); ourLog.info(methodName + ": " + list.toString());
@ -2104,15 +2135,14 @@ public class ResourceProviderDstu2Test extends BaseResourceProviderDstu2Test {
assertThat(list, not(containsInRelativeOrder(orgMissing))); assertThat(list, not(containsInRelativeOrder(orgMissing)));
} }
//@formatter:off Bundle found = ourClient
Bundle found = ourClient .search()
.search() .forResource(Organization.class)
.forResource(Organization.class) .where(Organization.NAME.isMissing(true))
.where(Organization.NAME.isMissing(true)) .count(100)
.count(100) .prettyPrint()
.prettyPrint() .returnBundle(Bundle.class)
.execute(); .execute();
//@formatter:on
List<IdDt> list = toIdListUnqualifiedVersionless(found); List<IdDt> list = toIdListUnqualifiedVersionless(found);
ourLog.info(methodName + " found: " + list.toString() + " - Wanted " + orgMissing + " but not " + orgNotMissing); ourLog.info(methodName + " found: " + list.toString() + " - Wanted " + orgMissing + " but not " + orgNotMissing);
@ -2236,7 +2266,6 @@ public class ResourceProviderDstu2Test extends BaseResourceProviderDstu2Test {
p.addName().addGiven("Sarah").addFamily("Graham"); p.addName().addGiven("Sarah").addFamily("Graham");
ourClient.create().resource(p).execute(); ourClient.create().resource(p).execute();
//@formatter:off
Bundle resp = ourClient Bundle resp = ourClient
.search() .search()
.forResource(Patient.class) .forResource(Patient.class)
@ -2244,14 +2273,13 @@ public class ResourceProviderDstu2Test extends BaseResourceProviderDstu2Test {
.sort().ascending(Patient.FAMILY) .sort().ascending(Patient.FAMILY)
.sort().ascending(Patient.GIVEN) .sort().ascending(Patient.GIVEN)
.count(100) .count(100)
.returnBundle(Bundle.class)
.execute(); .execute();
//@formatter:on
List<String> names = toNameList(resp); List<String> names = toNameList(resp);
ourLog.info(StringUtils.join(names, '\n')); ourLog.info(StringUtils.join(names, '\n'));
//@formatter:off
assertThat(names, contains( // this matches in order only assertThat(names, contains( // this matches in order only
"Daniel Adams", "Daniel Adams",
"Aaron Alexis", "Aaron Alexis",
@ -2269,7 +2297,6 @@ public class ResourceProviderDstu2Test extends BaseResourceProviderDstu2Test {
"Brian Gracia", "Brian Gracia",
"Sarah Graham", "Sarah Graham",
"Stephan Graham")); "Stephan Graham"));
//@formatter:om
} }
@ -2474,7 +2501,15 @@ public class ResourceProviderDstu2Test extends BaseResourceProviderDstu2Test {
assertThat(p1Id.getValue(), containsString("Patient/testUpdateWithClientSuppliedIdWhichDoesntExistRpDstu2/_history")); assertThat(p1Id.getValue(), containsString("Patient/testUpdateWithClientSuppliedIdWhichDoesntExistRpDstu2/_history"));
Bundle actual = ourClient.search().forResource(Patient.class).where(Patient.IDENTIFIER.exactly().systemAndCode("urn:system", "testUpdateWithClientSuppliedIdWhichDoesntExistRpDstu2")).encodedJson().prettyPrint().execute(); Bundle actual = ourClient
.search()
.forResource(Patient.class)
.where(Patient.IDENTIFIER.exactly().systemAndCode("urn:system", "testUpdateWithClientSuppliedIdWhichDoesntExistRpDstu2"))
.encodedJson()
.prettyPrint()
.returnBundle(Bundle.class)
.execute();
assertEquals(1, actual.getEntry().size()); assertEquals(1, actual.getEntry().size());
assertEquals(p1Id.getIdPart(), actual.getEntry().get(0).getResource().getId().getIdPart()); assertEquals(p1Id.getIdPart(), actual.getEntry().get(0).getResource().getId().getIdPart());

View File

@ -1,12 +1,13 @@
package ca.uhn.fhir.rest.server; package ca.uhn.fhir.rest.server;
import static org.mockito.Matchers.*; import static org.mockito.Matchers.any;
import static org.mockito.Mockito.*; import static org.mockito.Mockito.inOrder;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verifyNoMoreInteractions;
import static org.mockito.Mockito.when;
import java.util.Collections; import java.util.*;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeUnit;
import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletRequest;
@ -21,10 +22,7 @@ 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.junit.AfterClass; import org.junit.*;
import org.junit.Before;
import org.junit.BeforeClass;
import org.junit.Test;
import org.mockito.InOrder; import org.mockito.InOrder;
import ca.uhn.fhir.context.FhirContext; import ca.uhn.fhir.context.FhirContext;
@ -35,10 +33,7 @@ import ca.uhn.fhir.model.dstu.resource.Patient;
import ca.uhn.fhir.model.dstu.valueset.IdentifierUseEnum; import ca.uhn.fhir.model.dstu.valueset.IdentifierUseEnum;
import ca.uhn.fhir.model.primitive.IdDt; import ca.uhn.fhir.model.primitive.IdDt;
import ca.uhn.fhir.model.primitive.UriDt; import ca.uhn.fhir.model.primitive.UriDt;
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.annotation.RequiredParam;
import ca.uhn.fhir.rest.annotation.Search;
import ca.uhn.fhir.rest.api.RestOperationTypeEnum; import ca.uhn.fhir.rest.api.RestOperationTypeEnum;
import ca.uhn.fhir.rest.method.RequestDetails; import ca.uhn.fhir.rest.method.RequestDetails;
import ca.uhn.fhir.rest.server.interceptor.IServerInterceptor; import ca.uhn.fhir.rest.server.interceptor.IServerInterceptor;

View File

@ -1,700 +0,0 @@
package ca.uhn.fhir.rest.server;
import static ca.uhn.fhir.util.UrlUtil.escape;
import static org.hamcrest.Matchers.containsInAnyOrder;
import static org.hamcrest.Matchers.containsString;
import static org.hamcrest.Matchers.empty;
import static org.hamcrest.Matchers.startsWith;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertThat;
import static org.junit.Assert.assertTrue;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import java.util.concurrent.TimeUnit;
import org.apache.commons.io.IOUtils;
import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.NameValuePair;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.entity.ByteArrayEntity;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClientBuilder;
import org.apache.http.impl.conn.PoolingHttpClientConnectionManager;
import org.apache.http.message.BasicNameValuePair;
import org.eclipse.jetty.server.Server;
import org.eclipse.jetty.servlet.ServletHandler;
import org.eclipse.jetty.servlet.ServletHolder;
import org.junit.AfterClass;
import org.junit.Before;
import org.junit.BeforeClass;
import org.junit.Test;
import com.google.common.net.UrlEscapers;
import ca.uhn.fhir.context.FhirContext;
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.base.composite.BaseCodingDt;
import ca.uhn.fhir.model.dstu.composite.CodingDt;
import ca.uhn.fhir.model.dstu.resource.BaseResource;
import ca.uhn.fhir.model.dstu.resource.Observation;
import ca.uhn.fhir.model.dstu.resource.Patient;
import ca.uhn.fhir.model.primitive.IdDt;
import ca.uhn.fhir.narrative.DefaultThymeleafNarrativeGenerator;
import ca.uhn.fhir.rest.annotation.Create;
import ca.uhn.fhir.rest.annotation.IdParam;
import ca.uhn.fhir.rest.annotation.IncludeParam;
import ca.uhn.fhir.rest.annotation.OptionalParam;
import ca.uhn.fhir.rest.annotation.RequiredParam;
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.client.IGenericClient;
import ca.uhn.fhir.rest.param.ReferenceParam;
import ca.uhn.fhir.rest.param.StringAndListParam;
import ca.uhn.fhir.rest.param.StringOrListParam;
import ca.uhn.fhir.rest.param.StringParam;
import ca.uhn.fhir.rest.param.TokenOrListParam;
import ca.uhn.fhir.rest.param.TokenParam;
import ca.uhn.fhir.util.PortUtil;
import ca.uhn.fhir.util.TestUtil;
public class SearchSearchServerDstu1Test {
private static CloseableHttpClient ourClient;
private static FhirContext ourCtx = FhirContext.forDstu1();
private static IServerAddressStrategy ourDefaultAddressStrategy;
private static StringAndListParam ourLastAndList;
private static Set<Include> ourLastIncludes;
private static final org.slf4j.Logger ourLog = org.slf4j.LoggerFactory.getLogger(SearchSearchServerDstu1Test.class);
private static int ourPort;
private static Server ourServer;
private static RestfulServer ourServlet;
@Before
public void before() {
ourServlet.setServerAddressStrategy(ourDefaultAddressStrategy);
ourLastIncludes = null;
ourLastAndList = null;
}
@Test
public void testEncodeConvertsReferencesToRelative() throws Exception {
HttpGet httpGet = new HttpGet("http://localhost:" + ourPort + "/Patient?_query=searchWithRef");
HttpResponse status = ourClient.execute(httpGet);
String responseContent = IOUtils.toString(status.getEntity().getContent());
IOUtils.closeQuietly(status.getEntity().getContent());
ourLog.info(responseContent);
assertEquals(200, status.getStatusLine().getStatusCode());
Patient patient = (Patient) ourCtx.newXmlParser().parseBundle(responseContent).getEntries().get(0).getResource();
String ref = patient.getManagingOrganization().getReference().getValue();
assertEquals("Organization/555", ref);
}
/**
* Try loading the page as a POST just to make sure we get the right error
*/
@Test
public void testGetPagesWithPost() throws Exception {
HttpPost httpPost = new HttpPost("http://localhost:" + ourPort);
List<? extends NameValuePair> parameters = Collections.singletonList(new BasicNameValuePair("_getpages", "AAA"));
httpPost.setEntity(new UrlEncodedFormEntity(parameters));
CloseableHttpResponse status = ourClient.execute(httpPost);
String responseContent = IOUtils.toString(status.getEntity().getContent());
IOUtils.closeQuietly(status.getEntity().getContent());
ourLog.info(responseContent);
assertEquals(400, status.getStatusLine().getStatusCode());
// assertThat(responseContent, containsString("Requests for _getpages must use HTTP GET"));
}
@Test
public void testOmitEmptyOptionalParam() throws Exception {
HttpGet httpGet = new HttpGet("http://localhost:" + ourPort + "/Patient?_id=");
HttpResponse status = ourClient.execute(httpGet);
String responseContent = IOUtils.toString(status.getEntity().getContent());
IOUtils.closeQuietly(status.getEntity().getContent());
assertEquals(200, status.getStatusLine().getStatusCode());
Bundle bundle = ourCtx.newXmlParser().parseBundle(responseContent);
assertEquals(1, bundle.getEntries().size());
Patient p = bundle.getResources(Patient.class).get(0);
assertEquals(null, p.getNameFirstRep().getFamilyFirstRep().getValue());
}
@Test
public void testParseEscapedValues() throws Exception {
StringBuilder b = new StringBuilder();
b.append("http://localhost:");
b.append(ourPort);
b.append("/Patient?");
b.append(escape("findPatientWithAndList")).append('=').append(escape("NE\\,NE,NE\\,NE")).append('&');
b.append(escape("findPatientWithAndList")).append('=').append(escape("NE\\\\NE")).append('&');
b.append(escape("findPatientWithAndList:exact")).append('=').append(escape("E\\$E")).append('&');
b.append(escape("findPatientWithAndList:exact")).append('=').append(escape("E\\|E")).append('&');
HttpGet httpGet = new HttpGet(b.toString());
HttpResponse status = ourClient.execute(httpGet);
String responseContent = IOUtils.toString(status.getEntity().getContent());
IOUtils.closeQuietly(status.getEntity().getContent());
ourLog.info(responseContent);
assertEquals(200, status.getStatusLine().getStatusCode());
assertEquals(4, ourLastAndList.getValuesAsQueryTokens().size());
assertEquals(2, ourLastAndList.getValuesAsQueryTokens().get(0).getValuesAsQueryTokens().size());
assertFalse(ourLastAndList.getValuesAsQueryTokens().get(0).getValuesAsQueryTokens().get(0).isExact());
assertEquals("NE,NE", ourLastAndList.getValuesAsQueryTokens().get(0).getValuesAsQueryTokens().get(0).getValue());
assertEquals("NE,NE", ourLastAndList.getValuesAsQueryTokens().get(0).getValuesAsQueryTokens().get(1).getValue());
assertEquals("NE\\NE", ourLastAndList.getValuesAsQueryTokens().get(1).getValuesAsQueryTokens().get(0).getValue());
assertTrue(ourLastAndList.getValuesAsQueryTokens().get(2).getValuesAsQueryTokens().get(0).isExact());
assertEquals("E$E", ourLastAndList.getValuesAsQueryTokens().get(2).getValuesAsQueryTokens().get(0).getValue());
assertEquals("E|E", ourLastAndList.getValuesAsQueryTokens().get(3).getValuesAsQueryTokens().get(0).getValue());
}
@Test
public void testReturnLinks() throws Exception {
HttpGet httpGet = new HttpGet("http://localhost:" + ourPort + "/Patient?_query=findWithLinks");
CloseableHttpResponse status = ourClient.execute(httpGet);
String responseContent = IOUtils.toString(status.getEntity().getContent());
IOUtils.closeQuietly(status.getEntity().getContent());
assertEquals(200, status.getStatusLine().getStatusCode());
Bundle bundle = ourCtx.newXmlParser().parseBundle(responseContent);
assertEquals(10, bundle.getEntries().size());
Patient p = bundle.getResources(Patient.class).get(0);
assertEquals("AAANamed", p.getIdentifierFirstRep().getValue().getValue());
assertEquals("http://foo/Patient?_id=1", bundle.getEntries().get(0).getLinkSearch().getValue());
assertEquals("http://localhost:" + ourPort + "/Patient/99881", bundle.getEntries().get(0).getLinkAlternate().getValue());
assertEquals("http://foo/Patient?_id=1", ResourceMetadataKeyEnum.LINK_SEARCH.get(p));
assertEquals("http://localhost:" + ourPort + "/Patient/99881", ResourceMetadataKeyEnum.LINK_ALTERNATE.get(p));
}
/**
* #149
*/
@Test
public void testReturnLinksWithAddressStrategy() throws Exception {
ourServlet.setServerAddressStrategy(new HardcodedServerAddressStrategy("https://blah.com/base"));
HttpGet httpGet = new HttpGet("http://localhost:" + ourPort + "/Patient?_query=findWithLinks");
CloseableHttpResponse status = ourClient.execute(httpGet);
String responseContent = IOUtils.toString(status.getEntity().getContent());
IOUtils.closeQuietly(status.getEntity().getContent());
assertEquals(200, status.getStatusLine().getStatusCode());
Bundle bundle = ourCtx.newXmlParser().parseBundle(responseContent);
ourLog.info(responseContent);
assertEquals(10, bundle.getEntries().size());
assertEquals("https://blah.com/base", bundle.getLinkBase().getValue());
assertEquals("https://blah.com/base/Patient?_query=findWithLinks", bundle.getLinkSelf().getValue());
Patient p = bundle.getResources(Patient.class).get(0);
assertEquals("AAANamed", p.getIdentifierFirstRep().getValue().getValue());
assertEquals("http://foo/Patient?_id=1", bundle.getEntries().get(0).getLinkSearch().getValue());
assertEquals("https://blah.com/base/Patient/99881", bundle.getEntries().get(0).getLinkAlternate().getValue());
assertEquals("http://foo/Patient?_id=1", ResourceMetadataKeyEnum.LINK_SEARCH.get(p));
assertEquals("https://blah.com/base/Patient/99881", ResourceMetadataKeyEnum.LINK_ALTERNATE.get(p));
String linkNext = bundle.getLinkNext().getValue();
ourLog.info(linkNext);
assertThat(linkNext, startsWith("https://blah.com/base?_getpages="));
/*
* Load the second page
*/
String urlPart = linkNext.substring(linkNext.indexOf('?'));
String link = "http://localhost:" + ourPort + urlPart;
httpGet = new HttpGet(link);
status = ourClient.execute(httpGet);
responseContent = IOUtils.toString(status.getEntity().getContent());
IOUtils.closeQuietly(status.getEntity().getContent());
assertEquals(200, status.getStatusLine().getStatusCode());
bundle = ourCtx.newXmlParser().parseBundle(responseContent);
ourLog.info(responseContent);
assertEquals(10, bundle.getEntries().size());
assertEquals("https://blah.com/base", bundle.getLinkBase().getValue());
assertEquals(linkNext, bundle.getLinkSelf().getValue());
p = bundle.getResources(Patient.class).get(0);
assertEquals("AAANamed", p.getIdentifierFirstRep().getValue().getValue());
assertEquals("http://foo/Patient?_id=11", bundle.getEntries().get(0).getLinkSearch().getValue());
assertEquals("https://blah.com/base/Patient/998811", bundle.getEntries().get(0).getLinkAlternate().getValue());
assertEquals("http://foo/Patient?_id=11", ResourceMetadataKeyEnum.LINK_SEARCH.get(p));
assertEquals("https://blah.com/base/Patient/998811", ResourceMetadataKeyEnum.LINK_ALTERNATE.get(p));
}
@Test
public void testSearchById() throws Exception {
HttpGet httpGet = new HttpGet("http://localhost:" + ourPort + "/Patient?_id=aaa");
HttpResponse status = ourClient.execute(httpGet);
String responseContent = IOUtils.toString(status.getEntity().getContent());
IOUtils.closeQuietly(status.getEntity().getContent());
assertEquals(200, status.getStatusLine().getStatusCode());
Bundle bundle = ourCtx.newXmlParser().parseBundle(responseContent);
assertEquals(1, bundle.getEntries().size());
Patient p = bundle.getResources(Patient.class).get(0);
assertEquals("idaaa", p.getNameFirstRep().getFamilyAsSingleString());
}
@Test
public void testSearchByIdUsingClient() throws Exception {
IGenericClient client = ourCtx.newRestfulGenericClient("http://localhost:" + ourPort);
Bundle bundle = client.search().forResource("Patient").where(BaseResource.RES_ID.matches().value("aaa")).execute();
assertEquals(1, bundle.getEntries().size());
Patient p = bundle.getResources(Patient.class).get(0);
assertEquals("idaaa", p.getNameFirstRep().getFamilyAsSingleString());
}
@Test
public void testSearchByPost() throws Exception {
HttpPost filePost = new HttpPost("http://localhost:" + ourPort + "/Patient/_search");
// add parameters to the post method
List<NameValuePair> parameters = new ArrayList<NameValuePair>();
parameters.add(new BasicNameValuePair("_id", "aaa"));
UrlEncodedFormEntity sendentity = new UrlEncodedFormEntity(parameters, "UTF-8");
filePost.setEntity(sendentity);
HttpResponse status = ourClient.execute(filePost);
String responseContent = IOUtils.toString(status.getEntity().getContent());
IOUtils.closeQuietly(status.getEntity().getContent());
assertEquals(200, status.getStatusLine().getStatusCode());
Bundle bundle = ourCtx.newXmlParser().parseBundle(responseContent);
assertEquals(1, bundle.getEntries().size());
Patient p = bundle.getResources(Patient.class).get(0);
assertEquals("idaaa", p.getNameFirstRep().getFamilyAsSingleString());
}
/**
* See #164
*/
@Test
public void testSearchByPostWithInvalidPostUrl() throws Exception {
HttpPost filePost = new HttpPost("http://localhost:" + ourPort + "/Patient?name=Central"); // should end with
// _search
// add parameters to the post method
List<NameValuePair> parameters = new ArrayList<NameValuePair>();
parameters.add(new BasicNameValuePair("_id", "aaa"));
UrlEncodedFormEntity sendentity = new UrlEncodedFormEntity(parameters, "UTF-8");
filePost.setEntity(sendentity);
HttpResponse status = ourClient.execute(filePost);
String responseContent = IOUtils.toString(status.getEntity().getContent());
IOUtils.closeQuietly(status.getEntity().getContent());
ourLog.info(responseContent);
assertEquals(400, status.getStatusLine().getStatusCode());
assertThat(responseContent, containsString("<details value=\"Incorrect Content-Type header value of &quot;application/x-www-form-urlencoded; charset=UTF-8&quot; was provided in the request. A FHIR Content-Type is required for &quot;CREATE&quot; operation\"/>"));
}
/**
* See #164
*/
@Test
public void testSearchByPostWithMissingContentType() throws Exception {
HttpPost filePost = new HttpPost("http://localhost:" + ourPort + "/Patient?name=Central"); // should end with
// _search
HttpEntity sendentity = new ByteArrayEntity(new byte[] { 1, 2, 3, 4 });
filePost.setEntity(sendentity);
HttpResponse status = ourClient.execute(filePost);
String responseContent = IOUtils.toString(status.getEntity().getContent());
IOUtils.closeQuietly(status.getEntity().getContent());
ourLog.info(responseContent);
assertEquals(400, status.getStatusLine().getStatusCode());
assertThat(responseContent, containsString("<details value=\"No Content-Type header was provided in the request. This is required for &quot;CREATE&quot; operation\"/>"));
}
/**
* See #164
*/
@Test
public void testSearchByPostWithParamsInBodyAndUrl() throws Exception {
HttpPost filePost = new HttpPost("http://localhost:" + ourPort + "/Patient/_search?name=Central");
// add parameters to the post method
List<NameValuePair> parameters = new ArrayList<NameValuePair>();
parameters.add(new BasicNameValuePair("_id", "aaa"));
UrlEncodedFormEntity sendentity = new UrlEncodedFormEntity(parameters, "UTF-8");
filePost.setEntity(sendentity);
HttpResponse status = ourClient.execute(filePost);
String responseContent = IOUtils.toString(status.getEntity().getContent());
IOUtils.closeQuietly(status.getEntity().getContent());
ourLog.info(responseContent);
assertEquals(200, status.getStatusLine().getStatusCode());
Bundle bundle = ourCtx.newXmlParser().parseBundle(responseContent);
assertEquals(1, bundle.getEntries().size());
Patient p = bundle.getResources(Patient.class).get(0);
assertEquals("idaaa", p.getName().get(0).getFamilyAsSingleString());
assertEquals("nameCentral", p.getName().get(1).getFamilyAsSingleString());
}
@Test
public void testSearchCompartment() throws Exception {
HttpGet httpGet = new HttpGet("http://localhost:" + ourPort + "/Patient/123/fooCompartment");
HttpResponse status = ourClient.execute(httpGet);
String responseContent = IOUtils.toString(status.getEntity().getContent());
ourLog.info(responseContent);
IOUtils.closeQuietly(status.getEntity().getContent());
assertEquals(200, status.getStatusLine().getStatusCode());
Bundle bundle = ourCtx.newXmlParser().parseBundle(responseContent);
assertEquals(1, bundle.getEntries().size());
Patient p = bundle.getResources(Patient.class).get(0);
assertEquals("fooCompartment", p.getIdentifierFirstRep().getValue().getValue());
assertThat(bundle.getEntries().get(0).getResource().getId().getValue(), containsString("Patient/123"));
}
@Test
public void testSearchGetWithUnderscoreSearch() throws Exception {
HttpGet httpGet = new HttpGet("http://localhost:" + ourPort + "/Observation/_search?subject%3APatient=100&name=3141-9%2C8302-2%2C8287-5%2C39156-5");
HttpResponse status = ourClient.execute(httpGet);
String responseContent = IOUtils.toString(status.getEntity().getContent());
IOUtils.closeQuietly(status.getEntity().getContent());
assertEquals(200, status.getStatusLine().getStatusCode());
Bundle bundle = ourCtx.newXmlParser().parseBundle(responseContent);
assertEquals(1, bundle.getEntries().size());
Observation p = bundle.getResources(Observation.class).get(0);
assertEquals("Patient/100", p.getSubject().getReference().toString());
assertEquals(4, p.getName().getCoding().size());
assertEquals("3141-9", p.getName().getCoding().get(0).getCode().getValue());
assertEquals("8302-2", p.getName().getCoding().get(1).getCode().getValue());
}
@Test
public void testSearchIncludesParametersIncludes() throws Exception {
HttpGet httpGet = new HttpGet("http://localhost:" + ourPort + "/Patient?_query=searchIncludes&_include=foo&_include:recurse=bar");
CloseableHttpResponse status = ourClient.execute(httpGet);
IOUtils.toString(status.getEntity().getContent());
IOUtils.closeQuietly(status.getEntity().getContent());
assertEquals(200, status.getStatusLine().getStatusCode());
assertEquals(2, ourLastIncludes.size());
assertThat(ourLastIncludes, containsInAnyOrder(new Include("foo", false), new Include("bar", true)));
}
@Test
public void testSearchIncludesParametersIncludesList() throws Exception {
HttpGet httpGet = new HttpGet("http://localhost:" + ourPort + "/Patient?_query=searchIncludesList&_include=foo&_include:recurse=bar");
CloseableHttpResponse status = ourClient.execute(httpGet);
IOUtils.toString(status.getEntity().getContent());
IOUtils.closeQuietly(status.getEntity().getContent());
assertEquals(200, status.getStatusLine().getStatusCode());
assertEquals(2, ourLastIncludes.size());
assertThat(ourLastIncludes, containsInAnyOrder(new Include("foo", false), new Include("bar", true)));
}
@Test
public void testSearchIncludesParametersNone() throws Exception {
HttpGet httpGet = new HttpGet("http://localhost:" + ourPort + "/Patient?_query=searchIncludes");
CloseableHttpResponse status = ourClient.execute(httpGet);
IOUtils.toString(status.getEntity().getContent());
IOUtils.closeQuietly(status.getEntity().getContent());
assertEquals(200, status.getStatusLine().getStatusCode());
assertThat(ourLastIncludes, empty());
}
@Test
public void testSearchWithOrList() throws Exception {
HttpGet httpGet = new HttpGet("http://localhost:" + ourPort + "/Patient?findPatientWithOrList=aaa,bbb");
HttpResponse status = ourClient.execute(httpGet);
String responseContent = IOUtils.toString(status.getEntity().getContent());
IOUtils.closeQuietly(status.getEntity().getContent());
assertEquals(200, status.getStatusLine().getStatusCode());
Bundle bundle = ourCtx.newXmlParser().parseBundle(responseContent);
assertEquals(1, bundle.getEntries().size());
Patient p = bundle.getResources(Patient.class).get(0);
assertEquals("aaa", p.getIdentifier().get(0).getValue().getValue());
assertEquals("bbb", p.getIdentifier().get(1).getValue().getValue());
}
@Test
public void testSearchWithTokenParameter() throws Exception {
String token = UrlEscapers.urlFragmentEscaper().asFunction().apply("http://www.dmix.gov/vista/2957|301");
HttpGet httpGet = new HttpGet("http://localhost:" + ourPort + "/Patient?tokenParam=" + token);
HttpResponse status = ourClient.execute(httpGet);
String responseContent = IOUtils.toString(status.getEntity().getContent());
IOUtils.closeQuietly(status.getEntity().getContent());
assertEquals(200, status.getStatusLine().getStatusCode());
Bundle bundle = ourCtx.newXmlParser().parseBundle(responseContent);
assertEquals(1, bundle.getEntries().size());
Patient p = bundle.getResources(Patient.class).get(0);
assertEquals("http://www.dmix.gov/vista/2957", p.getNameFirstRep().getFamilyAsSingleString());
assertEquals("301", p.getNameFirstRep().getGivenAsSingleString());
}
@Test
public void testSpecificallyNamedQueryGetsPrecedence() throws Exception {
HttpGet httpGet = new HttpGet("http://localhost:" + ourPort + "/Patient?AAA=123");
HttpResponse status = ourClient.execute(httpGet);
String responseContent = IOUtils.toString(status.getEntity().getContent());
IOUtils.closeQuietly(status.getEntity().getContent());
assertEquals(200, status.getStatusLine().getStatusCode());
Bundle bundle = ourCtx.newXmlParser().parseBundle(responseContent);
assertEquals(1, bundle.getEntries().size());
Patient p = bundle.getResources(Patient.class).get(0);
assertEquals("AAA", p.getIdentifierFirstRep().getValue().getValue());
// Now the named query
httpGet = new HttpGet("http://localhost:" + ourPort + "/Patient?_query=findPatientByAAA&AAA=123");
status = ourClient.execute(httpGet);
responseContent = IOUtils.toString(status.getEntity().getContent());
IOUtils.closeQuietly(status.getEntity().getContent());
assertEquals(200, status.getStatusLine().getStatusCode());
bundle = ourCtx.newXmlParser().parseBundle(responseContent);
assertEquals(1, bundle.getEntries().size());
p = bundle.getResources(Patient.class).get(0);
assertEquals("AAANamed", p.getIdentifierFirstRep().getValue().getValue());
}
@AfterClass
public static void afterClassClearContext() throws Exception {
ourServer.stop();
TestUtil.clearAllStaticFieldsForUnitTest();
}
@BeforeClass
public static void beforeClass() throws Exception {
ourPort = PortUtil.findFreePort();
ourServer = new Server(ourPort);
DummyPatientResourceProvider patientProvider = new DummyPatientResourceProvider();
ServletHandler proxyHandler = new ServletHandler();
ourServlet = new RestfulServer();
ourServlet.getFhirContext().setNarrativeGenerator(new DefaultThymeleafNarrativeGenerator());
ourServlet.setPagingProvider(new FifoMemoryPagingProvider(10).setDefaultPageSize(10));
ourServlet.setResourceProviders(patientProvider, new DummyObservationResourceProvider());
ServletHolder servletHolder = new ServletHolder(ourServlet);
proxyHandler.addServletWithMapping(servletHolder, "/*");
ourServer.setHandler(proxyHandler);
ourServer.start();
PoolingHttpClientConnectionManager connectionManager = new PoolingHttpClientConnectionManager(5000, TimeUnit.MILLISECONDS);
HttpClientBuilder builder = HttpClientBuilder.create();
builder.setConnectionManager(connectionManager);
ourClient = builder.build();
ourDefaultAddressStrategy = ourServlet.getServerAddressStrategy();
}
public static class DummyObservationResourceProvider implements IResourceProvider {
@Override
public Class<? extends IResource> getResourceType() {
return Observation.class;
}
@Search
public Observation search(@RequiredParam(name = "subject") ReferenceParam theSubject, @RequiredParam(name = "name") TokenOrListParam theName) {
Observation o = new Observation();
o.setId("1");
o.getSubject().setReference(theSubject.getResourceType() + "/" + theSubject.getIdPart());
for (BaseCodingDt next : theName.getListAsCodings()) {
o.getName().getCoding().add(new CodingDt(next));
}
return o;
}
}
public static class DummyPatientResourceProvider implements IResourceProvider {
@Search(compartmentName = "fooCompartment")
public List<Patient> compartment(@IdParam IdDt theId) {
ArrayList<Patient> retVal = new ArrayList<Patient>();
Patient patient = new Patient();
patient.setId(theId);
patient.addIdentifier("system", "fooCompartment");
retVal.add(patient);
return retVal;
}
/**
* Only needed for #164
*/
@Create
public MethodOutcome create(@ResourceParam Patient thePatient) {
throw new IllegalArgumentException();
}
@Search
public List<Patient> findPatient(@RequiredParam(name = "_id") StringParam theParam, @OptionalParam(name = "name") StringParam theName) {
ArrayList<Patient> retVal = new ArrayList<Patient>();
Patient patient = new Patient();
patient.setId("1");
patient.addIdentifier("system", "identifier123");
if (theParam != null) {
patient.addName().addFamily("id" + theParam.getValue());
if (theName != null) {
patient.addName().addFamily("name" + theName.getValue());
}
}
retVal.add(patient);
return retVal;
}
@Search
public List<Patient> findPatientByAAA01(@RequiredParam(name = "AAA") StringParam theParam) {
ArrayList<Patient> retVal = new ArrayList<Patient>();
Patient patient = new Patient();
patient.setId("1");
patient.addIdentifier("system", "AAA");
retVal.add(patient);
return retVal;
}
@Search(queryName = "findPatientByAAA")
public List<Patient> findPatientByAAA02Named(@OptionalParam(name = "AAA") StringParam theParam) {
ArrayList<Patient> retVal = new ArrayList<Patient>();
Patient patient = new Patient();
patient.setId("1");
patient.addIdentifier("system", "AAANamed");
retVal.add(patient);
return retVal;
}
@Search()
public List<Patient> findPatientWithAndList(@RequiredParam(name = "findPatientWithAndList") StringAndListParam theParam) {
ourLastAndList = theParam;
ArrayList<Patient> retVal = new ArrayList<Patient>();
return retVal;
}
@Search()
public List<Patient> findPatientWithOrList(@RequiredParam(name = "findPatientWithOrList") StringOrListParam theParam) {
ArrayList<Patient> retVal = new ArrayList<Patient>();
Patient patient = new Patient();
patient.setId("1");
for (StringParam next : theParam.getValuesAsQueryTokens()) {
patient.addIdentifier("system", next.getValue());
}
retVal.add(patient);
return retVal;
}
@Search()
public List<Patient> findPatientWithToken(@RequiredParam(name = "tokenParam") TokenParam theParam) {
ArrayList<Patient> retVal = new ArrayList<Patient>();
Patient patient = new Patient();
patient.setId("1");
patient.addName().addFamily(theParam.getSystem()).addGiven(theParam.getValue());
retVal.add(patient);
return retVal;
}
@Search(queryName = "findWithLinks")
public List<Patient> findWithLinks() {
ArrayList<Patient> retVal = new ArrayList<Patient>();
for (int i = 1; i <= 20; i++) {
Patient patient = new Patient();
patient.setId("" + i);
patient.addIdentifier("system", "AAANamed");
ResourceMetadataKeyEnum.LINK_SEARCH.put(patient, ("http://foo/Patient?_id=" + i));
ResourceMetadataKeyEnum.LINK_ALTERNATE.put(patient, ("Patient/9988" + i));
retVal.add(patient);
}
return retVal;
}
@Override
public Class<? extends IResource> getResourceType() {
return Patient.class;
}
@Search(queryName = "searchIncludes")
public List<Patient> searchIncludes(@IncludeParam Set<Include> theIncludes) {
ourLastIncludes = theIncludes;
ArrayList<Patient> retVal = new ArrayList<Patient>();
return retVal;
}
@Search(queryName = "searchIncludesList")
public List<Patient> searchIncludesList(@IncludeParam List<Include> theIncludes) {
if (theIncludes != null) {
ourLastIncludes = new HashSet<Include>(theIncludes);
}
ArrayList<Patient> retVal = new ArrayList<Patient>();
return retVal;
}
@Search(queryName = "searchWithRef")
public Patient searchWithRef() {
Patient patient = new Patient();
patient.setId("Patient/1/_history/1");
patient.getManagingOrganization().setReference("http://localhost:" + ourPort + "/Organization/555/_history/666");
return patient;
}
}
}

View File

@ -265,11 +265,6 @@ public class Dstu2_1BundleFactory implements IVersionSpecificBundleFactory {
} }
} }
@Override
public ca.uhn.fhir.model.api.Bundle getDstu1Bundle() {
return null;
}
@Override @Override
public IBaseResource getResourceBundle() { public IBaseResource getResourceBundle() {
return myBundle; return myBundle;

View File

@ -258,11 +258,6 @@ public class Dstu2BundleFactory implements IVersionSpecificBundleFactory {
} }
} }
@Override
public ca.uhn.fhir.model.api.Bundle getDstu1Bundle() {
return null;
}
@Override @Override
public IResource getResourceBundle() { public IResource getResourceBundle() {
return myBundle; return myBundle;

View File

@ -36,7 +36,6 @@ import com.google.common.collect.Sets;
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.*;
import ca.uhn.fhir.model.api.Bundle;
import ca.uhn.fhir.model.base.composite.BaseCodingDt; import ca.uhn.fhir.model.base.composite.BaseCodingDt;
import ca.uhn.fhir.model.dstu2.composite.*; import ca.uhn.fhir.model.dstu2.composite.*;
import ca.uhn.fhir.model.dstu2.resource.*; import ca.uhn.fhir.model.dstu2.resource.*;
@ -74,7 +73,7 @@ public class JsonParserDstu2Test {
ourCtx = FhirContext.forDstu2(); ourCtx = FhirContext.forDstu2();
} }
} }
@Test @Test
public void testOverrideResourceIdWithBundleEntryFullUrlDisabled_ConfiguredOnParser() { public void testOverrideResourceIdWithBundleEntryFullUrlDisabled_ConfiguredOnParser() {
try { try {
@ -94,30 +93,30 @@ public class JsonParserDstu2Test {
ourCtx = FhirContext.forDstu2(); ourCtx = FhirContext.forDstu2();
} }
} }
/** /**
* See #544 * See #544
*/ */
@Test @Test
public void testBundleStitchReferencesByUuid() throws Exception { public void testBundleStitchReferencesByUuid() throws Exception {
ca.uhn.fhir.model.dstu2.resource.Bundle bundle = new ca.uhn.fhir.model.dstu2.resource.Bundle(); ca.uhn.fhir.model.dstu2.resource.Bundle bundle = new ca.uhn.fhir.model.dstu2.resource.Bundle();
DocumentManifest dm = new DocumentManifest(); DocumentManifest dm = new DocumentManifest();
dm.getSubject().setReference("urn:uuid:96e85cca-9797-45d6-834a-c4eb27f331d3"); dm.getSubject().setReference("urn:uuid:96e85cca-9797-45d6-834a-c4eb27f331d3");
bundle.addEntry().setResource(dm); bundle.addEntry().setResource(dm);
Patient patient = new Patient(); Patient patient = new Patient();
patient.addName().addFamily("FAMILY"); patient.addName().addFamily("FAMILY");
bundle.addEntry().setResource(patient).setFullUrl("urn:uuid:96e85cca-9797-45d6-834a-c4eb27f331d3"); bundle.addEntry().setResource(patient).setFullUrl("urn:uuid:96e85cca-9797-45d6-834a-c4eb27f331d3");
String encoded = ourCtx.newJsonParser().setPrettyPrint(true).encodeResourceToString(bundle); String encoded = ourCtx.newJsonParser().setPrettyPrint(true).encodeResourceToString(bundle);
ourLog.info(encoded); ourLog.info(encoded);
bundle = ourCtx.newJsonParser().parseResource(ca.uhn.fhir.model.dstu2.resource.Bundle.class, encoded); bundle = ourCtx.newJsonParser().parseResource(ca.uhn.fhir.model.dstu2.resource.Bundle.class, encoded);
dm = (DocumentManifest) bundle.getEntry().get(0).getResource(); dm = (DocumentManifest) bundle.getEntry().get(0).getResource();
assertEquals("urn:uuid:96e85cca-9797-45d6-834a-c4eb27f331d3", dm.getSubject().getReference().getValue()); assertEquals("urn:uuid:96e85cca-9797-45d6-834a-c4eb27f331d3", dm.getSubject().getReference().getValue());
Patient subject = (Patient) dm.getSubject().getResource(); Patient subject = (Patient) dm.getSubject().getResource();
assertNotNull(subject); assertNotNull(subject);
assertEquals("FAMILY", subject.getNameFirstRep().getFamilyAsSingleString()); assertEquals("FAMILY", subject.getNameFirstRep().getFamilyAsSingleString());
@ -145,21 +144,6 @@ public class JsonParserDstu2Test {
assertEquals("ORG", o.getName()); assertEquals("ORG", o.getName());
} }
@Test
public void testEncodeBundleOldStyleContainingResourceWithUuidBase() {
Patient p = new Patient();
p.setId(IdDt.newRandomUuid());
p.addName().addFamily("PATIENT");
Bundle b = new Bundle();
b.addEntry().setResource(p);
String encoded = ourCtx.newJsonParser().setPrettyPrint(true).encodeBundleToString(b);
ourLog.info(encoded);
assertThat(encoded, stringContainsInOrder("fullUrl", p.getId().getValue(), "Patient"));
}
/** /**
* See #308 * See #308
*/ */
@ -536,43 +520,6 @@ public class JsonParserDstu2Test {
} }
@Test
public void testEncodeBundleOldBundleNoText() {
Bundle b = new Bundle();
BundleEntry e = b.addEntry();
e.setResource(new Patient());
b.addCategory("scheme", "term", "label");
String val = ourCtx.newJsonParser().setPrettyPrint(false).encodeBundleToString(b);
ourLog.info(val);
assertThat(val, not(containsString("text")));
b = ourCtx.newJsonParser().parseBundle(val);
assertEquals(1, b.getEntries().size());
}
/**
* Fixing #89
*/
@Test
public void testEncodeBundleWithDeletedEntry() throws ConfigurationException, DataFormatException, IOException {
Bundle b = ourCtx.newXmlParser().parseBundle(IOUtils.toString(JsonParserDstu2Test.class.getResourceAsStream("/xml-bundle.xml")));
String val = ourCtx.newJsonParser().encodeBundleToString(b);
ourLog.info(val);
//@formatter:off
assertThat(val, containsString("\"deleted\":{" +
"\"type\":\"Patient\"," +
"\"resourceId\":\"4384\"," +
"\"instant\":\"2015-01-15T11:04:43.054-05:00\"" +
"}"));
//@formatter:on
}
@Test @Test
public void testEncodeDoesntIncludeUuidId() { public void testEncodeDoesntIncludeUuidId() {
@ -1055,28 +1002,28 @@ public class JsonParserDstu2Test {
public void testParseAndEncodeBundle() throws Exception { public void testParseAndEncodeBundle() throws Exception {
String content = IOUtils.toString(JsonParserDstu2Test.class.getResourceAsStream("/bundle-example.json")); String content = IOUtils.toString(JsonParserDstu2Test.class.getResourceAsStream("/bundle-example.json"));
Bundle parsed = ourCtx.newJsonParser().parseBundle(content); Bundle parsed = ourCtx.newJsonParser().parseResource(Bundle.class, content);
assertEquals("Bundle/example/_history/1", parsed.getId().getValue()); assertEquals("Bundle/example/_history/1", parsed.getId().getValue());
assertEquals("1", parsed.getResourceMetadata().get(ResourceMetadataKeyEnum.VERSION)); assertEquals("1", parsed.getResourceMetadata().get(ResourceMetadataKeyEnum.VERSION));
assertEquals("1", parsed.getId().getVersionIdPart()); assertEquals("1", parsed.getId().getVersionIdPart());
assertEquals(new InstantDt("2014-08-18T01:43:30Z"), parsed.getResourceMetadata().get(ResourceMetadataKeyEnum.UPDATED)); assertEquals(new InstantDt("2014-08-18T01:43:30Z"), parsed.getResourceMetadata().get(ResourceMetadataKeyEnum.UPDATED));
assertEquals("searchset", parsed.getType().getValue()); assertEquals("searchset", parsed.getTypeElement().getValueAsString());
assertEquals(3, parsed.getTotalResults().getValue().intValue()); assertEquals(3, parsed.getTotalElement().getValue().intValue());
assertEquals("https://example.com/base/MedicationOrder?patient=347&searchId=ff15fd40-ff71-4b48-b366-09c706bed9d0&page=2", parsed.getLinkNext().getValue()); assertEquals("https://example.com/base/MedicationOrder?patient=347&searchId=ff15fd40-ff71-4b48-b366-09c706bed9d0&page=2", parsed.getLink("next").getUrl());
assertEquals("https://example.com/base/MedicationOrder?patient=347&_include=MedicationOrder.medication", parsed.getLinkSelf().getValue()); assertEquals("https://example.com/base/MedicationOrder?patient=347&_include=MedicationOrder.medication", parsed.getLink("self").getUrl());
assertEquals(2, parsed.getEntries().size()); assertEquals(2, parsed.getEntry().size());
MedicationOrder p = (MedicationOrder) parsed.getEntries().get(0).getResource(); MedicationOrder p = (MedicationOrder) parsed.getEntry().get(0).getResource();
assertEquals("Patient/347", p.getPatient().getReference().getValue()); assertEquals("Patient/347", p.getPatient().getReference().getValue());
assertEquals("2014-08-16T05:31:17Z", ResourceMetadataKeyEnum.UPDATED.get(p).getValueAsString()); assertEquals("2014-08-16T05:31:17Z", ResourceMetadataKeyEnum.UPDATED.get(p).getValueAsString());
assertEquals("http://example.com/base/MedicationOrder/3123/_history/1", p.getId().getValue()); assertEquals("http://example.com/base/MedicationOrder/3123/_history/1", p.getId().getValue());
Medication m = (Medication) parsed.getEntries().get(1).getResource(); Medication m = (Medication) parsed.getEntry().get(1).getResource();
assertEquals("http://example.com/base/Medication/example", m.getId().getValue()); assertEquals("http://example.com/base/Medication/example", m.getId().getValue());
assertSame(((ResourceReferenceDt) p.getMedication()).getResource(), m); assertSame(((ResourceReferenceDt) p.getMedication()).getResource(), m);
String reencoded = ourCtx.newJsonParser().setPrettyPrint(true).encodeBundleToString(parsed); String reencoded = ourCtx.newJsonParser().setPrettyPrint(true).encodeResourceToString(parsed);
ourLog.info(reencoded); ourLog.info(reencoded);
JsonConfig cfg = new JsonConfig(); JsonConfig cfg = new JsonConfig();
@ -1130,7 +1077,7 @@ public class JsonParserDstu2Test {
assertEquals("1", parsed.getResourceMetadata().get(ResourceMetadataKeyEnum.VERSION)); assertEquals("1", parsed.getResourceMetadata().get(ResourceMetadataKeyEnum.VERSION));
assertEquals("1", parsed.getId().getVersionIdPart()); assertEquals("1", parsed.getId().getVersionIdPart());
assertEquals(new InstantDt("2014-08-18T01:43:30Z"), parsed.getResourceMetadata().get(ResourceMetadataKeyEnum.UPDATED)); assertEquals(new InstantDt("2014-08-18T01:43:30Z"), parsed.getResourceMetadata().get(ResourceMetadataKeyEnum.UPDATED));
assertEquals("searchset", parsed.getType()); assertEquals("searchset", parsed.getTypeElement().getValue());
assertEquals(3, parsed.getTotal().intValue()); assertEquals(3, parsed.getTotal().intValue());
assertEquals("https://example.com/base/MedicationOrder?patient=347&searchId=ff15fd40-ff71-4b48-b366-09c706bed9d0&page=2", parsed.getLink().get(0).getUrlElement().getValueAsString()); assertEquals("https://example.com/base/MedicationOrder?patient=347&searchId=ff15fd40-ff71-4b48-b366-09c706bed9d0&page=2", parsed.getLink().get(0).getUrlElement().getValueAsString());
assertEquals("https://example.com/base/MedicationOrder?patient=347&_include=MedicationOrder.medication", parsed.getLink().get(1).getUrlElement().getValueAsString()); assertEquals("https://example.com/base/MedicationOrder?patient=347&_include=MedicationOrder.medication", parsed.getLink().get(1).getUrlElement().getValueAsString());
@ -1169,25 +1116,25 @@ public class JsonParserDstu2Test {
public void testParseAndEncodeBundleOldStyle() throws Exception { public void testParseAndEncodeBundleOldStyle() throws Exception {
String content = IOUtils.toString(JsonParserDstu2Test.class.getResourceAsStream("/bundle-example.json")); String content = IOUtils.toString(JsonParserDstu2Test.class.getResourceAsStream("/bundle-example.json"));
Bundle parsed = ourCtx.newJsonParser().parseBundle(content); Bundle parsed = ourCtx.newJsonParser().parseResource(Bundle.class, content);
assertEquals(new InstantDt("2014-08-18T01:43:30Z"), parsed.getResourceMetadata().get(ResourceMetadataKeyEnum.UPDATED)); assertEquals(new InstantDt("2014-08-18T01:43:30Z"), parsed.getResourceMetadata().get(ResourceMetadataKeyEnum.UPDATED));
assertEquals("searchset", parsed.getType().getValue()); assertEquals("searchset", parsed.getTypeElement().getValue());
assertEquals(3, parsed.getTotalResults().getValue().intValue()); assertEquals(3, parsed.getTotalElement().getValue().intValue());
assertEquals(2, parsed.getEntries().size()); assertEquals(2, parsed.getEntry().size());
MedicationOrder p = (MedicationOrder) parsed.getEntries().get(0).getResource(); MedicationOrder p = (MedicationOrder) parsed.getEntry().get(0).getResource();
assertEquals("Patient/347", p.getPatient().getReference().getValue()); assertEquals("Patient/347", p.getPatient().getReference().getValue());
assertEquals("2014-08-16T05:31:17Z", ResourceMetadataKeyEnum.UPDATED.get(p).getValueAsString()); assertEquals("2014-08-16T05:31:17Z", ResourceMetadataKeyEnum.UPDATED.get(p).getValueAsString());
assertEquals("http://example.com/base/MedicationOrder/3123/_history/1", p.getId().getValue()); assertEquals("http://example.com/base/MedicationOrder/3123/_history/1", p.getId().getValue());
Medication m = (Medication) parsed.getEntries().get(1).getResource(); Medication m = (Medication) parsed.getEntry().get(1).getResource();
assertEquals("http://example.com/base/Medication/example", m.getId().getValue()); assertEquals("http://example.com/base/Medication/example", m.getId().getValue());
assertEquals("Medication/example", ((ResourceReferenceDt) p.getMedication()).getReference().getValue()); assertEquals("Medication/example", ((ResourceReferenceDt) p.getMedication()).getReference().getValue());
assertSame(((ResourceReferenceDt) p.getMedication()).getResource(), m); assertSame(((ResourceReferenceDt) p.getMedication()).getResource(), m);
String reencoded = ourCtx.newJsonParser().setPrettyPrint(true).encodeBundleToString(parsed); String reencoded = ourCtx.newJsonParser().setPrettyPrint(true).encodeResourceToString(parsed);
ourLog.info(reencoded); ourLog.info(reencoded);
JsonConfig cfg = new JsonConfig(); JsonConfig cfg = new JsonConfig();
@ -1211,31 +1158,13 @@ public class JsonParserDstu2Test {
public void testParseAndEncodeBundleResourceWithComments() throws Exception { public void testParseAndEncodeBundleResourceWithComments() throws Exception {
String content = IOUtils.toString(JsonParserDstu2Test.class.getResourceAsStream("/bundle-transaction2.json")); String content = IOUtils.toString(JsonParserDstu2Test.class.getResourceAsStream("/bundle-transaction2.json"));
ourCtx.newJsonParser().parseBundle(content); ourCtx.newJsonParser().parseResource(Bundle.class, content);
ca.uhn.fhir.model.dstu2.resource.Bundle parsed = ourCtx.newJsonParser().parseResource(ca.uhn.fhir.model.dstu2.resource.Bundle.class, content); ca.uhn.fhir.model.dstu2.resource.Bundle parsed = ourCtx.newJsonParser().parseResource(ca.uhn.fhir.model.dstu2.resource.Bundle.class, content);
// TODO: preserve comments // TODO: preserve comments
} }
@Test
public void testParseAndEncodeBundleWithDeletedEntry() {
Patient res = new Patient();
res.setId(new IdDt("Patient", "111", "222"));
ResourceMetadataKeyEnum.DELETED_AT.put(res, new InstantDt("2011-01-01T12:12:22Z"));
Bundle bundle = new Bundle();
bundle.addResource(res, ourCtx, "http://foo/base");
String actual = ourCtx.newJsonParser().encodeBundleToString(bundle);
ourLog.info(actual);
String expected = "{\"resourceType\":\"Bundle\",\"entry\":[{\"deleted\":{\"type\":\"Patient\",\"resourceId\":\"111\",\"versionId\":\"222\",\"instant\":\"2011-01-01T12:12:22Z\"}}]}";
assertEquals(expected, actual);
}
@Test @Test
public void testParseAndEncodeBundleWithUuidBase() { public void testParseAndEncodeBundleWithUuidBase() {
//@formatter:off //@formatter:off
@ -1531,38 +1460,32 @@ public class JsonParserDstu2Test {
" \"lastUpdated\" : \"2001-02-22T11:22:33-05:00\"\n" + " \"lastUpdated\" : \"2001-02-22T11:22:33-05:00\"\n" +
" },\n" + " },\n" +
" \"birthDate\" : \"2012-01-02\"\n" + " \"birthDate\" : \"2012-01-02\"\n" +
" },\n" + " }\n" +
" \"search\" : {\n" +
" \"mode\" : \"match\",\n" +
" \"score\" : 0.123\n" +
" },\n" +
" \"request\" : {\n" +
" \"method\" : \"POST\",\n" +
" \"url\" : \"http://foo/Patient?identifier=value\"\n" +
" }\n" +
" }]\n" + " }]\n" +
"}"; "}";
//@formatter:on //@formatter:on
Bundle b = ourCtx.newJsonParser().parseBundle(bundle); Bundle b = ourCtx.newJsonParser().parseResource(Bundle.class, bundle);
assertEquals(1, b.getEntries().size()); assertEquals(1, b.getEntry().size());
Patient pt = (Patient) b.getEntries().get(0).getResource(); Patient pt = (Patient) b.getEntry().get(0).getResource();
assertEquals("http://foo/fhirBase2/Patient/1/_history/2", pt.getId().getValue()); assertEquals("http://foo/fhirBase2/Patient/1/_history/2", pt.getId().getValue());
assertEquals("2012-01-02", pt.getBirthDateElement().getValueAsString()); assertEquals("2012-01-02", pt.getBirthDateElement().getValueAsString());
assertEquals("0.123", ResourceMetadataKeyEnum.ENTRY_SCORE.get(pt).getValueAsString()); // assertEquals("match", ResourceMetadataKeyEnum.ENTRY_SEARCH_MODE.get(pt).getCode());
assertEquals("match", ResourceMetadataKeyEnum.ENTRY_SEARCH_MODE.get(pt).getCode()); // assertEquals("POST", ResourceMetadataKeyEnum.ENTRY_TRANSACTION_METHOD.get(pt).getCode());
assertEquals("POST", ResourceMetadataKeyEnum.ENTRY_TRANSACTION_METHOD.get(pt).getCode()); // assertEquals("http://foo/Patient?identifier=value", ResourceMetadataKeyEnum.LINK_SEARCH.get(pt));
assertEquals("http://foo/Patient?identifier=value", ResourceMetadataKeyEnum.LINK_SEARCH.get(pt)); // assertEquals("2001-02-22T11:22:33-05:00", ResourceMetadataKeyEnum.UPDATED.get(pt).getValueAsString());
assertEquals("2001-02-22T11:22:33-05:00", ResourceMetadataKeyEnum.UPDATED.get(pt).getValueAsString());
Bundle toBundle = new Bundle(); Bundle toBundle = new Bundle();
toBundle.getLinkBase().setValue("http://foo/fhirBase1"); toBundle.getTotalElement().setValue(1);
toBundle.getTotalResults().setValue(1); // toBundle.getLinkOrCreate("base").setUrl("http://foo/fhirBase1");
toBundle.getLinkSelf().setValue("http://localhost:52788/Binary?_pretty=true"); toBundle.getLinkOrCreate("self").setUrl("http://localhost:52788/Binary?_pretty=true");
toBundle.addResource(pt, ourCtx, "http://foo/fhirBase1"); toBundle
String reEncoded = ourCtx.newJsonParser().setPrettyPrint(true).encodeBundleToString(toBundle); .addEntry()
.setFullUrl("http://foo/fhirBase2/Patient/1/_history/2")
.setResource(pt);
String reEncoded = ourCtx.newJsonParser().setPrettyPrint(true).encodeResourceToString(toBundle);
JsonConfig cfg = new JsonConfig(); JsonConfig cfg = new JsonConfig();
@ -1692,9 +1615,9 @@ public class JsonParserDstu2Test {
String text = "{\"resourceType\":\"Bundle\",\"id\":null,\"base\":\"http://localhost:57931/fhir/contextDev\",\"total\":1,\"link\":[{\"relation\":\"self\",\"url\":\"http://localhost:57931/fhir/contextDev/Patient?identifier=urn%3AMultiFhirVersionTest%7CtestSubmitPatient01&_format=json\"}],\"entry\":[{\"resource\":{\"resourceType\":\"Patient\",\"id\":\"1\",\"meta\":{\"versionId\":\"1\",\"lastUpdated\":\"2014-12-20T18:41:29.706-05:00\"},\"identifier\":[{\"system\":\"urn:MultiFhirVersionTest\",\"value\":\"testSubmitPatient01\"}]}}]}"; String text = "{\"resourceType\":\"Bundle\",\"id\":null,\"base\":\"http://localhost:57931/fhir/contextDev\",\"total\":1,\"link\":[{\"relation\":\"self\",\"url\":\"http://localhost:57931/fhir/contextDev/Patient?identifier=urn%3AMultiFhirVersionTest%7CtestSubmitPatient01&_format=json\"}],\"entry\":[{\"resource\":{\"resourceType\":\"Patient\",\"id\":\"1\",\"meta\":{\"versionId\":\"1\",\"lastUpdated\":\"2014-12-20T18:41:29.706-05:00\"},\"identifier\":[{\"system\":\"urn:MultiFhirVersionTest\",\"value\":\"testSubmitPatient01\"}]}}]}";
FhirContext ctx = FhirContext.forDstu2(); FhirContext ctx = FhirContext.forDstu2();
Bundle b = ctx.newJsonParser().parseBundle(text); Bundle b = ctx.newJsonParser().parseResource(Bundle.class, text);
IResource patient = b.getEntries().get(0).getResource(); IResource patient = b.getEntry().get(0).getResource();
assertEquals(Patient.class, patient.getClass()); assertEquals(Patient.class, patient.getClass());
assertNull(ResourceMetadataKeyEnum.TAG_LIST.get(patient)); assertNull(ResourceMetadataKeyEnum.TAG_LIST.get(patient));
@ -1999,29 +1922,29 @@ public class JsonParserDstu2Test {
patient.setPetName(new StringDt("myName")); patient.setPetName(new StringDt("myName"));
final Bundle bundle = new Bundle(); final Bundle bundle = new Bundle();
final BundleEntry entry = new BundleEntry(); final Entry entry = new Entry();
entry.setResource(patient); entry.setResource(patient);
bundle.addEntry(entry); bundle.addEntry(entry);
final IParser jsonParser = ourCtx.newJsonParser(); final IParser jsonParser = ourCtx.newJsonParser();
jsonParser.setServerBaseUrl("http://www.example.com"); jsonParser.setServerBaseUrl("http://www.example.com");
final String parsedBundle = jsonParser.encodeBundleToString(bundle); final String parsedBundle = jsonParser.encodeResourceToString(bundle);
System.out.println(parsedBundle); System.out.println(parsedBundle);
assertEquals(expected, parsedBundle); assertEquals(expected, parsedBundle);
// Parse with string // Parse with string
Bundle newBundle = jsonParser.parseBundle(parsedBundle); Bundle newBundle = jsonParser.parseResource(Bundle.class, parsedBundle);
assertNotNull(newBundle); assertNotNull(newBundle);
assertEquals(1, newBundle.getEntries().size()); assertEquals(1, newBundle.getEntry().size());
Patient newPatient = (Patient) newBundle.getEntries().get(0).getResource(); Patient newPatient = (Patient) newBundle.getEntry().get(0).getResource();
assertEquals("myName", ((StringDt) newPatient.getUndeclaredExtensionsByUrl("http://www.example.com/petname").get(0).getValue()).getValue()); assertEquals("myName", ((StringDt) newPatient.getUndeclaredExtensionsByUrl("http://www.example.com/petname").get(0).getValue()).getValue());
// Parse with stream // Parse with stream
newBundle = jsonParser.parseBundle(new StringReader(parsedBundle)); newBundle = jsonParser.parseResource(Bundle.class, new StringReader(parsedBundle));
assertNotNull(newBundle); assertNotNull(newBundle);
assertEquals(1, newBundle.getEntries().size()); assertEquals(1, newBundle.getEntry().size());
newPatient = (Patient) newBundle.getEntries().get(0).getResource(); newPatient = (Patient) newBundle.getEntry().get(0).getResource();
assertEquals("myName", ((StringDt) newPatient.getUndeclaredExtensionsByUrl("http://www.example.com/petname").get(0).getValue()).getValue()); assertEquals("myName", ((StringDt) newPatient.getUndeclaredExtensionsByUrl("http://www.example.com/petname").get(0).getValue()).getValue());
} }

View File

@ -41,7 +41,6 @@ import com.google.common.collect.Sets;
import ca.uhn.fhir.context.FhirContext; import ca.uhn.fhir.context.FhirContext;
import ca.uhn.fhir.model.api.*; import ca.uhn.fhir.model.api.*;
import ca.uhn.fhir.model.api.Bundle;
import ca.uhn.fhir.model.api.annotation.Child; import ca.uhn.fhir.model.api.annotation.Child;
import ca.uhn.fhir.model.api.annotation.ResourceDef; import ca.uhn.fhir.model.api.annotation.ResourceDef;
import ca.uhn.fhir.model.base.composite.BaseCodingDt; import ca.uhn.fhir.model.base.composite.BaseCodingDt;
@ -67,7 +66,7 @@ public class XmlParserDstu2Test {
ourCtx = FhirContext.forDstu2(); ourCtx = FhirContext.forDstu2();
} }
} }
@Test @Test
public void testOverrideResourceIdWithBundleEntryFullUrlDisabled_ConfiguredOnFhirContext() { public void testOverrideResourceIdWithBundleEntryFullUrlDisabled_ConfiguredOnFhirContext() {
try { try {
@ -88,7 +87,7 @@ public class XmlParserDstu2Test {
ourCtx = null; ourCtx = null;
} }
} }
@Test @Test
public void testOverrideResourceIdWithBundleEntryFullUrlDisabled_ConfiguredOnParser() { public void testOverrideResourceIdWithBundleEntryFullUrlDisabled_ConfiguredOnParser() {
try { try {
@ -108,7 +107,7 @@ public class XmlParserDstu2Test {
ourCtx = null; ourCtx = null;
} }
} }
/** /**
* See #414 * See #414
*/ */
@ -137,10 +136,9 @@ public class XmlParserDstu2Test {
} catch (DataFormatException e) { } catch (DataFormatException e) {
assertEquals("Resource is missing required element 'url' in parent element 'extension'", e.getCause().getMessage()); assertEquals("Resource is missing required element 'url' in parent element 'extension'", e.getCause().getMessage());
} }
} }
/** /**
* See #414 * See #414
*/ */
@ -169,9 +167,9 @@ public class XmlParserDstu2Test {
} catch (DataFormatException e) { } catch (DataFormatException e) {
assertEquals("Resource is missing required element 'url' in parent element 'modifierExtension'", e.getCause().getMessage()); assertEquals("Resource is missing required element 'url' in parent element 'modifierExtension'", e.getCause().getMessage());
} }
} }
/** /**
* If a contained resource refers to a contained resource that comes after it, it should still be successfully * If a contained resource refers to a contained resource that comes after it, it should still be successfully
* woven together. * woven together.
@ -179,11 +177,11 @@ public class XmlParserDstu2Test {
@Test @Test
public void testParseWovenContainedResources() throws IOException { public void testParseWovenContainedResources() throws IOException {
String string = IOUtils.toString(getClass().getResourceAsStream("/bundle_with_woven_obs.xml"), StandardCharsets.UTF_8); String string = IOUtils.toString(getClass().getResourceAsStream("/bundle_with_woven_obs.xml"), StandardCharsets.UTF_8);
IParser parser = ourCtx.newXmlParser(); IParser parser = ourCtx.newXmlParser();
parser.setParserErrorHandler(new StrictErrorHandler()); parser.setParserErrorHandler(new StrictErrorHandler());
ca.uhn.fhir.model.dstu2.resource.Bundle bundle = parser.parseResource(ca.uhn.fhir.model.dstu2.resource.Bundle.class, string); ca.uhn.fhir.model.dstu2.resource.Bundle bundle = parser.parseResource(ca.uhn.fhir.model.dstu2.resource.Bundle.class, string);
DiagnosticReport resource = (DiagnosticReport) bundle.getEntry().get(0).getResource(); DiagnosticReport resource = (DiagnosticReport) bundle.getEntry().get(0).getResource();
Observation obs = (Observation) resource.getResult().get(1).getResource(); Observation obs = (Observation) resource.getResult().get(1).getResource();
assertEquals("#2", obs.getId().getValue()); assertEquals("#2", obs.getId().getValue());
@ -191,30 +189,29 @@ public class XmlParserDstu2Test {
Practitioner performer = (Practitioner) performerFirstRep.getResource(); Practitioner performer = (Practitioner) performerFirstRep.getResource();
assertEquals("#3", performer.getId().getValue()); assertEquals("#3", performer.getId().getValue());
} }
@Test(expected=DataFormatException.class) @Test(expected = DataFormatException.class)
public void testContainedResourceWithNoId() throws IOException { public void testContainedResourceWithNoId() throws IOException {
String string = IOUtils.toString(getClass().getResourceAsStream("/bundle_with_contained_with_no_id.xml"), StandardCharsets.UTF_8); String string = IOUtils.toString(getClass().getResourceAsStream("/bundle_with_contained_with_no_id.xml"), StandardCharsets.UTF_8);
IParser parser = ourCtx.newXmlParser(); IParser parser = ourCtx.newXmlParser();
parser.setParserErrorHandler(new StrictErrorHandler()); parser.setParserErrorHandler(new StrictErrorHandler());
parser.parseResource(ca.uhn.fhir.model.dstu2.resource.Bundle.class, string); parser.parseResource(ca.uhn.fhir.model.dstu2.resource.Bundle.class, string);
} }
@Test() @Test()
public void testContainedResourceWithNoIdLenient() throws IOException { public void testContainedResourceWithNoIdLenient() throws IOException {
String string = IOUtils.toString(getClass().getResourceAsStream("/bundle_with_contained_with_no_id.xml"), StandardCharsets.UTF_8); String string = IOUtils.toString(getClass().getResourceAsStream("/bundle_with_contained_with_no_id.xml"), StandardCharsets.UTF_8);
IParser parser = ourCtx.newXmlParser(); IParser parser = ourCtx.newXmlParser();
parser.setParserErrorHandler(new LenientErrorHandler()); parser.setParserErrorHandler(new LenientErrorHandler());
parser.parseResource(ca.uhn.fhir.model.dstu2.resource.Bundle.class, string); parser.parseResource(ca.uhn.fhir.model.dstu2.resource.Bundle.class, string);
} }
@Test(expected=DataFormatException.class) @Test(expected = DataFormatException.class)
public void testParseWithInvalidLocalRef() throws IOException { public void testParseWithInvalidLocalRef() throws IOException {
String string = IOUtils.toString(getClass().getResourceAsStream("/bundle_with_invalid_contained_ref.xml"), StandardCharsets.UTF_8); String string = IOUtils.toString(getClass().getResourceAsStream("/bundle_with_invalid_contained_ref.xml"), StandardCharsets.UTF_8);
IParser parser = ourCtx.newXmlParser(); IParser parser = ourCtx.newXmlParser();
parser.setParserErrorHandler(new StrictErrorHandler()); parser.setParserErrorHandler(new StrictErrorHandler());
parser.parseResource(ca.uhn.fhir.model.dstu2.resource.Bundle.class, string); parser.parseResource(ca.uhn.fhir.model.dstu2.resource.Bundle.class, string);
@ -223,13 +220,12 @@ public class XmlParserDstu2Test {
@Test() @Test()
public void testParseWithInvalidLocalRefLenient() throws IOException { public void testParseWithInvalidLocalRefLenient() throws IOException {
String string = IOUtils.toString(getClass().getResourceAsStream("/bundle_with_invalid_contained_ref.xml"), StandardCharsets.UTF_8); String string = IOUtils.toString(getClass().getResourceAsStream("/bundle_with_invalid_contained_ref.xml"), StandardCharsets.UTF_8);
IParser parser = ourCtx.newXmlParser(); IParser parser = ourCtx.newXmlParser();
parser.setParserErrorHandler(new LenientErrorHandler()); parser.setParserErrorHandler(new LenientErrorHandler());
parser.parseResource(ca.uhn.fhir.model.dstu2.resource.Bundle.class, string); parser.parseResource(ca.uhn.fhir.model.dstu2.resource.Bundle.class, string);
} }
@Test @Test
public void testBundleWithBinary() { public void testBundleWithBinary() {
//@formatter:off //@formatter:off
@ -254,14 +250,14 @@ public class XmlParserDstu2Test {
"</Bundle>"; "</Bundle>";
//@formatter:on //@formatter:on
Bundle b = ourCtx.newXmlParser().parseBundle(bundle); Bundle b = ourCtx.newXmlParser().parseResource(Bundle.class, bundle);
assertEquals(1, b.getEntries().size()); assertEquals(1, b.getEntry().size());
Binary bin = (Binary) b.getEntries().get(0).getResource(); Binary bin = (Binary) b.getEntry().get(0).getResource();
assertArrayEquals(new byte[] { 1, 2, 3, 4 }, bin.getContent()); assertArrayEquals(new byte[] { 1, 2, 3, 4 }, bin.getContent());
} }
@Test @Test
public void testChoiceTypeWithProfiledType() { public void testChoiceTypeWithProfiledType() {
//@formatter:off //@formatter:off
@ -281,7 +277,7 @@ public class XmlParserDstu2Test {
String encoded = ourCtx.newXmlParser().setPrettyPrint(true).encodeResourceToString(parsed); String encoded = ourCtx.newXmlParser().setPrettyPrint(true).encodeResourceToString(parsed);
assertThat(encoded, containsString("<valueMarkdown value=\"THIS IS MARKDOWN\"/>")); assertThat(encoded, containsString("<valueMarkdown value=\"THIS IS MARKDOWN\"/>"));
} }
@Test @Test
public void testChoiceTypeWithProfiledType2() { public void testChoiceTypeWithProfiledType2() {
Parameters par = new Parameters(); Parameters par = new Parameters();
@ -299,7 +295,6 @@ public class XmlParserDstu2Test {
assertEquals(MarkdownDt.class, par.getParameter().get(1).getValue().getClass()); assertEquals(MarkdownDt.class, par.getParameter().get(1).getValue().getClass());
} }
@Test @Test
public void testContainedResourceInExtensionUndeclared() { public void testContainedResourceInExtensionUndeclared() {
Patient p = new Patient(); Patient p = new Patient();
@ -359,13 +354,14 @@ public class XmlParserDstu2Test {
Organization org = new Organization(); Organization org = new Organization();
org.addIdentifier().setSystem("urn:system").setValue("someval"); org.addIdentifier().setSystem("urn:system").setValue("someval");
Bundle bundle = Bundle.withSingleResource(org); Bundle bundle = new Bundle();
String str = ourCtx.newXmlParser().encodeBundleToString(bundle); bundle.addEntry().setResource(org);
String str = ourCtx.newXmlParser().encodeResourceToString(bundle);
ourLog.info(str); ourLog.info(str);
Bundle parsed = ourCtx.newXmlParser().parseBundle(str); Bundle parsed = ourCtx.newXmlParser().parseResource(Bundle.class, str);
assertThat(parsed.getEntries().get(0).getResource().getId().getValue(), emptyOrNullString()); assertThat(parsed.getEntry().get(0).getResource().getId().getValue(), emptyOrNullString());
assertTrue(parsed.getEntries().get(0).getResource().getId().isEmpty()); assertTrue(parsed.getEntry().get(0).getResource().getId().isEmpty());
} }
@Test @Test
@ -479,20 +475,20 @@ public class XmlParserDstu2Test {
ourCtx = FhirContext.forDstu2(); ourCtx = FhirContext.forDstu2();
ourCtx.setDefaultTypeForProfile(CustomObservationDstu2.PROFILE, CustomObservationDstu2.class); ourCtx.setDefaultTypeForProfile(CustomObservationDstu2.PROFILE, CustomObservationDstu2.class);
ourCtx.setDefaultTypeForProfile(CustomDiagnosticReportDstu2.PROFILE, CustomDiagnosticReportDstu2.class); ourCtx.setDefaultTypeForProfile(CustomDiagnosticReportDstu2.PROFILE, CustomDiagnosticReportDstu2.class);
CustomObservationDstu2 obs = new CustomObservationDstu2(); CustomObservationDstu2 obs = new CustomObservationDstu2();
obs.setStatus(ObservationStatusEnum.FINAL); obs.setStatus(ObservationStatusEnum.FINAL);
CustomDiagnosticReportDstu2 dr = new CustomDiagnosticReportDstu2(); CustomDiagnosticReportDstu2 dr = new CustomDiagnosticReportDstu2();
dr.setStatus(DiagnosticReportStatusEnum.FINAL); dr.setStatus(DiagnosticReportStatusEnum.FINAL);
dr.addResult().setResource(obs); dr.addResult().setResource(obs);
IParser parser = ourCtx.newXmlParser(); IParser parser = ourCtx.newXmlParser();
parser.setPrettyPrint(true); parser.setPrettyPrint(true);
String output = parser.encodeResourceToString(dr); String output = parser.encodeResourceToString(dr);
ourLog.info(output); ourLog.info(output);
//@formatter:off //@formatter:off
assertThat(output,stringContainsInOrder( assertThat(output,stringContainsInOrder(
"<DiagnosticReport xmlns=\"http://hl7.org/fhir\">", "<DiagnosticReport xmlns=\"http://hl7.org/fhir\">",
@ -514,11 +510,11 @@ public class XmlParserDstu2Test {
"</result>", "</result>",
"</DiagnosticReport>")); "</DiagnosticReport>"));
//@formatter:on //@formatter:on
/* /*
* Now PARSE! * Now PARSE!
*/ */
dr = (CustomDiagnosticReportDstu2) parser.parseResource(output); dr = (CustomDiagnosticReportDstu2) parser.parseResource(output);
assertEquals(DiagnosticReportStatusEnum.FINAL, dr.getStatusElement().getValueAsEnum()); assertEquals(DiagnosticReportStatusEnum.FINAL, dr.getStatusElement().getValueAsEnum());
@ -549,35 +545,34 @@ public class XmlParserDstu2Test {
"<status value=\"final\"/>" + "<status value=\"final\"/>" +
"</DiagnosticReport>"; "</DiagnosticReport>";
//@formatter:on //@formatter:on
IParser parser = ourCtx.newXmlParser(); IParser parser = ourCtx.newXmlParser();
CustomDiagnosticReportDstu2 dr = (CustomDiagnosticReportDstu2) parser.parseResource(input); CustomDiagnosticReportDstu2 dr = (CustomDiagnosticReportDstu2) parser.parseResource(input);
assertEquals(DiagnosticReportStatusEnum.FINAL, dr.getStatusElement().getValueAsEnum()); assertEquals(DiagnosticReportStatusEnum.FINAL, dr.getStatusElement().getValueAsEnum());
List<IdDt> profiles = ResourceMetadataKeyEnum.PROFILES.get(dr); List<IdDt> profiles = ResourceMetadataKeyEnum.PROFILES.get(dr);
assertEquals(3, profiles.size()); assertEquals(3, profiles.size());
ourCtx = null; ourCtx = null;
} }
@Test @Test
public void testEncodeAndParseContainedNonCustomTypes() { public void testEncodeAndParseContainedNonCustomTypes() {
ourCtx = FhirContext.forDstu2(); ourCtx = FhirContext.forDstu2();
Observation obs = new Observation(); Observation obs = new Observation();
obs.setStatus(ObservationStatusEnum.FINAL); obs.setStatus(ObservationStatusEnum.FINAL);
DiagnosticReport dr = new DiagnosticReport(); DiagnosticReport dr = new DiagnosticReport();
dr.setStatus(DiagnosticReportStatusEnum.FINAL); dr.setStatus(DiagnosticReportStatusEnum.FINAL);
dr.addResult().setResource(obs); dr.addResult().setResource(obs);
IParser parser = ourCtx.newXmlParser(); IParser parser = ourCtx.newXmlParser();
parser.setPrettyPrint(true); parser.setPrettyPrint(true);
String output = parser.encodeResourceToString(dr); String output = parser.encodeResourceToString(dr);
ourLog.info(output); ourLog.info(output);
//@formatter:off //@formatter:off
assertThat(output,stringContainsInOrder( assertThat(output,stringContainsInOrder(
"<DiagnosticReport xmlns=\"http://hl7.org/fhir\">", "<DiagnosticReport xmlns=\"http://hl7.org/fhir\">",
@ -593,11 +588,11 @@ public class XmlParserDstu2Test {
"</result>", "</result>",
"</DiagnosticReport>")); "</DiagnosticReport>"));
//@formatter:on //@formatter:on
/* /*
* Now PARSE! * Now PARSE!
*/ */
dr = (DiagnosticReport) parser.parseResource(output); dr = (DiagnosticReport) parser.parseResource(output);
assertEquals(DiagnosticReportStatusEnum.FINAL, dr.getStatusElement().getValueAsEnum()); assertEquals(DiagnosticReportStatusEnum.FINAL, dr.getStatusElement().getValueAsEnum());
@ -621,10 +616,10 @@ public class XmlParserDstu2Test {
condition.setOurAbatement(new DateTimeDt(new Date())); condition.setOurAbatement(new DateTimeDt(new Date()));
String conditionXml = parser.encodeResourceToString(condition); String conditionXml = parser.encodeResourceToString(condition);
ourLog.info(conditionXml); ourLog.info(conditionXml);
assertThat(conditionXml, containsString("abatementDateTime")); assertThat(conditionXml, containsString("abatementDateTime"));
CustomCondition parsedCondition = (CustomCondition) parser.parseResource(conditionXml); CustomCondition parsedCondition = (CustomCondition) parser.parseResource(conditionXml);
assertNotNull(parsedCondition.getOurAbatement()); assertNotNull(parsedCondition.getOurAbatement());
} }
@ -1120,9 +1115,9 @@ public class XmlParserDstu2Test {
p.addName().addFamily("PATIENT"); p.addName().addFamily("PATIENT");
Bundle b = new Bundle(); Bundle b = new Bundle();
b.addEntry().setResource(p); b.addEntry().setFullUrl(p.getId().getValue()).setResource(p);
String encoded = ourCtx.newXmlParser().setPrettyPrint(true).encodeBundleToString(b); String encoded = ourCtx.newXmlParser().setPrettyPrint(true).encodeResourceToString(b);
ourLog.info(encoded); ourLog.info(encoded);
assertThat(encoded, stringContainsInOrder("<Bundle", "<entry>", "<fullUrl value=\"" + p.getId().getValue() + "\"/>", "<Patient")); assertThat(encoded, stringContainsInOrder("<Bundle", "<entry>", "<fullUrl value=\"" + p.getId().getValue() + "\"/>", "<Patient"));
assertThat(encoded, not(containsString("<id value=\"" + p.getId().getIdPart() + "\"/>"))); assertThat(encoded, not(containsString("<id value=\"" + p.getId().getIdPart() + "\"/>")));
@ -1135,10 +1130,10 @@ public class XmlParserDstu2Test {
p.addName().addFamily("PATIENT"); p.addName().addFamily("PATIENT");
Bundle b = new Bundle(); Bundle b = new Bundle();
b.getLinkBase().setValue("urn:uuid:"); b.getLinkOrCreate("base").setUrl("urn:uuid:");
b.addEntry().setResource(p); b.addEntry().setResource(p);
String encoded = ourCtx.newXmlParser().setPrettyPrint(true).encodeBundleToString(b); String encoded = ourCtx.newXmlParser().setPrettyPrint(true).encodeResourceToString(b);
ourLog.info(encoded); ourLog.info(encoded);
// Base element has been removed! // Base element has been removed!
assertThat(encoded, not(stringContainsInOrder("<Bundle", "<entry>", "<base value=\"", "<Patient", "<id value="))); assertThat(encoded, not(stringContainsInOrder("<Bundle", "<entry>", "<base value=\"", "<Patient", "<id value=")));
@ -1318,7 +1313,7 @@ public class XmlParserDstu2Test {
"<pre>line1\nline2\nline3 <b>BOLD</b></pre>" "<pre>line1\nline2\nline3 <b>BOLD</b></pre>"
)); ));
//@formatter:on //@formatter:on
} }
/** /**
@ -1326,13 +1321,13 @@ public class XmlParserDstu2Test {
*/ */
@Test @Test
public void testEncodeDivWithPrePrettyPrint() { public void testEncodeDivWithPrePrettyPrint() {
Patient p = new Patient(); Patient p = new Patient();
p.getText().setDiv("<div>\n\n<p>A P TAG</p><p><pre>line1\nline2\nline3 <b>BOLD</b></pre></p></div>"); p.getText().setDiv("<div>\n\n<p>A P TAG</p><p><pre>line1\nline2\nline3 <b>BOLD</b></pre></p></div>");
String output = ourCtx.newXmlParser().setPrettyPrint(true).encodeResourceToString(p); String output = ourCtx.newXmlParser().setPrettyPrint(true).encodeResourceToString(p);
ourLog.info(output); ourLog.info(output);
//@formatter:off //@formatter:off
assertThat(output, stringContainsInOrder( assertThat(output, stringContainsInOrder(
" <text>", " <text>",
@ -1340,7 +1335,7 @@ public class XmlParserDstu2Test {
" <pre>line1\nline2\nline3 <b>BOLD</b></pre>" " <pre>line1\nline2\nline3 <b>BOLD</b></pre>"
)); ));
//@formatter:on //@formatter:on
} }
@Test @Test
@ -1352,7 +1347,7 @@ public class XmlParserDstu2Test {
String actual = ourCtx.newXmlParser().setPrettyPrint(true).encodeResourceToString(p); String actual = ourCtx.newXmlParser().setPrettyPrint(true).encodeResourceToString(p);
assertThat(actual, not(containsString("78ef6f64c2f2"))); assertThat(actual, not(containsString("78ef6f64c2f2")));
} }
@Test @Test
public void testEncodeEmptyBinary() { public void testEncodeEmptyBinary() {
String output = ourCtx.newXmlParser().encodeResourceToString(new Binary()); String output = ourCtx.newXmlParser().encodeResourceToString(new Binary());
@ -1367,10 +1362,10 @@ public class XmlParserDstu2Test {
TagList tagList = new TagList(); TagList tagList = new TagList();
tagList.addTag(null, null, null); tagList.addTag(null, null, null);
tagList.addTag(null, null, "Label"); tagList.addTag(null, null, "Label");
Patient p = new Patient(); Patient p = new Patient();
ResourceMetadataKeyEnum.TAG_LIST.put(p, tagList); ResourceMetadataKeyEnum.TAG_LIST.put(p, tagList);
String encoded = ourCtx.newXmlParser().encodeResourceToString(p); String encoded = ourCtx.newXmlParser().encodeResourceToString(p);
assertThat(encoded, not(containsString("tag"))); assertThat(encoded, not(containsString("tag")));
} }
@ -1383,10 +1378,10 @@ public class XmlParserDstu2Test {
TagList tagList = new TagList(); TagList tagList = new TagList();
tagList.addTag("scheme", "code", null); tagList.addTag("scheme", "code", null);
tagList.addTag(null, null, "Label"); tagList.addTag(null, null, "Label");
Patient p = new Patient(); Patient p = new Patient();
ResourceMetadataKeyEnum.TAG_LIST.put(p, tagList); ResourceMetadataKeyEnum.TAG_LIST.put(p, tagList);
String encoded = ourCtx.newXmlParser().encodeResourceToString(p); String encoded = ourCtx.newXmlParser().encodeResourceToString(p);
assertThat(encoded, containsString("tag")); assertThat(encoded, containsString("tag"));
assertThat(encoded, containsString("scheme")); assertThat(encoded, containsString("scheme"));
@ -1400,11 +1395,11 @@ public class XmlParserDstu2Test {
obs.getMeta().addProfile("http://profile"); obs.getMeta().addProfile("http://profile");
ExtensionDt ext = obs.addUndeclaredExtension(false, "http://exturl"); ExtensionDt ext = obs.addUndeclaredExtension(false, "http://exturl");
ext.setUrl("http://exturl").setValue(new StringDt("ext_url_value")); ext.setUrl("http://exturl").setValue(new StringDt("ext_url_value"));
obs.getCode().setText("CODE"); obs.getCode().setText("CODE");
IParser parser = ourCtx.newXmlParser(); IParser parser = ourCtx.newXmlParser();
String output = parser.setPrettyPrint(true).encodeResourceToString(obs); String output = parser.setPrettyPrint(true).encodeResourceToString(obs);
ourLog.info(output); ourLog.info(output);
@ -1912,30 +1907,30 @@ public class XmlParserDstu2Test {
public void testParseAndEncodeBundle() throws Exception { public void testParseAndEncodeBundle() throws Exception {
String content = IOUtils.toString(XmlParserDstu2Test.class.getResourceAsStream("/bundle-example.xml"), StandardCharsets.UTF_8); String content = IOUtils.toString(XmlParserDstu2Test.class.getResourceAsStream("/bundle-example.xml"), StandardCharsets.UTF_8);
Bundle parsed = ourCtx.newXmlParser().parseBundle(content); Bundle parsed = ourCtx.newXmlParser().parseResource(Bundle.class, content);
assertEquals("Bundle/example/_history/1", parsed.getId().getValue()); assertEquals("Bundle/example/_history/1", parsed.getId().getValue());
assertEquals("1", parsed.getResourceMetadata().get(ResourceMetadataKeyEnum.VERSION)); assertEquals("1", parsed.getResourceMetadata().get(ResourceMetadataKeyEnum.VERSION));
assertEquals("1", parsed.getId().getVersionIdPart()); assertEquals("1", parsed.getId().getVersionIdPart());
assertEquals(new InstantDt("2014-08-18T01:43:30Z"), parsed.getResourceMetadata().get(ResourceMetadataKeyEnum.UPDATED)); assertEquals(new InstantDt("2014-08-18T01:43:30Z"), parsed.getResourceMetadata().get(ResourceMetadataKeyEnum.UPDATED));
assertEquals("searchset", parsed.getType().getValue()); assertEquals("searchset", parsed.getTypeElement().getValue());
assertEquals(3, parsed.getTotalResults().getValue().intValue()); assertEquals(3, parsed.getTotalElement().getValue().intValue());
assertEquals("https://example.com/base/MedicationOrder?patient=347&searchId=ff15fd40-ff71-4b48-b366-09c706bed9d0&page=2", parsed.getLinkNext().getValue()); assertEquals("https://example.com/base/MedicationOrder?patient=347&searchId=ff15fd40-ff71-4b48-b366-09c706bed9d0&page=2", parsed.getLink("next").getUrl());
assertEquals("https://example.com/base/MedicationOrder?patient=347&_include=MedicationOrder.medication", parsed.getLinkSelf().getValue()); assertEquals("https://example.com/base/MedicationOrder?patient=347&_include=MedicationOrder.medication", parsed.getLink("self").getUrl());
assertEquals(2, parsed.getEntries().size()); assertEquals(2, parsed.getEntry().size());
assertEquals("http://foo?search", parsed.getEntries().get(0).getLinkSearch().getValue()); // assertEquals("http://foo?search", parsed.getEntry().get(0).getLink("search").getUrl());
// assertEquals("http://example.com/base/MedicationOrder/3123/_history/1", parsed.getEntry().get(0).getLink("alternate").getUrl());
assertEquals("http://example.com/base/MedicationOrder/3123/_history/1", parsed.getEntries().get(0).getLinkAlternate().getValue()); MedicationOrder p = (MedicationOrder) parsed.getEntry().get(0).getResource();
MedicationOrder p = (MedicationOrder) parsed.getEntries().get(0).getResource();
assertEquals("Patient/347", p.getPatient().getReference().getValue()); assertEquals("Patient/347", p.getPatient().getReference().getValue());
assertEquals("2014-08-16T05:31:17Z", ResourceMetadataKeyEnum.UPDATED.get(p).getValueAsString()); assertEquals("2014-08-16T05:31:17Z", ResourceMetadataKeyEnum.UPDATED.get(p).getValueAsString());
assertEquals("http://example.com/base/MedicationOrder/3123/_history/1", p.getId().getValue()); assertEquals("http://example.com/base/MedicationOrder/3123/_history/1", p.getId().getValue());
Medication m = (Medication) parsed.getEntries().get(1).getResource(); Medication m = (Medication) parsed.getEntry().get(1).getResource();
assertEquals("http://example.com/base/Medication/example", m.getId().getValue()); assertEquals("http://example.com/base/Medication/example", m.getId().getValue());
assertSame(((ResourceReferenceDt) p.getMedication()).getResource(), m); assertSame(((ResourceReferenceDt) p.getMedication()).getResource(), m);
String reencoded = ourCtx.newXmlParser().setPrettyPrint(true).encodeBundleToString(parsed); String reencoded = ourCtx.newXmlParser().setPrettyPrint(true).encodeResourceToString(parsed);
ourLog.info(reencoded); ourLog.info(reencoded);
Diff d = new Diff(new StringReader(content), new StringReader(reencoded)); Diff d = new Diff(new StringReader(content), new StringReader(reencoded));
@ -1952,7 +1947,7 @@ public class XmlParserDstu2Test {
assertEquals("Bundle/example/_history/1", parsed.getId().getValue()); assertEquals("Bundle/example/_history/1", parsed.getId().getValue());
assertEquals("1", parsed.getResourceMetadata().get(ResourceMetadataKeyEnum.VERSION)); assertEquals("1", parsed.getResourceMetadata().get(ResourceMetadataKeyEnum.VERSION));
assertEquals(new InstantDt("2014-08-18T01:43:30Z"), parsed.getResourceMetadata().get(ResourceMetadataKeyEnum.UPDATED)); assertEquals(new InstantDt("2014-08-18T01:43:30Z"), parsed.getResourceMetadata().get(ResourceMetadataKeyEnum.UPDATED));
assertEquals("searchset", parsed.getType()); assertEquals("searchset", parsed.getTypeElement().getValueAsString());
assertEquals(3, parsed.getTotal().intValue()); assertEquals(3, parsed.getTotal().intValue());
assertEquals("https://example.com/base/MedicationOrder?patient=347&searchId=ff15fd40-ff71-4b48-b366-09c706bed9d0&page=2", parsed.getLink().get(0).getUrlElement().getValueAsString()); assertEquals("https://example.com/base/MedicationOrder?patient=347&searchId=ff15fd40-ff71-4b48-b366-09c706bed9d0&page=2", parsed.getLink().get(0).getUrlElement().getValueAsString());
assertEquals("https://example.com/base/MedicationOrder?patient=347&_include=MedicationOrder.medication", parsed.getLink().get(1).getUrlElement().getValueAsString()); assertEquals("https://example.com/base/MedicationOrder?patient=347&_include=MedicationOrder.medication", parsed.getLink().get(1).getUrlElement().getValueAsString());
@ -2404,46 +2399,8 @@ public class XmlParserDstu2Test {
"</Bundle>"; "</Bundle>";
//@formatter:on //@formatter:on
Bundle b = ourCtx.newXmlParser().parseBundle(bundle); Bundle b = ourCtx.newXmlParser().parseResource(Bundle.class, bundle);
assertEquals(1, b.getEntries().size()); assertEquals(1, b.getEntry().size());
}
@Test
public void testParseBundleOldWithPlaceholderIds() {
//@formatter:off
String input = "<Bundle xmlns=\"http://hl7.org/fhir\">\n" +
" <id value=\"ringholm1430996763590912\"/>\n" +
" <entry>\n" +
" <base value=\"urn:oid:\"/>\n" +
" <resource>\n" +
" <Provenance>\n" +
" <id value=\"0.1.2.3\"/>\n" +
" </Provenance>\n" +
" </resource>\n" +
" </entry>\n" +
"</Bundle>\n";
//@formatter:on
Bundle parsed = ourCtx.newXmlParser().parseBundle(input);
assertEquals("urn:oid:0.1.2.3", parsed.getEntries().get(0).getResource().getId().getValue());
//@formatter:off
input = "<Bundle xmlns=\"http://hl7.org/fhir\">\n" +
" <id value=\"ringholm1430996763590912\"/>\n" +
" <entry>\n" +
" <base value=\"urn:oid\"/>\n" + // no trailing :, invalid but we'll be nice
" <resource>\n" +
" <Provenance>\n" +
" <id value=\"0.1.2.3\"/>\n" +
" </Provenance>\n" +
" </resource>\n" +
" </entry>\n" +
"</Bundle>\n";
//@formatter:on
parsed = ourCtx.newXmlParser().parseBundle(input);
assertEquals("urn:oid:0.1.2.3", parsed.getEntries().get(0).getResource().getId().getValue());
} }
@ -2452,8 +2409,6 @@ public class XmlParserDstu2Test {
// TODO: implement this test, make sure we handle ID and meta correctly in Binary // TODO: implement this test, make sure we handle ID and meta correctly in Binary
} }
/** /**
* See #191 * See #191
*/ */
@ -2559,15 +2514,14 @@ public class XmlParserDstu2Test {
/** /**
* See #366 * See #366
*/ */
@Test(expected=DataFormatException.class) @Test(expected = DataFormatException.class)
public void testParseInvalidBoolean() { public void testParseInvalidBoolean() {
//@formatter:off //@formatter:off
String resource = "<Patient xmlns=\"http://hl7.org/fhir\">\n" + String resource = "<Patient xmlns=\"http://hl7.org/fhir\">\n" +
" <active value=\"1\"/>\n" + " <active value=\"1\"/>\n" +
"</Patient>"; "</Patient>";
//@formatter:on //@formatter:on
IParser parser = ourCtx.newXmlParser(); IParser parser = ourCtx.newXmlParser();
parser.setParserErrorHandler(new StrictErrorHandler()); parser.setParserErrorHandler(new StrictErrorHandler());
parser.parseResource(resource); parser.parseResource(resource);
@ -2621,6 +2575,10 @@ public class XmlParserDstu2Test {
String bundle = "<Bundle xmlns=\"http://hl7.org/fhir\">\n" + String bundle = "<Bundle xmlns=\"http://hl7.org/fhir\">\n" +
" <total value=\"1\"/>\n" + " <total value=\"1\"/>\n" +
" <link>\n" + " <link>\n" +
" <relation value=\"base\"/>\n" +
" <url value=\"http://foo/fhirBase1\"/>\n" +
" </link>\n" +
" <link>\n" +
" <relation value=\"self\"/>\n" + " <relation value=\"self\"/>\n" +
" <url value=\"http://localhost:52788/Binary?_pretty=true\"/>\n" + " <url value=\"http://localhost:52788/Binary?_pretty=true\"/>\n" +
" </link>\n" + " </link>\n" +
@ -2636,37 +2594,33 @@ public class XmlParserDstu2Test {
" <birthDate value=\"2012-01-02\"/>\n" + " <birthDate value=\"2012-01-02\"/>\n" +
" </Patient>\n" + " </Patient>\n" +
" </resource>\n" + " </resource>\n" +
" <search>\n" +
" <mode value=\"match\"/>\n" +
" <score value=\"0.123\"/>\n" +
" </search>\n" +
" <request>\n" +
" <method value=\"POST\"/>\n" +
" <url value=\"http://foo/Patient?identifier=value\"/>\n" +
" </request>\n" +
" </entry>\n" + " </entry>\n" +
"</Bundle>"; "</Bundle>";
//@formatter:on //@formatter:on
Bundle b = ourCtx.newXmlParser().parseBundle(bundle); Bundle b = ourCtx.newXmlParser().parseResource(Bundle.class, bundle);
assertEquals(1, b.getEntries().size()); assertEquals(1, b.getEntry().size());
Patient pt = (Patient) b.getEntries().get(0).getResource(); Patient pt = (Patient) b.getEntry().get(0).getResource();
assertEquals("http://foo/fhirBase2/Patient/1/_history/2", pt.getId().getValue()); assertEquals("http://foo/fhirBase2/Patient/1/_history/2", pt.getId().getValue());
assertEquals("2012-01-02", pt.getBirthDateElement().getValueAsString()); assertEquals("2012-01-02", pt.getBirthDateElement().getValueAsString());
assertEquals("0.123", ResourceMetadataKeyEnum.ENTRY_SCORE.get(pt).getValueAsString()); // assertEquals("0.123", ResourceMetadataKeyEnum.ENTRY_SCORE.get(pt).getValueAsString());
assertEquals("match", ResourceMetadataKeyEnum.ENTRY_SEARCH_MODE.get(pt).getCode()); // assertEquals("match", ResourceMetadataKeyEnum.ENTRY_SEARCH_MODE.get(pt).getCode());
assertEquals("POST", ResourceMetadataKeyEnum.ENTRY_TRANSACTION_METHOD.get(pt).getCode()); // assertEquals("POST", ResourceMetadataKeyEnum.ENTRY_TRANSACTION_METHOD.get(pt).getCode());
assertEquals("http://foo/Patient?identifier=value", ResourceMetadataKeyEnum.LINK_SEARCH.get(pt)); // assertEquals("http://foo/Patient?identifier=value", ResourceMetadataKeyEnum.LINK_SEARCH.get(pt));
assertEquals("2001-02-22T11:22:33-05:00", ResourceMetadataKeyEnum.UPDATED.get(pt).getValueAsString()); // assertEquals("2001-02-22T11:22:33-05:00", ResourceMetadataKeyEnum.UPDATED.get(pt).getValueAsString());
Bundle toBundle = new Bundle(); Bundle toBundle = new Bundle();
toBundle.getLinkBase().setValue("http://foo/fhirBase1"); toBundle.getLinkOrCreate("base").setUrl("http://foo/fhirBase1");
toBundle.getTotalResults().setValue(1); toBundle.getTotalElement().setValue(1);
toBundle.getLinkSelf().setValue("http://localhost:52788/Binary?_pretty=true"); toBundle.getLinkOrCreate("self").setUrl("http://localhost:52788/Binary?_pretty=true");
toBundle.addResource(pt, ourCtx, "http://foo/fhirBase1"); toBundle
String reEncoded = ourCtx.newXmlParser().setPrettyPrint(true).encodeBundleToString(toBundle); .addEntry()
.setResource(pt)
.setFullUrl("http://foo/fhirBase2/Patient/1/_history/2");
String reEncoded = ourCtx.newXmlParser().setPrettyPrint(true).encodeResourceToString(toBundle);
ourLog.info(reEncoded); ourLog.info(reEncoded);
@ -2769,7 +2723,7 @@ public class XmlParserDstu2Test {
assertEquals("Patient", reincarnatedPatient.getId().getResourceType()); assertEquals("Patient", reincarnatedPatient.getId().getResourceType());
} }
/** /**
* Test for the url generated based on the server config * Test for the url generated based on the server config
*/ */
@Test @Test
@ -2811,7 +2765,7 @@ public class XmlParserDstu2Test {
newPatient = xmlParser.parseResource(MyPatientWithCustomUrlExtension.class, new StringReader(parsedPatient)); newPatient = xmlParser.parseResource(MyPatientWithCustomUrlExtension.class, new StringReader(parsedPatient));
assertEquals("myName", newPatient.getPetName().getValue()); assertEquals("myName", newPatient.getPetName().getValue());
//Check no NPE if base server not configure // Check no NPE if base server not configure
newPatient = ourCtx.newXmlParser().parseResource(MyPatientWithCustomUrlExtension.class, new StringReader(parsedPatient)); newPatient = ourCtx.newXmlParser().parseResource(MyPatientWithCustomUrlExtension.class, new StringReader(parsedPatient));
assertNull("myName", newPatient.getPetName().getValue()); assertNull("myName", newPatient.getPetName().getValue());
assertEquals("myName", ((StringDt) newPatient.getUndeclaredExtensionsByUrl("http://www.example.com/petname").get(0).getValue()).getValue()); assertEquals("myName", ((StringDt) newPatient.getUndeclaredExtensionsByUrl("http://www.example.com/petname").get(0).getValue()).getValue());
@ -2825,33 +2779,33 @@ public class XmlParserDstu2Test {
patient.setPetName(new StringDt("myName")); patient.setPetName(new StringDt("myName"));
final Bundle bundle = new Bundle(); final Bundle bundle = new Bundle();
final BundleEntry entry = new BundleEntry(); final Entry entry = new Entry();
entry.setResource(patient); entry.setResource(patient);
bundle.addEntry(entry); bundle.addEntry(entry);
final IParser xmlParser = ourCtx.newXmlParser(); final IParser xmlParser = ourCtx.newXmlParser();
xmlParser.setServerBaseUrl("http://www.example.com"); xmlParser.setServerBaseUrl("http://www.example.com");
final String parsedBundle = xmlParser.encodeBundleToString(bundle); final String parsedBundle = xmlParser.encodeResourceToString(bundle);
System.out.println(parsedBundle); System.out.println(parsedBundle);
assertEquals(expected, parsedBundle); assertEquals(expected, parsedBundle);
// Parse with string // Parse with string
Bundle newBundle = xmlParser.parseBundle(parsedBundle); Bundle newBundle = xmlParser.parseResource(Bundle.class, parsedBundle);
assertNotNull(newBundle); assertNotNull(newBundle);
assertEquals(1, newBundle.getEntries().size()); assertEquals(1, newBundle.getEntry().size());
Patient newPatient = (Patient) newBundle.getEntries().get(0).getResource(); Patient newPatient = (Patient) newBundle.getEntry().get(0).getResource();
assertEquals("myName", ((StringDt) newPatient.getUndeclaredExtensionsByUrl("http://www.example.com/petname").get(0).getValue()).getValue()); assertEquals("myName", ((StringDt) newPatient.getUndeclaredExtensionsByUrl("http://www.example.com/petname").get(0).getValue()).getValue());
// Parse with stream // Parse with stream
newBundle = xmlParser.parseBundle(new StringReader(parsedBundle)); newBundle = xmlParser.parseResource(Bundle.class, new StringReader(parsedBundle));
assertNotNull(newBundle); assertNotNull(newBundle);
assertEquals(1, newBundle.getEntries().size()); assertEquals(1, newBundle.getEntry().size());
newPatient = (Patient) newBundle.getEntries().get(0).getResource(); newPatient = (Patient) newBundle.getEntry().get(0).getResource();
assertEquals("myName", ((StringDt) newPatient.getUndeclaredExtensionsByUrl("http://www.example.com/petname").get(0).getValue()).getValue()); assertEquals("myName", ((StringDt) newPatient.getUndeclaredExtensionsByUrl("http://www.example.com/petname").get(0).getValue()).getValue());
} }
@AfterClass @AfterClass
public static void afterClassClearContext() { public static void afterClassClearContext() {
TestUtil.clearAllStaticFieldsForUnitTest(); TestUtil.clearAllStaticFieldsForUnitTest();
@ -2885,7 +2839,7 @@ public class XmlParserDstu2Test {
this.myAbatement = theAbatement; this.myAbatement = theAbatement;
} }
} }
@ResourceDef(name = "Patient") @ResourceDef(name = "Patient")
public static class TestPatientFor327 extends Patient { public static class TestPatientFor327 extends Patient {

View File

@ -25,7 +25,7 @@ import org.mockito.ArgumentCaptor;
import org.mockito.internal.stubbing.defaultanswers.ReturnsDeepStubs; import org.mockito.internal.stubbing.defaultanswers.ReturnsDeepStubs;
import ca.uhn.fhir.context.FhirContext; import ca.uhn.fhir.context.FhirContext;
import ca.uhn.fhir.model.api.Bundle; import ca.uhn.fhir.model.dstu2.resource.Bundle;
import ca.uhn.fhir.model.dstu2.resource.Patient; import ca.uhn.fhir.model.dstu2.resource.Patient;
import ca.uhn.fhir.model.valueset.BundleTypeEnum; import ca.uhn.fhir.model.valueset.BundleTypeEnum;
import ca.uhn.fhir.rest.api.Constants; import ca.uhn.fhir.rest.api.Constants;
@ -62,7 +62,7 @@ public class BundleTypeDstu2Test {
@Test @Test
public void testTransaction() throws Exception { public void testTransaction() throws Exception {
String retVal = ourCtx.newXmlParser().encodeBundleToString(new Bundle()); String retVal = ourCtx.newXmlParser().encodeResourceToString(new Bundle());
ArgumentCaptor<HttpUriRequest> capt = ArgumentCaptor.forClass(HttpUriRequest.class); ArgumentCaptor<HttpUriRequest> capt = ArgumentCaptor.forClass(HttpUriRequest.class);
when(ourHttpClient.execute(capt.capture())).thenReturn(ourHttpResponse); when(ourHttpClient.execute(capt.capture())).thenReturn(ourHttpResponse);
@ -94,9 +94,9 @@ public class BundleTypeDstu2Test {
IGenericClient client = ctx.newRestfulGenericClient("http://54.165.58.158:8081/FHIRServer/fhir"); IGenericClient client = ctx.newRestfulGenericClient("http://54.165.58.158:8081/FHIRServer/fhir");
client.registerInterceptor(new BearerTokenAuthInterceptor("AN3uCTC5B")); client.registerInterceptor(new BearerTokenAuthInterceptor("AN3uCTC5B"));
client.registerInterceptor(new LoggingInterceptor(true)); client.registerInterceptor(new LoggingInterceptor(true));
Bundle result = client.search().forResource(Patient.class).where(Patient.NAME.matches().value("Alice")).execute(); Bundle result = client.search().forResource(Patient.class).where(Patient.NAME.matches().value("Alice")).returnBundle(Bundle.class).execute();
System.out.println(result.getEntries().size()); System.out.println(result.getEntry().size());
} }

View File

@ -36,7 +36,6 @@ import org.mockito.stubbing.Answer;
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.*;
import ca.uhn.fhir.model.api.Bundle;
import ca.uhn.fhir.model.dstu2.composite.IdentifierDt; import ca.uhn.fhir.model.dstu2.composite.IdentifierDt;
import ca.uhn.fhir.model.dstu2.composite.MetaDt; import ca.uhn.fhir.model.dstu2.composite.MetaDt;
import ca.uhn.fhir.model.dstu2.resource.*; import ca.uhn.fhir.model.dstu2.resource.*;
@ -74,12 +73,12 @@ public class GenericClientDstu2Test {
ourCtx.getRestfulClientFactory().setConnectTimeout(10000); ourCtx.getRestfulClientFactory().setConnectTimeout(10000);
ourCtx.getRestfulClientFactory().setPoolMaxPerRoute(100); ourCtx.getRestfulClientFactory().setPoolMaxPerRoute(100);
ourCtx.getRestfulClientFactory().setPoolMaxTotal(100); ourCtx.getRestfulClientFactory().setPoolMaxTotal(100);
ourCtx.getRestfulClientFactory().setHttpClient(myHttpClient); ourCtx.getRestfulClientFactory().setHttpClient(myHttpClient);
ourCtx.getRestfulClientFactory().setServerValidationMode(ServerValidationModeEnum.NEVER); ourCtx.getRestfulClientFactory().setServerValidationMode(ServerValidationModeEnum.NEVER);
myHttpResponse = mock(HttpResponse.class, new ReturnsDeepStubs()); myHttpResponse = mock(HttpResponse.class, new ReturnsDeepStubs());
myResponseCount = 0; myResponseCount = 0;
System.setProperty(BaseClient.HAPI_CLIENT_KEEPRESPONSES, "true"); System.setProperty(BaseClient.HAPI_CLIENT_KEEPRESPONSES, "true");
} }
@ -108,7 +107,7 @@ public class GenericClientDstu2Test {
//@formatter:on //@formatter:on
return msg; return msg;
} }
@Test @Test
public void testAcceptHeaderFetchConformance() throws Exception { public void testAcceptHeaderFetchConformance() throws Exception {
IParser p = ourCtx.newXmlParser(); IParser p = ourCtx.newXmlParser();
@ -261,7 +260,7 @@ public class GenericClientDstu2Test {
int idx = 0; int idx = 0;
//@formatter:off //@formatter:off
Conformance resp = (Conformance)client.conformance(); Conformance resp = (Conformance)client.fetchConformance().ofType(Conformance.class).execute();
//@formatter:on //@formatter:on
assertEquals("http://example.com/fhir/metadata", capt.getAllValues().get(idx).getURI().toASCIIString()); assertEquals("http://example.com/fhir/metadata", capt.getAllValues().get(idx).getURI().toASCIIString());
@ -381,7 +380,7 @@ public class GenericClientDstu2Test {
Patient p = new Patient(); Patient p = new Patient();
p.addName().addFamily("FOOFAMILY"); p.addName().addFamily("FOOFAMILY");
client.create(p); client.create().resource(p).execute();
assertEquals(1, capt.getAllValues().get(idx).getHeaders(Constants.HEADER_CONTENT_TYPE).length); assertEquals(1, capt.getAllValues().get(idx).getHeaders(Constants.HEADER_CONTENT_TYPE).length);
assertEquals(EncodingEnum.XML.getResourceContentType() + Constants.HEADER_SUFFIX_CT_UTF_8, capt.getAllValues().get(idx).getFirstHeader(Constants.HEADER_CONTENT_TYPE).getValue()); assertEquals(EncodingEnum.XML.getResourceContentType() + Constants.HEADER_SUFFIX_CT_UTF_8, capt.getAllValues().get(idx).getFirstHeader(Constants.HEADER_CONTENT_TYPE).getValue());
@ -468,7 +467,7 @@ public class GenericClientDstu2Test {
Patient pat = new Patient(); Patient pat = new Patient();
pat.setId("Patient/123"); pat.setId("Patient/123");
client.delete().resource(pat).execute(); client.delete().resource(pat).execute();
assertEquals("DELETE", capt.getAllValues().get(idx).getMethod()); assertEquals("DELETE", capt.getAllValues().get(idx).getMethod());
assertEquals("http://example.com/fhir/Patient/123", capt.getAllValues().get(idx).getURI().toString()); assertEquals("http://example.com/fhir/Patient/123", capt.getAllValues().get(idx).getURI().toString());
@ -513,74 +512,45 @@ public class GenericClientDstu2Test {
public void testDeleteInvalidRequest() throws Exception { public void testDeleteInvalidRequest() throws Exception {
Patient pat = new Patient(); Patient pat = new Patient();
pat.setId("123"); pat.setId("123");
IGenericClient client = ourCtx.newRestfulGenericClient("http://example.com/fhir"); IGenericClient client = ourCtx.newRestfulGenericClient("http://example.com/fhir");
try { try {
client.delete().resource(pat).execute(); client.delete().resource(pat).execute();
fail(); fail();
} catch (IllegalArgumentException e){ } catch (IllegalArgumentException e) {
assertEquals("theResource.getId() must contain a resource type and logical ID at a minimum (e.g. Patient/1234), found: 123", e.getMessage()); assertEquals("theResource.getId() must contain a resource type and logical ID at a minimum (e.g. Patient/1234), found: 123", e.getMessage());
} }
try { try {
client.delete().resourceById(new IdDt("123")).execute(); client.delete().resourceById(new IdDt("123")).execute();
fail(); fail();
} catch (IllegalArgumentException e){ } catch (IllegalArgumentException e) {
assertEquals("theId must contain a resource type and logical ID at a minimum (e.g. Patient/1234)found: 123", e.getMessage()); assertEquals("theId must contain a resource type and logical ID at a minimum (e.g. Patient/1234)found: 123", e.getMessage());
} }
try { try {
client.delete().resourceById("", "123").execute(); client.delete().resourceById("", "123").execute();
fail(); fail();
} catch (IllegalArgumentException e){ } catch (IllegalArgumentException e) {
assertEquals("theResourceType can not be blank/null", e.getMessage()); assertEquals("theResourceType can not be blank/null", e.getMessage());
} }
try { try {
client.delete().resourceById("Patient", "").execute(); client.delete().resourceById("Patient", "").execute();
fail(); fail();
} catch (IllegalArgumentException e){ } catch (IllegalArgumentException e) {
assertEquals("theLogicalId can not be blank/null", e.getMessage()); assertEquals("theLogicalId can not be blank/null", e.getMessage());
} }
try { try {
client.delete().resourceConditionalByType("InvalidType"); client.delete().resourceConditionalByType("InvalidType");
fail(); fail();
} catch (DataFormatException e){ } catch (DataFormatException e) {
assertEquals("Unknown resource name \"InvalidType\" (this name is not known in FHIR version \"DSTU2\")", e.getMessage()); assertEquals("Unknown resource name \"InvalidType\" (this name is not known in FHIR version \"DSTU2\")", e.getMessage());
} }
} }
@SuppressWarnings("deprecation")
@Test
public void testDeleteNonFluent() throws Exception {
ArgumentCaptor<HttpUriRequest> capt = ArgumentCaptor.forClass(HttpUriRequest.class);
when(myHttpClient.execute(capt.capture())).thenReturn(myHttpResponse);
when(myHttpResponse.getStatusLine()).thenReturn(new BasicStatusLine(new ProtocolVersion("HTTP", 1, 1), Constants.STATUS_HTTP_204_NO_CONTENT, ""));
when(myHttpResponse.getEntity().getContent()).then(new Answer<ReaderInputStream>() {
@Override
public ReaderInputStream answer(InvocationOnMock theInvocation) throws Throwable {
return new ReaderInputStream(new StringReader(""), Charset.forName("UTF-8"));
}
});
IGenericClient client = ourCtx.newRestfulGenericClient("http://example.com/fhir");
int idx = 0;
client.delete(Patient.class, new IdDt("Patient/123"));
assertEquals("DELETE", capt.getAllValues().get(idx).getMethod());
assertEquals("http://example.com/fhir/Patient/123", capt.getAllValues().get(idx).getURI().toString());
idx++;
client.delete(Patient.class, "123");
assertEquals("DELETE", capt.getAllValues().get(idx).getMethod());
assertEquals("http://example.com/fhir/Patient/123", capt.getAllValues().get(idx).getURI().toString());
idx++;
}
/** /**
* See #322 * See #322
*/ */
@ -731,7 +701,8 @@ public class GenericClientDstu2Test {
.since(new InstantDt("2001-01-02T11:22:33Z")) .since(new InstantDt("2001-01-02T11:22:33Z"))
.execute(); .execute();
//@formatter:on //@formatter:on
assertThat(capt.getAllValues().get(idx).getURI().toString(), either(equalTo("http://example.com/fhir/Patient/123/_history?_since=2001-01-02T11:22:33Z&_count=123")).or(equalTo("http://example.com/fhir/Patient/123/_history?_count=123&_since=2001-01-02T11:22:33Z"))); assertThat(capt.getAllValues().get(idx).getURI().toString(), either(equalTo("http://example.com/fhir/Patient/123/_history?_since=2001-01-02T11:22:33Z&_count=123"))
.or(equalTo("http://example.com/fhir/Patient/123/_history?_count=123&_since=2001-01-02T11:22:33Z")));
assertEquals(1, response.getEntry().size()); assertEquals(1, response.getEntry().size());
idx++; idx++;
@ -794,7 +765,8 @@ public class GenericClientDstu2Test {
assertEquals("http://example.com/fhir/Patient/123/$meta-add", capt.getAllValues().get(idx).getURI().toASCIIString()); assertEquals("http://example.com/fhir/Patient/123/$meta-add", capt.getAllValues().get(idx).getURI().toASCIIString());
assertEquals("urn:profile:out", resp.getProfile().get(0).getValue()); assertEquals("urn:profile:out", resp.getProfile().get(0).getValue());
assertEquals("POST", capt.getAllValues().get(idx).getRequestLine().getMethod()); assertEquals("POST", capt.getAllValues().get(idx).getRequestLine().getMethod());
assertEquals("<Parameters xmlns=\"http://hl7.org/fhir\"><parameter><name value=\"meta\"/><valueMeta><profile value=\"urn:profile:in\"/></valueMeta></parameter></Parameters>", extractBody(capt, idx)); assertEquals("<Parameters xmlns=\"http://hl7.org/fhir\"><parameter><name value=\"meta\"/><valueMeta><profile value=\"urn:profile:in\"/></valueMeta></parameter></Parameters>",
extractBody(capt, idx));
idx++; idx++;
} }
@ -1148,7 +1120,9 @@ public class GenericClientDstu2Test {
assertEquals(1, capt.getAllValues().get(idx).getHeaders(Constants.HEADER_CONTENT_TYPE).length); assertEquals(1, capt.getAllValues().get(idx).getHeaders(Constants.HEADER_CONTENT_TYPE).length);
assertEquals(EncodingEnum.XML.getResourceContentType() + Constants.HEADER_SUFFIX_CT_UTF_8, capt.getAllValues().get(idx).getFirstHeader(Constants.HEADER_CONTENT_TYPE).getValue()); assertEquals(EncodingEnum.XML.getResourceContentType() + Constants.HEADER_SUFFIX_CT_UTF_8, capt.getAllValues().get(idx).getFirstHeader(Constants.HEADER_CONTENT_TYPE).getValue());
assertEquals("POST", capt.getAllValues().get(idx).getRequestLine().getMethod()); assertEquals("POST", capt.getAllValues().get(idx).getRequestLine().getMethod());
assertEquals("<Parameters xmlns=\"http://hl7.org/fhir\"><parameter><name value=\"name1\"/><valueString value=\"value1\"/></parameter><parameter><name value=\"name2\"/><valueString value=\"value1\"/></parameter></Parameters>", (extractBody(capt, idx))); assertEquals(
"<Parameters xmlns=\"http://hl7.org/fhir\"><parameter><name value=\"name1\"/><valueString value=\"value1\"/></parameter><parameter><name value=\"name2\"/><valueString value=\"value1\"/></parameter></Parameters>",
(extractBody(capt, idx)));
idx++; idx++;
/* /*
@ -1169,7 +1143,8 @@ public class GenericClientDstu2Test {
assertEquals(1, capt.getAllValues().get(idx).getHeaders(Constants.HEADER_CONTENT_TYPE).length); assertEquals(1, capt.getAllValues().get(idx).getHeaders(Constants.HEADER_CONTENT_TYPE).length);
assertEquals(EncodingEnum.XML.getResourceContentType() + Constants.HEADER_SUFFIX_CT_UTF_8, capt.getAllValues().get(idx).getFirstHeader(Constants.HEADER_CONTENT_TYPE).getValue()); assertEquals(EncodingEnum.XML.getResourceContentType() + Constants.HEADER_SUFFIX_CT_UTF_8, capt.getAllValues().get(idx).getFirstHeader(Constants.HEADER_CONTENT_TYPE).getValue());
assertEquals("POST", capt.getAllValues().get(idx).getRequestLine().getMethod()); assertEquals("POST", capt.getAllValues().get(idx).getRequestLine().getMethod());
assertEquals("<Parameters xmlns=\"http://hl7.org/fhir\"><parameter><name value=\"name1\"/><valueIdentifier><system value=\"system1\"/><value value=\"value1\"/></valueIdentifier></parameter><parameter><name value=\"name2\"/><valueString value=\"value1\"/></parameter></Parameters>", assertEquals(
"<Parameters xmlns=\"http://hl7.org/fhir\"><parameter><name value=\"name1\"/><valueIdentifier><system value=\"system1\"/><value value=\"value1\"/></valueIdentifier></parameter><parameter><name value=\"name2\"/><valueString value=\"value1\"/></parameter></Parameters>",
(extractBody(capt, idx))); (extractBody(capt, idx)));
idx++; idx++;
@ -1709,7 +1684,8 @@ public class GenericClientDstu2Test {
.execute(); .execute();
//@formatter:on //@formatter:on
assertThat(capt.getValue().getURI().toString(), either(equalTo("http://example.com/fhir/Patient/123?_elements=name%2Cidentifier")).or(equalTo("http://example.com/fhir/Patient/123?_elements=identifier%2Cname"))); assertThat(capt.getValue().getURI().toString(),
either(equalTo("http://example.com/fhir/Patient/123?_elements=name%2Cidentifier")).or(equalTo("http://example.com/fhir/Patient/123?_elements=identifier%2Cname")));
assertEquals(Patient.class, response.getClass()); assertEquals(Patient.class, response.getClass());
} }
@ -1848,21 +1824,20 @@ public class GenericClientDstu2Test {
IGenericClient client = ourCtx.newRestfulGenericClient("http://example.com/fhir"); IGenericClient client = ourCtx.newRestfulGenericClient("http://example.com/fhir");
//@formatter:off
Bundle response = client.search() Bundle response = client.search()
.forResource("Patient") .forResource("Patient")
.where(Patient.NAME.matches().value("james")) .where(Patient.NAME.matches().value("james"))
.elementsSubset("name", "identifier") .elementsSubset("name", "identifier")
.usingStyle(SearchStyleEnum.POST) .usingStyle(SearchStyleEnum.POST)
.execute(); .returnBundle(Bundle.class)
//@formatter:on .execute();
assertEquals("http://example.com/fhir/Patient/_search?_elements=identifier%2Cname", capt.getValue().getURI().toString()); assertEquals("http://example.com/fhir/Patient/_search?_elements=identifier%2Cname", capt.getValue().getURI().toString());
// assertThat(capt.getValue().getURI().toString(), // assertThat(capt.getValue().getURI().toString(),
// either(equalTo("http://example.com/fhir/Patient?name=james&_elements=name%2Cidentifier")).or(equalTo("http://example.com/fhir/Patient?name=james&_elements=identifier%2Cname"))); // either(equalTo("http://example.com/fhir/Patient?name=james&_elements=name%2Cidentifier")).or(equalTo("http://example.com/fhir/Patient?name=james&_elements=identifier%2Cname")));
assertEquals(Patient.class, response.getEntries().get(0).getResource().getClass()); assertEquals(Patient.class, response.getEntry().get(0).getResource().getClass());
ourLog.info(Arrays.asList(capt.getValue().getAllHeaders()).toString()); ourLog.info(Arrays.asList(capt.getValue().getAllHeaders()).toString());
ourLog.info(capt.getValue().toString()); ourLog.info(capt.getValue().toString());
@ -1888,24 +1863,23 @@ public class GenericClientDstu2Test {
IGenericClient client = ourCtx.newRestfulGenericClient("http://example.com/fhir"); IGenericClient client = ourCtx.newRestfulGenericClient("http://example.com/fhir");
//@formatter:off
Bundle response = client.search() Bundle response = client.search()
.forResource("Patient") .forResource("Patient")
.where(Patient.NAME.matches().value("james")) .where(Patient.NAME.matches().value("james"))
.elementsSubset("name", "identifier") .elementsSubset("name", "identifier")
.usingStyle(SearchStyleEnum.POST) .usingStyle(SearchStyleEnum.POST)
.encodedJson() .encodedJson()
.execute(); .returnBundle(Bundle.class)
//@formatter:on .execute();
assertThat(capt.getValue().getURI().toString(), containsString("http://example.com/fhir/Patient/_search?")); assertThat(capt.getValue().getURI().toString(), containsString("http://example.com/fhir/Patient/_search?"));
assertThat(capt.getValue().getURI().toString(), containsString("_elements=identifier%2Cname")); assertThat(capt.getValue().getURI().toString(), containsString("_elements=identifier%2Cname"));
assertThat(capt.getValue().getURI().toString(), not(containsString("_format=json"))); assertThat(capt.getValue().getURI().toString(), not(containsString("_format=json")));
// assertThat(capt.getValue().getURI().toString(), // assertThat(capt.getValue().getURI().toString(),
// either(equalTo("http://example.com/fhir/Patient?name=james&_elements=name%2Cidentifier")).or(equalTo("http://example.com/fhir/Patient?name=james&_elements=identifier%2Cname"))); // either(equalTo("http://example.com/fhir/Patient?name=james&_elements=name%2Cidentifier")).or(equalTo("http://example.com/fhir/Patient?name=james&_elements=identifier%2Cname")));
assertEquals(Patient.class, response.getEntries().get(0).getResource().getClass()); assertEquals(Patient.class, response.getEntry().get(0).getResource().getClass());
ourLog.info(Arrays.asList(capt.getValue().getAllHeaders()).toString()); ourLog.info(Arrays.asList(capt.getValue().getAllHeaders()).toString());
ourLog.info(capt.getValue().toString()); ourLog.info(capt.getValue().toString());
@ -1930,15 +1904,14 @@ public class GenericClientDstu2Test {
IGenericClient client = ourCtx.newRestfulGenericClient("http://example.com/fhir"); IGenericClient client = ourCtx.newRestfulGenericClient("http://example.com/fhir");
//@formatter:off Bundle response = client.search()
Bundle response = client.search() .forResource("Patient")
.forResource("Patient") .where(Patient.NAME.matches().value("james"))
.where(Patient.NAME.matches().value("james")) .returnBundle(Bundle.class)
.execute(); .execute();
//@formatter:on
assertEquals("http://example.com/fhir/Patient?name=james", capt.getValue().getURI().toString()); assertEquals("http://example.com/fhir/Patient?name=james", capt.getValue().getURI().toString());
assertEquals(Patient.class, response.getEntries().get(0).getResource().getClass()); assertEquals(Patient.class, response.getEntry().get(0).getResource().getClass());
} }
@ -2065,16 +2038,16 @@ public class GenericClientDstu2Test {
IGenericClient client = ourCtx.newRestfulGenericClient("http://example.com/fhir"); IGenericClient client = ourCtx.newRestfulGenericClient("http://example.com/fhir");
//@formatter:off Bundle response = client.search()
Bundle response = client.search() .forResource("Patient")
.forResource("Patient") .where(Patient.NAME.matches().value("james"))
.where(Patient.NAME.matches().value("james")) .elementsSubset("name", "identifier")
.elementsSubset("name", "identifier") .returnBundle(Bundle.class)
.execute(); .execute();
//@formatter:on
assertThat(capt.getValue().getURI().toString(), either(equalTo("http://example.com/fhir/Patient?name=james&_elements=name%2Cidentifier")).or(equalTo("http://example.com/fhir/Patient?name=james&_elements=identifier%2Cname"))); assertThat(capt.getValue().getURI().toString(),
assertEquals(Patient.class, response.getEntries().get(0).getResource().getClass()); either(equalTo("http://example.com/fhir/Patient?name=james&_elements=name%2Cidentifier")).or(equalTo("http://example.com/fhir/Patient?name=james&_elements=identifier%2Cname")));
assertEquals(Patient.class, response.getEntry().get(0).getResource().getClass());
} }
@ -2090,16 +2063,15 @@ public class GenericClientDstu2Test {
IGenericClient client = ourCtx.newRestfulGenericClient("http://example.com/fhir"); IGenericClient client = ourCtx.newRestfulGenericClient("http://example.com/fhir");
//@formatter:off Bundle response = client.search()
Bundle response = client.search() .forResource("Patient")
.forResource("Patient") .where(Patient.NAME.matches().value("james"))
.where(Patient.NAME.matches().value("james")) .lastUpdated(new DateRangeParam("2011-01-01", "2012-01-01"))
.lastUpdated(new DateRangeParam("2011-01-01", "2012-01-01")) .returnBundle(Bundle.class)
.execute(); .execute();
//@formatter:on
assertEquals("http://example.com/fhir/Patient?name=james&_lastUpdated=ge2011-01-01&_lastUpdated=le2012-01-01", capt.getValue().getURI().toString()); assertEquals("http://example.com/fhir/Patient?name=james&_lastUpdated=ge2011-01-01&_lastUpdated=le2012-01-01", capt.getValue().getURI().toString());
assertEquals(Patient.class, response.getEntries().get(0).getResource().getClass()); assertEquals(Patient.class, response.getEntry().get(0).getResource().getClass());
} }
@ -2116,11 +2088,16 @@ public class GenericClientDstu2Test {
IGenericClient client = ourCtx.newRestfulGenericClient("http://example.com/fhir"); IGenericClient client = ourCtx.newRestfulGenericClient("http://example.com/fhir");
HashMap<String, List<IQueryParameterType>> params = new HashMap<String, List<IQueryParameterType>>(); HashMap<String, List<IQueryParameterType>> params = new HashMap<String, List<IQueryParameterType>>();
params.put("foo", Arrays.asList((IQueryParameterType)new DateParam("2001"))); params.put("foo", Arrays.asList((IQueryParameterType) new DateParam("2001")));
Bundle response = client.search(Patient.class, params); Bundle response = client
.search()
.forResource(Patient.class)
.where(params)
.returnBundle(Bundle.class)
.execute();
assertEquals("http://example.com/fhir/Patient?foo=2001", capt.getValue().getURI().toString()); assertEquals("http://example.com/fhir/Patient?foo=2001", capt.getValue().getURI().toString());
assertEquals(Patient.class, response.getEntries().get(0).getResource().getClass()); assertEquals(Patient.class, response.getEntry().get(0).getResource().getClass());
} }
@ -2136,18 +2113,17 @@ public class GenericClientDstu2Test {
IGenericClient client = ourCtx.newRestfulGenericClient("http://example.com/fhir"); IGenericClient client = ourCtx.newRestfulGenericClient("http://example.com/fhir");
//@formatter:off Bundle response = client.search()
Bundle response = client.search() .forResource("Patient")
.forResource("Patient") .withProfile("http://foo1")
.withProfile("http://foo1") .withProfile("http://foo2")
.withProfile("http://foo2") .withSecurity("system1", "code1")
.withSecurity("system1", "code1") .withSecurity("system2", "code2")
.withSecurity("system2", "code2") .returnBundle(Bundle.class)
.execute(); .execute();
//@formatter:on
assertEquals("http://example.com/fhir/Patient?_security=system1%7Ccode1&_security=system2%7Ccode2&_profile=http%3A%2F%2Ffoo1&_profile=http%3A%2F%2Ffoo2", capt.getValue().getURI().toString()); assertEquals("http://example.com/fhir/Patient?_security=system1%7Ccode1&_security=system2%7Ccode2&_profile=http%3A%2F%2Ffoo1&_profile=http%3A%2F%2Ffoo2", capt.getValue().getURI().toString());
assertEquals(Patient.class, response.getEntries().get(0).getResource().getClass()); assertEquals(Patient.class, response.getEntry().get(0).getResource().getClass());
} }
@ -2165,13 +2141,12 @@ public class GenericClientDstu2Test {
IGenericClient client = ourCtx.newRestfulGenericClient("http://example.com/fhir"); IGenericClient client = ourCtx.newRestfulGenericClient("http://example.com/fhir");
//@formatter:off
Bundle response = client.search() Bundle response = client.search()
.forResource(Patient.class) .forResource(Patient.class)
.encodedJson() .encodedJson()
.revInclude(new Include("Provenance:target")) .revInclude(new Include("Provenance:target"))
.returnBundle(Bundle.class)
.execute(); .execute();
//@formatter:on
assertEquals("http://example.com/fhir/Patient?_revinclude=Provenance%3Atarget&_format=json", capt.getValue().getURI().toString()); assertEquals("http://example.com/fhir/Patient?_revinclude=Provenance%3Atarget&_format=json", capt.getValue().getURI().toString());
@ -2189,16 +2164,15 @@ public class GenericClientDstu2Test {
IGenericClient client = ourCtx.newRestfulGenericClient("http://example.com/fhir"); IGenericClient client = ourCtx.newRestfulGenericClient("http://example.com/fhir");
//@formatter:off Bundle response = client.search()
Bundle response = client.search() .forResource("Patient")
.forResource("Patient") .where(Patient.NAME.matches().value("james"))
.where(Patient.NAME.matches().value("james")) .summaryMode(SummaryEnum.FALSE)
.summaryMode(SummaryEnum.FALSE) .returnBundle(Bundle.class)
.execute(); .execute();
//@formatter:on
assertEquals("http://example.com/fhir/Patient?name=james&_summary=false", capt.getValue().getURI().toString()); assertEquals("http://example.com/fhir/Patient?name=james&_summary=false", capt.getValue().getURI().toString());
assertEquals(Patient.class, response.getEntries().get(0).getResource().getClass()); assertEquals(Patient.class, response.getEntry().get(0).getResource().getClass());
} }
@ -2540,7 +2514,9 @@ public class GenericClientDstu2Test {
assertEquals("http://example.com/fhir/Patient/$validate", capt.getAllValues().get(idx).getURI().toASCIIString()); assertEquals("http://example.com/fhir/Patient/$validate", capt.getAllValues().get(idx).getURI().toASCIIString());
assertEquals("POST", capt.getAllValues().get(idx).getRequestLine().getMethod()); assertEquals("POST", capt.getAllValues().get(idx).getRequestLine().getMethod());
assertEquals("application/xml+fhir", capt.getAllValues().get(idx).getFirstHeader("content-type").getValue().replaceAll(";.*", "")); assertEquals("application/xml+fhir", capt.getAllValues().get(idx).getFirstHeader("content-type").getValue().replaceAll(";.*", ""));
assertEquals("<Parameters xmlns=\"http://hl7.org/fhir\"><parameter><name value=\"resource\"/><resource><Patient xmlns=\"http://hl7.org/fhir\"><name><given value=\"GIVEN\"/></name></Patient></resource></parameter></Parameters>", extractBody(capt, idx)); assertEquals(
"<Parameters xmlns=\"http://hl7.org/fhir\"><parameter><name value=\"resource\"/><resource><Patient xmlns=\"http://hl7.org/fhir\"><name><given value=\"GIVEN\"/></name></Patient></resource></parameter></Parameters>",
extractBody(capt, idx));
assertNotNull(response.getOperationOutcome()); assertNotNull(response.getOperationOutcome());
assertEquals("FOOBAR", toOo(response.getOperationOutcome()).getIssueFirstRep().getDiagnosticsElement().getValue()); assertEquals("FOOBAR", toOo(response.getOperationOutcome()).getIssueFirstRep().getDiagnosticsElement().getValue());
idx++; idx++;
@ -2549,7 +2525,9 @@ public class GenericClientDstu2Test {
assertEquals("http://example.com/fhir/Patient/$validate", capt.getAllValues().get(idx).getURI().toASCIIString()); assertEquals("http://example.com/fhir/Patient/$validate", capt.getAllValues().get(idx).getURI().toASCIIString());
assertEquals("POST", capt.getAllValues().get(idx).getRequestLine().getMethod()); assertEquals("POST", capt.getAllValues().get(idx).getRequestLine().getMethod());
assertEquals("application/xml+fhir", capt.getAllValues().get(idx).getFirstHeader("content-type").getValue().replaceAll(";.*", "")); assertEquals("application/xml+fhir", capt.getAllValues().get(idx).getFirstHeader("content-type").getValue().replaceAll(";.*", ""));
assertEquals("<Parameters xmlns=\"http://hl7.org/fhir\"><parameter><name value=\"resource\"/><resource><Patient xmlns=\"http://hl7.org/fhir\"><name><given value=\"GIVEN\"/></name></Patient></resource></parameter></Parameters>", extractBody(capt, idx)); assertEquals(
"<Parameters xmlns=\"http://hl7.org/fhir\"><parameter><name value=\"resource\"/><resource><Patient xmlns=\"http://hl7.org/fhir\"><name><given value=\"GIVEN\"/></name></Patient></resource></parameter></Parameters>",
extractBody(capt, idx));
assertNotNull(response.getOperationOutcome()); assertNotNull(response.getOperationOutcome());
assertEquals("FOOBAR", toOo(response.getOperationOutcome()).getIssueFirstRep().getDiagnosticsElement().getValue()); assertEquals("FOOBAR", toOo(response.getOperationOutcome()).getIssueFirstRep().getDiagnosticsElement().getValue());
idx++; idx++;
@ -2605,7 +2583,9 @@ public class GenericClientDstu2Test {
assertEquals("http://example.com/fhir/Patient/$validate", capt.getAllValues().get(idx).getURI().toASCIIString()); assertEquals("http://example.com/fhir/Patient/$validate", capt.getAllValues().get(idx).getURI().toASCIIString());
assertEquals("POST", capt.getAllValues().get(idx).getRequestLine().getMethod()); assertEquals("POST", capt.getAllValues().get(idx).getRequestLine().getMethod());
assertEquals("<Parameters xmlns=\"http://hl7.org/fhir\"><parameter><name value=\"resource\"/><resource><Patient xmlns=\"http://hl7.org/fhir\"><name><given value=\"GIVEN\"/></name></Patient></resource></parameter></Parameters>", extractBody(capt, idx)); assertEquals(
"<Parameters xmlns=\"http://hl7.org/fhir\"><parameter><name value=\"resource\"/><resource><Patient xmlns=\"http://hl7.org/fhir\"><name><given value=\"GIVEN\"/></name></Patient></resource></parameter></Parameters>",
extractBody(capt, idx));
assertNotNull(response.getOperationOutcome()); assertNotNull(response.getOperationOutcome());
assertEquals("FOOBAR", toOo(response.getOperationOutcome()).getIssueFirstRep().getDiagnosticsElement().getValue()); assertEquals("FOOBAR", toOo(response.getOperationOutcome()).getIssueFirstRep().getDiagnosticsElement().getValue());
idx++; idx++;
@ -2648,27 +2628,27 @@ public class GenericClientDstu2Test {
@Override @Override
public void registerInterceptor(IClientInterceptor theInterceptor) { public void registerInterceptor(IClientInterceptor theInterceptor) {
//nothing // nothing
} }
@Override @Override
public void setEncoding(EncodingEnum theEncoding) { public void setEncoding(EncodingEnum theEncoding) {
//nothing // nothing
} }
@Override @Override
public void setPrettyPrint(Boolean thePrettyPrint) { public void setPrettyPrint(Boolean thePrettyPrint) {
//nothing // nothing
} }
@Override @Override
public void setSummary(SummaryEnum theSummary) { public void setSummary(SummaryEnum theSummary) {
//nothing // nothing
} }
@Override @Override
public void unregisterInterceptor(IClientInterceptor theInterceptor) { public void unregisterInterceptor(IClientInterceptor theInterceptor) {
//nothing // nothing
} }
@Override @Override

View File

@ -16,7 +16,6 @@ import ca.uhn.fhir.model.primitive.InstantDt;
public class DateParamTest { public class DateParamTest {
private static final org.slf4j.Logger ourLog = org.slf4j.LoggerFactory.getLogger(DateParamTest.class); private static final org.slf4j.Logger ourLog = org.slf4j.LoggerFactory.getLogger(DateParamTest.class);
@SuppressWarnings("deprecation")
@Test @Test
public void testConstructors() { public void testConstructors() {
new DateParam(); new DateParam();
@ -97,5 +96,15 @@ public class DateParamTest {
ourLog.info("POST: " + dt.getValue()); ourLog.info("POST: " + dt.getValue());
assertEquals("2016-06-09T16:38:00.000-04:00", dt.getValueAsString()); assertEquals("2016-06-09T16:38:00.000-04:00", dt.getValueAsString());
} }
@Test
public void testParseLegacyPrefixes() {
assertEquals(ParamPrefixEnum.APPROXIMATE, new DateParam("ap2012").getPrefix());
assertEquals(ParamPrefixEnum.GREATERTHAN, new DateParam("gt2012").getPrefix());
assertEquals(ParamPrefixEnum.GREATERTHAN_OR_EQUALS, new DateParam("ge2012").getPrefix());
assertEquals(ParamPrefixEnum.LESSTHAN, new DateParam("lt2012").getPrefix());
assertEquals(ParamPrefixEnum.LESSTHAN_OR_EQUALS, new DateParam("le2012").getPrefix());
}
} }

View File

@ -25,9 +25,9 @@ import org.eclipse.jetty.servlet.ServletHolder;
import org.junit.*; import org.junit.*;
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.IResource; import ca.uhn.fhir.model.api.IResource;
import ca.uhn.fhir.model.dstu2.resource.Binary; import ca.uhn.fhir.model.dstu2.resource.Binary;
import ca.uhn.fhir.model.dstu2.resource.Bundle;
import ca.uhn.fhir.model.primitive.IdDt; import ca.uhn.fhir.model.primitive.IdDt;
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.Constants;
@ -183,8 +183,8 @@ public class BinaryDstu2Test {
ourLog.info(responseContent); ourLog.info(responseContent);
Bundle bundle = ourCtx.newJsonParser().parseBundle(responseContent); Bundle bundle = ourCtx.newJsonParser().parseResource(Bundle.class, responseContent);
Binary bin = (Binary) bundle.getEntries().get(0).getResource(); Binary bin = (Binary) bundle.getEntry().get(0).getResource();
assertEquals("text/plain", bin.getContentType()); assertEquals("text/plain", bin.getContentType());
assertArrayEquals(new byte[] { 1, 2, 3, 4 }, bin.getContent()); assertArrayEquals(new byte[] { 1, 2, 3, 4 }, bin.getContent());
@ -201,8 +201,8 @@ public class BinaryDstu2Test {
ourLog.info(responseContent); ourLog.info(responseContent);
Bundle bundle = ourCtx.newXmlParser().parseBundle(responseContent); Bundle bundle = ourCtx.newXmlParser().parseResource(Bundle.class, responseContent);
Binary bin = (Binary) bundle.getEntries().get(0).getResource(); Binary bin = (Binary) bundle.getEntry().get(0).getResource();
assertEquals("text/plain", bin.getContentType()); assertEquals("text/plain", bin.getContentType());
assertArrayEquals(new byte[] { 1, 2, 3, 4 }, bin.getContent()); assertArrayEquals(new byte[] { 1, 2, 3, 4 }, bin.getContent());

View File

@ -15,13 +15,11 @@ 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.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.Bundle;
import ca.uhn.fhir.model.api.IResource; import ca.uhn.fhir.model.api.IResource;
import ca.uhn.fhir.model.dstu2.resource.Bundle;
import ca.uhn.fhir.model.dstu2.resource.Patient; import ca.uhn.fhir.model.dstu2.resource.Patient;
import ca.uhn.fhir.model.valueset.BundleTypeEnum; import ca.uhn.fhir.model.valueset.BundleTypeEnum;
import ca.uhn.fhir.narrative.DefaultThymeleafNarrativeGenerator; import ca.uhn.fhir.narrative.DefaultThymeleafNarrativeGenerator;
@ -51,9 +49,9 @@ public class BundleTypeInResponseTest {
ourLog.info(responseContent); ourLog.info(responseContent);
Bundle bundle = ourCtx.newXmlParser().parseBundle(responseContent); Bundle bundle = ourCtx.newXmlParser().parseResource(Bundle.class, responseContent);
assertEquals(1, bundle.getEntries().size()); assertEquals(1, bundle.getEntry().size());
assertEquals(BundleTypeEnum.SEARCHSET, bundle.getType().getValueAsEnum()); assertEquals(BundleTypeEnum.SEARCHSET, bundle.getTypeElement().getValueAsEnum());
} }

View File

@ -22,7 +22,6 @@ import org.junit.Test;
import ca.uhn.fhir.context.FhirContext; import ca.uhn.fhir.context.FhirContext;
import ca.uhn.fhir.context.api.BundleInclusionRule; import ca.uhn.fhir.context.api.BundleInclusionRule;
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.api.Include; import ca.uhn.fhir.model.api.Include;
import ca.uhn.fhir.model.api.annotation.*; import ca.uhn.fhir.model.api.annotation.*;
@ -61,20 +60,21 @@ public class IncludeDstu2Test {
IOUtils.closeQuietly(status.getEntity().getContent()); IOUtils.closeQuietly(status.getEntity().getContent());
assertEquals(200, status.getStatusLine().getStatusCode()); assertEquals(200, status.getStatusLine().getStatusCode());
Bundle bundle = ourCtx.newXmlParser().parseBundle(responseContent); Bundle bundle = ourCtx.newXmlParser().parseResource(Bundle.class, responseContent);
ourLog.info(responseContent); ourLog.info(responseContent);
assertEquals(3, bundle.size()); assertEquals(3, bundle.getEntry().size());
assertEquals(new IdDt("Patient/p1"), bundle.toListOfResources().get(0).getId().toUnqualifiedVersionless());
assertEquals(new IdDt("Patient/p2"), bundle.toListOfResources().get(1).getId().toUnqualifiedVersionless()); assertEquals(new IdDt("Patient/p1"), BundleUtil.toListOfResources(ourCtx, bundle).get(0).getIdElement().toUnqualifiedVersionless());
assertEquals(new IdDt("Organization/o1"), bundle.toListOfResources().get(2).getId().toUnqualifiedVersionless()); assertEquals(new IdDt("Patient/p2"), BundleUtil.toListOfResources(ourCtx, bundle).get(1).getIdElement().toUnqualifiedVersionless());
assertEquals(BundleEntrySearchModeEnum.INCLUDE, bundle.getEntries().get(2).getSearchMode().getValueAsEnum()); assertEquals(new IdDt("Organization/o1"), BundleUtil.toListOfResources(ourCtx, bundle).get(2).getIdElement().toUnqualifiedVersionless());
assertEquals(BundleEntrySearchModeEnum.INCLUDE, bundle.getEntry().get(2).getSearch().getModeElement().getValueAsEnum());
Patient p1 = (Patient) bundle.toListOfResources().get(0); Patient p1 = (Patient) BundleUtil.toListOfResources(ourCtx, bundle).get(0);
assertEquals(0, p1.getContained().getContainedResources().size()); assertEquals(0, p1.getContained().getContainedResources().size());
Patient p2 = (Patient) bundle.toListOfResources().get(1); Patient p2 = (Patient) BundleUtil.toListOfResources(ourCtx, bundle).get(1);
assertEquals(0, p2.getContained().getContainedResources().size()); assertEquals(0, p2.getContained().getContainedResources().size());
} }
@ -87,22 +87,22 @@ public class IncludeDstu2Test {
IOUtils.closeQuietly(status.getEntity().getContent()); IOUtils.closeQuietly(status.getEntity().getContent());
assertEquals(200, status.getStatusLine().getStatusCode()); assertEquals(200, status.getStatusLine().getStatusCode());
Bundle bundle = ourCtx.newXmlParser().parseBundle(responseContent); Bundle bundle = ourCtx.newXmlParser().parseResource(Bundle.class, responseContent);
ourLog.info(responseContent); ourLog.info(responseContent);
assertEquals(4, bundle.size()); assertEquals(4, bundle.getEntry().size());
assertEquals(new IdDt("Patient/p1"), bundle.toListOfResources().get(0).getId().toUnqualifiedVersionless()); assertEquals(new IdDt("Patient/p1"), BundleUtil.toListOfResources(ourCtx, bundle).get(0).getIdElement().toUnqualifiedVersionless());
assertEquals(new IdDt("Patient/p2"), bundle.toListOfResources().get(1).getId().toUnqualifiedVersionless()); assertEquals(new IdDt("Patient/p2"), BundleUtil.toListOfResources(ourCtx, bundle).get(1).getIdElement().toUnqualifiedVersionless());
assertEquals(new IdDt("Organization/o1"), bundle.toListOfResources().get(2).getId().toUnqualifiedVersionless()); assertEquals(new IdDt("Organization/o1"), BundleUtil.toListOfResources(ourCtx, bundle).get(2).getIdElement().toUnqualifiedVersionless());
assertEquals(new IdDt("Organization/o2"), bundle.toListOfResources().get(3).getId().toUnqualifiedVersionless()); assertEquals(new IdDt("Organization/o2"), BundleUtil.toListOfResources(ourCtx, bundle).get(3).getIdElement().toUnqualifiedVersionless());
assertEquals(BundleEntrySearchModeEnum.INCLUDE, bundle.getEntries().get(2).getSearchMode().getValueAsEnum()); assertEquals(BundleEntrySearchModeEnum.INCLUDE, bundle.getEntry().get(2).getSearch().getModeElement().getValueAsEnum());
assertEquals(BundleEntrySearchModeEnum.INCLUDE, bundle.getEntries().get(3).getSearchMode().getValueAsEnum()); assertEquals(BundleEntrySearchModeEnum.INCLUDE, bundle.getEntry().get(3).getSearch().getModeElement().getValueAsEnum());
Patient p1 = (Patient) bundle.toListOfResources().get(0); Patient p1 = (Patient) BundleUtil.toListOfResources(ourCtx, bundle).get(0);
assertEquals(0, p1.getContained().getContainedResources().size()); assertEquals(0, p1.getContained().getContainedResources().size());
Patient p2 = (Patient) bundle.toListOfResources().get(1); Patient p2 = (Patient) BundleUtil.toListOfResources(ourCtx, bundle).get(1);
assertEquals(0, p2.getContained().getContainedResources().size()); assertEquals(0, p2.getContained().getContainedResources().size());
} }
@ -115,20 +115,20 @@ public class IncludeDstu2Test {
IOUtils.closeQuietly(status.getEntity().getContent()); IOUtils.closeQuietly(status.getEntity().getContent());
assertEquals(200, status.getStatusLine().getStatusCode()); assertEquals(200, status.getStatusLine().getStatusCode());
Bundle bundle = ourCtx.newXmlParser().parseBundle(responseContent); Bundle bundle = ourCtx.newXmlParser().parseResource(Bundle.class, responseContent);
ourLog.info(responseContent); ourLog.info(responseContent);
assertEquals(3, bundle.size()); assertEquals(3, bundle.getEntry().size());
assertEquals(new IdDt("Patient/p1"), bundle.toListOfResources().get(0).getId().toUnqualifiedVersionless()); assertEquals(new IdDt("Patient/p1"), BundleUtil.toListOfResources(ourCtx, bundle).get(0).getIdElement().toUnqualifiedVersionless());
assertEquals(new IdDt("Patient/p2"), bundle.toListOfResources().get(1).getId().toUnqualifiedVersionless()); assertEquals(new IdDt("Patient/p2"), BundleUtil.toListOfResources(ourCtx, bundle).get(1).getIdElement().toUnqualifiedVersionless());
assertEquals(new IdDt("Organization/o1"), bundle.toListOfResources().get(2).getId().toUnqualifiedVersionless()); assertEquals(new IdDt("Organization/o1"), BundleUtil.toListOfResources(ourCtx, bundle).get(2).getIdElement().toUnqualifiedVersionless());
assertEquals(BundleEntrySearchModeEnum.INCLUDE, bundle.getEntries().get(2).getSearchMode().getValueAsEnum()); assertEquals(BundleEntrySearchModeEnum.INCLUDE, bundle.getEntry().get(2).getSearch().getModeElement().getValueAsEnum());
Patient p1 = (Patient) bundle.toListOfResources().get(0); Patient p1 = (Patient) BundleUtil.toListOfResources(ourCtx, bundle).get(0);
assertEquals(0, p1.getContained().getContainedResources().size()); assertEquals(0, p1.getContained().getContainedResources().size());
Patient p2 = (Patient) bundle.toListOfResources().get(1); Patient p2 = (Patient) BundleUtil.toListOfResources(ourCtx, bundle).get(1);
assertEquals(0, p2.getContained().getContainedResources().size()); assertEquals(0, p2.getContained().getContainedResources().size());
} }
@ -141,20 +141,20 @@ public class IncludeDstu2Test {
IOUtils.closeQuietly(status.getEntity().getContent()); IOUtils.closeQuietly(status.getEntity().getContent());
assertEquals(200, status.getStatusLine().getStatusCode()); assertEquals(200, status.getStatusLine().getStatusCode());
Bundle bundle = ourCtx.newJsonParser().parseBundle(responseContent); Bundle bundle = ourCtx.newJsonParser().parseResource(Bundle.class, responseContent);
ourLog.info(responseContent); ourLog.info(responseContent);
assertEquals(3, bundle.size()); assertEquals(3, bundle.getEntry().size());
assertEquals(new IdDt("Patient/p1"), bundle.toListOfResources().get(0).getId().toUnqualifiedVersionless()); assertEquals(new IdDt("Patient/p1"), BundleUtil.toListOfResources(ourCtx, bundle).get(0).getIdElement().toUnqualifiedVersionless());
assertEquals(new IdDt("Patient/p2"), bundle.toListOfResources().get(1).getId().toUnqualifiedVersionless()); assertEquals(new IdDt("Patient/p2"), BundleUtil.toListOfResources(ourCtx, bundle).get(1).getIdElement().toUnqualifiedVersionless());
assertEquals(new IdDt("Organization/o1"), bundle.toListOfResources().get(2).getId().toUnqualifiedVersionless()); assertEquals(new IdDt("Organization/o1"), BundleUtil.toListOfResources(ourCtx, bundle).get(2).getIdElement().toUnqualifiedVersionless());
assertEquals(BundleEntrySearchModeEnum.INCLUDE, bundle.getEntries().get(2).getSearchMode().getValueAsEnum()); assertEquals(BundleEntrySearchModeEnum.INCLUDE, bundle.getEntry().get(2).getSearch().getModeElement().getValueAsEnum());
Patient p1 = (Patient) bundle.toListOfResources().get(0); Patient p1 = (Patient) BundleUtil.toListOfResources(ourCtx, bundle).get(0);
assertEquals(0, p1.getContained().getContainedResources().size()); assertEquals(0, p1.getContained().getContainedResources().size());
Patient p2 = (Patient) bundle.toListOfResources().get(1); Patient p2 = (Patient) BundleUtil.toListOfResources(ourCtx, bundle).get(1);
assertEquals(0, p2.getContained().getContainedResources().size()); assertEquals(0, p2.getContained().getContainedResources().size());
} }
@ -169,8 +169,8 @@ public class IncludeDstu2Test {
ourLog.info(responseContent); ourLog.info(responseContent);
assertEquals(200, status.getStatusLine().getStatusCode()); assertEquals(200, status.getStatusLine().getStatusCode());
Bundle bundle = ourCtx.newXmlParser().parseBundle(responseContent); Bundle bundle = ourCtx.newXmlParser().parseResource(Bundle.class, responseContent);
assertEquals(4, bundle.size()); assertEquals(4, bundle.getEntry().size());
} }
@Test @Test
@ -181,10 +181,10 @@ public class IncludeDstu2Test {
IOUtils.closeQuietly(status.getEntity().getContent()); IOUtils.closeQuietly(status.getEntity().getContent());
assertEquals(200, status.getStatusLine().getStatusCode()); assertEquals(200, status.getStatusLine().getStatusCode());
Bundle bundle = ourCtx.newXmlParser().parseBundle(responseContent); Bundle bundle = ourCtx.newXmlParser().parseResource(Bundle.class, responseContent);
assertEquals(1, bundle.size()); assertEquals(1, bundle.getEntry().size());
Patient p = bundle.getResources(Patient.class).get(0); Patient p = BundleUtil.toListOfResourcesOfType(ourCtx, bundle, Patient.class).get(0);
assertEquals(0, p.getName().size()); assertEquals(0, p.getName().size());
assertEquals("Hello", p.getId().getIdPart()); assertEquals("Hello", p.getId().getIdPart());
} }
@ -200,10 +200,10 @@ public class IncludeDstu2Test {
ourLog.info(responseContent); ourLog.info(responseContent);
Bundle bundle = ourCtx.newJsonParser().parseBundle(responseContent); Bundle bundle = ourCtx.newJsonParser().parseResource(Bundle.class, responseContent);
assertEquals(1, bundle.size()); assertEquals(1, bundle.getEntry().size());
Patient p = bundle.getResources(Patient.class).get(0); Patient p = BundleUtil.toListOfResourcesOfType(ourCtx, bundle, Patient.class).get(0);
assertEquals(1, p.getName().size()); assertEquals(1, p.getName().size());
assertEquals("Hello", p.getId().getIdPart()); assertEquals("Hello", p.getId().getIdPart());
assertEquals("foo", p.getName().get(0).getFamilyFirstRep().getValue()); assertEquals("foo", p.getName().get(0).getFamilyFirstRep().getValue());
@ -220,10 +220,10 @@ public class IncludeDstu2Test {
ourLog.info(responseContent); ourLog.info(responseContent);
Bundle bundle = ourCtx.newXmlParser().parseBundle(responseContent); Bundle bundle = ourCtx.newXmlParser().parseResource(Bundle.class, responseContent);
assertEquals(1, bundle.size()); assertEquals(1, bundle.getEntry().size());
Patient p = bundle.getResources(Patient.class).get(0); Patient p = BundleUtil.toListOfResourcesOfType(ourCtx, bundle, Patient.class).get(0);
assertEquals(1, p.getName().size()); assertEquals(1, p.getName().size());
assertEquals("Hello", p.getId().getIdPart()); assertEquals("Hello", p.getId().getIdPart());
assertEquals("foo", p.getName().get(0).getFamilyFirstRep().getValue()); assertEquals("foo", p.getName().get(0).getFamilyFirstRep().getValue());
@ -239,10 +239,10 @@ public class IncludeDstu2Test {
ourLog.info(responseContent); ourLog.info(responseContent);
assertEquals(200, status.getStatusLine().getStatusCode()); assertEquals(200, status.getStatusLine().getStatusCode());
Bundle bundle = ourCtx.newXmlParser().parseBundle(responseContent); Bundle bundle = ourCtx.newXmlParser().parseResource(Bundle.class, responseContent);
assertEquals(1, bundle.size()); assertEquals(1, bundle.getEntry().size());
Patient p = bundle.getResources(Patient.class).get(0); Patient p = BundleUtil.toListOfResourcesOfType(ourCtx, bundle, Patient.class).get(0);
assertEquals(2, p.getName().size()); assertEquals(2, p.getName().size());
assertEquals("Hello", p.getId().getIdPart()); assertEquals("Hello", p.getId().getIdPart());

View File

@ -12,13 +12,7 @@ import org.junit.Test;
import ca.uhn.fhir.context.FhirContext; import ca.uhn.fhir.context.FhirContext;
import ca.uhn.fhir.model.dstu2.resource.Patient; import ca.uhn.fhir.model.dstu2.resource.Patient;
import ca.uhn.fhir.model.primitive.StringDt; import ca.uhn.fhir.rest.annotation.*;
import ca.uhn.fhir.rest.annotation.ConditionalUrlParam;
import ca.uhn.fhir.rest.annotation.Operation;
import ca.uhn.fhir.rest.annotation.OperationParam;
import ca.uhn.fhir.rest.annotation.ResourceParam;
import ca.uhn.fhir.rest.annotation.Update;
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.param.TokenParam; import ca.uhn.fhir.rest.param.TokenParam;
import ca.uhn.fhir.util.TestUtil; import ca.uhn.fhir.util.TestUtil;
@ -32,22 +26,6 @@ public class ServerInvalidDefinitionDstu2Test {
TestUtil.clearAllStaticFieldsForUnitTest(); TestUtil.clearAllStaticFieldsForUnitTest();
} }
@Test
public void testOperationReturningOldBundleProvider() {
RestfulServer srv = new RestfulServer(ourCtx);
srv.setFhirContext(ourCtx);
srv.setResourceProviders(new OperationReturningOldBundleProvider());
try {
srv.init();
fail();
} catch (ServletException e) {
assertThat(e.getCause().toString(), StringContains.containsString("ConfigurationException"));
assertThat(e.getCause().toString(), StringContains.containsString("Can not return a DSTU1 bundle"));
}
}
@Test @Test
public void testWrongConditionalUrlType() { public void testWrongConditionalUrlType() {
RestfulServer srv = new RestfulServer(ourCtx); RestfulServer srv = new RestfulServer(ourCtx);
@ -59,7 +37,8 @@ public class ServerInvalidDefinitionDstu2Test {
fail(); fail();
} catch (ServletException e) { } catch (ServletException e) {
assertThat(e.getCause().toString(), StringContains.containsString("ConfigurationException")); assertThat(e.getCause().toString(), StringContains.containsString("ConfigurationException"));
assertThat(e.getCause().toString(), StringContains.containsString("Parameters annotated with @ConditionalUrlParam must be of type String, found incorrect parameteter in method \"public ca.uhn.fhir.rest.api.MethodOutcome ca.uhn.fhir.rest.server.ServerInvalidDefinitionDstu2Test$UpdateWithWrongConditionalUrlType.update(ca.uhn.fhir.rest.param.TokenParam,ca.uhn.fhir.model.dstu2.resource.Patient)")); assertThat(e.getCause().toString(), StringContains.containsString(
"Parameters annotated with @ConditionalUrlParam must be of type String, found incorrect parameteter in method \"public ca.uhn.fhir.rest.api.MethodOutcome ca.uhn.fhir.rest.server.ServerInvalidDefinitionDstu2Test$UpdateWithWrongConditionalUrlType.update(ca.uhn.fhir.rest.param.TokenParam,ca.uhn.fhir.model.dstu2.resource.Patient)"));
} }
} }
@ -74,7 +53,8 @@ public class ServerInvalidDefinitionDstu2Test {
fail(); fail();
} catch (ServletException e) { } catch (ServletException e) {
assertThat(e.getCause().toString(), StringContains.containsString("ConfigurationException")); assertThat(e.getCause().toString(), StringContains.containsString("ConfigurationException"));
assertThat(e.getCause().toString(), StringContains.containsString("Method 'update' is annotated with @ResourceParam but has a type that is not an implemtation of org.hl7.fhir.instance.model.api.IBaseResource or String or byte[]")); assertThat(e.getCause().toString(), StringContains
.containsString("Method 'update' is annotated with @ResourceParam but has a type that is not an implemtation of org.hl7.fhir.instance.model.api.IBaseResource or String or byte[]"));
} }
} }
@ -108,20 +88,6 @@ public class ServerInvalidDefinitionDstu2Test {
} }
} }
public static class OperationReturningOldBundleProvider implements IResourceProvider {
@Override
public Class<? extends IBaseResource> getResourceType() {
return Patient.class;
}
@Operation(name = "$OP_TYPE_RET_OLD_BUNDLE")
public ca.uhn.fhir.model.api.Bundle opTypeRetOldBundle(@OperationParam(name = "PARAM1") StringDt theParam1, @OperationParam(name = "PARAM2") Patient theParam2) {
return null;
}
}
public static class UpdateWithWrongConditionalUrlType implements IResourceProvider { public static class UpdateWithWrongConditionalUrlType implements IResourceProvider {
@Override @Override

View File

@ -12,9 +12,7 @@ import static org.junit.Assert.fail;
import java.io.IOException; import java.io.IOException;
import java.nio.charset.StandardCharsets; import java.nio.charset.StandardCharsets;
import java.util.ArrayList; import java.util.*;
import java.util.Date;
import java.util.List;
import org.apache.commons.io.IOUtils; import org.apache.commons.io.IOUtils;
import org.hamcrest.core.StringContains; import org.hamcrest.core.StringContains;
@ -22,27 +20,12 @@ import org.junit.AfterClass;
import org.junit.Test; import org.junit.Test;
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.*;
import ca.uhn.fhir.model.api.ExtensionDt; import ca.uhn.fhir.model.dstu2.composite.*;
import ca.uhn.fhir.model.api.ResourceMetadataKeyEnum; import ca.uhn.fhir.model.dstu2.resource.*;
import ca.uhn.fhir.model.api.TemporalPrecisionEnum; import ca.uhn.fhir.model.dstu2.valueset.*;
import ca.uhn.fhir.model.dstu2.composite.CodeableConceptDt; import ca.uhn.fhir.model.primitive.*;
import ca.uhn.fhir.model.dstu2.composite.ResourceReferenceDt; import ca.uhn.fhir.parser.*;
import ca.uhn.fhir.model.dstu2.composite.TimingDt;
import ca.uhn.fhir.model.dstu2.resource.Condition;
import ca.uhn.fhir.model.dstu2.resource.MedicationOrder;
import ca.uhn.fhir.model.dstu2.resource.OperationOutcome;
import ca.uhn.fhir.model.dstu2.resource.Patient;
import ca.uhn.fhir.model.dstu2.valueset.ConditionVerificationStatusEnum;
import ca.uhn.fhir.model.dstu2.valueset.ContactPointSystemEnum;
import ca.uhn.fhir.model.dstu2.valueset.NarrativeStatusEnum;
import ca.uhn.fhir.model.dstu2.valueset.UnitsOfTimeEnum;
import ca.uhn.fhir.model.primitive.DateDt;
import ca.uhn.fhir.model.primitive.InstantDt;
import ca.uhn.fhir.model.primitive.StringDt;
import ca.uhn.fhir.parser.DataFormatException;
import ca.uhn.fhir.parser.IParser;
import ca.uhn.fhir.parser.StrictErrorHandler;
import ca.uhn.fhir.parser.XmlParserDstu2Test.TestPatientFor327; import ca.uhn.fhir.parser.XmlParserDstu2Test.TestPatientFor327;
import ca.uhn.fhir.util.TestUtil; import ca.uhn.fhir.util.TestUtil;
import ca.uhn.fhir.validation.schematron.SchematronBaseValidator; import ca.uhn.fhir.validation.schematron.SchematronBaseValidator;
@ -102,13 +85,13 @@ public class ResourceValidatorDstu2Test {
@Test @Test
public void testSchemaBundleValidator() throws IOException { public void testSchemaBundleValidator() throws IOException {
String res = IOUtils.toString(getClass().getClassLoader().getResourceAsStream("bundle-example.json")); String res = IOUtils.toString(getClass().getClassLoader().getResourceAsStream("bundle-example.json"));
Bundle b = ourCtx.newJsonParser().parseBundle(res); Bundle b = ourCtx.newJsonParser().parseResource(Bundle.class, res);
FhirValidator val = createFhirValidator(); FhirValidator val = createFhirValidator();
val.validate(b); val.validate(b);
MedicationOrder p = (MedicationOrder) b.getEntries().get(0).getResource(); MedicationOrder p = (MedicationOrder) b.getEntry().get(0).getResource();
TimingDt timing = new TimingDt(); TimingDt timing = new TimingDt();
timing.getRepeat().setDuration(123); timing.getRepeat().setDuration(123);
timing.getRepeat().setDurationUnits((UnitsOfTimeEnum) null); timing.getRepeat().setDurationUnits((UnitsOfTimeEnum) null);
@ -127,20 +110,26 @@ public class ResourceValidatorDstu2Test {
@Test @Test
public void testSchemaBundleValidatorFails() throws IOException { public void testSchemaBundleValidatorFails() throws IOException {
String res = IOUtils.toString(getClass().getClassLoader().getResourceAsStream("bundle-example.json"), StandardCharsets.UTF_8); String res = IOUtils.toString(getClass().getClassLoader().getResourceAsStream("bundle-example.json"), StandardCharsets.UTF_8);
Bundle b = ourCtx.newJsonParser().parseBundle(res); Bundle b = ourCtx.newJsonParser().parseResource(Bundle.class, res);
FhirValidator val = createFhirValidator(); FhirValidator val = createFhirValidator();
ValidationResult validationResult = val.validateWithResult(b); ValidationResult validationResult = val.validateWithResult(b);
assertTrue(validationResult.isSuccessful()); assertTrue(validationResult.isSuccessful());
MedicationOrder p = (MedicationOrder) b.getEntries().get(0).getResource(); MedicationOrder p = (MedicationOrder) b.getEntry().get(0).getResource();
TimingDt timing = new TimingDt(); TimingDt timing = new TimingDt();
timing.getRepeat().setDuration(123); timing.getRepeat().setDuration(123);
timing.getRepeat().setDurationUnits((UnitsOfTimeEnum) null); timing.getRepeat().setDurationUnits((UnitsOfTimeEnum) null);
p.getDosageInstructionFirstRep().setTiming(timing); p.getDosageInstructionFirstRep().setTiming(timing);
ourLog.info(ourCtx.newJsonParser().setPrettyPrint(true).encodeResourceToString(b));
validationResult = val.validateWithResult(b); validationResult = val.validateWithResult(b);
ourLog.info(ourCtx.newJsonParser().setPrettyPrint(true).encodeResourceToString(validationResult.toOperationOutcome()));
assertFalse(validationResult.isSuccessful()); assertFalse(validationResult.isSuccessful());
String encoded = logOperationOutcome(validationResult); String encoded = logOperationOutcome(validationResult);
@ -150,9 +139,9 @@ public class ResourceValidatorDstu2Test {
@Test @Test
public void testSchemaBundleValidatorIsSuccessful() throws IOException { public void testSchemaBundleValidatorIsSuccessful() throws IOException {
String res = IOUtils.toString(getClass().getClassLoader().getResourceAsStream("bundle-example.json"), StandardCharsets.UTF_8); String res = IOUtils.toString(getClass().getClassLoader().getResourceAsStream("bundle-example.json"), StandardCharsets.UTF_8);
Bundle b = ourCtx.newJsonParser().parseBundle(res); Bundle b = ourCtx.newJsonParser().parseResource(Bundle.class, res);
ourLog.info(ourCtx.newXmlParser().setPrettyPrint(true).encodeBundleToString(b)); ourLog.info(ourCtx.newXmlParser().setPrettyPrint(true).encodeResourceToString(b));
FhirValidator val = createFhirValidator(); FhirValidator val = createFhirValidator();

View File

@ -114,8 +114,13 @@ public class GenericClientDstu3Test {
.returnBundle(Bundle.class) .returnBundle(Bundle.class)
.execute(); .execute();
assertEquals("http://example.com/fhir/EpisodeOfCare?patient=123&_revinclude=Encounter%3Aepisodeofcare&_revinclude%3Arecurse=Observation%3Aencounter", String expected = "http://example.com/fhir/EpisodeOfCare?patient=123&_revinclude=Encounter%3Aepisodeofcare&_revinclude%3Arecurse=Observation%3Aencounter";
capt.getAllValues().get(idx).getURI().toString()); String actual = capt.getAllValues().get(idx).getURI().toString();
ourLog.info("EXP: {}", expected);
ourLog.info("ACT: {}", actual);
assertEquals(expected, actual);
idx++; idx++;
} }
@ -1526,17 +1531,6 @@ public class GenericClientDstu3Test {
} }
@Test
public void testSearchForUnknownType() throws Exception {
IGenericClient client = ourCtx.newRestfulGenericClient("http://example.com/fhir");
try {
client.search(new UriDt("?aaaa"));
fail();
} catch (IllegalArgumentException e) {
assertEquals("Unable to determine the resource type from the given URI: ?aaaa", e.getMessage());
}
}
@Test @Test
public void testSearchWithMultipleTokens() throws Exception { public void testSearchWithMultipleTokens() throws Exception {
ArgumentCaptor<HttpUriRequest> capt = prepareClientForSearchResponse(); ArgumentCaptor<HttpUriRequest> capt = prepareClientForSearchResponse();

View File

@ -67,9 +67,13 @@ public class DateRangeParamTest {
public void testDay() throws Exception { public void testDay() throws Exception {
assertEquals(parse("2011-01-01 00:00:00.0000"), create(">=2011-01-01", "<2011-01-02").getLowerBoundAsInstant()); assertEquals(parse("2011-01-01 00:00:00.0000"), create(">=2011-01-01", "<2011-01-02").getLowerBoundAsInstant());
assertEquals(parseM1("2011-01-02 00:00:00.0000"), create(">=2011-01-01", "<2011-01-02").getUpperBoundAsInstant()); assertEquals(parseM1("2011-01-02 00:00:00.0000"), create(">=2011-01-01", "<2011-01-02").getUpperBoundAsInstant());
assertEquals(parse("2011-01-02 00:00:00.0000"), create(">2011-01-01", "<=2011-01-02").getLowerBoundAsInstant()); assertEquals(parse("2011-01-02 00:00:00.0000"), create(">2011-01-01", "<=2011-01-02").getLowerBoundAsInstant());
assertEquals(parseM1("2011-01-03 00:00:00.0000"), create(">2011-01-01", "<=2011-01-02").getUpperBoundAsInstant()); assertEquals(parseM1("2011-01-03 00:00:00.0000"), create(">2011-01-01", "<=2011-01-02").getUpperBoundAsInstant());
assertEquals(parse("2011-01-01 00:00:00.0000"), create("ge2011-01-01", "lt2011-01-02").getLowerBoundAsInstant());
assertEquals(parseM1("2011-01-02 00:00:00.0000"), create("ge2011-01-01", "lt2011-01-02").getUpperBoundAsInstant());
assertEquals(parse("2011-01-02 00:00:00.0000"), create("gt2011-01-01", "le2011-01-02").getLowerBoundAsInstant());
assertEquals(parseM1("2011-01-03 00:00:00.0000"), create("gt2011-01-01", "le2011-01-02").getUpperBoundAsInstant());
} }
@Test @Test
@ -77,20 +81,20 @@ public class DateRangeParamTest {
assertEquals(parse("2011-01-01 00:00:00.0000"), create("2011-01-01").getLowerBoundAsInstant()); assertEquals(parse("2011-01-01 00:00:00.0000"), create("2011-01-01").getLowerBoundAsInstant());
assertEquals(parseM1("2011-01-02 00:00:00.0000"), create("2011-01-01").getUpperBoundAsInstant()); assertEquals(parseM1("2011-01-02 00:00:00.0000"), create("2011-01-01").getUpperBoundAsInstant());
assertEquals(parse("2011-01-01 00:00:00.0000"), create(">=2011-01-01").getLowerBoundAsInstant()); assertEquals(parse("2011-01-01 00:00:00.0000"), create("ge2011-01-01").getLowerBoundAsInstant());
assertEquals(null, create(">=2011-01-01").getUpperBoundAsInstant()); assertEquals(null, create("ge2011-01-01").getUpperBoundAsInstant());
assertEquals(null, create("<=2011-01-01").getLowerBoundAsInstant()); assertEquals(null, create("le2011-01-01").getLowerBoundAsInstant());
assertEquals(parseM1("2011-01-02 00:00:00.0000"), create("<=2011-01-01").getUpperBoundAsInstant()); assertEquals(parseM1("2011-01-02 00:00:00.0000"), create("le2011-01-01").getUpperBoundAsInstant());
} }
@Test @Test
public void testMonth() throws Exception { public void testMonth() throws Exception {
assertEquals(parse("2011-01-01 00:00:00.0000"), create(">=2011-01", "<2011-02").getLowerBoundAsInstant()); assertEquals(parse("2011-01-01 00:00:00.0000"), create("ge2011-01", "lt2011-02").getLowerBoundAsInstant());
assertEquals(parseM1("2011-02-01 00:00:00.0000"), create(">=2011-01", "<2011-02").getUpperBoundAsInstant()); assertEquals(parseM1("2011-02-01 00:00:00.0000"), create("ge2011-01", "lt2011-02").getUpperBoundAsInstant());
assertEquals(parse("2011-02-01 00:00:00.0000"), create(">2011-01", "<=2011-02").getLowerBoundAsInstant()); assertEquals(parse("2011-02-01 00:00:00.0000"), create("gt2011-01", "le2011-02").getLowerBoundAsInstant());
assertEquals(parseM1("2011-03-01 00:00:00.0000"), create(">2011-01", "<=2011-02").getUpperBoundAsInstant()); assertEquals(parseM1("2011-03-01 00:00:00.0000"), create("gt2011-01", "le2011-02").getUpperBoundAsInstant());
} }
@Test @Test
@ -159,20 +163,20 @@ public class DateRangeParamTest {
@Test @Test
public void testSecond() throws Exception { public void testSecond() throws Exception {
assertEquals(parse("2011-01-01 00:00:00.0000"), create(">=2011-01-01T00:00:00", "<2011-01-01T01:00:00").getLowerBoundAsInstant()); assertEquals(parse("2011-01-01 00:00:00.0000"), create("ge2011-01-01T00:00:00", "lt2011-01-01T01:00:00").getLowerBoundAsInstant());
assertEquals(parseM1("2011-01-01 02:00:00.0000"), create(">=2011-01-01T00:00:00", "<2011-01-01T02:00:00").getUpperBoundAsInstant()); assertEquals(parseM1("2011-01-01 02:00:00.0000"), create("ge2011-01-01T00:00:00", "lt2011-01-01T02:00:00").getUpperBoundAsInstant());
assertEquals(parse("2011-01-01 00:00:01.0000"), create(">2011-01-01T00:00:00", "<=2011-01-01T02:00:00").getLowerBoundAsInstant()); assertEquals(parse("2011-01-01 00:00:01.0000"), create("gt2011-01-01T00:00:00", "le2011-01-01T02:00:00").getLowerBoundAsInstant());
assertEquals(parseM1("2011-01-01 02:00:01.0000"), create(">2011-01-01T00:00:00", "<=2011-01-01T02:00:00").getUpperBoundAsInstant()); assertEquals(parseM1("2011-01-01 02:00:01.0000"), create("gt2011-01-01T00:00:00", "le2011-01-01T02:00:00").getUpperBoundAsInstant());
} }
@Test @Test
public void testYear() throws Exception { public void testYear() throws Exception {
assertEquals(parse("2011-01-01 00:00:00.0000"), create(">=2011", "<2012").getLowerBoundAsInstant()); assertEquals(parse("2011-01-01 00:00:00.0000"), create("ge2011", "lt2012").getLowerBoundAsInstant());
assertEquals(parseM1("2012-01-01 00:00:00.0000"), create(">=2011", "<2012").getUpperBoundAsInstant()); assertEquals(parseM1("2012-01-01 00:00:00.0000"), create("ge2011", "lt2012").getUpperBoundAsInstant());
assertEquals(parse("2012-01-01 00:00:00.0000"), create(">2011", "<=2012").getLowerBoundAsInstant()); assertEquals(parse("2012-01-01 00:00:00.0000"), create("gt2011", "le2012").getLowerBoundAsInstant());
assertEquals(parseM1("2014-01-01 00:00:00.0000"), create(">2011", "<=2013").getUpperBoundAsInstant()); assertEquals(parseM1("2014-01-01 00:00:00.0000"), create("gt2011", "le2013").getUpperBoundAsInstant());
} }
@AfterClass @AfterClass

View File

@ -1286,72 +1286,6 @@ public class JsonParserHl7OrgDstu2Test {
} }
@Test
public void testTagList() {
//@formatter:off
String tagListStr = "{\n" +
" \"resourceType\" : \"TagList\", " +
" \"category\" : [" +
" { " +
" \"term\" : \"term0\", " +
" \"label\" : \"label0\", " +
" \"scheme\" : \"scheme0\" " +
" }," +
" { " +
" \"term\" : \"term1\", " +
" \"label\" : \"label1\", " +
" \"scheme\" : null " +
" }," +
" { " +
" \"term\" : \"term2\", " +
" \"label\" : \"label2\" " +
" }" +
" ] " +
"}";
//@formatter:on
TagList tagList = ourCtx.newJsonParser().parseTagList(tagListStr);
assertEquals(3, tagList.size());
assertEquals("term0", tagList.get(0).getTerm());
assertEquals("label0", tagList.get(0).getLabel());
assertEquals("scheme0", tagList.get(0).getScheme());
assertEquals("term1", tagList.get(1).getTerm());
assertEquals("label1", tagList.get(1).getLabel());
assertEquals(null, tagList.get(1).getScheme());
assertEquals("term2", tagList.get(2).getTerm());
assertEquals("label2", tagList.get(2).getLabel());
assertEquals(null, tagList.get(2).getScheme());
/*
* Encode
*/
//@formatter:off
String expected = "{" +
"\"resourceType\":\"TagList\"," +
"\"category\":[" +
"{" +
"\"term\":\"term0\"," +
"\"label\":\"label0\"," +
"\"scheme\":\"scheme0\"" +
"}," +
"{" +
"\"term\":\"term1\"," +
"\"label\":\"label1\"" +
"}," +
"{" +
"\"term\":\"term2\"," +
"\"label\":\"label2\"" +
"}" +
"]" +
"}";
//@formatter:on
String encoded = ourCtx.newJsonParser().encodeTagListToString(tagList);
assertEquals(expected, encoded);
}
@ResourceDef(name = "Patient") @ResourceDef(name = "Patient")
public static class MyPatientWithOneDeclaredAddressExtension extends Patient { public static class MyPatientWithOneDeclaredAddressExtension extends Patient {

View File

@ -1,56 +0,0 @@
package ca.uhn.fhir.rest.server;
import static org.junit.Assert.assertThat;
import static org.junit.Assert.fail;
import javax.servlet.ServletException;
import org.hamcrest.core.StringContains;
import org.hl7.fhir.instance.model.Patient;
import org.hl7.fhir.instance.model.StringType;
import org.hl7.fhir.instance.model.api.IBaseResource;
import org.junit.Test;
import ca.uhn.fhir.context.FhirContext;
import ca.uhn.fhir.rest.annotation.Operation;
import ca.uhn.fhir.rest.annotation.OperationParam;
public class ServerInvalidDefinitionHl7OrgDstu2Test {
private static FhirContext ourCtx = FhirContext.forDstu2Hl7Org();
private static final org.slf4j.Logger ourLog = org.slf4j.LoggerFactory
.getLogger(ServerInvalidDefinitionHl7OrgDstu2Test.class);
@Test
public void testOperationReturningOldBundleProvider() {
RestfulServer srv = new RestfulServer(ourCtx);
srv.setFhirContext(ourCtx);
srv.setResourceProviders(new OperationReturningOldBundleProvider());
try {
srv.init();
fail();
} catch (ServletException e) {
ourLog.info(e.getCause().toString());
assertThat(e.getCause().toString(), StringContains.containsString("ConfigurationException"));
assertThat(e.getCause().toString(), StringContains.containsString("Can not return a DSTU1 bundle"));
}
}
public static class OperationReturningOldBundleProvider implements IResourceProvider {
@Override
public Class<? extends IBaseResource> getResourceType() {
return Patient.class;
}
@Operation(name = "$OP_TYPE_RET_OLD_BUNDLE")
public ca.uhn.fhir.model.api.Bundle opTypeRetOldBundle(@OperationParam(name = "PARAM1") StringType theParam1,
@OperationParam(name = "PARAM2") Patient theParam2) {
return null;
}
}
}

View File

@ -264,11 +264,6 @@ public class R4BundleFactory implements IVersionSpecificBundleFactory {
} }
} }
@Override
public ca.uhn.fhir.model.api.Bundle getDstu1Bundle() {
return null;
}
@Override @Override
public IBaseResource getResourceBundle() { public IBaseResource getResourceBundle() {
return myBundle; return myBundle;

View File

@ -2,7 +2,13 @@ package ca.uhn.fhir.rest.client;
import static org.hamcrest.Matchers.containsString; import static org.hamcrest.Matchers.containsString;
import static org.hamcrest.Matchers.startsWith; import static org.hamcrest.Matchers.startsWith;
import static org.junit.Assert.*; import static org.junit.Assert.assertArrayEquals;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertThat;
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;
@ -33,8 +39,10 @@ import com.phloc.commons.io.streams.StringInputStream;
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.IQueryParameterType;
import ca.uhn.fhir.model.api.TemporalPrecisionEnum; import ca.uhn.fhir.model.api.TemporalPrecisionEnum;
import ca.uhn.fhir.model.primitive.*; import ca.uhn.fhir.model.primitive.DateTimeDt;
import ca.uhn.fhir.model.primitive.StringDt;
import ca.uhn.fhir.parser.CustomTypeR4Test; import ca.uhn.fhir.parser.CustomTypeR4Test;
import ca.uhn.fhir.parser.CustomTypeR4Test.MyCustomPatient; import ca.uhn.fhir.parser.CustomTypeR4Test.MyCustomPatient;
import ca.uhn.fhir.parser.IParser; import ca.uhn.fhir.parser.IParser;
@ -47,6 +55,7 @@ import ca.uhn.fhir.rest.client.exceptions.NonFhirResponseException;
import ca.uhn.fhir.rest.client.impl.BaseClient; 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.DateParam;
import ca.uhn.fhir.rest.param.ParamPrefixEnum; import ca.uhn.fhir.rest.param.ParamPrefixEnum;
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;
@ -99,272 +108,6 @@ public class GenericClientR4Test {
return capt; return capt;
} }
@Test
public void testRevIncludeRecursive() throws ClientProtocolException, IOException {
ArgumentCaptor<HttpUriRequest> capt = prepareClientForSearchResponse();
IGenericClient client = ourCtx.newRestfulGenericClient("http://example.com/fhir");
int idx = 0;
client.search()
.forResource(EpisodeOfCare.class)
.where(EpisodeOfCare.PATIENT.hasId("123"))
.revInclude(Encounter.INCLUDE_EPISODEOFCARE)
.revInclude(Observation.INCLUDE_ENCOUNTER.asRecursive())
.returnBundle(Bundle.class)
.execute();
assertEquals("http://example.com/fhir/EpisodeOfCare?patient=123&_revinclude=Encounter%3Aepisodeofcare&_revinclude%3Arecurse=Observation%3Aencounter",
capt.getAllValues().get(idx).getURI().toString());
idx++;
}
@Test
public void testPatchJsonByIdString() throws Exception {
OperationOutcome conf = new OperationOutcome();
conf.getText().setDivAsString("OK!");
final String respString = ourCtx.newJsonParser().encodeResourceToString(conf);
ArgumentCaptor<HttpUriRequest> capt = ArgumentCaptor.forClass(HttpUriRequest.class);
when(myHttpClient.execute(capt.capture())).thenReturn(myHttpResponse);
when(myHttpResponse.getStatusLine()).thenReturn(new BasicStatusLine(new ProtocolVersion("HTTP", 1, 1), 200, "OK"));
when(myHttpResponse.getEntity().getContentType()).thenReturn(new BasicHeader("content-type", Constants.CT_FHIR_JSON + "; charset=UTF-8"));
when(myHttpResponse.getEntity().getContent()).then(new Answer<InputStream>() {
@Override
public InputStream answer(InvocationOnMock theInvocation) throws Throwable {
return new ReaderInputStream(new StringReader(respString), Charset.forName("UTF-8"));
}
});
IGenericClient client = ourCtx.newRestfulGenericClient("http://example.com/fhir");
int idx = 0;
String patch = "[ { \"op\":\"replace\", \"path\":\"/active\", \"value\":false } ]";
MethodOutcome outcome = client
.patch()
.withBody(patch)
.withId("Patient/123")
.execute();
assertEquals("http://example.com/fhir/Patient/123", UrlUtil.unescape(capt.getAllValues().get(idx).getURI().toString()));
assertEquals("PATCH", capt.getAllValues().get(0).getRequestLine().getMethod());
assertEquals(patch, extractBodyAsString(capt));
assertEquals(Constants.CT_JSON_PATCH, capt.getAllValues().get(idx).getFirstHeader("Content-Type").getValue().replaceAll(";.*", ""));
idx++;
OperationOutcome oo = (OperationOutcome) outcome.getOperationOutcome();
assertThat(oo.getText().getDivAsString(), containsString("OK!"));
}
@Test
public void testPatchJsonByIdType() throws Exception {
OperationOutcome conf = new OperationOutcome();
conf.getText().setDivAsString("OK!");
final String respString = ourCtx.newJsonParser().encodeResourceToString(conf);
ArgumentCaptor<HttpUriRequest> capt = ArgumentCaptor.forClass(HttpUriRequest.class);
when(myHttpClient.execute(capt.capture())).thenReturn(myHttpResponse);
when(myHttpResponse.getStatusLine()).thenReturn(new BasicStatusLine(new ProtocolVersion("HTTP", 1, 1), 200, "OK"));
when(myHttpResponse.getEntity().getContentType()).thenReturn(new BasicHeader("content-type", Constants.CT_FHIR_JSON + "; charset=UTF-8"));
when(myHttpResponse.getEntity().getContent()).then(new Answer<InputStream>() {
@Override
public InputStream answer(InvocationOnMock theInvocation) throws Throwable {
return new ReaderInputStream(new StringReader(respString), Charset.forName("UTF-8"));
}
});
IGenericClient client = ourCtx.newRestfulGenericClient("http://example.com/fhir");
int idx = 0;
String patch = "[ { \"op\":\"replace\", \"path\":\"/active\", \"value\":false } ]";
MethodOutcome outcome = client
.patch()
.withBody(patch)
.withId(new IdType("http://localhost/fhir/Patient/123/_history/234"))
.execute();
assertEquals("http://example.com/fhir/Patient/123", UrlUtil.unescape(capt.getAllValues().get(idx).getURI().toString()));
assertEquals("PATCH", capt.getAllValues().get(0).getRequestLine().getMethod());
assertEquals(patch, extractBodyAsString(capt));
assertEquals(Constants.CT_JSON_PATCH, capt.getAllValues().get(idx).getFirstHeader("Content-Type").getValue().replaceAll(";.*", ""));
idx++;
OperationOutcome oo = (OperationOutcome) outcome.getOperationOutcome();
assertThat(oo.getText().getDivAsString(), containsString("OK!"));
}
@Test
public void testPatchJsonByConditionalString() throws Exception {
OperationOutcome conf = new OperationOutcome();
conf.getText().setDivAsString("OK!");
final String respString = ourCtx.newJsonParser().encodeResourceToString(conf);
ArgumentCaptor<HttpUriRequest> capt = ArgumentCaptor.forClass(HttpUriRequest.class);
when(myHttpClient.execute(capt.capture())).thenReturn(myHttpResponse);
when(myHttpResponse.getStatusLine()).thenReturn(new BasicStatusLine(new ProtocolVersion("HTTP", 1, 1), 200, "OK"));
when(myHttpResponse.getEntity().getContentType()).thenReturn(new BasicHeader("content-type", Constants.CT_FHIR_JSON + "; charset=UTF-8"));
when(myHttpResponse.getEntity().getContent()).then(new Answer<InputStream>() {
@Override
public InputStream answer(InvocationOnMock theInvocation) throws Throwable {
return new ReaderInputStream(new StringReader(respString), Charset.forName("UTF-8"));
}
});
IGenericClient client = ourCtx.newRestfulGenericClient("http://example.com/fhir");
int idx = 0;
String patch = "[ { \"op\":\"replace\", \"path\":\"/active\", \"value\":false } ]";
MethodOutcome outcome = client
.patch()
.withBody(patch)
.conditionalByUrl("Patient?foo=bar")
.execute();
assertEquals("http://example.com/fhir/Patient?foo=bar", UrlUtil.unescape(capt.getAllValues().get(idx).getURI().toString()));
assertEquals("PATCH", capt.getAllValues().get(0).getRequestLine().getMethod());
assertEquals(patch, extractBodyAsString(capt));
assertEquals(Constants.CT_JSON_PATCH, capt.getAllValues().get(idx).getFirstHeader("Content-Type").getValue().replaceAll(";.*", ""));
idx++;
OperationOutcome oo = (OperationOutcome) outcome.getOperationOutcome();
assertThat(oo.getText().getDivAsString(), containsString("OK!"));
}
@Test
public void testPatchJsonByConditionalParam() throws Exception {
OperationOutcome conf = new OperationOutcome();
conf.getText().setDivAsString("OK!");
final String respString = ourCtx.newJsonParser().encodeResourceToString(conf);
ArgumentCaptor<HttpUriRequest> capt = ArgumentCaptor.forClass(HttpUriRequest.class);
when(myHttpClient.execute(capt.capture())).thenReturn(myHttpResponse);
when(myHttpResponse.getStatusLine()).thenReturn(new BasicStatusLine(new ProtocolVersion("HTTP", 1, 1), 200, "OK"));
when(myHttpResponse.getEntity().getContentType()).thenReturn(new BasicHeader("content-type", Constants.CT_FHIR_JSON + "; charset=UTF-8"));
when(myHttpResponse.getEntity().getContent()).then(new Answer<InputStream>() {
@Override
public InputStream answer(InvocationOnMock theInvocation) throws Throwable {
return new ReaderInputStream(new StringReader(respString), Charset.forName("UTF-8"));
}
});
IGenericClient client = ourCtx.newRestfulGenericClient("http://example.com/fhir");
int idx = 0;
String patch = "[ { \"op\":\"replace\", \"path\":\"/active\", \"value\":false } ]";
MethodOutcome outcome = client
.patch()
.withBody(patch)
.conditional("Patient").where(Patient.NAME.matches().value("TEST"))
.and(Patient.FAMILY.matches().value("TEST2"))
.execute();
assertEquals("http://example.com/fhir/Patient?name=TEST&family=TEST2", UrlUtil.unescape(capt.getAllValues().get(idx).getURI().toString()));
assertEquals("PATCH", capt.getAllValues().get(0).getRequestLine().getMethod());
assertEquals(patch, extractBodyAsString(capt));
assertEquals(Constants.CT_JSON_PATCH, capt.getAllValues().get(idx).getFirstHeader("Content-Type").getValue().replaceAll(";.*", ""));
idx++;
OperationOutcome oo = (OperationOutcome) outcome.getOperationOutcome();
assertThat(oo.getText().getDivAsString(), containsString("OK!"));
}
@Test
public void testPatchJsonByConditionalParamResourceType() throws Exception {
OperationOutcome conf = new OperationOutcome();
conf.getText().setDivAsString("OK!");
final String respString = ourCtx.newJsonParser().encodeResourceToString(conf);
ArgumentCaptor<HttpUriRequest> capt = ArgumentCaptor.forClass(HttpUriRequest.class);
when(myHttpClient.execute(capt.capture())).thenReturn(myHttpResponse);
when(myHttpResponse.getStatusLine()).thenReturn(new BasicStatusLine(new ProtocolVersion("HTTP", 1, 1), 200, "OK"));
when(myHttpResponse.getEntity().getContentType()).thenReturn(new BasicHeader("content-type", Constants.CT_FHIR_JSON + "; charset=UTF-8"));
when(myHttpResponse.getEntity().getContent()).then(new Answer<InputStream>() {
@Override
public InputStream answer(InvocationOnMock theInvocation) throws Throwable {
return new ReaderInputStream(new StringReader(respString), Charset.forName("UTF-8"));
}
});
IGenericClient client = ourCtx.newRestfulGenericClient("http://example.com/fhir");
int idx = 0;
String patch = "[ { \"op\":\"replace\", \"path\":\"/active\", \"value\":false } ]";
MethodOutcome outcome = client
.patch()
.withBody(patch)
.conditional(Patient.class).where(Patient.NAME.matches().value("TEST"))
.and(Patient.FAMILY.matches().value("TEST2"))
.execute();
assertEquals("http://example.com/fhir/Patient?name=TEST&family=TEST2", UrlUtil.unescape(capt.getAllValues().get(idx).getURI().toString()));
assertEquals("PATCH", capt.getAllValues().get(0).getRequestLine().getMethod());
assertEquals(patch, extractBodyAsString(capt));
assertEquals(Constants.CT_JSON_PATCH, capt.getAllValues().get(idx).getFirstHeader("Content-Type").getValue().replaceAll(";.*", ""));
idx++;
OperationOutcome oo = (OperationOutcome) outcome.getOperationOutcome();
assertThat(oo.getText().getDivAsString(), containsString("OK!"));
}
@Test
public void testPatchXmlByIdString() throws Exception {
OperationOutcome conf = new OperationOutcome();
conf.getText().setDivAsString("OK!");
final String respString = ourCtx.newJsonParser().encodeResourceToString(conf);
ArgumentCaptor<HttpUriRequest> capt = ArgumentCaptor.forClass(HttpUriRequest.class);
when(myHttpClient.execute(capt.capture())).thenReturn(myHttpResponse);
when(myHttpResponse.getStatusLine()).thenReturn(new BasicStatusLine(new ProtocolVersion("HTTP", 1, 1), 200, "OK"));
when(myHttpResponse.getEntity().getContentType()).thenReturn(new BasicHeader("content-type", Constants.CT_FHIR_JSON + "; charset=UTF-8"));
when(myHttpResponse.getEntity().getContent()).then(new Answer<InputStream>() {
@Override
public InputStream answer(InvocationOnMock theInvocation) throws Throwable {
return new ReaderInputStream(new StringReader(respString), Charset.forName("UTF-8"));
}
});
IGenericClient client = ourCtx.newRestfulGenericClient("http://example.com/fhir");
int idx = 0;
String patch = "<?xml version=\"1.0\" encoding=\"UTF-8\"?><diff xmlns:fhir=\"http://hl7.org/fhir\"><replace sel=\"fhir:Patient/fhir:active/@value\">false</replace></diff>";
MethodOutcome outcome = client
.patch()
.withBody(patch)
.withId("Patient/123")
.execute();
assertEquals("http://example.com/fhir/Patient/123", UrlUtil.unescape(capt.getAllValues().get(idx).getURI().toString()));
assertEquals("PATCH", capt.getAllValues().get(0).getRequestLine().getMethod());
assertEquals(patch, extractBodyAsString(capt));
assertEquals(Constants.CT_XML_PATCH, capt.getAllValues().get(idx).getFirstHeader("Content-Type").getValue().replaceAll(";.*", ""));
idx++;
OperationOutcome oo = (OperationOutcome) outcome.getOperationOutcome();
assertThat(oo.getText().getDivAsString(), containsString("OK!"));
}
@Test
public void testPatchInvalid() throws Exception {
IGenericClient client = ourCtx.newRestfulGenericClient("http://example.com/fhir");
try {
client
.patch()
.withBody("AA")
.withId("Patient/123")
.execute();
} catch (IllegalArgumentException e) {
assertEquals("Unable to determine encoding of patch", e.getMessage());
}
}
@Test @Test
public void testAcceptHeaderWithEncodingSpecified() throws Exception { public void testAcceptHeaderWithEncodingSpecified() throws Exception {
final String msg = "{\"resourceType\":\"Bundle\",\"id\":null,\"base\":\"http://localhost:57931/fhir/contextDev\",\"total\":1,\"link\":[{\"relation\":\"self\",\"url\":\"http://localhost:57931/fhir/contextDev/Patient?identifier=urn%3AMultiFhirVersionTest%7CtestSubmitPatient01&_format=json\"}],\"entry\":[{\"resource\":{\"resourceType\":\"Patient\",\"id\":\"1\",\"meta\":{\"versionId\":\"1\",\"lastUpdated\":\"2014-12-20T18:41:29.706-05:00\"},\"identifier\":[{\"system\":\"urn:MultiFhirVersionTest\",\"value\":\"testSubmitPatient01\"}]}}]}"; final String msg = "{\"resourceType\":\"Bundle\",\"id\":null,\"base\":\"http://localhost:57931/fhir/contextDev\",\"total\":1,\"link\":[{\"relation\":\"self\",\"url\":\"http://localhost:57931/fhir/contextDev/Patient?identifier=urn%3AMultiFhirVersionTest%7CtestSubmitPatient01&_format=json\"}],\"entry\":[{\"resource\":{\"resourceType\":\"Patient\",\"id\":\"1\",\"meta\":{\"versionId\":\"1\",\"lastUpdated\":\"2014-12-20T18:41:29.706-05:00\"},\"identifier\":[{\"system\":\"urn:MultiFhirVersionTest\",\"value\":\"testSubmitPatient01\"}]}}]}";
@ -923,18 +666,6 @@ public class GenericClientR4Test {
} }
@SuppressWarnings("deprecation")
@Test
public void testInvalidConformanceCall() {
IGenericClient client = ourCtx.newRestfulGenericClient("http://example.com/fhir");
try {
client.conformance();
fail();
} catch (IllegalArgumentException e) {
assertEquals("Must call fetchConformance() instead of conformance() for RI/STU3+ structures", e.getMessage());
}
}
/** /**
* See #150 * See #150
*/ */
@ -980,6 +711,251 @@ public class GenericClientR4Test {
} }
@Test
public void testPatchInvalid() throws Exception {
IGenericClient client = ourCtx.newRestfulGenericClient("http://example.com/fhir");
try {
client
.patch()
.withBody("AA")
.withId("Patient/123")
.execute();
} catch (IllegalArgumentException e) {
assertEquals("Unable to determine encoding of patch", e.getMessage());
}
}
@Test
public void testPatchJsonByConditionalParam() throws Exception {
OperationOutcome conf = new OperationOutcome();
conf.getText().setDivAsString("OK!");
final String respString = ourCtx.newJsonParser().encodeResourceToString(conf);
ArgumentCaptor<HttpUriRequest> capt = ArgumentCaptor.forClass(HttpUriRequest.class);
when(myHttpClient.execute(capt.capture())).thenReturn(myHttpResponse);
when(myHttpResponse.getStatusLine()).thenReturn(new BasicStatusLine(new ProtocolVersion("HTTP", 1, 1), 200, "OK"));
when(myHttpResponse.getEntity().getContentType()).thenReturn(new BasicHeader("content-type", Constants.CT_FHIR_JSON + "; charset=UTF-8"));
when(myHttpResponse.getEntity().getContent()).then(new Answer<InputStream>() {
@Override
public InputStream answer(InvocationOnMock theInvocation) throws Throwable {
return new ReaderInputStream(new StringReader(respString), Charset.forName("UTF-8"));
}
});
IGenericClient client = ourCtx.newRestfulGenericClient("http://example.com/fhir");
int idx = 0;
String patch = "[ { \"op\":\"replace\", \"path\":\"/active\", \"value\":false } ]";
MethodOutcome outcome = client
.patch()
.withBody(patch)
.conditional("Patient").where(Patient.NAME.matches().value("TEST"))
.and(Patient.FAMILY.matches().value("TEST2"))
.execute();
assertEquals("http://example.com/fhir/Patient?name=TEST&family=TEST2", UrlUtil.unescape(capt.getAllValues().get(idx).getURI().toString()));
assertEquals("PATCH", capt.getAllValues().get(0).getRequestLine().getMethod());
assertEquals(patch, extractBodyAsString(capt));
assertEquals(Constants.CT_JSON_PATCH, capt.getAllValues().get(idx).getFirstHeader("Content-Type").getValue().replaceAll(";.*", ""));
idx++;
OperationOutcome oo = (OperationOutcome) outcome.getOperationOutcome();
assertThat(oo.getText().getDivAsString(), containsString("OK!"));
}
@Test
public void testPatchJsonByConditionalParamResourceType() throws Exception {
OperationOutcome conf = new OperationOutcome();
conf.getText().setDivAsString("OK!");
final String respString = ourCtx.newJsonParser().encodeResourceToString(conf);
ArgumentCaptor<HttpUriRequest> capt = ArgumentCaptor.forClass(HttpUriRequest.class);
when(myHttpClient.execute(capt.capture())).thenReturn(myHttpResponse);
when(myHttpResponse.getStatusLine()).thenReturn(new BasicStatusLine(new ProtocolVersion("HTTP", 1, 1), 200, "OK"));
when(myHttpResponse.getEntity().getContentType()).thenReturn(new BasicHeader("content-type", Constants.CT_FHIR_JSON + "; charset=UTF-8"));
when(myHttpResponse.getEntity().getContent()).then(new Answer<InputStream>() {
@Override
public InputStream answer(InvocationOnMock theInvocation) throws Throwable {
return new ReaderInputStream(new StringReader(respString), Charset.forName("UTF-8"));
}
});
IGenericClient client = ourCtx.newRestfulGenericClient("http://example.com/fhir");
int idx = 0;
String patch = "[ { \"op\":\"replace\", \"path\":\"/active\", \"value\":false } ]";
MethodOutcome outcome = client
.patch()
.withBody(patch)
.conditional(Patient.class).where(Patient.NAME.matches().value("TEST"))
.and(Patient.FAMILY.matches().value("TEST2"))
.execute();
assertEquals("http://example.com/fhir/Patient?name=TEST&family=TEST2", UrlUtil.unescape(capt.getAllValues().get(idx).getURI().toString()));
assertEquals("PATCH", capt.getAllValues().get(0).getRequestLine().getMethod());
assertEquals(patch, extractBodyAsString(capt));
assertEquals(Constants.CT_JSON_PATCH, capt.getAllValues().get(idx).getFirstHeader("Content-Type").getValue().replaceAll(";.*", ""));
idx++;
OperationOutcome oo = (OperationOutcome) outcome.getOperationOutcome();
assertThat(oo.getText().getDivAsString(), containsString("OK!"));
}
@Test
public void testPatchJsonByConditionalString() throws Exception {
OperationOutcome conf = new OperationOutcome();
conf.getText().setDivAsString("OK!");
final String respString = ourCtx.newJsonParser().encodeResourceToString(conf);
ArgumentCaptor<HttpUriRequest> capt = ArgumentCaptor.forClass(HttpUriRequest.class);
when(myHttpClient.execute(capt.capture())).thenReturn(myHttpResponse);
when(myHttpResponse.getStatusLine()).thenReturn(new BasicStatusLine(new ProtocolVersion("HTTP", 1, 1), 200, "OK"));
when(myHttpResponse.getEntity().getContentType()).thenReturn(new BasicHeader("content-type", Constants.CT_FHIR_JSON + "; charset=UTF-8"));
when(myHttpResponse.getEntity().getContent()).then(new Answer<InputStream>() {
@Override
public InputStream answer(InvocationOnMock theInvocation) throws Throwable {
return new ReaderInputStream(new StringReader(respString), Charset.forName("UTF-8"));
}
});
IGenericClient client = ourCtx.newRestfulGenericClient("http://example.com/fhir");
int idx = 0;
String patch = "[ { \"op\":\"replace\", \"path\":\"/active\", \"value\":false } ]";
MethodOutcome outcome = client
.patch()
.withBody(patch)
.conditionalByUrl("Patient?foo=bar")
.execute();
assertEquals("http://example.com/fhir/Patient?foo=bar", UrlUtil.unescape(capt.getAllValues().get(idx).getURI().toString()));
assertEquals("PATCH", capt.getAllValues().get(0).getRequestLine().getMethod());
assertEquals(patch, extractBodyAsString(capt));
assertEquals(Constants.CT_JSON_PATCH, capt.getAllValues().get(idx).getFirstHeader("Content-Type").getValue().replaceAll(";.*", ""));
idx++;
OperationOutcome oo = (OperationOutcome) outcome.getOperationOutcome();
assertThat(oo.getText().getDivAsString(), containsString("OK!"));
}
@Test
public void testPatchJsonByIdString() throws Exception {
OperationOutcome conf = new OperationOutcome();
conf.getText().setDivAsString("OK!");
final String respString = ourCtx.newJsonParser().encodeResourceToString(conf);
ArgumentCaptor<HttpUriRequest> capt = ArgumentCaptor.forClass(HttpUriRequest.class);
when(myHttpClient.execute(capt.capture())).thenReturn(myHttpResponse);
when(myHttpResponse.getStatusLine()).thenReturn(new BasicStatusLine(new ProtocolVersion("HTTP", 1, 1), 200, "OK"));
when(myHttpResponse.getEntity().getContentType()).thenReturn(new BasicHeader("content-type", Constants.CT_FHIR_JSON + "; charset=UTF-8"));
when(myHttpResponse.getEntity().getContent()).then(new Answer<InputStream>() {
@Override
public InputStream answer(InvocationOnMock theInvocation) throws Throwable {
return new ReaderInputStream(new StringReader(respString), Charset.forName("UTF-8"));
}
});
IGenericClient client = ourCtx.newRestfulGenericClient("http://example.com/fhir");
int idx = 0;
String patch = "[ { \"op\":\"replace\", \"path\":\"/active\", \"value\":false } ]";
MethodOutcome outcome = client
.patch()
.withBody(patch)
.withId("Patient/123")
.execute();
assertEquals("http://example.com/fhir/Patient/123", UrlUtil.unescape(capt.getAllValues().get(idx).getURI().toString()));
assertEquals("PATCH", capt.getAllValues().get(0).getRequestLine().getMethod());
assertEquals(patch, extractBodyAsString(capt));
assertEquals(Constants.CT_JSON_PATCH, capt.getAllValues().get(idx).getFirstHeader("Content-Type").getValue().replaceAll(";.*", ""));
idx++;
OperationOutcome oo = (OperationOutcome) outcome.getOperationOutcome();
assertThat(oo.getText().getDivAsString(), containsString("OK!"));
}
@Test
public void testPatchJsonByIdType() throws Exception {
OperationOutcome conf = new OperationOutcome();
conf.getText().setDivAsString("OK!");
final String respString = ourCtx.newJsonParser().encodeResourceToString(conf);
ArgumentCaptor<HttpUriRequest> capt = ArgumentCaptor.forClass(HttpUriRequest.class);
when(myHttpClient.execute(capt.capture())).thenReturn(myHttpResponse);
when(myHttpResponse.getStatusLine()).thenReturn(new BasicStatusLine(new ProtocolVersion("HTTP", 1, 1), 200, "OK"));
when(myHttpResponse.getEntity().getContentType()).thenReturn(new BasicHeader("content-type", Constants.CT_FHIR_JSON + "; charset=UTF-8"));
when(myHttpResponse.getEntity().getContent()).then(new Answer<InputStream>() {
@Override
public InputStream answer(InvocationOnMock theInvocation) throws Throwable {
return new ReaderInputStream(new StringReader(respString), Charset.forName("UTF-8"));
}
});
IGenericClient client = ourCtx.newRestfulGenericClient("http://example.com/fhir");
int idx = 0;
String patch = "[ { \"op\":\"replace\", \"path\":\"/active\", \"value\":false } ]";
MethodOutcome outcome = client
.patch()
.withBody(patch)
.withId(new IdType("http://localhost/fhir/Patient/123/_history/234"))
.execute();
assertEquals("http://example.com/fhir/Patient/123", UrlUtil.unescape(capt.getAllValues().get(idx).getURI().toString()));
assertEquals("PATCH", capt.getAllValues().get(0).getRequestLine().getMethod());
assertEquals(patch, extractBodyAsString(capt));
assertEquals(Constants.CT_JSON_PATCH, capt.getAllValues().get(idx).getFirstHeader("Content-Type").getValue().replaceAll(";.*", ""));
idx++;
OperationOutcome oo = (OperationOutcome) outcome.getOperationOutcome();
assertThat(oo.getText().getDivAsString(), containsString("OK!"));
}
@Test
public void testPatchXmlByIdString() throws Exception {
OperationOutcome conf = new OperationOutcome();
conf.getText().setDivAsString("OK!");
final String respString = ourCtx.newJsonParser().encodeResourceToString(conf);
ArgumentCaptor<HttpUriRequest> capt = ArgumentCaptor.forClass(HttpUriRequest.class);
when(myHttpClient.execute(capt.capture())).thenReturn(myHttpResponse);
when(myHttpResponse.getStatusLine()).thenReturn(new BasicStatusLine(new ProtocolVersion("HTTP", 1, 1), 200, "OK"));
when(myHttpResponse.getEntity().getContentType()).thenReturn(new BasicHeader("content-type", Constants.CT_FHIR_JSON + "; charset=UTF-8"));
when(myHttpResponse.getEntity().getContent()).then(new Answer<InputStream>() {
@Override
public InputStream answer(InvocationOnMock theInvocation) throws Throwable {
return new ReaderInputStream(new StringReader(respString), Charset.forName("UTF-8"));
}
});
IGenericClient client = ourCtx.newRestfulGenericClient("http://example.com/fhir");
int idx = 0;
String patch = "<?xml version=\"1.0\" encoding=\"UTF-8\"?><diff xmlns:fhir=\"http://hl7.org/fhir\"><replace sel=\"fhir:Patient/fhir:active/@value\">false</replace></diff>";
MethodOutcome outcome = client
.patch()
.withBody(patch)
.withId("Patient/123")
.execute();
assertEquals("http://example.com/fhir/Patient/123", UrlUtil.unescape(capt.getAllValues().get(idx).getURI().toString()));
assertEquals("PATCH", capt.getAllValues().get(0).getRequestLine().getMethod());
assertEquals(patch, extractBodyAsString(capt));
assertEquals(Constants.CT_XML_PATCH, capt.getAllValues().get(idx).getFirstHeader("Content-Type").getValue().replaceAll(";.*", ""));
idx++;
OperationOutcome oo = (OperationOutcome) outcome.getOperationOutcome();
assertThat(oo.getText().getDivAsString(), containsString("OK!"));
}
@Test @Test
public void testPutDoesntForceAllIdsJson() throws Exception { public void testPutDoesntForceAllIdsJson() throws Exception {
IParser p = ourCtx.newJsonParser(); IParser p = ourCtx.newJsonParser();
@ -1152,33 +1128,24 @@ public class GenericClientR4Test {
} }
@Test @Test
public void testSearchWithNullParameters() throws Exception { public void testRevIncludeRecursive() throws ClientProtocolException, IOException {
final String msg = "{\"resourceType\":\"Bundle\",\"id\":null,\"base\":\"http://localhost:57931/fhir/contextDev\",\"total\":1,\"link\":[{\"relation\":\"self\",\"url\":\"http://localhost:57931/fhir/contextDev/Patient?identifier=urn%3AMultiFhirVersionTest%7CtestSubmitPatient01&_format=json\"}],\"entry\":[{\"resource\":{\"resourceType\":\"Patient\",\"id\":\"1\",\"meta\":{\"versionId\":\"1\",\"lastUpdated\":\"2014-12-20T18:41:29.706-05:00\"},\"identifier\":[{\"system\":\"urn:MultiFhirVersionTest\",\"value\":\"testSubmitPatient01\"}]}}]}"; ArgumentCaptor<HttpUriRequest> capt = prepareClientForSearchResponse();
ArgumentCaptor<HttpUriRequest> capt = ArgumentCaptor.forClass(HttpUriRequest.class);
when(myHttpClient.execute(capt.capture())).thenReturn(myHttpResponse);
when(myHttpResponse.getStatusLine()).thenReturn(new BasicStatusLine(new ProtocolVersion("HTTP", 1, 1), 200, "OK"));
when(myHttpResponse.getEntity().getContentType()).thenReturn(new BasicHeader("content-type", Constants.CT_FHIR_JSON + "; charset=UTF-8"));
when(myHttpResponse.getEntity().getContent()).then(new Answer<InputStream>() {
@Override
public InputStream answer(InvocationOnMock theInvocation) throws Throwable {
return new ReaderInputStream(new StringReader(msg), Charset.forName("UTF-8"));
}
});
IGenericClient client = ourCtx.newRestfulGenericClient("http://example.com/fhir"); IGenericClient client = ourCtx.newRestfulGenericClient("http://example.com/fhir");
int idx = 0; int idx = 0;
DateTimeDt now = DateTimeDt.withCurrentTime();
String dateString = now.getValueAsString().substring(0, 10);
client.search() client.search()
.forResource("Patient") .forResource(EpisodeOfCare.class)
.where(Patient.NAME.matches().value((String) null)) .where(EpisodeOfCare.PATIENT.hasId("123"))
.revInclude(Encounter.INCLUDE_EPISODEOFCARE)
.revInclude(Observation.INCLUDE_ENCOUNTER.asRecursive())
.returnBundle(Bundle.class) .returnBundle(Bundle.class)
.execute(); .execute();
assertEquals("http://example.com/fhir/Patient", capt.getAllValues().get(idx).getURI().toString());
assertEquals("http://example.com/fhir/EpisodeOfCare?patient=123&_revinclude=Encounter%3Aepisodeofcare&_revinclude%3Arecurse=Observation%3Aencounter",
capt.getAllValues().get(idx).getURI().toString());
idx++; idx++;
} }
@Test @Test
@ -1530,14 +1497,29 @@ public class GenericClientR4Test {
} }
@Test @Test
public void testSearchForUnknownType() throws Exception { public void testSearchWithMap() throws Exception {
String msg = "{\"resourceType\":\"Bundle\",\"id\":null,\"base\":\"http://localhost:57931/fhir/contextDev\",\"total\":1,\"link\":[{\"relation\":\"self\",\"url\":\"http://localhost:57931/fhir/contextDev/Patient?identifier=urn%3AMultiFhirVersionTest%7CtestSubmitPatient01&_format=json\"}],\"entry\":[{\"resource\":{\"resourceType\":\"Patient\",\"id\":\"1\",\"meta\":{\"versionId\":\"1\",\"lastUpdated\":\"2014-12-20T18:41:29.706-05:00\"},\"identifier\":[{\"system\":\"urn:MultiFhirVersionTest\",\"value\":\"testSubmitPatient01\"}]}}]}";
ArgumentCaptor<HttpUriRequest> capt = ArgumentCaptor.forClass(HttpUriRequest.class);
when(myHttpClient.execute(capt.capture())).thenReturn(myHttpResponse);
when(myHttpResponse.getStatusLine()).thenReturn(new BasicStatusLine(new ProtocolVersion("HTTP", 1, 1), 200, "OK"));
when(myHttpResponse.getEntity().getContentType()).thenReturn(new BasicHeader("content-type", Constants.CT_FHIR_JSON + "; charset=UTF-8"));
when(myHttpResponse.getEntity().getContent()).thenReturn(new ReaderInputStream(new StringReader(msg), Charset.forName("UTF-8")));
IGenericClient client = ourCtx.newRestfulGenericClient("http://example.com/fhir"); IGenericClient client = ourCtx.newRestfulGenericClient("http://example.com/fhir");
try {
client.search(new UriDt("?aaaa")); HashMap<String, List<IQueryParameterType>> params = new HashMap<String, List<IQueryParameterType>>();
fail(); params.put("foo", Arrays.asList((IQueryParameterType) new DateParam("2001")));
} catch (IllegalArgumentException e) { Bundle response = client
assertEquals("Unable to determine the resource type from the given URI: ?aaaa", e.getMessage()); .search()
} .forResource(Patient.class)
.where(params)
.returnBundle(Bundle.class)
.execute();
assertEquals("http://example.com/fhir/Patient?foo=2001", capt.getValue().getURI().toString());
assertEquals(Patient.class, response.getEntry().get(0).getResource().getClass());
} }
@Test @Test
@ -1561,6 +1543,36 @@ public class GenericClientR4Test {
} }
@Test
public void testSearchWithNullParameters() throws Exception {
final String msg = "{\"resourceType\":\"Bundle\",\"id\":null,\"base\":\"http://localhost:57931/fhir/contextDev\",\"total\":1,\"link\":[{\"relation\":\"self\",\"url\":\"http://localhost:57931/fhir/contextDev/Patient?identifier=urn%3AMultiFhirVersionTest%7CtestSubmitPatient01&_format=json\"}],\"entry\":[{\"resource\":{\"resourceType\":\"Patient\",\"id\":\"1\",\"meta\":{\"versionId\":\"1\",\"lastUpdated\":\"2014-12-20T18:41:29.706-05:00\"},\"identifier\":[{\"system\":\"urn:MultiFhirVersionTest\",\"value\":\"testSubmitPatient01\"}]}}]}";
ArgumentCaptor<HttpUriRequest> capt = ArgumentCaptor.forClass(HttpUriRequest.class);
when(myHttpClient.execute(capt.capture())).thenReturn(myHttpResponse);
when(myHttpResponse.getStatusLine()).thenReturn(new BasicStatusLine(new ProtocolVersion("HTTP", 1, 1), 200, "OK"));
when(myHttpResponse.getEntity().getContentType()).thenReturn(new BasicHeader("content-type", Constants.CT_FHIR_JSON + "; charset=UTF-8"));
when(myHttpResponse.getEntity().getContent()).then(new Answer<InputStream>() {
@Override
public InputStream answer(InvocationOnMock theInvocation) throws Throwable {
return new ReaderInputStream(new StringReader(msg), Charset.forName("UTF-8"));
}
});
IGenericClient client = ourCtx.newRestfulGenericClient("http://example.com/fhir");
int idx = 0;
DateTimeDt now = DateTimeDt.withCurrentTime();
String dateString = now.getValueAsString().substring(0, 10);
client.search()
.forResource("Patient")
.where(Patient.NAME.matches().value((String) null))
.returnBundle(Bundle.class)
.execute();
assertEquals("http://example.com/fhir/Patient", capt.getAllValues().get(idx).getURI().toString());
idx++;
}
/** /**
* See #371 * See #371
*/ */

View File

@ -0,0 +1,654 @@
package ca.uhn.fhir.rest.server;
import static ca.uhn.fhir.util.UrlUtil.escape;
import static org.hamcrest.Matchers.containsInAnyOrder;
import static org.hamcrest.Matchers.containsString;
import static org.hamcrest.Matchers.empty;
import static org.hamcrest.Matchers.startsWith;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertThat;
import static org.junit.Assert.assertTrue;
import java.util.*;
import java.util.concurrent.TimeUnit;
import org.apache.commons.io.IOUtils;
import org.apache.http.*;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.*;
import org.apache.http.entity.ByteArrayEntity;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClientBuilder;
import org.apache.http.impl.conn.PoolingHttpClientConnectionManager;
import org.apache.http.message.BasicNameValuePair;
import org.eclipse.jetty.server.Server;
import org.eclipse.jetty.servlet.ServletHandler;
import org.eclipse.jetty.servlet.ServletHolder;
import org.hl7.fhir.r4.model.*;
import org.junit.*;
import ca.uhn.fhir.context.FhirContext;
import ca.uhn.fhir.model.api.Include;
import ca.uhn.fhir.narrative.DefaultThymeleafNarrativeGenerator;
import ca.uhn.fhir.rest.annotation.*;
import ca.uhn.fhir.rest.api.MethodOutcome;
import ca.uhn.fhir.rest.client.api.IGenericClient;
import ca.uhn.fhir.rest.param.*;
import ca.uhn.fhir.util.*;
public class SearchSearchServerDstu1Test {
private static CloseableHttpClient ourClient;
private static FhirContext ourCtx = FhirContext.forR4();
private static IServerAddressStrategy ourDefaultAddressStrategy;
private static StringAndListParam ourLastAndList;
private static Set<Include> ourLastIncludes;
private static final org.slf4j.Logger ourLog = org.slf4j.LoggerFactory.getLogger(SearchSearchServerDstu1Test.class);
private static int ourPort;
private static Server ourServer;
private static RestfulServer ourServlet;
@Before
public void before() {
ourServlet.setServerAddressStrategy(ourDefaultAddressStrategy);
ourLastIncludes = null;
ourLastAndList = null;
}
@Test
public void testEncodeConvertsReferencesToRelative() throws Exception {
HttpGet httpGet = new HttpGet("http://localhost:" + ourPort + "/Patient?_query=searchWithRef");
HttpResponse status = ourClient.execute(httpGet);
String responseContent = IOUtils.toString(status.getEntity().getContent());
IOUtils.closeQuietly(status.getEntity().getContent());
ourLog.info(responseContent);
assertEquals(200, status.getStatusLine().getStatusCode());
Patient patient = (Patient) ourCtx.newXmlParser().parseResource(Bundle.class, responseContent).getEntry().get(0).getResource();
String ref = patient.getManagingOrganization().getReference();
assertEquals("Organization/555", ref);
}
/**
* Try loading the page as a POST just to make sure we get the right error
*/
@Test
public void testGetPagesWithPost() throws Exception {
HttpPost httpPost = new HttpPost("http://localhost:" + ourPort);
List<? extends NameValuePair> parameters = Collections.singletonList(new BasicNameValuePair("_getpages", "AAA"));
httpPost.setEntity(new UrlEncodedFormEntity(parameters));
CloseableHttpResponse status = ourClient.execute(httpPost);
String responseContent = IOUtils.toString(status.getEntity().getContent());
IOUtils.closeQuietly(status.getEntity().getContent());
ourLog.info(responseContent);
assertEquals(400, status.getStatusLine().getStatusCode());
// assertThat(responseContent, containsString("Requests for _getpages must use HTTP GET"));
}
@Test
public void testOmitEmptyOptionalParam() throws Exception {
HttpGet httpGet = new HttpGet("http://localhost:" + ourPort + "/Patient?_id=");
HttpResponse status = ourClient.execute(httpGet);
String responseContent = IOUtils.toString(status.getEntity().getContent());
IOUtils.closeQuietly(status.getEntity().getContent());
assertEquals(200, status.getStatusLine().getStatusCode());
Bundle bundle = ourCtx.newXmlParser().parseResource(Bundle.class, responseContent);
assertEquals(1, bundle.getEntry().size());
Patient p = BundleUtil.toListOfResourcesOfType(ourCtx, bundle, Patient.class).get(0);
assertEquals(null, p.getNameFirstRep().getFamily());
}
@Test
public void testParseEscapedValues() throws Exception {
StringBuilder b = new StringBuilder();
b.append("http://localhost:");
b.append(ourPort);
b.append("/Patient?");
b.append(escape("findPatientWithAndList")).append('=').append(escape("NE\\,NE,NE\\,NE")).append('&');
b.append(escape("findPatientWithAndList")).append('=').append(escape("NE\\\\NE")).append('&');
b.append(escape("findPatientWithAndList:exact")).append('=').append(escape("E\\$E")).append('&');
b.append(escape("findPatientWithAndList:exact")).append('=').append(escape("E\\|E")).append('&');
HttpGet httpGet = new HttpGet(b.toString());
HttpResponse status = ourClient.execute(httpGet);
String responseContent = IOUtils.toString(status.getEntity().getContent());
IOUtils.closeQuietly(status.getEntity().getContent());
ourLog.info(responseContent);
assertEquals(200, status.getStatusLine().getStatusCode());
assertEquals(4, ourLastAndList.getValuesAsQueryTokens().size());
assertEquals(2, ourLastAndList.getValuesAsQueryTokens().get(0).getValuesAsQueryTokens().size());
assertFalse(ourLastAndList.getValuesAsQueryTokens().get(0).getValuesAsQueryTokens().get(0).isExact());
assertEquals("NE,NE", ourLastAndList.getValuesAsQueryTokens().get(0).getValuesAsQueryTokens().get(0).getValue());
assertEquals("NE,NE", ourLastAndList.getValuesAsQueryTokens().get(0).getValuesAsQueryTokens().get(1).getValue());
assertEquals("NE\\NE", ourLastAndList.getValuesAsQueryTokens().get(1).getValuesAsQueryTokens().get(0).getValue());
assertTrue(ourLastAndList.getValuesAsQueryTokens().get(2).getValuesAsQueryTokens().get(0).isExact());
assertEquals("E$E", ourLastAndList.getValuesAsQueryTokens().get(2).getValuesAsQueryTokens().get(0).getValue());
assertEquals("E|E", ourLastAndList.getValuesAsQueryTokens().get(3).getValuesAsQueryTokens().get(0).getValue());
}
@Test
public void testReturnLinks() throws Exception {
HttpGet httpGet = new HttpGet("http://localhost:" + ourPort + "/Patient?_query=findWithLinks");
CloseableHttpResponse status = ourClient.execute(httpGet);
String responseContent = IOUtils.toString(status.getEntity().getContent());
IOUtils.closeQuietly(status.getEntity().getContent());
assertEquals(200, status.getStatusLine().getStatusCode());
Bundle bundle = ourCtx.newXmlParser().parseResource(Bundle.class, responseContent);
assertEquals(10, bundle.getEntry().size());
Patient p = BundleUtil.toListOfResourcesOfType(ourCtx, bundle, Patient.class).get(0);
assertEquals("AAANamed", p.getIdentifierFirstRep().getValue());
}
/**
* #149
*/
@Test
public void testReturnLinksWithAddressStrategy() throws Exception {
ourServlet.setServerAddressStrategy(new HardcodedServerAddressStrategy("https://blah.com/base"));
HttpGet httpGet = new HttpGet("http://localhost:" + ourPort + "/Patient?_query=findWithLinks");
CloseableHttpResponse status = ourClient.execute(httpGet);
String responseContent = IOUtils.toString(status.getEntity().getContent());
IOUtils.closeQuietly(status.getEntity().getContent());
assertEquals(200, status.getStatusLine().getStatusCode());
Bundle bundle = ourCtx.newXmlParser().parseResource(Bundle.class, responseContent);
ourLog.info(responseContent);
assertEquals(10, bundle.getEntry().size());
assertEquals("https://blah.com/base/Patient?_query=findWithLinks", bundle.getLink("self").getUrl());
Patient p = BundleUtil.toListOfResourcesOfType(ourCtx, bundle, Patient.class).get(0);
assertEquals("AAANamed", p.getIdentifierFirstRep().getValue());
String linkNext = bundle.getLink("next").getUrl();
ourLog.info(linkNext);
assertThat(linkNext, startsWith("https://blah.com/base?_getpages="));
/*
* Load the second page
*/
String urlPart = linkNext.substring(linkNext.indexOf('?'));
String link = "http://localhost:" + ourPort + urlPart;
httpGet = new HttpGet(link);
status = ourClient.execute(httpGet);
responseContent = IOUtils.toString(status.getEntity().getContent());
IOUtils.closeQuietly(status.getEntity().getContent());
assertEquals(200, status.getStatusLine().getStatusCode());
bundle = ourCtx.newXmlParser().parseResource(Bundle.class, responseContent);
ourLog.info(responseContent);
assertEquals(10, bundle.getEntry().size());
assertEquals(linkNext, bundle.getLink("self").getUrl());
p = BundleUtil.toListOfResourcesOfType(ourCtx, bundle, Patient.class).get(0);
assertEquals("AAANamed", p.getIdentifierFirstRep().getValue());
}
@Test
public void testSearchById() throws Exception {
HttpGet httpGet = new HttpGet("http://localhost:" + ourPort + "/Patient?_id=aaa");
HttpResponse status = ourClient.execute(httpGet);
String responseContent = IOUtils.toString(status.getEntity().getContent());
IOUtils.closeQuietly(status.getEntity().getContent());
assertEquals(200, status.getStatusLine().getStatusCode());
Bundle bundle = ourCtx.newXmlParser().parseResource(Bundle.class, responseContent);
assertEquals(1, bundle.getEntry().size());
Patient p = BundleUtil.toListOfResourcesOfType(ourCtx, bundle, Patient.class).get(0);
assertEquals("idaaa", p.getNameFirstRep().getFamily());
}
@Test
public void testSearchByIdUsingClient() throws Exception {
IGenericClient client = ourCtx.newRestfulGenericClient("http://localhost:" + ourPort);
Bundle bundle = client
.search()
.forResource("Patient")
.where(BaseResource.RES_ID.exactly().code("aaa"))
.returnBundle(Bundle.class)
.execute();
assertEquals(1, bundle.getEntry().size());
Patient p = BundleUtil.toListOfResourcesOfType(ourCtx, bundle, Patient.class).get(0);
assertEquals("idaaa", p.getNameFirstRep().getFamily());
}
@Test
public void testSearchByPost() throws Exception {
HttpPost filePost = new HttpPost("http://localhost:" + ourPort + "/Patient/_search");
// add parameters to the post method
List<NameValuePair> parameters = new ArrayList<NameValuePair>();
parameters.add(new BasicNameValuePair("_id", "aaa"));
UrlEncodedFormEntity sendentity = new UrlEncodedFormEntity(parameters, "UTF-8");
filePost.setEntity(sendentity);
HttpResponse status = ourClient.execute(filePost);
String responseContent = IOUtils.toString(status.getEntity().getContent());
IOUtils.closeQuietly(status.getEntity().getContent());
assertEquals(200, status.getStatusLine().getStatusCode());
Bundle bundle = ourCtx.newXmlParser().parseResource(Bundle.class, responseContent);
assertEquals(1, bundle.getEntry().size());
Patient p = BundleUtil.toListOfResourcesOfType(ourCtx, bundle, Patient.class).get(0);
assertEquals("idaaa", p.getNameFirstRep().getFamily());
}
/**
* See #164
*/
@Test
public void testSearchByPostWithInvalidPostUrl() throws Exception {
HttpPost filePost = new HttpPost("http://localhost:" + ourPort + "/Patient?name=Central"); // should end with
// _search
// add parameters to the post method
List<NameValuePair> parameters = new ArrayList<NameValuePair>();
parameters.add(new BasicNameValuePair("_id", "aaa"));
UrlEncodedFormEntity sendentity = new UrlEncodedFormEntity(parameters, "UTF-8");
filePost.setEntity(sendentity);
HttpResponse status = ourClient.execute(filePost);
String responseContent = IOUtils.toString(status.getEntity().getContent());
IOUtils.closeQuietly(status.getEntity().getContent());
ourLog.info(responseContent);
assertEquals(400, status.getStatusLine().getStatusCode());
assertThat(responseContent, containsString(
"<diagnostics value=\"Incorrect Content-Type header value of &quot;application/x-www-form-urlencoded; charset=UTF-8&quot; was provided in the request. A FHIR Content-Type is required for &quot;CREATE&quot; operation\"/>"));
}
/**
* See #164
*/
@Test
public void testSearchByPostWithMissingContentType() throws Exception {
HttpPost filePost = new HttpPost("http://localhost:" + ourPort + "/Patient?name=Central"); // should end with
// _search
HttpEntity sendentity = new ByteArrayEntity(new byte[] { 1, 2, 3, 4 });
filePost.setEntity(sendentity);
HttpResponse status = ourClient.execute(filePost);
String responseContent = IOUtils.toString(status.getEntity().getContent());
IOUtils.closeQuietly(status.getEntity().getContent());
ourLog.info(responseContent);
assertEquals(400, status.getStatusLine().getStatusCode());
assertThat(responseContent, containsString("<diagnostics value=\"No Content-Type header was provided in the request. This is required for &quot;CREATE&quot; operation\"/>"));
}
/**
* See #164
*/
@Test
public void testSearchByPostWithParamsInBodyAndUrl() throws Exception {
HttpPost filePost = new HttpPost("http://localhost:" + ourPort + "/Patient/_search?name=Central");
// add parameters to the post method
List<NameValuePair> parameters = new ArrayList<NameValuePair>();
parameters.add(new BasicNameValuePair("_id", "aaa"));
UrlEncodedFormEntity sendentity = new UrlEncodedFormEntity(parameters, "UTF-8");
filePost.setEntity(sendentity);
HttpResponse status = ourClient.execute(filePost);
String responseContent = IOUtils.toString(status.getEntity().getContent());
IOUtils.closeQuietly(status.getEntity().getContent());
ourLog.info(responseContent);
assertEquals(200, status.getStatusLine().getStatusCode());
Bundle bundle = ourCtx.newXmlParser().parseResource(Bundle.class, responseContent);
assertEquals(1, bundle.getEntry().size());
Patient p = BundleUtil.toListOfResourcesOfType(ourCtx, bundle, Patient.class).get(0);
assertEquals("idaaa", p.getName().get(0).getFamily());
assertEquals("nameCentral", p.getName().get(1).getGiven().get(0).getValue());
}
@Test
public void testSearchCompartment() throws Exception {
HttpGet httpGet = new HttpGet("http://localhost:" + ourPort + "/Patient/123/fooCompartment");
HttpResponse status = ourClient.execute(httpGet);
String responseContent = IOUtils.toString(status.getEntity().getContent());
ourLog.info(responseContent);
IOUtils.closeQuietly(status.getEntity().getContent());
assertEquals(200, status.getStatusLine().getStatusCode());
Bundle bundle = ourCtx.newXmlParser().parseResource(Bundle.class, responseContent);
assertEquals(1, bundle.getEntry().size());
Patient p = BundleUtil.toListOfResourcesOfType(ourCtx, bundle, Patient.class).get(0);
assertEquals("fooCompartment", p.getIdentifierFirstRep().getValue());
assertThat(bundle.getEntry().get(0).getResource().getIdElement().getValue(), containsString("Patient/123"));
}
@Test
public void testSearchGetWithUnderscoreSearch() throws Exception {
HttpGet httpGet = new HttpGet("http://localhost:" + ourPort + "/Observation/_search?subject%3APatient=100&name=3141-9%2C8302-2%2C8287-5%2C39156-5");
HttpResponse status = ourClient.execute(httpGet);
String responseContent = IOUtils.toString(status.getEntity().getContent());
IOUtils.closeQuietly(status.getEntity().getContent());
assertEquals(200, status.getStatusLine().getStatusCode());
Bundle bundle = ourCtx.newXmlParser().parseResource(Bundle.class, responseContent);
assertEquals(1, bundle.getEntry().size());
Observation p = BundleUtil.toListOfResourcesOfType(ourCtx, bundle, Observation.class).get(0);
assertEquals("Patient/100", p.getSubject().getReference().toString());
assertEquals(4, p.getCode().getCoding().size());
assertEquals("3141-9", p.getCode().getCoding().get(0).getCode());
assertEquals("8302-2", p.getCode().getCoding().get(1).getCode());
}
@Test
public void testSearchIncludesParametersIncludes() throws Exception {
HttpGet httpGet = new HttpGet("http://localhost:" + ourPort + "/Patient?_query=searchIncludes&_include=foo&_include:recurse=bar");
CloseableHttpResponse status = ourClient.execute(httpGet);
IOUtils.toString(status.getEntity().getContent());
IOUtils.closeQuietly(status.getEntity().getContent());
assertEquals(200, status.getStatusLine().getStatusCode());
assertEquals(2, ourLastIncludes.size());
assertThat(ourLastIncludes, containsInAnyOrder(new Include("foo", false), new Include("bar", true)));
}
@Test
public void testSearchIncludesParametersIncludesList() throws Exception {
HttpGet httpGet = new HttpGet("http://localhost:" + ourPort + "/Patient?_query=searchIncludesList&_include=foo&_include:recurse=bar");
CloseableHttpResponse status = ourClient.execute(httpGet);
IOUtils.toString(status.getEntity().getContent());
IOUtils.closeQuietly(status.getEntity().getContent());
assertEquals(200, status.getStatusLine().getStatusCode());
assertEquals(2, ourLastIncludes.size());
assertThat(ourLastIncludes, containsInAnyOrder(new Include("foo", false), new Include("bar", true)));
}
@Test
public void testSearchIncludesParametersNone() throws Exception {
HttpGet httpGet = new HttpGet("http://localhost:" + ourPort + "/Patient?_query=searchIncludes");
CloseableHttpResponse status = ourClient.execute(httpGet);
IOUtils.toString(status.getEntity().getContent());
IOUtils.closeQuietly(status.getEntity().getContent());
assertEquals(200, status.getStatusLine().getStatusCode());
assertThat(ourLastIncludes, empty());
}
@Test
public void testSearchWithOrList() throws Exception {
HttpGet httpGet = new HttpGet("http://localhost:" + ourPort + "/Patient?findPatientWithOrList=aaa,bbb");
HttpResponse status = ourClient.execute(httpGet);
String responseContent = IOUtils.toString(status.getEntity().getContent());
IOUtils.closeQuietly(status.getEntity().getContent());
assertEquals(200, status.getStatusLine().getStatusCode());
Bundle bundle = ourCtx.newXmlParser().parseResource(Bundle.class, responseContent);
assertEquals(1, bundle.getEntry().size());
Patient p = BundleUtil.toListOfResourcesOfType(ourCtx, bundle, Patient.class).get(0);
assertEquals("aaa", p.getIdentifier().get(0).getValue());
assertEquals("bbb", p.getIdentifier().get(1).getValue());
}
@Test
public void testSearchWithTokenParameter() throws Exception {
String token = UrlUtil.escape("http://www.dmix.gov/vista/2957|301");
HttpGet httpGet = new HttpGet("http://localhost:" + ourPort + "/Patient?tokenParam=" + token);
HttpResponse status = ourClient.execute(httpGet);
String responseContent = IOUtils.toString(status.getEntity().getContent());
IOUtils.closeQuietly(status.getEntity().getContent());
assertEquals(200, status.getStatusLine().getStatusCode());
Bundle bundle = ourCtx.newXmlParser().parseResource(Bundle.class, responseContent);
assertEquals(1, bundle.getEntry().size());
Patient p = BundleUtil.toListOfResourcesOfType(ourCtx, bundle, Patient.class).get(0);
assertEquals("http://www.dmix.gov/vista/2957", p.getNameFirstRep().getFamily());
assertEquals("301", p.getNameFirstRep().getGivenAsSingleString());
}
@Test
public void testSpecificallyNamedQueryGetsPrecedence() throws Exception {
HttpGet httpGet = new HttpGet("http://localhost:" + ourPort + "/Patient?AAA=123");
HttpResponse status = ourClient.execute(httpGet);
String responseContent = IOUtils.toString(status.getEntity().getContent());
IOUtils.closeQuietly(status.getEntity().getContent());
assertEquals(200, status.getStatusLine().getStatusCode());
Bundle bundle = ourCtx.newXmlParser().parseResource(Bundle.class, responseContent);
assertEquals(1, bundle.getEntry().size());
Patient p = BundleUtil.toListOfResourcesOfType(ourCtx, bundle, Patient.class).get(0);
assertEquals("AAA", p.getIdentifierFirstRep().getValue());
// Now the named query
httpGet = new HttpGet("http://localhost:" + ourPort + "/Patient?_query=findPatientByAAA&AAA=123");
status = ourClient.execute(httpGet);
responseContent = IOUtils.toString(status.getEntity().getContent());
IOUtils.closeQuietly(status.getEntity().getContent());
assertEquals(200, status.getStatusLine().getStatusCode());
bundle = ourCtx.newXmlParser().parseResource(Bundle.class, responseContent);
assertEquals(1, bundle.getEntry().size());
p = BundleUtil.toListOfResourcesOfType(ourCtx, bundle, Patient.class).get(0);
assertEquals("AAANamed", p.getIdentifierFirstRep().getValue());
}
@AfterClass
public static void afterClassClearContext() throws Exception {
ourServer.stop();
TestUtil.clearAllStaticFieldsForUnitTest();
}
@BeforeClass
public static void beforeClass() throws Exception {
ourPort = PortUtil.findFreePort();
ourServer = new Server(ourPort);
DummyPatientResourceProvider patientProvider = new DummyPatientResourceProvider();
ServletHandler proxyHandler = new ServletHandler();
ourServlet = new RestfulServer(ourCtx);
ourServlet.getFhirContext().setNarrativeGenerator(new DefaultThymeleafNarrativeGenerator());
ourServlet.setPagingProvider(new FifoMemoryPagingProvider(10).setDefaultPageSize(10));
ourServlet.setResourceProviders(patientProvider, new DummyObservationResourceProvider());
ServletHolder servletHolder = new ServletHolder(ourServlet);
proxyHandler.addServletWithMapping(servletHolder, "/*");
ourServer.setHandler(proxyHandler);
ourServer.start();
PoolingHttpClientConnectionManager connectionManager = new PoolingHttpClientConnectionManager(5000, TimeUnit.MILLISECONDS);
HttpClientBuilder builder = HttpClientBuilder.create();
builder.setConnectionManager(connectionManager);
ourClient = builder.build();
ourDefaultAddressStrategy = ourServlet.getServerAddressStrategy();
}
public static class DummyObservationResourceProvider implements IResourceProvider {
@Override
public Class<Observation> getResourceType() {
return Observation.class;
}
@Search
public Observation search(@RequiredParam(name = "subject") ReferenceParam theSubject, @RequiredParam(name = "name") TokenOrListParam theName) {
Observation o = new Observation();
o.setId("1");
o.getSubject().setReference(theSubject.getResourceType() + "/" + theSubject.getIdPart());
for (TokenParam next : theName.getValuesAsQueryTokens()) {
o.getCode().addCoding().setSystem(next.getSystem()).setCode(next.getValue());
}
return o;
}
}
public static class DummyPatientResourceProvider implements IResourceProvider {
@Search(compartmentName = "fooCompartment")
public List<Patient> compartment(@IdParam IdType theId) {
ArrayList<Patient> retVal = new ArrayList<Patient>();
Patient patient = new Patient();
patient.setId(theId);
patient.addIdentifier().setSystem("system").setValue("fooCompartment");
retVal.add(patient);
return retVal;
}
/**
* Only needed for #164
*/
@Create
public MethodOutcome create(@ResourceParam Patient thePatient) {
throw new IllegalArgumentException();
}
@Search
public List<Patient> findPatient(@RequiredParam(name = "_id") StringParam theParam, @OptionalParam(name = "name") StringParam theName) {
ArrayList<Patient> retVal = new ArrayList<Patient>();
Patient patient = new Patient();
patient.setId("1");
patient.addIdentifier().setSystem("system").setValue("identifier123");
if (theParam != null) {
patient.addName().setFamily("id" + theParam.getValue());
if (theName != null) {
patient.addName().addGiven("name" + theName.getValue());
}
}
retVal.add(patient);
return retVal;
}
@Search
public List<Patient> findPatientByAAA01(@RequiredParam(name = "AAA") StringParam theParam) {
ArrayList<Patient> retVal = new ArrayList<Patient>();
Patient patient = new Patient();
patient.setId("1");
patient.addIdentifier().setSystem("system").setValue("AAA");
retVal.add(patient);
return retVal;
}
@Search(queryName = "findPatientByAAA")
public List<Patient> findPatientByAAA02Named(@OptionalParam(name = "AAA") StringParam theParam) {
ArrayList<Patient> retVal = new ArrayList<Patient>();
Patient patient = new Patient();
patient.setId("1");
patient.addIdentifier().setSystem("system").setValue( "AAANamed");
retVal.add(patient);
return retVal;
}
@Search()
public List<Patient> findPatientWithAndList(@RequiredParam(name = "findPatientWithAndList") StringAndListParam theParam) {
ourLastAndList = theParam;
ArrayList<Patient> retVal = new ArrayList<Patient>();
return retVal;
}
@Search()
public List<Patient> findPatientWithOrList(@RequiredParam(name = "findPatientWithOrList") StringOrListParam theParam) {
ArrayList<Patient> retVal = new ArrayList<Patient>();
Patient patient = new Patient();
patient.setId("1");
for (StringParam next : theParam.getValuesAsQueryTokens()) {
patient.addIdentifier().setSystem("system").setValue( next.getValue());
}
retVal.add(patient);
return retVal;
}
@Search()
public List<Patient> findPatientWithToken(@RequiredParam(name = "tokenParam") TokenParam theParam) {
ArrayList<Patient> retVal = new ArrayList<Patient>();
Patient patient = new Patient();
patient.setId("1");
patient.addName().setFamily(theParam.getSystem()).addGiven(theParam.getValue());
retVal.add(patient);
return retVal;
}
@Search(queryName = "findWithLinks")
public List<Patient> findWithLinks() {
ArrayList<Patient> retVal = new ArrayList<Patient>();
for (int i = 1; i <= 20; i++) {
Patient patient = new Patient();
patient.setId("" + i);
patient.addIdentifier().setSystem("system").setValue( "AAANamed");
retVal.add(patient);
}
return retVal;
}
@Override
public Class<Patient> getResourceType() {
return Patient.class;
}
@Search(queryName = "searchIncludes")
public List<Patient> searchIncludes(@IncludeParam Set<Include> theIncludes) {
ourLastIncludes = theIncludes;
ArrayList<Patient> retVal = new ArrayList<Patient>();
return retVal;
}
@Search(queryName = "searchIncludesList")
public List<Patient> searchIncludesList(@IncludeParam List<Include> theIncludes) {
if (theIncludes != null) {
ourLastIncludes = new HashSet<Include>(theIncludes);
}
ArrayList<Patient> retVal = new ArrayList<Patient>();
return retVal;
}
@Search(queryName = "searchWithRef")
public Patient searchWithRef() {
Patient patient = new Patient();
patient.setId("Patient/1/_history/1");
patient.getManagingOrganization().setReference("http://localhost:" + ourPort + "/Organization/555/_history/666");
return patient;
}
}
}

View File

@ -0,0 +1,30 @@
<configuration>
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} [%file:%line] - %msg%n
</pattern>
</encoder>
</appender>
<logger name="org.eclipse" additivity="false" level="info">
<appender-ref ref="STDOUT" />
</logger>
<logger name="org.apache" additivity="false" level="info">
<appender-ref ref="STDOUT" />
</logger>
<logger name="org.thymeleaf" additivity="false" level="warn">
<appender-ref ref="STDOUT" />
</logger>
<!--
<logger name="ca.uhn.fhir.rest.client" additivity="false" level="trace">
<appender-ref ref="STDOUT" />
</logger>
-->
<root level="info">
<appender-ref ref="STDOUT" />
</root>
</configuration>

View File

@ -5,7 +5,6 @@ import java.util.List;
import org.hl7.fhir.instance.model.api.IBaseResource; import org.hl7.fhir.instance.model.api.IBaseResource;
import org.hl7.fhir.utilities.validation.ValidationMessage; import org.hl7.fhir.utilities.validation.ValidationMessage;
import ca.uhn.fhir.model.api.Bundle;
import ca.uhn.fhir.validation.*; import ca.uhn.fhir.validation.*;
/** /**
@ -39,11 +38,6 @@ abstract class BaseValidatorBridge implements IValidatorModule {
protected abstract List<ValidationMessage> validate(IValidationContext<?> theCtx); protected abstract List<ValidationMessage> validate(IValidationContext<?> theCtx);
@Override
public void validateBundle(IValidationContext<Bundle> theCtx) {
doValidate(theCtx);
}
@Override @Override
public void validateResource(IValidationContext<IBaseResource> theCtx) { public void validateResource(IValidationContext<IBaseResource> theCtx) {
doValidate(theCtx); doValidate(theCtx);

View File

@ -5,11 +5,7 @@ import java.util.List;
import org.hl7.fhir.instance.model.api.IBaseResource; import org.hl7.fhir.instance.model.api.IBaseResource;
import org.hl7.fhir.utilities.validation.ValidationMessage; import org.hl7.fhir.utilities.validation.ValidationMessage;
import ca.uhn.fhir.model.api.Bundle; import ca.uhn.fhir.validation.*;
import ca.uhn.fhir.validation.IValidationContext;
import ca.uhn.fhir.validation.IValidatorModule;
import ca.uhn.fhir.validation.ResultSeverityEnum;
import ca.uhn.fhir.validation.SingleValidationMessage;
/** /**
* Base class for a bridge between the RI validation tools and HAPI * Base class for a bridge between the RI validation tools and HAPI
@ -42,11 +38,6 @@ abstract class BaseValidatorBridge implements IValidatorModule {
protected abstract List<ValidationMessage> validate(IValidationContext<?> theCtx); protected abstract List<ValidationMessage> validate(IValidationContext<?> theCtx);
@Override
public void validateBundle(IValidationContext<Bundle> theCtx) {
doValidate(theCtx);
}
@Override @Override
public void validateResource(IValidationContext<IBaseResource> theCtx) { public void validateResource(IValidationContext<IBaseResource> theCtx) {
doValidate(theCtx); doValidate(theCtx);

View File

@ -265,11 +265,6 @@ public class Dstu2BundleFactory implements IVersionSpecificBundleFactory {
} }
} }
@Override
public ca.uhn.fhir.model.api.Bundle getDstu1Bundle() {
return null;
}
@Override @Override
public IResource getResourceBundle() { public IResource getResourceBundle() {
return myBundle; return myBundle;

View File

@ -1,23 +1,8 @@
package ca.uhn.fhir.tinder; package ca.uhn.fhir.tinder;
import java.io.File; import java.io.*;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.FileReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.nio.charset.Charset; import java.nio.charset.Charset;
import java.util.Collection; import java.util.*;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.TreeMap;
import org.apache.commons.io.IOUtils; import org.apache.commons.io.IOUtils;
import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.StringUtils;
@ -28,23 +13,17 @@ import org.apache.velocity.app.VelocityEngine;
import org.apache.velocity.tools.generic.EscapeTool; import org.apache.velocity.tools.generic.EscapeTool;
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.BundleEntry;
import ca.uhn.fhir.model.dstu.resource.ValueSet; import ca.uhn.fhir.model.dstu.resource.ValueSet;
import ca.uhn.fhir.model.dstu.resource.ValueSet.ComposeInclude; import ca.uhn.fhir.model.dstu.resource.ValueSet.ComposeInclude;
import ca.uhn.fhir.model.dstu.resource.ValueSet.Define; import ca.uhn.fhir.model.dstu.resource.ValueSet.Define;
import ca.uhn.fhir.model.dstu.resource.ValueSet.DefineConcept; import ca.uhn.fhir.model.dstu.resource.ValueSet.DefineConcept;
import ca.uhn.fhir.model.dstu2.resource.Bundle.Entry; import ca.uhn.fhir.model.dstu2.resource.Bundle.Entry;
import ca.uhn.fhir.model.dstu2.resource.ValueSet.CodeSystem; import ca.uhn.fhir.model.dstu2.resource.ValueSet.*;
import ca.uhn.fhir.model.dstu2.resource.ValueSet.CodeSystemConcept;
import ca.uhn.fhir.model.dstu2.resource.ValueSet.ComposeIncludeConcept;
import ca.uhn.fhir.model.primitive.CodeDt; import ca.uhn.fhir.model.primitive.CodeDt;
import ca.uhn.fhir.parser.IParser; import ca.uhn.fhir.parser.IParser;
import ca.uhn.fhir.parser.LenientErrorHandler; import ca.uhn.fhir.parser.LenientErrorHandler;
import ca.uhn.fhir.tinder.TinderStructuresMojo.ValueSetFileDefinition; import ca.uhn.fhir.tinder.TinderStructuresMojo.ValueSetFileDefinition;
import ca.uhn.fhir.tinder.model.BaseRootType;
import ca.uhn.fhir.tinder.model.ValueSetTm; import ca.uhn.fhir.tinder.model.ValueSetTm;
import ca.uhn.fhir.tinder.parser.ResourceGeneratorUsingSpreadsheet;
import ca.uhn.fhir.tinder.parser.TargetType; import ca.uhn.fhir.tinder.parser.TargetType;
public class ValueSetGenerator { public class ValueSetGenerator {
@ -126,18 +105,14 @@ public class ValueSetGenerator {
throw new FileNotFoundException(name); throw new FileNotFoundException(name);
} }
String vs = IOUtils.toString(is, Charset.defaultCharset()); String vs = IOUtils.toString(is, Charset.defaultCharset());
if ("dstu".equals(myVersion)) { if ("dstu2".equals(myVersion)) {
Bundle bundle = newXmlParser.parseBundle(vs);
for (BundleEntry next : bundle.getEntries()) {
ValueSet nextVs = (ValueSet) next.getResource();
parseValueSet(nextVs);
}
} else {
ca.uhn.fhir.model.dstu2.resource.Bundle bundle = newXmlParser.parseResource(ca.uhn.fhir.model.dstu2.resource.Bundle.class, vs); ca.uhn.fhir.model.dstu2.resource.Bundle bundle = newXmlParser.parseResource(ca.uhn.fhir.model.dstu2.resource.Bundle.class, vs);
for (Entry nextEntry : bundle.getEntry()) { for (Entry nextEntry : bundle.getEntry()) {
ca.uhn.fhir.model.dstu2.resource.ValueSet nextVs = (ca.uhn.fhir.model.dstu2.resource.ValueSet) nextEntry.getResource(); ca.uhn.fhir.model.dstu2.resource.ValueSet nextVs = (ca.uhn.fhir.model.dstu2.resource.ValueSet) nextEntry.getResource();
parseValueSet(nextVs); parseValueSet(nextVs);
} }
} else {
throw new IllegalStateException("Fhir version not supported");
} }
if (myResourceValueSetFiles != null) { if (myResourceValueSetFiles != null) {

View File

@ -18,6 +18,10 @@
being used in Bundle.entry.request.url as a part of the conditional URL being used in Bundle.entry.request.url as a part of the conditional URL
within transactions. within transactions.
</action> </action>
<action type="fix">
Schematron validator now applies invariants to resources within a Bundle, not
just to the outer Bundle resource itself
</action>
</release </release
<release version="2.6" date="TBD"> <release version="2.6" date="TBD">
<action type="add"> <action type="add">