From c55931ce7ab562468021a7ba4a013bd260b6f9b4 Mon Sep 17 00:00:00 2001 From: Joakim Erdfelt Date: Thu, 11 Jan 2024 10:12:10 -0600 Subject: [PATCH] Updates for 12.0.x --- .github/workflows/ci.yml | 3 +- embedded/client-certificates/pom.xml | 10 +- .../examples/EnableClientCertificates.java | 23 +-- .../src/main/java/examples/HelloHandler.java | 21 +- embedded/client/pom.xml | 10 +- .../examples/ClientWithDynamicConnection.java | 14 +- embedded/compressed-encoding/pom.xml | 10 +- .../examples/GzipRequestResponseExample.java | 11 +- embedded/connectors/pom.xml | 10 +- .../examples/ConnectorSpecificContexts.java | 6 +- .../examples/ConnectorSpecificWebapps.java | 12 +- .../src/main/java/examples/HelloHandler.java | 21 +- .../main/java/examples/ManyConnectors.java | 28 +-- .../java/examples/ServerConnectorHttps.java | 18 +- embedded/deploying/pom.xml | 12 +- .../examples/DelayedWebAppDeployExample.java | 29 +-- .../examples/WebAppsHotDeployExample.java | 15 +- embedded/error-handling/pom.xml | 10 +- .../ErrorPageErrorHandlerExample.java | 13 +- .../java/examples/ErrorStatusExample.java | 11 +- embedded/file-server/pom.xml | 10 +- .../ResourceHandlerFromClasspath.java | 6 +- .../ResourceHandlerFromFileSystem.java | 6 +- .../ServletFileServerMultipleLocations.java | 11 +- .../ServletFileServerSingleLocation.java | 10 +- embedded/file-upload/pom.xml | 10 +- .../examples/MultipartMimeUploadExample.java | 194 +++++++++++------- embedded/form-post/pom.xml | 10 +- .../examples/FormRestrictionsExample.java | 31 +-- embedded/http-config/pom.xml | 10 +- .../main/java/examples/HttpConfigExample.java | 24 +-- embedded/jndi/pom.xml | 14 +- .../java/examples/WebAppContextWithJNDI.java | 8 +- embedded/pom.xml | 6 +- embedded/redirect/pom.xml | 10 +- .../src/main/java/examples/HelloHandler.java | 25 ++- .../SecuredRedirectHandlerExample.java | 25 +-- embedded/rewrite/pom.xml | 10 +- .../examples/MovedPermanentlyRuleExample.java | 40 ++-- embedded/servlet-config/pom.xml | 10 +- .../examples/AddFilterMultipleMapping.java | 11 +- embedded/servlet-security/pom.xml | 10 +- .../ServletTransportGuaranteeExample.java | 38 ++-- embedded/simple-server/pom.xml | 10 +- embedded/virtual-hosts/pom.xml | 10 +- .../src/main/java/VirtualHostsExample.java | 12 +- embedded/webapp-context/pom.xml | 10 +- .../examples/WebAppContextFromClasspath.java | 2 +- .../examples/WebAppContextFromFileSystem.java | 2 +- embedded/websocket-jakarta-api/pom.xml | 14 +- .../java/examples/JakartaBrowserMain.java | 29 +-- embedded/websocket-jetty-api/pom.xml | 14 +- .../main/java/examples/JettyTimeSocket.java | 15 +- .../java/examples/SecureWebSocketServer.java | 56 +++-- .../examples/WebSocketServerViaFilter.java | 17 +- embedded/xml/pom.xml | 12 +- .../main/java/examples/XmlEnhancedServer.java | 19 +- .../xml/src/main/java/examples/XmlServer.java | 104 +++++----- pom.xml | 8 +- standalone/pom.xml | 6 +- webapps/hello/pom.xml | 6 +- webapps/pom.xml | 6 +- 62 files changed, 622 insertions(+), 546 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 1edd6ca..fd4afef 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -6,6 +6,7 @@ on: - '9.4.x' - '10.0.x' - '11.0.x' + - '12.0.x' pull_request: jobs: @@ -13,4 +14,4 @@ jobs: name: Build uses: jetty/.github/.github/workflows/maven-ci.yml@main with: - jdk-matrix: '[ "11", "21" ]' + jdk-matrix: '[ "17", "21" ]' diff --git a/embedded/client-certificates/pom.xml b/embedded/client-certificates/pom.xml index de1613b..e682d27 100644 --- a/embedded/client-certificates/pom.xml +++ b/embedded/client-certificates/pom.xml @@ -4,12 +4,12 @@ org.eclipse.jetty.examples.embedded jetty-embedded-examples - 11.0.x + 12.0.x client-certificates - 11.0.x + 12.0.x jar - Jetty Examples :: Jetty 11.0.x :: Embedded :: Client Certificates + Jetty Examples :: Jetty 12.0.x :: Embedded :: Client Certificates @@ -19,8 +19,8 @@ - org.eclipse.jetty - jetty-webapp + org.eclipse.jetty.ee10 + jetty-ee10-webapp ${jetty.version} diff --git a/embedded/client-certificates/src/main/java/examples/EnableClientCertificates.java b/embedded/client-certificates/src/main/java/examples/EnableClientCertificates.java index 515a437..7691e13 100644 --- a/embedded/client-certificates/src/main/java/examples/EnableClientCertificates.java +++ b/embedded/client-certificates/src/main/java/examples/EnableClientCertificates.java @@ -13,19 +13,20 @@ package examples; -import java.net.MalformedURLException; import java.net.URISyntaxException; import java.net.URL; +import org.eclipse.jetty.server.Handler; import org.eclipse.jetty.server.HttpConfiguration; import org.eclipse.jetty.server.HttpConnectionFactory; import org.eclipse.jetty.server.SecureRequestCustomizer; import org.eclipse.jetty.server.Server; import org.eclipse.jetty.server.ServerConnector; import org.eclipse.jetty.server.SslConnectionFactory; -import org.eclipse.jetty.server.handler.HandlerList; import org.eclipse.jetty.server.handler.SecuredRedirectHandler; import org.eclipse.jetty.util.resource.Resource; +import org.eclipse.jetty.util.resource.ResourceFactory; +import org.eclipse.jetty.util.resource.Resources; import org.eclipse.jetty.util.ssl.SslContextFactory; /** @@ -48,7 +49,7 @@ public static void main(String[] args) throws Exception // Setup SSL SslContextFactory.Server sslContextFactory = new SslContextFactory.Server(); - sslContextFactory.setKeyStoreResource(findKeyStore()); + sslContextFactory.setKeyStoreResource(findKeyStore(ResourceFactory.of(server))); sslContextFactory.setKeyStorePassword("OBF:1vny1zlo1x8e1vnw1vn61x8g1zlu1vn4"); sslContextFactory.setKeyManagerPassword("OBF:1u2u1wml1z7s1z7a1wnl1u2g"); sslContextFactory.setWantClientAuth(true); // Turn on javax.net.ssl.SSLEngine.wantClientAuth @@ -69,7 +70,7 @@ public static void main(String[] args) throws Exception server.addConnector(httpsConnector); // Add a Handlers for requests - HandlerList handlers = new HandlerList(); + Handler.Sequence handlers = new Handler.Sequence(); handlers.addHandler(new SecuredRedirectHandler()); handlers.addHandler(new HelloHandler("Hello Secure World")); server.setHandler(handlers); @@ -78,16 +79,14 @@ public static void main(String[] args) throws Exception server.join(); } - private static Resource findKeyStore() throws URISyntaxException, MalformedURLException + private static Resource findKeyStore(ResourceFactory resourceFactory) { - ClassLoader cl = EnableClientCertificates.class.getClassLoader(); - String keystoreResource = "ssl/keystore"; - URL f = cl.getResource(keystoreResource); - if (f == null) + String resourceName = "ssl/keystore"; + Resource resource = resourceFactory.newClassLoaderResource(resourceName); + if (Resources.isReadableFile(resource)) { - throw new RuntimeException("Unable to find " + keystoreResource); + throw new RuntimeException("Unable to read " + resourceName); } - - return Resource.newResource(f.toURI()); + return resource; } } diff --git a/embedded/client-certificates/src/main/java/examples/HelloHandler.java b/embedded/client-certificates/src/main/java/examples/HelloHandler.java index 2bd05d5..c0d8682 100644 --- a/embedded/client-certificates/src/main/java/examples/HelloHandler.java +++ b/embedded/client-certificates/src/main/java/examples/HelloHandler.java @@ -11,15 +11,16 @@ // ======================================================================== // -import java.io.IOException; -import jakarta.servlet.ServletException; -import jakarta.servlet.http.HttpServletRequest; -import jakarta.servlet.http.HttpServletResponse; +import java.nio.charset.StandardCharsets; +import org.eclipse.jetty.http.HttpHeader; +import org.eclipse.jetty.server.Handler; import org.eclipse.jetty.server.Request; -import org.eclipse.jetty.server.handler.AbstractHandler; +import org.eclipse.jetty.server.Response; +import org.eclipse.jetty.util.BufferUtil; +import org.eclipse.jetty.util.Callback; -public class HelloHandler extends AbstractHandler +public class HelloHandler extends Handler.Abstract { private final String msg; @@ -29,10 +30,10 @@ public HelloHandler(String msg) } @Override - public void handle(String target, Request baseRequest, HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException + public boolean handle(Request request, Response response, Callback callback) throws Exception { - response.setContentType("text/plain"); - response.getWriter().printf("%s%n", msg); - baseRequest.setHandled(true); + response.getHeaders().put(HttpHeader.CONTENT_TYPE, "text/plain; charset=utf-8"); + response.write(true, BufferUtil.toBuffer(String.format("%s%n", msg), StandardCharsets.UTF_8), callback); + return true; } } diff --git a/embedded/client/pom.xml b/embedded/client/pom.xml index 0f430b0..2d4f08b 100644 --- a/embedded/client/pom.xml +++ b/embedded/client/pom.xml @@ -4,12 +4,12 @@ org.eclipse.jetty.examples.embedded jetty-embedded-examples - 11.0.x + 12.0.x client - 11.0.x + 12.0.x jar - Jetty Examples :: Jetty 11.0.x :: Embedded :: Client + Jetty Examples :: Jetty 12.0.x :: Embedded :: Client @@ -24,12 +24,12 @@ org.eclipse.jetty.http2 - http2-client + jetty-http2-client ${jetty.version} org.eclipse.jetty.http2 - http2-http-client-transport + jetty-http2-client-transport ${jetty.version} diff --git a/embedded/client/src/main/java/examples/ClientWithDynamicConnection.java b/embedded/client/src/main/java/examples/ClientWithDynamicConnection.java index b32cf93..88c5c4f 100644 --- a/embedded/client/src/main/java/examples/ClientWithDynamicConnection.java +++ b/embedded/client/src/main/java/examples/ClientWithDynamicConnection.java @@ -14,11 +14,11 @@ package examples; import org.eclipse.jetty.client.HttpClient; -import org.eclipse.jetty.client.api.ContentResponse; -import org.eclipse.jetty.client.dynamic.HttpClientTransportDynamic; -import org.eclipse.jetty.client.http.HttpClientConnectionFactory; +import org.eclipse.jetty.client.ContentResponse; +import org.eclipse.jetty.client.transport.HttpClientConnectionFactory; +import org.eclipse.jetty.client.transport.HttpClientTransportDynamic; import org.eclipse.jetty.http2.client.HTTP2Client; -import org.eclipse.jetty.http2.client.http.ClientConnectionFactoryOverHTTP2; +import org.eclipse.jetty.http2.client.transport.ClientConnectionFactoryOverHTTP2; import org.eclipse.jetty.io.ClientConnectionFactory; import org.eclipse.jetty.io.ClientConnector; import org.eclipse.jetty.util.ssl.SslContextFactory; @@ -36,10 +36,10 @@ public static void main(String[] args) throws Exception ClientConnector clientConnector = new ClientConnector(); clientConnector.setSslContextFactory(sslContextFactory); - ClientConnectionFactory.Info h1 = HttpClientConnectionFactory.HTTP11; + ClientConnectionFactory.Info http1Info = HttpClientConnectionFactory.HTTP11; HTTP2Client http2Client = new HTTP2Client(clientConnector); - ClientConnectionFactory.Info h2 = new ClientConnectionFactoryOverHTTP2.HTTP2(http2Client); - HttpClientTransportDynamic dynamicTransport = new HttpClientTransportDynamic(clientConnector, h1, h2); + ClientConnectionFactoryOverHTTP2.HTTP2 http2Info = new ClientConnectionFactoryOverHTTP2.HTTP2(http2Client); + HttpClientTransportDynamic dynamicTransport = new HttpClientTransportDynamic(clientConnector, http1Info, http2Info); HttpClient httpClient = new HttpClient(dynamicTransport); try diff --git a/embedded/compressed-encoding/pom.xml b/embedded/compressed-encoding/pom.xml index f9073ae..7a3ae83 100644 --- a/embedded/compressed-encoding/pom.xml +++ b/embedded/compressed-encoding/pom.xml @@ -4,12 +4,12 @@ org.eclipse.jetty.examples.embedded jetty-embedded-examples - 11.0.x + 12.0.x compressed-encoding - 11.0.x + 12.0.x jar - Jetty Examples :: Jetty 11.0.x :: Embedded :: HTML Compressed Encoding + Jetty Examples :: Jetty 12.0.x :: Embedded :: HTML Compressed Encoding @@ -19,8 +19,8 @@ - org.eclipse.jetty - jetty-servlet + org.eclipse.jetty.ee10 + jetty-ee10-servlet ${jetty.version} diff --git a/embedded/compressed-encoding/src/main/java/examples/GzipRequestResponseExample.java b/embedded/compressed-encoding/src/main/java/examples/GzipRequestResponseExample.java index 1910a84..f6d86a5 100644 --- a/embedded/compressed-encoding/src/main/java/examples/GzipRequestResponseExample.java +++ b/embedded/compressed-encoding/src/main/java/examples/GzipRequestResponseExample.java @@ -13,17 +13,15 @@ package examples; -import java.io.File; import java.net.URI; import java.net.URL; -import java.nio.file.Path; +import org.eclipse.jetty.ee10.servlet.DefaultServlet; +import org.eclipse.jetty.ee10.servlet.ServletContextHandler; import org.eclipse.jetty.server.Server; import org.eclipse.jetty.server.ServerConnector; import org.eclipse.jetty.server.handler.gzip.GzipHandler; -import org.eclipse.jetty.servlet.DefaultServlet; -import org.eclipse.jetty.servlet.ServletContextHandler; -import org.eclipse.jetty.util.resource.PathResource; +import org.eclipse.jetty.util.resource.ResourceFactory; public class GzipRequestResponseExample { @@ -56,8 +54,9 @@ public static void main(String[] args) throws Exception ServletContextHandler context = new ServletContextHandler(); gzip.setHandler(context); + context.setContextPath("/"); - context.setBaseResource(new PathResource(webRootUri)); + context.setBaseResource(ResourceFactory.of(context).newResource(webRootUri)); context.setWelcomeFiles(new String[]{"index.html"}); // Adding Servlets diff --git a/embedded/connectors/pom.xml b/embedded/connectors/pom.xml index dcdac58..2d92148 100644 --- a/embedded/connectors/pom.xml +++ b/embedded/connectors/pom.xml @@ -4,12 +4,12 @@ org.eclipse.jetty.examples.embedded jetty-embedded-examples - 11.0.x + 12.0.x connectors - 11.0.x + 12.0.x jar - Jetty Examples :: Jetty 11.0.x :: Embedded :: Connectors + Jetty Examples :: Jetty 12.0.x :: Embedded :: Connectors @@ -19,8 +19,8 @@ - org.eclipse.jetty - jetty-webapp + org.eclipse.jetty.ee10 + jetty-ee10-webapp ${jetty.version} diff --git a/embedded/connectors/src/main/java/examples/ConnectorSpecificContexts.java b/embedded/connectors/src/main/java/examples/ConnectorSpecificContexts.java index d098eac..6fcd091 100644 --- a/embedded/connectors/src/main/java/examples/ConnectorSpecificContexts.java +++ b/embedded/connectors/src/main/java/examples/ConnectorSpecificContexts.java @@ -11,6 +11,8 @@ // ======================================================================== // +import java.util.List; + import org.eclipse.jetty.server.Server; import org.eclipse.jetty.server.ServerConnector; import org.eclipse.jetty.server.handler.ContextHandler; @@ -40,14 +42,14 @@ public static void main(String[] args) throws Exception ContextHandler ctxHelloA = new ContextHandler(); ctxHelloA.setContextPath("/"); ctxHelloA.setHandler(new HelloHandler("Hello Connection A")); - ctxHelloA.setVirtualHosts(new String[]{"@connA"}); // Reference connector name + ctxHelloA.setVirtualHosts(List.of("@connA")); // Reference connector name contexts.addHandler(ctxHelloA); // Hello Handler (connection B) ContextHandler ctxHelloB = new ContextHandler(); ctxHelloB.setContextPath("/"); ctxHelloB.setHandler(new HelloHandler("Greetings from Connection B")); - ctxHelloB.setVirtualHosts(new String[]{"@connB"}); // Reference connector name + ctxHelloB.setVirtualHosts(List.of("@connB")); // Reference connector name contexts.addHandler(ctxHelloB); server.start(); diff --git a/embedded/connectors/src/main/java/examples/ConnectorSpecificWebapps.java b/embedded/connectors/src/main/java/examples/ConnectorSpecificWebapps.java index 8bd03c4..e1b7f5c 100644 --- a/embedded/connectors/src/main/java/examples/ConnectorSpecificWebapps.java +++ b/embedded/connectors/src/main/java/examples/ConnectorSpecificWebapps.java @@ -11,10 +11,12 @@ // ======================================================================== // +import java.util.List; + +import org.eclipse.jetty.ee10.webapp.WebAppContext; import org.eclipse.jetty.server.Server; import org.eclipse.jetty.server.ServerConnector; -import org.eclipse.jetty.server.handler.HandlerCollection; -import org.eclipse.jetty.webapp.WebAppContext; +import org.eclipse.jetty.server.handler.ContextHandlerCollection; public class ConnectorSpecificWebapps { @@ -33,21 +35,21 @@ public static void main(String[] args) throws Exception server.addConnector(connectorB); // Basic handler collection - HandlerCollection contexts = new HandlerCollection(); + ContextHandlerCollection contexts = new ContextHandlerCollection(); server.setHandler(contexts); // WebApp A WebAppContext appA = new WebAppContext(); appA.setContextPath("/a"); appA.setWar("./src/main/webapps/webapp-a/"); - appA.setVirtualHosts(new String[]{"@connA"}); // Reference connector name + appA.setVirtualHosts(List.of("@connA")); // Reference connector name contexts.addHandler(appA); // WebApp B WebAppContext appB = new WebAppContext(); appB.setContextPath("/b"); appB.setWar("./src/main/webapps/webapp-b/"); - appB.setVirtualHosts(new String[]{"@connB"}); // Reference connector name + appB.setVirtualHosts(List.of("@connB")); // Reference connector name contexts.addHandler(appB); server.start(); diff --git a/embedded/connectors/src/main/java/examples/HelloHandler.java b/embedded/connectors/src/main/java/examples/HelloHandler.java index 2bd05d5..c0d8682 100644 --- a/embedded/connectors/src/main/java/examples/HelloHandler.java +++ b/embedded/connectors/src/main/java/examples/HelloHandler.java @@ -11,15 +11,16 @@ // ======================================================================== // -import java.io.IOException; -import jakarta.servlet.ServletException; -import jakarta.servlet.http.HttpServletRequest; -import jakarta.servlet.http.HttpServletResponse; +import java.nio.charset.StandardCharsets; +import org.eclipse.jetty.http.HttpHeader; +import org.eclipse.jetty.server.Handler; import org.eclipse.jetty.server.Request; -import org.eclipse.jetty.server.handler.AbstractHandler; +import org.eclipse.jetty.server.Response; +import org.eclipse.jetty.util.BufferUtil; +import org.eclipse.jetty.util.Callback; -public class HelloHandler extends AbstractHandler +public class HelloHandler extends Handler.Abstract { private final String msg; @@ -29,10 +30,10 @@ public HelloHandler(String msg) } @Override - public void handle(String target, Request baseRequest, HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException + public boolean handle(Request request, Response response, Callback callback) throws Exception { - response.setContentType("text/plain"); - response.getWriter().printf("%s%n", msg); - baseRequest.setHandled(true); + response.getHeaders().put(HttpHeader.CONTENT_TYPE, "text/plain; charset=utf-8"); + response.write(true, BufferUtil.toBuffer(String.format("%s%n", msg), StandardCharsets.UTF_8), callback); + return true; } } diff --git a/embedded/connectors/src/main/java/examples/ManyConnectors.java b/embedded/connectors/src/main/java/examples/ManyConnectors.java index d2a01f0..a3af30c 100644 --- a/embedded/connectors/src/main/java/examples/ManyConnectors.java +++ b/embedded/connectors/src/main/java/examples/ManyConnectors.java @@ -24,6 +24,8 @@ import org.eclipse.jetty.server.ServerConnector; import org.eclipse.jetty.server.SslConnectionFactory; import org.eclipse.jetty.util.resource.Resource; +import org.eclipse.jetty.util.resource.ResourceFactory; +import org.eclipse.jetty.util.resource.Resources; import org.eclipse.jetty.util.ssl.SslContextFactory; /** @@ -33,17 +35,17 @@ public class ManyConnectors { public static void main(String[] args) throws Exception { - // Since this example shows off SSL configuration, we need a keystore - // with the appropriate key. These lookup of jetty.home is purely a hack - // to get access to a keystore that we use in many unit tests and should - // probably be a direct path to your own keystore. - Resource keystoreResource = findKeyStore(); - // Create a basic jetty server object without declaring the port. Since // we are configuring connectors directly we'll be setting ports on // those connectors. Server server = new Server(); + // Since this example shows off SSL configuration, we need a keystore + // with the appropriate key. These lookup of jetty.home is purely a hack + // to get access to a keystore that we use in many unit tests and should + // probably be a direct path to your own keystore. + Resource keystoreResource = findKeyStore(ResourceFactory.of(server)); + // HTTP Configuration // HttpConfiguration is a collection of configuration information // appropriate for http and https. The default scheme for http is @@ -118,16 +120,14 @@ public static void main(String[] args) throws Exception server.join(); } - private static Resource findKeyStore() throws URISyntaxException, MalformedURLException + private static Resource findKeyStore(ResourceFactory resourceFactory) { - ClassLoader cl = ManyConnectors.class.getClassLoader(); - String keystoreResource = "ssl/keystore"; - URL f = cl.getResource(keystoreResource); - if (f == null) + String resourceName = "ssl/keystore"; + Resource resource = resourceFactory.newClassLoaderResource(resourceName); + if (Resources.isReadableFile(resource)) { - throw new RuntimeException("Unable to find " + keystoreResource); + throw new RuntimeException("Unable to read " + resourceName); } - - return Resource.newResource(f.toURI()); + return resource; } } diff --git a/embedded/connectors/src/main/java/examples/ServerConnectorHttps.java b/embedded/connectors/src/main/java/examples/ServerConnectorHttps.java index 6b28794..aff73fd 100644 --- a/embedded/connectors/src/main/java/examples/ServerConnectorHttps.java +++ b/embedded/connectors/src/main/java/examples/ServerConnectorHttps.java @@ -22,6 +22,8 @@ import org.eclipse.jetty.server.ServerConnector; import org.eclipse.jetty.server.SslConnectionFactory; import org.eclipse.jetty.util.resource.Resource; +import org.eclipse.jetty.util.resource.ResourceFactory; +import org.eclipse.jetty.util.resource.Resources; import org.eclipse.jetty.util.ssl.SslContextFactory; public class ServerConnectorHttps @@ -33,7 +35,7 @@ public static void main(String[] args) throws Exception // Setup SSL SslContextFactory.Server sslContextFactory = new SslContextFactory.Server(); - sslContextFactory.setKeyStoreResource(findKeyStore()); + sslContextFactory.setKeyStoreResource(findKeyStore(ResourceFactory.of(server))); sslContextFactory.setKeyStorePassword("OBF:1vny1zlo1x8e1vnw1vn61x8g1zlu1vn4"); sslContextFactory.setKeyManagerPassword("OBF:1u2u1wml1z7s1z7a1wnl1u2g"); @@ -58,16 +60,14 @@ public static void main(String[] args) throws Exception server.join(); } - private static Resource findKeyStore() throws URISyntaxException, MalformedURLException + private static Resource findKeyStore(ResourceFactory resourceFactory) { - ClassLoader cl = ServerConnectorHttps.class.getClassLoader(); - String keystoreResource = "ssl/keystore"; - URL f = cl.getResource(keystoreResource); - if (f == null) + String resourceName = "ssl/keystore"; + Resource resource = resourceFactory.newClassLoaderResource(resourceName); + if (Resources.isReadableFile(resource)) { - throw new RuntimeException("Unable to find " + keystoreResource); + throw new RuntimeException("Unable to read " + resourceName); } - - return Resource.newResource(f.toURI()); + return resource; } } diff --git a/embedded/deploying/pom.xml b/embedded/deploying/pom.xml index 84f4aab..cf63ca5 100644 --- a/embedded/deploying/pom.xml +++ b/embedded/deploying/pom.xml @@ -4,12 +4,12 @@ org.eclipse.jetty.examples.embedded jetty-embedded-examples - 11.0.x + 12.0.x deploying - 11.0.x + 12.0.x jar - Jetty Examples :: Jetty 11.0.x :: Embedded :: Deploying + Jetty Examples :: Jetty 12.0.x :: Embedded :: Deploying @@ -26,13 +26,13 @@ org.eclipse.jetty - jetty-servlet + jetty-xml ${jetty.version} - org.eclipse.jetty - jetty-xml + org.eclipse.jetty.ee10 + jetty-ee10-webapp ${jetty.version} diff --git a/embedded/deploying/src/main/java/examples/DelayedWebAppDeployExample.java b/embedded/deploying/src/main/java/examples/DelayedWebAppDeployExample.java index c47f1b4..47f6b45 100644 --- a/embedded/deploying/src/main/java/examples/DelayedWebAppDeployExample.java +++ b/embedded/deploying/src/main/java/examples/DelayedWebAppDeployExample.java @@ -14,21 +14,21 @@ package examples; import java.io.File; -import java.io.IOException; import java.nio.file.Path; import java.util.concurrent.TimeUnit; + import jakarta.servlet.ServletContextEvent; import jakarta.servlet.ServletContextListener; -import jakarta.servlet.ServletException; -import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletResponse; - +import org.eclipse.jetty.ee10.webapp.WebAppContext; +import org.eclipse.jetty.server.Handler; import org.eclipse.jetty.server.Request; +import org.eclipse.jetty.server.Response; import org.eclipse.jetty.server.Server; -import org.eclipse.jetty.server.handler.AbstractHandler; import org.eclipse.jetty.server.handler.ContextHandlerCollection; -import org.eclipse.jetty.server.handler.HandlerList; -import org.eclipse.jetty.webapp.WebAppContext; +import org.eclipse.jetty.util.Callback; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; /** * Demonstrate an Embedded Jetty server where the server @@ -37,6 +37,8 @@ */ public class DelayedWebAppDeployExample { + private static final Logger LOG = LoggerFactory.getLogger(DelayedWebAppDeployExample.class); + public static void main(String[] args) throws Exception { Server server = new Server(8080); @@ -45,7 +47,7 @@ public static void main(String[] args) throws Exception ContextHandlerCollection contexts = new ContextHandlerCollection(); // The server handler list - HandlerList handlers = new HandlerList(); + Handler.Sequence handlers = new Handler.Sequence(); handlers.addHandler(contexts); handlers.addHandler(new UnavailableHandler()); @@ -60,15 +62,15 @@ public static void main(String[] args) throws Exception server.join(); } - public static class UnavailableHandler extends AbstractHandler + public static class UnavailableHandler extends Handler.Abstract { @Override - public void handle(String target, Request baseRequest, HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException + public boolean handle(Request request, Response response, Callback callback) throws Exception { // Indicate a 503 status response.setStatus(HttpServletResponse.SC_SERVICE_UNAVAILABLE); // tell jetty that this request was handled (making others handlers not run for this request) - baseRequest.setHandled(true); + return true; } } @@ -102,7 +104,7 @@ public void run() } catch (Exception e) { - e.printStackTrace(); + LOG.warn("Unable to create/start webapp {} from {}", warPath, contextPath, e); } } } @@ -123,14 +125,13 @@ public void contextInitialized(ServletContextEvent sce) } catch (InterruptedException e) { - e.printStackTrace(); + LOG.warn("Context initialization interrupted {}", sce, e); } } @Override public void contextDestroyed(ServletContextEvent sce) { - } } } diff --git a/embedded/deploying/src/main/java/examples/WebAppsHotDeployExample.java b/embedded/deploying/src/main/java/examples/WebAppsHotDeployExample.java index 875a570..8ce0162 100644 --- a/embedded/deploying/src/main/java/examples/WebAppsHotDeployExample.java +++ b/embedded/deploying/src/main/java/examples/WebAppsHotDeployExample.java @@ -13,7 +13,6 @@ package examples; -import java.io.File; import java.io.FileNotFoundException; import java.nio.file.Path; import java.nio.file.Paths; @@ -24,13 +23,12 @@ import org.eclipse.jetty.deploy.AppLifeCycle; import org.eclipse.jetty.deploy.DeploymentManager; import org.eclipse.jetty.deploy.graph.Node; -import org.eclipse.jetty.deploy.providers.WebAppProvider; +import org.eclipse.jetty.deploy.providers.ContextProvider; import org.eclipse.jetty.server.Handler; import org.eclipse.jetty.server.Server; import org.eclipse.jetty.server.handler.ContextHandler; import org.eclipse.jetty.server.handler.ContextHandlerCollection; import org.eclipse.jetty.server.handler.DefaultHandler; -import org.eclipse.jetty.server.handler.HandlerCollection; public class WebAppsHotDeployExample { @@ -39,9 +37,9 @@ public static void main(String[] args) throws Exception Server server = new Server(8080); ContextHandlerCollection contexts = new ContextHandlerCollection(); - HandlerCollection handlers = new HandlerCollection(); - - handlers.setHandlers(new Handler[]{contexts, new DefaultHandler()}); + Handler.Sequence handlers = new Handler.Sequence(); + handlers.addHandler(contexts); + handlers.addHandler(new DefaultHandler()); server.setHandler(handlers); @@ -59,9 +57,10 @@ public static void main(String[] args) throws Exception { throw new FileNotFoundException("Missing System Property 'jetty.base'"); } - Path jettyBase = new File(jettyBaseProp).toPath().toAbsolutePath(); + Path jettyBase = Path.of(jettyBaseProp).toAbsolutePath(); - WebAppProvider webAppProvider = new WebAppProvider(); + ContextProvider webAppProvider = new ContextProvider(); + webAppProvider.setEnvironmentName("ee10"); webAppProvider.setMonitoredDirName(jettyBase.resolve("webapps").toString()); deploymentManager.addAppProvider(webAppProvider); diff --git a/embedded/error-handling/pom.xml b/embedded/error-handling/pom.xml index 2fd26fb..7d3dbe8 100644 --- a/embedded/error-handling/pom.xml +++ b/embedded/error-handling/pom.xml @@ -4,12 +4,12 @@ org.eclipse.jetty.examples.embedded jetty-embedded-examples - 11.0.x + 12.0.x error-handling - 11.0.x + 12.0.x jar - Jetty Examples :: Jetty 11.0.x :: Embedded :: Error Handling + Jetty Examples :: Jetty 12.0.x :: Embedded :: Error Handling @@ -19,8 +19,8 @@ - org.eclipse.jetty - jetty-webapp + org.eclipse.jetty.ee10 + jetty-ee10-webapp ${jetty.version} diff --git a/embedded/error-handling/src/main/java/examples/ErrorPageErrorHandlerExample.java b/embedded/error-handling/src/main/java/examples/ErrorPageErrorHandlerExample.java index 9d75d61..9ab0492 100644 --- a/embedded/error-handling/src/main/java/examples/ErrorPageErrorHandlerExample.java +++ b/embedded/error-handling/src/main/java/examples/ErrorPageErrorHandlerExample.java @@ -17,19 +17,18 @@ import java.io.InputStream; import java.net.HttpURLConnection; import java.net.URI; + import jakarta.servlet.DispatcherType; import jakarta.servlet.RequestDispatcher; -import jakarta.servlet.ServletException; import jakarta.servlet.http.HttpServlet; import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletResponse; - +import org.eclipse.jetty.ee10.servlet.DefaultServlet; +import org.eclipse.jetty.ee10.servlet.ErrorPageErrorHandler; +import org.eclipse.jetty.ee10.servlet.ServletContextHandler; +import org.eclipse.jetty.server.Handler; import org.eclipse.jetty.server.Server; import org.eclipse.jetty.server.handler.DefaultHandler; -import org.eclipse.jetty.server.handler.HandlerList; -import org.eclipse.jetty.servlet.DefaultServlet; -import org.eclipse.jetty.servlet.ErrorPageErrorHandler; -import org.eclipse.jetty.servlet.ServletContextHandler; import org.eclipse.jetty.util.IO; import org.eclipse.jetty.util.StringUtil; @@ -53,7 +52,7 @@ public static void main(String[] args) throws Exception errorPageErrorHandler.addErrorPage(HttpServletResponse.SC_REQUESTED_RANGE_NOT_SATISFIABLE, "/errors"); context.setErrorHandler(errorPageErrorHandler); - HandlerList handlers = new HandlerList(); + Handler.Sequence handlers = new Handler.Sequence(); handlers.addHandler(context); handlers.addHandler(new DefaultHandler()); // handle non-context errors server.setHandler(context); diff --git a/embedded/error-handling/src/main/java/examples/ErrorStatusExample.java b/embedded/error-handling/src/main/java/examples/ErrorStatusExample.java index 291854a..fdb2590 100644 --- a/embedded/error-handling/src/main/java/examples/ErrorStatusExample.java +++ b/embedded/error-handling/src/main/java/examples/ErrorStatusExample.java @@ -17,16 +17,15 @@ import java.io.InputStream; import java.net.HttpURLConnection; import java.net.URI; -import jakarta.servlet.ServletException; + import jakarta.servlet.http.HttpServlet; import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletResponse; - +import org.eclipse.jetty.ee10.servlet.DefaultServlet; +import org.eclipse.jetty.ee10.servlet.ServletContextHandler; +import org.eclipse.jetty.server.Handler; import org.eclipse.jetty.server.Server; import org.eclipse.jetty.server.handler.DefaultHandler; -import org.eclipse.jetty.server.handler.HandlerList; -import org.eclipse.jetty.servlet.DefaultServlet; -import org.eclipse.jetty.servlet.ServletContextHandler; import org.eclipse.jetty.util.IO; import static java.nio.charset.StandardCharsets.UTF_8; @@ -44,7 +43,7 @@ public static void main(String[] args) throws Exception context.setContextPath("/"); context.addServlet(RangeHandlingServlet.class, "/demo"); context.addServlet(DefaultServlet.class, "/"); // handle static content and errors for this context - HandlerList handlers = new HandlerList(); + Handler.Sequence handlers = new Handler.Sequence(); handlers.addHandler(context); handlers.addHandler(new DefaultHandler()); // handle non-context errors server.setHandler(context); diff --git a/embedded/file-server/pom.xml b/embedded/file-server/pom.xml index d888d64..3d5b8d2 100644 --- a/embedded/file-server/pom.xml +++ b/embedded/file-server/pom.xml @@ -4,12 +4,12 @@ org.eclipse.jetty.examples.embedded jetty-embedded-examples - 11.0.x + 12.0.x file-server - 11.0.x + 12.0.x jar - Jetty Examples :: Jetty 11.0.x :: Embedded :: File Server + Jetty Examples :: Jetty 12.0.x :: Embedded :: File Server @@ -19,8 +19,8 @@ - org.eclipse.jetty - jetty-webapp + org.eclipse.jetty.ee10 + jetty-ee10-webapp ${jetty.version} diff --git a/embedded/file-server/src/main/java/examples/ResourceHandlerFromClasspath.java b/embedded/file-server/src/main/java/examples/ResourceHandlerFromClasspath.java index 96f3687..7e0e777 100644 --- a/embedded/file-server/src/main/java/examples/ResourceHandlerFromClasspath.java +++ b/embedded/file-server/src/main/java/examples/ResourceHandlerFromClasspath.java @@ -19,6 +19,7 @@ import org.eclipse.jetty.server.Server; import org.eclipse.jetty.server.handler.ResourceHandler; import org.eclipse.jetty.util.resource.Resource; +import org.eclipse.jetty.util.resource.ResourceFactory; public class ResourceHandlerFromClasspath { @@ -40,9 +41,10 @@ public static void main(String[] args) throws Exception URI webRootUri = f.toURI().resolve("./").normalize(); System.err.println("WebRoot is " + webRootUri); + ResourceFactory resourceFactory = ResourceFactory.of(server); ResourceHandler handler = new ResourceHandler(); - handler.setBaseResource(Resource.newResource(webRootUri)); - handler.setDirectoriesListed(true); + handler.setBaseResource(resourceFactory.newResource(webRootUri)); + handler.setDirAllowed(true); server.setHandler(handler); diff --git a/embedded/file-server/src/main/java/examples/ResourceHandlerFromFileSystem.java b/embedded/file-server/src/main/java/examples/ResourceHandlerFromFileSystem.java index dc094c4..8ca9385 100644 --- a/embedded/file-server/src/main/java/examples/ResourceHandlerFromFileSystem.java +++ b/embedded/file-server/src/main/java/examples/ResourceHandlerFromFileSystem.java @@ -20,6 +20,7 @@ import org.eclipse.jetty.server.Server; import org.eclipse.jetty.server.handler.ResourceHandler; import org.eclipse.jetty.util.resource.PathResource; +import org.eclipse.jetty.util.resource.ResourceFactory; public class ResourceHandlerFromFileSystem { @@ -35,9 +36,10 @@ public static void main(String[] args) throws Exception } System.err.println("WebRoot is " + webRootPath); + ResourceFactory resourceFactory = ResourceFactory.of(server); ResourceHandler handler = new ResourceHandler(); - handler.setBaseResource(new PathResource(webRootPath)); - handler.setDirectoriesListed(true); + handler.setBaseResource(resourceFactory.newResource(webRootPath)); + handler.setDirAllowed(true); server.setHandler(handler); diff --git a/embedded/file-server/src/main/java/examples/ServletFileServerMultipleLocations.java b/embedded/file-server/src/main/java/examples/ServletFileServerMultipleLocations.java index 0fc8731..b429697 100644 --- a/embedded/file-server/src/main/java/examples/ServletFileServerMultipleLocations.java +++ b/embedded/file-server/src/main/java/examples/ServletFileServerMultipleLocations.java @@ -13,18 +13,18 @@ package examples; -import java.io.File; import java.net.URI; import java.net.URL; import java.nio.file.Path; import java.nio.file.Paths; +import org.eclipse.jetty.ee10.servlet.DefaultServlet; +import org.eclipse.jetty.ee10.servlet.ServletContextHandler; +import org.eclipse.jetty.ee10.servlet.ServletHolder; import org.eclipse.jetty.server.Server; import org.eclipse.jetty.server.ServerConnector; -import org.eclipse.jetty.servlet.DefaultServlet; -import org.eclipse.jetty.servlet.ServletContextHandler; -import org.eclipse.jetty.servlet.ServletHolder; import org.eclipse.jetty.util.resource.Resource; +import org.eclipse.jetty.util.resource.ResourceFactory; /** * Using a {@link ServletContextHandler} serve static file content from multiple locations. @@ -64,7 +64,8 @@ public static void main(String[] args) throws Exception // This is also known as the handler tree (in jetty speak) ServletContextHandler context = new ServletContextHandler(ServletContextHandler.SESSIONS); context.setContextPath("/"); - context.setBaseResource(Resource.newResource(webRootUri)); + ResourceFactory resourceFactory = ResourceFactory.of(context); + context.setBaseResource(resourceFactory.newResource(webRootUri)); context.setWelcomeFiles(new String[]{"index.html", "index.htm", "alt-index.html"}); server.setHandler(context); diff --git a/embedded/file-server/src/main/java/examples/ServletFileServerSingleLocation.java b/embedded/file-server/src/main/java/examples/ServletFileServerSingleLocation.java index b7747c7..0287339 100644 --- a/embedded/file-server/src/main/java/examples/ServletFileServerSingleLocation.java +++ b/embedded/file-server/src/main/java/examples/ServletFileServerSingleLocation.java @@ -16,12 +16,13 @@ import java.net.URI; import java.net.URL; +import org.eclipse.jetty.ee10.servlet.DefaultServlet; +import org.eclipse.jetty.ee10.servlet.ServletContextHandler; +import org.eclipse.jetty.ee10.servlet.ServletHolder; import org.eclipse.jetty.server.Server; import org.eclipse.jetty.server.ServerConnector; -import org.eclipse.jetty.servlet.DefaultServlet; -import org.eclipse.jetty.servlet.ServletContextHandler; -import org.eclipse.jetty.servlet.ServletHolder; import org.eclipse.jetty.util.resource.Resource; +import org.eclipse.jetty.util.resource.ResourceFactory; /** * Using a {@link ServletContextHandler} serve static file content from single location @@ -51,7 +52,8 @@ public static void main(String[] args) throws Exception ServletContextHandler context = new ServletContextHandler(ServletContextHandler.SESSIONS); context.setContextPath("/"); - context.setBaseResource(Resource.newResource(webRootUri)); + ResourceFactory resourceFactory = ResourceFactory.of(context); + context.setBaseResource(resourceFactory.newResource(webRootUri)); server.setHandler(context); ServletHolder holderPwd = new ServletHolder("default", DefaultServlet.class); diff --git a/embedded/file-upload/pom.xml b/embedded/file-upload/pom.xml index efbb16a..8fdf3d2 100644 --- a/embedded/file-upload/pom.xml +++ b/embedded/file-upload/pom.xml @@ -4,12 +4,12 @@ org.eclipse.jetty.examples.embedded jetty-embedded-examples - 11.0.x + 12.0.x file-upload - 11.0.x + 12.0.x jar - Jetty Examples :: Jetty 11.0.x :: Embedded :: File Upload + Jetty Examples :: Jetty 12.0.x :: Embedded :: File Upload @@ -19,8 +19,8 @@ - org.eclipse.jetty - jetty-servlet + org.eclipse.jetty.ee10 + jetty-ee10-servlet ${jetty.version} diff --git a/embedded/file-upload/src/main/java/examples/MultipartMimeUploadExample.java b/embedded/file-upload/src/main/java/examples/MultipartMimeUploadExample.java index 71f5d8b..6c163e8 100644 --- a/embedded/file-upload/src/main/java/examples/MultipartMimeUploadExample.java +++ b/embedded/file-upload/src/main/java/examples/MultipartMimeUploadExample.java @@ -17,40 +17,48 @@ import java.io.InputStream; import java.io.OutputStream; import java.io.PrintWriter; -import java.net.MalformedURLException; -import java.net.URI; -import java.net.URISyntaxException; -import java.net.URL; +import java.io.StringWriter; import java.net.URLEncoder; +import java.nio.charset.StandardCharsets; import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; import java.nio.file.StandardOpenOption; + import jakarta.servlet.MultipartConfigElement; import jakarta.servlet.ServletException; import jakarta.servlet.http.HttpServlet; import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletResponse; import jakarta.servlet.http.Part; - +import org.eclipse.jetty.ee10.servlet.ServletContextHandler; +import org.eclipse.jetty.ee10.servlet.ServletHolder; +import org.eclipse.jetty.http.HttpField; +import org.eclipse.jetty.http.HttpFields; +import org.eclipse.jetty.http.HttpHeader; +import org.eclipse.jetty.http.HttpStatus; +import org.eclipse.jetty.http.MultiPart; +import org.eclipse.jetty.http.MultiPartFormData; +import org.eclipse.jetty.io.Content; import org.eclipse.jetty.server.Handler; import org.eclipse.jetty.server.HttpConfiguration; import org.eclipse.jetty.server.HttpConnectionFactory; import org.eclipse.jetty.server.Request; +import org.eclipse.jetty.server.Response; import org.eclipse.jetty.server.SecureRequestCustomizer; import org.eclipse.jetty.server.Server; import org.eclipse.jetty.server.ServerConnector; import org.eclipse.jetty.server.SslConnectionFactory; -import org.eclipse.jetty.server.handler.AbstractHandler; import org.eclipse.jetty.server.handler.DefaultHandler; -import org.eclipse.jetty.server.handler.HandlerList; import org.eclipse.jetty.server.handler.ResourceHandler; import org.eclipse.jetty.server.handler.SecuredRedirectHandler; -import org.eclipse.jetty.servlet.ServletContextHandler; -import org.eclipse.jetty.servlet.ServletHolder; +import org.eclipse.jetty.util.BufferUtil; +import org.eclipse.jetty.util.Callback; import org.eclipse.jetty.util.IO; import org.eclipse.jetty.util.StringUtil; import org.eclipse.jetty.util.resource.Resource; +import org.eclipse.jetty.util.resource.ResourceFactory; +import org.eclipse.jetty.util.resource.Resources; import org.eclipse.jetty.util.ssl.SslContextFactory; public class MultipartMimeUploadExample @@ -60,6 +68,7 @@ public static void main(String[] args) throws Exception Server server = new Server(); int httpPort = 8080; int httpsPort = 8443; + ResourceFactory resourceFactory = ResourceFactory.of(server); // Setup HTTP Connector HttpConfiguration httpConf = new HttpConfiguration(); @@ -74,7 +83,7 @@ public static void main(String[] args) throws Exception // Setup SSL SslContextFactory.Server sslContextFactory = new SslContextFactory.Server(); - sslContextFactory.setKeyStoreResource(findKeyStore()); + sslContextFactory.setKeyStoreResource(findKeyStore(resourceFactory)); sslContextFactory.setKeyStorePassword("OBF:1vny1zlo1x8e1vnw1vn61x8g1zlu1vn4"); sslContextFactory.setKeyManagerPassword("OBF:1u2u1wml1z7s1z7a1wnl1u2g"); @@ -105,11 +114,11 @@ public static void main(String[] args) throws Exception MultipartConfigElement multipartConfig = new MultipartConfigElement(location, maxFileSize, maxRequestSize, fileSizeThreshold); // Add a Handlers for requests - HandlerList handlers = new HandlerList(); + Handler.Sequence handlers = new Handler.Sequence(); handlers.addHandler(new SecuredRedirectHandler()); - handlers.addHandler(newUploadHandler(multipartConfig, outputDir)); + handlers.addHandler(newUploadHandler(outputDir)); handlers.addHandler(newServletUploadHandler(multipartConfig, outputDir)); - handlers.addHandler(newResourceHandler()); + handlers.addHandler(newResourceHandler(resourceFactory)); handlers.addHandler(new DefaultHandler()); server.setHandler(handlers); @@ -117,25 +126,20 @@ public static void main(String[] args) throws Exception server.join(); } - private static URI findClassLoaderResource(String resourceName) throws URISyntaxException + private static Resource findKeyStore(ResourceFactory resourceFactory) { - ClassLoader cl = MultipartMimeUploadExample.class.getClassLoader(); - URL f = cl.getResource(resourceName); - if (f == null) + String resourceName = "ssl/keystore"; + Resource resource = resourceFactory.newClassLoaderResource(resourceName); + if (Resources.isReadableFile(resource)) { - throw new RuntimeException("Unable to find " + resourceName); + throw new RuntimeException("Unable to read " + resourceName); } - return f.toURI(); - } - - private static Resource findKeyStore() throws URISyntaxException, MalformedURLException - { - return Resource.newResource(findClassLoaderResource("ssl/keystore")); + return resource; } - private static Handler newUploadHandler(MultipartConfigElement multipartConfig, Path outputDir) throws IOException + private static Handler newUploadHandler(Path outputDir) throws IOException { - return new UploadHandler("/handler/upload", multipartConfig, outputDir); + return new UploadHandler("/handler/upload", outputDir); } private static ServletContextHandler newServletUploadHandler(MultipartConfigElement multipartConfig, Path outputDir) throws IOException @@ -152,12 +156,9 @@ private static ServletContextHandler newServletUploadHandler(MultipartConfigElem return context; } - private static Handler newResourceHandler() throws URISyntaxException, MalformedURLException + private static Handler newResourceHandler(ResourceFactory resourceFactory) { - URI indexUri = findClassLoaderResource("static-upload/index.html"); - URI staticUploadBaseUri = indexUri.resolve("./").normalize(); - Resource baseResource = Resource.newResource(staticUploadBaseUri); - + Resource baseResource = resourceFactory.newClassLoaderResource("static-upload/"); ResourceHandler resourceHandler = new ResourceHandler(); resourceHandler.setBaseResource(baseResource); @@ -176,35 +177,6 @@ private static Path ensureDirExists(Path path) throws IOException return dir; } - public static void processParts(HttpServletRequest request, HttpServletResponse response, Path outputDir) throws ServletException, IOException - { - response.setContentType("text/plain"); - response.setCharacterEncoding("utf-8"); - - PrintWriter out = response.getWriter(); - - for (Part part : request.getParts()) - { - out.printf("Got Part[%s].size=%s%n", part.getName(), part.getSize()); - out.printf("Got Part[%s].contentType=%s%n", part.getName(), part.getContentType()); - out.printf("Got Part[%s].submittedFileName=%s%n", part.getName(), part.getSubmittedFileName()); - String filename = part.getSubmittedFileName(); - if (StringUtil.isNotBlank(filename)) - { - // ensure we don't have "/" and ".." in the raw form. - filename = URLEncoder.encode(filename, "utf-8"); - - Path outputFile = outputDir.resolve(filename); - try (InputStream inputStream = part.getInputStream(); - OutputStream outputStream = Files.newOutputStream(outputFile, StandardOpenOption.CREATE, StandardOpenOption.TRUNCATE_EXISTING)) - { - IO.copy(inputStream, outputStream); - out.printf("Saved Part[%s] to %s%n", part.getName(), outputFile); - } - } - } - } - public static class SaveUploadServlet extends HttpServlet { private final Path outputDir; @@ -218,45 +190,117 @@ public SaveUploadServlet(Path outputDir) throws IOException @Override protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { - processParts(request, response, outputDir); + response.setContentType("text/plain"); + response.setCharacterEncoding("utf-8"); + + PrintWriter out = response.getWriter(); + + for (Part part : request.getParts()) + { + out.printf("Got Part[%s].size=%s%n", part.getName(), part.getSize()); + out.printf("Got Part[%s].contentType=%s%n", part.getName(), part.getContentType()); + out.printf("Got Part[%s].submittedFileName=%s%n", part.getName(), part.getSubmittedFileName()); + String filename = part.getSubmittedFileName(); + if (StringUtil.isNotBlank(filename)) + { + // ensure we don't have "/" and ".." in the raw form. + filename = URLEncoder.encode(filename, "utf-8"); + + Path outputFile = outputDir.resolve(filename); + try (InputStream inputStream = part.getInputStream(); + OutputStream outputStream = Files.newOutputStream(outputFile, StandardOpenOption.CREATE, StandardOpenOption.TRUNCATE_EXISTING)) + { + IO.copy(inputStream, outputStream); + out.printf("Saved Part[%s] to %s%n", part.getName(), outputFile); + } + } + } } } - public static class UploadHandler extends AbstractHandler + public static class UploadHandler extends Handler.Abstract { private final String contextPath; - private final MultipartConfigElement multipartConfig; private final Path outputDir; - public UploadHandler(String contextPath, MultipartConfigElement multipartConfig, Path outputDir) throws IOException + public UploadHandler(String contextPath, Path outputDir) throws IOException { super(); this.contextPath = contextPath; - this.multipartConfig = multipartConfig; this.outputDir = outputDir.resolve("handler"); ensureDirExists(this.outputDir); } @Override - public void handle(String target, Request baseRequest, HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException + public boolean handle(Request request, Response response, Callback callback) throws Exception { - if (!target.startsWith(contextPath)) + if (!request.getHttpURI().getPath().startsWith(contextPath)) { // not meant for us, skip it. - return; + return false; } if (!request.getMethod().equalsIgnoreCase("POST")) { - response.sendError(HttpServletResponse.SC_METHOD_NOT_ALLOWED); - return; + // Not a POST method + Response.writeError(request, response, callback, HttpStatus.METHOD_NOT_ALLOWED_405); + return true; + } + + String contentType = request.getHeaders().get(HttpHeader.CONTENT_TYPE); + if (!HttpField.getValueParameters(contentType, null).equals("multipart/form-data")) + { + // Not a content-type supporting multi-part + Response.writeError(request, response, callback, HttpStatus.NOT_ACCEPTABLE_406); + return true; + } + + String boundary = MultiPart.extractBoundary(contentType); + MultiPartFormData.Parser formData = new MultiPartFormData.Parser(boundary); + formData.setFilesDirectory(outputDir); + + try + { + String responseBody = process(formData.parse(request).join()); // May block waiting for multipart form data. + response.setStatus(HttpStatus.OK_200); + response.write(true, BufferUtil.toBuffer(responseBody), callback); + } + catch (Exception x) + { + Response.writeError(request, response, callback, x); + } + return true; + } + + private String process(MultiPartFormData.Parts parts) throws IOException + { + StringWriter body = new StringWriter(); + PrintWriter out = new PrintWriter(body); + + for (MultiPart.Part part : parts) + { + out.printf("Got Part[%s].length=%s%n", part.getName(), part.getLength()); + HttpFields headers = part.getHeaders(); + for (HttpField field: headers) + out.printf("Got Part[%s].header[%s]=%s%n", part.getName(), field.getName(), field.getValue()); + out.printf("Got Part[%s].fileName=%s%n", part.getName(), part.getFileName()); + String filename = part.getFileName(); + if (StringUtil.isNotBlank(filename)) + { + // ensure we don't have "/" and ".." in the raw form. + filename = URLEncoder.encode(filename, StandardCharsets.UTF_8); + + Path outputFile = outputDir.resolve(filename); + try (InputStream inputStream = Content.Source.asInputStream(part.getContentSource()); + OutputStream outputStream = Files.newOutputStream(outputFile, StandardOpenOption.CREATE, StandardOpenOption.TRUNCATE_EXISTING)) + { + IO.copy(inputStream, outputStream); + out.printf("Saved Part[%s] to %s%n", part.getName(), outputFile); + } + } } - // Ensure request knows about MultiPartConfigElement setup. - request.setAttribute(Request.__MULTIPART_CONFIG_ELEMENT, multipartConfig); - // Process the request - processParts(request, response, outputDir); - baseRequest.setHandled(true); + return body.toString(); } } } diff --git a/embedded/form-post/pom.xml b/embedded/form-post/pom.xml index 1d491da..b428654 100644 --- a/embedded/form-post/pom.xml +++ b/embedded/form-post/pom.xml @@ -4,12 +4,12 @@ org.eclipse.jetty.examples.embedded jetty-embedded-examples - 11.0.x + 12.0.x form-post - 11.0.x + 12.0.x jar - Jetty Examples :: Jetty 11.0.x :: Embedded :: HTML Form POST + Jetty Examples :: Jetty 12.0.x :: Embedded :: HTML Form POST @@ -25,8 +25,8 @@ - org.eclipse.jetty - jetty-servlet + org.eclipse.jetty.ee10 + jetty-ee10-servlet ${jetty.version} diff --git a/embedded/form-post/src/main/java/examples/FormRestrictionsExample.java b/embedded/form-post/src/main/java/examples/FormRestrictionsExample.java index ded77c3..696b536 100644 --- a/embedded/form-post/src/main/java/examples/FormRestrictionsExample.java +++ b/embedded/form-post/src/main/java/examples/FormRestrictionsExample.java @@ -15,6 +15,7 @@ import java.io.IOException; import java.net.URI; +import java.nio.file.Path; import java.util.Arrays; import java.util.concurrent.ExecutionException; import java.util.concurrent.TimeoutException; @@ -23,20 +24,23 @@ import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletResponse; +import org.eclipse.jetty.client.FormRequestContent; import org.eclipse.jetty.client.HttpClient; -import org.eclipse.jetty.client.api.ContentResponse; -import org.eclipse.jetty.client.api.Request; -import org.eclipse.jetty.client.util.FormContentProvider; -import org.eclipse.jetty.client.util.MultiPartContentProvider; -import org.eclipse.jetty.client.util.StringContentProvider; +import org.eclipse.jetty.client.ContentResponse; +import org.eclipse.jetty.client.MultiPartRequestContent; +import org.eclipse.jetty.client.Request; +import org.eclipse.jetty.client.StringRequestContent; +import org.eclipse.jetty.http.HttpFields; import org.eclipse.jetty.http.HttpStatus; +import org.eclipse.jetty.http.MultiPart; +import org.eclipse.jetty.server.Handler; 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.server.handler.DefaultHandler; -import org.eclipse.jetty.server.handler.HandlerList; -import org.eclipse.jetty.servlet.ServletContextHandler; +import org.eclipse.jetty.server.Handler.Sequence; +import org.eclipse.jetty.ee10.servlet.ServletContextHandler; import org.eclipse.jetty.util.Fields; import org.eclipse.jetty.util.StringUtil; import org.eclipse.jetty.util.component.LifeCycle; @@ -96,7 +100,7 @@ public void startServer(int port) throws Exception servletContextHandler.addServlet(ServiceFormServlet.class, "/form/service") .getRegistration().setMultipartConfig(multipartConfig); - HandlerList handlers = new HandlerList(); + Handler.Sequence handlers = new Handler.Sequence(); handlers.addHandler(servletContextHandler); handlers.addHandler(new DefaultHandler()); @@ -124,16 +128,15 @@ public void submitVariousForms(HttpClient client, URI uri) submitForm(httpMethod + " with application/x-www-form-urlencoded", client.newRequest(uri) .method(httpMethod) - .content(new FormContentProvider(wwwForm))); + .body(new FormRequestContent(wwwForm))); - MultiPartContentProvider multipartForm = new MultiPartContentProvider(); - multipartForm.addFieldPart("UserName", new StringContentProvider("Andrés Dorantes de Carranza"), null); - multipartForm.close(); + MultiPartRequestContent multiPartForm = new MultiPartRequestContent(); + multiPartForm.addPart(new MultiPart.ContentSourcePart("UserName", null, HttpFields.EMPTY, new StringRequestContent("Andrés Dorantes de Carranza"))); submitForm(httpMethod + " with multipart/form-data", client.newRequest(uri) .method(httpMethod) - .content(multipartForm)); + .body(multiPartForm)); } } @@ -141,7 +144,7 @@ private void submitForm(String description, Request request) { try { - ContentResponse response = request.header("Accept", "text/plain").send(); + ContentResponse response = request.headers((fields) -> fields.put("Accept", "text/plain")).send(); if (response.getStatus() == HttpStatus.OK_200) { System.out.printf("%-17s - %-44s -> OK: %s%n", request.getPath(), description, response.getContentAsString().trim()); diff --git a/embedded/http-config/pom.xml b/embedded/http-config/pom.xml index 14c65fb..eb34ab8 100644 --- a/embedded/http-config/pom.xml +++ b/embedded/http-config/pom.xml @@ -4,12 +4,12 @@ org.eclipse.jetty.examples.embedded jetty-embedded-examples - 11.0.x + 12.0.x http-config - 11.0.x + 12.0.x jar - Jetty Examples :: Jetty 11.0.x :: Embedded :: HTTP Configuration + Jetty Examples :: Jetty 12.0.x :: Embedded :: HTTP Configuration @@ -25,8 +25,8 @@ - org.eclipse.jetty - jetty-servlet + org.eclipse.jetty.ee10 + jetty-ee10-servlet ${jetty.version} diff --git a/embedded/http-config/src/main/java/examples/HttpConfigExample.java b/embedded/http-config/src/main/java/examples/HttpConfigExample.java index 07bbe22..3d3c6a1 100644 --- a/embedded/http-config/src/main/java/examples/HttpConfigExample.java +++ b/embedded/http-config/src/main/java/examples/HttpConfigExample.java @@ -13,20 +13,21 @@ package examples; -import java.io.IOException; import java.net.URI; -import jakarta.servlet.ServletException; -import jakarta.servlet.http.HttpServletRequest; -import jakarta.servlet.http.HttpServletResponse; +import java.nio.charset.StandardCharsets; +import org.eclipse.jetty.client.ContentResponse; import org.eclipse.jetty.client.HttpClient; -import org.eclipse.jetty.client.api.ContentResponse; +import org.eclipse.jetty.http.HttpHeader; +import org.eclipse.jetty.server.Handler; import org.eclipse.jetty.server.HttpConfiguration; import org.eclipse.jetty.server.HttpConnectionFactory; import org.eclipse.jetty.server.Request; +import org.eclipse.jetty.server.Response; import org.eclipse.jetty.server.Server; import org.eclipse.jetty.server.ServerConnector; -import org.eclipse.jetty.server.handler.AbstractHandler; +import org.eclipse.jetty.util.BufferUtil; +import org.eclipse.jetty.util.Callback; import org.eclipse.jetty.util.component.LifeCycle; public class HttpConfigExample @@ -50,15 +51,14 @@ public static void main(String[] args) throws Exception connectorDefault.setPort(9191); server.addConnector(connectorDefault); - server.setHandler(new AbstractHandler() + server.setHandler(new Handler.Abstract() { @Override - public void handle(String target, Request baseRequest, HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException + public boolean handle(Request request, Response response, Callback callback) { - response.setCharacterEncoding("utf-8"); - response.setContentType("text/plain"); - response.getWriter().println("Greetings."); - baseRequest.setHandled(true); + response.getHeaders().put(HttpHeader.CONTENT_TYPE, "text/plain; charset=utf-8"); + response.write(true, BufferUtil.toBuffer("Greetings.", StandardCharsets.UTF_8), callback); + return true; } }); diff --git a/embedded/jndi/pom.xml b/embedded/jndi/pom.xml index 1b688fd..1a795ce 100644 --- a/embedded/jndi/pom.xml +++ b/embedded/jndi/pom.xml @@ -4,23 +4,23 @@ org.eclipse.jetty.examples.embedded jetty-embedded-examples - 11.0.x + 12.0.x jndi - 11.0.x + 12.0.x jar - Jetty Examples :: Jetty 11.0.x :: Embedded :: JNDI + Jetty Examples :: Jetty 12.0.x :: Embedded :: JNDI - org.eclipse.jetty - jetty-plus + jetty-server ${jetty.version} + - org.eclipse.jetty - jetty-server + org.eclipse.jetty.ee10 + jetty-ee10-plus ${jetty.version} diff --git a/embedded/jndi/src/main/java/examples/WebAppContextWithJNDI.java b/embedded/jndi/src/main/java/examples/WebAppContextWithJNDI.java index 5be8da4..5a11906 100644 --- a/embedded/jndi/src/main/java/examples/WebAppContextWithJNDI.java +++ b/embedded/jndi/src/main/java/examples/WebAppContextWithJNDI.java @@ -25,17 +25,17 @@ import javax.naming.InitialContext; import javax.naming.NameNotFoundException; import javax.naming.NamingException; + import jakarta.servlet.ServletException; import jakarta.servlet.http.HttpServlet; import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletResponse; - +import org.eclipse.jetty.ee10.webapp.WebAppContext; import org.eclipse.jetty.server.Server; import org.eclipse.jetty.server.ServerConnector; import org.eclipse.jetty.util.IO; import org.eclipse.jetty.util.component.LifeCycle; -import org.eclipse.jetty.util.resource.PathResource; -import org.eclipse.jetty.webapp.WebAppContext; +import org.eclipse.jetty.util.resource.ResourceFactory; public class WebAppContextWithJNDI { @@ -91,7 +91,7 @@ public void startServer(int port) throws Exception WebAppContext context = new WebAppContext(); context.setContextPath("/"); // This directory only has WEB-INF/web.xml - context.setBaseResource(new PathResource(Paths.get("src/main/webroots/jndi-root"))); + context.setBaseResource(ResourceFactory.of(context).newResource(Paths.get("src/main/webroots/jndi-root"))); context.addServlet(JndiDumpServlet.class, "/jndi-dump"); new org.eclipse.jetty.plus.jndi.Resource(null, "val/foo", Integer.valueOf(770)); diff --git a/embedded/pom.xml b/embedded/pom.xml index 6d94a81..9ef3b88 100644 --- a/embedded/pom.xml +++ b/embedded/pom.xml @@ -4,13 +4,13 @@ org.eclipse.jetty.examples jetty-examples - 11.0.x + 12.0.x org.eclipse.jetty.examples.embedded jetty-embedded-examples - 11.0.x + 12.0.x pom - Jetty Examples :: Jetty 11.0.x :: Embedded + Jetty Examples :: Jetty 12.0.x :: Embedded client diff --git a/embedded/redirect/pom.xml b/embedded/redirect/pom.xml index 4db85e2..350a206 100644 --- a/embedded/redirect/pom.xml +++ b/embedded/redirect/pom.xml @@ -4,12 +4,12 @@ org.eclipse.jetty.examples.embedded jetty-embedded-examples - 11.0.x + 12.0.x redirect - 11.0.x + 12.0.x jar - Jetty Examples :: Jetty 11.0.x :: Embedded :: Redirect + Jetty Examples :: Jetty 12.0.x :: Embedded :: Redirect @@ -23,8 +23,8 @@ ${jetty.version} - org.eclipse.jetty - jetty-servlet + org.eclipse.jetty.ee10 + jetty-ee10-servlet ${jetty.version} diff --git a/embedded/redirect/src/main/java/examples/HelloHandler.java b/embedded/redirect/src/main/java/examples/HelloHandler.java index 38aac41..c0d8682 100644 --- a/embedded/redirect/src/main/java/examples/HelloHandler.java +++ b/embedded/redirect/src/main/java/examples/HelloHandler.java @@ -1,4 +1,4 @@ -// +package examples;// // ======================================================================== // Copyright (c) 1995 Mort Bay Consulting Pty Ltd and others. // @@ -11,17 +11,16 @@ // ======================================================================== // -package examples; - -import java.io.IOException; -import jakarta.servlet.ServletException; -import jakarta.servlet.http.HttpServletRequest; -import jakarta.servlet.http.HttpServletResponse; +import java.nio.charset.StandardCharsets; +import org.eclipse.jetty.http.HttpHeader; +import org.eclipse.jetty.server.Handler; import org.eclipse.jetty.server.Request; -import org.eclipse.jetty.server.handler.AbstractHandler; +import org.eclipse.jetty.server.Response; +import org.eclipse.jetty.util.BufferUtil; +import org.eclipse.jetty.util.Callback; -public class HelloHandler extends AbstractHandler +public class HelloHandler extends Handler.Abstract { private final String msg; @@ -31,10 +30,10 @@ public HelloHandler(String msg) } @Override - public void handle(String target, Request baseRequest, HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException + public boolean handle(Request request, Response response, Callback callback) throws Exception { - response.setContentType("text/plain"); - response.getWriter().printf("%s%n", msg); - baseRequest.setHandled(true); + response.getHeaders().put(HttpHeader.CONTENT_TYPE, "text/plain; charset=utf-8"); + response.write(true, BufferUtil.toBuffer(String.format("%s%n", msg), StandardCharsets.UTF_8), callback); + return true; } } diff --git a/embedded/redirect/src/main/java/examples/SecuredRedirectHandlerExample.java b/embedded/redirect/src/main/java/examples/SecuredRedirectHandlerExample.java index 9e863fa..a302cc8 100644 --- a/embedded/redirect/src/main/java/examples/SecuredRedirectHandlerExample.java +++ b/embedded/redirect/src/main/java/examples/SecuredRedirectHandlerExample.java @@ -16,24 +16,23 @@ import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; -import java.net.MalformedURLException; import java.net.Socket; import java.net.URI; -import java.net.URISyntaxException; -import java.net.URL; import java.nio.charset.StandardCharsets; import org.eclipse.jetty.http.HttpTester; +import org.eclipse.jetty.server.Handler; import org.eclipse.jetty.server.HttpConfiguration; import org.eclipse.jetty.server.HttpConnectionFactory; import org.eclipse.jetty.server.SecureRequestCustomizer; import org.eclipse.jetty.server.Server; import org.eclipse.jetty.server.ServerConnector; import org.eclipse.jetty.server.SslConnectionFactory; -import org.eclipse.jetty.server.handler.HandlerList; import org.eclipse.jetty.server.handler.SecuredRedirectHandler; import org.eclipse.jetty.util.component.LifeCycle; import org.eclipse.jetty.util.resource.Resource; +import org.eclipse.jetty.util.resource.ResourceFactory; +import org.eclipse.jetty.util.resource.Resources; import org.eclipse.jetty.util.ssl.SslContextFactory; public class SecuredRedirectHandlerExample @@ -86,7 +85,7 @@ public void startServer(int httpPort, int httpsPort) throws Exception // Setup SSL SslContextFactory.Server sslContextFactory = new SslContextFactory.Server(); - sslContextFactory.setKeyStoreResource(findKeyStore()); + sslContextFactory.setKeyStoreResource(findKeyStore(ResourceFactory.of(server))); sslContextFactory.setKeyStorePassword("OBF:1vny1zlo1x8e1vnw1vn61x8g1zlu1vn4"); sslContextFactory.setKeyManagerPassword("OBF:1u2u1wml1z7s1z7a1wnl1u2g"); @@ -103,7 +102,7 @@ public void startServer(int httpPort, int httpsPort) throws Exception server.addConnector(httpsConnector); // Add a Handlers for requests - HandlerList handlers = new HandlerList(); + Handler.Sequence handlers = new Handler.Sequence(); handlers.addHandler(new SecuredRedirectHandler()); handlers.addHandler(new HelloHandler("Hello Secure World")); server.setHandler(handlers); @@ -137,16 +136,14 @@ private void testRequest(String host, int port, String rawRequest) throws IOExce } } - private static Resource findKeyStore() throws URISyntaxException, MalformedURLException + private static Resource findKeyStore(ResourceFactory resourceFactory) { - ClassLoader cl = SecuredRedirectHandlerExample.class.getClassLoader(); - String keystoreResource = "ssl/keystore"; - URL f = cl.getResource(keystoreResource); - if (f == null) + String resourceName = "ssl/keystore"; + Resource resource = resourceFactory.newClassLoaderResource(resourceName); + if (Resources.isReadableFile(resource)) { - throw new RuntimeException("Unable to find " + keystoreResource); + throw new RuntimeException("Unable to read " + resourceName); } - - return Resource.newResource(f.toURI()); + return resource; } } diff --git a/embedded/rewrite/pom.xml b/embedded/rewrite/pom.xml index 7c96425..29c1f38 100644 --- a/embedded/rewrite/pom.xml +++ b/embedded/rewrite/pom.xml @@ -4,12 +4,12 @@ org.eclipse.jetty.examples.embedded jetty-embedded-examples - 11.0.x + 12.0.x rewrite - 11.0.x + 12.0.x jar - Jetty Examples :: Jetty 11.0.x :: Embedded :: Rewrite + Jetty Examples :: Jetty 12.0.x :: Embedded :: Rewrite @@ -28,8 +28,8 @@ ${jetty.version} - org.eclipse.jetty - jetty-servlet + org.eclipse.jetty.ee10 + jetty-ee10-servlet ${jetty.version} diff --git a/embedded/rewrite/src/main/java/examples/MovedPermanentlyRuleExample.java b/embedded/rewrite/src/main/java/examples/MovedPermanentlyRuleExample.java index 0ead92f..0b08cda 100644 --- a/embedded/rewrite/src/main/java/examples/MovedPermanentlyRuleExample.java +++ b/embedded/rewrite/src/main/java/examples/MovedPermanentlyRuleExample.java @@ -13,7 +13,6 @@ package examples; -import java.io.File; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; @@ -25,19 +24,20 @@ import java.nio.file.Paths; import java.util.regex.Matcher; import java.util.regex.Pattern; -import jakarta.servlet.http.HttpServletRequest; -import jakarta.servlet.http.HttpServletResponse; +import org.eclipse.jetty.ee10.servlet.ServletContextHandler; +import org.eclipse.jetty.http.HttpHeader; +import org.eclipse.jetty.http.HttpStatus; import org.eclipse.jetty.http.HttpTester; -import org.eclipse.jetty.rewrite.handler.RedirectUtil; import org.eclipse.jetty.rewrite.handler.RewriteHandler; import org.eclipse.jetty.rewrite.handler.Rule; +import org.eclipse.jetty.server.Handler; +import org.eclipse.jetty.server.Response; import org.eclipse.jetty.server.Server; import org.eclipse.jetty.server.ServerConnector; -import org.eclipse.jetty.server.handler.HandlerList; -import org.eclipse.jetty.servlet.ServletContextHandler; +import org.eclipse.jetty.util.Callback; import org.eclipse.jetty.util.component.LifeCycle; -import org.eclipse.jetty.util.resource.PathResource; +import org.eclipse.jetty.util.resource.ResourceFactory; public class MovedPermanentlyRuleExample { @@ -77,7 +77,7 @@ public void startServer(int port) throws Exception connector.setPort(port); server.addConnector(connector); - HandlerList handlers = new HandlerList(); + Handler.Sequence handlers = new Handler.Sequence(); server.setHandler(handlers); // Add Rewrite / Redirect handlers + Rules @@ -98,7 +98,7 @@ public void startServer(int port) throws Exception ServletContextHandler context = new ServletContextHandler(); handlers.addHandler(context); context.setContextPath("/"); - context.setBaseResource(new PathResource(webRootPath)); + context.setBaseResource(ResourceFactory.of(context).newResource(webRootPath)); context.setWelcomeFiles(new String[]{"index.html"}); context.addServlet(DumpServlet.class, "/dump/*"); @@ -162,18 +162,24 @@ public void setReplacement(String replacement) } @Override - public String matchAndApply(String target, HttpServletRequest request, HttpServletResponse response) throws IOException + public Handler matchAndApply(Handler input) { - Matcher matcher = regex.matcher(request.getRequestURL()); + Matcher matcher = regex.matcher(input.getHttpURI().toString()); boolean matches = matcher.matches(); if (matches) { - String location = response.encodeRedirectURL(replacement); - response.setHeader("Location", RedirectUtil.toRedirectURL(request, location)); - response.setStatus(HttpServletResponse.SC_MOVED_PERMANENTLY); - response.getOutputStream().flush(); // no output / content - response.getOutputStream().close(); - return location; + return new Handler(input) + { + @Override + protected boolean handle(Response response, Callback callback) + { + String location = Response.toRedirectURI(input, replacement); + response.setStatus(HttpStatus.MOVED_TEMPORARILY_302); + response.getHeaders().put(HttpHeader.LOCATION, location); + callback.succeeded(); + return true; + } + }; } return null; } diff --git a/embedded/servlet-config/pom.xml b/embedded/servlet-config/pom.xml index d4420d6..e7565fb 100644 --- a/embedded/servlet-config/pom.xml +++ b/embedded/servlet-config/pom.xml @@ -4,12 +4,12 @@ org.eclipse.jetty.examples.embedded jetty-embedded-examples - 11.0.x + 12.0.x servlet-config - 11.0.x + 12.0.x jar - Jetty Examples :: Jetty 11.0.x :: Embedded :: Servlet Configuration + Jetty Examples :: Jetty 12.0.x :: Embedded :: Servlet Configuration @@ -19,8 +19,8 @@ - org.eclipse.jetty - jetty-servlet + org.eclipse.jetty.ee10 + jetty-ee10-servlet ${jetty.version} diff --git a/embedded/servlet-config/src/main/java/examples/AddFilterMultipleMapping.java b/embedded/servlet-config/src/main/java/examples/AddFilterMultipleMapping.java index 88d2909..a7dbdbc 100644 --- a/embedded/servlet-config/src/main/java/examples/AddFilterMultipleMapping.java +++ b/embedded/servlet-config/src/main/java/examples/AddFilterMultipleMapping.java @@ -28,11 +28,12 @@ import org.eclipse.jetty.server.Server; import org.eclipse.jetty.server.ServerConnector; -import org.eclipse.jetty.servlet.DefaultServlet; -import org.eclipse.jetty.servlet.FilterHolder; -import org.eclipse.jetty.servlet.ServletContextHandler; -import org.eclipse.jetty.servlet.ServletHolder; +import org.eclipse.jetty.ee10.servlet.DefaultServlet; +import org.eclipse.jetty.ee10.servlet.FilterHolder; +import org.eclipse.jetty.ee10.servlet.ServletContextHandler; +import org.eclipse.jetty.ee10.servlet.ServletHolder; import org.eclipse.jetty.util.resource.Resource; +import org.eclipse.jetty.util.resource.ResourceFactory; public class AddFilterMultipleMapping { @@ -84,7 +85,7 @@ public static void main(String[] args) throws Exception // This is also known as the handler tree (in jetty speak) ServletContextHandler context = new ServletContextHandler(ServletContextHandler.SESSIONS); context.setContextPath("/"); - context.setBaseResource(Resource.newResource(webRootUri)); + context.setBaseResource(ResourceFactory.of(context).newResource(webRootUri)); server.setHandler(context); EnumSet dispatches = EnumSet.allOf(DispatcherType.class); diff --git a/embedded/servlet-security/pom.xml b/embedded/servlet-security/pom.xml index c60eeef..2bd6cb2 100644 --- a/embedded/servlet-security/pom.xml +++ b/embedded/servlet-security/pom.xml @@ -4,12 +4,12 @@ org.eclipse.jetty.examples.embedded jetty-embedded-examples - 11.0.x + 12.0.x servlet-security - 11.0.x + 12.0.x jar - Jetty Examples :: Jetty 11.0.x :: Embedded :: Servlet Security Constraints + Jetty Examples :: Jetty 12.0.x :: Embedded :: Servlet Security Constraints @@ -19,8 +19,8 @@ - org.eclipse.jetty - jetty-servlet + org.eclipse.jetty.ee10 + jetty-ee10-servlet ${jetty.version} diff --git a/embedded/servlet-security/src/main/java/examples/ServletTransportGuaranteeExample.java b/embedded/servlet-security/src/main/java/examples/ServletTransportGuaranteeExample.java index e420de1..65aab5e 100644 --- a/embedded/servlet-security/src/main/java/examples/ServletTransportGuaranteeExample.java +++ b/embedded/servlet-security/src/main/java/examples/ServletTransportGuaranteeExample.java @@ -13,12 +13,11 @@ package examples; -import java.net.MalformedURLException; -import java.net.URISyntaxException; -import java.net.URL; - -import org.eclipse.jetty.security.ConstraintAware; -import org.eclipse.jetty.security.ConstraintMapping; +import org.eclipse.jetty.ee10.servlet.ServletContextHandler; +import org.eclipse.jetty.ee10.servlet.ServletHolder; +import org.eclipse.jetty.ee10.servlet.security.ConstraintAware; +import org.eclipse.jetty.ee10.servlet.security.ConstraintMapping; +import org.eclipse.jetty.security.Constraint; import org.eclipse.jetty.security.SecurityHandler; import org.eclipse.jetty.server.HttpConfiguration; import org.eclipse.jetty.server.HttpConnectionFactory; @@ -26,10 +25,9 @@ import org.eclipse.jetty.server.Server; import org.eclipse.jetty.server.ServerConnector; import org.eclipse.jetty.server.SslConnectionFactory; -import org.eclipse.jetty.servlet.ServletContextHandler; -import org.eclipse.jetty.servlet.ServletHolder; 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.util.resource.Resources; import org.eclipse.jetty.util.ssl.SslContextFactory; public class ServletTransportGuaranteeExample @@ -39,6 +37,7 @@ public static void main(String[] args) throws Exception Server server = new Server(); int httpPort = 8080; int httpsPort = 8443; + ResourceFactory resourceFactory = ResourceFactory.of(server); // Setup HTTP Connector HttpConfiguration httpConf = new HttpConfiguration(); @@ -53,7 +52,7 @@ public static void main(String[] args) throws Exception // Setup SSL SslContextFactory.Server sslContextFactory = new SslContextFactory.Server(); - sslContextFactory.setKeyStoreResource(findKeyStore()); + sslContextFactory.setKeyStoreResource(findKeyStore(resourceFactory)); sslContextFactory.setKeyStorePassword("OBF:1vny1zlo1x8e1vnw1vn61x8g1zlu1vn4"); sslContextFactory.setKeyManagerPassword("OBF:1u2u1wml1z7s1z7a1wnl1u2g"); @@ -82,8 +81,9 @@ public static void main(String[] args) throws Exception ConstraintAware constraint = (ConstraintAware)security; ConstraintMapping mapping = new ConstraintMapping(); mapping.setPathSpec("/*"); - Constraint dc = new Constraint(); - dc.setDataConstraint(Constraint.DC_CONFIDENTIAL); + Constraint dc = new Constraint.Builder() + .transport(Constraint.Transport.SECURE) + .build(); mapping.setConstraint(dc); constraint.addConstraintMapping(mapping); } @@ -102,16 +102,14 @@ public static void main(String[] args) throws Exception server.join(); } - private static Resource findKeyStore() throws URISyntaxException, MalformedURLException + private static Resource findKeyStore(ResourceFactory resourceFactory) { - ClassLoader cl = ServletTransportGuaranteeExample.class.getClassLoader(); - String keystoreResource = "ssl/keystore"; - URL f = cl.getResource(keystoreResource); - if (f == null) + String resourceName = "ssl/keystore"; + Resource resource = resourceFactory.newClassLoaderResource(resourceName); + if (Resources.isReadableFile(resource)) { - throw new RuntimeException("Unable to find " + keystoreResource); + throw new RuntimeException("Unable to read " + resourceName); } - - return Resource.newResource(f.toURI()); + return resource; } } diff --git a/embedded/simple-server/pom.xml b/embedded/simple-server/pom.xml index 9e0a2c4..d5cddfa 100644 --- a/embedded/simple-server/pom.xml +++ b/embedded/simple-server/pom.xml @@ -4,12 +4,12 @@ org.eclipse.jetty.examples.embedded jetty-embedded-examples - 11.0.x + 12.0.x simple-server - 11.0.x + 12.0.x jar - Jetty Examples :: Jetty 11.0.x :: Embedded :: Simple Server + Jetty Examples :: Jetty 12.0.x :: Embedded :: Simple Server @@ -19,8 +19,8 @@ - org.eclipse.jetty - jetty-webapp + org.eclipse.jetty.ee10 + jetty-ee10-webapp ${jetty.version} diff --git a/embedded/virtual-hosts/pom.xml b/embedded/virtual-hosts/pom.xml index a018b15..4643c49 100644 --- a/embedded/virtual-hosts/pom.xml +++ b/embedded/virtual-hosts/pom.xml @@ -4,12 +4,12 @@ org.eclipse.jetty.examples.embedded jetty-embedded-examples - 11.0.x + 12.0.x virtual-hosts - 11.0.x + 12.0.x jar - Jetty Examples :: Jetty 11.0.x :: Embedded :: Virtual Hosts + Jetty Examples :: Jetty 12.0.x :: Embedded :: Virtual Hosts @@ -19,8 +19,8 @@ - org.eclipse.jetty - jetty-servlet + org.eclipse.jetty.ee10 + jetty-ee10-servlet ${jetty.version} diff --git a/embedded/virtual-hosts/src/main/java/VirtualHostsExample.java b/embedded/virtual-hosts/src/main/java/VirtualHostsExample.java index 270513a..a3a7656 100644 --- a/embedded/virtual-hosts/src/main/java/VirtualHostsExample.java +++ b/embedded/virtual-hosts/src/main/java/VirtualHostsExample.java @@ -14,15 +14,17 @@ import java.io.IOException; import java.net.Socket; import java.nio.charset.StandardCharsets; +import java.util.List; + import jakarta.servlet.http.HttpServlet; import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletResponse; import org.eclipse.jetty.server.Server; import org.eclipse.jetty.server.handler.ContextHandler; -import org.eclipse.jetty.server.handler.HandlerCollection; -import org.eclipse.jetty.servlet.DefaultServlet; -import org.eclipse.jetty.servlet.ServletContextHandler; +import org.eclipse.jetty.server.handler.ContextHandlerCollection; +import org.eclipse.jetty.ee10.servlet.DefaultServlet; +import org.eclipse.jetty.ee10.servlet.ServletContextHandler; import org.eclipse.jetty.util.IO; import org.eclipse.jetty.util.component.LifeCycle; @@ -53,7 +55,7 @@ private void stopServer() private void startServer() throws Exception { server = new Server(8080); - HandlerCollection handlers = new HandlerCollection(); + ContextHandlerCollection handlers = new ContextHandlerCollection(); server.setHandler(handlers); handlers.addHandler(createContext("/", "foo.company.com", HelloFooServlet.class)); @@ -70,7 +72,7 @@ private ContextHandler createContext(String contextPath, String host, Class org.eclipse.jetty.examples.embedded jetty-embedded-examples - 11.0.x + 12.0.x webapp-context - 11.0.x + 12.0.x jar - Jetty Examples :: Jetty 11.0.x :: Embedded :: WebApp Context + Jetty Examples :: Jetty 12.0.x :: Embedded :: WebApp Context @@ -19,8 +19,8 @@ - org.eclipse.jetty - jetty-webapp + org.eclipse.jetty.ee10 + jetty-ee10-webapp ${jetty.version} diff --git a/embedded/webapp-context/src/main/java/examples/WebAppContextFromClasspath.java b/embedded/webapp-context/src/main/java/examples/WebAppContextFromClasspath.java index a67df92..3980b9a 100644 --- a/embedded/webapp-context/src/main/java/examples/WebAppContextFromClasspath.java +++ b/embedded/webapp-context/src/main/java/examples/WebAppContextFromClasspath.java @@ -17,7 +17,7 @@ import java.net.URL; import org.eclipse.jetty.server.Server; -import org.eclipse.jetty.webapp.WebAppContext; +import org.eclipse.jetty.ee10.webapp.WebAppContext; public class WebAppContextFromClasspath { diff --git a/embedded/webapp-context/src/main/java/examples/WebAppContextFromFileSystem.java b/embedded/webapp-context/src/main/java/examples/WebAppContextFromFileSystem.java index 00d6316..26fb71e 100644 --- a/embedded/webapp-context/src/main/java/examples/WebAppContextFromFileSystem.java +++ b/embedded/webapp-context/src/main/java/examples/WebAppContextFromFileSystem.java @@ -18,7 +18,7 @@ import java.nio.file.Paths; import org.eclipse.jetty.server.Server; -import org.eclipse.jetty.webapp.WebAppContext; +import org.eclipse.jetty.ee10.webapp.WebAppContext; public class WebAppContextFromFileSystem { diff --git a/embedded/websocket-jakarta-api/pom.xml b/embedded/websocket-jakarta-api/pom.xml index cc46cdf..696d7a7 100644 --- a/embedded/websocket-jakarta-api/pom.xml +++ b/embedded/websocket-jakarta-api/pom.xml @@ -4,12 +4,12 @@ org.eclipse.jetty.examples.embedded jetty-embedded-examples - 11.0.x + 12.0.x websocket-jakarta-api - 11.0.x + 12.0.x jar - Jetty Examples :: Jetty 11.0.x :: Embedded :: WebSocket with Jakarta EE API + Jetty Examples :: Jetty 12.0.x :: Embedded :: WebSocket with Jakarta EE API @@ -19,14 +19,14 @@ - org.eclipse.jetty - jetty-servlet + org.eclipse.jetty.ee10 + jetty-ee10-servlet ${jetty.version} - org.eclipse.jetty.websocket - websocket-jakarta-server + org.eclipse.jetty.ee10.websocket + jetty-ee10-websocket-jakarta-server ${jetty.version} diff --git a/embedded/websocket-jakarta-api/src/main/java/examples/JakartaBrowserMain.java b/embedded/websocket-jakarta-api/src/main/java/examples/JakartaBrowserMain.java index f7d21d9..09f9a33 100644 --- a/embedded/websocket-jakarta-api/src/main/java/examples/JakartaBrowserMain.java +++ b/embedded/websocket-jakarta-api/src/main/java/examples/JakartaBrowserMain.java @@ -24,12 +24,14 @@ import org.eclipse.jetty.server.Server; import org.eclipse.jetty.server.ServerConnector; import org.eclipse.jetty.server.SslConnectionFactory; -import org.eclipse.jetty.servlet.DefaultServlet; -import org.eclipse.jetty.servlet.ServletContextHandler; -import org.eclipse.jetty.servlet.ServletHolder; +import org.eclipse.jetty.ee10.servlet.DefaultServlet; +import org.eclipse.jetty.ee10.servlet.ServletContextHandler; +import org.eclipse.jetty.ee10.servlet.ServletHolder; import org.eclipse.jetty.util.resource.Resource; +import org.eclipse.jetty.util.resource.ResourceFactory; +import org.eclipse.jetty.util.resource.Resources; import org.eclipse.jetty.util.ssl.SslContextFactory; -import org.eclipse.jetty.websocket.jakarta.server.config.JakartaWebSocketServletContainerInitializer; +import org.eclipse.jetty.ee10.websocket.jakarta.server.config.JakartaWebSocketServletContainerInitializer; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -88,7 +90,7 @@ private void setupServer(int port, int sslPort) throws MalformedURLException, UR // Setup SSL SslContextFactory.Server sslContextFactory = new SslContextFactory.Server(); - sslContextFactory.setKeyStoreResource(findKeyStore()); + sslContextFactory.setKeyStoreResource(findKeyStore(ResourceFactory.of(server))); sslContextFactory.setKeyStorePassword("OBF:1vny1zlo1x8e1vnw1vn61x8g1zlu1vn4"); sslContextFactory.setKeyManagerPassword("OBF:1u2u1wml1z7s1z7a1wnl1u2g"); @@ -121,7 +123,8 @@ private void setupServer(int port, int sslPort) throws MalformedURLException, UR // Setup ServletContext ServletContextHandler context = new ServletContextHandler(ServletContextHandler.SESSIONS); context.setContextPath("/"); - context.setBaseResource(Resource.newResource(webRootUri)); + ResourceFactory resourceFactory = ResourceFactory.of(context); + context.setBaseResource(resourceFactory.newResource(webRootUri)); ServletHolder holder = context.addServlet(DefaultServlet.class, "/"); holder.setInitParameter("dirAllowed", "true"); server.setHandler(context); @@ -132,16 +135,14 @@ private void setupServer(int port, int sslPort) throws MalformedURLException, UR LOG.info("{} setup on (http) port {} and (https) port {}", this.getClass().getName(), port, sslPort); } - private static Resource findKeyStore() throws URISyntaxException, MalformedURLException + private static Resource findKeyStore(ResourceFactory resourceFactory) { - ClassLoader cl = JakartaBrowserMain.class.getClassLoader(); - String keystoreResource = "ssl/keystore"; - URL f = cl.getResource(keystoreResource); - if (f == null) + String resourceName = "ssl/keystore"; + Resource resource = resourceFactory.newClassLoaderResource(resourceName); + if (Resources.isReadableFile(resource)) { - throw new RuntimeException("Unable to find " + keystoreResource); + throw new RuntimeException("Unable to read " + resourceName); } - - return Resource.newResource(f.toURI()); + return resource; } } diff --git a/embedded/websocket-jetty-api/pom.xml b/embedded/websocket-jetty-api/pom.xml index 5e02abf..0fa28d7 100644 --- a/embedded/websocket-jetty-api/pom.xml +++ b/embedded/websocket-jetty-api/pom.xml @@ -4,12 +4,12 @@ org.eclipse.jetty.examples.embedded jetty-embedded-examples - 11.0.x + 12.0.x websocket-jetty-api - 11.0.x + 12.0.x jar - Jetty Examples :: Jetty 11.0.x :: Embedded :: WebSocket with Jetty API + Jetty Examples :: Jetty 12.0.x :: Embedded :: WebSocket with Jetty API @@ -19,14 +19,14 @@ - org.eclipse.jetty - jetty-servlet + org.eclipse.jetty.ee10 + jetty-ee10-servlet ${jetty.version} - org.eclipse.jetty.websocket - websocket-jetty-server + org.eclipse.jetty.ee10.websocket + jetty-ee10-websocket-jetty-server ${jetty.version} diff --git a/embedded/websocket-jetty-api/src/main/java/examples/JettyTimeSocket.java b/embedded/websocket-jetty-api/src/main/java/examples/JettyTimeSocket.java index c3a5eca..b045c69 100644 --- a/embedded/websocket-jetty-api/src/main/java/examples/JettyTimeSocket.java +++ b/embedded/websocket-jetty-api/src/main/java/examples/JettyTimeSocket.java @@ -13,24 +13,27 @@ package examples; -import java.io.IOException; import java.text.SimpleDateFormat; import java.util.Date; import java.util.TimeZone; import java.util.concurrent.TimeUnit; +import org.eclipse.jetty.websocket.api.Callback; import org.eclipse.jetty.websocket.api.Session; import org.eclipse.jetty.websocket.api.annotations.OnWebSocketClose; -import org.eclipse.jetty.websocket.api.annotations.OnWebSocketConnect; +import org.eclipse.jetty.websocket.api.annotations.OnWebSocketOpen; import org.eclipse.jetty.websocket.api.annotations.WebSocket; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; @WebSocket public class JettyTimeSocket implements Runnable { + private static final Logger LOG = LoggerFactory.getLogger(JettyTimeSocket.class); private TimeZone timezone; private Session session; - @OnWebSocketConnect + @OnWebSocketOpen public void onOpen(Session session) { this.session = session; @@ -55,12 +58,12 @@ public void run() dateFormat.setTimeZone(timezone); String timestamp = dateFormat.format(new Date()); - this.session.getRemote().sendString(timestamp); + this.session.sendText(timestamp, Callback.NOOP); TimeUnit.SECONDS.sleep(1); } - catch (InterruptedException | IOException e) + catch (InterruptedException e) { - e.printStackTrace(); + LOG.warn("Send of TEXT message interrupted", e); } } } diff --git a/embedded/websocket-jetty-api/src/main/java/examples/SecureWebSocketServer.java b/embedded/websocket-jetty-api/src/main/java/examples/SecureWebSocketServer.java index cf04289..f5dd7c4 100644 --- a/embedded/websocket-jetty-api/src/main/java/examples/SecureWebSocketServer.java +++ b/embedded/websocket-jetty-api/src/main/java/examples/SecureWebSocketServer.java @@ -14,9 +14,7 @@ package examples; import java.io.IOException; -import java.net.MalformedURLException; import java.net.URISyntaxException; -import java.net.URL; import org.eclipse.jetty.server.HttpConfiguration; import org.eclipse.jetty.server.HttpConnectionFactory; @@ -24,12 +22,19 @@ import org.eclipse.jetty.server.Server; import org.eclipse.jetty.server.ServerConnector; import org.eclipse.jetty.server.SslConnectionFactory; -import org.eclipse.jetty.servlet.ServletContextHandler; +import org.eclipse.jetty.ee10.servlet.ServletContextHandler; import org.eclipse.jetty.util.resource.Resource; +import org.eclipse.jetty.util.resource.ResourceFactory; +import org.eclipse.jetty.util.resource.Resources; import org.eclipse.jetty.util.ssl.SslContextFactory; -import org.eclipse.jetty.websocket.api.WebSocketAdapter; -import org.eclipse.jetty.websocket.server.JettyWebSocketServlet; -import org.eclipse.jetty.websocket.server.JettyWebSocketServletFactory; +import org.eclipse.jetty.ee10.websocket.server.JettyWebSocketServlet; +import org.eclipse.jetty.ee10.websocket.server.JettyWebSocketServletFactory; +import org.eclipse.jetty.websocket.api.Callback; +import org.eclipse.jetty.websocket.api.Session; +import org.eclipse.jetty.websocket.api.annotations.OnWebSocketError; +import org.eclipse.jetty.websocket.api.annotations.OnWebSocketMessage; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; /** * Create a Secure WebSocket Server and host an Echo WebSocket endpoint on "/echo" @@ -49,36 +54,31 @@ protected void configure(JettyWebSocketServletFactory jettyWebSocketServletFacto } } - public static class EchoSocket extends WebSocketAdapter + public static class EchoSocket { - @Override - public void onWebSocketText(String message) + private static final Logger LOG = LoggerFactory.getLogger(EchoSocket.class); + + @OnWebSocketMessage + public void onWebSocketText(Session session, String message) { - try - { - getRemote().sendString(message); - } - catch (IOException e) - { - e.printStackTrace(System.err); - } + session.sendText(message, Callback.NOOP); } - @Override + @OnWebSocketError public void onWebSocketError(Throwable cause) { - cause.printStackTrace(System.err); + LOG.warn("WebSocket error", cause); } } - public static void main(String[] args) throws IOException, URISyntaxException + public static void main(String[] args) { Server server = new Server(); int httpsPort = 8443; // Setup SSL SslContextFactory.Server sslContextFactory = new SslContextFactory.Server(); - sslContextFactory.setKeyStoreResource(findKeyStore()); + sslContextFactory.setKeyStoreResource(findKeyStore(ResourceFactory.of(server))); sslContextFactory.setKeyStorePassword("OBF:1vny1zlo1x8e1vnw1vn61x8g1zlu1vn4"); sslContextFactory.setKeyManagerPassword("OBF:1u2u1wml1z7s1z7a1wnl1u2g"); @@ -116,16 +116,14 @@ public static void main(String[] args) throws IOException, URISyntaxException } } - private static Resource findKeyStore() throws URISyntaxException, MalformedURLException + private static Resource findKeyStore(ResourceFactory resourceFactory) { - ClassLoader cl = SecureWebSocketServer.class.getClassLoader(); - String keystoreResource = "ssl/keystore"; - URL f = cl.getResource(keystoreResource); - if (f == null) + String resourceName = "ssl/keystore"; + Resource resource = resourceFactory.newClassLoaderResource(resourceName); + if (Resources.isReadableFile(resource)) { - throw new RuntimeException("Unable to find " + keystoreResource); + throw new RuntimeException("Unable to read " + resourceName); } - - return Resource.newResource(f.toURI()); + return resource; } } diff --git a/embedded/websocket-jetty-api/src/main/java/examples/WebSocketServerViaFilter.java b/embedded/websocket-jetty-api/src/main/java/examples/WebSocketServerViaFilter.java index 73ad0b5..19dcd8d 100644 --- a/embedded/websocket-jetty-api/src/main/java/examples/WebSocketServerViaFilter.java +++ b/embedded/websocket-jetty-api/src/main/java/examples/WebSocketServerViaFilter.java @@ -21,14 +21,15 @@ import org.eclipse.jetty.server.Server; import org.eclipse.jetty.server.ServerConnector; -import org.eclipse.jetty.servlet.DefaultServlet; -import org.eclipse.jetty.servlet.ServletContextHandler; -import org.eclipse.jetty.servlet.ServletHolder; +import org.eclipse.jetty.ee10.servlet.DefaultServlet; +import org.eclipse.jetty.ee10.servlet.ServletContextHandler; +import org.eclipse.jetty.ee10.servlet.ServletHolder; import org.eclipse.jetty.util.resource.Resource; -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.config.JettyWebSocketServletContainerInitializer; +import org.eclipse.jetty.ee10.websocket.server.JettyServerUpgradeRequest; +import org.eclipse.jetty.ee10.websocket.server.JettyServerUpgradeResponse; +import org.eclipse.jetty.ee10.websocket.server.JettyWebSocketCreator; +import org.eclipse.jetty.ee10.websocket.server.config.JettyWebSocketServletContainerInitializer; +import org.eclipse.jetty.util.resource.ResourceFactory; public class WebSocketServerViaFilter { @@ -64,7 +65,7 @@ public static void main(String[] args) throws URISyntaxException, MalformedURLEx // This is also known as the handler tree (in jetty speak) ServletContextHandler contextHandler = new ServletContextHandler(ServletContextHandler.SESSIONS); contextHandler.setContextPath("/"); - contextHandler.setBaseResource(Resource.newResource(webRootUri)); + contextHandler.setBaseResource(ResourceFactory.of(contextHandler).newResource(webRootUri)); contextHandler.setWelcomeFiles(new String[]{"index.html"}); server.setHandler(contextHandler); diff --git a/embedded/xml/pom.xml b/embedded/xml/pom.xml index ab6c3d0..fd4663b 100644 --- a/embedded/xml/pom.xml +++ b/embedded/xml/pom.xml @@ -4,12 +4,12 @@ org.eclipse.jetty.examples.embedded jetty-embedded-examples - 11.0.x + 12.0.x xml - 11.0.x + 12.0.x jar - Jetty Examples :: Jetty 11.0.x :: Embedded :: XML + Jetty Examples :: Jetty 12.0.x :: Embedded :: XML @@ -20,13 +20,13 @@ org.eclipse.jetty - jetty-servlet + jetty-xml ${jetty.version} - org.eclipse.jetty - jetty-xml + org.eclipse.jetty.ee10 + jetty-ee10-servlet ${jetty.version} diff --git a/embedded/xml/src/main/java/examples/XmlEnhancedServer.java b/embedded/xml/src/main/java/examples/XmlEnhancedServer.java index a867469..53370bf 100644 --- a/embedded/xml/src/main/java/examples/XmlEnhancedServer.java +++ b/embedded/xml/src/main/java/examples/XmlEnhancedServer.java @@ -20,18 +20,18 @@ import java.util.HashMap; import java.util.Map; +import org.eclipse.jetty.ee10.servlet.DefaultServlet; +import org.eclipse.jetty.ee10.servlet.ServletContextHandler; +import org.eclipse.jetty.ee10.servlet.ServletHolder; +import org.eclipse.jetty.server.Handler; 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.server.handler.ContextHandlerCollection; import org.eclipse.jetty.server.handler.DefaultHandler; -import org.eclipse.jetty.server.handler.HandlerList; -import org.eclipse.jetty.servlet.DefaultServlet; -import org.eclipse.jetty.servlet.ServletContextHandler; -import org.eclipse.jetty.servlet.ServletHolder; -import org.eclipse.jetty.util.resource.PathResource; import org.eclipse.jetty.util.resource.Resource; +import org.eclipse.jetty.util.resource.ResourceFactory; import org.eclipse.jetty.xml.XmlConfiguration; /** @@ -65,6 +65,9 @@ public class XmlEnhancedServer public static void main(String[] args) throws Exception { Server server = new Server(); + + ResourceFactory resourceFactory = ResourceFactory.of(server); + HttpConfiguration httpConfig = new HttpConfiguration(); ServerConnector httpConnector = new ServerConnector(server, new HttpConnectionFactory(httpConfig)); httpConnector.setPort(8080); @@ -84,12 +87,12 @@ public static void main(String[] args) throws Exception URI webRootUri = f.toURI().resolve("./").normalize(); System.err.println("WebRoot is " + webRootUri); - HandlerList handlers = new HandlerList(); + Handler.Sequence handlers = new Handler.Sequence(); ContextHandlerCollection contexts = new ContextHandlerCollection(); ServletContextHandler context = new ServletContextHandler(ServletContextHandler.SESSIONS); context.setContextPath("/"); - context.setBaseResource(Resource.newResource(webRootUri)); + context.setBaseResource(resourceFactory.newResource(webRootUri)); contexts.addHandler(context); ServletHolder holderPwd = new ServletHolder("default", DefaultServlet.class); @@ -126,7 +129,7 @@ public static void main(String[] args) throws Exception { Path xmlPath = Paths.get(xml); System.err.println("Applying XML: " + xmlPath); - PathResource xmlResource = new PathResource(xmlPath); + Resource xmlResource = resourceFactory.newResource(xmlPath); XmlConfiguration configuration = new XmlConfiguration(xmlResource); if (lastConfig != null) configuration.getIdMap().putAll(lastConfig.getIdMap()); diff --git a/embedded/xml/src/main/java/examples/XmlServer.java b/embedded/xml/src/main/java/examples/XmlServer.java index 6fb8bfa..d2a1621 100644 --- a/embedded/xml/src/main/java/examples/XmlServer.java +++ b/embedded/xml/src/main/java/examples/XmlServer.java @@ -15,6 +15,7 @@ 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; @@ -34,6 +35,7 @@ import org.eclipse.jetty.server.ServerConnector; import org.eclipse.jetty.util.resource.PathResource; import org.eclipse.jetty.util.resource.Resource; +import org.eclipse.jetty.util.resource.ResourceFactory; import org.eclipse.jetty.xml.XmlConfiguration; /** @@ -49,6 +51,9 @@ public static void main(String[] args) throws Exception final boolean enableHttp = !argList.contains("--disable-http"); final boolean enableHttps = !argList.contains("--disable-https"); + // List of configured IDs from XML; + Map idMap; + // The list of XMLs in the order they should be executed. List xmls = new ArrayList<>(); @@ -61,52 +66,57 @@ public static void main(String[] args) throws Exception // Bonus is we also learn what JAR files we need. // And if we look at tmpdir/start.ini we can also know what properties can be set. - Path homeXmlPath = Paths.get("src/main/xml/home"); - xmls.add(new PathResource(homeXmlPath.resolve("jetty-bytebufferpool.xml"))); - xmls.add(new PathResource(homeXmlPath.resolve("jetty-threadpool.xml"))); - xmls.add(new PathResource(homeXmlPath.resolve("jetty.xml"))); - if (enableHttp) - { - xmls.add(new PathResource(homeXmlPath.resolve("jetty-http.xml"))); - } - if (enableHttps) + try(ResourceFactory.Closeable resourceFactory = ResourceFactory.closeable()) { - xmls.add(new PathResource(homeXmlPath.resolve("jetty-ssl.xml"))); - xmls.add(new PathResource(homeXmlPath.resolve("jetty-ssl-context.xml"))); - xmls.add(new PathResource(homeXmlPath.resolve("jetty-https.xml"))); + Resource homeXmlResource = resourceFactory.newResource(Path.of("src/main/xml/home")); + Resource customBaseResource = resourceFactory.newResource(Path.of("src/main/xml/base")); + + xmls.add(homeXmlResource.resolve("jetty-bytebufferpool.xml")); + xmls.add(homeXmlResource.resolve("jetty-threadpool.xml")); + xmls.add(homeXmlResource.resolve("jetty.xml")); + if (enableHttp) + { + xmls.add(homeXmlResource.resolve("jetty-http.xml")); + } + if (enableHttps) + { + 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(customBaseResource.resolve("context-foo.xml")); + xmls.add(customBaseResource.resolve("context-bar.xml")); + + // Lets load our properties + Map customProps = loadProperties(customBaseResource.resolve("custom.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); } - xmls.add(new PathResource(homeXmlPath.resolve("jetty-customrequestlog.xml"))); - - // Now we add our customizations - // In this case, it's 2 ServletContextHandlers - Path customBasePath = Paths.get("src/main/xml/base"); - xmls.add(new PathResource(customBasePath.resolve("context-foo.xml"))); - xmls.add(new PathResource(customBasePath.resolve("context-bar.xml"))); - - // Lets load our properties - Map customProps = loadProperties(customBasePath.resolve("custom.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", customBasePath.resolve("keystore").toString()); - customProps.put("jetty.sslContext.trustStoreAbsolutePath", customBasePath.resolve("keystore").toString()); - - // Now lets tie it all together - Map idMap = configure(xmls, customProps); + Server server = (Server)idMap.get("Server"); server.start(); System.out.println("Server is running, and listening on ..."); @@ -160,13 +170,13 @@ private static void ensureDirExists(Path path) throws IOException } } - private static Map loadProperties(Path path) throws IOException + private static Map loadProperties(Resource resource) throws IOException { Properties properties = new Properties(); - try (BufferedReader reader = Files.newBufferedReader(path, StandardCharsets.UTF_8)) + try (InputStream in = resource.newInputStream()) { - properties.load(reader); + properties.load(in); } return properties.entrySet().stream().collect( diff --git a/pom.xml b/pom.xml index f98887a..02e19b8 100644 --- a/pom.xml +++ b/pom.xml @@ -8,9 +8,9 @@ org.eclipse.jetty.examples jetty-examples - 11.0.x + 12.0.x pom - Jetty Examples :: Jetty 11.0.x + Jetty Examples :: Jetty 12.0.x embedded @@ -25,10 +25,10 @@ - 11 + 17 6.2 jetty-examples - 11.0.19 + 12.0.5 diff --git a/standalone/pom.xml b/standalone/pom.xml index d775f4f..8aea13b 100644 --- a/standalone/pom.xml +++ b/standalone/pom.xml @@ -4,11 +4,11 @@ org.eclipse.jetty.examples jetty-examples - 11.0.x + 12.0.x jetty-standalone-examples - 11.0.x + 12.0.x pom - Jetty Examples :: Jetty 11.0.x :: Standalone + Jetty Examples :: Jetty 12.0.x :: Standalone diff --git a/webapps/hello/pom.xml b/webapps/hello/pom.xml index 069e060..3bb4a37 100644 --- a/webapps/hello/pom.xml +++ b/webapps/hello/pom.xml @@ -4,12 +4,12 @@ org.eclipse.jetty.examples.webapps jetty-webapp-examples - 11.0.x + 12.0.x hello - 11.0.x + 12.0.x war - Jetty Examples :: Jetty 11.0.x :: Hello WebApp + Jetty Examples :: Jetty 12.0.x :: Hello WebApp hello diff --git a/webapps/pom.xml b/webapps/pom.xml index 3e004da..372e4ed 100644 --- a/webapps/pom.xml +++ b/webapps/pom.xml @@ -4,13 +4,13 @@ org.eclipse.jetty.examples jetty-examples - 11.0.x + 12.0.x org.eclipse.jetty.examples.webapps jetty-webapp-examples - 11.0.x + 12.0.x pom - Jetty Examples :: Jetty 11.0.x :: WebApps + Jetty Examples :: Jetty 12.0.x :: WebApps hello