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

reiern70 pushed a commit to branch improvement/reiern70/WICKET-6950
in repository https://gitbox.apache.org/repos/asf/wicket.git

commit d0ba4a77fbb3a09f3476b08ede2da77a8dca026c
Author: reiern70 <[email protected]>
AuthorDate: Fri Nov 12 23:50:01 2021 -0500

    [WICKET-6950] allow configuring web-sockets sessions when connection is 
opened
---
 .../examples/websocket/JSR356Application.java      |  19 +++-
 .../wicket/protocol/ws/WebSocketSettings.java      |  11 ++
 .../protocol/ws/api/IWebSocketProcessor.java       |   7 ++
 .../wicket/protocol/ws/api/IWebSocketSession.java  | 119 +++++++++++++++++++++
 .../protocol/ws/javax/JavaxWebSocketProcessor.java |   5 +-
 .../wicket/protocol/ws/javax/WicketEndpoint.java   | 116 ++++++++++++++++++++
 6 files changed, 275 insertions(+), 2 deletions(-)

diff --git 
a/wicket-examples/src/main/java/org/apache/wicket/examples/websocket/JSR356Application.java
 
b/wicket-examples/src/main/java/org/apache/wicket/examples/websocket/JSR356Application.java
index e178f7c..b1f378e 100644
--- 
a/wicket-examples/src/main/java/org/apache/wicket/examples/websocket/JSR356Application.java
+++ 
b/wicket-examples/src/main/java/org/apache/wicket/examples/websocket/JSR356Application.java
@@ -23,9 +23,13 @@ import org.apache.wicket.protocol.http.WebApplication;
 import org.apache.wicket.protocol.https.HttpsConfig;
 import org.apache.wicket.protocol.https.HttpsMapper;
 import org.apache.wicket.protocol.ws.WebSocketSettings;
+import org.apache.wicket.protocol.ws.api.IWebSocketSession;
 import org.apache.wicket.request.Request;
 import org.apache.wicket.request.Response;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 
+import java.time.Duration;
 import java.util.concurrent.Executors;
 import java.util.concurrent.ScheduledExecutorService;
 
@@ -35,6 +39,8 @@ import java.util.concurrent.ScheduledExecutorService;
  */
 public class JSR356Application extends WicketExampleApplication
 {
+       private static final Logger LOGGER = 
LoggerFactory.getLogger(JSR356Application.class);
+
     private ScheduledExecutorService scheduledExecutorService;
 
        @Override
@@ -59,11 +65,22 @@ public class JSR356Application extends 
WicketExampleApplication
 
                getSharedResources().add(ChartWebSocketResource.NAME, new 
ChartWebSocketResource());
 
+               final WebSocketSettings webSocketSettings = new 
WebSocketSettings() {
+                       @Override
+                       public void configureSession(IWebSocketSession 
webSocketSession) {
+                               LOGGER.info("getMaxIdleTimeout = " + 
webSocketSession.getMaxIdleTimeout());
+                               // make sessions almost "immortal"
+                               
webSocketSession.setMaxIdleTimeout(Duration.ofHours(10).toMillis());
+                       }
+               };
+
+               WebSocketSettings.Holder.set(this, webSocketSettings);
+
                if (System.getenv("OPENSHIFT_APP_NAME") != null)
                {
                        // OpenShift uses special proxy for WebSocket 
connections
                        // https://blog.openshift.com/paas-websockets/
-                       final WebSocketSettings webSocketSettings = 
WebSocketSettings.Holder.get(this);
+
                        webSocketSettings.setPort(8000);
                        webSocketSettings.setSecurePort(8443);
                }
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 6b47820..d920de9 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
@@ -21,6 +21,7 @@ import org.apache.wicket.MetaDataKey;
 import org.apache.wicket.Page;
 import org.apache.wicket.protocol.ws.api.IWebSocketConnection;
 import org.apache.wicket.protocol.ws.api.IWebSocketConnectionFilter;
+import org.apache.wicket.protocol.ws.api.IWebSocketSession;
 import org.apache.wicket.protocol.ws.api.ServletRequestCopy;
 import org.apache.wicket.protocol.ws.api.WebSocketConnectionFilterCollection;
 import org.apache.wicket.protocol.ws.api.WebSocketRequest;
@@ -246,6 +247,16 @@ public class WebSocketSettings
        }
 
        /**
+        * Allows to configure {@link 
org.apache.wicket.protocol.ws.api.IWebSocketSession}
+        *
+        * @param webSocketSession The {@link 
org.apache.wicket.protocol.ws.api.IWebSocketSession}
+        */
+       public void configureSession(IWebSocketSession webSocketSession)
+       {
+               // it does nothing by default
+       }
+
+       /**
         * Sets the filter for checking the incoming connections
         *
         * @param connectionFilter
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 376265e..baeaff5 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
@@ -16,6 +16,9 @@
  */
 package org.apache.wicket.protocol.ws.api;
 
