This is an automated email from the ASF dual-hosted git repository. markt pushed a commit to branch main in repository https://gitbox.apache.org/repos/asf/tomcat.git
commit 1b1685b377f547bbece829dfcbf7f93d56624274 Author: Mark Thomas <ma...@apache.org> AuthorDate: Tue Jun 20 13:46:31 2023 +0100 Add getSession() to SendResult This aligns Tomcat 11.0.x with the latest proposals for Jakarta WebSocket 2.2 from the Jakarta WebSocket project. --- .../tomcat/websocket/WsRemoteEndpointImplBase.java | 24 ++++++++++-------- .../websocket/WsRemoteEndpointImplClient.java | 7 +++--- java/org/apache/tomcat/websocket/WsSession.java | 4 +-- .../server/WsRemoteEndpointImplServer.java | 29 ++++++++++++---------- webapps/docs/changelog.xml | 6 +++++ 5 files changed, 42 insertions(+), 28 deletions(-) diff --git a/java/org/apache/tomcat/websocket/WsRemoteEndpointImplBase.java b/java/org/apache/tomcat/websocket/WsRemoteEndpointImplBase.java index 5dc9298b6e..5717a7bfca 100644 --- a/java/org/apache/tomcat/websocket/WsRemoteEndpointImplBase.java +++ b/java/org/apache/tomcat/websocket/WsRemoteEndpointImplBase.java @@ -58,8 +58,6 @@ public abstract class WsRemoteEndpointImplBase implements RemoteEndpoint { protected static final StringManager sm = StringManager.getManager(WsRemoteEndpointImplBase.class); - protected static final SendResult SENDRESULT_OK = new SendResult(); - private final Log log = LogFactory.getLog(WsRemoteEndpointImplBase.class); // must not be static private final StateMachine stateMachine = new StateMachine(); @@ -104,6 +102,11 @@ public abstract class WsRemoteEndpointImplBase implements RemoteEndpoint { } + protected WsSession getSession() { + return wsSession; + } + + @Override public void setBatchingAllowed(boolean batchingAllowed) throws IOException { boolean oldValue = this.batchingAllowed.getAndSet(batchingAllowed); @@ -362,7 +365,7 @@ public abstract class WsRemoteEndpointImplBase implements RemoteEndpoint { try { messageParts = transformation.sendMessagePart(messageParts); } catch (IOException ioe) { - handler.onResult(new SendResult(ioe)); + handler.onResult(new SendResult(getSession(), ioe)); return; } @@ -370,7 +373,7 @@ public abstract class WsRemoteEndpointImplBase implements RemoteEndpoint { // that no message parts will be returned. If this is the case the // trigger the supplied SendHandler if (messageParts.size() == 0) { - handler.onResult(new SendResult()); + handler.onResult(new SendResult(getSession())); return; } @@ -671,7 +674,7 @@ public abstract class WsRemoteEndpointImplBase implements RemoteEndpoint { try (Writer w = getSendWriter()) { ((Encoder.TextStream) encoder).encode(obj, w); } - completion.onResult(new SendResult()); + completion.onResult(new SendResult(getSession())); } else if (encoder instanceof Encoder.Binary) { ByteBuffer msg = ((Encoder.Binary) encoder).encode(obj); sendBytesByCompletion(msg, completion); @@ -679,12 +682,12 @@ public abstract class WsRemoteEndpointImplBase implements RemoteEndpoint { try (OutputStream os = getSendStream()) { ((Encoder.BinaryStream) encoder).encode(obj, os); } - completion.onResult(new SendResult()); + completion.onResult(new SendResult(getSession())); } else { throw new EncodeException(obj, sm.getString("wsRemoteEndpoint.noEncoder", obj.getClass())); } } catch (Exception e) { - SendResult sr = new SendResult(e); + SendResult sr = new SendResult(getSession(), e); completion.onResult(sr); } } @@ -848,7 +851,8 @@ public abstract class WsRemoteEndpointImplBase implements RemoteEndpoint { } else if (!result.isOK()) { handler.onResult(result); } else if (closed) { - SendResult sr = new SendResult(new IOException(sm.getString("wsRemoteEndpoint.closedDuringMessage"))); + SendResult sr = new SendResult(getSession(), + new IOException(sm.getString("wsRemoteEndpoint.closedDuringMessage"))); handler.onResult(sr); } else { write(); @@ -933,12 +937,12 @@ public abstract class WsRemoteEndpointImplBase implements RemoteEndpoint { if (flushRequired) { outputBuffer.flip(); if (outputBuffer.remaining() == 0) { - handler.onResult(SENDRESULT_OK); + handler.onResult(new SendResult(endpoint.getSession())); } else { endpoint.doWrite(this, blockingWriteTimeoutExpiry, outputBuffer); } } else { - handler.onResult(SENDRESULT_OK); + handler.onResult(new SendResult(endpoint.getSession())); } } diff --git a/java/org/apache/tomcat/websocket/WsRemoteEndpointImplClient.java b/java/org/apache/tomcat/websocket/WsRemoteEndpointImplClient.java index 5f0cc67fc3..7b0386224d 100644 --- a/java/org/apache/tomcat/websocket/WsRemoteEndpointImplClient.java +++ b/java/org/apache/tomcat/websocket/WsRemoteEndpointImplClient.java @@ -54,7 +54,8 @@ public class WsRemoteEndpointImplClient extends WsRemoteEndpointImplBase { } else { timeout = blockingWriteTimeoutExpiry - System.currentTimeMillis(); if (timeout < 0) { - SendResult sr = new SendResult(new IOException(sm.getString("wsRemoteEndpoint.writeTimeout"))); + SendResult sr = new SendResult(getSession(), + new IOException(sm.getString("wsRemoteEndpoint.writeTimeout"))); handler.onResult(sr); } } @@ -62,11 +63,11 @@ public class WsRemoteEndpointImplClient extends WsRemoteEndpointImplBase { try { channel.write(byteBuffer).get(timeout, TimeUnit.MILLISECONDS); } catch (InterruptedException | ExecutionException | TimeoutException e) { - handler.onResult(new SendResult(e)); + handler.onResult(new SendResult(getSession(), e)); return; } } - handler.onResult(SENDRESULT_OK); + handler.onResult(new SendResult(getSession())); } diff --git a/java/org/apache/tomcat/websocket/WsSession.java b/java/org/apache/tomcat/websocket/WsSession.java index 0c75f92184..41cc389eae 100644 --- a/java/org/apache/tomcat/websocket/WsSession.java +++ b/java/org/apache/tomcat/websocket/WsSession.java @@ -598,7 +598,7 @@ public class WsSession implements Session { // Fail any uncompleted messages. IOException ioe = new IOException(sm.getString("wsSession.messageFailed")); - SendResult sr = new SendResult(ioe); + SendResult sr = new SendResult(this, ioe); for (FutureToSendHandler f2sh : futures.keySet()) { f2sh.onResult(sr); } @@ -825,7 +825,7 @@ public class WsSession implements Session { // second and subsequent attempts are ignored. IOException ioe = new IOException(sm.getString("wsSession.messageFailed")); - SendResult sr = new SendResult(ioe); + SendResult sr = new SendResult(this, ioe); f2sh.onResult(sr); } diff --git a/java/org/apache/tomcat/websocket/server/WsRemoteEndpointImplServer.java b/java/org/apache/tomcat/websocket/server/WsRemoteEndpointImplServer.java index 31779aa32a..396de502e3 100644 --- a/java/org/apache/tomcat/websocket/server/WsRemoteEndpointImplServer.java +++ b/java/org/apache/tomcat/websocket/server/WsRemoteEndpointImplServer.java @@ -38,6 +38,7 @@ import org.apache.tomcat.util.res.StringManager; import org.apache.tomcat.websocket.Constants; import org.apache.tomcat.websocket.Transformation; import org.apache.tomcat.websocket.WsRemoteEndpointImplBase; +import org.apache.tomcat.websocket.WsSession; /** * This is the server side {@link jakarta.websocket.RemoteEndpoint} implementation - i.e. what the server uses to send @@ -144,7 +145,7 @@ public class WsRemoteEndpointImplServer extends WsRemoteEndpointImplBase { if (block) { timeout = blockingWriteTimeoutExpiry - System.currentTimeMillis(); if (timeout <= 0) { - SendResult sr = new SendResult(new SocketTimeoutException()); + SendResult sr = new SendResult(getSession(), new SocketTimeoutException()); handler.onResult(sr); return; } @@ -166,7 +167,7 @@ public class WsRemoteEndpointImplServer extends WsRemoteEndpointImplBase { if (timeout <= 0) { failed(new SocketTimeoutException(), null); } else { - handler.onResult(SENDRESULT_OK); + handler.onResult(new SendResult(getSession())); } } else { wsWriteTimeout.unregister(WsRemoteEndpointImplServer.this); @@ -177,7 +178,7 @@ public class WsRemoteEndpointImplServer extends WsRemoteEndpointImplBase { @Override public void failed(Throwable exc, Void attachment) { if (block) { - SendResult sr = new SendResult(exc); + SendResult sr = new SendResult(getSession(), exc); handler.onResult(sr); } else { wsWriteTimeout.unregister(WsRemoteEndpointImplServer.this); @@ -199,7 +200,7 @@ public class WsRemoteEndpointImplServer extends WsRemoteEndpointImplBase { for (ByteBuffer buffer : buffers) { long timeout = blockingWriteTimeoutExpiry - System.currentTimeMillis(); if (timeout <= 0) { - SendResult sr = new SendResult(new SocketTimeoutException()); + SendResult sr = new SendResult(getSession(), new SocketTimeoutException()); handler.onResult(sr); return; } @@ -208,15 +209,15 @@ public class WsRemoteEndpointImplServer extends WsRemoteEndpointImplBase { } long timeout = blockingWriteTimeoutExpiry - System.currentTimeMillis(); if (timeout <= 0) { - SendResult sr = new SendResult(new SocketTimeoutException()); + SendResult sr = new SendResult(getSession(), new SocketTimeoutException()); handler.onResult(sr); return; } socketWrapper.setWriteTimeout(timeout); socketWrapper.flush(true); - handler.onResult(SENDRESULT_OK); + handler.onResult(new SendResult(getSession())); } catch (IOException e) { - SendResult sr = new SendResult(e); + SendResult sr = new SendResult(getSession(), e); handler.onResult(sr); } } @@ -341,7 +342,7 @@ public class WsRemoteEndpointImplServer extends WsRemoteEndpointImplBase { buffers = null; if (sh != null) { if (useDispatch) { - OnResultRunnable r = new OnResultRunnable(sh, t); + OnResultRunnable r = new OnResultRunnable(getSession(), sh, t); try { socketWrapper.execute(r); } catch (RejectedExecutionException ree) { @@ -356,9 +357,9 @@ public class WsRemoteEndpointImplServer extends WsRemoteEndpointImplBase { } } else { if (t == null) { - sh.onResult(new SendResult()); + sh.onResult(new SendResult(getSession())); } else { - sh.onResult(new SendResult(t)); + sh.onResult(new SendResult(getSession(), t)); } } } @@ -373,10 +374,12 @@ public class WsRemoteEndpointImplServer extends WsRemoteEndpointImplBase { private static class OnResultRunnable implements Runnable { + private final WsSession session; private final SendHandler sh; private final Throwable t; - private OnResultRunnable(SendHandler sh, Throwable t) { + private OnResultRunnable(WsSession session, SendHandler sh, Throwable t) { + this.session = session; this.sh = sh; this.t = t; } @@ -384,9 +387,9 @@ public class WsRemoteEndpointImplServer extends WsRemoteEndpointImplBase { @Override public void run() { if (t == null) { - sh.onResult(new SendResult()); + sh.onResult(new SendResult(session)); } else { - sh.onResult(new SendResult(t)); + sh.onResult(new SendResult(session, t)); } } } diff --git a/webapps/docs/changelog.xml b/webapps/docs/changelog.xml index 880e0fc70d..17da9051e3 100644 --- a/webapps/docs/changelog.xml +++ b/webapps/docs/changelog.xml @@ -146,6 +146,12 @@ WebSocket session could return false for <code>onOpen()</code> before the <code>onClose()</code> event had been completed. (markt) </fix> + <add> + Update the WebSocket API provided by Tomcat to align with the latest + proposals from the Jakarta WebSocket project and make the WebSocket + <code>Session</code> instance available via <code>SendResult</code>. + (markt) + </add> </changelog> </subsection> <subsection name="Web applications"> --------------------------------------------------------------------- To unsubscribe, e-mail: dev-unsubscr...@tomcat.apache.org For additional commands, e-mail: dev-h...@tomcat.apache.org