/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Locale;
import java.util.Set;
/**
* Class to help determining the OS.
*
* @author <a href="mailto:stefan.bodewig@epost.de">Stefan Bodewig</a>
* @author <a href="mailto:umagesh@apache.org">Magesh Umasankar</a>
* @author <a href="mailto:peter@apache.org">Peter Donald</a>
*/
public final class Os
{
private static final String OS_NAME =
System.getProperty("os.name").toLowerCase(Locale.US);
private static final String OS_ARCH =
System.getProperty("os.arch").toLowerCase(Locale.US);
private static final String OS_VERSION =
System.getProperty("os.version").toLowerCase(Locale.US);
private static final String PATH_SEP =
System.getProperty("path.separator");
private static final OsFamily OS_FAMILY;
private static final OsFamily[] OS_ALL_FAMILIES;
/**
* All Windows based OSes.
*/
public static final OsFamily OS_FAMILY_WINDOWS = new OsFamily("windows");
/**
* All DOS based OSes.
*/
public static final OsFamily OS_FAMILY_DOS = new OsFamily("dos");
/**
* All Windows NT based OSes.
*/
public static final OsFamily OS_FAMILY_WINNT =
new OsFamily("nt", new OsFamily[]{OS_FAMILY_WINDOWS});
/**
* All Windows 9x based OSes.
*/
public static final OsFamily OS_FAMILY_WIN9X =
new OsFamily("win9x", new OsFamily[]{OS_FAMILY_WINDOWS, OS_FAMILY_DOS});
/**
* OS/2
*/
public static final OsFamily OS_FAMILY_OS2 =
new OsFamily("os/2", new OsFamily[]{OS_FAMILY_DOS});
/**
* Netware
*/
public static final OsFamily OS_FAMILY_NETWARE =
new OsFamily("netware");
/**
* All UNIX based OSes.
*/
public static final OsFamily OS_FAMILY_UNIX = new OsFamily("unix");
/**
* All Mac based OSes.
*/
public static final OsFamily OS_FAMILY_MAC = new OsFamily("mac");
/**
* OSX
*/
public static final OsFamily OS_FAMILY_OSX =
new OsFamily("osx", new OsFamily[]{OS_FAMILY_UNIX, OS_FAMILY_MAC});
private static final OsFamily[] ALL_FAMILIES = new OsFamily[]
{
OS_FAMILY_DOS,
OS_FAMILY_MAC,
OS_FAMILY_NETWARE,
OS_FAMILY_OS2,
OS_FAMILY_OSX,
OS_FAMILY_UNIX,
OS_FAMILY_WINDOWS,
OS_FAMILY_WINNT,
OS_FAMILY_WIN9X
};
static
{
OS_FAMILY = determineOsFamily();
OS_ALL_FAMILIES = determineAllFamilies();
}
/**
* Private constructor to block instantiation.
*/
private Os()
{
}
/**
* Determines if the OS on which Ant is executing matches the given OS
* version.
*/
public static boolean isVersion(final String version)
{
return isOs((OsFamily) null, null, null, version);
}
/**
* Determines if the OS on which Ant is executing matches the given OS
* architecture.
*/
public static boolean isArch(final String arch)
{
return isOs((OsFamily) null, null, arch, null);
}
/**
* Determines if the OS on which Ant is executing matches the given OS
* family.
*/
public static boolean isFamily(final String family)
{
return isOs(family, null, null, null);
}
/**
* Determines if the OS on which Ant is executing matches the given OS
* family.
*/
public static boolean isFamily(final OsFamily family)
{
return isOs(family, null, null, null);
}
/**
* Determines if the OS on which Ant is executing matches the given OS name.
*
* @param name Description of Parameter
* @return The Name value
* @since 1.7
*/
public static boolean isName(final String name)
{
return isOs((OsFamily) null, name, null, null);
}
/**
* Determines if the OS on which Ant is executing matches the given OS
* family, name, architecture and version.
*
* @param family The OS family
* @param name The OS name
* @param arch The OS architecture
* @param version The OS version
* @return The Os value
*/
public static boolean isOs(final String family,
final String name,
final String arch,
final String version)
{
return isOs(getFamily(family), name, arch, version);
}
/**
* Determines if the OS on which Ant is executing matches the given OS
* family, name, architecture and version
*
* @param family The OS family
* @param name The OS name
* @param arch The OS architecture
* @param version The OS version
* @return The Os value
*/
public static boolean isOs(final OsFamily family,
final String name,
final String arch,
final String version)
{
if (family != null || name != null || arch != null || version != null)
{
final boolean isFamily = familyMatches(family);
final boolean isName = nameMatches(name);
final boolean isArch = archMatches(arch);
final boolean isVersion = versionMatches(version);
return isFamily && isName && isArch && isVersion;
}
else
{
return false;
}
}
/**
* Locates an OsFamily by name (case-insensitive).
*
* @return the OS family, or null if not found.
*/
public static OsFamily getFamily(final String name)
{
for (int i = 0; i < ALL_FAMILIES.length; i++)
{
final OsFamily osFamily = ALL_FAMILIES[i];
if (osFamily.getName().equalsIgnoreCase(name))
{
return osFamily;
}
}
return null;
}
private static boolean versionMatches(final String version)
{
boolean isVersion = true;
if (version != null)
{
isVersion = version.equalsIgnoreCase(OS_VERSION);
}
return isVersion;
}
private static boolean archMatches(final String arch)
{
boolean isArch = true;
if (arch != null)
{
isArch = arch.equalsIgnoreCase(OS_ARCH);
}
return isArch;
}
private static boolean nameMatches(final String name)
{
boolean isName = true;
if (name != null)
{
isName = name.equalsIgnoreCase(OS_NAME);
}
return isName;
}
private static boolean familyMatches(final OsFamily family)
{
if (family == null)
{
return false;
}
for (int i = 0; i < OS_ALL_FAMILIES.length; i++)
{
final OsFamily osFamily = OS_ALL_FAMILIES[i];
if (family == osFamily)
{
return true;
}
}
return false;
}
private static OsFamily[] determineAllFamilies()
{
// Determine all families the current OS belongs to
Set allFamilies = new HashSet();
if (OS_FAMILY != null)
{
List queue = new ArrayList();
queue.add(OS_FAMILY);
while (queue.size() > 0)
{
final OsFamily family = (OsFamily) queue.remove(0);
allFamilies.add(family);
final OsFamily[] families = family.getFamilies();
for (int i = 0; i < families.length; i++)
{
OsFamily parent = families[i];
queue.add(parent);
}
}
}
return (OsFamily[]) allFamilies.toArray(new OsFamily[allFamilies.size()]);
}
private static OsFamily determineOsFamily()
{
// Determine the most specific OS family
if (OS_NAME.indexOf("windows") > -1)
{
if (OS_NAME.indexOf("xp") > -1
|| OS_NAME.indexOf("2000") > -1
|| OS_NAME.indexOf("nt") > -1)
{
return OS_FAMILY_WINNT;
}
else
{
return OS_FAMILY_WIN9X;
}
}
else if (OS_NAME.indexOf("os/2") > -1)
{
return OS_FAMILY_OS2;
}
else if (OS_NAME.indexOf("netware") > -1)
{
return OS_FAMILY_NETWARE;
}
else if (OS_NAME.indexOf("mac") > -1)
{
if (OS_NAME.endsWith("x"))
{
return OS_FAMILY_OSX;
}
else
{
return OS_FAMILY_MAC;
}
}
else if (PATH_SEP.equals(":"))
{
return OS_FAMILY_UNIX;
}
else
{
return null;
}
}
}
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
/**
* An enumerated type, which represents an OS family.
*
* @author <a href="mailto:adammurdoch@apache.org">Adam Murdoch</a>
* @version $Revision: 480428 $ $Date: 2006-11-29 07:15:24 +0100 (Mi, 29 Nov 2006) $
*/
final class OsFamily
{
private final String name;
private final OsFamily[] families;
OsFamily(final String name)
{
this.name = name;
families = new OsFamily[0];
}
OsFamily(final String name, final OsFamily[] families)
{
this.name = name;
this.families = families;
}
/**
* Returns the name of this family.
*/
public String getName()
{
return name;
}
/**
* Returns the OS families that this family belongs to.
*/
public OsFamily[] getFamilies()
{
return families;
}
}