diff --git a/spring-core/src/main/java/org/springframework/util/CollectionUtils.java b/spring-core/src/main/java/org/springframework/util/CollectionUtils.java index 9dbb027a9f..4685796853 100644 --- a/spring-core/src/main/java/org/springframework/util/CollectionUtils.java +++ b/spring-core/src/main/java/org/springframework/util/CollectionUtils.java @@ -342,7 +342,6 @@ public abstract class CollectionUtils { */ public static MultiValueMap toMultiValueMap(Map> map) { return new MultiValueMapAdapter(map); - } /** @@ -390,6 +389,7 @@ public abstract class CollectionUtils { } } + /** * Adapts a Map to the MultiValueMap contract. */ diff --git a/spring-core/src/main/java/org/springframework/util/LinkedMultiValueMap.java b/spring-core/src/main/java/org/springframework/util/LinkedMultiValueMap.java index f980b91c23..9c361d7bc5 100644 --- a/spring-core/src/main/java/org/springframework/util/LinkedMultiValueMap.java +++ b/spring-core/src/main/java/org/springframework/util/LinkedMultiValueMap.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2012 the original author or authors. + * Copyright 2002-2015 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -59,8 +59,9 @@ public class LinkedMultiValueMap implements MultiValueMap, Serializa } /** - * Copy constructor: Create a new LinkedMultiValueMap with the same mappings - * as the specified Map. + * Copy constructor: Create a new LinkedMultiValueMap with the same mappings as + * the specified Map. Note that this will be a shallow copy; its value-holding + * List entries will get reused and therefore cannot get modified independently. * @param otherMap the Map whose mappings are to be placed in this Map */ public LinkedMultiValueMap(Map> otherMap) { @@ -103,7 +104,7 @@ public class LinkedMultiValueMap implements MultiValueMap, Serializa @Override public Map toSingleValueMap() { LinkedHashMap singleValueMap = new LinkedHashMap(this.targetMap.size()); - for (Entry> entry : targetMap.entrySet()) { + for (Entry> entry : this.targetMap.entrySet()) { singleValueMap.put(entry.getKey(), entry.getValue().get(0)); } return singleValueMap; @@ -148,8 +149,8 @@ public class LinkedMultiValueMap implements MultiValueMap, Serializa } @Override - public void putAll(Map> m) { - this.targetMap.putAll(m); + public void putAll(Map> map) { + this.targetMap.putAll(map); } @Override diff --git a/spring-messaging/src/main/java/org/springframework/messaging/simp/broker/AbstractSubscriptionRegistry.java b/spring-messaging/src/main/java/org/springframework/messaging/simp/broker/AbstractSubscriptionRegistry.java index 4a5497c570..3a9a04ece1 100644 --- a/spring-messaging/src/main/java/org/springframework/messaging/simp/broker/AbstractSubscriptionRegistry.java +++ b/spring-messaging/src/main/java/org/springframework/messaging/simp/broker/AbstractSubscriptionRegistry.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2014 the original author or authors. + * Copyright 2002-2015 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -23,7 +23,6 @@ import org.springframework.messaging.Message; import org.springframework.messaging.MessageHeaders; import org.springframework.messaging.simp.SimpMessageHeaderAccessor; import org.springframework.messaging.simp.SimpMessageType; -import org.springframework.util.Assert; import org.springframework.util.MultiValueMap; /** @@ -42,66 +41,84 @@ public abstract class AbstractSubscriptionRegistry implements SubscriptionRegist @Override public final void registerSubscription(Message message) { MessageHeaders headers = message.getHeaders(); + SimpMessageType messageType = SimpMessageHeaderAccessor.getMessageType(headers); - Assert.isTrue(SimpMessageType.SUBSCRIBE.equals(messageType), "Expected SUBSCRIBE: " + message); + if (!SimpMessageType.SUBSCRIBE.equals(messageType)) { + throw new IllegalArgumentException("Expected SUBSCRIBE: " + message); + } + String sessionId = SimpMessageHeaderAccessor.getSessionId(headers); if (sessionId == null) { logger.error("No sessionId in " + message); return; } + String subscriptionId = SimpMessageHeaderAccessor.getSubscriptionId(headers); if (subscriptionId == null) { logger.error("No subscriptionId in " + message); return; } + String destination = SimpMessageHeaderAccessor.getDestination(headers); if (destination == null) { logger.error("No destination in " + message); return; } + addSubscriptionInternal(sessionId, subscriptionId, destination, message); } - protected abstract void addSubscriptionInternal(String sessionId, String subscriptionId, - String destination, Message message); - @Override public final void unregisterSubscription(Message message) { MessageHeaders headers = message.getHeaders(); + SimpMessageType messageType = SimpMessageHeaderAccessor.getMessageType(headers); - Assert.isTrue(SimpMessageType.UNSUBSCRIBE.equals(messageType), "Expected UNSUBSCRIBE: " + message); + if (!SimpMessageType.UNSUBSCRIBE.equals(messageType)) { + throw new IllegalArgumentException("Expected UNSUBSCRIBE: " + message); + } + String sessionId = SimpMessageHeaderAccessor.getSessionId(headers); if (sessionId == null) { logger.error("No sessionId in " + message); return; } + String subscriptionId = SimpMessageHeaderAccessor.getSubscriptionId(headers); if (subscriptionId == null) { logger.error("No subscriptionId " + message); return; } + removeSubscriptionInternal(sessionId, subscriptionId, message); } + @Override + public final MultiValueMap findSubscriptions(Message message) { + MessageHeaders headers = message.getHeaders(); + + SimpMessageType type = SimpMessageHeaderAccessor.getMessageType(headers); + if (!SimpMessageType.MESSAGE.equals(type)) { + throw new IllegalArgumentException("Unexpected message type: " + type); + } + + String destination = SimpMessageHeaderAccessor.getDestination(headers); + if (destination == null) { + logger.error("No destination in " + message); + return null; + } + + return findSubscriptionsInternal(destination, message); + } + + + protected abstract void addSubscriptionInternal(String sessionId, String subscriptionId, + String destination, Message message); + protected abstract void removeSubscriptionInternal(String sessionId, String subscriptionId, Message message); @Override public abstract void unregisterAllSubscriptions(String sessionId); - @Override - public final MultiValueMap findSubscriptions(Message message) { - MessageHeaders headers = message.getHeaders(); - SimpMessageType type = SimpMessageHeaderAccessor.getMessageType(headers); - Assert.isTrue(SimpMessageType.MESSAGE.equals(type), "Unexpected message type: " + type); - String destination = SimpMessageHeaderAccessor.getDestination(headers); - if (destination == null) { - logger.error("No destination in " + message); - return null; - } - return findSubscriptionsInternal(destination, message); - } - - protected abstract MultiValueMap findSubscriptionsInternal( - String destination, Message message); + protected abstract MultiValueMap findSubscriptionsInternal(String destination, Message message); } diff --git a/spring-messaging/src/main/java/org/springframework/messaging/support/NativeMessageHeaderAccessor.java b/spring-messaging/src/main/java/org/springframework/messaging/support/NativeMessageHeaderAccessor.java index db8a534a17..20e9dedea7 100644 --- a/spring-messaging/src/main/java/org/springframework/messaging/support/NativeMessageHeaderAccessor.java +++ b/spring-messaging/src/main/java/org/springframework/messaging/support/NativeMessageHeaderAccessor.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2014 the original author or authors. + * Copyright 2002-2015 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -33,8 +33,8 @@ import org.springframework.util.ObjectUtils; * created to represent a STOMP message received from a STOMP client or message broker. * Native message headers are kept in a {@code Map>} under the key * {@link #NATIVE_HEADERS}. - *

- * This class is not intended for direct use but is rather expected to be used + * + *

This class is not intended for direct use but is rather expected to be used * indirectly through protocol-specific sub-classes such as * {@link org.springframework.messaging.simp.stomp.StompHeaderAccessor StompHeaderAccessor}. * Such sub-classes may provide factory methods to translate message headers from @@ -59,7 +59,7 @@ public class NativeMessageHeaderAccessor extends MessageHeaderAccessor { /** * A protected constructor to create new headers. - * @param nativeHeaders native headers to create the message with, may be {@code null} + * @param nativeHeaders native headers to create the message with (may be {@code null}) */ protected NativeMessageHeaderAccessor(Map> nativeHeaders) { if (!CollectionUtils.isEmpty(nativeHeaders)) { @@ -114,7 +114,7 @@ public class NativeMessageHeaderAccessor extends MessageHeaderAccessor { */ public boolean containsNativeHeader(String headerName) { Map> map = getNativeHeaders(); - return (map != null ? map.containsKey(headerName) : false); + return (map != null && map.containsKey(headerName)); } /**