You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@tomcat.apache.org by ma...@apache.org on 2017/10/06 09:59:31 UTC

svn commit: r1811311 - in /tomcat/trunk/java: javax/el/ javax/security/auth/message/config/ javax/websocket/ javax/websocket/server/ org/apache/catalina/authenticator/jaspic/ org/apache/catalina/connector/ org/apache/catalina/core/ org/apache/catalina/...

Author: markt
Date: Fri Oct  6 09:59:31 2017
New Revision: 1811311

URL: http://svn.apache.org/viewvc?rev=1811311&view=rev
Log:
Refactor
Use ReflectiveOperationException rather than multiple sub-classes

Modified:
    tomcat/trunk/java/javax/el/ExpressionFactory.java
    tomcat/trunk/java/javax/el/StaticFieldELResolver.java
    tomcat/trunk/java/javax/security/auth/message/config/AuthConfigFactory.java
    tomcat/trunk/java/javax/websocket/ContainerProvider.java
    tomcat/trunk/java/javax/websocket/server/ServerEndpointConfig.java
    tomcat/trunk/java/org/apache/catalina/authenticator/jaspic/AuthConfigFactoryImpl.java
    tomcat/trunk/java/org/apache/catalina/authenticator/jaspic/SimpleServerAuthConfig.java
    tomcat/trunk/java/org/apache/catalina/connector/Request.java
    tomcat/trunk/java/org/apache/catalina/core/ApplicationContext.java
    tomcat/trunk/java/org/apache/catalina/core/ApplicationFilterConfig.java
    tomcat/trunk/java/org/apache/catalina/core/AsyncContextImpl.java
    tomcat/trunk/java/org/apache/catalina/realm/JAASRealm.java
    tomcat/trunk/java/org/apache/catalina/startup/Tomcat.java
    tomcat/trunk/java/org/apache/juli/logging/LogFactory.java
    tomcat/trunk/java/org/apache/tomcat/util/compat/Jre9Compat.java
    tomcat/trunk/java/org/apache/tomcat/util/compat/JreCompat.java

Modified: tomcat/trunk/java/javax/el/ExpressionFactory.java
URL: http://svn.apache.org/viewvc/tomcat/trunk/java/javax/el/ExpressionFactory.java?rev=1811311&r1=1811310&r2=1811311&view=diff
==============================================================================
--- tomcat/trunk/java/javax/el/ExpressionFactory.java (original)
+++ tomcat/trunk/java/javax/el/ExpressionFactory.java Fri Oct  6 09:59:31 2017
@@ -175,17 +175,16 @@ public abstract class ExpressionFactory
                     (ExpressionFactory) constructor.newInstance(properties);
             }
 
-        } catch (InstantiationException | IllegalAccessException | IllegalArgumentException |
-                NoSuchMethodException e) {
-            throw new ELException(
-                    "Unable to create ExpressionFactory of type: " + clazz.getName(),
-                    e);
         } catch (InvocationTargetException e) {
             Throwable cause = e.getCause();
             Util.handleThrowable(cause);
             throw new ELException(
                     "Unable to create ExpressionFactory of type: " + clazz.getName(),
                     e);
+        } catch (ReflectiveOperationException | IllegalArgumentException e) {
+            throw new ELException(
+                    "Unable to create ExpressionFactory of type: " + clazz.getName(),
+                    e);
         }
 
         return result;

Modified: tomcat/trunk/java/javax/el/StaticFieldELResolver.java
URL: http://svn.apache.org/viewvc/tomcat/trunk/java/javax/el/StaticFieldELResolver.java?rev=1811311&r1=1811310&r2=1811311&view=diff
==============================================================================
--- tomcat/trunk/java/javax/el/StaticFieldELResolver.java (original)
+++ tomcat/trunk/java/javax/el/StaticFieldELResolver.java Fri Oct  6 09:59:31 2017
@@ -101,13 +101,12 @@ public class StaticFieldELResolver exten
 
                 try {
                     result = match.newInstance(parameters);
-                } catch (IllegalArgumentException | IllegalAccessException |
-                        InstantiationException e) {
-                    throw new ELException(e);
                 } catch (InvocationTargetException e) {
                     Throwable cause = e.getCause();
                     Util.handleThrowable(cause);
                     throw new ELException(cause);
+                } catch (ReflectiveOperationException e) {
+                    throw new ELException(e);
                 }
                 return result;
 

