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)

Reply via email to