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

reiern70 pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/wicket.git


The following commit(s) were added to refs/heads/master by this push:
     new 9828cf8  [WICKET-6950] allow configuring web-sockets sessions when 
connection is opened
9828cf8 is described below

commit 9828cf8e783f5fcd897826d297b53a5cafc52adc
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      |  17 ++-
 .../wicket/protocol/ws/WebSocketSettings.java      |  29 +++++
 .../protocol/ws/api/IWebSocketProcessor.java       |  20 +++
 .../wicket/protocol/ws/api/IWebSocketSession.java  | 119 +++++++++++++++++
 .../ws/api/IWebSocketSessionConfigurer.java        |  32 +++++
 .../protocol/ws/javax/JavaxWebSocketProcessor.java |   5 +-
 .../protocol/ws/javax/JavaxWebSocketSession.java   | 142 +++++++++++++++++++++
 .../wicket/protocol/ws/javax/WicketEndpoint.java   |   2 +
 8 files changed, 364 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..8bc6e9d 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,14 @@ 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.protocol.ws.api.IWebSocketSessionConfigurer;
 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 +40,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 +66,19 @@ public class JSR356Application extends 
WicketExampleApplication
 
                getSharedResources().add(ChartWebSocketResource.NAME, new 
ChartWebSocketResource());
 
+               final WebSocketSettings webSocketSettings = 
WebSocketSettings.Holder.get(this);
+
+               webSocketSettings.setSocketSessionConfigurer(webSocketSession 
-> {
+                       LOGGER.info("getMaxIdleTimeout = {}", 
webSocketSession.getMaxIdleTimeout());
+                       // use 5 minutes idle timeout
+                       
webSocketSession.setMaxIdleTimeout(Duration.ofMinutes(5).toMillis());
+               });
+
                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 e84909e..7aca394 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,8 @@ 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.IWebSocketSessionConfigurer;
 import org.apache.wicket.protocol.ws.api.ServletRequestCopy;
 import org.apache.wicket.protocol.ws.api.WebSocketConnectionFilterCollection;
 import org.apache.wicket.protocol.ws.api.WebSocketRequest;
@@ -138,6 +140,17 @@ public class WebSocketSettings
        private IWebSocketConnectionFilter connectionFilter;
 
        /**
+        * A {@link 
org.apache.wicket.protocol.ws.api.IWebSocketSessionConfigurer} that allows to 
configure
+        * {@link org.apache.wicket.protocol.ws.api.IWebSocketSession}s.
+        */
+       private IWebSocketSessionConfigurer socketSessionConfigurer = new 
IWebSocketSessionConfigurer() {
+               @Override
+               public void configureSession(IWebSocketSession 
webSocketSession) {
+                       // does nothing by default
+               }
+       };
+
+       /**
         * A function that decides whether to notify the page/resource on
         * web socket connection closed event.
         * The page notification leads to deserialization of the page instance 
from
@@ -246,6 +259,22 @@ public class WebSocketSettings
        }
 
        /**
+        * Sets the IWebSocketSessionConfigurer
+        * @param socketSessionConfigurer A non-null {@link 
org.apache.wicket.protocol.ws.api.IWebSocketSessionConfigurer}
+        */
+       public void setSocketSessionConfigurer(IWebSocketSessionConfigurer 
socketSessionConfigurer) {
+               Args.notNull(socketSessionConfigurer, 
"socketSessionConfigurer");
+               this.socketSessionConfigurer = socketSessionConfigurer;
+       }
+
+       /**
+        * @return returns the {@link 
org.apache.wicket.protocol.ws.api.IWebSocketSessionConfigurer}
+        */
+       public IWebSocketSessionConfigurer getSocketSessionConfigurer() {
+               return socketSessionConfigurer;
+       }
+
+       /**
         * 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..74b34d1 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.
  *
@@ -24,6 +27,21 @@ package org.apache.wicket.protocol.ws.api;
 public interface IWebSocketProcessor
 {
        /**
+        * Called when then {@link 
org.apache.wicket.protocol.ws.api.IWebSocketSession} is being opened: to allow 
to configure
+        * the underlying web socket session.
+        *
+        * @param webSocketSession
+        *                      the {@link 
org.apache.wicket.protocol.ws.api.IWebSocketSession}
+        * @param application
+        *          the {@link org.apache.wicket.protocol.http.WebApplication}
+        */
+       default void onOpen(IWebSocketSession webSocketSession, final 
WebApplication application) {
+               // find the current 
org.apache.wicket.protocol.ws.api.IWebSocketSessionConfigurer and use it
+               // in order to configure the session
+               
WebSocketSettings.Holder.get(application).getSocketSessionConfigurer().configureSession(webSocketSession);
+       }
+
+       /**
         * Called when a text message arrives from the client
         *
         * @param message
@@ -56,7 +74,9 @@ public interface IWebSocketProcessor
         * The connection could be closed by either the client or the server
         *
         * @param closeCode
+        *              The close code
         * @param message
+        *          the message
         */
        void onClose(int closeCode, String message);
 
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-core/src/main/java/org/apache/wicket/protocol/ws/api/IWebSocketSessionConfigurer.java
 
