001 /*
002 * Licensed to the Apache Software Foundation (ASF) under one or more
003 * contributor license agreements. See the NOTICE file distributed with
004 * this work for additional information regarding copyright ownership.
005 * The ASF licenses this file to You under the Apache License, Version 2.0
006 * (the "License"); you may not use this file except in compliance with
007 * the License. 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 */
018
019 package org.apache.commons.exec;
020
021 import java.util.Locale;
022
023 /**
024 * Condition that tests the OS type.
025 */
026 public final class OS {
027 private static final String FAMILY_OS_400 = "os/400";
028
029 private static final String FAMILY_Z_OS = "z/os";
030
031 private static final String FAMILY_WIN9X = "win9x";
032
033 private static final String FAMILY_OPENVMS = "openvms";
034
035 private static final String FAMILY_UNIX = "unix";
036
037 private static final String FAMILY_TANDEM = "tandem";
038
039 private static final String FAMILY_MAC = "mac";
040
041 private static final String FAMILY_DOS = "dos";
042
043 private static final String FAMILY_NETWARE = "netware";
044
045 private static final String FAMILY_OS_2 = "os/2";
046
047 private static final String FAMILY_WINDOWS = "windows";
048
049 private static final String OS_NAME = System.getProperty("os.name")
050 .toLowerCase(Locale.US);
051
052 private static final String OS_ARCH = System.getProperty("os.arch")
053 .toLowerCase(Locale.US);
054
055 private static final String OS_VERSION = System.getProperty("os.version")
056 .toLowerCase(Locale.US);
057
058 private static final String PATH_SEP = System.getProperty("path.separator");
059
060 /**
061 * Default constructor
062 */
063 private OS() {
064 }
065
066 /**
067 * Determines if the OS on which Ant is executing matches the given OS
068 * family. * Possible values:<br />
069 * <ul>
070 * <li>dos</li>
071 * <li>mac</li>
072 * <li>netware</li>
073 * <li>os/2</li>
074 * <li>tandem</li>
075 * <li>unix</li>
076 * <li>windows</li>
077 * <li>win9x</li>
078 * <li>z/os</li>
079 * <li>os/400</li>
080 * </ul>
081 *
082 * @param family
083 * the family to check for
084 * @return true if the OS matches
085 */
086 private static boolean isFamily(final String family) {
087 return isOs(family, null, null, null);
088 }
089
090 public static boolean isFamilyDOS() {
091 return isFamily(FAMILY_DOS);
092 }
093
094 public static boolean isFamilyMac() {
095 return isFamily(FAMILY_MAC);
096 }
097
098 public static boolean isFamilyNetware() {
099 return isFamily(FAMILY_NETWARE);
100 }
101
102 public static boolean isFamilyOS2() {
103 return isFamily(FAMILY_OS_2);
104 }
105
106 public static boolean isFamilyTandem() {
107 return isFamily(FAMILY_TANDEM);
108 }
109
110 public static boolean isFamilyUnix() {
111 return isFamily(FAMILY_UNIX);
112 }
113
114 public static boolean isFamilyWindows() {
115 return isFamily(FAMILY_WINDOWS);
116 }
117
118 public static boolean isFamilyWin9x() {
119 return isFamily(FAMILY_WIN9X);
120 }
121
122 public static boolean isFamilyZOS() {
123 return isFamily(FAMILY_Z_OS);
124 }
125
126 public static boolean isFamilyOS400() {
127 return isFamily(FAMILY_OS_400);
128 }
129
130 public static boolean isFamilyOpenVms() {
131 return isFamily(FAMILY_OPENVMS);
132 }
133
134 /**
135 * Determines if the OS on which Ant is executing matches the given OS name.
136 *
137 * @param name
138 * the OS name to check for
139 * @return true if the OS matches
140 */
141 public static boolean isName(final String name) {
142 return isOs(null, name, null, null);
143 }
144
145 /**
146 * Determines if the OS on which Ant is executing matches the given OS
147 * architecture.
148 *
149 * @param arch
150 * the OS architecture to check for
151 * @return true if the OS matches
152 */
153 public static boolean isArch(final String arch) {
154 return isOs(null, null, arch, null);
155 }
156
157 /**
158 * Determines if the OS on which Ant is executing matches the given OS
159 * version.
160 *
161 * @param version
162 * the OS version to check for
163 * @return true if the OS matches
164 */
165 public static boolean isVersion(final String version) {
166 return isOs(null, null, null, version);
167 }
168
169 /**
170 * Determines if the OS on which Ant is executing matches the given OS
171 * family, name, architecture and version
172 *
173 * @param family
174 * The OS family
175 * @param name
176 * The OS name
177 * @param arch
178 * The OS architecture
179 * @param version
180 * The OS version
181 * @return true if the OS matches
182 */
183 public static boolean isOs(final String family, final String name,
184 final String arch, final String version) {
185 boolean retValue = false;
186
187 if (family != null || name != null || arch != null || version != null) {
188
189 boolean isFamily = true;
190 boolean isName = true;
191 boolean isArch = true;
192 boolean isVersion = true;
193
194 if (family != null) {
195 if (family.equals(FAMILY_WINDOWS)) {
196 isFamily = OS_NAME.indexOf(FAMILY_WINDOWS) > -1;
197 } else if (family.equals(FAMILY_OS_2)) {
198 isFamily = OS_NAME.indexOf(FAMILY_OS_2) > -1;
199 } else if (family.equals(FAMILY_NETWARE)) {
200 isFamily = OS_NAME.indexOf(FAMILY_NETWARE) > -1;
201 } else if (family.equals(FAMILY_DOS)) {
202 isFamily = PATH_SEP.equals(";")
203 && !isFamily(FAMILY_NETWARE);
204 } else if (family.equals(FAMILY_MAC)) {
205 isFamily = OS_NAME.indexOf(FAMILY_MAC) > -1;
206 } else if (family.equals(FAMILY_TANDEM)) {
207 isFamily = OS_NAME.indexOf("nonstop_kernel") > -1;
208 } else if (family.equals(FAMILY_UNIX)) {
209 isFamily = PATH_SEP.equals(":")
210 && !isFamily(FAMILY_OPENVMS)
211 && (!isFamily(FAMILY_MAC) || OS_NAME.endsWith("x"));
212 } else if (family.equals(FAMILY_WIN9X)) {
213 isFamily = isFamily(FAMILY_WINDOWS)
214 && (OS_NAME.indexOf("95") >= 0
215 || OS_NAME.indexOf("98") >= 0
216 || OS_NAME.indexOf("me") >= 0 || OS_NAME
217 .indexOf("ce") >= 0);
218 } else if (family.equals(FAMILY_Z_OS)) {
219 isFamily = OS_NAME.indexOf(FAMILY_Z_OS) > -1
220 || OS_NAME.indexOf("os/390") > -1;
221 } else if (family.equals(FAMILY_OS_400)) {
222 isFamily = OS_NAME.indexOf(FAMILY_OS_400) > -1;
223 } else if (family.equals(FAMILY_OPENVMS)) {
224 isFamily = OS_NAME.indexOf(FAMILY_OPENVMS) > -1;
225 } else {
226 throw new IllegalArgumentException(
227 "Don\'t know how to detect os family \"" + family
228 + "\"");
229 }
230 }
231 if (name != null) {
232 isName = name.equals(OS_NAME);
233 }
234 if (arch != null) {
235 isArch = arch.equals(OS_ARCH);
236 }
237 if (version != null) {
238 isVersion = version.equals(OS_VERSION);
239 }
240 retValue = isFamily && isName && isArch && isVersion;
241 }
242 return retValue;
243 }
244 }