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
{