Class JreCompat

java.lang.Object
org.apache.tomcat.util.compat.JreCompat
Direct Known Subclasses:
Jre19Compat

public class JreCompat extends Object
This is the base implementation class for JRE compatibility and provides an implementation based on Java 8. Sub-classes may extend this class and provide alternative implementations for later JRE versions
  • Field Details

    • setApplicationProtocolsMethod

      protected static final Method setApplicationProtocolsMethod
    • getApplicationProtocolMethod

      protected static final Method getApplicationProtocolMethod
  • Constructor Details

    • JreCompat

      public JreCompat()
  • Method Details

    • getInstance

      public static JreCompat getInstance()
    • isGraalAvailable

      public static boolean isGraalAvailable()
    • isAlpnSupported

      public static boolean isAlpnSupported()
    • isJre9Available

      public static boolean isJre9Available()
    • isJre11Available

      public static boolean isJre11Available()
    • isJre16Available

      public static boolean isJre16Available()
    • isJre19Available

      public static boolean isJre19Available()
    • isJre21Available

      public static boolean isJre21Available()
    • isJre22Available

      public static boolean isJre22Available()
    • isInstanceOfInaccessibleObjectException

      public boolean isInstanceOfInaccessibleObjectException(Throwable t)
      Test if the provided exception is an instance of java.lang.reflect.InaccessibleObjectException.
      Parameters:
      t - The exception to test
      Returns:
      true if the exception is an instance of InaccessibleObjectException, otherwise false
    • setApplicationProtocols

      public void setApplicationProtocols(SSLParameters sslParameters, String[] protocols)
      Set the application protocols the server will accept for ALPN
      Parameters:
      sslParameters - The SSL parameters for a connection
      protocols - The application protocols to be allowed for that connection
    • getApplicationProtocol

      public String getApplicationProtocol(SSLEngine sslEngine)
      Get the application protocol that has been negotiated for connection associated with the given SSLEngine.
      Parameters:
      sslEngine - The SSLEngine for which to obtain the negotiated protocol
      Returns:
      The name of the negotiated protocol
    • disableCachingForJarUrlConnections

      public void disableCachingForJarUrlConnections() throws IOException
      Disables caching for JAR URL connections. For Java 8 and earlier, this also disables caching for ALL URL connections.
      Throws:
      IOException - If a dummy JAR URLConnection can not be created
    • addBootModulePath

      public void addBootModulePath(Deque<URL> classPathUrlsToProcess)
      Obtains the URLs for all the JARs on the module path when the JVM starts and adds them to the provided Deque.
      Parameters:
      classPathUrlsToProcess - The Deque to which the modules should be added
    • jarFileNewInstance

      public final JarFile jarFileNewInstance(String s) throws IOException
      Creates a new JarFile instance. When running on Java 9 and later, the JarFile will be multi-release JAR aware. While this isn't strictly required to be in this package, it is provided as a convenience method.
      Parameters:
      s - The JAR file to open
      Returns:
      A JarFile instance based on the provided path
      Throws:
      IOException - If an I/O error occurs creating the JarFile instance
    • jarFileNewInstance

      public JarFile jarFileNewInstance(File f) throws IOException
      Creates a new JarFile instance. When running on Java 9 and later, the JarFile will be multi-release JAR aware.
      Parameters:
      f - The JAR file to open
      Returns:
      A JarFile instance based on the provided file
      Throws:
      IOException - If an I/O error occurs creating the JarFile instance
    • jarFileIsMultiRelease

      public boolean jarFileIsMultiRelease(JarFile jarFile)
      Is this JarFile a multi-release JAR file.
      Parameters:
      jarFile - The JarFile to test
      Returns:
      true If it is a multi-release JAR file and is configured to behave as such.
    • jarFileRuntimeMajorVersion

      public int jarFileRuntimeMajorVersion()
    • canAccess

      public boolean canAccess(Object base, AccessibleObject accessibleObject)
      Is the accessibleObject accessible (as a result of appropriate module exports) on the provided instance?
      Parameters:
      base - The specific instance to be tested.
      accessibleObject - The method/field/constructor to be tested.
      Returns:
      {code true} if the AccessibleObject can be accessed otherwise {code false}
    • isExported

      public boolean isExported(Class<?> type)
      Is the given class in an exported package?
      Parameters:
      type - The class to test
      Returns:
      Always true for Java 8. true if the enclosing package is exported for Java 9+
    • getModuleName

      public String getModuleName(Class<?> type)
      What is the module of the given class?
      Parameters:
      type - The class to test
      Returns:
      Always true for Java 8. true if the enclosing package is exported for Java 9+
    • getUnixDomainSocketAddress

      public SocketAddress getUnixDomainSocketAddress(String path)
      Return Unix domain socket address for given path.
      Parameters:
      path - The path
      Returns:
      the socket address
    • openUnixDomainServerSocketChannel

      public ServerSocketChannel openUnixDomainServerSocketChannel()
      Create server socket channel using the Unix domain socket ProtocolFamily.
      Returns:
      the server socket channel
    • openUnixDomainSocketChannel

      public SocketChannel openUnixDomainSocketChannel()
      Create socket channel using the Unix domain socket ProtocolFamily.
      Returns:
      the socket channel
    • getExecutor

      Obtains the executor, if any, used to create the provided thread.
      Parameters:
      thread - The thread to examine
      Returns:
      The executor, if any, that created the provided thread
      Throws:
      NoSuchFieldException - If a field used via reflection to obtain the executor cannot be found
      SecurityException - If a security exception occurs while trying to identify the executor
      IllegalArgumentException - If the instance object does not match the class of the field when obtaining a field value via reflection
      IllegalAccessException - If a field is not accessible due to access restrictions
    • createVirtualThreadBuilder

      public Object createVirtualThreadBuilder(String name)
      Create a thread builder for virtual threads using the given name to name the threads.
      Parameters:
      name - The base name for the threads
      Returns:
      The thread buidler for virtual threads
    • threadBuilderStart

      public void threadBuilderStart(Object threadBuilder, Runnable command)
      Create a thread with the given thread builder and use it to execute the given runnable.
      Parameters:
      threadBuilder - The thread builder to use to create a thread
      command - The command to run
    • callAs

      public <T> T callAs(Subject subject, Callable<T> action) throws CompletionException
      Throws:
      CompletionException