package com.revolsys.util;
import java.io.File;
import java.util.LinkedHashMap;
import java.util.Map;
import com.revolsys.io.FileUtil;
import com.revolsys.record.io.format.json.Json;
public class OS {
public static final String OS_ARCH = System.getProperty("os.arch");
public final static String OS_NAME = System.getProperty("os.name");
public final static boolean IS_LINUX = OS_NAME.equals("Linux");
public final static boolean IS_MAC = OS_NAME.contains("OS X") || OS_NAME.equals("Darwin");
public final static boolean IS_SOLARIS = OS_NAME.equals("SunOS");
public final static boolean IS_WINDOWS = OS_NAME.startsWith("Windows");
public static File getApplicationDataDirectory() {
String path;
if (OS.isWindows()) {
path = System.getenv("APPDATA");
} else if (OS.isMac()) {
path = System.getProperty("user.home") + "/Library/Application Support";
} else {
path = System.getProperty("user.home") + "/.config";
}
final File directory = FileUtil.getDirectory(path);
return directory;
}
public static File getApplicationDataDirectory(final String applicationName) {
final File appsDirectory = getApplicationDataDirectory();
final File directory = FileUtil.getDirectory(appsDirectory, applicationName);
return directory;
}
public static String getArch() {
final String osArch = OS_ARCH.toLowerCase();
if (osArch.equals("i386")) {
return "x86";
} else if (osArch.startsWith("amd64") || osArch.startsWith("x86_64")) {
return "x86_64";
} else if (osArch.equals("ppc")) {
return "ppc";
} else if (osArch.startsWith("ppc")) {
return "ppc_64";
} else if (osArch.startsWith("sparc")) {
return "sparc";
} else {
return OS_ARCH;
}
}
@SuppressWarnings("unchecked")
public static <T> T getPreference(final String applicationName, final String path,
final String propertyName) {
final Map<String, Object> preferences = getPreferences(applicationName, path);
return (T)Property.get(preferences, propertyName);
}
public static <T> T getPreference(final String applicationName, final String path,
final String propertyName, final T defaultValue) {
final T value = getPreference(applicationName, path, propertyName);
if (value == null) {
return defaultValue;
} else {
return value;
}
}
public static boolean getPreferenceBoolean(final String applicationName, final String path,
final String propertyName) {
final Map<String, Object> preferences = getPreferences(applicationName, path);
final Object value = preferences.get(propertyName);
return !Booleans.isFalse(value);
}
public static boolean getPreferenceBoolean(final String applicationName, final String path,
final String propertyName, final boolean defaultValue) {
final Map<String, Object> preferences = getPreferences(applicationName, path);
final Object value = preferences.get(propertyName);
if (value == null) {
return defaultValue;
} else {
return !Booleans.isFalse(value);
}
}
public static File getPreferenceFile(final String applicationName, final String path) {
if (path.contains("..")) {
throw new IllegalArgumentException(
"Path cannot contain the '..' character sequernce: " + path);
}
final File preferencesDirectory = getPreferencesDirectory(applicationName);
final File file = FileUtil.getFile(preferencesDirectory, path + ".rgobject");
file.getParentFile().mkdirs();
return file;
}
public static Integer getPreferenceInt(final String applicationName, final String path,
final String propertyName) {
final Map<String, Object> preferences = getPreferences(applicationName, path);
final Object value = preferences.get(propertyName);
if (value == null) {
return null;
} else {
return Integer.valueOf(value.toString());
}
}
public static int getPreferenceInt(final String applicationName, final String path,
final String propertyName, final int defaultValue) {
final Map<String, Object> preferences = getPreferences(applicationName, path);
final Object value = preferences.get(propertyName);
if (value == null) {
return defaultValue;
} else {
return Integer.valueOf(value.toString());
}
}
public static Map<String, Object> getPreferences(final String applicationName,
final String path) {
final File file = getPreferenceFile(applicationName, path);
if (file.exists()) {
return Json.toMap(file);
} else {
return new LinkedHashMap<>();
}
}
public static File getPreferencesDirectory(final String applicationName) {
String path;
if (OS.isWindows()) {
path = System.getenv("APPDATA") + "/" + applicationName + "/Preferences";
} else if (OS.isMac()) {
path = System.getProperty("user.home") + "/Library/Preferences/" + applicationName;
} else {
path = System.getProperty("user.home") + "/.config/" + applicationName + "/Preferences";
}
final File directory = FileUtil.getFile(path);
directory.mkdirs();
return directory;
}
public static File getUserDirectory() {
final String home = System.getProperty("user.home");
return FileUtil.getFile(home);
}
public static File getUserDirectory(final String path) {
final File userDirectory = getUserDirectory();
return FileUtil.getFile(userDirectory, path);
}
public static boolean isMac() {
return IS_MAC;
}
public static boolean isUnix() {
return IS_SOLARIS || IS_LINUX;
}
public static boolean isWindows() {
return IS_WINDOWS;
}
public static void setPreference(final String applicationName, final String path,
final String propertyName, final Object value) {
final Map<String, Object> preferences = getPreferences(applicationName, path);
preferences.put(propertyName, value);
final File file = getPreferenceFile(applicationName, path);
Json.writeMap(preferences, file, true);
}
}