/*
* 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;
}
}