Consolidate WebSocketHandler interface and sub-interfaces

This commit is contained in:
Rossen Stoyanchev
2013-04-25 19:01:49 -04:00
parent 8200601ace
commit 9da2c21edb
8 changed files with 69 additions and 85 deletions

View File

@@ -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

View File

@@ -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;

View File

@@ -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
}
}
}

View File

@@ -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
}
}
}

View File

@@ -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
*/

View File

@@ -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 {
}
}

View File

@@ -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);

View File

@@ -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);