Class CachedFile

  • All Implemented Interfaces:
    java.io.Closeable, java.lang.AutoCloseable

    public class CachedFile
    extends java.lang.Object
    implements java.io.Closeable
    Downloads a file and caches it on disk in order to reduce network load. Supports URLs, local files, and a custom scheme (resource:) to get resources from the current JOSM *.jar file as well as plugins *.jar files. (Local caching is only done for URLs.)

    The mirrored file is only downloaded if it has been more than 7 days since last download. (Time can be configured.)

    The file content is normally accessed with getInputStream(), but you can also get the mirrored copy with getFile().

    • Constructor Detail

      • CachedFile

        public CachedFile​(java.lang.String name)
        Constructs a CachedFile object from a given filename, URL or internal resource.
        Parameters:
        name - can be:
        • relative or absolute file name
        • file:///SOME/FILE the same as above
        • http://... a URL. It will be cached on disk.
        • resource://SOME/FILE file from the classpath (usually in the current *.jar)
        • josmdir://SOME/FILE file inside josm user data directory (since r7058)
        • josmplugindir://SOME/FILE file inside josm plugin directory (since r7834)
    • Method Detail

      • setName

        public CachedFile setName​(java.lang.String name)
        Set the name of the resource.
        Parameters:
        name - can be:
        • relative or absolute file name
        • file:///SOME/FILE the same as above
        • http://... a URL. It will be cached on disk.
        • resource://SOME/FILE file from the classpath (usually in the current *.jar)
        • josmdir://SOME/FILE file inside josm user data directory (since r7058)
        • josmplugindir://SOME/FILE file inside josm plugin directory (since r7834)
        Returns:
        this object
      • setMaxAge

        public CachedFile setMaxAge​(long maxAge)
        Set maximum age of cache file. Only applies to URLs. When this time has passed after the last download of the file, the cache is considered stale and a new download will be attempted.
        Parameters:
        maxAge - the maximum cache age in seconds
        Returns:
        this object
      • setDestDir

        public CachedFile setDestDir​(java.lang.String destDir)
        Set the destination directory for the cache file. Only applies to URLs.
        Parameters:
        destDir - the destination directory
        Returns:
        this object
      • setHttpAccept

        public CachedFile setHttpAccept​(java.lang.String httpAccept)
        Set the accepted MIME types sent in the HTTP Accept header. Only applies to URLs.
        Parameters:
        httpAccept - the accepted MIME types
        Returns:
        this object
      • setHttpHeaders

        public CachedFile setHttpHeaders​(java.util.Map<java.lang.String,​java.lang.String> headers)
        Sets the http headers. Only applies to URL pointing to http or https resources
        Parameters:
        headers - that should be sent together with request
        Returns:
        this object
      • setFastFail

        public void setFastFail​(boolean fastFail)
        Sets whether opening HTTP connections should fail fast, i.e., whether a low connect timeout should be used.
        Parameters:
        fastFail - whether opening HTTP connections should fail fast
      • setParam

        public void setParam​(java.lang.String parameter)
        Sets additional URL parameter (used e.g. for maps)
        Parameters:
        parameter - the URL parameter
        Since:
        13536
      • getName

        public java.lang.String getName()
      • getMaxAge

        public long getMaxAge()
        Returns maximum age of cache file. Only applies to URLs. When this time has passed after the last download of the file, the cache is considered stale and a new download will be attempted.
        Returns:
        the maximum cache age in seconds
      • getDestDir

        public java.lang.String getDestDir()
      • getInputStream

        public java.io.InputStream getInputStream()
                                           throws java.io.IOException
        Get InputStream to the requested resource.
        Returns:
        the InputStream
        Throws:
        java.io.IOException - when the resource with the given name could not be retrieved
        java.nio.file.InvalidPathException - if a Path object cannot be constructed from the inner file path
      • getByteContent

        public byte[] getByteContent()
                              throws java.io.IOException
        Get the full content of the requested resource as a byte array.
        Returns:
        the full content of the requested resource as byte array
        Throws:
        java.io.IOException - in case of an I/O error
      • getContentReader

        public java.io.BufferedReader getContentReader()
                                                throws java.io.IOException
        Returns getInputStream() wrapped in a buffered reader.

        Detects Unicode charset in use utilizing UTFInputStreamReader.

        Returns:
        buffered reader
        Throws:
        java.io.IOException - if any I/O error occurs
        Since:
        9411
      • getFile

        public java.io.File getFile()
                             throws java.io.IOException
        Get local file for the requested resource.
        Returns:
        The local cache file for URLs. If the resource is a local file, returns just that file.
        Throws:
        java.io.IOException - when the resource with the given name could not be retrieved
      • findZipEntryPath

        public java.lang.String findZipEntryPath​(java.lang.String extension,
                                                 java.lang.String namepart)
        Looks for a certain entry inside a zip file and returns the entry path. Replies a file in the top level directory of the ZIP file which has an extension extension. If more than one files have this extension, the last file whose name includes namepart is opened.
        Parameters:
        extension - the extension of the file we're looking for
        namepart - the name part
        Returns:
        The zip entry path of the matching file. null if this cached file doesn't represent a zip file or if there was no matching file in the ZIP file.
      • findZipEntryInputStream

        public java.io.InputStream findZipEntryInputStream​(java.lang.String extension,
                                                           java.lang.String namepart)
        Like findZipEntryPath(java.lang.String, java.lang.String), but returns the corresponding InputStream.
        Parameters:
        extension - the extension of the file we're looking for
        namepart - the name part
        Returns:
        InputStream to the matching file. null if this cached file doesn't represent a zip file or if there was no matching file in the ZIP file.
        Since:
        6148
      • findZipEntryImpl

        private Pair<java.lang.String,​java.io.InputStream> findZipEntryImpl​(java.lang.String extension,
                                                                                  java.lang.String namepart)
      • cleanup

        public static void cleanup​(java.lang.String name)
        Clear the cache for the given resource. This forces a fresh download.
        Parameters:
        name - the URL
      • cleanup

        public static void cleanup​(java.lang.String name,
                                   java.lang.String destDir)
        Clear the cache for the given resource. This forces a fresh download.
        Parameters:
        name - the URL
        destDir - the destination directory (see setDestDir(java.lang.String))
      • getPrefKey

        private static java.lang.String getPrefKey​(java.net.URL url,
                                                   java.lang.String destDir)
        Get preference key to store the location and age of the cached file. 2 resources that point to the same url, but that are to be stored in different directories will not share a cache file.
        Parameters:
        url - URL
        destDir - destination directory
        Returns:
        Preference key
      • checkLocal

        private java.io.File checkLocal​(java.net.URL url)
                                 throws java.io.IOException
        Throws:
        java.io.IOException
      • truncatePath

        private static java.lang.String truncatePath​(java.lang.String directory,
                                                     java.lang.String fileName)
      • close

        public void close()
        Attempts to disconnect an URL connection.
        Specified by:
        close in interface java.lang.AutoCloseable
        Specified by:
        close in interface java.io.Closeable
        Since:
        9411
        See Also:
        HttpClient.disconnect()
      • clear

        public void clear()
                   throws java.io.IOException
        Clears the cached file
        Throws:
        java.io.IOException - if any I/O error occurs
        Since:
        10993
      • toString

        public java.lang.String toString()
        Overrides:
        toString in class java.lang.Object