b/wicket-native-websocket/wicket-native-websocket-core/src/main/java/org/apache/wicket/protocol/ws/api/IWebSocketSessionConfigurer.java
new file mode 100644
index 0000000..1ef4efb
--- /dev/null
+++ 
b/wicket-native-websocket/wicket-native-websocket-core/src/main/java/org/apache/wicket/protocol/ws/api/IWebSocketSessionConfigurer.java
@@ -0,0 +1,32 @@
+/*
+ * 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;
+
+/**
+ * Allows to configure the {@link 
org.apache.wicket.protocol.ws.api.IWebSocketSession}
+ */
+public interface IWebSocketSessionConfigurer {
+
+    /**
+     * Allows to configure {@link 
org.apache.wicket.protocol.ws.api.IWebSocketSession}
+     *
+     * @param webSocketSession
+     *        The {@link org.apache.wicket.protocol.ws.api.IWebSocketSession}
+     */
+    void configureSession(IWebSocketSession webSocketSession);
+
+}
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 9832f43..c393517 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 jakarta.websocket.MessageHandler;
 import jakarta.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 jakarta.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/JavaxWebSocketSession.java
 
b/wicket-native-websocket/wicket-native-websocket-javax/src/main/java/org/apache/wicket/protocol/ws/javax/JavaxWebSocketSession.java
new file mode 100644
index 0000000..00d3b1e
--- /dev/null
+++ 
b/wicket-native-websocket/wicket-native-websocket-javax/src/main/java/org/apache/wicket/protocol/ws/javax/JavaxWebSocketSession.java
@@ -0,0 +1,142 @@
+/*
+ * 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.javax;
+
+import java.net.URI;
+import java.security.Principal;
+import java.util.List;
+import java.util.Map;
+
+
+import org.apache.wicket.protocol.ws.api.IWebSocketSession;
+
+import jakarta.websocket.Session;
+
+/**
+ * An implementation of IWebSocketSession that is just a delegating  wrapper 
around {@link jakarta.websocket.Session}.
+ */
+class JavaxWebSocketSession implements IWebSocketSession
+{
+    private final Session session;
+
+    JavaxWebSocketSession(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();
+    }
+}
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 3714b7f..40ba7d4 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
@@ -43,6 +43,7 @@ import org.slf4j.LoggerFactory;
  */
 public class WicketEndpoint extends Endpoint
 {
+
        private static final Logger LOG = 
LoggerFactory.getLogger(WicketEndpoint.class);
 
        /**
@@ -70,6 +71,7 @@ public class WicketEndpoint extends Endpoint
                {
                        ThreadContext.setApplication(app);
                        javaxWebSocketProcessor = new 
JavaxWebSocketProcessor(session, app, endpointConfig);
+                       javaxWebSocketProcessor.onOpen(new 
JavaxWebSocketSession(session), app);
                }
                finally
                {

Reply via email to