@Test public void addNativeHeader() { MultiValueMap<String, String> nativeHeaders = new LinkedMultiValueMap<>(); nativeHeaders.add("foo", "bar"); NativeMessageHeaderAccessor headers = new NativeMessageHeaderAccessor(nativeHeaders); headers.addNativeHeader("foo", "baz"); assertEquals(Arrays.asList("bar", "baz"), headers.getNativeHeader("foo")); }
/** * Add the specified native header value to existing values. */ public void addNativeHeader(String name, @Nullable String value) { Assert.state(isMutable(), "Already immutable"); if (value == null) { return; } Map<String, List<String>> nativeHeaders = getNativeHeaders(); if (nativeHeaders == null) { nativeHeaders = new LinkedMultiValueMap<>(4); setHeader(NATIVE_HEADERS, nativeHeaders); } List<String> values = nativeHeaders.computeIfAbsent(name, k -> new LinkedList<>()); values.add(value); setModified(true); }
@Override public String getShortLogMessage(Object payload) { if (getMessageType() == null) { return super.getDetailedLogMessage(payload); } StringBuilder sb = getBaseLogMessage(); if (!CollectionUtils.isEmpty(getSessionAttributes())) { sb.append(" attributes[").append(getSessionAttributes().size()).append("]"); } sb.append(getShortPayloadLogMessage(payload)); return sb.toString(); }
@Override public void setImmutable() { if (isMutable()) { Map<String, List<String>> map = getNativeHeaders(); if (map != null) { // Force removal since setHeader checks for equality removeHeader(NATIVE_HEADERS); setHeader(NATIVE_HEADERS, Collections.unmodifiableMap(map)); } super.setImmutable(); } }
/** * A protected constructor accepting the headers of an existing message to copy. */ protected NativeMessageHeaderAccessor(@Nullable Message<?> message) { super(message); if (message != null) { @SuppressWarnings("unchecked") Map<String, List<String>> map = (Map<String, List<String>>) getHeader(NATIVE_HEADERS); if (map != null) { // Force removal since setHeader checks for equality removeHeader(NATIVE_HEADERS); setHeader(NATIVE_HEADERS, new LinkedMultiValueMap<>(map)); } } }
@Nullable public List<String> removeNativeHeader(String name) { Assert.state(isMutable(), "Already immutable"); Map<String, List<String>> nativeHeaders = getNativeHeaders(); if (nativeHeaders == null) { return null; } return nativeHeaders.remove(name); }
/** * Whether the native header map contains the give header name. */ public boolean containsNativeHeader(String headerName) { Map<String, List<String>> map = getNativeHeaders(); return (map != null && map.containsKey(headerName)); }
@Test public void createFromMessageAndModify() { MultiValueMap<String, String> inputNativeHeaders = new LinkedMultiValueMap<>(); inputNativeHeaders.add("foo", "bar"); inputNativeHeaders.add("bar", "baz"); Map<String, Object> nativeHeaders = new HashMap<>(); nativeHeaders.put("a", "b"); nativeHeaders.put(NativeMessageHeaderAccessor.NATIVE_HEADERS, inputNativeHeaders); GenericMessage<String> message = new GenericMessage<>("p", nativeHeaders); NativeMessageHeaderAccessor headerAccessor = new NativeMessageHeaderAccessor(message); headerAccessor.setHeader("a", "B"); headerAccessor.setNativeHeader("foo", "BAR"); Map<String, Object> actual = headerAccessor.toMap(); assertEquals(2, actual.size()); assertEquals("B", actual.get("a")); @SuppressWarnings("unchecked") Map<String, List<String>> actualNativeHeaders = (Map<String, List<String>>) actual.get(NativeMessageHeaderAccessor.NATIVE_HEADERS); assertNotNull(actualNativeHeaders); assertEquals(Arrays.asList("BAR"), actualNativeHeaders.get("foo")); assertEquals(Arrays.asList("baz"), actualNativeHeaders.get("bar")); }
@Test public void addNativeHeaderLazyInitNullValue() { NativeMessageHeaderAccessor headerAccessor = new NativeMessageHeaderAccessor(); headerAccessor.addNativeHeader("foo", null); assertNull(headerAccessor.getNativeHeader("foo")); assertNull(headerAccessor.getMessageHeaders().get(NativeMessageHeaderAccessor.NATIVE_HEADERS)); }
@Test public void setImmutableIdempotent() { NativeMessageHeaderAccessor headerAccessor = new NativeMessageHeaderAccessor(); headerAccessor.addNativeHeader("foo", "bar"); headerAccessor.setImmutable(); headerAccessor.setImmutable(); }
public void addNativeHeaders(@Nullable MultiValueMap<String, String> headers) { if (headers == null) { return; } headers.forEach((key, values) -> values.forEach(value -> addNativeHeader(key, value))); }
/** * A protected constructor to create new headers. * @param nativeHeaders native headers to create the message with (may be {@code null}) */ protected NativeMessageHeaderAccessor(@Nullable Map<String, List<String>> nativeHeaders) { if (!CollectionUtils.isEmpty(nativeHeaders)) { setHeader(NATIVE_HEADERS, new LinkedMultiValueMap<>(nativeHeaders)); } }
@Test public void setNativeHeaderLazyInit() { NativeMessageHeaderAccessor headerAccessor = new NativeMessageHeaderAccessor(); headerAccessor.setNativeHeader("foo", "baz"); assertEquals(Arrays.asList("baz"), headerAccessor.getNativeHeader("foo")); }
@Test public void setNativeHeaderLazyInitNullValue() { NativeMessageHeaderAccessor headerAccessor = new NativeMessageHeaderAccessor(); headerAccessor.setNativeHeader("foo", null); assertNull(headerAccessor.getNativeHeader("foo")); assertNull(headerAccessor.getMessageHeaders().get(NativeMessageHeaderAccessor.NATIVE_HEADERS)); }
@SuppressWarnings("unchecked") @Nullable protected Map<String, List<String>> getNativeHeaders() { return (Map<String, List<String>>) getHeader(NATIVE_HEADERS); }
@Test public void setNativeHeaderImmutable() { NativeMessageHeaderAccessor headerAccessor = new NativeMessageHeaderAccessor(); headerAccessor.setNativeHeader("foo", "bar"); headerAccessor.setImmutable(); this.thrown.expect(IllegalStateException.class); this.thrown.expectMessage("Already immutable"); headerAccessor.setNativeHeader("foo", "baz"); }
private void doPut(MessageHeaderAccessor accessor, String key, String value) { accessor.setHeader(key, value); if (accessor instanceof NativeMessageHeaderAccessor) { NativeMessageHeaderAccessor nativeAccessor = (NativeMessageHeaderAccessor) accessor; nativeAccessor.setNativeHeader(key, value); } else { Object nativeHeaders = accessor .getHeader(NativeMessageHeaderAccessor.NATIVE_HEADERS); if (nativeHeaders == null) { accessor.setHeader(NativeMessageHeaderAccessor.NATIVE_HEADERS, nativeHeaders = new LinkedMultiValueMap<>()); } if (nativeHeaders instanceof Map<?, ?>) { ((Map) nativeHeaders).put(key, Collections.singletonList(value)); } } }
@Override public void setImmutable() { if (isMutable()) { Map<String, List<String>> map = getNativeHeaders(); if (map != null) { // Force removal since setHeader checks for equality removeHeader(NATIVE_HEADERS); setHeader(NATIVE_HEADERS, Collections.unmodifiableMap(map)); } super.setImmutable(); } }
/** * A protected constructor accepting the headers of an existing message to copy. */ protected NativeMessageHeaderAccessor(@Nullable Message<?> message) { super(message); if (message != null) { @SuppressWarnings("unchecked") Map<String, List<String>> map = (Map<String, List<String>>) getHeader(NATIVE_HEADERS); if (map != null) { // Force removal since setHeader checks for equality removeHeader(NATIVE_HEADERS); setHeader(NATIVE_HEADERS, new LinkedMultiValueMap<>(map)); } } }
@Nullable public List<String> removeNativeHeader(String name) { Assert.state(isMutable(), "Already immutable"); Map<String, List<String>> nativeHeaders = getNativeHeaders(); if (nativeHeaders == null) { return null; } return nativeHeaders.remove(name); }