From 3062430bc57baebb91c8fd6cb1ac28be8a00c678 Mon Sep 17 00:00:00 2001 From: StevenXLi Date: Tue, 18 Jan 2022 14:56:10 -0500 Subject: [PATCH] 2720 rest hook subscription with payload search criteria is not getting triggered (#3308) * Added IT for Payload Search REST HOOK subscription, fixed issue with null pointer exception * removed todo comment, added changelog Co-authored-by: Steven Li --- ...arch-criteria-is-not-getting-triggered.yaml | 5 +++++ ...bscriptionDeliveringRestHookSubscriber.java | 7 ++++--- .../matching/DaoSubscriptionMatcher.java | 9 +++------ .../subscription/util/SubscriptionUtil.java | 18 ++++++++++++++++++ 4 files changed, 30 insertions(+), 9 deletions(-) create mode 100644 hapi-fhir-docs/src/main/resources/ca/uhn/hapi/fhir/changelog/5_7_0/2720-rest-hook-subscription-with-payload-search-criteria-is-not-getting-triggered.yaml create mode 100644 hapi-fhir-jpaserver-subscription/src/main/java/ca/uhn/fhir/jpa/subscription/util/SubscriptionUtil.java diff --git a/hapi-fhir-docs/src/main/resources/ca/uhn/hapi/fhir/changelog/5_7_0/2720-rest-hook-subscription-with-payload-search-criteria-is-not-getting-triggered.yaml b/hapi-fhir-docs/src/main/resources/ca/uhn/hapi/fhir/changelog/5_7_0/2720-rest-hook-subscription-with-payload-search-criteria-is-not-getting-triggered.yaml new file mode 100644 index 00000000000..1989580a969 --- /dev/null +++ b/hapi-fhir-docs/src/main/resources/ca/uhn/hapi/fhir/changelog/5_7_0/2720-rest-hook-subscription-with-payload-search-criteria-is-not-getting-triggered.yaml @@ -0,0 +1,5 @@ +--- +type: fix +issue: 2720 +title: "Using the delivery option: Payload Search Result Mode for rest-rook subscriptions on a partition enabled + server would cause a NPE. This issue has been fixed." diff --git a/hapi-fhir-jpaserver-subscription/src/main/java/ca/uhn/fhir/jpa/subscription/match/deliver/resthook/SubscriptionDeliveringRestHookSubscriber.java b/hapi-fhir-jpaserver-subscription/src/main/java/ca/uhn/fhir/jpa/subscription/match/deliver/resthook/SubscriptionDeliveringRestHookSubscriber.java index df06871576d..b5061e313e2 100644 --- a/hapi-fhir-jpaserver-subscription/src/main/java/ca/uhn/fhir/jpa/subscription/match/deliver/resthook/SubscriptionDeliveringRestHookSubscriber.java +++ b/hapi-fhir-jpaserver-subscription/src/main/java/ca/uhn/fhir/jpa/subscription/match/deliver/resthook/SubscriptionDeliveringRestHookSubscriber.java @@ -64,6 +64,7 @@ import java.util.HashMap; import java.util.List; import java.util.Map; +import static ca.uhn.fhir.jpa.subscription.util.SubscriptionUtil.createRequestDetailForPartitionedRequest; import static org.apache.commons.lang3.StringUtils.isNotBlank; @Scope("prototype") @@ -154,7 +155,7 @@ public class SubscriptionDeliveringRestHookSubscriber extends BaseSubscriptionDe SearchParameterMap payloadSearchMap = myMatchUrlService.translateMatchUrl(payloadUrl, resourceDefinition, MatchUrlService.processIncludes()); payloadSearchMap.setLoadSynchronous(true); - IBundleProvider searchResults = dao.search(payloadSearchMap); + IBundleProvider searchResults = dao.search(payloadSearchMap, createRequestDetailForPartitionedRequest(theSubscription)); BundleBuilder builder = new BundleBuilder(myFhirContext); for (IBaseResource next : searchResults.getAllResources()) { @@ -169,7 +170,7 @@ public class SubscriptionDeliveringRestHookSubscriber extends BaseSubscriptionDe RuntimeResourceDefinition resourceDef = myFhirContext.getResourceDefinition(payloadId.getResourceType()); SystemRequestDetails systemRequestDetails = new SystemRequestDetails().setRequestPartitionId(thePartitionId); IFhirResourceDao dao = myDaoRegistry.getResourceDao(resourceDef.getImplementingClass()); - return dao.read(payloadId.toVersionless(), systemRequestDetails, theDeletedOK); + return dao.read(payloadId.toVersionless(), systemRequestDetails, theDeletedOK); } @@ -297,5 +298,5 @@ public class SubscriptionDeliveringRestHookSubscriber extends BaseSubscriptionDe } return headers; } - + } diff --git a/hapi-fhir-jpaserver-subscription/src/main/java/ca/uhn/fhir/jpa/subscription/match/matcher/matching/DaoSubscriptionMatcher.java b/hapi-fhir-jpaserver-subscription/src/main/java/ca/uhn/fhir/jpa/subscription/match/matcher/matching/DaoSubscriptionMatcher.java index 999c7ab3913..1d5712ef62f 100644 --- a/hapi-fhir-jpaserver-subscription/src/main/java/ca/uhn/fhir/jpa/subscription/match/matcher/matching/DaoSubscriptionMatcher.java +++ b/hapi-fhir-jpaserver-subscription/src/main/java/ca/uhn/fhir/jpa/subscription/match/matcher/matching/DaoSubscriptionMatcher.java @@ -24,21 +24,20 @@ import ca.uhn.fhir.context.FhirContext; import ca.uhn.fhir.context.RuntimeResourceDefinition; import ca.uhn.fhir.jpa.api.dao.DaoRegistry; import ca.uhn.fhir.jpa.api.dao.IFhirResourceDao; -import ca.uhn.fhir.jpa.model.entity.PartitionablePartitionId; -import ca.uhn.fhir.jpa.partition.SystemRequestDetails; import ca.uhn.fhir.jpa.searchparam.MatchUrlService; import ca.uhn.fhir.jpa.searchparam.SearchParameterMap; import ca.uhn.fhir.jpa.searchparam.matcher.InMemoryMatchResult; import ca.uhn.fhir.jpa.subscription.model.CanonicalSubscription; import ca.uhn.fhir.jpa.subscription.model.ResourceModifiedMessage; import ca.uhn.fhir.rest.api.server.IBundleProvider; -import ca.uhn.fhir.rest.api.server.RequestDetails; import org.hl7.fhir.instance.model.api.IBaseResource; import org.hl7.fhir.instance.model.api.IIdType; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; +import static ca.uhn.fhir.jpa.subscription.util.SubscriptionUtil.createRequestDetailForPartitionedRequest; + public class DaoSubscriptionMatcher implements ISubscriptionMatcher { private final Logger ourLog = LoggerFactory.getLogger(DaoSubscriptionMatcher.class); @@ -77,9 +76,7 @@ public class DaoSubscriptionMatcher implements ISubscriptionMatcher { IFhirResourceDao responseDao = myDaoRegistry.getResourceDao(responseResourceDef.getImplementingClass()); responseCriteriaUrl.setLoadSynchronousUpTo(1); - PartitionablePartitionId partitionId = new PartitionablePartitionId(theSubscription.getRequestPartitionId(), null); - RequestDetails systemRequestDetails = new SystemRequestDetails().setRequestPartitionId(partitionId.toPartitionId()); - return responseDao.search(responseCriteriaUrl, systemRequestDetails); + return responseDao.search(responseCriteriaUrl, createRequestDetailForPartitionedRequest(theSubscription)); } } diff --git a/hapi-fhir-jpaserver-subscription/src/main/java/ca/uhn/fhir/jpa/subscription/util/SubscriptionUtil.java b/hapi-fhir-jpaserver-subscription/src/main/java/ca/uhn/fhir/jpa/subscription/util/SubscriptionUtil.java new file mode 100644 index 00000000000..68634588be4 --- /dev/null +++ b/hapi-fhir-jpaserver-subscription/src/main/java/ca/uhn/fhir/jpa/subscription/util/SubscriptionUtil.java @@ -0,0 +1,18 @@ +package ca.uhn.fhir.jpa.subscription.util; + +import ca.uhn.fhir.interceptor.model.RequestPartitionId; +import ca.uhn.fhir.jpa.model.entity.PartitionablePartitionId; +import ca.uhn.fhir.jpa.partition.SystemRequestDetails; +import ca.uhn.fhir.jpa.subscription.model.CanonicalSubscription; +import ca.uhn.fhir.rest.api.server.RequestDetails; + +/** + * Utilities for working with the subscription resource + */ +public class SubscriptionUtil { + + public static RequestDetails createRequestDetailForPartitionedRequest(CanonicalSubscription theSubscription) { + RequestPartitionId requestPartitionId = new PartitionablePartitionId(theSubscription.getRequestPartitionId(), null).toPartitionId(); + return new SystemRequestDetails().setRequestPartitionId(requestPartitionId); + } +}