Skip to content

Commit f45ef75

Browse files
committed
Add WebSocketHandlerDecorator
1 parent ba87743 commit f45ef75

13 files changed

+316
-154
lines changed

spring-websocket/src/main/java/org/springframework/sockjs/AbstractSockJsSession.java

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,6 @@
2626
import org.springframework.websocket.TextMessage;
2727
import org.springframework.websocket.WebSocketHandler;
2828
import org.springframework.websocket.WebSocketSession;
29-
import org.springframework.websocket.adapter.WebSocketHandlerInvoker;
3029

3130

3231
/**
@@ -42,7 +41,7 @@ public abstract class AbstractSockJsSession implements WebSocketSession {
4241

4342
private final String sessionId;
4443

45-
private WebSocketHandlerInvoker handler;
44+
private WebSocketHandler handler;
4645

4746
private State state = State.NEW;
4847

@@ -59,7 +58,7 @@ public AbstractSockJsSession(String sessionId, WebSocketHandler webSocketHandler
5958
Assert.notNull(sessionId, "sessionId is required");
6059
Assert.notNull(webSocketHandler, "webSocketHandler is required");
6160
this.sessionId = sessionId;
62-
this.handler = new WebSocketHandlerInvoker(webSocketHandler).setLogger(logger);
61+
this.handler = webSocketHandler;
6362
}
6463

6564
public String getId() {
@@ -129,7 +128,13 @@ public void delegateConnectionEstablished() {
129128
*/
130129
protected void tryCloseWithSockJsTransportError(Throwable ex, CloseStatus closeStatus) {
131130
delegateError(ex);
132-
this.handler.tryCloseWithError(this, ex, closeStatus);
131+
try {
132+
logger.error("Closing due to transport error for " + this, ex);
133+
close(closeStatus);
134+
}
135+
catch (Throwable t) {
136+
// ignore
137+
}
133138
}
134139

