/** * Return the id of the current session. */ @Nullable public String getSessionId() { return (String) getHeader(SESSION_ID_HEADER); }
/** * Return the attributes associated with the current session. */ @SuppressWarnings("unchecked") @Nullable public Map<String, Object> getSessionAttributes() { return (Map<String, Object>) getHeader(SESSION_ATTRIBUTES); }
@Nullable public String getDestination() { return (String) getHeader(DESTINATION_HEADER); }
/** * Return the user associated with the current session. */ @Nullable public Principal getUser() { return (Principal) getHeader(USER_HEADER); }
@Nullable public SimpMessageType getMessageType() { return (SimpMessageType) getHeader(MESSAGE_TYPE_HEADER); }
@Nullable public String getSubscriptionId() { return (String) getHeader(SUBSCRIPTION_ID_HEADER); }
@Nullable private String getDisconnectReceipt(SimpMessageHeaderAccessor simpHeaders) { String name = StompHeaderAccessor.DISCONNECT_MESSAGE_HEADER; Message<?> message = (Message<?>) simpHeaders.getHeader(name); if (message != null) { StompHeaderAccessor accessor = MessageHeaderAccessor.getAccessor(message, StompHeaderAccessor.class); if (accessor != null) { return accessor.getReceipt(); } } return null; }
@SuppressWarnings("unchecked") @Override public String getDetailedLogMessage(@Nullable Object payload) { if (getMessageType() == null) { return super.getDetailedLogMessage(payload); } StringBuilder sb = getBaseLogMessage(); if (!CollectionUtils.isEmpty(getSessionAttributes())) { sb.append(" attributes=").append(getSessionAttributes()); } if (!CollectionUtils.isEmpty((Map<String, List<String>>) getHeader(NATIVE_HEADERS))) { sb.append(" nativeHeaders=").append(getHeader(NATIVE_HEADERS)); } sb.append(getDetailedPayloadLogMessage(payload)); return sb.toString(); }
@Test public void connect() { String id = "sess1"; Message<String> connectMessage = startSession(id); Message<?> connectAckMessage = this.messageCaptor.getValue(); SimpMessageHeaderAccessor connectAckHeaders = SimpMessageHeaderAccessor.wrap(connectAckMessage); assertEquals(connectMessage, connectAckHeaders.getHeader(SimpMessageHeaderAccessor.CONNECT_MESSAGE_HEADER)); assertEquals(id, connectAckHeaders.getSessionId()); assertEquals("joe", connectAckHeaders.getUser().getName()); assertArrayEquals(new long[] {10000, 10000}, SimpMessageHeaderAccessor.getHeartbeat(connectAckHeaders.getMessageHeaders())); }
@Test public void testHeadersToSend() throws Exception { Message<?> message = createMessage("sess1", "sub1", "/app", "/dest", null); SimpMessageSendingOperations messagingTemplate = Mockito.mock(SimpMessageSendingOperations.class); SendToMethodReturnValueHandler handler = new SendToMethodReturnValueHandler(messagingTemplate, false); handler.handleReturnValue(PAYLOAD, this.noAnnotationsReturnType, message); ArgumentCaptor<MessageHeaders> captor = ArgumentCaptor.forClass(MessageHeaders.class); verify(messagingTemplate).convertAndSend(eq("/topic/dest"), eq(PAYLOAD), captor.capture()); MessageHeaders headers = captor.getValue(); SimpMessageHeaderAccessor accessor = MessageHeaderAccessor.getAccessor(headers, SimpMessageHeaderAccessor.class); assertNotNull(accessor); assertTrue(accessor.isMutable()); assertEquals("sess1", accessor.getSessionId()); assertNull("Subscription id should not be copied", accessor.getSubscriptionId()); assertEquals(this.noAnnotationsReturnType, accessor.getHeader(SimpMessagingTemplate.CONVERSION_HINT_HEADER)); }
@Test public void testMessageSentToChannel() throws Exception { given(this.messageChannel.send(any(Message.class))).willReturn(true); String sessionId = "sess1"; String subscriptionId = "subs1"; String destination = "/dest"; Message<?> inputMessage = createInputMessage(sessionId, subscriptionId, destination, null); this.handler.handleReturnValue(PAYLOAD, this.subscribeEventReturnType, inputMessage); verify(this.messageChannel).send(this.messageCaptor.capture()); assertNotNull(this.messageCaptor.getValue()); Message<?> message = this.messageCaptor.getValue(); SimpMessageHeaderAccessor headerAccessor = SimpMessageHeaderAccessor.wrap(message); assertNull("SimpMessageHeaderAccessor should have disabled id", headerAccessor.getId()); assertNull("SimpMessageHeaderAccessor should have disabled timestamp", headerAccessor.getTimestamp()); assertEquals(sessionId, headerAccessor.getSessionId()); assertEquals(subscriptionId, headerAccessor.getSubscriptionId()); assertEquals(destination, headerAccessor.getDestination()); assertEquals(MIME_TYPE, headerAccessor.getContentType()); assertEquals(this.subscribeEventReturnType, headerAccessor.getHeader(SimpMessagingTemplate.CONVERSION_HINT_HEADER)); }
@Test @SuppressWarnings({ "unchecked", "rawtypes" }) public void testHeadersPassedToMessagingTemplate() throws Exception { String sessionId = "sess1"; String subscriptionId = "subs1"; String destination = "/dest"; Message<?> inputMessage = createInputMessage(sessionId, subscriptionId, destination, null); MessageSendingOperations messagingTemplate = Mockito.mock(MessageSendingOperations.class); SubscriptionMethodReturnValueHandler handler = new SubscriptionMethodReturnValueHandler(messagingTemplate); handler.handleReturnValue(PAYLOAD, this.subscribeEventReturnType, inputMessage); ArgumentCaptor<MessageHeaders> captor = ArgumentCaptor.forClass(MessageHeaders.class); verify(messagingTemplate).convertAndSend(eq("/dest"), eq(PAYLOAD), captor.capture()); SimpMessageHeaderAccessor headerAccessor = MessageHeaderAccessor.getAccessor(captor.getValue(), SimpMessageHeaderAccessor.class); assertNotNull(headerAccessor); assertTrue(headerAccessor.isMutable()); assertEquals(sessionId, headerAccessor.getSessionId()); assertEquals(subscriptionId, headerAccessor.getSubscriptionId()); assertEquals(this.subscribeEventReturnType, headerAccessor.getHeader(SimpMessagingTemplate.CONVERSION_HINT_HEADER)); }
@Test public void sendToUserDefaultDestinationSingleSession() throws Exception { given(this.messageChannel.send(any(Message.class))).willReturn(true); String sessionId = "sess1"; TestUser user = new TestUser(); Message<?> message = createMessage(sessionId, "sub1", "/app", "/dest", user); this.handler.handleReturnValue(PAYLOAD, this.sendToUserInSessionDefaultDestReturnType, message); verify(this.messageChannel, times(1)).send(this.messageCaptor.capture()); SimpMessageHeaderAccessor accessor = getCapturedAccessor(0); assertEquals(sessionId, accessor.getSessionId()); assertEquals("/user/" + user.getName() + "/queue/dest", accessor.getDestination()); assertEquals(MIME_TYPE, accessor.getContentType()); assertNull("Subscription id should not be copied", accessor.getSubscriptionId()); assertEquals(this.sendToUserInSessionDefaultDestReturnType, accessor.getHeader(SimpMessagingTemplate.CONVERSION_HINT_HEADER)); }
private void assertResponse(MethodParameter methodParameter, String sessionId, int index, String destination) { SimpMessageHeaderAccessor accessor = getCapturedAccessor(index); assertEquals(sessionId, accessor.getSessionId()); assertEquals(destination, accessor.getDestination()); assertEquals(MIME_TYPE, accessor.getContentType()); assertNull("Subscription id should not be copied", accessor.getSubscriptionId()); assertEquals(methodParameter, accessor.getHeader(SimpMessagingTemplate.CONVERSION_HINT_HEADER)); }
@Nullable public SimpMessageType getMessageType() { return (SimpMessageType) getHeader(MESSAGE_TYPE_HEADER); }
@Nullable public String getSubscriptionId() { return (String) getHeader(SUBSCRIPTION_ID_HEADER); }
/** * Return the id of the current session. */ @Nullable public String getSessionId() { return (String) getHeader(SESSION_ID_HEADER); }
/** * Return the attributes associated with the current session. */ @SuppressWarnings("unchecked") @Nullable public Map<String, Object> getSessionAttributes() { return (Map<String, Object>) getHeader(SESSION_ATTRIBUTES); }
/** * Return the user associated with the current session. */ @Nullable public Principal getUser() { return (Principal) getHeader(USER_HEADER); }
@Test public void sendToUserSingleSession() throws Exception { given(this.messageChannel.send(any(Message.class))).willReturn(true); String sessionId = "sess1"; TestUser user = new TestUser(); Message<?> inputMessage = createMessage(sessionId, "sub1", null, null, user); this.handler.handleReturnValue(PAYLOAD, this.sendToUserInSessionReturnType, inputMessage); verify(this.messageChannel, times(2)).send(this.messageCaptor.capture()); SimpMessageHeaderAccessor accessor = getCapturedAccessor(0); assertEquals(sessionId, accessor.getSessionId()); assertEquals(MIME_TYPE, accessor.getContentType()); assertEquals("/user/" + user.getName() + "/dest1", accessor.getDestination()); assertNull("Subscription id should not be copied", accessor.getSubscriptionId()); assertEquals(this.sendToUserInSessionReturnType, accessor.getHeader(SimpMessagingTemplate.CONVERSION_HINT_HEADER)); accessor = getCapturedAccessor(1); assertEquals(sessionId, accessor.getSessionId()); assertEquals("/user/" + user.getName() + "/dest2", accessor.getDestination()); assertEquals(MIME_TYPE, accessor.getContentType()); assertNull("Subscription id should not be copied", accessor.getSubscriptionId()); assertEquals(this.sendToUserInSessionReturnType, accessor.getHeader(SimpMessagingTemplate.CONVERSION_HINT_HEADER)); }