2789 nullpointerexception rest hook subscription is not being triggered when cross partition is (#3370)
* Fixed null pointer exception for re-loading subscription on cdr restart and when there's no partition id in the request, and added tests * added changelogs for this fix Co-authored-by: Steven Li <steven@smilecdr.com>
This commit is contained in:
parent
43f570259e
commit
7841e578ab
|
@ -0,0 +1,6 @@
|
|||
---
|
||||
type: fix
|
||||
issue: 2789
|
||||
title: "When cross-partition reference Mode is used, the rest-hook subscriptions on a partition enabled server would
|
||||
cause a NPE. Cause of this is from the reloading of the subscription when the server is restarted.
|
||||
This issue has been fixed. Also fixed issue with revinclude for rest-hook subscription not working."
|
|
@ -35,7 +35,6 @@ import org.apache.commons.lang3.Validate;
|
|||
|
||||
import javax.annotation.Nonnull;
|
||||
import java.util.List;
|
||||
import java.util.Optional;
|
||||
import java.util.stream.Collectors;
|
||||
import java.util.stream.StreamSupport;
|
||||
|
||||
|
|
|
@ -20,11 +20,7 @@ package ca.uhn.fhir.jpa.search.autocomplete;
|
|||
* #L%
|
||||
*/
|
||||
|
||||
import ca.uhn.fhir.context.FhirContext;
|
||||
import ca.uhn.fhir.rest.param.TokenParam;
|
||||
import ca.uhn.fhir.util.TerserUtil;
|
||||
import org.apache.commons.lang3.Validate;
|
||||
import org.hl7.fhir.instance.model.api.IBaseCoding;
|
||||
|
||||
import javax.annotation.Nonnull;
|
||||
|
||||
|
|
|
@ -28,7 +28,6 @@ import ca.uhn.fhir.model.api.IQueryParameterType;
|
|||
import ca.uhn.fhir.rest.param.StringParam;
|
||||
import com.google.gson.JsonObject;
|
||||
import org.apache.commons.lang3.StringUtils;
|
||||
import org.apache.commons.lang3.Validate;
|
||||
import org.hibernate.search.backend.elasticsearch.ElasticsearchExtension;
|
||||
import org.hibernate.search.engine.search.aggregation.AggregationKey;
|
||||
import org.hibernate.search.engine.search.aggregation.SearchAggregation;
|
||||
|
@ -36,14 +35,12 @@ import org.hibernate.search.engine.search.query.SearchResult;
|
|||
import org.hibernate.search.engine.search.query.dsl.SearchQueryOptionsStep;
|
||||
import org.hibernate.search.mapper.orm.search.loading.dsl.SearchLoadingOptionsStep;
|
||||
import org.hibernate.search.mapper.orm.session.SearchSession;
|
||||
import org.hl7.fhir.instance.model.api.IBaseCoding;
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
|
||||
import javax.annotation.Nonnull;
|
||||
import java.util.Collections;
|
||||
import java.util.List;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
import static org.apache.commons.lang3.StringUtils.isNotBlank;
|
||||
|
||||
|
|
|
@ -21,17 +21,12 @@ package ca.uhn.fhir.jpa.search.autocomplete;
|
|||
*/
|
||||
|
||||
import ca.uhn.fhir.context.FhirContext;
|
||||
import ca.uhn.fhir.rest.api.Constants;
|
||||
import ca.uhn.fhir.rest.param.TokenParam;
|
||||
import ca.uhn.fhir.util.TerserUtil;
|
||||
import org.hibernate.search.mapper.orm.session.SearchSession;
|
||||
import org.hl7.fhir.instance.model.api.IBaseBackboneElement;
|
||||
import org.hl7.fhir.instance.model.api.IBaseCoding;
|
||||
import org.hl7.fhir.instance.model.api.IBaseResource;
|
||||
import org.hl7.fhir.r4.model.ValueSet;
|
||||
|
||||
import java.util.List;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
/**
|
||||
* Adapt the autocomplete result into a ValueSet suitable for our $expand extension.
|
||||
|
|
|
@ -20,10 +20,10 @@ package ca.uhn.fhir.jpa.searchparam;
|
|||
* #L%
|
||||
*/
|
||||
|
||||
import ca.uhn.fhir.i18n.Msg;
|
||||
import ca.uhn.fhir.context.FhirContext;
|
||||
import ca.uhn.fhir.context.RuntimeResourceDefinition;
|
||||
import ca.uhn.fhir.context.RuntimeSearchParam;
|
||||
import ca.uhn.fhir.i18n.Msg;
|
||||
import ca.uhn.fhir.interceptor.model.RequestPartitionId;
|
||||
import ca.uhn.fhir.jpa.model.util.JpaConstants;
|
||||
import ca.uhn.fhir.jpa.searchparam.util.JpaParamUtil;
|
||||
|
@ -203,7 +203,7 @@ public class MatchUrlService {
|
|||
} else if (Constants.PARAM_REVINCLUDE.equals(theParamName)) {
|
||||
for (QualifiedParamList nextQualifiedList : theValues) {
|
||||
for (String nextValue : nextQualifiedList) {
|
||||
theMapToPopulate.addInclude(new Include(nextValue, ParameterUtil.isIncludeIterate(nextQualifiedList.getQualifier())));
|
||||
theMapToPopulate.addRevInclude(new Include(nextValue, ParameterUtil.isIncludeIterate(nextQualifiedList.getQualifier())));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -127,8 +127,9 @@ public class SubscriptionMatchingSubscriber implements MessageHandler {
|
|||
for (ActiveSubscription nextActiveSubscription : subscriptions) {
|
||||
// skip if the partitions don't match
|
||||
CanonicalSubscription subscription = nextActiveSubscription.getSubscription();
|
||||
if (subscription != null && subscription.getRequestPartitionId() != null && theMsg.getPartitionId() != null
|
||||
&& !subscription.getCrossPartitionEnabled() && !theMsg.getPartitionId().hasPartitionId(subscription.getRequestPartitionId())) {
|
||||
if (subscription != null && subscription.getRequestPartitionId() != null && theMsg.getPartitionId() != null &&
|
||||
theMsg.getPartitionId().hasPartitionIds() && !subscription.getCrossPartitionEnabled() &&
|
||||
!theMsg.getPartitionId().hasPartitionId(subscription.getRequestPartitionId())) {
|
||||
continue;
|
||||
}
|
||||
String nextSubscriptionId = getId(nextActiveSubscription);
|
||||
|
@ -146,7 +147,7 @@ public class SubscriptionMatchingSubscriber implements MessageHandler {
|
|||
}
|
||||
|
||||
if (theMsg.getOperationType().equals(DELETE)) {
|
||||
if (! nextActiveSubscription.getSubscription().getSendDeleteMessages()) {
|
||||
if (!nextActiveSubscription.getSubscription().getSendDeleteMessages()) {
|
||||
ourLog.trace("Not processing modified message for {}", theMsg.getOperationType());
|
||||
return;
|
||||
}
|
||||
|
|
|
@ -242,7 +242,8 @@ public class SubscriptionLoader implements IResourceChangeListener {
|
|||
return;
|
||||
}
|
||||
IFhirResourceDao<?> subscriptionDao = getSubscriptionDao();
|
||||
List<IBaseResource> resourceList = theResourceIds.stream().map(subscriptionDao::read).collect(Collectors.toList());
|
||||
SystemRequestDetails systemRequestDetails = SystemRequestDetails.forAllPartition();
|
||||
List<IBaseResource> resourceList = theResourceIds.stream().map(n -> subscriptionDao.read(n, systemRequestDetails)).collect(Collectors.toList());
|
||||
updateSubscriptionRegistry(resourceList);
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue