Consolidate WebSocketHandler interface and sub-interfaces
This commit is contained in:
@@ -25,7 +25,6 @@ import org.springframework.util.Assert;
|
||||
import org.springframework.websocket.CloseStatus;
|
||||
import org.springframework.websocket.HandlerProvider;
|
||||
import org.springframework.websocket.TextMessage;
|
||||
import org.springframework.websocket.TextMessageHandler;
|
||||
import org.springframework.websocket.WebSocketHandler;
|
||||
import org.springframework.websocket.WebSocketSession;
|
||||
|
||||
@@ -44,7 +43,7 @@ public abstract class AbstractSockJsSession implements WebSocketSession {
|
||||
|
||||
private final HandlerProvider<WebSocketHandler> handlerProvider;
|
||||
|
||||
private TextMessageHandler handler;
|
||||
private WebSocketHandler handler;
|
||||
|
||||
private State state = State.NEW;
|
||||
|
||||
@@ -124,7 +123,7 @@ public abstract class AbstractSockJsSession implements WebSocketSession {
|
||||
|
||||
public void delegateConnectionEstablished() {
|
||||
this.state = State.OPEN;
|
||||
initHandler();
|
||||
this.handler = handlerProvider.getHandler();
|
||||
try {
|
||||
this.handler.afterConnectionEstablished(this);
|
||||
}
|
||||
@@ -133,12 +132,6 @@ public abstract class AbstractSockJsSession implements WebSocketSession {
|
||||
}
|
||||
}
|
||||
|
||||
private void initHandler() {
|
||||
WebSocketHandler webSocketHandler = handlerProvider.getHandler();
|
||||
Assert.isInstanceOf(TextMessageHandler.class, webSocketHandler, "Expected a TextMessageHandler");
|
||||
this.handler = (TextMessageHandler) webSocketHandler;
|
||||
}
|
||||
|
||||
/**
|
||||
* Close due to unhandled runtime error from WebSocketHandler.
|
||||
* @param closeStatus TODO
|
||||
|
||||
@@ -27,7 +27,7 @@ import org.springframework.util.StringUtils;
|
||||
import org.springframework.websocket.CloseStatus;
|
||||
import org.springframework.websocket.HandlerProvider;
|
||||
import org.springframework.websocket.TextMessage;
|
||||
import org.springframework.websocket.TextMessageHandler;
|
||||
import org.springframework.websocket.TextWebSocketHandlerAdapter;
|
||||
import org.springframework.websocket.WebSocketHandler;
|
||||
import org.springframework.websocket.WebSocketSession;
|
||||
|
||||
@@ -41,7 +41,7 @@ import com.fasterxml.jackson.databind.ObjectMapper;
|
||||
* @author Rossen Stoyanchev
|
||||
* @since 4.0
|
||||
*/
|
||||
public class SockJsWebSocketHandler implements TextMessageHandler {
|
||||
public class SockJsWebSocketHandler extends TextWebSocketHandlerAdapter {
|
||||
|
||||
private final SockJsConfiguration sockJsConfig;
|
||||
|
||||
|
||||
@@ -5,7 +5,7 @@
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
@@ -13,27 +13,26 @@
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
package org.springframework.websocket;
|
||||
|
||||
import org.springframework.websocket.WebSocketHandlerAdapter.TextAndBinaryMessageHandlerAdapter;
|
||||
import org.springframework.websocket.WebSocketHandlerAdapter.TextMessageHandlerAdapter;
|
||||
import java.io.IOException;
|
||||
|
||||
|
||||
/**
|
||||
* A handler for WebSocket text messages.
|
||||
*
|
||||
* @author Rossen Stoyanchev
|
||||
* @since 4.0
|
||||
*
|
||||
* @see TextMessageHandlerAdapter
|
||||
* @see TextAndBinaryMessageHandlerAdapter
|
||||
* @author rossen
|
||||
*/
|
||||
public interface TextMessageHandler extends WebSocketHandler {
|
||||
public class BinaryWebSocketHandlerAdapter extends WebSocketHandlerAdapter {
|
||||
|
||||
|
||||
/**
|
||||
* Handle an incoming text message.
|
||||
*/
|
||||
void handleTextMessage(TextMessage message, WebSocketSession session);
|
||||
@Override
|
||||
public void handleTextMessage(TextMessage message, WebSocketSession session) {
|
||||
try {
|
||||
session.close(CloseStatus.NOT_ACCEPTABLE.withReason("Text messages not supported"));
|
||||
}
|
||||
catch (IOException e) {
|
||||
// ignore
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
@@ -5,7 +5,7 @@
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
@@ -13,22 +13,27 @@
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
package org.springframework.websocket;
|
||||
|
||||
import java.io.IOException;
|
||||
|
||||
|
||||
/**
|
||||
* A handler for WebSocket binary messages.
|
||||
*
|
||||
* @author Rossen Stoyanchev
|
||||
* @since 4.0
|
||||
*/
|
||||
public interface BinaryMessageHandler extends WebSocketHandler {
|
||||
public class TextWebSocketHandlerAdapter extends WebSocketHandlerAdapter {
|
||||
|
||||
|
||||
/**
|
||||
* Handle an incoming binary message.
|
||||
*/
|
||||
void handleBinaryMessage(BinaryMessage message, WebSocketSession session);
|
||||
@Override
|
||||
public void handleBinaryMessage(BinaryMessage message, WebSocketSession session) {
|
||||
try {
|
||||
session.close(CloseStatus.NOT_ACCEPTABLE.withReason("Binary messages not supported"));
|
||||
}
|
||||
catch (IOException e) {
|
||||
// ignore
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
@@ -36,6 +36,16 @@ public interface WebSocketHandler {
|
||||
*/
|
||||
void afterConnectionClosed(CloseStatus closeStatus, WebSocketSession session);
|
||||
|
||||
/**
|
||||
* Handle an incoming text message.
|
||||
*/
|
||||
void handleTextMessage(TextMessage message, WebSocketSession session);
|
||||
|
||||
/**
|
||||
* Handle an incoming binary message.
|
||||
*/
|
||||
void handleBinaryMessage(BinaryMessage message, WebSocketSession session);
|
||||
|
||||
/**
|
||||
* TODO
|
||||
*/
|
||||
|
||||
@@ -33,21 +33,16 @@ public class WebSocketHandlerAdapter implements WebSocketHandler {
|
||||
public void afterConnectionClosed(CloseStatus status, WebSocketSession session) {
|
||||
}
|
||||
|
||||
@Override
|
||||
public void handleTextMessage(TextMessage message, WebSocketSession session) {
|
||||
}
|
||||
|
||||
@Override
|
||||
public void handleBinaryMessage(BinaryMessage message, WebSocketSession session) {
|
||||
}
|
||||
|
||||
@Override
|
||||
public void handleTransportError(Throwable exception, WebSocketSession session) {
|
||||
}
|
||||
|
||||
|
||||
public static abstract class TextMessageHandlerAdapter
|
||||
extends WebSocketHandlerAdapter implements TextMessageHandler {
|
||||
}
|
||||
|
||||
public static abstract class BinaryMessageHandlerAdapter
|
||||
extends WebSocketHandlerAdapter implements BinaryMessageHandler {
|
||||
}
|
||||
|
||||
public static abstract class TextAndBinaryMessageHandlerAdapter extends WebSocketHandlerAdapter
|
||||
implements TextMessageHandler, BinaryMessageHandler {
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -27,12 +27,10 @@ import org.apache.commons.logging.Log;
|
||||
import org.apache.commons.logging.LogFactory;
|
||||
import org.springframework.util.Assert;
|
||||
import org.springframework.websocket.BinaryMessage;
|
||||
import org.springframework.websocket.BinaryMessageHandler;
|
||||
import org.springframework.websocket.CloseStatus;
|
||||
import org.springframework.websocket.HandlerProvider;
|
||||
import org.springframework.websocket.PartialMessageHandler;
|
||||
import org.springframework.websocket.TextMessage;
|
||||
import org.springframework.websocket.TextMessageHandler;
|
||||
import org.springframework.websocket.WebSocketHandler;
|
||||
import org.springframework.websocket.WebSocketSession;
|
||||
|
||||
@@ -74,36 +72,27 @@ public class WebSocketHandlerEndpoint extends Endpoint {
|
||||
this.webSocketSession = new StandardWebSocketSession(session);
|
||||
this.handler = handlerProvider.getHandler();
|
||||
|
||||
if (this.handler instanceof TextMessageHandler) {
|
||||
session.addMessageHandler(new MessageHandler.Whole<String>() {
|
||||
session.addMessageHandler(new MessageHandler.Whole<String>() {
|
||||
@Override
|
||||
public void onMessage(String message) {
|
||||
handleTextMessage(session, message);
|
||||
}
|
||||
});
|
||||
if (this.handler instanceof PartialMessageHandler) {
|
||||
session.addMessageHandler(new MessageHandler.Partial<byte[]>() {
|
||||
@Override
|
||||
public void onMessage(String message) {
|
||||
handleTextMessage(session, message);
|
||||
public void onMessage(byte[] messagePart, boolean isLast) {
|
||||
handleBinaryMessage(session, messagePart, isLast);
|
||||
}
|
||||
});
|
||||
}
|
||||
else if (this.handler instanceof BinaryMessageHandler) {
|
||||
if (this.handler instanceof PartialMessageHandler) {
|
||||
session.addMessageHandler(new MessageHandler.Partial<byte[]>() {
|
||||
@Override
|
||||
public void onMessage(byte[] messagePart, boolean isLast) {
|
||||
handleBinaryMessage(session, messagePart, isLast);
|
||||
}
|
||||
});
|
||||
}
|
||||
else {
|
||||
session.addMessageHandler(new MessageHandler.Whole<byte[]>() {
|
||||
@Override
|
||||
public void onMessage(byte[] message) {
|
||||
handleBinaryMessage(session, message, true);
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
else {
|
||||
if (logger.isWarnEnabled()) {
|
||||
logger.warn("WebSocketHandler handles neither text nor binary messages: " + this.handler);
|
||||
}
|
||||
session.addMessageHandler(new MessageHandler.Whole<byte[]>() {
|
||||
@Override
|
||||
public void onMessage(byte[] message) {
|
||||
handleBinaryMessage(session, message, true);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
try {
|
||||
@@ -147,7 +136,7 @@ public class WebSocketHandlerEndpoint extends Endpoint {
|
||||
}
|
||||
try {
|
||||
TextMessage textMessage = new TextMessage(message);
|
||||
((TextMessageHandler) handler).handleTextMessage(textMessage, this.webSocketSession);
|
||||
this.handler.handleTextMessage(textMessage, this.webSocketSession);
|
||||
}
|
||||
catch (Throwable ex) {
|
||||
tryCloseWithError(ex);
|
||||
@@ -160,7 +149,7 @@ public class WebSocketHandlerEndpoint extends Endpoint {
|
||||
}
|
||||
try {
|
||||
BinaryMessage binaryMessage = new BinaryMessage(message, isLast);
|
||||
((BinaryMessageHandler) handler).handleBinaryMessage(binaryMessage, this.webSocketSession);
|
||||
this.handler.handleBinaryMessage(binaryMessage, this.webSocketSession);
|
||||
}
|
||||
catch (Throwable ex) {
|
||||
tryCloseWithError(ex);
|
||||
|
||||
@@ -40,11 +40,9 @@ import org.springframework.http.server.ServletServerHttpResponse;
|
||||
import org.springframework.util.Assert;
|
||||
import org.springframework.util.ObjectUtils;
|
||||
import org.springframework.websocket.BinaryMessage;
|
||||
import org.springframework.websocket.BinaryMessageHandler;
|
||||
import org.springframework.websocket.CloseStatus;
|
||||
import org.springframework.websocket.HandlerProvider;
|
||||
import org.springframework.websocket.TextMessage;
|
||||
import org.springframework.websocket.TextMessageHandler;
|
||||
import org.springframework.websocket.WebSocketHandler;
|
||||
import org.springframework.websocket.WebSocketMessage;
|
||||
import org.springframework.websocket.WebSocketSession;
|
||||
@@ -213,9 +211,7 @@ public class JettyRequestUpgradeStrategy implements RequestUpgradeStrategy {
|
||||
logger.trace("Received message for WebSocket session id="
|
||||
+ this.session.getId() + ": " + message);
|
||||
}
|
||||
if (this.handler instanceof TextMessageHandler) {
|
||||
((TextMessageHandler) this.handler).handleTextMessage(message, this.session);
|
||||
}
|
||||
this.handler.handleTextMessage(message, this.session);
|
||||
}
|
||||
catch(Throwable ex) {
|
||||
tryCloseWithError(ex);
|
||||
@@ -230,10 +226,7 @@ public class JettyRequestUpgradeStrategy implements RequestUpgradeStrategy {
|
||||
logger.trace("Received binary data for WebSocket session id="
|
||||
+ this.session.getId() + ": " + message);
|
||||
}
|
||||
if (this.handler instanceof BinaryMessageHandler) {
|
||||
((BinaryMessageHandler) this.handler).handleBinaryMessage(message,
|
||||
this.session);
|
||||
}
|
||||
this.handler.handleBinaryMessage(message, this.session);
|
||||
}
|
||||
catch(Throwable ex) {
|
||||
tryCloseWithError(ex);
|
||||
|
||||
Reference in New Issue
Block a user