WICKET-6106 Propagate JSR 356 WebSocket connection error to WebSocketBehavior/WebSocketResource
Project: http://git-wip-us.apache.org/repos/asf/wicket/repo Commit: http://git-wip-us.apache.org/repos/asf/wicket/commit/7f503f9c Tree: http://git-wip-us.apache.org/repos/asf/wicket/tree/7f503f9c Diff: http://git-wip-us.apache.org/repos/asf/wicket/diff/7f503f9c Branch: refs/heads/lambdas Commit: 7f503f9c3ddbba1e5e97c29f9abe093f674b99b7 Parents: cdfaeed Author: Martin Tzvetanov Grigorov <[email protected]> Authored: Fri Feb 26 21:53:18 2016 +0100 Committer: Martin Tzvetanov Grigorov <[email protected]> Committed: Fri Feb 26 21:54:36 2016 +0100 ---------------------------------------------------------------------- .../ws/api/AbstractWebSocketProcessor.java | 16 ++++++- .../protocol/ws/api/IWebSocketProcessor.java | 8 ++++ .../protocol/ws/api/WebSocketBehavior.java | 36 +++++++++++---- .../protocol/ws/api/WebSocketResource.java | 20 ++++++++ .../ws/api/event/WebSocketErrorPayload.java | 43 ++++++++++++++++++ .../protocol/ws/api/message/ErrorMessage.java | 48 ++++++++++++++++++++ .../protocol/ws/javax/WicketEndpoint.java | 2 + 7 files changed, 164 insertions(+), 9 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/wicket/blob/7f503f9c/wicket-native-websocket/wicket-native-websocket-core/src/main/java/org/apache/wicket/protocol/ws/api/AbstractWebSocketProcessor.java ---------------------------------------------------------------------- diff --git a/wicket-native-websocket/wicket-native-websocket-core/src/main/java/org/apache/wicket/protocol/ws/api/AbstractWebSocketProcessor.java b/wicket-native-websocket/wicket-native-websocket-core/src/main/java/org/apache/wicket/protocol/ws/api/AbstractWebSocketProcessor.java index b853dee..7768acd 100644 --- a/wicket-native-websocket/wicket-native-websocket-core/src/main/java/org/apache/wicket/protocol/ws/api/AbstractWebSocketProcessor.java +++ b/wicket-native-websocket/wicket-native-websocket-core/src/main/java/org/apache/wicket/protocol/ws/api/AbstractWebSocketProcessor.java @@ -33,6 +33,7 @@ import org.apache.wicket.protocol.ws.api.event.WebSocketAbortedPayload; import org.apache.wicket.protocol.ws.api.event.WebSocketBinaryPayload; import org.apache.wicket.protocol.ws.api.event.WebSocketClosedPayload; import org.apache.wicket.protocol.ws.api.event.WebSocketConnectedPayload; +import org.apache.wicket.protocol.ws.api.event.WebSocketErrorPayload; import org.apache.wicket.protocol.ws.api.event.WebSocketPayload; import org.apache.wicket.protocol.ws.api.event.WebSocketPushPayload; import org.apache.wicket.protocol.ws.api.event.WebSocketTextPayload; @@ -40,6 +41,7 @@ import org.apache.wicket.protocol.ws.api.message.AbortedMessage; import org.apache.wicket.protocol.ws.api.message.BinaryMessage; import org.apache.wicket.protocol.ws.api.message.ClosedMessage; import org.apache.wicket.protocol.ws.api.message.ConnectedMessage; +import org.apache.wicket.protocol.ws.api.message.ErrorMessage; import org.apache.wicket.protocol.ws.api.message.IWebSocketMessage; import org.apache.wicket.protocol.ws.api.message.IWebSocketPushMessage; import org.apache.wicket.protocol.ws.api.message.TextMessage; @@ -181,6 +183,13 @@ public abstract class AbstractWebSocketProcessor implements IWebSocketProcessor connectionRegistry.removeConnection(getApplication(), getSessionId(), key); } + @Override + public void onError(Throwable t) + { + IKey key = getRegistryKey(); + broadcastMessage(new ErrorMessage(getApplication(), getSessionId(), key, t)); + } + /** * Exports the Wicket thread locals and broadcasts the received message from the client to all * interested components and behaviors in the page with id {@code #pageId} @@ -232,7 +241,8 @@ public abstract class AbstractWebSocketProcessor implements IWebSocketProcessor WebSocketPayload payload = createEventPayload(message, requestHandler); - if (!(message instanceof ConnectedMessage || message instanceof ClosedMessage)) + if (!(message instanceof ConnectedMessage || message instanceof ClosedMessage + || message instanceof AbortedMessage)) { requestCycle.scheduleRequestHandlerAfterCurrent(requestHandler); } @@ -335,6 +345,10 @@ public abstract class AbstractWebSocketProcessor implements IWebSocketProcessor { payload = new WebSocketClosedPayload((ClosedMessage) message, handler); } + else if (message instanceof ErrorMessage) + { + payload = new WebSocketErrorPayload((ErrorMessage) message, handler); + } else if (message instanceof AbortedMessage) { payload = new WebSocketAbortedPayload((AbortedMessage) message, handler); http://git-wip-us.apache.org/repos/asf/wicket/blob/7f503f9c/wicket-native-websocket/wicket-native-websocket-core/src/main/java/org/apache/wicket/protocol/ws/api/IWebSocketProcessor.java ---------------------------------------------------------------------- diff --git a/wicket-native-websocket/wicket-native-websocket-core/src/main/java/org/apache/wicket/protocol/ws/api/IWebSocketProcessor.java b/wicket-native-websocket/wicket-native-websocket-core/src/main/java/org/apache/wicket/protocol/ws/api/IWebSocketProcessor.java index 9e06a5e..376265e 100644 --- a/wicket-native-websocket/wicket-native-websocket-core/src/main/java/org/apache/wicket/protocol/ws/api/IWebSocketProcessor.java +++ b/wicket-native-websocket/wicket-native-websocket-core/src/main/java/org/apache/wicket/protocol/ws/api/IWebSocketProcessor.java @@ -59,4 +59,12 @@ public interface IWebSocketProcessor * @param message */ void onClose(int closeCode, String message); + + /** + * A notification after a communication error. + * + * @param t + * The throwable for the communication problem + */ + void onError(Throwable t); } http://git-wip-us.apache.org/repos/asf/wicket/blob/7f503f9c/wicket-native-websocket/wicket-native-websocket-core/src/main/java/org/apache/wicket/protocol/ws/api/WebSocketBehavior.java ---------------------------------------------------------------------- diff --git a/wicket-native-websocket/wicket-native-websocket-core/src/main/java/org/apache/wicket/protocol/ws/api/WebSocketBehavior.java b/wicket-native-websocket/wicket-native-websocket-core/src/main/java/org/apache/wicket/protocol/ws/api/WebSocketBehavior.java index 50cb5f0..30a65e0 100644 --- a/wicket-native-websocket/wicket-native-websocket-core/src/main/java/org/apache/wicket/protocol/ws/api/WebSocketBehavior.java +++ b/wicket-native-websocket/wicket-native-websocket-core/src/main/java/org/apache/wicket/protocol/ws/api/WebSocketBehavior.java @@ -22,6 +22,7 @@ import org.apache.wicket.protocol.ws.api.event.WebSocketAbortedPayload; import org.apache.wicket.protocol.ws.api.event.WebSocketBinaryPayload; import org.apache.wicket.protocol.ws.api.event.WebSocketClosedPayload; import org.apache.wicket.protocol.ws.api.event.WebSocketConnectedPayload; +import org.apache.wicket.protocol.ws.api.event.WebSocketErrorPayload; import org.apache.wicket.protocol.ws.api.event.WebSocketPayload; import org.apache.wicket.protocol.ws.api.event.WebSocketPushPayload; import org.apache.wicket.protocol.ws.api.event.WebSocketTextPayload; @@ -29,6 +30,7 @@ import org.apache.wicket.protocol.ws.api.message.AbortedMessage; import org.apache.wicket.protocol.ws.api.message.BinaryMessage; import org.apache.wicket.protocol.ws.api.message.ClosedMessage; import org.apache.wicket.protocol.ws.api.message.ConnectedMessage; +import org.apache.wicket.protocol.ws.api.message.ErrorMessage; import org.apache.wicket.protocol.ws.api.message.IWebSocketPushMessage; import org.apache.wicket.protocol.ws.api.message.TextMessage; @@ -79,6 +81,12 @@ public abstract class WebSocketBehavior extends BaseWebSocketBehavior ClosedMessage message = closedPayload.getMessage(); onClose(message); } + else if (wsPayload instanceof WebSocketErrorPayload) + { + WebSocketErrorPayload errorPayload = (WebSocketErrorPayload) wsPayload; + ErrorMessage message = errorPayload.getMessage(); + onError(webSocketHandler, message); + } else if (wsPayload instanceof WebSocketAbortedPayload) { WebSocketAbortedPayload abortedPayload = (WebSocketAbortedPayload) wsPayload; @@ -129,14 +137,26 @@ public abstract class WebSocketBehavior extends BaseWebSocketBehavior { } - /** - * A callback method called when the server has aborted the connection - * - * @param message - * the aborted message with the info about the client - */ - protected void onAbort(AbortedMessage message) { - } + /** + * A callback method called when there is a communication error + * + * @param handler + * The request handler that can be used to send messages to the client + * @param message + * The error message that that brings information about the communication error + */ + protected void onError(WebSocketRequestHandler handler, ErrorMessage message) + { + } + + /** + * A callback method called when the server has aborted the connection + * + * @param message + * the aborted message with the info about the client + */ + protected void onAbort(AbortedMessage message) { + } /** * A callback method called when there is a text message sent by the client http://git-wip-us.apache.org/repos/asf/wicket/blob/7f503f9c/wicket-native-websocket/wicket-native-websocket-core/src/main/java/org/apache/wicket/protocol/ws/api/WebSocketResource.java ---------------------------------------------------------------------- diff --git a/wicket-native-websocket/wicket-native-websocket-core/src/main/java/org/apache/wicket/protocol/ws/api/WebSocketResource.java b/wicket-native-websocket/wicket-native-websocket-core/src/main/java/org/apache/wicket/protocol/ws/api/WebSocketResource.java index a49fc2b..d5bbed9 100644 --- a/wicket-native-websocket/wicket-native-websocket-core/src/main/java/org/apache/wicket/protocol/ws/api/WebSocketResource.java +++ b/wicket-native-websocket/wicket-native-websocket-core/src/main/java/org/apache/wicket/protocol/ws/api/WebSocketResource.java @@ -20,6 +20,7 @@ import org.apache.wicket.protocol.ws.api.event.WebSocketAbortedPayload; import org.apache.wicket.protocol.ws.api.event.WebSocketBinaryPayload; import org.apache.wicket.protocol.ws.api.event.WebSocketClosedPayload; import org.apache.wicket.protocol.ws.api.event.WebSocketConnectedPayload; +import org.apache.wicket.protocol.ws.api.event.WebSocketErrorPayload; import org.apache.wicket.protocol.ws.api.event.WebSocketPayload; import org.apache.wicket.protocol.ws.api.event.WebSocketPushPayload; import org.apache.wicket.protocol.ws.api.event.WebSocketTextPayload; @@ -27,6 +28,7 @@ import org.apache.wicket.protocol.ws.api.message.AbortedMessage; import org.apache.wicket.protocol.ws.api.message.BinaryMessage; import org.apache.wicket.protocol.ws.api.message.ClosedMessage; import org.apache.wicket.protocol.ws.api.message.ConnectedMessage; +import org.apache.wicket.protocol.ws.api.message.ErrorMessage; import org.apache.wicket.protocol.ws.api.message.IWebSocketPushMessage; import org.apache.wicket.protocol.ws.api.message.TextMessage; import org.apache.wicket.request.resource.IResource; @@ -64,6 +66,12 @@ public abstract class WebSocketResource implements IResource ClosedMessage message = connectedPayload.getMessage(); onClose(message); } + else if (payload instanceof WebSocketErrorPayload) + { + WebSocketErrorPayload errorPayload = (WebSocketErrorPayload) payload; + ErrorMessage message = errorPayload.getMessage(); + onError(webSocketHandler, message); + } else if (payload instanceof WebSocketAbortedPayload) { WebSocketAbortedPayload abortedPayload = (WebSocketAbortedPayload) payload; @@ -124,6 +132,18 @@ public abstract class WebSocketResource implements IResource } /** + * A callback method called when there is a communication error + * + * @param handler + * The request handler that can be used to send messages to the client + * @param message + * The error message that that brings information about the communication error + */ + protected void onError(WebSocketRequestHandler handler, ErrorMessage message) + { + } + + /** * A callback method called when there is a text message sent by the client * * @param handler http://git-wip-us.apache.org/repos/asf/wicket/blob/7f503f9c/wicket-native-websocket/wicket-native-websocket-core/src/main/java/org/apache/wicket/protocol/ws/api/event/WebSocketErrorPayload.java ---------------------------------------------------------------------- diff --git a/wicket-native-websocket/wicket-native-websocket-core/src/main/java/org/apache/wicket/protocol/ws/api/event/WebSocketErrorPayload.java b/wicket-native-websocket/wicket-native-websocket-core/src/main/java/org/apache/wicket/protocol/ws/api/event/WebSocketErrorPayload.java new file mode 100644 index 0000000..80d61a7 --- /dev/null +++ b/wicket-native-websocket/wicket-native-websocket-core/src/main/java/org/apache/wicket/protocol/ws/api/event/WebSocketErrorPayload.java @@ -0,0 +1,43 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); 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 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.wicket.protocol.ws.api.event; + +import org.apache.wicket.protocol.ws.api.WebSocketRequestHandler; +import org.apache.wicket.protocol.ws.api.message.ErrorMessage; + +/** + * Payload for event broadcasting when there is a communication error + * + * @since 7.3.0 + */ +public class WebSocketErrorPayload extends WebSocketPayload<ErrorMessage> +{ + private final ErrorMessage message; + + public WebSocketErrorPayload(ErrorMessage message, WebSocketRequestHandler handler) + { + super(handler); + + this.message = message; + } + + @Override + public final ErrorMessage getMessage() + { + return message; + } +} http://git-wip-us.apache.org/repos/asf/wicket/blob/7f503f9c/wicket-native-websocket/wicket-native-websocket-core/src/main/java/org/apache/wicket/protocol/ws/api/message/ErrorMessage.java ---------------------------------------------------------------------- diff --git a/wicket-native-websocket/wicket-native-websocket-core/src/main/java/org/apache/wicket/protocol/ws/api/message/ErrorMessage.java b/wicket-native-websocket/wicket-native-websocket-core/src/main/java/org/apache/wicket/protocol/ws/api/message/ErrorMessage.java new file mode 100644 index 0000000..1fa6e4c --- /dev/null +++ b/wicket-native-websocket/wicket-native-websocket-core/src/main/java/org/apache/wicket/protocol/ws/api/message/ErrorMessage.java @@ -0,0 +1,48 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); 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 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.wicket.protocol.ws.api.message; + +import org.apache.wicket.Application; +import org.apache.wicket.protocol.ws.api.registry.IKey; + +/** + * A {@link IWebSocketMessage message} sent when there is an error while using the + * web socket connection. + * + * @since 7.3.0 + */ +public class ErrorMessage extends AbstractClientMessage +{ + private final Throwable t; + + public ErrorMessage(Application application, String sessionId, IKey key, Throwable t) + { + super(application, sessionId, key); + this.t = t; + } + + public Throwable getThrowable() + { + return t; + } + + @Override + public final String toString() + { + return "A communication error has occurred!"; + } +} http://git-wip-us.apache.org/repos/asf/wicket/blob/7f503f9c/wicket-native-websocket/wicket-native-websocket-javax/src/main/java/org/apache/wicket/protocol/ws/javax/WicketEndpoint.java ---------------------------------------------------------------------- diff --git a/wicket-native-websocket/wicket-native-websocket-javax/src/main/java/org/apache/wicket/protocol/ws/javax/WicketEndpoint.java b/wicket-native-websocket/wicket-native-websocket-javax/src/main/java/org/apache/wicket/protocol/ws/javax/WicketEndpoint.java index e7cecf6..9de80f1 100644 --- a/wicket-native-websocket/wicket-native-websocket-javax/src/main/java/org/apache/wicket/protocol/ws/javax/WicketEndpoint.java +++ b/wicket-native-websocket/wicket-native-websocket-javax/src/main/java/org/apache/wicket/protocol/ws/javax/WicketEndpoint.java @@ -76,6 +76,8 @@ public class WicketEndpoint extends Endpoint { LOG.error("An error occurred in web socket connection with id : " + session.getId(), t); super.onError(session, t); + + javaxWebSocketProcessor.onError(t); } private String getApplicationName(Session session)
