|
|
|
|
@ -78,7 +78,7 @@ import org.springframework.web.socket.sockjs.support.SockJsHttpRequestHandler;
@@ -78,7 +78,7 @@ import org.springframework.web.socket.sockjs.support.SockJsHttpRequestHandler;
|
|
|
|
|
* <p>Registers a Spring MVC {@link org.springframework.web.servlet.HandlerMapping} |
|
|
|
|
* with order 1 to map HTTP WebSocket handshake requests from STOMP/WebSocket clients. |
|
|
|
|
* |
|
|
|
|
* <p>Registers the following {@link org.springframework.messaging.MessageChannel org.springframework.messaging.MessageChannels}: |
|
|
|
|
* <p>Registers the following {@link org.springframework.messaging.MessageChannel MessageChannels}: |
|
|
|
|
* <ul> |
|
|
|
|
* <li>"clientInboundChannel" for receiving messages from clients (e.g. WebSocket clients) |
|
|
|
|
* <li>"clientOutboundChannel" for sending messages to clients (e.g. WebSocket clients) |
|
|
|
|
@ -124,7 +124,6 @@ class MessageBrokerBeanDefinitionParser implements BeanDefinitionParser {
@@ -124,7 +124,6 @@ class MessageBrokerBeanDefinitionParser implements BeanDefinitionParser {
|
|
|
|
|
|
|
|
|
|
@Override |
|
|
|
|
public BeanDefinition parse(Element element, ParserContext context) { |
|
|
|
|
|
|
|
|
|
Object source = context.extractSource(element); |
|
|
|
|
CompositeComponentDefinition compDefinition = new CompositeComponentDefinition(element.getTagName(), source); |
|
|
|
|
context.pushContainingComponent(compDefinition); |
|
|
|
|
@ -155,13 +154,12 @@ class MessageBrokerBeanDefinitionParser implements BeanDefinitionParser {
@@ -155,13 +154,12 @@ class MessageBrokerBeanDefinitionParser implements BeanDefinitionParser {
|
|
|
|
|
for (Element endpointElem : DomUtils.getChildElementsByTagName(element, "stomp-endpoint")) { |
|
|
|
|
RuntimeBeanReference requestHandler = registerRequestHandler(endpointElem, stompHandler, context, source); |
|
|
|
|
String pathAttribute = endpointElem.getAttribute("path"); |
|
|
|
|
Assert.state(StringUtils.hasText(pathAttribute), "Invalid <stomp-endpoint> (no path mapping)"); |
|
|
|
|
List<String> paths = Arrays.asList(StringUtils.tokenizeToStringArray(pathAttribute, ",")); |
|
|
|
|
for (String path : paths) { |
|
|
|
|
Assert.hasText(pathAttribute, "Invalid <stomp-endpoint> (no path mapping)"); |
|
|
|
|
for (String path : StringUtils.tokenizeToStringArray(pathAttribute, ",")) { |
|
|
|
|
path = path.trim(); |
|
|
|
|
Assert.state(StringUtils.hasText(path), () -> "Invalid <stomp-endpoint> path attribute: " + pathAttribute); |
|
|
|
|
Assert.hasText(path, () -> "Invalid <stomp-endpoint> path attribute: " + pathAttribute); |
|
|
|
|
if (DomUtils.getChildElementByTagName(endpointElem, "sockjs") != null) { |
|
|
|
|
path = path.endsWith("/") ? path + "**" : path + "/**"; |
|
|
|
|
path = (path.endsWith("/") ? path + "**" : path + "/**"); |
|
|
|
|
} |
|
|
|
|
urlMap.put(path, requestHandler); |
|
|
|
|
} |
|
|
|
|
@ -179,7 +177,6 @@ class MessageBrokerBeanDefinitionParser implements BeanDefinitionParser {
@@ -179,7 +177,6 @@ class MessageBrokerBeanDefinitionParser implements BeanDefinitionParser {
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
private RuntimeBeanReference registerUserRegistry(Element element, ParserContext context, @Nullable Object source) { |
|
|
|
|
|
|
|
|
|
Element relayElement = DomUtils.getChildElementByTagName(element, "stomp-broker-relay"); |
|
|
|
|
boolean multiServer = (relayElement != null && relayElement.hasAttribute("user-registry-broadcast")); |
|
|
|
|
|
|
|
|
|
@ -197,8 +194,8 @@ class MessageBrokerBeanDefinitionParser implements BeanDefinitionParser {
@@ -197,8 +194,8 @@ class MessageBrokerBeanDefinitionParser implements BeanDefinitionParser {
|
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
private ManagedMap<String, Object> registerHandlerMapping(Element element, |
|
|
|
|
ParserContext context, @Nullable Object source) { |
|
|
|
|
private ManagedMap<String, Object> registerHandlerMapping( |
|
|
|
|
Element element, ParserContext context, @Nullable Object source) { |
|
|
|
|
|
|
|
|
|
RootBeanDefinition handlerMappingDef = new RootBeanDefinition(WebSocketHandlerMapping.class); |
|
|
|
|
|
|
|
|
|
@ -247,6 +244,7 @@ class MessageBrokerBeanDefinitionParser implements BeanDefinitionParser {
@@ -247,6 +244,7 @@ class MessageBrokerBeanDefinitionParser implements BeanDefinitionParser {
|
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
ConstructorArgumentValues cargs = new ConstructorArgumentValues(); |
|
|
|
|
if (executor != null) { |
|
|
|
|
executor.getPropertyValues().add("threadNamePrefix", name + "-"); |
|
|
|
|
@ -254,6 +252,7 @@ class MessageBrokerBeanDefinitionParser implements BeanDefinitionParser {
@@ -254,6 +252,7 @@ class MessageBrokerBeanDefinitionParser implements BeanDefinitionParser {
|
|
|
|
|
registerBeanDefByName(executorName, executor, context, source); |
|
|
|
|
cargs.addIndexedArgumentValue(0, new RuntimeBeanReference(executorName)); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
RootBeanDefinition channelDef = new RootBeanDefinition(ExecutorSubscribableChannel.class, cargs, null); |
|
|
|
|
ManagedList<? super Object> interceptors = new ManagedList<>(); |
|
|
|
|
if (element != null) { |
|
|
|
|
@ -327,13 +326,13 @@ class MessageBrokerBeanDefinitionParser implements BeanDefinitionParser {
@@ -327,13 +326,13 @@ class MessageBrokerBeanDefinitionParser implements BeanDefinitionParser {
|
|
|
|
|
return result; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
private RuntimeBeanReference registerRequestHandler(Element element, RuntimeBeanReference subProtoHandler, |
|
|
|
|
ParserContext cxt, @Nullable Object source) { |
|
|
|
|
private RuntimeBeanReference registerRequestHandler( |
|
|
|
|
Element element, RuntimeBeanReference subProtoHandler, ParserContext ctx, @Nullable Object source) { |
|
|
|
|
|
|
|
|
|
RootBeanDefinition beanDef; |
|
|
|
|
|
|
|
|
|
RuntimeBeanReference sockJsService = WebSocketNamespaceUtils.registerSockJsService( |
|
|
|
|
element, SCHEDULER_BEAN_NAME, cxt, source); |
|
|
|
|
element, SCHEDULER_BEAN_NAME, ctx, source); |
|
|
|
|
|
|
|
|
|
if (sockJsService != null) { |
|
|
|
|
ConstructorArgumentValues cargs = new ConstructorArgumentValues(); |
|
|
|
|
@ -342,12 +341,12 @@ class MessageBrokerBeanDefinitionParser implements BeanDefinitionParser {
@@ -342,12 +341,12 @@ class MessageBrokerBeanDefinitionParser implements BeanDefinitionParser {
|
|
|
|
|
beanDef = new RootBeanDefinition(SockJsHttpRequestHandler.class, cargs, null); |
|
|
|
|
|
|
|
|
|
// Register alias for backwards compatibility with 4.1
|
|
|
|
|
cxt.getRegistry().registerAlias(SCHEDULER_BEAN_NAME, SOCKJS_SCHEDULER_BEAN_NAME); |
|
|
|
|
ctx.getRegistry().registerAlias(SCHEDULER_BEAN_NAME, SOCKJS_SCHEDULER_BEAN_NAME); |
|
|
|
|
} |
|
|
|
|
else { |
|
|
|
|
RuntimeBeanReference handler = WebSocketNamespaceUtils.registerHandshakeHandler(element, cxt, source); |
|
|
|
|
RuntimeBeanReference handler = WebSocketNamespaceUtils.registerHandshakeHandler(element, ctx, source); |
|
|
|
|
Element interceptElem = DomUtils.getChildElementByTagName(element, "handshake-interceptors"); |
|
|
|
|
ManagedList<? super Object> interceptors = WebSocketNamespaceUtils.parseBeanSubElements(interceptElem, cxt); |
|
|
|
|
ManagedList<? super Object> interceptors = WebSocketNamespaceUtils.parseBeanSubElements(interceptElem, ctx); |
|
|
|
|
String allowedOrigins = element.getAttribute("allowed-origins"); |
|
|
|
|
List<String> origins = Arrays.asList(StringUtils.tokenizeToStringArray(allowedOrigins, ",")); |
|
|
|
|
interceptors.add(new OriginHandshakeInterceptor(origins)); |
|
|
|
|
@ -357,7 +356,7 @@ class MessageBrokerBeanDefinitionParser implements BeanDefinitionParser {
@@ -357,7 +356,7 @@ class MessageBrokerBeanDefinitionParser implements BeanDefinitionParser {
|
|
|
|
|
beanDef = new RootBeanDefinition(WebSocketHttpRequestHandler.class, cargs, null); |
|
|
|
|
beanDef.getPropertyValues().add("handshakeInterceptors", interceptors); |
|
|
|
|
} |
|
|
|
|
return new RuntimeBeanReference(registerBeanDef(beanDef, cxt, source)); |
|
|
|
|
return new RuntimeBeanReference(registerBeanDef(beanDef, ctx, source)); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
private RootBeanDefinition registerMessageBroker(Element brokerElement, |
|
|
|
|
@ -673,20 +672,20 @@ class MessageBrokerBeanDefinitionParser implements BeanDefinitionParser {
@@ -673,20 +672,20 @@ class MessageBrokerBeanDefinitionParser implements BeanDefinitionParser {
|
|
|
|
|
context.registerComponent(new BeanComponentDefinition(beanDef, name)); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
private static final class DecoratingFactoryBean implements FactoryBean<WebSocketHandler> { |
|
|
|
|
|
|
|
|
|
private final WebSocketHandler handler; |
|
|
|
|
|
|
|
|
|
private final List<WebSocketHandlerDecoratorFactory> factories; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
private DecoratingFactoryBean(WebSocketHandler handler, List<WebSocketHandlerDecoratorFactory> factories) { |
|
|
|
|
public DecoratingFactoryBean(WebSocketHandler handler, List<WebSocketHandlerDecoratorFactory> factories) { |
|
|
|
|
this.handler = handler; |
|
|
|
|
this.factories = factories; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
@Override |
|
|
|
|
public WebSocketHandler getObject() throws Exception { |
|
|
|
|
public WebSocketHandler getObject() { |
|
|
|
|
WebSocketHandler result = this.handler; |
|
|
|
|
for (WebSocketHandlerDecoratorFactory factory : this.factories) { |
|
|
|
|
result = factory.decorate(result); |
|
|
|
|
|