1 package org.apache.maven.shared.utils;
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22 import java.util.Collections;
23 import java.util.HashSet;
24 import java.util.Locale;
25 import java.util.Set;
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44 public class Os
45 {
46
47
48
49 public static final String OS_NAME = System.getProperty( "os.name" ).toLowerCase( Locale.ENGLISH );
50
51
52
53
54 public static final String OS_ARCH = System.getProperty( "os.arch" ).toLowerCase( Locale.ENGLISH );
55
56
57
58
59 public static final String OS_VERSION = System.getProperty( "os.version" ).toLowerCase( Locale.ENGLISH );
60
61
62
63
64 public static final String PATH_SEP = System.getProperty( "path.separator" );
65
66
67
68
69 public static final String LINE_SEP = System.getProperty( "line.separator" );
70
71
72
73
74 public static final String OS_FAMILY = getOsFamily();
75
76
77 private static final Set<String> VALID_FAMILIES = getValidFamilies();
78
79
80
81
82
83 private String family;
84
85
86
87
88 public static final String FAMILY_WINDOWS = "windows";
89
90
91
92
93 public static final String FAMILY_WIN9X = "win9x";
94
95
96
97
98 public static final String FAMILY_NT = "winnt";
99
100
101
102
103 public static final String FAMILY_OS2 = "os/2";
104
105
106
107
108 public static final String FAMILY_NETWARE = "netware";
109
110
111
112
113 public static final String FAMILY_DOS = "dos";
114
115
116
117
118 public static final String FAMILY_MAC = "mac";
119
120
121
122
123 public static final String FAMILY_TANDEM = "tandem";
124
125
126
127
128 public static final String FAMILY_UNIX = "unix";
129
130
131
132
133 public static final String FAMILY_OPENVMS = "openvms";
134
135
136
137
138 public static final String FAMILY_ZOS = "z/os";
139
140
141
142
143 public static final String FAMILY_OS400 = "os/400";
144
145
146
147
148
149
150
151 private static final String DARWIN = "darwin";
152
153
154
155
156
157
158
159 public static Set<String> getValidFamilies()
160 {
161 if ( VALID_FAMILIES != null )
162 {
163 return VALID_FAMILIES;
164 }
165
166 Set<String> valid = new HashSet<String>();
167 valid.add( FAMILY_DOS );
168 valid.add( FAMILY_MAC );
169 valid.add( FAMILY_NETWARE );
170 valid.add( FAMILY_NT );
171 valid.add( FAMILY_OPENVMS );
172 valid.add( FAMILY_OS2 );
173 valid.add( FAMILY_OS400 );
174 valid.add( FAMILY_TANDEM );
175 valid.add( FAMILY_UNIX );
176 valid.add( FAMILY_WIN9X );
177 valid.add( FAMILY_WINDOWS );
178 valid.add( FAMILY_ZOS );
179
180 return Collections.unmodifiableSet( valid );
181 }
182
183
184
185
186 public Os()
187 {
188
189 }
190
191
192
193
194
195
196 public Os( String family )
197 {
198 setFamily( family );
199 }
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219 private void setFamily( String f )
220 {
221 family = f.toLowerCase( Locale.ENGLISH );
222 }
223
224
225
226
227
228
229
230
231 boolean eval()
232 {
233 return isOs( family, null, null, null );
234 }
235
236
237
238
239
240
241
242
243
244 public static boolean isFamily( String family )
245 {
246 return isOs( family, null, null, null );
247 }
248
249
250
251
252
253
254
255
256
257 public static boolean isName( String name )
258 {
259 return isOs( null, name, null, null );
260 }
261
262
263
264
265
266
267
268
269
270 public static boolean isArch( String arch )
271 {
272 return isOs( null, null, arch, null );
273 }
274
275
276
277
278
279
280
281
282
283 public static boolean isVersion( String version )
284 {
285 return isOs( null, null, null, version );
286 }
287
288
289
290
291
292
293
294
295
296
297
298
299 private static boolean isOs( String family, String name, String arch, String version )
300 {
301 boolean retValue = false;
302
303 if ( family != null || name != null || arch != null || version != null )
304 {
305
306 boolean isFamily = true;
307 boolean isName = true;
308 boolean isArch = true;
309 boolean isVersion = true;
310
311 if ( family != null )
312 {
313
314
315
316 boolean isWindows = OS_NAME.contains( FAMILY_WINDOWS );
317 boolean is9x = false;
318 boolean isNT = false;
319 if ( isWindows )
320 {
321
322 is9x =
323 ( OS_NAME.contains( "95" ) || OS_NAME.contains( "98" ) || OS_NAME.contains( "me" )
324
325
326 || OS_NAME.contains( "ce" ) );
327 isNT = !is9x;
328 }
329 if ( family.equals( FAMILY_WINDOWS ) )
330 {
331 isFamily = isWindows;
332 }
333 else if ( family.equals( FAMILY_WIN9X ) )
334 {
335 isFamily = isWindows && is9x;
336 }
337 else if ( family.equals( FAMILY_NT ) )
338 {
339 isFamily = isWindows && isNT;
340 }
341 else if ( family.equals( FAMILY_OS2 ) )
342 {
343 isFamily = OS_NAME.contains( FAMILY_OS2 );
344 }
345 else if ( family.equals( FAMILY_NETWARE ) )
346 {
347 isFamily = OS_NAME.contains( FAMILY_NETWARE );
348 }
349 else if ( family.equals( FAMILY_DOS ) )
350 {
351 isFamily = PATH_SEP.equals( ";" ) && !isFamily( FAMILY_NETWARE );
352 }
353 else if ( family.equals( FAMILY_MAC ) )
354 {
355 isFamily = OS_NAME.contains( FAMILY_MAC ) || OS_NAME.contains( DARWIN );
356 }
357 else if ( family.equals( FAMILY_TANDEM ) )
358 {
359 isFamily = OS_NAME.contains( "nonstop_kernel" );
360 }
361 else if ( family.equals( FAMILY_UNIX ) )
362 {
363 isFamily = PATH_SEP.equals( ":" ) && !isFamily( FAMILY_OPENVMS ) && ( !isFamily( FAMILY_MAC )
364 || OS_NAME.endsWith( "x" ) || OS_NAME.contains( DARWIN ) );
365 }
366 else if ( family.equals( FAMILY_ZOS ) )
367 {
368 isFamily = OS_NAME.contains( FAMILY_ZOS ) || OS_NAME.contains( "os/390" );
369 }
370 else if ( family.equals( FAMILY_OS400 ) )
371 {
372 isFamily = OS_NAME.contains( FAMILY_OS400 );
373 }
374 else if ( family.equals( FAMILY_OPENVMS ) )
375 {
376 isFamily = OS_NAME.contains( FAMILY_OPENVMS );
377 }
378 else
379 {
380 isFamily = OS_NAME.contains( family.toLowerCase( Locale.US ) );
381 }
382 }
383 if ( name != null )
384 {
385 isName = name.equals( OS_NAME );
386 }
387 if ( arch != null )
388 {
389 isArch = arch.equals( OS_ARCH );
390 }
391 if ( version != null )
392 {
393 isVersion = version.equals( OS_VERSION );
394 }
395 retValue = isFamily && isName && isArch && isVersion;
396 }
397 return retValue;
398 }
399
400
401
402
403
404
405 private static String getOsFamily()
406 {
407 Set<String> families = getValidFamilies();
408
409 for ( String fam : families )
410 {
411 if ( Os.isFamily( fam ) )
412 {
413 return fam;
414 }
415 }
416 return null;
417 }
418
419
420
421
422
423
424
425 public static boolean isValidFamily( String family )
426 {
427 return VALID_FAMILIES.contains( family );
428 }
429
430 }