Add missing handshake-interceptor namespace support
Issue: SPR-11845
This commit is contained in:
parent
61e77eeb61
commit
85c175059a
|
@ -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));
|
||||||
}
|
}
|
||||||
|
|
|
@ -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);
|
||||||
}
|
}
|
||||||
|
|
|
@ -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">
|
||||||
|
|
|
@ -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">
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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);
|
||||||
|
|
||||||
|
|
|
@ -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>
|
||||||
|
|
|
@ -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>
|
||||||
|
|
|
@ -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>
|
||||||
|
|
Loading…
Reference in New Issue