package org.codehaus.plexus.util;

/*
 * The Apache Software License, Version 1.1
 *
 * Copyright (c) 2001-2003 The Apache Software Foundation.  All rights
 * reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 *
 * 1. Redistributions of source code must retain the above copyright
 *    notice, this list of conditions and the following disclaimer.
 *
 * 2. 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.
 *
 * 3. The end-user documentation included with the redistribution, if
 *    any, must include the following acknowledgement:
 *       "This product includes software developed by the
 *        Apache Software Foundation (http://www.apache.org/)."
 *    Alternately, this acknowledgement may appear in the software itself,
 *    if and wherever such third-party acknowledgements normally appear.
 *
 * 4. The names "Ant" and "Apache Software
 *    Foundation" must not be used to endorse or promote products derived
 *    from this software without prior written permission. For written
 *    permission, please contact apache@apache.org.
 *
 * 5. Products derived from this software may not be called "Apache"
 *    nor may "Apache" appear in their names without prior written
 *    permission of the Apache Group.
 *
 * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED 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 APACHE SOFTWARE FOUNDATION OR
 * ITS 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.
 * ====================================================================
 *
 * This software consists of voluntary contributions made by many
 * individuals on behalf of the Apache Software Foundation.  For more
 * information on the Apache Software Foundation, please see
 * <http://www.apache.org/>.
 */

import java.util.HashSet;
import java.util.Locale;
import java.util.Set;

