From a1c44cfafe2ff42f078a4441d3e5f581536c4b77 Mon Sep 17 00:00:00 2001 From: Joakim Erdfelt Date: Mon, 5 Feb 2024 15:11:02 -0600 Subject: [PATCH 1/2] Backporting StaticFileGen fixes --- .../java/examples/ResourceHandlerFromFileSystemTest.java | 3 +-- .../examples/ServletFileServerMultipleLocationsTest.java | 3 +-- .../src/test/java/examples/StaticFileGen.java | 9 +++++++++ 3 files changed, 11 insertions(+), 4 deletions(-) diff --git a/embedded/file-server/src/test/java/examples/ResourceHandlerFromFileSystemTest.java b/embedded/file-server/src/test/java/examples/ResourceHandlerFromFileSystemTest.java index 632db22..2bd9f08 100644 --- a/embedded/file-server/src/test/java/examples/ResourceHandlerFromFileSystemTest.java +++ b/embedded/file-server/src/test/java/examples/ResourceHandlerFromFileSystemTest.java @@ -18,7 +18,6 @@ import org.eclipse.jetty.server.Server; import org.eclipse.jetty.toolchain.test.FS; -import org.eclipse.jetty.toolchain.test.MavenTestingUtils; import org.eclipse.jetty.util.component.LifeCycle; import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.BeforeEach; @@ -41,7 +40,7 @@ public class ResourceHandlerFromFileSystemTest @BeforeEach public void startServer() throws Exception { - Path resourcesRoot = MavenTestingUtils.getTargetTestingPath(ResourceHandlerFromFileSystemTest.class.getSimpleName()); + Path resourcesRoot = StaticFileGen.tempDir("static-huge"); FS.ensureDirExists(resourcesRoot); exampleSha = StaticFileGen.generate(resourcesRoot.resolve("example.png"), exampleSize); diff --git a/embedded/file-server/src/test/java/examples/ServletFileServerMultipleLocationsTest.java b/embedded/file-server/src/test/java/examples/ServletFileServerMultipleLocationsTest.java index 859cf11..150425c 100644 --- a/embedded/file-server/src/test/java/examples/ServletFileServerMultipleLocationsTest.java +++ b/embedded/file-server/src/test/java/examples/ServletFileServerMultipleLocationsTest.java @@ -19,7 +19,6 @@ import org.eclipse.jetty.server.Server; import org.eclipse.jetty.toolchain.test.FS; -import org.eclipse.jetty.toolchain.test.MavenTestingUtils; import org.eclipse.jetty.util.component.LifeCycle; import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.BeforeEach; @@ -42,7 +41,7 @@ public class ServletFileServerMultipleLocationsTest @BeforeEach public void startServer() throws Exception { - Path resourcesRoot = MavenTestingUtils.getTargetTestingPath(ServletFileServerMultipleLocations.class.getSimpleName()); + Path resourcesRoot = StaticFileGen.tempDir("static-huge"); FS.ensureDirExists(resourcesRoot); exampleSha = StaticFileGen.generate(resourcesRoot.resolve("example.png"), exampleSize); diff --git a/embedded/file-server/src/test/java/examples/StaticFileGen.java b/embedded/file-server/src/test/java/examples/StaticFileGen.java index f01286d..9f0477d 100644 --- a/embedded/file-server/src/test/java/examples/StaticFileGen.java +++ b/embedded/file-server/src/test/java/examples/StaticFileGen.java @@ -19,12 +19,14 @@ import java.nio.channels.SeekableByteChannel; import java.nio.file.Files; import java.nio.file.Path; +import java.nio.file.Paths; import java.nio.file.StandardOpenOption; import java.security.DigestOutputStream; import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; import java.util.Arrays; +import org.eclipse.jetty.toolchain.test.FS; import org.eclipse.jetty.toolchain.test.Hex; import org.eclipse.jetty.toolchain.test.Sha1Sum; import org.eclipse.jetty.util.IO; @@ -81,6 +83,13 @@ public static String generate(Path staticFile, long size) throws IOException, No return Sha1Sum.calculate(staticFile); } + public static Path tempDir(String directoryName) + { + Path tempDir = Paths.get(System.getProperty("java.io.tmpdir"), directoryName); + FS.ensureDirExists(tempDir); + return tempDir; + } + public static void verify(InputStream inputStream, long expectedSize, String expectedSha1) throws NoSuchAlgorithmException, IOException { MessageDigest digest = MessageDigest.getInstance("SHA1"); From f90ed75c8f6cd6495fb177f6b66bdf7a494db01d Mon Sep 17 00:00:00 2001 From: Joakim Erdfelt Date: Mon, 5 Feb 2024 15:11:21 -0600 Subject: [PATCH 2/2] Porting over lowresource-access-webapp examples --- standalone/lowresource-access/pom.xml | 85 ++++++++++ .../AbstractLowResourceDumpServlet.java | 34 ++++ .../java/examples/FromBaseRequestServlet.java | 40 +++++ .../FromRequestAttributeChannelServlet.java | 41 +++++ ...FromRequestAttributeConnectionServlet.java | 41 +++++ .../examples/FromServletContextServlet.java | 42 +++++ .../src/main/webapp/WEB-INF/web.xml | 5 + .../AccessLowResourceMonitorTest.java | 159 ++++++++++++++++++ .../src/test/java/examples/WarBuilder.java | 89 ++++++++++ .../start.d/annotations.ini | 1 + .../lowresource-access/start.d/deploy.ini | 1 + .../lowresource-access/start.d/http.ini | 2 + .../start.d/lowresources.ini | 1 + .../lowresource-access/webapps/.gitignore | 1 + .../lowresource-access/webapps/demo.xml | 49 ++++++ standalone/pom.xml | 4 + 16 files changed, 595 insertions(+) create mode 100644 standalone/lowresource-access/pom.xml create mode 100644 standalone/lowresource-access/src/main/java/examples/AbstractLowResourceDumpServlet.java create mode 100644 standalone/lowresource-access/src/main/java/examples/FromBaseRequestServlet.java create mode 100644 standalone/lowresource-access/src/main/java/examples/FromRequestAttributeChannelServlet.java create mode 100644 standalone/lowresource-access/src/main/java/examples/FromRequestAttributeConnectionServlet.java create mode 100644 standalone/lowresource-access/src/main/java/examples/FromServletContextServlet.java create mode 100644 standalone/lowresource-access/src/main/webapp/WEB-INF/web.xml create mode 100644 standalone/lowresource-access/src/test/java/examples/AccessLowResourceMonitorTest.java create mode 100644 standalone/lowresource-access/src/test/java/examples/WarBuilder.java create mode 100644 standalone/lowresource-access/start.d/annotations.ini create mode 100644 standalone/lowresource-access/start.d/deploy.ini create mode 100644 standalone/lowresource-access/start.d/http.ini create mode 100644 standalone/lowresource-access/start.d/lowresources.ini create mode 100644 standalone/lowresource-access/webapps/.gitignore create mode 100644 standalone/lowresource-access/webapps/demo.xml diff --git a/standalone/lowresource-access/pom.xml b/standalone/lowresource-access/pom.xml new file mode 100644 index 0000000..469abd3 --- /dev/null +++ b/standalone/lowresource-access/pom.xml @@ -0,0 +1,85 @@ + + + 4.0.0 + + + org.eclipse.jetty.examples + jetty-standalone-examples + 9.4.x + + + lowresource-access + war + lowresource-access + + + UTF-8 + 3.1.0 + + + + + javax.servlet + javax.servlet-api + ${servlet.api.version} + provided + + + + org.eclipse.jetty + jetty-server + ${jetty.version} + provided + + + org.eclipse.jetty + jetty-annotations + ${jetty.version} + test + + + org.eclipse.jetty + jetty-deploy + ${jetty.version} + test + + + org.eclipse.jetty + jetty-webapp + ${jetty.version} + test + + + + org.junit.jupiter + junit-jupiter-api + 5.10.1 + test + + + + + demo + + + org.apache.maven.plugins + maven-antrun-plugin + 3.1.0 + + + copy-to-webapps + + run + + install + + + + + + + + + + + diff --git a/standalone/lowresource-access/src/main/java/examples/AbstractLowResourceDumpServlet.java b/standalone/lowresource-access/src/main/java/examples/AbstractLowResourceDumpServlet.java new file mode 100644 index 0000000..ff74135 --- /dev/null +++ b/standalone/lowresource-access/src/main/java/examples/AbstractLowResourceDumpServlet.java @@ -0,0 +1,34 @@ +// +// ======================================================================== +// Copyright (c) 1995 Mort Bay Consulting Pty Ltd and others. +// +// This program and the accompanying materials are made available under the +// terms of the Eclipse Public License v. 2.0 which is available at +// https://www.eclipse.org/legal/epl-2.0, or the Apache License, Version 2.0 +// which is available at https://www.apache.org/licenses/LICENSE-2.0. +// +// SPDX-License-Identifier: EPL-2.0 OR Apache-2.0 +// ======================================================================== +// + +package examples; + +import java.io.IOException; +import java.util.Set; +import javax.servlet.ServletOutputStream; +import javax.servlet.http.HttpServlet; + +import org.eclipse.jetty.server.LowResourceMonitor; + +public class AbstractLowResourceDumpServlet extends HttpServlet +{ + protected void dump(ServletOutputStream out, LowResourceMonitor monitor) throws IOException + { + Set checks = monitor.getLowResourceChecks(); + out.println("LowResourceChecks: "); + for (LowResourceMonitor.LowResourceCheck check : checks) + { + out.println(String.format(" (%s) %s%n", check.getClass().getName(), check)); + } + } +} diff --git a/standalone/lowresource-access/src/main/java/examples/FromBaseRequestServlet.java b/standalone/lowresource-access/src/main/java/examples/FromBaseRequestServlet.java new file mode 100644 index 0000000..4567c01 --- /dev/null +++ b/standalone/lowresource-access/src/main/java/examples/FromBaseRequestServlet.java @@ -0,0 +1,40 @@ +// +// ======================================================================== +// Copyright (c) 1995 Mort Bay Consulting Pty Ltd and others. +// +// This program and the accompanying materials are made available under the +// terms of the Eclipse Public License v. 2.0 which is available at +// https://www.eclipse.org/legal/epl-2.0, or the Apache License, Version 2.0 +// which is available at https://www.apache.org/licenses/LICENSE-2.0. +// +// SPDX-License-Identifier: EPL-2.0 OR Apache-2.0 +// ======================================================================== +// + +package examples; + +import java.io.IOException; +import javax.servlet.ServletException; +import javax.servlet.annotation.WebServlet; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +import org.eclipse.jetty.server.LowResourceMonitor; +import org.eclipse.jetty.server.Request; +import org.eclipse.jetty.server.Server; + +@WebServlet("/baserequest") +public class FromBaseRequestServlet extends AbstractLowResourceDumpServlet +{ + @Override + protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException + { + Server server = Request.getBaseRequest(request).getHttpChannel().getServer(); + + LowResourceMonitor monitor = server.getBean(LowResourceMonitor.class); + + response.setCharacterEncoding("UTF-8"); + response.setContentType("text/plain"); + dump(response.getOutputStream(), monitor); + } +} diff --git a/standalone/lowresource-access/src/main/java/examples/FromRequestAttributeChannelServlet.java b/standalone/lowresource-access/src/main/java/examples/FromRequestAttributeChannelServlet.java new file mode 100644 index 0000000..c63d994 --- /dev/null +++ b/standalone/lowresource-access/src/main/java/examples/FromRequestAttributeChannelServlet.java @@ -0,0 +1,41 @@ +// +// ======================================================================== +// Copyright (c) 1995 Mort Bay Consulting Pty Ltd and others. +// +// This program and the accompanying materials are made available under the +// terms of the Eclipse Public License v. 2.0 which is available at +// https://www.eclipse.org/legal/epl-2.0, or the Apache License, Version 2.0 +// which is available at https://www.apache.org/licenses/LICENSE-2.0. +// +// SPDX-License-Identifier: EPL-2.0 OR Apache-2.0 +// ======================================================================== +// + +package examples; + +import java.io.IOException; +import javax.servlet.ServletException; +import javax.servlet.annotation.WebServlet; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +import org.eclipse.jetty.server.HttpChannel; +import org.eclipse.jetty.server.LowResourceMonitor; +import org.eclipse.jetty.server.Server; + +@WebServlet("/requestattribute/channel") +public class FromRequestAttributeChannelServlet extends AbstractLowResourceDumpServlet +{ + @Override + protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException + { + HttpChannel channel = (HttpChannel)request.getAttribute(HttpChannel.class.getName()); + Server server = channel.getServer(); + + LowResourceMonitor monitor = server.getBean(LowResourceMonitor.class); + + response.setCharacterEncoding("UTF-8"); + response.setContentType("text/plain"); + dump(response.getOutputStream(), monitor); + } +} diff --git a/standalone/lowresource-access/src/main/java/examples/FromRequestAttributeConnectionServlet.java b/standalone/lowresource-access/src/main/java/examples/FromRequestAttributeConnectionServlet.java new file mode 100644 index 0000000..cec5756 --- /dev/null +++ b/standalone/lowresource-access/src/main/java/examples/FromRequestAttributeConnectionServlet.java @@ -0,0 +1,41 @@ +// +// ======================================================================== +// Copyright (c) 1995 Mort Bay Consulting Pty Ltd and others. +// +// This program and the accompanying materials are made available under the +// terms of the Eclipse Public License v. 2.0 which is available at +// https://www.eclipse.org/legal/epl-2.0, or the Apache License, Version 2.0 +// which is available at https://www.apache.org/licenses/LICENSE-2.0. +// +// SPDX-License-Identifier: EPL-2.0 OR Apache-2.0 +// ======================================================================== +// + +package examples; + +import java.io.IOException; +import javax.servlet.ServletException; +import javax.servlet.annotation.WebServlet; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +import org.eclipse.jetty.server.HttpConnection; +import org.eclipse.jetty.server.LowResourceMonitor; +import org.eclipse.jetty.server.Server; + +@WebServlet("/requestattribute/connection") +public class FromRequestAttributeConnectionServlet extends AbstractLowResourceDumpServlet +{ + @Override + protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException + { + HttpConnection connection = (HttpConnection)request.getAttribute(HttpConnection.class.getName()); + Server server = connection.getServer(); + + LowResourceMonitor monitor = server.getBean(LowResourceMonitor.class); + + response.setCharacterEncoding("UTF-8"); + response.setContentType("text/plain"); + dump(response.getOutputStream(), monitor); + } +} diff --git a/standalone/lowresource-access/src/main/java/examples/FromServletContextServlet.java b/standalone/lowresource-access/src/main/java/examples/FromServletContextServlet.java new file mode 100644 index 0000000..d604e8a --- /dev/null +++ b/standalone/lowresource-access/src/main/java/examples/FromServletContextServlet.java @@ -0,0 +1,42 @@ +// +// ======================================================================== +// Copyright (c) 1995 Mort Bay Consulting Pty Ltd and others. +// +// This program and the accompanying materials are made available under the +// terms of the Eclipse Public License v. 2.0 which is available at +// https://www.eclipse.org/legal/epl-2.0, or the Apache License, Version 2.0 +// which is available at https://www.apache.org/licenses/LICENSE-2.0. +// +// SPDX-License-Identifier: EPL-2.0 OR Apache-2.0 +// ======================================================================== +// + +package examples; + +import java.io.IOException; +import javax.servlet.ServletException; +import javax.servlet.annotation.WebServlet; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +import org.eclipse.jetty.server.LowResourceMonitor; + +@WebServlet("/servletcontext") +public class FromServletContextServlet extends AbstractLowResourceDumpServlet +{ + private LowResourceMonitor monitor; + + @Override + public void init() throws ServletException + { + monitor = (LowResourceMonitor)getServletContext().getAttribute(LowResourceMonitor.class.getName()); + } + + @Override + protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException + { + response.setCharacterEncoding("UTF-8"); + response.setContentType("text/plain"); + dump(response.getOutputStream(), monitor); + } +} diff --git a/standalone/lowresource-access/src/main/webapp/WEB-INF/web.xml b/standalone/lowresource-access/src/main/webapp/WEB-INF/web.xml new file mode 100644 index 0000000..e1a570d --- /dev/null +++ b/standalone/lowresource-access/src/main/webapp/WEB-INF/web.xml @@ -0,0 +1,5 @@ + + + Accessing LowResourceMonitor from a Servlet + diff --git a/standalone/lowresource-access/src/test/java/examples/AccessLowResourceMonitorTest.java b/standalone/lowresource-access/src/test/java/examples/AccessLowResourceMonitorTest.java new file mode 100644 index 0000000..77d4055 --- /dev/null +++ b/standalone/lowresource-access/src/test/java/examples/AccessLowResourceMonitorTest.java @@ -0,0 +1,159 @@ +// +// ======================================================================== +// Copyright (c) 1995 Mort Bay Consulting Pty Ltd and others. +// +// This program and the accompanying materials are made available under the +// terms of the Eclipse Public License v. 2.0 which is available at +// https://www.eclipse.org/legal/epl-2.0, or the Apache License, Version 2.0 +// which is available at https://www.apache.org/licenses/LICENSE-2.0. +// +// SPDX-License-Identifier: EPL-2.0 OR Apache-2.0 +// ======================================================================== +// + +package examples; + +import java.io.IOException; +import java.io.InputStream; +import java.net.HttpURLConnection; +import java.net.URI; +import java.nio.file.Path; +import java.nio.file.Paths; + +import org.eclipse.jetty.deploy.DeploymentManager; +import org.eclipse.jetty.deploy.PropertiesConfigurationManager; +import org.eclipse.jetty.deploy.providers.WebAppProvider; +import org.eclipse.jetty.server.LowResourceMonitor; +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.util.IO; +import org.eclipse.jetty.util.component.LifeCycle; +import org.eclipse.jetty.webapp.Configuration; +import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; + +import static java.nio.charset.StandardCharsets.UTF_8; +import static org.junit.jupiter.api.Assertions.assertEquals; + +public class AccessLowResourceMonitorTest +{ + private Server server; + + @BeforeEach + public void startServer() throws Exception + { + server = new Server(); + ServerConnector connector = new ServerConnector(server); + connector.setPort(0); + server.addConnector(connector); + + // Handler tree + HandlerList handlers = new HandlerList(); + ContextHandlerCollection contexts = new ContextHandlerCollection(); + handlers.addHandler(contexts); + handlers.addHandler(new DefaultHandler()); + server.setHandler(handlers); + + // create War + Path jettyBase = Paths.get(System.getProperty("user.dir")); + Path webappsDir = jettyBase.resolve("webapps"); + try (WarBuilder war = new WarBuilder(webappsDir.resolve("demo.war"))) + { + war.addClasses(Paths.get("target/classes")); + war.addDir(Paths.get("src/main/webapp")); + } + + // enable hot deployment + DeploymentManager deployer = new DeploymentManager(); + deployer.setContexts(contexts); + WebAppProvider webAppProvider = new WebAppProvider(); + webAppProvider.setMonitoredDirName(jettyBase + "/webapps"); + webAppProvider.setScanInterval(0); + webAppProvider.setExtractWars(true); + webAppProvider.setConfigurationManager(new PropertiesConfigurationManager()); + deployer.addAppProvider(webAppProvider); + server.addBean(deployer); + + // enable annotation scanning + Configuration.ClassList classlist = Configuration.ClassList + .setServerDefault(server); + + classlist.addBefore("org.eclipse.jetty.webapp.JettyWebXmlConfiguration", + "org.eclipse.jetty.annotations.AnnotationConfiguration"); + + // add LowResourceMonitor + LowResourceMonitor lowResourcesMonitor = new LowResourceMonitor(server); + lowResourcesMonitor.setPeriod(1000); + lowResourcesMonitor.setLowResourcesIdleTimeout(200); + lowResourcesMonitor.setMonitorThreads(true); + lowResourcesMonitor.setMaxMemory(0); + lowResourcesMonitor.setMaxLowResourcesTime(5000); + server.addBean(lowResourcesMonitor); + + // start server + // DEBUG state - server.setDumpAfterStart(true); + server.start(); + } + + @AfterEach + public void teardown() + { + LifeCycle.stop(server); + } + + @Test + public void testFromServletContext() throws IOException + { + URI dest = server.getURI().resolve("/demo/servletcontext"); + System.err.println("Request to " + dest); + HttpURLConnection http = (HttpURLConnection)dest.toURL().openConnection(); + try (InputStream in = http.getInputStream()) + { + System.err.println(IO.toString(in, UTF_8)); + } + assertEquals(http.getResponseCode(), HttpURLConnection.HTTP_OK, "HTTP Response Status Code"); + } + + @Test + public void testFromRequestAttributeChannel() throws IOException + { + URI dest = server.getURI().resolve("/demo/requestattribute/channel"); + System.err.println("Request to " + dest); + HttpURLConnection http = (HttpURLConnection)dest.toURL().openConnection(); + try (InputStream in = http.getInputStream()) + { + System.err.println(IO.toString(in, UTF_8)); + } + assertEquals(http.getResponseCode(), HttpURLConnection.HTTP_OK, "HTTP Response Status Code"); + } + + @Test + public void testFromRequestAttributeConnection() throws IOException + { + URI dest = server.getURI().resolve("/demo/requestattribute/connection"); + System.err.println("Request to " + dest); + HttpURLConnection http = (HttpURLConnection)dest.toURL().openConnection(); + try (InputStream in = http.getInputStream()) + { + System.err.println(IO.toString(in, UTF_8)); + } + assertEquals(http.getResponseCode(), HttpURLConnection.HTTP_OK, "HTTP Response Status Code"); + } + + @Test + public void testFromBaseRequest() throws IOException + { + URI dest = server.getURI().resolve("/demo/baserequest"); + System.err.println("Request to " + dest); + HttpURLConnection http = (HttpURLConnection)dest.toURL().openConnection(); + try (InputStream in = http.getInputStream()) + { + System.err.println(IO.toString(in, UTF_8)); + } + assertEquals(http.getResponseCode(), HttpURLConnection.HTTP_OK, "HTTP Response Status Code"); + } +} diff --git a/standalone/lowresource-access/src/test/java/examples/WarBuilder.java b/standalone/lowresource-access/src/test/java/examples/WarBuilder.java new file mode 100644 index 0000000..0ad36f3 --- /dev/null +++ b/standalone/lowresource-access/src/test/java/examples/WarBuilder.java @@ -0,0 +1,89 @@ +// +// ======================================================================== +// Copyright (c) 1995 Mort Bay Consulting Pty Ltd and others. +// +// This program and the accompanying materials are made available under the +// terms of the Eclipse Public License v. 2.0 which is available at +// https://www.eclipse.org/legal/epl-2.0, or the Apache License, Version 2.0 +// which is available at https://www.apache.org/licenses/LICENSE-2.0. +// +// SPDX-License-Identifier: EPL-2.0 OR Apache-2.0 +// ======================================================================== +// + +package examples; + +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.StandardOpenOption; +import java.util.Iterator; +import java.util.jar.JarEntry; +import java.util.jar.JarOutputStream; +import java.util.stream.Stream; + +import org.eclipse.jetty.util.IO; + +public class WarBuilder implements AutoCloseable +{ + private OutputStream out; + private JarOutputStream jarOut; + + public WarBuilder(Path warPath) throws IOException + { + out = Files.newOutputStream(warPath, StandardOpenOption.CREATE); + jarOut = new JarOutputStream(out); + } + + public void addClasses(Path path) throws IOException + { + packDir(path, "WEB-INF/classes", path); + } + + public void addDir(Path path) throws IOException + { + packDir(path, "/", path); + } + + private void packDir(Path baseDir, String destPath, Path path) throws IOException + { + Stream pathStream = Files.list(path); + for (Iterator it = pathStream.iterator(); it.hasNext(); ) + { + Path entry = it.next(); + if (Files.isDirectory(entry)) + { + packDir(baseDir, destPath, entry); + } + else + { + String name = destPath; + if (!name.startsWith("/")) + name = "/" + name; + if (!name.endsWith("/")) + name = name + "/"; + name = name + baseDir.relativize(entry).toString(); + JarEntry jarEntry = new JarEntry(name); + jarEntry.setSize(Files.size(entry)); + try (InputStream in = Files.newInputStream(entry)) + { + jarOut.putNextEntry(jarEntry); + IO.copy(in, jarOut); + } + finally + { + jarOut.closeEntry(); + } + } + } + } + + @Override + public void close() + { + IO.close(jarOut); + IO.close(out); + } +} diff --git a/standalone/lowresource-access/start.d/annotations.ini b/standalone/lowresource-access/start.d/annotations.ini new file mode 100644 index 0000000..218863c --- /dev/null +++ b/standalone/lowresource-access/start.d/annotations.ini @@ -0,0 +1 @@ +--module=annotations diff --git a/standalone/lowresource-access/start.d/deploy.ini b/standalone/lowresource-access/start.d/deploy.ini new file mode 100644 index 0000000..5ce7f2e --- /dev/null +++ b/standalone/lowresource-access/start.d/deploy.ini @@ -0,0 +1 @@ +--module=deploy diff --git a/standalone/lowresource-access/start.d/http.ini b/standalone/lowresource-access/start.d/http.ini new file mode 100644 index 0000000..f67c68a --- /dev/null +++ b/standalone/lowresource-access/start.d/http.ini @@ -0,0 +1,2 @@ +--module=http +jetty.http.port=8080 diff --git a/standalone/lowresource-access/start.d/lowresources.ini b/standalone/lowresource-access/start.d/lowresources.ini new file mode 100644 index 0000000..6188678 --- /dev/null +++ b/standalone/lowresource-access/start.d/lowresources.ini @@ -0,0 +1 @@ +--module=lowresources diff --git a/standalone/lowresource-access/webapps/.gitignore b/standalone/lowresource-access/webapps/.gitignore new file mode 100644 index 0000000..3a29ed9 --- /dev/null +++ b/standalone/lowresource-access/webapps/.gitignore @@ -0,0 +1 @@ +*.war \ No newline at end of file diff --git a/standalone/lowresource-access/webapps/demo.xml b/standalone/lowresource-access/webapps/demo.xml new file mode 100644 index 0000000..44e3205 --- /dev/null +++ b/standalone/lowresource-access/webapps/demo.xml @@ -0,0 +1,49 @@ + + + + /demo + /demo.war + + + + + + org.eclipse.jetty.server.LowResourceMonitor + + + + + + org.eclipse.jetty.server.LowResourceMonitor + + + + + + + + + -org.eclipse.jetty.server.LowResourceMonitor + + + + -org.eclipse.jetty.server.Server + + + + -org.eclipse.jetty.server.Request + + + + -org.eclipse.jetty.server.HttpChannel + + + + -org.eclipse.jetty.server.HttpConnection + + + \ No newline at end of file diff --git a/standalone/pom.xml b/standalone/pom.xml index f31b37e..ea077d3 100644 --- a/standalone/pom.xml +++ b/standalone/pom.xml @@ -11,4 +11,8 @@ pom Jetty Examples :: Jetty 9.4.x :: Standalone + + lowresource-access + +