+import org.apache.wicket.protocol.http.WebApplication;
+import org.apache.wicket.protocol.ws.WebSocketSettings;
+
 /**
  * Processes web socket messages.
  *
@@ -23,6 +26,10 @@ package org.apache.wicket.protocol.ws.api;
  */
 public interface IWebSocketProcessor
 {
+       default void onOpen(IWebSocketSession webSocketSession, final 
WebApplication application) {
+               
WebSocketSettings.Holder.get(application).configureSession(webSocketSession);
+       }
+
        /**
         * Called when a text message arrives from the client
         *
diff --git 
a/wicket-native-websocket/wicket-native-websocket-core/src/main/java/org/apache/wicket/protocol/ws/api/IWebSocketSession.java
 
b/wicket-native-websocket/wicket-native-websocket-core/src/main/java/org/apache/wicket/protocol/ws/api/IWebSocketSession.java
new file mode 100644
index 0000000..6d68bfc
--- /dev/null
+++ 
b/wicket-native-websocket/wicket-native-websocket-core/src/main/java/org/apache/wicket/protocol/ws/api/IWebSocketSession.java
@@ -0,0 +1,119 @@
+/*
+ * 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;
+
+import java.net.URI;
+import java.security.Principal;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * Wicket proxy interface to javax.websocket.Session.
+ */
+public interface IWebSocketSession
+{
+
+    /**
+     * See javax.websocket.Session#getProtocolVersion()
+     */
+    String getProtocolVersion();
+
+
+    /**
+     * See javax.websocket.Session#getNegotiatedSubprotocol()
+     */
+    String getNegotiatedSubprotocol();
+
+
+    /**
+     * See javax.websocket.Session#isSecure()
+     */
+    boolean isSecure();
+
+    /**
+     * See javax.websocket.Session#isOpen()
+     */
+    boolean isOpen();
+
+    /**
+     * See javax.websocket.Session#getMaxIdleTimeout()
+     */
+    long getMaxIdleTimeout();
+
+    /**
+     * See javax.websocket.Session#setMaxIdleTimeout()
+     */
+    void setMaxIdleTimeout(long milliseconds);
+
+    /**
+     * See javax.websocket.Session#setMaxBinaryMessageBufferSize()
+     */
+    void setMaxBinaryMessageBufferSize(int length);
+
+    /**
+     * See javax.websocket.Session#getMaxBinaryMessageBufferSize()
+     */
+    int getMaxBinaryMessageBufferSize();
+
+    /**
+     * See javax.websocket.Session#setMaxTextMessageBufferSize()
+     */
+    void setMaxTextMessageBufferSize(int length);
+
+    /**
+     * See javax.websocket.Session#getMaxTextMessageBufferSize()
+     */
+    int getMaxTextMessageBufferSize();
+
+
+    /**
+     * See javax.websocket.Session#getId()
+     */
+    String getId();
+
+
+    /**
+     * See javax.websocket.Session#getRequestURI()
+     */
+    URI getRequestURI();
+
+    /**
+     * See javax.websocket.Session#getRequestParameterMap()
+     */
+    Map<String, List<String>> getRequestParameterMap();
+
+    /**
+     * See javax.websocket.Session#getQueryString()
+     */
+    String getQueryString();
+
+    /**
+     * See javax.websocket.Session#getPathParameters()
+     */
+    Map<String, String> getPathParameters();
+
+    /**
+     * See javax.websocket.Session#getUserProperties()
+     */
+    Map<String, Object> getUserProperties();
+
+    /**
+     * See javax.websocket.Session#getUserPrincipal()
+     */
+    Principal getUserPrincipal();
+}
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 c9d1479..4d2e052 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
@@ -23,7 +23,9 @@ import javax.websocket.MessageHandler;
 import javax.websocket.Session;
 
 import org.apache.wicket.protocol.http.WebApplication;
+import org.apache.wicket.protocol.ws.WebSocketSettings;
 import org.apache.wicket.protocol.ws.api.AbstractWebSocketProcessor;
+import org.apache.wicket.protocol.ws.api.IWebSocketSession;
 
 /**
  * An {@link org.apache.wicket.protocol.ws.api.IWebSocketProcessor processor} 
that integrates with
@@ -39,7 +41,9 @@ public class JavaxWebSocketProcessor extends 
AbstractWebSocketProcessor
         * @param session
         *            the WebSocket session
         * @param application
+        *            the {@link org.apache.wicket.protocol.http.WebApplication}
         * @param endpointConfig
+        *            the {@link javax.websocket.EndpointConfig}
         */
        public JavaxWebSocketProcessor(final Session session, final 
WebApplication application, EndpointConfig endpointConfig)
        {
@@ -51,7 +55,6 @@ public class JavaxWebSocketProcessor extends 
AbstractWebSocketProcessor
                session.addMessageHandler(new BinaryMessageHandler());
        }
 
-
        @Override
        public void onOpen(Object containerConnection)
        {
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 c14cb1f..f177e6b 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
@@ -18,6 +18,8 @@ package org.apache.wicket.protocol.ws.javax;
 
 import java.io.EOFException;
 import java.io.IOException;
+import java.net.URI;
+import java.security.Principal;
 import java.util.List;
 import java.util.Map;
 import java.util.Set;
@@ -33,6 +35,7 @@ import org.apache.wicket.Application;
 import org.apache.wicket.IApplicationListener;
 import org.apache.wicket.ThreadContext;
 import org.apache.wicket.protocol.http.WebApplication;
+import org.apache.wicket.protocol.ws.api.IWebSocketSession;
 import org.apache.wicket.util.lang.Checks;
 import org.apache.wicket.util.string.Strings;
 import org.slf4j.Logger;
@@ -43,6 +46,118 @@ import org.slf4j.LoggerFactory;
  */
 public class WicketEndpoint extends Endpoint
 {
+       private static class JavaxWebSocketSessionWrapper  implements 
IWebSocketSession
+       {
+               private final Session session;
+
+               private JavaxWebSocketSessionWrapper(Session session)
+               {
+                       this.session = session;
+               }
+
+               @Override
+               public String getProtocolVersion()
+               {
+                       return session.getProtocolVersion();
+               }
+
+               @Override
+               public String getNegotiatedSubprotocol()
+               {
+                       return session.getNegotiatedSubprotocol();
+               }
+
+               @Override
+               public boolean isSecure()
+               {
+                       return session.isSecure();
+               }
+
+               @Override
+               public boolean isOpen()
+               {
+                       return session.isOpen();
+               }
+
+               @Override
+               public long getMaxIdleTimeout()
+               {
+                       return session.getMaxIdleTimeout();
+               }
+
+               @Override
+               public void setMaxIdleTimeout(long milliseconds)
+               {
+                       session.setMaxIdleTimeout(milliseconds);
+               }
+
+               @Override
+               public void setMaxBinaryMessageBufferSize(int length)
+               {
+                       session.setMaxBinaryMessageBufferSize(length);
+               }
+
+               @Override
+               public int getMaxBinaryMessageBufferSize()
+               {
+                       return session.getMaxBinaryMessageBufferSize();
+               }
+
+               @Override
+               public void setMaxTextMessageBufferSize(int length)
+               {
+                       session.setMaxTextMessageBufferSize(length);
+               }
+
+               @Override
+               public int getMaxTextMessageBufferSize()
+               {
+                       return session.getMaxTextMessageBufferSize();
+               }
+
+               @Override
+               public String getId()
+               {
+                       return session.getId();
+               }
+
+               @Override
+               public URI getRequestURI()
+               {
+                       return session.getRequestURI();
+               }
+
+               @Override
+               public Map<String, List<String>> getRequestParameterMap()
+               {
+                       return session.getRequestParameterMap();
+               }
+
+               @Override
+               public String getQueryString()
+               {
+                       return session.getQueryString();
+               }
+
+               @Override
+               public Map<String, String> getPathParameters()
+               {
+                       return session.getPathParameters();
+               }
+
+               @Override
+               public Map<String, Object> getUserProperties()
+               {
+                       return session.getUserProperties();
+               }
+
+               @Override
+               public Principal getUserPrincipal()
+               {
+                       return session.getUserPrincipal();
+               }
+       }
+
        private static final Logger LOG = 
LoggerFactory.getLogger(WicketEndpoint.class);
 
        /**
@@ -70,6 +185,7 @@ public class WicketEndpoint extends Endpoint
                {
                        ThreadContext.setApplication(app);
                        javaxWebSocketProcessor = new 
JavaxWebSocketProcessor(session, app, endpointConfig);
+                       javaxWebSocketProcessor.onOpen(new 
JavaxWebSocketSessionWrapper(session), app);
                }
                finally
                {

Reply via email to