Polish WebSocket namespace
This commit is contained in:
@@ -38,13 +38,13 @@ import org.springframework.web.socket.server.support.WebSocketHttpRequestHandler
|
||||
import org.springframework.web.socket.sockjs.support.SockJsHttpRequestHandler;
|
||||
|
||||
/**
|
||||
* A {@link BeanDefinitionParser} that provides the configuration for the
|
||||
* {@code <websocket:handlers/>} namespace element. It registers a Spring MVC
|
||||
* {@link org.springframework.web.servlet.handler.SimpleUrlHandlerMapping}
|
||||
* to map HTTP WebSocket handshake requests to
|
||||
* {@link org.springframework.web.socket.WebSocketHandler}s.
|
||||
* Parses the configuration for the {@code <websocket:handlers/>} namespace
|
||||
* element. Registers a Spring MVC {@code SimpleUrlHandlerMapping} to map HTTP
|
||||
* WebSocket handshake (or SockJS) requests to
|
||||
* {@link org.springframework.web.socket.WebSocketHandler WebSocketHandler}s.
|
||||
*
|
||||
* @author Brian Clozel
|
||||
* @author Rossen Stoyanchev
|
||||
* @since 4.0
|
||||
*/
|
||||
class HandlersBeanDefinitionParser implements BeanDefinitionParser {
|
||||
@@ -55,11 +55,10 @@ class HandlersBeanDefinitionParser implements BeanDefinitionParser {
|
||||
|
||||
|
||||
@Override
|
||||
public BeanDefinition parse(Element element, ParserContext parserCxt) {
|
||||
|
||||
Object source = parserCxt.extractSource(element);
|
||||
public BeanDefinition parse(Element element, ParserContext context) {
|
||||
Object source = context.extractSource(element);
|
||||
CompositeComponentDefinition compDefinition = new CompositeComponentDefinition(element.getTagName(), source);
|
||||
parserCxt.pushContainingComponent(compDefinition);
|
||||
context.pushContainingComponent(compDefinition);
|
||||
|
||||
String orderAttribute = element.getAttribute("order");
|
||||
int order = orderAttribute.isEmpty() ? DEFAULT_MAPPING_ORDER : Integer.valueOf(orderAttribute);
|
||||
@@ -68,128 +67,106 @@ class HandlersBeanDefinitionParser implements BeanDefinitionParser {
|
||||
handlerMappingDef.setSource(source);
|
||||
handlerMappingDef.setRole(BeanDefinition.ROLE_INFRASTRUCTURE);
|
||||
handlerMappingDef.getPropertyValues().add("order", order);
|
||||
String handlerMappingName = parserCxt.getReaderContext().registerWithGeneratedName(handlerMappingDef);
|
||||
String handlerMappingName = context.getReaderContext().registerWithGeneratedName(handlerMappingDef);
|
||||
|
||||
RuntimeBeanReference handshakeHandler = WebSocketNamespaceUtils.registerHandshakeHandler(element, parserCxt, source);
|
||||
Element interceptorsElement = DomUtils.getChildElementByTagName(element, "handshake-interceptors");
|
||||
ManagedList<?> interceptors = WebSocketNamespaceUtils.parseBeanSubElements(interceptorsElement, parserCxt);
|
||||
RuntimeBeanReference sockJsServiceRef =
|
||||
WebSocketNamespaceUtils.registerSockJsService(element, SOCK_JS_SCHEDULER_NAME, parserCxt, source);
|
||||
RuntimeBeanReference sockJsService = WebSocketNamespaceUtils.registerSockJsService(
|
||||
element, SOCK_JS_SCHEDULER_NAME, context, source);
|
||||
|
||||
HandlerMappingStrategy strategy = createHandlerMappingStrategy(sockJsServiceRef, handshakeHandler, interceptors);
|
||||
HandlerMappingStrategy strategy;
|
||||
if (sockJsService != null) {
|
||||
strategy = new SockJsHandlerMappingStrategy(sockJsService);
|
||||
}
|
||||
else {
|
||||
RuntimeBeanReference handshakeHandler = WebSocketNamespaceUtils.registerHandshakeHandler(element, context, source);
|
||||
Element interceptorsElement = DomUtils.getChildElementByTagName(element, "handshake-interceptors");
|
||||
ManagedList<?> interceptors = WebSocketNamespaceUtils.parseBeanSubElements(interceptorsElement, context);
|
||||
strategy = new WebSocketHandlerMappingStrategy(handshakeHandler, interceptors);
|
||||
}
|
||||
|
||||
List<Element> mappingElements = DomUtils.getChildElementsByTagName(element, "mapping");
|
||||
ManagedMap<String, Object> urlMap = new ManagedMap<String, Object>();
|
||||
urlMap.setSource(source);
|
||||
|
||||
for(Element mappingElement : mappingElements) {
|
||||
urlMap.putAll(strategy.createMappings(mappingElement, parserCxt));
|
||||
for(Element mappingElement : DomUtils.getChildElementsByTagName(element, "mapping")) {
|
||||
strategy.addMapping(mappingElement, urlMap, context);
|
||||
}
|
||||
handlerMappingDef.getPropertyValues().add("urlMap", urlMap);
|
||||
|
||||
parserCxt.registerComponent(new BeanComponentDefinition(handlerMappingDef, handlerMappingName));
|
||||
parserCxt.popAndRegisterContainingComponent();
|
||||
context.registerComponent(new BeanComponentDefinition(handlerMappingDef, handlerMappingName));
|
||||
context.popAndRegisterContainingComponent();
|
||||
return null;
|
||||
}
|
||||
|
||||
|
||||
private interface HandlerMappingStrategy {
|
||||
|
||||
public ManagedMap<String, Object> createMappings(Element mappingElement, ParserContext parserContext);
|
||||
void addMapping(Element mappingElement, ManagedMap<String, Object> map, ParserContext context);
|
||||
|
||||
}
|
||||
|
||||
private HandlerMappingStrategy createHandlerMappingStrategy(
|
||||
RuntimeBeanReference sockJsServiceRef, RuntimeBeanReference handshakeHandlerRef,
|
||||
ManagedList<? extends Object> interceptorsList) {
|
||||
private static class WebSocketHandlerMappingStrategy implements HandlerMappingStrategy {
|
||||
|
||||
if(sockJsServiceRef != null) {
|
||||
SockJSHandlerMappingStrategy strategy = new SockJSHandlerMappingStrategy();
|
||||
strategy.setSockJsServiceRef(sockJsServiceRef);
|
||||
return strategy;
|
||||
private final RuntimeBeanReference handshakeHandlerReference;
|
||||
|
||||
private final ManagedList<?> interceptorsList;
|
||||
|
||||
|
||||
private WebSocketHandlerMappingStrategy(RuntimeBeanReference handshakeHandler, ManagedList<?> interceptors) {
|
||||
this.handshakeHandlerReference = handshakeHandler;
|
||||
this.interceptorsList = interceptors;
|
||||
}
|
||||
else {
|
||||
WebSocketHandlerMappingStrategy strategy = new WebSocketHandlerMappingStrategy();
|
||||
strategy.setHandshakeHandlerReference(handshakeHandlerRef);
|
||||
strategy.setInterceptorsList(interceptorsList);
|
||||
return strategy;
|
||||
}
|
||||
}
|
||||
|
||||
private class WebSocketHandlerMappingStrategy implements HandlerMappingStrategy {
|
||||
|
||||
private RuntimeBeanReference handshakeHandlerReference;
|
||||
|
||||
private ManagedList<?> interceptorsList;
|
||||
|
||||
public void setHandshakeHandlerReference(RuntimeBeanReference handshakeHandlerReference) {
|
||||
this.handshakeHandlerReference = handshakeHandlerReference;
|
||||
}
|
||||
|
||||
public void setInterceptorsList(ManagedList<?> interceptorsList) { this.interceptorsList = interceptorsList; }
|
||||
|
||||
@Override
|
||||
public ManagedMap<String, Object> createMappings(Element mappingElement, ParserContext parserContext) {
|
||||
ManagedMap<String, Object> urlMap = new ManagedMap<String, Object>();
|
||||
Object source = parserContext.extractSource(mappingElement);
|
||||
|
||||
String path = mappingElement.getAttribute("path");
|
||||
List<String> mappings = Arrays.asList(StringUtils.tokenizeToStringArray(path, ","));
|
||||
RuntimeBeanReference webSocketHandlerReference = new RuntimeBeanReference(mappingElement.getAttribute("handler"));
|
||||
public void addMapping(Element element, ManagedMap<String, Object> urlMap, ParserContext context) {
|
||||
String pathAttribute = element.getAttribute("path");
|
||||
List<String> mappings = Arrays.asList(StringUtils.tokenizeToStringArray(pathAttribute, ","));
|
||||
RuntimeBeanReference handlerReference = new RuntimeBeanReference(element.getAttribute("handler"));
|
||||
|
||||
ConstructorArgumentValues cavs = new ConstructorArgumentValues();
|
||||
cavs.addIndexedArgumentValue(0, webSocketHandlerReference);
|
||||
cavs.addIndexedArgumentValue(0, handlerReference);
|
||||
if(this.handshakeHandlerReference != null) {
|
||||
cavs.addIndexedArgumentValue(1, this.handshakeHandlerReference);
|
||||
}
|
||||
RootBeanDefinition requestHandlerDef = new RootBeanDefinition(WebSocketHttpRequestHandler.class, cavs, null);
|
||||
requestHandlerDef.setSource(source);
|
||||
requestHandlerDef.setSource(context.extractSource(element));
|
||||
requestHandlerDef.setRole(BeanDefinition.ROLE_INFRASTRUCTURE);
|
||||
requestHandlerDef.getPropertyValues().add("handshakeInterceptors", this.interceptorsList);
|
||||
String requestHandlerName = parserContext.getReaderContext().registerWithGeneratedName(requestHandlerDef);
|
||||
String requestHandlerName = context.getReaderContext().registerWithGeneratedName(requestHandlerDef);
|
||||
RuntimeBeanReference requestHandlerRef = new RuntimeBeanReference(requestHandlerName);
|
||||
|
||||
for(String mapping : mappings) {
|
||||
for (String mapping : mappings) {
|
||||
urlMap.put(mapping, requestHandlerRef);
|
||||
}
|
||||
|
||||
return urlMap;
|
||||
}
|
||||
}
|
||||
|
||||
private class SockJSHandlerMappingStrategy implements HandlerMappingStrategy {
|
||||
private static class SockJsHandlerMappingStrategy implements HandlerMappingStrategy {
|
||||
|
||||
private RuntimeBeanReference sockJsServiceRef;
|
||||
private final RuntimeBeanReference sockJsService;
|
||||
|
||||
public void setSockJsServiceRef(RuntimeBeanReference sockJsServiceRef) {
|
||||
this.sockJsServiceRef = sockJsServiceRef;
|
||||
|
||||
private SockJsHandlerMappingStrategy(RuntimeBeanReference sockJsService) {
|
||||
this.sockJsService = sockJsService;
|
||||
}
|
||||
|
||||
@Override
|
||||
public ManagedMap<String, Object> createMappings(Element mappingElement, ParserContext parserContext) {
|
||||
|
||||
ManagedMap<String, Object> urlMap = new ManagedMap<String, Object>();
|
||||
Object source = parserContext.extractSource(mappingElement);
|
||||
|
||||
String pathValue = mappingElement.getAttribute("path");
|
||||
List<String> mappings = Arrays.asList(StringUtils.tokenizeToStringArray(pathValue, ","));
|
||||
RuntimeBeanReference webSocketHandlerReference = new RuntimeBeanReference(mappingElement.getAttribute("handler"));
|
||||
public void addMapping(Element element, ManagedMap<String, Object> urlMap, ParserContext context) {
|
||||
String pathAttribute = element.getAttribute("path");
|
||||
List<String> mappings = Arrays.asList(StringUtils.tokenizeToStringArray(pathAttribute, ","));
|
||||
RuntimeBeanReference handlerReference = new RuntimeBeanReference(element.getAttribute("handler"));
|
||||
|
||||
ConstructorArgumentValues cavs = new ConstructorArgumentValues();
|
||||
cavs.addIndexedArgumentValue(0, this.sockJsServiceRef, "SockJsService");
|
||||
cavs.addIndexedArgumentValue(1, webSocketHandlerReference, "WebSocketHandler");
|
||||
cavs.addIndexedArgumentValue(0, this.sockJsService, "SockJsService");
|
||||
cavs.addIndexedArgumentValue(1, handlerReference, "WebSocketHandler");
|
||||
|
||||
RootBeanDefinition requestHandlerDef = new RootBeanDefinition(SockJsHttpRequestHandler.class, cavs, null);
|
||||
requestHandlerDef.setSource(source);
|
||||
requestHandlerDef.setSource(context.extractSource(element));
|
||||
requestHandlerDef.setRole(BeanDefinition.ROLE_INFRASTRUCTURE);
|
||||
String requestHandlerName = parserContext.getReaderContext().registerWithGeneratedName(requestHandlerDef);
|
||||
String requestHandlerName = context.getReaderContext().registerWithGeneratedName(requestHandlerDef);
|
||||
RuntimeBeanReference requestHandlerRef = new RuntimeBeanReference(requestHandlerName);
|
||||
|
||||
for(String path : mappings) {
|
||||
String pathPattern = path.endsWith("/") ? path + "**" : path + "/**";
|
||||
for (String mapping : mappings) {
|
||||
String pathPattern = (mapping.endsWith("/") ? mapping + "**" : mapping + "/**");
|
||||
urlMap.put(pathPattern, requestHandlerRef);
|
||||
}
|
||||
|
||||
return urlMap;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -50,7 +50,6 @@ import org.springframework.messaging.simp.user.UserDestinationMessageHandler;
|
||||
import org.springframework.messaging.simp.stomp.StompBrokerRelayMessageHandler;
|
||||
import org.springframework.messaging.support.ExecutorSubscribableChannel;
|
||||
import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
|
||||
import org.springframework.util.AntPathMatcher;
|
||||
import org.springframework.util.Assert;
|
||||
import org.springframework.util.ClassUtils;
|
||||
import org.springframework.util.MimeTypeUtils;
|
||||
@@ -92,7 +91,7 @@ import org.springframework.web.socket.sockjs.support.SockJsHttpRequestHandler;
|
||||
*/
|
||||
class MessageBrokerBeanDefinitionParser implements BeanDefinitionParser {
|
||||
|
||||
protected static final String SOCKJS_SCHEDULER_BEAN_NAME = "messageBrokerSockJsScheduler";
|
||||
private static final String SOCKJS_SCHEDULER_BEAN_NAME = "messageBrokerSockJsScheduler";
|
||||
|
||||
private static final int DEFAULT_MAPPING_ORDER = 1;
|
||||
|
||||
@@ -101,142 +100,111 @@ class MessageBrokerBeanDefinitionParser implements BeanDefinitionParser {
|
||||
|
||||
|
||||
@Override
|
||||
public BeanDefinition parse(Element element, ParserContext parserCxt) {
|
||||
|
||||
Object source = parserCxt.extractSource(element);
|
||||
public BeanDefinition parse(Element element, ParserContext context) {
|
||||
Object source = context.extractSource(element);
|
||||
CompositeComponentDefinition compDefinition = new CompositeComponentDefinition(element.getTagName(), source);
|
||||
parserCxt.pushContainingComponent(compDefinition);
|
||||
context.pushContainingComponent(compDefinition);
|
||||
|
||||
String orderAttribute = element.getAttribute("order");
|
||||
int order = orderAttribute.isEmpty() ? DEFAULT_MAPPING_ORDER : Integer.valueOf(orderAttribute);
|
||||
|
||||
ManagedMap<String, Object> urlMap = new ManagedMap<String, Object>();
|
||||
urlMap.setSource(source);
|
||||
|
||||
RootBeanDefinition handlerMappingDef = new RootBeanDefinition(SimpleUrlHandlerMapping.class);
|
||||
handlerMappingDef.getPropertyValues().add("order", order);
|
||||
handlerMappingDef.getPropertyValues().add("urlMap", urlMap);
|
||||
registerBeanDef(handlerMappingDef, context, source);
|
||||
|
||||
String beanName = "clientInboundChannel";
|
||||
Element channelElem = DomUtils.getChildElementByTagName(element, "client-inbound-channel");
|
||||
RuntimeBeanReference clientInChannel = getMessageChannel(beanName, channelElem, parserCxt, source);
|
||||
RuntimeBeanReference inChannel = getMessageChannel("clientInboundChannel", channelElem, context, source);
|
||||
|
||||
beanName = "clientOutboundChannel";
|
||||
channelElem = DomUtils.getChildElementByTagName(element, "client-outbound-channel");
|
||||
RuntimeBeanReference clientOutChannel = getMessageChannel(beanName, channelElem, parserCxt, source);
|
||||
RuntimeBeanReference outChannel = getMessageChannel("clientOutboundChannel", channelElem, context, source);
|
||||
|
||||
RootBeanDefinition beanDef = new RootBeanDefinition(DefaultUserSessionRegistry.class);
|
||||
beanName = registerBeanDef(beanDef, parserCxt, source);
|
||||
RuntimeBeanReference userSessionRegistry = new RuntimeBeanReference(beanName);
|
||||
RootBeanDefinition registryBeanDef = new RootBeanDefinition(DefaultUserSessionRegistry.class);
|
||||
String registryBeanName = registerBeanDef(registryBeanDef, context, source);
|
||||
RuntimeBeanReference sessionRegistry = new RuntimeBeanReference(registryBeanName);
|
||||
|
||||
RuntimeBeanReference subProtocolHandlerDef = registerSubProtocolWebSocketHandler(
|
||||
element, clientInChannel, clientOutChannel, userSessionRegistry, parserCxt, source);
|
||||
RuntimeBeanReference subProtoHandler = registerSubProtoHandler(element, inChannel, outChannel,
|
||||
sessionRegistry, context, source);
|
||||
|
||||
for(Element stompEndpointElem : DomUtils.getChildElementsByTagName(element, "stomp-endpoint")) {
|
||||
|
||||
RuntimeBeanReference httpRequestHandler = registerHttpRequestHandler(
|
||||
stompEndpointElem, subProtocolHandlerDef, parserCxt, source);
|
||||
|
||||
String pathAttribute = stompEndpointElem.getAttribute("path");
|
||||
for (Element endpointElem : DomUtils.getChildElementsByTagName(element, "stomp-endpoint")) {
|
||||
RuntimeBeanReference requestHandler = registerRequestHandler(endpointElem, subProtoHandler, 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) {
|
||||
path = path.trim();
|
||||
Assert.state(StringUtils.hasText(path), "Invalid <stomp-endpoint> path attribute: " + pathAttribute);
|
||||
if (DomUtils.getChildElementByTagName(stompEndpointElem, "sockjs") != null) {
|
||||
if (DomUtils.getChildElementByTagName(endpointElem, "sockjs") != null) {
|
||||
path = path.endsWith("/") ? path + "**" : path + "/**";
|
||||
}
|
||||
urlMap.put(path, httpRequestHandler);
|
||||
urlMap.put(path, requestHandler);
|
||||
}
|
||||
}
|
||||
|
||||
registerBeanDef(handlerMappingDef, parserCxt, source);
|
||||
|
||||
beanName = "brokerChannel";
|
||||
channelElem = DomUtils.getChildElementByTagName(element, "broker-channel");
|
||||
RuntimeBeanReference brokerChannel = getMessageChannel(beanName, channelElem, parserCxt, source);
|
||||
RootBeanDefinition brokerDef = registerMessageBroker(element, clientInChannel,
|
||||
clientOutChannel, brokerChannel, parserCxt, source);
|
||||
RuntimeBeanReference brokerChannel = getMessageChannel("brokerChannel", channelElem, context, source);
|
||||
RootBeanDefinition broker = registerMessageBroker(element, inChannel, outChannel, brokerChannel, context, source);
|
||||
|
||||
RuntimeBeanReference messageConverter = registerBrokerMessageConverter(element, parserCxt, source);
|
||||
RuntimeBeanReference converter = registerMessageConverter(element, context, source);
|
||||
RuntimeBeanReference template = registerMessagingTemplate(element, brokerChannel, converter, context, source);
|
||||
registerAnnotationMethodMessageHandler(element, inChannel, outChannel,converter, template, context, source);
|
||||
|
||||
RuntimeBeanReference messagingTemplate = registerBrokerMessagingTemplate(element, brokerChannel,
|
||||
messageConverter, parserCxt, source);
|
||||
|
||||
registerAnnotationMethodMessageHandler(element, clientInChannel, clientOutChannel,
|
||||
messageConverter, messagingTemplate, parserCxt, source);
|
||||
|
||||
RuntimeBeanReference userDestinationResolver = registerUserDestinationResolver(element,
|
||||
userSessionRegistry, parserCxt, source);
|
||||
|
||||
registerUserDestinationMessageHandler(clientInChannel, clientOutChannel, brokerChannel,
|
||||
userDestinationResolver, parserCxt, source);
|
||||
RuntimeBeanReference resolver = registerUserDestinationResolver(element, sessionRegistry, context, source);
|
||||
registerUserDestinationMessageHandler(inChannel, brokerChannel, resolver, context, source);
|
||||
|
||||
Map<String, Object> scopeMap = Collections.<String, Object>singletonMap("websocket", new SimpSessionScope());
|
||||
RootBeanDefinition scopeConfigurerDef = new RootBeanDefinition(CustomScopeConfigurer.class);
|
||||
scopeConfigurerDef.getPropertyValues().add("scopes", scopeMap);
|
||||
registerBeanDefByName("webSocketScopeConfigurer", scopeConfigurerDef, parserCxt, source);
|
||||
RootBeanDefinition scopeConfigurer = new RootBeanDefinition(CustomScopeConfigurer.class);
|
||||
scopeConfigurer.getPropertyValues().add("scopes", scopeMap);
|
||||
registerBeanDefByName("webSocketScopeConfigurer", scopeConfigurer, context, source);
|
||||
|
||||
registerWebSocketMessageBrokerStats(subProtocolHandlerDef, brokerDef, clientInChannel,
|
||||
clientOutChannel, parserCxt, source);
|
||||
|
||||
parserCxt.popAndRegisterContainingComponent();
|
||||
registerWebSocketMessageBrokerStats(subProtoHandler, broker, inChannel, outChannel, context, source);
|
||||
|
||||
context.popAndRegisterContainingComponent();
|
||||
return null;
|
||||
}
|
||||
|
||||
private RuntimeBeanReference getMessageChannel(String channelName, Element channelElement,
|
||||
ParserContext parserCxt, Object source) {
|
||||
|
||||
RootBeanDefinition executorDef = null;
|
||||
if (channelElement == null) {
|
||||
executorDef = getDefaultExecutorBeanDefinition(channelName);
|
||||
private RuntimeBeanReference getMessageChannel(String name, Element element, ParserContext context, Object source) {
|
||||
RootBeanDefinition executor = null;
|
||||
if (element == null) {
|
||||
executor = getDefaultExecutorBeanDefinition(name);
|
||||
}
|
||||
else {
|
||||
Element executor = DomUtils.getChildElementByTagName(channelElement, "executor");
|
||||
if (executor == null) {
|
||||
executorDef = getDefaultExecutorBeanDefinition(channelName);
|
||||
Element executorElem = DomUtils.getChildElementByTagName(element, "executor");
|
||||
if (executorElem == null) {
|
||||
executor = getDefaultExecutorBeanDefinition(name);
|
||||
}
|
||||
else {
|
||||
executorDef = new RootBeanDefinition(ThreadPoolTaskExecutor.class);
|
||||
String attrValue = executor.getAttribute("core-pool-size");
|
||||
if (!StringUtils.isEmpty(attrValue)) {
|
||||
executorDef.getPropertyValues().add("corePoolSize", attrValue);
|
||||
executor = new RootBeanDefinition(ThreadPoolTaskExecutor.class);
|
||||
if (executorElem.hasAttribute("core-pool-size")) {
|
||||
executor.getPropertyValues().add("corePoolSize", executorElem.getAttribute("core-pool-size"));
|
||||
}
|
||||
attrValue = executor.getAttribute("max-pool-size");
|
||||
if (!StringUtils.isEmpty(attrValue)) {
|
||||
executorDef.getPropertyValues().add("maxPoolSize", attrValue);
|
||||
if (executorElem.hasAttribute("max-pool-size")) {
|
||||
executor.getPropertyValues().add("maxPoolSize", executorElem.getAttribute("max-pool-size"));
|
||||
}
|
||||
attrValue = executor.getAttribute("keep-alive-seconds");
|
||||
if (!StringUtils.isEmpty(attrValue)) {
|
||||
executorDef.getPropertyValues().add("keepAliveSeconds", attrValue);
|
||||
if (executorElem.hasAttribute("keep-alive-seconds")) {
|
||||
executor.getPropertyValues().add("keepAliveSeconds", executorElem.getAttribute("keep-alive-seconds"));
|
||||
}
|
||||
attrValue = executor.getAttribute("queue-capacity");
|
||||
if (!StringUtils.isEmpty(attrValue)) {
|
||||
executorDef.getPropertyValues().add("queueCapacity", attrValue);
|
||||
if (executorElem.hasAttribute("queue-capacity")) {
|
||||
executor.getPropertyValues().add("queueCapacity", executorElem.getAttribute("queue-capacity"));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
ConstructorArgumentValues argValues = new ConstructorArgumentValues();
|
||||
if (executorDef != null) {
|
||||
executorDef.getPropertyValues().add("threadNamePrefix", channelName + "-");
|
||||
String executorName = channelName + "Executor";
|
||||
registerBeanDefByName(executorName, executorDef, parserCxt, source);
|
||||
if (executor != null) {
|
||||
executor.getPropertyValues().add("threadNamePrefix", name + "-");
|
||||
String executorName = name + "Executor";
|
||||
registerBeanDefByName(executorName, executor, context, source);
|
||||
argValues.addIndexedArgumentValue(0, new RuntimeBeanReference(executorName));
|
||||
}
|
||||
|
||||
RootBeanDefinition channelDef = new RootBeanDefinition(ExecutorSubscribableChannel.class, argValues, null);
|
||||
|
||||
if (channelElement != null) {
|
||||
Element interceptorsElement = DomUtils.getChildElementByTagName(channelElement, "interceptors");
|
||||
ManagedList<?> interceptorList = WebSocketNamespaceUtils.parseBeanSubElements(interceptorsElement, parserCxt);
|
||||
channelDef.getPropertyValues().add("interceptors", interceptorList);
|
||||
if (element != null) {
|
||||
Element interceptorsElement = DomUtils.getChildElementByTagName(element, "interceptors");
|
||||
ManagedList<?> interceptors = WebSocketNamespaceUtils.parseBeanSubElements(interceptorsElement, context);
|
||||
channelDef.getPropertyValues().add("interceptors", interceptors);
|
||||
}
|
||||
|
||||
registerBeanDefByName(channelName, channelDef, parserCxt, source);
|
||||
return new RuntimeBeanReference(channelName);
|
||||
registerBeanDefByName(name, channelDef, context, source);
|
||||
return new RuntimeBeanReference(name);
|
||||
}
|
||||
|
||||
private RootBeanDefinition getDefaultExecutorBeanDefinition(String channelName) {
|
||||
@@ -250,81 +218,71 @@ class MessageBrokerBeanDefinitionParser implements BeanDefinitionParser {
|
||||
return executorDef;
|
||||
}
|
||||
|
||||
private RuntimeBeanReference registerSubProtocolWebSocketHandler(Element element,
|
||||
RuntimeBeanReference clientInChannel, RuntimeBeanReference clientOutChannel,
|
||||
RuntimeBeanReference userSessionRegistry, ParserContext parserCxt, Object source) {
|
||||
private RuntimeBeanReference registerSubProtoHandler(Element element, RuntimeBeanReference inChannel,
|
||||
RuntimeBeanReference outChannel, RuntimeBeanReference registry, ParserContext context, Object source) {
|
||||
|
||||
RootBeanDefinition stompHandlerDef = new RootBeanDefinition(StompSubProtocolHandler.class);
|
||||
stompHandlerDef.getPropertyValues().add("userSessionRegistry", userSessionRegistry);
|
||||
registerBeanDef(stompHandlerDef, parserCxt, source);
|
||||
stompHandlerDef.getPropertyValues().add("userSessionRegistry", registry);
|
||||
registerBeanDef(stompHandlerDef, context, source);
|
||||
|
||||
ConstructorArgumentValues cavs = new ConstructorArgumentValues();
|
||||
cavs.addIndexedArgumentValue(0, clientInChannel);
|
||||
cavs.addIndexedArgumentValue(1, clientOutChannel);
|
||||
cavs.addIndexedArgumentValue(0, inChannel);
|
||||
cavs.addIndexedArgumentValue(1, outChannel);
|
||||
|
||||
RootBeanDefinition subProtocolWshDef = new RootBeanDefinition(SubProtocolWebSocketHandler.class, cavs, null);
|
||||
subProtocolWshDef.getPropertyValues().addPropertyValue("protocolHandlers", stompHandlerDef);
|
||||
String subProtocolWshName = registerBeanDef(subProtocolWshDef, parserCxt, source);
|
||||
RootBeanDefinition beanDef = new RootBeanDefinition(SubProtocolWebSocketHandler.class, cavs, null);
|
||||
beanDef.getPropertyValues().addPropertyValue("protocolHandlers", stompHandlerDef);
|
||||
|
||||
Element transportElem = DomUtils.getChildElementByTagName(element, "transport");
|
||||
if (transportElem != null) {
|
||||
String messageSize = transportElem.getAttribute("message-size");
|
||||
if (messageSize != null) {
|
||||
stompHandlerDef.getPropertyValues().add("messageSizeLimit", messageSize);
|
||||
if (transportElem.hasAttribute("message-size")) {
|
||||
stompHandlerDef.getPropertyValues().add("messageSizeLimit", transportElem.getAttribute("message-size"));
|
||||
}
|
||||
String sendTimeLimit = transportElem.getAttribute("send-timeout");
|
||||
if (sendTimeLimit != null) {
|
||||
subProtocolWshDef.getPropertyValues().add("sendTimeLimit", sendTimeLimit);
|
||||
if (transportElem.hasAttribute("send-timeout")) {
|
||||
beanDef.getPropertyValues().add("sendTimeLimit", transportElem.getAttribute("send-timeout"));
|
||||
}
|
||||
String sendBufferSizeLimit = transportElem.getAttribute("send-buffer-size");
|
||||
if (sendBufferSizeLimit != null) {
|
||||
subProtocolWshDef.getPropertyValues().add("sendBufferSizeLimit", sendBufferSizeLimit);
|
||||
if (transportElem.hasAttribute("send-buffer-size")) {
|
||||
beanDef.getPropertyValues().add("sendBufferSizeLimit", transportElem.getAttribute("send-buffer-size"));
|
||||
}
|
||||
}
|
||||
|
||||
return new RuntimeBeanReference(subProtocolWshName);
|
||||
return new RuntimeBeanReference(registerBeanDef(beanDef, context, source));
|
||||
}
|
||||
|
||||
private RuntimeBeanReference registerHttpRequestHandler(Element stompEndpointElement,
|
||||
RuntimeBeanReference subProtocolWebSocketHandler, ParserContext parserCxt, Object source) {
|
||||
private RuntimeBeanReference registerRequestHandler(Element element, RuntimeBeanReference subProtoHandler,
|
||||
ParserContext context, Object source) {
|
||||
|
||||
RootBeanDefinition httpRequestHandlerDef;
|
||||
RootBeanDefinition beanDef;
|
||||
|
||||
RuntimeBeanReference sockJsService = WebSocketNamespaceUtils.registerSockJsService(
|
||||
stompEndpointElement, SOCKJS_SCHEDULER_BEAN_NAME, parserCxt, source);
|
||||
element, SOCKJS_SCHEDULER_BEAN_NAME, context, source);
|
||||
|
||||
if (sockJsService != null) {
|
||||
ConstructorArgumentValues cavs = new ConstructorArgumentValues();
|
||||
cavs.addIndexedArgumentValue(0, sockJsService);
|
||||
cavs.addIndexedArgumentValue(1, subProtocolWebSocketHandler);
|
||||
httpRequestHandlerDef = new RootBeanDefinition(SockJsHttpRequestHandler.class, cavs, null);
|
||||
cavs.addIndexedArgumentValue(1, subProtoHandler);
|
||||
beanDef = new RootBeanDefinition(SockJsHttpRequestHandler.class, cavs, null);
|
||||
}
|
||||
else {
|
||||
RuntimeBeanReference handshakeHandler =
|
||||
WebSocketNamespaceUtils.registerHandshakeHandler(stompEndpointElement, parserCxt, source);
|
||||
RuntimeBeanReference handshakeHandler = WebSocketNamespaceUtils.registerHandshakeHandler(element, context, source);
|
||||
ConstructorArgumentValues cavs = new ConstructorArgumentValues();
|
||||
cavs.addIndexedArgumentValue(0, subProtocolWebSocketHandler);
|
||||
if(handshakeHandler != null) {
|
||||
cavs.addIndexedArgumentValue(0, subProtoHandler);
|
||||
if (handshakeHandler != null) {
|
||||
cavs.addIndexedArgumentValue(1, handshakeHandler);
|
||||
}
|
||||
httpRequestHandlerDef = new RootBeanDefinition(WebSocketHttpRequestHandler.class, cavs, null);
|
||||
beanDef = new RootBeanDefinition(WebSocketHttpRequestHandler.class, cavs, null);
|
||||
}
|
||||
|
||||
String httpRequestHandlerBeanName = registerBeanDef(httpRequestHandlerDef, parserCxt, source);
|
||||
return new RuntimeBeanReference(httpRequestHandlerBeanName);
|
||||
return new RuntimeBeanReference(registerBeanDef(beanDef, context, source));
|
||||
}
|
||||
|
||||
private RootBeanDefinition registerMessageBroker(Element messageBrokerElement, RuntimeBeanReference clientInChannelDef,
|
||||
RuntimeBeanReference clientOutChannelDef, RuntimeBeanReference brokerChannelDef,
|
||||
ParserContext parserCxt, Object source) {
|
||||
private RootBeanDefinition registerMessageBroker(Element messageBrokerElement, RuntimeBeanReference inChannel,
|
||||
RuntimeBeanReference outChannel, RuntimeBeanReference brokerChannel, ParserContext context, Object source) {
|
||||
|
||||
Element simpleBrokerElem = DomUtils.getChildElementByTagName(messageBrokerElement, "simple-broker");
|
||||
Element brokerRelayElem = DomUtils.getChildElementByTagName(messageBrokerElement, "stomp-broker-relay");
|
||||
|
||||
ConstructorArgumentValues cavs = new ConstructorArgumentValues();
|
||||
cavs.addIndexedArgumentValue(0, clientInChannelDef);
|
||||
cavs.addIndexedArgumentValue(1, clientOutChannelDef);
|
||||
cavs.addIndexedArgumentValue(2, brokerChannelDef);
|
||||
cavs.addIndexedArgumentValue(0, inChannel);
|
||||
cavs.addIndexedArgumentValue(1, outChannel);
|
||||
cavs.addIndexedArgumentValue(2, brokerChannel);
|
||||
|
||||
RootBeanDefinition brokerDef;
|
||||
if (simpleBrokerElem != null) {
|
||||
@@ -332,213 +290,177 @@ class MessageBrokerBeanDefinitionParser implements BeanDefinitionParser {
|
||||
cavs.addIndexedArgumentValue(3, Arrays.asList(StringUtils.tokenizeToStringArray(prefix, ",")));
|
||||
brokerDef = new RootBeanDefinition(SimpleBrokerMessageHandler.class, cavs, null);
|
||||
if (messageBrokerElement.hasAttribute("path-matcher")) {
|
||||
brokerDef.getPropertyValues().add("pathMatcher",
|
||||
new RuntimeBeanReference(messageBrokerElement.getAttribute("path-matcher")));
|
||||
String pathMatcherRef = messageBrokerElement.getAttribute("path-matcher");
|
||||
brokerDef.getPropertyValues().add("pathMatcher", new RuntimeBeanReference(pathMatcherRef));
|
||||
}
|
||||
}
|
||||
else if (brokerRelayElem != null) {
|
||||
String prefix = brokerRelayElem.getAttribute("prefix");
|
||||
cavs.addIndexedArgumentValue(3, Arrays.asList(StringUtils.tokenizeToStringArray(prefix, ",")));
|
||||
|
||||
MutablePropertyValues mpvs = new MutablePropertyValues();
|
||||
String relayHost = brokerRelayElem.getAttribute("relay-host");
|
||||
if(!relayHost.isEmpty()) {
|
||||
mpvs.add("relayHost",relayHost);
|
||||
MutablePropertyValues values = new MutablePropertyValues();
|
||||
if (brokerRelayElem.hasAttribute("relay-host")) {
|
||||
values.add("relayHost", brokerRelayElem.getAttribute("relay-host"));
|
||||
}
|
||||
String relayPort = brokerRelayElem.getAttribute("relay-port");
|
||||
if(!relayPort.isEmpty()) {
|
||||
mpvs.add("relayPort", Integer.valueOf(relayPort));
|
||||
if (brokerRelayElem.hasAttribute("relay-port")) {
|
||||
values.add("relayPort", brokerRelayElem.getAttribute("relay-port"));
|
||||
}
|
||||
String attrValue = brokerRelayElem.getAttribute("client-login");
|
||||
if(!attrValue.isEmpty()) {
|
||||
mpvs.add("clientLogin",attrValue);
|
||||
if (brokerRelayElem.hasAttribute("client-login")) {
|
||||
values.add("clientLogin", brokerRelayElem.getAttribute("client-login"));
|
||||
}
|
||||
attrValue = brokerRelayElem.getAttribute("client-passcode");
|
||||
if(!attrValue.isEmpty()) {
|
||||
mpvs.add("clientPasscode", attrValue);
|
||||
if (brokerRelayElem.hasAttribute("client-passcode")) {
|
||||
values.add("clientPasscode", brokerRelayElem.getAttribute("client-passcode"));
|
||||
}
|
||||
attrValue = brokerRelayElem.getAttribute("system-login");
|
||||
if(!attrValue.isEmpty()) {
|
||||
mpvs.add("systemLogin",attrValue);
|
||||
if (brokerRelayElem.hasAttribute("system-login")) {
|
||||
values.add("systemLogin", brokerRelayElem.getAttribute("system-login"));
|
||||
}
|
||||
attrValue = brokerRelayElem.getAttribute("system-passcode");
|
||||
if(!attrValue.isEmpty()) {
|
||||
mpvs.add("systemPasscode", attrValue);
|
||||
if (brokerRelayElem.hasAttribute("system-passcode")) {
|
||||
values.add("systemPasscode", brokerRelayElem.getAttribute("system-passcode"));
|
||||
}
|
||||
attrValue = brokerRelayElem.getAttribute("heartbeat-send-interval");
|
||||
if(!attrValue.isEmpty()) {
|
||||
mpvs.add("systemHeartbeatSendInterval", Long.parseLong(attrValue));
|
||||
if (brokerRelayElem.hasAttribute("heartbeat-send-interval")) {
|
||||
values.add("systemHeartbeatSendInterval", brokerRelayElem.getAttribute("heartbeat-send-interval"));
|
||||
}
|
||||
attrValue = brokerRelayElem.getAttribute("heartbeat-receive-interval");
|
||||
if(!attrValue.isEmpty()) {
|
||||
mpvs.add("systemHeartbeatReceiveInterval", Long.parseLong(attrValue));
|
||||
if (brokerRelayElem.hasAttribute("heartbeat-receive-interval")) {
|
||||
values.add("systemHeartbeatReceiveInterval", brokerRelayElem.getAttribute("heartbeat-receive-interval"));
|
||||
}
|
||||
attrValue = brokerRelayElem.getAttribute("virtual-host");
|
||||
if(!attrValue.isEmpty()) {
|
||||
mpvs.add("virtualHost", attrValue);
|
||||
if (brokerRelayElem.hasAttribute("virtual-host")) {
|
||||
values.add("virtualHost", brokerRelayElem.getAttribute("virtual-host"));
|
||||
}
|
||||
Class<?> handlerType = StompBrokerRelayMessageHandler.class;
|
||||
brokerDef = new RootBeanDefinition(handlerType, cavs, mpvs);
|
||||
brokerDef = new RootBeanDefinition(handlerType, cavs, values);
|
||||
}
|
||||
else {
|
||||
// Should not happen
|
||||
throw new IllegalStateException("Neither <simple-broker> nor <stomp-broker-relay> elements found.");
|
||||
}
|
||||
registerBeanDef(brokerDef, parserCxt, source);
|
||||
registerBeanDef(brokerDef, context, source);
|
||||
return brokerDef;
|
||||
}
|
||||
|
||||
private RuntimeBeanReference registerBrokerMessageConverter(Element element,
|
||||
ParserContext parserCxt, Object source) {
|
||||
|
||||
private RuntimeBeanReference registerMessageConverter(Element element, ParserContext context, Object source) {
|
||||
Element convertersElement = DomUtils.getChildElementByTagName(element, "message-converters");
|
||||
ManagedList<? super Object> convertersDef = new ManagedList<Object>();
|
||||
ManagedList<? super Object> converters = new ManagedList<Object>();
|
||||
if (convertersElement != null) {
|
||||
convertersDef.setSource(source);
|
||||
converters.setSource(source);
|
||||
for (Element beanElement : DomUtils.getChildElementsByTagName(convertersElement, "bean", "ref")) {
|
||||
Object object = parserCxt.getDelegate().parsePropertySubElement(beanElement, null);
|
||||
convertersDef.add(object);
|
||||
Object object = context.getDelegate().parsePropertySubElement(beanElement, null);
|
||||
converters.add(object);
|
||||
}
|
||||
}
|
||||
|
||||
if (convertersElement == null || Boolean.valueOf(convertersElement.getAttribute("register-defaults"))) {
|
||||
convertersDef.setSource(source);
|
||||
convertersDef.add(new RootBeanDefinition(StringMessageConverter.class));
|
||||
convertersDef.add(new RootBeanDefinition(ByteArrayMessageConverter.class));
|
||||
converters.setSource(source);
|
||||
converters.add(new RootBeanDefinition(StringMessageConverter.class));
|
||||
converters.add(new RootBeanDefinition(ByteArrayMessageConverter.class));
|
||||
if (jackson2Present) {
|
||||
RootBeanDefinition jacksonConverterDef = new RootBeanDefinition(MappingJackson2MessageConverter.class);
|
||||
RootBeanDefinition resolverDef = new RootBeanDefinition(DefaultContentTypeResolver.class);
|
||||
resolverDef.getPropertyValues().add("defaultMimeType", MimeTypeUtils.APPLICATION_JSON);
|
||||
jacksonConverterDef.getPropertyValues().add("contentTypeResolver", resolverDef);
|
||||
convertersDef.add(jacksonConverterDef);
|
||||
converters.add(jacksonConverterDef);
|
||||
}
|
||||
}
|
||||
|
||||
ConstructorArgumentValues cavs = new ConstructorArgumentValues();
|
||||
cavs.addIndexedArgumentValue(0, convertersDef);
|
||||
|
||||
cavs.addIndexedArgumentValue(0, converters);
|
||||
RootBeanDefinition messageConverterDef = new RootBeanDefinition(CompositeMessageConverter.class, cavs, null);
|
||||
return new RuntimeBeanReference(registerBeanDef(messageConverterDef, parserCxt, source));
|
||||
return new RuntimeBeanReference(registerBeanDef(messageConverterDef, context, source));
|
||||
}
|
||||
|
||||
private RuntimeBeanReference registerBrokerMessagingTemplate(
|
||||
Element element, RuntimeBeanReference brokerChannelDef, RuntimeBeanReference messageConverterRef,
|
||||
ParserContext parserCxt, Object source) {
|
||||
private RuntimeBeanReference registerMessagingTemplate(Element element, RuntimeBeanReference brokerChannel,
|
||||
RuntimeBeanReference messageConverter, ParserContext context, Object source) {
|
||||
|
||||
ConstructorArgumentValues cavs = new ConstructorArgumentValues();
|
||||
cavs.addIndexedArgumentValue(0, brokerChannelDef);
|
||||
RootBeanDefinition messagingTemplateDef = new RootBeanDefinition(SimpMessagingTemplate.class,cavs, null);
|
||||
|
||||
String userDestinationPrefixAttribute = element.getAttribute("user-destination-prefix");
|
||||
if(!userDestinationPrefixAttribute.isEmpty()) {
|
||||
messagingTemplateDef.getPropertyValues().add("userDestinationPrefix", userDestinationPrefixAttribute);
|
||||
cavs.addIndexedArgumentValue(0, brokerChannel);
|
||||
RootBeanDefinition beanDef = new RootBeanDefinition(SimpMessagingTemplate.class,cavs, null);
|
||||
if(element.hasAttribute("user-destination-prefix")) {
|
||||
beanDef.getPropertyValues().add("userDestinationPrefix", element.getAttribute("user-destination-prefix"));
|
||||
}
|
||||
messagingTemplateDef.getPropertyValues().add("messageConverter", messageConverterRef);
|
||||
|
||||
return new RuntimeBeanReference(registerBeanDef(messagingTemplateDef,parserCxt, source));
|
||||
beanDef.getPropertyValues().add("messageConverter", messageConverter);
|
||||
return new RuntimeBeanReference(registerBeanDef(beanDef,context, source));
|
||||
}
|
||||
|
||||
private void registerAnnotationMethodMessageHandler(Element messageBrokerElement,
|
||||
RuntimeBeanReference clientInChannelDef, RuntimeBeanReference clientOutChannelDef,
|
||||
RuntimeBeanReference brokerMessageConverterRef, RuntimeBeanReference brokerMessagingTemplateRef,
|
||||
ParserContext parserCxt, Object source) {
|
||||
|
||||
String appDestPrefix = messageBrokerElement.getAttribute("application-destination-prefix");
|
||||
RuntimeBeanReference inChannel, RuntimeBeanReference outChannel,
|
||||
RuntimeBeanReference converter, RuntimeBeanReference messagingTemplate,
|
||||
ParserContext context, Object source) {
|
||||
|
||||
ConstructorArgumentValues cavs = new ConstructorArgumentValues();
|
||||
cavs.addIndexedArgumentValue(0, clientInChannelDef);
|
||||
cavs.addIndexedArgumentValue(1, clientOutChannelDef);
|
||||
cavs.addIndexedArgumentValue(2, brokerMessagingTemplateRef);
|
||||
cavs.addIndexedArgumentValue(0, inChannel);
|
||||
cavs.addIndexedArgumentValue(1, outChannel);
|
||||
cavs.addIndexedArgumentValue(2, messagingTemplate);
|
||||
|
||||
MutablePropertyValues mpvs = new MutablePropertyValues();
|
||||
mpvs.add("destinationPrefixes",Arrays.asList(StringUtils.tokenizeToStringArray(appDestPrefix, ",")));
|
||||
mpvs.add("messageConverter", brokerMessageConverterRef);
|
||||
MutablePropertyValues values = new MutablePropertyValues();
|
||||
String prefixAttribute = messageBrokerElement.getAttribute("application-destination-prefix");
|
||||
values.add("destinationPrefixes", Arrays.asList(StringUtils.tokenizeToStringArray(prefixAttribute, ",")));
|
||||
values.add("messageConverter", converter);
|
||||
|
||||
RootBeanDefinition beanDef = new RootBeanDefinition(SimpAnnotationMethodMessageHandler.class, cavs, mpvs);
|
||||
RootBeanDefinition beanDef = new RootBeanDefinition(SimpAnnotationMethodMessageHandler.class, cavs, values);
|
||||
if (messageBrokerElement.hasAttribute("path-matcher")) {
|
||||
beanDef.getPropertyValues().add("pathMatcher",
|
||||
new RuntimeBeanReference(messageBrokerElement.getAttribute("path-matcher")));
|
||||
String pathMatcherRef = messageBrokerElement.getAttribute("path-matcher");
|
||||
beanDef.getPropertyValues().add("pathMatcher", new RuntimeBeanReference(pathMatcherRef));
|
||||
}
|
||||
|
||||
registerBeanDef(beanDef, parserCxt, source);
|
||||
registerBeanDef(beanDef, context, source);
|
||||
}
|
||||
|
||||
private RuntimeBeanReference registerUserDestinationResolver(Element messageBrokerElement,
|
||||
RuntimeBeanReference userSessionRegistry, ParserContext parserCxt, Object source) {
|
||||
private RuntimeBeanReference registerUserDestinationResolver(Element brokerElem,
|
||||
RuntimeBeanReference userSessionRegistry, ParserContext context, Object source) {
|
||||
|
||||
ConstructorArgumentValues cavs = new ConstructorArgumentValues();
|
||||
cavs.addIndexedArgumentValue(0, userSessionRegistry);
|
||||
RootBeanDefinition userDestinationResolverDef =
|
||||
new RootBeanDefinition(DefaultUserDestinationResolver.class, cavs, null);
|
||||
String prefix = messageBrokerElement.getAttribute("user-destination-prefix");
|
||||
if (!prefix.isEmpty()) {
|
||||
userDestinationResolverDef.getPropertyValues().add("userDestinationPrefix", prefix);
|
||||
RootBeanDefinition beanDef = new RootBeanDefinition(DefaultUserDestinationResolver.class, cavs, null);
|
||||
if (brokerElem.hasAttribute("user-destination-prefix")) {
|
||||
beanDef.getPropertyValues().add("userDestinationPrefix", brokerElem.getAttribute("user-destination-prefix"));
|
||||
}
|
||||
String userDestinationResolverName = registerBeanDef(userDestinationResolverDef, parserCxt, source);
|
||||
return new RuntimeBeanReference(userDestinationResolverName);
|
||||
return new RuntimeBeanReference(registerBeanDef(beanDef, context, source));
|
||||
}
|
||||
|
||||
private RuntimeBeanReference registerUserDestinationMessageHandler(RuntimeBeanReference clientInChannelDef,
|
||||
RuntimeBeanReference clientOutChannelDef, RuntimeBeanReference brokerChannelDef,
|
||||
RuntimeBeanReference userDestinationResolverRef, ParserContext parserCxt, Object source) {
|
||||
private RuntimeBeanReference registerUserDestinationMessageHandler(RuntimeBeanReference inChannel,
|
||||
RuntimeBeanReference brokerChannel, RuntimeBeanReference userDestinationResolver,
|
||||
ParserContext context, Object source) {
|
||||
|
||||
ConstructorArgumentValues cavs = new ConstructorArgumentValues();
|
||||
cavs.addIndexedArgumentValue(0, clientInChannelDef);
|
||||
cavs.addIndexedArgumentValue(1, brokerChannelDef);
|
||||
cavs.addIndexedArgumentValue(2, userDestinationResolverRef);
|
||||
|
||||
RootBeanDefinition userDestinationMessageHandlerDef =
|
||||
new RootBeanDefinition(UserDestinationMessageHandler.class, cavs, null);
|
||||
|
||||
String userDestinationMessageHandleName = registerBeanDef(userDestinationMessageHandlerDef, parserCxt, source);
|
||||
return new RuntimeBeanReference(userDestinationMessageHandleName);
|
||||
cavs.addIndexedArgumentValue(0, inChannel);
|
||||
cavs.addIndexedArgumentValue(1, brokerChannel);
|
||||
cavs.addIndexedArgumentValue(2, userDestinationResolver);
|
||||
RootBeanDefinition beanDef = new RootBeanDefinition(UserDestinationMessageHandler.class, cavs, null);
|
||||
return new RuntimeBeanReference(registerBeanDef(beanDef, context, source));
|
||||
}
|
||||
|
||||
private void registerWebSocketMessageBrokerStats(RuntimeBeanReference subProtocolHandlerDef,
|
||||
RootBeanDefinition brokerDef, RuntimeBeanReference clientInChannel,
|
||||
RuntimeBeanReference clientOutChannel, ParserContext parserCxt, Object source) {
|
||||
private void registerWebSocketMessageBrokerStats(RuntimeBeanReference subProtoHandler,
|
||||
RootBeanDefinition broker, RuntimeBeanReference inChannel, RuntimeBeanReference outChannel,
|
||||
ParserContext context, Object source) {
|
||||
|
||||
RootBeanDefinition statsDef = new RootBeanDefinition(WebSocketMessageBrokerStats.class);
|
||||
statsDef.getPropertyValues().add("subProtocolWebSocketHandler", subProtocolHandlerDef);
|
||||
RootBeanDefinition beanDef = new RootBeanDefinition(WebSocketMessageBrokerStats.class);
|
||||
beanDef.getPropertyValues().add("subProtocolWebSocketHandler", subProtoHandler);
|
||||
|
||||
if (StompBrokerRelayMessageHandler.class.equals(brokerDef.getBeanClass())) {
|
||||
statsDef.getPropertyValues().add("stompBrokerRelay", brokerDef);
|
||||
if (StompBrokerRelayMessageHandler.class.equals(broker.getBeanClass())) {
|
||||
beanDef.getPropertyValues().add("stompBrokerRelay", broker);
|
||||
}
|
||||
|
||||
String beanName = clientInChannel.getBeanName() + "Executor";
|
||||
if (parserCxt.getRegistry().containsBeanDefinition(beanName)) {
|
||||
BeanDefinition beanDef = parserCxt.getRegistry().getBeanDefinition(beanName);
|
||||
statsDef.getPropertyValues().add("inboundChannelExecutor", beanDef);
|
||||
String name = inChannel.getBeanName() + "Executor";
|
||||
if (context.getRegistry().containsBeanDefinition(name)) {
|
||||
beanDef.getPropertyValues().add("inboundChannelExecutor", context.getRegistry().getBeanDefinition(name));
|
||||
}
|
||||
|
||||
beanName = clientOutChannel.getBeanName() + "Executor";
|
||||
if (parserCxt.getRegistry().containsBeanDefinition(beanName)) {
|
||||
BeanDefinition beanDef = parserCxt.getRegistry().getBeanDefinition(beanName);
|
||||
statsDef.getPropertyValues().add("outboundChannelExecutor", beanDef);
|
||||
name = outChannel.getBeanName() + "Executor";
|
||||
if (context.getRegistry().containsBeanDefinition(name)) {
|
||||
beanDef.getPropertyValues().add("outboundChannelExecutor", context.getRegistry().getBeanDefinition(name));
|
||||
}
|
||||
|
||||
beanName = SOCKJS_SCHEDULER_BEAN_NAME;
|
||||
if (parserCxt.getRegistry().containsBeanDefinition(beanName)) {
|
||||
BeanDefinition beanDef = parserCxt.getRegistry().getBeanDefinition(beanName);
|
||||
statsDef.getPropertyValues().add("sockJsTaskScheduler", beanDef);
|
||||
name = SOCKJS_SCHEDULER_BEAN_NAME;
|
||||
if (context.getRegistry().containsBeanDefinition(name)) {
|
||||
beanDef.getPropertyValues().add("sockJsTaskScheduler", context.getRegistry().getBeanDefinition(name));
|
||||
}
|
||||
registerBeanDefByName("webSocketMessageBrokerStats", statsDef, parserCxt, source);
|
||||
registerBeanDefByName("webSocketMessageBrokerStats", beanDef, context, source);
|
||||
}
|
||||
|
||||
|
||||
private static String registerBeanDef(RootBeanDefinition beanDef, ParserContext parserCxt, Object source) {
|
||||
String beanName = parserCxt.getReaderContext().generateBeanName(beanDef);
|
||||
registerBeanDefByName(beanName, beanDef, parserCxt, source);
|
||||
return beanName;
|
||||
private static String registerBeanDef(RootBeanDefinition beanDef, ParserContext context, Object source) {
|
||||
String name = context.getReaderContext().generateBeanName(beanDef);
|
||||
registerBeanDefByName(name, beanDef, context, source);
|
||||
return name;
|
||||
}
|
||||
|
||||
private static void registerBeanDefByName(String beanName, RootBeanDefinition beanDef,
|
||||
ParserContext parserCxt, Object source) {
|
||||
|
||||
private static void registerBeanDefByName(String name, RootBeanDefinition beanDef, ParserContext context, Object source) {
|
||||
beanDef.setSource(source);
|
||||
beanDef.setRole(BeanDefinition.ROLE_INFRASTRUCTURE);
|
||||
parserCxt.getRegistry().registerBeanDefinition(beanName, beanDef);
|
||||
parserCxt.registerComponent(new BeanComponentDefinition(beanDef, beanName));
|
||||
context.getRegistry().registerBeanDefinition(name, beanDef);
|
||||
context.registerComponent(new BeanComponentDefinition(beanDef, name));
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -31,8 +31,6 @@ import org.springframework.web.socket.sockjs.transport.TransportHandlingSockJsSe
|
||||
import org.springframework.web.socket.sockjs.transport.handler.DefaultSockJsService;
|
||||
import org.springframework.web.socket.sockjs.transport.handler.WebSocketTransportHandler;
|
||||
|
||||
import java.util.concurrent.ScheduledThreadPoolExecutor;
|
||||
|
||||
/**
|
||||
* Provides utility methods for parsing common WebSocket XML namespace elements.
|
||||
*
|
||||
@@ -43,7 +41,7 @@ import java.util.concurrent.ScheduledThreadPoolExecutor;
|
||||
class WebSocketNamespaceUtils {
|
||||
|
||||
|
||||
public static RuntimeBeanReference registerHandshakeHandler(Element element, ParserContext parserContext, Object source) {
|
||||
public static RuntimeBeanReference registerHandshakeHandler(Element element, ParserContext context, Object source) {
|
||||
RuntimeBeanReference handlerRef;
|
||||
Element handlerElem = DomUtils.getChildElementByTagName(element, "handshake-handler");
|
||||
if (handlerElem != null) {
|
||||
@@ -53,19 +51,19 @@ class WebSocketNamespaceUtils {
|
||||
RootBeanDefinition defaultHandlerDef = new RootBeanDefinition(DefaultHandshakeHandler.class);
|
||||
defaultHandlerDef.setSource(source);
|
||||
defaultHandlerDef.setRole(BeanDefinition.ROLE_INFRASTRUCTURE);
|
||||
String handlerName = parserContext.getReaderContext().registerWithGeneratedName(defaultHandlerDef);
|
||||
String handlerName = context.getReaderContext().registerWithGeneratedName(defaultHandlerDef);
|
||||
handlerRef = new RuntimeBeanReference(handlerName);
|
||||
}
|
||||
return handlerRef;
|
||||
}
|
||||
|
||||
public static RuntimeBeanReference registerSockJsService(Element element, String sockJsSchedulerName,
|
||||
ParserContext parserContext, Object source) {
|
||||
ParserContext context, Object source) {
|
||||
|
||||
Element sockJsElement = DomUtils.getChildElementByTagName(element, "sockjs");
|
||||
|
||||
if (sockJsElement != null) {
|
||||
Element handshakeHandlerElement = DomUtils.getChildElementByTagName(element, "handshake-handler");
|
||||
Element handshakeHandler = DomUtils.getChildElementByTagName(element, "handshake-handler");
|
||||
|
||||
RootBeanDefinition sockJsServiceDef = new RootBeanDefinition(DefaultSockJsService.class);
|
||||
sockJsServiceDef.setSource(source);
|
||||
@@ -76,28 +74,29 @@ class WebSocketNamespaceUtils {
|
||||
scheduler = new RuntimeBeanReference(customTaskSchedulerName);
|
||||
}
|
||||
else {
|
||||
scheduler = registerSockJsTaskScheduler(sockJsSchedulerName, parserContext, source);
|
||||
scheduler = registerSockJsScheduler(sockJsSchedulerName, context, source);
|
||||
}
|
||||
sockJsServiceDef.getConstructorArgumentValues().addIndexedArgumentValue(0, scheduler);
|
||||
|
||||
Element transportHandlersElement = DomUtils.getChildElementByTagName(sockJsElement, "transport-handlers");
|
||||
if (transportHandlersElement != null) {
|
||||
String registerDefaultsAttribute = transportHandlersElement.getAttribute("register-defaults");
|
||||
if (registerDefaultsAttribute.equals("false")) {
|
||||
String registerDefaults = transportHandlersElement.getAttribute("register-defaults");
|
||||
if (registerDefaults.equals("false")) {
|
||||
sockJsServiceDef.setBeanClass(TransportHandlingSockJsService.class);
|
||||
}
|
||||
ManagedList<?> transportHandlersList = parseBeanSubElements(transportHandlersElement, parserContext);
|
||||
sockJsServiceDef.getConstructorArgumentValues().addIndexedArgumentValue(1, transportHandlersList);
|
||||
} else if(handshakeHandlerElement != null){
|
||||
RuntimeBeanReference handshakeHandlerRef = new RuntimeBeanReference(handshakeHandlerElement.getAttribute("ref"));
|
||||
ManagedList<?> transportHandlers = parseBeanSubElements(transportHandlersElement, context);
|
||||
sockJsServiceDef.getConstructorArgumentValues().addIndexedArgumentValue(1, transportHandlers);
|
||||
}
|
||||
else if (handshakeHandler != null) {
|
||||
RuntimeBeanReference handshakeHandlerRef = new RuntimeBeanReference(handshakeHandler.getAttribute("ref"));
|
||||
|
||||
RootBeanDefinition wsTransportHandler = new RootBeanDefinition(WebSocketTransportHandler.class);
|
||||
wsTransportHandler.setSource(source);
|
||||
wsTransportHandler.getConstructorArgumentValues().addIndexedArgumentValue(0, handshakeHandlerRef);
|
||||
sockJsServiceDef.getConstructorArgumentValues().addIndexedArgumentValue(1, wsTransportHandler);
|
||||
RootBeanDefinition transportHandler = new RootBeanDefinition(WebSocketTransportHandler.class);
|
||||
transportHandler.setSource(source);
|
||||
transportHandler.getConstructorArgumentValues().addIndexedArgumentValue(0, handshakeHandlerRef);
|
||||
sockJsServiceDef.getConstructorArgumentValues().addIndexedArgumentValue(1, transportHandler);
|
||||
}
|
||||
|
||||
String attrValue = sockJsElement.getAttribute("name");
|
||||
String attrValue = sockJsElement.getAttribute("name");
|
||||
if (!attrValue.isEmpty()) {
|
||||
sockJsServiceDef.getPropertyValues().add("name", attrValue);
|
||||
}
|
||||
@@ -125,43 +124,35 @@ class WebSocketNamespaceUtils {
|
||||
if (!attrValue.isEmpty()) {
|
||||
sockJsServiceDef.getPropertyValues().add("heartbeatTime", Long.valueOf(attrValue));
|
||||
}
|
||||
|
||||
sockJsServiceDef.setRole(BeanDefinition.ROLE_INFRASTRUCTURE);
|
||||
String sockJsServiceName = parserContext.getReaderContext().registerWithGeneratedName(sockJsServiceDef);
|
||||
String sockJsServiceName = context.getReaderContext().registerWithGeneratedName(sockJsServiceDef);
|
||||
return new RuntimeBeanReference(sockJsServiceName);
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
private static RuntimeBeanReference registerSockJsTaskScheduler(String schedulerName,
|
||||
ParserContext parserContext, Object source) {
|
||||
|
||||
if (!parserContext.getRegistry().containsBeanDefinition(schedulerName)) {
|
||||
private static RuntimeBeanReference registerSockJsScheduler(String schedulerName, ParserContext context, Object source) {
|
||||
if (!context.getRegistry().containsBeanDefinition(schedulerName)) {
|
||||
RootBeanDefinition taskSchedulerDef = new RootBeanDefinition(ThreadPoolTaskScheduler.class);
|
||||
taskSchedulerDef.setSource(source);
|
||||
taskSchedulerDef.setRole(BeanDefinition.ROLE_INFRASTRUCTURE);
|
||||
taskSchedulerDef.getPropertyValues().add("poolSize", Runtime.getRuntime().availableProcessors());
|
||||
taskSchedulerDef.getPropertyValues().add("threadNamePrefix", schedulerName + "-");
|
||||
taskSchedulerDef.getPropertyValues().add("removeOnCancelPolicy", true);
|
||||
parserContext.getRegistry().registerBeanDefinition(schedulerName, taskSchedulerDef);
|
||||
parserContext.registerComponent(new BeanComponentDefinition(taskSchedulerDef, schedulerName));
|
||||
context.getRegistry().registerBeanDefinition(schedulerName, taskSchedulerDef);
|
||||
context.registerComponent(new BeanComponentDefinition(taskSchedulerDef, schedulerName));
|
||||
}
|
||||
|
||||
return new RuntimeBeanReference(schedulerName);
|
||||
}
|
||||
|
||||
public static ManagedList<? super Object> parseBeanSubElements(Element parentElement, ParserContext parserContext) {
|
||||
|
||||
public static ManagedList<? super Object> parseBeanSubElements(Element parentElement, ParserContext context) {
|
||||
ManagedList<? super Object> beans = new ManagedList<Object>();
|
||||
if (parentElement != null) {
|
||||
beans.setSource(parserContext.extractSource(parentElement));
|
||||
for (Element beanElement : DomUtils.getChildElementsByTagName(parentElement, new String[] { "bean", "ref" })) {
|
||||
Object object = parserContext.getDelegate().parsePropertySubElement(beanElement, null);
|
||||
beans.add(object);
|
||||
beans.setSource(context.extractSource(parentElement));
|
||||
for (Element beanElement : DomUtils.getChildElementsByTagName(parentElement, new String[] {"bean", "ref"})) {
|
||||
beans.add(context.getDelegate().parsePropertySubElement(beanElement, null));
|
||||
}
|
||||
}
|
||||
|
||||
return beans;
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user