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}