001 /** 002 * 003 * Copyright 2005 The Apache Software Foundation 004 * 005 * Licensed under the Apache License, Version 2.0 (the "License"); 006 * you may not use this file except in compliance with the License. 007 * You may obtain a copy of the License at 008 * 009 * http://www.apache.org/licenses/LICENSE-2.0 010 * 011 * Unless required by applicable law or agreed to in writing, software 012 * distributed under the License is distributed on an "AS IS" BASIS, 013 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 014 * See the License for the specific language governing permissions and 015 * limitations under the License. 016 */ 017 package org.apache.geronimo.kernel.config; 018 019 import java.util.Locale; 020 021 /** 022 * Condition that tests the OS type. 023 * 024 * @version $Rev: 410741 $ $Date: 2006-05-31 21:35:48 -0700 (Wed, 31 May 2006) $ 025 */ 026 public class Os { 027 private static final String OS_NAME = System.getProperty("os.name").toLowerCase(Locale.US); 028 private static final String OS_ARCH = System.getProperty("os.arch").toLowerCase(Locale.US); 029 private static final String OS_VERSION = System.getProperty("os.version").toLowerCase(Locale.US); 030 private static final String PATH_SEP = System.getProperty("path.separator"); 031 032 /** 033 * OS family that can be tested for. {@value} 034 */ 035 public static final String FAMILY_WINDOWS = "windows"; 036 /** 037 * OS family that can be tested for. {@value} 038 */ 039 public static final String FAMILY_9X = "win9x"; 040 /** 041 * OS family that can be tested for. {@value} 042 */ 043 public static final String FAMILY_NT = "winnt"; 044 /** 045 * OS family that can be tested for. {@value} 046 */ 047 public static final String FAMILY_OS2 = "os/2"; 048 /** 049 * OS family that can be tested for. {@value} 050 */ 051 public static final String FAMILY_NETWARE = "netware"; 052 /** 053 * OS family that can be tested for. {@value} 054 */ 055 public static final String FAMILY_DOS = "dos"; 056 /** 057 * OS family that can be tested for. {@value} 058 */ 059 public static final String FAMILY_MAC = "mac"; 060 /** 061 * OS family that can be tested for. {@value} 062 */ 063 public static final String FAMILY_TANDEM = "tandem"; 064 /** 065 * OS family that can be tested for. {@value} 066 */ 067 public static final String FAMILY_UNIX = "unix"; 068 /** 069 * OS family that can be tested for. {@value} 070 */ 071 public static final String FAMILY_VMS = "openvms"; 072 /** 073 * OS family that can be tested for. {@value} 074 */ 075 public static final String FAMILY_ZOS = "z/os"; 076 /** 077 * OS family that can be tested for. {@value} 078 */ 079 public static final String FAMILY_OS400 = "os/400"; 080 081 private Os() { 082 //default 083 } 084 085 /** 086 * Determines if the OS on which Ant is executing matches the 087 * given OS family. 088 * @param family the family to check for 089 * @return true if the OS matches 090 * @since 1.5 091 */ 092 public static boolean isFamily(String family) { 093 return isOs(family, null, null, null); 094 } 095 096 /** 097 * Determines if the OS on which Ant is executing matches the 098 * given OS name. 099 * 100 * @param name The OS family type desired<br /> 101 * Possible values:<br /> 102 * <ul> 103 * <li>dos</li> 104 * <li>mac</li> 105 * <li>netware</li> 106 * <li>os/2</li> 107 * <li>tandem</li> 108 * <li>unix</li> 109 * <li>windows</li> 110 * <li>win9x</li> 111 * <li>z/os</li> 112 * <li>os/400</li> 113 * </ul> 114 * @return true if the OS matches 115 * @since 1.7 116 */ 117 public static boolean isName(String name) { 118 return isOs(null, name, null, null); 119 } 120 121 /** 122 * Determines if the OS on which Ant is executing matches the 123 * given OS architecture. 124 * 125 * @param arch the OS architecture to check for 126 * @return true if the OS matches 127 * @since 1.7 128 */ 129 public static boolean isArch(String arch) { 130 return isOs(null, null, arch, null); 131 } 132 133 /** 134 * Determines if the OS on which Ant is executing matches the 135 * given OS version. 136 * 137 * @param version the OS version to check for 138 * @return true if the OS matches 139 * @since 1.7 140 */ 141 public static boolean isVersion(String version) { 142 return isOs(null, null, null, version); 143 } 144 145 /** 146 * Determines if the OS on which Ant is executing matches the 147 * given OS family, name, architecture and version 148 * 149 * @param family The OS family 150 * @param name The OS name 151 * @param arch The OS architecture 152 * @param version The OS version 153 * @return true if the OS matches 154 * @since 1.7 155 */ 156 public static boolean isOs(String family, String name, String arch, 157 String version) { 158 boolean retValue = false; 159 160 if (family != null || name != null || arch != null 161 || version != null) { 162 163 boolean isFamily = true; 164 boolean isName = true; 165 boolean isArch = true; 166 boolean isVersion = true; 167 168 if (family != null) { 169 170 //windows probing logic relies on the word 'windows' in 171 //the OS 172 boolean isWindows = OS_NAME.indexOf(FAMILY_WINDOWS) > -1; 173 boolean is9x = false; 174 boolean isNT = false; 175 if(isWindows) { 176 //there are only four 9x platforms that we look for 177 is9x = (OS_NAME.indexOf("95") >= 0 178 || OS_NAME.indexOf("98") >= 0 179 || OS_NAME.indexOf("me") >= 0 180 //wince isn't really 9x, but crippled enough to 181 //be a muchness. Ant doesnt run on CE, anyway. 182 || OS_NAME.indexOf("ce") >= 0); 183 isNT = !is9x; 184 } 185 if (family.equals(FAMILY_WINDOWS)) { 186 isFamily = isWindows; 187 } else if (family.equals(FAMILY_9X)) { 188 isFamily = isWindows && is9x; 189 } else if (family.equals(FAMILY_NT)) { 190 isFamily = isWindows && isNT; 191 } else if (family.equals(FAMILY_OS2)) { 192 isFamily = OS_NAME.indexOf(FAMILY_OS2) > -1; 193 } else if (family.equals(FAMILY_NETWARE)) { 194 isFamily = OS_NAME.indexOf(FAMILY_NETWARE) > -1; 195 } else if (family.equals(FAMILY_DOS)) { 196 isFamily = PATH_SEP.equals(";") && !isFamily(FAMILY_NETWARE); 197 } else if (family.equals(FAMILY_MAC)) { 198 isFamily = OS_NAME.indexOf(FAMILY_MAC) > -1; 199 } else if (family.equals(FAMILY_TANDEM)) { 200 isFamily = OS_NAME.indexOf("nonstop_kernel") > -1; 201 } else if (family.equals(FAMILY_UNIX)) { 202 isFamily = PATH_SEP.equals(":") 203 && !isFamily(FAMILY_VMS) 204 && (!isFamily(FAMILY_MAC) || OS_NAME.endsWith("x")); 205 } else if (family.equals(FAMILY_ZOS)) { 206 isFamily = OS_NAME.indexOf(FAMILY_ZOS) > -1 207 || OS_NAME.indexOf("os/390") > -1; 208 } else if (family.equals(FAMILY_OS400)) { 209 isFamily = OS_NAME.indexOf(FAMILY_OS400) > -1; 210 } else if (family.equals(FAMILY_VMS)) { 211 isFamily = OS_NAME.indexOf(FAMILY_VMS) > -1; 212 } else { 213 throw new IllegalArgumentException( 214 "Don\'t know how to detect os family \"" 215 + family + "\""); 216 } 217 } 218 if (name != null) { 219 isName = name.equals(OS_NAME); 220 } 221 if (arch != null) { 222 isArch = arch.equals(OS_ARCH); 223 } 224 if (version != null) { 225 isVersion = version.equals(OS_VERSION); 226 } 227 retValue = isFamily && isName && isArch && isVersion; 228 } 229 return retValue; 230 } 231 }