Work on seed bundles

This commit is contained in:
jamesagnew 2020-06-29 17:10:33 -04:00
parent ed2e62752e
commit 7cde945281
5 changed files with 72 additions and 15 deletions

View File

@ -9,6 +9,7 @@ import ca.uhn.fhir.model.api.IQueryParameterType;
import ca.uhn.fhir.model.primitive.IdDt; import ca.uhn.fhir.model.primitive.IdDt;
import ca.uhn.fhir.model.primitive.IntegerDt; import ca.uhn.fhir.model.primitive.IntegerDt;
import ca.uhn.fhir.rest.annotation.IdParam; import ca.uhn.fhir.rest.annotation.IdParam;
import ca.uhn.fhir.rest.api.Constants;
import ca.uhn.fhir.rest.api.QualifiedParamList; import ca.uhn.fhir.rest.api.QualifiedParamList;
import ca.uhn.fhir.rest.api.RestSearchParameterTypeEnum; import ca.uhn.fhir.rest.api.RestSearchParameterTypeEnum;
import ca.uhn.fhir.rest.param.binder.QueryParameterAndBinder; import ca.uhn.fhir.rest.param.binder.QueryParameterAndBinder;
@ -386,4 +387,10 @@ public class ParameterUtil {
return b.toString(); return b.toString();
} }
/**
* Returns true if the value is :iterate or :recurse (the former name of :iterate) for an _include parameter
*/
public static boolean isIncludeIterate(String theQualifier) {
return Constants.PARAM_INCLUDE_QUALIFIER_RECURSE.equals(theQualifier) || Constants.PARAM_INCLUDE_QUALIFIER_ITERATE.equals(theQualifier);
}
} }

View File

