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