135140
public void delegateMessages(String[] messages) {

spring-websocket/src/main/java/org/springframework/sockjs/server/support/SockJsHttpRequestHandler.java

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,8 @@
3232
import org.springframework.web.util.NestedServletException;
3333
import org.springframework.web.util.UrlPathHelper;
3434
import org.springframework.websocket.WebSocketHandler;
35+
import org.springframework.websocket.support.ExceptionWebSocketHandlerDecorator;
36+
import org.springframework.websocket.support.LoggingWebSocketHandlerDecorator;
3537

3638
/**
3739
* @author Rossen Stoyanchev
@@ -63,7 +65,18 @@ public SockJsHttpRequestHandler(String prefix, SockJsService sockJsService, WebS
6365

6466
this.prefix = prefix;
6567
this.sockJsService = sockJsService;
66-
this.webSocketHandler = webSocketHandler;
68+
this.webSocketHandler = decorateWebSocketHandler(webSocketHandler);
69+
}
70+
71+
/**
72+
* Decorate the WebSocketHandler provided to the class constructor.
73+
* <p>
74+
* By default {@link ExceptionWebSocketHandlerDecorator} and
75+
* {@link LoggingWebSocketHandlerDecorator} are applied are added.
76+
*/
77+
protected WebSocketHandler decorateWebSocketHandler(WebSocketHandler handler) {
78+
handler = new ExceptionWebSocketHandlerDecorator(handler);
79+
return new LoggingWebSocketHandlerDecorator(handler);
6780
}
6881

6982
public String getPrefix() {

spring-websocket/src/main/java/org/springframework/websocket/WebSocketHandler.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,4 +48,9 @@ public interface WebSocketHandler {
4848
*/
4949
void afterConnectionClosed(WebSocketSession session, CloseStatus closeStatus);
5050

51+
/**
52+
* Whether this WebSocketHandler wishes to receive messages broken up in parts.
53+
*/
54+
boolean isStreaming();
55+
5156
}

spring-websocket/src/main/java/org/springframework/websocket/adapter/JettyWebSocketListenerAdapter.java

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -16,8 +16,6 @@
1616

1717
package org.springframework.websocket.adapter;
1818

19-
import org.apache.commons.logging.Log;
20-
import org.apache.commons.logging.LogFactory;
2119
import org.eclipse.jetty.websocket.api.Session;
2220
import org.eclipse.jetty.websocket.api.WebSocketListener;
2321
import org.springframework.util.Assert;
@@ -35,16 +33,14 @@
3533
*/
3634
public class JettyWebSocketListenerAdapter implements WebSocketListener {
3735

38-
private static Log logger = LogFactory.getLog(JettyWebSocketListenerAdapter.class);
39-
4036
private final WebSocketHandler webSocketHandler;
4137

4238
private WebSocketSession wsSession;
4339

4440

4541
public JettyWebSocketListenerAdapter(WebSocketHandler webSocketHandler) {
4642
Assert.notNull(webSocketHandler, "webSocketHandler is required");
47-
this.webSocketHandler = new WebSocketHandlerInvoker(webSocketHandler).setLogger(logger);
43+
this.webSocketHandler = webSocketHandler;
4844
}
4945

5046

@@ -76,4 +72,5 @@ public void onWebSocketBinary(byte[] payload, int offset, int len) {
7672
public void onWebSocketError(Throwable cause) {
7773
this.webSocketHandler.handleTransportError(this.wsSession, cause);
7874
}
75+
7976
}

spring-websocket/src/main/java/org/springframework/websocket/adapter/StandardEndpointAdapter.java

Lines changed: 6 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -23,12 +23,9 @@
2323
import javax.websocket.EndpointConfig;
2424
import javax.websocket.MessageHandler;
2525

26-
import org.apache.commons.logging.Log;
27-
import org.apache.commons.logging.LogFactory;
2826
import org.springframework.util.Assert;
2927
import org.springframework.websocket.BinaryMessage;
3028
import org.springframework.websocket.CloseStatus;
31-
import org.springframework.websocket.PartialMessageHandler;
3229
import org.springframework.websocket.TextMessage;
3330
import org.springframework.websocket.WebSocketHandler;
3431
import org.springframework.websocket.WebSocketSession;
@@ -42,36 +39,31 @@
4239
*/
4340
public class StandardEndpointAdapter extends Endpoint {
4441

45-
private static Log logger = LogFactory.getLog(StandardEndpointAdapter.class);
46-
47-
private final WebSocketHandlerInvoker handler;
48-
49-
private final Class<?> handlerClass;
42+
private final WebSocketHandler handler;
5043

5144
private WebSocketSession wsSession;
5245

5346

54-
5547
public StandardEndpointAdapter(WebSocketHandler webSocketHandler) {
5648
Assert.notNull(webSocketHandler, "webSocketHandler is required");
57-
this.handler = new WebSocketHandlerInvoker(webSocketHandler).setLogger(logger);
58-
this.handlerClass= webSocketHandler.getClass();
49+
this.handler = webSocketHandler;
5950
}
6051

6152

6253
@Override
6354
public void onOpen(final javax.websocket.Session session, EndpointConfig config) {
6455

56+
this.wsSession = new StandardWebSocketSessionAdapter(session);
57+
this.handler.afterConnectionEstablished(this.wsSession);
58+
6559
session.addMessageHandler(new MessageHandler.Whole<String>() {
6660
@Override
6761
public void onMessage(String message) {
6862
handleTextMessage(session, message);
6963
}
7064
});
7165

72-
// TODO: per-connection proxy
73-
74-
if (!PartialMessageHandler.class.isAssignableFrom(this.handlerClass)) {
66+
if (!this.handler.isStreaming()) {
7567
session.addMessageHandler(new MessageHandler.Whole<ByteBuffer>() {
7668
@Override
7769
public void onMessage(ByteBuffer message) {
@@ -88,8 +80,6 @@ public void onMessage(ByteBuffer messagePart, boolean isLast) {
8880
});
8981
}
9082

91-
this.wsSession = new StandardWebSocketSessionAdapter(session);
92-
this.handler.afterConnectionEstablished(this.wsSession);
9383
}
9484

9585
private void handleTextMessage(javax.websocket.Session session, String payload) {

spring-websocket/src/main/java/org/springframework/websocket/adapter/WebSocketHandlerAdapter.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -68,4 +68,9 @@ public void handleTransportError(WebSocketSession session, Throwable exception)
6868
public void afterConnectionClosed(WebSocketSession session, CloseStatus status) {
6969
}
7070

71+
@Override
72+
public boolean isStreaming() {
73+
return false;
74+
}
75+
7176
}

spring-websocket/src/main/java/org/springframework/websocket/adapter/WebSocketHandlerInvoker.java

Lines changed: 0 additions & 126 deletions
This file was deleted.

spring-websocket/src/main/java/org/springframework/websocket/client/WebSocketConnectionManager.java

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,8 @@
2323
import org.springframework.util.CollectionUtils;
2424
import org.springframework.websocket.WebSocketHandler;
2525
import org.springframework.websocket.WebSocketSession;
26+
import org.springframework.websocket.support.ExceptionWebSocketHandlerDecorator;
27+
import org.springframework.websocket.support.LoggingWebSocketHandlerDecorator;
2628

2729
/**
2830
* @author Rossen Stoyanchev
@@ -44,7 +46,18 @@ public WebSocketConnectionManager(WebSocketClient webSocketClient,
4446

4547
super(uriTemplate, uriVariables);
4648
this.client = webSocketClient;
47-
this.webSocketHandler = webSocketHandler;
49+
this.webSocketHandler = decorateWebSocketHandler(webSocketHandler);
50+
}
51+
52+
/**
53+
* Decorate the WebSocketHandler provided to the class constructor.
54+
* <p>
55+
* By default {@link ExceptionWebSocketHandlerDecorator} and
56+
* {@link LoggingWebSocketHandlerDecorator} are applied are added.
57+
*/
58+
protected WebSocketHandler decorateWebSocketHandler(WebSocketHandler handler) {
59+
handler = new ExceptionWebSocketHandlerDecorator(handler);
60+
return new LoggingWebSocketHandlerDecorator(handler);
4861
}
4962

5063
public void setSubProtocols(List<String> subProtocols) {

spring-websocket/src/main/java/org/springframework/websocket/server/support/WebSocketHttpRequestHandler.java

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,8 @@
3232
import org.springframework.websocket.WebSocketHandler;
3333
import org.springframework.websocket.server.DefaultHandshakeHandler;
3434
import org.springframework.websocket.server.HandshakeHandler;
35+
import org.springframework.websocket.support.ExceptionWebSocketHandlerDecorator;
36+
import org.springframework.websocket.support.LoggingWebSocketHandlerDecorator;
3537

3638
/**
3739
* An {@link HttpRequestHandler} that wraps the invocation of a {@link HandshakeHandler}.
@@ -53,10 +55,21 @@ public WebSocketHttpRequestHandler(WebSocketHandler webSocketHandler) {
5355
public WebSocketHttpRequestHandler( WebSocketHandler webSocketHandler, HandshakeHandler handshakeHandler) {
5456
Assert.notNull(webSocketHandler, "webSocketHandler is required");
5557
Assert.notNull(handshakeHandler, "handshakeHandler is required");
56-
this.webSocketHandler = webSocketHandler;
58+
this.webSocketHandler = decorateWebSocketHandler(webSocketHandler);
5759
this.handshakeHandler = new DefaultHandshakeHandler();
5860
}
5961

62+
/**
63+
* Decorate the WebSocketHandler provided to the class constructor.
64+
* <p>
65+
* By default {@link ExceptionWebSocketHandlerDecorator} and
66+
* {@link LoggingWebSocketHandlerDecorator} are applied are added.
67+
*/
68+
protected WebSocketHandler decorateWebSocketHandler(WebSocketHandler handler) {
69+
handler = new ExceptionWebSocketHandlerDecorator(handler);
70+
return new LoggingWebSocketHandlerDecorator(handler);
71+
}
72+
6073
@Override
6174
public void handleRequest(HttpServletRequest request, HttpServletResponse response)
6275
throws ServletException, IOException {

0 commit comments

Comments
 (0)