From c8c6dad752f836e779ee4b9d3870704cf9f8fc0e Mon Sep 17 00:00:00 2001 From: Joakim Erdfelt Date: Wed, 13 Mar 2024 12:02:20 -0500 Subject: [PATCH 01/28] Issue #11514 - Cleanup `jetty.webapp.addServerClasses` property behavior for ee10/ee9/ee8 --- .../ResourceAnnotationHandler.java | 4 +- .../ee10/plus/webapp/EnvConfiguration.java | 5 +- .../ee10/plus/webapp/PlusConfiguration.java | 4 +- .../ee10/servlet/ServletContextHandler.java | 7 ++- .../src/main/config/etc/jetty-ee10-webapp.xml | 2 - .../jetty/ee10/webapp/WebAppContext.java | 58 +++++++++++++++---- .../jetty/ee10/webapp/WebDescriptor.java | 2 +- .../jetty/ee10/webapp/WebAppContextTest.java | 24 ++++++++ .../src/main/config/etc/jetty-ee8-webapp.xml | 2 - .../src/main/config/etc/jetty-ee9-webapp.xml | 2 - .../jetty/ee9/webapp/WebAppContext.java | 56 ++++++++++++++---- .../jetty/ee9/webapp/WebAppContextTest.java | 23 ++++++++ 12 files changed, 151 insertions(+), 38 deletions(-) diff --git a/jetty-ee10/jetty-ee10-annotations/src/main/java/org/eclipse/jetty/ee10/annotations/ResourceAnnotationHandler.java b/jetty-ee10/jetty-ee10-annotations/src/main/java/org/eclipse/jetty/ee10/annotations/ResourceAnnotationHandler.java index ca442da47c1d..78cebbd08bac 100644 --- a/jetty-ee10/jetty-ee10-annotations/src/main/java/org/eclipse/jetty/ee10/annotations/ResourceAnnotationHandler.java +++ b/jetty-ee10/jetty-ee10-annotations/src/main/java/org/eclipse/jetty/ee10/annotations/ResourceAnnotationHandler.java @@ -158,7 +158,7 @@ public void handleField(Class clazz, Field field) //try environment scope next if (!bound) - bound = NamingEntryUtil.bindToENC(ServletContextHandler.__environment.getName(), name, mappedName); + bound = NamingEntryUtil.bindToENC(ServletContextHandler.ENVIRONMENT.getName(), name, mappedName); //try Server scope next if (!bound) @@ -313,7 +313,7 @@ public void handleMethod(Class clazz, Method method) //try the environment's scope if (!bound) - bound = NamingEntryUtil.bindToENC(ServletContextHandler.__environment.getName(), name, mappedName); + bound = NamingEntryUtil.bindToENC(ServletContextHandler.ENVIRONMENT.getName(), name, mappedName); //try the server's scope if (!bound) diff --git a/jetty-ee10/jetty-ee10-plus/src/main/java/org/eclipse/jetty/ee10/plus/webapp/EnvConfiguration.java b/jetty-ee10/jetty-ee10-plus/src/main/java/org/eclipse/jetty/ee10/plus/webapp/EnvConfiguration.java index 6e4df6f9a23c..486ad1edd20e 100644 --- a/jetty-ee10/jetty-ee10-plus/src/main/java/org/eclipse/jetty/ee10/plus/webapp/EnvConfiguration.java +++ b/jetty-ee10/jetty-ee10-plus/src/main/java/org/eclipse/jetty/ee10/plus/webapp/EnvConfiguration.java @@ -13,7 +13,6 @@ package org.eclipse.jetty.ee10.plus.webapp; -import java.util.Map; import java.util.Set; import javax.naming.Context; import javax.naming.InitialContext; @@ -208,8 +207,8 @@ public void bindEnvEntries(WebAppContext context) LOG.debug("Binding env entries from the server scope"); doBindings(envCtx, context.getServer()); - LOG.debug("Binding env entries from environment {} scope", ServletContextHandler.__environment.getName()); - doBindings(envCtx, ServletContextHandler.__environment.getName()); + LOG.debug("Binding env entries from environment {} scope", ServletContextHandler.ENVIRONMENT.getName()); + doBindings(envCtx, ServletContextHandler.ENVIRONMENT.getName()); LOG.debug("Binding env entries from the context scope"); doBindings(envCtx, context); diff --git a/jetty-ee10/jetty-ee10-plus/src/main/java/org/eclipse/jetty/ee10/plus/webapp/PlusConfiguration.java b/jetty-ee10/jetty-ee10-plus/src/main/java/org/eclipse/jetty/ee10/plus/webapp/PlusConfiguration.java index 92d6cc21b69e..d6aec5135c01 100644 --- a/jetty-ee10/jetty-ee10-plus/src/main/java/org/eclipse/jetty/ee10/plus/webapp/PlusConfiguration.java +++ b/jetty-ee10/jetty-ee10-plus/src/main/java/org/eclipse/jetty/ee10/plus/webapp/PlusConfiguration.java @@ -83,13 +83,13 @@ public void bindUserTransaction(WebAppContext context) { try { - Transaction.bindTransactionToENC(ServletContextHandler.__environment.getName()); + Transaction.bindTransactionToENC(ServletContextHandler.ENVIRONMENT.getName()); } catch (NameNotFoundException e) { try { - org.eclipse.jetty.plus.jndi.Transaction.bindTransactionToENC(ServletContextHandler.__environment.getName()); + org.eclipse.jetty.plus.jndi.Transaction.bindTransactionToENC(ServletContextHandler.ENVIRONMENT.getName()); } catch (NameNotFoundException x) { diff --git a/jetty-ee10/jetty-ee10-servlet/src/main/java/org/eclipse/jetty/ee10/servlet/ServletContextHandler.java b/jetty-ee10/jetty-ee10-servlet/src/main/java/org/eclipse/jetty/ee10/servlet/ServletContextHandler.java index f2d54f384104..638e74dd93e8 100644 --- a/jetty-ee10/jetty-ee10-servlet/src/main/java/org/eclipse/jetty/ee10/servlet/ServletContextHandler.java +++ b/jetty-ee10/jetty-ee10-servlet/src/main/java/org/eclipse/jetty/ee10/servlet/ServletContextHandler.java @@ -130,7 +130,12 @@ public class ServletContextHandler extends ContextHandler { private static final Logger LOG = LoggerFactory.getLogger(ServletContextHandler.class); - public static final Environment __environment = Environment.ensure("ee10"); + public static final Environment ENVIRONMENT = Environment.ensure("ee10"); + /** + * @deprecated Use {@link ServletContextHandler#ENVIRONMENT} instead. will be removed in Jetty 12.1.0. + */ + @Deprecated(since = "12.0.8", forRemoval = true) + public static final Environment __environment = ENVIRONMENT; public static final Class[] SERVLET_LISTENER_TYPES = { ServletContextListener.class, diff --git a/jetty-ee10/jetty-ee10-webapp/src/main/config/etc/jetty-ee10-webapp.xml b/jetty-ee10/jetty-ee10-webapp/src/main/config/etc/jetty-ee10-webapp.xml index 40d2e023fe60..772def0c92b1 100644 --- a/jetty-ee10/jetty-ee10-webapp/src/main/config/etc/jetty-ee10-webapp.xml +++ b/jetty-ee10/jetty-ee10-webapp/src/main/config/etc/jetty-ee10-webapp.xml @@ -3,7 +3,6 @@ - @@ -12,7 +11,6 @@ - diff --git a/jetty-ee10/jetty-ee10-webapp/src/main/java/org/eclipse/jetty/ee10/webapp/WebAppContext.java b/jetty-ee10/jetty-ee10-webapp/src/main/java/org/eclipse/jetty/ee10/webapp/WebAppContext.java index 7e89fec12c38..788f7d43e184 100644 --- a/jetty-ee10/jetty-ee10-webapp/src/main/java/org/eclipse/jetty/ee10/webapp/WebAppContext.java +++ b/jetty-ee10/jetty-ee10-webapp/src/main/java/org/eclipse/jetty/ee10/webapp/WebAppContext.java @@ -486,7 +486,7 @@ public void postConfigure() throws Exception protected void doStart() throws Exception { ClassLoader old = Thread.currentThread().getContextClassLoader(); - Thread.currentThread().setContextClassLoader(__environment.getClassLoader()); + Thread.currentThread().setContextClassLoader(ServletContextHandler.ENVIRONMENT.getClassLoader()); try { _metadata.setAllowDuplicateFragmentNames(isAllowDuplicateFragmentNames()); @@ -728,7 +728,7 @@ public void setServer(Server server) { if (__dftSystemClasses.equals(_systemClasses)) { - Object systemClasses = server.getAttribute(SERVER_SYS_CLASSES); + Object systemClasses = ServletContextHandler.ENVIRONMENT.getAttribute(SERVER_SYS_CLASSES); if (systemClasses instanceof String[]) systemClasses = new ClassMatcher((String[])systemClasses); if (systemClasses instanceof ClassMatcher) @@ -737,7 +737,7 @@ public void setServer(Server server) if (__dftServerClasses.equals(_serverClasses)) { - Object serverClasses = server.getAttribute(SERVER_SRV_CLASSES); + Object serverClasses = ServletContextHandler.ENVIRONMENT.getAttribute(SERVER_SRV_CLASSES); if (serverClasses instanceof String[]) serverClasses = new ClassMatcher((String[])serverClasses); if (serverClasses instanceof ClassMatcher) @@ -1383,24 +1383,58 @@ public MetaData getMetaData() return _metadata; } - public static void addServerClasses(Server server, String... pattern) + /** + * @param server ignored. + * @param patterns the patterns to add + * @deprecated use {@link #addServerClasses(String...)} instead, will be removed in Jetty 12.1.0 + */ + @Deprecated(since = "12.0.8", forRemoval = true) + public static void addServerClasses(Server server, String... patterns) + { + addServerClasses(patterns); + } + + /** + * Add a Server Class pattern to use for all ee10 WebAppContexts. + * @param patterns the patterns to use + * @see #getServerClassMatcher() + * @see #getServerClasses() + */ + public static void addServerClasses(String... patterns) { - addClasses(__dftServerClasses, SERVER_SRV_CLASSES, server, pattern); + addClasses(__dftServerClasses, SERVER_SRV_CLASSES, patterns); } - public static void addSystemClasses(Server server, String... pattern) + /** + * @param server ignored. + * @param patterns the patterns to add + * @deprecated use {@link #addSystemClasses(String...)} instead, will be removed in Jetty 12.1.0 + */ + @Deprecated(since = "12.0.8", forRemoval = true) + public static void addSystemClasses(Server server, String... patterns) + { + addSystemClasses(patterns); + } + + /** + * Add a System Class pattern to use for all ee10 WebAppContexts. + * @param patterns the patterns to use + * @see #getSystemClassMatcher() + * @see #getSystemClasses() + */ + public static void addSystemClasses(String... patterns) { - addClasses(__dftSystemClasses, SERVER_SYS_CLASSES, server, pattern); + addClasses(__dftSystemClasses, SERVER_SYS_CLASSES, patterns); } - private static void addClasses(ClassMatcher matcher, String attribute, Server server, String... pattern) + private static void addClasses(ClassMatcher matcher, String attributeKey, String... pattern) { if (pattern == null || pattern.length == 0) return; - // look for a Server attribute with the list of System classes - // to apply to every web application. If not present, use our defaults. - Object o = server.getAttribute(attribute); + // look for a ClassMatcher attribute with the list of Server / System classes + // to apply to every ee10 web application. If not present, use our defaults. + Object o = ServletContextHandler.ENVIRONMENT.getAttribute(attributeKey); if (o instanceof ClassMatcher) { ((ClassMatcher)o).add(pattern); @@ -1415,6 +1449,6 @@ private static void addClasses(ClassMatcher matcher, String attribute, Server se int l = classes.length; classes = Arrays.copyOf(classes, l + pattern.length); System.arraycopy(pattern, 0, classes, l, pattern.length); - server.setAttribute(attribute, classes); + ServletContextHandler.ENVIRONMENT.setAttribute(attributeKey, classes); } } diff --git a/jetty-ee10/jetty-ee10-webapp/src/main/java/org/eclipse/jetty/ee10/webapp/WebDescriptor.java b/jetty-ee10/jetty-ee10-webapp/src/main/java/org/eclipse/jetty/ee10/webapp/WebDescriptor.java index 49fca834aba0..3bb42c9fbbee 100644 --- a/jetty-ee10/jetty-ee10-webapp/src/main/java/org/eclipse/jetty/ee10/webapp/WebDescriptor.java +++ b/jetty-ee10/jetty-ee10-webapp/src/main/java/org/eclipse/jetty/ee10/webapp/WebDescriptor.java @@ -95,7 +95,7 @@ private static class WebDescriptorParser extends XmlParser public WebDescriptorParser(boolean validating) throws IOException { super(validating); - String catalogName = "catalog-%s.xml".formatted(ServletContextHandler.__environment.getName()); + String catalogName = "catalog-%s.xml".formatted(ServletContextHandler.ENVIRONMENT.getName()); URL url = WebDescriptor.class.getResource(catalogName); if (url == null) throw new IllegalStateException("Catalog not found: %s/%s".formatted(WebDescriptor.class.getPackageName(), catalogName)); diff --git a/jetty-ee10/jetty-ee10-webapp/src/test/java/org/eclipse/jetty/ee10/webapp/WebAppContextTest.java b/jetty-ee10/jetty-ee10-webapp/src/test/java/org/eclipse/jetty/ee10/webapp/WebAppContextTest.java index 41bcb5a668b1..50c1f47e9a0e 100644 --- a/jetty-ee10/jetty-ee10-webapp/src/test/java/org/eclipse/jetty/ee10/webapp/WebAppContextTest.java +++ b/jetty-ee10/jetty-ee10-webapp/src/test/java/org/eclipse/jetty/ee10/webapp/WebAppContextTest.java @@ -43,6 +43,7 @@ import org.eclipse.jetty.server.handler.ContextHandlerCollection; import org.eclipse.jetty.server.handler.DefaultHandler; import org.eclipse.jetty.toolchain.test.FS; +import org.eclipse.jetty.toolchain.test.MavenPaths; import org.eclipse.jetty.toolchain.test.MavenTestingUtils; import org.eclipse.jetty.toolchain.test.jupiter.WorkDir; import org.eclipse.jetty.toolchain.test.jupiter.WorkDirExtension; @@ -72,6 +73,7 @@ import static org.hamcrest.Matchers.either; import static org.hamcrest.Matchers.empty; import static org.hamcrest.Matchers.endsWith; +import static org.hamcrest.Matchers.hasItem; import static org.hamcrest.Matchers.instanceOf; import static org.hamcrest.Matchers.is; import static org.hamcrest.Matchers.notNullValue; @@ -802,4 +804,26 @@ public void testSetServerPropagation() assertThat(handler.getServer(), sameInstance(server)); } + + @Test + public void testAddServerClasses() throws Exception + { + Server server = newServer(); + + String testPattern = "org.eclipse.jetty.ee10.webapp.test."; + + WebAppContext.addServerClasses(server, testPattern); + + WebAppContext context = new WebAppContext(); + context.setContextPath("/"); + Path warPath = MavenPaths.findTestResourceFile("wars/dump.war"); + context.setBaseResource(context.getResourceFactory().newResource(warPath)); + + server.setHandler(context); + server.start(); + + List serverClasses = List.of(context.getServerClasses()); + + assertThat(serverClasses, hasItem(testPattern)); + } } diff --git a/jetty-ee8/jetty-ee8-webapp/src/main/config/etc/jetty-ee8-webapp.xml b/jetty-ee8/jetty-ee8-webapp/src/main/config/etc/jetty-ee8-webapp.xml index cd3cb99317f1..8b282630c5df 100644 --- a/jetty-ee8/jetty-ee8-webapp/src/main/config/etc/jetty-ee8-webapp.xml +++ b/jetty-ee8/jetty-ee8-webapp/src/main/config/etc/jetty-ee8-webapp.xml @@ -3,7 +3,6 @@ - @@ -12,7 +11,6 @@ - diff --git a/jetty-ee9/jetty-ee9-webapp/src/main/config/etc/jetty-ee9-webapp.xml b/jetty-ee9/jetty-ee9-webapp/src/main/config/etc/jetty-ee9-webapp.xml index f726687eabbc..ae9d7520685e 100644 --- a/jetty-ee9/jetty-ee9-webapp/src/main/config/etc/jetty-ee9-webapp.xml +++ b/jetty-ee9/jetty-ee9-webapp/src/main/config/etc/jetty-ee9-webapp.xml @@ -3,7 +3,6 @@ - @@ -12,7 +11,6 @@ - diff --git a/jetty-ee9/jetty-ee9-webapp/src/main/java/org/eclipse/jetty/ee9/webapp/WebAppContext.java b/jetty-ee9/jetty-ee9-webapp/src/main/java/org/eclipse/jetty/ee9/webapp/WebAppContext.java index c76a53dfe2f7..96eb60272d0d 100644 --- a/jetty-ee9/jetty-ee9-webapp/src/main/java/org/eclipse/jetty/ee9/webapp/WebAppContext.java +++ b/jetty-ee9/jetty-ee9-webapp/src/main/java/org/eclipse/jetty/ee9/webapp/WebAppContext.java @@ -780,7 +780,7 @@ public void setServer(Server server) { if (__dftSystemClasses.equals(_systemClasses)) { - Object systemClasses = server.getAttribute(SERVER_SYS_CLASSES); + Object systemClasses = ServletContextHandler.ENVIRONMENT.getAttribute(SERVER_SYS_CLASSES); if (systemClasses instanceof String[]) systemClasses = new ClassMatcher((String[])systemClasses); if (systemClasses instanceof ClassMatcher) @@ -789,7 +789,7 @@ public void setServer(Server server) if (__dftServerClasses.equals(_serverClasses)) { - Object serverClasses = server.getAttribute(SERVER_SRV_CLASSES); + Object serverClasses = ServletContextHandler.ENVIRONMENT.getAttribute(SERVER_SRV_CLASSES); if (serverClasses instanceof String[]) serverClasses = new ClassMatcher((String[])serverClasses); if (serverClasses instanceof ClassMatcher) @@ -1472,24 +1472,58 @@ public MetaData getMetaData() return _metadata; } - public static void addServerClasses(Attributes attributes, String... pattern) + /** + * Add a Server Class pattern to use for all ee9 WebAppContexts. + * @param patterns the patterns to use + * @see #getServerClassMatcher() + * @see #getServerClasses() + */ + public static void addServerClasses(String... patterns) + { + addClasses(__dftServerClasses, SERVER_SRV_CLASSES, patterns); + } + + /** + * @param attributes ignored. + * @param patterns the patterns to add + * @deprecated use {@link #addServerClasses(String...)} instead. will be removed in Jetty 12.1.0 + */ + @Deprecated(since = "12.0.8", forRemoval = true) + public static void addServerClasses(Attributes attributes, String... patterns) { - addClasses(__dftServerClasses, SERVER_SRV_CLASSES, attributes, pattern); + addServerClasses(patterns); } - public static void addSystemClasses(Attributes attributes, String... pattern) + /** + * Add a System Class pattern to use for all ee9 WebAppContexts. + * @param patterns the patterns to use + * @see #getSystemClassMatcher() + * @see #getSystemClasses() + */ + public static void addSystemClasses(String... patterns) + { + addClasses(__dftSystemClasses, SERVER_SYS_CLASSES, patterns); + } + + /** + * @param attributes ignored. + * @param patterns the patterns to add + * @deprecated use {@link #addSystemClasses(String...)} instead. will be removed in Jetty 12.1.0 + */ + @Deprecated(since = "12.0.8", forRemoval = true) + public static void addSystemClasses(Attributes attributes, String... patterns) { - addClasses(__dftSystemClasses, SERVER_SYS_CLASSES, attributes, pattern); + addSystemClasses(patterns); } - private static void addClasses(ClassMatcher matcher, String attribute, Attributes attributes, String... pattern) + private static void addClasses(ClassMatcher matcher, String attributeKey, String... pattern) { if (pattern == null || pattern.length == 0) return; - // look for a Server attribute with the list of System classes - // to apply to every web application. If not present, use our defaults. - Object o = attributes.getAttribute(attribute); + // look for a ClassMatcher attribute with the list of Server / System classes + // to apply to every ee9 web application. If not present, use our defaults. + Object o = ServletContextHandler.ENVIRONMENT.getAttribute(attributeKey); if (o instanceof ClassMatcher) { ((ClassMatcher)o).add(pattern); @@ -1504,6 +1538,6 @@ private static void addClasses(ClassMatcher matcher, String attribute, Attribute int l = classes.length; classes = Arrays.copyOf(classes, l + pattern.length); System.arraycopy(pattern, 0, classes, l, pattern.length); - attributes.setAttribute(attribute, classes); + ServletContextHandler.ENVIRONMENT.setAttribute(attributeKey, classes); } } diff --git a/jetty-ee9/jetty-ee9-webapp/src/test/java/org/eclipse/jetty/ee9/webapp/WebAppContextTest.java b/jetty-ee9/jetty-ee9-webapp/src/test/java/org/eclipse/jetty/ee9/webapp/WebAppContextTest.java index 99f9c2b81485..f381e08cf819 100644 --- a/jetty-ee9/jetty-ee9-webapp/src/test/java/org/eclipse/jetty/ee9/webapp/WebAppContextTest.java +++ b/jetty-ee9/jetty-ee9-webapp/src/test/java/org/eclipse/jetty/ee9/webapp/WebAppContextTest.java @@ -74,6 +74,7 @@ import static org.hamcrest.Matchers.containsString; import static org.hamcrest.Matchers.empty; import static org.hamcrest.Matchers.endsWith; +import static org.hamcrest.Matchers.hasItem; import static org.hamcrest.Matchers.instanceOf; import static org.hamcrest.Matchers.is; import static org.hamcrest.Matchers.notNullValue; @@ -804,4 +805,26 @@ public void testExtraClasspathDir(String extraClassPathReference) throws Excepti extLibs = extLibs.toAbsolutePath(); assertThat("URL[0]", urls[0].toURI(), is(extLibs.toUri())); } + + @Test + public void testAddServerClasses() throws Exception + { + Server server = newServer(); + + String testPattern = "org.eclipse.jetty.ee9.webapp.test."; + + WebAppContext.addServerClasses(testPattern); + + WebAppContext context = new WebAppContext(); + context.setContextPath("/"); + Path warPath = MavenPaths.findTestResourceFile("wars/dump.war"); + context.setBaseResource(context.getResourceFactory().newResource(warPath)); + + server.setHandler(context); + server.start(); + + List serverClasses = List.of(context.getServerClasses()); + + assertThat(serverClasses, hasItem(testPattern)); + } } From 503225e7a84a681976f62eed4487653d946d9dd2 Mon Sep 17 00:00:00 2001 From: Joakim Erdfelt Date: Wed, 13 Mar 2024 12:04:53 -0500 Subject: [PATCH 02/28] Fix test --- .../java/org/eclipse/jetty/ee10/webapp/WebAppContextTest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/jetty-ee10/jetty-ee10-webapp/src/test/java/org/eclipse/jetty/ee10/webapp/WebAppContextTest.java b/jetty-ee10/jetty-ee10-webapp/src/test/java/org/eclipse/jetty/ee10/webapp/WebAppContextTest.java index 50c1f47e9a0e..6d54bbadc394 100644 --- a/jetty-ee10/jetty-ee10-webapp/src/test/java/org/eclipse/jetty/ee10/webapp/WebAppContextTest.java +++ b/jetty-ee10/jetty-ee10-webapp/src/test/java/org/eclipse/jetty/ee10/webapp/WebAppContextTest.java @@ -812,7 +812,7 @@ public void testAddServerClasses() throws Exception String testPattern = "org.eclipse.jetty.ee10.webapp.test."; - WebAppContext.addServerClasses(server, testPattern); + WebAppContext.addServerClasses(testPattern); WebAppContext context = new WebAppContext(); context.setContextPath("/"); From 87d0c451c57980c9b4da67a9b4f6d80e5ba1e487 Mon Sep 17 00:00:00 2001 From: Joakim Erdfelt Date: Wed, 13 Mar 2024 13:45:15 -0500 Subject: [PATCH 03/28] Merging patterns (default -> env -> config) --- .../jetty/ee10/webapp/WebAppContext.java | 20 ++++++++----- .../jetty/ee10/webapp/WebAppContextTest.java | 28 ++++++++++++++++- .../jetty/ee9/webapp/WebAppContext.java | 21 ++++++++----- .../jetty/ee9/webapp/WebAppContextTest.java | 30 ++++++++++++++++++- 4 files changed, 81 insertions(+), 18 deletions(-) diff --git a/jetty-ee10/jetty-ee10-webapp/src/main/java/org/eclipse/jetty/ee10/webapp/WebAppContext.java b/jetty-ee10/jetty-ee10-webapp/src/main/java/org/eclipse/jetty/ee10/webapp/WebAppContext.java index 788f7d43e184..1061468b0c2d 100644 --- a/jetty-ee10/jetty-ee10-webapp/src/main/java/org/eclipse/jetty/ee10/webapp/WebAppContext.java +++ b/jetty-ee10/jetty-ee10-webapp/src/main/java/org/eclipse/jetty/ee10/webapp/WebAppContext.java @@ -729,19 +729,19 @@ public void setServer(Server server) if (__dftSystemClasses.equals(_systemClasses)) { Object systemClasses = ServletContextHandler.ENVIRONMENT.getAttribute(SERVER_SYS_CLASSES); - if (systemClasses instanceof String[]) - systemClasses = new ClassMatcher((String[])systemClasses); - if (systemClasses instanceof ClassMatcher) - _systemClasses.add(((ClassMatcher)systemClasses).getPatterns()); + if (systemClasses instanceof String[] patterns) + _systemClasses.add(patterns); + if (systemClasses instanceof ClassMatcher classMatcher) + _systemClasses.add(classMatcher.getPatterns()); } if (__dftServerClasses.equals(_serverClasses)) { Object serverClasses = ServletContextHandler.ENVIRONMENT.getAttribute(SERVER_SRV_CLASSES); - if (serverClasses instanceof String[]) - serverClasses = new ClassMatcher((String[])serverClasses); - if (serverClasses instanceof ClassMatcher) - _serverClasses.add(((ClassMatcher)serverClasses).getPatterns()); + if (serverClasses instanceof String[] patterns) + _serverClasses.add(patterns); + if (serverClasses instanceof ClassMatcher classMatcher) + _serverClasses.add(classMatcher.getPatterns()); } } } @@ -1402,6 +1402,8 @@ public static void addServerClasses(Server server, String... patterns) */ public static void addServerClasses(String... patterns) { + if (LOG.isDebugEnabled()) + LOG.debug("Adding {} ServerClasses: {}", ServletContextHandler.ENVIRONMENT, String.join(", ", patterns)); addClasses(__dftServerClasses, SERVER_SRV_CLASSES, patterns); } @@ -1424,6 +1426,8 @@ public static void addSystemClasses(Server server, String... patterns) */ public static void addSystemClasses(String... patterns) { + if (LOG.isDebugEnabled()) + LOG.debug("Adding {} SystemClasses: {}", ServletContextHandler.ENVIRONMENT, String.join(", ", patterns)); addClasses(__dftSystemClasses, SERVER_SYS_CLASSES, patterns); } diff --git a/jetty-ee10/jetty-ee10-webapp/src/test/java/org/eclipse/jetty/ee10/webapp/WebAppContextTest.java b/jetty-ee10/jetty-ee10-webapp/src/test/java/org/eclipse/jetty/ee10/webapp/WebAppContextTest.java index 6d54bbadc394..ac8dd91e29e7 100644 --- a/jetty-ee10/jetty-ee10-webapp/src/test/java/org/eclipse/jetty/ee10/webapp/WebAppContextTest.java +++ b/jetty-ee10/jetty-ee10-webapp/src/test/java/org/eclipse/jetty/ee10/webapp/WebAppContextTest.java @@ -823,7 +823,33 @@ public void testAddServerClasses() throws Exception server.start(); List serverClasses = List.of(context.getServerClasses()); + assertThat("Should have environment specific test pattern", serverClasses, hasItem(testPattern)); + assertThat("Should have pattern from JaasConfiguration", serverClasses, hasItem("-org.eclipse.jetty.security.jaas.")); + for (String defaultServerClass: WebAppContext.__dftServerClasses) + assertThat("Should have default patterns", serverClasses, hasItem(defaultServerClass)); + } + + @Test + public void testAddSystemClasses() throws Exception + { + Server server = newServer(); + + String testPattern = "org.eclipse.jetty.ee10.webapp.test."; + + WebAppContext.addSystemClasses(testPattern); + + WebAppContext context = new WebAppContext(); + context.setContextPath("/"); + Path warPath = MavenPaths.findTestResourceFile("wars/dump.war"); + context.setBaseResource(context.getResourceFactory().newResource(warPath)); + + server.setHandler(context); + server.start(); - assertThat(serverClasses, hasItem(testPattern)); + List systemClasses = List.of(context.getSystemClasses()); + assertThat("Should have environment specific test pattern", systemClasses, hasItem(testPattern)); + assertThat("Should have pattern from JaasConfiguration", systemClasses, hasItem("org.eclipse.jetty.security.jaas.")); + for (String defaultSystemClass: WebAppContext.__dftSystemClasses) + assertThat("Should have default patterns", systemClasses, hasItem(defaultSystemClass)); } } diff --git a/jetty-ee9/jetty-ee9-webapp/src/main/java/org/eclipse/jetty/ee9/webapp/WebAppContext.java b/jetty-ee9/jetty-ee9-webapp/src/main/java/org/eclipse/jetty/ee9/webapp/WebAppContext.java index 96eb60272d0d..77ac0b64dd67 100644 --- a/jetty-ee9/jetty-ee9-webapp/src/main/java/org/eclipse/jetty/ee9/webapp/WebAppContext.java +++ b/jetty-ee9/jetty-ee9-webapp/src/main/java/org/eclipse/jetty/ee9/webapp/WebAppContext.java @@ -781,19 +781,19 @@ public void setServer(Server server) if (__dftSystemClasses.equals(_systemClasses)) { Object systemClasses = ServletContextHandler.ENVIRONMENT.getAttribute(SERVER_SYS_CLASSES); - if (systemClasses instanceof String[]) - systemClasses = new ClassMatcher((String[])systemClasses); - if (systemClasses instanceof ClassMatcher) - _systemClasses.add(((ClassMatcher)systemClasses).getPatterns()); + if (systemClasses instanceof String[] patterns) + _systemClasses.add(patterns); + if (systemClasses instanceof ClassMatcher classMatcher) + _systemClasses.add(classMatcher.getPatterns()); } if (__dftServerClasses.equals(_serverClasses)) { Object serverClasses = ServletContextHandler.ENVIRONMENT.getAttribute(SERVER_SRV_CLASSES); - if (serverClasses instanceof String[]) - serverClasses = new ClassMatcher((String[])serverClasses); - if (serverClasses instanceof ClassMatcher) - _serverClasses.add(((ClassMatcher)serverClasses).getPatterns()); + if (serverClasses instanceof String[] patterns) + _serverClasses.add(patterns); + if (serverClasses instanceof ClassMatcher classMatcher) + _serverClasses.add(classMatcher.getPatterns()); } } } @@ -1480,6 +1480,8 @@ public MetaData getMetaData() */ public static void addServerClasses(String... patterns) { + if (LOG.isDebugEnabled()) + LOG.debug("Adding {} ServerClasses: {}", ServletContextHandler.ENVIRONMENT, String.join(", ", patterns)); addClasses(__dftServerClasses, SERVER_SRV_CLASSES, patterns); } @@ -1502,6 +1504,9 @@ public static void addServerClasses(Attributes attributes, String... patterns) */ public static void addSystemClasses(String... patterns) { + if (LOG.isDebugEnabled()) + LOG.debug("Adding {} SystemClasses: {}", ServletContextHandler.ENVIRONMENT, String.join(", ", patterns)); + addClasses(__dftSystemClasses, SERVER_SYS_CLASSES, patterns); } diff --git a/jetty-ee9/jetty-ee9-webapp/src/test/java/org/eclipse/jetty/ee9/webapp/WebAppContextTest.java b/jetty-ee9/jetty-ee9-webapp/src/test/java/org/eclipse/jetty/ee9/webapp/WebAppContextTest.java index f381e08cf819..6fb1573785ba 100644 --- a/jetty-ee9/jetty-ee9-webapp/src/test/java/org/eclipse/jetty/ee9/webapp/WebAppContextTest.java +++ b/jetty-ee9/jetty-ee9-webapp/src/test/java/org/eclipse/jetty/ee9/webapp/WebAppContextTest.java @@ -824,7 +824,35 @@ public void testAddServerClasses() throws Exception server.start(); List serverClasses = List.of(context.getServerClasses()); + assertThat("Should have environment specific test pattern", serverClasses, hasItem(testPattern)); + assertThat("Should have pattern from JaasConfiguration", serverClasses, hasItem("-org.eclipse.jetty.security.jaas.")); + for (String defaultServerClass: WebAppContext.__dftServerClasses) + assertThat("Should have default patterns", serverClasses, hasItem(defaultServerClass)); + } + + @Test + public void testAddSystemClasses() throws Exception + { + Server server = newServer(); + + String testPattern = "org.eclipse.jetty.ee9.webapp.test."; + + WebAppContext.addSystemClasses(testPattern); + + WebAppContext context = new WebAppContext(); + context.setContextPath("/"); + Path warPath = MavenPaths.findTestResourceFile("wars/dump.war"); + context.setBaseResource(context.getResourceFactory().newResource(warPath)); - assertThat(serverClasses, hasItem(testPattern)); + server.setHandler(context); + server.start(); + + List systemClasses = List.of(context.getSystemClasses()); + assertThat("Should have environment specific test pattern", systemClasses, hasItem(testPattern)); + assertThat("Should have pattern from JaasConfiguration", systemClasses, hasItem("org.eclipse.jetty.security.jaas.")); + for (String defaultSystemClass : WebAppContext.__dftSystemClasses) + { + assertThat("Should have default patterns", systemClasses, hasItem(defaultSystemClass)); + } } } From 2775c3233dff01e93a06a7f9f14d028c06193655 Mon Sep 17 00:00:00 2001 From: gregw Date: Sun, 24 Mar 2024 18:07:04 +0100 Subject: [PATCH 04/28] Moved ClassMatcher to util --- .../org/eclipse/jetty/util}/ClassMatcher.java | 8 +- .../eclipse/jetty/util}/ClassMatcherTest.java | 10 +- .../src/main/jetty/jetty-context.xml | 2 +- .../ee10/webapp/AbstractConfiguration.java | 2 + .../jetty/ee10/webapp/Configuration.java | 1 + .../jetty/ee10/webapp/WebAppContext.java | 1 + .../ee10/webapp/WebAppClassLoaderTest.java | 3 +- .../ee9/webapp/AbstractConfiguration.java | 2 + .../jetty/ee9/webapp/ClassMatcher.java | 798 ------------------ .../jetty/ee9/webapp/Configuration.java | 1 + .../jetty/ee9/webapp/WebAppContext.java | 1 + .../jetty/ee9/webapp/ClassMatcherTest.java | 307 ------- .../ee9/webapp/WebAppClassLoaderTest.java | 3 +- 13 files changed, 16 insertions(+), 1123 deletions(-) rename {jetty-ee10/jetty-ee10-webapp/src/main/java/org/eclipse/jetty/ee10/webapp => jetty-core/jetty-util/src/main/java/org/eclipse/jetty/util}/ClassMatcher.java (98%) rename {jetty-ee10/jetty-ee10-webapp/src/test/java/org/eclipse/jetty/ee10/webapp => jetty-core/jetty-util/src/test/java/org/eclipse/jetty/util}/ClassMatcherTest.java (97%) delete mode 100644 jetty-ee9/jetty-ee9-webapp/src/main/java/org/eclipse/jetty/ee9/webapp/ClassMatcher.java delete mode 100644 jetty-ee9/jetty-ee9-webapp/src/test/java/org/eclipse/jetty/ee9/webapp/ClassMatcherTest.java diff --git a/jetty-ee10/jetty-ee10-webapp/src/main/java/org/eclipse/jetty/ee10/webapp/ClassMatcher.java b/jetty-core/jetty-util/src/main/java/org/eclipse/jetty/util/ClassMatcher.java similarity index 98% rename from jetty-ee10/jetty-ee10-webapp/src/main/java/org/eclipse/jetty/ee10/webapp/ClassMatcher.java rename to jetty-core/jetty-util/src/main/java/org/eclipse/jetty/util/ClassMatcher.java index a79a8783fb9a..e2919cd33c64 100644 --- a/jetty-ee10/jetty-ee10-webapp/src/main/java/org/eclipse/jetty/ee10/webapp/ClassMatcher.java +++ b/jetty-core/jetty-util/src/main/java/org/eclipse/jetty/util/ClassMatcher.java @@ -11,7 +11,7 @@ // ======================================================================== // -package org.eclipse.jetty.ee10.webapp; +package org.eclipse.jetty.util; import java.io.IOException; import java.net.URI; @@ -32,12 +32,6 @@ import java.util.function.Predicate; import java.util.function.Supplier; -import org.eclipse.jetty.util.IncludeExcludeSet; -import org.eclipse.jetty.util.Index; -import org.eclipse.jetty.util.StringUtil; -import org.eclipse.jetty.util.TypeUtil; -import org.eclipse.jetty.util.URIUtil; - /** * A matcher for classes based on package and/or location and/or module/ *

