/* * This file is part of muCommander, http://www.mucommander.com * Copyright (C) 2002-2016 Maxence Bernard * * muCommander is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * muCommander is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see <http://www.gnu.org/licenses/>. */ package com.mucommander.commons.runtime; import org.slf4j.Logger; import org.slf4j.LoggerFactory; /** * This class represents a non-versioned family of operating system, like <code>Windows</code> or <code>Linux</code>. * The current runtime instance is determined using the value of the <code>os.name</code> system property. * * @see OsVersion * @author Maxence Bernard, Arik Hadas */ public enum OsFamily { /** Windows */ WINDOWS("Windows"), /** Mac OS X */ MAC_OS_X("Mac OS X"), /** Linux */ LINUX("Linux"), /** Solaris */ SOLARIS("Solaris"), /** OS/2 */ OS_2("OS/2"), /** FreeBSD */ FREEBSD("FreeBSD"), /** AIX */ AIX("AIX"), /** HP-UX */ HP_UX("HP-UX"), /** OpenVMS */ OPENVMS("OpenVMS"), /** Other OS */ UNKNOWN_OS_FAMILY("Unknown"); /** Logger used by this class. */ private static final Logger LOGGER = LoggerFactory.getLogger(OsFamily.class); /** The String representation of this RuntimeProperty, set at creation time */ protected final String stringRepresentation; /** Holds the OsFamily of the current runtime environment */ private static OsFamily currentValue; /* * Determines the current value by parsing the corresponding system property. This method is called automatically * by this class the first time the current value is accessed. However, this method has been made public to allow * to force the initialization if it needs to happen at a predictable time. */ static { currentValue = parseSystemProperty(getRawSystemProperty()); LOGGER.info("Current OS family: {}", currentValue); } OsFamily(String stringRepresentation) { this.stringRepresentation = stringRepresentation; } //////////////////// // Static methods // //////////////////// /** * Returns the OS family of the current runtime environment. * * @return the OS family of the current runtime environment */ public static OsFamily getCurrent() { return currentValue; } /** * Returns <code>true</code> if this OS family is UNIX-based. The following OS families are considered UNIX-based: * <ul> * <li>{@link #LINUX}</li> * <li>{@link #MAC_OS_X}</li> * <li>{@link #SOLARIS}</li> * <li>{@link #FREEBSD}</li> * <li>{@link #AIX}</li> * <li>{@link #HP_UX}</li> * <li>{@link #UNKNOWN_OS_FAMILY}: the reasonning for this being that most alternative OSes are Unix-based.</li> * </ul> * * @return <code>true</code> if the current OS is UNIX-based */ public boolean isUnixBased() { return this==MAC_OS_X || this==LINUX || this==SOLARIS || this==FREEBSD || this==AIX || this==HP_UX || this== UNKNOWN_OS_FAMILY; // Not UNIX-based: WINDOWS, OS/2 and OpenVMS } /** * Returns the value of the system property which serves to detect the OS family at runtime. * * @return the value of the system property which serves to detect the OS family at runtime. */ public static String getRawSystemProperty() { return System.getProperty("os.name"); } /** * Returns an <code>OsFamily</code> instance corresponding to the specified system property's value. * * @param osNameProp the value of the "os.name" system property * @return an OsFamily instance corresponding to the specified system property's value */ static OsFamily parseSystemProperty(String osNameProp) { // This website holds a collection of system property values under many OSes: // http://lopica.sourceforge.net/os.html // Windows family if (osNameProp.startsWith("Windows")) { return WINDOWS; } // Mac OS X family if (osNameProp.startsWith("Mac OS X")) { return MAC_OS_X; } // OS/2 family if (osNameProp.startsWith("OS/2")) { return OS_2; } // Linux family if (osNameProp.startsWith("Linux")) { return LINUX; } // Solaris family if (osNameProp.startsWith("Solaris") || osNameProp.startsWith("SunOS")) { return SOLARIS; } if (osNameProp.startsWith("FreeBSD")) { return FREEBSD; } if (osNameProp.startsWith("AIX")) { return AIX; } if (osNameProp.startsWith("HP-UX")) { return HP_UX; } if (osNameProp.startsWith("OpenVMS")) { return OPENVMS; } // Any other OS return UNKNOWN_OS_FAMILY; } /** * Returns <code>true</code> if this instance is the same instance as the one returned by {@link #getCurrent()}. * * @return true if this instance is the same as the current runtime's value */ public boolean isCurrent() { return this==currentValue; } //////////////////////// // Overridden methods // //////////////////////// @Override public String toString() { return stringRepresentation; } }