gt:         if (f == null) {
context: /*
   * Copyright (c) 1998, 2014, Oracle and/or its affiliates. All rights reserved.
   * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
   *
   * This code is free software; you can redistribute it and/or modify it
   * under the terms of the GNU General Public License version 2 only, as
   * published by the Free Software Foundation.  Oracle designates this
   * particular file as subject to the "Classpath" exception as provided
   * by Oracle in the LICENSE file that accompanied this code.
   *
   * This code is distributed in the hope that it will be useful, but WITHOUT
   * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
   * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
   * version 2 for more details (a copy is included in the LICENSE file that
   * accompanied this code).
   *
   * You should have received a copy of the GNU General Public License version
   * 2 along with this work; if not, write to the Free Software Foundation,
   * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
   *
   * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
   * or visit www.oracle.com if you need additional information or have any
   * questions.
   */
  
  package javax.swing.filechooser;
  
  
  import javax.swing.*;
  
  import java.awt.Image;
  import java.io.File;
  import java.io.FileNotFoundException;
  import java.io.IOException;
  import java.text.MessageFormat;
  import java.util.List;
  import java.util.ArrayList;
  import java.lang.ref.WeakReference;
  import java.beans.PropertyChangeListener;
  import java.beans.PropertyChangeEvent;
  import java.security.AccessController;
  import java.security.PrivilegedAction;
  
  import sun.awt.shell.*;
  
  /**
   * FileSystemView is JFileChooser's gateway to the
   * file system. Since the JDK1.1 File API doesn't allow
   * access to such information as root partitions, file type
   * information, or hidden file bits, this class is designed
   * to intuit as much OS-specific file system information as
   * possible.
   *
   * <p>
   *
   * Java Licensees may want to provide a different implementation of
   * FileSystemView to better handle a given operating system.
   *
   * @author Jeff Dinkins
   */
  
  // PENDING(jeff) - need to provide a specification for
  // how Mac/OS2/BeOS/etc file systems can modify FileSystemView
  // to handle their particular type of file system.
  
  public abstract class FileSystemView {
  
      static FileSystemView windowsFileSystemView = null;
      static FileSystemView unixFileSystemView = null;
      //static FileSystemView macFileSystemView = null;
      static FileSystemView genericFileSystemView = null;
  
      private boolean useSystemExtensionHiding =
              UIManager.getDefaults().getBoolean("FileChooser.useSystemExtensionHiding");
  
      public static FileSystemView getFileSystemView() {
          if(File.separatorChar == '\\') {
              if(windowsFileSystemView == null) {
                  windowsFileSystemView = new WindowsFileSystemView();
              }
              return windowsFileSystemView;
          }
  
          if(File.separatorChar == '/') {
              if(unixFileSystemView == null) {
                  unixFileSystemView = new UnixFileSystemView();
              }
              return unixFileSystemView;
          }
  
          // if(File.separatorChar == ':') {
          //    if(macFileSystemView == null) {
          //      macFileSystemView = new MacFileSystemView();
          //    }
          //    return macFileSystemView;
          //}
  
          if(genericFileSystemView == null) {
              genericFileSystemView = new GenericFileSystemView();
          }
          return genericFileSystemView;
      }
  
      public FileSystemView() {
          final WeakReference<FileSystemView> weakReference = new WeakReference<FileSystemView>(this);
  
          UIManager.addPropertyChangeListener(new PropertyChangeListener() {
              public void propertyChange(PropertyChangeEvent evt) {
                  FileSystemView fileSystemView = weakReference.get();
  
                  if (fileSystemView == null) {
                      // FileSystemView was destroyed
                      UIManager.removePropertyChangeListener(this);
                  } else {
                      if (evt.getPropertyName().equals("lookAndFeel")) {
                          fileSystemView.useSystemExtensionHiding =
                                  UIManager.getDefaults().getBoolean("FileChooser.useSystemExtensionHiding");
                      }
                  }
              }
          });
      }
  
      /**
       * Determines if the given file is a root in the navigable tree(s).
       * Examples: Windows 98 has one root, the Desktop folder. DOS has one root
       * per drive letter, <code>C:\</code>, <code>D:\</code>, etc. Unix has one root,
       * the <code>"/"</code> directory.
       *
       * The default implementation gets information from the <code>ShellFolder</code> class.
       *
       * @param f a <code>File</code> object representing a directory
       * @return <code>true</code> if <code>f</code> is a root in the navigable tree.
       * @see #isFileSystemRoot
       */
      public boolean isRoot(File f) {
          if (f == null || !f.isAbsolute()) {
              return false;
          }
  
          File[] roots = getRoots();
          for (File root : roots) {
              if (root.equals(f)) {
                  return true;
              }
          }
          return false;
      }
  
      /**
       * Returns true if the file (directory) can be visited.
       * Returns false if the directory cannot be traversed.
       *
       * @param f the <code>File</code>
       * @return <code>true</code> if the file/directory can be traversed, otherwise <code>false</code>
       * @see JFileChooser#isTraversable
       * @see FileView#isTraversable
       * @since 1.4
       */
      public Boolean isTraversable(File f) {
          return Boolean.valueOf(f.isDirectory());
      }
  
      /**
       * Name of a file, directory, or folder as it would be displayed in
       * a system file browser. Example from Windows: the "M:\" directory
       * displays as "CD-ROM (M:)"
       *
       * The default implementation gets information from the ShellFolder class.
       *
       * @param f a <code>File</code> object
       * @return the file name as it would be displayed by a native file chooser
       * @see JFileChooser#getName
       * @since 1.4
       */
      public String getSystemDisplayName(File f) {
          if (f == null) {
              return null;
          }
  
          String name = f.getName();
  
          if (!name.equals("..") && !name.equals(".") &&
                  (useSystemExtensionHiding || !isFileSystem(f) || isFileSystemRoot(f)) &&
                  (f instanceof ShellFolder || f.exists())) {
  
              try {
                  name = getShellFolder(f).getDisplayName();
              } catch (FileNotFoundException e) {
                  return null;
              }
  
              if (name == null || name.length() == 0) {
                  name = f.getPath(); // e.g. "/"
              }
          }
  
          return name;
      }
  
      /**
       * Type description for a file, directory, or folder as it would be displayed in
       * a system file browser. Example from Windows: the "Desktop" folder
       * is described as "Desktop".
       *
       * Override for platforms with native ShellFolder implementations.
       *
       * @param f a <code>File</code> object
       * @return the file type description as it would be displayed by a native file chooser
       * or null if no native information is available.
       * @see JFileChooser#getTypeDescription
       * @since 1.4
       */
      public String getSystemTypeDescription(File f) {
          return null;
      }
  
      /**
       * Icon for a file, directory, or folder as it would be displayed in
       * a system file browser. Example from Windows: the "M:\" directory
       * displays a CD-ROM icon.
       *
       * The default implementation gets information from the ShellFolder class.
       *
       * @param f a <code>File</code> object
       * @return an icon as it would be displayed by a native file chooser
       * @see JFileChooser#getIcon
       * @since 1.4
       */
      public Icon getSystemIcon(File f) {
  