diff --git a/core/com.b2international.snowowl.core.rest/src/com/b2international/snowowl/core/rest/util/PromiseMethodReturnValueHandler.java b/core/com.b2international.snowowl.core.rest/src/com/b2international/snowowl/core/rest/util/PromiseMethodReturnValueHandler.java index 61894f3c29..b630357a42 100644 --- a/core/com.b2international.snowowl.core.rest/src/com/b2international/snowowl/core/rest/util/PromiseMethodReturnValueHandler.java +++ b/core/com.b2international.snowowl.core.rest/src/com/b2international/snowowl/core/rest/util/PromiseMethodReturnValueHandler.java @@ -33,6 +33,7 @@ import com.b2international.snowowl.core.api.SnowowlRuntimeException; import com.b2international.snowowl.core.events.util.Promise; import com.b2international.snowowl.core.events.util.Response; +import com.b2international.snowowl.eventbus.IEventBus; import com.google.common.collect.Iterables; import jakarta.servlet.http.HttpServletResponse; @@ -99,8 +100,10 @@ private Response setDeferredResult(DeferredResult> result, // see Spring Security issue not being able to properly prevent duplicate caching headers // https://github.com/spring-projects/spring-security/issues/12865 responseHeaders.forEach((entry) -> { - // XXX using set header here, for most of our use cases we only need a single response header, so overwrite anything that has been injected by Spring earlier - webRequest.getNativeResponse(HttpServletResponse.class).setHeader(entry.getKey(), entry.getValue()); + if (!IEventBus.SEND_STACK_HEADER.equals(entry.getKey())) { + // XXX using set header here, for most of our use cases we only need a single response header, so overwrite anything that has been injected by Spring earlier + webRequest.getNativeResponse(HttpServletResponse.class).setHeader(entry.getKey(), entry.getValue()); + } }); result.setResult(response); diff --git a/core/com.b2international.snowowl.core/src/com/b2international/snowowl/core/repository/ApiRequestHandler.java b/core/com.b2international.snowowl.core/src/com/b2international/snowowl/core/repository/ApiRequestHandler.java index ff5d907078..f9183a1295 100644 --- a/core/com.b2international.snowowl.core/src/com/b2international/snowowl/core/repository/ApiRequestHandler.java +++ b/core/com.b2international.snowowl.core/src/com/b2international/snowowl/core/repository/ApiRequestHandler.java @@ -87,7 +87,7 @@ public final void handle(IMessage message) { message.fail(e.getCause()); } catch (ApiException e) { if (IEventBus.RECORD_SEND_STACK) { - System.err.println(message.headers().get("sendStack")); + System.err.println(message.headers().get(IEventBus.SEND_STACK_HEADER)); } message.fail(e); diff --git a/netty/com.b2international.snowowl.eventbus/src/com/b2international/snowowl/eventbus/IEventBus.java b/netty/com.b2international.snowowl.eventbus/src/com/b2international/snowowl/eventbus/IEventBus.java index 99be45b16e..bbdbf87fe2 100644 --- a/netty/com.b2international.snowowl.eventbus/src/com/b2international/snowowl/eventbus/IEventBus.java +++ b/netty/com.b2international.snowowl.eventbus/src/com/b2international/snowowl/eventbus/IEventBus.java @@ -30,6 +30,11 @@ public interface IEventBus { * Feature flag for send-time stack tracing */ boolean RECORD_SEND_STACK = Boolean.getBoolean("eventbus.record.stack"); + + /** + * The message header used for send-time call stack tracing + */ + String SEND_STACK_HEADER = "sendStack"; /** * The address where handler registration and un-registration messages are sent. diff --git a/netty/com.b2international.snowowl.eventbus/src/com/b2international/snowowl/internal/eventbus/EventBus.java b/netty/com.b2international.snowowl.eventbus/src/com/b2international/snowowl/internal/eventbus/EventBus.java index 7660fb3c51..fc2670088c 100644 --- a/netty/com.b2international.snowowl.eventbus/src/com/b2international/snowowl/internal/eventbus/EventBus.java +++ b/netty/com.b2international.snowowl.eventbus/src/com/b2international/snowowl/internal/eventbus/EventBus.java @@ -164,7 +164,7 @@ public IEventBus publish(String address, Object message, String tag, Map headersWithStack = newHashMap(message.headers()); - headersWithStack.put("sendStack", sendStack); + headersWithStack.put(SEND_STACK_HEADER, sendStack); message.headers = Map.copyOf(headersWithStack); } catch (IOException unexpected) { diff --git a/snomed/com.b2international.snowowl.snomed.datastore/src/com/b2international/snowowl/snomed/datastore/request/SnomedRefSetMemberSearchRequest.java b/snomed/com.b2international.snowowl.snomed.datastore/src/com/b2international/snowowl/snomed/datastore/request/SnomedRefSetMemberSearchRequest.java index 7ee0ebe8d5..d5e4e65b85 100644 --- a/snomed/com.b2international.snowowl.snomed.datastore/src/com/b2international/snowowl/snomed/datastore/request/SnomedRefSetMemberSearchRequest.java +++ b/snomed/com.b2international.snowowl.snomed.datastore/src/com/b2international/snowowl/snomed/datastore/request/SnomedRefSetMemberSearchRequest.java @@ -42,9 +42,7 @@ import com.b2international.snowowl.snomed.datastore.converter.SnomedReferenceSetMemberConverter; import com.b2international.snowowl.snomed.datastore.index.entry.SnomedDocument; import com.b2international.snowowl.snomed.datastore.index.entry.SnomedRefSetMemberIndexEntry; -import com.google.common.collect.ImmutableSortedMap; -import com.google.common.collect.Iterables; -import com.google.common.collect.Sets; +import com.google.common.collect.*; /** * @since 4.5 @@ -53,6 +51,16 @@ public final class SnomedRefSetMemberSearchRequest extends SnomedSearchRequest REPLACE_VALUE_FIELD = ImmutableMultimap.builder() + .putAll(SnomedRf2Headers.FIELD_VALUE, + SnomedRefSetMemberIndexEntry.Fields.BOOLEAN_VALUE, + SnomedRefSetMemberIndexEntry.Fields.DECIMAL_VALUE, + SnomedRefSetMemberIndexEntry.Fields.INTEGER_VALUE, + SnomedRefSetMemberIndexEntry.Fields.STRING_VALUE, + SnomedRefSetMemberIndexEntry.Fields.DATA_TYPE) + .build(); + private static final SortedMap> SUPPORTED_MEMBER_FIELDS = ImmutableSortedMap.>naturalOrder() // String types, ECL support .put(SnomedRf2Headers.FIELD_REFERENCED_COMPONENT_ID, new SnomedRefsetMemberFieldQueryHandler<>(String.class, SnomedRefSetMemberIndexEntry.Expressions::referencedComponentIds, true)) @@ -147,6 +155,11 @@ protected Class getDocumentType() { return SnomedRefSetMemberIndexEntry.class; } + @Override + protected Multimap collectFieldsToLoadReplacements() { + return REPLACE_VALUE_FIELD; + } + @Override protected Expression prepareQuery(BranchContext context) { final Collection referencedComponentIds = getCollection(OptionKey.REFERENCED_COMPONENT, String.class); diff --git a/snomed/com.b2international.snowowl.snomed.datastore/src/com/b2international/snowowl/snomed/datastore/request/SnomedRelationshipSearchRequest.java b/snomed/com.b2international.snowowl.snomed.datastore/src/com/b2international/snowowl/snomed/datastore/request/SnomedRelationshipSearchRequest.java index c1cdd485d1..0463cd9eca 100644 --- a/snomed/com.b2international.snowowl.snomed.datastore/src/com/b2international/snowowl/snomed/datastore/request/SnomedRelationshipSearchRequest.java +++ b/snomed/com.b2international.snowowl.snomed.datastore/src/com/b2international/snowowl/snomed/datastore/request/SnomedRelationshipSearchRequest.java @@ -44,8 +44,12 @@ */ final class SnomedRelationshipSearchRequest extends SnomedComponentSearchRequest { + // Requesting the "value" field should load "numericValue", "stringValue" and "valueType" instead private static final Multimap REPLACE_VALUE_FIELD = ImmutableMultimap.builder() - .putAll(SnomedRelationship.Fields.VALUE, SnomedRelationshipIndexEntry.Fields.NUMERIC_VALUE, SnomedRelationshipIndexEntry.Fields.STRING_VALUE, SnomedRelationshipIndexEntry.Fields.VALUE_TYPE) + .putAll(SnomedRelationship.Fields.VALUE, + SnomedRelationshipIndexEntry.Fields.NUMERIC_VALUE, + SnomedRelationshipIndexEntry.Fields.STRING_VALUE, + SnomedRelationshipIndexEntry.Fields.VALUE_TYPE) .build(); enum OptionKey {