Modified: tomcat/trunk/java/javax/security/auth/message/config/AuthConfigFactory.java
URL: http://svn.apache.org/viewvc/tomcat/trunk/java/javax/security/auth/message/config/AuthConfigFactory.java?rev=1811311&r1=1811310&r2=1811311&view=diff
==============================================================================
--- tomcat/trunk/java/javax/security/auth/message/config/AuthConfigFactory.java (original)
+++ tomcat/trunk/java/javax/security/auth/message/config/AuthConfigFactory.java Fri Oct  6 09:59:31 2017
@@ -16,7 +16,6 @@
  */
 package javax.security.auth.message.config;
 
-import java.lang.reflect.InvocationTargetException;
 import java.security.AccessController;
 import java.security.Permission;
 import java.security.PrivilegedAction;
@@ -65,9 +64,8 @@ public abstract class AuthConfigFactory
             factory = AccessController.doPrivileged(
                     new PrivilegedExceptionAction<AuthConfigFactory>() {
                 @Override
-                public AuthConfigFactory run() throws ClassNotFoundException,
-                        InstantiationException, IllegalAccessException, IllegalArgumentException,
-                        InvocationTargetException, NoSuchMethodException, SecurityException {
+                public AuthConfigFactory run() throws ReflectiveOperationException,
+                        IllegalArgumentException, SecurityException {
                     // Load this class with the same class loader as used for
                     // this class. Note that the Thread context class loader
                     // should not be used since that would trigger a memory leak

Modified: tomcat/trunk/java/javax/websocket/ContainerProvider.java
URL: http://svn.apache.org/viewvc/tomcat/trunk/java/javax/websocket/ContainerProvider.java?rev=1811311&r1=1811310&r2=1811311&view=diff
==============================================================================
--- tomcat/trunk/java/javax/websocket/ContainerProvider.java (original)
+++ tomcat/trunk/java/javax/websocket/ContainerProvider.java Fri Oct  6 09:59:31 2017
@@ -16,7 +16,6 @@
  */
 package javax.websocket;
 
-import java.lang.reflect.InvocationTargetException;
 import java.util.Iterator;
 import java.util.ServiceLoader;
 
@@ -52,8 +51,7 @@ public abstract class ContainerProvider
                         (Class<WebSocketContainer>) Class.forName(
                                 DEFAULT_PROVIDER_CLASS_NAME);
                 result = clazz.getConstructor().newInstance();
-            } catch (ClassNotFoundException | InstantiationException | IllegalAccessException |
-                    IllegalArgumentException | InvocationTargetException | NoSuchMethodException |
+            } catch (ReflectiveOperationException | IllegalArgumentException |
                     SecurityException e) {
                 // No options left. Just return null.
             }

Modified: tomcat/trunk/java/javax/websocket/server/ServerEndpointConfig.java
URL: http://svn.apache.org/viewvc/tomcat/trunk/java/javax/websocket/server/ServerEndpointConfig.java?rev=1811311&r1=1811310&r2=1811311&view=diff
==============================================================================
--- tomcat/trunk/java/javax/websocket/server/ServerEndpointConfig.java (original)
+++ tomcat/trunk/java/javax/websocket/server/ServerEndpointConfig.java Fri Oct  6 09:59:31 2017
@@ -16,7 +16,6 @@
  */
 package javax.websocket.server;
 
-import java.lang.reflect.InvocationTargetException;
 import java.util.Collections;
 import java.util.Iterator;
 import java.util.List;
@@ -177,9 +176,8 @@ public interface ServerEndpointConfig ex
                             (Class<Configurator>) Class.forName(
                                     DEFAULT_IMPL_CLASSNAME);
                     result = clazz.getConstructor().newInstance();
-                } catch (ClassNotFoundException | InstantiationException | IllegalAccessException |
-                        IllegalArgumentException | InvocationTargetException |
-                        NoSuchMethodException | SecurityException e) {
+                } catch (ReflectiveOperationException | IllegalArgumentException |
+                        SecurityException e) {
                     // No options left. Just return null.
                 }
             }

Modified: tomcat/trunk/java/org/apache/catalina/authenticator/jaspic/AuthConfigFactoryImpl.java
URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/catalina/authenticator/jaspic/AuthConfigFactoryImpl.java?rev=1811311&r1=1811310&r2=1811311&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/catalina/authenticator/jaspic/AuthConfigFactoryImpl.java (original)
+++ tomcat/trunk/java/org/apache/catalina/authenticator/jaspic/AuthConfigFactoryImpl.java Fri Oct  6 09:59:31 2017
@@ -18,7 +18,6 @@ package org.apache.catalina.authenticato
 
 import java.io.File;
 import java.lang.reflect.Constructor;
-import java.lang.reflect.InvocationTargetException;
 import java.util.ArrayList;
 import java.util.Collections;
 import java.util.HashMap;
@@ -115,8 +114,7 @@ public class AuthConfigFactoryImpl exten
             clazz = Class.forName(className);
             Constructor<?> constructor = clazz.getConstructor(Map.class, AuthConfigFactory.class);
             provider = (AuthConfigProvider) constructor.newInstance(properties, null);
-        } catch (ClassNotFoundException | NoSuchMethodException | InstantiationException |
-                IllegalAccessException | IllegalArgumentException | InvocationTargetException e) {
+        } catch (ReflectiveOperationException | IllegalArgumentException e) {
             throw new SecurityException(e);
         }
 

