Class ReferenceCountedJar

java.lang.Object
org.apache.tomcat.util.scan.ReferenceCountedJar
All Implemented Interfaces:
AutoCloseable, Jar

public class ReferenceCountedJar extends Object implements Jar
This class provides a wrapper around Jar that uses reference counting to close and re-create the wrapped Jar instance as required.

Each stream returned by getInputStream(String) or getEntryInputStream() holds a reference to the wrapped Jar until it is closed. The wrapped Jar, and its underlying file handle, therefore remains open until every returned stream has been closed, even if all other references have been released. Callers are responsible for closing every stream they obtain.

  • Constructor Details

    • ReferenceCountedJar

      public ReferenceCountedJar(URL url) throws IOException
      Creates a new reference-counted wrapper for the JAR at the given URL.
      Parameters:
      url - the URL of the JAR file
      Throws:
      IOException - if the JAR cannot be opened
  • Method Details

    • close

      public void close()
      Description copied from interface: Jar
      Close any resources associated with this JAR.
      Specified by:
      close in interface AutoCloseable
      Specified by:
      close in interface Jar
    • getJarFileURL

      public URL getJarFileURL()
      Description copied from interface: Jar
      Returns the URL for accessing the JAR file.
      Specified by:
      getJarFileURL in interface Jar
      Returns:
      The URL for accessing the JAR file.
    • getInputStream

      public InputStream getInputStream(String name) throws IOException
      Description copied from interface: Jar
      Obtain an InputStream for a given entry in a JAR. The caller is responsible for closing the stream.
      Specified by:
      getInputStream in interface Jar
      Parameters:
      name - Entry to obtain an InputStream for
      Returns:
      An InputStream for the specified entry or null if the entry does not exist
      Throws:
      IOException - if an I/O error occurs while processing the JAR file
    • getLastModified

      public long getLastModified(String name) throws IOException
      Description copied from interface: Jar
      Obtain the last modified time for the given resource in the JAR.
      Specified by:
      getLastModified in interface Jar
      Parameters:
      name - Entry to obtain the modification time for
      Returns:
      The time (in the same format as System.currentTimeMillis()) that the resource was last modified. Returns -1 if the entry does not exist
      Throws:
      IOException - if an I/O error occurs while processing the JAR file
    • exists

      public boolean exists(String name) throws IOException
      Description copied from interface: Jar
      Determine if the given resource in present in the JAR.
      Specified by:
      exists in interface Jar
      Parameters:
      name - Entry to look for
      Returns:
      true if the entry is present in the JAR, otherwise false
      Throws:
      IOException - if an I/O error occurs while processing the JAR file
    • nextEntry

      public void nextEntry()
      Description copied from interface: Jar
      Moves the internal pointer to the next entry in the JAR.
      Specified by:
      nextEntry in interface Jar
    • getEntryName

      public String getEntryName()
      Description copied from interface: Jar
      Obtains the name of the current entry.
      Specified by:
      getEntryName in interface Jar
      Returns:
      The entry name
    • getEntryInputStream

      public InputStream getEntryInputStream() throws IOException
      Description copied from interface: Jar
      Obtains the input stream for the current entry.
      Specified by:
      getEntryInputStream in interface Jar
      Returns:
      The input stream
      Throws:
      IOException - If the stream cannot be obtained
    • getURL

      public String getURL(String entry)
      Description copied from interface: Jar
      Obtain, in String form, the URL for an entry in this JAR. Note that for JARs nested in WAR files, the Tomcat specific war:file:... form will not be used, rather the jar:jar:file:... form (that the JRE does not understand) will be used. Note that this means that any code using these URLs will need to understand the jar:jar:file:... form and use the JarFactory to ensure resources are accessed correctly.
      Specified by:
      getURL in interface Jar
      Parameters:
      entry - The entry to generate the URL for
      Returns:
      a URL for the specified entry in the JAR
    • getManifest

      public Manifest getManifest() throws IOException
      Description copied from interface: Jar
      Obtain the manifest for the JAR file.
      Specified by:
      getManifest in interface Jar
      Returns:
      The manifest for this JAR file.
      Throws:
      IOException - If an I/O error occurs trying to obtain the manifest
    • reset

      public void reset() throws IOException
      Description copied from interface: Jar
      Resets the internal pointer used to track JAR entries to the beginning of the JAR.
      Specified by:
      reset in interface Jar
      Throws:
      IOException - If the pointer cannot be reset