This is an automated email from the ASF dual-hosted git repository.

reiern70 pushed a commit to branch 
improvement/reiern70/WICKET-6954-ping-pong-keep-alive
in repository https://gitbox.apache.org/repos/asf/wicket.git

commit d705894bd2b3956e3abf6786076fd4de1ee8f5a3
Author: reiern70 <[email protected]>
AuthorDate: Sat Feb 5 10:46:39 2022 -0500

    [WICKET-6954] initial work
---
 .../wicket/protocol/ws/WebSocketSettings.java      | 18 ++++++-
 .../ws/api/AbstractWebSocketProcessor.java         | 19 ++++++--
 .../protocol/ws/api/IWebSocketProcessor.java       |  5 ++
 .../ws/api/message/PongMessageMessage.java         | 55 ++++++++++++++++++++++
 .../protocol/ws/javax/JavaxWebSocketProcessor.java |  1 -
 5 files changed, 92 insertions(+), 6 deletions(-)

diff --git 
a/wicket-native-websocket/wicket-native-websocket-core/src/main/java/org/apache/wicket/protocol/ws/WebSocketSettings.java
 
b/wicket-native-websocket/wicket-native-websocket-core/src/main/java/org/apache/wicket/protocol/ws/WebSocketSettings.java
index dd59f49..27237a0 100644
--- 
a/wicket-native-websocket/wicket-native-websocket-core/src/main/java/org/apache/wicket/protocol/ws/WebSocketSettings.java
+++ 
b/wicket-native-websocket/wicket-native-websocket-core/src/main/java/org/apache/wicket/protocol/ws/WebSocketSettings.java
@@ -94,6 +94,7 @@ public class WebSocketSettings
        private final AtomicInteger port = new AtomicInteger();
        private final AtomicInteger securePort = new AtomicInteger();
 
+
        /**
         * Holds this WebSocketSettings in the Application's metadata.
         * This way wicket-core module doesn't have reference to 
wicket-native-websocket.
@@ -177,7 +178,12 @@ public class WebSocketSettings
         */
        private Executor heartBeatsExecutor = new HeartBeatsExecutor();
 
-       // internal heartbeats timer.
+       /**
+        * Whether messages are broadcast when receiving pong messages
+        */
+       private boolean sendMessagesOnPong = false;
+
+       // internal heartbeat's timer.
        private Timer heartBeatsTimer;
 
        /**
@@ -589,6 +595,16 @@ public class WebSocketSettings
                }
        }
 
+       public void setSendMessagesOnPong(boolean sendMessagesOnPong)
+       {
+               this.sendMessagesOnPong = sendMessagesOnPong;
+       }
+
+       public boolean isSendMessagesOnPong()
+       {
+               return sendMessagesOnPong;
+       }
+
        private void sendHeartBeats(String application)
        {
                sendHeartBeats(Application.get(application));
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 0290544..d5aef01 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
@@ -47,6 +47,7 @@ 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.PongMessageMessage;
 import org.apache.wicket.protocol.ws.api.message.TextMessage;
 import org.apache.wicket.protocol.ws.api.registry.IKey;
 import org.apache.wicket.protocol.ws.api.registry.IWebSocketConnectionRegistry;
@@ -149,12 +150,22 @@ public abstract class AbstractWebSocketProcessor 
implements IWebSocketProcessor
                this.connectionFilter = webSocketSettings.getConnectionFilter();
        }
 
-
        @Override
-       public void onPong(ByteBuffer byteBuffer) {
+       public void onPong(ByteBuffer byteBuffer)
+       {
                IKey key = getRegistryKey();
-               IWebSocketConnection webSocketConnection = 
connectionRegistry.getConnection(getApplication(), getSessionId(), key);
-               webSocketConnection.onPong(byteBuffer);
+               WebApplication application = getApplication();
+               String sessionId = getSessionId();
+               IWebSocketConnection webSocketConnection = 
connectionRegistry.getConnection(application, sessionId, key);
+               if (webSocketConnection != null)
+               {
+                       webSocketConnection.onPong(byteBuffer);
+                       if (webSocketSettings.isSendMessagesOnPong())
+                       {
+                               // if we want to deliver messages on pong 
deliver them
+                               broadcastMessage(new 
PongMessageMessage(application, sessionId, key, byteBuffer));
+                       }
+               }
        }
 
        @Override
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 5aa9391..708002f 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
@@ -44,6 +44,11 @@ public interface IWebSocketProcessor
                
WebSocketSettings.Holder.get(application).getSocketSessionConfigurer().configureSession(webSocketSession);
        }
 
+       /**
+        * Called when remote peer answers to ping with pong message.
+        *
+        * @param byteBuffer Contains application specific content
+        */
        void onPong(ByteBuffer byteBuffer);
 
        /**
diff --git 
a/wicket-native-websocket/wicket-native-websocket-core/src/main/java/org/apache/wicket/protocol/ws/api/message/PongMessageMessage.java
 
b/wicket-native-websocket/wicket-native-websocket-core/src/main/java/org/apache/wicket/protocol/ws/api/message/PongMessageMessage.java
new file mode 100644
index 0000000..0708f82
--- /dev/null
+++ 
b/wicket-native-websocket/wicket-native-websocket-core/src/main/java/org/apache/wicket/protocol/ws/api/message/PongMessageMessage.java
@@ -0,0 +1,55 @@
+/*
+ * 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 java.nio.ByteBuffer;
+
+import org.apache.wicket.Application;
+import org.apache.wicket.protocol.ws.api.registry.IKey;
+import org.apache.wicket.util.lang.Args;
+
+/**
+ * A {@link IWebSocketMessage message} with Pong message data
+ *
+ * @since 6.0
+ */
+public class PongMessageMessage extends AbstractClientMessage
+{
+       private final ByteBuffer byteBuffer;
+
+       /**
+        *
+        * @param application
+        *      the Wicket application
+        * @param sessionId
+        *      the id of the http session
+        * @param key
+        *      the page id or resource name
+        * @param byteBuffer
+        *      the message sent from the client
+        */
+       public PongMessageMessage(Application application, String sessionId, 
IKey key, ByteBuffer byteBuffer)
+       {
+               super(application, sessionId, key);
+               this.byteBuffer = Args.notNull(byteBuffer, "byteBuffer");
+       }
+
+       public ByteBuffer getByteBuffer()
+       {
+               return byteBuffer;
+       }
+}
diff --git 
a/wicket-native-websocket/wicket-native-websocket-javax/src/main/java/org/apache/wicket/protocol/ws/javax/JavaxWebSocketProcessor.java
 
b/wicket-native-websocket/wicket-native-websocket-javax/src/main/java/org/apache/wicket/protocol/ws/javax/JavaxWebSocketProcessor.java
index cd3adf8..85f78ea 100644
--- 
a/wicket-native-websocket/wicket-native-websocket-javax/src/main/java/org/apache/wicket/protocol/ws/javax/JavaxWebSocketProcessor.java
+++ 
b/wicket-native-websocket/wicket-native-websocket-javax/src/main/java/org/apache/wicket/protocol/ws/javax/JavaxWebSocketProcessor.java
@@ -70,7 +70,6 @@ public class JavaxWebSocketProcessor extends 
AbstractWebSocketProcessor
                @Override
                public void onMessage(PongMessage message)
                {
-                       IKey key = getRegistryKey();
                        
JavaxWebSocketProcessor.this.onPong(message.getApplicationData());
                }
        }

Reply via email to