Modified: tomcat/trunk/java/org/apache/catalina/authenticator/jaspic/SimpleServerAuthConfig.java
URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/catalina/authenticator/jaspic/SimpleServerAuthConfig.java?rev=1811311&r1=1811310&r2=1811311&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/catalina/authenticator/jaspic/SimpleServerAuthConfig.java (original)
+++ tomcat/trunk/java/org/apache/catalina/authenticator/jaspic/SimpleServerAuthConfig.java Fri Oct  6 09:59:31 2017
@@ -16,7 +16,6 @@
  */
 package org.apache.catalina.authenticator.jaspic;
 
-import java.lang.reflect.InvocationTargetException;
 import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.List;
@@ -118,9 +117,7 @@ public class SimpleServerAuthConfig impl
                                     (ServerAuthModule) clazz.getConstructor().newInstance();
                             module.initialize(null, null, handler, mergedProperties);
                             modules.add(module);
-                        } catch (ClassNotFoundException | InstantiationException |
-                                IllegalAccessException | IllegalArgumentException |
-                                InvocationTargetException | NoSuchMethodException |
+                        } catch (ReflectiveOperationException | IllegalArgumentException |
                                 SecurityException e) {
                             AuthException ae = new AuthException();
                             ae.initCause(e);

Modified: tomcat/trunk/java/org/apache/catalina/connector/Request.java
URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/catalina/connector/Request.java?rev=1811311&r1=1811310&r2=1811311&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/catalina/connector/Request.java (original)
+++ tomcat/trunk/java/org/apache/catalina/connector/Request.java Fri Oct  6 09:59:31 2017
@@ -22,7 +22,6 @@ import java.io.IOException;
 import java.io.InputStream;
 import java.io.StringReader;
 import java.io.UnsupportedEncodingException;
-import java.lang.reflect.InvocationTargetException;
 import java.nio.charset.Charset;
 import java.nio.charset.StandardCharsets;
 import java.security.Principal;
@@ -1988,8 +1987,7 @@ public class Request implements HttpServ
                 instanceManager = getContext().getInstanceManager();
                 handler = (T) instanceManager.newInstance(httpUpgradeHandlerClass);
             }
