提交 47ef45d1 编写于 作者: R Rossen Stoyanchev

Polish websocket xml namespace

Issue: SPR-11063
上级 92e144a8
......@@ -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">
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册