16
16
17
17
package org .springframework .websocket .endpoint ;
18
18
19
+ import java .util .concurrent .atomic .AtomicInteger ;
20
+
19
21
import javax .websocket .CloseReason ;
20
22
import javax .websocket .Endpoint ;
21
23
import javax .websocket .EndpointConfig ;
@@ -51,6 +53,8 @@ public class WebSocketHandlerEndpoint extends Endpoint {
51
53
52
54
private WebSocketSession webSocketSession ;
53
55
56
+ private final AtomicInteger sessionCount = new AtomicInteger (0 );
57
+
54
58
55
59
public WebSocketHandlerEndpoint (HandlerProvider <WebSocketHandler > handlerProvider ) {
56
60
Assert .notNull (handlerProvider , "handlerProvider is required" );
@@ -59,48 +63,54 @@ public WebSocketHandlerEndpoint(HandlerProvider<WebSocketHandler> handlerProvide
59
63
60
64
@ Override
61
65
public void onOpen (final javax .websocket .Session session , EndpointConfig config ) {
66
+
67
+ Assert .isTrue (this .sessionCount .compareAndSet (0 , 1 ), "Unexpected connection" );
68
+
62
69
if (logger .isDebugEnabled ()) {
63
- logger .debug ("Client connected, WebSocket session id=" + session .getId () + ", uri=" + session .getRequestURI ());
70
+ logger .debug ("Client connected, javax.websocket.Session id="
71
+ + session .getId () + ", uri=" + session .getRequestURI ());
64
72
}
65
- try {
66
- this .handler = handlerProvider .getHandler ();
67
- this .webSocketSession = new StandardWebSocketSession (session );
68
73
69
- if (this .handler instanceof TextMessageHandler ) {
70
- session .addMessageHandler (new MessageHandler .Whole <String >() {
74
+ this .webSocketSession = new StandardWebSocketSession (session );
75
+ this .handler = handlerProvider .getHandler ();
76
+
77
+ if (this .handler instanceof TextMessageHandler ) {
78
+ session .addMessageHandler (new MessageHandler .Whole <String >() {
79
+ @ Override
80
+ public void onMessage (String message ) {
81
+ handleTextMessage (session , message );
82
+ }
83
+ });
84
+ }
85
+ else if (this .handler instanceof BinaryMessageHandler ) {
86
+ if (this .handler instanceof PartialMessageHandler ) {
87
+ session .addMessageHandler (new MessageHandler .Partial <byte []>() {
71
88
@ Override
72
- public void onMessage (String message ) {
73
- handleTextMessage (session , message );
89
+ public void onMessage (byte [] messagePart , boolean isLast ) {
90
+ handleBinaryMessage (session , messagePart , isLast );
74
91
}
75
92
});
76
93
}
77
- else if (this .handler instanceof BinaryMessageHandler ) {
78
- if (this .handler instanceof PartialMessageHandler ) {
79
- session .addMessageHandler (new MessageHandler .Partial <byte []>() {
80
- @ Override
81
- public void onMessage (byte [] messagePart , boolean isLast ) {
82
- handleBinaryMessage (session , messagePart , isLast );
83
- }
84
- });
85
- }
86
- else {
87
- session .addMessageHandler (new MessageHandler .Whole <byte []>() {
88
- @ Override
89
- public void onMessage (byte [] message ) {
90
- handleBinaryMessage (session , message , true );
91
- }
92
- });
93
- }
94
- }
95
94
else {
95
+ session .addMessageHandler (new MessageHandler .Whole <byte []>() {
96
+ @ Override
97
+ public void onMessage (byte [] message ) {
98
+ handleBinaryMessage (session , message , true );
99
+ }
100
+ });
101
+ }
102
+ }
103
+ else {
104
+ if (logger .isWarnEnabled ()) {
96
105
logger .warn ("WebSocketHandler handles neither text nor binary messages: " + this .handler );
97
106
}
107
+ }
98
108
109
+ try {
99
110
this .handler .afterConnectionEstablished (this .webSocketSession );
100
111
}
101
112
catch (Throwable ex ) {
102
- // TODO
103
- logger .error ("Error while processing new session" , ex );
113
+ this .handler .handleError (ex , this .webSocketSession );
104
114
}
105
115
}
106
116
@@ -113,8 +123,7 @@ private void handleTextMessage(javax.websocket.Session session, String message)
113
123
((TextMessageHandler ) handler ).handleTextMessage (textMessage , this .webSocketSession );
114
124
}
115
125
catch (Throwable ex ) {
116
- // TODO
117
- logger .error ("Error while processing message" , ex );
126
+ this .handler .handleError (ex , this .webSocketSession );
118
127
}
119
128
}
120
129
@@ -127,8 +136,7 @@ private void handleBinaryMessage(javax.websocket.Session session, byte[] message
127
136
((BinaryMessageHandler ) handler ).handleBinaryMessage (binaryMessage , this .webSocketSession );
128
137
}
129
138
catch (Throwable ex ) {
130
- // TODO
131
- logger .error ("Error while processing message" , ex );
139
+ this .handler .handleError (ex , this .webSocketSession );
132
140
}
133
141
}
134
142
@@ -142,7 +150,6 @@ public void onClose(javax.websocket.Session session, CloseReason reason) {
142
150
this .handler .afterConnectionClosed (closeStatus , this .webSocketSession );
143
151
}
144
152
catch (Throwable ex ) {
145
- // TODO
146
153
logger .error ("Error while processing session closing" , ex );
147
154
}
148
155
finally {
@@ -157,7 +164,7 @@ public void onError(javax.websocket.Session session, Throwable exception) {
157
164
this .handler .handleError (exception , this .webSocketSession );
158
165
}
159
166
catch (Throwable ex ) {
160
- // TODO
167
+ // TODO: close the session?
161
168
logger .error ("Failed to handle error" , ex );
162
169
}
163
170
}
0 commit comments