You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@wicket.apache.org by re...@apache.org on 2022/01/28 18:07:13 UTC
[wicket] 01/01: [WICKET-6950] allow configuring web-sockets sessions when connection is opened
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 <re...@gmail.com>
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
{