This is an automated email from the ASF dual-hosted git repository. markt pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/tomcat.git
commit 40021ab1a249366855a4ccb8643f9c58c19a81d0 Author: Mark Thomas <ma...@apache.org> AuthorDate: Fri Oct 4 17:44:04 2019 +0100 Add a module check when processing the scan for server endpoints --- java/org/apache/tomcat/util/compat/Jre9Compat.java | 21 +++++++++++++++++++++ java/org/apache/tomcat/util/compat/JreCompat.java | 13 +++++++++++++ java/org/apache/tomcat/websocket/server/WsSci.java | 9 +++++++-- webapps/docs/changelog.xml | 4 ++++ 4 files changed, 45 insertions(+), 2 deletions(-) diff --git a/java/org/apache/tomcat/util/compat/Jre9Compat.java b/java/org/apache/tomcat/util/compat/Jre9Compat.java index 98adc3d..29fef06 100644 --- a/java/org/apache/tomcat/util/compat/Jre9Compat.java +++ b/java/org/apache/tomcat/util/compat/Jre9Compat.java @@ -59,6 +59,8 @@ class Jre9Compat extends JreCompat { private static final Object RUNTIME_VERSION; private static final int RUNTIME_MAJOR_VERSION; private static final Method canAccessMethod; + private static final Method getModuleMethod; + private static final Method isExportedMethod; static { Class<?> c1 = null; @@ -77,6 +79,8 @@ class Jre9Compat extends JreCompat { Object o14 = null; Object o15 = null; Method m16 = null; + Method m17 = null; + Method m18 = null; try { // Order is important for the error handling below. @@ -107,6 +111,9 @@ class Jre9Compat extends JreCompat { o14 = runtimeVersionMethod.invoke(null); o15 = majorMethod.invoke(o14); m16 = AccessibleObject.class.getMethod("canAccess", new Class<?>[] { Object.class }); + m17 = Class.class.getMethod("getModule"); + Class<?> moduleClass = Class.forName("java.lang.Module"); + m18 = moduleClass.getMethod("isExported", String.class); } catch (ClassNotFoundException e) { if (c1 == null) { @@ -144,6 +151,8 @@ class Jre9Compat extends JreCompat { } canAccessMethod = m16; + getModuleMethod = m17; + isExportedMethod = m18; } @@ -253,4 +262,16 @@ class Jre9Compat extends JreCompat { return false; } } + + + @Override + public boolean isExported(Class<?> type) { + try { + String packageName = type.getPackage().getName(); + Object module = getModuleMethod.invoke(type); + return ((Boolean) isExportedMethod.invoke(module, packageName)).booleanValue(); + } catch (ReflectiveOperationException e) { + return false; + } + } } diff --git a/java/org/apache/tomcat/util/compat/JreCompat.java b/java/org/apache/tomcat/util/compat/JreCompat.java index 9576fbd..b33175b 100644 --- a/java/org/apache/tomcat/util/compat/JreCompat.java +++ b/java/org/apache/tomcat/util/compat/JreCompat.java @@ -211,4 +211,17 @@ public class JreCompat { // Java 8 doesn't support modules so default to true return true; } + + + /** + * Is the given class in an exported package? + * + * @param type The class to test + * + * @return Always {@code true} for Java 8. {@code true} if the enclosing + * package is exported for Java 9+ + */ + public boolean isExported(Class<?> type) { + return true; + } } diff --git a/java/org/apache/tomcat/websocket/server/WsSci.java b/java/org/apache/tomcat/websocket/server/WsSci.java index 6f98f43..6396c60 100644 --- a/java/org/apache/tomcat/websocket/server/WsSci.java +++ b/java/org/apache/tomcat/websocket/server/WsSci.java @@ -31,6 +31,8 @@ import javax.websocket.server.ServerApplicationConfig; import javax.websocket.server.ServerEndpoint; import javax.websocket.server.ServerEndpointConfig; +import org.apache.tomcat.util.compat.JreCompat; + /** * Registers an interest in any class that is annotated with * {@link ServerEndpoint} so that Endpoint can be published via the WebSocket @@ -60,11 +62,14 @@ public class WsSci implements ServletContainerInitializer { String wsPackage = ContainerProvider.class.getName(); wsPackage = wsPackage.substring(0, wsPackage.lastIndexOf('.') + 1); for (Class<?> clazz : clazzes) { + JreCompat jreCompat = JreCompat.getInstance(); int modifiers = clazz.getModifiers(); if (!Modifier.isPublic(modifiers) || Modifier.isAbstract(modifiers) || - Modifier.isInterface(modifiers)) { - // Non-public, abstract or interface - skip it. + Modifier.isInterface(modifiers) || + !jreCompat.isExported(clazz)) { + // Non-public, abstract, interface or not in an exported + // package (Java 9+) - skip it. continue; } // Protect against scanning the WebSocket API JARs diff --git a/webapps/docs/changelog.xml b/webapps/docs/changelog.xml index cde6e30..239241e 100644 --- a/webapps/docs/changelog.xml +++ b/webapps/docs/changelog.xml @@ -93,6 +93,10 @@ Socket HTTP upgrade request only contains a port if a non-default port is being used. (markt) </fix> + <fix> + When running on Java 9 and above, don't attempt to instantiate WebSocket + Endpoints found in modules that are not exported. (markt) + </fix> </changelog> </subsection> <subsection name="Web Applications"> --------------------------------------------------------------------- To unsubscribe, e-mail: dev-unsubscr...@tomcat.apache.org For additional commands, e-mail: dev-h...@tomcat.apache.org