Add missing handshake-interceptor namespace support

Issue: SPR-11845
This commit is contained in:
Rossen Stoyanchev 2014-07-15 09:46:53 -04:00
parent 61e77eeb61
commit 85c175059a
9 changed files with 49 additions and 13 deletions

View File

@ -263,12 +263,15 @@ class MessageBrokerBeanDefinitionParser implements BeanDefinitionParser {
} }
else { else {
RuntimeBeanReference handshakeHandler = WebSocketNamespaceUtils.registerHandshakeHandler(element, context, source); RuntimeBeanReference handshakeHandler = WebSocketNamespaceUtils.registerHandshakeHandler(element, context, source);
Element interceptorsElement = DomUtils.getChildElementByTagName(element, "handshake-interceptors");
ManagedList<?> interceptors = WebSocketNamespaceUtils.parseBeanSubElements(interceptorsElement, context);
ConstructorArgumentValues cavs = new ConstructorArgumentValues(); ConstructorArgumentValues cavs = new ConstructorArgumentValues();
cavs.addIndexedArgumentValue(0, subProtoHandler); cavs.addIndexedArgumentValue(0, subProtoHandler);
if (handshakeHandler != null) { if (handshakeHandler != null) {
cavs.addIndexedArgumentValue(1, handshakeHandler); cavs.addIndexedArgumentValue(1, handshakeHandler);
} }
beanDef = new RootBeanDefinition(WebSocketHttpRequestHandler.class, cavs, null); beanDef = new RootBeanDefinition(WebSocketHttpRequestHandler.class, cavs, null);
beanDef.getPropertyValues().add("handshakeInterceptors", interceptors);
} }
return new RuntimeBeanReference(registerBeanDef(beanDef, context, source)); return new RuntimeBeanReference(registerBeanDef(beanDef, context, source));
} }

View File

@ -96,7 +96,11 @@ class WebSocketNamespaceUtils {
sockJsServiceDef.getConstructorArgumentValues().addIndexedArgumentValue(1, transportHandler); sockJsServiceDef.getConstructorArgumentValues().addIndexedArgumentValue(1, transportHandler);
} }
String attrValue = sockJsElement.getAttribute("name"); Element interceptorsElement = DomUtils.getChildElementByTagName(element, "handshake-interceptors");
ManagedList<?> interceptors = WebSocketNamespaceUtils.parseBeanSubElements(interceptorsElement, context);
sockJsServiceDef.getPropertyValues().add("handshakeInterceptors", interceptors);
String attrValue = sockJsElement.getAttribute("name");
if (!attrValue.isEmpty()) { if (!attrValue.isEmpty()) {
sockJsServiceDef.getPropertyValues().add("name", attrValue); sockJsServiceDef.getPropertyValues().add("name", attrValue);
} }

View File

@ -589,6 +589,7 @@
<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"/>
<xsd:element name="handshake-interceptors" type="handshake-interceptors" minOccurs="0" maxOccurs="1"/>
<xsd:element name="sockjs" type="sockjs-service" minOccurs="0" maxOccurs="1"/> <xsd:element name="sockjs" type="sockjs-service" minOccurs="0" maxOccurs="1"/>
</xsd:sequence> </xsd:sequence>
<xsd:attribute name="path" type="xsd:string"> <xsd:attribute name="path" type="xsd:string">

View File

@ -590,6 +590,7 @@
<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"/>
<xsd:element name="handshake-interceptors" type="handshake-interceptors" minOccurs="0" maxOccurs="1"/>
<xsd:element name="sockjs" type="sockjs-service" minOccurs="0" maxOccurs="1"/> <xsd:element name="sockjs" type="sockjs-service" minOccurs="0" maxOccurs="1"/>
</xsd:sequence> </xsd:sequence>
<xsd:attribute name="path" type="xsd:string"> <xsd:attribute name="path" type="xsd:string">

View File

