Clean up ResourceMetadataKeyEnum (#4425)

* Clean up ResourceMetadataKeyEnum

* Compile fix

* Test fix

* Test fix

* Change

* Test fixes
This commit is contained in:
James Agnew 2023-01-12 11:22:40 -05:00 committed by GitHub
parent 7a31860376
commit d0a77f4322
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
24 changed files with 202 additions and 576 deletions

View File

@ -27,19 +27,13 @@ import ca.uhn.fhir.model.primitive.InstantDt;
import ca.uhn.fhir.model.valueset.BundleEntrySearchModeEnum; import ca.uhn.fhir.model.valueset.BundleEntrySearchModeEnum;
import ca.uhn.fhir.model.valueset.BundleEntryTransactionMethodEnum; import ca.uhn.fhir.model.valueset.BundleEntryTransactionMethodEnum;
import ca.uhn.fhir.rest.server.exceptions.InternalErrorException; import ca.uhn.fhir.rest.server.exceptions.InternalErrorException;
import org.apache.commons.lang3.StringUtils;
import org.hl7.fhir.instance.model.api.IAnyResource; import org.hl7.fhir.instance.model.api.IAnyResource;
import org.hl7.fhir.instance.model.api.IBaseResource; import org.hl7.fhir.instance.model.api.IBaseResource;
import org.hl7.fhir.instance.model.api.IPrimitiveType; import org.hl7.fhir.instance.model.api.IPrimitiveType;
import java.io.Serializable; import java.io.Serializable;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Date; import java.util.Date;
import java.util.List; import java.util.List;
import java.util.Map;
import static org.apache.commons.lang3.StringUtils.isNotBlank;
/** /**
* Keys in this map refer to <b>resource metadata keys</b>, which are keys used to access information about specific resource instances that live outside of the resource body. Typically, these are * Keys in this map refer to <b>resource metadata keys</b>, which are keys used to access information about specific resource instances that live outside of the resource body. Typically, these are
@ -65,23 +59,6 @@ import static org.apache.commons.lang3.StringUtils.isNotBlank;
*/ */
public abstract class ResourceMetadataKeyEnum<T> implements Serializable { public abstract class ResourceMetadataKeyEnum<T> implements Serializable {
// TODO: JA - Replace all of the various other get/put methods in subclasses with just using the two that are here
public T get(IBaseResource theResource) {
if (theResource instanceof IAnyResource) {
return (T) theResource.getUserData(name());
} else {
return (T) ((IResource)theResource).getResourceMetadata().get(this);
}
}
public void put(IBaseResource theResource, T theValue) {
if (theResource instanceof IAnyResource) {
theResource.setUserData(name(), theValue);
} else {
((IResource)theResource).getResourceMetadata().put(this, theValue);
}
}
/** /**
* If present and populated with a date/time (as an instance of {@link InstantDt}), this value is an indication that the resource is in the deleted state. This key is only used in a limited number * If present and populated with a date/time (as an instance of {@link InstantDt}), this value is an indication that the resource is in the deleted state. This key is only used in a limited number
* of scenarios, such as POSTing transaction bundles to a server, or returning resource history. * of scenarios, such as POSTing transaction bundles to a server, or returning resource history.
@ -89,21 +66,8 @@ public abstract class ResourceMetadataKeyEnum<T> implements Serializable {
* Values for this key are of type <b>{@link InstantDt}</b> * Values for this key are of type <b>{@link InstantDt}</b>
* </p> * </p>
*/ */
public static final ResourceMetadataKeyEnum<IPrimitiveType<Date>> DELETED_AT = new ResourceMetadataKeyEnum<>("DELETED_AT") { public static final ResourceMetadataKeyEnum<IPrimitiveType<Date>> DELETED_AT = new ResourceMetadataKeyEnum<>("DELETED_AT", IPrimitiveType.class) {
private static final long serialVersionUID = 1L;
@Override
public IPrimitiveType<Date> get(IResource theResource) {
return (IPrimitiveType<Date>) theResource.getResourceMetadata().get(this);
}
@Override
public void put(IResource theResource, IPrimitiveType<Date> theObject) {
theResource.getResourceMetadata().put(this, theObject);
}
}; };
/** /**
* If present and populated with a {@link BundleEntrySearchModeEnum}, contains the "bundle entry search mode", which is the value of the status field in the Bundle entry containing this resource. * If present and populated with a {@link BundleEntrySearchModeEnum}, contains the "bundle entry search mode", which is the value of the status field in the Bundle entry containing this resource.
* The value for this key corresponds to field <code>Bundle.entry.search.mode</code>. This value can be set to provide a status value of "include" for included resources being returned by a * The value for this key corresponds to field <code>Bundle.entry.search.mode</code>. This value can be set to provide a status value of "include" for included resources being returned by a
@ -115,28 +79,7 @@ public abstract class ResourceMetadataKeyEnum<T> implements Serializable {
* Values for this key are of type <b>{@link BundleEntrySearchModeEnum}</b> * Values for this key are of type <b>{@link BundleEntrySearchModeEnum}</b>
* </p> * </p>
*/ */
public static final ResourceMetadataKeySupportingAnyResource<BundleEntrySearchModeEnum, String> ENTRY_SEARCH_MODE = new ResourceMetadataKeySupportingAnyResource<BundleEntrySearchModeEnum, String>("ENTRY_SEARCH_MODE") { public static final ResourceMetadataKeyEnum<BundleEntrySearchModeEnum> ENTRY_SEARCH_MODE = new ResourceMetadataKeyEnum<>("ENTRY_SEARCH_MODE", BundleEntrySearchModeEnum.class) {
private static final long serialVersionUID = 1L;
@Override
public BundleEntrySearchModeEnum get(IResource theResource) {
return getEnumFromMetadataOrNullIfNone(theResource.getResourceMetadata(), ENTRY_SEARCH_MODE, BundleEntrySearchModeEnum.class, BundleEntrySearchModeEnum.VALUESET_BINDER);
}
@Override
public String get(IAnyResource theResource) {
return (String) theResource.getUserData(ENTRY_SEARCH_MODE.name());
}
@Override
public void put(IResource theResource, BundleEntrySearchModeEnum theObject) {
theResource.getResourceMetadata().put(ENTRY_SEARCH_MODE, theObject);
}
@Override
public void put(IAnyResource theResource, String theObject) {
theResource.setUserData(ENTRY_SEARCH_MODE.name(), theObject);
}
}; };
/** /**
* If present and populated with a {@link BundleEntryTransactionMethodEnum}, contains the "bundle entry transaction operation", which is the value of the status field in the Bundle entry * If present and populated with a {@link BundleEntryTransactionMethodEnum}, contains the "bundle entry transaction operation", which is the value of the status field in the Bundle entry
@ -150,33 +93,8 @@ public abstract class ResourceMetadataKeyEnum<T> implements Serializable {
* Values for this key are of type <b>{@link BundleEntryTransactionMethodEnum}</b> * Values for this key are of type <b>{@link BundleEntryTransactionMethodEnum}</b>
* </p> * </p>
*/ */
public static final ResourceMetadataKeySupportingAnyResource<BundleEntryTransactionMethodEnum, String> ENTRY_TRANSACTION_METHOD = new ResourceMetadataKeySupportingAnyResource<BundleEntryTransactionMethodEnum, String>( public static final ResourceMetadataKeyEnum<BundleEntryTransactionMethodEnum> ENTRY_TRANSACTION_METHOD = new ResourceMetadataKeyEnum<>("ENTRY_TRANSACTION_OPERATION", BundleEntryTransactionMethodEnum.class) {
"ENTRY_TRANSACTION_OPERATION") {
private static final long serialVersionUID = 1L;
@Override
public BundleEntryTransactionMethodEnum get(IResource theResource) {
return getEnumFromMetadataOrNullIfNone(theResource.getResourceMetadata(), ENTRY_TRANSACTION_METHOD, BundleEntryTransactionMethodEnum.class,
BundleEntryTransactionMethodEnum.VALUESET_BINDER);
}
@Override
public String get(IAnyResource theResource) {
return (String) theResource.getUserData(ENTRY_TRANSACTION_METHOD.name());
}
@Override
public void put(IResource theResource, BundleEntryTransactionMethodEnum theObject) {
theResource.getResourceMetadata().put(ENTRY_TRANSACTION_METHOD, theObject);
}
@Override
public void put(IAnyResource theResource, String theObject) {
theResource.setUserData(ENTRY_TRANSACTION_METHOD.name(), theObject);
}
}; };
/** /**
* The value for this key represents a {@link List} of profile IDs that this resource claims to conform to. * The value for this key represents a {@link List} of profile IDs that this resource claims to conform to.
* <p> * <p>
@ -184,18 +102,7 @@ public abstract class ResourceMetadataKeyEnum<T> implements Serializable {
* Values for this key are of type <b>List&lt;IdDt&gt;</b>. Note that the returned list is <i>unmodifiable</i>, so you need to create a new list and call <code>put</code> to change its value. * Values for this key are of type <b>List&lt;IdDt&gt;</b>. Note that the returned list is <i>unmodifiable</i>, so you need to create a new list and call <code>put</code> to change its value.
* </p> * </p>
*/ */
public static final ResourceMetadataKeyEnum<List<IdDt>> PROFILES = new ResourceMetadataKeyEnum<List<IdDt>>("PROFILES") { public static final ResourceMetadataKeyEnum<List<IdDt>> PROFILES = new ResourceMetadataKeyEnum<>("PROFILES", List.class) {
private static final long serialVersionUID = 1L;
@Override
public List<IdDt> get(IResource theResource) {
return getIdListFromMetadataOrNullIfNone(theResource.getResourceMetadata(), PROFILES);
}
@Override
public void put(IResource theResource, List<IdDt> theObject) {
theResource.getResourceMetadata().put(PROFILES, theObject);
}
}; };
/** /**
* The value for this key is the bundle entry <b>Published</b> time. This is defined by FHIR as "Time resource copied into the feed", which is generally best left to the current time. * The value for this key is the bundle entry <b>Published</b> time. This is defined by FHIR as "Time resource copied into the feed", which is generally best left to the current time.
@ -208,37 +115,9 @@ public abstract class ResourceMetadataKeyEnum<T> implements Serializable {
* *
* @see InstantDt * @see InstantDt
*/ */
public static final ResourceMetadataKeyEnum<InstantDt> PUBLISHED = new ResourceMetadataKeyEnum<InstantDt>("PUBLISHED") { public static final ResourceMetadataKeyEnum<InstantDt> PUBLISHED = new ResourceMetadataKeyEnum<>("PUBLISHED", InstantDt.class) {
private static final long serialVersionUID = 1L;
@Override
public InstantDt get(IResource theResource) {
return getInstantFromMetadataOrNullIfNone(theResource.getResourceMetadata(), PUBLISHED);
}
@Override
public void put(IResource theResource, InstantDt theObject) {
theResource.getResourceMetadata().put(PUBLISHED, theObject);
}
}; };
public static final ResourceMetadataKeyEnum<List<BaseCodingDt>> SECURITY_LABELS = new ResourceMetadataKeyEnum<List<BaseCodingDt>>("SECURITY_LABELS") { public static final ResourceMetadataKeyEnum<List<BaseCodingDt>> SECURITY_LABELS = new ResourceMetadataKeyEnum<>("SECURITY_LABELS", List.class) {
private static final long serialVersionUID = 1L;
@Override
public List<BaseCodingDt> get(IResource resource) {
Object obj = resource.getResourceMetadata().get(SECURITY_LABELS);
if (obj == null) {
return null;
}
//noinspection unchecked
return (List<BaseCodingDt>) obj;
}
@Override
public void put(IResource iResource, List<BaseCodingDt> labels) {
iResource.getResourceMetadata().put(SECURITY_LABELS, labels);
}
}; };
/** /**
* The value for this key is the list of tags associated with this resource * The value for this key is the list of tags associated with this resource
@ -248,23 +127,7 @@ public abstract class ResourceMetadataKeyEnum<T> implements Serializable {
* *
* @see TagList * @see TagList
*/ */
public static final ResourceMetadataKeyEnum<TagList> TAG_LIST = new ResourceMetadataKeyEnum<TagList>("TAG_LIST") { public static final ResourceMetadataKeyEnum<TagList> TAG_LIST = new ResourceMetadataKeyEnum<>("TAG_LIST", TagList.class) {
private static final long serialVersionUID = 1L;
@Override
public TagList get(IResource theResource) {
Object retValObj = theResource.getResourceMetadata().get(TAG_LIST);
if (retValObj == null) {
return null;
} else {
return (TagList) retValObj;
}
}
@Override
public void put(IResource theResource, TagList theObject) {
theResource.getResourceMetadata().put(TAG_LIST, theObject);
}
}; };
/** /**
* The value for this key is the bundle entry <b>Updated</b> time. This is defined by FHIR as "Last Updated for resource". This value is also used for populating the "Last-Modified" header in the * The value for this key is the bundle entry <b>Updated</b> time. This is defined by FHIR as "Last Updated for resource". This value is also used for populating the "Last-Modified" header in the
@ -275,18 +138,7 @@ public abstract class ResourceMetadataKeyEnum<T> implements Serializable {
* *
* @see InstantDt * @see InstantDt
*/ */
public static final ResourceMetadataKeyEnum<InstantDt> UPDATED = new ResourceMetadataKeyEnum<InstantDt>("UPDATED") { public static final ResourceMetadataKeyEnum<InstantDt> UPDATED = new ResourceMetadataKeyEnum<>("UPDATED", InstantDt.class) {
private static final long serialVersionUID = 1L;
@Override
public InstantDt get(IResource theResource) {
return getInstantFromMetadataOrNullIfNone(theResource.getResourceMetadata(), UPDATED);
}
@Override
public void put(IResource theResource, InstantDt theObject) {
theResource.getResourceMetadata().put(UPDATED, theObject);
}
}; };
/** /**
* The value for this key is the version ID of the resource object. * The value for this key is the version ID of the resource object.
@ -297,18 +149,7 @@ public abstract class ResourceMetadataKeyEnum<T> implements Serializable {
* @deprecated The {@link IResource#getId()} resource ID will now be populated with the version ID via the {@link IdDt#getVersionIdPart()} method * @deprecated The {@link IResource#getId()} resource ID will now be populated with the version ID via the {@link IdDt#getVersionIdPart()} method
*/ */
@Deprecated @Deprecated
public static final ResourceMetadataKeyEnum<String> VERSION = new ResourceMetadataKeyEnum<String>("VERSION") { public static final ResourceMetadataKeyEnum<String> VERSION = new ResourceMetadataKeyEnum<>("VERSION", String.class) {
private static final long serialVersionUID = 1L;
@Override
public String get(IResource theResource) {
return getStringFromMetadataOrNullIfNone(theResource.getResourceMetadata(), VERSION);
}
@Override
public void put(IResource theResource, String theObject) {
theResource.getResourceMetadata().put(VERSION, theObject);
}
}; };
/** /**
* The value for this key is the version ID of the resource object. * The value for this key is the version ID of the resource object.
@ -319,24 +160,48 @@ public abstract class ResourceMetadataKeyEnum<T> implements Serializable {
* @deprecated The {@link IResource#getId()} resource ID will now be populated with the version ID via the {@link IdDt#getVersionIdPart()} method * @deprecated The {@link IResource#getId()} resource ID will now be populated with the version ID via the {@link IdDt#getVersionIdPart()} method
*/ */
@Deprecated @Deprecated
public static final ResourceMetadataKeyEnum<IdDt> VERSION_ID = new ResourceMetadataKeyEnum<IdDt>("VERSION_ID") { public static final ResourceMetadataKeyEnum<IdDt> VERSION_ID = new ResourceMetadataKeyEnum<>("VERSION_ID", IdDt.class) {
private static final long serialVersionUID = 1L;
@Override
public IdDt get(IResource theResource) {
return getIdFromMetadataOrNullIfNone(theResource.getResourceMetadata());
}
@Override
public void put(IResource theResource, IdDt theObject) {
theResource.getResourceMetadata().put(VERSION_ID, theObject);
}
}; };
private static final long serialVersionUID = 1L; private static final long serialVersionUID = 1L;
private final String myValue; private final String myValue;
private final Class<?> myType;
public ResourceMetadataKeyEnum(String theValue) { public ResourceMetadataKeyEnum(String theValue, Class<?> theType) {
myValue = theValue; myValue = theValue;
myType = theType;
}
// TODO: JA - Replace all of the various other get/put methods in subclasses with just using the two that are here
public T get(IBaseResource theResource) {
Object retVal;
if (theResource instanceof IAnyResource) {
retVal = theResource.getUserData(name());
} else {
retVal = ((IResource) theResource).getResourceMetadata().get(this);
}
if (retVal != null && !myType.isAssignableFrom(retVal.getClass())) {
throw new InternalErrorException(Msg.code(1890) + "Found an object of type '" + retVal.getClass().getCanonicalName()
+ "' in resource metadata for key " + this.name() + " - Expected "
+ myType.getCanonicalName());
}
//noinspection unchecked
return (T) retVal;
}
public void put(IBaseResource theResource, T theValue) {
if (theValue != null && !myType.isAssignableFrom(theValue.getClass())) {
throw new InternalErrorException(Msg.code(1891) + "Can not put object of type '" + theValue.getClass().getCanonicalName()
+ "' in resource metadata for key " + this.name() + " - Expected "
+ myType.getCanonicalName());
}
if (theResource instanceof IAnyResource) {
theResource.setUserData(name(), theValue);
} else {
((IResource) theResource).getResourceMetadata().put(this, theValue);
}
} }
@Override @Override
@ -349,15 +214,10 @@ public abstract class ResourceMetadataKeyEnum<T> implements Serializable {
return false; return false;
ResourceMetadataKeyEnum<?> other = (ResourceMetadataKeyEnum<?>) obj; ResourceMetadataKeyEnum<?> other = (ResourceMetadataKeyEnum<?>) obj;
if (myValue == null) { if (myValue == null) {
if (other.myValue != null) return other.myValue == null;
return false; } else return myValue.equals(other.myValue);
} else if (!myValue.equals(other.myValue))
return false;
return true;
} }
public abstract T get(IResource theResource);
@Override @Override
public int hashCode() { public int hashCode() {
final int prime = 31; final int prime = 31;
@ -370,138 +230,9 @@ public abstract class ResourceMetadataKeyEnum<T> implements Serializable {
return myValue; return myValue;
} }
public abstract void put(IResource theResource, T theObject);
public static abstract class ResourceMetadataKeySupportingAnyResource<T, T2> extends ResourceMetadataKeyEnum<T> {
private static final long serialVersionUID = 1L;
public ResourceMetadataKeySupportingAnyResource(String theValue) {
super(theValue);
}
public abstract T2 get(IAnyResource theResource);
public abstract void put(IAnyResource theResource, T2 theObject);
}
public static final class ExtensionResourceMetadataKey extends ResourceMetadataKeyEnum<ExtensionDt> { public static final class ExtensionResourceMetadataKey extends ResourceMetadataKeyEnum<ExtensionDt> {
public ExtensionResourceMetadataKey(String theUrl) { public ExtensionResourceMetadataKey(String theUrl) {
super(theUrl); super(theUrl, ExtensionDt.class);
}
@Override
public ExtensionDt get(IResource theResource) {
Object retValObj = theResource.getResourceMetadata().get(this);
if (retValObj == null) {
return null;
} else if (retValObj instanceof ExtensionDt) {
return (ExtensionDt) retValObj;
}
throw new InternalErrorException(Msg.code(1890) + "Found an object of type '" + retValObj.getClass().getCanonicalName()
+ "' in resource metadata for key " + this.name() + " - Expected "
+ ExtensionDt.class.getCanonicalName());
}
@Override
public void put(IResource theResource, ExtensionDt theObject) {
theResource.getResourceMetadata().put(this, theObject);
} }
} }
@SuppressWarnings("unchecked")
private static <T extends Enum<?>> T getEnumFromMetadataOrNullIfNone(Map<ResourceMetadataKeyEnum<?>, Object> theResourceMetadata, ResourceMetadataKeyEnum<T> theKey, Class<T> theEnumType,
IValueSetEnumBinder<T> theBinder) {
Object retValObj = theResourceMetadata.get(theKey);
if (retValObj == null) {
return null;
} else if (theEnumType.equals(retValObj.getClass())) {
return (T) retValObj;
} else if (retValObj instanceof String) {
return theBinder.fromCodeString((String) retValObj);
}
throw new InternalErrorException(Msg.code(1891) + "Found an object of type '" + retValObj.getClass().getCanonicalName() + "' in resource metadata for key " + theKey.name() + " - Expected "
+ InstantDt.class.getCanonicalName());
}
private static IdDt getIdFromMetadataOrNullIfNone(Map<ResourceMetadataKeyEnum<?>, Object> theResourceMetadata) {
return toId(ResourceMetadataKeyEnum.VERSION_ID, theResourceMetadata.get(ResourceMetadataKeyEnum.VERSION_ID));
}
private static List<IdDt> getIdListFromMetadataOrNullIfNone(Map<ResourceMetadataKeyEnum<?>, Object> theResourceMetadata, ResourceMetadataKeyEnum<?> theKey) {
Object retValObj = theResourceMetadata.get(theKey);
if (retValObj == null) {
return null;
} else if (retValObj instanceof List) {
List<?> retValList = (List<?>) retValObj;
for (Object next : retValList) {
if (!(next instanceof IdDt)) {
List<IdDt> retVal = new ArrayList<IdDt>();
for (Object nextVal : retValList) {
retVal.add(toId(theKey, nextVal));
}
return Collections.unmodifiableList(retVal);
}
}
@SuppressWarnings("unchecked")
List<IdDt> retVal = (List<IdDt>) retValList;
return Collections.unmodifiableList(retVal);
} else {
return Collections.singletonList(toId(theKey, retValObj));
}
}
private static InstantDt getInstantFromMetadataOrNullIfNone(Map<ResourceMetadataKeyEnum<?>, Object> theResourceMetadata, ResourceMetadataKeyEnum<InstantDt> theKey) {
Object retValObj = theResourceMetadata.get(theKey);
if (retValObj == null) {
return null;
} else if (retValObj instanceof Date) {
return new InstantDt((Date) retValObj);
} else if (retValObj instanceof InstantDt) {
if (((InstantDt) retValObj).isEmpty()) {
return null;
}
return (InstantDt) retValObj;
}
throw new InternalErrorException(Msg.code(1892) + "Found an object of type '" + retValObj.getClass().getCanonicalName() + "' in resource metadata for key " + theKey.name() + " - Expected "
+ InstantDt.class.getCanonicalName());
}
private static String getStringFromMetadataOrNullIfNone(Map<ResourceMetadataKeyEnum<?>, Object> theResourceMetadata, ResourceMetadataKeyEnum<String> theKey) {
Object retValObj = theResourceMetadata.get(theKey);
if (retValObj == null) {
return null;
} else if (retValObj instanceof String) {
if (StringUtils.isBlank(((String) retValObj))) {
return null;
}
return (String) retValObj;
}
throw new InternalErrorException(Msg.code(1893) + "Found an object of type '" + retValObj.getClass().getCanonicalName() + "' in resource metadata for key " + theKey.name() + " - Expected "
+ String.class.getCanonicalName());
}
private static IdDt toId(ResourceMetadataKeyEnum<?> theKey, Object retValObj) {
if (retValObj == null) {
return null;
} else if (retValObj instanceof String) {
if (isNotBlank((String) retValObj)) {
return new IdDt((String) retValObj);
}
return null;
} else if (retValObj instanceof IdDt) {
if (((IdDt) retValObj).isEmpty()) {
return null;
}
return (IdDt) retValObj;
} else if (retValObj instanceof Number) {
return new IdDt(retValObj.toString());
}
throw new InternalErrorException(Msg.code(1894) + "Found an object of type '" + retValObj.getClass().getCanonicalName() + "' in resource metadata for key " + theKey.name() + " - Expected "
+ IdDt.class.getCanonicalName());
}
} }

View File

@ -2206,28 +2206,15 @@ public class GenericClient extends BaseClient implements IGenericClient {
Validate.notNull(theResources, "theResources must not be null"); Validate.notNull(theResources, "theResources must not be null");
for (IBaseResource next : theResources) { for (IBaseResource next : theResources) {
String entryMethod = null; BundleEntryTransactionMethodEnum entryMethod = ResourceMetadataKeyEnum.ENTRY_TRANSACTION_METHOD.get(next);
if (next instanceof IResource) {
BundleEntryTransactionMethodEnum entryMethodEnum = ResourceMetadataKeyEnum.ENTRY_TRANSACTION_METHOD.get((IResource) next);
if (entryMethodEnum != null) {
entryMethod = entryMethodEnum.getCode();
}
} else {
entryMethod = ResourceMetadataKeyEnum.ENTRY_TRANSACTION_METHOD.get((IAnyResource) next);
}
if (isBlank(entryMethod)) { if (entryMethod == null) {
if (isBlank(next.getIdElement().getValue())) { if (isBlank(next.getIdElement().getValue())) {
entryMethod = "POST"; entryMethod = BundleEntryTransactionMethodEnum.POST;
} else { } else {
entryMethod = "PUT"; entryMethod = BundleEntryTransactionMethodEnum.PUT;
} }
if (next instanceof IResource) { ResourceMetadataKeyEnum.ENTRY_TRANSACTION_METHOD.put(next, entryMethod);
ResourceMetadataKeyEnum.ENTRY_TRANSACTION_METHOD.put((IResource) next, BundleEntryTransactionMethodEnum.valueOf(entryMethod));
} else {
ResourceMetadataKeyEnum.ENTRY_TRANSACTION_METHOD.put((IAnyResource) next, entryMethod);
}
} }
} }
@ -2305,7 +2292,7 @@ public class GenericClient extends BaseClient implements IGenericClient {
OutcomeResponseHandler binding = new OutcomeResponseHandler(myPrefer); OutcomeResponseHandler binding = new OutcomeResponseHandler(myPrefer);
Map<String, List<String>> params = new HashMap<String, List<String>>(); Map<String, List<String>> params = new HashMap<>();
return invoke(params, binding, invocation); return invoke(params, binding, invocation);
} }
@ -2362,7 +2349,7 @@ public class GenericClient extends BaseClient implements IGenericClient {
@Override @Override
public MethodOutcome execute() { public MethodOutcome execute() {
BaseHttpClientInvocation invocation = ValidateMethodBindingDstu2Plus.createValidateInvocation(myContext, myResource); BaseHttpClientInvocation invocation = ValidateMethodBindingDstu2Plus.createValidateInvocation(myContext, myResource);
ResourceResponseHandler<BaseOperationOutcome> handler = new ResourceResponseHandler<BaseOperationOutcome>(null, null); ResourceResponseHandler<BaseOperationOutcome> handler = new ResourceResponseHandler<>(null, null);
IBaseOperationOutcome outcome = invoke(null, handler, invocation); IBaseOperationOutcome outcome = invoke(null, handler, invocation);
MethodOutcome retVal = new MethodOutcome(); MethodOutcome retVal = new MethodOutcome();
retVal.setOperationOutcome(outcome); retVal.setOperationOutcome(outcome);
@ -2486,7 +2473,7 @@ public class GenericClient extends BaseClient implements IGenericClient {
private static void addParam(Map<String, List<String>> params, String parameterName, String parameterValue) { private static void addParam(Map<String, List<String>> params, String parameterName, String parameterValue) {
if (!params.containsKey(parameterName)) { if (!params.containsKey(parameterName)) {
params.put(parameterName, new ArrayList<String>()); params.put(parameterName, new ArrayList<>());
} }
params.get(parameterName).add(parameterValue); params.get(parameterName).add(parameterValue);
} }

View File

@ -387,7 +387,7 @@ public class JpaStorageResourceParser implements IJpaStorageResourceParser {
retVal = (R) res; retVal = (R) res;
ResourceMetadataKeyEnum.DELETED_AT.put(res, new InstantDt(theEntity.getDeleted())); ResourceMetadataKeyEnum.DELETED_AT.put(res, new InstantDt(theEntity.getDeleted()));
if (theForHistoryOperation) { if (theForHistoryOperation) {
ResourceMetadataKeyEnum.ENTRY_TRANSACTION_METHOD.put(res, Bundle.HTTPVerb.DELETE.toCode()); ResourceMetadataKeyEnum.ENTRY_TRANSACTION_METHOD.put(res, BundleEntryTransactionMethodEnum.DELETE);
} }
} else if (theForHistoryOperation) { } else if (theForHistoryOperation) {
/* /*
@ -396,9 +396,9 @@ public class JpaStorageResourceParser implements IJpaStorageResourceParser {
Date published = theEntity.getPublished().getValue(); Date published = theEntity.getPublished().getValue();
Date updated = theEntity.getUpdated().getValue(); Date updated = theEntity.getUpdated().getValue();
if (published.equals(updated)) { if (published.equals(updated)) {
ResourceMetadataKeyEnum.ENTRY_TRANSACTION_METHOD.put(res, Bundle.HTTPVerb.POST.toCode()); ResourceMetadataKeyEnum.ENTRY_TRANSACTION_METHOD.put(res, BundleEntryTransactionMethodEnum.POST);
} else { } else {
ResourceMetadataKeyEnum.ENTRY_TRANSACTION_METHOD.put(res, Bundle.HTTPVerb.PUT.toCode()); ResourceMetadataKeyEnum.ENTRY_TRANSACTION_METHOD.put(res, BundleEntryTransactionMethodEnum.PUT);
} }
} }

View File

@ -42,9 +42,9 @@ import java.util.stream.Collectors;
public class PersistedJpaSearchFirstPageBundleProvider extends PersistedJpaBundleProvider { public class PersistedJpaSearchFirstPageBundleProvider extends PersistedJpaBundleProvider {
private static final Logger ourLog = LoggerFactory.getLogger(PersistedJpaSearchFirstPageBundleProvider.class); private static final Logger ourLog = LoggerFactory.getLogger(PersistedJpaSearchFirstPageBundleProvider.class);
private SearchTask mySearchTask; private final SearchTask mySearchTask;
private ISearchBuilder mySearchBuilder; private final ISearchBuilder mySearchBuilder;
private Search mySearch; private final Search mySearch;
/** /**
* Constructor * Constructor
@ -105,10 +105,7 @@ public class PersistedJpaSearchFirstPageBundleProvider extends PersistedJpaBundl
} }
private boolean isInclude(IBaseResource theResource) { private boolean isInclude(IBaseResource theResource) {
if (theResource instanceof IAnyResource) { BundleEntrySearchModeEnum searchMode = ResourceMetadataKeyEnum.ENTRY_SEARCH_MODE.get(theResource);
return "include".equals(ResourceMetadataKeyEnum.ENTRY_SEARCH_MODE.get(((IAnyResource) theResource)));
}
BundleEntrySearchModeEnum searchMode = ResourceMetadataKeyEnum.ENTRY_SEARCH_MODE.get(((IResource) theResource));
return BundleEntrySearchModeEnum.INCLUDE.equals(searchMode); return BundleEntrySearchModeEnum.INCLUDE.equals(searchMode);
} }

View File

@ -63,7 +63,6 @@ import ca.uhn.fhir.rest.server.servlet.ServletRequestDetails;
import ca.uhn.fhir.rest.server.util.CompositeInterceptorBroadcaster; import ca.uhn.fhir.rest.server.util.CompositeInterceptorBroadcaster;
import ca.uhn.fhir.rest.server.util.ISearchParamRegistry; import ca.uhn.fhir.rest.server.util.ISearchParamRegistry;
import ca.uhn.fhir.util.AsyncUtil; import ca.uhn.fhir.util.AsyncUtil;
import ca.uhn.fhir.util.ICallable;
import ca.uhn.fhir.util.StopWatch; import ca.uhn.fhir.util.StopWatch;
import ca.uhn.fhir.util.UrlUtil; import ca.uhn.fhir.util.UrlUtil;
import com.google.common.annotations.VisibleForTesting; import com.google.common.annotations.VisibleForTesting;
@ -293,8 +292,10 @@ public class SearchCoordinatorSvcImpl implements ISearchCoordinatorSvc<JpaPid> {
} }
} }
if (!search.getStatus().isDone()) {
AsyncUtil.sleep(500); AsyncUtil.sleep(500);
} }
}
ourLog.trace("Finished looping"); ourLog.trace("Finished looping");

View File

@ -903,18 +903,10 @@ public class SearchBuilder implements ISearchBuilder<JpaPid> {
continue; continue;
} }
if (resource instanceof IResource) {
if (theIncludedPids.contains(resourceId)) { if (theIncludedPids.contains(resourceId)) {
ResourceMetadataKeyEnum.ENTRY_SEARCH_MODE.put((IResource) resource, BundleEntrySearchModeEnum.INCLUDE); ResourceMetadataKeyEnum.ENTRY_SEARCH_MODE.put(resource, BundleEntrySearchModeEnum.INCLUDE);
} else { } else {
ResourceMetadataKeyEnum.ENTRY_SEARCH_MODE.put((IResource) resource, BundleEntrySearchModeEnum.MATCH); ResourceMetadataKeyEnum.ENTRY_SEARCH_MODE.put(resource, BundleEntrySearchModeEnum.MATCH);
}
} else {
if (theIncludedPids.contains(resourceId)) {
ResourceMetadataKeyEnum.ENTRY_SEARCH_MODE.put((IAnyResource) resource, BundleEntrySearchModeEnum.INCLUDE.getCode());
} else {
ResourceMetadataKeyEnum.ENTRY_SEARCH_MODE.put((IAnyResource) resource, BundleEntrySearchModeEnum.MATCH.getCode());
}
} }
theResourceListToPopulate.set(index, resource); theResourceListToPopulate.set(index, resource);

View File

@ -1,46 +0,0 @@
package ca.uhn.fhir.jpa.util;
/*-
* #%L
* HAPI FHIR JPA Server
* %%
* Copyright (C) 2014 - 2023 Smile CDR, Inc.
* %%
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
* #L%
*/
import ca.uhn.fhir.i18n.Msg;
import ca.uhn.fhir.model.api.IResource;
import ca.uhn.fhir.model.api.ResourceMetadataKeyEnum;
import ca.uhn.fhir.util.CoverageIgnore;
final class AllowStatusChangeMetadata extends ResourceMetadataKeyEnum<Object> {
private static final long serialVersionUID = 1;
AllowStatusChangeMetadata(String theValue) {
super(theValue);
}
@CoverageIgnore
@Override
public Object get(IResource theResource) {
throw new UnsupportedOperationException(Msg.code(805));
}
@CoverageIgnore
@Override
public void put(IResource theResource, Object theObject) {
throw new UnsupportedOperationException(Msg.code(806));
}
}

View File

@ -25,24 +25,36 @@ public enum SearchStatusEnum {
/** /**
* The search is currently actively working * The search is currently actively working
*/ */
LOADING, LOADING(false),
/** /**
* The search has loaded a set of results and has stopped searching because it * The search has loaded a set of results and has stopped searching because it
* reached an appropriate threshold * reached an appropriate threshold
*/ */
PASSCMPLET, PASSCMPLET(false),
/** /**
* The search completed normally and loaded all of the results it as permitted to * The search completed normally and loaded all of the results it as permitted to
* load * load
*/ */
FINISHED, FINISHED(true),
/** /**
* The search failed and will not continue * The search failed and will not continue
*/ */
FAILED, FAILED(true),
/** /**
* The search has been expired and will be expunged shortly * The search has been expired and will be expunged shortly
*/ */
GONE GONE(true);
private final boolean myDone;
SearchStatusEnum(boolean theDone) {
myDone = theDone;
}
/**
* Returns true if no more work will happen for this search (finished, failed, gone)
*/
public boolean isDone() {
return myDone;
}
} }

View File

@ -449,6 +449,7 @@ public class SearchCoordinatorSvcImplTest extends BaseSearchSvc{
search.setUuid(uuid); search.setUuid(uuid);
search.setSearchType(SearchTypeEnum.SEARCH); search.setSearchType(SearchTypeEnum.SEARCH);
search.setResourceType("Patient"); search.setResourceType("Patient");
search.setStatus(SearchStatusEnum.LOADING);
when(mySearchCacheSvc.fetchByUuid(eq(uuid))).thenReturn(Optional.of(search)); when(mySearchCacheSvc.fetchByUuid(eq(uuid))).thenReturn(Optional.of(search));
doAnswer(loadPids()).when(mySearchBuilder).loadResourcesByPid(any(Collection.class), any(Collection.class), any(List.class), anyBoolean(), any()); doAnswer(loadPids()).when(mySearchBuilder).loadResourcesByPid(any(Collection.class), any(Collection.class), any(List.class), anyBoolean(), any());

View File

@ -1055,7 +1055,7 @@ public class FhirResourceDaoDstu3Test extends BaseJpaDstu3Test {
IBundleProvider history = myPatientDao.history(null, null, null, mySrd); IBundleProvider history = myPatientDao.history(null, null, null, mySrd);
assertEquals(4 + initialHistory, history.size().intValue()); assertEquals(4 + initialHistory, history.size().intValue());
List<IBaseResource> resources = history.getResources(0, 4); List<IBaseResource> resources = history.getResources(0, 4);
assertNotNull(ResourceMetadataKeyEnum.DELETED_AT.get((IAnyResource) resources.get(0))); assertNotNull(ResourceMetadataKeyEnum.DELETED_AT.get(resources.get(0)));
try { try {
myPatientDao.delete(id2, mySrd); myPatientDao.delete(id2, mySrd);
@ -1164,9 +1164,9 @@ public class FhirResourceDaoDstu3Test extends BaseJpaDstu3Test {
IBundleProvider history = myPatientDao.history(id, null, null, null, mySrd); IBundleProvider history = myPatientDao.history(id, null, null, null, mySrd);
assertEquals(2, history.size().intValue()); assertEquals(2, history.size().intValue());
assertNotNull(ResourceMetadataKeyEnum.DELETED_AT.get((IAnyResource) history.getResources(0, 1).get(0))); assertNotNull(ResourceMetadataKeyEnum.DELETED_AT.get(history.getResources(0, 1).get(0)));
assertNotNull(ResourceMetadataKeyEnum.DELETED_AT.get((IAnyResource) history.getResources(0, 1).get(0)).getValue()); assertNotNull(ResourceMetadataKeyEnum.DELETED_AT.get(history.getResources(0, 1).get(0)).getValue());
assertNull(ResourceMetadataKeyEnum.DELETED_AT.get((IAnyResource) history.getResources(1, 2).get(0))); assertNull(ResourceMetadataKeyEnum.DELETED_AT.get(history.getResources(1, 2).get(0)));
} }
@ -1386,7 +1386,7 @@ public class FhirResourceDaoDstu3Test extends BaseJpaDstu3Test {
} }
List<Patient> patients = toList(myPatientDao.history(idv1.toVersionless(), null, null, null, mySrd)); List<Patient> patients = toList(myPatientDao.history(idv1.toVersionless(), null, null, null, mySrd));
assertTrue(patients.size() == 2); assertEquals(2, patients.size());
// Newest first // Newest first
assertEquals("Patient/testHistoryByForcedId/_history/2", patients.get(0).getIdElement().toUnqualified().getValue()); assertEquals("Patient/testHistoryByForcedId/_history/2", patients.get(0).getIdElement().toUnqualified().getValue());
assertEquals("Patient/testHistoryByForcedId/_history/1", patients.get(1).getIdElement().toUnqualified().getValue()); assertEquals("Patient/testHistoryByForcedId/_history/1", patients.get(1).getIdElement().toUnqualified().getValue());
@ -1622,14 +1622,14 @@ public class FhirResourceDaoDstu3Test extends BaseJpaDstu3Test {
assertEquals(id.withVersion("2"), entries.get(1).getIdElement()); assertEquals(id.withVersion("2"), entries.get(1).getIdElement());
assertEquals(id.withVersion("1"), entries.get(2).getIdElement()); assertEquals(id.withVersion("1"), entries.get(2).getIdElement());
assertNull(ResourceMetadataKeyEnum.DELETED_AT.get((IAnyResource) entries.get(0))); assertNull(ResourceMetadataKeyEnum.DELETED_AT.get(entries.get(0)));
assertEquals(BundleEntryTransactionMethodEnum.PUT.getCode(), ResourceMetadataKeyEnum.ENTRY_TRANSACTION_METHOD.get((IAnyResource) entries.get(0))); assertEquals(BundleEntryTransactionMethodEnum.PUT, ResourceMetadataKeyEnum.ENTRY_TRANSACTION_METHOD.get(entries.get(0)));
assertNotNull(ResourceMetadataKeyEnum.DELETED_AT.get((IAnyResource) entries.get(1))); assertNotNull(ResourceMetadataKeyEnum.DELETED_AT.get(entries.get(1)));
assertEquals(BundleEntryTransactionMethodEnum.DELETE.getCode(), ResourceMetadataKeyEnum.ENTRY_TRANSACTION_METHOD.get((IAnyResource) entries.get(1))); assertEquals(BundleEntryTransactionMethodEnum.DELETE, ResourceMetadataKeyEnum.ENTRY_TRANSACTION_METHOD.get(entries.get(1)));
assertNull(ResourceMetadataKeyEnum.DELETED_AT.get((IAnyResource) entries.get(2))); assertNull(ResourceMetadataKeyEnum.DELETED_AT.get(entries.get(2)));
assertEquals(BundleEntryTransactionMethodEnum.POST.getCode(), ResourceMetadataKeyEnum.ENTRY_TRANSACTION_METHOD.get((IAnyResource) entries.get(2))); assertEquals(BundleEntryTransactionMethodEnum.POST, ResourceMetadataKeyEnum.ENTRY_TRANSACTION_METHOD.get(entries.get(2)));
} }
@Test @Test
@ -2371,7 +2371,7 @@ public class FhirResourceDaoDstu3Test extends BaseJpaDstu3Test {
meta = myPatientDao.metaGetOperation(Meta.class, mySrd); meta = myPatientDao.metaGetOperation(Meta.class, mySrd);
List<Coding> published = meta.getTag(); List<Coding> published = meta.getTag();
assertEquals(2, published.size()); assertEquals(2, published.size());
assertEquals(null, published.get(0).getSystem()); assertNull(published.get(0).getSystem());
assertEquals("Dog", published.get(0).getCode()); assertEquals("Dog", published.get(0).getCode());
assertEquals("Puppies", published.get(0).getDisplay()); assertEquals("Puppies", published.get(0).getDisplay());
assertEquals("http://foo", published.get(1).getSystem()); assertEquals("http://foo", published.get(1).getSystem());
@ -2472,7 +2472,7 @@ public class FhirResourceDaoDstu3Test extends BaseJpaDstu3Test {
meta = myPatientDao.metaGetOperation(Meta.class, mySrd); meta = myPatientDao.metaGetOperation(Meta.class, mySrd);
List<Coding> published = meta.getTag(); List<Coding> published = meta.getTag();
assertEquals(2, published.size()); assertEquals(2, published.size());
assertEquals(null, published.get(0).getSystem()); assertNull(published.get(0).getSystem());
assertEquals("Dog", published.get(0).getCode()); assertEquals("Dog", published.get(0).getCode());
assertEquals("Puppies", published.get(0).getDisplay()); assertEquals("Puppies", published.get(0).getDisplay());
assertEquals("http://foo", published.get(1).getSystem()); assertEquals("http://foo", published.get(1).getSystem());
@ -2573,7 +2573,7 @@ public class FhirResourceDaoDstu3Test extends BaseJpaDstu3Test {
meta = myPatientDao.metaGetOperation(Meta.class, mySrd); meta = myPatientDao.metaGetOperation(Meta.class, mySrd);
List<Coding> published = meta.getTag(); List<Coding> published = meta.getTag();
assertEquals(2, published.size()); assertEquals(2, published.size());
assertEquals(null, published.get(0).getSystem()); assertNull(published.get(0).getSystem());
assertEquals("Dog", published.get(0).getCode()); assertEquals("Dog", published.get(0).getCode());
assertEquals("Puppies", published.get(0).getDisplay()); assertEquals("Puppies", published.get(0).getDisplay());
assertEquals("http://foo", published.get(1).getSystem()); assertEquals("http://foo", published.get(1).getSystem());
@ -2649,9 +2649,9 @@ public class FhirResourceDaoDstu3Test extends BaseJpaDstu3Test {
List<IBaseResource> results = resultsP.getResources(0, resultsP.size()); List<IBaseResource> results = resultsP.getResources(0, resultsP.size());
assertEquals(2, results.size()); assertEquals(2, results.size());
assertEquals(Organization.class, results.get(0).getClass()); assertEquals(Organization.class, results.get(0).getClass());
assertEquals(BundleEntrySearchModeEnum.MATCH.getCode(), ResourceMetadataKeyEnum.ENTRY_SEARCH_MODE.get((IAnyResource) results.get(0))); assertEquals(BundleEntrySearchModeEnum.MATCH, ResourceMetadataKeyEnum.ENTRY_SEARCH_MODE.get(results.get(0)));
assertEquals(Patient.class, results.get(1).getClass()); assertEquals(Patient.class, results.get(1).getClass());
assertEquals(BundleEntrySearchModeEnum.INCLUDE.getCode(), ResourceMetadataKeyEnum.ENTRY_SEARCH_MODE.get((IAnyResource) results.get(1))); assertEquals(BundleEntrySearchModeEnum.INCLUDE, ResourceMetadataKeyEnum.ENTRY_SEARCH_MODE.get(results.get(1)));
} }
@Test() @Test()
@ -3294,7 +3294,7 @@ public class FhirResourceDaoDstu3Test extends BaseJpaDstu3Test {
myOrganizationDao.create(org, mySrd); myOrganizationDao.create(org, mySrd);
val = myOrganizationDao.searchForIds(new SearchParameterMap("name", new StringParam("P")), null); val = myOrganizationDao.searchForIds(new SearchParameterMap("name", new StringParam("P")), null);
assertEquals(initial + 0, val.size()); assertEquals(initial, val.size());
val = myOrganizationDao.searchForIds(new SearchParameterMap("name", new StringParam(str.substring(0, ResourceIndexedSearchParamString.MAX_LENGTH))), null); val = myOrganizationDao.searchForIds(new SearchParameterMap("name", new StringParam(str.substring(0, ResourceIndexedSearchParamString.MAX_LENGTH))), null);
assertEquals(initial + 1, val.size()); assertEquals(initial + 1, val.size());
@ -3340,7 +3340,7 @@ public class FhirResourceDaoDstu3Test extends BaseJpaDstu3Test {
assertEquals(2, published.size()); assertEquals(2, published.size());
assertEquals("Dog", published.get(0).getCode()); assertEquals("Dog", published.get(0).getCode());
assertEquals("Puppies", published.get(0).getDisplay()); assertEquals("Puppies", published.get(0).getDisplay());
assertEquals(null, published.get(0).getSystem()); assertNull(published.get(0).getSystem());
assertEquals("Cat", published.get(1).getCode()); assertEquals("Cat", published.get(1).getCode());
assertEquals("Kittens", published.get(1).getDisplay()); assertEquals("Kittens", published.get(1).getDisplay());
assertEquals("http://foo", published.get(1).getSystem()); assertEquals("http://foo", published.get(1).getSystem());
@ -3368,7 +3368,7 @@ public class FhirResourceDaoDstu3Test extends BaseJpaDstu3Test {
sort(published); sort(published);
assertEquals("Dog", published.get(0).getCode()); assertEquals("Dog", published.get(0).getCode());
assertEquals("Puppies", published.get(0).getDisplay()); assertEquals("Puppies", published.get(0).getDisplay());
assertEquals(null, published.get(0).getSystem()); assertNull(published.get(0).getSystem());
assertEquals("Cat", published.get(1).getCode()); assertEquals("Cat", published.get(1).getCode());
assertEquals("Kittens", published.get(1).getDisplay()); assertEquals("Kittens", published.get(1).getDisplay());
assertEquals("http://foo", published.get(1).getSystem()); assertEquals("http://foo", published.get(1).getSystem());
@ -3398,7 +3398,7 @@ public class FhirResourceDaoDstu3Test extends BaseJpaDstu3Test {
assertEquals(3, published.size()); assertEquals(3, published.size());
assertEquals("Dog", published.get(0).getCode()); assertEquals("Dog", published.get(0).getCode());
assertEquals("Puppies", published.get(0).getDisplay()); assertEquals("Puppies", published.get(0).getDisplay());
assertEquals(null, published.get(0).getSystem()); assertNull(published.get(0).getSystem());
assertEquals("Cat", published.get(1).getCode()); assertEquals("Cat", published.get(1).getCode());
assertEquals("Kittens", published.get(1).getDisplay()); assertEquals("Kittens", published.get(1).getDisplay());
assertEquals("http://foo", published.get(1).getSystem()); assertEquals("http://foo", published.get(1).getSystem());

View File

@ -48,18 +48,15 @@ public class ClientThreadedCapabilitiesTest {
private static final Logger ourLog = LoggerFactory.getLogger("ClientThreadedCapabilitiesTest"); private static final Logger ourLog = LoggerFactory.getLogger("ClientThreadedCapabilitiesTest");
private static final FhirContext fhirContext = FhirContext.forR4(); private static final FhirContext fhirContext = FhirContext.forR4();
private static final String SERVER_URL = "http://hapi.fhir.org/baseR4";
private IGenericClient myClient;
private static final IClientInterceptor myCountingMetaClientInterceptor = new CountingMetaClientInterceptor(); private static final IClientInterceptor myCountingMetaClientInterceptor = new CountingMetaClientInterceptor();
private static final Collection<String> lastNames = Lists.newArrayList("Johnson", "Williams", "Brown", "Jones", "Garcia", "Miller", "Davis", private static final Collection<String> lastNames = Lists.newArrayList("Johnson", "Williams", "Brown", "Jones", "Garcia", "Miller", "Davis",
"Rodriguez", "Martinez", "Hernandez", "Lopez", "Gonzalez", "Wilson", "Anderson", "Thomas", "Taylor", "Moore", "Jackson", "Martin", "Lee"); "Rodriguez", "Martinez", "Hernandez", "Lopez", "Gonzalez", "Wilson", "Anderson", "Thomas", "Taylor", "Moore", "Jackson", "Martin", "Lee");
@RegisterExtension @RegisterExtension
public static RestfulServerExtension ourServer = new RestfulServerExtension(fhirContext) public static RestfulServerExtension ourServer = new RestfulServerExtension(fhirContext)
.registerProvider(new TestPatientResourceProvider()) .registerProvider(new TestPatientResourceProvider())
.withValidationMode(ServerValidationModeEnum.ONCE) .withValidationMode(ServerValidationModeEnum.ONCE)
.registerInterceptor(new SearchPreferHandlingInterceptor()); .registerInterceptor(new SearchPreferHandlingInterceptor());
private IGenericClient myClient;
@BeforeEach @BeforeEach
public void beforeEach() throws Exception { public void beforeEach() throws Exception {
@ -139,7 +136,7 @@ public class ClientThreadedCapabilitiesTest {
public Patient search(@OptionalParam(name = Patient.SP_FAMILY) StringParam theFamilyName) { public Patient search(@OptionalParam(name = Patient.SP_FAMILY) StringParam theFamilyName) {
Patient patient = new Patient(); Patient patient = new Patient();
patient.getIdElement().setValue("Patient/" + rand.nextInt() + "/_history/222"); patient.getIdElement().setValue("Patient/" + rand.nextInt() + "/_history/222");
ResourceMetadataKeyEnum.ENTRY_SEARCH_MODE.put(patient, BundleEntrySearchModeEnum.INCLUDE.getCode()); ResourceMetadataKeyEnum.ENTRY_SEARCH_MODE.put(patient, BundleEntrySearchModeEnum.INCLUDE);
patient.addName(new HumanName().setFamily(theFamilyName.getValue())); patient.addName(new HumanName().setFamily(theFamilyName.getValue()));
patient.setActive(true); patient.setActive(true);
return patient; return patient;
@ -148,5 +145,4 @@ public class ClientThreadedCapabilitiesTest {
} }
} }

View File

@ -123,6 +123,7 @@ import org.springframework.transaction.support.TransactionCallbackWithoutResult;
import org.springframework.transaction.support.TransactionTemplate; import org.springframework.transaction.support.TransactionTemplate;
import java.io.IOException; import java.io.IOException;
import java.nio.charset.StandardCharsets;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Collections; import java.util.Collections;
import java.util.Comparator; import java.util.Comparator;
@ -837,7 +838,7 @@ public class FhirResourceDaoR4Test extends BaseJpaR4Test {
String name = "profiles-resources"; String name = "profiles-resources";
ourLog.info("Uploading " + name); ourLog.info("Uploading " + name);
String vsContents; String vsContents;
vsContents = IOUtils.toString(FhirResourceDaoR4Test.class.getResourceAsStream("/org/hl7/fhir/r4/model/profile/" + name + ".xml"), "UTF-8"); vsContents = IOUtils.toString(FhirResourceDaoR4Test.class.getResourceAsStream("/org/hl7/fhir/r4/model/profile/" + name + ".xml"), StandardCharsets.UTF_8);
bundle = myFhirContext.newXmlParser().parseResource(org.hl7.fhir.r4.model.Bundle.class, vsContents); bundle = myFhirContext.newXmlParser().parseResource(org.hl7.fhir.r4.model.Bundle.class, vsContents);
for (BundleEntryComponent i : bundle.getEntry()) { for (BundleEntryComponent i : bundle.getEntry()) {
@ -1018,15 +1019,15 @@ public class FhirResourceDaoR4Test extends BaseJpaR4Test {
* If any of this ever fails, it means that one of the OperationOutcome issue severity codes has changed code value across versions. We store the string as a constant, so something will need to * If any of this ever fails, it means that one of the OperationOutcome issue severity codes has changed code value across versions. We store the string as a constant, so something will need to
* be fixed. * be fixed.
*/ */
assertEquals(org.hl7.fhir.dstu2.model.OperationOutcome.IssueSeverity.ERROR.toCode(), BaseHapiFhirDao.OO_SEVERITY_ERROR); assertEquals(org.hl7.fhir.dstu2.model.OperationOutcome.IssueSeverity.ERROR.toCode(), BaseStorageDao.OO_SEVERITY_ERROR);
assertEquals(org.hl7.fhir.r4.model.OperationOutcome.IssueSeverity.ERROR.toCode(), BaseStorageDao.OO_SEVERITY_ERROR); assertEquals(org.hl7.fhir.r4.model.OperationOutcome.IssueSeverity.ERROR.toCode(), BaseStorageDao.OO_SEVERITY_ERROR);
assertEquals(org.hl7.fhir.r4.model.OperationOutcome.IssueSeverity.ERROR.toCode(), BaseHapiFhirDao.OO_SEVERITY_ERROR); assertEquals(org.hl7.fhir.r4.model.OperationOutcome.IssueSeverity.ERROR.toCode(), BaseStorageDao.OO_SEVERITY_ERROR);
assertEquals(org.hl7.fhir.dstu2.model.OperationOutcome.IssueSeverity.INFORMATION.toCode(), BaseHapiFhirDao.OO_SEVERITY_INFO); assertEquals(org.hl7.fhir.dstu2.model.OperationOutcome.IssueSeverity.INFORMATION.toCode(), BaseStorageDao.OO_SEVERITY_INFO);
assertEquals(org.hl7.fhir.r4.model.OperationOutcome.IssueSeverity.INFORMATION.toCode(), BaseStorageDao.OO_SEVERITY_INFO); assertEquals(org.hl7.fhir.r4.model.OperationOutcome.IssueSeverity.INFORMATION.toCode(), BaseStorageDao.OO_SEVERITY_INFO);
assertEquals(org.hl7.fhir.r4.model.OperationOutcome.IssueSeverity.INFORMATION.toCode(), BaseHapiFhirDao.OO_SEVERITY_INFO); assertEquals(org.hl7.fhir.r4.model.OperationOutcome.IssueSeverity.INFORMATION.toCode(), BaseStorageDao.OO_SEVERITY_INFO);
assertEquals(org.hl7.fhir.dstu2.model.OperationOutcome.IssueSeverity.WARNING.toCode(), BaseHapiFhirDao.OO_SEVERITY_WARN); assertEquals(org.hl7.fhir.dstu2.model.OperationOutcome.IssueSeverity.WARNING.toCode(), BaseStorageDao.OO_SEVERITY_WARN);
assertEquals(org.hl7.fhir.r4.model.OperationOutcome.IssueSeverity.WARNING.toCode(), BaseStorageDao.OO_SEVERITY_WARN);
assertEquals(org.hl7.fhir.r4.model.OperationOutcome.IssueSeverity.WARNING.toCode(), BaseStorageDao.OO_SEVERITY_WARN); assertEquals(org.hl7.fhir.r4.model.OperationOutcome.IssueSeverity.WARNING.toCode(), BaseStorageDao.OO_SEVERITY_WARN);
assertEquals(org.hl7.fhir.r4.model.OperationOutcome.IssueSeverity.WARNING.toCode(), BaseHapiFhirDao.OO_SEVERITY_WARN);
} }
@Test @Test
@ -1417,7 +1418,7 @@ public class FhirResourceDaoR4Test extends BaseJpaR4Test {
IBundleProvider history = myPatientDao.history(null, null, null, mySrd); IBundleProvider history = myPatientDao.history(null, null, null, mySrd);
assertEquals(4 + initialHistory, history.size().intValue()); assertEquals(4 + initialHistory, history.size().intValue());
List<IBaseResource> resources = history.getResources(0, 4); List<IBaseResource> resources = history.getResources(0, 4);
assertNotNull(ResourceMetadataKeyEnum.DELETED_AT.get((IAnyResource) resources.get(0))); assertNotNull(ResourceMetadataKeyEnum.DELETED_AT.get(resources.get(0)));
try { try {
myPatientDao.delete(id2, mySrd); myPatientDao.delete(id2, mySrd);
@ -1518,7 +1519,7 @@ public class FhirResourceDaoR4Test extends BaseJpaR4Test {
assertEquals("3", id5.getVersionIdPart()); assertEquals("3", id5.getVersionIdPart());
patient = myPatientDao.read(id.withVersion("1")); patient = myPatientDao.read(id.withVersion("1"));
assertEquals(true, patient.getActive()); assertTrue(patient.getActive());
try { try {
myPatientDao.read(id.withVersion("2")); myPatientDao.read(id.withVersion("2"));
@ -1528,7 +1529,7 @@ public class FhirResourceDaoR4Test extends BaseJpaR4Test {
} }
patient = myPatientDao.read(id.withVersion("3")); patient = myPatientDao.read(id.withVersion("3"));
assertEquals(false, patient.getActive()); assertFalse(patient.getActive());
} }
@ -1592,9 +1593,9 @@ public class FhirResourceDaoR4Test extends BaseJpaR4Test {
IBundleProvider history = myPatientDao.history(id, null, null, null, mySrd); IBundleProvider history = myPatientDao.history(id, null, null, null, mySrd);
assertEquals(2, history.size().intValue()); assertEquals(2, history.size().intValue());
assertNotNull(ResourceMetadataKeyEnum.DELETED_AT.get((IAnyResource) history.getResources(0, 1).get(0))); assertNotNull(ResourceMetadataKeyEnum.DELETED_AT.get(history.getResources(0, 1).get(0)));
assertNotNull(ResourceMetadataKeyEnum.DELETED_AT.get((IAnyResource) history.getResources(0, 1).get(0)).getValue()); assertNotNull(ResourceMetadataKeyEnum.DELETED_AT.get(history.getResources(0, 1).get(0)).getValue());
assertNull(ResourceMetadataKeyEnum.DELETED_AT.get((IAnyResource) history.getResources(1, 2).get(0))); assertNull(ResourceMetadataKeyEnum.DELETED_AT.get(history.getResources(1, 2).get(0)));
} }
@ -1837,7 +1838,7 @@ public class FhirResourceDaoR4Test extends BaseJpaR4Test {
} }
List<Patient> patients = toList(myPatientDao.history(idv1.toVersionless(), null, null, null, mySrd)); List<Patient> patients = toList(myPatientDao.history(idv1.toVersionless(), null, null, null, mySrd));
assertTrue(patients.size() == 2); assertEquals(2, patients.size());
// Newest first // Newest first
assertEquals("Patient/testHistoryByForcedId/_history/2", patients.get(0).getIdElement().toUnqualified().getValue()); assertEquals("Patient/testHistoryByForcedId/_history/2", patients.get(0).getIdElement().toUnqualified().getValue());
assertEquals("Patient/testHistoryByForcedId/_history/1", patients.get(1).getIdElement().toUnqualified().getValue()); assertEquals("Patient/testHistoryByForcedId/_history/1", patients.get(1).getIdElement().toUnqualified().getValue());
@ -2072,14 +2073,14 @@ public class FhirResourceDaoR4Test extends BaseJpaR4Test {
assertEquals(id.withVersion("2"), entries.get(1).getIdElement()); assertEquals(id.withVersion("2"), entries.get(1).getIdElement());
assertEquals(id.withVersion("1"), entries.get(2).getIdElement()); assertEquals(id.withVersion("1"), entries.get(2).getIdElement());
assertNull(ResourceMetadataKeyEnum.DELETED_AT.get((IAnyResource) entries.get(0))); assertNull(ResourceMetadataKeyEnum.DELETED_AT.get(entries.get(0)));
assertEquals(BundleEntryTransactionMethodEnum.PUT.getCode(), ResourceMetadataKeyEnum.ENTRY_TRANSACTION_METHOD.get((IAnyResource) entries.get(0))); assertEquals(BundleEntryTransactionMethodEnum.PUT, ResourceMetadataKeyEnum.ENTRY_TRANSACTION_METHOD.get(entries.get(0)));
assertNotNull(ResourceMetadataKeyEnum.DELETED_AT.get((IAnyResource) entries.get(1))); assertNotNull(ResourceMetadataKeyEnum.DELETED_AT.get(entries.get(1)));
assertEquals(BundleEntryTransactionMethodEnum.DELETE.getCode(), ResourceMetadataKeyEnum.ENTRY_TRANSACTION_METHOD.get((IAnyResource) entries.get(1))); assertEquals(BundleEntryTransactionMethodEnum.DELETE, ResourceMetadataKeyEnum.ENTRY_TRANSACTION_METHOD.get(entries.get(1)));
assertNull(ResourceMetadataKeyEnum.DELETED_AT.get((IAnyResource) entries.get(2))); assertNull(ResourceMetadataKeyEnum.DELETED_AT.get(entries.get(2)));
assertEquals(BundleEntryTransactionMethodEnum.POST.getCode(), ResourceMetadataKeyEnum.ENTRY_TRANSACTION_METHOD.get((IAnyResource) entries.get(2))); assertEquals(BundleEntryTransactionMethodEnum.POST, ResourceMetadataKeyEnum.ENTRY_TRANSACTION_METHOD.get(entries.get(2)));
} }
@Test @Test
@ -2255,7 +2256,7 @@ public class FhirResourceDaoR4Test extends BaseJpaR4Test {
myConditionDao.create(c2, mySrd).getId().toUnqualifiedVersionless(); myConditionDao.create(c2, mySrd).getId().toUnqualifiedVersionless();
Condition c3 = new Condition(); Condition c3 = new Condition();
c3.setOnset(new Range().setLow((SimpleQuantity) new SimpleQuantity().setValue(200L)).setHigh((SimpleQuantity) new SimpleQuantity().setValue(300L))); c3.setOnset(new Range().setLow(new SimpleQuantity().setValue(200L)).setHigh(new SimpleQuantity().setValue(300L)));
myConditionDao.create(c3, mySrd).getId().toUnqualifiedVersionless(); myConditionDao.create(c3, mySrd).getId().toUnqualifiedVersionless();
Condition c4 = new Condition(); Condition c4 = new Condition();
@ -2841,7 +2842,7 @@ public class FhirResourceDaoR4Test extends BaseJpaR4Test {
meta = myPatientDao.metaGetOperation(Meta.class, mySrd); meta = myPatientDao.metaGetOperation(Meta.class, mySrd);
List<Coding> published = meta.getTag(); List<Coding> published = meta.getTag();
assertEquals(2, published.size()); assertEquals(2, published.size());
assertEquals(null, published.get(0).getSystem()); assertNull(published.get(0).getSystem());
assertEquals("Dog", published.get(0).getCode()); assertEquals("Dog", published.get(0).getCode());
assertEquals("Puppies", published.get(0).getDisplay()); assertEquals("Puppies", published.get(0).getDisplay());
assertEquals("http://foo", published.get(1).getSystem()); assertEquals("http://foo", published.get(1).getSystem());
@ -2972,7 +2973,7 @@ public class FhirResourceDaoR4Test extends BaseJpaR4Test {
meta = myPatientDao.metaGetOperation(Meta.class, mySrd); meta = myPatientDao.metaGetOperation(Meta.class, mySrd);
List<Coding> published = meta.getTag(); List<Coding> published = meta.getTag();
assertEquals(2, published.size()); assertEquals(2, published.size());
assertEquals(null, published.get(0).getSystem()); assertNull(published.get(0).getSystem());
assertEquals("Dog", published.get(0).getCode()); assertEquals("Dog", published.get(0).getCode());
assertEquals("Puppies", published.get(0).getDisplay()); assertEquals("Puppies", published.get(0).getDisplay());
assertEquals("http://foo", published.get(1).getSystem()); assertEquals("http://foo", published.get(1).getSystem());
@ -3073,7 +3074,7 @@ public class FhirResourceDaoR4Test extends BaseJpaR4Test {
meta = myPatientDao.metaGetOperation(Meta.class, mySrd); meta = myPatientDao.metaGetOperation(Meta.class, mySrd);
List<Coding> published = meta.getTag(); List<Coding> published = meta.getTag();
assertEquals(2, published.size()); assertEquals(2, published.size());
assertEquals(null, published.get(0).getSystem()); assertNull(published.get(0).getSystem());
assertEquals("Dog", published.get(0).getCode()); assertEquals("Dog", published.get(0).getCode());
assertEquals("Puppies", published.get(0).getDisplay()); assertEquals("Puppies", published.get(0).getDisplay());
assertEquals("http://foo", published.get(1).getSystem()); assertEquals("http://foo", published.get(1).getSystem());
@ -3149,9 +3150,9 @@ public class FhirResourceDaoR4Test extends BaseJpaR4Test {
List<IBaseResource> results = resultsP.getResources(0, resultsP.size()); List<IBaseResource> results = resultsP.getResources(0, resultsP.size());
assertEquals(2, results.size()); assertEquals(2, results.size());
assertEquals(Organization.class, results.get(0).getClass()); assertEquals(Organization.class, results.get(0).getClass());
assertEquals(BundleEntrySearchModeEnum.MATCH.getCode(), ResourceMetadataKeyEnum.ENTRY_SEARCH_MODE.get((IAnyResource) results.get(0))); assertEquals(BundleEntrySearchModeEnum.MATCH, ResourceMetadataKeyEnum.ENTRY_SEARCH_MODE.get(results.get(0)));
assertEquals(Patient.class, results.get(1).getClass()); assertEquals(Patient.class, results.get(1).getClass());
assertEquals(BundleEntrySearchModeEnum.INCLUDE.getCode(), ResourceMetadataKeyEnum.ENTRY_SEARCH_MODE.get((IAnyResource) results.get(1))); assertEquals(BundleEntrySearchModeEnum.INCLUDE, ResourceMetadataKeyEnum.ENTRY_SEARCH_MODE.get(results.get(1)));
} }
@Test @Test
@ -4033,7 +4034,7 @@ public class FhirResourceDaoR4Test extends BaseJpaR4Test {
assertEquals(2, published.size()); assertEquals(2, published.size());
assertEquals("Dog", published.get(0).getCode()); assertEquals("Dog", published.get(0).getCode());
assertEquals("Puppies", published.get(0).getDisplay()); assertEquals("Puppies", published.get(0).getDisplay());
assertEquals(null, published.get(0).getSystem()); assertNull(published.get(0).getSystem());
assertEquals("Cat", published.get(1).getCode()); assertEquals("Cat", published.get(1).getCode());
assertEquals("Kittens", published.get(1).getDisplay()); assertEquals("Kittens", published.get(1).getDisplay());
assertEquals("http://foo", published.get(1).getSystem()); assertEquals("http://foo", published.get(1).getSystem());
@ -4061,7 +4062,7 @@ public class FhirResourceDaoR4Test extends BaseJpaR4Test {
sort(published); sort(published);
assertEquals("Dog", published.get(0).getCode()); assertEquals("Dog", published.get(0).getCode());
assertEquals("Puppies", published.get(0).getDisplay()); assertEquals("Puppies", published.get(0).getDisplay());
assertEquals(null, published.get(0).getSystem()); assertNull(published.get(0).getSystem());
assertEquals("Cat", published.get(1).getCode()); assertEquals("Cat", published.get(1).getCode());
assertEquals("Kittens", published.get(1).getDisplay()); assertEquals("Kittens", published.get(1).getDisplay());
assertEquals("http://foo", published.get(1).getSystem()); assertEquals("http://foo", published.get(1).getSystem());
@ -4091,7 +4092,7 @@ public class FhirResourceDaoR4Test extends BaseJpaR4Test {
assertEquals(3, published.size()); assertEquals(3, published.size());
assertEquals("Dog", published.get(0).getCode()); assertEquals("Dog", published.get(0).getCode());
assertEquals("Puppies", published.get(0).getDisplay()); assertEquals("Puppies", published.get(0).getDisplay());
assertEquals(null, published.get(0).getSystem()); assertNull(published.get(0).getSystem());
assertEquals("Cat", published.get(1).getCode()); assertEquals("Cat", published.get(1).getCode());
assertEquals("Kittens", published.get(1).getDisplay()); assertEquals("Kittens", published.get(1).getDisplay());
assertEquals("http://foo", published.get(1).getSystem()); assertEquals("http://foo", published.get(1).getSystem());

View File

@ -20,23 +20,13 @@ package ca.uhn.fhir.jpa.api.dao;
* #L% * #L%
*/ */
import ca.uhn.fhir.model.api.IResource;
import ca.uhn.fhir.model.api.ResourceMetadataKeyEnum; import ca.uhn.fhir.model.api.ResourceMetadataKeyEnum;
public final class MetadataKeyCurrentlyReindexing extends ResourceMetadataKeyEnum<Boolean> { public final class MetadataKeyCurrentlyReindexing extends ResourceMetadataKeyEnum<Boolean> {
private static final long serialVersionUID = 1L; private static final long serialVersionUID = 2L;
MetadataKeyCurrentlyReindexing(String theValue) { MetadataKeyCurrentlyReindexing(String theValue) {
super(theValue); super(theValue, Boolean.class);
} }
@Override
public Boolean get(IResource theResource) {
return (Boolean) theResource.getResourceMetadata().get(IDao.CURRENTLY_REINDEXING);
}
@Override
public void put(IResource theResource, Boolean theObject) {
theResource.getResourceMetadata().put(IDao.CURRENTLY_REINDEXING, theObject);
}
} }

View File

@ -20,34 +20,13 @@ package ca.uhn.fhir.jpa.api.dao;
* #L% * #L%
*/ */
import ca.uhn.fhir.model.api.IResource; import ca.uhn.fhir.model.api.ResourceMetadataKeyEnum;
import ca.uhn.fhir.model.api.ResourceMetadataKeyEnum.ResourceMetadataKeySupportingAnyResource;
import org.hl7.fhir.instance.model.api.IAnyResource;
public final class MetadataKeyResourcePid extends ResourceMetadataKeySupportingAnyResource<Long, Long> { public final class MetadataKeyResourcePid extends ResourceMetadataKeyEnum<Long> {
private static final long serialVersionUID = 1L; private static final long serialVersionUID = 2L;
MetadataKeyResourcePid(String theValue) { MetadataKeyResourcePid(String theValue) {
super(theValue); super(theValue, Long.class);
} }
@Override
public Long get(IAnyResource theResource) {
return (Long) theResource.getUserData(IDao.RESOURCE_PID.name());
}
@Override
public Long get(IResource theResource) {
return (Long) theResource.getResourceMetadata().get(IDao.RESOURCE_PID);
}
@Override
public void put(IAnyResource theResource, Long theObject) {
theResource.setUserData(IDao.RESOURCE_PID.name(), theObject);
}
@Override
public void put(IResource theResource, Long theObject) {
theResource.getResourceMetadata().put(IDao.RESOURCE_PID, theObject);
}
} }

View File

@ -24,6 +24,8 @@ 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.Include; import ca.uhn.fhir.model.api.Include;
import ca.uhn.fhir.model.api.ResourceMetadataKeyEnum; import ca.uhn.fhir.model.api.ResourceMetadataKeyEnum;
import ca.uhn.fhir.model.valueset.BundleEntrySearchModeEnum;
import ca.uhn.fhir.model.valueset.BundleEntryTransactionMethodEnum;
import ca.uhn.fhir.model.valueset.BundleTypeEnum; import ca.uhn.fhir.model.valueset.BundleTypeEnum;
import ca.uhn.fhir.rest.api.BundleLinks; import ca.uhn.fhir.rest.api.BundleLinks;
import ca.uhn.fhir.rest.api.Constants; import ca.uhn.fhir.rest.api.Constants;
@ -131,17 +133,17 @@ public class Dstu2_1BundleFactory implements IVersionSpecificBundleFactory {
BundleEntryComponent entry = myBundle.addEntry().setResource((Resource) next); BundleEntryComponent entry = myBundle.addEntry().setResource((Resource) next);
Resource nextAsResource = (Resource) next; Resource nextAsResource = (Resource) next;
IIdType id = populateBundleEntryFullUrl(next, entry); IIdType id = populateBundleEntryFullUrl(next, entry);
String httpVerb = ResourceMetadataKeyEnum.ENTRY_TRANSACTION_METHOD.get(nextAsResource); BundleEntryTransactionMethodEnum httpVerb = ResourceMetadataKeyEnum.ENTRY_TRANSACTION_METHOD.get(nextAsResource);
if (httpVerb != null) { if (httpVerb != null) {
entry.getRequest().getMethodElement().setValueAsString(httpVerb); entry.getRequest().getMethodElement().setValueAsString(httpVerb.name());
if (id != null) { if (id != null) {
entry.getRequest().setUrl(id.getValue()); entry.getRequest().setUrl(id.getValue());
} }
} }
String searchMode = ResourceMetadataKeyEnum.ENTRY_SEARCH_MODE.get(nextAsResource); BundleEntrySearchModeEnum searchMode = ResourceMetadataKeyEnum.ENTRY_SEARCH_MODE.get(nextAsResource);
if (searchMode != null) { if (searchMode != null) {
entry.getSearch().getModeElement().setValueAsString(searchMode); entry.getSearch().getModeElement().setValueAsString(searchMode.getCode());
} }
} }

View File

@ -24,6 +24,8 @@ 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.Include; import ca.uhn.fhir.model.api.Include;
import ca.uhn.fhir.model.api.ResourceMetadataKeyEnum; import ca.uhn.fhir.model.api.ResourceMetadataKeyEnum;
import ca.uhn.fhir.model.valueset.BundleEntrySearchModeEnum;
import ca.uhn.fhir.model.valueset.BundleEntryTransactionMethodEnum;
import ca.uhn.fhir.model.valueset.BundleTypeEnum; import ca.uhn.fhir.model.valueset.BundleTypeEnum;
import ca.uhn.fhir.rest.api.BundleLinks; import ca.uhn.fhir.rest.api.BundleLinks;
import ca.uhn.fhir.rest.api.Constants; import ca.uhn.fhir.rest.api.Constants;
@ -132,14 +134,14 @@ public class Dstu3BundleFactory implements IVersionSpecificBundleFactory {
BundleEntryComponent entry = myBundle.addEntry().setResource((Resource) next); BundleEntryComponent entry = myBundle.addEntry().setResource((Resource) next);
Resource nextAsResource = (Resource) next; Resource nextAsResource = (Resource) next;
IIdType id = populateBundleEntryFullUrl(next, entry); IIdType id = populateBundleEntryFullUrl(next, entry);
String httpVerb = ResourceMetadataKeyEnum.ENTRY_TRANSACTION_METHOD.get(nextAsResource); BundleEntryTransactionMethodEnum httpVerb = ResourceMetadataKeyEnum.ENTRY_TRANSACTION_METHOD.get(nextAsResource);
if (httpVerb != null) { if (httpVerb != null) {
entry.getRequest().getMethodElement().setValueAsString(httpVerb); entry.getRequest().getMethodElement().setValueAsString(httpVerb.name());
if (id != null) { if (id != null) {
entry.getRequest().setUrl(id.toUnqualified().getValue()); entry.getRequest().setUrl(id.toUnqualified().getValue());
} }
} }
if ("DELETE".equals(httpVerb)) { if (BundleEntryTransactionMethodEnum.DELETE.equals(httpVerb)) {
entry.setResource(null); entry.setResource(null);
} }
@ -161,9 +163,9 @@ public class Dstu3BundleFactory implements IVersionSpecificBundleFactory {
} }
// Populate Bundle.entry.search // Populate Bundle.entry.search
String searchMode = ResourceMetadataKeyEnum.ENTRY_SEARCH_MODE.get(nextAsResource); BundleEntrySearchModeEnum searchMode = ResourceMetadataKeyEnum.ENTRY_SEARCH_MODE.get(nextAsResource);
if (searchMode != null) { if (searchMode != null) {
entry.getSearch().getModeElement().setValueAsString(searchMode); entry.getSearch().getModeElement().setValueAsString(searchMode.getCode());
} }
} }

View File

@ -24,6 +24,8 @@ 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.Include; import ca.uhn.fhir.model.api.Include;
import ca.uhn.fhir.model.api.ResourceMetadataKeyEnum; import ca.uhn.fhir.model.api.ResourceMetadataKeyEnum;
import ca.uhn.fhir.model.valueset.BundleEntrySearchModeEnum;
import ca.uhn.fhir.model.valueset.BundleEntryTransactionMethodEnum;
import ca.uhn.fhir.model.valueset.BundleTypeEnum; import ca.uhn.fhir.model.valueset.BundleTypeEnum;
import ca.uhn.fhir.rest.api.BundleLinks; import ca.uhn.fhir.rest.api.BundleLinks;
import ca.uhn.fhir.rest.api.Constants; import ca.uhn.fhir.rest.api.Constants;
@ -135,14 +137,14 @@ public class Dstu2Hl7OrgBundleFactory implements IVersionSpecificBundleFactory {
BundleEntryComponent entry = myBundle.addEntry().setResource((Resource) next); BundleEntryComponent entry = myBundle.addEntry().setResource((Resource) next);
Resource nextAsResource = (Resource) next; Resource nextAsResource = (Resource) next;
IIdType id = populateBundleEntryFullUrl(next, entry); IIdType id = populateBundleEntryFullUrl(next, entry);
String httpVerb = ResourceMetadataKeyEnum.ENTRY_TRANSACTION_METHOD.get(nextAsResource); BundleEntryTransactionMethodEnum httpVerb = ResourceMetadataKeyEnum.ENTRY_TRANSACTION_METHOD.get(nextAsResource);
if (httpVerb != null) { if (httpVerb != null) {
entry.getRequest().getMethodElement().setValueAsString(httpVerb); entry.getRequest().getMethodElement().setValueAsString(httpVerb.name());
if (id != null) { if (id != null) {
entry.getRequest().setUrl(id.getValue()); entry.getRequest().setUrl(id.getValue());
} }
} }
if ("DELETE".equals(httpVerb)) { if (BundleEntryTransactionMethodEnum.DELETE.equals(httpVerb)) {
entry.setResource(null); entry.setResource(null);
} }
@ -166,9 +168,9 @@ public class Dstu2Hl7OrgBundleFactory implements IVersionSpecificBundleFactory {
} }
// Populate Bundle.entry.search // Populate Bundle.entry.search
String searchMode = ResourceMetadataKeyEnum.ENTRY_SEARCH_MODE.get(nextAsResource); BundleEntrySearchModeEnum searchMode = ResourceMetadataKeyEnum.ENTRY_SEARCH_MODE.get(nextAsResource);
if (searchMode != null) { if (searchMode != null) {
entry.getSearch().getModeElement().setValueAsString(searchMode); entry.getSearch().getModeElement().setValueAsString(searchMode.getCode());
} }
} }

View File

@ -24,6 +24,8 @@ 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.Include; import ca.uhn.fhir.model.api.Include;
import ca.uhn.fhir.model.api.ResourceMetadataKeyEnum; import ca.uhn.fhir.model.api.ResourceMetadataKeyEnum;
import ca.uhn.fhir.model.valueset.BundleEntrySearchModeEnum;
import ca.uhn.fhir.model.valueset.BundleEntryTransactionMethodEnum;
import ca.uhn.fhir.model.valueset.BundleTypeEnum; import ca.uhn.fhir.model.valueset.BundleTypeEnum;
import ca.uhn.fhir.rest.api.BundleLinks; import ca.uhn.fhir.rest.api.BundleLinks;
import ca.uhn.fhir.rest.api.Constants; import ca.uhn.fhir.rest.api.Constants;
@ -134,14 +136,14 @@ public class R4BundleFactory implements IVersionSpecificBundleFactory {
IIdType id = populateBundleEntryFullUrl(next, entry); IIdType id = populateBundleEntryFullUrl(next, entry);
// Populate Request // Populate Request
String httpVerb = ResourceMetadataKeyEnum.ENTRY_TRANSACTION_METHOD.get(nextAsResource); BundleEntryTransactionMethodEnum httpVerb = ResourceMetadataKeyEnum.ENTRY_TRANSACTION_METHOD.get(nextAsResource);
if (httpVerb != null) { if (httpVerb != null) {
entry.getRequest().getMethodElement().setValueAsString(httpVerb); entry.getRequest().getMethodElement().setValueAsString(httpVerb.name());
if (id != null) { if (id != null) {
entry.getRequest().setUrl(id.toUnqualified().getValue()); entry.getRequest().setUrl(id.toUnqualified().getValue());
} }
} }
if ("DELETE".equals(httpVerb)) { if (BundleEntryTransactionMethodEnum.DELETE.equals(httpVerb)) {
entry.setResource(null); entry.setResource(null);
} }
@ -164,9 +166,9 @@ public class R4BundleFactory implements IVersionSpecificBundleFactory {
} }
// Populate Bundle.entry.search // Populate Bundle.entry.search
String searchMode = ResourceMetadataKeyEnum.ENTRY_SEARCH_MODE.get(nextAsResource); BundleEntrySearchModeEnum searchMode = ResourceMetadataKeyEnum.ENTRY_SEARCH_MODE.get(nextAsResource);
if (searchMode != null) { if (searchMode != null) {
entry.getSearch().getModeElement().setValueAsString(searchMode); entry.getSearch().getModeElement().setValueAsString(searchMode.getCode());
} }
} }

View File

@ -154,7 +154,7 @@ public class SearchPreferHandlingInterceptorTest {
for (int i = 0; i < 200; i++) { for (int i = 0; i < 200; i++) {
Patient patient = new Patient(); Patient patient = new Patient();
patient.getIdElement().setValue("Patient/" + i + "/_history/222"); patient.getIdElement().setValue("Patient/" + i + "/_history/222");
ResourceMetadataKeyEnum.ENTRY_SEARCH_MODE.put(patient, BundleEntrySearchModeEnum.INCLUDE.getCode()); ResourceMetadataKeyEnum.ENTRY_SEARCH_MODE.put(patient, BundleEntrySearchModeEnum.INCLUDE);
patient.addName(new HumanName().setFamily("FAMILY")); patient.addName(new HumanName().setFamily("FAMILY"));
patient.setActive(true); patient.setActive(true);
retVal.add(patient); retVal.add(patient);

View File

@ -517,7 +517,7 @@ public class SearchR4Test {
for (int i = 0; i < 200; i++) { for (int i = 0; i < 200; i++) {
Patient patient = new Patient(); Patient patient = new Patient();
patient.getIdElement().setValue("Patient/" + i + "/_history/222"); patient.getIdElement().setValue("Patient/" + i + "/_history/222");
ResourceMetadataKeyEnum.ENTRY_SEARCH_MODE.put(patient, BundleEntrySearchModeEnum.INCLUDE.getCode()); ResourceMetadataKeyEnum.ENTRY_SEARCH_MODE.put(patient, BundleEntrySearchModeEnum.INCLUDE);
patient.addName(new HumanName().setFamily("FAMILY")); patient.addName(new HumanName().setFamily("FAMILY"));
patient.setActive(true); patient.setActive(true);
retVal.add(patient); retVal.add(patient);
@ -534,7 +534,6 @@ public class SearchR4Test {
return MedicationRequest.class; return MedicationRequest.class;
} }
@SuppressWarnings("rawtypes")
@Search() @Search()
public List<IBaseResource> search( public List<IBaseResource> search(
@IncludeParam Set<Include> theIncludes @IncludeParam Set<Include> theIncludes

View File

@ -24,6 +24,8 @@ 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.Include; import ca.uhn.fhir.model.api.Include;
import ca.uhn.fhir.model.api.ResourceMetadataKeyEnum; import ca.uhn.fhir.model.api.ResourceMetadataKeyEnum;
import ca.uhn.fhir.model.valueset.BundleEntrySearchModeEnum;
import ca.uhn.fhir.model.valueset.BundleEntryTransactionMethodEnum;
import ca.uhn.fhir.model.valueset.BundleTypeEnum; import ca.uhn.fhir.model.valueset.BundleTypeEnum;
import ca.uhn.fhir.rest.api.BundleLinks; import ca.uhn.fhir.rest.api.BundleLinks;
import ca.uhn.fhir.rest.api.Constants; import ca.uhn.fhir.rest.api.Constants;
@ -134,14 +136,14 @@ public class R4BBundleFactory implements IVersionSpecificBundleFactory {
IIdType id = populateBundleEntryFullUrl(next, entry); IIdType id = populateBundleEntryFullUrl(next, entry);
// Populate Request // Populate Request
String httpVerb = ResourceMetadataKeyEnum.ENTRY_TRANSACTION_METHOD.get(nextAsResource); BundleEntryTransactionMethodEnum httpVerb = ResourceMetadataKeyEnum.ENTRY_TRANSACTION_METHOD.get(nextAsResource);
if (httpVerb != null) { if (httpVerb != null) {
entry.getRequest().getMethodElement().setValueAsString(httpVerb); entry.getRequest().getMethodElement().setValueAsString(httpVerb.name());
if (id != null) { if (id != null) {
entry.getRequest().setUrl(id.toUnqualified().getValue()); entry.getRequest().setUrl(id.toUnqualified().getValue());
} }
} }
if ("DELETE".equals(httpVerb)) { if (BundleEntryTransactionMethodEnum.DELETE.equals(httpVerb)) {
entry.setResource(null); entry.setResource(null);
} }
@ -164,9 +166,9 @@ public class R4BBundleFactory implements IVersionSpecificBundleFactory {
} }
// Populate Bundle.entry.search // Populate Bundle.entry.search
String searchMode = ResourceMetadataKeyEnum.ENTRY_SEARCH_MODE.get(nextAsResource); BundleEntrySearchModeEnum searchMode = ResourceMetadataKeyEnum.ENTRY_SEARCH_MODE.get(nextAsResource);
if (searchMode != null) { if (searchMode != null) {
entry.getSearch().getModeElement().setValueAsString(searchMode); entry.getSearch().getModeElement().setValueAsString(searchMode.getCode());
} }
} }

View File

@ -9,8 +9,6 @@ import ca.uhn.fhir.rest.api.EncodingEnum;
import ca.uhn.fhir.rest.param.TokenAndListParam; import ca.uhn.fhir.rest.param.TokenAndListParam;
import ca.uhn.fhir.test.utilities.JettyUtil; import ca.uhn.fhir.test.utilities.JettyUtil;
import ca.uhn.fhir.util.TestUtil; import ca.uhn.fhir.util.TestUtil;
import ca.uhn.fhir.validation.FhirValidator;
import ca.uhn.fhir.validation.ValidationResult;
import org.apache.commons.io.IOUtils; import org.apache.commons.io.IOUtils;
import org.apache.http.client.methods.CloseableHttpResponse; import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpGet; import org.apache.http.client.methods.HttpGet;
@ -34,13 +32,12 @@ import java.util.List;
import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeUnit;
import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.fail;
public class SearchR4BTest { public class SearchR4BTest {
private static final org.slf4j.Logger ourLog = org.slf4j.LoggerFactory.getLogger(SearchR4BTest.class); private static final org.slf4j.Logger ourLog = org.slf4j.LoggerFactory.getLogger(SearchR4BTest.class);
private static final FhirContext ourCtx = FhirContext.forR4BCached();
private static CloseableHttpClient ourClient; private static CloseableHttpClient ourClient;
private static FhirContext ourCtx = FhirContext.forR4BCached();
private static TokenAndListParam ourIdentifiers; private static TokenAndListParam ourIdentifiers;
private static String ourLastMethod; private static String ourLastMethod;
private static int ourPort; private static int ourPort;
@ -60,7 +57,6 @@ public class SearchR4BTest {
try (CloseableHttpResponse status = ourClient.execute(httpGet)) { try (CloseableHttpResponse status = ourClient.execute(httpGet)) {
String responseContent = IOUtils.toString(status.getEntity().getContent(), StandardCharsets.UTF_8); String responseContent = IOUtils.toString(status.getEntity().getContent(), StandardCharsets.UTF_8);
ourLog.info(responseContent); ourLog.info(responseContent);
// validate(ourCtx.newJsonParser().parseResource(responseContent));
assertEquals(200, status.getStatusLine().getStatusCode()); assertEquals(200, status.getStatusLine().getStatusCode());
assertEquals("search", ourLastMethod); assertEquals("search", ourLastMethod);
@ -72,15 +68,6 @@ public class SearchR4BTest {
} }
private void validate(IBaseResource theResource) {
FhirValidator validatorModule = ourCtx.newValidator();
ValidationResult result = validatorModule.validateWithResult(theResource);
if (!result.isSuccessful()) {
fail(ourCtx.newXmlParser().setPrettyPrint(true).encodeResourceToString(result.toOperationOutcome()));
}
}
public static class DummyPatientResourceProvider implements IResourceProvider { public static class DummyPatientResourceProvider implements IResourceProvider {
@Override @Override
@ -99,7 +86,7 @@ public class SearchR4BTest {
for (int i = 0; i < 200; i++) { for (int i = 0; i < 200; i++) {
Patient patient = new Patient(); Patient patient = new Patient();
patient.getIdElement().setValue("Patient/" + i + "/_history/222"); patient.getIdElement().setValue("Patient/" + i + "/_history/222");
ResourceMetadataKeyEnum.ENTRY_SEARCH_MODE.put(patient, BundleEntrySearchModeEnum.INCLUDE.getCode()); ResourceMetadataKeyEnum.ENTRY_SEARCH_MODE.put(patient, BundleEntrySearchModeEnum.INCLUDE);
patient.addName(new HumanName().setFamily("FAMILY")); patient.addName(new HumanName().setFamily("FAMILY"));
patient.setActive(true); patient.setActive(true);
retVal.add(patient); retVal.add(patient);

View File

@ -24,6 +24,8 @@ 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.Include; import ca.uhn.fhir.model.api.Include;
import ca.uhn.fhir.model.api.ResourceMetadataKeyEnum; import ca.uhn.fhir.model.api.ResourceMetadataKeyEnum;
import ca.uhn.fhir.model.valueset.BundleEntrySearchModeEnum;
import ca.uhn.fhir.model.valueset.BundleEntryTransactionMethodEnum;
import ca.uhn.fhir.model.valueset.BundleTypeEnum; import ca.uhn.fhir.model.valueset.BundleTypeEnum;
import ca.uhn.fhir.rest.api.BundleLinks; import ca.uhn.fhir.rest.api.BundleLinks;
import ca.uhn.fhir.rest.api.Constants; import ca.uhn.fhir.rest.api.Constants;
@ -134,14 +136,14 @@ public class R5BundleFactory implements IVersionSpecificBundleFactory {
IIdType id = populateBundleEntryFullUrl(next, entry); IIdType id = populateBundleEntryFullUrl(next, entry);
// Populate Request // Populate Request
String httpVerb = ResourceMetadataKeyEnum.ENTRY_TRANSACTION_METHOD.get(nextAsResource); BundleEntryTransactionMethodEnum httpVerb = ResourceMetadataKeyEnum.ENTRY_TRANSACTION_METHOD.get(nextAsResource);
if (httpVerb != null) { if (httpVerb != null) {
entry.getRequest().getMethodElement().setValueAsString(httpVerb); entry.getRequest().getMethodElement().setValueAsString(httpVerb.name());
if (id != null) { if (id != null) {
entry.getRequest().setUrl(id.toUnqualified().getValue()); entry.getRequest().setUrl(id.toUnqualified().getValue());
} }
} }
if ("DELETE".equals(httpVerb)) { if (BundleEntryTransactionMethodEnum.DELETE.equals(httpVerb)) {
entry.setResource(null); entry.setResource(null);
} }
@ -164,9 +166,9 @@ public class R5BundleFactory implements IVersionSpecificBundleFactory {
} }
// Populate Bundle.entry.search // Populate Bundle.entry.search
String searchMode = ResourceMetadataKeyEnum.ENTRY_SEARCH_MODE.get(nextAsResource); BundleEntrySearchModeEnum searchMode = ResourceMetadataKeyEnum.ENTRY_SEARCH_MODE.get(nextAsResource);
if (searchMode != null) { if (searchMode != null) {
entry.getSearch().getModeElement().setValueAsString(searchMode); entry.getSearch().getModeElement().setValueAsString(searchMode.getCode());
} }
} }

View File

@ -9,8 +9,6 @@ import ca.uhn.fhir.rest.api.EncodingEnum;
import ca.uhn.fhir.rest.param.TokenAndListParam; import ca.uhn.fhir.rest.param.TokenAndListParam;
import ca.uhn.fhir.test.utilities.JettyUtil; import ca.uhn.fhir.test.utilities.JettyUtil;
import ca.uhn.fhir.util.TestUtil; import ca.uhn.fhir.util.TestUtil;
import ca.uhn.fhir.validation.FhirValidator;
import ca.uhn.fhir.validation.ValidationResult;
import org.apache.commons.io.IOUtils; import org.apache.commons.io.IOUtils;
import org.apache.http.client.methods.CloseableHttpResponse; import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpGet; import org.apache.http.client.methods.HttpGet;
@ -34,13 +32,12 @@ import java.util.List;
import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeUnit;
import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.fail;
public class SearchR5Test { public class SearchR5Test {
private static final org.slf4j.Logger ourLog = org.slf4j.LoggerFactory.getLogger(SearchR5Test.class); private static final org.slf4j.Logger ourLog = org.slf4j.LoggerFactory.getLogger(SearchR5Test.class);
private static final FhirContext ourCtx = FhirContext.forR5Cached();
private static CloseableHttpClient ourClient; private static CloseableHttpClient ourClient;
private static FhirContext ourCtx = FhirContext.forR5();
private static TokenAndListParam ourIdentifiers; private static TokenAndListParam ourIdentifiers;
private static String ourLastMethod; private static String ourLastMethod;
private static int ourPort; private static int ourPort;
@ -60,7 +57,6 @@ public class SearchR5Test {
try (CloseableHttpResponse status = ourClient.execute(httpGet)) { try (CloseableHttpResponse status = ourClient.execute(httpGet)) {
String responseContent = IOUtils.toString(status.getEntity().getContent(), StandardCharsets.UTF_8); String responseContent = IOUtils.toString(status.getEntity().getContent(), StandardCharsets.UTF_8);
ourLog.info(responseContent); ourLog.info(responseContent);
// validate(ourCtx.newJsonParser().parseResource(responseContent));
assertEquals(200, status.getStatusLine().getStatusCode()); assertEquals(200, status.getStatusLine().getStatusCode());
assertEquals("search", ourLastMethod); assertEquals("search", ourLastMethod);
@ -72,15 +68,6 @@ public class SearchR5Test {
} }
private void validate(IBaseResource theResource) {
FhirValidator validatorModule = ourCtx.newValidator();
ValidationResult result = validatorModule.validateWithResult(theResource);
if (!result.isSuccessful()) {
fail(ourCtx.newXmlParser().setPrettyPrint(true).encodeResourceToString(result.toOperationOutcome()));
}
}
public static class DummyPatientResourceProvider implements IResourceProvider { public static class DummyPatientResourceProvider implements IResourceProvider {
@Override @Override
@ -99,7 +86,7 @@ public class SearchR5Test {
for (int i = 0; i < 200; i++) { for (int i = 0; i < 200; i++) {
Patient patient = new Patient(); Patient patient = new Patient();
patient.getIdElement().setValue("Patient/" + i + "/_history/222"); patient.getIdElement().setValue("Patient/" + i + "/_history/222");
ResourceMetadataKeyEnum.ENTRY_SEARCH_MODE.put(patient, BundleEntrySearchModeEnum.INCLUDE.getCode()); ResourceMetadataKeyEnum.ENTRY_SEARCH_MODE.put(patient, BundleEntrySearchModeEnum.INCLUDE);
patient.addName(new HumanName().setFamily("FAMILY")); patient.addName(new HumanName().setFamily("FAMILY"));
patient.setActive(true); patient.setActive(true);
retVal.add(patient); retVal.add(patient);