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