|
|
|
|
@ -50,7 +50,6 @@ import org.springframework.messaging.simp.user.UserDestinationMessageHandler;
@@ -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;
@@ -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 {
@@ -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); |
|
|
|
|
|
|
|
|
|
RootBeanDefinition beanDef = new RootBeanDefinition(DefaultUserSessionRegistry.class); |
|
|
|
|
beanName = registerBeanDef(beanDef, parserCxt, source); |
|
|
|
|
RuntimeBeanReference userSessionRegistry = new RuntimeBeanReference(beanName); |
|
|
|
|
|
|
|
|
|
RuntimeBeanReference subProtocolHandlerDef = registerSubProtocolWebSocketHandler( |
|
|
|
|
element, clientInChannel, clientOutChannel, userSessionRegistry, parserCxt, source); |
|
|
|
|
RuntimeBeanReference outChannel = getMessageChannel("clientOutboundChannel", channelElem, context, source); |
|
|
|
|
|
|
|
|
|
for(Element stompEndpointElem : DomUtils.getChildElementsByTagName(element, "stomp-endpoint")) { |
|
|
|
|
RootBeanDefinition registryBeanDef = new RootBeanDefinition(DefaultUserSessionRegistry.class); |
|
|
|
|
String registryBeanName = registerBeanDef(registryBeanDef, context, source); |
|
|
|
|
RuntimeBeanReference sessionRegistry = new RuntimeBeanReference(registryBeanName); |
|
|
|
|
|
|
|
|
|
RuntimeBeanReference httpRequestHandler = registerHttpRequestHandler( |
|
|
|
|
stompEndpointElem, subProtocolHandlerDef, parserCxt, source); |
|
|
|
|
RuntimeBeanReference subProtoHandler = registerSubProtoHandler(element, inChannel, outChannel, |
|
|
|
|
sessionRegistry, context, 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 messageConverter = registerBrokerMessageConverter(element, parserCxt, source); |
|
|
|
|
|
|
|
|
|
RuntimeBeanReference messagingTemplate = registerBrokerMessagingTemplate(element, brokerChannel, |
|
|
|
|
messageConverter, parserCxt, source); |
|
|
|
|
RuntimeBeanReference brokerChannel = getMessageChannel("brokerChannel", channelElem, context, source); |
|
|
|
|
RootBeanDefinition broker = registerMessageBroker(element, inChannel, outChannel, brokerChannel, context, source); |
|
|
|
|
|
|
|
|
|
registerAnnotationMethodMessageHandler(element, clientInChannel, clientOutChannel, |
|
|
|
|
messageConverter, messagingTemplate, 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 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); |
|
|
|
|
|
|
|
|
|
registerWebSocketMessageBrokerStats(subProtocolHandlerDef, brokerDef, clientInChannel, |
|
|
|
|
clientOutChannel, parserCxt, source); |
|
|
|
|
RootBeanDefinition scopeConfigurer = new RootBeanDefinition(CustomScopeConfigurer.class); |
|
|
|
|
scopeConfigurer.getPropertyValues().add("scopes", scopeMap); |
|
|
|
|
registerBeanDefByName("webSocketScopeConfigurer", scopeConfigurer, context, 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 {
@@ -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 {
@@ -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)); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
} |
|
|
|
|
|