/* * Copyright (c) 2008, Harald Kuhr * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * Neither the name "TwelveMonkeys" nor the * names of its contributors may be used to endorse or promote products * derived from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ package com.twelvemonkeys.lang; import java.util.Properties; /** * Platform * * @author <a href="mailto:harald.kuhr@gmail.com">Harald Kuhr</a> * @author last modified by $Author: haku $ * @version $Id: //depot/branches/personal/haraldk/twelvemonkeys/release-2/twelvemonkeys-core/src/main/java/com/twelvemonkeys/lang/Platform.java#1 $ */ public final class Platform { /** * Normalized operating system constant */ final OperatingSystem os; /** * Unnormalized operating system version constant (for completeness) */ final String version; /** * Normalized system architecture constant */ final Architecture architecture; static final private Platform INSTANCE = new Platform(); private Platform() { this(System.getProperties()); } Platform(final Properties properties) { os = normalizeOperatingSystem(properties.getProperty("os.name")); version = properties.getProperty("os.version"); architecture = normalizeArchitecture(os, properties.getProperty("os.arch")); } static OperatingSystem normalizeOperatingSystem(final String osName) { String os = osName; if (os == null) { throw new IllegalStateException("System property \"os.name\" == null"); } os = os.toLowerCase(); if (os.startsWith("windows")) { return OperatingSystem.Windows; } else if (os.startsWith("linux")) { return OperatingSystem.Linux; } else if (os.startsWith("mac os") || os.startsWith("darwin")) { return OperatingSystem.MacOS; } else if (os.startsWith("solaris") || os.startsWith("sunos")) { return OperatingSystem.Solaris; } return OperatingSystem.Unknown; } static Architecture normalizeArchitecture(final OperatingSystem pOsName, final String osArch) { String arch = osArch; if (arch == null) { throw new IllegalStateException("System property \"os.arch\" == null"); } arch = arch.toLowerCase(); if (pOsName == OperatingSystem.Windows && (arch.startsWith("x86") || arch.startsWith("i386"))) { return Architecture.X86; // TODO: 64 bit } else if (pOsName == OperatingSystem.Linux) { if (arch.startsWith("x86") || arch.startsWith("i386")) { return Architecture.I386; } else if (arch.startsWith("i686")) { return Architecture.I686; } else if (arch.startsWith("power") || arch.startsWith("ppc")) { return Architecture.PPC; } // TODO: More Linux options? // TODO: 64 bit } else if (pOsName == OperatingSystem.MacOS) { if (arch.startsWith("power") || arch.startsWith("ppc")) { return Architecture.PPC; } else if (arch.startsWith("x86")) { return Architecture.X86; } else if (arch.startsWith("i386")) { return Architecture.X86; } // TODO: 64 bit } else if (pOsName == OperatingSystem.Solaris) { if (arch.startsWith("sparc")) { return Architecture.SPARC; } if (arch.startsWith("x86")) { // TODO: Should we use i386 as Linux and Mac does? return Architecture.X86; } // TODO: 64 bit } return Architecture.Unknown; } /** * Returns the current {@code Platform}. * @return the current {@code Platform}. */ public static Platform get() { return INSTANCE; } /** * @return this platform's OS. */ public OperatingSystem getOS() { return os; } /** * @return this platform's OS version. */ public String getVersion() { return version; } /** * @return this platform's architecture. */ public Architecture getArchitecture() { return architecture; } /** * Shorthand for {@code Platform.get().getOS()}. * @return the current {@code OperatingSystem}. */ public static OperatingSystem os() { return INSTANCE.os; } /** * Shorthand for {@code Platform.get().getVersion()}. * @return the current OS version. */ public static String version() { return INSTANCE.version; } /** * Shorthand for {@code Platform.get().getArchitecture()}. * @return the current {@code Architecture}. */ public static Architecture arch() { return INSTANCE.architecture; } /** * Enumeration of common System {@code Architecture}s. * <p/> * For {@link #Unknown unknown architectures}, {@code toString()} will return * the the same value as {@code System.getProperty("os.arch")}. * * @author <a href="mailto:harald.kuhr@gmail.com">Harald Kuhr</a> * @version $Id: //depot/branches/personal/haraldk/twelvemonkeys/release-2/twelvemonkeys-core/src/main/java/com/twelvemonkeys/lang/Platform.java#1 $ */ public enum Architecture { X86("x86"), I386("i386"), I686("i686"), PPC("ppc"), SPARC("sparc"), Unknown(System.getProperty("os.arch")); final String name;// for debug only Architecture(String pName) { name = pName; } public String toString() { return name; } } /** * Enumeration of common {@code OperatingSystem}s. * <p/> * For {@link #Unknown unknown operating systems}, {@code getName()} will return * the the same value as {@code System.getProperty("os.name")}. * * @author <a href="mailto:harald.kuhr@gmail.com">Harald Kuhr</a> * @version $Id: //depot/branches/personal/haraldk/twelvemonkeys/release-2/twelvemonkeys-core/src/main/java/com/twelvemonkeys/lang/Platform.java#1 $ */ public enum OperatingSystem { Windows("Windows", "win"), Linux("Linux", "lnx"), Solaris("Solaris", "sun"), MacOS("Mac OS", "osx"), Unknown(System.getProperty("os.name"), null); final String id; final String name;// for debug only OperatingSystem(String pName, String pId) { name = pName; id = pId != null ? pId : pName.toLowerCase(); } public String getName() { return name; } public String id() { return id; } public String toString() { return String.format("%s (%s)", id, name); } } }