Browse Source

Polish websocket xml namespace

Issue: SPR-11063
pull/423/head
Rossen Stoyanchev 11 years ago
parent
commit
47ef45d152
  1. 7
      spring-messaging/src/main/java/org/springframework/messaging/simp/handler/DefaultUserDestinationResolver.java
  2. 48
      spring-websocket/src/main/java/org/springframework/web/socket/messaging/config/xml/MessageBrokerBeanDefinitionParser.java
  3. 2
      spring-websocket/src/main/resources/org/springframework/web/socket/server/config/xml/spring-websocket-4.0.xsd
  4. 17
      spring-websocket/src/test/java/org/springframework/web/socket/messaging/config/xml/MessageBrokerBeanDefinitionParserTests.java
  5. 3
      spring-websocket/src/test/java/org/springframework/web/socket/server/config/xml/HandlersBeanDefinitionParserTests.java
  6. 2
      spring-websocket/src/test/resources/org/springframework/web/socket/messaging/config/xml/websocket-config-broker-simple.xml

7
spring-messaging/src/main/java/org/springframework/messaging/simp/handler/DefaultUserDestinationResolver.java

@ -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) {

48
spring-websocket/src/main/java/org/springframework/web/socket/messaging/config/xml/MessageBrokerBeanDefinitionParser.java

@ -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");

2
spring-websocket/src/main/resources/org/springframework/web/socket/server/config/xml/spring-websocket-4.0.xsd

@ -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" />

17
spring-websocket/src/test/java/org/springframework/web/socket/messaging/config/xml/MessageBrokerBeanDefinitionParserTests.java

@ -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);

3
spring-websocket/src/test/java/org/springframework/web/socket/server/config/xml/HandlersBeanDefinitionParserTests.java

@ -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 {}

2
spring-websocket/src/test/resources/org/springframework/web/socket/messaging/config/xml/websocket-config-broker-simple.xml

@ -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">

Loading…
Cancel
Save