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 the configured {@link UserSessionRegistry}.
|
||||
*/
|
||||
public UserSessionRegistry getUserSessionRegistry() {
|
||||
return this.userSessionRegistry;
|
||||
}
|
||||
|
||||
@Override
|
||||
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.StringMessageConverter;
|
||||
import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
|
||||
import org.springframework.util.Assert;
|
||||
import org.springframework.util.ClassUtils;
|
||||
import org.springframework.util.MimeTypeUtils;
|
||||
import org.springframework.util.StringUtils;
|
||||
@@ -111,41 +112,45 @@ public class MessageBrokerBeanDefinitionParser implements BeanDefinitionParser {
|
||||
handlerMappingDef.getPropertyValues().add("order", order);
|
||||
handlerMappingDef.getPropertyValues().add("urlMap", urlMap);
|
||||
|
||||
String channelName = "clientInboundChannel";
|
||||
String beanName = "clientInboundChannel";
|
||||
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");
|
||||
RuntimeBeanReference clientOutChannel = getMessageChannel(channelName, channelElem, parserCxt, source);
|
||||
RuntimeBeanReference clientOutChannel = getMessageChannel(beanName, channelElem, parserCxt, source);
|
||||
|
||||
RootBeanDefinition userSessionRegistryDef = new RootBeanDefinition(DefaultUserSessionRegistry.class);
|
||||
String userSessionRegistryName = registerBeanDef(userSessionRegistryDef, parserCxt, source);
|
||||
RuntimeBeanReference userSessionRegistry = new RuntimeBeanReference(userSessionRegistryName);
|
||||
RootBeanDefinition beanDef = new RootBeanDefinition(DefaultUserSessionRegistry.class);
|
||||
beanName = registerBeanDef(beanDef, parserCxt, source);
|
||||
RuntimeBeanReference userSessionRegistry = new RuntimeBeanReference(beanName);
|
||||
|
||||
RuntimeBeanReference subProtocolWebSocketHandler = registerSubProtocolWebSocketHandler(
|
||||
RuntimeBeanReference subProtocolWsHandler = registerSubProtocolWebSocketHandler(
|
||||
clientInChannel, clientOutChannel, userSessionRegistry, parserCxt, source);
|
||||
|
||||
List<Element> stompEndpointElements = DomUtils.getChildElementsByTagName(element, "stomp-endpoint");
|
||||
for(Element stompEndpointElement : stompEndpointElements) {
|
||||
for(Element stompEndpointElem : DomUtils.getChildElementsByTagName(element, "stomp-endpoint")) {
|
||||
|
||||
RuntimeBeanReference requestHandler = registerHttpRequestHandler(
|
||||
stompEndpointElement, subProtocolWebSocketHandler, parserCxt, source);
|
||||
RuntimeBeanReference httpRequestHandler = registerHttpRequestHandler(
|
||||
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) {
|
||||
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 + "/**";
|
||||
}
|
||||
urlMap.put(path, requestHandler);
|
||||
urlMap.put(path, httpRequestHandler);
|
||||
}
|
||||
}
|
||||
|
||||
registerBeanDef(handlerMappingDef, parserCxt, source);
|
||||
|
||||
channelName = "brokerChannel";
|
||||
beanName = "brokerChannel";
|
||||
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);
|
||||
|
||||
RuntimeBeanReference messageConverter = registerBrokerMessageConverter(parserCxt, source);
|
||||
@@ -156,7 +161,7 @@ public class MessageBrokerBeanDefinitionParser implements BeanDefinitionParser {
|
||||
messageConverter, messagingTemplate, parserCxt, source);
|
||||
|
||||
RuntimeBeanReference userDestinationResolver = registerUserDestinationResolver(element,
|
||||
userSessionRegistryDef, parserCxt, source);
|
||||
userSessionRegistry, parserCxt, source);
|
||||
|
||||
registerUserDestinationMessageHandler(clientInChannel, clientOutChannel, brokerChannel,
|
||||
userDestinationResolver, parserCxt, source);
|
||||
@@ -320,7 +325,8 @@ public class MessageBrokerBeanDefinitionParser implements BeanDefinitionParser {
|
||||
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);
|
||||
}
|
||||
|
||||
@@ -386,10 +392,10 @@ public class MessageBrokerBeanDefinitionParser implements BeanDefinitionParser {
|
||||
}
|
||||
|
||||
private RuntimeBeanReference registerUserDestinationResolver(Element messageBrokerElement,
|
||||
BeanDefinition userSessionRegistryDef, ParserContext parserCxt, Object source) {
|
||||
RuntimeBeanReference userSessionRegistry, ParserContext parserCxt, Object source) {
|
||||
|
||||
ConstructorArgumentValues cavs = new ConstructorArgumentValues();
|
||||
cavs.addIndexedArgumentValue(0, userSessionRegistryDef);
|
||||
cavs.addIndexedArgumentValue(0, userSessionRegistry);
|
||||
RootBeanDefinition userDestinationResolverDef =
|
||||
new RootBeanDefinition(DefaultUserDestinationResolver.class, cavs, null);
|
||||
String prefix = messageBrokerElement.getAttribute("user-destination-prefix");
|
||||
|
||||
@@ -192,7 +192,7 @@
|
||||
</xsd:annotation>
|
||||
<xsd:complexType>
|
||||
<xsd:sequence>
|
||||
<xsd:element name="stomp-endpoint" maxOccurs="unbounded">
|
||||
<xsd:element name="stomp-endpoint" minOccurs="1" maxOccurs="unbounded">
|
||||
<xsd:complexType>
|
||||
<xsd:sequence>
|
||||
<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.handler.SimpleUrlHandlerMapping;
|
||||
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.server.support.WebSocketHttpRequestHandler;
|
||||
import org.springframework.web.socket.sockjs.SockJsHttpRequestHandler;
|
||||
@@ -47,7 +48,9 @@ import java.util.Map;
|
||||
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
|
||||
*/
|
||||
public class MessageBrokerBeanDefinitionParserTests {
|
||||
@@ -82,6 +85,10 @@ public class MessageBrokerBeanDefinitionParserTests {
|
||||
SubProtocolWebSocketHandler subProtocolWsHandler = (SubProtocolWebSocketHandler) wsHandler;
|
||||
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/**");
|
||||
assertNotNull(httpRequestHandler);
|
||||
assertThat(httpRequestHandler, Matchers.instanceOf(SockJsHttpRequestHandler.class));
|
||||
@@ -91,12 +98,20 @@ public class MessageBrokerBeanDefinitionParserTests {
|
||||
assertThat(wsHandler, Matchers.instanceOf(SubProtocolWebSocketHandler.class));
|
||||
assertNotNull(sockJsHttpRequestHandler.getSockJsService());
|
||||
|
||||
UserSessionRegistry userSessionRegistry = this.appContext.getBean(UserSessionRegistry.class);
|
||||
assertNotNull(userSessionRegistry);
|
||||
|
||||
UserDestinationResolver userDestResolver = this.appContext.getBean(UserDestinationResolver.class);
|
||||
assertNotNull(userDestResolver);
|
||||
assertThat(userDestResolver, Matchers.instanceOf(DefaultUserDestinationResolver.class));
|
||||
DefaultUserDestinationResolver defaultUserDestResolver = (DefaultUserDestinationResolver) userDestResolver;
|
||||
assertEquals("/personal/", defaultUserDestResolver.getDestinationPrefix());
|
||||
|
||||
assertSame(stompHandler.getUserSessionRegistry(), defaultUserDestResolver.getUserSessionRegistry());
|
||||
|
||||
UserDestinationMessageHandler userDestHandler = this.appContext.getBean(UserDestinationMessageHandler.class);
|
||||
assertNotNull(userDestHandler);
|
||||
|
||||
List<Class<? extends MessageHandler>> subscriberTypes =
|
||||
Arrays.<Class<? extends MessageHandler>>asList(SimpAnnotationMethodMessageHandler.class,
|
||||
UserDestinationMessageHandler.class, SimpleBrokerMessageHandler.class);
|
||||
|
||||
@@ -64,7 +64,7 @@ import static org.junit.Assert.assertTrue;
|
||||
|
||||
/**
|
||||
* Test fixture for HandlersBeanDefinitionParser.
|
||||
* See test configuration files websocket-config-handlers*.xml.
|
||||
* See test configuration files websocket-config-handlers-*.xml.
|
||||
*
|
||||
* @author Brian Clozel
|
||||
*/
|
||||
@@ -227,6 +227,7 @@ public class HandlersBeanDefinitionParserTests {
|
||||
}
|
||||
|
||||
class TestWebSocketHandler implements WebSocketHandler {
|
||||
|
||||
@Override
|
||||
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">
|
||||
|
||||
<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:stomp-endpoint>
|
||||
<websocket:stomp-endpoint path="/test,/sockjs">
|
||||
|
||||
Reference in New Issue
Block a user