Condition that tests the OS type.
Author:Stefan Bodewig, Magesh Umasankar, Brian Fox
Since:1.0
Version:$Revision$
/** * Condition that tests the OS type. * * @author Stefan Bodewig * @author Magesh Umasankar * @author Brian Fox * @since 1.0 * @version $Revision$ */
public class Os { // define the families for easier reference public static final String FAMILY_DOS = "dos"; public static final String FAMILY_MAC = "mac"; public static final String FAMILY_NETWARE = "netware"; public static final String FAMILY_OS2 = "os/2"; public static final String FAMILY_TANDEM = "tandem"; public static final String FAMILY_UNIX = "unix"; public static final String FAMILY_WINDOWS = "windows"; public static final String FAMILY_WIN9X = "win9x"; public static final String FAMILY_ZOS = "z/os"; public static final String FAMILY_OS400 = "os/400"; public static final String FAMILY_OPENVMS = "openvms"; // store the valid families private static final Set<String> validFamilies = setValidFamilies(); // get the current info private static final String PATH_SEP = System.getProperty( "path.separator" ); public static final String OS_NAME = System.getProperty( "os.name" ).toLowerCase( Locale.US ); public static final String OS_ARCH = System.getProperty( "os.arch" ).toLowerCase( Locale.US ); public static final String OS_VERSION = System.getProperty( "os.version" ).toLowerCase( Locale.US ); // Make sure this method is called after static fields it depends on have been set! public static final String OS_FAMILY = getOsFamily(); private String family; private String name; private String version; private String arch;
Default constructor
/** * Default constructor */
public Os() { }
Constructor that sets the family attribute
Params:
  • family – a String value
/** * Constructor that sets the family attribute * * @param family a String value */
public Os( String family ) { setFamily( family ); }
Initializes the set of valid families.
/** * Initializes the set of valid families. */
private static Set<String> setValidFamilies() { Set<String> valid = new HashSet<String>(); valid.add( FAMILY_DOS ); valid.add( FAMILY_MAC ); valid.add( FAMILY_NETWARE ); valid.add( FAMILY_OS2 ); valid.add( FAMILY_TANDEM ); valid.add( FAMILY_UNIX ); valid.add( FAMILY_WINDOWS ); valid.add( FAMILY_WIN9X ); valid.add( FAMILY_ZOS ); valid.add( FAMILY_OS400 ); valid.add( FAMILY_OPENVMS ); return valid; }
Sets the desired OS family type
Params:
  • f – The OS family type desired
    Possible values:
    • dos
    • mac
    • netware
    • os/2
    • tandem
    • unix
    • windows
    • win9x
    • z/os
    • os/400
    • openvms
/** * Sets the desired OS family type * * @param f The OS family type desired<br> * Possible values: * <ul> * <li>dos</li> * <li>mac</li> * <li>netware</li> * <li>os/2</li> * <li>tandem</li> * <li>unix</li> * <li>windows</li> * <li>win9x</li> * <li>z/os</li> * <li>os/400</li> * <li>openvms</li> * </ul> */
public void setFamily( String f ) { family = f.toLowerCase( Locale.US ); }
Sets the desired OS name
Params:
  • name – The OS name
/** * Sets the desired OS name * * @param name The OS name */
public void setName( String name ) { this.name = name.toLowerCase( Locale.US ); }
Sets the desired OS architecture
Params:
  • arch – The OS architecture
/** * Sets the desired OS architecture * * @param arch The OS architecture */
public void setArch( String arch ) { this.arch = arch.toLowerCase( Locale.US ); }
Sets the desired OS version
Params:
  • version – The OS version
/** * Sets the desired OS version * * @param version The OS version */
public void setVersion( String version ) { this.version = version.toLowerCase( Locale.US ); }
Determines if the current OS matches the type of that set in setFamily.
See Also:
  • setFamily.setFamily(String)
/** * Determines if the current OS matches the type of that set in setFamily. * * @see Os#setFamily(String) */
public boolean eval() throws Exception { return isOs( family, name, arch, version ); }
Determines if the current OS matches the given OS family.
Params:
  • family – the family to check for
Returns:true if the OS matches
Since:1.0
/** * Determines if the current OS matches the given OS family. * * @param family the family to check for * @return true if the OS matches * @since 1.0 */
public static boolean isFamily( String family ) { return isOs( family, null, null, null ); }
Determines if the current OS matches the given OS name.
Params:
  • name – the OS name to check for
Returns:true if the OS matches
Since:1.0
/** * Determines if the current OS matches the given OS name. * * @param name the OS name to check for * @return true if the OS matches * @since 1.0 */
public static boolean isName( String name ) { return isOs( null, name, null, null ); }
Determines if the current OS matches the given OS architecture.
Params:
  • arch – the OS architecture to check for
Returns:true if the OS matches
Since:1.0
/** * Determines if the current OS matches the given OS architecture. * * @param arch the OS architecture to check for * @return true if the OS matches * @since 1.0 */
public static boolean isArch( String arch ) { return isOs( null, null, arch, null ); }
Determines if the current OS matches the given OS version.
Params:
  • version – the OS version to check for
Returns:true if the OS matches
Since:1.0
/** * Determines if the current OS matches the given OS version. * * @param version the OS version to check for * @return true if the OS matches * @since 1.0 */
public static boolean isVersion( String version ) { return isOs( null, null, null, version ); }
Determines if the current OS matches the given OS family, name, architecture and version. The name, architecture and version are compared to the System properties os.name, os.version and os.arch in a case-independent way.
Params:
  • family – The OS family
  • name – The OS name
  • arch – The OS architecture
  • version – The OS version
Returns:true if the OS matches
Since:1.0
/** * Determines if the current OS matches the given OS family, name, architecture and version. The name, architecture * and version are compared to the System properties os.name, os.version and os.arch in a case-independent way. * * @param family The OS family * @param name The OS name * @param arch The OS architecture * @param version The OS version * @return true if the OS matches * @since 1.0 */
public static boolean isOs( String family, String name, String arch, String version ) { boolean retValue = false; if ( family != null || name != null || arch != null || version != null ) { boolean isFamily = true; boolean isName = true; boolean isArch = true; boolean isVersion = true; if ( family != null ) { if ( family.equalsIgnoreCase( FAMILY_WINDOWS ) ) { isFamily = OS_NAME.contains( FAMILY_WINDOWS ); } else if ( family.equalsIgnoreCase( FAMILY_OS2 ) ) { isFamily = OS_NAME.contains( FAMILY_OS2 ); } else if ( family.equalsIgnoreCase( FAMILY_NETWARE ) ) { isFamily = OS_NAME.contains( FAMILY_NETWARE ); } else if ( family.equalsIgnoreCase( FAMILY_DOS ) ) { isFamily = PATH_SEP.equals( ";" ) && !isFamily( FAMILY_NETWARE ) && !isFamily( FAMILY_WINDOWS ) && !isFamily( FAMILY_WIN9X ); } else if ( family.equalsIgnoreCase( FAMILY_MAC ) ) { isFamily = OS_NAME.contains( FAMILY_MAC ); } else if ( family.equalsIgnoreCase( FAMILY_TANDEM ) ) { isFamily = OS_NAME.contains( "nonstop_kernel" ); } else if ( family.equalsIgnoreCase( FAMILY_UNIX ) ) { isFamily = PATH_SEP.equals( ":" ) && !isFamily( FAMILY_OPENVMS ) && ( !isFamily( FAMILY_MAC ) || OS_NAME.endsWith( "x" ) ); } else if ( family.equalsIgnoreCase( FAMILY_WIN9X ) ) { isFamily = isFamily( FAMILY_WINDOWS ) && ( OS_NAME.contains( "95" ) || OS_NAME.contains( "98" ) || OS_NAME.contains( "me" ) || OS_NAME.contains( "ce" ) ); } else if ( family.equalsIgnoreCase( FAMILY_ZOS ) ) { isFamily = OS_NAME.contains( FAMILY_ZOS ) || OS_NAME.contains( "os/390" ); } else if ( family.equalsIgnoreCase( FAMILY_OS400 ) ) { isFamily = OS_NAME.contains( FAMILY_OS400 ); } else if ( family.equalsIgnoreCase( FAMILY_OPENVMS ) ) { isFamily = OS_NAME.contains( FAMILY_OPENVMS ); } else { isFamily = OS_NAME.contains( family.toLowerCase( Locale.US ) ); } } if ( name != null ) { isName = name.toLowerCase( Locale.US ).equals( OS_NAME ); } if ( arch != null ) { isArch = arch.toLowerCase( Locale.US ).equals( OS_ARCH ); } if ( version != null ) { isVersion = version.toLowerCase( Locale.US ).equals( OS_VERSION ); } retValue = isFamily && isName && isArch && isVersion; } return retValue; }
Helper method to determine the current OS family.
Returns:name of current OS family.
Since:1.4.2
/** * Helper method to determine the current OS family. * * @return name of current OS family. * @since 1.4.2 */
private static String getOsFamily() { // in case the order of static initialization is // wrong, get the list // safely. Set<String> families = null; if ( !validFamilies.isEmpty() ) { families = validFamilies; } else { families = setValidFamilies(); } for ( String fam : families ) { if ( Os.isFamily( fam ) ) { return fam; } } return null; }
Helper method to check if the given family is in the following list:
  • dos
  • mac
  • netware
  • os/2
  • tandem
  • unix
  • windows
  • win9x
  • z/os
  • os/400
  • openvms
Params:
  • theFamily – the family to check.
Returns:true if one of the valid families.
Since:1.4.2
/** * Helper method to check if the given family is in the following list: * <ul> * <li>dos</li> * <li>mac</li> * <li>netware</li> * <li>os/2</li> * <li>tandem</li> * <li>unix</li> * <li>windows</li> * <li>win9x</li> * <li>z/os</li> * <li>os/400</li> * <li>openvms</li> * </ul> * * @param theFamily the family to check. * @return true if one of the valid families. * @since 1.4.2 */
public static boolean isValidFamily( String theFamily ) { return ( validFamilies.contains( theFamily ) ); }
Returns:a copy of the valid families
Since:1.4.2
/** * @return a copy of the valid families * @since 1.4.2 */
public static Set<String> getValidFamilies() { return new HashSet<String>( validFamilies ); } }