-        } catch (InstantiationException | IllegalAccessException | InvocationTargetException |
-                NamingException | IllegalArgumentException | NoSuchMethodException |
+        } catch (ReflectiveOperationException | NamingException | IllegalArgumentException |
                 SecurityException e) {
             throw new ServletException(e);
         }

Modified: tomcat/trunk/java/org/apache/catalina/core/ApplicationContext.java
URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/catalina/core/ApplicationContext.java?rev=1811311&r1=1811310&r2=1811311&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/catalina/core/ApplicationContext.java (original)
+++ tomcat/trunk/java/org/apache/catalina/core/ApplicationContext.java Fri Oct  6 09:59:31 2017
@@ -825,8 +825,7 @@ public class ApplicationContext implemen
         } catch (InvocationTargetException e) {
             ExceptionUtils.handleThrowable(e.getCause());
             throw new ServletException(e);
-        } catch (IllegalAccessException | NamingException | InstantiationException |
-                ClassNotFoundException | NoSuchMethodException e) {
+        } catch (ReflectiveOperationException | NamingException e) {
             throw new ServletException(e);
         }
     }
@@ -959,8 +958,7 @@ public class ApplicationContext implemen
         } catch (InvocationTargetException e) {
             ExceptionUtils.handleThrowable(e.getCause());
             throw new ServletException(e);
-        } catch (IllegalAccessException | NamingException | InstantiationException |
-                ClassNotFoundException | NoSuchMethodException e) {
+        } catch (ReflectiveOperationException | NamingException e) {
             throw new ServletException(e);
         }
     }
@@ -1100,8 +1098,7 @@ public class ApplicationContext implemen
             throw new IllegalArgumentException(sm.getString(
                     "applicationContext.addListener.iae.cnfe", className),
                     e);
-        } catch (IllegalAccessException | NamingException | InstantiationException |
-                ClassNotFoundException | NoSuchMethodException e) {
+        } catch (ReflectiveOperationException| NamingException e) {
             throw new IllegalArgumentException(sm.getString(
                     "applicationContext.addListener.iae.cnfe", className),
                     e);
@@ -1173,8 +1170,7 @@ public class ApplicationContext implemen
         } catch (InvocationTargetException e) {
             ExceptionUtils.handleThrowable(e.getCause());
             throw new ServletException(e);
-        } catch (IllegalAccessException | NamingException | InstantiationException |
-                NoSuchMethodException e) {
+        } catch (ReflectiveOperationException | NamingException e) {
             throw new ServletException(e);
         }
     }

Modified: tomcat/trunk/java/org/apache/catalina/core/ApplicationFilterConfig.java
URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/catalina/core/ApplicationFilterConfig.java?rev=1811311&r1=1811310&r2=1811311&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/catalina/core/ApplicationFilterConfig.java (original)
+++ tomcat/trunk/java/org/apache/catalina/core/ApplicationFilterConfig.java Fri Oct  6 09:59:31 2017
@@ -20,7 +20,6 @@ package org.apache.catalina.core;
 
 
 import java.io.Serializable;
-import java.lang.reflect.InvocationTargetException;
 import java.util.Collections;
 import java.util.Enumeration;
 import java.util.HashMap;
@@ -89,15 +88,12 @@ public final class ApplicationFilterConf
      *  instantiating the filter object
      * @exception ServletException if thrown by the filter's init() method
      * @throws NamingException
-     * @throws InvocationTargetException
      * @throws SecurityException
-     * @throws NoSuchMethodException
      * @throws IllegalArgumentException
      */
     ApplicationFilterConfig(Context context, FilterDef filterDef)
