diff --git a/jetty-webapp/pom.xml b/jetty-webapp/pom.xml index 76a0f1b47885..3e9055d2d181 100644 --- a/jetty-webapp/pom.xml +++ b/jetty-webapp/pom.xml @@ -96,6 +96,12 @@ jetty-slf4j-impl test + + org.eclipse.jetty.tests + jetty-http-tools + ${project.version} + test + org.eclipse.jetty.toolchain jetty-test-helper diff --git a/jetty-webapp/src/test/java/org/eclipse/jetty/webapp/WebAppClassLoaderTest.java b/jetty-webapp/src/test/java/org/eclipse/jetty/webapp/WebAppClassLoaderTest.java index 51db274b7e1d..af5574c3146f 100644 --- a/jetty-webapp/src/test/java/org/eclipse/jetty/webapp/WebAppClassLoaderTest.java +++ b/jetty-webapp/src/test/java/org/eclipse/jetty/webapp/WebAppClassLoaderTest.java @@ -20,7 +20,6 @@ import java.io.InputStream; import java.lang.instrument.ClassFileTransformer; -import java.lang.instrument.IllegalClassFormatException; import java.net.URI; import java.net.URL; import java.nio.file.Path; @@ -45,6 +44,7 @@ import static org.hamcrest.Matchers.notNullValue; import static org.hamcrest.Matchers.nullValue; import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertNotNull; import static org.junit.jupiter.api.Assertions.assertThrows; import static org.junit.jupiter.api.Assertions.assertTrue; import static org.junit.jupiter.api.Assumptions.assumeTrue; @@ -79,7 +79,7 @@ public void assertCanLoadClass(String clazz) throws ClassNotFoundException assertThat("Can Load Class [" + clazz + "]", _loader.loadClass(clazz), notNullValue()); } - public void assertCanLoadResource(String res) throws ClassNotFoundException + public void assertCanLoadResource(String res) { assertThat("Can Load Resource [" + res + "]", _loader.getResource(res), notNullValue()); } @@ -112,7 +112,7 @@ public void testParentLoad() throws Exception assertCantLoadClass("org.eclipse.jetty.webapp.Configuration"); Class clazzA = _loader.loadClass("org.acme.webapp.ClassInJarA"); - assertTrue(clazzA.getField("FROM_PARENT") != null); + assertNotNull(clazzA.getField("FROM_PARENT")); } @Test @@ -131,21 +131,18 @@ public void testWebAppLoad() throws Exception Class clazzA = _loader.loadClass("org.acme.webapp.ClassInJarA"); assertThrows(NoSuchFieldException.class, () -> - { - clazzA.getField("FROM_PARENT"); - }); + clazzA.getField("FROM_PARENT")); } @Test public void testClassFileTranslations() throws Exception { - final List results = new ArrayList(); + final List results = new ArrayList<>(); _loader.addTransformer(new ClassFileTransformer() { @Override public byte[] transform(ClassLoader loader, String className, Class classBeingRedefined, ProtectionDomain protectionDomain, byte[] classfileBuffer) - throws IllegalClassFormatException { results.add(loader); byte[] b = new byte[classfileBuffer.length]; @@ -160,7 +157,6 @@ public byte[] transform(ClassLoader loader, String className, Class classBein { @Override public byte[] transform(ClassLoader loader, String className, Class classBeingRedefined, ProtectionDomain protectionDomain, byte[] classfileBuffer) - throws IllegalClassFormatException { results.add(className); byte[] b = new byte[classfileBuffer.length]; @@ -196,7 +192,6 @@ public void testNullClassFileTransformer() throws Exception { @Override public byte[] transform(ClassLoader loader, String className, Class classBeingRedefined, ProtectionDomain protectionDomain, byte[] classfileBuffer) - throws IllegalClassFormatException { return null; } @@ -235,7 +230,6 @@ public void testExposedClass() throws Exception assertCantLoadClass("org.eclipse.jetty.webapp.JarScanner"); } - @SuppressWarnings("deprecation") @Test public void testSystemServerClassDeprecated() throws Exception { @@ -377,7 +371,7 @@ public void testResources() throws Exception } @Test - public void ordering() throws Exception + public void testClashingResource() throws Exception { // The existence of a URLStreamHandler changes the behavior assumeTrue(URLStreamHandlerUtil.getFactory() == null, "URLStreamHandler changes behavior, skip test"); diff --git a/jetty-webapp/src/test/java/org/eclipse/jetty/webapp/WebAppContextExtraClasspathTest.java b/jetty-webapp/src/test/java/org/eclipse/jetty/webapp/WebAppContextExtraClasspathTest.java deleted file mode 100644 index 80e878db8af3..000000000000 --- a/jetty-webapp/src/test/java/org/eclipse/jetty/webapp/WebAppContextExtraClasspathTest.java +++ /dev/null @@ -1,216 +0,0 @@ -// -// ======================================================================== -// Copyright (c) 1995-2020 Mort Bay Consulting Pty Ltd and others. -// -// This program and the accompanying materials are made available under -// the terms of the Eclipse Public License 2.0 which is available at -// https://www.eclipse.org/legal/epl-2.0 -// -// This Source Code may also be made available under the following -// Secondary Licenses when the conditions for such availability set -// forth in the Eclipse Public License, v. 2.0 are satisfied: -// the Apache License v2.0 which is available at -// https://www.apache.org/licenses/LICENSE-2.0 -// -// SPDX-License-Identifier: EPL-2.0 OR Apache-2.0 -// ======================================================================== -// - -package org.eclipse.jetty.webapp; - -import java.io.File; -import java.net.URL; -import java.nio.file.Files; -import java.nio.file.Path; -import java.nio.file.Paths; -import java.util.ArrayList; -import java.util.List; -import java.util.stream.Collectors; -import java.util.stream.Stream; - -import org.eclipse.jetty.server.Server; -import org.eclipse.jetty.server.ServerConnector; -import org.eclipse.jetty.toolchain.test.MavenTestingUtils; -import org.eclipse.jetty.util.component.LifeCycle; -import org.eclipse.jetty.util.resource.PathResource; -import org.junit.jupiter.api.AfterEach; -import org.junit.jupiter.api.Test; -import org.junit.jupiter.params.ParameterizedTest; -import org.junit.jupiter.params.provider.Arguments; -import org.junit.jupiter.params.provider.MethodSource; - -import static org.hamcrest.MatcherAssert.assertThat; -import static org.hamcrest.Matchers.instanceOf; -import static org.hamcrest.Matchers.is; -import static org.junit.jupiter.api.Assertions.assertTrue; - -public class WebAppContextExtraClasspathTest -{ - private Server server; - - private Server newServer() - { - server = new Server(); - ServerConnector connector = new ServerConnector(server); - connector.setPort(0); - server.addConnector(connector); - return server; - } - - @AfterEach - public void tearDown() - { - LifeCycle.stop(server); - } - - @Test - public void testBaseResourceAbsolutePath() throws Exception - { - Server server = newServer(); - - WebAppContext context = new WebAppContext(); - context.setContextPath("/"); - - Path warPath = MavenTestingUtils.getTestResourcePathFile("wars/dump.war"); - warPath = warPath.toAbsolutePath(); - assertTrue(warPath.isAbsolute(), "Path should be absolute: " + warPath); - // Use String reference to war - // On Unix / Linux this should have no issue. - // On Windows with fully qualified paths such as "E:\mybase\webapps\dump.war" the - // resolution of the Resource can trigger various URI issues with the "E:" portion of the provided String. - context.setResourceBase(warPath.toString()); - - server.setHandler(context); - server.start(); - - assertTrue(context.isAvailable(), "WebAppContext should be available"); - } - - public static Stream extraClasspathGlob() - { - List references = new ArrayList<>(); - - Path extLibs = MavenTestingUtils.getTestResourcePathDir("ext"); - extLibs = extLibs.toAbsolutePath(); - - // Absolute reference with trailing slash and glob - references.add(Arguments.of(extLibs.toString() + File.separator + "*")); - - // Establish a relative extraClassPath reference - String relativeExtLibsDir = MavenTestingUtils.getBasePath().relativize(extLibs).toString(); - - // This will be in the String form similar to "src/test/resources/ext/*" (with trailing slash and glob) - references.add(Arguments.of(relativeExtLibsDir + File.separator + "*")); - - return references.stream(); - } - - /** - * Test using WebAppContext.setExtraClassPath(String) with a reference to a glob - */ - @ParameterizedTest - @MethodSource("extraClasspathGlob") - public void testExtraClasspathGlob(String extraClasspathGlobReference) throws Exception - { - Server server = newServer(); - - WebAppContext context = new WebAppContext(); - context.setContextPath("/"); - Path warPath = MavenTestingUtils.getTestResourcePathFile("wars/dump.war"); - context.setBaseResource(new PathResource(warPath)); - context.setExtraClasspath(extraClasspathGlobReference); - - server.setHandler(context); - server.start(); - - // Should not have failed the start of the WebAppContext - assertTrue(context.isAvailable(), "WebAppContext should be available"); - - // Test WebAppClassLoader contents for expected jars - ClassLoader contextClassLoader = context.getClassLoader(); - assertThat(contextClassLoader, instanceOf(WebAppClassLoader.class)); - WebAppClassLoader webAppClassLoader = (WebAppClassLoader)contextClassLoader; - Path extLibsDir = MavenTestingUtils.getTestResourcePathDir("ext"); - extLibsDir = extLibsDir.toAbsolutePath(); - List expectedPaths = Files.list(extLibsDir) - .filter(Files::isRegularFile) - .filter((path) -> path.toString().endsWith(".jar")) - .collect(Collectors.toList()); - List actualPaths = new ArrayList<>(); - for (URL url : webAppClassLoader.getURLs()) - { - actualPaths.add(Paths.get(url.toURI())); - } - assertThat("WebAppClassLoader.urls.length", actualPaths.size(), is(expectedPaths.size())); - for (Path expectedPath : expectedPaths) - { - boolean found = false; - for (Path actualPath : actualPaths) - { - if (Files.isSameFile(actualPath, expectedPath)) - { - found = true; - } - } - assertTrue(found, "Not able to find expected jar in WebAppClassLoader: " + expectedPath); - } - } - - public static Stream extraClasspathDir() - { - List references = new ArrayList<>(); - - Path extLibs = MavenTestingUtils.getTestResourcePathDir("ext"); - extLibs = extLibs.toAbsolutePath(); - - // Absolute reference with trailing slash - references.add(Arguments.of(extLibs.toString() + File.separator)); - - // Absolute reference without trailing slash - references.add(Arguments.of(extLibs.toString())); - - // Establish a relative extraClassPath reference - String relativeExtLibsDir = MavenTestingUtils.getBasePath().relativize(extLibs).toString(); - - // This will be in the String form similar to "src/test/resources/ext/" (with trailing slash) - references.add(Arguments.of(relativeExtLibsDir + File.separator)); - - // This will be in the String form similar to "src/test/resources/ext/" (without trailing slash) - references.add(Arguments.of(relativeExtLibsDir)); - - return references.stream(); - } - - /** - * Test using WebAppContext.setExtraClassPath(String) with a reference to a directory - */ - @ParameterizedTest - @MethodSource("extraClasspathDir") - public void testExtraClasspathDir(String extraClassPathReference) throws Exception - { - Server server = newServer(); - - WebAppContext context = new WebAppContext(); - context.setContextPath("/"); - Path warPath = MavenTestingUtils.getTestResourcePathFile("wars/dump.war"); - context.setBaseResource(new PathResource(warPath)); - - context.setExtraClasspath(extraClassPathReference); - - server.setHandler(context); - server.start(); - - // Should not have failed the start of the WebAppContext - assertTrue(context.isAvailable(), "WebAppContext should be available"); - - // Test WebAppClassLoader contents for expected directory reference - ClassLoader contextClassLoader = context.getClassLoader(); - assertThat(contextClassLoader, instanceOf(WebAppClassLoader.class)); - WebAppClassLoader webAppClassLoader = (WebAppClassLoader)contextClassLoader; - URL[] urls = webAppClassLoader.getURLs(); - assertThat("URLs", urls.length, is(1)); - Path extLibs = MavenTestingUtils.getTestResourcePathDir("ext"); - extLibs = extLibs.toAbsolutePath(); - assertThat("URL[0]", urls[0].toURI(), is(extLibs.toUri())); - } -} diff --git a/jetty-webapp/src/test/java/org/eclipse/jetty/webapp/WebAppContextTest.java b/jetty-webapp/src/test/java/org/eclipse/jetty/webapp/WebAppContextTest.java index e78ca39f7526..ac648850c35d 100644 --- a/jetty-webapp/src/test/java/org/eclipse/jetty/webapp/WebAppContextTest.java +++ b/jetty-webapp/src/test/java/org/eclipse/jetty/webapp/WebAppContextTest.java @@ -19,70 +19,83 @@ package org.eclipse.jetty.webapp; import java.io.File; +import java.net.URL; +import java.nio.file.Files; import java.nio.file.Path; +import java.nio.file.Paths; import java.util.ArrayList; import java.util.Arrays; -import java.util.Collection; import java.util.List; import java.util.stream.Collectors; +import java.util.stream.Stream; import javax.servlet.GenericServlet; import javax.servlet.ServletContext; -import javax.servlet.ServletContextEvent; -import javax.servlet.ServletContextListener; import javax.servlet.ServletRequest; import javax.servlet.ServletResponse; -import javax.servlet.http.HttpSessionEvent; -import javax.servlet.http.HttpSessionListener; +import org.eclipse.jetty.http.HttpStatus; +import org.eclipse.jetty.http.tools.HttpTester; import org.eclipse.jetty.server.LocalConnector; 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.HandlerList; -import org.eclipse.jetty.server.handler.HotSwapHandler; import org.eclipse.jetty.servlet.ErrorPageErrorHandler; import org.eclipse.jetty.servlet.ServletContextHandler; +import org.eclipse.jetty.toolchain.test.FS; import org.eclipse.jetty.toolchain.test.MavenTestingUtils; +import org.eclipse.jetty.toolchain.test.jupiter.WorkDir; +import org.eclipse.jetty.toolchain.test.jupiter.WorkDirExtension; +import org.eclipse.jetty.util.component.LifeCycle; import org.eclipse.jetty.util.resource.PathResource; import org.eclipse.jetty.util.resource.Resource; -import org.eclipse.jetty.util.resource.ResourceCollection; import org.hamcrest.Matchers; import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.Arguments; +import org.junit.jupiter.params.provider.MethodSource; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import static org.hamcrest.MatcherAssert.assertThat; -import static org.hamcrest.Matchers.contains; -import static org.hamcrest.Matchers.containsString; +import static org.hamcrest.Matchers.instanceOf; +import static org.hamcrest.Matchers.is; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertFalse; import static org.junit.jupiter.api.Assertions.assertNotNull; import static org.junit.jupiter.api.Assertions.assertNull; import static org.junit.jupiter.api.Assertions.assertTrue; +@ExtendWith(WorkDirExtension.class) public class WebAppContextTest { - public class MySessionListener implements HttpSessionListener - { - @Override - public void sessionCreated(HttpSessionEvent se) - { - } - - @Override - public void sessionDestroyed(HttpSessionEvent se) - { - } - } + public static final Logger LOG = LoggerFactory.getLogger(WebAppContextTest.class); + public WorkDir workDir; + private final List lifeCycles = new ArrayList<>(); @AfterEach public void tearDown() { + lifeCycles.forEach(LifeCycle::stop); Configurations.cleanKnown(); } + private Server newServer() + { + Server server = new Server(); + ServerConnector connector = new ServerConnector(server); + connector.setPort(0); + server.addConnector(connector); + lifeCycles.add(server); + return server; + } + @Test public void testDefaultContextPath() throws Exception { - Server server = new Server(); + Server server = newServer(); File webXml = MavenTestingUtils.getTestResourceFile("web-with-default-context-path.xml"); File webXmlEmptyPath = MavenTestingUtils.getTestResourceFile("web-with-empty-default-context-path.xml"); File webDefaultXml = MavenTestingUtils.getTestResourceFile("web-default-with-default-context-path.xml"); @@ -92,66 +105,43 @@ public void testDefaultContextPath() throws Exception assertNotNull(overrideWebXml); assertNotNull(webXmlEmptyPath); - try - { - WebAppContext wac = new WebAppContext(); - wac.setResourceBase(MavenTestingUtils.getTargetTestingDir().getAbsolutePath()); - server.setHandler(wac); - - //test that an empty default-context-path defaults to root - wac.setDescriptor(webXmlEmptyPath.getAbsolutePath()); - server.start(); - assertEquals("/", wac.getContextPath()); - - server.stop(); - - //test web-default.xml value is used - wac.setDescriptor(null); - wac.setDefaultsDescriptor(webDefaultXml.getAbsolutePath()); - server.start(); - assertEquals("/one", wac.getContextPath()); - - server.stop(); + WebAppContext wac = new WebAppContext(); + wac.setResourceBase(MavenTestingUtils.getTargetTestingDir().getAbsolutePath()); + server.setHandler(wac); - //test web.xml value is used - wac.setDescriptor(webXml.getAbsolutePath()); - server.start(); - assertEquals("/two", wac.getContextPath()); + //test that an empty default-context-path defaults to root + wac.setDescriptor(webXmlEmptyPath.getAbsolutePath()); + server.start(); + assertEquals("/", wac.getContextPath()); - server.stop(); + server.stop(); - //test override-web.xml value is used - wac.setOverrideDescriptor(overrideWebXml.getAbsolutePath()); - server.start(); - assertEquals("/three", wac.getContextPath()); + //test web-default.xml value is used + wac.setDescriptor(null); + wac.setDefaultsDescriptor(webDefaultXml.getAbsolutePath()); + server.start(); + assertEquals("/one", wac.getContextPath()); - server.stop(); + server.stop(); - //test that explicitly set context path is used instead - wac.setContextPath("/foo"); - server.start(); - assertEquals("/foo", wac.getContextPath()); - } - finally - { - server.stop(); - } - } + //test web.xml value is used + wac.setDescriptor(webXml.getAbsolutePath()); + server.start(); + assertEquals("/two", wac.getContextPath()); - @Test - public void testSessionListeners() - { - Server server = new Server(); + server.stop(); - WebAppContext wac = new WebAppContext(); + //test override-web.xml value is used + wac.setOverrideDescriptor(overrideWebXml.getAbsolutePath()); + server.start(); + assertEquals("/three", wac.getContextPath()); - wac.setServer(server); - server.setHandler(wac); - wac.addEventListener(new MySessionListener()); + server.stop(); - Collection listeners = wac.getSessionHandler().getBeans(MySessionListener.class); - assertNotNull(listeners); - assertEquals(1, listeners.size()); + //test that explicitly set context path is used instead + wac.setContextPath("/foo"); + server.start(); + assertEquals("/foo", wac.getContextPath()); } @Test @@ -159,11 +149,11 @@ public void testConfigurationClassesFromDefault() { Configurations.cleanKnown(); String[] knownAndEnabled = Configurations.getKnown().stream() - .filter(c -> c.isEnabledByDefault()) + .filter(Configuration::isEnabledByDefault) .map(c -> c.getClass().getName()) .toArray(String[]::new); - Server server = new Server(); + Server server = newServer(); //test if no classnames set, its the defaults WebAppContext wac = new WebAppContext(); @@ -174,7 +164,7 @@ public void testConfigurationClassesFromDefault() String[] classNames = wac.getConfigurationClasses(); assertNotNull(classNames); - //test if no classname set, and none from server its the defaults + // test if no classname set, and none from server its the defaults wac.setServer(server); assertTrue(Arrays.equals(classNames, wac.getConfigurationClasses())); } @@ -214,7 +204,7 @@ public void testConfigurationInstances() //test that explicit config instances override any from server String[] classNames = {"x.y.z"}; - Server server = new Server(); + Server server = newServer(); server.setAttribute(Configuration.ATTR, classNames); wac.setServer(server); assertThat(wac.getConfigurations(), Matchers.contains(configs)); @@ -223,7 +213,7 @@ public void testConfigurationInstances() @Test public void testRealPathDoesNotExist() throws Exception { - Server server = new Server(0); + Server server = newServer(); WebAppContext context = new WebAppContext(".", "/"); server.setHandler(context); server.start(); @@ -241,7 +231,7 @@ public void testRealPathDoesNotExist() throws Exception @Test public void testContextWhiteList() throws Exception { - Server server = new Server(0); + Server server = newServer(); HandlerList handlers = new HandlerList(); WebAppContext contextA = new WebAppContext(".", "/A"); @@ -268,22 +258,20 @@ public void testContextWhiteList() throws Exception @Test public void testAlias() throws Exception { - File dir = File.createTempFile("dir", null); - dir.delete(); - dir.mkdir(); - dir.deleteOnExit(); + Path tempDir = workDir.getEmptyPathDir().resolve("dir"); + FS.ensureEmpty(tempDir); - File webinf = new File(dir, "WEB-INF"); - webinf.mkdir(); + Path webinf = tempDir.resolve("WEB-INF"); + FS.ensureEmpty(webinf); - File classes = new File(dir, "classes"); - classes.mkdir(); + Path classes = tempDir.resolve("classes"); + FS.ensureEmpty(classes); - File someclass = new File(classes, "SomeClass.class"); - someclass.createNewFile(); + Path someClass = classes.resolve("SomeClass.class"); + FS.touch(someClass); WebAppContext context = new WebAppContext(); - context.setBaseResource(new ResourceCollection(dir.getAbsolutePath())); + context.setBaseResource(new PathResource(tempDir)); context.setResourceAlias("/WEB-INF/classes/", "/classes/"); @@ -295,6 +283,7 @@ public void testAlias() throws Exception public void testIsProtected() { WebAppContext context = new WebAppContext(); + assertTrue(context.isProtectedTarget("/web-inf/lib/foo.jar")); assertTrue(context.isProtectedTarget("/meta-inf/readme.txt")); assertFalse(context.isProtectedTarget("/something-else/web-inf")); @@ -303,11 +292,13 @@ public void testIsProtected() @Test public void testNullPath() throws Exception { - Server server = new Server(0); + Server server = newServer(); + HandlerList handlers = new HandlerList(); ContextHandlerCollection contexts = new ContextHandlerCollection(); WebAppContext context = new WebAppContext(); - context.setBaseResource(Resource.newResource("./src/test/webapp")); + Path testWebapp = MavenTestingUtils.getProjectDirPath("src/test/webapp"); + context.setBaseResource(new PathResource(testWebapp)); context.setContextPath("/"); server.setHandler(handlers); handlers.addHandler(contexts); @@ -318,27 +309,24 @@ public void testNullPath() throws Exception server.start(); - try - { - String response = connector.getResponse("GET http://localhost:8080 HTTP/1.1\r\nHost: localhost:8080\r\nConnection: close\r\n\r\n"); - assertThat("Response OK", response, containsString("200 OK")); - } - finally - { - server.stop(); - } + String rawResponse = connector.getResponse("GET http://localhost:8080 HTTP/1.1\r\nHost: localhost:8080\r\nConnection: close\r\n\r\n"); + HttpTester.Response response = HttpTester.parseResponse(rawResponse); + assertThat("Response OK", response.getStatus(), is(HttpStatus.OK_200)); } @Test public void testNullSessionAndSecurityHandler() throws Exception { - Server server = new Server(0); + Server server = newServer(); + HandlerList handlers = new HandlerList(); ContextHandlerCollection contexts = new ContextHandlerCollection(); WebAppContext context = new WebAppContext(null, null, null, null, null, new ErrorPageErrorHandler(), ServletContextHandler.NO_SESSIONS | ServletContextHandler.NO_SECURITY); context.setContextPath("/"); - context.setBaseResource(Resource.newResource("./src/test/webapp")); + + Path testWebapp = MavenTestingUtils.getProjectDirPath("src/test/webapp"); + context.setBaseResource(new PathResource(testWebapp)); server.setHandler(handlers); handlers.addHandler(contexts); contexts.addHandler(context); @@ -346,18 +334,11 @@ public void testNullSessionAndSecurityHandler() throws Exception LocalConnector connector = new LocalConnector(server); server.addConnector(connector); - try - { - server.start(); - assertTrue(context.isAvailable()); - } - finally - { - server.stop(); - } + server.start(); + assertTrue(context.isAvailable()); } - class ServletA extends GenericServlet + static class ServletA extends GenericServlet { @Override public void service(ServletRequest req, ServletResponse res) @@ -366,7 +347,7 @@ public void service(ServletRequest req, ServletResponse res) } } - class ServletB extends GenericServlet + static class ServletB extends GenericServlet { @Override public void service(ServletRequest req, ServletResponse res) @@ -376,120 +357,153 @@ public void service(ServletRequest req, ServletResponse res) } @Test - public void testServletContextListener() throws Exception + public void testBaseResourceAbsolutePath() throws Exception { - Server server = new Server(); - HotSwapHandler swap = new HotSwapHandler(); - server.setHandler(swap); - server.start(); + Server server = newServer(); - ServletContextHandler context = new ServletContextHandler( - ServletContextHandler.SESSIONS); + WebAppContext context = new WebAppContext(); context.setContextPath("/"); - context.setResourceBase(System.getProperty("java.io.tmpdir")); - final List history = new ArrayList<>(); + Path warPath = MavenTestingUtils.getTestResourcePathFile("wars/dump.war"); + warPath = warPath.toAbsolutePath(); + assertTrue(warPath.isAbsolute(), "Path should be absolute: " + warPath); + // Use String reference to war + // On Unix / Linux this should have no issue. + // On Windows with fully qualified paths such as "E:\mybase\webapps\dump.war" the + // resolution of the Resource can trigger various URI issues with the "E:" portion of the provided String. + context.setResourceBase(warPath.toString()); - context.addEventListener(new ServletContextListener() - { - @Override - public void contextInitialized(ServletContextEvent servletContextEvent) - { - history.add("I0"); - } + server.setHandler(context); + server.start(); - @Override - public void contextDestroyed(ServletContextEvent servletContextEvent) - { - history.add("D0"); - } - }); - context.addEventListener(new ServletContextListener() - { - @Override - public void contextInitialized(ServletContextEvent servletContextEvent) - { - history.add("I1"); - } + assertTrue(context.isAvailable(), "WebAppContext should be available"); + } - @Override - public void contextDestroyed(ServletContextEvent servletContextEvent) - { - history.add("D1"); - throw new RuntimeException("Listener1 destroy broken"); - } - }); - context.addEventListener(new ServletContextListener() - { - @Override - public void contextInitialized(ServletContextEvent servletContextEvent) - { - history.add("I2"); - throw new RuntimeException("Listener2 init broken"); - } + public static Stream extraClasspathGlob() + { + List references = new ArrayList<>(); - @Override - public void contextDestroyed(ServletContextEvent servletContextEvent) - { - history.add("D2"); - } - }); - context.addEventListener(new ServletContextListener() - { - @Override - public void contextInitialized(ServletContextEvent servletContextEvent) - { - history.add("I3"); - } + Path extLibs = MavenTestingUtils.getTestResourcePathDir("ext"); + extLibs = extLibs.toAbsolutePath(); - @Override - public void contextDestroyed(ServletContextEvent servletContextEvent) - { - history.add("D3"); - } - }); + // Absolute reference with trailing slash and glob + references.add(Arguments.of(extLibs.toString() + File.separator + "*")); - try - { - swap.setHandler(context); - context.start(); - } - catch (Exception e) + // Establish a relative extraClassPath reference + String relativeExtLibsDir = MavenTestingUtils.getBasePath().relativize(extLibs).toString(); + + // This will be in the String form similar to "src/test/resources/ext/*" (with trailing slash and glob) + references.add(Arguments.of(relativeExtLibsDir + File.separator + "*")); + + return references.stream(); + } + + /** + * Test using WebAppContext.setExtraClassPath(String) with a reference to a glob + */ + @ParameterizedTest + @MethodSource("extraClasspathGlob") + public void testExtraClasspathGlob(String extraClasspathGlobReference) throws Exception + { + Server server = newServer(); + + WebAppContext context = new WebAppContext(); + context.setContextPath("/"); + Path warPath = MavenTestingUtils.getTestResourcePathFile("wars/dump.war"); + context.setBaseResource(new PathResource(warPath)); + context.setExtraClasspath(extraClasspathGlobReference); + + server.setHandler(context); + server.start(); + + // Should not have failed the start of the WebAppContext + assertTrue(context.isAvailable(), "WebAppContext should be available"); + + // Test WebAppClassLoader contents for expected jars + ClassLoader contextClassLoader = context.getClassLoader(); + assertThat(contextClassLoader, instanceOf(WebAppClassLoader.class)); + WebAppClassLoader webAppClassLoader = (WebAppClassLoader)contextClassLoader; + Path extLibsDir = MavenTestingUtils.getTestResourcePathDir("ext"); + extLibsDir = extLibsDir.toAbsolutePath(); + List expectedPaths = Files.list(extLibsDir) + .filter(Files::isRegularFile) + .filter((path) -> path.toString().endsWith(".jar")) + .collect(Collectors.toList()); + List actualPaths = new ArrayList<>(); + for (URL url : webAppClassLoader.getURLs()) { - history.add(e.getMessage()); + actualPaths.add(Paths.get(url.toURI())); } - finally + assertThat("WebAppClassLoader.urls.length", actualPaths.size(), is(expectedPaths.size())); + for (Path expectedPath : expectedPaths) { - try - { - swap.setHandler(null); - } - catch (Exception e) + boolean found = false; + for (Path actualPath : actualPaths) { - while (e.getCause() instanceof Exception) + if (Files.isSameFile(actualPath, expectedPath)) { - e = (Exception)e.getCause(); + found = true; } - history.add(e.getMessage()); } + assertTrue(found, "Not able to find expected jar in WebAppClassLoader: " + expectedPath); } + } - assertThat(history, contains("I0", "I1", "I2", "Listener2 init broken", "D1", "D0", "Listener1 destroy broken")); + public static Stream extraClasspathDir() + { + List references = new ArrayList<>(); - server.stop(); + Path extLibs = MavenTestingUtils.getTestResourcePathDir("ext"); + extLibs = extLibs.toAbsolutePath(); + + // Absolute reference with trailing slash + references.add(Arguments.of(extLibs.toString() + File.separator)); + + // Absolute reference without trailing slash + references.add(Arguments.of(extLibs.toString())); + + // Establish a relative extraClassPath reference + String relativeExtLibsDir = MavenTestingUtils.getBasePath().relativize(extLibs).toString(); + + // This will be in the String form similar to "src/test/resources/ext/" (with trailing slash) + references.add(Arguments.of(relativeExtLibsDir + File.separator)); + + // This will be in the String form similar to "src/test/resources/ext/" (without trailing slash) + references.add(Arguments.of(relativeExtLibsDir)); + + return references.stream(); } - @Test - public void ordering() throws Exception + /** + * Test using WebAppContext.setExtraClassPath(String) with a reference to a directory + */ + @ParameterizedTest + @MethodSource("extraClasspathDir") + public void testExtraClasspathDir(String extraClassPathReference) throws Exception { - Path testWebappDir = MavenTestingUtils.getProjectDirPath("src/test/webapp"); - Resource webapp = new PathResource(testWebappDir); + Server server = newServer(); + WebAppContext context = new WebAppContext(); - context.setBaseResource(webapp); - context.setContextPath("/test"); - context.setServer(new Server()); - new MetaInfConfiguration().preConfigure(context); - assertEquals(Arrays.asList("acme.jar", "alpha.jar", "omega.jar"), - context.getMetaData().getWebInfResources(false).stream().map(r -> r.getURI().toString().replaceFirst(".+/", "")).collect(Collectors.toList())); + context.setContextPath("/"); + Path warPath = MavenTestingUtils.getTestResourcePathFile("wars/dump.war"); + context.setBaseResource(new PathResource(warPath)); + + context.setExtraClasspath(extraClassPathReference); + + server.setHandler(context); + server.start(); + + // Should not have failed the start of the WebAppContext + assertTrue(context.isAvailable(), "WebAppContext should be available"); + + // Test WebAppClassLoader contents for expected directory reference + ClassLoader contextClassLoader = context.getClassLoader(); + assertThat(contextClassLoader, instanceOf(WebAppClassLoader.class)); + WebAppClassLoader webAppClassLoader = (WebAppClassLoader)contextClassLoader; + URL[] urls = webAppClassLoader.getURLs(); + assertThat("URLs", urls.length, is(1)); + Path extLibs = MavenTestingUtils.getTestResourcePathDir("ext"); + extLibs = extLibs.toAbsolutePath(); + assertThat("URL[0]", urls[0].toURI(), is(extLibs.toUri())); } } diff --git a/tests/test-sessions/test-sessions-common/src/test/java/org/eclipse/jetty/server/session/SessionListenerTest.java b/tests/test-sessions/test-sessions-common/src/test/java/org/eclipse/jetty/server/session/SessionListenerTest.java index 7fd71f0b0d88..9e6c706e5f27 100644 --- a/tests/test-sessions/test-sessions-common/src/test/java/org/eclipse/jetty/server/session/SessionListenerTest.java +++ b/tests/test-sessions/test-sessions-common/src/test/java/org/eclipse/jetty/server/session/SessionListenerTest.java @@ -18,14 +18,16 @@ package org.eclipse.jetty.server.session; -import java.io.File; -import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; +import java.io.OutputStream; import java.io.Serializable; import java.net.HttpCookie; import java.net.URL; import java.net.URLClassLoader; +import java.nio.file.Files; +import java.nio.file.Path; +import java.util.Collection; import java.util.concurrent.TimeUnit; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; @@ -34,17 +36,25 @@ import javax.servlet.http.HttpSession; import javax.servlet.http.HttpSessionBindingEvent; import javax.servlet.http.HttpSessionBindingListener; +import javax.servlet.http.HttpSessionEvent; +import javax.servlet.http.HttpSessionListener; import org.eclipse.jetty.client.HttpClient; import org.eclipse.jetty.client.api.ContentResponse; import org.eclipse.jetty.client.api.Request; +import org.eclipse.jetty.server.Server; import org.eclipse.jetty.servlet.ServletContextHandler; import org.eclipse.jetty.servlet.ServletHolder; import org.eclipse.jetty.toolchain.test.IO; -import org.eclipse.jetty.toolchain.test.MavenTestingUtils; +import org.eclipse.jetty.toolchain.test.jupiter.WorkDir; +import org.eclipse.jetty.toolchain.test.jupiter.WorkDirExtension; +import org.eclipse.jetty.util.component.LifeCycle; +import org.eclipse.jetty.webapp.WebAppContext; import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.Matchers.greaterThan; import static org.hamcrest.Matchers.in; import static org.hamcrest.Matchers.is; import static org.junit.jupiter.api.Assertions.assertEquals; @@ -58,8 +68,11 @@ * * Test that session listeners are called. */ +@ExtendWith(WorkDirExtension.class) public class SessionListenerTest { + public WorkDir workDir; + /** * Test that listeners are called when a session is deliberately invalidated. */ @@ -73,8 +86,8 @@ public void testListenerWithInvalidation() throws Exception DefaultSessionCacheFactory cacheFactory = new DefaultSessionCacheFactory(); cacheFactory.setEvictionPolicy(SessionCache.NEVER_EVICT); - SessionDataStoreFactory storeFactory = new TestSessionDataStoreFactory(); - ((AbstractSessionDataStoreFactory)storeFactory).setGracePeriodSec(scavengePeriod); + TestSessionDataStoreFactory storeFactory = new TestSessionDataStoreFactory(); + storeFactory.setGracePeriodSec(scavengePeriod); TestServer server = new TestServer(0, inactivePeriod, scavengePeriod, cacheFactory, storeFactory); @@ -99,7 +112,7 @@ public void testListenerWithInvalidation() throws Exception ContentResponse response1 = client.GET(url + "?action=init"); assertEquals(HttpServletResponse.SC_OK, response1.getStatus()); String sessionCookie = response1.getHeaders().get("Set-Cookie"); - assertTrue(sessionCookie != null); + assertNotNull(sessionCookie); assertTrue(TestServlet.bindingListener.bound); String sessionId = TestServer.extractSessionId(sessionCookie); @@ -115,12 +128,12 @@ public void testListenerWithInvalidation() throws Exception } finally { - client.stop(); + LifeCycle.stop(client); } } finally { - server.stop(); + LifeCycle.stop(server); } } @@ -131,17 +144,20 @@ public void testListenerWithInvalidation() throws Exception @Test public void testSessionExpiresWithListener() throws Exception { + Path foodir = workDir.getEmptyPathDir(); + Path fooClass = foodir.resolve("Foo.class"); + //Use a class that would only be known to the webapp classloader - InputStream foostream = Thread.currentThread().getContextClassLoader().getResourceAsStream("Foo.clazz"); - File foodir = new File(MavenTestingUtils.getTargetDir(), "foo"); - foodir.mkdirs(); - File fooclass = new File(foodir, "Foo.class"); - IO.copy(foostream, new FileOutputStream(fooclass)); + try (InputStream foostream = Thread.currentThread().getContextClassLoader().getResourceAsStream("Foo.clazz"); + OutputStream out = Files.newOutputStream(fooClass)) + { + IO.copy(foostream, out); + } - assertTrue(fooclass.exists()); - assertTrue(fooclass.length() != 0); + assertTrue(Files.exists(fooClass)); + assertThat(Files.size(fooClass), greaterThan(0L)); - URL[] foodirUrls = new URL[]{foodir.toURI().toURL()}; + URL[] foodirUrls = new URL[]{foodir.toUri().toURL()}; URLClassLoader contextClassLoader = new URLClassLoader(foodirUrls, Thread.currentThread().getContextClassLoader()); String contextPath = "/"; @@ -151,8 +167,8 @@ public void testSessionExpiresWithListener() throws Exception DefaultSessionCacheFactory cacheFactory = new DefaultSessionCacheFactory(); cacheFactory.setEvictionPolicy(SessionCache.NEVER_EVICT); - SessionDataStoreFactory storeFactory = new TestSessionDataStoreFactory(); - ((AbstractSessionDataStoreFactory)storeFactory).setGracePeriodSec(scavengePeriod); + TestSessionDataStoreFactory storeFactory = new TestSessionDataStoreFactory(); + storeFactory.setGracePeriodSec(scavengePeriod); TestServer server1 = new TestServer(0, inactivePeriod, scavengePeriod, cacheFactory, storeFactory); @@ -164,31 +180,38 @@ public void testSessionExpiresWithListener() throws Exception TestHttpSessionListener listener = new TestHttpSessionListenerWithWebappClasses(true); context.getSessionHandler().addEventListener(listener); - server1.start(); - int port1 = server1.getPort(); - try { + server1.start(); + int port1 = server1.getPort(); + HttpClient client = new HttpClient(); - client.start(); - String url = "http://localhost:" + port1 + contextPath + servletMapping.substring(1); + try + { + client.start(); + String url = "http://localhost:" + port1 + contextPath + servletMapping.substring(1); - //make a request to set up a session on the server - ContentResponse response1 = client.GET(url + "?action=init"); - assertEquals(HttpServletResponse.SC_OK, response1.getStatus()); - String sessionCookie = response1.getHeaders().get("Set-Cookie"); - assertTrue(sessionCookie != null); + //make a request to set up a session on the server + ContentResponse response1 = client.GET(url + "?action=init"); + assertEquals(HttpServletResponse.SC_OK, response1.getStatus()); + String sessionCookie = response1.getHeaders().get("Set-Cookie"); + assertNotNull(sessionCookie); - String sessionId = TestServer.extractSessionId(sessionCookie); + String sessionId = TestServer.extractSessionId(sessionCookie); - assertThat(sessionId, is(in(listener.createdSessions))); + assertThat(sessionId, is(in(listener.createdSessions))); - //and wait until the session should have expired - Thread.currentThread().sleep(TimeUnit.SECONDS.toMillis(inactivePeriod + (2 * scavengePeriod))); + //and wait until the session should have expired + Thread.sleep(TimeUnit.SECONDS.toMillis(inactivePeriod + (2 * scavengePeriod))); - assertThat(sessionId, is(in(listener.destroyedSessions))); + assertThat(sessionId, is(in(listener.destroyedSessions))); - assertNull(listener.ex); + assertNull(listener.ex); + } + finally + { + LifeCycle.stop(client); + } } finally { @@ -209,8 +232,8 @@ public void testExpiredSession() throws Exception DefaultSessionCacheFactory cacheFactory = new DefaultSessionCacheFactory(); cacheFactory.setEvictionPolicy(SessionCache.NEVER_EVICT); - SessionDataStoreFactory storeFactory = new TestSessionDataStoreFactory(); - ((AbstractSessionDataStoreFactory)storeFactory).setGracePeriodSec(scavengePeriod); + TestSessionDataStoreFactory storeFactory = new TestSessionDataStoreFactory(); + storeFactory.setGracePeriodSec(scavengePeriod); TestServer server1 = new TestServer(0, inactivePeriod, scavengePeriod, cacheFactory, storeFactory); @@ -222,11 +245,11 @@ public void testExpiredSession() throws Exception context.getSessionHandler().addEventListener(listener); - server1.start(); - int port1 = server1.getPort(); - try { + server1.start(); + int port1 = server1.getPort(); + //save a session that has already expired long now = System.currentTimeMillis(); SessionData data = context.getSessionHandler().getSessionCache().getSessionDataStore().newSessionData("1234", now - 10, now - 5, now - 10, 30000); @@ -234,24 +257,31 @@ public void testExpiredSession() throws Exception context.getSessionHandler().getSessionCache().getSessionDataStore().store("1234", data); HttpClient client = new HttpClient(); - client.start(); + try + { + client.start(); - port1 = server1.getPort(); - String url = "http://localhost:" + port1 + contextPath + servletMapping.substring(1); + port1 = server1.getPort(); + String url = "http://localhost:" + port1 + contextPath + servletMapping.substring(1); - //make another request using the id of the expired session - Request request = client.newRequest(url + "?action=test"); - request.cookie(new HttpCookie("JSESSIONID", "1234")); - ContentResponse response = request.send(); - assertEquals(HttpServletResponse.SC_OK, response.getStatus()); + //make another request using the id of the expired session + Request request = client.newRequest(url + "?action=test"); + request.cookie(new HttpCookie("JSESSIONID", "1234")); + ContentResponse response = request.send(); + assertEquals(HttpServletResponse.SC_OK, response.getStatus()); - //should be a new session id - String cookie2 = response.getHeaders().get("Set-Cookie"); - assertNotEquals("1234", TestServer.extractSessionId(cookie2)); + //should be a new session id + String cookie2 = response.getHeaders().get("Set-Cookie"); + assertNotEquals("1234", TestServer.extractSessionId(cookie2)); - assertTrue(listener.destroyedSessions.contains("1234")); + assertTrue(listener.destroyedSessions.contains("1234")); - assertNull(listener.ex); + assertNull(listener.ex); + } + finally + { + LifeCycle.stop(client); + } } finally { @@ -259,6 +289,42 @@ public void testExpiredSession() throws Exception } } + public static class MyHttpSessionListener implements HttpSessionListener + { + @Override + public void sessionCreated(HttpSessionEvent se) + { + } + + @Override + public void sessionDestroyed(HttpSessionEvent se) + { + } + } + + @Test + public void testSessionListeners() + { + Server server = new Server(); + try + { + WebAppContext wac = new WebAppContext(); + + wac.setServer(server); + server.setHandler(wac); + wac.addEventListener(new MyHttpSessionListener()); + + Collection listeners = wac.getSessionHandler().getBeans(MyHttpSessionListener.class); + assertNotNull(listeners); + + assertEquals(1, listeners.size()); + } + finally + { + LifeCycle.stop(server); + } + } + public static class MySessionBindingListener implements HttpSessionBindingListener, Serializable { private static final long serialVersionUID = 1L; @@ -314,7 +380,7 @@ protected void doGet(HttpServletRequest request, HttpServletResponse httpServlet if ("test".equals(action)) { HttpSession session = request.getSession(true); - assertTrue(session != null); + assertNotNull(session); } } } diff --git a/tests/test-webapps/test-servlet-spec/test-spec-webapp/src/main/java/com/acme/test/AnnotatedListener.java b/tests/test-webapps/test-servlet-spec/test-spec-webapp/src/main/java/com/acme/test/AnnotatedListener.java index 241cdde622cf..3ffee2ed98cc 100644 --- a/tests/test-webapps/test-servlet-spec/test-spec-webapp/src/main/java/com/acme/test/AnnotatedListener.java +++ b/tests/test-webapps/test-servlet-spec/test-spec-webapp/src/main/java/com/acme/test/AnnotatedListener.java @@ -18,6 +18,7 @@ package com.acme.test; +import java.util.logging.Logger; import javax.annotation.Resource; import javax.servlet.ServletContextAttributeEvent; import javax.servlet.ServletContextAttributeListener; @@ -35,69 +36,77 @@ import javax.servlet.http.HttpSessionListener; @WebListener -public class AnnotatedListener implements HttpSessionListener, HttpSessionAttributeListener, HttpSessionActivationListener, ServletContextListener, ServletContextAttributeListener, ServletRequestListener, ServletRequestAttributeListener +public class AnnotatedListener implements HttpSessionListener, + HttpSessionAttributeListener, + HttpSessionActivationListener, + ServletContextListener, + ServletContextAttributeListener, + ServletRequestListener, + ServletRequestAttributeListener { + private static final Logger LOG = Logger.getLogger(AnnotatedListener.class.getName()); + @Resource(mappedName = "maxAmount") private Double maxAmount; @Override public void attributeAdded(HttpSessionBindingEvent se) { - // System.err.println("attributedAdded "+se); + LOG.fine("attributedAdded " + se); } @Override - public void attributeAdded(ServletContextAttributeEvent scab) + public void attributeAdded(ServletContextAttributeEvent scae) { - // System.err.println("attributeAdded "+scab); + LOG.fine("attributeAdded " + scae); } @Override public void attributeAdded(ServletRequestAttributeEvent srae) { - // System.err.println("attributeAdded "+srae); + LOG.fine("attributeAdded " + srae); } @Override public void attributeRemoved(HttpSessionBindingEvent se) { - // System.err.println("attributeRemoved "+se); + LOG.fine("attributeRemoved " + se); } @Override public void attributeRemoved(ServletContextAttributeEvent scab) { - // System.err.println("attributeRemoved "+scab); + LOG.fine("attributeRemoved " + scab); } @Override public void attributeRemoved(ServletRequestAttributeEvent srae) { - // System.err.println("attributeRemoved "+srae); + LOG.fine("attributeRemoved " + srae); } @Override public void attributeReplaced(HttpSessionBindingEvent se) { - // System.err.println("attributeReplaced "+se); + LOG.fine("attributeReplaced " + se); } @Override public void attributeReplaced(ServletContextAttributeEvent scab) { - // System.err.println("attributeReplaced "+scab); + LOG.fine("attributeReplaced " + scab); } @Override public void attributeReplaced(ServletRequestAttributeEvent srae) { - // System.err.println("attributeReplaced "+srae); + LOG.fine("attributeReplaced " + srae); } @Override public void contextDestroyed(ServletContextEvent sce) { - // System.err.println("contextDestroyed "+sce); + LOG.fine("contextDestroyed " + sce); } @Override @@ -106,7 +115,7 @@ public void contextInitialized(ServletContextEvent sce) if (sce.getServletContext().getAttribute("com.acme.AnnotationTest.sclInjectWebListenerTest") != null) throw new IllegalStateException("AnnotatedListener already initialized"); - sce.getServletContext().setAttribute("com.acme.AnnotationTest.sclInjectWebListenerTest", Boolean.valueOf(maxAmount != null)); + sce.getServletContext().setAttribute("com.acme.AnnotationTest.sclInjectWebListenerTest", maxAmount != null); boolean setSessionTimeout; try @@ -118,7 +127,7 @@ public void contextInitialized(ServletContextEvent sce) { setSessionTimeout = false; } - sce.getServletContext().setAttribute("com.acme.AnnotationTest.sclSetSessionTimeout", Boolean.valueOf(setSessionTimeout)); + sce.getServletContext().setAttribute("com.acme.AnnotationTest.sclSetSessionTimeout", setSessionTimeout); boolean getSessionTimeout; try @@ -129,60 +138,42 @@ public void contextInitialized(ServletContextEvent sce) { getSessionTimeout = false; } - sce.getServletContext().setAttribute("com.acme.AnnotationTest.sclGetSessionTimeout", Boolean.valueOf(getSessionTimeout)); - } - - public void requestCompleted(ServletRequestEvent rre) - { - // TODO Auto-generated method stub - + sce.getServletContext().setAttribute("com.acme.AnnotationTest.sclGetSessionTimeout", getSessionTimeout); } @Override public void requestDestroyed(ServletRequestEvent sre) { - // System.err.println("requestDestroyed "+sre); + LOG.fine("requestDestroyed " + sre); } @Override public void requestInitialized(ServletRequestEvent sre) { - // System.err.println("requestInitialized "+sre); - } - - public void requestResumed(ServletRequestEvent rre) - { - // TODO Auto-generated method stub - - } - - public void requestSuspended(ServletRequestEvent rre) - { - // TODO Auto-generated method stub - + LOG.fine("requestInitialized " + sre); } @Override public void sessionCreated(HttpSessionEvent se) { - // System.err.println("sessionCreated "+se); + LOG.fine("sessionCreated " + se); } @Override public void sessionDestroyed(HttpSessionEvent se) { - // System.err.println("sessionDestroyed "+se); + LOG.fine("sessionDestroyed " + se); } @Override public void sessionDidActivate(HttpSessionEvent se) { - // System.err.println("sessionDidActivate "+se); + LOG.fine("sessionDidActivate " + se); } @Override public void sessionWillPassivate(HttpSessionEvent se) { - // System.err.println("sessionWillPassivate "+se); + LOG.fine("sessionWillPassivate " + se); } } diff --git a/tests/test-webapps/test-servlet-spec/test-spec-webapp/src/main/java/com/acme/test/AsyncListenerServlet.java b/tests/test-webapps/test-servlet-spec/test-spec-webapp/src/main/java/com/acme/test/AsyncListenerServlet.java index 5cc1daa911d3..7efe30fd09a5 100644 --- a/tests/test-webapps/test-servlet-spec/test-spec-webapp/src/main/java/com/acme/test/AsyncListenerServlet.java +++ b/tests/test-webapps/test-servlet-spec/test-spec-webapp/src/main/java/com/acme/test/AsyncListenerServlet.java @@ -62,29 +62,21 @@ public boolean isResourceInjected() @Override public void onComplete(AsyncEvent event) throws IOException { - // TODO Auto-generated method stub - } @Override public void onTimeout(AsyncEvent event) throws IOException { - // TODO Auto-generated method stub - } @Override public void onError(AsyncEvent event) throws IOException { - // TODO Auto-generated method stub - } @Override public void onStartAsync(AsyncEvent event) throws IOException { - // TODO Auto-generated method stub - } } diff --git a/tests/test-webapps/test-servlet-spec/test-spec-webapp/src/main/java/com/acme/test/Bar.java b/tests/test-webapps/test-servlet-spec/test-spec-webapp/src/main/java/com/acme/test/Bar.java index 1172fe7fded1..1aed8905f1e5 100644 --- a/tests/test-webapps/test-servlet-spec/test-spec-webapp/src/main/java/com/acme/test/Bar.java +++ b/tests/test-webapps/test-servlet-spec/test-spec-webapp/src/main/java/com/acme/test/Bar.java @@ -20,7 +20,6 @@ public class Bar { - @com.acme.initializer.Foo(2) public void someMethod() { diff --git a/tests/test-webapps/test-servlet-spec/test-spec-webapp/src/main/java/com/acme/test/ClassLoaderServlet.java b/tests/test-webapps/test-servlet-spec/test-spec-webapp/src/main/java/com/acme/test/ClassLoaderServlet.java index c37262340d6d..b22a5db26d18 100644 --- a/tests/test-webapps/test-servlet-spec/test-spec-webapp/src/main/java/com/acme/test/ClassLoaderServlet.java +++ b/tests/test-webapps/test-servlet-spec/test-spec-webapp/src/main/java/com/acme/test/ClassLoaderServlet.java @@ -38,7 +38,6 @@ protected void doGet(HttpServletRequest req, HttpServletResponse resp) { try { - PrintWriter writer = resp.getWriter(); writer.println(""); writer.println(""); diff --git a/tests/test-webapps/test-servlet-spec/test-spec-webapp/src/main/java/com/acme/test/RoleAnnotationTest.java b/tests/test-webapps/test-servlet-spec/test-spec-webapp/src/main/java/com/acme/test/RoleAnnotationTest.java index 4b612d24680e..e886402e8fcb 100644 --- a/tests/test-webapps/test-servlet-spec/test-spec-webapp/src/main/java/com/acme/test/RoleAnnotationTest.java +++ b/tests/test-webapps/test-servlet-spec/test-spec-webapp/src/main/java/com/acme/test/RoleAnnotationTest.java @@ -32,7 +32,6 @@ * * Use DeclareRolesAnnotations from within Jetty. */ - @DeclareRoles({"server-administrator", "user"}) public class RoleAnnotationTest extends HttpServlet { diff --git a/tests/test-webapps/test-servlet-spec/test-spec-webapp/src/main/java/com/acme/test/SecuredServlet.java b/tests/test-webapps/test-servlet-spec/test-spec-webapp/src/main/java/com/acme/test/SecuredServlet.java index 8719d8688fa9..a66f858f066e 100644 --- a/tests/test-webapps/test-servlet-spec/test-spec-webapp/src/main/java/com/acme/test/SecuredServlet.java +++ b/tests/test-webapps/test-servlet-spec/test-spec-webapp/src/main/java/com/acme/test/SecuredServlet.java @@ -20,7 +20,6 @@ import java.io.IOException; import java.io.PrintWriter; -import javax.servlet.ServletException; import javax.servlet.annotation.HttpConstraint; import javax.servlet.annotation.ServletSecurity; import javax.servlet.annotation.WebServlet; @@ -32,10 +31,9 @@ @ServletSecurity(@HttpConstraint(rolesAllowed = "admin")) public class SecuredServlet extends HttpServlet { - @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) - throws ServletException, IOException + throws IOException { PrintWriter writer = resp.getWriter(); writer.println(""); diff --git a/tests/test-webapps/test-servlet-spec/test-spec-webapp/src/main/java/com/acme/test/TestListener.java b/tests/test-webapps/test-servlet-spec/test-spec-webapp/src/main/java/com/acme/test/TestListener.java index a8f2eecf12bb..49d528fce09c 100644 --- a/tests/test-webapps/test-servlet-spec/test-spec-webapp/src/main/java/com/acme/test/TestListener.java +++ b/tests/test-webapps/test-servlet-spec/test-spec-webapp/src/main/java/com/acme/test/TestListener.java @@ -19,6 +19,7 @@ package com.acme.test; import java.util.EventListener; +import java.util.logging.Logger; import javax.annotation.Resource; import javax.servlet.ServletContextAttributeEvent; import javax.servlet.ServletContextAttributeListener; @@ -38,69 +39,76 @@ @com.acme.initializer.Foo(1) @WebListener -public class TestListener implements HttpSessionListener, HttpSessionAttributeListener, HttpSessionActivationListener, ServletContextListener, ServletContextAttributeListener, ServletRequestListener, ServletRequestAttributeListener +public class TestListener implements HttpSessionListener, + HttpSessionAttributeListener, + HttpSessionActivationListener, + ServletContextListener, + ServletContextAttributeListener, + ServletRequestListener, + ServletRequestAttributeListener { + private static final Logger LOG = Logger.getLogger(TestListener.class.getName()); @Resource(mappedName = "maxAmount") private Double maxAmount; @Override public void attributeAdded(HttpSessionBindingEvent se) { - // System.err.println("attributedAdded "+se); + LOG.fine("attributeAdded " + se); } @Override public void attributeAdded(ServletContextAttributeEvent scab) { - // System.err.println("attributeAdded "+scab); + LOG.fine("attributeAdded " + scab); } @Override public void attributeAdded(ServletRequestAttributeEvent srae) { - // System.err.println("attributeAdded "+srae); + LOG.fine("attributeAdded " + srae); } @Override public void attributeRemoved(HttpSessionBindingEvent se) { - // System.err.println("attributeRemoved "+se); + LOG.fine("attributeRemoved " + se); } @Override public void attributeRemoved(ServletContextAttributeEvent scab) { - // System.err.println("attributeRemoved "+scab); + LOG.fine("attributeRemoved " + scab); } @Override public void attributeRemoved(ServletRequestAttributeEvent srae) { - // System.err.println("attributeRemoved "+srae); + LOG.fine("attributeRemoved " + srae); } @Override public void attributeReplaced(HttpSessionBindingEvent se) { - // System.err.println("attributeReplaced "+se); + LOG.fine("attributeReplaced " + se); } @Override public void attributeReplaced(ServletContextAttributeEvent scab) { - // System.err.println("attributeReplaced "+scab); + LOG.fine("attributeReplaced " + scab); } @Override public void attributeReplaced(ServletRequestAttributeEvent srae) { - // System.err.println("attributeReplaced "+srae); + LOG.fine("attributeReplaced " + srae); } @Override public void contextDestroyed(ServletContextEvent sce) { - // System.err.println("contextDestroyed "+sce); + LOG.fine("contextDestroyed " + sce); } @Override @@ -109,9 +117,9 @@ public void contextInitialized(ServletContextEvent sce) if (sce.getServletContext().getAttribute("com.acme.AnnotationTest.sclInjectTest") != null) throw new IllegalStateException("TestListener already initialized"); - sce.getServletContext().setAttribute("com.acme.AnnotationTest.sclInjectTest", Boolean.valueOf(maxAmount != null)); + sce.getServletContext().setAttribute("com.acme.AnnotationTest.sclInjectTest", maxAmount != null); - //Can't add a ServletContextListener from a ServletContextListener even if it is declared in web.xml + // Can't add a ServletContextListener from a ServletContextListener even if it is declared in web.xml try { sce.getServletContext().addListener(new NaughtyServletContextListener()); @@ -126,7 +134,7 @@ public void contextInitialized(ServletContextEvent sce) sce.getServletContext().setAttribute("com.acme.AnnotationTest.sclFromSclRegoTest", Boolean.FALSE); } - //Can't add an EventListener not part of the specified list for addListener() + // Can't add an EventListener not part of the specified list for addListener() try { sce.getServletContext().addListener(new InvalidListener()); @@ -141,11 +149,11 @@ public void contextInitialized(ServletContextEvent sce) sce.getServletContext().setAttribute("com.acme.AnnotationTest.invalidListenerRegoTest", Boolean.FALSE); } - //Programmatically add a listener and make sure its injected + // Programmatically add a listener and make sure its injected try { ValidListener l = sce.getServletContext().createListener(ValidListener.class); - sce.getServletContext().setAttribute("com.acme.AnnotationTest.programListenerInjectTest", Boolean.valueOf(l != null && l.maxAmount != null)); + sce.getServletContext().setAttribute("com.acme.AnnotationTest.programListenerInjectTest", l != null && l.maxAmount != null); } catch (Exception e) { @@ -153,58 +161,28 @@ public void contextInitialized(ServletContextEvent sce) } } - public void requestCompleted(ServletRequestEvent rre) - { - // TODO Auto-generated method stub - - } - @Override public void requestDestroyed(ServletRequestEvent sre) { - // System.err.println("requestDestroyed "+sre); + LOG.fine("requestDestroyed " + sre); } @Override public void requestInitialized(ServletRequestEvent sre) { - // System.err.println("requestInitialized "+sre); - } - - public void requestResumed(ServletRequestEvent rre) - { - // TODO Auto-generated method stub - - } - - public void requestSuspended(ServletRequestEvent rre) - { - // TODO Auto-generated method stub - + LOG.fine("requestInitialized " + sre); } @Override public void sessionCreated(HttpSessionEvent se) { - // System.err.println("sessionCreated "+se); + LOG.fine("sessionCreated " + se); } @Override public void sessionDestroyed(HttpSessionEvent se) { - // System.err.println("sessionDestroyed "+se); - } - - @Override - public void sessionDidActivate(HttpSessionEvent se) - { - // System.err.println("sessionDidActivate "+se); - } - - @Override - public void sessionWillPassivate(HttpSessionEvent se) - { - // System.err.println("sessionWillPassivate "+se); + LOG.fine("sessionDestroyed " + se); } public static class NaughtyServletContextListener implements ServletContextListener @@ -242,7 +220,6 @@ public ValidListener() @Override public void sessionIdChanged(HttpSessionEvent event, String oldSessionId) { - } } }