https://issues.apache.org/jira/browse/AMQ-5356
Upgraded to Jetty 9.2.x to solve JDK 8 compatibility issues. This required migrating to the new WebSocket API. Project: http://git-wip-us.apache.org/repos/asf/activemq/repo Commit: http://git-wip-us.apache.org/repos/asf/activemq/commit/f44c3d20 Tree: http://git-wip-us.apache.org/repos/asf/activemq/tree/f44c3d20 Diff: http://git-wip-us.apache.org/repos/asf/activemq/diff/f44c3d20 Branch: refs/heads/master Commit: f44c3d20ed2a9f74746a02418a4381909936a000 Parents: 505916b Author: Christopher L. Shannon (cshannon) <christopher.l.shan...@gmail.com> Authored: Wed Aug 19 16:55:14 2015 +0000 Committer: Christopher L. Shannon (cshannon) <christopher.l.shan...@gmail.com> Committed: Thu Sep 3 11:54:57 2015 +0000 ---------------------------------------------------------------------- activemq-fileserver/pom.xml | 18 +- .../src/main/webapp/WEB-INF/web.xml | 9 +- .../apache/activemq/util/HttpTestSupport.java | 8 +- .../apache/activemq/util/RestFilterTest.java | 4 +- activemq-http/pom.xml | 11 +- .../transport/SecureSocketConnectorFactory.java | 27 +- .../transport/SocketConnectorFactory.java | 15 +- .../transport/WebTransportServerSupport.java | 7 +- .../https/Krb5AndCertsSslSocketConnector.java | 309 ++++++------- .../transport/ws/WSTransportServer.java | 12 +- .../transport/ws/jetty8/MQTTSocket.java | 89 ---- .../transport/ws/jetty8/StompSocket.java | 73 --- .../activemq/transport/ws/jetty8/WSServlet.java | 66 --- .../transport/ws/jetty9/MQTTSocket.java | 2 + .../activemq/transport/ws/jetty9/WSServlet.java | 7 +- .../activemq/transport/ws/MQTTWSConnection.java | 57 ++- .../ws/MQTTWSConnectionTimeoutTest.java | 21 +- .../transport/ws/MQTTWSLinkStealingTest.java | 21 +- .../transport/ws/MQTTWSTransportTest.java | 17 +- .../activemq/transport/ws/SocketTest.java | 11 +- .../transport/ws/StompWSConnection.java | 44 +- .../ws/StompWSConnectionTimeoutTest.java | 15 +- .../transport/ws/StompWSTransportTest.java | 13 +- .../activemq/transport/ws/WSTransportTest.java | 3 - .../transport/ws/WSTransportTestSupport.java | 9 +- .../transport/wss/WSSTransportTest.java | 7 +- activemq-http/src/webapp/WEB-INF/web.xml | 13 +- activemq-osgi/pom.xml | 2 +- activemq-web-console/pom.xml | 78 +++- .../src/main/webapp/WEB-INF/activemq.xml | 2 +- .../src/main/webapp/WEB-INF/web.xml | 9 +- .../java/org/apache/activemq/web/tool/Main.java | 18 +- activemq-web-demo/pom.xml | 5 +- .../src/main/webapp/WEB-INF/web.xml | 18 +- .../java/org/apache/activemq/web/AjaxTest.java | 457 ++++++++----------- .../org/apache/activemq/web/JettyServer.java | 7 +- .../apache/activemq/web/JettyTestSupport.java | 10 +- .../apache/activemq/web/RestPersistentTest.java | 75 ++- .../java/org/apache/activemq/web/RestTest.java | 250 ++++++---- activemq-web/pom.xml | 17 +- .../activemq/web/config/JspConfigurer.java | 50 ++ assembly/pom.xml | 43 +- assembly/src/main/descriptors/common-bin.xml | 22 +- assembly/src/release/conf/jetty.xml | 142 +++--- .../src/release/examples/conf/jetty-demo.xml | 153 ++++--- .../src/release/webapps/api/WEB-INF/web.xml | 14 +- pom.xml | 74 ++- 47 files changed, 1170 insertions(+), 1164 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/activemq/blob/f44c3d20/activemq-fileserver/pom.xml ---------------------------------------------------------------------- diff --git a/activemq-fileserver/pom.xml b/activemq-fileserver/pom.xml index 7f6dc02..65feb30 100755 --- a/activemq-fileserver/pom.xml +++ b/activemq-fileserver/pom.xml @@ -33,12 +33,11 @@ <build> <plugins> <plugin> - <groupId>org.mortbay.jetty</groupId> + <groupId>org.eclipse.jetty</groupId> <artifactId>jetty-maven-plugin</artifactId> - <version>${jetty-version}</version> <configuration> <connectors> - <connector implementation="org.eclipse.jetty.server.nio.SelectChannelConnector"> + <connector implementation="org.eclipse.jetty.server.ServerConnector"> <port>${jetty.port}</port> <maxIdleTime>60000</maxIdleTime> </connector> @@ -63,12 +62,13 @@ <artifactId>slf4j-api</artifactId> </dependency> - <!-- web container --> - <dependency> - <groupId>org.apache.geronimo.specs</groupId> - <artifactId>geronimo-servlet_3.0_spec</artifactId> - <scope>provided</scope> - </dependency> + <!-- web container --> + <dependency> + <groupId>org.apache.tomcat</groupId> + <artifactId>tomcat-servlet-api</artifactId> + <scope>provided</scope> + </dependency> + <!-- used for testing --> <dependency> http://git-wip-us.apache.org/repos/asf/activemq/blob/f44c3d20/activemq-fileserver/src/main/webapp/WEB-INF/web.xml ---------------------------------------------------------------------- diff --git a/activemq-fileserver/src/main/webapp/WEB-INF/web.xml b/activemq-fileserver/src/main/webapp/WEB-INF/web.xml index 372ec1c..e3d3bed 100644 --- a/activemq-fileserver/src/main/webapp/WEB-INF/web.xml +++ b/activemq-fileserver/src/main/webapp/WEB-INF/web.xml @@ -15,11 +15,10 @@ See the License for the specific language governing permissions and limitations under the License. --> -<!DOCTYPE web-app - PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" - "http://java.sun.com/dtd/web-app_2_3.dtd"> - -<web-app> +<web-app xmlns="http://java.sun.com/xml/ns/javaee" + xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" + version="3.0"> <display-name>RESTful file access application</display-name> http://git-wip-us.apache.org/repos/asf/activemq/blob/f44c3d20/activemq-fileserver/src/test/java/org/apache/activemq/util/HttpTestSupport.java ---------------------------------------------------------------------- diff --git a/activemq-fileserver/src/test/java/org/apache/activemq/util/HttpTestSupport.java b/activemq-fileserver/src/test/java/org/apache/activemq/util/HttpTestSupport.java index 6ea0a25..32017b6 100644 --- a/activemq-fileserver/src/test/java/org/apache/activemq/util/HttpTestSupport.java +++ b/activemq-fileserver/src/test/java/org/apache/activemq/util/HttpTestSupport.java @@ -30,9 +30,7 @@ import junit.framework.TestCase; import org.apache.activemq.ActiveMQConnectionFactory; import org.apache.activemq.broker.BrokerService; -import org.eclipse.jetty.server.Connector; import org.eclipse.jetty.server.Server; -import org.eclipse.jetty.server.nio.SelectChannelConnector; import org.eclipse.jetty.webapp.WebAppContext; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -51,8 +49,8 @@ public abstract class HttpTestSupport extends TestCase { protected boolean createBroker = true; final File homeDir = new File("src/main/webapp/uploads/"); + int port; - private int getPort(Object o) throws Exception { return (Integer)o.getClass().getMethod("getLocalPort").invoke(o); } @@ -68,7 +66,7 @@ public abstract class HttpTestSupport extends TestCase { server.setHandler(context); server.start(); - int port = getPort(server.getConnectors()[0]); + port = getPort(server.getConnectors()[0]); waitForJettySocketToAccept("http://localhost:" + port); @@ -93,6 +91,8 @@ public abstract class HttpTestSupport extends TestCase { } } + + @Override protected void tearDown() throws Exception { server.stop(); http://git-wip-us.apache.org/repos/asf/activemq/blob/f44c3d20/activemq-fileserver/src/test/java/org/apache/activemq/util/RestFilterTest.java ---------------------------------------------------------------------- diff --git a/activemq-fileserver/src/test/java/org/apache/activemq/util/RestFilterTest.java b/activemq-fileserver/src/test/java/org/apache/activemq/util/RestFilterTest.java index 7e2b799..5422694 100644 --- a/activemq-fileserver/src/test/java/org/apache/activemq/util/RestFilterTest.java +++ b/activemq-fileserver/src/test/java/org/apache/activemq/util/RestFilterTest.java @@ -28,12 +28,12 @@ import org.eclipse.jetty.util.IO; public class RestFilterTest extends HttpTestSupport { protected boolean createBroker = false; - + public void testFilter() throws Exception { byte[] fileContents = new byte[] { 'a', 'b', 'c' }; - URL url = new URL("http://localhost:8080/uploads/file.txt"); + URL url = new URL("http://localhost:" + port + "/uploads/file.txt"); // 1. upload HttpURLConnection connection = (HttpURLConnection)url.openConnection(); http://git-wip-us.apache.org/repos/asf/activemq/blob/f44c3d20/activemq-http/pom.xml ---------------------------------------------------------------------- diff --git a/activemq-http/pom.xml b/activemq-http/pom.xml index 7d00276..ee8c480 100755 --- a/activemq-http/pom.xml +++ b/activemq-http/pom.xml @@ -39,6 +39,10 @@ <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> </dependency> + <dependency> + <groupId>org.springframework</groupId> + <artifactId>spring-jms</artifactId> + </dependency> <dependency> <groupId>${project.groupId}</groupId> <artifactId>activemq-stomp</artifactId> @@ -111,11 +115,10 @@ <dependency> <groupId>org.eclipse.jetty.websocket</groupId> <artifactId>websocket-server</artifactId> - <version>${jetty9-version}</version> <scope>provided</scope> <optional>true</optional> - </dependency> - <dependency> + </dependency> + <dependency> <groupId>org.mockito</groupId> <artifactId>mockito-core</artifactId> <scope>test</scope> @@ -143,7 +146,7 @@ org.apache.activemq.transport.https*;version=${project.version};-noimport:=;-split-package:=merge-last </Export-Package> <Import-Package> - org.eclipse.jetty*;version="[7.5,8.0)";resolution:=optional, + org.eclipse.jetty*;version="[9.0,10.0)";resolution:=optional, !org.apache.activemq.transport.ws*;version=${project.version}, !org.apache.activemq.transport.xstream;version=${project.version}, !org.apache.activemq.transport.util;version=${project.version}, http://git-wip-us.apache.org/repos/asf/activemq/blob/f44c3d20/activemq-http/src/main/java/org/apache/activemq/transport/SecureSocketConnectorFactory.java ---------------------------------------------------------------------- diff --git a/activemq-http/src/main/java/org/apache/activemq/transport/SecureSocketConnectorFactory.java b/activemq-http/src/main/java/org/apache/activemq/transport/SecureSocketConnectorFactory.java index 3ac922a..3fd27f1 100644 --- a/activemq-http/src/main/java/org/apache/activemq/transport/SecureSocketConnectorFactory.java +++ b/activemq-http/src/main/java/org/apache/activemq/transport/SecureSocketConnectorFactory.java @@ -19,10 +19,10 @@ package org.apache.activemq.transport; import javax.net.ssl.SSLContext; import org.apache.activemq.broker.SslContext; -import org.apache.activemq.transport.https.Krb5AndCertsSslSocketConnector; import org.apache.activemq.util.IntrospectionSupport; import org.eclipse.jetty.server.Connector; import org.eclipse.jetty.server.Server; +import org.eclipse.jetty.server.ServerConnector; import org.eclipse.jetty.util.ssl.SslContextFactory; public class SecureSocketConnectorFactory extends SocketConnectorFactory { @@ -43,9 +43,9 @@ public class SecureSocketConnectorFactory extends SocketConnectorFactory { private SslContext context; private SslContextFactory contextFactory; - + public SecureSocketConnectorFactory() { - + } public SecureSocketConnectorFactory(SslContext context) { this.context = context; @@ -113,21 +113,16 @@ public class SecureSocketConnectorFactory extends SocketConnectorFactory { factory = contextFactory; } - + if ("KRB".equals(auth) || "BOTH".equals(auth) && Server.getVersion().startsWith("8")) { - return new Krb5AndCertsSslSocketConnector(factory, auth); + //return new Krb5AndCertsSslSocketConnector(factory, auth); + return null; } else { - try { - Class<?> cls = Class.forName("org.eclipse.jetty.server.ssl.SslSelectChannelConnector", true, Server.class.getClassLoader()); - return (Connector)cls.getConstructor(SslContextFactory.class).newInstance(factory); - } catch (Throwable t) { - Class<?> c = Class.forName("org.eclipse.jetty.server.ServerConnector", true, Server.class.getClassLoader()); - Connector connector = (Connector)c.getConstructor(Server.class, SslContextFactory.class).newInstance(server, factory); - Server.class.getMethod("setStopTimeout", Long.TYPE).invoke(server, 500); - connector.getClass().getMethod("setStopTimeout", Long.TYPE).invoke(connector, 500); - return connector; - } + ServerConnector connector = new ServerConnector(server, factory); + server.setStopTimeout(500); + connector.setStopTimeout(500); + return connector; } } private void setTrustStore(SslContextFactory factory, String trustStore2) throws Exception { @@ -136,7 +131,7 @@ public class SecureSocketConnectorFactory extends SocketConnectorFactory { } - + // Properties // -------------------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/activemq/blob/f44c3d20/activemq-http/src/main/java/org/apache/activemq/transport/SocketConnectorFactory.java ---------------------------------------------------------------------- diff --git a/activemq-http/src/main/java/org/apache/activemq/transport/SocketConnectorFactory.java b/activemq-http/src/main/java/org/apache/activemq/transport/SocketConnectorFactory.java index b982f18..03c574d 100644 --- a/activemq-http/src/main/java/org/apache/activemq/transport/SocketConnectorFactory.java +++ b/activemq-http/src/main/java/org/apache/activemq/transport/SocketConnectorFactory.java @@ -21,23 +21,16 @@ import java.util.Map; import org.apache.activemq.util.IntrospectionSupport; import org.eclipse.jetty.server.Connector; import org.eclipse.jetty.server.Server; +import org.eclipse.jetty.server.ServerConnector; public class SocketConnectorFactory { private Map<String, Object> transportOptions; public Connector createConnector(Server server) throws Exception { - Connector connector = null; - - try { - connector = (Connector)Class.forName("org.eclipse.jetty.server.nio.SelectChannelConnector", true, Server.class.getClassLoader()).newInstance(); - } catch (Throwable t) { - Class<?> c = Class.forName("org.eclipse.jetty.server.ServerConnector", true, Server.class.getClassLoader()); - connector = (Connector)c.getConstructor(Server.class).newInstance(server); - Server.class.getMethod("setStopTimeout", Long.TYPE).invoke(server, 500); - connector.getClass().getMethod("setStopTimeout", Long.TYPE).invoke(connector, 500); - } - System.out.println(transportOptions); + ServerConnector connector = new ServerConnector(server); + server.setStopTimeout(500); + connector.setStopTimeout(500); if (transportOptions != null) { IntrospectionSupport.setProperties(connector, transportOptions, ""); } http://git-wip-us.apache.org/repos/asf/activemq/blob/f44c3d20/activemq-http/src/main/java/org/apache/activemq/transport/WebTransportServerSupport.java ---------------------------------------------------------------------- diff --git a/activemq-http/src/main/java/org/apache/activemq/transport/WebTransportServerSupport.java b/activemq-http/src/main/java/org/apache/activemq/transport/WebTransportServerSupport.java index a52424e..4b2adcb 100644 --- a/activemq-http/src/main/java/org/apache/activemq/transport/WebTransportServerSupport.java +++ b/activemq-http/src/main/java/org/apache/activemq/transport/WebTransportServerSupport.java @@ -38,13 +38,13 @@ abstract public class WebTransportServerSupport extends TransportServerSupport { private <T> void setConnectorProperty(String name, Class<T> type, T value) throws Exception { connector.getClass().getMethod("set" + name, type).invoke(connector, value); } - + protected void createServer() { server = new Server(); try { server.getClass().getMethod("setStopTimeout", Long.TYPE).invoke(server, 500l); } catch (Throwable t) { - //ignore, jetty 8. + //ignore, jetty 8. } } public URI bind() throws Exception { @@ -58,9 +58,6 @@ abstract public class WebTransportServerSupport extends TransportServerSupport { setConnectorProperty("Host", String.class, host); setConnectorProperty("Port", Integer.TYPE, bindAddress.getPort()); - if (Server.getVersion().startsWith("8")) { - connector.setServer(server); - } server.addConnector(connector); if (addr.isAnyLocalAddress()) { host = InetAddressUtil.getLocalHostName(); http://git-wip-us.apache.org/repos/asf/activemq/blob/f44c3d20/activemq-http/src/main/java/org/apache/activemq/transport/https/Krb5AndCertsSslSocketConnector.java ---------------------------------------------------------------------- diff --git a/activemq-http/src/main/java/org/apache/activemq/transport/https/Krb5AndCertsSslSocketConnector.java b/activemq-http/src/main/java/org/apache/activemq/transport/https/Krb5AndCertsSslSocketConnector.java index cf36122..aacf897 100644 --- a/activemq-http/src/main/java/org/apache/activemq/transport/https/Krb5AndCertsSslSocketConnector.java +++ b/activemq-http/src/main/java/org/apache/activemq/transport/https/Krb5AndCertsSslSocketConnector.java @@ -16,27 +16,6 @@ */ package org.apache.activemq.transport.https; -import java.io.IOException; -import java.net.ServerSocket; -import java.security.KeyManagementException; -import java.security.NoSuchAlgorithmException; -import java.security.NoSuchProviderException; -import java.security.Principal; -import java.util.Collections; -import java.util.List; -import java.util.Random; -import javax.net.ssl.SSLContext; -import javax.net.ssl.SSLServerSocket; -import javax.net.ssl.SSLSocket; - -import org.eclipse.jetty.http.HttpSchemes; -import org.eclipse.jetty.io.EndPoint; -import org.eclipse.jetty.server.Request; -import org.eclipse.jetty.server.ssl.ServletSSL; -import org.eclipse.jetty.server.ssl.SslSocketConnector; -import org.eclipse.jetty.util.ssl.SslContextFactory; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; /** * Extend Jetty's {@link SslSocketConnector} to optionally also provide @@ -44,147 +23,149 @@ import org.slf4j.LoggerFactory; * that we no longer honor requests to turn off NeedAuthentication when running * with Kerberos support. */ -public class Krb5AndCertsSslSocketConnector extends SslSocketConnector { - public static final List<String> KRB5_CIPHER_SUITES = Collections.unmodifiableList(Collections.singletonList("TLS_KRB5_WITH_3DES_EDE_CBC_SHA")); - static { - System.setProperty("https.cipherSuites", KRB5_CIPHER_SUITES.get(0)); - } - - private static final Logger LOG = LoggerFactory.getLogger(Krb5AndCertsSslSocketConnector.class); - - private static final String REMOTE_PRINCIPAL = "remote_principal"; - - public enum MODE { - KRB, CERTS, BOTH - } // Support Kerberos, certificates or both? - - private boolean useKrb; - private boolean useCerts; - - public Krb5AndCertsSslSocketConnector() { - // By default, stick to cert based authentication - super(); - useKrb = false; - useCerts = true; - setPasswords(); - } - public Krb5AndCertsSslSocketConnector(SslContextFactory f, String auth) { - // By default, stick to cert based authentication - super(f); - useKrb = false; - useCerts = true; - setPasswords(); - setMode(auth); - } - - public static boolean isKrb(String mode) { - return mode == MODE.KRB.toString() || mode == MODE.BOTH.toString(); - } - - public void setMode(String mode) { - useKrb = mode == MODE.KRB.toString() || mode == MODE.BOTH.toString(); - useCerts = mode == MODE.CERTS.toString() || mode == MODE.BOTH.toString(); - logIfDebug("useKerb = " + useKrb + ", useCerts = " + useCerts); - } - - // If not using Certs, set passwords to random gibberish or else - // Jetty will actually prompt the user for some. - private void setPasswords() { - if (!useCerts) { - Random r = new Random(); - System.setProperty("jetty.ssl.password", String.valueOf(r.nextLong())); - System.setProperty("jetty.ssl.keypassword", String.valueOf(r.nextLong())); - } - } - - @Override - public SslContextFactory getSslContextFactory() { - final SslContextFactory factory = super.getSslContextFactory(); - - if (useCerts) { - return factory; - } - - try { - SSLContext context = factory.getProvider() == null ? SSLContext.getInstance(factory.getProtocol()) : SSLContext.getInstance(factory.getProtocol(), - factory.getProvider()); - context.init(null, null, null); - factory.setSslContext(context); - } catch (NoSuchAlgorithmException e) { - } catch (NoSuchProviderException e) { - } catch (KeyManagementException e) { - } - - return factory; - } - - /* - * (non-Javadoc) - * - * @see - * org.mortbay.jetty.security.SslSocketConnector#newServerSocket(java.lang - * .String, int, int) - */ - @Override - protected ServerSocket newServerSocket(String host, int port, int backlog) throws IOException { - logIfDebug("Creating new KrbServerSocket for: " + host); - SSLServerSocket ss = null; - - if (useCerts) // Get the server socket from the SSL super impl - ss = (SSLServerSocket) super.newServerSocket(host, port, backlog); - else { // Create a default server socket - try { - ss = (SSLServerSocket) super.newServerSocket(host, port, backlog); - } catch (Exception e) { - LOG.warn("Could not create KRB5 Listener", e); - throw new IOException("Could not create KRB5 Listener: " + e.toString()); - } - } - - // Add Kerberos ciphers to this socket server if needed. - if (useKrb) { - ss.setNeedClientAuth(true); - String[] combined; - if (useCerts) { // combine the cipher suites - String[] certs = ss.getEnabledCipherSuites(); - combined = new String[certs.length + KRB5_CIPHER_SUITES.size()]; - System.arraycopy(certs, 0, combined, 0, certs.length); - System.arraycopy(KRB5_CIPHER_SUITES.toArray(new String[0]), 0, combined, certs.length, KRB5_CIPHER_SUITES.size()); - } else { // Just enable Kerberos auth - combined = KRB5_CIPHER_SUITES.toArray(new String[0]); - } - - ss.setEnabledCipherSuites(combined); - } - return ss; - }; - - @Override - public void customize(EndPoint endpoint, Request request) throws IOException { - if (useKrb) { // Add Kerberos-specific info - SSLSocket sslSocket = (SSLSocket) endpoint.getTransport(); - Principal remotePrincipal = sslSocket.getSession().getPeerPrincipal(); - logIfDebug("Remote principal = " + remotePrincipal); - request.setScheme(HttpSchemes.HTTPS); - request.setAttribute(REMOTE_PRINCIPAL, remotePrincipal); - - if (!useCerts) { // Add extra info that would have been added by - // super - String cipherSuite = sslSocket.getSession().getCipherSuite(); - Integer keySize = Integer.valueOf(ServletSSL.deduceKeyLength(cipherSuite)); - ; - - request.setAttribute("javax.servlet.request.cipher_suite", cipherSuite); - request.setAttribute("javax.servlet.request.key_size", keySize); - } - } - - if (useCerts) - super.customize(endpoint, request); - } - - private void logIfDebug(String s) { - if (LOG.isDebugEnabled()) - LOG.debug(s); - } +public class Krb5AndCertsSslSocketConnector { +// +//extends SslSocketConnector { +// public static final List<String> KRB5_CIPHER_SUITES = Collections.unmodifiableList(Collections.singletonList("TLS_KRB5_WITH_3DES_EDE_CBC_SHA")); +// static { +// System.setProperty("https.cipherSuites", KRB5_CIPHER_SUITES.get(0)); +// } +// +// private static final Logger LOG = LoggerFactory.getLogger(Krb5AndCertsSslSocketConnector.class); +// +// private static final String REMOTE_PRINCIPAL = "remote_principal"; +// +// public enum MODE { +// KRB, CERTS, BOTH +// } // Support Kerberos, certificates or both? +// +// private boolean useKrb; +// private boolean useCerts; +// +// public Krb5AndCertsSslSocketConnector() { +// // By default, stick to cert based authentication +// super(); +// useKrb = false; +// useCerts = true; +// setPasswords(); +// } +// public Krb5AndCertsSslSocketConnector(SslContextFactory f, String auth) { +// // By default, stick to cert based authentication +// super(f); +// useKrb = false; +// useCerts = true; +// setPasswords(); +// setMode(auth); +// } +// +// public static boolean isKrb(String mode) { +// return mode == MODE.KRB.toString() || mode == MODE.BOTH.toString(); +// } +// +// public void setMode(String mode) { +// useKrb = mode == MODE.KRB.toString() || mode == MODE.BOTH.toString(); +// useCerts = mode == MODE.CERTS.toString() || mode == MODE.BOTH.toString(); +// logIfDebug("useKerb = " + useKrb + ", useCerts = " + useCerts); +// } +// +// // If not using Certs, set passwords to random gibberish or else +// // Jetty will actually prompt the user for some. +// private void setPasswords() { +// if (!useCerts) { +// Random r = new Random(); +// System.setProperty("jetty.ssl.password", String.valueOf(r.nextLong())); +// System.setProperty("jetty.ssl.keypassword", String.valueOf(r.nextLong())); +// } +// } +// +// @Override +// public SslContextFactory getSslContextFactory() { +// final SslContextFactory factory = super.getSslContextFactory(); +// +// if (useCerts) { +// return factory; +// } +// +// try { +// SSLContext context = factory.getProvider() == null ? SSLContext.getInstance(factory.getProtocol()) : SSLContext.getInstance(factory.getProtocol(), +// factory.getProvider()); +// context.init(null, null, null); +// factory.setSslContext(context); +// } catch (NoSuchAlgorithmException e) { +// } catch (NoSuchProviderException e) { +// } catch (KeyManagementException e) { +// } +// +// return factory; +// } +// +// /* +// * (non-Javadoc) +// * +// * @see +// * org.mortbay.jetty.security.SslSocketConnector#newServerSocket(java.lang +// * .String, int, int) +// */ +// @Override +// protected ServerSocket newServerSocket(String host, int port, int backlog) throws IOException { +// logIfDebug("Creating new KrbServerSocket for: " + host); +// SSLServerSocket ss = null; +// +// if (useCerts) // Get the server socket from the SSL super impl +// ss = (SSLServerSocket) super.newServerSocket(host, port, backlog); +// else { // Create a default server socket +// try { +// ss = (SSLServerSocket) super.newServerSocket(host, port, backlog); +// } catch (Exception e) { +// LOG.warn("Could not create KRB5 Listener", e); +// throw new IOException("Could not create KRB5 Listener: " + e.toString()); +// } +// } +// +// // Add Kerberos ciphers to this socket server if needed. +// if (useKrb) { +// ss.setNeedClientAuth(true); +// String[] combined; +// if (useCerts) { // combine the cipher suites +// String[] certs = ss.getEnabledCipherSuites(); +// combined = new String[certs.length + KRB5_CIPHER_SUITES.size()]; +// System.arraycopy(certs, 0, combined, 0, certs.length); +// System.arraycopy(KRB5_CIPHER_SUITES.toArray(new String[0]), 0, combined, certs.length, KRB5_CIPHER_SUITES.size()); +// } else { // Just enable Kerberos auth +// combined = KRB5_CIPHER_SUITES.toArray(new String[0]); +// } +// +// ss.setEnabledCipherSuites(combined); +// } +// return ss; +// }; +// +// @Override +// public void customize(EndPoint endpoint, Request request) throws IOException { +// if (useKrb) { // Add Kerberos-specific info +// SSLSocket sslSocket = (SSLSocket) endpoint.getTransport(); +// Principal remotePrincipal = sslSocket.getSession().getPeerPrincipal(); +// logIfDebug("Remote principal = " + remotePrincipal); +// request.setScheme(HttpSchemes.HTTPS); +// request.setAttribute(REMOTE_PRINCIPAL, remotePrincipal); +// +// if (!useCerts) { // Add extra info that would have been added by +// // super +// String cipherSuite = sslSocket.getSession().getCipherSuite(); +// Integer keySize = Integer.valueOf(ServletSSL.deduceKeyLength(cipherSuite)); +// ; +// +// request.setAttribute("javax.servlet.request.cipher_suite", cipherSuite); +// request.setAttribute("javax.servlet.request.key_size", keySize); +// } +// } +// +// if (useCerts) +// super.customize(endpoint, request); +// } +// +// private void logIfDebug(String s) { +// if (LOG.isDebugEnabled()) +// LOG.debug(s); +// } } http://git-wip-us.apache.org/repos/asf/activemq/blob/f44c3d20/activemq-http/src/main/java/org/apache/activemq/transport/ws/WSTransportServer.java ---------------------------------------------------------------------- diff --git a/activemq-http/src/main/java/org/apache/activemq/transport/ws/WSTransportServer.java b/activemq-http/src/main/java/org/apache/activemq/transport/ws/WSTransportServer.java index adfa2af..487879f 100644 --- a/activemq-http/src/main/java/org/apache/activemq/transport/ws/WSTransportServer.java +++ b/activemq-http/src/main/java/org/apache/activemq/transport/ws/WSTransportServer.java @@ -26,6 +26,7 @@ import javax.servlet.Servlet; import org.apache.activemq.command.BrokerInfo; import org.apache.activemq.transport.SocketConnectorFactory; import org.apache.activemq.transport.WebTransportServerSupport; +import org.apache.activemq.transport.ws.jetty9.WSServlet; import org.apache.activemq.util.IntrospectionSupport; import org.apache.activemq.util.ServiceStopper; import org.eclipse.jetty.server.Connector; @@ -81,7 +82,7 @@ public class WSTransportServer extends WebTransportServerSupport { // Update the Connect To URI with our actual location in case the configured port // was set to zero so that we report the actual port we are listening on. - int port = getConnectorLocalPort(); + int port = getConnectorLocalPort(); if (port == -1) { port = boundTo.getPort(); } @@ -98,18 +99,13 @@ public class WSTransportServer extends WebTransportServerSupport { } private Servlet createWSServlet() throws Exception { - if (Server.getVersion().startsWith("9")) { - return (Servlet)Class.forName("org.apache.activemq.transport.ws.jetty9.WSServlet", true, - getClass().getClassLoader()).newInstance(); - } - return (Servlet)Class.forName("org.apache.activemq.transport.ws.jetty8.WSServlet", true, - getClass().getClassLoader()).newInstance(); + return new WSServlet(); } private int getConnectorLocalPort() throws Exception { return (Integer)connector.getClass().getMethod("getLocalPort").invoke(connector); } - + @Override protected void doStop(ServiceStopper stopper) throws Exception { Server temp = server; http://git-wip-us.apache.org/repos/asf/activemq/blob/f44c3d20/activemq-http/src/main/java/org/apache/activemq/transport/ws/jetty8/MQTTSocket.java ---------------------------------------------------------------------- diff --git a/activemq-http/src/main/java/org/apache/activemq/transport/ws/jetty8/MQTTSocket.java b/activemq-http/src/main/java/org/apache/activemq/transport/ws/jetty8/MQTTSocket.java deleted file mode 100644 index 7032b1f..0000000 --- a/activemq-http/src/main/java/org/apache/activemq/transport/ws/jetty8/MQTTSocket.java +++ /dev/null @@ -1,89 +0,0 @@ -/** - * 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.activemq.transport.ws.jetty8; - -import java.io.IOException; - -import org.apache.activemq.transport.ws.AbstractMQTTSocket; -import org.apache.activemq.util.ByteSequence; -import org.apache.activemq.util.IOExceptionSupport; -import org.eclipse.jetty.websocket.WebSocket; -import org.fusesource.mqtt.codec.DISCONNECT; -import org.fusesource.mqtt.codec.MQTTFrame; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -public class MQTTSocket extends AbstractMQTTSocket implements WebSocket.OnBinaryMessage { - - private static final Logger LOG = LoggerFactory.getLogger(MQTTSocket.class); - - private Connection outbound; - - public MQTTSocket(String remoteAddress) { - super(remoteAddress); - } - - @Override - public void sendToMQTT(MQTTFrame command) throws IOException { - ByteSequence bytes = wireFormat.marshal(command); - outbound.sendMessage(bytes.getData(), 0, bytes.getLength()); - } - - @Override - public void handleStopped() throws IOException { - if (outbound != null && outbound.isOpen()) { - outbound.close(); - } - } - - //----- WebSocket.OnTextMessage callback handlers ------------------------// - - @Override - public void onOpen(Connection connection) { - this.outbound = connection; - } - - @Override - public void onMessage(byte[] bytes, int offset, int length) { - if (!transportStartedAtLeastOnce()) { - LOG.debug("Waiting for MQTTSocket to be properly started..."); - try { - socketTransportStarted.await(); - } catch (InterruptedException e) { - LOG.warn("While waiting for MQTTSocket to be properly started, we got interrupted!! Should be okay, but you could see race conditions..."); - } - } - - receiveCounter += length; - - try { - MQTTFrame frame = (MQTTFrame)wireFormat.unmarshal(new ByteSequence(bytes, offset, length)); - getProtocolConverter().onMQTTCommand(frame); - } catch (Exception e) { - onException(IOExceptionSupport.create(e)); - } - } - - @Override - public void onClose(int closeCode, String message) { - try { - getProtocolConverter().onMQTTCommand(new DISCONNECT().encode()); - } catch (Exception e) { - LOG.warn("Failed to close WebSocket", e); - } - } -} http://git-wip-us.apache.org/repos/asf/activemq/blob/f44c3d20/activemq-http/src/main/java/org/apache/activemq/transport/ws/jetty8/StompSocket.java ---------------------------------------------------------------------- diff --git a/activemq-http/src/main/java/org/apache/activemq/transport/ws/jetty8/StompSocket.java b/activemq-http/src/main/java/org/apache/activemq/transport/ws/jetty8/StompSocket.java deleted file mode 100644 index a2d07b9..0000000 --- a/activemq-http/src/main/java/org/apache/activemq/transport/ws/jetty8/StompSocket.java +++ /dev/null @@ -1,73 +0,0 @@ -/** - * 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.activemq.transport.ws.jetty8; - -import java.io.IOException; - -import org.apache.activemq.transport.stomp.Stomp; -import org.apache.activemq.transport.stomp.StompFrame; -import org.apache.activemq.transport.ws.AbstractStompSocket; -import org.eclipse.jetty.websocket.WebSocket; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -/** - * Implements web socket and mediates between servlet and the broker - */ -public class StompSocket extends AbstractStompSocket implements WebSocket.OnTextMessage { - - private static final Logger LOG = LoggerFactory.getLogger(StompSocket.class); - - private Connection outbound; - - public StompSocket(String remoteAddress) { - super(remoteAddress); - } - - @Override - public void handleStopped() throws IOException { - if (outbound != null && outbound.isOpen()) { - outbound.close(); - } - } - - @Override - public void sendToStomp(StompFrame command) throws IOException { - outbound.sendMessage(command.format()); - } - - //----- WebSocket.OnTextMessage callback handlers ------------------------// - - @Override - public void onOpen(Connection connection) { - this.outbound = connection; - } - - @Override - public void onClose(int closeCode, String message) { - try { - protocolConverter.onStompCommand(new StompFrame(Stomp.Commands.DISCONNECT)); - } catch (Exception e) { - LOG.warn("Failed to close WebSocket", e); - } - } - - @Override - public void onMessage(String data) { - processStompFrame(data); - } -} http://git-wip-us.apache.org/repos/asf/activemq/blob/f44c3d20/activemq-http/src/main/java/org/apache/activemq/transport/ws/jetty8/WSServlet.java ---------------------------------------------------------------------- diff --git a/activemq-http/src/main/java/org/apache/activemq/transport/ws/jetty8/WSServlet.java b/activemq-http/src/main/java/org/apache/activemq/transport/ws/jetty8/WSServlet.java deleted file mode 100644 index 91a4c32..0000000 --- a/activemq-http/src/main/java/org/apache/activemq/transport/ws/jetty8/WSServlet.java +++ /dev/null @@ -1,66 +0,0 @@ -/** - * 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.activemq.transport.ws.jetty8; - -import java.io.IOException; - -import javax.servlet.ServletException; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; - -import org.apache.activemq.transport.Transport; -import org.apache.activemq.transport.TransportAcceptListener; -import org.apache.activemq.transport.util.HttpTransportUtils; -import org.eclipse.jetty.websocket.WebSocket; -import org.eclipse.jetty.websocket.WebSocketServlet; - -/** - * Handle connection upgrade requests and creates web sockets - */ -public class WSServlet extends WebSocketServlet { - - private static final long serialVersionUID = -4716657876092884139L; - - private TransportAcceptListener listener; - - @Override - public void init() throws ServletException { - super.init(); - listener = (TransportAcceptListener) getServletContext().getAttribute("acceptListener"); - if (listener == null) { - throw new ServletException("No such attribute 'acceptListener' available in the ServletContext"); - } - } - - @Override - protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { - getServletContext().getNamedDispatcher("default").forward(request, response); - } - - @Override - public WebSocket doWebSocketConnect(HttpServletRequest request, String protocol) { - WebSocket socket; - - if (protocol != null && protocol.startsWith("mqtt")) { - socket = new MQTTSocket(HttpTransportUtils.generateWsRemoteAddress(request)); - } else { - socket = new StompSocket(HttpTransportUtils.generateWsRemoteAddress(request)); - } - listener.onAccept((Transport) socket); - return socket; - } -} http://git-wip-us.apache.org/repos/asf/activemq/blob/f44c3d20/activemq-http/src/main/java/org/apache/activemq/transport/ws/jetty9/MQTTSocket.java ---------------------------------------------------------------------- diff --git a/activemq-http/src/main/java/org/apache/activemq/transport/ws/jetty9/MQTTSocket.java b/activemq-http/src/main/java/org/apache/activemq/transport/ws/jetty9/MQTTSocket.java index dc49da7..b2dd9be 100644 --- a/activemq-http/src/main/java/org/apache/activemq/transport/ws/jetty9/MQTTSocket.java +++ b/activemq-http/src/main/java/org/apache/activemq/transport/ws/jetty9/MQTTSocket.java @@ -65,6 +65,8 @@ public class MQTTSocket extends AbstractMQTTSocket implements WebSocketListener } } + receiveCounter += length; + try { MQTTFrame frame = (MQTTFrame)wireFormat.unmarshal(new ByteSequence(bytes, offset, length)); getProtocolConverter().onMQTTCommand(frame); http://git-wip-us.apache.org/repos/asf/activemq/blob/f44c3d20/activemq-http/src/main/java/org/apache/activemq/transport/ws/jetty9/WSServlet.java ---------------------------------------------------------------------- diff --git a/activemq-http/src/main/java/org/apache/activemq/transport/ws/jetty9/WSServlet.java b/activemq-http/src/main/java/org/apache/activemq/transport/ws/jetty9/WSServlet.java index 7684318..f84f02c 100644 --- a/activemq-http/src/main/java/org/apache/activemq/transport/ws/jetty9/WSServlet.java +++ b/activemq-http/src/main/java/org/apache/activemq/transport/ws/jetty9/WSServlet.java @@ -62,7 +62,12 @@ public class WSServlet extends WebSocketServlet { @Override public Object createWebSocket(ServletUpgradeRequest req, ServletUpgradeResponse resp) { WebSocketListener socket; - if (req.getSubProtocols().contains("mqtt")) { + boolean isMqtt = false; + for (String subProtocol : req.getSubProtocols()) { + subProtocol.startsWith("mqtt"); + isMqtt = true; + } + if (isMqtt) { socket = new MQTTSocket(HttpTransportUtils.generateWsRemoteAddress(req.getHttpServletRequest())); resp.setAcceptedSubProtocol("mqtt"); } else { http://git-wip-us.apache.org/repos/asf/activemq/blob/f44c3d20/activemq-http/src/test/java/org/apache/activemq/transport/ws/MQTTWSConnection.java ---------------------------------------------------------------------- diff --git a/activemq-http/src/test/java/org/apache/activemq/transport/ws/MQTTWSConnection.java b/activemq-http/src/test/java/org/apache/activemq/transport/ws/MQTTWSConnection.java index 81788b7..30fc0a6 100644 --- a/activemq-http/src/test/java/org/apache/activemq/transport/ws/MQTTWSConnection.java +++ b/activemq-http/src/test/java/org/apache/activemq/transport/ws/MQTTWSConnection.java @@ -17,6 +17,7 @@ package org.apache.activemq.transport.ws; import java.io.IOException; +import java.nio.ByteBuffer; import java.util.UUID; import java.util.concurrent.BlockingQueue; import java.util.concurrent.CountDownLatch; @@ -25,7 +26,9 @@ import java.util.concurrent.TimeUnit; import org.apache.activemq.transport.mqtt.MQTTWireFormat; import org.apache.activemq.util.ByteSequence; -import org.eclipse.jetty.websocket.WebSocket; +import org.eclipse.jetty.websocket.api.Session; +import org.eclipse.jetty.websocket.api.WebSocketAdapter; +import org.eclipse.jetty.websocket.api.WebSocketListener; import org.fusesource.hawtbuf.UTF8Buffer; import org.fusesource.mqtt.codec.CONNACK; import org.fusesource.mqtt.codec.CONNECT; @@ -45,13 +48,13 @@ import org.slf4j.LoggerFactory; /** * Implements a simple WebSocket based MQTT Client that can be used for unit testing. */ -public class MQTTWSConnection implements WebSocket, WebSocket.OnBinaryMessage { +public class MQTTWSConnection extends WebSocketAdapter implements WebSocketListener { private static final Logger LOG = LoggerFactory.getLogger(MQTTWSConnection.class); private static final MQTTFrame PING_RESP_FRAME = new PINGRESP().encode(); - private Connection connection; + private Session connection; private final CountDownLatch connectLatch = new CountDownLatch(1); private final MQTTWireFormat wireFormat = new MQTTWireFormat(); @@ -60,6 +63,7 @@ public class MQTTWSConnection implements WebSocket, WebSocket.OnBinaryMessage { private int closeCode = -1; private String closeMessage; + @Override public boolean isConnected() { return connection != null ? connection.isOpen() : false; } @@ -87,7 +91,7 @@ public class MQTTWSConnection implements WebSocket, WebSocket.OnBinaryMessage { command.keepAlive((short) 0); ByteSequence payload = wireFormat.marshal(command.encode()); - connection.sendMessage(payload.data, 0, payload.length); + connection.getRemote().sendBytes(ByteBuffer.wrap(payload.data)); MQTTFrame incoming = receive(15, TimeUnit.SECONDS); if (incoming == null || incoming.messageType() != CONNACK.TYPE) { @@ -102,7 +106,7 @@ public class MQTTWSConnection implements WebSocket, WebSocket.OnBinaryMessage { DISCONNECT command = new DISCONNECT(); ByteSequence payload = wireFormat.marshal(command.encode()); - connection.sendMessage(payload.data, 0, payload.length); + connection.getRemote().sendBytes(ByteBuffer.wrap(payload.data)); } //---- Send methods ------------------------------------------------------// @@ -110,13 +114,13 @@ public class MQTTWSConnection implements WebSocket, WebSocket.OnBinaryMessage { public void sendFrame(MQTTFrame frame) throws Exception { checkConnected(); ByteSequence payload = wireFormat.marshal(frame); - connection.sendMessage(payload.data, 0, payload.length); + connection.getRemote().sendBytes(ByteBuffer.wrap(payload.data)); } public void keepAlive() throws Exception { checkConnected(); ByteSequence payload = wireFormat.marshal(new PINGREQ().encode()); - connection.sendMessage(payload.data, 0, payload.length); + connection.getRemote().sendBytes(ByteBuffer.wrap(payload.data)); } //----- Receive methods --------------------------------------------------// @@ -159,7 +163,7 @@ public class MQTTWSConnection implements WebSocket, WebSocket.OnBinaryMessage { //----- WebSocket callback handlers --------------------------------------// @Override - public void onMessage(byte[] data, int offset, int length) { + public void onWebSocketBinary(byte[] data, int offset, int length) { if (data ==null || length <= 0) { return; } @@ -228,26 +232,35 @@ public class MQTTWSConnection implements WebSocket, WebSocket.OnBinaryMessage { } } - @Override - public void onOpen(Connection connection) { - this.connection = connection; - this.connectLatch.countDown(); + //----- Internal implementation ------------------------------------------// + + private void checkConnected() throws IOException { + if (!isConnected()) { + throw new IOException("MQTT WS Connection is closed."); + } } + /* (non-Javadoc) + * @see org.eclipse.jetty.websocket.api.WebSocketListener#onWebSocketClose(int, java.lang.String) + */ @Override - public void onClose(int closeCode, String message) { - LOG.trace("MQTT WS Connection closed, code:{} message:{}", closeCode, message); + public void onWebSocketClose(int statusCode, String reason) { + LOG.trace("MQTT WS Connection closed, code:{} message:{}", statusCode, reason); this.connection = null; - this.closeCode = closeCode; - this.closeMessage = message; - } + this.closeCode = statusCode; + this.closeMessage = reason; - //----- Internal implementation ------------------------------------------// + } - private void checkConnected() throws IOException { - if (!isConnected()) { - throw new IOException("MQTT WS Connection is closed."); - } + /* (non-Javadoc) + * @see org.eclipse.jetty.websocket.api.WebSocketListener#onWebSocketConnect(org.eclipse.jetty.websocket.api.Session) + */ + @Override + public void onWebSocketConnect( + org.eclipse.jetty.websocket.api.Session session) { + this.connection = session; + this.connectLatch.countDown(); } + } http://git-wip-us.apache.org/repos/asf/activemq/blob/f44c3d20/activemq-http/src/test/java/org/apache/activemq/transport/ws/MQTTWSConnectionTimeoutTest.java ---------------------------------------------------------------------- diff --git a/activemq-http/src/test/java/org/apache/activemq/transport/ws/MQTTWSConnectionTimeoutTest.java b/activemq-http/src/test/java/org/apache/activemq/transport/ws/MQTTWSConnectionTimeoutTest.java index d587371..745fdcf 100644 --- a/activemq-http/src/test/java/org/apache/activemq/transport/ws/MQTTWSConnectionTimeoutTest.java +++ b/activemq-http/src/test/java/org/apache/activemq/transport/ws/MQTTWSConnectionTimeoutTest.java @@ -23,8 +23,8 @@ import java.util.Vector; import java.util.concurrent.TimeUnit; import org.apache.activemq.util.Wait; -import org.eclipse.jetty.websocket.WebSocketClient; -import org.eclipse.jetty.websocket.WebSocketClientFactory; +import org.eclipse.jetty.websocket.client.ClientUpgradeRequest; +import org.eclipse.jetty.websocket.client.WebSocketClient; import org.junit.Before; import org.junit.Test; @@ -39,15 +39,20 @@ public class MQTTWSConnectionTimeoutTest extends WSTransportTestSupport { @Before public void setUp() throws Exception { super.setUp(); + wsMQTTConnection = new MQTTWSConnection(); - WebSocketClientFactory clientFactory = new WebSocketClientFactory(); - clientFactory.start(); + // WebSocketClientFactory clientFactory = new WebSocketClientFactory(); + //clientFactory.start(); - wsClient = clientFactory.newWebSocketClient(); - wsClient.setProtocol("mqttv3.1"); - wsMQTTConnection = new MQTTWSConnection(); + wsClient = new WebSocketClient(); + wsClient.start(); + + ClientUpgradeRequest request = new ClientUpgradeRequest(); + request.setSubProtocols("mqtt"); + + wsClient.connect(wsMQTTConnection, wsConnectUri, request); + //wsClient.setProtocol("mqttv3.1"); - wsClient.open(wsConnectUri, wsMQTTConnection); if (!wsMQTTConnection.awaitConnection(30, TimeUnit.SECONDS)) { throw new IOException("Could not connect to MQTT WS endpoint"); } http://git-wip-us.apache.org/repos/asf/activemq/blob/f44c3d20/activemq-http/src/test/java/org/apache/activemq/transport/ws/MQTTWSLinkStealingTest.java ---------------------------------------------------------------------- diff --git a/activemq-http/src/test/java/org/apache/activemq/transport/ws/MQTTWSLinkStealingTest.java b/activemq-http/src/test/java/org/apache/activemq/transport/ws/MQTTWSLinkStealingTest.java index 2d94eaa..d5c918d 100644 --- a/activemq-http/src/test/java/org/apache/activemq/transport/ws/MQTTWSLinkStealingTest.java +++ b/activemq-http/src/test/java/org/apache/activemq/transport/ws/MQTTWSLinkStealingTest.java @@ -23,8 +23,8 @@ import java.io.IOException; import java.util.concurrent.TimeUnit; import org.apache.activemq.util.Wait; -import org.eclipse.jetty.websocket.WebSocketClient; -import org.eclipse.jetty.websocket.WebSocketClientFactory; +import org.eclipse.jetty.websocket.client.ClientUpgradeRequest; +import org.eclipse.jetty.websocket.client.WebSocketClient; import org.junit.After; import org.junit.Before; import org.junit.Test; @@ -38,21 +38,22 @@ public class MQTTWSLinkStealingTest extends WSTransportTestSupport { protected WebSocketClient wsClient; protected MQTTWSConnection wsMQTTConnection; + protected ClientUpgradeRequest request; @Override @Before public void setUp() throws Exception { super.setUp(); - WebSocketClientFactory clientFactory = new WebSocketClientFactory(); - clientFactory.start(); + wsMQTTConnection = new MQTTWSConnection(); - wsClient = clientFactory.newWebSocketClient(); - wsClient.setProtocol("mqttv3.1"); + wsClient = new WebSocketClient(); + wsClient.start(); - wsMQTTConnection = new MQTTWSConnection(); + request = new ClientUpgradeRequest(); + request.setSubProtocols("mqttv3.1"); - wsClient.open(wsConnectUri, wsMQTTConnection); + wsClient.connect(wsMQTTConnection, wsConnectUri, request); if (!wsMQTTConnection.awaitConnection(30, TimeUnit.SECONDS)) { throw new IOException("Could not connect to MQTT WS endpoint"); } @@ -83,12 +84,10 @@ public class MQTTWSLinkStealingTest extends WSTransportTestSupport { } })); - WebSocketClientFactory theifFactory = new WebSocketClientFactory(); - theifFactory.start(); MQTTWSConnection theif = new MQTTWSConnection(); - wsClient.open(wsConnectUri, theif); + wsClient.connect(theif, wsConnectUri, request); if (!theif.awaitConnection(30, TimeUnit.SECONDS)) { fail("Could not open new WS connection for link stealing client"); } http://git-wip-us.apache.org/repos/asf/activemq/blob/f44c3d20/activemq-http/src/test/java/org/apache/activemq/transport/ws/MQTTWSTransportTest.java ---------------------------------------------------------------------- diff --git a/activemq-http/src/test/java/org/apache/activemq/transport/ws/MQTTWSTransportTest.java b/activemq-http/src/test/java/org/apache/activemq/transport/ws/MQTTWSTransportTest.java index b62442a..a74a160 100644 --- a/activemq-http/src/test/java/org/apache/activemq/transport/ws/MQTTWSTransportTest.java +++ b/activemq-http/src/test/java/org/apache/activemq/transport/ws/MQTTWSTransportTest.java @@ -25,8 +25,8 @@ import java.util.concurrent.TimeUnit; import java.util.concurrent.atomic.AtomicBoolean; import org.apache.activemq.util.Wait; -import org.eclipse.jetty.websocket.WebSocketClient; -import org.eclipse.jetty.websocket.WebSocketClientFactory; +import org.eclipse.jetty.websocket.client.ClientUpgradeRequest; +import org.eclipse.jetty.websocket.client.WebSocketClient; import org.fusesource.hawtbuf.UTF8Buffer; import org.fusesource.mqtt.codec.CONNACK; import org.fusesource.mqtt.codec.CONNECT; @@ -40,21 +40,22 @@ public class MQTTWSTransportTest extends WSTransportTestSupport { protected WebSocketClient wsClient; protected MQTTWSConnection wsMQTTConnection; + protected ClientUpgradeRequest request; @Override @Before public void setUp() throws Exception { super.setUp(); - WebSocketClientFactory clientFactory = new WebSocketClientFactory(); - clientFactory.start(); + wsClient = new WebSocketClient(); + wsClient.start(); - wsClient = clientFactory.newWebSocketClient(); - wsClient.setProtocol("mqttv3.1"); + request = new ClientUpgradeRequest(); + request.setSubProtocols("mqttv3.1"); wsMQTTConnection = new MQTTWSConnection(); - wsClient.open(wsConnectUri, wsMQTTConnection); + wsClient.connect(wsMQTTConnection, wsConnectUri, request); if (!wsMQTTConnection.awaitConnection(30, TimeUnit.SECONDS)) { throw new IOException("Could not connect to MQTT WS endpoint"); } @@ -79,7 +80,7 @@ public class MQTTWSTransportTest extends WSTransportTestSupport { wsMQTTConnection = new MQTTWSConnection(); - wsClient.open(wsConnectUri, wsMQTTConnection); + wsClient.connect(wsMQTTConnection, wsConnectUri, request); if (!wsMQTTConnection.awaitConnection(30, TimeUnit.SECONDS)) { throw new IOException("Could not connect to MQTT WS endpoint"); } http://git-wip-us.apache.org/repos/asf/activemq/blob/f44c3d20/activemq-http/src/test/java/org/apache/activemq/transport/ws/SocketTest.java ---------------------------------------------------------------------- diff --git a/activemq-http/src/test/java/org/apache/activemq/transport/ws/SocketTest.java b/activemq-http/src/test/java/org/apache/activemq/transport/ws/SocketTest.java index c44d672..8f65384 100644 --- a/activemq-http/src/test/java/org/apache/activemq/transport/ws/SocketTest.java +++ b/activemq-http/src/test/java/org/apache/activemq/transport/ws/SocketTest.java @@ -18,6 +18,8 @@ package org.apache.activemq.transport.ws; import static org.junit.Assert.assertEquals; +import org.apache.activemq.transport.ws.jetty9.MQTTSocket; +import org.apache.activemq.transport.ws.jetty9.StompSocket; import org.junit.Test; public class SocketTest { @@ -25,8 +27,7 @@ public class SocketTest { @Test public void testStompSocketRemoteAddress() { - org.apache.activemq.transport.ws.jetty8.StompSocket stompSocketJetty8 = - new org.apache.activemq.transport.ws.jetty8.StompSocket("ws://localhost:8080"); + StompSocket stompSocketJetty8 = new StompSocket("ws://localhost:8080"); assertEquals("ws://localhost:8080", stompSocketJetty8.getRemoteAddress()); @@ -39,13 +40,11 @@ public class SocketTest { @Test public void testMqttSocketRemoteAddress() { - org.apache.activemq.transport.ws.jetty8.MQTTSocket mqttSocketJetty8 = - new org.apache.activemq.transport.ws.jetty8.MQTTSocket("ws://localhost:8080"); + MQTTSocket mqttSocketJetty8 = new MQTTSocket("ws://localhost:8080"); assertEquals("ws://localhost:8080", mqttSocketJetty8.getRemoteAddress()); - org.apache.activemq.transport.ws.jetty8.MQTTSocket mqttSocketJetty9 = - new org.apache.activemq.transport.ws.jetty8.MQTTSocket("ws://localhost:8080"); + MQTTSocket mqttSocketJetty9 = new MQTTSocket("ws://localhost:8080"); assertEquals("ws://localhost:8080", mqttSocketJetty9.getRemoteAddress()); } http://git-wip-us.apache.org/repos/asf/activemq/blob/f44c3d20/activemq-http/src/test/java/org/apache/activemq/transport/ws/StompWSConnection.java ---------------------------------------------------------------------- diff --git a/activemq-http/src/test/java/org/apache/activemq/transport/ws/StompWSConnection.java b/activemq-http/src/test/java/org/apache/activemq/transport/ws/StompWSConnection.java index 09ec106..8531c73 100644 --- a/activemq-http/src/test/java/org/apache/activemq/transport/ws/StompWSConnection.java +++ b/activemq-http/src/test/java/org/apache/activemq/transport/ws/StompWSConnection.java @@ -23,18 +23,20 @@ import java.util.concurrent.LinkedBlockingDeque; import java.util.concurrent.TimeUnit; import org.apache.activemq.transport.stomp.StompFrame; -import org.eclipse.jetty.websocket.WebSocket; +import org.eclipse.jetty.websocket.api.Session; +import org.eclipse.jetty.websocket.api.WebSocketAdapter; +import org.eclipse.jetty.websocket.api.WebSocketListener; import org.slf4j.Logger; import org.slf4j.LoggerFactory; /** * STOMP over WS based Connection class */ -public class StompWSConnection implements WebSocket, WebSocket.OnTextMessage { +public class StompWSConnection extends WebSocketAdapter implements WebSocketListener { private static final Logger LOG = LoggerFactory.getLogger(StompWSConnection.class); - private Connection connection; + private Session connection; private final CountDownLatch connectLatch = new CountDownLatch(1); private final BlockingQueue<String> prefetch = new LinkedBlockingDeque<String>(); @@ -42,6 +44,7 @@ public class StompWSConnection implements WebSocket, WebSocket.OnTextMessage { private int closeCode = -1; private String closeMessage; + @Override public boolean isConnected() { return connection != null ? connection.isOpen() : false; } @@ -56,17 +59,17 @@ public class StompWSConnection implements WebSocket, WebSocket.OnTextMessage { public void sendRawFrame(String rawFrame) throws Exception { checkConnected(); - connection.sendMessage(rawFrame); + connection.getRemote().sendString(rawFrame); } public void sendFrame(StompFrame frame) throws Exception { checkConnected(); - connection.sendMessage(frame.format()); + connection.getRemote().sendString(frame.format()); } public void keepAlive() throws Exception { checkConnected(); - connection.sendMessage("\n"); + connection.getRemote().sendString("\n"); } //----- Receive methods --------------------------------------------------// @@ -109,7 +112,7 @@ public class StompWSConnection implements WebSocket, WebSocket.OnTextMessage { //----- WebSocket callback handlers --------------------------------------// @Override - public void onMessage(String data) { + public void onWebSocketText(String data) { if (data == null) { return; } @@ -122,19 +125,28 @@ public class StompWSConnection implements WebSocket, WebSocket.OnTextMessage { } } - @Override - public void onOpen(Connection connection) { - this.connection = connection; - this.connectLatch.countDown(); - } + /* (non-Javadoc) + * @see org.eclipse.jetty.websocket.api.WebSocketListener#onWebSocketClose(int, java.lang.String) + */ @Override - public void onClose(int closeCode, String message) { - LOG.trace("STOMP WS Connection closed, code:{} message:{}", closeCode, message); + public void onWebSocketClose(int statusCode, String reason) { + LOG.trace("STOMP WS Connection closed, code:{} message:{}", statusCode, reason); this.connection = null; - this.closeCode = closeCode; - this.closeMessage = message; + this.closeCode = statusCode; + this.closeMessage = reason; + + } + + /* (non-Javadoc) + * @see org.eclipse.jetty.websocket.api.WebSocketListener#onWebSocketConnect(org.eclipse.jetty.websocket.api.Session) + */ + @Override + public void onWebSocketConnect( + org.eclipse.jetty.websocket.api.Session session) { + this.connection = session; + this.connectLatch.countDown(); } //----- Internal implementation ------------------------------------------// http://git-wip-us.apache.org/repos/asf/activemq/blob/f44c3d20/activemq-http/src/test/java/org/apache/activemq/transport/ws/StompWSConnectionTimeoutTest.java ---------------------------------------------------------------------- diff --git a/activemq-http/src/test/java/org/apache/activemq/transport/ws/StompWSConnectionTimeoutTest.java b/activemq-http/src/test/java/org/apache/activemq/transport/ws/StompWSConnectionTimeoutTest.java index b0ca372..83cbd69 100644 --- a/activemq-http/src/test/java/org/apache/activemq/transport/ws/StompWSConnectionTimeoutTest.java +++ b/activemq-http/src/test/java/org/apache/activemq/transport/ws/StompWSConnectionTimeoutTest.java @@ -23,8 +23,7 @@ import java.util.Vector; import java.util.concurrent.TimeUnit; import org.apache.activemq.util.Wait; -import org.eclipse.jetty.websocket.WebSocketClient; -import org.eclipse.jetty.websocket.WebSocketClientFactory; +import org.eclipse.jetty.websocket.client.WebSocketClient; import org.junit.Before; import org.junit.Test; @@ -42,14 +41,16 @@ public class StompWSConnectionTimeoutTest extends WSTransportTestSupport { @Before public void setUp() throws Exception { super.setUp(); + wsStompConnection = new StompWSConnection(); + +// WebSocketClientFactory clientFactory = new WebSocketClientFactory(); +// clientFactory.start(); + wsClient = new WebSocketClient(); + wsClient.start(); - WebSocketClientFactory clientFactory = new WebSocketClientFactory(); - clientFactory.start(); - wsClient = clientFactory.newWebSocketClient(); - wsStompConnection = new StompWSConnection(); - wsClient.open(wsConnectUri, wsStompConnection); + wsClient.connect(wsStompConnection, wsConnectUri); if (!wsStompConnection.awaitConnection(30, TimeUnit.SECONDS)) { throw new IOException("Could not connect to STOMP WS endpoint"); } http://git-wip-us.apache.org/repos/asf/activemq/blob/f44c3d20/activemq-http/src/test/java/org/apache/activemq/transport/ws/StompWSTransportTest.java ---------------------------------------------------------------------- diff --git a/activemq-http/src/test/java/org/apache/activemq/transport/ws/StompWSTransportTest.java b/activemq-http/src/test/java/org/apache/activemq/transport/ws/StompWSTransportTest.java index c6bfdd4..45bfa7f 100644 --- a/activemq-http/src/test/java/org/apache/activemq/transport/ws/StompWSTransportTest.java +++ b/activemq-http/src/test/java/org/apache/activemq/transport/ws/StompWSTransportTest.java @@ -27,8 +27,7 @@ import java.util.concurrent.TimeUnit; import org.apache.activemq.transport.stomp.Stomp; import org.apache.activemq.transport.stomp.StompFrame; import org.apache.activemq.util.Wait; -import org.eclipse.jetty.websocket.WebSocketClient; -import org.eclipse.jetty.websocket.WebSocketClientFactory; +import org.eclipse.jetty.websocket.client.WebSocketClient; import org.junit.After; import org.junit.Before; import org.junit.Test; @@ -49,14 +48,12 @@ public class StompWSTransportTest extends WSTransportTestSupport { @Before public void setUp() throws Exception { super.setUp(); - - WebSocketClientFactory clientFactory = new WebSocketClientFactory(); - clientFactory.start(); - - wsClient = clientFactory.newWebSocketClient(); wsStompConnection = new StompWSConnection(); - wsClient.open(wsConnectUri, wsStompConnection); + wsClient = new WebSocketClient(); + wsClient.start(); + + wsClient.connect(wsStompConnection, wsConnectUri); if (!wsStompConnection.awaitConnection(30, TimeUnit.SECONDS)) { throw new IOException("Could not connect to STOMP WS endpoint"); } http://git-wip-us.apache.org/repos/asf/activemq/blob/f44c3d20/activemq-http/src/test/java/org/apache/activemq/transport/ws/WSTransportTest.java ---------------------------------------------------------------------- diff --git a/activemq-http/src/test/java/org/apache/activemq/transport/ws/WSTransportTest.java b/activemq-http/src/test/java/org/apache/activemq/transport/ws/WSTransportTest.java index 546209e..f9fe74d 100644 --- a/activemq-http/src/test/java/org/apache/activemq/transport/ws/WSTransportTest.java +++ b/activemq-http/src/test/java/org/apache/activemq/transport/ws/WSTransportTest.java @@ -74,9 +74,6 @@ public class WSTransportTest extends WSTransportTestSupport { Server server = new Server(); Connector connector = createJettyConnector(server); - if (Server.getVersion().startsWith("8")) { - connector.setServer(server); - } WebAppContext context = new WebAppContext(); context.setResourceBase("src/test/webapp"); http://git-wip-us.apache.org/repos/asf/activemq/blob/f44c3d20/activemq-http/src/test/java/org/apache/activemq/transport/ws/WSTransportTestSupport.java ---------------------------------------------------------------------- diff --git a/activemq-http/src/test/java/org/apache/activemq/transport/ws/WSTransportTestSupport.java b/activemq-http/src/test/java/org/apache/activemq/transport/ws/WSTransportTestSupport.java index c745221..edf7b6c 100644 --- a/activemq-http/src/test/java/org/apache/activemq/transport/ws/WSTransportTestSupport.java +++ b/activemq-http/src/test/java/org/apache/activemq/transport/ws/WSTransportTestSupport.java @@ -69,11 +69,18 @@ public class WSTransportTestSupport { LOG.info("========== Finished test: {} ==========", name.getMethodName()); } +// protected String getWSConnectorURI() { +// return "ws://127.0.0.1:" + getProxyPort() + +// "?allowLinkStealing=" + isAllowLinkStealing() + +// "&websocket.maxTextMessageSize=99999&" + +// "transport.maxIdleTime=1001"; +// } + protected String getWSConnectorURI() { return "ws://127.0.0.1:" + getProxyPort() + "?allowLinkStealing=" + isAllowLinkStealing() + "&websocket.maxTextMessageSize=99999&" + - "transport.maxIdleTime=1001"; + "transport.idleTimeout=1001"; } protected boolean isAllowLinkStealing() { http://git-wip-us.apache.org/repos/asf/activemq/blob/f44c3d20/activemq-http/src/test/java/org/apache/activemq/transport/wss/WSSTransportTest.java ---------------------------------------------------------------------- diff --git a/activemq-http/src/test/java/org/apache/activemq/transport/wss/WSSTransportTest.java b/activemq-http/src/test/java/org/apache/activemq/transport/wss/WSSTransportTest.java index 36b33f6..6af0f4e 100644 --- a/activemq-http/src/test/java/org/apache/activemq/transport/wss/WSSTransportTest.java +++ b/activemq-http/src/test/java/org/apache/activemq/transport/wss/WSSTransportTest.java @@ -20,6 +20,7 @@ import org.apache.activemq.transport.SecureSocketConnectorFactory; import org.apache.activemq.transport.ws.WSTransportTest; import org.eclipse.jetty.server.Connector; import org.eclipse.jetty.server.Server; +import org.eclipse.jetty.server.ServerConnector; public class WSSTransportTest extends WSTransportTest { @Override @@ -29,9 +30,9 @@ public class WSSTransportTest extends WSTransportTest { sscf.setKeyStorePassword("password"); sscf.setTrustStore("src/test/resources/client.keystore"); sscf.setTrustStorePassword("password"); - - Connector c = sscf.createConnector(server); - c.getClass().getMethod("setPort", Integer.TYPE).invoke(c, getProxyPort()); + + ServerConnector c = (ServerConnector) sscf.createConnector(server); + c.setPort(getProxyPort()); return c; } http://git-wip-us.apache.org/repos/asf/activemq/blob/f44c3d20/activemq-http/src/webapp/WEB-INF/web.xml ---------------------------------------------------------------------- diff --git a/activemq-http/src/webapp/WEB-INF/web.xml b/activemq-http/src/webapp/WEB-INF/web.xml index 2ae5ca6..779410e 100755 --- a/activemq-http/src/webapp/WEB-INF/web.xml +++ b/activemq-http/src/webapp/WEB-INF/web.xml @@ -16,11 +16,10 @@ limitations under the License. --> -<!DOCTYPE web-app - PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" - "http://java.sun.com/dtd/web-app_2_3.dtd"> - -<web-app> +<web-app xmlns="http://java.sun.com/xml/ns/javaee" + xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" + version="3.0"> <display-name>ActiveMQ Message Broker Web Application</display-name> <description> @@ -29,9 +28,9 @@ <!-- context config --> <context-param> + <description>The URL that the embedded broker should listen on in addition to HTTP</description> <param-name>org.apache.activemq.brokerURL</param-name> - <param-value>tcp://localhost:61616</param-value> - <description>The URL that the embedded broker should listen on in addition to HTTP</description> + <param-value>tcp://localhost:61616</param-value> </context-param> http://git-wip-us.apache.org/repos/asf/activemq/blob/f44c3d20/activemq-osgi/pom.xml ---------------------------------------------------------------------- diff --git a/activemq-osgi/pom.xml b/activemq-osgi/pom.xml index 92cd330..a583717 100644 --- a/activemq-osgi/pom.xml +++ b/activemq-osgi/pom.xml @@ -52,7 +52,7 @@ com.fasterxml.jackson*;resolution:=optional, org.codehaus.jettison*;resolution:=optional, org.jasypt*;resolution:=optional, - org.eclipse.jetty*;resolution:=optional;version="[8.1,10)", + org.eclipse.jetty*;resolution:=optional;version="[9.0,10)", org.apache.zookeeper*;resolution:=optional, org.fusesource.leveldbjni*;resolution:=optional, org.fusesource.hawtjni*;resolution:=optional, http://git-wip-us.apache.org/repos/asf/activemq/blob/f44c3d20/activemq-web-console/pom.xml ---------------------------------------------------------------------- diff --git a/activemq-web-console/pom.xml b/activemq-web-console/pom.xml index 1dd2250..fde16e4 100755 --- a/activemq-web-console/pom.xml +++ b/activemq-web-console/pom.xml @@ -32,7 +32,7 @@ <properties> <jetty.port>8080</jetty.port> - <jetty.maven.groupid>org.mortbay.jetty</jetty.maven.groupid> + <jetty.maven.groupid>org.eclipse.jetty</jetty.maven.groupid> </properties> <build> @@ -57,7 +57,7 @@ <version>${jetty-version}</version> <configuration> <connectors> - <connector implementation="org.eclipse.jetty.server.nio.SelectChannelConnector"> + <connector implementation="org.eclipse.jetty.server.ServerConnector"> <port>${jetty.port}</port> <maxIdleTime>60000</maxIdleTime> </connector> @@ -158,7 +158,7 @@ org.slf4j.spi;version="[1.6,2)";resolution:=optional, org.apache.log4j;version="[1.2.14,2)";resolution:=optional, org.apache.log4j.spi;version="[1.2.14,2)";resolution:=optional, - org.eclipse.jetty*;resolution:=optional;version="[8.1,10)" + org.eclipse.jetty*;resolution:=optional;version="[9.0,10)" </Import-Package> </instructions> </configuration> @@ -167,18 +167,17 @@ </build> <dependencies> - <dependency> - <groupId>org.apache.geronimo.specs</groupId> - <artifactId>geronimo-servlet_3.0_spec</artifactId> + <groupId>org.apache.tomcat</groupId> + <artifactId>tomcat-servlet-api</artifactId> <scope>provided</scope> </dependency> <dependency> - <groupId>org.apache.geronimo.specs</groupId> - <artifactId>geronimo-jsp_2.1_spec</artifactId> - <scope>provided</scope> + <groupId>org.apache.tomcat</groupId> + <artifactId>tomcat-websocket-api</artifactId> + <scope>provided</scope> </dependency> - + <!-- j2ee jars --> <dependency> <groupId>org.apache.geronimo.specs</groupId> @@ -207,8 +206,8 @@ <artifactId>activemq-all</artifactId> </exclusion> <exclusion> - <groupId>org.eclipse.jetty</groupId> - <artifactId>jetty-websocket</artifactId> + <groupId>org.eclipse.jetty.websocket</groupId> + <artifactId>websocket-server</artifactId> </exclusion> <exclusion> <groupId>org.eclipse.jetty</groupId> @@ -247,10 +246,10 @@ <artifactId>jetty-all</artifactId> <scope>test</scope> </dependency> - <dependency> - <groupId>org.eclipse.jdt</groupId> - <artifactId>core</artifactId> - <version>3.1.1</version> + <dependency> + <groupId>org.eclipse.jetty.orbit</groupId> + <artifactId>org.eclipse.jdt.core</artifactId> + <version>3.8.2.v20130121</version> <scope>test</scope> </dependency> <dependency> @@ -267,15 +266,13 @@ </dependency> <!-- JSTL support --> + <dependency> - <groupId>javax.servlet</groupId> - <artifactId>jstl</artifactId> - </dependency> - <dependency> - <groupId>taglibs</groupId> - <artifactId>standard</artifactId> + <groupId>org.eclipse.jetty</groupId> + <artifactId>apache-jstl</artifactId> + <scope>provided</scope> </dependency> - + <!-- used for testing --> <dependency> <groupId>junit</groupId> @@ -284,6 +281,41 @@ </dependency> <dependency> + <groupId>${project.groupId}</groupId> + <artifactId>activemq-unit-tests</artifactId> + <scope>test</scope> + <type>test-jar</type> + </dependency> + <dependency> + <groupId>${project.groupId}</groupId> + <artifactId>activemq-broker</artifactId> + <type>test-jar</type> + <scope>test</scope> + </dependency> + + <dependency> + <groupId>org.eclipse.jetty</groupId> + <artifactId>apache-jsp</artifactId> + <scope>provided</scope> + <exclusions> + <exclusion> + <groupId>javax.servlet</groupId> + <artifactId>javax.servlet-api</artifactId> + </exclusion> + </exclusions> + </dependency> + + <dependency> + <groupId>org.apache.geronimo.specs</groupId> + <artifactId>geronimo-annotation_1.0_spec</artifactId> + </dependency> + + + <dependency> + <groupId>org.ow2.asm</groupId> + <artifactId>asm</artifactId> + </dependency> + <dependency> <groupId>org.osgi</groupId> <artifactId>org.osgi.core</artifactId> <scope>provided</scope> http://git-wip-us.apache.org/repos/asf/activemq/blob/f44c3d20/activemq-web-console/src/main/webapp/WEB-INF/activemq.xml ---------------------------------------------------------------------- diff --git a/activemq-web-console/src/main/webapp/WEB-INF/activemq.xml b/activemq-web-console/src/main/webapp/WEB-INF/activemq.xml index 7203bef..c7ed77f 100755 --- a/activemq-web-console/src/main/webapp/WEB-INF/activemq.xml +++ b/activemq-web-console/src/main/webapp/WEB-INF/activemq.xml @@ -30,7 +30,7 @@ <broker brokerName="web-console" useJmx="true" xmlns="http://activemq.apache.org/schema/core"> <persistenceAdapter> - <kahaDB directory="${activemq.data}/kahadb"/> + <kahaDB directory="target/kahadb"/> </persistenceAdapter> <transportConnectors> http://git-wip-us.apache.org/repos/asf/activemq/blob/f44c3d20/activemq-web-console/src/main/webapp/WEB-INF/web.xml ---------------------------------------------------------------------- diff --git a/activemq-web-console/src/main/webapp/WEB-INF/web.xml b/activemq-web-console/src/main/webapp/WEB-INF/web.xml index d647002..962713e 100755 --- a/activemq-web-console/src/main/webapp/WEB-INF/web.xml +++ b/activemq-web-console/src/main/webapp/WEB-INF/web.xml @@ -16,11 +16,10 @@ limitations under the License. --> -<web-app xmlns="http://java.sun.com/xml/ns/j2ee" - xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" - xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee - http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd" - version="2.4"> +<web-app xmlns="http://java.sun.com/xml/ns/javaee" + xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" + version="3.0"> <description> Apache ActiveMQ Web Console http://git-wip-us.apache.org/repos/asf/activemq/blob/f44c3d20/activemq-web-console/src/test/java/org/apache/activemq/web/tool/Main.java ---------------------------------------------------------------------- diff --git a/activemq-web-console/src/test/java/org/apache/activemq/web/tool/Main.java b/activemq-web-console/src/test/java/org/apache/activemq/web/tool/Main.java index ab9d482..2c8fb48 100644 --- a/activemq-web-console/src/test/java/org/apache/activemq/web/tool/Main.java +++ b/activemq-web-console/src/test/java/org/apache/activemq/web/tool/Main.java @@ -17,15 +17,16 @@ package org.apache.activemq.web.tool; -import org.eclipse.jetty.server.Connector; +import org.apache.activemq.web.config.JspConfigurer; import org.eclipse.jetty.server.Server; +import org.eclipse.jetty.server.handler.ContextHandlerCollection; import org.eclipse.jetty.webapp.WebAppContext; /** * A simple bootstrap class for starting Jetty in your IDE using the local web * application. - * - * + * + * */ public final class Main { @@ -45,6 +46,8 @@ public final class Main { String text = args[0]; port = Integer.parseInt(text); } + + System.setProperty("activemq.conf", "/home/clshann/dev/git/apache-activemq/assembly/target/apache-activemq-5.13-SNAPSHOT/conf"); System.out.println("Starting Web Server on port: " + port); System.setProperty("jetty.port", "" + port); Server server = new Server(port); @@ -54,11 +57,16 @@ public final class Main { //System.setProperty("webconsole.jmx.url","service:jmx:rmi:///jndi/rmi://localhost:1099/karaf-root"); WebAppContext context = new WebAppContext(); + ContextHandlerCollection handlers = new ContextHandlerCollection(); + handlers.setHandlers(new WebAppContext[] {context}); + + JspConfigurer.configureJetty(server, handlers); + context.setResourceBase(WEBAPP_DIR); context.setContextPath(WEBAPP_CTX); context.setServer(server); - server.setHandler(context); + server.setHandler(handlers); server.start(); System.out.println(); @@ -67,4 +75,6 @@ public final class Main { System.out.println("=============================================================================="); System.out.println(); } + + } http://git-wip-us.apache.org/repos/asf/activemq/blob/f44c3d20/activemq-web-demo/pom.xml ---------------------------------------------------------------------- diff --git a/activemq-web-demo/pom.xml b/activemq-web-demo/pom.xml index 58aa3b1..29562b0 100755 --- a/activemq-web-demo/pom.xml +++ b/activemq-web-demo/pom.xml @@ -33,12 +33,11 @@ <build> <plugins> <plugin> - <groupId>org.mortbay.jetty</groupId> + <groupId>org.eclipse.jetty</groupId> <artifactId>jetty-maven-plugin</artifactId> - <version>${jetty-version}</version> <configuration> <connectors> - <connector implementation="org.eclipse.jetty.server.nio.SelectChannelConnector"> + <connector implementation="org.eclipse.jetty.server.ServerConnector"> <port>${jetty.port}</port> <maxIdleTime>60000</maxIdleTime> </connector> http://git-wip-us.apache.org/repos/asf/activemq/blob/f44c3d20/activemq-web-demo/src/main/webapp/WEB-INF/web.xml ---------------------------------------------------------------------- diff --git a/activemq-web-demo/src/main/webapp/WEB-INF/web.xml b/activemq-web-demo/src/main/webapp/WEB-INF/web.xml index 742604a..cd39366 100755 --- a/activemq-web-demo/src/main/webapp/WEB-INF/web.xml +++ b/activemq-web-demo/src/main/webapp/WEB-INF/web.xml @@ -15,25 +15,25 @@ See the License for the specific language governing permissions and limitations under the License. --> -<!DOCTYPE web-app - PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" - "http://java.sun.com/dtd/web-app_2_3.dtd"> - -<web-app> +<web-app xmlns="http://java.sun.com/xml/ns/javaee" + xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" + version="3.0"> <display-name>Apache ActiveMQ Web Demo</display-name> <!-- context config --> <context-param> + <description>Whether we should include an embedded broker or not</description> <param-name>org.apache.activemq.embeddedBroker</param-name> - <param-value>true</param-value> - <description>Whether we should include an embedded broker or not</description> + <param-value>true</param-value> </context-param> <!-- filters --> <filter> <filter-name>session</filter-name> <filter-class>org.apache.activemq.web.SessionFilter</filter-class> + <async-supported>true</async-supported> </filter> <filter-mapping> <filter-name>session</filter-name> @@ -52,12 +52,14 @@ <servlet-name>AjaxServlet</servlet-name> <servlet-class>org.apache.activemq.web.AjaxServlet</servlet-class> <load-on-startup>1</load-on-startup> + <async-supported>true</async-supported> </servlet> <servlet> <servlet-name>MessageServlet</servlet-name> <servlet-class>org.apache.activemq.web.MessageServlet</servlet-class> <load-on-startup>1</load-on-startup> + <async-supported>true</async-supported> <!-- Uncomment this parameter if you plan to use multiple consumers over REST <init-param> @@ -71,6 +73,7 @@ <servlet> <servlet-name>QueueBrowseServlet</servlet-name> <servlet-class>org.apache.activemq.web.QueueBrowseServlet</servlet-class> + <async-supported>true</async-supported> </servlet> <!-- servlets for the portfolio demo --> @@ -78,6 +81,7 @@ <servlet-name>PortfolioPublishServlet</servlet-name> <servlet-class>org.apache.activemq.web.PortfolioPublishServlet</servlet-class> <load-on-startup>1</load-on-startup> + <async-supported>true</async-supported> </servlet> <!-- servlet mappings -->