From 9da2c21edbaa31bcbd12447afbf578b621a1de93 Mon Sep 17 00:00:00 2001 From: Rossen Stoyanchev Date: Thu, 25 Apr 2013 19:01:49 -0400 Subject: [PATCH] Consolidate WebSocketHandler interface and sub-interfaces --- .../sockjs/AbstractSockJsSession.java | 11 +---- .../transport/SockJsWebSocketHandler.java | 4 +- ...ava => BinaryWebSocketHandlerAdapter.java} | 29 ++++++------ ....java => TextWebSocketHandlerAdapter.java} | 21 +++++---- .../websocket/WebSocketHandler.java | 10 ++++ .../websocket/WebSocketHandlerAdapter.java | 21 ++++----- .../endpoint/WebSocketHandlerEndpoint.java | 47 +++++++------------ .../support/JettyRequestUpgradeStrategy.java | 11 +---- 8 files changed, 69 insertions(+), 85 deletions(-) rename spring-websocket/src/main/java/org/springframework/websocket/{TextMessageHandler.java => BinaryWebSocketHandlerAdapter.java} (51%) rename spring-websocket/src/main/java/org/springframework/websocket/{BinaryMessageHandler.java => TextWebSocketHandlerAdapter.java} (63%) diff --git a/spring-websocket/src/main/java/org/springframework/sockjs/AbstractSockJsSession.java b/spring-websocket/src/main/java/org/springframework/sockjs/AbstractSockJsSession.java index ee8157e5b6..e584333759 100644 --- a/spring-websocket/src/main/java/org/springframework/sockjs/AbstractSockJsSession.java +++ b/spring-websocket/src/main/java/org/springframework/sockjs/AbstractSockJsSession.java @@ -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 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 diff --git a/spring-websocket/src/main/java/org/springframework/sockjs/server/transport/SockJsWebSocketHandler.java b/spring-websocket/src/main/java/org/springframework/sockjs/server/transport/SockJsWebSocketHandler.java index 691571a72a..95cb4a0522 100644 --- a/spring-websocket/src/main/java/org/springframework/sockjs/server/transport/SockJsWebSocketHandler.java +++ b/spring-websocket/src/main/java/org/springframework/sockjs/server/transport/SockJsWebSocketHandler.java @@ -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; diff --git a/spring-websocket/src/main/java/org/springframework/websocket/TextMessageHandler.java b/spring-websocket/src/main/java/org/springframework/websocket/BinaryWebSocketHandlerAdapter.java similarity index 51% rename from spring-websocket/src/main/java/org/springframework/websocket/TextMessageHandler.java rename to spring-websocket/src/main/java/org/springframework/websocket/BinaryWebSocketHandlerAdapter.java index fe79622b4b..acfeeab6d2 100644 --- a/spring-websocket/src/main/java/org/springframework/websocket/TextMessageHandler.java +++ b/spring-websocket/src/main/java/org/springframework/websocket/BinaryWebSocketHandlerAdapter.java @@ -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 + } + } } diff --git a/spring-websocket/src/main/java/org/springframework/websocket/BinaryMessageHandler.java b/spring-websocket/src/main/java/org/springframework/websocket/TextWebSocketHandlerAdapter.java similarity index 63% rename from spring-websocket/src/main/java/org/springframework/websocket/BinaryMessageHandler.java rename to spring-websocket/src/main/java/org/springframework/websocket/TextWebSocketHandlerAdapter.java index bac882087f..69941bfa14 100644 --- a/spring-websocket/src/main/java/org/springframework/websocket/BinaryMessageHandler.java +++ b/spring-websocket/src/main/java/org/springframework/websocket/TextWebSocketHandlerAdapter.java @@ -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 + } + } } diff --git a/spring-websocket/src/main/java/org/springframework/websocket/WebSocketHandler.java b/spring-websocket/src/main/java/org/springframework/websocket/WebSocketHandler.java index da4b841d2c..b835c383af 100644 --- a/spring-websocket/src/main/java/org/springframework/websocket/WebSocketHandler.java +++ b/spring-websocket/src/main/java/org/springframework/websocket/WebSocketHandler.java @@ -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 */ diff --git a/spring-websocket/src/main/java/org/springframework/websocket/WebSocketHandlerAdapter.java b/spring-websocket/src/main/java/org/springframework/websocket/WebSocketHandlerAdapter.java index 4d9e5259d9..95cd36af56 100644 --- a/spring-websocket/src/main/java/org/springframework/websocket/WebSocketHandlerAdapter.java +++ b/spring-websocket/src/main/java/org/springframework/websocket/WebSocketHandlerAdapter.java @@ -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 { - } - } diff --git a/spring-websocket/src/main/java/org/springframework/websocket/endpoint/WebSocketHandlerEndpoint.java b/spring-websocket/src/main/java/org/springframework/websocket/endpoint/WebSocketHandlerEndpoint.java index ce9f0736ba..4d02cabd6b 100644 --- a/spring-websocket/src/main/java/org/springframework/websocket/endpoint/WebSocketHandlerEndpoint.java +++ b/spring-websocket/src/main/java/org/springframework/websocket/endpoint/WebSocketHandlerEndpoint.java @@ -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() { + session.addMessageHandler(new MessageHandler.Whole() { + @Override + public void onMessage(String message) { + handleTextMessage(session, message); + } + }); + if (this.handler instanceof PartialMessageHandler) { + session.addMessageHandler(new MessageHandler.Partial() { @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() { - @Override - public void onMessage(byte[] messagePart, boolean isLast) { - handleBinaryMessage(session, messagePart, isLast); - } - }); - } - else { - session.addMessageHandler(new MessageHandler.Whole() { - @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() { + @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); diff --git a/spring-websocket/src/main/java/org/springframework/websocket/server/support/JettyRequestUpgradeStrategy.java b/spring-websocket/src/main/java/org/springframework/websocket/server/support/JettyRequestUpgradeStrategy.java index c313f9cdc0..22c186637a 100644 --- a/spring-websocket/src/main/java/org/springframework/websocket/server/support/JettyRequestUpgradeStrategy.java +++ b/spring-websocket/src/main/java/org/springframework/websocket/server/support/JettyRequestUpgradeStrategy.java @@ -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);