@ -16,6 +16,7 @@
package org.springframework.messaging.support ;
package org.springframework.messaging.support ;
import java.util.ArrayList ;
import java.util.Collections ;
import java.util.Collections ;
import java.util.LinkedList ;
import java.util.LinkedList ;
import java.util.List ;
import java.util.List ;
@ -75,6 +76,8 @@ public class NativeMessageHeaderAccessor extends MessageHeaderAccessor {
@SuppressWarnings ( "unchecked" )
@SuppressWarnings ( "unchecked" )
Map < String , List < String > > map = ( Map < String , List < String > > ) getHeader ( NATIVE_HEADERS ) ;
Map < String , List < String > > map = ( Map < String , List < String > > ) getHeader ( NATIVE_HEADERS ) ;
if ( map ! = null ) {
if ( map ! = null ) {
// setHeader checks for equality but we need copy of native headers
setHeader ( NATIVE_HEADERS , null ) ;
setHeader ( NATIVE_HEADERS , new LinkedMultiValueMap < > ( map ) ) ;
setHeader ( NATIVE_HEADERS , new LinkedMultiValueMap < > ( map ) ) ;
}
}
}
}
@ -103,6 +106,8 @@ public class NativeMessageHeaderAccessor extends MessageHeaderAccessor {
if ( isMutable ( ) ) {
if ( isMutable ( ) ) {
Map < String , List < String > > map = getNativeHeaders ( ) ;
Map < String , List < String > > map = getNativeHeaders ( ) ;
if ( map ! = null ) {
if ( map ! = null ) {
// setHeader checks for equality but we need immutable wrapper
setHeader ( NATIVE_HEADERS , null ) ;
setHeader ( NATIVE_HEADERS , Collections . unmodifiableMap ( map ) ) ;
setHeader ( NATIVE_HEADERS , Collections . unmodifiableMap ( map ) ) ;
}
}
super . setImmutable ( ) ;
super . setImmutable ( ) ;
@ -110,31 +115,34 @@ public class NativeMessageHeaderAccessor extends MessageHeaderAccessor {
}
}
@Override
@Override
public void setHeader ( String name , @Nullable Object value ) {
public void copyHeaders ( @Nullable Map < String , ? > headersToCopy ) {
if ( name . equalsIgnoreCase ( NATIVE_HEADERS ) ) {
if ( headersToCopy = = null ) {
// Force removal since setHeader checks for equality
return ;
super . setHeader ( NATIVE_HEADERS , null ) ;
}
@SuppressWarnings ( "unchecked" )
Map < String , List < String > > map = ( Map < String , List < String > > ) headersToCopy . get ( NATIVE_HEADERS ) ;
if ( map ! = null & & map ! = getNativeHeaders ( ) ) {
map . forEach ( this : : setNativeHeaderValues ) ;
}
}
super . setHeader ( name , value ) ;
// setHeader checks for equality, native headers should be equal by now
super . copyHeaders ( headersToCopy ) ;
}
}
@Override
@Override
@SuppressWarnings ( "unchecked" )
public void copyHeadersIfAbsent ( @Nullable Map < String , ? > headersToCopy ) {
public void copyHeaders ( @Nullable Map < String , ? > headersToCopy ) {
if ( headersToCopy = = null ) {
if ( headersToCopy ! = null ) {
return ;
Map < String , List < String > > nativeHeaders = getNativeHeaders ( ) ;
}
Map < String , List < String > > map = ( Map < String , List < String > > ) headersToCopy . get ( NATIVE_HEADERS ) ;
if ( map ! = null ) {
@SuppressWarnings ( "unchecked" )
if ( nativeHeaders ! = null ) {
Map < String , List < String > > map = ( Map < String , List < String > > ) headersToCopy . get ( NATIVE_HEADERS ) ;
nativeHeaders . putAll ( map ) ;
if ( map ! = null & & getNativeHeaders ( ) = = null ) {
}
map . forEach ( this : : setNativeHeaderValues ) ;
else {
nativeHeaders = new LinkedMultiValueMap < > ( map ) ;
}
}
super . copyHeaders ( headersToCopy ) ;
setHeader ( NATIVE_HEADERS , nativeHeaders ) ;
}
}
super . copyHeadersIfAbsent ( headersToCopy ) ;
}
}
/ * *
/ * *
@ -201,6 +209,30 @@ public class NativeMessageHeaderAccessor extends MessageHeaderAccessor {
}
}
}
}
/ * *
* Variant of { @link # addNativeHeader ( String , String ) } for all values .
* @since 5 . 2 . 12
* /
public void setNativeHeaderValues ( String name , @Nullable List < String > values ) {
Assert . state ( isMutable ( ) , "Already immutable" ) ;
Map < String , List < String > > map = getNativeHeaders ( ) ;
if ( values = = null ) {
if ( map ! = null & & map . get ( name ) ! = null ) {
setModified ( true ) ;
map . remove ( name ) ;
}
return ;
}
if ( map = = null ) {
map = new LinkedMultiValueMap < > ( 3 ) ;
setHeader ( NATIVE_HEADERS , map ) ;
}
if ( ! ObjectUtils . nullSafeEquals ( values , getHeader ( name ) ) ) {
setModified ( true ) ;
map . put ( name , new ArrayList < > ( values ) ) ;
}
}
/ * *
/ * *
* Add the specified native header value to existing values .
* Add the specified native header value to existing values .
* < p > In order for this to work , the accessor must be { @link # isMutable ( )
* < p > In order for this to work , the accessor must be { @link # isMutable ( )