From f69f2a4b8ea697b3a631c0dc7a470e3c9793fee3 Mon Sep 17 00:00:00 2001 From: Emmanuel Bourg Date: Tue, 2 Aug 2016 11:13:32 +0200 Subject: Imported Upstream version 4.2.6 --- .../support/SendToMethodReturnValueHandler.java | 48 +++++++++++++++++++--- 1 file changed, 43 insertions(+), 5 deletions(-) (limited to 'spring-messaging/src/main/java/org/springframework/messaging/simp/annotation/support/SendToMethodReturnValueHandler.java') 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 vars = (Map) 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 vars; + + public DestinationVariablePlaceholderResolver(Map vars) { + this.vars = vars; + } + + @Override + public String resolvePlaceholder(String placeholderName) { + return (this.vars != null ? this.vars.get(placeholderName) : null); + } + } + } -- cgit v1.2.3