Development Java Tutorial

/*
 *  OS.java
 *  2007-04-14
 */
//cb.aloe.util;
import java.io.File;
import java.util.ArrayList;
/**
 * Class representing a standard operating system platform, WIN, MAC, or POSIX.
 * 
 * @author Christopher Bach
 */
public final class OS {
  public static final OS WIN = new OS("WIN");
  public static final OS MAC = new OS("MAC");
  public static final OS POSIX = new OS("POSIX");
  private String ourOS = "";
  /**
   * Private constructor to avert instantiation.
   */
  private OS(String os) {
    ourOS = os;
  }
  /**
   * Returns a String representing this OS object.
   */
  public String toString() {
    return ourOS;
  }
  /**
   * Returns the first readable and writable application data folder appropriate
   * to this OS.
   */
  public static File getAppDataFolder() {
    File[] folders = listAppDataFolders();
    for (int i = 0; i < folders.length; i++) {
      File folder = folders[i];
      if (folder.canRead() && folder.canWrite())
        return folder;
    }
    return null;
  }
  /**
   * Returns the first readable and writable user data folder appropriate to
   * this OS.
   */
  public static File getUserDataFolder() {
    File[] folders = listUserDataFolders();
    for (int i = 0; i < folders.length; i++) {
      File folder = folders[i];
      if (folder.canRead() && folder.canWrite())
        return folder;
    }
    return null;
  }
  /**
   * Returns a list of the preferred locations for storing application- specific
   * data in descending order.
   */
  public static File[] listAppDataFolders() {
    String home = System.getProperty("user.home");
    ArrayList folders = new ArrayList();
    if (isWinNT()) // NT/2000/XP
    {
      // C:\Documents and Settings\All Users\Application Data
      // Surmise that the "All Users" folder will be a child of the
      // parent of the current user's home folder:
      File folder = new File(home).getParentFile();
      folders.add(new File(folder, "All Users\\Application Data"));
    }
    else if (isWin9X()) // 95/98/ME
    {
      // C:\Windows
      folders.add(new File(home));
    }
    else if (isVista()) {
      // C:\ProgramData
      File folder = new File(home).getParentFile().getParentFile();
      folders.add(new File(folder, "ProgramData"));
      // C:\Users\Public\AppData
      folder = new File(home).getParentFile();
      folders.add(new File(folder, "Public\\AppData"));
    }
    else if (isMac()) {
      folders.add(new File("/Library/Application Support"));
    }
    else {
      folders.add(new File("/var/local"));
      folders.add(new File("/var"));
    }
    // folders.addAll(Arrays.asList(listUserDataFolders()));
    File[] files = new File[folders.size()];
    return (File[]) folders.toArray(files);
  }
  /**
   * Returns a list of the preferred locations for storing user- specific data
   * in descending order.
   */
  public static File[] listUserDataFolders() {
    String home = System.getProperty("user.home");
    ArrayList folders = new ArrayList();
    if (isWinNT()) {
      folders.add(new File(home + "\\Application Data"));
      folders.add(new File(home + "\\Local Settings\\Application Data"));
    }
    else if (isVista()) {
      folders.add(new File(home + "\\AppData"));
      folders.add(new File(home + "\\AppData\\Local"));
    }
    else if (isMac()) {
      folders.add(new File(home + "/Library/Application Support"));
    }
    folders.add(new File(home));
    File[] files = new File[folders.size()];
    return (File[]) folders.toArray(files);
  }
  /**
   * Returns the name of the current operating system platform as listed in the
   * System properties.
   */
  public static final String getOSName() {
    return System.getProperty("os.name");
  }
  /**
   * Returns the OS representing the current operating system platform.
   */
  public static final OS getOS() {
    String os = System.getProperty("os.name").toLowerCase();
    if (os.indexOf("windows") >= 0)
      return WIN;
    else if (os.indexOf("mac os") >= 0)
      return MAC;
    else
      return POSIX;
  }
  /**
   * Returns whether or not the current operating system is a Microsoft Windows
   * platform.
   */
  public static final boolean isWindows() {
    return getOS() == WIN;
  }
  /**
   * Returns whether or not the current operating system is a Microsoft Windows
   * 9X platform (Windows 95/98/ME).
   */
  public static boolean isWin9X() {
    if (getOS() != WIN)
      return false;
    String os = getOSName();
    if (os.indexOf("95") >= 0 || os.indexOf("98") >= 0 || os.indexOf("me") >= 0)
      return true;
    return false;
  }
  /**
   * Returns whether or not the current operating system is a Microsoft Windows
   * NT platform (Windows NT/2000/2003/XP).
   */
  public static boolean isWinNT() {
    if (getOS() != WIN)
      return false;
    String os = getOSName();
    if (os.indexOf("NT") >= 0 || os.indexOf("2000") >= 0 || os.indexOf("2003") >= 0
        || os.indexOf("XP") >= 0)
      return true;
    return false;
  }
  /**
   * Returns whether or not the current operating system is a Microsoft Windows
   * Vista platform.
   */
  public static boolean isVista() {
    if (getOS() != WIN)
      return false;
    String os = getOSName();
    return (os.indexOf("Vista") >= 0);
  }
  /**
   * Returns whether or not the current operating system is the Apple Macintosh
   * OS X platform.
   */
  public static final boolean isMac() {
    return getOS() == MAC;
  }
  /**
   * Returns whether or not the current operating system is a Posix-compatible
   * platform (Unix, Linux, Solaris, etc).
   */
  public static final boolean isPosix() {
    return getOS() == POSIX;
  }
}