summaryrefslogtreecommitdiff
path: root/spring-messaging/src/main/java/org/springframework/messaging/simp/annotation/support/SendToMethodReturnValueHandler.java
diff options
context:
space:
mode:
authorEmmanuel Bourg <ebourg@apache.org>2016-08-02 11:13:32 +0200
committerEmmanuel Bourg <ebourg@apache.org>2016-08-02 11:13:32 +0200
commitf69f2a4b8ea697b3a631c0dc7a470e3c9793fee3 (patch)
treedb2f25b29aa3e59c463ab41d3f2856f6265bb1a5 /spring-messaging/src/main/java/org/springframework/messaging/simp/annotation/support/SendToMethodReturnValueHandler.java
parent5575b60c30c5a0c308c4ba3a2db93956d8c1746c (diff)
Imported Upstream version 4.2.6
Diffstat (limited to 'spring-messaging/src/main/java/org/springframework/messaging/simp/annotation/support/SendToMethodReturnValueHandler.java')
-rw-r--r--spring-messaging/src/main/java/org/springframework/messaging/simp/annotation/support/SendToMethodReturnValueHandler.java48
1 files changed, 43 insertions, 5 deletions
diff --git a/spring-messaging/src/main/java/org/springframework/messaging/simp/annotation/support/SendToMethodReturnValueHandler.java b/spring-messaging/src/main/java/org/springframework/messaging/simp/annotation/support/SendToMethodReturnValueHandler.java
index 3f5bf1c7..0f18a567 100644
--- a/spring-messaging/src/main/java/org/springframework/messaging/simp/annotation/support/SendToMethodReturnValueHandler.java
+++ b/spring-messaging/src/main/java/org/springframework/messaging/simp/annotation/support/SendToMethodReturnValueHandler.java
@@ -18,6 +18,7 @@ package org.springframework.messaging.simp.annotation.support;
import java.lang.annotation.Annotation;
import java.security.Principal;
+import java.util.Map;
import org.springframework.core.MethodParameter;
import org.springframework.core.annotation.AnnotationUtils;
@@ -26,15 +27,19 @@ import org.springframework.messaging.MessageChannel;
import org.springframework.messaging.MessageHeaders;
import org.springframework.messaging.handler.DestinationPatternsMessageCondition;
import org.springframework.messaging.handler.annotation.SendTo;
+import org.springframework.messaging.handler.annotation.support.DestinationVariableMethodArgumentResolver;
import org.springframework.messaging.handler.invocation.HandlerMethodReturnValueHandler;
import org.springframework.messaging.simp.SimpMessageHeaderAccessor;
import org.springframework.messaging.simp.SimpMessageSendingOperations;
import org.springframework.messaging.simp.SimpMessageType;
+import org.springframework.messaging.simp.SimpMessagingTemplate;
import org.springframework.messaging.simp.annotation.SendToUser;
import org.springframework.messaging.simp.user.DestinationUserNameProvider;
import org.springframework.messaging.support.MessageHeaderInitializer;
import org.springframework.util.Assert;
import org.springframework.util.ObjectUtils;
+import org.springframework.util.PropertyPlaceholderHelper;
+import org.springframework.util.PropertyPlaceholderHelper.PlaceholderResolver;
import org.springframework.util.StringUtils;
/**
@@ -47,6 +52,7 @@ import org.springframework.util.StringUtils;
* If multiple destinations are specified, a copy of the message is sent to each destination.
*
* @author Rossen Stoyanchev
+ * @author Sebastien Deleuze
* @since 4.0
*/
public class SendToMethodReturnValueHandler implements HandlerMethodReturnValueHandler {
@@ -59,6 +65,8 @@ public class SendToMethodReturnValueHandler implements HandlerMethodReturnValueH
private String defaultUserDestinationPrefix = "/queue";
+ private PropertyPlaceholderHelper placeholderHelper = new PropertyPlaceholderHelper("{", "}", null, false);
+
private MessageHeaderInitializer headerInitializer;
@@ -139,6 +147,7 @@ public class SendToMethodReturnValueHandler implements HandlerMethodReturnValueH
MessageHeaders headers = message.getHeaders();
String sessionId = SimpMessageHeaderAccessor.getSessionId(headers);
+ PlaceholderResolver varResolver = initVarResolver(headers);
SendToUser sendToUser = returnType.getMethodAnnotation(SendToUser.class);
if (sendToUser != null) {
@@ -153,11 +162,14 @@ public class SendToMethodReturnValueHandler implements HandlerMethodReturnValueH
}
String[] destinations = getTargetDestinations(sendToUser, message, this.defaultUserDestinationPrefix);
for (String destination : destinations) {
+ destination = this.placeholderHelper.replacePlaceholders(destination, varResolver);
if (broadcast) {
- this.messagingTemplate.convertAndSendToUser(user, destination, returnValue);
+ this.messagingTemplate.convertAndSendToUser(
+ user, destination, returnValue, createHeaders(null, returnType));
}
else {
- this.messagingTemplate.convertAndSendToUser(user, destination, returnValue, createHeaders(sessionId));
+ this.messagingTemplate.convertAndSendToUser(
+ user, destination, returnValue, createHeaders(sessionId, returnType));
}
}
}
@@ -165,11 +177,19 @@ public class SendToMethodReturnValueHandler implements HandlerMethodReturnValueH
SendTo sendTo = returnType.getMethodAnnotation(SendTo.class);
String[] destinations = getTargetDestinations(sendTo, message, this.defaultDestinationPrefix);
for (String destination : destinations) {
- this.messagingTemplate.convertAndSend(destination, returnValue, createHeaders(sessionId));
+ destination = this.placeholderHelper.replacePlaceholders(destination, varResolver);
+ this.messagingTemplate.convertAndSend(destination, returnValue, createHeaders(sessionId, returnType));
}
}
}
+ @SuppressWarnings("unchecked")
+ private PlaceholderResolver initVarResolver(MessageHeaders headers) {
+ String name = DestinationVariableMethodArgumentResolver.DESTINATION_TEMPLATE_VARIABLES_HEADER;
+ Map<String, String> vars = (Map<String, String>) headers.get(name);
+ return new DestinationVariablePlaceholderResolver(vars);
+ }
+
protected String getUserName(Message<?> message, MessageHeaders headers) {
Principal principal = SimpMessageHeaderAccessor.getUser(headers);
if (principal != null) {
@@ -196,12 +216,15 @@ public class SendToMethodReturnValueHandler implements HandlerMethodReturnValueH
new String[] {defaultPrefix + destination} : new String[] {defaultPrefix + "/" + destination});
}
- private MessageHeaders createHeaders(String sessionId) {
+ private MessageHeaders createHeaders(String sessionId, MethodParameter returnType) {
SimpMessageHeaderAccessor headerAccessor = SimpMessageHeaderAccessor.create(SimpMessageType.MESSAGE);
if (getHeaderInitializer() != null) {
getHeaderInitializer().initHeaders(headerAccessor);
}
- headerAccessor.setSessionId(sessionId);
+ if (sessionId != null) {
+ headerAccessor.setSessionId(sessionId);
+ }
+ headerAccessor.setHeader(SimpMessagingTemplate.CONVERSION_HINT_HEADER, returnType);
headerAccessor.setLeaveMutable(true);
return headerAccessor.getMessageHeaders();
}
@@ -212,4 +235,19 @@ public class SendToMethodReturnValueHandler implements HandlerMethodReturnValueH
return "SendToMethodReturnValueHandler [annotationRequired=" + annotationRequired + "]";
}
+
+ private static class DestinationVariablePlaceholderResolver implements PlaceholderResolver {
+
+ private final Map<String, String> vars;
+
+ public DestinationVariablePlaceholderResolver(Map<String, String> vars) {
+ this.vars = vars;
+ }
+
+ @Override
+ public String resolvePlaceholder(String placeholderName) {
+ return (this.vars != null ? this.vars.get(placeholderName) : null);
+ }
+ }
+
}