diff --git a/jetty-ee10/jetty-ee10-webapp/src/test/java/org/eclipse/jetty/ee10/webapp/ClassMatcherTest.java b/jetty-core/jetty-util/src/test/java/org/eclipse/jetty/util/ClassMatcherTest.java similarity index 97% rename from jetty-ee10/jetty-ee10-webapp/src/test/java/org/eclipse/jetty/ee10/webapp/ClassMatcherTest.java rename to jetty-core/jetty-util/src/test/java/org/eclipse/jetty/util/ClassMatcherTest.java index 069b4df78ab8..e29c994f0112 100644 --- a/jetty-ee10/jetty-ee10-webapp/src/test/java/org/eclipse/jetty/ee10/webapp/ClassMatcherTest.java +++ b/jetty-core/jetty-util/src/test/java/org/eclipse/jetty/util/ClassMatcherTest.java @@ -11,17 +11,15 @@ // ======================================================================== // -package org.eclipse.jetty.ee10.webapp; +package org.eclipse.jetty.util; import java.net.URI; import java.util.Arrays; import java.util.function.Supplier; -import org.eclipse.jetty.ee10.webapp.ClassMatcher.ByLocationOrModule; -import org.eclipse.jetty.ee10.webapp.ClassMatcher.ByPackageOrName; -import org.eclipse.jetty.ee10.webapp.ClassMatcher.Entry; -import org.eclipse.jetty.util.IncludeExcludeSet; -import org.eclipse.jetty.util.TypeUtil; +import org.eclipse.jetty.util.ClassMatcher.ByLocationOrModule; +import org.eclipse.jetty.util.ClassMatcher.ByPackageOrName; +import org.eclipse.jetty.util.ClassMatcher.Entry; import org.hamcrest.Matchers; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; diff --git a/jetty-ee10/jetty-ee10-maven-plugin/src/it/jetty-cdi-start-forked/src/main/jetty/jetty-context.xml b/jetty-ee10/jetty-ee10-maven-plugin/src/it/jetty-cdi-start-forked/src/main/jetty/jetty-context.xml index effcf47f4cf7..9214a93f9c36 100644 --- a/jetty-ee10/jetty-ee10-maven-plugin/src/it/jetty-cdi-start-forked/src/main/jetty/jetty-context.xml +++ b/jetty-ee10/jetty-ee10-maven-plugin/src/it/jetty-cdi-start-forked/src/main/jetty/jetty-context.xml @@ -6,7 +6,7 @@ - + -org.eclipse.jetty.util.Decorator diff --git a/jetty-ee10/jetty-ee10-webapp/src/main/java/org/eclipse/jetty/ee10/webapp/AbstractConfiguration.java b/jetty-ee10/jetty-ee10-webapp/src/main/java/org/eclipse/jetty/ee10/webapp/AbstractConfiguration.java index 2db4056c8bd9..3bef5aa38434 100644 --- a/jetty-ee10/jetty-ee10-webapp/src/main/java/org/eclipse/jetty/ee10/webapp/AbstractConfiguration.java +++ b/jetty-ee10/jetty-ee10-webapp/src/main/java/org/eclipse/jetty/ee10/webapp/AbstractConfiguration.java @@ -19,6 +19,8 @@ import java.util.Collections; import java.util.List; +import org.eclipse.jetty.util.ClassMatcher; + public class AbstractConfiguration implements Configuration { private final boolean _enabledByDefault; diff --git a/jetty-ee10/jetty-ee10-webapp/src/main/java/org/eclipse/jetty/ee10/webapp/Configuration.java b/jetty-ee10/jetty-ee10-webapp/src/main/java/org/eclipse/jetty/ee10/webapp/Configuration.java index ca8e4934ecdb..1e2c1921f9ea 100644 --- a/jetty-ee10/jetty-ee10-webapp/src/main/java/org/eclipse/jetty/ee10/webapp/Configuration.java +++ b/jetty-ee10/jetty-ee10-webapp/src/main/java/org/eclipse/jetty/ee10/webapp/Configuration.java @@ -17,6 +17,7 @@ import java.util.Collections; import java.util.ServiceLoader; +import org.eclipse.jetty.util.ClassMatcher; import org.eclipse.jetty.util.TopologicalSort; /** diff --git a/jetty-ee10/jetty-ee10-webapp/src/main/java/org/eclipse/jetty/ee10/webapp/WebAppContext.java b/jetty-ee10/jetty-ee10-webapp/src/main/java/org/eclipse/jetty/ee10/webapp/WebAppContext.java index 7c9c571304c6..fd3fcdafb51e 100644 --- a/jetty-ee10/jetty-ee10-webapp/src/main/java/org/eclipse/jetty/ee10/webapp/WebAppContext.java +++ b/jetty-ee10/jetty-ee10-webapp/src/main/java/org/eclipse/jetty/ee10/webapp/WebAppContext.java @@ -50,6 +50,7 @@ import org.eclipse.jetty.server.Connector; import org.eclipse.jetty.server.Deployable; import org.eclipse.jetty.server.Server; +import org.eclipse.jetty.util.ClassMatcher; import org.eclipse.jetty.util.ExceptionUtil; import org.eclipse.jetty.util.IO; import org.eclipse.jetty.util.StringUtil; diff --git a/jetty-ee10/jetty-ee10-webapp/src/test/java/org/eclipse/jetty/ee10/webapp/WebAppClassLoaderTest.java b/jetty-ee10/jetty-ee10-webapp/src/test/java/org/eclipse/jetty/ee10/webapp/WebAppClassLoaderTest.java index 59b78202a3b9..63d19eb204e9 100644 --- a/jetty-ee10/jetty-ee10-webapp/src/test/java/org/eclipse/jetty/ee10/webapp/WebAppClassLoaderTest.java +++ b/jetty-ee10/jetty-ee10-webapp/src/test/java/org/eclipse/jetty/ee10/webapp/WebAppClassLoaderTest.java @@ -26,9 +26,9 @@ import org.eclipse.jetty.server.Server; import org.eclipse.jetty.toolchain.test.MavenTestingUtils; +import org.eclipse.jetty.util.ClassMatcher; import org.eclipse.jetty.util.IO; import org.eclipse.jetty.util.component.LifeCycle; -import org.eclipse.jetty.util.resource.FileSystemPool; import org.eclipse.jetty.util.resource.Resource; import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.BeforeEach; @@ -37,7 +37,6 @@ import static org.eclipse.jetty.toolchain.test.ExtraMatchers.ordered; import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.contains; -import static org.hamcrest.Matchers.empty; import static org.hamcrest.Matchers.is; import static org.hamcrest.Matchers.notNullValue; import static org.hamcrest.Matchers.nullValue; diff --git a/jetty-ee9/jetty-ee9-webapp/src/main/java/org/eclipse/jetty/ee9/webapp/AbstractConfiguration.java b/jetty-ee9/jetty-ee9-webapp/src/main/java/org/eclipse/jetty/ee9/webapp/AbstractConfiguration.java index 2d5db6c60989..aa661e3d50f5 100644 --- a/jetty-ee9/jetty-ee9-webapp/src/main/java/org/eclipse/jetty/ee9/webapp/AbstractConfiguration.java +++ b/jetty-ee9/jetty-ee9-webapp/src/main/java/org/eclipse/jetty/ee9/webapp/AbstractConfiguration.java @@ -19,6 +19,8 @@ import java.util.List; import java.util.stream.Collectors; +import org.eclipse.jetty.util.ClassMatcher; + public class AbstractConfiguration implements Configuration { private final boolean _enabledByDefault; diff --git a/jetty-ee9/jetty-ee9-webapp/src/main/java/org/eclipse/jetty/ee9/webapp/ClassMatcher.java b/jetty-ee9/jetty-ee9-webapp/src/main/java/org/eclipse/jetty/ee9/webapp/ClassMatcher.java deleted file mode 100644 index 84d05c2a9cf9..000000000000 --- a/jetty-ee9/jetty-ee9-webapp/src/main/java/org/eclipse/jetty/ee9/webapp/ClassMatcher.java +++ /dev/null @@ -1,798 +0,0 @@ -// -// ======================================================================== -// 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 org.eclipse.jetty.ee9.webapp; - -import java.io.IOException; -import java.net.URI; -import java.net.URISyntaxException; -import java.net.URL; -import java.nio.file.Files; -import java.nio.file.Path; -import java.nio.file.Paths; -import java.util.AbstractSet; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.HashMap; -import java.util.HashSet; -import java.util.Iterator; -import java.util.List; -import java.util.Map; -import java.util.Set; -import java.util.function.Predicate; -import java.util.function.Supplier; - -import org.eclipse.jetty.util.IncludeExcludeSet; -import org.eclipse.jetty.util.Index; -import org.eclipse.jetty.util.StringUtil; -import org.eclipse.jetty.util.TypeUtil; -import org.eclipse.jetty.util.URIUtil; - -/** - * A matcher for classes based on package and/or location and/or module/ - *

- * Performs pattern matching of a class against a set of pattern entries. - * A class pattern is a string of one of the forms:

    - *
  • 'org.package.SomeClass' will match a specific class - *
  • 'org.package.' will match a specific package hierarchy - *
  • 'org.package.SomeClass$NestedClass ' will match a nested class exactly otherwise. - * Nested classes are matched by their containing class. (eg. org.example.MyClass - * matches org.example.MyClass$AnyNestedClass) - *
  • 'file:///some/location/' - A file system directory from which - * the class was loaded - *
  • 'file:///some/location.jar' - The URI of a jar file from which - * the class was loaded - *
  • 'jrt:/modulename' - A Java9 module name
  • - *
  • Any of the above patterns preceded by '-' will exclude rather than include the match. - *
