Polish websocket xml namespace
Issue: SPR-11063
This commit is contained in:
@@ -90,6 +90,13 @@ public class DefaultUserDestinationResolver implements UserDestinationResolver {
|
|||||||
return this.subscriptionDestinationPrefix;
|
return this.subscriptionDestinationPrefix;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Return the configured {@link UserSessionRegistry}.
|
||||||
|
*/
|
||||||
|
public UserSessionRegistry getUserSessionRegistry() {
|
||||||
|
return this.userSessionRegistry;
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Set<String> resolveDestination(Message<?> message) {
|
public Set<String> resolveDestination(Message<?> message) {
|
||||||
|
|
||||||
|
|||||||
@@ -41,6 +41,7 @@ import org.springframework.messaging.support.converter.DefaultContentTypeResolve
|
|||||||
import org.springframework.messaging.support.converter.MappingJackson2MessageConverter;
|
import org.springframework.messaging.support.converter.MappingJackson2MessageConverter;
|
||||||
import org.springframework.messaging.support.converter.StringMessageConverter;
|
import org.springframework.messaging.support.converter.StringMessageConverter;
|
||||||
import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
|
import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
|
||||||
|
import org.springframework.util.Assert;
|
||||||
import org.springframework.util.ClassUtils;
|
import org.springframework.util.ClassUtils;
|
||||||
import org.springframework.util.MimeTypeUtils;
|
import org.springframework.util.MimeTypeUtils;
|
||||||
import org.springframework.util.StringUtils;
|
import org.springframework.util.StringUtils;
|
||||||
@@ -111,41 +112,45 @@ public class MessageBrokerBeanDefinitionParser implements BeanDefinitionParser {
|
|||||||
handlerMappingDef.getPropertyValues().add("order", order);
|
handlerMappingDef.getPropertyValues().add("order", order);
|
||||||
handlerMappingDef.getPropertyValues().add("urlMap", urlMap);
|
handlerMappingDef.getPropertyValues().add("urlMap", urlMap);
|
||||||
|
|
||||||
String channelName = "clientInboundChannel";
|
String beanName = "clientInboundChannel";
|
||||||
Element channelElem = DomUtils.getChildElementByTagName(element, "client-inbound-channel");
|
Element channelElem = DomUtils.getChildElementByTagName(element, "client-inbound-channel");
|
||||||
RuntimeBeanReference clientInChannel = getMessageChannel(channelName, channelElem, parserCxt, source);
|
RuntimeBeanReference clientInChannel = getMessageChannel(beanName, channelElem, parserCxt, source);
|
||||||
|
|
||||||
channelName = "clientOutboundChannel";
|
beanName = "clientOutboundChannel";
|
||||||
channelElem = DomUtils.getChildElementByTagName(element, "client-outbound-channel");
|
channelElem = DomUtils.getChildElementByTagName(element, "client-outbound-channel");
|
||||||
RuntimeBeanReference clientOutChannel = getMessageChannel(channelName, channelElem, parserCxt, source);
|
RuntimeBeanReference clientOutChannel = getMessageChannel(beanName, channelElem, parserCxt, source);
|
||||||
|
|
||||||
RootBeanDefinition userSessionRegistryDef = new RootBeanDefinition(DefaultUserSessionRegistry.class);
|
RootBeanDefinition beanDef = new RootBeanDefinition(DefaultUserSessionRegistry.class);
|
||||||
String userSessionRegistryName = registerBeanDef(userSessionRegistryDef, parserCxt, source);
|
beanName = registerBeanDef(beanDef, parserCxt, source);
|
||||||
RuntimeBeanReference userSessionRegistry = new RuntimeBeanReference(userSessionRegistryName);
|
RuntimeBeanReference userSessionRegistry = new RuntimeBeanReference(beanName);
|
||||||
|
|
||||||
RuntimeBeanReference subProtocolWebSocketHandler = registerSubProtocolWebSocketHandler(
|
RuntimeBeanReference subProtocolWsHandler = registerSubProtocolWebSocketHandler(
|
||||||
clientInChannel, clientOutChannel, userSessionRegistry, parserCxt, source);
|
clientInChannel, clientOutChannel, userSessionRegistry, parserCxt, source);
|
||||||
|
|
||||||
List<Element> stompEndpointElements = DomUtils.getChildElementsByTagName(element, "stomp-endpoint");
|
for(Element stompEndpointElem : DomUtils.getChildElementsByTagName(element, "stomp-endpoint")) {
|
||||||
for(Element stompEndpointElement : stompEndpointElements) {
|
|
||||||
|
|
||||||
RuntimeBeanReference requestHandler = registerHttpRequestHandler(
|
RuntimeBeanReference httpRequestHandler = registerHttpRequestHandler(
|
||||||
stompEndpointElement, subProtocolWebSocketHandler, parserCxt, source);
|
stompEndpointElem, subProtocolWsHandler, parserCxt, source);
|
||||||
|
|
||||||
List<String> paths = Arrays.asList(stompEndpointElement.getAttribute("path").split(","));
|
String pathAttribute = stompEndpointElem.getAttribute("path");
|
||||||
|
Assert.state(StringUtils.hasText(pathAttribute), "Invalid <stomp-endpoint> (no path mapping)");
|
||||||
|
|
||||||
|
List<String> paths = Arrays.asList(pathAttribute.split(","));
|
||||||
for(String path : paths) {
|
for(String path : paths) {
|
||||||
if (DomUtils.getChildElementByTagName(stompEndpointElement, "sockjs") != null) {
|
path = path.trim();
|
||||||
|
Assert.state(StringUtils.hasText(path), "Invalid <stomp-endpoint> path attribute: " + pathAttribute);
|
||||||
|
if (DomUtils.getChildElementByTagName(stompEndpointElem, "sockjs") != null) {
|
||||||
path = path.endsWith("/") ? path + "**" : path + "/**";
|
path = path.endsWith("/") ? path + "**" : path + "/**";
|
||||||
}
|
}
|
||||||
urlMap.put(path, requestHandler);
|
urlMap.put(path, httpRequestHandler);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
registerBeanDef(handlerMappingDef, parserCxt, source);
|
registerBeanDef(handlerMappingDef, parserCxt, source);
|
||||||
|
|
||||||
channelName = "brokerChannel";
|
beanName = "brokerChannel";
|
||||||
channelElem = DomUtils.getChildElementByTagName(element, "broker-channel");
|
channelElem = DomUtils.getChildElementByTagName(element, "broker-channel");
|
||||||
RuntimeBeanReference brokerChannel = getMessageChannel(channelName, channelElem, parserCxt, source);
|
RuntimeBeanReference brokerChannel = getMessageChannel(beanName, channelElem, parserCxt, source);
|
||||||
registerMessageBroker(element, clientInChannel, clientOutChannel, brokerChannel, parserCxt, source);
|
registerMessageBroker(element, clientInChannel, clientOutChannel, brokerChannel, parserCxt, source);
|
||||||
|
|
||||||
RuntimeBeanReference messageConverter = registerBrokerMessageConverter(parserCxt, source);
|
RuntimeBeanReference messageConverter = registerBrokerMessageConverter(parserCxt, source);
|
||||||
@@ -156,7 +161,7 @@ public class MessageBrokerBeanDefinitionParser implements BeanDefinitionParser {
|
|||||||
messageConverter, messagingTemplate, parserCxt, source);
|
messageConverter, messagingTemplate, parserCxt, source);
|
||||||
|
|
||||||
RuntimeBeanReference userDestinationResolver = registerUserDestinationResolver(element,
|
RuntimeBeanReference userDestinationResolver = registerUserDestinationResolver(element,
|
||||||
userSessionRegistryDef, parserCxt, source);
|
userSessionRegistry, parserCxt, source);
|
||||||
|
|
||||||
registerUserDestinationMessageHandler(clientInChannel, clientOutChannel, brokerChannel,
|
registerUserDestinationMessageHandler(clientInChannel, clientOutChannel, brokerChannel,
|
||||||
userDestinationResolver, parserCxt, source);
|
userDestinationResolver, parserCxt, source);
|
||||||
@@ -320,7 +325,8 @@ public class MessageBrokerBeanDefinitionParser implements BeanDefinitionParser {
|
|||||||
mpvs.add("virtualHost",virtualHost);
|
mpvs.add("virtualHost",virtualHost);
|
||||||
}
|
}
|
||||||
|
|
||||||
RootBeanDefinition messageBrokerDef = new RootBeanDefinition(StompBrokerRelayMessageHandler.class, cavs, mpvs);
|
Class<?> handlerType = StompBrokerRelayMessageHandler.class;
|
||||||
|
RootBeanDefinition messageBrokerDef = new RootBeanDefinition(handlerType, cavs, mpvs);
|
||||||
registerBeanDef(messageBrokerDef, parserCxt, source);
|
registerBeanDef(messageBrokerDef, parserCxt, source);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -386,10 +392,10 @@ public class MessageBrokerBeanDefinitionParser implements BeanDefinitionParser {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private RuntimeBeanReference registerUserDestinationResolver(Element messageBrokerElement,
|
private RuntimeBeanReference registerUserDestinationResolver(Element messageBrokerElement,
|
||||||
BeanDefinition userSessionRegistryDef, ParserContext parserCxt, Object source) {
|
RuntimeBeanReference userSessionRegistry, ParserContext parserCxt, Object source) {
|
||||||
|
|
||||||
ConstructorArgumentValues cavs = new ConstructorArgumentValues();
|
ConstructorArgumentValues cavs = new ConstructorArgumentValues();
|
||||||
cavs.addIndexedArgumentValue(0, userSessionRegistryDef);
|
cavs.addIndexedArgumentValue(0, userSessionRegistry);
|
||||||
RootBeanDefinition userDestinationResolverDef =
|
RootBeanDefinition userDestinationResolverDef =
|
||||||
new RootBeanDefinition(DefaultUserDestinationResolver.class, cavs, null);
|
new RootBeanDefinition(DefaultUserDestinationResolver.class, cavs, null);
|
||||||
String prefix = messageBrokerElement.getAttribute("user-destination-prefix");
|
String prefix = messageBrokerElement.getAttribute("user-destination-prefix");
|
||||||
|
|||||||
@@ -192,7 +192,7 @@
|
|||||||
</xsd:annotation>
|
</xsd:annotation>
|
||||||
<xsd:complexType>
|
<xsd:complexType>
|
||||||
<xsd:sequence>
|
<xsd:sequence>
|
||||||
<xsd:element name="stomp-endpoint" maxOccurs="unbounded">
|
<xsd:element name="stomp-endpoint" minOccurs="1" maxOccurs="unbounded">
|
||||||
<xsd:complexType>
|
<xsd:complexType>
|
||||||
<xsd:sequence>
|
<xsd:sequence>
|
||||||
<xsd:element name="handshake-handler" type="handshake-handler" minOccurs="0" maxOccurs="1" />
|
<xsd:element name="handshake-handler" type="handshake-handler" minOccurs="0" maxOccurs="1" />
|
||||||
|
|||||||
@@ -35,6 +35,7 @@ import org.springframework.web.context.support.GenericWebApplicationContext;
|
|||||||
import org.springframework.web.servlet.HandlerMapping;
|
import org.springframework.web.servlet.HandlerMapping;
|
||||||
import org.springframework.web.servlet.handler.SimpleUrlHandlerMapping;
|
import org.springframework.web.servlet.handler.SimpleUrlHandlerMapping;
|
||||||
import org.springframework.web.socket.WebSocketHandler;
|
import org.springframework.web.socket.WebSocketHandler;
|
||||||
|
import org.springframework.web.socket.messaging.StompSubProtocolHandler;
|
||||||
import org.springframework.web.socket.messaging.SubProtocolWebSocketHandler;
|
import org.springframework.web.socket.messaging.SubProtocolWebSocketHandler;
|
||||||
import org.springframework.web.socket.server.support.WebSocketHttpRequestHandler;
|
import org.springframework.web.socket.server.support.WebSocketHttpRequestHandler;
|
||||||
import org.springframework.web.socket.sockjs.SockJsHttpRequestHandler;
|
import org.springframework.web.socket.sockjs.SockJsHttpRequestHandler;
|
||||||
@@ -47,7 +48,9 @@ import java.util.Map;
|
|||||||
import static org.junit.Assert.*;
|
import static org.junit.Assert.*;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Test fixture for the configuration in websocket-config-broker*.xml test files.
|
* Test fixture for MessageBrokerBeanDefinitionParser.
|
||||||
|
* See test configuration files websocket-config-broker-*.xml.
|
||||||
|
*
|
||||||
* @author Brian Clozel
|
* @author Brian Clozel
|
||||||
*/
|
*/
|
||||||
public class MessageBrokerBeanDefinitionParserTests {
|
public class MessageBrokerBeanDefinitionParserTests {
|
||||||
@@ -82,6 +85,10 @@ public class MessageBrokerBeanDefinitionParserTests {
|
|||||||
SubProtocolWebSocketHandler subProtocolWsHandler = (SubProtocolWebSocketHandler) wsHandler;
|
SubProtocolWebSocketHandler subProtocolWsHandler = (SubProtocolWebSocketHandler) wsHandler;
|
||||||
assertEquals(Arrays.asList("v10.stomp", "v11.stomp", "v12.stomp"), subProtocolWsHandler.getSubProtocols());
|
assertEquals(Arrays.asList("v10.stomp", "v11.stomp", "v12.stomp"), subProtocolWsHandler.getSubProtocols());
|
||||||
|
|
||||||
|
StompSubProtocolHandler stompHandler =
|
||||||
|
(StompSubProtocolHandler) subProtocolWsHandler.getProtocolHandlerMap().get("v12.stomp");
|
||||||
|
assertNotNull(stompHandler);
|
||||||
|
|
||||||
httpRequestHandler = (HttpRequestHandler) suhm.getUrlMap().get("/test/**");
|
httpRequestHandler = (HttpRequestHandler) suhm.getUrlMap().get("/test/**");
|
||||||
assertNotNull(httpRequestHandler);
|
assertNotNull(httpRequestHandler);
|
||||||
assertThat(httpRequestHandler, Matchers.instanceOf(SockJsHttpRequestHandler.class));
|
assertThat(httpRequestHandler, Matchers.instanceOf(SockJsHttpRequestHandler.class));
|
||||||
@@ -91,12 +98,20 @@ public class MessageBrokerBeanDefinitionParserTests {
|
|||||||
assertThat(wsHandler, Matchers.instanceOf(SubProtocolWebSocketHandler.class));
|
assertThat(wsHandler, Matchers.instanceOf(SubProtocolWebSocketHandler.class));
|
||||||
assertNotNull(sockJsHttpRequestHandler.getSockJsService());
|
assertNotNull(sockJsHttpRequestHandler.getSockJsService());
|
||||||
|
|
||||||
|
UserSessionRegistry userSessionRegistry = this.appContext.getBean(UserSessionRegistry.class);
|
||||||
|
assertNotNull(userSessionRegistry);
|
||||||
|
|
||||||
UserDestinationResolver userDestResolver = this.appContext.getBean(UserDestinationResolver.class);
|
UserDestinationResolver userDestResolver = this.appContext.getBean(UserDestinationResolver.class);
|
||||||
assertNotNull(userDestResolver);
|
assertNotNull(userDestResolver);
|
||||||
assertThat(userDestResolver, Matchers.instanceOf(DefaultUserDestinationResolver.class));
|
assertThat(userDestResolver, Matchers.instanceOf(DefaultUserDestinationResolver.class));
|
||||||
DefaultUserDestinationResolver defaultUserDestResolver = (DefaultUserDestinationResolver) userDestResolver;
|
DefaultUserDestinationResolver defaultUserDestResolver = (DefaultUserDestinationResolver) userDestResolver;
|
||||||
assertEquals("/personal/", defaultUserDestResolver.getDestinationPrefix());
|
assertEquals("/personal/", defaultUserDestResolver.getDestinationPrefix());
|
||||||
|
|
||||||
|
assertSame(stompHandler.getUserSessionRegistry(), defaultUserDestResolver.getUserSessionRegistry());
|
||||||
|
|
||||||
|
UserDestinationMessageHandler userDestHandler = this.appContext.getBean(UserDestinationMessageHandler.class);
|
||||||
|
assertNotNull(userDestHandler);
|
||||||
|
|
||||||
List<Class<? extends MessageHandler>> subscriberTypes =
|
List<Class<? extends MessageHandler>> subscriberTypes =
|
||||||
Arrays.<Class<? extends MessageHandler>>asList(SimpAnnotationMethodMessageHandler.class,
|
Arrays.<Class<? extends MessageHandler>>asList(SimpAnnotationMethodMessageHandler.class,
|
||||||
UserDestinationMessageHandler.class, SimpleBrokerMessageHandler.class);
|
UserDestinationMessageHandler.class, SimpleBrokerMessageHandler.class);
|
||||||
|
|||||||
@@ -64,7 +64,7 @@ import static org.junit.Assert.assertTrue;
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Test fixture for HandlersBeanDefinitionParser.
|
* Test fixture for HandlersBeanDefinitionParser.
|
||||||
* See test configuration files websocket-config-handlers*.xml.
|
* See test configuration files websocket-config-handlers-*.xml.
|
||||||
*
|
*
|
||||||
* @author Brian Clozel
|
* @author Brian Clozel
|
||||||
*/
|
*/
|
||||||
@@ -227,6 +227,7 @@ public class HandlersBeanDefinitionParserTests {
|
|||||||
}
|
}
|
||||||
|
|
||||||
class TestWebSocketHandler implements WebSocketHandler {
|
class TestWebSocketHandler implements WebSocketHandler {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void afterConnectionEstablished(WebSocketSession session) throws Exception {}
|
public void afterConnectionEstablished(WebSocketSession session) throws Exception {}
|
||||||
|
|
||||||
|
|||||||
@@ -21,7 +21,7 @@
|
|||||||
http://www.springframework.org/schema/websocket http://www.springframework.org/schema/websocket/spring-websocket-4.0.xsd">
|
http://www.springframework.org/schema/websocket http://www.springframework.org/schema/websocket/spring-websocket-4.0.xsd">
|
||||||
|
|
||||||
<websocket:message-broker application-destination-prefix="/app" user-destination-prefix="/personal">
|
<websocket:message-broker application-destination-prefix="/app" user-destination-prefix="/personal">
|
||||||
<websocket:stomp-endpoint path="/foo,/bar">
|
<websocket:stomp-endpoint path=" /foo,/bar">
|
||||||
<websocket:handshake-handler ref="myHandler" />
|
<websocket:handshake-handler ref="myHandler" />
|
||||||
</websocket:stomp-endpoint>
|
</websocket:stomp-endpoint>
|
||||||
<websocket:stomp-endpoint path="/test,/sockjs">
|
<websocket:stomp-endpoint path="/test,/sockjs">
|
||||||
|
|||||||
Reference in New Issue
Block a user