public Icon getFileIcon(AbstractFile originalFile, Dimension preferredResolution) {
    // Specified file is a LocalFile or a ProxyFile proxying a LocalFile (e.g. an archive file):
    // let's simply get
    // the icon using #getLocalFileIcon(LocalFile)
    AbstractFile topFile = originalFile.getTopAncestor();
    Icon icon;

    if (topFile instanceof LocalFile) {
      icon = getLocalFileIcon((LocalFile) topFile, originalFile, preferredResolution);
    }
    // File is a remote file: create a temporary local file (or directory) with the same extension
    // to grab the icon
    // and then delete the file. This operation is I/O bound and thus expensive, so an LRU is used
    // to cache
    // frequently-accessed file extensions.
    else {
      // create the temporary, local file
      LocalFile tempFile = createTempLocalFile(topFile);
      if (tempFile == null) {
        // No temp file, no icon!
        return null;
      }

      // Get the file icon
      icon = getLocalFileIcon(tempFile, originalFile, preferredResolution);

      // Delete the temporary file
      try {
        tempFile.delete();
      } catch (IOException e) {
        // Not much to do
      }
    }

    return icon;
  }