- * When class is initialized from a classpath pattern string, entries - * in this string should be separated by ':' (semicolon) or ',' (comma). - */ - -public class ClassMatcher extends AbstractSet -{ - public static class Entry - { - private final String _pattern; - private final String _name; - private final boolean _inclusive; - - protected Entry(String name, boolean inclusive) - { - _name = name; - _inclusive = inclusive; - _pattern = inclusive ? _name : ("-" + _name); - } - - public String getPattern() - { - return _pattern; - } - - public String getName() - { - return _name; - } - - @Override - public String toString() - { - return _pattern; - } - - @Override - public int hashCode() - { - return _pattern.hashCode(); - } - - @Override - public boolean equals(Object o) - { - return (o instanceof Entry) && _pattern.equals(((Entry)o)._pattern); - } - - public boolean isInclusive() - { - return _inclusive; - } - } - - private static class PackageEntry extends Entry - { - protected PackageEntry(String name, boolean inclusive) - { - super(name, inclusive); - } - } - - private static class ClassEntry extends Entry - { - protected ClassEntry(String name, boolean inclusive) - { - super(name, inclusive); - } - } - - private static class LocationEntry extends Entry - { - private final Path _path; - - protected LocationEntry(String name, boolean inclusive) - { - super(name, inclusive); - URI uri = URI.create(name); - if (!uri.isAbsolute() && !"file".equalsIgnoreCase(uri.getScheme())) - throw new IllegalArgumentException("Not a valid file URI: " + name); - - _path = Paths.get(uri); - } - - public Path getPath() - { - return _path; - } - } - - private static class ModuleEntry extends Entry - { - private final String _module; - - protected ModuleEntry(String name, boolean inclusive) - { - super(name, inclusive); - if (!getName().startsWith("jrt:")) - throw new IllegalArgumentException(name); - _module = getName().split("/")[1]; - } - - public String getModule() - { - return _module; - } - } - - public static class ByPackage extends AbstractSet implements Predicate - { - private final Index.Mutable _entries = new Index.Builder() - .caseSensitive(true) - .mutable() - .build(); - - @Override - public boolean test(String name) - { - return _entries.getBest(name) != null; - } - - @Override - public Iterator iterator() - { - return _entries.keySet().stream().map(_entries::get).iterator(); - } - - @Override - public int size() - { - return _entries.size(); - } - - @Override - public boolean isEmpty() - { - return _entries.isEmpty(); - } - - @Override - public boolean add(Entry entry) - { - String name = entry.getName(); - if (entry instanceof ClassEntry) - name += "$"; - else if (!(entry instanceof PackageEntry)) - throw new IllegalArgumentException(entry.toString()); - else if (".".equals(name)) - name = ""; - - if (_entries.get(name) != null) - return false; - - return _entries.put(name, entry); - } - - @Override - public boolean remove(Object entry) - { - if (!(entry instanceof Entry)) - return false; - - return _entries.remove(((Entry)entry).getName()) != null; - } - - @Override - public void clear() - { - _entries.clear(); - } - } - - @SuppressWarnings("serial") - public static class ByClass extends HashSet implements Predicate - { - private final Map _entries = new HashMap<>(); - - @Override - public boolean test(String name) - { - return _entries.containsKey(name); - } - - @Override - public Iterator iterator() - { - return _entries.values().iterator(); - } - - @Override - public int size() - { - return _entries.size(); - } - - @Override - public boolean add(Entry entry) - { - if (!(entry instanceof ClassEntry)) - throw new IllegalArgumentException(entry.toString()); - return _entries.put(entry.getName(), entry) == null; - } - - @Override - public boolean remove(Object entry) - { - if (!(entry instanceof Entry)) - return false; - - return _entries.remove(((Entry)entry).getName()) != null; - } - } - - public static class ByPackageOrName extends AbstractSet implements Predicate - { - private final ByClass _byClass = new ByClass(); - private final ByPackage _byPackage = new ByPackage(); - - @Override - public boolean test(String name) - { - return _byPackage.test(name) || _byClass.test(name); - } - - @Override - public Iterator iterator() - { - // by package contains all entries (classes are also $ packages). - return _byPackage.iterator(); - } - - @Override - public int size() - { - return _byPackage.size(); - } - - @Override - public boolean add(Entry entry) - { - if (entry instanceof PackageEntry) - return _byPackage.add(entry); - - if (entry instanceof ClassEntry) - { - // Add class name to packages also as classes act - // as packages for nested classes. - boolean added = _byPackage.add(entry); - added = _byClass.add(entry) || added; - return added; - } - - throw new IllegalArgumentException(); - } - - @Override - public boolean remove(Object o) - { - if (!(o instanceof Entry)) - return false; - - boolean removedPackage = _byPackage.remove(o); - boolean removedClass = _byClass.remove(o); - - return removedPackage || removedClass; - } - - @Override - public void clear() - { - _byPackage.clear(); - _byClass.clear(); - } - } - - @SuppressWarnings("serial") - public static class ByLocation extends HashSet implements Predicate - { - @Override - public boolean test(URI uri) - { - if ((uri == null) || (!uri.isAbsolute())) - return false; - if (!uri.getScheme().equals("file")) - return false; - Path path = Paths.get(uri); - - for (Entry entry : this) - { - if (!(entry instanceof LocationEntry)) - throw new IllegalStateException(); - - Path entryPath = ((LocationEntry)entry).getPath(); - - if (Files.isDirectory(entryPath)) - { - if (path.startsWith(entryPath)) - { - return true; - } - } - else - { - try - { - if (Files.isSameFile(path, entryPath)) - { - return true; - } - } - catch (IOException ignore) - { - // this means there is a FileSystem issue preventing comparison. - // Use old technique - if (path.equals(entryPath)) - { - return true; - } - } - } - } - return false; - } - } - - @SuppressWarnings("serial") - public static class ByModule extends HashSet implements Predicate - { - private final Index.Mutable _entries = new Index.Builder() - .caseSensitive(true) - .mutable() - .build(); - - @Override - public boolean test(URI uri) - { - if ((uri == null) || (!uri.isAbsolute())) - return false; - if (!uri.getScheme().equalsIgnoreCase("jrt")) - return false; - String module = uri.getPath(); - int end = module.indexOf('/', 1); - if (end < 1) - end = module.length(); - return _entries.get(module, 1, end - 1) != null; - } - - @Override - public Iterator iterator() - { - return _entries.keySet().stream().map(_entries::get).iterator(); - } - - @Override - public int size() - { - return _entries.size(); - } - - @Override - public boolean add(Entry entry) - { - if (!(entry instanceof ModuleEntry)) - throw new IllegalArgumentException(entry.toString()); - String module = ((ModuleEntry)entry).getModule(); - - if (_entries.get(module) != null) - return false; - _entries.put(module, entry); - return true; - } - - @Override - public boolean remove(Object entry) - { - if (!(entry instanceof Entry)) - return false; - - return _entries.remove(((Entry)entry).getName()) != null; - } - } - - public static class ByLocationOrModule extends AbstractSet implements Predicate - { - private final ByLocation _byLocation = new ByLocation(); - private final ByModule _byModule = new ByModule(); - - @Override - public boolean test(URI name) - { - if ((name == null) || (!name.isAbsolute())) - return false; - return _byLocation.test(name) || _byModule.test(name); - } - - @Override - public Iterator iterator() - { - Set entries = new HashSet<>(); - entries.addAll(_byLocation); - entries.addAll(_byModule); - return entries.iterator(); - } - - @Override - public int size() - { - return _byLocation.size() + _byModule.size(); - } - - @Override - public boolean add(Entry entry) - { - if (entry instanceof LocationEntry) - return _byLocation.add(entry); - if (entry instanceof ModuleEntry) - return _byModule.add(entry); - - throw new IllegalArgumentException(entry.toString()); - } - - @Override - public boolean remove(Object o) - { - if (o instanceof LocationEntry) - return _byLocation.remove(o); - if (o instanceof ModuleEntry) - return _byModule.remove(o); - return false; - } - - @Override - public void clear() - { - _byLocation.clear(); - _byModule.clear(); - } - } - - Map _entries = new HashMap<>(); - IncludeExcludeSet _patterns = new IncludeExcludeSet<>(ByPackageOrName.class); - IncludeExcludeSet _locations = new IncludeExcludeSet<>(ByLocationOrModule.class); - - public ClassMatcher() - { - } - - @SuppressWarnings("CopyConstructorMissesField") - public ClassMatcher(ClassMatcher patterns) - { - if (patterns != null) - setAll(patterns.getPatterns()); - } - - public ClassMatcher(String... patterns) - { - if (patterns != null && patterns.length > 0) - setAll(patterns); - } - - public ClassMatcher(String pattern) - { - add(pattern); - } - - public boolean include(String name) - { - if (name == null) - return false; - return add(newEntry(name, true)); - } - - public boolean include(String... name) - { - boolean added = false; - for (String n : name) - { - if (n != null) - added = add(newEntry(n, true)) || added; - } - return added; - } - - public boolean exclude(String name) - { - if (name == null) - return false; - return add(newEntry(name, false)); - } - - public boolean exclude(String... name) - { - boolean added = false; - for (String n : name) - { - if (n != null) - added = add(newEntry(n, false)) || added; - } - return added; - } - - @Override - public boolean add(String pattern) - { - if (pattern == null) - return false; - return add(newEntry(pattern)); - } - - public boolean add(String... pattern) - { - boolean added = false; - for (String p : pattern) - { - if (p != null) - added = add(newEntry(p)) || added; - } - return added; - } - - protected boolean add(Entry entry) - { - if (_entries.containsKey(entry.getPattern())) - return false; - _entries.put(entry.getPattern(), entry); - - if (entry instanceof LocationEntry || entry instanceof ModuleEntry) - { - if (entry.isInclusive()) - _locations.include(entry); - else - _locations.exclude(entry); - } - else - { - if (entry.isInclusive()) - _patterns.include(entry); - else - _patterns.exclude(entry); - } - return true; - } - - protected Entry newEntry(String pattern) - { - if (pattern.startsWith("-")) - return newEntry(pattern.substring(1), false); - return newEntry(pattern, true); - } - - protected Entry newEntry(String name, boolean inclusive) - { - if (name.startsWith("-")) - throw new IllegalStateException(name); - if (name.startsWith("file:")) - return new LocationEntry(name, inclusive); - if (name.startsWith("jrt:")) - return new ModuleEntry(name, inclusive); - if (name.endsWith(".")) - return new PackageEntry(name, inclusive); - return new ClassEntry(name, inclusive); - } - - @Override - public boolean remove(Object o) - { - if (!(o instanceof String)) - return false; - String pattern = (String)o; - - Entry entry = _entries.remove(pattern); - if (entry == null) - return false; - - List saved = new ArrayList<>(_entries.values()); - clear(); - for (Entry e : saved) - { - add(e); - } - return true; - } - - @Override - public void clear() - { - _entries.clear(); - _patterns.clear(); - _locations.clear(); - } - - @Override - public Iterator iterator() - { - return _entries.keySet().iterator(); - } - - @Override - public int size() - { - return _entries.size(); - } - - /** - * Initialize the matcher by parsing each classpath pattern in an array - * - * @param classes array of classpath patterns - */ - private void setAll(String[] classes) - { - _entries.clear(); - addAll(classes); - } - - /** - * Add array of classpath patterns. - * @param classes array of classpath patterns - */ - private void addAll(String[] classes) - { - if (classes != null) - addAll(Arrays.asList(classes)); - } - - /** - * @return array of classpath patterns - */ - public String[] getPatterns() - { - return toArray(new String[0]); - } - - /** - * @return array of inclusive classpath patterns - */ - public String[] getInclusions() - { - return _entries.values().stream().filter(Entry::isInclusive).map(Entry::getName).toArray(String[]::new); - } - - /** - * @return array of excluded classpath patterns (without '-' prefix) - */ - public String[] getExclusions() - { - return _entries.values().stream().filter(e -> !e.isInclusive()).map(Entry::getName).toArray(String[]::new); - } - - /** - * Match the class name against the pattern - * - * @param name name of the class to match - * @return true if class matches the pattern - */ - public boolean match(String name) - { - return _patterns.test(name); - } - - /** - * Match the class name against the pattern - * - * @param clazz A class to try to match - * @return true if class matches the pattern - */ - public boolean match(Class clazz) - { - try - { - return combine(_patterns, clazz.getName(), _locations, () -> TypeUtil.getLocationOfClass(clazz)); - } - catch (Exception ignored) - { - } - return false; - } - - public boolean match(String name, URL url) - { - if (url == null) - return false; - - // Strip class suffix for name matching - if (name.endsWith(".class")) - name = name.substring(0, name.length() - 6); - - // Treat path elements as packages for name matching - name = StringUtil.replace(name, '/', '.'); - - return combine(_patterns, name, _locations, () -> - { - try - { - return URIUtil.unwrapContainer(url.toURI()); - } - catch (URISyntaxException ignored) - { - return null; - } - }); - } - - /** - * Match a class against inclusions and exclusions by name and location. - * Name based checks are performed before location checks. For a class to match, - * it must not be excluded by either name or location, and must either be explicitly - * included, or for there to be no inclusions. In the case where the location - * of the class is null, it will match if it is included by name, or - * if there are no location exclusions. - * - * @param names configured inclusions and exclusions by name - * @param name the name to check - * @param locations configured inclusions and exclusions by location - * @param location the location of the class (can be null) - * @return true if the class is not excluded but is included, or there are - * no inclusions. False otherwise. - */ - static boolean combine(IncludeExcludeSet names, String name, IncludeExcludeSet locations, Supplier location) - { - // check the name set - Boolean byName = names.isIncludedAndNotExcluded(name); - - // If we excluded by name, then no match - if (Boolean.FALSE == byName) - return false; - - // check the location set - URI uri = location.get(); - Boolean byLocation = uri == null ? null : locations.isIncludedAndNotExcluded(uri); - - // If we excluded by location or couldn't check location exclusion, then no match - if (Boolean.FALSE == byLocation || (locations.hasExcludes() && uri == null)) - return false; - - // If there are includes, then we must be included to match. - if (names.hasIncludes() || locations.hasIncludes()) - return byName == Boolean.TRUE || byLocation == Boolean.TRUE; - - // Otherwise there are no includes and it was not excluded, so match - return true; - } -} diff --git a/jetty-ee9/jetty-ee9-webapp/src/main/java/org/eclipse/jetty/ee9/webapp/Configuration.java b/jetty-ee9/jetty-ee9-webapp/src/main/java/org/eclipse/jetty/ee9/webapp/Configuration.java index bc0b23f3a682..cdea5d816c5b 100644 --- a/jetty-ee9/jetty-ee9-webapp/src/main/java/org/eclipse/jetty/ee9/webapp/Configuration.java +++ b/jetty-ee9/jetty-ee9-webapp/src/main/java/org/eclipse/jetty/ee9/webapp/Configuration.java @@ -17,6 +17,7 @@ import java.util.Collections; import java.util.ServiceLoader; +import org.eclipse.jetty.util.ClassMatcher; import org.eclipse.jetty.util.TopologicalSort; /** diff --git a/jetty-ee9/jetty-ee9-webapp/src/main/java/org/eclipse/jetty/ee9/webapp/WebAppContext.java b/jetty-ee9/jetty-ee9-webapp/src/main/java/org/eclipse/jetty/ee9/webapp/WebAppContext.java index 75705120752e..0fbfc1ef1c23 100644 --- a/jetty-ee9/jetty-ee9-webapp/src/main/java/org/eclipse/jetty/ee9/webapp/WebAppContext.java +++ b/jetty-ee9/jetty-ee9-webapp/src/main/java/org/eclipse/jetty/ee9/webapp/WebAppContext.java @@ -56,6 +56,7 @@ import org.eclipse.jetty.server.Handler; import org.eclipse.jetty.server.Server; import org.eclipse.jetty.util.Attributes; +import org.eclipse.jetty.util.ClassMatcher; import org.eclipse.jetty.util.ExceptionUtil; import org.eclipse.jetty.util.IO; import org.eclipse.jetty.util.StringUtil; diff --git a/jetty-ee9/jetty-ee9-webapp/src/test/java/org/eclipse/jetty/ee9/webapp/ClassMatcherTest.java b/jetty-ee9/jetty-ee9-webapp/src/test/java/org/eclipse/jetty/ee9/webapp/ClassMatcherTest.java deleted file mode 100644 index 1e112bb5ac94..000000000000 --- a/jetty-ee9/jetty-ee9-webapp/src/test/java/org/eclipse/jetty/ee9/webapp/ClassMatcherTest.java +++ /dev/null @@ -1,307 +0,0 @@ -// -// ======================================================================== -// 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 org.eclipse.jetty.ee9.webapp; - -import java.net.URI; -import java.util.Arrays; -import java.util.function.Supplier; - -import org.eclipse.jetty.ee9.webapp.ClassMatcher.ByLocationOrModule; -import org.eclipse.jetty.ee9.webapp.ClassMatcher.ByPackageOrName; -import org.eclipse.jetty.ee9.webapp.ClassMatcher.Entry; -import org.eclipse.jetty.util.IncludeExcludeSet; -import org.eclipse.jetty.util.TypeUtil; -import org.hamcrest.Matchers; -import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.Test; - -import static org.hamcrest.MatcherAssert.assertThat; -import static org.hamcrest.Matchers.is; -import static org.hamcrest.Matchers.notNullValue; -import static org.junit.jupiter.api.Assertions.assertFalse; -import static org.junit.jupiter.api.Assertions.assertNotNull; -import static org.junit.jupiter.api.Assertions.assertTrue; - -public class ClassMatcherTest -{ - private final ClassMatcher _pattern = new ClassMatcher(); - - protected static Supplier NULL_SUPPLIER = () -> null; - - @BeforeEach - public void before() - { - _pattern.clear(); - _pattern.add("org.package."); - _pattern.add("-org.excluded."); - _pattern.add("org.example.FooBar"); - _pattern.add("-org.example.Excluded"); - _pattern.addAll(Arrays.asList( - "-org.example.Nested$Minus", - "org.example.Nested", - "org.example.Nested$Something")); - - assertThat(_pattern, Matchers.containsInAnyOrder( - "org.package.", - "-org.excluded.", - "org.example.FooBar", - "-org.example.Excluded", - "-org.example.Nested$Minus", - "org.example.Nested", - "org.example.Nested$Something" - )); - } - - @Test - public void testClassMatch() - { - assertTrue(_pattern.match("org.example.FooBar")); - assertTrue(_pattern.match("org.example.Nested")); - - assertFalse(_pattern.match("org.example.Unknown")); - assertFalse(_pattern.match("org.example.FooBar.Unknown")); - } - - @Test - public void testPackageMatch() - { - assertTrue(_pattern.match("org.package.Something")); - assertTrue(_pattern.match("org.package.other.Something")); - - assertFalse(_pattern.match("org.example.Unknown")); - assertFalse(_pattern.match("org.example.FooBar.Unknown")); - assertFalse(_pattern.match("org.example.FooBarElse")); - } - - @Test - public void testExplicitNestedMatch() - { - assertTrue(_pattern.match("org.example.Nested$Something")); - assertFalse(_pattern.match("org.example.Nested$Minus")); - assertTrue(_pattern.match("org.example.Nested$Other")); - } - - @Test - public void testImplicitNestedMatch() - { - assertTrue(_pattern.match("org.example.FooBar$Other")); - assertTrue(_pattern.match("org.example.Nested$Other")); - } - - @Test - public void testDoubledNested() - { - assertTrue(_pattern.match("org.example.Nested$Something$Else")); - - assertFalse(_pattern.match("org.example.Nested$Minus$Else")); - } - - @Test - public void testMatchAll() - { - _pattern.clear(); - _pattern.add("."); - assertTrue(_pattern.match("org.example.Anything")); - assertTrue(_pattern.match("org.example.Anything$Else")); - } - - @Test - public void testCopy() - { - ClassMatcher copy = new ClassMatcher(_pattern); - assertThat(copy.toString(), is(_pattern.toString())); - } - - @Test - public void testMatchFundamentalExcludeSpecific() - { - _pattern.clear(); - _pattern.add("jakarta."); - _pattern.add("-jakarta.ws.rs.", "-jakarta.inject."); - assertFalse(_pattern.match("org.example.Anything")); - assertTrue(_pattern.match("jakarta.servlet.HttpServlet")); - assertFalse(_pattern.match("jakarta.ws.rs.ProcessingException")); - } - - @SuppressWarnings("restriction") - @Test - public void testIncludedLocations() throws Exception - { - // jar from JVM classloader - URI locString = TypeUtil.getLocationOfClass(String.class); - - // a jar from maven repo jar - URI locJunit = TypeUtil.getLocationOfClass(Test.class); - - // class file - URI locTest = TypeUtil.getLocationOfClass(ClassMatcherTest.class); - - ClassMatcher pattern = new ClassMatcher(); - pattern.include("something"); - assertThat(pattern.match(String.class), is(false)); - assertThat(pattern.match(Test.class), is(false)); - assertThat(pattern.match(ClassMatcherTest.class), is(false)); - - // Add directory for both JVM classes - pattern.include(locString.toASCIIString()); - - // Add jar for individual class and classes directory - pattern.include(locJunit.toString(), locTest.toString()); - - assertThat(pattern.match(String.class), is(true)); - assertThat(pattern.match(Test.class), is(true)); - assertThat(pattern.match(ClassMatcherTest.class), is(true)); - - pattern.add("-java.lang.String"); - assertThat(pattern.match(String.class), is(false)); - assertThat(pattern.match(Test.class), is(true)); - assertThat(pattern.match(ClassMatcherTest.class), is(true)); - } - - @SuppressWarnings("restriction") - @Test - public void testIncludedLocationsOrModule() throws Exception - { - // jar from JVM classloader - URI modString = TypeUtil.getLocationOfClass(String.class); - // System.err.println(modString); - - // a jar from maven repo jar - URI locJunit = TypeUtil.getLocationOfClass(Test.class); - // System.err.println(locJunit); - - // class file - URI locTest = TypeUtil.getLocationOfClass(ClassMatcherTest.class); - // System.err.println(locTest); - - ClassMatcher pattern = new ClassMatcher(); - pattern.include("something"); - assertThat(pattern.match(String.class), is(false)); - assertThat(pattern.match(Test.class), is(false)); - assertThat(pattern.match(ClassMatcherTest.class), is(false)); - - // Add module for all JVM base classes - pattern.include("jrt:/java.base"); - - // Add jar for individual class and classes directory - pattern.include(locJunit.toString(), locTest.toString()); - - assertThat(pattern.match(String.class), is(true)); - assertThat(pattern.match(Test.class), is(true)); - assertThat(pattern.match(ClassMatcherTest.class), is(true)); - - pattern.add("-java.lang.String"); - assertThat(pattern.match(String.class), is(false)); - assertThat(pattern.match(Test.class), is(true)); - assertThat(pattern.match(ClassMatcherTest.class), is(true)); - } - - @SuppressWarnings("restriction") - @Test - public void testExcludeLocationsOrModule() throws Exception - { - // jar from JVM classloader - URI modString = TypeUtil.getLocationOfClass(String.class); - assertNotNull(modString); - - // a jar from maven repo jar - URI locJunit = TypeUtil.getLocationOfClass(Test.class); - assertNotNull(locJunit); - - // class file - URI locTest = TypeUtil.getLocationOfClass(ClassMatcherTest.class); - assertNotNull(locTest); - - ClassMatcher pattern = new ClassMatcher(); - - // include everything - pattern.include("."); - - assertThat(pattern.match(String.class), is(true)); - assertThat(pattern.match(Test.class), is(true)); - assertThat(pattern.match(ClassMatcherTest.class), is(true)); - - // Add directory for both JVM classes - pattern.exclude("jrt:/java.base/"); - - // Add jar for individual class and classes directory - pattern.exclude(locJunit.toASCIIString(), locTest.toASCIIString()); - - assertThat(pattern.match(String.class), is(false)); - assertThat(pattern.match(Test.class), is(false)); - assertThat(pattern.match(ClassMatcherTest.class), is(false)); - } - - @Test - public void testWithNullLocation() throws Exception - { - ClassMatcher matcher = new ClassMatcher(); - - IncludeExcludeSet names = new IncludeExcludeSet<>(ByPackageOrName.class); - IncludeExcludeSet locations = new IncludeExcludeSet<>(ByLocationOrModule.class); - - //Test no name or location includes or excludes - should match - assertThat(ClassMatcher.combine(names, "a.b.c", locations, NULL_SUPPLIER), is(true)); - - names.include(matcher.newEntry("a.b.", true)); - names.exclude(matcher.newEntry("d.e.", false)); - - //Test explicit include by name no locations - should match - assertThat(ClassMatcher.combine(names, "a.b.c", locations, NULL_SUPPLIER), is(true)); - - //Test explicit exclude by name no locations - should not match - assertThat(ClassMatcher.combine(names, "d.e.f", locations, NULL_SUPPLIER), is(false)); - - //Test include by name with location includes - should match - locations.include(matcher.newEntry("file:/foo/bar", true)); - assertThat(ClassMatcher.combine(names, "a.b.c", locations, NULL_SUPPLIER), is(true)); - - //Test include by name but with location exclusions - should not match - locations.clear(); - locations.exclude(matcher.newEntry("file:/high/low", false)); - assertThat(ClassMatcher.combine(names, "a.b.c", locations, NULL_SUPPLIER), is(false)); - - //Test neither included or excluded by name, but with location exclusions - should not match - assertThat(ClassMatcher.combine(names, "g.b.r", locations, NULL_SUPPLIER), is(false)); - - //Test neither included nor excluded by name, but with location inclusions - should not match - locations.clear(); - locations.include(matcher.newEntry("file:/foo/bar", true)); - assertThat(ClassMatcher.combine(names, "g.b.r", locations, NULL_SUPPLIER), is(false)); - } - - @Test - public void testLarge() - { - ClassMatcher pattern = new ClassMatcher(); - for (int i = 0; i < 500; i++) - { - assertTrue(pattern.add("n" + i + "." + Integer.toHexString(100 + i) + ".Name")); - } - - for (int i = 0; i < 500; i++) - { - assertTrue(pattern.match("n" + i + "." + Integer.toHexString(100 + i) + ".Name")); - } - } - - @Test - public void testJvmModule() - { - URI uri = TypeUtil.getLocationOfClass(String.class); - assertThat(uri, notNullValue()); - assertThat(uri.getScheme(), is("jrt")); - assertThat(uri.getPath(), is("/java.base")); - } -} diff --git a/jetty-ee9/jetty-ee9-webapp/src/test/java/org/eclipse/jetty/ee9/webapp/WebAppClassLoaderTest.java b/jetty-ee9/jetty-ee9-webapp/src/test/java/org/eclipse/jetty/ee9/webapp/WebAppClassLoaderTest.java index e7b93249b013..af4e50031f41 100644 --- a/jetty-ee9/jetty-ee9-webapp/src/test/java/org/eclipse/jetty/ee9/webapp/WebAppClassLoaderTest.java +++ b/jetty-ee9/jetty-ee9-webapp/src/test/java/org/eclipse/jetty/ee9/webapp/WebAppClassLoaderTest.java @@ -26,9 +26,9 @@ import org.eclipse.jetty.server.Server; import org.eclipse.jetty.toolchain.test.MavenTestingUtils; +import org.eclipse.jetty.util.ClassMatcher; import org.eclipse.jetty.util.IO; import org.eclipse.jetty.util.component.LifeCycle; -import org.eclipse.jetty.util.resource.FileSystemPool; import org.eclipse.jetty.util.resource.Resource; import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.BeforeEach; @@ -37,7 +37,6 @@ import static org.eclipse.jetty.toolchain.test.ExtraMatchers.ordered; import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.contains; -import static org.hamcrest.Matchers.empty; import static org.hamcrest.Matchers.is; import static org.hamcrest.Matchers.notNullValue; import static org.hamcrest.Matchers.nullValue; From 17b20041baf369fee27ddd950a35700556e71542 Mon Sep 17 00:00:00 2001 From: gregw Date: Sun, 24 Mar 2024 19:47:41 +0100 Subject: [PATCH 05/28] System Server Classes --- jetty-core/jetty-ee/pom.xml | 65 +++++++++ .../jetty-ee/src/main/java/module-info.java | 22 +++ .../jetty/ee/WebappProtectedClasses.java | 129 +++++++++++++++++ jetty-core/pom.xml | 1 + jetty-ee10/jetty-ee10-webapp/pom.xml | 4 + .../src/main/config/etc/jetty-ee10-webapp.xml | 7 +- .../src/main/java/module-info.java | 1 + .../jetty/ee10/webapp/ClassMatcher.java | 42 ++++++ .../jetty/ee10/webapp/WebAppContext.java | 132 +++++------------- .../jetty/ee10/webapp/WebAppContextTest.java | 9 +- .../src/main/jetty/jetty-context.xml | 2 +- .../src/main/config/etc/jetty-ee8-webapp.xml | 2 + .../src/main/jetty/jetty-context.xml | 2 +- jetty-ee9/jetty-ee9-webapp/pom.xml | 4 + .../src/main/config/etc/jetty-ee9-webapp.xml | 6 +- .../src/main/java/module-info.java | 1 + .../jetty/ee9/webapp/ClassMatcher.java | 42 ++++++ .../jetty/ee9/webapp/WebAppContext.java | 128 ++++------------- .../jetty/ee9/webapp/WebAppContextTest.java | 4 +- 19 files changed, 393 insertions(+), 210 deletions(-) create mode 100644 jetty-core/jetty-ee/pom.xml create mode 100644 jetty-core/jetty-ee/src/main/java/module-info.java create mode 100644 jetty-core/jetty-ee/src/main/java/org/eclipse/jetty/ee/WebappProtectedClasses.java create mode 100644 jetty-ee10/jetty-ee10-webapp/src/main/java/org/eclipse/jetty/ee10/webapp/ClassMatcher.java create mode 100644 jetty-ee9/jetty-ee9-webapp/src/main/java/org/eclipse/jetty/ee9/webapp/ClassMatcher.java diff --git a/jetty-core/jetty-ee/pom.xml b/jetty-core/jetty-ee/pom.xml new file mode 100644 index 000000000000..288b73e2a2ca --- /dev/null +++ b/jetty-core/jetty-ee/pom.xml @@ -0,0 +1,65 @@ + + + + 4.0.0 + + org.eclipse.jetty + jetty-core + 12.0.8-SNAPSHOT + + jetty-ee + Core :: EE Common + + + ${project.groupId}.ee + org.eclipse.jetty.ee.* + + + + + org.eclipse.jetty + jetty-server + + + org.slf4j + slf4j-api + + + org.eclipse.jetty + jetty-slf4j-impl + test + + + org.eclipse.jetty.tests + jetty-test-multipart + ${project.version} + test + + + org.eclipse.jetty.toolchain + jetty-test-helper + test + + + + + + + org.apache.felix + maven-bundle-plugin + true + + + + + + + org.apache.maven.plugins + maven-surefire-plugin + + @{argLine} ${jetty.surefire.argLine} --add-reads org.eclipse.jetty.ee=org.eclipse.jetty.logging + + + + + diff --git a/jetty-core/jetty-ee/src/main/java/module-info.java b/jetty-core/jetty-ee/src/main/java/module-info.java new file mode 100644 index 000000000000..90f777dc5720 --- /dev/null +++ b/jetty-core/jetty-ee/src/main/java/module-info.java @@ -0,0 +1,22 @@ +// +// ======================================================================== +// 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 +// ======================================================================== +// + +module org.eclipse.jetty.ee +{ + requires org.slf4j; + + requires transitive org.eclipse.jetty.util; + requires transitive org.eclipse.jetty.server; + + exports org.eclipse.jetty.ee; +} diff --git a/jetty-core/jetty-ee/src/main/java/org/eclipse/jetty/ee/WebappProtectedClasses.java b/jetty-core/jetty-ee/src/main/java/org/eclipse/jetty/ee/WebappProtectedClasses.java new file mode 100644 index 000000000000..74c466db5bb5 --- /dev/null +++ b/jetty-core/jetty-ee/src/main/java/org/eclipse/jetty/ee/WebappProtectedClasses.java @@ -0,0 +1,129 @@ +package org.eclipse.jetty.ee; + +import org.eclipse.jetty.server.Server; +import org.eclipse.jetty.util.Attributes; +import org.eclipse.jetty.util.ClassMatcher; +import org.eclipse.jetty.util.component.Environment; + +public class WebappProtectedClasses +{ + public static final String SYSTEM_CLASSES_ATTRIBUTE = "org.eclipse.jetty.webapp.systemClasses"; + public static final String SERVER_CLASSES_ATTRIBUTE = "org.eclipse.jetty.webapp.serverClasses"; + + // System classes are classes that cannot be replaced by + // the web application, and they are *always* loaded via + // system classloader. + public static final ClassMatcher DEFAULT_SYSTEM_CLASSES = new ClassMatcher( + "java.", // Java SE classes (per servlet spec v2.5 / SRV.9.7.2) + "javax.", // Java SE classes (per servlet spec v2.5 / SRV.9.7.2) + "jakarta.", // Jakarta classes (per servlet spec v5.0 / Section 15.2.1) + "org.xml.", // javax.xml + "org.w3c." // javax.xml + ); + + // Server classes are classes that are hidden from being + // loaded by the web application using system classloader, + // so if web application needs to load any of such classes, + // it has to include them in its distribution. + public static final ClassMatcher DEFAULT_SERVER_CLASSES = new ClassMatcher( + "org.eclipse.jetty." // hide jetty classes + ); + + public static ClassMatcher getSystemClasses(Server server) + { + return getClassMatcher(server, SYSTEM_CLASSES_ATTRIBUTE, null); + } + + public static ClassMatcher getSystemClasses(Environment environment) + { + return getClassMatcher(environment, SYSTEM_CLASSES_ATTRIBUTE, null); + } + + /** + * Add a System Class pattern to use for all WebAppContexts. + * @param patterns the patterns to use + */ + public static void addSystemClasses(String... patterns) + { + DEFAULT_SYSTEM_CLASSES.add(patterns); + } + + /** + * Add a System Class pattern to use for all WebAppContexts of a given {@link Server}. + * @param server The {@link Server} instance to add classes to + * @param patterns the patterns to use + */ + public static void addSystemClasses(Server server, String... patterns) + { + addClasses(server, SYSTEM_CLASSES_ATTRIBUTE, DEFAULT_SYSTEM_CLASSES, patterns); + } + + /** + * Add a System Class pattern to use for WebAppContexts of a given environment. + * @param environment The {@link Environment} instance to add classes to + * @param patterns the patterns to use + */ + public static void addSystemClasses(Environment environment, String... patterns) + { + addClasses(environment, SYSTEM_CLASSES_ATTRIBUTE, DEFAULT_SYSTEM_CLASSES, patterns); + } + + public static ClassMatcher getServerClasses(Server server) + { + return getClassMatcher(server, SERVER_CLASSES_ATTRIBUTE, DEFAULT_SERVER_CLASSES); + } + + public static ClassMatcher getServerClasses(Environment environment) + { + return getClassMatcher(environment, SERVER_CLASSES_ATTRIBUTE, DEFAULT_SERVER_CLASSES); + } + + /** + * Add a Server Class pattern to use for all WebAppContexts of a given {@link Server}. + * @param patterns the patterns to use + */ + public static void addServerClasses(String... patterns) + { + DEFAULT_SERVER_CLASSES.add(patterns); + } + + /** + * Add a Server Class pattern to use for all WebAppContexts of a given {@link Server}. + * @param server The {@link Server} instance to add classes to + * @param patterns the patterns to use + */ + public static void addServerClasses(Server server, String... patterns) + { + addClasses(server, SERVER_CLASSES_ATTRIBUTE, DEFAULT_SERVER_CLASSES, patterns); + } + + /** + * Add a Server Class pattern to use for all ee9 WebAppContexts. + * @param environment The {@link Environment} instance to add classes to + * @param patterns the patterns to use + */ + public static void addServerClasses(Environment environment, String... patterns) + { + addClasses(environment, SERVER_CLASSES_ATTRIBUTE, DEFAULT_SERVER_CLASSES, patterns); + } + + private static void addClasses(Attributes attributes, String attribute, ClassMatcher defaultPatterns, String... patterns) + { + ClassMatcher classMatcher = getClassMatcher(attributes, attribute, defaultPatterns); + if (patterns != null && patterns.length > 0) + classMatcher.add(patterns); + } + + private static ClassMatcher getClassMatcher(Attributes attributes, String attribute, ClassMatcher defaultPatterns) + { + Object existing = attributes.getAttribute(attribute); + if (existing instanceof ClassMatcher cm) + return cm; + + ClassMatcher classMatcher = (existing instanceof String[] stringArray) + ? new ClassMatcher(stringArray) : new ClassMatcher(defaultPatterns); + attributes.setAttribute(attribute, classMatcher); + return classMatcher; + } + +} diff --git a/jetty-core/pom.xml b/jetty-core/pom.xml index 54f20d4d4987..523d8bb1ef49 100644 --- a/jetty-core/pom.xml +++ b/jetty-core/pom.xml @@ -44,6 +44,7 @@ jetty-util-ajax jetty-websocket jetty-xml + jetty-ee diff --git a/jetty-ee10/jetty-ee10-webapp/pom.xml b/jetty-ee10/jetty-ee10-webapp/pom.xml index 00ad79566552..efed17695f85 100644 --- a/jetty-ee10/jetty-ee10-webapp/pom.xml +++ b/jetty-ee10/jetty-ee10-webapp/pom.xml @@ -25,6 +25,10 @@ org.eclipse.jetty jetty-xml + + org.eclipse.jetty + jetty-ee + org.eclipse.jetty.ee10 jetty-ee10-servlet diff --git a/jetty-ee10/jetty-ee10-webapp/src/main/config/etc/jetty-ee10-webapp.xml b/jetty-ee10/jetty-ee10-webapp/src/main/config/etc/jetty-ee10-webapp.xml index 772def0c92b1..c60c38021eab 100644 --- a/jetty-ee10/jetty-ee10-webapp/src/main/config/etc/jetty-ee10-webapp.xml +++ b/jetty-ee10/jetty-ee10-webapp/src/main/config/etc/jetty-ee10-webapp.xml @@ -2,7 +2,8 @@ - + + @@ -10,12 +11,12 @@ - + + - diff --git a/jetty-ee10/jetty-ee10-webapp/src/main/java/module-info.java b/jetty-ee10/jetty-ee10-webapp/src/main/java/module-info.java index e9f4dd7200e9..cb475ecbdab2 100644 --- a/jetty-ee10/jetty-ee10-webapp/src/main/java/module-info.java +++ b/jetty-ee10/jetty-ee10-webapp/src/main/java/module-info.java @@ -33,6 +33,7 @@ requires transitive org.eclipse.jetty.session; requires transitive org.eclipse.jetty.ee10.servlet; requires transitive org.eclipse.jetty.xml; + requires transitive org.eclipse.jetty.ee; exports org.eclipse.jetty.ee10.webapp; diff --git a/jetty-ee10/jetty-ee10-webapp/src/main/java/org/eclipse/jetty/ee10/webapp/ClassMatcher.java b/jetty-ee10/jetty-ee10-webapp/src/main/java/org/eclipse/jetty/ee10/webapp/ClassMatcher.java new file mode 100644 index 000000000000..ed921b5c9df1 --- /dev/null +++ b/jetty-ee10/jetty-ee10-webapp/src/main/java/org/eclipse/jetty/ee10/webapp/ClassMatcher.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 org.eclipse.jetty.ee10.webapp; + +/** + * @deprecated Use org.eclipse.jetty.util.ClassMatcher + */ + +@Deprecated(since = "12.0.8", forRemoval = true) +public class ClassMatcher extends org.eclipse.jetty.util.ClassMatcher +{ + public ClassMatcher() + { + super(); + } + + public ClassMatcher(org.eclipse.jetty.util.ClassMatcher patterns) + { + super(patterns); + } + + public ClassMatcher(String... patterns) + { + super(patterns); + } + + public ClassMatcher(String pattern) + { + super(pattern); + } +} diff --git a/jetty-ee10/jetty-ee10-webapp/src/main/java/org/eclipse/jetty/ee10/webapp/WebAppContext.java b/jetty-ee10/jetty-ee10-webapp/src/main/java/org/eclipse/jetty/ee10/webapp/WebAppContext.java index fd3fcdafb51e..f835e53eb9cc 100644 --- a/jetty-ee10/jetty-ee10-webapp/src/main/java/org/eclipse/jetty/ee10/webapp/WebAppContext.java +++ b/jetty-ee10/jetty-ee10-webapp/src/main/java/org/eclipse/jetty/ee10/webapp/WebAppContext.java @@ -38,6 +38,7 @@ import jakarta.servlet.http.HttpSessionBindingListener; import jakarta.servlet.http.HttpSessionIdListener; import jakarta.servlet.http.HttpSessionListener; +import org.eclipse.jetty.ee.WebappProtectedClasses; import org.eclipse.jetty.ee10.servlet.ErrorHandler; import org.eclipse.jetty.ee10.servlet.ErrorPageErrorHandler; import org.eclipse.jetty.ee10.servlet.ServletContextHandler; @@ -83,32 +84,25 @@ public class WebAppContext extends ServletContextHandler implements WebAppClassL static final Logger LOG = LoggerFactory.getLogger(WebAppContext.class); public static final String WEB_DEFAULTS_XML = "org/eclipse/jetty/ee10/webapp/webdefault-ee10.xml"; - public static final String SERVER_SYS_CLASSES = "org.eclipse.jetty.webapp.systemClasses"; - public static final String SERVER_SRV_CLASSES = "org.eclipse.jetty.webapp.serverClasses"; - - private static String[] __dftProtectedTargets = {"/WEB-INF", "/META-INF"}; - - // System classes are classes that cannot be replaced by - // the web application, and they are *always* loaded via - // system classloader. - public static final ClassMatcher __dftSystemClasses = new ClassMatcher( - "java.", // Java SE classes (per servlet spec v2.5 / SRV.9.7.2) - "javax.", // Java SE classes (per servlet spec v2.5 / SRV.9.7.2) - "jakarta.", // Jakarta classes (per servlet spec v5.0 / Section 15.2.1) - "org.xml.", // javax.xml - "org.w3c." // javax.xml - ); - - // Server classes are classes that are hidden from being - // loaded by the web application using system classloader, - // so if web application needs to load any of such classes, - // it has to include them in its distribution. - public static final ClassMatcher __dftServerClasses = new ClassMatcher( - "org.eclipse.jetty." // hide jetty classes - ); - - private final ClassMatcher _systemClasses = new ClassMatcher(__dftSystemClasses); - private final ClassMatcher _serverClasses = new ClassMatcher(__dftServerClasses); + public static final String SERVER_SYS_CLASSES = WebappProtectedClasses.SYSTEM_CLASSES_ATTRIBUTE; + public static final String SERVER_SRV_CLASSES = WebappProtectedClasses.SERVER_CLASSES_ATTRIBUTE; + + private static final String[] __dftProtectedTargets = {"/WEB-INF", "/META-INF"}; + + /** + * @deprecated use {@link WebappProtectedClasses#DEFAULT_SYSTEM_CLASSES} + */ + @Deprecated + public static final ClassMatcher __dftSystemClasses = WebappProtectedClasses.DEFAULT_SYSTEM_CLASSES; + + /** + * @deprecated use {@link WebappProtectedClasses#DEFAULT_SERVER_CLASSES} + */ + @Deprecated + public static final ClassMatcher __dftServerClasses = WebappProtectedClasses.DEFAULT_SERVER_CLASSES; + + private final ClassMatcher _systemClasses = new ClassMatcher(WebappProtectedClasses.getSystemClasses(ServletContextHandler.ENVIRONMENT)); + private final ClassMatcher _serverClasses = new ClassMatcher(WebappProtectedClasses.getServerClasses(ServletContextHandler.ENVIRONMENT)); private Configurations _configurations; private String _defaultsDescriptor = WEB_DEFAULTS_XML; @@ -727,23 +721,8 @@ public void setServer(Server server) super.setServer(server); if (server != null) { - if (__dftSystemClasses.equals(_systemClasses)) - { - Object systemClasses = ServletContextHandler.ENVIRONMENT.getAttribute(SERVER_SYS_CLASSES); - if (systemClasses instanceof String[] patterns) - _systemClasses.add(patterns); - if (systemClasses instanceof ClassMatcher classMatcher) - _systemClasses.add(classMatcher.getPatterns()); - } - - if (__dftServerClasses.equals(_serverClasses)) - { - Object serverClasses = ServletContextHandler.ENVIRONMENT.getAttribute(SERVER_SRV_CLASSES); - if (serverClasses instanceof String[] patterns) - _serverClasses.add(patterns); - if (serverClasses instanceof ClassMatcher classMatcher) - _serverClasses.add(classMatcher.getPatterns()); - } + _systemClasses.add(WebappProtectedClasses.getSystemClasses(server).getPatterns()); + _serverClasses.add(WebappProtectedClasses.getServerClasses(server).getPatterns()); } } @@ -1403,75 +1382,30 @@ public MetaData getMetaData() } /** - * @param server ignored. - * @param patterns the patterns to add - * @deprecated use {@link #addServerClasses(String...)} instead, will be removed in Jetty 12.1.0 - */ - @Deprecated(since = "12.0.8", forRemoval = true) - public static void addServerClasses(Server server, String... patterns) - { - addServerClasses(patterns); - } - - /** - * Add a Server Class pattern to use for all ee10 WebAppContexts. + * Add a Server Class pattern to use for all ee9 WebAppContexts. + * @param server The {@link Server} instance to add classes to * @param patterns the patterns to use * @see #getServerClassMatcher() * @see #getServerClasses() - */ - public static void addServerClasses(String... patterns) - { - if (LOG.isDebugEnabled()) - LOG.debug("Adding {} ServerClasses: {}", ServletContextHandler.ENVIRONMENT, String.join(", ", patterns)); - addClasses(__dftServerClasses, SERVER_SRV_CLASSES, patterns); - } - - /** - * @param server ignored. - * @param patterns the patterns to add - * @deprecated use {@link #addSystemClasses(String...)} instead, will be removed in Jetty 12.1.0 + * @deprecated use {@link WebappProtectedClasses#addSystemClasses(Server, String...)} */ @Deprecated(since = "12.0.8", forRemoval = true) - public static void addSystemClasses(Server server, String... patterns) + public static void addServerClasses(Server server, String... patterns) { - addSystemClasses(patterns); + WebappProtectedClasses.addServerClasses(server, patterns); } /** - * Add a System Class pattern to use for all ee10 WebAppContexts. + * Add a System Class pattern to use for all ee9 WebAppContexts. + * @param server The {@link Server} instance to add classes to * @param patterns the patterns to use * @see #getSystemClassMatcher() * @see #getSystemClasses() + * @deprecated use {@link WebappProtectedClasses#addServerClasses(Server, String...)} */ - public static void addSystemClasses(String... patterns) - { - if (LOG.isDebugEnabled()) - LOG.debug("Adding {} SystemClasses: {}", ServletContextHandler.ENVIRONMENT, String.join(", ", patterns)); - addClasses(__dftSystemClasses, SERVER_SYS_CLASSES, patterns); - } - - private static void addClasses(ClassMatcher matcher, String attributeKey, String... pattern) + @Deprecated(since = "12.0.8", forRemoval = true) + public static void addSystemClasses(Server server, String... patterns) { - if (pattern == null || pattern.length == 0) - return; - - // look for a ClassMatcher attribute with the list of Server / System classes - // to apply to every ee10 web application. If not present, use our defaults. - Object o = ServletContextHandler.ENVIRONMENT.getAttribute(attributeKey); - if (o instanceof ClassMatcher) - { - ((ClassMatcher)o).add(pattern); - return; - } - - String[] classes; - if (o instanceof String[]) - classes = (String[])o; - else - classes = matcher.getPatterns(); - int l = classes.length; - classes = Arrays.copyOf(classes, l + pattern.length); - System.arraycopy(pattern, 0, classes, l, pattern.length); - ServletContextHandler.ENVIRONMENT.setAttribute(attributeKey, classes); + WebappProtectedClasses.addSystemClasses(server, patterns); } } diff --git a/jetty-ee10/jetty-ee10-webapp/src/test/java/org/eclipse/jetty/ee10/webapp/WebAppContextTest.java b/jetty-ee10/jetty-ee10-webapp/src/test/java/org/eclipse/jetty/ee10/webapp/WebAppContextTest.java index ac8dd91e29e7..94027675ab59 100644 --- a/jetty-ee10/jetty-ee10-webapp/src/test/java/org/eclipse/jetty/ee10/webapp/WebAppContextTest.java +++ b/jetty-ee10/jetty-ee10-webapp/src/test/java/org/eclipse/jetty/ee10/webapp/WebAppContextTest.java @@ -30,6 +30,7 @@ import jakarta.servlet.ServletContext; import jakarta.servlet.ServletRequest; import jakarta.servlet.ServletResponse; +import org.eclipse.jetty.ee.WebappProtectedClasses; import org.eclipse.jetty.ee10.servlet.ErrorPageErrorHandler; import org.eclipse.jetty.ee10.servlet.ServletContextHandler; import org.eclipse.jetty.http.HttpStatus; @@ -812,7 +813,7 @@ public void testAddServerClasses() throws Exception String testPattern = "org.eclipse.jetty.ee10.webapp.test."; - WebAppContext.addServerClasses(testPattern); + WebAppContext.addServerClasses(server, testPattern); WebAppContext context = new WebAppContext(); context.setContextPath("/"); @@ -825,7 +826,7 @@ public void testAddServerClasses() throws Exception List serverClasses = List.of(context.getServerClasses()); assertThat("Should have environment specific test pattern", serverClasses, hasItem(testPattern)); assertThat("Should have pattern from JaasConfiguration", serverClasses, hasItem("-org.eclipse.jetty.security.jaas.")); - for (String defaultServerClass: WebAppContext.__dftServerClasses) + for (String defaultServerClass: WebappProtectedClasses.DEFAULT_SERVER_CLASSES) assertThat("Should have default patterns", serverClasses, hasItem(defaultServerClass)); } @@ -836,7 +837,7 @@ public void testAddSystemClasses() throws Exception String testPattern = "org.eclipse.jetty.ee10.webapp.test."; - WebAppContext.addSystemClasses(testPattern); + WebAppContext.addSystemClasses(server, testPattern); WebAppContext context = new WebAppContext(); context.setContextPath("/"); @@ -849,7 +850,7 @@ public void testAddSystemClasses() throws Exception List systemClasses = List.of(context.getSystemClasses()); assertThat("Should have environment specific test pattern", systemClasses, hasItem(testPattern)); assertThat("Should have pattern from JaasConfiguration", systemClasses, hasItem("org.eclipse.jetty.security.jaas.")); - for (String defaultSystemClass: WebAppContext.__dftSystemClasses) + for (String defaultSystemClass: WebappProtectedClasses.DEFAULT_SYSTEM_CLASSES) assertThat("Should have default patterns", systemClasses, hasItem(defaultSystemClass)); } } diff --git a/jetty-ee8/jetty-ee8-maven-plugin/src/it/jetty-cdi-start-forked/src/main/jetty/jetty-context.xml b/jetty-ee8/jetty-ee8-maven-plugin/src/it/jetty-cdi-start-forked/src/main/jetty/jetty-context.xml index c250a8892385..f7b99769fd8d 100644 --- a/jetty-ee8/jetty-ee8-maven-plugin/src/it/jetty-cdi-start-forked/src/main/jetty/jetty-context.xml +++ b/jetty-ee8/jetty-ee8-maven-plugin/src/it/jetty-cdi-start-forked/src/main/jetty/jetty-context.xml @@ -6,7 +6,7 @@ - + -org.eclipse.jetty.util.Decorator diff --git a/jetty-ee8/jetty-ee8-webapp/src/main/config/etc/jetty-ee8-webapp.xml b/jetty-ee8/jetty-ee8-webapp/src/main/config/etc/jetty-ee8-webapp.xml index 8b282630c5df..a39427120d4c 100644 --- a/jetty-ee8/jetty-ee8-webapp/src/main/config/etc/jetty-ee8-webapp.xml +++ b/jetty-ee8/jetty-ee8-webapp/src/main/config/etc/jetty-ee8-webapp.xml @@ -3,6 +3,7 @@ + @@ -11,6 +12,7 @@ + diff --git a/jetty-ee9/jetty-ee9-maven-plugin/src/it/jetty-cdi-start-forked/src/main/jetty/jetty-context.xml b/jetty-ee9/jetty-ee9-maven-plugin/src/it/jetty-cdi-start-forked/src/main/jetty/jetty-context.xml index aad5850fc829..cfc55f41dfb6 100644 --- a/jetty-ee9/jetty-ee9-maven-plugin/src/it/jetty-cdi-start-forked/src/main/jetty/jetty-context.xml +++ b/jetty-ee9/jetty-ee9-maven-plugin/src/it/jetty-cdi-start-forked/src/main/jetty/jetty-context.xml @@ -6,7 +6,7 @@ - + -org.eclipse.jetty.util.Decorator diff --git a/jetty-ee9/jetty-ee9-webapp/pom.xml b/jetty-ee9/jetty-ee9-webapp/pom.xml index 7d324f96f3ca..31c6a9e80bf4 100644 --- a/jetty-ee9/jetty-ee9-webapp/pom.xml +++ b/jetty-ee9/jetty-ee9-webapp/pom.xml @@ -21,6 +21,10 @@ org.eclipse.jetty jetty-xml + + org.eclipse.jetty + jetty-ee + org.eclipse.jetty.ee9 jetty-ee9-servlet diff --git a/jetty-ee9/jetty-ee9-webapp/src/main/config/etc/jetty-ee9-webapp.xml b/jetty-ee9/jetty-ee9-webapp/src/main/config/etc/jetty-ee9-webapp.xml index ae9d7520685e..cf77f66b8cf2 100644 --- a/jetty-ee9/jetty-ee9-webapp/src/main/config/etc/jetty-ee9-webapp.xml +++ b/jetty-ee9/jetty-ee9-webapp/src/main/config/etc/jetty-ee9-webapp.xml @@ -2,7 +2,8 @@ - + + @@ -10,7 +11,8 @@ - + + diff --git a/jetty-ee9/jetty-ee9-webapp/src/main/java/module-info.java b/jetty-ee9/jetty-ee9-webapp/src/main/java/module-info.java index 1d9d3fa8b22c..6a249f98de03 100644 --- a/jetty-ee9/jetty-ee9-webapp/src/main/java/module-info.java +++ b/jetty-ee9/jetty-ee9-webapp/src/main/java/module-info.java @@ -32,6 +32,7 @@ requires transitive java.instrument; requires transitive org.eclipse.jetty.ee9.servlet; requires transitive org.eclipse.jetty.xml; + requires transitive org.eclipse.jetty.ee; exports org.eclipse.jetty.ee9.webapp; diff --git a/jetty-ee9/jetty-ee9-webapp/src/main/java/org/eclipse/jetty/ee9/webapp/ClassMatcher.java b/jetty-ee9/jetty-ee9-webapp/src/main/java/org/eclipse/jetty/ee9/webapp/ClassMatcher.java new file mode 100644 index 000000000000..057e7f914013 --- /dev/null +++ b/jetty-ee9/jetty-ee9-webapp/src/main/java/org/eclipse/jetty/ee9/webapp/ClassMatcher.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 org.eclipse.jetty.ee9.webapp; + +/** + * @deprecated Use org.eclipse.jetty.util.ClassMatcher + */ + +@Deprecated(since = "12.0.8", forRemoval = true) +public class ClassMatcher extends org.eclipse.jetty.util.ClassMatcher +{ + public ClassMatcher() + { + super(); + } + + public ClassMatcher(org.eclipse.jetty.util.ClassMatcher patterns) + { + super(patterns); + } + + public ClassMatcher(String... patterns) + { + super(patterns); + } + + public ClassMatcher(String pattern) + { + super(pattern); + } +} diff --git a/jetty-ee9/jetty-ee9-webapp/src/main/java/org/eclipse/jetty/ee9/webapp/WebAppContext.java b/jetty-ee9/jetty-ee9-webapp/src/main/java/org/eclipse/jetty/ee9/webapp/WebAppContext.java index 0fbfc1ef1c23..8116ca25f7d6 100644 --- a/jetty-ee9/jetty-ee9-webapp/src/main/java/org/eclipse/jetty/ee9/webapp/WebAppContext.java +++ b/jetty-ee9/jetty-ee9-webapp/src/main/java/org/eclipse/jetty/ee9/webapp/WebAppContext.java @@ -40,6 +40,7 @@ import jakarta.servlet.http.HttpSessionBindingListener; import jakarta.servlet.http.HttpSessionIdListener; import jakarta.servlet.http.HttpSessionListener; +import org.eclipse.jetty.ee.WebappProtectedClasses; import org.eclipse.jetty.ee9.nested.ContextHandler; import org.eclipse.jetty.ee9.nested.ErrorHandler; import org.eclipse.jetty.ee9.nested.HandlerWrapper; @@ -55,7 +56,6 @@ import org.eclipse.jetty.server.Deployable; import org.eclipse.jetty.server.Handler; import org.eclipse.jetty.server.Server; -import org.eclipse.jetty.util.Attributes; import org.eclipse.jetty.util.ClassMatcher; import org.eclipse.jetty.util.ExceptionUtil; import org.eclipse.jetty.util.IO; @@ -91,32 +91,25 @@ public class WebAppContext extends ServletContextHandler implements WebAppClassL public static final String WEB_DEFAULTS_XML = "org/eclipse/jetty/ee9/webapp/webdefault-ee9.xml"; public static final String ERROR_PAGE = "org.eclipse.jetty.server.error_page"; - public static final String SERVER_SYS_CLASSES = "org.eclipse.jetty.ee9.webapp.systemClasses"; - public static final String SERVER_SRV_CLASSES = "org.eclipse.jetty.ee9.webapp.serverClasses"; - - private static String[] __dftProtectedTargets = {"/WEB-INF", "/META-INF"}; - - // System classes are classes that cannot be replaced by - // the web application, and they are *always* loaded via - // system classloader. - public static final ClassMatcher __dftSystemClasses = new ClassMatcher( - "java.", // Java SE classes (per servlet spec v2.5 / SRV.9.7.2) - "javax.", // Java SE classes (per servlet spec v2.5 / SRV.9.7.2) - "jakarta.", // Jakarta classes (per servlet spec v5.0 / Section 15.2.1) - "org.xml.", // javax.xml - "org.w3c." // javax.xml - ); - - // Server classes are classes that are hidden from being - // loaded by the web application using system classloader, - // so if web application needs to load any of such classes, - // it has to include them in its distribution. - public static final ClassMatcher __dftServerClasses = new ClassMatcher( - "org.eclipse.jetty." // hide jetty classes - ); - - private final ClassMatcher _systemClasses = new ClassMatcher(__dftSystemClasses); - private final ClassMatcher _serverClasses = new ClassMatcher(__dftServerClasses); + public static final String SERVER_SYS_CLASSES = WebappProtectedClasses.SYSTEM_CLASSES_ATTRIBUTE; + public static final String SERVER_SRV_CLASSES = WebappProtectedClasses.SERVER_CLASSES_ATTRIBUTE; + + private static final String[] __dftProtectedTargets = {"/WEB-INF", "/META-INF"}; + + /** + * @deprecated use {@link WebappProtectedClasses#DEFAULT_SYSTEM_CLASSES} + */ + @Deprecated + public static final ClassMatcher __dftSystemClasses = WebappProtectedClasses.DEFAULT_SYSTEM_CLASSES; + + /** + * @deprecated use {@link WebappProtectedClasses#DEFAULT_SERVER_CLASSES} + */ + @Deprecated + public static final ClassMatcher __dftServerClasses = WebappProtectedClasses.DEFAULT_SERVER_CLASSES; + + private final ClassMatcher _systemClasses = new ClassMatcher(WebappProtectedClasses.getSystemClasses(ServletContextHandler.ENVIRONMENT)); + private final ClassMatcher _serverClasses = new ClassMatcher(WebappProtectedClasses.getServerClasses(ServletContextHandler.ENVIRONMENT)); private Configurations _configurations; private String _defaultsDescriptor = WEB_DEFAULTS_XML; @@ -779,23 +772,8 @@ public void setServer(Server server) super.setServer(server); if (server != null) { - if (__dftSystemClasses.equals(_systemClasses)) - { - Object systemClasses = ServletContextHandler.ENVIRONMENT.getAttribute(SERVER_SYS_CLASSES); - if (systemClasses instanceof String[] patterns) - _systemClasses.add(patterns); - if (systemClasses instanceof ClassMatcher classMatcher) - _systemClasses.add(classMatcher.getPatterns()); - } - - if (__dftServerClasses.equals(_serverClasses)) - { - Object serverClasses = ServletContextHandler.ENVIRONMENT.getAttribute(SERVER_SRV_CLASSES); - if (serverClasses instanceof String[] patterns) - _serverClasses.add(patterns); - if (serverClasses instanceof ClassMatcher classMatcher) - _serverClasses.add(classMatcher.getPatterns()); - } + _systemClasses.add(WebappProtectedClasses.getSystemClasses(server).getPatterns()); + _serverClasses.add(WebappProtectedClasses.getServerClasses(server).getPatterns()); } } @@ -1493,75 +1471,29 @@ public MetaData getMetaData() /** * Add a Server Class pattern to use for all ee9 WebAppContexts. + * @param server The {@link Server} instance to add classes to * @param patterns the patterns to use * @see #getServerClassMatcher() * @see #getServerClasses() - */ - public static void addServerClasses(String... patterns) - { - if (LOG.isDebugEnabled()) - LOG.debug("Adding {} ServerClasses: {}", ServletContextHandler.ENVIRONMENT, String.join(", ", patterns)); - addClasses(__dftServerClasses, SERVER_SRV_CLASSES, patterns); - } - - /** - * @param attributes ignored. - * @param patterns the patterns to add - * @deprecated use {@link #addServerClasses(String...)} instead. will be removed in Jetty 12.1.0 + * @deprecated use {@link WebappProtectedClasses#addSystemClasses(Server, String...)} */ @Deprecated(since = "12.0.8", forRemoval = true) - public static void addServerClasses(Attributes attributes, String... patterns) + public static void addServerClasses(Server server, String... patterns) { - addServerClasses(patterns); + WebappProtectedClasses.addServerClasses(server, patterns); } /** * Add a System Class pattern to use for all ee9 WebAppContexts. + * @param server The {@link Server} instance to add classes to * @param patterns the patterns to use * @see #getSystemClassMatcher() * @see #getSystemClasses() - */ - public static void addSystemClasses(String... patterns) - { - if (LOG.isDebugEnabled()) - LOG.debug("Adding {} SystemClasses: {}", ServletContextHandler.ENVIRONMENT, String.join(", ", patterns)); - - addClasses(__dftSystemClasses, SERVER_SYS_CLASSES, patterns); - } - - /** - * @param attributes ignored. - * @param patterns the patterns to add - * @deprecated use {@link #addSystemClasses(String...)} instead. will be removed in Jetty 12.1.0 + * @deprecated use {@link WebappProtectedClasses#addServerClasses(Server, String...)} */ @Deprecated(since = "12.0.8", forRemoval = true) - public static void addSystemClasses(Attributes attributes, String... patterns) + public static void addSystemClasses(Server server, String... patterns) { - addSystemClasses(patterns); - } - - private static void addClasses(ClassMatcher matcher, String attributeKey, String... pattern) - { - if (pattern == null || pattern.length == 0) - return; - - // look for a ClassMatcher attribute with the list of Server / System classes - // to apply to every ee9 web application. If not present, use our defaults. - Object o = ServletContextHandler.ENVIRONMENT.getAttribute(attributeKey); - if (o instanceof ClassMatcher) - { - ((ClassMatcher)o).add(pattern); - return; - } - - String[] classes; - if (o instanceof String[]) - classes = (String[])o; - else - classes = matcher.getPatterns(); - int l = classes.length; - classes = Arrays.copyOf(classes, l + pattern.length); - System.arraycopy(pattern, 0, classes, l, pattern.length); - ServletContextHandler.ENVIRONMENT.setAttribute(attributeKey, classes); + WebappProtectedClasses.addSystemClasses(server, patterns); } } diff --git a/jetty-ee9/jetty-ee9-webapp/src/test/java/org/eclipse/jetty/ee9/webapp/WebAppContextTest.java b/jetty-ee9/jetty-ee9-webapp/src/test/java/org/eclipse/jetty/ee9/webapp/WebAppContextTest.java index 6fb1573785ba..7fd398b9a960 100644 --- a/jetty-ee9/jetty-ee9-webapp/src/test/java/org/eclipse/jetty/ee9/webapp/WebAppContextTest.java +++ b/jetty-ee9/jetty-ee9-webapp/src/test/java/org/eclipse/jetty/ee9/webapp/WebAppContextTest.java @@ -813,7 +813,7 @@ public void testAddServerClasses() throws Exception String testPattern = "org.eclipse.jetty.ee9.webapp.test."; - WebAppContext.addServerClasses(testPattern); + WebAppContext.addServerClasses(server, testPattern); WebAppContext context = new WebAppContext(); context.setContextPath("/"); @@ -837,7 +837,7 @@ public void testAddSystemClasses() throws Exception String testPattern = "org.eclipse.jetty.ee9.webapp.test."; - WebAppContext.addSystemClasses(testPattern); + WebAppContext.addSystemClasses(server, testPattern); WebAppContext context = new WebAppContext(); context.setContextPath("/"); From eb1c207879cde7b4d70899682936cae7ebff0c7d Mon Sep 17 00:00:00 2001 From: gregw Date: Mon, 25 Mar 2024 08:49:54 +0100 Subject: [PATCH 06/28] System Server Classes --- jetty-core/jetty-ee/pom.xml | 4 ---- .../src/main/config/etc/jetty-ee-webapp.xml | 23 +++++++++++++++++++ 2 files changed, 23 insertions(+), 4 deletions(-) create mode 100644 jetty-core/jetty-ee/src/main/config/etc/jetty-ee-webapp.xml diff --git a/jetty-core/jetty-ee/pom.xml b/jetty-core/jetty-ee/pom.xml index 288b73e2a2ca..4e7e3c7d0918 100644 --- a/jetty-core/jetty-ee/pom.xml +++ b/jetty-core/jetty-ee/pom.xml @@ -48,10 +48,6 @@ org.apache.felix maven-bundle-plugin true - - - - org.apache.maven.plugins diff --git a/jetty-core/jetty-ee/src/main/config/etc/jetty-ee-webapp.xml b/jetty-core/jetty-ee/src/main/config/etc/jetty-ee-webapp.xml new file mode 100644 index 000000000000..639f268261ad --- /dev/null +++ b/jetty-core/jetty-ee/src/main/config/etc/jetty-ee-webapp.xml @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + + + + + + + + From 8b46ea20bcb66f766aecf1bf4d6f0703866a2fc5 Mon Sep 17 00:00:00 2001 From: gregw Date: Mon, 25 Mar 2024 09:10:41 +0100 Subject: [PATCH 07/28] System Server Classes --- .../src/main/config/modules/ee-webapp.mod | 31 +++++++++++++++++++ jetty-core/pom.xml | 2 +- jetty-ee10/jetty-ee10-webapp/pom.xml | 6 ++-- .../src/main/config/modules/ee10-webapp.mod | 3 +- jetty-ee8/jetty-ee8-webapp/pom.xml | 4 +++ .../src/main/config/modules/ee8-webapp.mod | 3 +- jetty-ee9/jetty-ee9-webapp/pom.xml | 4 +-- .../src/main/config/modules/ee9-webapp.mod | 3 +- jetty-home/pom.xml | 4 +++ 9 files changed, 51 insertions(+), 9 deletions(-) create mode 100644 jetty-core/jetty-ee/src/main/config/modules/ee-webapp.mod diff --git a/jetty-core/jetty-ee/src/main/config/modules/ee-webapp.mod b/jetty-core/jetty-ee/src/main/config/modules/ee-webapp.mod new file mode 100644 index 000000000000..a9954b98edc6 --- /dev/null +++ b/jetty-core/jetty-ee/src/main/config/modules/ee-webapp.mod @@ -0,0 +1,31 @@ +# DO NOT EDIT THIS FILE - See: https://eclipse.dev/jetty/documentation/ + +[description] +# tag::description[] +This module provide common configuration of Java Servlet web applications over all environments. +# end::description[] + +[xml] +etc/jetty-ee-webapp.xml + +[lib] +lib/jetty-ee-webapp-${jetty.version}.jar + +[ini-template] +# tag::ini-template[] +## Add to the server wide default jars and packages protected or hidden from webapps. +## System classes are protected and cannot be overridden by a webapp. +## Server classes are hidden and cannot be seen by a webapp +## Lists of patterns are comma separated and may be either: +## + a qualified classname e.g. 'com.acme.Foo' +## + a package name e.g. 'net.example.' +## + a jar file e.g. '${jetty.base.uri}/lib/dependency.jar' +## + a directory of jars,resource or classes e.g. '${jetty.base.uri}/resources' +## + A pattern preceded with a '-' is an exclusion, all other patterns are inclusions +## +## The +=, operator appends to a CSV list with a comma as needed. +## +#jetty.server.addSystemClasses+=,org.example. +#jetty.server.addServerClasses+=,org.example. +# end::ini-template[] + diff --git a/jetty-core/pom.xml b/jetty-core/pom.xml index 523d8bb1ef49..a35300f8e20d 100644 --- a/jetty-core/pom.xml +++ b/jetty-core/pom.xml @@ -17,6 +17,7 @@ jetty-client jetty-demos jetty-deploy + jetty-ee jetty-fcgi jetty-http jetty-http-spi @@ -44,7 +45,6 @@ jetty-util-ajax jetty-websocket jetty-xml - jetty-ee diff --git a/jetty-ee10/jetty-ee10-webapp/pom.xml b/jetty-ee10/jetty-ee10-webapp/pom.xml index efed17695f85..7d99a576daf8 100644 --- a/jetty-ee10/jetty-ee10-webapp/pom.xml +++ b/jetty-ee10/jetty-ee10-webapp/pom.xml @@ -19,15 +19,15 @@ org.eclipse.jetty - jetty-session + jetty-ee org.eclipse.jetty - jetty-xml + jetty-session org.eclipse.jetty - jetty-ee + jetty-xml org.eclipse.jetty.ee10 diff --git a/jetty-ee10/jetty-ee10-webapp/src/main/config/modules/ee10-webapp.mod b/jetty-ee10/jetty-ee10-webapp/src/main/config/modules/ee10-webapp.mod index 298e6b98ef17..0778b27b0a17 100644 --- a/jetty-ee10/jetty-ee10-webapp/src/main/config/modules/ee10-webapp.mod +++ b/jetty-ee10/jetty-ee10-webapp/src/main/config/modules/ee10-webapp.mod @@ -9,6 +9,7 @@ This module enables deployment of Java Servlet web applications. ee10 [depend] +ee-webapp ee10-servlet ee10-security @@ -20,7 +21,7 @@ lib/jetty-ee10-webapp-${jetty.version}.jar [ini-template] # tag::ini-template[] -## Add to the server wide default jars and packages protected or hidden from webapps. +## Add to the environment wide default jars and packages protected or hidden from webapps. ## System classes are protected and cannot be overridden by a webapp. ## Server classes are hidden and cannot be seen by a webapp ## Lists of patterns are comma separated and may be either: diff --git a/jetty-ee8/jetty-ee8-webapp/pom.xml b/jetty-ee8/jetty-ee8-webapp/pom.xml index 68204f217efb..bfec795d88a8 100644 --- a/jetty-ee8/jetty-ee8-webapp/pom.xml +++ b/jetty-ee8/jetty-ee8-webapp/pom.xml @@ -18,6 +18,10 @@ + + org.eclipse.jetty + jetty-ee + org.eclipse.jetty jetty-xml diff --git a/jetty-ee8/jetty-ee8-webapp/src/main/config/modules/ee8-webapp.mod b/jetty-ee8/jetty-ee8-webapp/src/main/config/modules/ee8-webapp.mod index b4a2f2fef2d3..6e816604b80a 100644 --- a/jetty-ee8/jetty-ee8-webapp/src/main/config/modules/ee8-webapp.mod +++ b/jetty-ee8/jetty-ee8-webapp/src/main/config/modules/ee8-webapp.mod @@ -8,6 +8,7 @@ Without this, only Jetty-specific handlers may be deployed. ee8 [depend] +ee-webapp ee8-servlet ee8-security @@ -18,7 +19,7 @@ etc/jetty-ee8-webapp.xml lib/jetty-ee8-webapp-${jetty.version}.jar [ini-template] -## Add to the server wide default jars and packages protected or hidden from webapps. +## Add to the environment wide default jars and packages protected or hidden from webapps. ## System classes are protected and cannot be overridden by a webapp. ## Server classes are hidden and cannot be seen by a webapp ## Lists of patterns are comma separated and may be either: diff --git a/jetty-ee9/jetty-ee9-webapp/pom.xml b/jetty-ee9/jetty-ee9-webapp/pom.xml index 31c6a9e80bf4..67619c3e6fd4 100644 --- a/jetty-ee9/jetty-ee9-webapp/pom.xml +++ b/jetty-ee9/jetty-ee9-webapp/pom.xml @@ -19,11 +19,11 @@ org.eclipse.jetty - jetty-xml + jetty-ee org.eclipse.jetty - jetty-ee + jetty-xml org.eclipse.jetty.ee9 diff --git a/jetty-ee9/jetty-ee9-webapp/src/main/config/modules/ee9-webapp.mod b/jetty-ee9/jetty-ee9-webapp/src/main/config/modules/ee9-webapp.mod index 37e3a46627fa..2d13db53edba 100644 --- a/jetty-ee9/jetty-ee9-webapp/src/main/config/modules/ee9-webapp.mod +++ b/jetty-ee9/jetty-ee9-webapp/src/main/config/modules/ee9-webapp.mod @@ -8,6 +8,7 @@ Without this, only Jetty-specific handlers may be deployed. ee9 [depend] +ee-webapp ee9-servlet ee9-security @@ -18,7 +19,7 @@ etc/jetty-ee9-webapp.xml lib/jetty-ee9-webapp-${jetty.version}.jar [ini-template] -## Add to the server wide default jars and packages protected or hidden from webapps. +## Add to the environment wide default jars and packages protected or hidden from webapps. ## System classes are protected and cannot be overridden by a webapp. ## Server classes are hidden and cannot be seen by a webapp ## Lists of patterns are comma separated and may be either: diff --git a/jetty-home/pom.xml b/jetty-home/pom.xml index 4f2a0a4b8b97..369d9c7deb77 100644 --- a/jetty-home/pom.xml +++ b/jetty-home/pom.xml @@ -39,6 +39,10 @@ org.eclipse.jetty jetty-deploy + + org.eclipse.jetty + jetty-ee + org.eclipse.jetty jetty-hazelcast From 01f2903cde8a87c9f35e4a81dec897cc9bed1154 Mon Sep 17 00:00:00 2001 From: gregw Date: Mon, 25 Mar 2024 13:26:47 +0100 Subject: [PATCH 08/28] System Server Classes Renaming to Hidden/Protected --- .../src/main/config/etc/jetty-ee-webapp.xml | 8 +- .../src/main/config/modules/ee-webapp.mod | 8 +- .../eclipse/jetty/ee/WebappClassLoading.java | 181 ++++++++++++++ .../jetty/ee/WebappProtectedClasses.java | 129 ---------- .../src/main/config/modules/test-keystore.mod | 2 +- .../eclipse/jetty/session/SessionData.java | 2 +- .../jetty/util/ClassVisibilityChecker.java | 4 +- .../jetty/ee10/demos/ProxyWebAppTest.java | 2 +- .../webapp/PlusDescriptorProcessorTest.java | 2 +- .../jetty/ee10/quickstart/TestQuickStart.java | 8 +- .../ee10/cdi/tests/EmbeddedWeldTest.java | 9 +- .../src/main/config/etc/jetty-ee10-webapp.xml | 8 +- .../src/main/config/modules/ee10-webapp.mod | 8 +- .../jetty/ee10/webapp/WebAppClassLoader.java | 32 +-- .../jetty/ee10/webapp/WebAppContext.java | 232 +++++++++++++----- .../ee10/webapp/WebAppClassLoaderTest.java | 44 ++-- .../jetty/ee10/webapp/WebAppContextTest.java | 10 +- .../src/main/config/etc/jetty-ee8-webapp.xml | 4 +- .../src/main/config/modules/ee8-webapp.mod | 8 +- .../src/main/config/etc/jetty-ee9-webapp.xml | 8 +- .../src/main/config/modules/ee9-webapp.mod | 8 +- .../jetty/ee9/webapp/WebAppClassLoader.java | 16 +- .../jetty/ee9/webapp/WebAppContext.java | 34 +-- .../main/resources/modules/logging-jetty.mod | 4 +- .../main/resources/modules/logging-log4j1.mod | 2 +- .../main/resources/modules/logging-log4j2.mod | 2 +- .../resources/modules/logging-logback.mod | 2 +- .../main/resources/modules/logging/slf4j.mod | 2 +- .../main/config-template/modules/gcloud.mod | 2 +- .../infinispan-embedded-serverclasses.mod | 2 +- .../infinispan-remote-serverclasses.mod | 2 +- 31 files changed, 473 insertions(+), 312 deletions(-) create mode 100644 jetty-core/jetty-ee/src/main/java/org/eclipse/jetty/ee/WebappClassLoading.java delete mode 100644 jetty-core/jetty-ee/src/main/java/org/eclipse/jetty/ee/WebappProtectedClasses.java diff --git a/jetty-core/jetty-ee/src/main/config/etc/jetty-ee-webapp.xml b/jetty-core/jetty-ee/src/main/config/etc/jetty-ee-webapp.xml index 639f268261ad..cb3442903c70 100644 --- a/jetty-core/jetty-ee/src/main/config/etc/jetty-ee-webapp.xml +++ b/jetty-core/jetty-ee/src/main/config/etc/jetty-ee-webapp.xml @@ -2,20 +2,20 @@ - + - + - + - + diff --git a/jetty-core/jetty-ee/src/main/config/modules/ee-webapp.mod b/jetty-core/jetty-ee/src/main/config/modules/ee-webapp.mod index a9954b98edc6..b9f62c4ad48c 100644 --- a/jetty-core/jetty-ee/src/main/config/modules/ee-webapp.mod +++ b/jetty-core/jetty-ee/src/main/config/modules/ee-webapp.mod @@ -14,8 +14,8 @@ lib/jetty-ee-webapp-${jetty.version}.jar [ini-template] # tag::ini-template[] ## Add to the server wide default jars and packages protected or hidden from webapps. -## System classes are protected and cannot be overridden by a webapp. -## Server classes are hidden and cannot be seen by a webapp +## Protected (aka System) classes cannot be overridden by a webapp. +## Hidden (aka Server) classes cannot be seen by a webapp ## Lists of patterns are comma separated and may be either: ## + a qualified classname e.g. 'com.acme.Foo' ## + a package name e.g. 'net.example.' @@ -25,7 +25,7 @@ lib/jetty-ee-webapp-${jetty.version}.jar ## ## The +=, operator appends to a CSV list with a comma as needed. ## -#jetty.server.addSystemClasses+=,org.example. -#jetty.server.addServerClasses+=,org.example. +#jetty.server.addProtectedClasses+=,org.example. +#jetty.server.addHiddenClasses+=,org.example. # end::ini-template[] diff --git a/jetty-core/jetty-ee/src/main/java/org/eclipse/jetty/ee/WebappClassLoading.java b/jetty-core/jetty-ee/src/main/java/org/eclipse/jetty/ee/WebappClassLoading.java new file mode 100644 index 000000000000..2b1fb5d6b7bc --- /dev/null +++ b/jetty-core/jetty-ee/src/main/java/org/eclipse/jetty/ee/WebappClassLoading.java @@ -0,0 +1,181 @@ +package org.eclipse.jetty.ee; + +import org.eclipse.jetty.server.Server; +import org.eclipse.jetty.util.Attributes; +import org.eclipse.jetty.util.ClassMatcher; +import org.eclipse.jetty.util.component.Environment; + +/** + * Common attributes and methods for configuring the {@link ClassLoader Class loading} of web application: + *
    + *
  • Protected (a.k.a. System) classes are classes typically provided by the JVM, that cannot be replaced by the + * web application, and they are always loaded via the environment or system classloader. They are visible but + * protected.
  • + *
  • Hidden (a.k.a. Server) classes are those used to implement the Server and are not made available to the + * web application. They are hidden from the web application {@link ClassLoader}.
  • + *
+ *

These protections are set to reasonable defaults {@link #DEFAULT_PROTECTED_CLASSES} and {@link #DEFAULT_HIDDEN_CLASSES}, + * which may be programmatically configured and will affect the defaults applied to all web applications in the same JVM. + * + *

+ * The defaults applied by a specific {@link Server} can be configured using {@link #addProtectedClasses(Server, String...)} and + * {@link #addHiddenClasses(Server, String...)}. Alternately the {@link Server} attributes {@link #PROTECTED_CLASSES_ATTRIBUTE} + * and {@link #HIDDEN_CLASSES_ATTRIBUTE} may be used to direct set a {@link ClassMatcher} to use for all web applications + * within the server instance. + *

+ *

+ * The defaults applied by a specific {@link Environment} can be configured using {@link #addProtectedClasses(Environment, String...)} and + * {@link #addHiddenClasses(Environment, String...)}. Alternately the {@link Environment} attributes {@link #PROTECTED_CLASSES_ATTRIBUTE} + * and {@link #HIDDEN_CLASSES_ATTRIBUTE} may be used to direct set a {@link ClassMatcher} to use for all web applications + * within the server instance. + *

+ *

+ * Ultimately, the configurations set by this class only affects the defaults applied to each web application + * {@link org.eclipse.jetty.server.handler.ContextHandler Context} and the {@link ClassMatcher} fields of the web applications + * can be directly access to configure a specific context. + *

+ */ +public class WebappClassLoading +{ + public static final String PROTECTED_CLASSES_ATTRIBUTE = "org.eclipse.jetty.webapp.systemClasses"; + public static final String HIDDEN_CLASSES_ATTRIBUTE = "org.eclipse.jetty.webapp.serverClasses"; + + /** + * The default protected (system) classes used by a web application, which can be overridden by {@link Server}, + * {@link Environment} or {@link org.eclipse.jetty.server.handler.ContextHandler Context} configuration. + */ + public static final ClassMatcher DEFAULT_PROTECTED_CLASSES = new ClassMatcher( + "java.", // Java SE classes (per servlet spec v2.5 / SRV.9.7.2) + "javax.", // Java SE classes (per servlet spec v2.5 / SRV.9.7.2) + "jakarta.", // Jakarta classes (per servlet spec v5.0 / Section 15.2.1) + "org.xml.", // javax.xml + "org.w3c." // javax.xml + ); + + /** + * The default hidden (server) classes used by a web application, which can be overridden by {@link Server}, + * {@link Environment} or {@link org.eclipse.jetty.server.handler.ContextHandler Context} configuration. + */ + public static final ClassMatcher DEFAULT_HIDDEN_CLASSES = new ClassMatcher( + "org.eclipse.jetty." // hide jetty classes + ); + + /** + * Get the default protected (system) classes for a {@link Server} + * @param server The {@link Server} for the defaults + * @return The default protected (system) classes for the {@link Server}, which will be the {@link #DEFAULT_PROTECTED_CLASSES} if not previously configured. + */ + public static ClassMatcher getProtectedClasses(Server server) + { + return getClassMatcher(server, PROTECTED_CLASSES_ATTRIBUTE, null); + } + + /** + * Get the default protected (system) classes for an {@link Environment} + * @param environment The {@link Server} for the defaults + * @return The default protected (system) classes for the {@link Environment}, which will be empty if not previously configured. + */ + public static ClassMatcher getProtectedClasses(Environment environment) + { + return getClassMatcher(environment, PROTECTED_CLASSES_ATTRIBUTE, null); + } + + /** + * Add a protected (system) Class pattern to use for all WebAppContexts. + * @param patterns the patterns to use + */ + public static void addProtectedClasses(String... patterns) + { + DEFAULT_PROTECTED_CLASSES.add(patterns); + } + + /** + * Add a protected (system) Class pattern to use for all WebAppContexts of a given {@link Server}. + * @param server The {@link Server} instance to add classes to + * @param patterns the patterns to use + */ + public static void addProtectedClasses(Server server, String... patterns) + { + addClasses(server, PROTECTED_CLASSES_ATTRIBUTE, DEFAULT_PROTECTED_CLASSES, patterns); + } + + /** + * Add a protected (system) Class pattern to use for WebAppContexts of a given environment. + * @param environment The {@link Environment} instance to add classes to + * @param patterns the patterns to use + */ + public static void addProtectedClasses(Environment environment, String... patterns) + { + addClasses(environment, PROTECTED_CLASSES_ATTRIBUTE, DEFAULT_PROTECTED_CLASSES, patterns); + } + + /** + * Get the default hidden (server) classes for a {@link Server} + * @param server The {@link Server} for the defaults + * @return The default hidden (server) classes for the {@link Server}, which will be the + * {@link #DEFAULT_PROTECTED_CLASSES} if not previously configured. + */ + public static ClassMatcher getHiddenClasses(Server server) + { + return getClassMatcher(server, HIDDEN_CLASSES_ATTRIBUTE, DEFAULT_HIDDEN_CLASSES); + } + + /** + * Get the default hidden (server) classes for an {@link Environment} + * @param environment The {@link Server} for the defaults + * @return The default hidden (server) classes for the {@link Environment}, which will be empty if not previously configured. + */ + public static ClassMatcher getHiddenClasses(Environment environment) + { + return getClassMatcher(environment, HIDDEN_CLASSES_ATTRIBUTE, DEFAULT_HIDDEN_CLASSES); + } + + /** + * Add a hidden (server) Class pattern to use for all WebAppContexts of a given {@link Server}. + * @param patterns the patterns to use + */ + public static void addHiddenClasses(String... patterns) + { + DEFAULT_HIDDEN_CLASSES.add(patterns); + } + + /** + * Add a hidden (server) Class pattern to use for all WebAppContexts of a given {@link Server}. + * @param server The {@link Server} instance to add classes to + * @param patterns the patterns to use + */ + public static void addHiddenClasses(Server server, String... patterns) + { + addClasses(server, HIDDEN_CLASSES_ATTRIBUTE, DEFAULT_HIDDEN_CLASSES, patterns); + } + + /** + * Add a hidden (server) Class pattern to use for all ee9 WebAppContexts. + * @param environment The {@link Environment} instance to add classes to + * @param patterns the patterns to use + */ + public static void addHiddenClasses(Environment environment, String... patterns) + { + addClasses(environment, HIDDEN_CLASSES_ATTRIBUTE, DEFAULT_HIDDEN_CLASSES, patterns); + } + + private static void addClasses(Attributes attributes, String attribute, ClassMatcher defaultPatterns, String... patterns) + { + ClassMatcher classMatcher = getClassMatcher(attributes, attribute, defaultPatterns); + if (patterns != null && patterns.length > 0) + classMatcher.add(patterns); + } + + private static ClassMatcher getClassMatcher(Attributes attributes, String attribute, ClassMatcher defaultPatterns) + { + Object existing = attributes.getAttribute(attribute); + if (existing instanceof ClassMatcher cm) + return cm; + + ClassMatcher classMatcher = (existing instanceof String[] stringArray) + ? new ClassMatcher(stringArray) : new ClassMatcher(defaultPatterns); + attributes.setAttribute(attribute, classMatcher); + return classMatcher; + } + +} diff --git a/jetty-core/jetty-ee/src/main/java/org/eclipse/jetty/ee/WebappProtectedClasses.java b/jetty-core/jetty-ee/src/main/java/org/eclipse/jetty/ee/WebappProtectedClasses.java deleted file mode 100644 index 74c466db5bb5..000000000000 --- a/jetty-core/jetty-ee/src/main/java/org/eclipse/jetty/ee/WebappProtectedClasses.java +++ /dev/null @@ -1,129 +0,0 @@ -package org.eclipse.jetty.ee; - -import org.eclipse.jetty.server.Server; -import org.eclipse.jetty.util.Attributes; -import org.eclipse.jetty.util.ClassMatcher; -import org.eclipse.jetty.util.component.Environment; - -public class WebappProtectedClasses -{ - public static final String SYSTEM_CLASSES_ATTRIBUTE = "org.eclipse.jetty.webapp.systemClasses"; - public static final String SERVER_CLASSES_ATTRIBUTE = "org.eclipse.jetty.webapp.serverClasses"; - - // System classes are classes that cannot be replaced by - // the web application, and they are *always* loaded via - // system classloader. - public static final ClassMatcher DEFAULT_SYSTEM_CLASSES = new ClassMatcher( - "java.", // Java SE classes (per servlet spec v2.5 / SRV.9.7.2) - "javax.", // Java SE classes (per servlet spec v2.5 / SRV.9.7.2) - "jakarta.", // Jakarta classes (per servlet spec v5.0 / Section 15.2.1) - "org.xml.", // javax.xml - "org.w3c." // javax.xml - ); - - // Server classes are classes that are hidden from being - // loaded by the web application using system classloader, - // so if web application needs to load any of such classes, - // it has to include them in its distribution. - public static final ClassMatcher DEFAULT_SERVER_CLASSES = new ClassMatcher( - "org.eclipse.jetty." // hide jetty classes - ); - - public static ClassMatcher getSystemClasses(Server server) - { - return getClassMatcher(server, SYSTEM_CLASSES_ATTRIBUTE, null); - } - - public static ClassMatcher getSystemClasses(Environment environment) - { - return getClassMatcher(environment, SYSTEM_CLASSES_ATTRIBUTE, null); - } - - /** - * Add a System Class pattern to use for all WebAppContexts. - * @param patterns the patterns to use - */ - public static void addSystemClasses(String... patterns) - { - DEFAULT_SYSTEM_CLASSES.add(patterns); - } - - /** - * Add a System Class pattern to use for all WebAppContexts of a given {@link Server}. - * @param server The {@link Server} instance to add classes to - * @param patterns the patterns to use - */ - public static void addSystemClasses(Server server, String... patterns) - { - addClasses(server, SYSTEM_CLASSES_ATTRIBUTE, DEFAULT_SYSTEM_CLASSES, patterns); - } - - /** - * Add a System Class pattern to use for WebAppContexts of a given environment. - * @param environment The {@link Environment} instance to add classes to - * @param patterns the patterns to use - */ - public static void addSystemClasses(Environment environment, String... patterns) - { - addClasses(environment, SYSTEM_CLASSES_ATTRIBUTE, DEFAULT_SYSTEM_CLASSES, patterns); - } - - public static ClassMatcher getServerClasses(Server server) - { - return getClassMatcher(server, SERVER_CLASSES_ATTRIBUTE, DEFAULT_SERVER_CLASSES); - } - - public static ClassMatcher getServerClasses(Environment environment) - { - return getClassMatcher(environment, SERVER_CLASSES_ATTRIBUTE, DEFAULT_SERVER_CLASSES); - } - - /** - * Add a Server Class pattern to use for all WebAppContexts of a given {@link Server}. - * @param patterns the patterns to use - */ - public static void addServerClasses(String... patterns) - { - DEFAULT_SERVER_CLASSES.add(patterns); - } - - /** - * Add a Server Class pattern to use for all WebAppContexts of a given {@link Server}. - * @param server The {@link Server} instance to add classes to - * @param patterns the patterns to use - */ - public static void addServerClasses(Server server, String... patterns) - { - addClasses(server, SERVER_CLASSES_ATTRIBUTE, DEFAULT_SERVER_CLASSES, patterns); - } - - /** - * Add a Server Class pattern to use for all ee9 WebAppContexts. - * @param environment The {@link Environment} instance to add classes to - * @param patterns the patterns to use - */ - public static void addServerClasses(Environment environment, String... patterns) - { - addClasses(environment, SERVER_CLASSES_ATTRIBUTE, DEFAULT_SERVER_CLASSES, patterns); - } - - private static void addClasses(Attributes attributes, String attribute, ClassMatcher defaultPatterns, String... patterns) - { - ClassMatcher classMatcher = getClassMatcher(attributes, attribute, defaultPatterns); - if (patterns != null && patterns.length > 0) - classMatcher.add(patterns); - } - - private static ClassMatcher getClassMatcher(Attributes attributes, String attribute, ClassMatcher defaultPatterns) - { - Object existing = attributes.getAttribute(attribute); - if (existing instanceof ClassMatcher cm) - return cm; - - ClassMatcher classMatcher = (existing instanceof String[] stringArray) - ? new ClassMatcher(stringArray) : new ClassMatcher(defaultPatterns); - attributes.setAttribute(attribute, classMatcher); - return classMatcher; - } - -} diff --git a/jetty-core/jetty-keystore/src/main/config/modules/test-keystore.mod b/jetty-core/jetty-keystore/src/main/config/modules/test-keystore.mod index 0ff1996dbfed..1c1b98fb3dc0 100644 --- a/jetty-core/jetty-keystore/src/main/config/modules/test-keystore.mod +++ b/jetty-core/jetty-keystore/src/main/config/modules/test-keystore.mod @@ -25,7 +25,7 @@ etc/jetty-test-keystore.xml [ini] bouncycastle.version?=@bouncycastle.version@ -jetty.webapp.addServerClasses+=,${jetty.base.uri}/lib/bouncycastle/ +jetty.webapp.addHiddenClasses+=,${jetty.base.uri}/lib/bouncycastle/ jetty.sslContext.keyStorePath?=etc/test-keystore.p12 jetty.sslContext.keyStoreType?=PKCS12 jetty.sslContext.keyStorePassword?=OBF:1vny1zlo1x8e1vnw1vn61x8g1zlu1vn4 diff --git a/jetty-core/jetty-session/src/main/java/org/eclipse/jetty/session/SessionData.java b/jetty-core/jetty-session/src/main/java/org/eclipse/jetty/session/SessionData.java index a5445c76ccac..c33682cb4327 100644 --- a/jetty-core/jetty-session/src/main/java/org/eclipse/jetty/session/SessionData.java +++ b/jetty-core/jetty-session/src/main/java/org/eclipse/jetty/session/SessionData.java @@ -89,7 +89,7 @@ else if (contextLoader instanceof ClassVisibilityChecker) //Clazz not loaded by context classloader, but ask if loadable by context classloader, //because preferable to use context classloader if possible (eg for deep structures). ClassVisibilityChecker checker = (ClassVisibilityChecker)(contextLoader); - isContextLoader = (checker.isSystemClass(clazz) && !(checker.isServerClass(clazz))); + isContextLoader = (checker.isProtectedClass(clazz) && !(checker.isHiddenClass(clazz))); } else { diff --git a/jetty-core/jetty-util/src/main/java/org/eclipse/jetty/util/ClassVisibilityChecker.java b/jetty-core/jetty-util/src/main/java/org/eclipse/jetty/util/ClassVisibilityChecker.java index 3167d9b82d35..a2e170c41a0a 100644 --- a/jetty-core/jetty-util/src/main/java/org/eclipse/jetty/util/ClassVisibilityChecker.java +++ b/jetty-core/jetty-util/src/main/java/org/eclipse/jetty/util/ClassVisibilityChecker.java @@ -31,7 +31,7 @@ public interface ClassVisibilityChecker * @param clazz The fully qualified name of the class. * @return True if the class is a system class. */ - boolean isSystemClass(Class clazz); + boolean isProtectedClass(Class clazz); /** * Is the class a Server Class. @@ -43,5 +43,5 @@ public interface ClassVisibilityChecker * @param clazz The fully qualified name of the class. * @return True if the class is a server class. */ - boolean isServerClass(Class clazz); + boolean isHiddenClass(Class clazz); } diff --git a/jetty-ee10/jetty-ee10-demos/jetty-ee10-demo-proxy-webapp/src/test/java/org/eclipse/jetty/ee10/demos/ProxyWebAppTest.java b/jetty-ee10/jetty-ee10-demos/jetty-ee10-demo-proxy-webapp/src/test/java/org/eclipse/jetty/ee10/demos/ProxyWebAppTest.java index 63562373118a..79390bd4e4b0 100644 --- a/jetty-ee10/jetty-ee10-demos/jetty-ee10-demo-proxy-webapp/src/test/java/org/eclipse/jetty/ee10/demos/ProxyWebAppTest.java +++ b/jetty-ee10/jetty-ee10-demos/jetty-ee10-demo-proxy-webapp/src/test/java/org/eclipse/jetty/ee10/demos/ProxyWebAppTest.java @@ -54,7 +54,7 @@ public void setup() throws Exception // This is a pieced together WebApp. // We don't have a valid WEB-INF/lib to rely on at this point. // So, open up server classes here, for purposes of this testcase. - webapp.getServerClassMatcher().add("-org.eclipse.jetty.ee10.proxy."); + webapp.getHiddenClassMatcher().add("-org.eclipse.jetty.ee10.proxy."); webapp.setWar(MavenTestingUtils.getProjectDirPath("src/main/webapp").toString()); webapp.setExtraClasspath(MavenTestingUtils.getTargetPath().resolve("test-classes").toString()); server.setHandler(webapp); diff --git a/jetty-ee10/jetty-ee10-plus/src/test/java/org/eclipse/jetty/ee10/plus/webapp/PlusDescriptorProcessorTest.java b/jetty-ee10/jetty-ee10-plus/src/test/java/org/eclipse/jetty/ee10/plus/webapp/PlusDescriptorProcessorTest.java index 242e28940db7..b31ce7297a61 100644 --- a/jetty-ee10/jetty-ee10-plus/src/test/java/org/eclipse/jetty/ee10/plus/webapp/PlusDescriptorProcessorTest.java +++ b/jetty-ee10/jetty-ee10-plus/src/test/java/org/eclipse/jetty/ee10/plus/webapp/PlusDescriptorProcessorTest.java @@ -129,7 +129,7 @@ public void setUp() throws Exception context.setConfigurations(new Configuration[]{new PlusConfiguration(), new EnvConfiguration()}); context.preConfigure(); context.setClassLoader(new WebAppClassLoader(Thread.currentThread().getContextClassLoader(), context)); - context.getServerClassMatcher().exclude("org.eclipse.jetty.ee10.plus.webapp."); //need visbility of the TestInjections class + context.getHiddenClassMatcher().exclude("org.eclipse.jetty.ee10.plus.webapp."); //need visbility of the TestInjections class ClassLoader oldLoader = Thread.currentThread().getContextClassLoader(); Thread.currentThread().setContextClassLoader(context.getClassLoader()); Context icontext = new InitialContext(); diff --git a/jetty-ee10/jetty-ee10-quickstart/src/test/java/org/eclipse/jetty/ee10/quickstart/TestQuickStart.java b/jetty-ee10/jetty-ee10-quickstart/src/test/java/org/eclipse/jetty/ee10/quickstart/TestQuickStart.java index 86657db17234..dfc86ee2f001 100644 --- a/jetty-ee10/jetty-ee10-quickstart/src/test/java/org/eclipse/jetty/ee10/quickstart/TestQuickStart.java +++ b/jetty-ee10/jetty-ee10-quickstart/src/test/java/org/eclipse/jetty/ee10/quickstart/TestQuickStart.java @@ -89,7 +89,7 @@ public void testProgrammaticOverrideOfDefaultServletMapping() throws Exception WebAppContext webapp = new WebAppContext(); webapp.setBaseResourceAsPath(testDir.toPath()); webapp.addConfiguration(new QuickStartConfiguration()); - webapp.getServerClassMatcher().exclude("org.eclipse.jetty.ee10.quickstart."); + webapp.getHiddenClassMatcher().exclude("org.eclipse.jetty.ee10.quickstart."); webapp.setAttribute(QuickStartConfiguration.MODE, QuickStartConfiguration.Mode.QUICKSTART); //add in the servlet webapp.getServletHandler().addServlet(fooHolder); @@ -139,7 +139,7 @@ public void testDefaultContextPath() throws Exception webapp.addConfiguration(new QuickStartConfiguration()); webapp.setAttribute(QuickStartConfiguration.MODE, QuickStartConfiguration.Mode.QUICKSTART); webapp.setBaseResourceAsPath(testDir.toPath()); - webapp.getServerClassMatcher().exclude("org.eclipse.jetty.ee10.quickstart."); + webapp.getHiddenClassMatcher().exclude("org.eclipse.jetty.ee10.quickstart."); server.setHandler(webapp); server.setDryRun(false); @@ -180,7 +180,7 @@ public void testDefaultRequestAndResponseEncodings() throws Exception webapp.addConfiguration(new QuickStartConfiguration()); webapp.setAttribute(QuickStartConfiguration.MODE, QuickStartConfiguration.Mode.QUICKSTART); webapp.setBaseResourceAsPath(testDir.toPath()); - webapp.getServerClassMatcher().exclude("org.eclipse.jetty.ee10.quickstart."); + webapp.getHiddenClassMatcher().exclude("org.eclipse.jetty.ee10.quickstart."); server.setHandler(webapp); server.setDryRun(false); @@ -255,7 +255,7 @@ public void testDuplicateGenerationFromContextXml() throws Exception //a freshly applied context xml quickstart = new WebAppContext(); //need visibility of FooServlet, FooFilter, FooContextListener when we quickstart - quickstart.getServerClassMatcher().exclude("org.eclipse.jetty.ee10.quickstart."); + quickstart.getHiddenClassMatcher().exclude("org.eclipse.jetty.ee10.quickstart."); quickstart.addConfiguration(new QuickStartConfiguration()); quickstart.setWar(testDir.toURI().toURL().toExternalForm()); quickstart.setDescriptor(MavenTestingUtils.getTestResourceFile("web.xml").getAbsolutePath()); diff --git a/jetty-ee10/jetty-ee10-tests/jetty-ee10-test-cdi/src/test/java/org/eclipse/jetty/ee10/cdi/tests/EmbeddedWeldTest.java b/jetty-ee10/jetty-ee10-tests/jetty-ee10-test-cdi/src/test/java/org/eclipse/jetty/ee10/cdi/tests/EmbeddedWeldTest.java index 46f0360f371f..c3fa25dfd259 100644 --- a/jetty-ee10/jetty-ee10-tests/jetty-ee10-test-cdi/src/test/java/org/eclipse/jetty/ee10/cdi/tests/EmbeddedWeldTest.java +++ b/jetty-ee10/jetty-ee10-tests/jetty-ee10-test-cdi/src/test/java/org/eclipse/jetty/ee10/cdi/tests/EmbeddedWeldTest.java @@ -29,7 +29,6 @@ import org.eclipse.jetty.server.LocalConnector; import org.eclipse.jetty.server.Server; import org.junit.jupiter.api.Assumptions; -import org.junit.jupiter.api.Disabled; import org.junit.jupiter.api.Test; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.ValueSource; @@ -204,8 +203,8 @@ public void testWebappContext() throws Exception webapp.addServletContainerInitializer(new org.jboss.weld.environment.servlet.EnhancedListener()); String pkg = EmbeddedWeldTest.class.getPackage().getName(); - webapp.getServerClassMatcher().add("-" + pkg + "."); - webapp.getSystemClassMatcher().add(pkg + "."); + webapp.getHiddenClassMatcher().add("-" + pkg + "."); + webapp.getProtectedClassMatcher().add(pkg + "."); webapp.addServlet(GreetingsServlet.class, "/greet"); webapp.addFilter(MyFilter.class, "/*", EnumSet.of(DispatcherType.REQUEST)); @@ -240,8 +239,8 @@ public void testWebappContextDiscovered() throws Exception // This is ugly but needed for maven for testing in a overlaid war pom String pkg = EmbeddedWeldTest.class.getPackage().getName(); - webapp.getServerClassMatcher().add("-" + pkg + "."); - webapp.getSystemClassMatcher().add(pkg + "."); + webapp.getHiddenClassMatcher().add("-" + pkg + "."); + webapp.getProtectedClassMatcher().add(pkg + "."); webapp.getServletHandler().addListener(new ListenerHolder(MyContextListener.class)); webapp.addFilter(MyFilter.class, "/*", EnumSet.of(DispatcherType.REQUEST)); diff --git a/jetty-ee10/jetty-ee10-webapp/src/main/config/etc/jetty-ee10-webapp.xml b/jetty-ee10/jetty-ee10-webapp/src/main/config/etc/jetty-ee10-webapp.xml index c60c38021eab..7359df998a32 100644 --- a/jetty-ee10/jetty-ee10-webapp/src/main/config/etc/jetty-ee10-webapp.xml +++ b/jetty-ee10/jetty-ee10-webapp/src/main/config/etc/jetty-ee10-webapp.xml @@ -2,20 +2,20 @@ - + - + - + - + diff --git a/jetty-ee10/jetty-ee10-webapp/src/main/config/modules/ee10-webapp.mod b/jetty-ee10/jetty-ee10-webapp/src/main/config/modules/ee10-webapp.mod index 0778b27b0a17..229c107f3f3c 100644 --- a/jetty-ee10/jetty-ee10-webapp/src/main/config/modules/ee10-webapp.mod +++ b/jetty-ee10/jetty-ee10-webapp/src/main/config/modules/ee10-webapp.mod @@ -22,8 +22,8 @@ lib/jetty-ee10-webapp-${jetty.version}.jar [ini-template] # tag::ini-template[] ## Add to the environment wide default jars and packages protected or hidden from webapps. -## System classes are protected and cannot be overridden by a webapp. -## Server classes are hidden and cannot be seen by a webapp +## Protected (aka System) classes cannot be overridden by a webapp. +## Hidden (aka Server) classes cannot be seen by a webapp ## Lists of patterns are comma separated and may be either: ## + a qualified classname e.g. 'com.acme.Foo' ## + a package name e.g. 'net.example.' @@ -33,8 +33,8 @@ lib/jetty-ee10-webapp-${jetty.version}.jar ## ## The +=, operator appends to a CSV list with a comma as needed. ## -#jetty.webapp.addSystemClasses+=,org.example. -#jetty.webapp.addServerClasses+=,org.example. +#jetty.webapp.addProtectedClasses+=,org.example. +#jetty.webapp.addHiddenClasses+=,org.example. # end::ini-template[] [ini] diff --git a/jetty-ee10/jetty-ee10-webapp/src/main/java/org/eclipse/jetty/ee10/webapp/WebAppClassLoader.java b/jetty-ee10/jetty-ee10-webapp/src/main/java/org/eclipse/jetty/ee10/webapp/WebAppClassLoader.java index c66b470d01f0..c65e29d7433b 100644 --- a/jetty-ee10/jetty-ee10-webapp/src/main/java/org/eclipse/jetty/ee10/webapp/WebAppClassLoader.java +++ b/jetty-ee10/jetty-ee10-webapp/src/main/java/org/eclipse/jetty/ee10/webapp/WebAppClassLoader.java @@ -59,8 +59,8 @@ * parent loader. Java2 compliant loading, where the parent loader * always has priority, can be selected with the * {@link WebAppContext#setParentLoaderPriority(boolean)} - * method and influenced with {@link WebAppContext#isServerClass(Class)} and - * {@link WebAppContext#isSystemClass(Class)}. + * method and influenced with {@link WebAppContext#isHiddenClass(Class)} and + * {@link WebAppContext#isProtectedClass(Class)}. *

* If no parent class loader is provided, then the current thread * context classloader will be used. If that is null then the @@ -114,9 +114,9 @@ public interface Context extends ClassVisibilityChecker List getExtraClasspath(); - boolean isServerResource(String name, URL parentUrl); + boolean isHiddenResource(String name, URL parentUrl); - boolean isSystemResource(String name, URL webappUrl); + boolean isProtectedResource(String name, URL webappUrl); } /** @@ -324,7 +324,7 @@ public Enumeration getResources(String name) throws IOException while (urls != null && urls.hasMoreElements()) { URL url = urls.nextElement(); - if (Boolean.TRUE.equals(__loadServerClasses.get()) || !_context.isServerResource(name, url)) + if (Boolean.TRUE.equals(__loadServerClasses.get()) || !_context.isHiddenResource(name, url)) fromParent.add(url); } @@ -332,7 +332,7 @@ public Enumeration getResources(String name) throws IOException while (urls != null && urls.hasMoreElements()) { URL url = urls.nextElement(); - if (!_context.isSystemResource(name, url) || fromParent.isEmpty()) + if (!_context.isProtectedResource(name, url) || fromParent.isEmpty()) fromWebapp.add(url); } @@ -373,7 +373,7 @@ public URL getResource(String name) // return if we have a url the webapp is allowed to see if (parentUrl != null && (Boolean.TRUE.equals(__loadServerClasses.get()) || - !_context.isServerResource(name, parentUrl))) + !_context.isHiddenResource(name, parentUrl))) resource = parentUrl; else { @@ -392,7 +392,7 @@ public URL getResource(String name) { URL webappUrl = this.findResource(name); - if (webappUrl != null && !_context.isSystemResource(name, webappUrl)) + if (webappUrl != null && !_context.isProtectedResource(name, webappUrl)) resource = webappUrl; else { @@ -401,7 +401,7 @@ public URL getResource(String name) URL parentUrl = _parent.getResource(name); if (parentUrl != null && (Boolean.TRUE.equals(__loadServerClasses.get()) || - !_context.isServerResource(name, parentUrl))) + !_context.isHiddenResource(name, parentUrl))) resource = parentUrl; // We couldn't find a parent resource, so OK to return a webapp one if it exists // and we just couldn't see it before @@ -447,7 +447,7 @@ protected Class loadClass(String name, boolean resolve) throws ClassNotFoundE throw new ClassNotFoundException("Bad ClassLoader: returned null for loadClass(" + name + ")"); // If the webapp is allowed to see this class - if (Boolean.TRUE.equals(__loadServerClasses.get()) || !_context.isServerClass(parentClass)) + if (Boolean.TRUE.equals(__loadServerClasses.get()) || !_context.isHiddenClass(parentClass)) { return parentClass; } @@ -495,7 +495,7 @@ else if (e != ex) { parentClass = _parent.loadClass(name); // If the webapp is allowed to see this class - if (Boolean.TRUE.equals(__loadServerClasses.get()) || !_context.isServerClass(parentClass)) + if (Boolean.TRUE.equals(__loadServerClasses.get()) || !_context.isHiddenClass(parentClass)) { return parentClass; } @@ -546,7 +546,7 @@ protected Class loadAsResource(final String name, boolean checkSystemResource String path = TypeUtil.toClassReference(name); URL webappUrl = findResource(path); - if (webappUrl != null && (!checkSystemResource || !_context.isSystemResource(name, webappUrl))) + if (webappUrl != null && (!checkSystemResource || !_context.isProtectedResource(name, webappUrl))) { webappClass = this.foundClass(name, webappUrl); @@ -627,14 +627,14 @@ public String toString() } @Override - public boolean isSystemClass(Class clazz) + public boolean isProtectedClass(Class clazz) { - return _context.isSystemClass(clazz); + return _context.isProtectedClass(clazz); } @Override - public boolean isServerClass(Class clazz) + public boolean isHiddenClass(Class clazz) { - return _context.isServerClass(clazz); + return _context.isHiddenClass(clazz); } } diff --git a/jetty-ee10/jetty-ee10-webapp/src/main/java/org/eclipse/jetty/ee10/webapp/WebAppContext.java b/jetty-ee10/jetty-ee10-webapp/src/main/java/org/eclipse/jetty/ee10/webapp/WebAppContext.java index f835e53eb9cc..0c1a663146ec 100644 --- a/jetty-ee10/jetty-ee10-webapp/src/main/java/org/eclipse/jetty/ee10/webapp/WebAppContext.java +++ b/jetty-ee10/jetty-ee10-webapp/src/main/java/org/eclipse/jetty/ee10/webapp/WebAppContext.java @@ -38,7 +38,7 @@ import jakarta.servlet.http.HttpSessionBindingListener; import jakarta.servlet.http.HttpSessionIdListener; import jakarta.servlet.http.HttpSessionListener; -import org.eclipse.jetty.ee.WebappProtectedClasses; +import org.eclipse.jetty.ee.WebappClassLoading; import org.eclipse.jetty.ee10.servlet.ErrorHandler; import org.eclipse.jetty.ee10.servlet.ErrorPageErrorHandler; import org.eclipse.jetty.ee10.servlet.ServletContextHandler; @@ -84,25 +84,25 @@ public class WebAppContext extends ServletContextHandler implements WebAppClassL static final Logger LOG = LoggerFactory.getLogger(WebAppContext.class); public static final String WEB_DEFAULTS_XML = "org/eclipse/jetty/ee10/webapp/webdefault-ee10.xml"; - public static final String SERVER_SYS_CLASSES = WebappProtectedClasses.SYSTEM_CLASSES_ATTRIBUTE; - public static final String SERVER_SRV_CLASSES = WebappProtectedClasses.SERVER_CLASSES_ATTRIBUTE; + public static final String SERVER_SYS_CLASSES = WebappClassLoading.PROTECTED_CLASSES_ATTRIBUTE; + public static final String SERVER_SRV_CLASSES = WebappClassLoading.HIDDEN_CLASSES_ATTRIBUTE; private static final String[] __dftProtectedTargets = {"/WEB-INF", "/META-INF"}; /** - * @deprecated use {@link WebappProtectedClasses#DEFAULT_SYSTEM_CLASSES} + * @deprecated use {@link WebappClassLoading#DEFAULT_PROTECTED_CLASSES} */ @Deprecated - public static final ClassMatcher __dftSystemClasses = WebappProtectedClasses.DEFAULT_SYSTEM_CLASSES; + public static final ClassMatcher __dftSystemClasses = WebappClassLoading.DEFAULT_PROTECTED_CLASSES; /** - * @deprecated use {@link WebappProtectedClasses#DEFAULT_SERVER_CLASSES} + * @deprecated use {@link WebappClassLoading#DEFAULT_HIDDEN_CLASSES} */ @Deprecated - public static final ClassMatcher __dftServerClasses = WebappProtectedClasses.DEFAULT_SERVER_CLASSES; + public static final ClassMatcher __dftServerClasses = WebappClassLoading.DEFAULT_HIDDEN_CLASSES; - private final ClassMatcher _systemClasses = new ClassMatcher(WebappProtectedClasses.getSystemClasses(ServletContextHandler.ENVIRONMENT)); - private final ClassMatcher _serverClasses = new ClassMatcher(WebappProtectedClasses.getServerClasses(ServletContextHandler.ENVIRONMENT)); + private final ClassMatcher _protectedClasses = new ClassMatcher(WebappClassLoading.getProtectedClasses(ServletContextHandler.ENVIRONMENT)); + private final ClassMatcher _hiddenClasses = new ClassMatcher(WebappClassLoading.getHiddenClasses(ServletContextHandler.ENVIRONMENT)); private Configurations _configurations; private String _defaultsDescriptor = WEB_DEFAULTS_XML; @@ -417,7 +417,7 @@ public void preConfigure() throws Exception // Add the known server class inclusions for all known configurations for (Configuration configuration : Configurations.getKnown()) { - _serverClasses.include(configuration.getServerClasses().getInclusions()); + _hiddenClasses.include(configuration.getServerClasses().getInclusions()); } // Setup Configuration classes for this webapp! @@ -425,8 +425,8 @@ public void preConfigure() throws Exception _configurations.sort(); for (Configuration configuration : _configurations) { - _systemClasses.add(configuration.getSystemClasses().getPatterns()); - _serverClasses.exclude(configuration.getServerClasses().getExclusions()); + _protectedClasses.add(configuration.getSystemClasses().getPatterns()); + _hiddenClasses.exclude(configuration.getServerClasses().getExclusions()); } // Configure classloader @@ -612,107 +612,217 @@ public PermissionCollection getPermissions() } /** - * Set the server classes patterns. + * Set the hidden (aka server) classes patterns. *

- * Server classes/packages are classes used to implement the server and are hidden + * These classes/packages are used to implement the server and are hiddenClasses * from the context. If the context needs to load these classes, it must have its * own copy of them in WEB-INF/lib or WEB-INF/classes. * - * @param serverClasses the server classes pattern + * @param hiddenClasses the server classes pattern */ - public void setServerClassMatcher(ClassMatcher serverClasses) + public void setHiddenClassMatcher(ClassMatcher hiddenClasses) { - _serverClasses.clear(); - _serverClasses.add(serverClasses.getPatterns()); + _hiddenClasses.clear(); + _hiddenClasses.add(hiddenClasses.getPatterns()); } /** - * Set the system classes patterns. + * Set the protected (aka system) classes patterns. *

- * System classes/packages are classes provided by the JVM and that + * These classes/packages are provided by the JVM and * cannot be replaced by classes of the same name from WEB-INF, * regardless of the value of {@link #setParentLoaderPriority(boolean)}. * - * @param systemClasses the system classes pattern + * @param protectedClasses the system classes pattern */ - public void setSystemClassMatcher(ClassMatcher systemClasses) + public void setProtectedClassMatcher(ClassMatcher protectedClasses) { - _systemClasses.clear(); - _systemClasses.add(systemClasses.getPatterns()); + _protectedClasses.clear(); + _protectedClasses.add(protectedClasses.getPatterns()); } /** - * Add a ClassMatcher for server classes by combining with + * Add a ClassMatcher for hidden (server) classes by combining with * any existing matcher. * - * @param serverClasses The class matcher of patterns to add to the server ClassMatcher + * @param hiddenClasses The class matcher of patterns to add to the server ClassMatcher */ - public void addServerClassMatcher(ClassMatcher serverClasses) + public void addHiddenClassMatcher(ClassMatcher hiddenClasses) { - _serverClasses.add(serverClasses.getPatterns()); + _hiddenClasses.add(hiddenClasses.getPatterns()); } /** - * Add a ClassMatcher for system classes by combining with + * Add a ClassMatcher for protected (system) classes by combining with * any existing matcher. * - * @param systemClasses The class matcher of patterns to add to the system ClassMatcher + * @param protectedClasses The class matcher of patterns to add to the system ClassMatcher */ - public void addSystemClassMatcher(ClassMatcher systemClasses) + public void addProtectedClassMatcher(ClassMatcher protectedClasses) { - _systemClasses.add(systemClasses.getPatterns()); + _protectedClasses.add(protectedClasses.getPatterns()); } /** * @return The ClassMatcher used to match System (protected) classes */ + public ClassMatcher getProtectedClassMatcher() + { + return _protectedClasses; + } + + /** + * @return The ClassMatcher used to match Server (hiddenClasses) classes + */ + public ClassMatcher getHiddenClassMatcher() + { + return _hiddenClasses; + } + + @ManagedAttribute(value = "classes and packages protected by context classloader", readonly = true) + public String[] getProtectedClasses() + { + return _protectedClasses.getPatterns(); + } + + @ManagedAttribute(value = "classes and packages hiddenClasses by the context classloader", readonly = true) + public String[] getHiddenClasses() + { + return _hiddenClasses.getPatterns(); + } + + @Override + public boolean isHiddenClass(Class clazz) + { + return _hiddenClasses.match(clazz); + } + + @Override + public boolean isProtectedClass(Class clazz) + { + return _protectedClasses.match(clazz); + } + + @Override + public boolean isHiddenResource(String name, URL url) + { + return _hiddenClasses.match(name, url); + } + + @Override + public boolean isProtectedResource(String name, URL url) + { + return _protectedClasses.match(name, url); + } + + /** + * @deprecated use {@link #setHiddenClassMatcher(ClassMatcher)} + */ + @Deprecated(since = "12.0.8", forRemoval = true) + public void setServerClassMatcher(ClassMatcher serverClasses) + { + _hiddenClasses.clear(); + _hiddenClasses.add(serverClasses.getPatterns()); + } + + /** + * @deprecated use {@link #setProtectedClassMatcher(ClassMatcher)} + */ + @Deprecated(since = "12.0.8", forRemoval = true) + public void setSystemClassMatcher(ClassMatcher systemClasses) + { + _protectedClasses.clear(); + _protectedClasses.add(systemClasses.getPatterns()); + } + + /** + * @deprecated use {@link #addHiddenClassMatcher(ClassMatcher)} + */ + @Deprecated(since = "12.0.8", forRemoval = true) + public void addServerClassMatcher(ClassMatcher serverClasses) + { + _hiddenClasses.add(serverClasses.getPatterns()); + } + + /** + * @deprecated use {@link #addProtectedClassMatcher(ClassMatcher)} + */ + @Deprecated(since = "12.0.8", forRemoval = true) + public void addSystemClassMatcher(ClassMatcher systemClasses) + { + _protectedClasses.add(systemClasses.getPatterns()); + } + + /** + * @deprecated use {@link #getProtectedClassMatcher()} + */ + @Deprecated(since = "12.0.8", forRemoval = true) public ClassMatcher getSystemClassMatcher() { - return _systemClasses; + return _protectedClasses; } /** - * @return The ClassMatcher used to match Server (hidden) classes + * @deprecated use {@link #getHiddenClassMatcher()} */ + @Deprecated(since = "12.0.8", forRemoval = true) public ClassMatcher getServerClassMatcher() { - return _serverClasses; + return _hiddenClasses; } - @ManagedAttribute(value = "classes and packages protected by context classloader", readonly = true) + /** + * @deprecated use {@link #getProtectedClasses()} + */ + @Deprecated(since = "12.0.8", forRemoval = true) public String[] getSystemClasses() { - return _systemClasses.getPatterns(); + return _protectedClasses.getPatterns(); } - @ManagedAttribute(value = "classes and packages hidden by the context classloader", readonly = true) + /** + * @deprecated use {@link #getHiddenClasses()} + */ + @Deprecated(since = "12.0.8", forRemoval = true) public String[] getServerClasses() { - return _serverClasses.getPatterns(); + return _hiddenClasses.getPatterns(); } - @Override + /** + * @deprecated use {@link #isHiddenClass(Class)} + */ + @Deprecated(since = "12.0.8", forRemoval = true) public boolean isServerClass(Class clazz) { - return _serverClasses.match(clazz); + return _hiddenClasses.match(clazz); } - @Override + /** + * @deprecated use {@link #isProtectedClass(Class)} + */ + @Deprecated(since = "12.0.8", forRemoval = true) public boolean isSystemClass(Class clazz) { - return _systemClasses.match(clazz); + return _protectedClasses.match(clazz); } - @Override + /** + * @deprecated use {@link #isHiddenResource(String, URL)} + */ + @Deprecated(since = "12.0.8", forRemoval = true) public boolean isServerResource(String name, URL url) { - return _serverClasses.match(name, url); + return _hiddenClasses.match(name, url); } - @Override + /** + * @deprecated use {@link #isProtectedResource(String, URL)} + */ + @Deprecated(since = "12.0.8", forRemoval = true) public boolean isSystemResource(String name, URL url) { - return _systemClasses.match(name, url); + return _protectedClasses.match(name, url); } @Override @@ -721,8 +831,8 @@ public void setServer(Server server) super.setServer(server); if (server != null) { - _systemClasses.add(WebappProtectedClasses.getSystemClasses(server).getPatterns()); - _serverClasses.add(WebappProtectedClasses.getServerClasses(server).getPatterns()); + _protectedClasses.add(WebappClassLoading.getProtectedClasses(server).getPatterns()); + _hiddenClasses.add(WebappClassLoading.getHiddenClasses(server).getPatterns()); } } @@ -845,16 +955,16 @@ public String toString() public void dump(Appendable out, String indent) throws IOException { List systemClasses = null; - if (_systemClasses != null) + if (_protectedClasses != null) { - systemClasses = new ArrayList<>(_systemClasses); + systemClasses = new ArrayList<>(_protectedClasses); Collections.sort(systemClasses); } List serverClasses = null; - if (_serverClasses != null) + if (_hiddenClasses != null) { - serverClasses = new ArrayList<>(_serverClasses); + serverClasses = new ArrayList<>(_hiddenClasses); Collections.sort(serverClasses); } @@ -1385,27 +1495,27 @@ public MetaData getMetaData() * Add a Server Class pattern to use for all ee9 WebAppContexts. * @param server The {@link Server} instance to add classes to * @param patterns the patterns to use - * @see #getServerClassMatcher() - * @see #getServerClasses() - * @deprecated use {@link WebappProtectedClasses#addSystemClasses(Server, String...)} + * @see #getHiddenClassMatcher() + * @see #getHiddenClasses() + * @deprecated use {@link WebappClassLoading#addProtectedClasses(Server, String...)} */ @Deprecated(since = "12.0.8", forRemoval = true) public static void addServerClasses(Server server, String... patterns) { - WebappProtectedClasses.addServerClasses(server, patterns); + WebappClassLoading.addHiddenClasses(server, patterns); } /** * Add a System Class pattern to use for all ee9 WebAppContexts. * @param server The {@link Server} instance to add classes to * @param patterns the patterns to use - * @see #getSystemClassMatcher() - * @see #getSystemClasses() - * @deprecated use {@link WebappProtectedClasses#addServerClasses(Server, String...)} + * @see #getProtectedClassMatcher() + * @see #getProtectedClasses() + * @deprecated use {@link WebappClassLoading#addHiddenClasses(Server, String...)} */ @Deprecated(since = "12.0.8", forRemoval = true) public static void addSystemClasses(Server server, String... patterns) { - WebappProtectedClasses.addSystemClasses(server, patterns); + WebappClassLoading.addProtectedClasses(server, patterns); } } diff --git a/jetty-ee10/jetty-ee10-webapp/src/test/java/org/eclipse/jetty/ee10/webapp/WebAppClassLoaderTest.java b/jetty-ee10/jetty-ee10-webapp/src/test/java/org/eclipse/jetty/ee10/webapp/WebAppClassLoaderTest.java index 63d19eb204e9..c08c71724ea8 100644 --- a/jetty-ee10/jetty-ee10-webapp/src/test/java/org/eclipse/jetty/ee10/webapp/WebAppClassLoaderTest.java +++ b/jetty-ee10/jetty-ee10-webapp/src/test/java/org/eclipse/jetty/ee10/webapp/WebAppClassLoaderTest.java @@ -210,11 +210,11 @@ public byte[] transform(ClassLoader loader, String className, Class classBein @Test public void testExposedClassDeprecated() throws Exception { - String[] oldSC = _context.getServerClasses(); + String[] oldSC = _context.getHiddenClasses(); String[] newSC = new String[oldSC.length + 1]; newSC[0] = "-org.eclipse.jetty.ee10.webapp.Configuration"; System.arraycopy(oldSC, 0, newSC, 1, oldSC.length); - _context.setServerClassMatcher(new ClassMatcher(newSC)); + _context.setHiddenClassMatcher(new ClassMatcher(newSC)); assertCanLoadClass("org.acme.webapp.ClassInJarA"); assertCanLoadClass("org.acme.webapp.ClassInJarB"); @@ -227,7 +227,7 @@ public void testExposedClassDeprecated() throws Exception @Test public void testExposedClass() throws Exception { - _context.getServerClassMatcher().exclude("org.eclipse.jetty.ee10.webapp.Configuration"); + _context.getHiddenClassMatcher().exclude("org.eclipse.jetty.ee10.webapp.Configuration"); assertCanLoadClass("org.acme.webapp.ClassInJarA"); assertCanLoadClass("org.acme.webapp.ClassInJarB"); @@ -240,18 +240,18 @@ public void testExposedClass() throws Exception @Test public void testSystemServerClassDeprecated() throws Exception { - String[] oldServC = _context.getServerClasses(); + String[] oldServC = _context.getHiddenClasses(); String[] newServC = new String[oldServC.length + 1]; newServC[0] = "org.eclipse.jetty.ee10.webapp.Configuration"; System.arraycopy(oldServC, 0, newServC, 1, oldServC.length); - _context.setServerClassMatcher(new ClassMatcher(newServC)); + _context.setHiddenClassMatcher(new ClassMatcher(newServC)); - String[] oldSysC = _context.getSystemClasses(); + String[] oldSysC = _context.getProtectedClasses(); String[] newSysC = new String[oldSysC.length + 1]; newSysC[0] = "org.eclipse.jetty.ee10.webapp."; System.arraycopy(oldSysC, 0, newSysC, 1, oldSysC.length); - _context.setSystemClassMatcher(new ClassMatcher(newSysC)); + _context.setProtectedClassMatcher(new ClassMatcher(newSysC)); assertCanLoadClass("org.acme.webapp.ClassInJarA"); assertCanLoadClass("org.acme.webapp.ClassInJarB"); @@ -259,28 +259,28 @@ public void testSystemServerClassDeprecated() throws Exception assertCantLoadClass("org.eclipse.jetty.ee10.webapp.Configuration"); assertCantLoadClass("org.eclipse.jetty.ee10.webapp.JarScanner"); - oldSysC = _context.getSystemClasses(); + oldSysC = _context.getProtectedClasses(); newSysC = new String[oldSysC.length + 1]; newSysC[0] = "org.acme.webapp.ClassInJarA"; System.arraycopy(oldSysC, 0, newSysC, 1, oldSysC.length); - _context.setSystemClassMatcher(new ClassMatcher(newSysC)); + _context.setProtectedClassMatcher(new ClassMatcher(newSysC)); assertCanLoadResource("org/acme/webapp/ClassInJarA.class"); - _context.setSystemClassMatcher(new ClassMatcher(oldSysC)); + _context.setProtectedClassMatcher(new ClassMatcher(oldSysC)); - oldServC = _context.getServerClasses(); + oldServC = _context.getHiddenClasses(); newServC = new String[oldServC.length + 1]; newServC[0] = "org.acme.webapp.ClassInJarA"; System.arraycopy(oldServC, 0, newServC, 1, oldServC.length); - _context.setServerClassMatcher(new ClassMatcher(newServC)); + _context.setHiddenClassMatcher(new ClassMatcher(newServC)); assertCanLoadResource("org/acme/webapp/ClassInJarA.class"); } @Test public void testSystemServerClass() throws Exception { - _context.getServerClassMatcher().add("org.eclipse.jetty.ee10.webapp.Configuration"); - _context.getSystemClassMatcher().add("org.eclipse.jetty.ee10.webapp."); + _context.getHiddenClassMatcher().add("org.eclipse.jetty.ee10.webapp.Configuration"); + _context.getProtectedClassMatcher().add("org.eclipse.jetty.ee10.webapp."); assertCanLoadClass("org.acme.webapp.ClassInJarA"); assertCanLoadClass("org.acme.webapp.ClassInJarB"); @@ -288,11 +288,11 @@ public void testSystemServerClass() throws Exception assertCantLoadClass("org.eclipse.jetty.ee10.webapp.Configuration"); assertCantLoadClass("org.eclipse.jetty.ee10.webapp.JarScanner"); - _context.getSystemClassMatcher().add("org.acme.webapp.ClassInJarA"); + _context.getProtectedClassMatcher().add("org.acme.webapp.ClassInJarA"); assertCanLoadResource("org/acme/webapp/ClassInJarA.class"); - _context.getSystemClassMatcher().remove("org.acme.webapp.ClassInJarA"); + _context.getProtectedClassMatcher().remove("org.acme.webapp.ClassInJarA"); - _context.getServerClassMatcher().add("org.acme.webapp.ClassInJarA"); + _context.getHiddenClassMatcher().add("org.acme.webapp.ClassInJarA"); assertCanLoadResource("org/acme/webapp/ClassInJarA.class"); } @@ -339,11 +339,11 @@ public void testResources() throws Exception // assertEquals(0,resources.get(1).toString().indexOf("jar:file:")); // assertEquals(-1,resources.get(2).toString().indexOf("test-classes")); - String[] oldServC = _context.getServerClasses(); + String[] oldServC = _context.getHiddenClasses(); String[] newServC = new String[oldServC.length + 1]; newServC[0] = "org.acme."; System.arraycopy(oldServC, 0, newServC, 1, oldServC.length); - _context.setServerClassMatcher(new ClassMatcher(newServC)); + _context.setHiddenClassMatcher(new ClassMatcher(newServC)); _context.setParentLoaderPriority(true); // dump(_context); @@ -360,12 +360,12 @@ public void testResources() throws Exception // assertEquals(0,resources.get(0).toString().indexOf("jar:file:")); // assertEquals(0,resources.get(1).toString().indexOf("file:")); - _context.setServerClassMatcher(new ClassMatcher(oldServC)); - String[] oldSysC = _context.getSystemClasses(); + _context.setHiddenClassMatcher(new ClassMatcher(oldServC)); + String[] oldSysC = _context.getProtectedClasses(); String[] newSysC = new String[oldSysC.length + 1]; newSysC[0] = "org.acme."; System.arraycopy(oldSysC, 0, newSysC, 1, oldSysC.length); - _context.setSystemClassMatcher(new ClassMatcher(newSysC)); + _context.setProtectedClassMatcher(new ClassMatcher(newSysC)); _context.setParentLoaderPriority(true); // dump(_context); diff --git a/jetty-ee10/jetty-ee10-webapp/src/test/java/org/eclipse/jetty/ee10/webapp/WebAppContextTest.java b/jetty-ee10/jetty-ee10-webapp/src/test/java/org/eclipse/jetty/ee10/webapp/WebAppContextTest.java index 94027675ab59..77db783230ee 100644 --- a/jetty-ee10/jetty-ee10-webapp/src/test/java/org/eclipse/jetty/ee10/webapp/WebAppContextTest.java +++ b/jetty-ee10/jetty-ee10-webapp/src/test/java/org/eclipse/jetty/ee10/webapp/WebAppContextTest.java @@ -30,7 +30,7 @@ import jakarta.servlet.ServletContext; import jakarta.servlet.ServletRequest; import jakarta.servlet.ServletResponse; -import org.eclipse.jetty.ee.WebappProtectedClasses; +import org.eclipse.jetty.ee.WebappClassLoading; import org.eclipse.jetty.ee10.servlet.ErrorPageErrorHandler; import org.eclipse.jetty.ee10.servlet.ServletContextHandler; import org.eclipse.jetty.http.HttpStatus; @@ -823,10 +823,10 @@ public void testAddServerClasses() throws Exception server.setHandler(context); server.start(); - List serverClasses = List.of(context.getServerClasses()); + List serverClasses = List.of(context.getHiddenClasses()); assertThat("Should have environment specific test pattern", serverClasses, hasItem(testPattern)); assertThat("Should have pattern from JaasConfiguration", serverClasses, hasItem("-org.eclipse.jetty.security.jaas.")); - for (String defaultServerClass: WebappProtectedClasses.DEFAULT_SERVER_CLASSES) + for (String defaultServerClass: WebappClassLoading.DEFAULT_HIDDEN_CLASSES) assertThat("Should have default patterns", serverClasses, hasItem(defaultServerClass)); } @@ -847,10 +847,10 @@ public void testAddSystemClasses() throws Exception server.setHandler(context); server.start(); - List systemClasses = List.of(context.getSystemClasses()); + List systemClasses = List.of(context.getProtectedClasses()); assertThat("Should have environment specific test pattern", systemClasses, hasItem(testPattern)); assertThat("Should have pattern from JaasConfiguration", systemClasses, hasItem("org.eclipse.jetty.security.jaas.")); - for (String defaultSystemClass: WebappProtectedClasses.DEFAULT_SYSTEM_CLASSES) + for (String defaultSystemClass: WebappClassLoading.DEFAULT_PROTECTED_CLASSES) assertThat("Should have default patterns", systemClasses, hasItem(defaultSystemClass)); } } diff --git a/jetty-ee8/jetty-ee8-webapp/src/main/config/etc/jetty-ee8-webapp.xml b/jetty-ee8/jetty-ee8-webapp/src/main/config/etc/jetty-ee8-webapp.xml index a39427120d4c..16ec7507ebd0 100644 --- a/jetty-ee8/jetty-ee8-webapp/src/main/config/etc/jetty-ee8-webapp.xml +++ b/jetty-ee8/jetty-ee8-webapp/src/main/config/etc/jetty-ee8-webapp.xml @@ -6,7 +6,7 @@ - + @@ -15,7 +15,7 @@ - + diff --git a/jetty-ee8/jetty-ee8-webapp/src/main/config/modules/ee8-webapp.mod b/jetty-ee8/jetty-ee8-webapp/src/main/config/modules/ee8-webapp.mod index 6e816604b80a..152944da3a09 100644 --- a/jetty-ee8/jetty-ee8-webapp/src/main/config/modules/ee8-webapp.mod +++ b/jetty-ee8/jetty-ee8-webapp/src/main/config/modules/ee8-webapp.mod @@ -20,8 +20,8 @@ lib/jetty-ee8-webapp-${jetty.version}.jar [ini-template] ## Add to the environment wide default jars and packages protected or hidden from webapps. -## System classes are protected and cannot be overridden by a webapp. -## Server classes are hidden and cannot be seen by a webapp +## Protected (aka System) classes cannot be overridden by a webapp. +## Hidden (aka Server) classes cannot be seen by a webapp ## Lists of patterns are comma separated and may be either: ## + a qualified classname e.g. 'com.acme.Foo' ## + a package name e.g. 'net.example.' @@ -31,8 +31,8 @@ lib/jetty-ee8-webapp-${jetty.version}.jar ## ## The +=, operator appends to a CSV list with a comma as needed. ## -#jetty.webapp.addSystemClasses+=,org.example. -#jetty.webapp.addServerClasses+=,org.example. +#jetty.webapp.addProtectedClasses+=,org.example. +#jetty.webapp.addHiddenClasses+=,org.example. [ini] contextHandlerClass=org.eclipse.jetty.ee8.webapp.WebAppContext diff --git a/jetty-ee9/jetty-ee9-webapp/src/main/config/etc/jetty-ee9-webapp.xml b/jetty-ee9/jetty-ee9-webapp/src/main/config/etc/jetty-ee9-webapp.xml index cf77f66b8cf2..af859f4528b3 100644 --- a/jetty-ee9/jetty-ee9-webapp/src/main/config/etc/jetty-ee9-webapp.xml +++ b/jetty-ee9/jetty-ee9-webapp/src/main/config/etc/jetty-ee9-webapp.xml @@ -2,20 +2,20 @@ - + - + - + - + diff --git a/jetty-ee9/jetty-ee9-webapp/src/main/config/modules/ee9-webapp.mod b/jetty-ee9/jetty-ee9-webapp/src/main/config/modules/ee9-webapp.mod index 2d13db53edba..ab28ee845747 100644 --- a/jetty-ee9/jetty-ee9-webapp/src/main/config/modules/ee9-webapp.mod +++ b/jetty-ee9/jetty-ee9-webapp/src/main/config/modules/ee9-webapp.mod @@ -20,8 +20,8 @@ lib/jetty-ee9-webapp-${jetty.version}.jar [ini-template] ## Add to the environment wide default jars and packages protected or hidden from webapps. -## System classes are protected and cannot be overridden by a webapp. -## Server classes are hidden and cannot be seen by a webapp +## Protected (aka System) classes cannot be overridden by a webapp. +## Hidden (aka Server) classes cannot be seen by a webapp ## Lists of patterns are comma separated and may be either: ## + a qualified classname e.g. 'com.acme.Foo' ## + a package name e.g. 'net.example.' @@ -31,8 +31,8 @@ lib/jetty-ee9-webapp-${jetty.version}.jar ## ## The +=, operator appends to a CSV list with a comma as needed. ## -#jetty.webapp.addSystemClasses+=,org.example. -#jetty.webapp.addServerClasses+=,org.example. +#jetty.webapp.addProtectedClasses+=,org.example. +#jetty.webapp.addHiddenClasses+=,org.example. [ini] contextHandlerClass?=org.eclipse.jetty.ee9.webapp.WebAppContext diff --git a/jetty-ee9/jetty-ee9-webapp/src/main/java/org/eclipse/jetty/ee9/webapp/WebAppClassLoader.java b/jetty-ee9/jetty-ee9-webapp/src/main/java/org/eclipse/jetty/ee9/webapp/WebAppClassLoader.java index 9bdb835db28c..c4f9bcfcd996 100644 --- a/jetty-ee9/jetty-ee9-webapp/src/main/java/org/eclipse/jetty/ee9/webapp/WebAppClassLoader.java +++ b/jetty-ee9/jetty-ee9-webapp/src/main/java/org/eclipse/jetty/ee9/webapp/WebAppClassLoader.java @@ -59,8 +59,8 @@ * parent loader. Java2 compliant loading, where the parent loader * always has priority, can be selected with the * {@link WebAppContext#setParentLoaderPriority(boolean)} - * method and influenced with {@link WebAppContext#isServerClass(Class)} and - * {@link WebAppContext#isSystemClass(Class)}. + * method and influenced with {@link WebAppContext#isHiddenClass(Class)} and + * {@link WebAppContext#isProtectedClass(Class)}. *

* If no parent class loader is provided, then the current thread * context classloader will be used. If that is null then the @@ -449,7 +449,7 @@ protected Class loadClass(String name, boolean resolve) throws ClassNotFoundE throw new ClassNotFoundException("Bad ClassLoader: returned null for loadClass(" + name + ")"); // If the webapp is allowed to see this class - if (Boolean.TRUE.equals(__loadServerClasses.get()) || !_context.isServerClass(parentClass)) + if (Boolean.TRUE.equals(__loadServerClasses.get()) || !_context.isHiddenClass(parentClass)) { return parentClass; } @@ -497,7 +497,7 @@ else if (e != ex) { parentClass = _parent.loadClass(name); // If the webapp is allowed to see this class - if (Boolean.TRUE.equals(__loadServerClasses.get()) || !_context.isServerClass(parentClass)) + if (Boolean.TRUE.equals(__loadServerClasses.get()) || !_context.isHiddenClass(parentClass)) { return parentClass; } @@ -629,14 +629,14 @@ public String toString() } @Override - public boolean isSystemClass(Class clazz) + public boolean isProtectedClass(Class clazz) { - return _context.isSystemClass(clazz); + return _context.isProtectedClass(clazz); } @Override - public boolean isServerClass(Class clazz) + public boolean isHiddenClass(Class clazz) { - return _context.isServerClass(clazz); + return _context.isHiddenClass(clazz); } } diff --git a/jetty-ee9/jetty-ee9-webapp/src/main/java/org/eclipse/jetty/ee9/webapp/WebAppContext.java b/jetty-ee9/jetty-ee9-webapp/src/main/java/org/eclipse/jetty/ee9/webapp/WebAppContext.java index 8116ca25f7d6..4db2fe492583 100644 --- a/jetty-ee9/jetty-ee9-webapp/src/main/java/org/eclipse/jetty/ee9/webapp/WebAppContext.java +++ b/jetty-ee9/jetty-ee9-webapp/src/main/java/org/eclipse/jetty/ee9/webapp/WebAppContext.java @@ -40,7 +40,7 @@ import jakarta.servlet.http.HttpSessionBindingListener; import jakarta.servlet.http.HttpSessionIdListener; import jakarta.servlet.http.HttpSessionListener; -import org.eclipse.jetty.ee.WebappProtectedClasses; +import org.eclipse.jetty.ee.WebappClassLoading; import org.eclipse.jetty.ee9.nested.ContextHandler; import org.eclipse.jetty.ee9.nested.ErrorHandler; import org.eclipse.jetty.ee9.nested.HandlerWrapper; @@ -91,25 +91,25 @@ public class WebAppContext extends ServletContextHandler implements WebAppClassL public static final String WEB_DEFAULTS_XML = "org/eclipse/jetty/ee9/webapp/webdefault-ee9.xml"; public static final String ERROR_PAGE = "org.eclipse.jetty.server.error_page"; - public static final String SERVER_SYS_CLASSES = WebappProtectedClasses.SYSTEM_CLASSES_ATTRIBUTE; - public static final String SERVER_SRV_CLASSES = WebappProtectedClasses.SERVER_CLASSES_ATTRIBUTE; + public static final String SERVER_SYS_CLASSES = WebappClassLoading.PROTECTED_CLASSES_ATTRIBUTE; + public static final String SERVER_SRV_CLASSES = WebappClassLoading.HIDDEN_CLASSES_ATTRIBUTE; private static final String[] __dftProtectedTargets = {"/WEB-INF", "/META-INF"}; /** - * @deprecated use {@link WebappProtectedClasses#DEFAULT_SYSTEM_CLASSES} + * @deprecated use {@link WebappClassLoading#DEFAULT_PROTECTED_CLASSES} */ @Deprecated - public static final ClassMatcher __dftSystemClasses = WebappProtectedClasses.DEFAULT_SYSTEM_CLASSES; + public static final ClassMatcher __dftSystemClasses = WebappClassLoading.DEFAULT_PROTECTED_CLASSES; /** - * @deprecated use {@link WebappProtectedClasses#DEFAULT_SERVER_CLASSES} + * @deprecated use {@link WebappClassLoading#DEFAULT_HIDDEN_CLASSES} */ @Deprecated - public static final ClassMatcher __dftServerClasses = WebappProtectedClasses.DEFAULT_SERVER_CLASSES; + public static final ClassMatcher __dftServerClasses = WebappClassLoading.DEFAULT_HIDDEN_CLASSES; - private final ClassMatcher _systemClasses = new ClassMatcher(WebappProtectedClasses.getSystemClasses(ServletContextHandler.ENVIRONMENT)); - private final ClassMatcher _serverClasses = new ClassMatcher(WebappProtectedClasses.getServerClasses(ServletContextHandler.ENVIRONMENT)); + private final ClassMatcher _systemClasses = new ClassMatcher(WebappClassLoading.getProtectedClasses(ServletContextHandler.ENVIRONMENT)); + private final ClassMatcher _serverClasses = new ClassMatcher(WebappClassLoading.getHiddenClasses(ServletContextHandler.ENVIRONMENT)); private Configurations _configurations; private String _defaultsDescriptor = WEB_DEFAULTS_XML; @@ -743,13 +743,13 @@ public String[] getServerClasses() } @Override - public boolean isServerClass(Class clazz) + public boolean isHiddenClass(Class clazz) { return _serverClasses.match(clazz); } @Override - public boolean isSystemClass(Class clazz) + public boolean isProtectedClass(Class clazz) { return _systemClasses.match(clazz); } @@ -772,8 +772,8 @@ public void setServer(Server server) super.setServer(server); if (server != null) { - _systemClasses.add(WebappProtectedClasses.getSystemClasses(server).getPatterns()); - _serverClasses.add(WebappProtectedClasses.getServerClasses(server).getPatterns()); + _systemClasses.add(WebappClassLoading.getProtectedClasses(server).getPatterns()); + _serverClasses.add(WebappClassLoading.getHiddenClasses(server).getPatterns()); } } @@ -1475,12 +1475,12 @@ public MetaData getMetaData() * @param patterns the patterns to use * @see #getServerClassMatcher() * @see #getServerClasses() - * @deprecated use {@link WebappProtectedClasses#addSystemClasses(Server, String...)} + * @deprecated use {@link WebappClassLoading#addProtectedClasses(Server, String...)} */ @Deprecated(since = "12.0.8", forRemoval = true) public static void addServerClasses(Server server, String... patterns) { - WebappProtectedClasses.addServerClasses(server, patterns); + WebappClassLoading.addHiddenClasses(server, patterns); } /** @@ -1489,11 +1489,11 @@ public static void addServerClasses(Server server, String... patterns) * @param patterns the patterns to use * @see #getSystemClassMatcher() * @see #getSystemClasses() - * @deprecated use {@link WebappProtectedClasses#addServerClasses(Server, String...)} + * @deprecated use {@link WebappClassLoading#addHiddenClasses(Server, String...)} */ @Deprecated(since = "12.0.8", forRemoval = true) public static void addSystemClasses(Server server, String... patterns) { - WebappProtectedClasses.addSystemClasses(server, patterns); + WebappClassLoading.addProtectedClasses(server, patterns); } } diff --git a/jetty-home/src/main/resources/modules/logging-jetty.mod b/jetty-home/src/main/resources/modules/logging-jetty.mod index e6aa3e3a631f..c068913f00f1 100644 --- a/jetty-home/src/main/resources/modules/logging-jetty.mod +++ b/jetty-home/src/main/resources/modules/logging-jetty.mod @@ -21,5 +21,5 @@ basehome:modules/logging/jetty lib/logging/jetty-slf4j-impl-${jetty.version}.jar [ini] -jetty.webapp.addServerClasses+=,org.eclipse.jetty.logging. -jetty.webapp.addServerClasses+=,${jetty.home.uri}/lib/logging/ +jetty.webapp.addHiddenClasses+=,org.eclipse.jetty.logging. +jetty.webapp.addHiddenClasses+=,${jetty.home.uri}/lib/logging/ diff --git a/jetty-home/src/main/resources/modules/logging-log4j1.mod b/jetty-home/src/main/resources/modules/logging-log4j1.mod index 653e33eb93cb..70b8a1e607a4 100644 --- a/jetty-home/src/main/resources/modules/logging-log4j1.mod +++ b/jetty-home/src/main/resources/modules/logging-log4j1.mod @@ -31,7 +31,7 @@ lib/logging/log4j-${log4j.version}.jar [ini] log4j.version?=1.2.17 -jetty.webapp.addServerClasses+=,org.apache.log4j. +jetty.webapp.addHiddenClasses+=,org.apache.log4j. [license] diff --git a/jetty-home/src/main/resources/modules/logging-log4j2.mod b/jetty-home/src/main/resources/modules/logging-log4j2.mod index 2fed6c18a4d5..42e93e4eca55 100644 --- a/jetty-home/src/main/resources/modules/logging-log4j2.mod +++ b/jetty-home/src/main/resources/modules/logging-log4j2.mod @@ -28,7 +28,7 @@ lib/logging/log4j-core-${log4j2.version}.jar [ini] log4j2.version?=@log4j2.version@ -jetty.webapp.addServerClasses+=,org.apache.logging.log4j. +jetty.webapp.addHiddenClasses+=,org.apache.logging.log4j. [license] Log4j is released under the Apache 2.0 license. diff --git a/jetty-home/src/main/resources/modules/logging-logback.mod b/jetty-home/src/main/resources/modules/logging-logback.mod index 40538f43ac0a..aa70e7f9a2ea 100644 --- a/jetty-home/src/main/resources/modules/logging-logback.mod +++ b/jetty-home/src/main/resources/modules/logging-logback.mod @@ -25,7 +25,7 @@ lib/logging/logback-core-${logback.version}.jar [ini] logback.version?=@logback.version@ -jetty.webapp.addServerClasses+=,ch.qos.logback. +jetty.webapp.addHiddenClasses+=,ch.qos.logback. [license] Logback: the reliable, generic, fast and flexible logging framework. diff --git a/jetty-home/src/main/resources/modules/logging/slf4j.mod b/jetty-home/src/main/resources/modules/logging/slf4j.mod index 4ebb74a2a872..059e02da3654 100644 --- a/jetty-home/src/main/resources/modules/logging/slf4j.mod +++ b/jetty-home/src/main/resources/modules/logging/slf4j.mod @@ -16,4 +16,4 @@ lib/logging/slf4j-api-${slf4j.version}.jar [ini] slf4j.version?=@slf4j.version@ -jetty.webapp.addServerClasses+=,org.slf4j. +jetty.webapp.addHiddenClasses+=,org.slf4j. diff --git a/jetty-integrations/jetty-gcloud/jetty-gcloud-session-manager/src/main/config-template/modules/gcloud.mod b/jetty-integrations/jetty-gcloud/jetty-gcloud-session-manager/src/main/config-template/modules/gcloud.mod index 2dc51d64d74e..4d2a7e18f5f5 100644 --- a/jetty-integrations/jetty-gcloud/jetty-gcloud-session-manager/src/main/config-template/modules/gcloud.mod +++ b/jetty-integrations/jetty-gcloud/jetty-gcloud-session-manager/src/main/config-template/modules/gcloud.mod @@ -17,4 +17,4 @@ http://www.apache.org/licenses/LICENSE-2.0.html [ini] ## Hide the gcloud libraries from deployed webapps -jetty.webapp.addServerClasses+=,${jetty.base.uri}/lib/gcloud/ +jetty.webapp.addHiddenClasses+=,${jetty.base.uri}/lib/gcloud/ diff --git a/jetty-integrations/jetty-infinispan/jetty-infinispan-embedded/src/main/config-template/modules/sessions/infinispan/embedded/infinispan-embedded-serverclasses.mod b/jetty-integrations/jetty-infinispan/jetty-infinispan-embedded/src/main/config-template/modules/sessions/infinispan/embedded/infinispan-embedded-serverclasses.mod index 6c369eb73e96..2c4d48f3cd17 100644 --- a/jetty-integrations/jetty-infinispan/jetty-infinispan-embedded/src/main/config-template/modules/sessions/infinispan/embedded/infinispan-embedded-serverclasses.mod +++ b/jetty-integrations/jetty-infinispan/jetty-infinispan-embedded/src/main/config-template/modules/sessions/infinispan/embedded/infinispan-embedded-serverclasses.mod @@ -10,4 +10,4 @@ internal [ini] ## Hide the infinispan libraries from deployed webapps -jetty.webapp.addServerClasses+=,${jetty.base.uri}/lib/infinispan/ +jetty.webapp.addHiddenClasses+=,${jetty.base.uri}/lib/infinispan/ diff --git a/jetty-integrations/jetty-infinispan/jetty-infinispan-remote/src/main/config-template/modules/sessions/infinispan/remote/infinispan-remote-serverclasses.mod b/jetty-integrations/jetty-infinispan/jetty-infinispan-remote/src/main/config-template/modules/sessions/infinispan/remote/infinispan-remote-serverclasses.mod index b36937e1c6c3..c6e9e48f4852 100644 --- a/jetty-integrations/jetty-infinispan/jetty-infinispan-remote/src/main/config-template/modules/sessions/infinispan/remote/infinispan-remote-serverclasses.mod +++ b/jetty-integrations/jetty-infinispan/jetty-infinispan-remote/src/main/config-template/modules/sessions/infinispan/remote/infinispan-remote-serverclasses.mod @@ -9,4 +9,4 @@ infinispan [ini] ## Hide the infinispan libraries from deployed webapps -jetty.webapp.addServerClasses+=,${jetty.base.uri}/lib/infinispan/ +jetty.webapp.addHiddenClasses+=,${jetty.base.uri}/lib/infinispan/ From 5bfc74f816b1f89d721f7fa36c39102ae759ad66 Mon Sep 17 00:00:00 2001 From: gregw Date: Tue, 26 Mar 2024 20:12:06 +0100 Subject: [PATCH 09/28] Updated for loss of dump.war --- .../org/eclipse/jetty/ee/WebappClassLoading.java | 13 +++++++++++++ .../jetty/ee10/webapp/WebAppContextTest.java | 13 ++++++++++--- .../eclipse/jetty/ee9/webapp/WebAppContextTest.java | 10 ++++++++-- 3 files changed, 31 insertions(+), 5 deletions(-) diff --git a/jetty-core/jetty-ee/src/main/java/org/eclipse/jetty/ee/WebappClassLoading.java b/jetty-core/jetty-ee/src/main/java/org/eclipse/jetty/ee/WebappClassLoading.java index 2b1fb5d6b7bc..02e12921822b 100644 --- a/jetty-core/jetty-ee/src/main/java/org/eclipse/jetty/ee/WebappClassLoading.java +++ b/jetty-core/jetty-ee/src/main/java/org/eclipse/jetty/ee/WebappClassLoading.java @@ -1,3 +1,16 @@ +// +// ======================================================================== +// 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 org.eclipse.jetty.ee; import org.eclipse.jetty.server.Server; diff --git a/jetty-ee10/jetty-ee10-webapp/src/test/java/org/eclipse/jetty/ee10/webapp/WebAppContextTest.java b/jetty-ee10/jetty-ee10-webapp/src/test/java/org/eclipse/jetty/ee10/webapp/WebAppContextTest.java index dc7265feb802..199d331ae86a 100644 --- a/jetty-ee10/jetty-ee10-webapp/src/test/java/org/eclipse/jetty/ee10/webapp/WebAppContextTest.java +++ b/jetty-ee10/jetty-ee10-webapp/src/test/java/org/eclipse/jetty/ee10/webapp/WebAppContextTest.java @@ -130,7 +130,7 @@ private Server newServer() * @param name the name of the war * @return the Path of the generated war * - * @throws Exception + * @throws Exception if the war could not be created */ private Path createWar(Path tempDir, String name) throws Exception { @@ -950,7 +950,11 @@ public void testAddServerClasses() throws Exception WebAppContext context = new WebAppContext(); context.setContextPath("/"); - Path warPath = MavenPaths.findTestResourceFile("wars/dump.war"); + + Path testPath = MavenPaths.targetTestDir("testAddServerClasses"); + FS.ensureDirExists(testPath); + FS.ensureEmpty(testPath); + Path warPath = createWar(testPath, "test.war"); context.setBaseResource(context.getResourceFactory().newResource(warPath)); server.setHandler(context); @@ -974,7 +978,10 @@ public void testAddSystemClasses() throws Exception WebAppContext context = new WebAppContext(); context.setContextPath("/"); - Path warPath = MavenPaths.findTestResourceFile("wars/dump.war"); + Path testPath = MavenPaths.targetTestDir("testAddServerClasses"); + FS.ensureDirExists(testPath); + FS.ensureEmpty(testPath); + Path warPath = createWar(testPath, "test.war"); context.setBaseResource(context.getResourceFactory().newResource(warPath)); server.setHandler(context); diff --git a/jetty-ee9/jetty-ee9-webapp/src/test/java/org/eclipse/jetty/ee9/webapp/WebAppContextTest.java b/jetty-ee9/jetty-ee9-webapp/src/test/java/org/eclipse/jetty/ee9/webapp/WebAppContextTest.java index 04efcaa07108..8dc13ec07c62 100644 --- a/jetty-ee9/jetty-ee9-webapp/src/test/java/org/eclipse/jetty/ee9/webapp/WebAppContextTest.java +++ b/jetty-ee9/jetty-ee9-webapp/src/test/java/org/eclipse/jetty/ee9/webapp/WebAppContextTest.java @@ -860,7 +860,10 @@ public void testAddServerClasses() throws Exception WebAppContext context = new WebAppContext(); context.setContextPath("/"); - Path warPath = MavenPaths.findTestResourceFile("wars/dump.war"); + Path testPath = MavenPaths.targetTestDir("testAddServerClasses"); + FS.ensureDirExists(testPath); + FS.ensureEmpty(testPath); + Path warPath = createWar(testPath, "test.war"); context.setBaseResource(context.getResourceFactory().newResource(warPath)); server.setHandler(context); @@ -884,7 +887,10 @@ public void testAddSystemClasses() throws Exception WebAppContext context = new WebAppContext(); context.setContextPath("/"); - Path warPath = MavenPaths.findTestResourceFile("wars/dump.war"); + Path testPath = MavenPaths.targetTestDir("testAddServerClasses"); + FS.ensureDirExists(testPath); + FS.ensureEmpty(testPath); + Path warPath = createWar(testPath, "test.war"); context.setBaseResource(context.getResourceFactory().newResource(warPath)); server.setHandler(context); From 77483580f52b252289568a750d5f6e8b24b778ea Mon Sep 17 00:00:00 2001 From: gregw Date: Wed, 27 Mar 2024 10:04:25 +0100 Subject: [PATCH 10/28] revert name changes in ee8 and ee9 --- .../src/main/config/etc/jetty-ee8-webapp.xml | 4 ++-- .../src/main/config/modules/ee8-webapp.mod | 8 ++++---- .../src/main/config/etc/jetty-ee9-webapp.xml | 8 ++++---- .../src/main/config/modules/ee9-webapp.mod | 8 ++++---- 4 files changed, 14 insertions(+), 14 deletions(-) diff --git a/jetty-ee8/jetty-ee8-webapp/src/main/config/etc/jetty-ee8-webapp.xml b/jetty-ee8/jetty-ee8-webapp/src/main/config/etc/jetty-ee8-webapp.xml index 16ec7507ebd0..a39427120d4c 100644 --- a/jetty-ee8/jetty-ee8-webapp/src/main/config/etc/jetty-ee8-webapp.xml +++ b/jetty-ee8/jetty-ee8-webapp/src/main/config/etc/jetty-ee8-webapp.xml @@ -6,7 +6,7 @@ - + @@ -15,7 +15,7 @@ - + diff --git a/jetty-ee8/jetty-ee8-webapp/src/main/config/modules/ee8-webapp.mod b/jetty-ee8/jetty-ee8-webapp/src/main/config/modules/ee8-webapp.mod index 152944da3a09..d01b4f13590c 100644 --- a/jetty-ee8/jetty-ee8-webapp/src/main/config/modules/ee8-webapp.mod +++ b/jetty-ee8/jetty-ee8-webapp/src/main/config/modules/ee8-webapp.mod @@ -20,8 +20,8 @@ lib/jetty-ee8-webapp-${jetty.version}.jar [ini-template] ## Add to the environment wide default jars and packages protected or hidden from webapps. -## Protected (aka System) classes cannot be overridden by a webapp. -## Hidden (aka Server) classes cannot be seen by a webapp +## System (aka Protected) classes cannot be overridden by a webapp. +## Server (aka Hidden) classes cannot be seen by a webapp ## Lists of patterns are comma separated and may be either: ## + a qualified classname e.g. 'com.acme.Foo' ## + a package name e.g. 'net.example.' @@ -31,8 +31,8 @@ lib/jetty-ee8-webapp-${jetty.version}.jar ## ## The +=, operator appends to a CSV list with a comma as needed. ## -#jetty.webapp.addProtectedClasses+=,org.example. -#jetty.webapp.addHiddenClasses+=,org.example. +#jetty.webapp.addSystemClasses+=,org.example. +#jetty.webapp.addServerClasses+=,org.example. [ini] contextHandlerClass=org.eclipse.jetty.ee8.webapp.WebAppContext diff --git a/jetty-ee9/jetty-ee9-webapp/src/main/config/etc/jetty-ee9-webapp.xml b/jetty-ee9/jetty-ee9-webapp/src/main/config/etc/jetty-ee9-webapp.xml index af859f4528b3..f726687eabbc 100644 --- a/jetty-ee9/jetty-ee9-webapp/src/main/config/etc/jetty-ee9-webapp.xml +++ b/jetty-ee9/jetty-ee9-webapp/src/main/config/etc/jetty-ee9-webapp.xml @@ -2,20 +2,20 @@ - + - + - + - + diff --git a/jetty-ee9/jetty-ee9-webapp/src/main/config/modules/ee9-webapp.mod b/jetty-ee9/jetty-ee9-webapp/src/main/config/modules/ee9-webapp.mod index ab28ee845747..023169ec38b9 100644 --- a/jetty-ee9/jetty-ee9-webapp/src/main/config/modules/ee9-webapp.mod +++ b/jetty-ee9/jetty-ee9-webapp/src/main/config/modules/ee9-webapp.mod @@ -20,8 +20,8 @@ lib/jetty-ee9-webapp-${jetty.version}.jar [ini-template] ## Add to the environment wide default jars and packages protected or hidden from webapps. -## Protected (aka System) classes cannot be overridden by a webapp. -## Hidden (aka Server) classes cannot be seen by a webapp +## System (aka Protected) classes cannot be overridden by a webapp. +## Server (aka Hidden) classes cannot be seen by a webapp ## Lists of patterns are comma separated and may be either: ## + a qualified classname e.g. 'com.acme.Foo' ## + a package name e.g. 'net.example.' @@ -31,8 +31,8 @@ lib/jetty-ee9-webapp-${jetty.version}.jar ## ## The +=, operator appends to a CSV list with a comma as needed. ## -#jetty.webapp.addProtectedClasses+=,org.example. -#jetty.webapp.addHiddenClasses+=,org.example. +#jetty.webapp.addSystemClasses+=,org.example. +#jetty.webapp.addServerClasses+=,org.example. [ini] contextHandlerClass?=org.eclipse.jetty.ee9.webapp.WebAppContext From 4214001a791cf4f85f2e063f468504f8b1819d52 Mon Sep 17 00:00:00 2001 From: gregw Date: Wed, 27 Mar 2024 13:38:44 +0100 Subject: [PATCH 11/28] revert reverted name changes in ee8 and ee9 --- .../jetty-ee/src/main/config/modules/ee-webapp.mod | 2 +- .../src/main/config/etc/jetty-ee8-webapp.xml | 13 ++++++------- .../src/main/config/modules/ee8-webapp.mod | 4 ++-- .../src/main/config/etc/jetty-ee9-webapp.xml | 9 ++++----- .../src/main/config/modules/ee9-webapp.mod | 4 ++-- 5 files changed, 15 insertions(+), 17 deletions(-) diff --git a/jetty-core/jetty-ee/src/main/config/modules/ee-webapp.mod b/jetty-core/jetty-ee/src/main/config/modules/ee-webapp.mod index b9f62c4ad48c..db2420cf4f29 100644 --- a/jetty-core/jetty-ee/src/main/config/modules/ee-webapp.mod +++ b/jetty-core/jetty-ee/src/main/config/modules/ee-webapp.mod @@ -9,7 +9,7 @@ This module provide common configuration of Java Servlet web applications over a etc/jetty-ee-webapp.xml [lib] -lib/jetty-ee-webapp-${jetty.version}.jar +lib/jetty-ee-${jetty.version}.jar [ini-template] # tag::ini-template[] diff --git a/jetty-ee8/jetty-ee8-webapp/src/main/config/etc/jetty-ee8-webapp.xml b/jetty-ee8/jetty-ee8-webapp/src/main/config/etc/jetty-ee8-webapp.xml index a39427120d4c..d2d966d56d3c 100644 --- a/jetty-ee8/jetty-ee8-webapp/src/main/config/etc/jetty-ee8-webapp.xml +++ b/jetty-ee8/jetty-ee8-webapp/src/main/config/etc/jetty-ee8-webapp.xml @@ -2,22 +2,21 @@ - - + + - + - - + + - + - diff --git a/jetty-ee8/jetty-ee8-webapp/src/main/config/modules/ee8-webapp.mod b/jetty-ee8/jetty-ee8-webapp/src/main/config/modules/ee8-webapp.mod index d01b4f13590c..f1bd99183c8b 100644 --- a/jetty-ee8/jetty-ee8-webapp/src/main/config/modules/ee8-webapp.mod +++ b/jetty-ee8/jetty-ee8-webapp/src/main/config/modules/ee8-webapp.mod @@ -31,8 +31,8 @@ lib/jetty-ee8-webapp-${jetty.version}.jar ## ## The +=, operator appends to a CSV list with a comma as needed. ## -#jetty.webapp.addSystemClasses+=,org.example. -#jetty.webapp.addServerClasses+=,org.example. +#jetty.webapp.addProtectedClasses+=,org.example. +#jetty.webapp.addHiddenClasses+=,org.example. [ini] contextHandlerClass=org.eclipse.jetty.ee8.webapp.WebAppContext diff --git a/jetty-ee9/jetty-ee9-webapp/src/main/config/etc/jetty-ee9-webapp.xml b/jetty-ee9/jetty-ee9-webapp/src/main/config/etc/jetty-ee9-webapp.xml index f726687eabbc..7359df998a32 100644 --- a/jetty-ee9/jetty-ee9-webapp/src/main/config/etc/jetty-ee9-webapp.xml +++ b/jetty-ee9/jetty-ee9-webapp/src/main/config/etc/jetty-ee9-webapp.xml @@ -2,22 +2,21 @@ - + - + - + - + - diff --git a/jetty-ee9/jetty-ee9-webapp/src/main/config/modules/ee9-webapp.mod b/jetty-ee9/jetty-ee9-webapp/src/main/config/modules/ee9-webapp.mod index 023169ec38b9..56301513d116 100644 --- a/jetty-ee9/jetty-ee9-webapp/src/main/config/modules/ee9-webapp.mod +++ b/jetty-ee9/jetty-ee9-webapp/src/main/config/modules/ee9-webapp.mod @@ -31,8 +31,8 @@ lib/jetty-ee9-webapp-${jetty.version}.jar ## ## The +=, operator appends to a CSV list with a comma as needed. ## -#jetty.webapp.addSystemClasses+=,org.example. -#jetty.webapp.addServerClasses+=,org.example. +#jetty.webapp.addProtectedClasses+=,org.example. +#jetty.webapp.addHiddenClasses+=,org.example. [ini] contextHandlerClass?=org.eclipse.jetty.ee9.webapp.WebAppContext From ddc6dc28d367224b39a772b213097a4483609bd1 Mon Sep 17 00:00:00 2001 From: Greg Wilkins Date: Wed, 27 Mar 2024 17:31:27 +0100 Subject: [PATCH 12/28] Update jetty-core/jetty-ee/src/main/java/org/eclipse/jetty/ee/WebappClassLoading.java Co-authored-by: Jan Bartel --- .../src/main/java/org/eclipse/jetty/ee/WebappClassLoading.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/jetty-core/jetty-ee/src/main/java/org/eclipse/jetty/ee/WebappClassLoading.java b/jetty-core/jetty-ee/src/main/java/org/eclipse/jetty/ee/WebappClassLoading.java index 02e12921822b..891d2b841fcc 100644 --- a/jetty-core/jetty-ee/src/main/java/org/eclipse/jetty/ee/WebappClassLoading.java +++ b/jetty-core/jetty-ee/src/main/java/org/eclipse/jetty/ee/WebappClassLoading.java @@ -48,7 +48,7 @@ * can be directly access to configure a specific context. *

*/ -public class WebappClassLoading +public class WebAppClassLoading { public static final String PROTECTED_CLASSES_ATTRIBUTE = "org.eclipse.jetty.webapp.systemClasses"; public static final String HIDDEN_CLASSES_ATTRIBUTE = "org.eclipse.jetty.webapp.serverClasses"; From ce085027d2c97fe4ff557925f42b16b825b859f3 Mon Sep 17 00:00:00 2001 From: gregw Date: Wed, 27 Mar 2024 17:35:01 +0100 Subject: [PATCH 13/28] renamed as per review --- .../src/main/config/etc/jetty-ee-webapp.xml | 4 +-- ...ssLoading.java => WebAppClassLoading.java} | 0 .../src/main/config/etc/jetty-ee10-webapp.xml | 4 +-- .../jetty/ee10/webapp/WebAppContext.java | 30 +++++++++---------- .../jetty/ee10/webapp/WebAppContextTest.java | 6 ++-- .../src/main/config/etc/jetty-ee8-webapp.xml | 4 +-- .../src/main/config/etc/jetty-ee9-webapp.xml | 4 +-- .../jetty/ee9/webapp/WebAppContext.java | 30 +++++++++---------- 8 files changed, 41 insertions(+), 41 deletions(-) rename jetty-core/jetty-ee/src/main/java/org/eclipse/jetty/ee/{WebappClassLoading.java => WebAppClassLoading.java} (100%) diff --git a/jetty-core/jetty-ee/src/main/config/etc/jetty-ee-webapp.xml b/jetty-core/jetty-ee/src/main/config/etc/jetty-ee-webapp.xml index cb3442903c70..0ba8f34ec729 100644 --- a/jetty-core/jetty-ee/src/main/config/etc/jetty-ee-webapp.xml +++ b/jetty-core/jetty-ee/src/main/config/etc/jetty-ee-webapp.xml @@ -2,7 +2,7 @@ - + @@ -11,7 +11,7 @@ - + diff --git a/jetty-core/jetty-ee/src/main/java/org/eclipse/jetty/ee/WebappClassLoading.java b/jetty-core/jetty-ee/src/main/java/org/eclipse/jetty/ee/WebAppClassLoading.java similarity index 100% rename from jetty-core/jetty-ee/src/main/java/org/eclipse/jetty/ee/WebappClassLoading.java rename to jetty-core/jetty-ee/src/main/java/org/eclipse/jetty/ee/WebAppClassLoading.java diff --git a/jetty-ee10/jetty-ee10-webapp/src/main/config/etc/jetty-ee10-webapp.xml b/jetty-ee10/jetty-ee10-webapp/src/main/config/etc/jetty-ee10-webapp.xml index 7359df998a32..2a964d7eeae9 100644 --- a/jetty-ee10/jetty-ee10-webapp/src/main/config/etc/jetty-ee10-webapp.xml +++ b/jetty-ee10/jetty-ee10-webapp/src/main/config/etc/jetty-ee10-webapp.xml @@ -2,7 +2,7 @@ - + @@ -11,7 +11,7 @@ - + diff --git a/jetty-ee10/jetty-ee10-webapp/src/main/java/org/eclipse/jetty/ee10/webapp/WebAppContext.java b/jetty-ee10/jetty-ee10-webapp/src/main/java/org/eclipse/jetty/ee10/webapp/WebAppContext.java index f45f6959081c..4c3ab222a090 100644 --- a/jetty-ee10/jetty-ee10-webapp/src/main/java/org/eclipse/jetty/ee10/webapp/WebAppContext.java +++ b/jetty-ee10/jetty-ee10-webapp/src/main/java/org/eclipse/jetty/ee10/webapp/WebAppContext.java @@ -38,7 +38,7 @@ import jakarta.servlet.http.HttpSessionBindingListener; import jakarta.servlet.http.HttpSessionIdListener; import jakarta.servlet.http.HttpSessionListener; -import org.eclipse.jetty.ee.WebappClassLoading; +import org.eclipse.jetty.ee.WebAppClassLoading; import org.eclipse.jetty.ee10.servlet.ErrorHandler; import org.eclipse.jetty.ee10.servlet.ErrorPageErrorHandler; import org.eclipse.jetty.ee10.servlet.ServletContextHandler; @@ -85,25 +85,25 @@ public class WebAppContext extends ServletContextHandler implements WebAppClassL static final Logger LOG = LoggerFactory.getLogger(WebAppContext.class); public static final String WEB_DEFAULTS_XML = "org/eclipse/jetty/ee10/webapp/webdefault-ee10.xml"; - public static final String SERVER_SYS_CLASSES = WebappClassLoading.PROTECTED_CLASSES_ATTRIBUTE; - public static final String SERVER_SRV_CLASSES = WebappClassLoading.HIDDEN_CLASSES_ATTRIBUTE; + public static final String SERVER_SYS_CLASSES = WebAppClassLoading.PROTECTED_CLASSES_ATTRIBUTE; + public static final String SERVER_SRV_CLASSES = WebAppClassLoading.HIDDEN_CLASSES_ATTRIBUTE; private static final String[] __dftProtectedTargets = {"/WEB-INF", "/META-INF"}; /** - * @deprecated use {@link WebappClassLoading#DEFAULT_PROTECTED_CLASSES} + * @deprecated use {@link WebAppClassLoading#DEFAULT_PROTECTED_CLASSES} */ @Deprecated - public static final ClassMatcher __dftSystemClasses = WebappClassLoading.DEFAULT_PROTECTED_CLASSES; + public static final ClassMatcher __dftSystemClasses = WebAppClassLoading.DEFAULT_PROTECTED_CLASSES; /** - * @deprecated use {@link WebappClassLoading#DEFAULT_HIDDEN_CLASSES} + * @deprecated use {@link WebAppClassLoading#DEFAULT_HIDDEN_CLASSES} */ @Deprecated - public static final ClassMatcher __dftServerClasses = WebappClassLoading.DEFAULT_HIDDEN_CLASSES; + public static final ClassMatcher __dftServerClasses = WebAppClassLoading.DEFAULT_HIDDEN_CLASSES; - private final ClassMatcher _protectedClasses = new ClassMatcher(WebappClassLoading.getProtectedClasses(ServletContextHandler.ENVIRONMENT)); - private final ClassMatcher _hiddenClasses = new ClassMatcher(WebappClassLoading.getHiddenClasses(ServletContextHandler.ENVIRONMENT)); + private final ClassMatcher _protectedClasses = new ClassMatcher(WebAppClassLoading.getProtectedClasses(ServletContextHandler.ENVIRONMENT)); + private final ClassMatcher _hiddenClasses = new ClassMatcher(WebAppClassLoading.getHiddenClasses(ServletContextHandler.ENVIRONMENT)); private Configurations _configurations; private String _defaultsDescriptor = WEB_DEFAULTS_XML; @@ -832,8 +832,8 @@ public void setServer(Server server) super.setServer(server); if (server != null) { - _protectedClasses.add(WebappClassLoading.getProtectedClasses(server).getPatterns()); - _hiddenClasses.add(WebappClassLoading.getHiddenClasses(server).getPatterns()); + _protectedClasses.add(WebAppClassLoading.getProtectedClasses(server).getPatterns()); + _hiddenClasses.add(WebAppClassLoading.getHiddenClasses(server).getPatterns()); } } @@ -1511,12 +1511,12 @@ public MetaData getMetaData() * @param patterns the patterns to use * @see #getHiddenClassMatcher() * @see #getHiddenClasses() - * @deprecated use {@link WebappClassLoading#addProtectedClasses(Server, String...)} + * @deprecated use {@link WebAppClassLoading#addProtectedClasses(Server, String...)} */ @Deprecated(since = "12.0.8", forRemoval = true) public static void addServerClasses(Server server, String... patterns) { - WebappClassLoading.addHiddenClasses(server, patterns); + WebAppClassLoading.addHiddenClasses(server, patterns); } /** @@ -1525,11 +1525,11 @@ public static void addServerClasses(Server server, String... patterns) * @param patterns the patterns to use * @see #getProtectedClassMatcher() * @see #getProtectedClasses() - * @deprecated use {@link WebappClassLoading#addHiddenClasses(Server, String...)} + * @deprecated use {@link WebAppClassLoading#addHiddenClasses(Server, String...)} */ @Deprecated(since = "12.0.8", forRemoval = true) public static void addSystemClasses(Server server, String... patterns) { - WebappClassLoading.addProtectedClasses(server, patterns); + WebAppClassLoading.addProtectedClasses(server, patterns); } } diff --git a/jetty-ee10/jetty-ee10-webapp/src/test/java/org/eclipse/jetty/ee10/webapp/WebAppContextTest.java b/jetty-ee10/jetty-ee10-webapp/src/test/java/org/eclipse/jetty/ee10/webapp/WebAppContextTest.java index 199d331ae86a..1fb67d58166d 100644 --- a/jetty-ee10/jetty-ee10-webapp/src/test/java/org/eclipse/jetty/ee10/webapp/WebAppContextTest.java +++ b/jetty-ee10/jetty-ee10-webapp/src/test/java/org/eclipse/jetty/ee10/webapp/WebAppContextTest.java @@ -36,7 +36,7 @@ import jakarta.servlet.ServletContext; import jakarta.servlet.ServletRequest; import jakarta.servlet.ServletResponse; -import org.eclipse.jetty.ee.WebappClassLoading; +import org.eclipse.jetty.ee.WebAppClassLoading; import org.eclipse.jetty.ee10.servlet.ErrorPageErrorHandler; import org.eclipse.jetty.ee10.servlet.ServletContextHandler; import org.eclipse.jetty.http.HttpStatus; @@ -963,7 +963,7 @@ public void testAddServerClasses() throws Exception List serverClasses = List.of(context.getHiddenClasses()); assertThat("Should have environment specific test pattern", serverClasses, hasItem(testPattern)); assertThat("Should have pattern from JaasConfiguration", serverClasses, hasItem("-org.eclipse.jetty.security.jaas.")); - for (String defaultServerClass: WebappClassLoading.DEFAULT_HIDDEN_CLASSES) + for (String defaultServerClass: WebAppClassLoading.DEFAULT_HIDDEN_CLASSES) assertThat("Should have default patterns", serverClasses, hasItem(defaultServerClass)); } @@ -990,7 +990,7 @@ public void testAddSystemClasses() throws Exception List systemClasses = List.of(context.getProtectedClasses()); assertThat("Should have environment specific test pattern", systemClasses, hasItem(testPattern)); assertThat("Should have pattern from JaasConfiguration", systemClasses, hasItem("org.eclipse.jetty.security.jaas.")); - for (String defaultSystemClass: WebappClassLoading.DEFAULT_PROTECTED_CLASSES) + for (String defaultSystemClass: WebAppClassLoading.DEFAULT_PROTECTED_CLASSES) assertThat("Should have default patterns", systemClasses, hasItem(defaultSystemClass)); } } diff --git a/jetty-ee8/jetty-ee8-webapp/src/main/config/etc/jetty-ee8-webapp.xml b/jetty-ee8/jetty-ee8-webapp/src/main/config/etc/jetty-ee8-webapp.xml index d2d966d56d3c..d041fcdb3f8b 100644 --- a/jetty-ee8/jetty-ee8-webapp/src/main/config/etc/jetty-ee8-webapp.xml +++ b/jetty-ee8/jetty-ee8-webapp/src/main/config/etc/jetty-ee8-webapp.xml @@ -2,7 +2,7 @@ - + @@ -11,7 +11,7 @@ - + diff --git a/jetty-ee9/jetty-ee9-webapp/src/main/config/etc/jetty-ee9-webapp.xml b/jetty-ee9/jetty-ee9-webapp/src/main/config/etc/jetty-ee9-webapp.xml index 7359df998a32..2a964d7eeae9 100644 --- a/jetty-ee9/jetty-ee9-webapp/src/main/config/etc/jetty-ee9-webapp.xml +++ b/jetty-ee9/jetty-ee9-webapp/src/main/config/etc/jetty-ee9-webapp.xml @@ -2,7 +2,7 @@ - + @@ -11,7 +11,7 @@ - + diff --git a/jetty-ee9/jetty-ee9-webapp/src/main/java/org/eclipse/jetty/ee9/webapp/WebAppContext.java b/jetty-ee9/jetty-ee9-webapp/src/main/java/org/eclipse/jetty/ee9/webapp/WebAppContext.java index 4db2fe492583..b66589823162 100644 --- a/jetty-ee9/jetty-ee9-webapp/src/main/java/org/eclipse/jetty/ee9/webapp/WebAppContext.java +++ b/jetty-ee9/jetty-ee9-webapp/src/main/java/org/eclipse/jetty/ee9/webapp/WebAppContext.java @@ -40,7 +40,7 @@ import jakarta.servlet.http.HttpSessionBindingListener; import jakarta.servlet.http.HttpSessionIdListener; import jakarta.servlet.http.HttpSessionListener; -import org.eclipse.jetty.ee.WebappClassLoading; +import org.eclipse.jetty.ee.WebAppClassLoading; import org.eclipse.jetty.ee9.nested.ContextHandler; import org.eclipse.jetty.ee9.nested.ErrorHandler; import org.eclipse.jetty.ee9.nested.HandlerWrapper; @@ -91,25 +91,25 @@ public class WebAppContext extends ServletContextHandler implements WebAppClassL public static final String WEB_DEFAULTS_XML = "org/eclipse/jetty/ee9/webapp/webdefault-ee9.xml"; public static final String ERROR_PAGE = "org.eclipse.jetty.server.error_page"; - public static final String SERVER_SYS_CLASSES = WebappClassLoading.PROTECTED_CLASSES_ATTRIBUTE; - public static final String SERVER_SRV_CLASSES = WebappClassLoading.HIDDEN_CLASSES_ATTRIBUTE; + public static final String SERVER_SYS_CLASSES = WebAppClassLoading.PROTECTED_CLASSES_ATTRIBUTE; + public static final String SERVER_SRV_CLASSES = WebAppClassLoading.HIDDEN_CLASSES_ATTRIBUTE; private static final String[] __dftProtectedTargets = {"/WEB-INF", "/META-INF"}; /** - * @deprecated use {@link WebappClassLoading#DEFAULT_PROTECTED_CLASSES} + * @deprecated use {@link WebAppClassLoading#DEFAULT_PROTECTED_CLASSES} */ @Deprecated - public static final ClassMatcher __dftSystemClasses = WebappClassLoading.DEFAULT_PROTECTED_CLASSES; + public static final ClassMatcher __dftSystemClasses = WebAppClassLoading.DEFAULT_PROTECTED_CLASSES; /** - * @deprecated use {@link WebappClassLoading#DEFAULT_HIDDEN_CLASSES} + * @deprecated use {@link WebAppClassLoading#DEFAULT_HIDDEN_CLASSES} */ @Deprecated - public static final ClassMatcher __dftServerClasses = WebappClassLoading.DEFAULT_HIDDEN_CLASSES; + public static final ClassMatcher __dftServerClasses = WebAppClassLoading.DEFAULT_HIDDEN_CLASSES; - private final ClassMatcher _systemClasses = new ClassMatcher(WebappClassLoading.getProtectedClasses(ServletContextHandler.ENVIRONMENT)); - private final ClassMatcher _serverClasses = new ClassMatcher(WebappClassLoading.getHiddenClasses(ServletContextHandler.ENVIRONMENT)); + private final ClassMatcher _systemClasses = new ClassMatcher(WebAppClassLoading.getProtectedClasses(ServletContextHandler.ENVIRONMENT)); + private final ClassMatcher _serverClasses = new ClassMatcher(WebAppClassLoading.getHiddenClasses(ServletContextHandler.ENVIRONMENT)); private Configurations _configurations; private String _defaultsDescriptor = WEB_DEFAULTS_XML; @@ -772,8 +772,8 @@ public void setServer(Server server) super.setServer(server); if (server != null) { - _systemClasses.add(WebappClassLoading.getProtectedClasses(server).getPatterns()); - _serverClasses.add(WebappClassLoading.getHiddenClasses(server).getPatterns()); + _systemClasses.add(WebAppClassLoading.getProtectedClasses(server).getPatterns()); + _serverClasses.add(WebAppClassLoading.getHiddenClasses(server).getPatterns()); } } @@ -1475,12 +1475,12 @@ public MetaData getMetaData() * @param patterns the patterns to use * @see #getServerClassMatcher() * @see #getServerClasses() - * @deprecated use {@link WebappClassLoading#addProtectedClasses(Server, String...)} + * @deprecated use {@link WebAppClassLoading#addProtectedClasses(Server, String...)} */ @Deprecated(since = "12.0.8", forRemoval = true) public static void addServerClasses(Server server, String... patterns) { - WebappClassLoading.addHiddenClasses(server, patterns); + WebAppClassLoading.addHiddenClasses(server, patterns); } /** @@ -1489,11 +1489,11 @@ public static void addServerClasses(Server server, String... patterns) * @param patterns the patterns to use * @see #getSystemClassMatcher() * @see #getSystemClasses() - * @deprecated use {@link WebappClassLoading#addHiddenClasses(Server, String...)} + * @deprecated use {@link WebAppClassLoading#addHiddenClasses(Server, String...)} */ @Deprecated(since = "12.0.8", forRemoval = true) public static void addSystemClasses(Server server, String... patterns) { - WebappClassLoading.addProtectedClasses(server, patterns); + WebAppClassLoading.addProtectedClasses(server, patterns); } } From 94c0cae726ffb7b1d26487402ba38ea682ced061 Mon Sep 17 00:00:00 2001 From: gregw Date: Fri, 29 Mar 2024 11:29:18 +0100 Subject: [PATCH 14/28] fixed OSGi tests --- .../test/java/org/eclipse/jetty/ee10/osgi/test/TestOSGiUtil.java | 1 + 1 file changed, 1 insertion(+) diff --git a/jetty-ee10/jetty-ee10-osgi/test-jetty-ee10-osgi/src/test/java/org/eclipse/jetty/ee10/osgi/test/TestOSGiUtil.java b/jetty-ee10/jetty-ee10-osgi/test-jetty-ee10-osgi/src/test/java/org/eclipse/jetty/ee10/osgi/test/TestOSGiUtil.java index fafe558a150e..cefc69ea1854 100644 --- a/jetty-ee10/jetty-ee10-osgi/test-jetty-ee10-osgi/src/test/java/org/eclipse/jetty/ee10/osgi/test/TestOSGiUtil.java +++ b/jetty-ee10/jetty-ee10-osgi/test-jetty-ee10-osgi/src/test/java/org/eclipse/jetty/ee10/osgi/test/TestOSGiUtil.java @@ -233,6 +233,7 @@ public static void coreJettyDependencies(List