@ -1018,6 +1018,7 @@ public class RestHookTestR4Test extends BaseSubscriptionsR4Test {
{ {
Subscription subscription = newSubscription("Observation?", "application/json"); Subscription subscription = newSubscription("Observation?", "application/json");
subscription.addExtension(JpaConstants.EXT_SUBSCRIPTION_PAYLOAD_SEARCH_RESULT, new StringType("Observation?_id=${matched_resource_id}&_include=*")); subscription.addExtension(JpaConstants.EXT_SUBSCRIPTION_PAYLOAD_SEARCH_RESULT, new StringType("Observation?_id=${matched_resource_id}&_include=*"));
ourLog.info(myFhirCtx.newJsonParser().setPrettyPrint(true).encodeResourceToString(subscription));
MethodOutcome methodOutcome = ourClient.create().resource(subscription).execute(); MethodOutcome methodOutcome = ourClient.create().resource(subscription).execute();
mySubscriptionIds.add(methodOutcome.getId()); mySubscriptionIds.add(methodOutcome.getId());
waitForActivatedSubscriptionCount(1); waitForActivatedSubscriptionCount(1);

View File

@ -26,6 +26,7 @@ import ca.uhn.fhir.context.RuntimeSearchParam;
import ca.uhn.fhir.jpa.searchparam.registry.ISearchParamRegistry; import ca.uhn.fhir.jpa.searchparam.registry.ISearchParamRegistry;
import ca.uhn.fhir.model.api.IQueryParameterAnd; import ca.uhn.fhir.model.api.IQueryParameterAnd;
import ca.uhn.fhir.model.api.IQueryParameterType; import ca.uhn.fhir.model.api.IQueryParameterType;
import ca.uhn.fhir.model.api.Include;
import ca.uhn.fhir.rest.api.Constants; import ca.uhn.fhir.rest.api.Constants;
import ca.uhn.fhir.rest.api.QualifiedParamList; import ca.uhn.fhir.rest.api.QualifiedParamList;
import ca.uhn.fhir.rest.api.RestSearchParameterTypeEnum; import ca.uhn.fhir.rest.api.RestSearchParameterTypeEnum;
@ -50,7 +51,7 @@ public class MatchUrlService {
@Autowired @Autowired
private ISearchParamRegistry mySearchParamRegistry; private ISearchParamRegistry mySearchParamRegistry;
public SearchParameterMap translateMatchUrl(String theMatchUrl, RuntimeResourceDefinition theResourceDefinition) { public SearchParameterMap translateMatchUrl(String theMatchUrl, RuntimeResourceDefinition theResourceDefinition, Flag... theFlags) {
SearchParameterMap paramMap = new SearchParameterMap(); SearchParameterMap paramMap = new SearchParameterMap();
List<NameValuePair> parameters = translateMatchUrl(theMatchUrl); List<NameValuePair> parameters = translateMatchUrl(theMatchUrl);
@ -79,6 +80,13 @@ public class MatchUrlService {
for (String nextParamName : nameToParamLists.keySet()) { for (String nextParamName : nameToParamLists.keySet()) {
List<QualifiedParamList> paramList = nameToParamLists.get(nextParamName); List<QualifiedParamList> paramList = nameToParamLists.get(nextParamName);
if (theFlags != null && theFlags.length > 0) {
for (Flag next : theFlags) {
next.process(nextParamName, paramList, paramMap);
}
}
if (Constants.PARAM_LASTUPDATED.equals(nextParamName)) { if (Constants.PARAM_LASTUPDATED.equals(nextParamName)) {
if (paramList != null && paramList.size() > 0) { if (paramList != null && paramList.size() > 0) {
if (paramList.size() > 2) { if (paramList.size() > 2) {
@ -131,8 +139,8 @@ public class MatchUrlService {
return UrlUtil.translateMatchUrl(theMatchUrl); return UrlUtil.translateMatchUrl(theMatchUrl);
} }
private IQueryParameterAnd newInstanceAnd(String theParamType) { private IQueryParameterAnd<?> newInstanceAnd(String theParamType) {
Class<? extends IQueryParameterAnd> clazz = ResourceMetaParams.RESOURCE_META_AND_PARAMS.get(theParamType); Class<? extends IQueryParameterAnd<?>> clazz = ResourceMetaParams.RESOURCE_META_AND_PARAMS.get(theParamType);
return ReflectionUtil.newInstance(clazz); return ReflectionUtil.newInstance(clazz);
} }
@ -140,4 +148,44 @@ public class MatchUrlService {
Class<? extends IQueryParameterType> clazz = ResourceMetaParams.RESOURCE_META_PARAMS.get(theParamType); Class<? extends IQueryParameterType> clazz = ResourceMetaParams.RESOURCE_META_PARAMS.get(theParamType);
return ReflectionUtil.newInstance(clazz); return ReflectionUtil.newInstance(clazz);
} }
public abstract static class Flag {
/**
* Constructor
*/
Flag() {
// nothing
}
abstract void process(String theParamName, List<QualifiedParamList> theValues, SearchParameterMap theMapToPopulate);
}
/**
* Indicates that the parser should process _include and _revinclude (by default these are not handled)
*/
public static Flag processIncludes() {
return new Flag() {
@Override
void process(String theParamName, List<QualifiedParamList> theValues, SearchParameterMap theMapToPopulate) {
if (Constants.PARAM_INCLUDE.equals(theParamName)) {
for (QualifiedParamList nextQualifiedList : theValues) {
for (String nextValue : nextQualifiedList) {
theMapToPopulate.addInclude(new Include(nextValue, ParameterUtil.isIncludeIterate(nextQualifiedList.getQualifier())));
}
}
} else if (Constants.PARAM_REVINCLUDE.equals(theParamName)) {
for (QualifiedParamList nextQualifiedList : theValues) {
for (String nextValue : nextQualifiedList) {
theMapToPopulate.addInclude(new Include(nextValue, ParameterUtil.isIncludeIterate(nextQualifiedList.getQualifier())));
}
}
}
}
};
}
} }

View File

@ -100,7 +100,7 @@ public class SubscriptionDeliveringRestHookSubscriber extends BaseSubscriptionDe
Map<String, String> valueMap = new HashMap<>(1); Map<String, String> valueMap = new HashMap<>(1);
valueMap.put("matched_resource_id", thePayloadResource.getIdElement().toUnqualifiedVersionless().getValue()); valueMap.put("matched_resource_id", thePayloadResource.getIdElement().toUnqualifiedVersionless().getValue());
payloadUrl = new StringSubstitutor(valueMap).replace(payloadUrl); payloadUrl = new StringSubstitutor(valueMap).replace(payloadUrl);
SearchParameterMap payloadSearchMap = myMatchUrlService.translateMatchUrl(payloadUrl, resourceDefinition); SearchParameterMap payloadSearchMap = myMatchUrlService.translateMatchUrl(payloadUrl, resourceDefinition, MatchUrlService.processIncludes());
payloadSearchMap.setLoadSynchronous(true); payloadSearchMap.setLoadSynchronous(true);
IBundleProvider searchResults = dao.search(payloadSearchMap); IBundleProvider searchResults = dao.search(payloadSearchMap);

View File

@ -20,14 +20,6 @@ package ca.uhn.fhir.rest.server.method;
* #L% * #L%
*/ */
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import java.util.TreeSet;
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.Include; import ca.uhn.fhir.model.api.Include;
@ -35,9 +27,18 @@ import ca.uhn.fhir.rest.annotation.IncludeParam;
import ca.uhn.fhir.rest.api.Constants; import ca.uhn.fhir.rest.api.Constants;
import ca.uhn.fhir.rest.api.QualifiedParamList; import ca.uhn.fhir.rest.api.QualifiedParamList;
import ca.uhn.fhir.rest.api.RestSearchParameterTypeEnum; import ca.uhn.fhir.rest.api.RestSearchParameterTypeEnum;
import ca.uhn.fhir.rest.param.ParameterUtil;
import ca.uhn.fhir.rest.server.exceptions.InternalErrorException; import ca.uhn.fhir.rest.server.exceptions.InternalErrorException;
import ca.uhn.fhir.rest.server.exceptions.InvalidRequestException; import ca.uhn.fhir.rest.server.exceptions.InvalidRequestException;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import java.util.TreeSet;
class IncludeParameter extends BaseQueryParameter { class IncludeParameter extends BaseQueryParameter {
private Set<String> myAllow; private Set<String> myAllow;
@ -142,7 +143,7 @@ class IncludeParameter extends BaseQueryParameter {
} }
String qualifier = nextParamList.getQualifier(); String qualifier = nextParamList.getQualifier();
boolean recurse = Constants.PARAM_INCLUDE_QUALIFIER_RECURSE.equals(qualifier) || Constants.PARAM_INCLUDE_QUALIFIER_ITERATE.equals(qualifier); boolean iterate = ParameterUtil.isIncludeIterate(qualifier);
String value = nextParamList.get(0); String value = nextParamList.get(0);
if (myAllow != null && !myAllow.isEmpty()) { if (myAllow != null && !myAllow.isEmpty()) {
@ -157,10 +158,10 @@ class IncludeParameter extends BaseQueryParameter {
if (mySpecType == String.class) { if (mySpecType == String.class) {
return value; return value;
} }
return new Include(value, recurse); return new Include(value, iterate);
} }
retValCollection.add(new Include(value, recurse)); retValCollection.add(new Include(value, iterate));
} }
return retValCollection; return retValCollection;