@ -48,7 +48,9 @@ import org.springframework.web.socket.server.support.DefaultHandshakeHandler;
import org.springframework.web.socket.server.support.WebSocketHttpRequestHandler; import org.springframework.web.socket.server.support.WebSocketHttpRequestHandler;
import org.springframework.web.socket.sockjs.SockJsService; import org.springframework.web.socket.sockjs.SockJsService;
import org.springframework.web.socket.sockjs.support.SockJsHttpRequestHandler; import org.springframework.web.socket.sockjs.support.SockJsHttpRequestHandler;
import org.springframework.web.socket.sockjs.transport.TransportHandler;
import org.springframework.web.socket.sockjs.transport.TransportHandlingSockJsService; import org.springframework.web.socket.sockjs.transport.TransportHandlingSockJsService;
import org.springframework.web.socket.sockjs.transport.TransportType;
import org.springframework.web.socket.sockjs.transport.handler.DefaultSockJsService; import org.springframework.web.socket.sockjs.transport.handler.DefaultSockJsService;
import org.springframework.web.socket.sockjs.transport.handler.EventSourceTransportHandler; import org.springframework.web.socket.sockjs.transport.handler.EventSourceTransportHandler;
import org.springframework.web.socket.sockjs.transport.handler.HtmlFileTransportHandler; import org.springframework.web.socket.sockjs.transport.handler.HtmlFileTransportHandler;
@ -79,8 +81,8 @@ public class HandlersBeanDefinitionParserTests {
this.appContext = new GenericWebApplicationContext(); this.appContext = new GenericWebApplicationContext();
} }
@Test
@Test
public void webSocketHandlers() { public void webSocketHandlers() {
loadBeanDefinitions("websocket-config-handlers.xml"); loadBeanDefinitions("websocket-config-handlers.xml");
@ -132,7 +134,6 @@ public class HandlersBeanDefinitionParserTests {
assertNotNull(handshakeHandler); assertNotNull(handshakeHandler);
assertTrue(handshakeHandler instanceof TestHandshakeHandler); assertTrue(handshakeHandler instanceof TestHandshakeHandler);
List<HandshakeInterceptor> interceptors = handler.getHandshakeInterceptors(); List<HandshakeInterceptor> interceptors = handler.getHandshakeInterceptors();
assertNotNull(interceptors);
assertThat(interceptors, contains(instanceOf(FooTestInterceptor.class), instanceOf(BarTestInterceptor.class))); assertThat(interceptors, contains(instanceOf(FooTestInterceptor.class), instanceOf(BarTestInterceptor.class)));
handler = (WebSocketHttpRequestHandler) urlHandlerMapping.getUrlMap().get("/test"); handler = (WebSocketHttpRequestHandler) urlHandlerMapping.getUrlMap().get("/test");
@ -142,7 +143,6 @@ public class HandlersBeanDefinitionParserTests {
assertNotNull(handshakeHandler); assertNotNull(handshakeHandler);
assertTrue(handshakeHandler instanceof TestHandshakeHandler); assertTrue(handshakeHandler instanceof TestHandshakeHandler);
interceptors = handler.getHandshakeInterceptors(); interceptors = handler.getHandshakeInterceptors();
assertNotNull(interceptors);
assertThat(interceptors, contains(instanceOf(FooTestInterceptor.class), instanceOf(BarTestInterceptor.class))); assertThat(interceptors, contains(instanceOf(FooTestInterceptor.class), instanceOf(BarTestInterceptor.class)));
} }
@ -171,7 +171,9 @@ public class HandlersBeanDefinitionParserTests {
assertThat(sockJsService, instanceOf(DefaultSockJsService.class)); assertThat(sockJsService, instanceOf(DefaultSockJsService.class));
DefaultSockJsService defaultSockJsService = (DefaultSockJsService) sockJsService; DefaultSockJsService defaultSockJsService = (DefaultSockJsService) sockJsService;
assertThat(defaultSockJsService.getTaskScheduler(), instanceOf(ThreadPoolTaskScheduler.class)); assertThat(defaultSockJsService.getTaskScheduler(), instanceOf(ThreadPoolTaskScheduler.class));
assertThat(defaultSockJsService.getTransportHandlers().values(),
Map<TransportType, TransportHandler> transportHandlers = defaultSockJsService.getTransportHandlers();
assertThat(transportHandlers.values(),
containsInAnyOrder( containsInAnyOrder(
instanceOf(XhrPollingTransportHandler.class), instanceOf(XhrPollingTransportHandler.class),
instanceOf(XhrReceivingTransportHandler.class), instanceOf(XhrReceivingTransportHandler.class),
@ -181,6 +183,12 @@ public class HandlersBeanDefinitionParserTests {
instanceOf(EventSourceTransportHandler.class), instanceOf(EventSourceTransportHandler.class),
instanceOf(HtmlFileTransportHandler.class), instanceOf(HtmlFileTransportHandler.class),
instanceOf(WebSocketTransportHandler.class))); instanceOf(WebSocketTransportHandler.class)));
WebSocketTransportHandler handler = (WebSocketTransportHandler) transportHandlers.get(TransportType.WEBSOCKET);
assertEquals(TestHandshakeHandler.class, handler.getHandshakeHandler().getClass());
List<HandshakeInterceptor> interceptors = defaultSockJsService.getHandshakeInterceptors();
assertThat(interceptors, contains(instanceOf(FooTestInterceptor.class), instanceOf(BarTestInterceptor.class)));
} }
@Test @Test

View File

@ -75,16 +75,19 @@ import org.springframework.web.socket.sockjs.transport.handler.WebSocketTranspor
* *
* @author Brian Clozel * @author Brian Clozel
* @author Artem Bilan * @author Artem Bilan
* @author Rossen Stoyanchev
*/ */
public class MessageBrokerBeanDefinitionParserTests { public class MessageBrokerBeanDefinitionParserTests {
private GenericWebApplicationContext appContext; private GenericWebApplicationContext appContext;
@Before @Before
public void setup() { public void setup() {
this.appContext = new GenericWebApplicationContext(); this.appContext = new GenericWebApplicationContext();
} }
@Test @Test
public void simpleBroker() { public void simpleBroker() {
loadBeanDefinitions("websocket-config-broker-simple.xml"); loadBeanDefinitions("websocket-config-broker-simple.xml");
@ -103,6 +106,8 @@ public class MessageBrokerBeanDefinitionParserTests {
HandshakeHandler handshakeHandler = wsHttpRequestHandler.getHandshakeHandler(); HandshakeHandler handshakeHandler = wsHttpRequestHandler.getHandshakeHandler();
assertNotNull(handshakeHandler); assertNotNull(handshakeHandler);
assertTrue(handshakeHandler instanceof TestHandshakeHandler); assertTrue(handshakeHandler instanceof TestHandshakeHandler);
List<HandshakeInterceptor> interceptors = wsHttpRequestHandler.getHandshakeInterceptors();
assertThat(interceptors, contains(instanceOf(FooTestInterceptor.class), instanceOf(BarTestInterceptor.class)));
WebSocketHandler wsHandler = unwrapWebSocketHandler(wsHttpRequestHandler.getWebSocketHandler()); WebSocketHandler wsHandler = unwrapWebSocketHandler(wsHttpRequestHandler.getWebSocketHandler());
assertNotNull(wsHandler); assertNotNull(wsHandler);
@ -140,6 +145,9 @@ public class MessageBrokerBeanDefinitionParserTests {
assertEquals(Runtime.getRuntime().availableProcessors(), scheduler.getScheduledThreadPoolExecutor().getCorePoolSize()); assertEquals(Runtime.getRuntime().availableProcessors(), scheduler.getScheduledThreadPoolExecutor().getCorePoolSize());
assertTrue(scheduler.getScheduledThreadPoolExecutor().getRemoveOnCancelPolicy()); assertTrue(scheduler.getScheduledThreadPoolExecutor().getRemoveOnCancelPolicy());
interceptors = defaultSockJsService.getHandshakeInterceptors();
assertThat(interceptors, contains(instanceOf(FooTestInterceptor.class), instanceOf(BarTestInterceptor.class)));
UserSessionRegistry userSessionRegistry = this.appContext.getBean(UserSessionRegistry.class); UserSessionRegistry userSessionRegistry = this.appContext.getBean(UserSessionRegistry.class);
assertNotNull(userSessionRegistry); assertNotNull(userSessionRegistry);

View File

@ -13,10 +13,18 @@
<websocket:stomp-endpoint path=" /foo,/bar"> <websocket:stomp-endpoint path=" /foo,/bar">
<websocket:handshake-handler ref="myHandler"/> <websocket:handshake-handler ref="myHandler"/>
<websocket:handshake-interceptors>
<bean class="org.springframework.web.socket.config.FooTestInterceptor"/>
<ref bean="barTestInterceptor"/>
</websocket:handshake-interceptors>
</websocket:stomp-endpoint> </websocket:stomp-endpoint>
<websocket:stomp-endpoint path="/test,/sockjs"> <websocket:stomp-endpoint path="/test,/sockjs">
<websocket:handshake-handler ref="myHandler"/> <websocket:handshake-handler ref="myHandler"/>
<websocket:handshake-interceptors>
<bean class="org.springframework.web.socket.config.FooTestInterceptor"/>
<ref bean="barTestInterceptor"/>
</websocket:handshake-interceptors>
<websocket:sockjs/> <websocket:sockjs/>
</websocket:stomp-endpoint> </websocket:stomp-endpoint>
@ -29,5 +37,6 @@
</bean> </bean>
<bean id="myHandler" class="org.springframework.web.socket.config.TestHandshakeHandler"/> <bean id="myHandler" class="org.springframework.web.socket.config.TestHandshakeHandler"/>
<bean id="barTestInterceptor" class="org.springframework.web.socket.config.BarTestInterceptor"/>
</beans> </beans>

View File

@ -17,13 +17,8 @@
</websocket:sockjs> </websocket:sockjs>
</websocket:handlers> </websocket:handlers>
<bean id="testHandler" <bean id="testHandler" class="org.springframework.web.socket.config.TestWebSocketHandler"/>
class="org.springframework.web.socket.config.TestWebSocketHandler"/> <bean id="testTaskScheduler" class="org.springframework.web.socket.config.TestTaskScheduler"/>
<bean id="xhrStreamingTransportHandler" class="org.springframework.web.socket.sockjs.transport.handler.XhrStreamingTransportHandler"/>
<bean id="xhrStreamingTransportHandler"
class="org.springframework.web.socket.sockjs.transport.handler.XhrStreamingTransportHandler"/>
<bean id="testTaskScheduler"
class="org.springframework.web.socket.config.TestTaskScheduler"/>
</beans> </beans>

View File

@ -8,10 +8,17 @@
<websocket:handlers> <websocket:handlers>
<websocket:mapping path="/test" handler="testHandler"/> <websocket:mapping path="/test" handler="testHandler"/>
<websocket:mapping path="/foo/" handler="fooHandler"/> <websocket:mapping path="/foo/" handler="fooHandler"/>
<websocket:handshake-handler ref="testHandshakeHandler"/>
<websocket:handshake-interceptors>
<bean class="org.springframework.web.socket.config.FooTestInterceptor"/>
<ref bean="barTestInterceptor"/>
</websocket:handshake-interceptors>
<websocket:sockjs/> <websocket:sockjs/>
</websocket:handlers> </websocket:handlers>
<bean id="testHandler" class="org.springframework.web.socket.config.TestWebSocketHandler"/> <bean id="testHandler" class="org.springframework.web.socket.config.TestWebSocketHandler"/>
<bean id="fooHandler" class="org.springframework.web.socket.config.FooWebSocketHandler"/> <bean id="fooHandler" class="org.springframework.web.socket.config.FooWebSocketHandler"/>
<bean id="testHandshakeHandler" class="org.springframework.web.socket.config.TestHandshakeHandler"/>
<bean id="barTestInterceptor" class="org.springframework.web.socket.config.BarTestInterceptor"/>
</beans> </beans>