-            throws ClassCastException, ClassNotFoundException, IllegalAccessException,
-            InstantiationException, ServletException, InvocationTargetException, NamingException,
-            IllegalArgumentException, NoSuchMethodException, SecurityException {
+            throws ClassCastException, ReflectiveOperationException, ServletException,
+            NamingException, IllegalArgumentException, SecurityException {
 
         super();
 
@@ -244,14 +240,12 @@ public final class ApplicationFilterConf
      *  instantiating the filter object
      * @exception ServletException if thrown by the filter's init() method
      * @throws NamingException
-     * @throws InvocationTargetException
+     * @throws ReflectiveOperationException
      * @throws SecurityException
-     * @throws NoSuchMethodException
      * @throws IllegalArgumentException
      */
-    Filter getFilter() throws ClassCastException, ClassNotFoundException, IllegalAccessException,
-            InstantiationException, ServletException, InvocationTargetException, NamingException,
-            IllegalArgumentException, NoSuchMethodException, SecurityException {
+    Filter getFilter() throws ClassCastException, ReflectiveOperationException, ServletException,
+            NamingException, IllegalArgumentException, SecurityException {
 
         // Return the existing filter instance, if any
         if (this.filter != null)

Modified: tomcat/trunk/java/org/apache/catalina/core/AsyncContextImpl.java
URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/catalina/core/AsyncContextImpl.java?rev=1811311&r1=1811310&r2=1811311&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/catalina/core/AsyncContextImpl.java (original)
+++ tomcat/trunk/java/org/apache/catalina/core/AsyncContextImpl.java Fri Oct  6 09:59:31 2017
@@ -268,8 +268,7 @@ public class AsyncContextImpl implements
         try {
              listener = (T) getInstanceManager().newInstance(clazz.getName(),
                      clazz.getClassLoader());
-        } catch (InstantiationException | IllegalAccessException | NamingException |
-                ClassNotFoundException e) {
+        } catch (ReflectiveOperationException | NamingException e) {
             ServletException se = new ServletException(e);
             throw se;
         } catch (Exception e) {

Modified: tomcat/trunk/java/org/apache/catalina/realm/JAASRealm.java
URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/catalina/realm/JAASRealm.java?rev=1811311&r1=1811310&r2=1811311&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/catalina/realm/JAASRealm.java (original)
+++ tomcat/trunk/java/org/apache/catalina/realm/JAASRealm.java Fri Oct  6 09:59:31 2017
@@ -628,23 +628,11 @@ public class JAASRealm extends RealmBase
                 this.jaasConfigurationLoaded = true;
                 return this.jaasConfiguration;
             }
-        } catch (URISyntaxException ex) {
-            throw new RuntimeException(ex);
-        } catch (NoSuchMethodException ex) {
-            throw new RuntimeException(ex);
-        } catch (SecurityException ex) {
-            throw new RuntimeException(ex);
-        } catch (InstantiationException ex) {
-            throw new RuntimeException(ex);
-        } catch (IllegalAccessException ex) {
-            throw new RuntimeException(ex);
-        } catch (IllegalArgumentException ex) {
-            throw new RuntimeException(ex);
         } catch (InvocationTargetException ex) {
             throw new RuntimeException(ex.getCause());
-        } catch (ClassNotFoundException ex) {
+        } catch (SecurityException | URISyntaxException | ReflectiveOperationException |
+                IllegalArgumentException ex) {
             throw new RuntimeException(ex);
         }
-
     }
 }

Modified: tomcat/trunk/java/org/apache/catalina/startup/Tomcat.java
URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/catalina/startup/Tomcat.java?rev=1811311&r1=1811310&r2=1811311&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/catalina/startup/Tomcat.java (original)
+++ tomcat/trunk/java/org/apache/catalina/startup/Tomcat.java Fri Oct  6 09:59:31 2017
@@ -18,7 +18,6 @@ package org.apache.catalina.startup;
 
 import java.io.File;
 import java.io.IOException;
-import java.lang.reflect.InvocationTargetException;
 import java.net.MalformedURLException;
 import java.net.URL;
 import java.security.Principal;
@@ -853,10 +852,7 @@ public class Tomcat {
         try {
             return (Context) Class.forName(contextClass).getConstructor()
                     .newInstance();
-        } catch (InstantiationException | IllegalAccessException
-                | IllegalArgumentException | InvocationTargetException
-                | NoSuchMethodException | SecurityException
-                | ClassNotFoundException e) {
+        } catch (ReflectiveOperationException  | IllegalArgumentException | SecurityException e) {
             throw new IllegalArgumentException(
                     "Can't instantiate context-class " + contextClass
                             + " for host " + host + " and url "

Modified: tomcat/trunk/java/org/apache/juli/logging/LogFactory.java
URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/juli/logging/LogFactory.java?rev=1811311&r1=1811310&r2=1811311&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/juli/logging/LogFactory.java (original)
+++ tomcat/trunk/java/org/apache/juli/logging/LogFactory.java Fri Oct  6 09:59:31 2017
@@ -17,7 +17,6 @@
 package org.apache.juli.logging;
 
 import java.lang.reflect.Constructor;
-import java.lang.reflect.InvocationTargetException;
 import java.util.ServiceLoader;
 import java.util.logging.LogManager;
 
@@ -119,8 +118,7 @@ public class LogFactory {
 
         try {
             return discoveredLogConstructor.newInstance(name);
-        } catch (InstantiationException | IllegalAccessException | IllegalArgumentException |
-                InvocationTargetException e) {
+        } catch (ReflectiveOperationException | IllegalArgumentException e) {
             throw new LogConfigurationException(e);
         }
     }

Modified: tomcat/trunk/java/org/apache/tomcat/util/compat/Jre9Compat.java
URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/tomcat/util/compat/Jre9Compat.java?rev=1811311&r1=1811310&r2=1811311&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/tomcat/util/compat/Jre9Compat.java (original)
+++ tomcat/trunk/java/org/apache/tomcat/util/compat/Jre9Compat.java Fri Oct  6 09:59:31 2017
@@ -19,7 +19,11 @@ package org.apache.tomcat.util.compat;
 import java.io.IOException;
 import java.lang.reflect.InvocationTargetException;
 import java.lang.reflect.Method;
+import java.net.MalformedURLException;
+import java.net.URL;
 import java.net.URLConnection;
+import java.util.Deque;
+import java.util.Optional;
 
 import javax.net.ssl.SSLEngine;
 import javax.net.ssl.SSLParameters;
@@ -97,4 +101,19 @@ class Jre9Compat extends JreCompat {
             throw new UnsupportedOperationException(e);
         }
     }
+
+
+    @Override
+    public void addClassPath(Deque<URL> classPathUrlsToProcess) {
+        ModuleLayer.boot().configuration().modules().stream().map(
+                rm -> rm.reference().location()).flatMap(Optional::stream).map(u -> {
+                    try {
+                        return u.toURL();
+                    } catch (MalformedURLException e) {
+                        // TODO Auto-generated catch block
+                        e.printStackTrace();
+                        return null;
+                    }
+                }).forEach(classPathUrlsToProcess::add);
+    }
 }

Modified: tomcat/trunk/java/org/apache/tomcat/util/compat/JreCompat.java
URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/tomcat/util/compat/JreCompat.java?rev=1811311&r1=1811310&r2=1811311&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/tomcat/util/compat/JreCompat.java (original)
+++ tomcat/trunk/java/org/apache/tomcat/util/compat/JreCompat.java Fri Oct  6 09:59:31 2017
@@ -19,6 +19,7 @@ package org.apache.tomcat.util.compat;
 import java.io.IOException;
 import java.net.URL;
 import java.net.URLConnection;
+import java.util.Deque;
 
 import javax.net.ssl.SSLEngine;
 import javax.net.ssl.SSLParameters;
@@ -115,4 +116,16 @@ public class JreCompat {
         URLConnection uConn = url.openConnection();
         uConn.setDefaultUseCaches(false);
     }
+
+
+    /**
+     * Scans the module path and adds the locations of each module found to the
+     * queue for URLs to be processed.
+     *
+     * @param classPathUrlsToProcess    The queue of URLs to which found
+     *                                  locations should be added
+     */
+    public void addClassPath(Deque<URL> classPathUrlsToProcess) {
+        // NO-OP unless running on Java 9 or later
+    }
 }



---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscribe@tomcat.apache.org
For additional commands, e-mail: dev-help@tomcat.apache.org