Updated Branches: refs/heads/master 74e776763 -> 55b916f0e
WICKET-5095 Upgrade Wicket Native WebSocket to Jetty 9.0.0 Project: http://git-wip-us.apache.org/repos/asf/wicket/repo Commit: http://git-wip-us.apache.org/repos/asf/wicket/commit/55b916f0 Tree: http://git-wip-us.apache.org/repos/asf/wicket/tree/55b916f0 Diff: http://git-wip-us.apache.org/repos/asf/wicket/diff/55b916f0 Branch: refs/heads/master Commit: 55b916f0eac2cf262d4fa49355c860684a89a297 Parents: 74e7767 Author: Martin Tzvetanov Grigorov <[email protected]> Authored: Tue Mar 12 23:28:18 2013 +0100 Committer: Martin Tzvetanov Grigorov <[email protected]> Committed: Tue Mar 12 23:29:09 2013 +0100 ---------------------------------------------------------------------- pom.xml | 2 +- .../ws/jetty9/Jetty9UpgradeHttpRequest.java | 74 +++++++++++++++ .../ws/jetty9/Jetty9WebSocketConnection.java | 54 ++++------- .../protocol/ws/jetty9/Jetty9WebSocketFilter.java | 19 ++-- .../ws/jetty9/Jetty9WebSocketProcessor.java | 34 +++---- 5 files changed, 118 insertions(+), 65 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/wicket/blob/55b916f0/pom.xml ---------------------------------------------------------------------- diff --git a/pom.xml b/pom.xml index cb9b19e..8c27b2a 100644 --- a/pom.xml +++ b/pom.xml @@ -30,7 +30,7 @@ <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <jetty.version>7.6.3.v20120416</jetty.version> - <jetty9.version>9.0.0.M0</jetty9.version> + <jetty9.version>9.0.0.v20130308</jetty9.version> <spring.version>3.0.7.RELEASE</spring.version> <maven.javadoc.version>2.8.1</maven.javadoc.version> <maven.surefire.version>2.12.2</maven.surefire.version> http://git-wip-us.apache.org/repos/asf/wicket/blob/55b916f0/wicket-experimental/wicket-native-websocket/wicket-native-websocket-jetty9/src/main/java/org/apache/wicket/protocol/ws/jetty9/Jetty9UpgradeHttpRequest.java ---------------------------------------------------------------------- diff --git a/wicket-experimental/wicket-native-websocket/wicket-native-websocket-jetty9/src/main/java/org/apache/wicket/protocol/ws/jetty9/Jetty9UpgradeHttpRequest.java b/wicket-experimental/wicket-native-websocket/wicket-native-websocket-jetty9/src/main/java/org/apache/wicket/protocol/ws/jetty9/Jetty9UpgradeHttpRequest.java new file mode 100644 index 0000000..7d5b449 --- /dev/null +++ b/wicket-experimental/wicket-native-websocket/wicket-native-websocket-jetty9/src/main/java/org/apache/wicket/protocol/ws/jetty9/Jetty9UpgradeHttpRequest.java @@ -0,0 +1,74 @@ +/* + * 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.jetty9; + +import java.lang.reflect.Field; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletRequestWrapper; + +import org.eclipse.jetty.websocket.api.UpgradeRequest; +import org.eclipse.jetty.websocket.server.ServletWebSocketRequest; + +/** + * An HttpServletRequest that wraps the original HttpServletRequest + * hidden hard by Jetty 9.x UpgradeRequest. + */ +class Jetty9UpgradeHttpRequest extends HttpServletRequestWrapper +{ + private static final Field REQ; + static + { + try + { + REQ = ServletWebSocketRequest.class.getDeclaredField("req"); + } catch (NoSuchFieldException nsfx) + { + throw new IllegalStateException(ServletWebSocketRequest.class.getName() + + " has no 'req' field!", nsfx); + } + REQ.setAccessible(true); + } + + Jetty9UpgradeHttpRequest(UpgradeRequest upgradeRequest) + { + super(extractHttpRequest(upgradeRequest)); + } + + private static HttpServletRequest extractHttpRequest(UpgradeRequest upgradeRequest) + { + if (upgradeRequest instanceof ServletWebSocketRequest == false) + { + throw new IllegalArgumentException(Jetty9UpgradeHttpRequest.class.getName() + + " can work only with " + ServletWebSocketRequest.class.getName()); + } + + ServletWebSocketRequest servletWebSocketRequest = (ServletWebSocketRequest) upgradeRequest; + HttpServletRequest request; + try + { + request = (HttpServletRequest) REQ.get(servletWebSocketRequest); + } + catch (IllegalAccessException iax) + { + throw new IllegalStateException("Cannot get the HttpServletRequest after the protocol upgrade", iax); + } + + return request; + } + +} http://git-wip-us.apache.org/repos/asf/wicket/blob/55b916f0/wicket-experimental/wicket-native-websocket/wicket-native-websocket-jetty9/src/main/java/org/apache/wicket/protocol/ws/jetty9/Jetty9WebSocketConnection.java ---------------------------------------------------------------------- diff --git a/wicket-experimental/wicket-native-websocket/wicket-native-websocket-jetty9/src/main/java/org/apache/wicket/protocol/ws/jetty9/Jetty9WebSocketConnection.java b/wicket-experimental/wicket-native-websocket/wicket-native-websocket-jetty9/src/main/java/org/apache/wicket/protocol/ws/jetty9/Jetty9WebSocketConnection.java index a57bcad..45fd3b1 100644 --- a/wicket-experimental/wicket-native-websocket/wicket-native-websocket-jetty9/src/main/java/org/apache/wicket/protocol/ws/jetty9/Jetty9WebSocketConnection.java +++ b/wicket-experimental/wicket-native-websocket/wicket-native-websocket-jetty9/src/main/java/org/apache/wicket/protocol/ws/jetty9/Jetty9WebSocketConnection.java @@ -17,16 +17,15 @@ package org.apache.wicket.protocol.ws.jetty9; import java.io.IOException; -import java.io.InterruptedIOException; -import java.util.concurrent.ExecutionException; +import java.nio.ByteBuffer; import org.apache.wicket.protocol.ws.api.AbstractWebSocketConnection; import org.apache.wicket.protocol.ws.api.AbstractWebSocketProcessor; import org.apache.wicket.protocol.ws.api.IWebSocketConnection; import org.apache.wicket.util.lang.Args; -import org.eclipse.jetty.util.Callback; -import org.eclipse.jetty.util.FutureCallback; -import org.eclipse.jetty.websocket.core.api.WebSocketConnection; +import org.eclipse.jetty.websocket.api.Session; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; /** * A wrapper around Jetty9's native WebSocketConnection. @@ -35,24 +34,26 @@ import org.eclipse.jetty.websocket.core.api.WebSocketConnection; */ public class Jetty9WebSocketConnection extends AbstractWebSocketConnection { - private final WebSocketConnection connection; + private static final Logger LOG = LoggerFactory.getLogger(Jetty9WebSocketConnection.class); + + private final Session session; /** * Constructor. * - * @param connection + * @param session * the jetty websocket connection */ - public Jetty9WebSocketConnection(WebSocketConnection connection, AbstractWebSocketProcessor webSocketProcessor) + public Jetty9WebSocketConnection(Session session, AbstractWebSocketProcessor webSocketProcessor) { super(webSocketProcessor); - this.connection = Args.notNull(connection, "connection"); + this.session = Args.notNull(session, "connection"); } @Override public boolean isOpen() { - return connection.isOpen(); + return session.isOpen(); } @Override @@ -60,7 +61,13 @@ public class Jetty9WebSocketConnection extends AbstractWebSocketConnection { if (isOpen()) { - connection.close(code, reason); + try + { + session.close(code, reason); + } catch (IOException iox) + { + LOG.error("An error occurred while closing WebSocket session", iox); + } } } @@ -69,9 +76,7 @@ public class Jetty9WebSocketConnection extends AbstractWebSocketConnection { checkClosed(); - FutureCallback<Void> waiter = new FutureCallback<Void>(); - connection.write(null, waiter, message); - waitForMessageSent(waiter); + session.getRemote().sendString(message); return this; } @@ -81,28 +86,11 @@ public class Jetty9WebSocketConnection extends AbstractWebSocketConnection { checkClosed(); - FutureCallback<Void> waiter = new FutureCallback<Void>(); - connection.write(null, new Callback.Empty<Void>(), message, offset, length); - waitForMessageSent(waiter); + ByteBuffer buf = ByteBuffer.wrap(message, offset, length); + session.getRemote().sendBytes(buf); return this; } - private void waitForMessageSent(FutureCallback<?> waiter) throws IOException - { - try - { - waiter.get(); - } - catch (InterruptedException e) - { - throw new InterruptedIOException(); - } - catch (ExecutionException e) - { - FutureCallback.rethrow(e); - } - } - private void checkClosed() { if (!isOpen()) http://git-wip-us.apache.org/repos/asf/wicket/blob/55b916f0/wicket-experimental/wicket-native-websocket/wicket-native-websocket-jetty9/src/main/java/org/apache/wicket/protocol/ws/jetty9/Jetty9WebSocketFilter.java ---------------------------------------------------------------------- diff --git a/wicket-experimental/wicket-native-websocket/wicket-native-websocket-jetty9/src/main/java/org/apache/wicket/protocol/ws/jetty9/Jetty9WebSocketFilter.java b/wicket-experimental/wicket-native-websocket/wicket-native-websocket-jetty9/src/main/java/org/apache/wicket/protocol/ws/jetty9/Jetty9WebSocketFilter.java index fd67ce5..817ccd8 100644 --- a/wicket-experimental/wicket-native-websocket/wicket-native-websocket-jetty9/src/main/java/org/apache/wicket/protocol/ws/jetty9/Jetty9WebSocketFilter.java +++ b/wicket-experimental/wicket-native-websocket/wicket-native-websocket-jetty9/src/main/java/org/apache/wicket/protocol/ws/jetty9/Jetty9WebSocketFilter.java @@ -24,11 +24,11 @@ import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.apache.wicket.protocol.ws.AbstractUpgradeFilter; -import org.eclipse.jetty.websocket.core.api.UpgradeRequest; -import org.eclipse.jetty.websocket.core.api.UpgradeResponse; -import org.eclipse.jetty.websocket.core.api.WebSocketPolicy; -import org.eclipse.jetty.websocket.server.WebSocketCreator; +import org.eclipse.jetty.websocket.api.UpgradeRequest; +import org.eclipse.jetty.websocket.api.UpgradeResponse; +import org.eclipse.jetty.websocket.api.WebSocketPolicy; import org.eclipse.jetty.websocket.server.WebSocketServerFactory; +import org.eclipse.jetty.websocket.servlet.WebSocketCreator; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -50,20 +50,17 @@ public class Jetty9WebSocketFilter extends AbstractUpgradeFilter try { WebSocketPolicy serverPolicy = WebSocketPolicy.newServerPolicy(); - String bs = filterConfig.getInitParameter("bufferSize"); + String bs = filterConfig.getInitParameter("inputBufferSize"); if (bs != null) - serverPolicy.setBufferSize(Integer.parseInt(bs)); + serverPolicy.setInputBufferSize(Integer.parseInt(bs)); String max = filterConfig.getInitParameter("maxIdleTime"); if (max != null) serverPolicy.setIdleTimeout(Integer.parseInt(max)); - max = filterConfig.getInitParameter("maxTextMessageSize"); + max = filterConfig.getInitParameter("maxMessageSize"); if (max != null) - serverPolicy.setMaxTextMessageSize(Integer.parseInt(max)); + serverPolicy.setMaxMessageSize(Integer.parseInt(max)); - max = filterConfig.getInitParameter("maxBinaryMessageSize"); - if (max != null) - serverPolicy.setMaxBinaryMessageSize(Integer.parseInt(max)); _webSocketFactory = new WebSocketServerFactory(serverPolicy); _webSocketFactory.setCreator(new WebSocketCreator() http://git-wip-us.apache.org/repos/asf/wicket/blob/55b916f0/wicket-experimental/wicket-native-websocket/wicket-native-websocket-jetty9/src/main/java/org/apache/wicket/protocol/ws/jetty9/Jetty9WebSocketProcessor.java ---------------------------------------------------------------------- diff --git a/wicket-experimental/wicket-native-websocket/wicket-native-websocket-jetty9/src/main/java/org/apache/wicket/protocol/ws/jetty9/Jetty9WebSocketProcessor.java b/wicket-experimental/wicket-native-websocket/wicket-native-websocket-jetty9/src/main/java/org/apache/wicket/protocol/ws/jetty9/Jetty9WebSocketProcessor.java index 9f0f53f..04c8ffb 100644 --- a/wicket-experimental/wicket-native-websocket/wicket-native-websocket-jetty9/src/main/java/org/apache/wicket/protocol/ws/jetty9/Jetty9WebSocketProcessor.java +++ b/wicket-experimental/wicket-native-websocket/wicket-native-websocket-jetty9/src/main/java/org/apache/wicket/protocol/ws/jetty9/Jetty9WebSocketProcessor.java @@ -16,23 +16,18 @@ */ package org.apache.wicket.protocol.ws.jetty9; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletRequestWrapper; - import org.apache.wicket.protocol.http.WebApplication; import org.apache.wicket.protocol.ws.api.AbstractWebSocketProcessor; -import org.eclipse.jetty.websocket.core.annotations.WebSocket; -import org.eclipse.jetty.websocket.core.api.UpgradeRequest; -import org.eclipse.jetty.websocket.core.api.UpgradeResponse; -import org.eclipse.jetty.websocket.core.api.WebSocketConnection; -import org.eclipse.jetty.websocket.core.api.WebSocketException; -import org.eclipse.jetty.websocket.core.api.WebSocketListener; +import org.eclipse.jetty.websocket.api.Session; +import org.eclipse.jetty.websocket.api.UpgradeRequest; +import org.eclipse.jetty.websocket.api.UpgradeResponse; +import org.eclipse.jetty.websocket.api.WebSocketListener; import org.slf4j.Logger; import org.slf4j.LoggerFactory; /** * An {@link org.apache.wicket.protocol.ws.api.IWebSocketProcessor processor} that integrates with - * Jetty 9.x {@link WebSocket web socket} implementation. + * Jetty 9.x {@link Session web socket} implementation. * * @since 6.2 */ @@ -55,14 +50,13 @@ public class Jetty9WebSocketProcessor extends AbstractWebSocketProcessor public Jetty9WebSocketProcessor(final UpgradeRequest upgradeRequest, final UpgradeResponse upgradeResponse, final WebApplication application) { - super((HttpServletRequest)((HttpServletRequestWrapper)upgradeRequest).getRequest(), - application); + super(new Jetty9UpgradeHttpRequest(upgradeRequest), application); } @Override - public void onWebSocketConnect(WebSocketConnection connection) + public void onWebSocketConnect(Session session) { - onConnect(new Jetty9WebSocketConnection(connection, this)); + onConnect(new Jetty9WebSocketConnection(session, this)); } @Override @@ -84,19 +78,19 @@ public class Jetty9WebSocketProcessor extends AbstractWebSocketProcessor } @Override - public void onWebSocketException(WebSocketException error) + public void onWebSocketError(Throwable throwable) { - LOG.error("An error occurred when using WebSocket.", error); + LOG.error("An error occurred when using WebSocket.", throwable); } @Override public void onOpen(Object connection) { - if (!(connection instanceof WebSocketConnection)) + if (!(connection instanceof Session)) { - throw new IllegalArgumentException(WebSocketConnection.class.getName() + - " can work only with " + WebSocketConnection.class.getName()); + throw new IllegalArgumentException(Jetty9WebSocketProcessor.class.getName() + + " can work only with " + Session.class.getName()); } - onWebSocketConnect((WebSocketConnection)connection); + onWebSocketConnect((Session)connection); } } \ No newline at end of file
