Skip to content

Commit be4d73e

Browse files
committed
Merge HandshakeInterceptor-related config updates
2 parents 2665d56 + 4dd5c27 commit be4d73e

25 files changed

+1459
-1495
lines changed

spring-websocket/src/main/java/org/springframework/web/socket/config/HandlersBeanDefinitionParser.java

Lines changed: 56 additions & 79 deletions
Original file line numberDiff line numberDiff line change
@@ -38,13 +38,13 @@
3838
import 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
*/
5050
class 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

Comments
 (0)