diff --git a/activemq-amqp/pom.xml b/activemq-amqp/pom.xml
index 4a181a35ae2..5a982d80b0b 100644
--- a/activemq-amqp/pom.xml
+++ b/activemq-amqp/pom.xml
@@ -114,7 +114,7 @@
org.eclipse.jetty.websocket
- websocket-jetty-server
+ jetty-websocket-jetty-server
test
diff --git a/activemq-http/pom.xml b/activemq-http/pom.xml
index 3bd6faaffe2..54024d5e85f 100644
--- a/activemq-http/pom.xml
+++ b/activemq-http/pom.xml
@@ -65,8 +65,8 @@
jetty-xml
- org.eclipse.jetty
- jetty-webapp
+ org.eclipse.jetty.ee9
+ jetty-ee9-webapp
org.apache.httpcomponents
@@ -115,13 +115,37 @@
org.eclipse.jetty.websocket
- websocket-jetty-client
+ jetty-websocket-core-client
+ provided
+ true
+
+
+ org.eclipse.jetty.websocket
+ jetty-websocket-core-server
provided
true
+
+ org.eclipse.jetty.websocket
+ jetty-websocket-jetty-client
+ provided
+ true
+
org.eclipse.jetty.websocket
- websocket-jetty-server
+ jetty-websocket-jetty-api
+ provided
+ true
+
+
+ org.eclipse.jetty.ee9.websocket
+ jetty-ee9-websocket-jakarta-client
+ provided
+ true
+
+
+ org.eclipse.jetty.ee9.websocket
+ jetty-ee9-websocket-jetty-server
provided
true
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 3cfeda36acb..8ba1c5703e6 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
@@ -21,15 +21,14 @@
import java.net.URI;
import java.util.Map;
-import org.apache.activemq.transport.http.BlockingQueueTransport;
import org.apache.activemq.util.InetAddressUtil;
import org.apache.activemq.util.IntrospectionSupport;
-import org.eclipse.jetty.security.ConstraintMapping;
-import org.eclipse.jetty.security.ConstraintSecurityHandler;
+import org.eclipse.jetty.ee9.nested.ServletConstraint;
+import org.eclipse.jetty.ee9.security.ConstraintMapping;
+import org.eclipse.jetty.ee9.security.ConstraintSecurityHandler;
import org.eclipse.jetty.server.Connector;
import org.eclipse.jetty.server.Server;
-import org.eclipse.jetty.util.resource.Resource;
-import org.eclipse.jetty.util.security.Constraint;
+import org.eclipse.jetty.util.resource.ResourceFactory;
import org.eclipse.jetty.xml.XmlConfiguration;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -57,13 +56,13 @@ private void setConnectorProperty(String name, Class type, T value) throw
protected void createServer() {
LOG.info("Starting Jetty server");
if (jettyOptions.getConfig() != null) {
- try {
+ try (ResourceFactory.Closeable resourceFactory = ResourceFactory.closeable()) {
LOG.info("Configuring Jetty server using {}", jettyOptions.getConfig());
File file = new File(jettyOptions.getConfig());
if (!file.exists()) {
throw new IllegalArgumentException("Jetty XML not found: " + file.getAbsolutePath());
}
- XmlConfiguration xmlConfiguration = new XmlConfiguration(Resource.newResource(file));
+ XmlConfiguration xmlConfiguration = new XmlConfiguration(resourceFactory.newResource(file.getPath()));
server = (Server) xmlConfiguration.configure();
} catch (Throwable t) {
throw new IllegalStateException("Jetty configuration can't be loaded", t);
@@ -111,12 +110,17 @@ public URI bind() throws Exception {
protected void configureTraceMethod(ConstraintSecurityHandler securityHandler,
boolean enableTrace) {
- Constraint constraint = new Constraint();
- constraint.setName("trace-security");
+
+ ServletConstraint servletConstraint;
//If enableTrace is true, then we want to set authenticate to false to allow it
- constraint.setAuthenticate(!enableTrace);
+ if(enableTrace) {
+ servletConstraint = new ServletConstraint("trace-security", ServletConstraint.ANY_AUTH);
+ } else {
+ servletConstraint = new ServletConstraint("trace-security", ServletConstraint.ANY_ROLE);
+ }
+
ConstraintMapping mapping = new ConstraintMapping();
- mapping.setConstraint(constraint);
+ mapping.setConstraint(servletConstraint);
mapping.setMethod("TRACE");
mapping.setPathSpec("/");
securityHandler.addConstraintMapping(mapping);
diff --git a/activemq-http/src/main/java/org/apache/activemq/transport/discovery/http/EmbeddedJettyServer.java b/activemq-http/src/main/java/org/apache/activemq/transport/discovery/http/EmbeddedJettyServer.java
index 786e3aac8d9..0c996292cf6 100644
--- a/activemq-http/src/main/java/org/apache/activemq/transport/discovery/http/EmbeddedJettyServer.java
+++ b/activemq-http/src/main/java/org/apache/activemq/transport/discovery/http/EmbeddedJettyServer.java
@@ -19,8 +19,8 @@
import java.net.URI;
import org.eclipse.jetty.server.Server;
-import org.eclipse.jetty.servlet.ServletContextHandler;
-import org.eclipse.jetty.servlet.ServletHolder;
+import org.eclipse.jetty.ee9.servlet.ServletContextHandler;
+import org.eclipse.jetty.ee9.servlet.ServletHolder;
public class EmbeddedJettyServer implements org.apache.activemq.Service {
diff --git a/activemq-http/src/main/java/org/apache/activemq/transport/http/HttpTransportServer.java b/activemq-http/src/main/java/org/apache/activemq/transport/http/HttpTransportServer.java
index 5b21f0a9cce..4b354ceb76e 100644
--- a/activemq-http/src/main/java/org/apache/activemq/transport/http/HttpTransportServer.java
+++ b/activemq-http/src/main/java/org/apache/activemq/transport/http/HttpTransportServer.java
@@ -27,14 +27,15 @@
import org.apache.activemq.transport.util.TextWireFormat;
import org.apache.activemq.transport.xstream.XStreamWireFormat;
import org.apache.activemq.util.ServiceStopper;
-import org.eclipse.jetty.security.ConstraintSecurityHandler;
+import org.eclipse.jetty.ee9.security.ConstraintSecurityHandler;
import org.eclipse.jetty.server.ConnectionFactory;
import org.eclipse.jetty.server.Connector;
+import org.eclipse.jetty.server.Handler;
import org.eclipse.jetty.server.HttpConnectionFactory;
import org.eclipse.jetty.server.Server;
-import org.eclipse.jetty.server.handler.HandlerWrapper;
-import org.eclipse.jetty.servlet.ServletContextHandler;
-import org.eclipse.jetty.servlet.ServletHolder;
+import org.eclipse.jetty.server.Handler.Wrapper;
+import org.eclipse.jetty.ee9.servlet.ServletContextHandler;
+import org.eclipse.jetty.ee9.servlet.ServletHolder;
public class HttpTransportServer extends WebTransportServerSupport {
@@ -135,11 +136,11 @@ private int getConnectorLocalPort() throws Exception {
}
private void addGzipHandler(ServletContextHandler contextHandler) throws Exception {
- HandlerWrapper handler = null;
+ Handler.Wrapper handler = null;
try {
- handler = (HandlerWrapper) forName("org.eclipse.jetty.servlets.gzip.GzipHandler").getConstructor().newInstance();
+ handler = (Handler.Wrapper) forName("org.eclipse.jetty.servlets.gzip.GzipHandler").getConstructor().newInstance();
} catch (Throwable t) {
- handler = (HandlerWrapper) forName("org.eclipse.jetty.server.handler.gzip.GzipHandler").getConstructor().newInstance();
+ handler = (Handler.Wrapper) forName("org.eclipse.jetty.server.handler.gzip.GzipHandler").getConstructor().newInstance();
}
contextHandler.insertHandler(handler);
}
diff --git a/activemq-http/src/main/java/org/apache/activemq/transport/ws/StompWSConnection.java b/activemq-http/src/main/java/org/apache/activemq/transport/ws/StompWSConnection.java
index 8c0fccb1cc8..10c0603540c 100644
--- a/activemq-http/src/main/java/org/apache/activemq/transport/ws/StompWSConnection.java
+++ b/activemq-http/src/main/java/org/apache/activemq/transport/ws/StompWSConnection.java
@@ -26,19 +26,16 @@
import org.apache.activemq.transport.stomp.StompFrame;
import org.apache.activemq.transport.stomp.StompWireFormat;
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 extends WebSocketAdapter implements WebSocketListener {
+public class StompWSConnection extends org.eclipse.jetty.websocket.api.Session.Listener.AbstractAutoDemanding implements Session.Listener.AutoDemanding {
private static final Logger LOG = LoggerFactory.getLogger(StompWSConnection.class);
- private Session connection;
private final CountDownLatch connectLatch = new CountDownLatch(1);
private final BlockingQueue prefetch = new LinkedBlockingDeque();
@@ -47,36 +44,37 @@ public class StompWSConnection extends WebSocketAdapter implements WebSocketList
private int closeCode = -1;
private String closeMessage;
- @Override
public boolean isConnected() {
- return connection != null ? connection.isOpen() : false;
+ Session session = getSession();
+ return session != null && session.isOpen();
}
public void close() {
- if (connection != null) {
- connection.close();
+ Session session = getSession();
+ if (session != null) {
+ session.close();
}
}
protected Session getConnection() {
- return connection;
+ return getSession();
}
//---- Send methods ------------------------------------------------------//
public synchronized void sendRawFrame(String rawFrame) throws Exception {
checkConnected();
- connection.getRemote().sendString(rawFrame);
+ getSession().sendText(rawFrame, null);
}
public synchronized void sendFrame(StompFrame frame) throws Exception {
checkConnected();
- connection.getRemote().sendString(wireFormat.marshalToString(frame));
+ getSession().sendText(wireFormat.marshalToString(frame), null);
}
public synchronized void keepAlive() throws Exception {
checkConnected();
- connection.getRemote().sendString("\n");
+ getSession().sendText("\n", null);
}
//----- Receive methods --------------------------------------------------//
@@ -136,22 +134,21 @@ public void onWebSocketText(String data) {
public void onWebSocketClose(int statusCode, String reason) {
LOG.trace("STOMP WS Connection closed, code:{} message:{}", statusCode, reason);
- this.connection = null;
this.closeCode = statusCode;
this.closeMessage = reason;
}
@Override
- public void onWebSocketConnect(org.eclipse.jetty.websocket.api.Session session) {
- this.connection = session;
- this.connection.setIdleTimeout(Duration.ZERO);
+ public void onWebSocketOpen(Session session) {
+ super.onWebSocketOpen(session);
+ session.setIdleTimeout(Duration.ZERO);
this.connectLatch.countDown();
}
//----- Internal implementation ------------------------------------------//
private void checkConnected() throws IOException {
- if (!isConnected()) {
+ if (!isOpen()) {
throw new IOException("STOMP WS Connection is closed.");
}
}
diff --git a/activemq-http/src/main/java/org/apache/activemq/transport/ws/WSTransportProxy.java b/activemq-http/src/main/java/org/apache/activemq/transport/ws/WSTransportProxy.java
index a8242d4eddd..dde57bbaf36 100644
--- a/activemq-http/src/main/java/org/apache/activemq/transport/ws/WSTransportProxy.java
+++ b/activemq-http/src/main/java/org/apache/activemq/transport/ws/WSTransportProxy.java
@@ -34,8 +34,8 @@
import org.apache.activemq.util.IntrospectionSupport;
import org.apache.activemq.util.ServiceStopper;
import org.apache.activemq.wireformat.WireFormat;
-import org.eclipse.jetty.websocket.api.Session;
-import org.eclipse.jetty.websocket.api.WebSocketListener;
+import org.eclipse.jetty.ee9.websocket.api.Session;
+import org.eclipse.jetty.ee9.websocket.api.WebSocketListener;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -222,8 +222,8 @@ public void onWebSocketConnect(Session session) {
this.session.setIdleTimeout(Duration.ZERO);
if (wsTransport.getMaxFrameSize() > 0) {
- this.session.getPolicy().setMaxBinaryMessageSize(wsTransport.getMaxFrameSize());
- this.session.getPolicy().setMaxTextMessageSize(wsTransport.getMaxFrameSize());
+ this.session.setMaxBinaryMessageSize(wsTransport.getMaxFrameSize());
+ this.session.setMaxTextMessageSize(wsTransport.getMaxFrameSize());
}
}
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 75cf1fd56cc..4c7357a711b 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
@@ -21,24 +21,22 @@
import java.net.URI;
import java.util.Map;
-import jakarta.servlet.Servlet;
-
import org.apache.activemq.broker.BrokerService;
import org.apache.activemq.broker.BrokerServiceAware;
import org.apache.activemq.command.BrokerInfo;
import org.apache.activemq.transport.SocketConnectorFactory;
import org.apache.activemq.transport.WebTransportServerSupport;
-import org.apache.activemq.transport.ws.jetty11.WSServlet;
+import org.apache.activemq.transport.ws.jetty12.WSServlet;
import org.apache.activemq.util.IntrospectionSupport;
import org.apache.activemq.util.ServiceStopper;
-import org.eclipse.jetty.security.ConstraintSecurityHandler;
import org.eclipse.jetty.server.ConnectionFactory;
import org.eclipse.jetty.server.Connector;
import org.eclipse.jetty.server.HttpConnectionFactory;
import org.eclipse.jetty.server.Server;
-import org.eclipse.jetty.servlet.ServletContextHandler;
-import org.eclipse.jetty.servlet.ServletHolder;
-import org.eclipse.jetty.websocket.server.config.JettyWebSocketServletContainerInitializer;
+import org.eclipse.jetty.ee9.security.ConstraintSecurityHandler;
+import org.eclipse.jetty.ee9.servlet.ServletContextHandler;
+import org.eclipse.jetty.ee9.servlet.ServletHolder;
+import org.eclipse.jetty.ee9.websocket.server.config.JettyWebSocketServletContainerInitializer;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -77,6 +75,7 @@ protected void doStart() throws Exception {
ServletContextHandler contextHandler =
new ServletContextHandler(server, "/", ServletContextHandler.SECURITY);
+ // server.setHandler(contextHandler); Future: Jetty 12 EE10 API change
ServletHolder holder = new ServletHolder();
JettyWebSocketServletContainerInitializer.configure(contextHandler, null);
@@ -96,7 +95,7 @@ protected void doStart() throws Exception {
contextHandler.addServlet(holder, "/");
contextHandler.setAttribute("acceptListener", getAcceptListener());
-
+
server.start();
// Update the Connect To URI with our actual location in case the configured port
@@ -118,7 +117,7 @@ protected void doStart() throws Exception {
LOG.info("Listening for connections at {}", getConnectURI());
}
- private Servlet createWSServlet() throws Exception {
+ private WSServlet createWSServlet() throws Exception {
servlet = new WSServlet();
servlet.setTransportOptions(transportOptions);
servlet.setBrokerService(brokerService);
diff --git a/activemq-http/src/main/java/org/apache/activemq/transport/ws/jetty11/MQTTSocket.java b/activemq-http/src/main/java/org/apache/activemq/transport/ws/jetty12/MQTTSocket.java
similarity index 96%
rename from activemq-http/src/main/java/org/apache/activemq/transport/ws/jetty11/MQTTSocket.java
rename to activemq-http/src/main/java/org/apache/activemq/transport/ws/jetty12/MQTTSocket.java
index 853c201c346..6e14b9ec37e 100644
--- a/activemq-http/src/main/java/org/apache/activemq/transport/ws/jetty11/MQTTSocket.java
+++ b/activemq-http/src/main/java/org/apache/activemq/transport/ws/jetty12/MQTTSocket.java
@@ -14,7 +14,7 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
-package org.apache.activemq.transport.ws.jetty11;
+package org.apache.activemq.transport.ws.jetty12;
import java.io.IOException;
import java.nio.ByteBuffer;
@@ -26,8 +26,8 @@
import org.apache.activemq.transport.ws.AbstractMQTTSocket;
import org.apache.activemq.util.ByteSequence;
import org.apache.activemq.util.IOExceptionSupport;
-import org.eclipse.jetty.websocket.api.Session;
-import org.eclipse.jetty.websocket.api.WebSocketListener;
+import org.eclipse.jetty.ee9.websocket.api.WebSocketListener;
+import org.eclipse.jetty.ee9.websocket.api.Session;
import org.fusesource.hawtbuf.Buffer;
import org.fusesource.hawtbuf.DataByteArrayInputStream;
import org.fusesource.mqtt.codec.DISCONNECT;
diff --git a/activemq-http/src/main/java/org/apache/activemq/transport/ws/jetty11/StompSocket.java b/activemq-http/src/main/java/org/apache/activemq/transport/ws/jetty12/StompSocket.java
similarity index 95%
rename from activemq-http/src/main/java/org/apache/activemq/transport/ws/jetty11/StompSocket.java
rename to activemq-http/src/main/java/org/apache/activemq/transport/ws/jetty12/StompSocket.java
index 5c718c8ab06..2a47a5156c2 100644
--- a/activemq-http/src/main/java/org/apache/activemq/transport/ws/jetty11/StompSocket.java
+++ b/activemq-http/src/main/java/org/apache/activemq/transport/ws/jetty12/StompSocket.java
@@ -14,7 +14,7 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
-package org.apache.activemq.transport.ws.jetty11;
+package org.apache.activemq.transport.ws.jetty12;
import java.io.IOException;
import java.time.Duration;
@@ -24,8 +24,8 @@
import org.apache.activemq.transport.stomp.StompFrame;
import org.apache.activemq.transport.ws.AbstractStompSocket;
import org.apache.activemq.util.IOExceptionSupport;
-import org.eclipse.jetty.websocket.api.Session;
-import org.eclipse.jetty.websocket.api.WebSocketListener;
+import org.eclipse.jetty.ee9.websocket.api.Session;
+import org.eclipse.jetty.ee9.websocket.api.WebSocketListener;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
diff --git a/activemq-http/src/main/java/org/apache/activemq/transport/ws/jetty11/WSServlet.java b/activemq-http/src/main/java/org/apache/activemq/transport/ws/jetty12/WSServlet.java
similarity index 94%
rename from activemq-http/src/main/java/org/apache/activemq/transport/ws/jetty11/WSServlet.java
rename to activemq-http/src/main/java/org/apache/activemq/transport/ws/jetty12/WSServlet.java
index 607248e4dee..86183c8c4f4 100644
--- a/activemq-http/src/main/java/org/apache/activemq/transport/ws/jetty11/WSServlet.java
+++ b/activemq-http/src/main/java/org/apache/activemq/transport/ws/jetty12/WSServlet.java
@@ -15,7 +15,7 @@
* limitations under the License.
*/
-package org.apache.activemq.transport.ws.jetty11;
+package org.apache.activemq.transport.ws.jetty12;
import java.io.IOException;
import java.net.URI;
@@ -38,12 +38,12 @@
import org.apache.activemq.transport.TransportFactory;
import org.apache.activemq.transport.util.HttpTransportUtils;
import org.apache.activemq.transport.ws.WSTransportProxy;
-import org.eclipse.jetty.websocket.api.WebSocketListener;
-import org.eclipse.jetty.websocket.server.JettyServerUpgradeRequest;
-import org.eclipse.jetty.websocket.server.JettyServerUpgradeResponse;
-import org.eclipse.jetty.websocket.server.JettyWebSocketCreator;
-import org.eclipse.jetty.websocket.server.JettyWebSocketServlet;
-import org.eclipse.jetty.websocket.server.JettyWebSocketServletFactory;
+import org.eclipse.jetty.ee9.websocket.api.WebSocketListener;
+import org.eclipse.jetty.ee9.websocket.server.JettyServerUpgradeRequest;
+import org.eclipse.jetty.ee9.websocket.server.JettyServerUpgradeResponse;
+import org.eclipse.jetty.ee9.websocket.server.JettyWebSocketCreator;
+import org.eclipse.jetty.ee9.websocket.server.JettyWebSocketServlet;
+import org.eclipse.jetty.ee9.websocket.server.JettyWebSocketServletFactory;
/**
* Handle connection upgrade requests and creates web sockets
diff --git a/activemq-http/src/test/java/org/apache/activemq/transport/http/HttpTraceTestSupport.java b/activemq-http/src/test/java/org/apache/activemq/transport/http/HttpTraceTestSupport.java
index 0eb35f6cf59..b55d45bc485 100644
--- a/activemq-http/src/test/java/org/apache/activemq/transport/http/HttpTraceTestSupport.java
+++ b/activemq-http/src/test/java/org/apache/activemq/transport/http/HttpTraceTestSupport.java
@@ -24,10 +24,10 @@
import java.util.concurrent.atomic.AtomicInteger;
import org.eclipse.jetty.client.HttpClient;
-import org.eclipse.jetty.client.api.Request;
-import org.eclipse.jetty.client.api.Result;
-import org.eclipse.jetty.client.dynamic.HttpClientTransportDynamic;
-import org.eclipse.jetty.client.util.BufferingResponseListener;
+import org.eclipse.jetty.client.Request;
+import org.eclipse.jetty.client.Result;
+import org.eclipse.jetty.client.transport.HttpClientTransportDynamic;
+import org.eclipse.jetty.client.BufferingResponseListener;
import org.eclipse.jetty.http.HttpMethod;
import org.eclipse.jetty.http.HttpStatus;
import org.eclipse.jetty.io.ClientConnector;
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 e127d077d0c..bcb8ff2c114 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
@@ -27,9 +27,9 @@
import org.apache.activemq.transport.mqtt.MQTTWireFormat;
import org.apache.activemq.util.ByteSequence;
+import org.eclipse.jetty.websocket.api.Callback;
import org.eclipse.jetty.websocket.api.Session;
-import org.eclipse.jetty.websocket.api.WebSocketAdapter;
-import org.eclipse.jetty.websocket.api.WebSocketListener;
+import org.eclipse.jetty.websocket.api.Session.Listener.AbstractAutoDemanding;
import org.fusesource.hawtbuf.UTF8Buffer;
import org.fusesource.mqtt.codec.CONNACK;
import org.fusesource.mqtt.codec.CONNECT;
@@ -49,13 +49,12 @@
/**
* Implements a simple WebSocket based MQTT Client that can be used for unit testing.
*/
-public class MQTTWSConnection extends WebSocketAdapter implements WebSocketListener {
+public class MQTTWSConnection extends AbstractAutoDemanding implements Session.Listener.AutoDemanding {
private static final Logger LOG = LoggerFactory.getLogger(MQTTWSConnection.class);
private static final MQTTFrame PING_RESP_FRAME = new PINGRESP().encode();
- private Session connection;
private final CountDownLatch connectLatch = new CountDownLatch(1);
private final MQTTWireFormat wireFormat = new MQTTWireFormat();
@@ -65,19 +64,18 @@ public class MQTTWSConnection extends WebSocketAdapter implements WebSocketListe
private int closeCode = -1;
private String closeMessage;
- @Override
public boolean isConnected() {
- return connection != null ? connection.isOpen() : false;
+ return getSession() != null ? getSession().isOpen() : false;
}
public void close() {
- if (connection != null) {
- connection.close();
+ if (getSession() != null) {
+ getSession().close();
}
}
protected Session getConnection() {
- return connection;
+ return getSession();
}
//----- Connection and Disconnection methods -----------------------------//
@@ -182,18 +180,18 @@ public MQTTWSConnection setWritePartialFrames(boolean value) {
//----- WebSocket callback handlers --------------------------------------//
@Override
- public void onWebSocketBinary(byte[] data, int offset, int length) {
- if (data ==null || length <= 0) {
+ public void onWebSocketBinary(ByteBuffer payload, Callback callback) {
+ if (payload == null || !payload.hasRemaining()) {
return;
}
MQTTFrame frame = null;
try {
- frame = (MQTTFrame)wireFormat.unmarshal(new ByteSequence(data, offset, length));
+ frame = (MQTTFrame)wireFormat.unmarshal(new ByteSequence(payload.array()));
} catch (IOException e) {
LOG.error("Could not decode incoming MQTT Frame: {}", e.getMessage());
- connection.close();
+ getSession().close();
}
try {
@@ -243,11 +241,11 @@ public void onWebSocketBinary(byte[] data, int offset, int length) {
break;
default:
LOG.error("Unknown MQTT Frame received.");
- connection.close();
+ getSession().close();
}
} catch (Exception e) {
LOG.error("Could not decode incoming MQTT Frame: {}", e.getMessage());
- connection.close();
+ getSession().close();
}
}
@@ -255,12 +253,12 @@ public void onWebSocketBinary(byte[] data, int offset, int length) {
private void sendBytes(ByteSequence payload) throws IOException {
if (!isWritePartialFrames()) {
- connection.getRemote().sendBytes(ByteBuffer.wrap(payload.data, payload.offset, payload.length));
+ getSession().sendBinary(ByteBuffer.wrap(payload.data, payload.offset, payload.length), null);
} else {
- connection.getRemote().sendBytes(ByteBuffer.wrap(
- payload.data, payload.offset, payload.length / 2));
- connection.getRemote().sendBytes(ByteBuffer.wrap(
- payload.data, payload.offset + payload.length / 2, payload.length / 2));
+ getSession().sendBinary(ByteBuffer.wrap(
+ payload.data, payload.offset, payload.length / 2), null);
+ getSession().sendBinary(ByteBuffer.wrap(
+ payload.data, payload.offset + payload.length / 2, payload.length / 2), null);
}
}
@@ -273,17 +271,14 @@ private void checkConnected() throws IOException {
@Override
public void onWebSocketClose(int statusCode, String reason) {
LOG.trace("MQTT WS Connection closed, code:{} message:{}", statusCode, reason);
-
- this.connection = null;
this.closeCode = statusCode;
this.closeMessage = reason;
-
}
@Override
- public void onWebSocketConnect(org.eclipse.jetty.websocket.api.Session session) {
- this.connection = session;
- this.connection.setIdleTimeout(Duration.ZERO);
+ public void onWebSocketOpen(Session session) {
+ super.onWebSocketOpen(session);
+ session.setIdleTimeout(Duration.ZERO);
this.connectLatch.countDown();
}
}
diff --git a/activemq-http/src/test/java/org/apache/activemq/transport/ws/MQTTWSSubProtocolTest.java b/activemq-http/src/test/java/org/apache/activemq/transport/ws/MQTTWSSubProtocolTest.java
index 46aa692b6a4..2afddf84fe2 100644
--- a/activemq-http/src/test/java/org/apache/activemq/transport/ws/MQTTWSSubProtocolTest.java
+++ b/activemq-http/src/test/java/org/apache/activemq/transport/ws/MQTTWSSubProtocolTest.java
@@ -22,7 +22,7 @@
import java.util.concurrent.TimeUnit;
import org.eclipse.jetty.client.HttpClient;
-import org.eclipse.jetty.client.dynamic.HttpClientTransportDynamic;
+import org.eclipse.jetty.client.transport.HttpClientTransportDynamic;
import org.eclipse.jetty.io.ClientConnector;
import org.eclipse.jetty.util.ssl.SslContextFactory;
import org.eclipse.jetty.websocket.client.ClientUpgradeRequest;
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 671f77f64f8..41ebbe6a4cb 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
@@ -16,6 +16,7 @@
*/
package org.apache.activemq.transport.ws;
+import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertTrue;
import static org.junit.Assert.fail;
@@ -23,14 +24,16 @@
import java.util.Arrays;
import java.util.Collection;
import java.util.UUID;
+import java.util.concurrent.CompletableFuture;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicBoolean;
import org.apache.activemq.util.Wait;
import org.eclipse.jetty.client.HttpClient;
-import org.eclipse.jetty.client.dynamic.HttpClientTransportDynamic;
+import org.eclipse.jetty.client.transport.HttpClientTransportDynamic;
import org.eclipse.jetty.io.ClientConnector;
import org.eclipse.jetty.util.ssl.SslContextFactory;
+import org.eclipse.jetty.websocket.api.Session;
import org.eclipse.jetty.websocket.client.ClientUpgradeRequest;
import org.eclipse.jetty.websocket.client.WebSocketClient;
import org.fusesource.hawtbuf.UTF8Buffer;
@@ -85,7 +88,9 @@ public void setUp() throws Exception {
wsMQTTConnection = new MQTTWSConnection().setWritePartialFrames(partialFrames);
- wsClient.connect(wsMQTTConnection, wsConnectUri, request);
+ CompletableFuture webSocketFuture = wsClient.connect(wsMQTTConnection, wsConnectUri, request);
+ Session webSocketSession = webSocketFuture.get(30, TimeUnit.SECONDS);
+ assertNotNull(webSocketSession);
if (!wsMQTTConnection.awaitConnection(30, TimeUnit.SECONDS)) {
throw new IOException("Could not connect to MQTT WS endpoint");
}
@@ -110,7 +115,8 @@ public void testConnectCycles() throws Exception {
wsMQTTConnection = new MQTTWSConnection().setWritePartialFrames(partialFrames);
- wsClient.connect(wsMQTTConnection, wsConnectUri, request);
+ CompletableFuture wsClientFuture = wsClient.connect(wsMQTTConnection, wsConnectUri, request);
+ wsClientFuture.get(30, TimeUnit.SECONDS);
if (!wsMQTTConnection.awaitConnection(30, TimeUnit.SECONDS)) {
throw new IOException("Could not connect to MQTT WS endpoint");
}
diff --git a/activemq-http/src/test/java/org/apache/activemq/transport/ws/MQTTWSTransportWillTest.java b/activemq-http/src/test/java/org/apache/activemq/transport/ws/MQTTWSTransportWillTest.java
index 9f8d7abf406..a9998069e2c 100644
--- a/activemq-http/src/test/java/org/apache/activemq/transport/ws/MQTTWSTransportWillTest.java
+++ b/activemq-http/src/test/java/org/apache/activemq/transport/ws/MQTTWSTransportWillTest.java
@@ -26,7 +26,7 @@
import java.util.concurrent.TimeUnit;
import org.eclipse.jetty.client.HttpClient;
-import org.eclipse.jetty.client.dynamic.HttpClientTransportDynamic;
+import org.eclipse.jetty.client.transport.HttpClientTransportDynamic;
import org.eclipse.jetty.io.ClientConnector;
import org.eclipse.jetty.util.ssl.SslContextFactory;
import org.eclipse.jetty.websocket.client.ClientUpgradeRequest;
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 76910dfee36..9f2aecfc84c 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,8 +18,8 @@
import static org.junit.Assert.assertEquals;
-import org.apache.activemq.transport.ws.jetty11.MQTTSocket;
-import org.apache.activemq.transport.ws.jetty11.StompSocket;
+import org.apache.activemq.transport.ws.jetty12.MQTTSocket;
+import org.apache.activemq.transport.ws.jetty12.StompSocket;
import org.junit.Test;
public class SocketTest {
@@ -31,8 +31,8 @@ public void testStompSocketRemoteAddress() {
assertEquals("ws://localhost:8080", stompSocketJetty8.getRemoteAddress());
- org.apache.activemq.transport.ws.jetty11.StompSocket stompSocketJetty11 =
- new org.apache.activemq.transport.ws.jetty11.StompSocket("ws://localhost:8080");
+ org.apache.activemq.transport.ws.jetty12.StompSocket stompSocketJetty11 =
+ new org.apache.activemq.transport.ws.jetty12.StompSocket("ws://localhost:8080");
assertEquals("ws://localhost:8080", stompSocketJetty11.getRemoteAddress());
}
diff --git a/activemq-http/src/test/java/org/apache/activemq/transport/ws/StompWSSubProtocolTest.java b/activemq-http/src/test/java/org/apache/activemq/transport/ws/StompWSSubProtocolTest.java
index 80a86c5d04b..b689cca453c 100644
--- a/activemq-http/src/test/java/org/apache/activemq/transport/ws/StompWSSubProtocolTest.java
+++ b/activemq-http/src/test/java/org/apache/activemq/transport/ws/StompWSSubProtocolTest.java
@@ -25,7 +25,7 @@
import org.apache.activemq.transport.stomp.Stomp;
import org.eclipse.jetty.client.HttpClient;
-import org.eclipse.jetty.client.dynamic.HttpClientTransportDynamic;
+import org.eclipse.jetty.client.transport.HttpClientTransportDynamic;
import org.eclipse.jetty.io.ClientConnector;
import org.eclipse.jetty.util.ssl.SslContextFactory;
import org.eclipse.jetty.websocket.client.ClientUpgradeRequest;
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 40e3290ac3f..9bc2f5431f2 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
@@ -29,7 +29,7 @@
import org.apache.activemq.transport.stomp.StompFrame;
import org.apache.activemq.util.Wait;
import org.eclipse.jetty.client.HttpClient;
-import org.eclipse.jetty.client.dynamic.HttpClientTransportDynamic;
+import org.eclipse.jetty.client.transport.HttpClientTransportDynamic;
import org.eclipse.jetty.io.ClientConnector;
import org.eclipse.jetty.util.ssl.SslContextFactory;
import org.eclipse.jetty.websocket.client.ClientUpgradeRequest;
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 9ea1cbbbfbb..6b89569ff32 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
@@ -32,17 +32,17 @@
import org.apache.activemq.transport.SocketConnectorFactory;
import org.apache.activemq.transport.stomp.StompConnection;
import org.eclipse.jetty.client.HttpClient;
-import org.eclipse.jetty.client.api.Request;
-import org.eclipse.jetty.client.api.Result;
-import org.eclipse.jetty.client.dynamic.HttpClientTransportDynamic;
-import org.eclipse.jetty.client.util.BufferingResponseListener;
+import org.eclipse.jetty.client.Request;
+import org.eclipse.jetty.client.Result;
+import org.eclipse.jetty.client.transport.HttpClientTransportDynamic;
+import org.eclipse.jetty.client.BufferingResponseListener;
import org.eclipse.jetty.http.HttpMethod;
import org.eclipse.jetty.http.HttpStatus;
import org.eclipse.jetty.io.ClientConnector;
import org.eclipse.jetty.server.Connector;
import org.eclipse.jetty.server.Server;
import org.eclipse.jetty.util.ssl.SslContextFactory;
-import org.eclipse.jetty.webapp.WebAppContext;
+import org.eclipse.jetty.ee9.webapp.WebAppContext;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
diff --git a/activemq-http/src/test/java/org/apache/activemq/transport/wss/WSSTransportHttpTraceTest.java b/activemq-http/src/test/java/org/apache/activemq/transport/wss/WSSTransportHttpTraceTest.java
index c3f2599b1e7..aa766fd8040 100644
--- a/activemq-http/src/test/java/org/apache/activemq/transport/wss/WSSTransportHttpTraceTest.java
+++ b/activemq-http/src/test/java/org/apache/activemq/transport/wss/WSSTransportHttpTraceTest.java
@@ -25,7 +25,7 @@
import org.junit.runner.RunWith;
import org.junit.runners.Parameterized;
-@Ignore
+
@RunWith(Parameterized.class)
public class WSSTransportHttpTraceTest extends WSTransportHttpTraceTest {
diff --git a/activemq-http/src/test/java/org/apache/activemq/transport/wss/WSSTransportNeedClientAuthTest.java b/activemq-http/src/test/java/org/apache/activemq/transport/wss/WSSTransportNeedClientAuthTest.java
index cfc9c73e5a1..8553d555c21 100644
--- a/activemq-http/src/test/java/org/apache/activemq/transport/wss/WSSTransportNeedClientAuthTest.java
+++ b/activemq-http/src/test/java/org/apache/activemq/transport/wss/WSSTransportNeedClientAuthTest.java
@@ -23,7 +23,7 @@
import org.apache.activemq.transport.ws.MQTTWSConnection;
import org.apache.activemq.transport.ws.StompWSConnection;
import org.eclipse.jetty.client.HttpClient;
-import org.eclipse.jetty.client.dynamic.HttpClientTransportDynamic;
+import org.eclipse.jetty.client.transport.HttpClientTransportDynamic;
import org.eclipse.jetty.io.ClientConnector;
import org.eclipse.jetty.util.ssl.SslContextFactory;
import org.eclipse.jetty.websocket.api.Session;
@@ -145,12 +145,12 @@ public void testMQTTNeedClientAuth() throws Exception {
MQTTWSConnection wsMQTTConnection = new MQTTWSConnection();
wsClient.connect(wsMQTTConnection, new URI("wss://localhost:61618"), request);
+
if (!wsMQTTConnection.awaitConnection(30, TimeUnit.SECONDS)) {
throw new IOException("Could not connect to MQTT WS endpoint");
}
wsMQTTConnection.connect();
-
assertTrue("Client not connected", wsMQTTConnection.isConnected());
wsMQTTConnection.disconnect();
diff --git a/activemq-http/src/test/java/org/apache/activemq/transport/xstream/XStreamWireFormatTest.java b/activemq-http/src/test/java/org/apache/activemq/transport/xstream/XStreamWireFormatTest.java
index 5a5e6112989..90a5c850dde 100644
--- a/activemq-http/src/test/java/org/apache/activemq/transport/xstream/XStreamWireFormatTest.java
+++ b/activemq-http/src/test/java/org/apache/activemq/transport/xstream/XStreamWireFormatTest.java
@@ -20,7 +20,6 @@
import junit.framework.Test;
import org.apache.activemq.command.ActiveMQTextMessage;
-import org.apache.activemq.command.Command;
import org.apache.activemq.command.MessageTest;
import org.apache.activemq.wireformat.WireFormat;
import org.slf4j.Logger;
diff --git a/activemq-http/src/test/resources/spring-http.xml b/activemq-http/src/test/resources/spring-http.xml
index 1a65db43728..129ae77c8c3 100644
--- a/activemq-http/src/test/resources/spring-http.xml
+++ b/activemq-http/src/test/resources/spring-http.xml
@@ -44,7 +44,7 @@
-
+
diff --git a/activemq-web-console/pom.xml b/activemq-web-console/pom.xml
index 654f9af2f54..ed514da9477 100644
--- a/activemq-web-console/pom.xml
+++ b/activemq-web-console/pom.xml
@@ -52,20 +52,18 @@
- ${jetty.maven.groupid}
- jetty-maven-plugin
+ org.eclipse.jetty.ee9
+ jetty-ee9-maven-plugin
${jetty-version}
-
-
- ${jetty.port}
- 60000
-
-
-
-
+
+ ${jetty.port}
+ 60000
+
+ 10
+
/
-
+
@@ -100,7 +98,6 @@
-->
- 10
@@ -248,9 +245,19 @@
+
+ org.eclipse.jetty.ee9
+ jetty-ee9-webapp
+ provided
+
org.eclipse.jetty
jetty-server
+ provided
+
+
+ org.eclipse.jetty
+ jetty-rewrite
test
@@ -283,19 +290,30 @@
provided
-
+
+
jakarta.servlet.jsp.jstl
jakarta.servlet.jsp.jstl-api
3.0.0
- provided
+
+
+
+ org.eclipse.jetty.ee9
+ jetty-ee9-glassfish-jstl
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/activemq-web-console/src/test/resources/conf/jetty.properties b/activemq-web-console/src/test/resources/conf/jetty.properties
new file mode 100644
index 00000000000..1e45494ca73
--- /dev/null
+++ b/activemq-web-console/src/test/resources/conf/jetty.properties
@@ -0,0 +1,4 @@
+jetty.http.port=9090
+jetty.ssl.port=9443
+jetty.httpConfig.securePort=9443
+jetty.sslContext.keyStorePassword=OBF:1vny1zlo1x8e1vnw1vn61x8g1zlu1vn4
\ No newline at end of file
diff --git a/activemq-web-console/src/test/resources/jetty/jetty-activemq-console.xml b/activemq-web-console/src/test/resources/jetty/jetty-activemq-console.xml
new file mode 100644
index 00000000000..66dc771e7f0
--- /dev/null
+++ b/activemq-web-console/src/test/resources/jetty/jetty-activemq-console.xml
@@ -0,0 +1,6 @@
+
+
+
+ /console
+ webapps/admin
+
\ No newline at end of file
diff --git a/activemq-web-console/src/test/resources/jetty/jetty-bytebufferpool.xml b/activemq-web-console/src/test/resources/jetty/jetty-bytebufferpool.xml
new file mode 100644
index 00000000000..3d2820830d9
--- /dev/null
+++ b/activemq-web-console/src/test/resources/jetty/jetty-bytebufferpool.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/activemq-web-console/src/test/resources/jetty/jetty-http.xml b/activemq-web-console/src/test/resources/jetty/jetty-http.xml
new file mode 100644
index 00000000000..2c99e7d2575
--- /dev/null
+++ b/activemq-web-console/src/test/resources/jetty/jetty-http.xml
@@ -0,0 +1,50 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ -
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/activemq-web-console/src/test/resources/jetty/jetty-requestlog.xml b/activemq-web-console/src/test/resources/jetty/jetty-requestlog.xml
new file mode 100644
index 00000000000..0e55b4d17d5
--- /dev/null
+++ b/activemq-web-console/src/test/resources/jetty/jetty-requestlog.xml
@@ -0,0 +1,48 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ /yyyy_mm_dd.request.log
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/activemq-web-console/src/test/resources/jetty/jetty-threadpool.xml b/activemq-web-console/src/test/resources/jetty/jetty-threadpool.xml
new file mode 100644
index 00000000000..ae55f65a217
--- /dev/null
+++ b/activemq-web-console/src/test/resources/jetty/jetty-threadpool.xml
@@ -0,0 +1,32 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/activemq-web-console/src/test/resources/jetty/jetty-webapps.xml b/activemq-web-console/src/test/resources/jetty/jetty-webapps.xml
new file mode 100644
index 00000000000..5274bf790f9
--- /dev/null
+++ b/activemq-web-console/src/test/resources/jetty/jetty-webapps.xml
@@ -0,0 +1,116 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+ *
+ X-FRAME-OPTIONS
+ SAMEORIGIN
+
+
+
+
+
+
+ *
+ X-XSS-Protection
+ 1; mode=block
+
+
+
+
+
+
+ *
+ X-Content-Type-Options
+ nosniff
+
+
+
+
+
+
+ *
+ Cache-Control
+ no-store
+
+
+
+
+
+
+ *
+ Content-Security-Policy
+ style-src-elem 'self'; style-src 'self'; img-src 'self'; script-src-elem 'self'; default-src 'none'; object-src 'none'; frame-ancestors 'none'; base-uri 'none';
+
+
+
+
+
+
+
+ /admin/xml/*
+ Content-Security-Policy
+ style-src-elem 'self' 'unsafe-inline'; style-src 'self'; img-src 'self' data:; script-src-elem 'self'; default-src 'none'; object-src 'none'; frame-ancestors 'none'; base-uri 'none';
+
+
+
+
+
+
+
+
+
+
+
+ /admin
+ webapps/admin
+ true
+
+
+
+
+
+
+
+
+ /api
+ webapps/api
+ true
+
+
+
+
+
+
+
+
+
+
+
+ - index.html
+
+
+ webapps/
+
+
+
+
+
+
+
+
+ false
+
+
+
+
+
\ No newline at end of file
diff --git a/activemq-web-console/src/test/resources/jetty/jetty.xml b/activemq-web-console/src/test/resources/jetty/jetty.xml
new file mode 100644
index 00000000000..0e25e519779
--- /dev/null
+++ b/activemq-web-console/src/test/resources/jetty/jetty.xml
@@ -0,0 +1,98 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/activemq-web-demo/pom.xml b/activemq-web-demo/pom.xml
index 065d2617011..339268c319b 100644
--- a/activemq-web-demo/pom.xml
+++ b/activemq-web-demo/pom.xml
@@ -33,16 +33,15 @@
- org.eclipse.jetty
- jetty-maven-plugin
+ org.eclipse.jetty.ee9
+ jetty-ee9-maven-plugin
-
-
- ${jetty.port}
- 60000
-
-
- 10
+
+ ${jetty.port}
+ 60000
+
+ 10
+ true
@@ -188,6 +187,11 @@
jetty-server
test
+
+ org.eclipse.jetty.ee9
+ jetty-ee9-webapp
+ test
+
org.eclipse.jetty
jetty-client
diff --git a/activemq-web-demo/src/test/java/org/apache/activemq/web/AjaxTest.java b/activemq-web-demo/src/test/java/org/apache/activemq/web/AjaxTest.java
index f3f88d8d2db..c0b77c08964 100644
--- a/activemq-web-demo/src/test/java/org/apache/activemq/web/AjaxTest.java
+++ b/activemq-web-demo/src/test/java/org/apache/activemq/web/AjaxTest.java
@@ -19,8 +19,8 @@
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;
-import java.io.ByteArrayInputStream;
import java.net.SocketTimeoutException;
+import java.nio.charset.StandardCharsets;
import java.util.HashMap;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.TimeUnit;
@@ -34,10 +34,10 @@
import org.apache.activemq.transport.stomp.StompConnection;
import org.apache.activemq.transport.stomp.StompFrame;
import org.eclipse.jetty.client.HttpClient;
-import org.eclipse.jetty.client.api.Request;
-import org.eclipse.jetty.client.api.Result;
-import org.eclipse.jetty.client.util.BufferingResponseListener;
-import org.eclipse.jetty.client.util.InputStreamContentProvider;
+import org.eclipse.jetty.client.Request;
+import org.eclipse.jetty.client.Result;
+import org.eclipse.jetty.client.BufferingResponseListener;
+import org.eclipse.jetty.client.BytesRequestContent;
import org.eclipse.jetty.http.HttpHeader;
import org.eclipse.jetty.http.HttpMethod;
import org.junit.Test;
@@ -422,9 +422,9 @@ protected void sendMessages(HttpClient httpClient, int port, byte[] content) thr
final StringBuffer buf = new StringBuffer();
httpClient
.newRequest("http://localhost:" + port + "/amq")
- .header("Content-Type", "application/x-www-form-urlencoded; charset=UTF-8")
- .content(
- new InputStreamContentProvider(new ByteArrayInputStream(content)))
+ .headers(headers -> headers
+ .put("Content-Type", "application/x-www-form-urlencoded; charset=UTF-8"))
+ .body(new BytesRequestContent(content))
.method(HttpMethod.POST).send(new BufferingResponseListener() {
@Override
public void onComplete(Result result) {
@@ -445,24 +445,28 @@ protected String subscribe(HttpClient httpClient, int port, String content, Stri
final StringBuffer sessionId = new StringBuffer();
Request request = httpClient.newRequest("http://localhost:" + port + "/amq");
if (selector != null) {
- request.header("selector", selector);
+ request.headers(headers -> headers
+ .put("selector", selector));
}
if (session != null) {
- request.header(HttpHeader.COOKIE, session);
+ request.headers(headers -> headers
+ .put(HttpHeader.COOKIE, session));
}
- request.header("Content-Type","application/x-www-form-urlencoded; charset=UTF-8")
- .content(new InputStreamContentProvider(new ByteArrayInputStream(content.getBytes())))
- .method(HttpMethod.POST).send(new BufferingResponseListener() {
- @Override
- public void onComplete(Result result) {
- buf.append(getContentAsString());
- String cookie = result.getResponse().getHeaders().get(HttpHeader.SET_COOKIE);
- if (cookie != null) {
- String[] cookieParts = cookie.split(";");
- sessionId.append(cookieParts[0]);
+ request
+ .headers(headers -> headers
+ .put("Content-Type","application/x-www-form-urlencoded; charset=UTF-8"))
+ .body(new BytesRequestContent(content.getBytes(StandardCharsets.UTF_8)))
+ .method(HttpMethod.POST).send(new BufferingResponseListener() {
+ @Override
+ public void onComplete(Result result) {
+ buf.append(getContentAsString());
+ String cookie = result.getResponse().getHeaders().get(HttpHeader.SET_COOKIE);
+ if (cookie != null) {
+ String[] cookieParts = cookie.split(";");
+ sessionId.append(cookieParts[0]);
+ }
+ latch.countDown();
}
- latch.countDown();
- }
});
latch.await();
@@ -474,7 +478,8 @@ protected CountDownLatch asyncRequest(final HttpClient httpClient, final String
final CountDownLatch latch = new CountDownLatch(1);
Request request = httpClient.newRequest(url);
if (sessionId != null) {
- request.header(HttpHeader.COOKIE, sessionId);
+ request.headers(headers -> headers
+ .put(HttpHeader.COOKIE, sessionId));
}
request.send(new BufferingResponseListener() {
@Override
diff --git a/activemq-web-demo/src/test/java/org/apache/activemq/web/JettyServer.java b/activemq-web-demo/src/test/java/org/apache/activemq/web/JettyServer.java
index 8069954adce..eb5602eb04b 100644
--- a/activemq-web-demo/src/test/java/org/apache/activemq/web/JettyServer.java
+++ b/activemq-web-demo/src/test/java/org/apache/activemq/web/JettyServer.java
@@ -22,7 +22,8 @@
import org.eclipse.jetty.server.Connector;
import org.eclipse.jetty.server.Server;
import org.eclipse.jetty.server.ServerConnector;
-import org.eclipse.jetty.webapp.WebAppContext;
+import org.eclipse.jetty.util.resource.ResourceFactory;
+import org.eclipse.jetty.ee9.webapp.WebAppContext;
/**
* A simple bootstrap class for starting Jetty in your IDE using the local web
@@ -66,8 +67,9 @@ public static void main(String[] args) throws Exception {
ServerConnector connector = new ServerConnector(server);
connector.setPort(port);
WebAppContext context = new WebAppContext();
+ ResourceFactory resourceFactory = ResourceFactory.of(context);
- context.setResourceBase(WEBAPP_DIR);
+ context.setBaseResource(resourceFactory.newResource(WEBAPP_DIR));
context.setContextPath(WEBAPP_CTX);
context.setServer(server);
server.setHandler(context);
diff --git a/activemq-web-demo/src/test/java/org/apache/activemq/web/JettyTestSupport.java b/activemq-web-demo/src/test/java/org/apache/activemq/web/JettyTestSupport.java
index 59e957b5958..7fd016d15eb 100644
--- a/activemq-web-demo/src/test/java/org/apache/activemq/web/JettyTestSupport.java
+++ b/activemq-web-demo/src/test/java/org/apache/activemq/web/JettyTestSupport.java
@@ -36,7 +36,8 @@
import org.eclipse.jetty.server.Connector;
import org.eclipse.jetty.server.Server;
import org.eclipse.jetty.server.ServerConnector;
-import org.eclipse.jetty.webapp.WebAppContext;
+import org.eclipse.jetty.util.resource.ResourceFactory;
+import org.eclipse.jetty.ee9.webapp.WebAppContext;
import org.junit.After;
import org.junit.Before;
import org.slf4j.Logger;
@@ -77,8 +78,9 @@ public void setUp() throws Exception {
ServerConnector connector = new ServerConnector(server);
connector.setPort(port);
WebAppContext context = new WebAppContext();
+ ResourceFactory resourceFactory = ResourceFactory.of(context);
- context.setResourceBase("src/main/webapp");
+ context.setBaseResource(resourceFactory.newResource("src/main/webapp"));
context.setContextPath("/");
context.setServer(server);
server.setHandler(context);
diff --git a/activemq-web-demo/src/test/java/org/apache/activemq/web/RestPersistentTest.java b/activemq-web-demo/src/test/java/org/apache/activemq/web/RestPersistentTest.java
index 61345eaa80c..87382c55c24 100644
--- a/activemq-web-demo/src/test/java/org/apache/activemq/web/RestPersistentTest.java
+++ b/activemq-web-demo/src/test/java/org/apache/activemq/web/RestPersistentTest.java
@@ -25,10 +25,11 @@
import java.util.concurrent.atomic.AtomicInteger;
import org.eclipse.jetty.client.HttpClient;
-import org.eclipse.jetty.client.api.Request;
-import org.eclipse.jetty.client.api.Result;
-import org.eclipse.jetty.client.util.BufferingResponseListener;
-import org.eclipse.jetty.client.util.InputStreamContentProvider;
+import org.eclipse.jetty.client.InputStreamRequestContent;
+import org.eclipse.jetty.client.Request;
+import org.eclipse.jetty.client.Result;
+import org.eclipse.jetty.client.BufferingResponseListener;
+import org.eclipse.jetty.http.HttpHeader;
import org.eclipse.jetty.http.HttpMethod;
import org.eclipse.jetty.http.HttpStatus;
import org.junit.Ignore;
@@ -79,9 +80,12 @@ private void postMessage(HttpClient httpClient, String url, String properties, S
final CountDownLatch latch = new CountDownLatch(1);
final StringBuffer buf = new StringBuffer();
final AtomicInteger status = new AtomicInteger();
+
+
httpClient.newRequest(url+"&"+properties)
- .header("Content-Type","text/xml")
- .content(new InputStreamContentProvider(new ByteArrayInputStream(message.getBytes("UTF-8"))))
+ .headers(headers -> headers
+ .put(HttpHeader.CONTENT_TYPE,"text/xml"))
+ .body(new InputStreamRequestContent(new ByteArrayInputStream(message.getBytes("UTF-8"))))
.method(HttpMethod.POST).send(new BufferingResponseListener() {
@Override
public void onComplete(Result result) {
@@ -101,13 +105,15 @@ private void getMessage(HttpClient httpClient, String url, String selector, Stri
final CountDownLatch latch = new CountDownLatch(1);
final StringBuffer buf = new StringBuffer();
final AtomicInteger status = new AtomicInteger();
+
Request request = httpClient.newRequest(url)
- .header("accept", "text/xml")
- .header("Content-Type","text/xml");
+ .headers(headers -> headers
+ .put("accept", "text/xml")
+ .put("Content-Type","text/xml"));
- if(selector!=null)
- {
- request.header("selector", selector);
+ if(selector != null) {
+ request.headers(headers -> headers
+ .put("selector", selector));
}
request.method(HttpMethod.GET).send(new BufferingResponseListener() {
diff --git a/activemq-web-demo/src/test/java/org/apache/activemq/web/RestTest.java b/activemq-web-demo/src/test/java/org/apache/activemq/web/RestTest.java
index 7617ddb8b68..a37abef600f 100644
--- a/activemq-web-demo/src/test/java/org/apache/activemq/web/RestTest.java
+++ b/activemq-web-demo/src/test/java/org/apache/activemq/web/RestTest.java
@@ -32,8 +32,8 @@
import javax.management.ObjectName;
import org.eclipse.jetty.client.HttpClient;
-import org.eclipse.jetty.client.api.Result;
-import org.eclipse.jetty.client.util.BufferingResponseListener;
+import org.eclipse.jetty.client.Result;
+import org.eclipse.jetty.client.BufferingResponseListener;
import org.eclipse.jetty.http.HttpFields;
import org.eclipse.jetty.http.HttpMethod;
import org.eclipse.jetty.http.HttpStatus;
@@ -137,24 +137,26 @@ public void testSelector() throws Exception {
producer.send(msg2);
LOG.info("message 2 sent");
- HttpClient httpClient = new HttpClient();
- httpClient.start();
-
final StringBuffer buf = new StringBuffer();
final CountDownLatch latch = new CountDownLatch(1);
- httpClient.newRequest("http://localhost:" + port + "/message/test?readTimeout=1000&type=queue")
- .header("selector", "test=2").send(new BufferingResponseListener() {
- @Override
- public void onComplete(Result result) {
- buf.append(getContentAsString());
- latch.countDown();
- }
- });
- latch.await();
+
+ try(HttpClient httpClient = new HttpClient()) {
+ httpClient.start();
+ httpClient.newRequest("http://localhost:" + port + "/message/test?readTimeout=1000&type=queue")
+ .headers(headers -> headers
+ .put("selector", "test=2"))
+ .send(new BufferingResponseListener() {
+ @Override
+ public void onComplete(Result result) {
+ buf.append(getContentAsString());
+ latch.countDown();
+ }
+ });
+ latch.await();
+ }
assertEquals("test2", buf.toString());
}
-
// test for https://issues.apache.org/activemq/browse/AMQ-2827
@Test(timeout = 15 * 1000)
public void testCorrelation() throws Exception {
@@ -258,23 +260,25 @@ public void onComplete(Result result) {
public void testProperties() throws Exception {
int port = getPort();
- HttpClient httpClient = new HttpClient();
- httpClient.start();
-
final CountDownLatch latch = new CountDownLatch(1);
final StringBuffer buf = new StringBuffer();
final AtomicInteger status = new AtomicInteger();
- httpClient.newRequest("http://localhost:" + port + "/message/testPost?type=queue&property=value")
- .method(HttpMethod.POST).send(new BufferingResponseListener() {
- @Override
- public void onComplete(Result result) {
- status.getAndSet(result.getResponse().getStatus());
- buf.append(getContentAsString());
- latch.countDown();
- }
- });
- latch.await();
+ try(HttpClient httpClient = new HttpClient()) {
+ httpClient.start();
+
+ httpClient.newRequest("http://localhost:" + port + "/message/testPost?type=queue&property=value")
+ .method(HttpMethod.POST).send(new BufferingResponseListener() {
+ @Override
+ public void onComplete(Result result) {
+ status.getAndSet(result.getResponse().getStatus());
+ buf.append(getContentAsString());
+ latch.countDown();
+ }
+ });
+ latch.await();
+ }
+
assertTrue("success status", HttpStatus.isSuccess(status.get()));
final CountDownLatch latch2 = new CountDownLatch(1);
@@ -282,16 +286,19 @@ public void onComplete(Result result) {
final AtomicInteger status2 = new AtomicInteger();
final HttpFields.Mutable responseFields = HttpFields.build();
- httpClient.newRequest("http://localhost:" + port + "/message/testPost?readTimeout=1000&type=Queue")
- .method(HttpMethod.GET).send(new BufferingResponseListener() {
- @Override
- public void onComplete(Result result) {
- responseFields.add(result.getResponse().getHeaders());
- status2.getAndSet(result.getResponse().getStatus());
- buf2.append(getContentAsString());
- latch2.countDown();
- }
- });
+ try(HttpClient httpClient = new HttpClient()) {
+ httpClient.start();
+ httpClient.newRequest("http://localhost:" + port + "/message/testPost?readTimeout=1000&type=Queue")
+ .method(HttpMethod.GET).send(new BufferingResponseListener() {
+ @Override
+ public void onComplete(Result result) {
+ responseFields.add(result.getResponse().getHeaders());
+ status2.getAndSet(result.getResponse().getStatus());
+ buf2.append(getContentAsString());
+ latch2.countDown();
+ }
+ });
+ }
latch2.await();
assertTrue("success status", HttpStatus.isSuccess(status2.get()));
@@ -306,25 +313,25 @@ public void onComplete(Result result) {
public void testAuth() throws Exception {
int port = getPort();
- HttpClient httpClient = new HttpClient();
- httpClient.start();
-
final CountDownLatch latch = new CountDownLatch(1);
final StringBuffer buf = new StringBuffer();
final AtomicInteger status = new AtomicInteger();
- httpClient.newRequest("http://localhost:" + port + "/message/testPost?type=queue")
- .header("Authorization", "Basic YWRtaW46YWRtaW4=")
- .method(HttpMethod.POST).send(new BufferingResponseListener() {
- @Override
- public void onComplete(Result result) {
- status.getAndSet(result.getResponse().getStatus());
- buf.append(getContentAsString());
- latch.countDown();
- }
- });
-
- latch.await();
+ try(HttpClient httpClient = new HttpClient()) {
+ httpClient.start();
+ httpClient.newRequest("http://localhost:" + port + "/message/testPost?type=queue")
+ .headers(headers -> headers
+ .put("Authorization", "Basic YWRtaW46YWRtaW4="))
+ .method(HttpMethod.POST).send(new BufferingResponseListener() {
+ @Override
+ public void onComplete(Result result) {
+ status.getAndSet(result.getResponse().getStatus());
+ buf.append(getContentAsString());
+ latch.countDown();
+ }
+ });
+ latch.await();
+ }
assertTrue("success status", HttpStatus.isSuccess(status.get()));
}
diff --git a/activemq-web/pom.xml b/activemq-web/pom.xml
index 43782fcde95..c7a5c7a5317 100644
--- a/activemq-web/pom.xml
+++ b/activemq-web/pom.xml
@@ -79,12 +79,12 @@
provided
- org.eclipse.jetty
- jetty-webapp
+ org.eclipse.jetty.ee9
+ jetty-ee9-webapp
- org.eclipse.jetty.websocket
- websocket-jetty-server
+ org.eclipse.jetty.ee9.websocket
+ jetty-ee9-websocket-jetty-server
diff --git a/activemq-web/src/main/java/org/apache/activemq/spring/jetty/JettyServerBean.java b/activemq-web/src/main/java/org/apache/activemq/spring/jetty/JettyServerBean.java
new file mode 100644
index 00000000000..06d6e685e67
--- /dev/null
+++ b/activemq-web/src/main/java/org/apache/activemq/spring/jetty/JettyServerBean.java
@@ -0,0 +1,233 @@
+/**
+ * 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.spring.jetty;
+
+import java.io.BufferedReader;
+import java.io.IOException;
+import java.io.InputStream;
+import java.net.InetAddress;
+import java.nio.charset.StandardCharsets;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.nio.file.Paths;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Properties;
+import java.util.stream.Collectors;
+
+import org.eclipse.jetty.server.HttpConfiguration;
+import org.eclipse.jetty.server.HttpConnectionFactory;
+import org.eclipse.jetty.server.Server;
+import org.eclipse.jetty.server.ServerConnector;
+import org.eclipse.jetty.util.resource.Resource;
+import org.eclipse.jetty.util.resource.ResourceFactory;
+import org.eclipse.jetty.xml.XmlConfiguration;
+import org.springframework.beans.factory.DisposableBean;
+import org.springframework.beans.factory.InitializingBean;
+
+/**
+ * Demonstration of using the XmlConfiguration to build up a server with multiple XML files and Properties.
+ */
+public class JettyServerBean implements InitializingBean, DisposableBean {
+
+ boolean httpEnabled = true;
+ boolean httpsEnabled = false;
+ String jettyXmlDirectory = Path.of("conf", "jetty").toString();
+ String jettyConfDirectory = Path.of("conf").toString();
+ String webAppsContext = null;
+
+ // List of configured IDs from XML;
+ Map idMap;
+
+ // The list of XMLs in the order they should be executed.
+ List xmls = new ArrayList<>();
+
+ private Server server;
+
+
+ /**
+ * Configure for the list of XML Resources and Properties.
+ *
+ * @param xmls the xml resources (in order of execution)
+ * @param properties the properties to use with the XML
+ * @return the ID Map of configured objects (key is the id name in the XML, and the value is configured object)
+ * @throws Exception if unable to create objects or read XML
+ */
+ public Map configure(List xmls, Map properties) throws Exception {
+ Map idMap = new HashMap<>();
+
+ // Configure everything
+ for (Resource xmlResource : xmls)
+ {
+ XmlConfiguration configuration = new XmlConfiguration(xmlResource);
+ configuration.getIdMap().putAll(idMap);
+ configuration.getProperties().putAll(properties);
+ configuration.configure();
+ idMap.putAll(configuration.getIdMap());
+ }
+
+ return idMap;
+ }
+
+ private static void ensureDirExists(Path path) throws IOException {
+ if (!Files.exists(path))
+ {
+ Files.createDirectories(path);
+ }
+ }
+
+ private static Map loadProperties(Resource resource) throws IOException {
+ Properties properties = new Properties();
+
+ try (InputStream in = resource.newInputStream()) {
+ properties.load(in);
+ }
+
+ return properties.entrySet().stream().collect(
+ Collectors.toMap(
+ e -> String.valueOf(e.getKey()),
+ e -> String.valueOf(e.getValue()),
+ (prev, next) -> next, HashMap::new
+ ));
+ }
+
+ @Override
+ public void destroy() throws Exception {
+ // TODO: review if we need to check
+ // && !server.isStopping()
+ if(server != null) {
+ server.stop();
+ }
+ }
+
+ @Override
+ public void afterPropertiesSet() throws Exception {
+ try(ResourceFactory.Closeable resourceFactory = ResourceFactory.closeable())
+ {
+ Resource homeXmlResource = resourceFactory.newResource(Path.of(getJettyXmlDirectory()));
+ Resource customBaseResource = resourceFactory.newResource(Path.of(getJettyConfDirectory()));
+
+ xmls.add(homeXmlResource.resolve("jetty-bytebufferpool.xml"));
+ xmls.add(homeXmlResource.resolve("jetty-threadpool.xml"));
+ xmls.add(homeXmlResource.resolve("jetty.xml"));
+ if (isHttpEnabled()) {
+ xmls.add(homeXmlResource.resolve("jetty-http.xml"));
+ }
+ if (isHttpsEnabled()) {
+ xmls.add(homeXmlResource.resolve("jetty-ssl.xml"));
+ xmls.add(homeXmlResource.resolve("jetty-ssl-context.xml"));
+ xmls.add(homeXmlResource.resolve("jetty-https.xml"));
+ }
+ // xmls.add(homeXmlResource.resolve("jetty-customrequestlog.xml"));
+
+ // Now we add our customizations
+ // In this case, it's 2 ServletContextHandlers
+ // xmls.add(homeXmlResource.resolve("jetty-webapps.xml/context-activemq-console.xml"));
+ if(getWebAppsContext() != null) {
+ xmls.add(homeXmlResource.resolve(getWebAppsContext()));
+ }
+
+ // Lets load our properties
+ Map customProps = loadProperties(customBaseResource.resolve("jetty.properties"));
+
+ // Create a path suitable for output / work directory / etc.
+ Path outputPath = Paths.get("target/xmlserver-output");
+ Path resourcesPath = outputPath.resolve("resources");
+
+ ensureDirExists(outputPath);
+ ensureDirExists(outputPath.resolve("logs"));
+ ensureDirExists(resourcesPath);
+ ensureDirExists(resourcesPath.resolve("bar"));
+ ensureDirExists(resourcesPath.resolve("foo"));
+
+ // And define some common properties
+ // These 2 properties are used in MANY PLACES, define them, even if you don't use them fully.
+ customProps.put("jetty.home", outputPath.toString());
+ customProps.put("jetty.base", outputPath.toString());
+ // And define the resource paths for the contexts
+ customProps.put("custom.resources", resourcesPath.toString());
+ customProps.put("jetty.sslContext.keyStoreAbsolutePath", customBaseResource.resolve("keystore").toString());
+ customProps.put("jetty.sslContext.trustStoreAbsolutePath", customBaseResource.resolve("keystore").toString());
+
+ // Now lets tie it all together
+ idMap = configure(xmls, customProps);
+ }
+
+ Server tmpServer = (Server)idMap.get("Server");
+ tmpServer.start();
+ System.out.println("Server is running, and listening on ...");
+ for (ServerConnector connector : tmpServer.getBeans(ServerConnector.class))
+ {
+ for (HttpConnectionFactory connectionFactory : connector.getBeans(HttpConnectionFactory.class))
+ {
+ String scheme = "http";
+ HttpConfiguration httpConfiguration = connectionFactory.getHttpConfiguration();
+ if (httpConfiguration.getSecurePort() == connector.getLocalPort())
+ scheme = httpConfiguration.getSecureScheme();
+ String host = connector.getHost();
+ if (host == null)
+ host = InetAddress.getLocalHost().getHostAddress();
+ System.out.printf(" %s://%s:%s/%n", scheme, host, connector.getLocalPort());
+ }
+ }
+ tmpServer.join();
+ this.server = tmpServer;
+ }
+
+ public void setHttpEnabled(boolean httpEnabled) {
+ this.httpEnabled = httpEnabled;
+ }
+
+ public boolean isHttpEnabled() {
+ return this.httpEnabled;
+ }
+
+ public void setHttpsEnabled(boolean httpsEnabled) {
+ this.httpsEnabled = httpsEnabled;;
+ }
+
+ public boolean isHttpsEnabled() {
+ return this.httpsEnabled;
+ }
+
+ public void setJettyConfDirectory(String jettyConfDirectory) {
+ this.jettyConfDirectory = jettyConfDirectory;
+ }
+
+ public String getJettyConfDirectory() {
+ return jettyConfDirectory;
+ }
+
+ public void setJettyXmlDirectory(String jettyXmlDirectory) {
+ this.jettyXmlDirectory = jettyXmlDirectory;
+ }
+
+ public String getJettyXmlDirectory() {
+ return jettyXmlDirectory;
+ }
+
+ public void setWebAppsContext(String webAppsContext) {
+ this.webAppsContext = webAppsContext;
+ }
+
+ public String getWebAppsContext() {
+ return webAppsContext;
+ }
+}
\ No newline at end of file
diff --git a/activemq-web/src/main/java/org/apache/activemq/web/config/JspConfigurer.java b/activemq-web/src/main/java/org/apache/activemq/web/config/JspConfigurer.java
index aecff8d59de..6fe6d53779d 100644
--- a/activemq-web/src/main/java/org/apache/activemq/web/config/JspConfigurer.java
+++ b/activemq-web/src/main/java/org/apache/activemq/web/config/JspConfigurer.java
@@ -18,9 +18,8 @@
import org.eclipse.jetty.server.Handler;
import org.eclipse.jetty.server.Server;
-import org.eclipse.jetty.server.handler.HandlerCollection;
-import org.eclipse.jetty.webapp.Configuration;
-import org.eclipse.jetty.webapp.WebAppContext;
+import org.eclipse.jetty.server.Handler.Sequence;
+import org.eclipse.jetty.ee9.webapp.WebAppContext;
/**
*
@@ -28,7 +27,7 @@
*/
public class JspConfigurer {
- public static void configureJetty(Server server, HandlerCollection collection) {
+ public static void configureJetty(Server server, Sequence sequence) {
// Configuration.ClassList classlist = Configuration.ClassList
// .setServerDefault( server );
// classlist.addBefore(
@@ -39,7 +38,7 @@ public static void configureJetty(Server server, HandlerCollection collection) {
// container-path jars for tlds, web-fragments etc.
// If you omit the jar that contains the jstl .tlds, the jsp engine will
// scan for them instead.
- for (Handler handler: collection.getHandlers()) {
+ for (Handler handler: sequence.getHandlers()) {
if (handler instanceof WebAppContext){
((WebAppContext) handler).setAttribute(
"org.eclipse.jetty.server.webapp.ContainerIncludeJarPattern",
diff --git a/assembly/pom.xml b/assembly/pom.xml
index 03ca26e6f83..59554ec5612 100644
--- a/assembly/pom.xml
+++ b/assembly/pom.xml
@@ -371,20 +371,53 @@
false
- org.springframework
- spring-oxm
+ org.springframework
+ spring-oxm
org.codehaus.jettison
jettison
+
+ org.eclipse.jetty.ee9
+ jetty-ee9-webapp
+
+
+ org.eclipse.jetty.ee9
+ jetty-ee9-annotations
+
+
+ org.eclipse.jetty.ee9
+ jetty-ee9-jndi
+
+
+ org.eclipse.jetty.ee9
+ jetty-ee9-nested
+
+
+ org.eclipse.jetty.ee9
+ jetty-ee9-plus
+
+
+ org.eclipse.jetty.ee9
+ jetty-ee9-security
+
+
+ org.eclipse.jetty.ee9
+ jetty-ee9-servlet
+
org.eclipse.jetty
- jetty-annotations
+ jetty-ee
+ ${jetty-version}
org.eclipse.jetty
- jetty-jaas
+ jetty-security
+
+
+ org.eclipse.jetty
+ jetty-session
org.eclipse.jetty
@@ -398,10 +431,66 @@
org.eclipse.jetty
jetty-server
+
+ org.eclipse.jetty
+ jetty-server
+ config
+ ${jetty-version}
+
org.eclipse.jetty
jetty-rewrite
+
+ org.eclipse.jetty.websocket
+ jetty-websocket-core-client
+
+
+ org.eclipse.jetty.websocket
+ jetty-websocket-core-common
+
+
+ org.eclipse.jetty.websocket
+ jetty-websocket-core-server
+
+
+ org.eclipse.jetty.websocket
+ jetty-websocket-jetty-client
+
+
+ org.eclipse.jetty.websocket
+ jetty-websocket-jetty-api
+
+
+ org.eclipse.jetty.ee9.websocket
+ jetty-ee9-websocket-jakarta-client
+
+
+ org.eclipse.jetty.ee9.websocket
+ jetty-ee9-websocket-jetty-api
+
+
+ org.eclipse.jetty.ee9.websocket
+ jetty-ee9-websocket-jetty-common
+
+
+ org.eclipse.jetty.ee9.websocket
+ jetty-ee9-websocket-jetty-server
+
+
+ org.eclipse.jetty.ee9.websocket
+ jetty-ee9-websocket-servlet
+
+
org.eclipse.jdt
ecj
@@ -446,8 +535,8 @@
- org.eclipse.jetty
- apache-jsp
+ org.eclipse.jetty.ee9
+ jetty-ee9-apache-jsp
org.eclipse.jetty
@@ -457,13 +546,19 @@
jakarta.servlet.jsp.jstl
jakarta.servlet.jsp.jstl-api
- 3.0.0
+ 3.0.2
+
+
+ org.eclipse.jetty.ee9
+ jetty-ee9-glassfish-jstl
+
org.jasypt
jasypt
@@ -571,6 +666,22 @@
true
+
+ unpack-jetty-config
+ package
+
+ unpack-dependencies
+
+
+ org.eclipse.jetty
+ jetty-server
+ config
+ ${project.build.outputDirectory}/jetty-server-config
+ false
+ true
+ **/jetty.xml,**/jetty-bytebufferpool.xml,**/jetty-http.xml,**/jetty-requestlog.xml,**/jetty-threadpool.xml
+
+
diff --git a/assembly/src/main/descriptors/common-bin.xml b/assembly/src/main/descriptors/common-bin.xml
index 4574d21bc0f..bbba025763e 100644
--- a/assembly/src/main/descriptors/common-bin.xml
+++ b/assembly/src/main/descriptors/common-bin.xml
@@ -257,34 +257,45 @@
lib/web
false
- runtime
+
org.springframework:spring-web
org.springframework:spring-webmvc
- org.eclipse.jetty:jetty-annotations
+ org.eclipse.jetty:jetty-ee
org.eclipse.jetty:jetty-server
+ org.eclipse.jetty:jetty-session
org.eclipse.jetty:jetty-xml
- org.eclipse.jetty:jetty-webapp
org.eclipse.jetty:jetty-util
org.eclipse.jetty:jetty-http
org.eclipse.jetty:jetty-io
- org.eclipse.jetty:jetty-jaas
org.eclipse.jetty:jetty-jndi
org.eclipse.jetty:jetty-plus
- org.eclipse.jetty:jetty-servlet
org.eclipse.jetty:jetty-security
org.eclipse.jetty:jetty-rewrite
+ org.eclipse.jetty.ee9:jetty-ee9-annotations
+ org.eclipse.jetty.ee9:jetty-ee9-apache-jsp
+ org.eclipse.jetty.ee9:jetty-ee9-jndi
+ org.eclipse.jetty.ee9:jetty-ee9-nested
+ org.eclipse.jetty.ee9:jetty-ee9-plus
+ org.eclipse.jetty.ee9:jetty-ee9-security
+ org.eclipse.jetty.ee9:jetty-ee9-servlet
+ org.eclipse.jetty.ee9:jetty-ee9-webapp
org.eclipse.jetty.toolchain:jetty-jakarta-servlet-api
- org.eclipse.jetty.websocket:websocket-core-common
- org.eclipse.jetty.websocket:websocket-core-server
- org.eclipse.jetty.websocket:websocket-jetty-api
+ org.eclipse.jetty.websocket:jetty-websocket-core-client
+ org.eclipse.jetty.websocket:jetty-websocket-core-common
+ org.eclipse.jetty.websocket:jetty-websocket-core-server
+ org.eclipse.jetty.websocket:jetty-websocket-jetty-client
+ org.eclipse.jetty.websocket:jetty-websocket-jetty-api
org.eclipse.jetty.websocket:websocket-jetty-common
org.eclipse.jetty.websocket:websocket-jetty-server
- org.eclipse.jetty.websocket:websocket-servlet
org.eclipse.jetty.orbit:javax.security.auth.message
+ org.eclipse.jetty.ee9.websocket:jetty-ee9-websocket-jakarta-client
+ org.eclipse.jetty.ee9.websocket:jetty-ee9-websocket-jetty-api
+ org.eclipse.jetty.ee9.websocket:jetty-ee9-websocket-jetty-common
+ org.eclipse.jetty.ee9.websocket:jetty-ee9-websocket-jetty-server
+ org.eclipse.jetty.ee9.websocket:jetty-ee9-websocket-servlet
jakarta.websocket:jakarta.websocket-api
-
org.eclipse.jetty:apache-jsp
@@ -293,7 +304,8 @@
org.eclipse.jetty:apache-jstl
jakarta.servlet.jsp.jstl:jakarta.servlet.jsp.jstl-api
- org.glassfish.web:jakarta.servlet.jsp.jstl
+ org.eclipse.jetty.ee9:jetty-ee9-glassfish-jstl
+
org.mortbay.jasper:apache-el
diff --git a/assembly/src/release/conf/activemq.xml b/assembly/src/release/conf/activemq.xml
index 9f32bd90f59..940d66b03b9 100644
--- a/assembly/src/release/conf/activemq.xml
+++ b/assembly/src/release/conf/activemq.xml
@@ -124,7 +124,7 @@
Take a look at ${ACTIVEMQ_HOME}/conf/jetty.xml for more details
-->
-
+
diff --git a/assembly/src/release/conf/jetty-spring.xml b/assembly/src/release/conf/jetty-spring.xml
new file mode 100644
index 00000000000..80a05ef6bbb
--- /dev/null
+++ b/assembly/src/release/conf/jetty-spring.xml
@@ -0,0 +1,28 @@
+
+
+
+
+
+
+
+
+
+
+
diff --git a/assembly/src/release/conf/jetty.properties b/assembly/src/release/conf/jetty.properties
new file mode 100644
index 00000000000..1e45494ca73
--- /dev/null
+++ b/assembly/src/release/conf/jetty.properties
@@ -0,0 +1,4 @@
+jetty.http.port=9090
+jetty.ssl.port=9443
+jetty.httpConfig.securePort=9443
+jetty.sslContext.keyStorePassword=OBF:1vny1zlo1x8e1vnw1vn61x8g1zlu1vn4
\ No newline at end of file
diff --git a/assembly/src/release/conf/jetty.xml b/assembly/src/release/conf/jetty.xml
index cb3d281ea35..bf784e829e4 100644
--- a/assembly/src/release/conf/jetty.xml
+++ b/assembly/src/release/conf/jetty.xml
@@ -11,8 +11,7 @@
implied. See the License for the specific language governing permissions and
limitations under the License.
-->
-
@@ -23,7 +22,7 @@
-
+
@@ -35,49 +34,49 @@
-
+
-
+
-
+
-
+
-
+
-
-
+
+
-
-
+
+
-
-
+
+
-
-
+
+
@@ -93,37 +92,37 @@
-
-
-
+
+
+
-
+
-
+
-
+
index.html
-
+
-
+
-
+
-
+
@@ -151,7 +150,7 @@
destroy-method="stop">
-
+
@@ -207,11 +206,11 @@
-
+
-
+
diff --git a/assembly/src/release/conf/jetty/jetty-bytebufferpool.xml b/assembly/src/release/conf/jetty/jetty-bytebufferpool.xml
new file mode 100644
index 00000000000..3d2820830d9
--- /dev/null
+++ b/assembly/src/release/conf/jetty/jetty-bytebufferpool.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/assembly/src/release/conf/jetty/jetty-http.xml b/assembly/src/release/conf/jetty/jetty-http.xml
new file mode 100644
index 00000000000..2c99e7d2575
--- /dev/null
+++ b/assembly/src/release/conf/jetty/jetty-http.xml
@@ -0,0 +1,50 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ -
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/assembly/src/release/conf/jetty/jetty-requestlog.xml b/assembly/src/release/conf/jetty/jetty-requestlog.xml
new file mode 100644
index 00000000000..0e55b4d17d5
--- /dev/null
+++ b/assembly/src/release/conf/jetty/jetty-requestlog.xml
@@ -0,0 +1,48 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ /yyyy_mm_dd.request.log
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/assembly/src/release/conf/jetty/jetty-threadpool.xml b/assembly/src/release/conf/jetty/jetty-threadpool.xml
new file mode 100644
index 00000000000..ae55f65a217
--- /dev/null
+++ b/assembly/src/release/conf/jetty/jetty-threadpool.xml
@@ -0,0 +1,32 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/assembly/src/release/conf/jetty/jetty-webapps.xml b/assembly/src/release/conf/jetty/jetty-webapps.xml
new file mode 100644
index 00000000000..5274bf790f9
--- /dev/null
+++ b/assembly/src/release/conf/jetty/jetty-webapps.xml
@@ -0,0 +1,116 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+ *
+ X-FRAME-OPTIONS
+ SAMEORIGIN
+
+
+
+
+
+
+ *
+ X-XSS-Protection
+ 1; mode=block
+
+
+
+
+
+
+ *
+ X-Content-Type-Options
+ nosniff
+
+
+
+
+
+
+ *
+ Cache-Control
+ no-store
+
+
+
+
+
+
+ *
+ Content-Security-Policy
+ style-src-elem 'self'; style-src 'self'; img-src 'self'; script-src-elem 'self'; default-src 'none'; object-src 'none'; frame-ancestors 'none'; base-uri 'none';
+
+
+
+
+
+
+
+ /admin/xml/*
+ Content-Security-Policy
+ style-src-elem 'self' 'unsafe-inline'; style-src 'self'; img-src 'self' data:; script-src-elem 'self'; default-src 'none'; object-src 'none'; frame-ancestors 'none'; base-uri 'none';
+
+
+
+
+
+
+
+
+
+
+
+ /admin
+ webapps/admin
+ true
+
+
+
+
+
+
+
+
+ /api
+ webapps/api
+ true
+
+
+
+
+
+
+
+
+
+
+
+ - index.html
+
+
+ webapps/
+
+
+
+
+
+
+
+
+ false
+
+
+
+
+
\ No newline at end of file
diff --git a/assembly/src/release/conf/jetty/jetty.xml b/assembly/src/release/conf/jetty/jetty.xml
new file mode 100644
index 00000000000..0e25e519779
--- /dev/null
+++ b/assembly/src/release/conf/jetty/jetty.xml
@@ -0,0 +1,98 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/pom.xml b/pom.xml
index 041852d90a9..525285357be 100644
--- a/pom.xml
+++ b/pom.xml
@@ -65,8 +65,9 @@
1.9.3
4.0.5
2.3.2_1
- 11.0.25
[11,13)
+ 12.0.21
+ [12,13)
3.6.1
3.30.2-GA
1.5.4
@@ -819,6 +820,14 @@
import
+
+ org.eclipse.jetty.ee9
+ jetty-ee9-bom
+ ${jetty-version}
+ pom
+ import
+
+
org.apache.httpcomponents
httpclient
@@ -997,8 +1006,8 @@
${javacc-maven-plugin-version}
- org.eclipse.jetty
- jetty-maven-plugin
+ org.eclipse.jetty.ee9
+ jetty-ee9-maven-plugin
${jetty-version}