3838import org .springframework .web .socket .sockjs .support .SockJsHttpRequestHandler ;
3939
4040/**
41- * A {@link BeanDefinitionParser} that provides the configuration for the
42- * {@code <websocket:handlers/>} namespace element. It registers a Spring MVC
43- * {@link org.springframework.web.servlet.handler.SimpleUrlHandlerMapping}
44- * to map HTTP WebSocket handshake requests to
45- * {@link org.springframework.web.socket.WebSocketHandler}s.
41+ * Parses the configuration for the {@code <websocket:handlers/>} namespace
42+ * element. Registers a Spring MVC {@code SimpleUrlHandlerMapping} to map HTTP
43+ * WebSocket handshake (or SockJS) requests to
44+ * {@link org.springframework.web.socket.WebSocketHandler WebSocketHandler}s.
4645 *
4746 * @author Brian Clozel
47+ * @author Rossen Stoyanchev
4848 * @since 4.0
4949 */
5050class HandlersBeanDefinitionParser implements BeanDefinitionParser {
@@ -55,11 +55,10 @@ class HandlersBeanDefinitionParser implements BeanDefinitionParser {
5555
5656
5757 @ Override
58- public BeanDefinition parse (Element element , ParserContext parserCxt ) {
59-
60- Object source = parserCxt .extractSource (element );
58+ public BeanDefinition parse (Element element , ParserContext context ) {
59+ Object source = context .extractSource (element );
6160 CompositeComponentDefinition compDefinition = new CompositeComponentDefinition (element .getTagName (), source );
62- parserCxt .pushContainingComponent (compDefinition );
61+ context .pushContainingComponent (compDefinition );
6362
6463 String orderAttribute = element .getAttribute ("order" );
6564 int order = orderAttribute .isEmpty () ? DEFAULT_MAPPING_ORDER : Integer .valueOf (orderAttribute );
@@ -68,128 +67,106 @@ public BeanDefinition parse(Element element, ParserContext parserCxt) {
6867 handlerMappingDef .setSource (source );
6968 handlerMappingDef .setRole (BeanDefinition .ROLE_INFRASTRUCTURE );
7069 handlerMappingDef .getPropertyValues ().add ("order" , order );
71- String handlerMappingName = parserCxt .getReaderContext ().registerWithGeneratedName (handlerMappingDef );
70+ String handlerMappingName = context .getReaderContext ().registerWithGeneratedName (handlerMappingDef );
7271
73- RuntimeBeanReference handshakeHandler = WebSocketNamespaceUtils .registerHandshakeHandler (element , parserCxt , source );
74- Element interceptorsElement = DomUtils .getChildElementByTagName (element , "handshake-interceptors" );
75- ManagedList <?> interceptors = WebSocketNamespaceUtils .parseBeanSubElements (interceptorsElement , parserCxt );
76- RuntimeBeanReference sockJsServiceRef =
77- WebSocketNamespaceUtils .registerSockJsService (element , SOCK_JS_SCHEDULER_NAME , parserCxt , source );
72+ RuntimeBeanReference sockJsService = WebSocketNamespaceUtils .registerSockJsService (
73+ element , SOCK_JS_SCHEDULER_NAME , context , source );
7874
79- HandlerMappingStrategy strategy = createHandlerMappingStrategy (sockJsServiceRef , handshakeHandler , interceptors );
75+ HandlerMappingStrategy strategy ;
76+ if (sockJsService != null ) {
77+ strategy = new SockJsHandlerMappingStrategy (sockJsService );
78+ }
79+ else {
80+ RuntimeBeanReference handshakeHandler = WebSocketNamespaceUtils .registerHandshakeHandler (element , context , source );
81+ Element interceptorsElement = DomUtils .getChildElementByTagName (element , "handshake-interceptors" );
82+ ManagedList <?> interceptors = WebSocketNamespaceUtils .parseBeanSubElements (interceptorsElement , context );
83+ strategy = new WebSocketHandlerMappingStrategy (handshakeHandler , interceptors );
84+ }
8085
81- List <Element > mappingElements = DomUtils .getChildElementsByTagName (element , "mapping" );
8286 ManagedMap <String , Object > urlMap = new ManagedMap <String , Object >();
8387 urlMap .setSource (source );
84-
85- for (Element mappingElement : mappingElements ) {
86- urlMap .putAll (strategy .createMappings (mappingElement , parserCxt ));
88+ for (Element mappingElement : DomUtils .getChildElementsByTagName (element , "mapping" )) {
89+ strategy .addMapping (mappingElement , urlMap , context );
8790 }
8891 handlerMappingDef .getPropertyValues ().add ("urlMap" , urlMap );
8992
90- parserCxt .registerComponent (new BeanComponentDefinition (handlerMappingDef , handlerMappingName ));
91- parserCxt .popAndRegisterContainingComponent ();
93+ context .registerComponent (new BeanComponentDefinition (handlerMappingDef , handlerMappingName ));
94+ context .popAndRegisterContainingComponent ();
9295 return null ;
9396 }
9497
9598
9699 private interface HandlerMappingStrategy {
97100
98- public ManagedMap <String , Object > createMappings (Element mappingElement , ParserContext parserContext );
99- }
100-
101- private HandlerMappingStrategy createHandlerMappingStrategy (
102- RuntimeBeanReference sockJsServiceRef , RuntimeBeanReference handshakeHandlerRef ,
103- ManagedList <? extends Object > interceptorsList ) {
101+ void addMapping (Element mappingElement , ManagedMap <String , Object > map , ParserContext context );
104102
105- if (sockJsServiceRef != null ) {
106- SockJSHandlerMappingStrategy strategy = new SockJSHandlerMappingStrategy ();
107- strategy .setSockJsServiceRef (sockJsServiceRef );
108- return strategy ;
109- }
110- else {
111- WebSocketHandlerMappingStrategy strategy = new WebSocketHandlerMappingStrategy ();
112- strategy .setHandshakeHandlerReference (handshakeHandlerRef );
113- strategy .setInterceptorsList (interceptorsList );
114- return strategy ;
115- }
116103 }
117104
118- private class WebSocketHandlerMappingStrategy implements HandlerMappingStrategy {
105+ private static class WebSocketHandlerMappingStrategy implements HandlerMappingStrategy {
119106
120- private RuntimeBeanReference handshakeHandlerReference ;
107+ private final RuntimeBeanReference handshakeHandlerReference ;
121108
122- private ManagedList <?> interceptorsList ;
109+ private final ManagedList <?> interceptorsList ;
123110
124- public void setHandshakeHandlerReference (RuntimeBeanReference handshakeHandlerReference ) {
125- this .handshakeHandlerReference = handshakeHandlerReference ;
126- }
127111
128- public void setInterceptorsList (ManagedList <?> interceptorsList ) { this .interceptorsList = interceptorsList ; }
112+ private WebSocketHandlerMappingStrategy (RuntimeBeanReference handshakeHandler , ManagedList <?> interceptors ) {
113+ this .handshakeHandlerReference = handshakeHandler ;
114+ this .interceptorsList = interceptors ;
115+ }
129116
130117 @ Override
131- public ManagedMap <String , Object > createMappings (Element mappingElement , ParserContext parserContext ) {
132- ManagedMap <String , Object > urlMap = new ManagedMap <String , Object >();
133- Object source = parserContext .extractSource (mappingElement );
134-
135- String path = mappingElement .getAttribute ("path" );
136- List <String > mappings = Arrays .asList (StringUtils .tokenizeToStringArray (path , "," ));
137- RuntimeBeanReference webSocketHandlerReference = new RuntimeBeanReference (mappingElement .getAttribute ("handler" ));
118+ public void addMapping (Element element , ManagedMap <String , Object > urlMap , ParserContext context ) {
119+ String pathAttribute = element .getAttribute ("path" );
120+ List <String > mappings = Arrays .asList (StringUtils .tokenizeToStringArray (pathAttribute , "," ));
121+ RuntimeBeanReference handlerReference = new RuntimeBeanReference (element .getAttribute ("handler" ));
138122
139123 ConstructorArgumentValues cavs = new ConstructorArgumentValues ();
140- cavs .addIndexedArgumentValue (0 , webSocketHandlerReference );
124+ cavs .addIndexedArgumentValue (0 , handlerReference );
141125 if (this .handshakeHandlerReference != null ) {
142126 cavs .addIndexedArgumentValue (1 , this .handshakeHandlerReference );
143127 }
144128 RootBeanDefinition requestHandlerDef = new RootBeanDefinition (WebSocketHttpRequestHandler .class , cavs , null );
145- requestHandlerDef .setSource (source );
129+ requestHandlerDef .setSource (context . extractSource ( element ) );
146130 requestHandlerDef .setRole (BeanDefinition .ROLE_INFRASTRUCTURE );
147131 requestHandlerDef .getPropertyValues ().add ("handshakeInterceptors" , this .interceptorsList );
148- String requestHandlerName = parserContext .getReaderContext ().registerWithGeneratedName (requestHandlerDef );
132+ String requestHandlerName = context .getReaderContext ().registerWithGeneratedName (requestHandlerDef );
149133 RuntimeBeanReference requestHandlerRef = new RuntimeBeanReference (requestHandlerName );
150134
151- for (String mapping : mappings ) {
135+ for (String mapping : mappings ) {
152136 urlMap .put (mapping , requestHandlerRef );
153137 }
154-
155- return urlMap ;
156138 }
157139 }
158140
159- private class SockJSHandlerMappingStrategy implements HandlerMappingStrategy {
141+ private static class SockJsHandlerMappingStrategy implements HandlerMappingStrategy {
160142
161- private RuntimeBeanReference sockJsServiceRef ;
143+ private final RuntimeBeanReference sockJsService ;
162144
163- public void setSockJsServiceRef (RuntimeBeanReference sockJsServiceRef ) {
164- this .sockJsServiceRef = sockJsServiceRef ;
145+
146+ private SockJsHandlerMappingStrategy (RuntimeBeanReference sockJsService ) {
147+ this .sockJsService = sockJsService ;
165148 }
166149
167150 @ Override
168- public ManagedMap <String , Object > createMappings (Element mappingElement , ParserContext parserContext ) {
169-
170- ManagedMap <String , Object > urlMap = new ManagedMap <String , Object >();
171- Object source = parserContext .extractSource (mappingElement );
172-
173- String pathValue = mappingElement .getAttribute ("path" );
174- List <String > mappings = Arrays .asList (StringUtils .tokenizeToStringArray (pathValue , "," ));
175- RuntimeBeanReference webSocketHandlerReference = new RuntimeBeanReference (mappingElement .getAttribute ("handler" ));
151+ public void addMapping (Element element , ManagedMap <String , Object > urlMap , ParserContext context ) {
152+ String pathAttribute = element .getAttribute ("path" );
153+ List <String > mappings = Arrays .asList (StringUtils .tokenizeToStringArray (pathAttribute , "," ));
154+ RuntimeBeanReference handlerReference = new RuntimeBeanReference (element .getAttribute ("handler" ));
176155
177156 ConstructorArgumentValues cavs = new ConstructorArgumentValues ();
178- cavs .addIndexedArgumentValue (0 , this .sockJsServiceRef , "SockJsService" );
179- cavs .addIndexedArgumentValue (1 , webSocketHandlerReference , "WebSocketHandler" );
157+ cavs .addIndexedArgumentValue (0 , this .sockJsService , "SockJsService" );
158+ cavs .addIndexedArgumentValue (1 , handlerReference , "WebSocketHandler" );
180159
181160 RootBeanDefinition requestHandlerDef = new RootBeanDefinition (SockJsHttpRequestHandler .class , cavs , null );
182- requestHandlerDef .setSource (source );
161+ requestHandlerDef .setSource (context . extractSource ( element ) );
183162 requestHandlerDef .setRole (BeanDefinition .ROLE_INFRASTRUCTURE );
184- String requestHandlerName = parserContext .getReaderContext ().registerWithGeneratedName (requestHandlerDef );
163+ String requestHandlerName = context .getReaderContext ().registerWithGeneratedName (requestHandlerDef );
185164 RuntimeBeanReference requestHandlerRef = new RuntimeBeanReference (requestHandlerName );
186165
187- for (String path : mappings ) {
188- String pathPattern = path .endsWith ("/" ) ? path + "**" : path + "/**" ;
166+ for (String mapping : mappings ) {
167+ String pathPattern = ( mapping .endsWith ("/" ) ? mapping + "**" : mapping + "/**" ) ;
189168 urlMap .put (pathPattern , requestHandlerRef );
190169 }
191-
192- return urlMap ;
193170 }
194171 }
195172
0 commit comments