package jp.co.worksap.workspace.common;
import static com.google.common.base.Preconditions.checkArgument;
import static com.google.common.base.Preconditions.checkNotNull;
import javax.annotation.Nonnegative;
import javax.annotation.Nonnull;
import org.codehaus.jackson.map.annotate.JsonDeserialize;
@JsonDeserialize(using = OperatingSystemDeserializer.class)
public enum OperatingSystem {
WIN32("win", 32), WIN64("win", 64), OSX32("osx", 32), OSX64("osx", 64), LINUX32("linux", 32), LINUX64("linux", 64);
private static final String WINDOWS = "win";
public String getName() {
return name;
}
public int getBits() {
return bits;
}
@Nonnull
private final String name;
@Nonnegative
private final int bits;
OperatingSystem(@Nonnull String name, @Nonnegative int bits) {
checkArgument(bits == 32 || bits == 64);
this.name = checkNotNull(name);
this.bits = bits;
}
@Nonnull
public String appendExtensionTo(@Nonnull String fileName) {
checkNotNull(fileName);
if (name.equals(WINDOWS)) {
return fileName + ".exe";
} else {
return fileName;
}
}
public static OperatingSystem create() {
if (isWindows()) {
if (is32bit()) {
return WIN32;
} else {
return WIN64;
}
} else if (isOsx()) {
if (is32bit()) {
return OSX32;
} else {
return OSX64;
}
} else {
if (is32bit()) {
return LINUX32;
} else {
return LINUX64;
}
}
}
public static OperatingSystem fromString(@Nonnull String string) {
return new OperatingSystemLiteralConverter().apply(string);
}
private static boolean is32bit() {
String osName = System.getProperty("os.arch");
return osName.contains("32");
}
/**
* @see https://developer.apple.com/library/mac/technotes/tn2002/tn2110.html
*/
private static boolean isOsx() {
String osName = System.getProperty("os.name");
return osName.contains("OS X");
}
private static boolean isWindows() {
String osName = System.getProperty("os.name");
return osName.startsWith("Windows");
}
}