Added: incubator/directory/asn1/branches/rewrite/ber/src/java/org/apache/asn1/util/StopWatch.java URL: http://svn.apache.org/viewcvs/incubator/directory/asn1/branches/rewrite/ber/src/java/org/apache/asn1/util/StopWatch.java?view=auto&rev=151131 ============================================================================== --- incubator/directory/asn1/branches/rewrite/ber/src/java/org/apache/asn1/util/StopWatch.java (added) +++ incubator/directory/asn1/branches/rewrite/ber/src/java/org/apache/asn1/util/StopWatch.java Wed Feb 2 23:18:42 2005 @@ -0,0 +1,237 @@ +/* + * Copyright 2002-2004 The Apache Software Foundation. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.asn1.util; + +/** + * <p><code>StopWatch</code> provides a convenient API for timings.</p> + * + * <p>The methods do <b>not</b> protect against inappropriate calls. Thus you + * can call stop before start, resume before suspend or unsplit before split. + * The results are indeterminate in these cases.</p> + * + * <p>To start the watch, call [EMAIL PROTECTED] #start()}. At this point you can:</p> + * <ul> + * <li>[EMAIL PROTECTED] #split()} the watch to get the time whilst the watch continues in the + * background. [EMAIL PROTECTED] #unsplit()} will remove the effect of the split. At this point, + * these three options are available again.</li> + * <li>[EMAIL PROTECTED] #suspend()} the watch to pause it. [EMAIL PROTECTED] #resume()} allows the watch + * to continue. Any time between the suspend and resume will not be counted in + * the total. At this point, these three options are available again.</li> + * <li>[EMAIL PROTECTED] #stop()} the watch to complete the timing session.</li> + * </ul> + * + * <p>It is intended that the output methods [EMAIL PROTECTED] #toString()} and [EMAIL PROTECTED] #getTime()} + * should only be called after stop, split or suspend, however a suitable result will + * be returned at other points.</p> + +1. split(), suspend(), or stop() cannot be invoked twice. +2. unsplit() may only be called if the watch has been split() +3. resume() may only be called if the watch has been suspend() +4. start() cannot be called twice. + + * + * @author Henri Yandell + * @author Stephen Colebourne + * @since 2.0 + * @version $Id: StopWatch.java,v 1.11 2004/10/15 23:11:31 scolebourne Exp $ + */ +public class StopWatch { + + // running states + private static final int STATE_UNSTARTED = 0; + private static final int STATE_RUNNING = 1; + private static final int STATE_STOPPED = 2; + private static final int STATE_SUSPENDED = 3; + + // split state + private static final int STATE_UNSPLIT = 10; + private static final int STATE_SPLIT = 11; + + /** + * The current running state of the StopWatch. + */ + private int runningState = STATE_UNSTARTED; + + /** + * Whether the stopwatch has a split time recorded. + */ + private int splitState = STATE_UNSPLIT; + + /** + * The start time. + */ + private long startTime = -1; + /** + * The stop time. + */ + private long stopTime = -1; + + /** + * <p>Constructor.</p> + */ + public StopWatch() { + } + + /** + * <p>Start the stopwatch.</p> + * + * <p>This method starts a new timing session, clearing any previous values.</p> + * + * @throws IllegalStateException if the StopWatch is already running. + */ + public void start() { + if(this.runningState == STATE_STOPPED) { + throw new IllegalStateException("Stopwatch must be reset before being restarted. "); + } + if(this.runningState != STATE_UNSTARTED) { + throw new IllegalStateException("Stopwatch already started. "); + } + stopTime = -1; + startTime = System.currentTimeMillis(); + this.runningState = STATE_RUNNING; + } + + /** + * <p>Stop the stopwatch.</p> + * + * <p>This method ends a new timing session, allowing the time to be retrieved.</p> + * + * @throws IllegalStateException if the StopWatch is not running. + */ + public void stop() { + if(this.runningState != STATE_RUNNING && this.runningState != STATE_SUSPENDED) { + throw new IllegalStateException("Stopwatch is not running. "); + } + stopTime = System.currentTimeMillis(); + this.runningState = STATE_STOPPED; + } + + /** + * <p>Resets the stopwatch. Stops it if need be. </p> + * + * <p>This method clears the internal values to allow the object to be reused.</p> + */ + public void reset() { + this.runningState = STATE_UNSTARTED; + this.splitState = STATE_UNSPLIT; + startTime = -1; + stopTime = -1; + } + + /** + * <p>Split the time.</p> + * + * <p>This method sets the stop time of the watch to allow a time to be extracted. + * The start time is unaffected, enabling [EMAIL PROTECTED] #unsplit()} to continue the + * timing from the original start point.</p> + * + * @throws IllegalStateException if the StopWatch is not running. + */ + public void split() { + if(this.runningState != STATE_RUNNING) { + throw new IllegalStateException("Stopwatch is not running. "); + } + stopTime = System.currentTimeMillis(); + this.splitState = STATE_SPLIT; + } + + /** + * <p>Remove a split.</p> + * + * <p>This method clears the stop time. The start time is unaffected, enabling + * timing from the original start point to continue.</p> + * + * @throws IllegalStateException if the StopWatch has not been split. + */ + public void unsplit() { + if(this.splitState != STATE_SPLIT) { + throw new IllegalStateException("Stopwatch has not been split. "); + } + stopTime = -1; + this.splitState = STATE_UNSPLIT; + } + + /** + * <p>Suspend the stopwatch for later resumption.</p> + * + * <p>This method suspends the watch until it is resumed. The watch will not include + * time between the suspend and resume calls in the total time.</p> + * + * @throws IllegalStateException if the StopWatch is not currently running. + */ + public void suspend() { + if(this.runningState != STATE_RUNNING) { + throw new IllegalStateException("Stopwatch must be running to suspend. "); + } + stopTime = System.currentTimeMillis(); + this.runningState = STATE_SUSPENDED; + } + + /** + * <p>Resume the stopwatch after a suspend.</p> + * + * <p>This method resumes the watch after it was suspended. The watch will not include + * time between the suspend and resume calls in the total time.</p> + * + * @throws IllegalStateException if the StopWatch has not been suspended. + */ + public void resume() { + if(this.runningState != STATE_SUSPENDED) { + throw new IllegalStateException("Stopwatch must be suspended to resume. "); + } + startTime += (System.currentTimeMillis() - stopTime); + stopTime = -1; + this.runningState = STATE_RUNNING; + } + + /** + * <p>Get the time on the stopwatch.</p> + * + * <p>This is either the time between the start and the moment this method + * is called, or the amount of time between start and stop.</p> + * + * @return the time in milliseconds + */ + public long getTime() { + if(this.runningState == STATE_STOPPED || this.runningState == STATE_SUSPENDED) { + return (this.stopTime - this.startTime); + } else + if(this.runningState == STATE_UNSTARTED) { + return 0; + } else + if(this.runningState == STATE_RUNNING) { + return (System.currentTimeMillis() - this.startTime); + } + throw new RuntimeException("Illegal running state has occured. "); + } + + /** + * <p>Get the split time on the stopwatch.</p> + * + * <p>This is the time between start and latest split. </p> + * + * @return the split time in milliseconds + * + * @throws IllegalStateException if the StopWatch has not yet been split. + * @since 2.1 + */ + public long getSplitTime() { + if(this.splitState != STATE_SPLIT) { + throw new IllegalStateException("Stopwatch must be split to get the split time. "); + } + return (this.stopTime - this.startTime); + } +}
Added: incubator/directory/asn1/branches/rewrite/ber/src/java/org/apache/asn1/util/StringUtils.java URL: http://svn.apache.org/viewcvs/incubator/directory/asn1/branches/rewrite/ber/src/java/org/apache/asn1/util/StringUtils.java?view=auto&rev=151131 ============================================================================== --- incubator/directory/asn1/branches/rewrite/ber/src/java/org/apache/asn1/util/StringUtils.java (added) +++ incubator/directory/asn1/branches/rewrite/ber/src/java/org/apache/asn1/util/StringUtils.java Wed Feb 2 23:18:42 2005 @@ -0,0 +1,175 @@ +/* + * Copyright 2004 The Apache Software Foundation + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ +package org.apache.asn1.util; + + +/** + * A minimum of StringUtils we need - as we use more we'll add more. + * + * @author <a href="mailto:[EMAIL PROTECTED]">Apache Directory Project</a> + * @version $Rev$ + */ +public class StringUtils +{ + /** + * The empty String <code>""</code>. + */ + public static final String EMPTY = ""; + + /** + * <p>An array of <code>String</code>s used for padding.</p> + * <p/> + * <p>Used for efficient space padding. The length of each String expands as + * needed.</p> + */ + private static final String[] PADDING = new String[Character.MAX_VALUE]; + + /** + * <p>The maximum size to which the padding constant(s) can expand.</p> + */ + private static final int PAD_LIMIT = 8192; + + + static + { + // space padding is most common, start with 64 chars + PADDING[32] = " "; + } + + + /** + * <p>Repeat a String <code>repeat</code> times to form a new String.</p> + * <p/> + * <pre> + * StringUtils.repeat(null, 2) = null + * StringUtils.repeat("", 0) = "" + * StringUtils.repeat("", 2) = "" + * StringUtils.repeat("a", 3) = "aaa" + * StringUtils.repeat("ab", 2) = "abab" + * StringUtils.repeat("a", -2) = "" + * </pre> + * + * @param str the String to repeat, may be null + * @param repeat number of times to repeat str, negative treated as zero + * @return a new String consisting of the original String repeated, + * <code>null</code> if null String input + */ + public static String repeat( String str, int repeat ) + { + // Performance tuned for 2.0 (JDK1.4) + + if ( str == null ) + { + return null; + } + + if ( repeat <= 0 ) + { + return EMPTY; + } + + int inputLength = str.length(); + + if ( repeat == 1 || inputLength == 0 ) + { + return str; + } + if ( inputLength == 1 && repeat <= PAD_LIMIT ) + { + return padding( repeat, str.charAt( 0 ) ); + } + + int outputLength = inputLength * repeat; + + switch ( inputLength ) + { + case 1: + char ch = str.charAt( 0 ); + + char[] output1 = new char[outputLength]; + + for ( int i = repeat - 1; i >= 0; i-- ) + { + output1[i] = ch; + } + + return new String( output1 ); + + case 2: + char ch0 = str.charAt( 0 ); + + char ch1 = str.charAt( 1 ); + + char[] output2 = new char[outputLength]; + + for ( int i = repeat * 2 - 2; i >= 0; i--, i-- ) + { + output2[i] = ch0; + + output2[i + 1] = ch1; + } + + return new String( output2 ); + + default : + StringBuffer buf = new StringBuffer( outputLength ); + + for ( int i = 0; i < repeat; i++ ) + { + buf.append( str ); + } + + return buf.toString(); + } + } + + + /** + * <p>Returns padding using the specified delimiter repeated to a given + * length.</p> + * <p/> + * <pre> + * StringUtils.padding(0, 'e') = "" + * StringUtils.padding(3, 'e') = "eee" + * StringUtils.padding(-2, 'e') = IndexOutOfBoundsException + * </pre> + * + * @param repeat number of times to repeat delim + * @param padChar character to repeat + * @return String with repeated character + * @throws IndexOutOfBoundsException if <code>repeat < 0</code> + */ + private static String padding( int repeat, char padChar ) + { + // be careful of synchronization in this method + // we are assuming that get and set from an array index is atomic + String pad = PADDING[padChar]; + + if ( pad == null ) + { + pad = String.valueOf( padChar ); + } + while ( pad.length() < repeat ) + { + pad = pad.concat( pad ); + } + + PADDING[padChar] = pad; + + return pad.substring( 0, repeat ); + } +} Added: incubator/directory/asn1/branches/rewrite/ber/src/java/org/apache/asn1/util/SystemUtils.java URL: http://svn.apache.org/viewcvs/incubator/directory/asn1/branches/rewrite/ber/src/java/org/apache/asn1/util/SystemUtils.java?view=auto&rev=151131 ============================================================================== --- incubator/directory/asn1/branches/rewrite/ber/src/java/org/apache/asn1/util/SystemUtils.java (added) +++ incubator/directory/asn1/branches/rewrite/ber/src/java/org/apache/asn1/util/SystemUtils.java Wed Feb 2 23:18:42 2005 @@ -0,0 +1,1326 @@ +/* + * Copyright 2002-2004 The Apache Software Foundation. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.asn1.util; + + +import java.io.File; + + +/** + * <p>Helpers for <code>java.lang.System</code>.</p> + * <p/> + * <p>If a system property cannot be read due to security restrictions, the + * corresponding field in this class will be set to <code>null</code> and a + * message will be written to <code>System.err</code>.</p> + * + * @author Based on code from Avalon Excalibur + * @author Based on code from Lucene + * @author Stephen Colebourne + * @author <a href="mailto:[EMAIL PROTECTED]">Steve Downey</a> + * @author Gary Gregory + * @author Michael Becke + * @author Tetsuya Kaneuchi + * @author Rafal Krupinski + * @version $Id: SystemUtils.java,v 1.35 2004/08/30 21:21:18 ggregory Exp $ + * @since 1.0 + */ +public class SystemUtils +{ + + /** + * The prefix String for all Windows OS. + */ + private static final String OS_NAME_WINDOWS_PREFIX = "Windows"; + + // System property constants + //----------------------------------------------------------------------- + // These MUST be declared first. Other constants depend on this. + + /** + * The System property key for the user home directory. + */ + private static final String USER_HOME_KEY = "user.home"; + + /** + * The System property key for the user directory. + */ + private static final String USER_DIR_KEY = "user.dir"; + + /** + * The System property key for the Java IO temporary directory. + */ + private static final String JAVA_IO_TMPDIR_KEY = "java.io.tmpdir"; + + /** + * The System property key for the Java home directory. + */ + private static final String JAVA_HOME_KEY = "java.home"; + + /** + * <p>The <code>awt.toolkit</code> System Property.</p> <p>Holds a class + * name, on Windows XP this is <code>sun.awt.windows.WToolkit</code>.</p> + * <p><b>On platforms without a GUI, this value is <code>null</code>.</b></p> + * <p/> + * <p>Defaults to <code>null</code> if the runtime does not have security + * access to read this property or the property does not exist.</p> + * <p/> + * <p/> + * This value is initialized when the class is loaded. If [EMAIL PROTECTED] + * System#setProperty(String,String)} or [EMAIL PROTECTED] System#setProperties(java.util.Properties)} + * is called after this class is loaded, the value will be out of sync with + * that System property. </p> + * + * @since 2.1 + */ + public static final String AWT_TOOLKIT = getSystemProperty( "awt.toolkit" ); + + /** + * <p>The <code>file.encoding</code> System Property.</p> <p>File encoding, + * such as <code>Cp1252</code>.</p> + * <p/> + * <p>Defaults to <code>null</code> if the runtime does not have security + * access to read this property or the property does not exist.</p> + * <p/> + * <p/> + * This value is initialized when the class is loaded. If [EMAIL PROTECTED] + * System#setProperty(String,String)} or [EMAIL PROTECTED] System#setProperties(java.util.Properties)} + * is called after this class is loaded, the value will be out of sync with + * that System property. </p> + * + * @since Java 1.2 + */ + public static final String FILE_ENCODING = getSystemProperty( "file.encoding" ); + + /** + * <p>The <code>file.separator</code> System Property. File separator + * (<code>"/"</code> on UNIX).</p> + * <p/> + * <p>Defaults to <code>null</code> if the runtime does not have security + * access to read this property or the property does not exist.</p> + * <p/> + * <p/> + * This value is initialized when the class is loaded. If [EMAIL PROTECTED] + * System#setProperty(String,String)} or [EMAIL PROTECTED] System#setProperties(java.util.Properties)} + * is called after this class is loaded, the value will be out of sync with + * that System property. </p> + * + * @since Java 1.1 + */ + public static final String FILE_SEPARATOR = getSystemProperty( "file.separator" ); + + /** + * <p>The <code>java.awt.fonts</code> System Property.</p> + * <p/> + * <p>Defaults to <code>null</code> if the runtime does not have security + * access to read this property or the property does not exist.</p> + * <p/> + * <p/> + * This value is initialized when the class is loaded. If [EMAIL PROTECTED] + * System#setProperty(String,String)} or [EMAIL PROTECTED] System#setProperties(java.util.Properties)} + * is called after this class is loaded, the value will be out of sync with + * that System property. </p> + * + * @since 2.1 + */ + public static final String JAVA_AWT_FONTS = getSystemProperty( "java.awt.fonts" ); + + /** + * <p>The <code>java.awt.graphicsenv</code> System Property.</p> + * <p/> + * <p>Defaults to <code>null</code> if the runtime does not have security + * access to read this property or the property does not exist.</p> + * <p/> + * <p/> + * This value is initialized when the class is loaded. If [EMAIL PROTECTED] + * System#setProperty(String,String)} or [EMAIL PROTECTED] System#setProperties(java.util.Properties)} + * is called after this class is loaded, the value will be out of sync with + * that System property. </p> + * + * @since 2.1 + */ + public static final String JAVA_AWT_GRAPHICSENV = getSystemProperty( "java.awt.graphicsenv" ); + + /** + * <p/> + * The <code>java.awt.headless</code> System Property. The value of this + * property is the String <code>"true"</code> or <code>"false"</code>. </p> + * <p/> + * <p>Defaults to <code>null</code> if the runtime does not have security + * access to read this property or the property does not exist.</p> + * <p/> + * <p/> + * This value is initialized when the class is loaded. If [EMAIL PROTECTED] + * System#setProperty(String,String)} or [EMAIL PROTECTED] System#setProperties(java.util.Properties)} + * is called after this class is loaded, the value will be out of sync with + * that System property. </p> + * + * @see #isJavaAwtHeadless() + * @since Java 1.4 + */ + public static final String JAVA_AWT_HEADLESS = getSystemProperty( "java.awt.headless" ); + + /** + * <p>The <code>java.awt.printerjob</code> System Property.</p> + * <p/> + * <p>Defaults to <code>null</code> if the runtime does not have security + * access to read this property or the property does not exist.</p> + * <p/> + * <p/> + * This value is initialized when the class is loaded. If [EMAIL PROTECTED] + * System#setProperty(String,String)} or [EMAIL PROTECTED] System#setProperties(java.util.Properties)} + * is called after this class is loaded, the value will be out of sync with + * that System property. </p> + * + * @since 2.1 + */ + public static final String JAVA_AWT_PRINTERJOB = getSystemProperty( "java.awt.printerjob" ); + + /** + * <p>The <code>java.class.path</code> System Property. Java class + * path.</p> + * <p/> + * <p>Defaults to <code>null</code> if the runtime does not have security + * access to read this property or the property does not exist.</p> + * <p/> + * <p/> + * This value is initialized when the class is loaded. If [EMAIL PROTECTED] + * System#setProperty(String,String)} or [EMAIL PROTECTED] System#setProperties(java.util.Properties)} + * is called after this class is loaded, the value will be out of sync with + * that System property. </p> + * + * @since Java 1.1 + */ + public static final String JAVA_CLASS_PATH = getSystemProperty( "java.class.path" ); + + /** + * <p>The <code>java.class.version</code> System Property. Java class format + * version number.</p> + * <p/> + * <p>Defaults to <code>null</code> if the runtime does not have security + * access to read this property or the property does not exist.</p> + * <p/> + * <p/> + * This value is initialized when the class is loaded. If [EMAIL PROTECTED] + * System#setProperty(String,String)} or [EMAIL PROTECTED] System#setProperties(java.util.Properties)} + * is called after this class is loaded, the value will be out of sync with + * that System property. </p> + * + * @since Java 1.1 + */ + public static final String JAVA_CLASS_VERSION = getSystemProperty( "java.class.version" ); + + /** + * <p>The <code>java.compiler</code> System Property. Name of JIT compiler + * to use. First in JDK version 1.2. Not used in Sun JDKs after 1.2.</p> + * <p/> + * <p>Defaults to <code>null</code> if the runtime does not have security + * access to read this property or the property does not exist.</p> + * <p/> + * <p/> + * This value is initialized when the class is loaded. If [EMAIL PROTECTED] + * System#setProperty(String,String)} or [EMAIL PROTECTED] System#setProperties(java.util.Properties)} + * is called after this class is loaded, the value will be out of sync with + * that System property. </p> + * + * @since Java 1.2. Not used in Sun versions after 1.2. + */ + public static final String JAVA_COMPILER = getSystemProperty( "java.compiler" ); + + /** + * <p>The <code>java.endorsed.dirs</code> System Property. Path of endorsed + * directory or directories.</p> + * <p/> + * <p>Defaults to <code>null</code> if the runtime does not have security + * access to read this property or the property does not exist.</p> + * <p/> + * <p/> + * This value is initialized when the class is loaded. If [EMAIL PROTECTED] + * System#setProperty(String,String)} or [EMAIL PROTECTED] System#setProperties(java.util.Properties)} + * is called after this class is loaded, the value will be out of sync with + * that System property. </p> + * + * @since Java 1.4 + */ + public static final String JAVA_ENDORSED_DIRS = getSystemProperty( "java.endorsed.dirs" ); + + /** + * <p>The <code>java.ext.dirs</code> System Property. Path of extension + * directory or directories.</p> + * <p/> + * <p>Defaults to <code>null</code> if the runtime does not have security + * access to read this property or the property does not exist.</p> + * <p/> + * <p/> + * This value is initialized when the class is loaded. If [EMAIL PROTECTED] + * System#setProperty(String,String)} or [EMAIL PROTECTED] System#setProperties(java.util.Properties)} + * is called after this class is loaded, the value will be out of sync with + * that System property. </p> + * + * @since Java 1.3 + */ + public static final String JAVA_EXT_DIRS = getSystemProperty( "java.ext.dirs" ); + + /** + * <p>The <code>java.home</code> System Property. Java installation + * directory.</p> + * <p/> + * <p>Defaults to <code>null</code> if the runtime does not have security + * access to read this property or the property does not exist.</p> + * <p/> + * <p/> + * This value is initialized when the class is loaded. If [EMAIL PROTECTED] + * System#setProperty(String,String)} or [EMAIL PROTECTED] System#setProperties(java.util.Properties)} + * is called after this class is loaded, the value will be out of sync with + * that System property. </p> + * + * @since Java 1.1 + */ + public static final String JAVA_HOME = getSystemProperty( JAVA_HOME_KEY ); + + /** + * <p>The <code>java.io.tmpdir</code> System Property. Default temp file + * path.</p> + * <p/> + * <p>Defaults to <code>null</code> if the runtime does not have security + * access to read this property or the property does not exist.</p> + * <p/> + * <p/> + * This value is initialized when the class is loaded. If [EMAIL PROTECTED] + * System#setProperty(String,String)} or [EMAIL PROTECTED] System#setProperties(java.util.Properties)} + * is called after this class is loaded, the value will be out of sync with + * that System property. </p> + * + * @since Java 1.2 + */ + public static final String JAVA_IO_TMPDIR = getSystemProperty( JAVA_IO_TMPDIR_KEY ); + + /** + * <p>The <code>java.library.path</code> System Property. List of paths to + * search when loading libraries.</p> + * <p/> + * <p>Defaults to <code>null</code> if the runtime does not have security + * access to read this property or the property does not exist.</p> + * <p/> + * <p/> + * This value is initialized when the class is loaded. If [EMAIL PROTECTED] + * System#setProperty(String,String)} or [EMAIL PROTECTED] System#setProperties(java.util.Properties)} + * is called after this class is loaded, the value will be out of sync with + * that System property. </p> + * + * @since Java 1.2 + */ + public static final String JAVA_LIBRARY_PATH = getSystemProperty( "java.library.path" ); + + /** + * <p>The <code>java.runtime.name</code> System Property. Java Runtime + * Environment name.</p> + * <p/> + * <p>Defaults to <code>null</code> if the runtime does not have security + * access to read this property or the property does not exist.</p> + * <p/> + * <p/> + * This value is initialized when the class is loaded. If [EMAIL PROTECTED] + * System#setProperty(String,String)} or [EMAIL PROTECTED] System#setProperties(java.util.Properties)} + * is called after this class is loaded, the value will be out of sync with + * that System property. </p> + * + * @since Java 1.3 + */ + public static final String JAVA_RUNTIME_NAME = getSystemProperty( "java.runtime.name" ); + + /** + * <p>The <code>java.runtime.version</code> System Property. Java Runtime + * Environment version.</p> + * <p/> + * <p>Defaults to <code>null</code> if the runtime does not have security + * access to read this property or the property does not exist.</p> + * <p/> + * <p/> + * This value is initialized when the class is loaded. If [EMAIL PROTECTED] + * System#setProperty(String,String)} or [EMAIL PROTECTED] System#setProperties(java.util.Properties)} + * is called after this class is loaded, the value will be out of sync with + * that System property. </p> + * + * @since Java 1.3 + */ + public static final String JAVA_RUNTIME_VERSION = getSystemProperty( "java.runtime.version" ); + + /** + * <p>The <code>java.specification.name</code> System Property. Java Runtime + * Environment specification name.</p> + * <p/> + * <p>Defaults to <code>null</code> if the runtime does not have security + * access to read this property or the property does not exist.</p> + * <p/> + * <p/> + * This value is initialized when the class is loaded. If [EMAIL PROTECTED] + * System#setProperty(String,String)} or [EMAIL PROTECTED] System#setProperties(java.util.Properties)} + * is called after this class is loaded, the value will be out of sync with + * that System property. </p> + * + * @since Java 1.2 + */ + public static final String JAVA_SPECIFICATION_NAME = getSystemProperty( "java.specification.name" ); + + /** + * <p>The <code>java.specification.vendor</code> System Property. Java + * Runtime Environment specification vendor.</p> + * <p/> + * <p>Defaults to <code>null</code> if the runtime does not have security + * access to read this property or the property does not exist.</p> + * <p/> + * <p/> + * This value is initialized when the class is loaded. If [EMAIL PROTECTED] + * System#setProperty(String,String)} or [EMAIL PROTECTED] System#setProperties(java.util.Properties)} + * is called after this class is loaded, the value will be out of sync with + * that System property. </p> + * + * @since Java 1.2 + */ + public static final String JAVA_SPECIFICATION_VENDOR = getSystemProperty( "java.specification.vendor" ); + + /** + * <p>The <code>java.specification.version</code> System Property. Java + * Runtime Environment specification version.</p> + * <p/> + * <p>Defaults to <code>null</code> if the runtime does not have security + * access to read this property or the property does not exist.</p> + * <p/> + * <p/> + * This value is initialized when the class is loaded. If [EMAIL PROTECTED] + * System#setProperty(String,String)} or [EMAIL PROTECTED] System#setProperties(java.util.Properties)} + * is called after this class is loaded, the value will be out of sync with + * that System property. </p> + * + * @since Java 1.3 + */ + public static final String JAVA_SPECIFICATION_VERSION = getSystemProperty( "java.specification.version" ); + + /** + * <p>The <code>java.util.prefs.PreferencesFactory</code> System Property. A + * class name.</p> + * <p/> + * <p>Defaults to <code>null</code> if the runtime does not have security + * access to read this property or the property does not exist.</p> + * <p/> + * <p/> + * This value is initialized when the class is loaded. If [EMAIL PROTECTED] + * System#setProperty(String,String)} or [EMAIL PROTECTED] System#setProperties(java.util.Properties)} + * is called after this class is loaded, the value will be out of sync with + * that System property. </p> + * + * @since Java 1.4 + */ + public static final String JAVA_UTIL_PREFS_PREFERENCES_FACTORY = getSystemProperty( "java.util.prefs.PreferencesFactory" ); + + /** + * <p>The <code>java.vendor</code> System Property. Java vendor-specific + * string.</p> + * <p/> + * <p>Defaults to <code>null</code> if the runtime does not have security + * access to read this property or the property does not exist.</p> + * <p/> + * <p/> + * This value is initialized when the class is loaded. If [EMAIL PROTECTED] + * System#setProperty(String,String)} or [EMAIL PROTECTED] System#setProperties(java.util.Properties)} + * is called after this class is loaded, the value will be out of sync with + * that System property. </p> + * + * @since Java 1.1 + */ + public static final String JAVA_VENDOR = getSystemProperty( "java.vendor" ); + + /** + * <p>The <code>java.vendor.url</code> System Property. Java vendor + * URL.</p> + * <p/> + * <p>Defaults to <code>null</code> if the runtime does not have security + * access to read this property or the property does not exist.</p> + * <p/> + * <p/> + * This value is initialized when the class is loaded. If [EMAIL PROTECTED] + * System#setProperty(String,String)} or [EMAIL PROTECTED] System#setProperties(java.util.Properties)} + * is called after this class is loaded, the value will be out of sync with + * that System property. </p> + * + * @since Java 1.1 + */ + public static final String JAVA_VENDOR_URL = getSystemProperty( "java.vendor.url" ); + + /** + * <p>The <code>java.version</code> System Property. Java version + * number.</p> + * <p/> + * <p>Defaults to <code>null</code> if the runtime does not have security + * access to read this property or the property does not exist.</p> + * <p/> + * <p/> + * This value is initialized when the class is loaded. If [EMAIL PROTECTED] + * System#setProperty(String,String)} or [EMAIL PROTECTED] System#setProperties(java.util.Properties)} + * is called after this class is loaded, the value will be out of sync with + * that System property. </p> + * + * @since Java 1.1 + */ + public static final String JAVA_VERSION = getSystemProperty( "java.version" ); + + /** + * <p>The <code>java.vm.info</code> System Property. Java Virtual Machine + * implementation info.</p> + * <p/> + * <p>Defaults to <code>null</code> if the runtime does not have security + * access to read this property or the property does not exist.</p> + * <p/> + * <p/> + * This value is initialized when the class is loaded. If [EMAIL PROTECTED] + * System#setProperty(String,String)} or [EMAIL PROTECTED] System#setProperties(java.util.Properties)} + * is called after this class is loaded, the value will be out of sync with + * that System property. </p> + * + * @since Java 1.2 + */ + public static final String JAVA_VM_INFO = getSystemProperty( "java.vm.info" ); + + /** + * <p>The <code>java.vm.name</code> System Property. Java Virtual Machine + * implementation name.</p> + * <p/> + * <p>Defaults to <code>null</code> if the runtime does not have security + * access to read this property or the property does not exist.</p> + * <p/> + * <p/> + * This value is initialized when the class is loaded. If [EMAIL PROTECTED] + * System#setProperty(String,String)} or [EMAIL PROTECTED] System#setProperties(java.util.Properties)} + * is called after this class is loaded, the value will be out of sync with + * that System property. </p> + * + * @since Java 1.2 + */ + public static final String JAVA_VM_NAME = getSystemProperty( "java.vm.name" ); + + /** + * <p>The <code>java.vm.specification.name</code> System Property. Java + * Virtual Machine specification name.</p> + * <p/> + * <p>Defaults to <code>null</code> if the runtime does not have security + * access to read this property or the property does not exist.</p> + * <p/> + * <p/> + * This value is initialized when the class is loaded. If [EMAIL PROTECTED] + * System#setProperty(String,String)} or [EMAIL PROTECTED] System#setProperties(java.util.Properties)} + * is called after this class is loaded, the value will be out of sync with + * that System property. </p> + * + * @since Java 1.2 + */ + public static final String JAVA_VM_SPECIFICATION_NAME = getSystemProperty( "java.vm.specification.name" ); + + /** + * <p>The <code>java.vm.specification.vendor</code> System Property. Java + * Virtual Machine specification vendor.</p> + * <p/> + * <p>Defaults to <code>null</code> if the runtime does not have security + * access to read this property or the property does not exist.</p> + * <p/> + * <p/> + * This value is initialized when the class is loaded. If [EMAIL PROTECTED] + * System#setProperty(String,String)} or [EMAIL PROTECTED] System#setProperties(java.util.Properties)} + * is called after this class is loaded, the value will be out of sync with + * that System property. </p> + * + * @since Java 1.2 + */ + public static final String JAVA_VM_SPECIFICATION_VENDOR = getSystemProperty( "java.vm.specification.vendor" ); + + /** + * <p>The <code>java.vm.specification.version</code> System Property. Java + * Virtual Machine specification version.</p> + * <p/> + * <p>Defaults to <code>null</code> if the runtime does not have security + * access to read this property or the property does not exist.</p> + * <p/> + * <p/> + * This value is initialized when the class is loaded. If [EMAIL PROTECTED] + * System#setProperty(String,String)} or [EMAIL PROTECTED] System#setProperties(java.util.Properties)} + * is called after this class is loaded, the value will be out of sync with + * that System property. </p> + * + * @since Java 1.2 + */ + public static final String JAVA_VM_SPECIFICATION_VERSION = getSystemProperty( "java.vm.specification.version" ); + + /** + * <p>The <code>java.vm.vendor</code> System Property. Java Virtual Machine + * implementation vendor.</p> + * <p/> + * <p>Defaults to <code>null</code> if the runtime does not have security + * access to read this property or the property does not exist.</p> + * <p/> + * <p/> + * This value is initialized when the class is loaded. If [EMAIL PROTECTED] + * System#setProperty(String,String)} or [EMAIL PROTECTED] System#setProperties(java.util.Properties)} + * is called after this class is loaded, the value will be out of sync with + * that System property. </p> + * + * @since Java 1.2 + */ + public static final String JAVA_VM_VENDOR = getSystemProperty( "java.vm.vendor" ); + + /** + * <p>The <code>java.vm.version</code> System Property. Java Virtual Machine + * implementation version.</p> + * <p/> + * <p>Defaults to <code>null</code> if the runtime does not have security + * access to read this property or the property does not exist.</p> + * <p/> + * <p/> + * This value is initialized when the class is loaded. If [EMAIL PROTECTED] + * System#setProperty(String,String)} or [EMAIL PROTECTED] System#setProperties(java.util.Properties)} + * is called after this class is loaded, the value will be out of sync with + * that System property. </p> + * + * @since Java 1.2 + */ + public static final String JAVA_VM_VERSION = getSystemProperty( "java.vm.version" ); + + /** + * <p>The <code>line.separator</code> System Property. Line separator + * (<code>"\n<"</code> on UNIX).</p> + * <p/> + * <p>Defaults to <code>null</code> if the runtime does not have security + * access to read this property or the property does not exist.</p> + * <p/> + * <p/> + * This value is initialized when the class is loaded. If [EMAIL PROTECTED] + * System#setProperty(String,String)} or [EMAIL PROTECTED] System#setProperties(java.util.Properties)} + * is called after this class is loaded, the value will be out of sync with + * that System property. </p> + * + * @since Java 1.1 + */ + public static final String LINE_SEPARATOR = getSystemProperty( "line.separator" ); + + /** + * <p>The <code>os.arch</code> System Property. Operating system + * architecture.</p> + * <p/> + * <p>Defaults to <code>null</code> if the runtime does not have security + * access to read this property or the property does not exist.</p> + * <p/> + * <p/> + * This value is initialized when the class is loaded. If [EMAIL PROTECTED] + * System#setProperty(String,String)} or [EMAIL PROTECTED] System#setProperties(java.util.Properties)} + * is called after this class is loaded, the value will be out of sync with + * that System property. </p> + * + * @since Java 1.1 + */ + public static final String OS_ARCH = getSystemProperty( "os.arch" ); + + /** + * <p>The <code>os.name</code> System Property. Operating system name.</p> + * <p/> + * <p>Defaults to <code>null</code> if the runtime does not have security + * access to read this property or the property does not exist.</p> + * <p/> + * <p/> + * This value is initialized when the class is loaded. If [EMAIL PROTECTED] + * System#setProperty(String,String)} or [EMAIL PROTECTED] System#setProperties(java.util.Properties)} + * is called after this class is loaded, the value will be out of sync with + * that System property. </p> + * + * @since Java 1.1 + */ + public static final String OS_NAME = getSystemProperty( "os.name" ); + + /** + * <p>The <code>os.version</code> System Property. Operating system + * version.</p> + * <p/> + * <p>Defaults to <code>null</code> if the runtime does not have security + * access to read this property or the property does not exist.</p> + * <p/> + * <p/> + * This value is initialized when the class is loaded. If [EMAIL PROTECTED] + * System#setProperty(String,String)} or [EMAIL PROTECTED] System#setProperties(java.util.Properties)} + * is called after this class is loaded, the value will be out of sync with + * that System property. </p> + * + * @since Java 1.1 + */ + public static final String OS_VERSION = getSystemProperty( "os.version" ); + + /** + * <p>The <code>path.separator</code> System Property. Path separator + * (<code>":"</code> on UNIX).</p> + * <p/> + * <p>Defaults to <code>null</code> if the runtime does not have security + * access to read this property or the property does not exist.</p> + * <p/> + * <p/> + * This value is initialized when the class is loaded. If [EMAIL PROTECTED] + * System#setProperty(String,String)} or [EMAIL PROTECTED] System#setProperties(java.util.Properties)} + * is called after this class is loaded, the value will be out of sync with + * that System property. </p> + * + * @since Java 1.1 + */ + public static final String PATH_SEPARATOR = getSystemProperty( "path.separator" ); + + /** + * <p>The <code>user.country</code> or <code>user.region</code> System + * Property. User's country code, such as <code>GB</code>. First in JDK + * version 1.2 as <code>user.region</code>. Renamed to + * <code>user.country</code> in 1.4</p> + * <p/> + * <p>Defaults to <code>null</code> if the runtime does not have security + * access to read this property or the property does not exist.</p> + * <p/> + * <p/> + * This value is initialized when the class is loaded. If [EMAIL PROTECTED] + * System#setProperty(String,String)} or [EMAIL PROTECTED] System#setProperties(java.util.Properties)} + * is called after this class is loaded, the value will be out of sync with + * that System property. </p> + * + * @since Java 1.2 + */ + public static final String USER_COUNTRY = + ( getSystemProperty( "user.country" ) == null ? + getSystemProperty( "user.region" ) : getSystemProperty( "user.country" ) ); + + /** + * <p>The <code>user.dir</code> System Property. User's current working + * directory.</p> + * <p/> + * <p>Defaults to <code>null</code> if the runtime does not have security + * access to read this property or the property does not exist.</p> + * <p/> + * <p/> + * This value is initialized when the class is loaded. If [EMAIL PROTECTED] + * System#setProperty(String,String)} or [EMAIL PROTECTED] System#setProperties(java.util.Properties)} + * is called after this class is loaded, the value will be out of sync with + * that System property. </p> + * + * @since Java 1.1 + */ + public static final String USER_DIR = getSystemProperty( USER_DIR_KEY ); + + /** + * <p>The <code>user.home</code> System Property. User's home + * directory.</p> + * <p/> + * <p>Defaults to <code>null</code> if the runtime does not have security + * access to read this property or the property does not exist.</p> + * <p/> + * <p/> + * This value is initialized when the class is loaded. If [EMAIL PROTECTED] + * System#setProperty(String,String)} or [EMAIL PROTECTED] System#setProperties(java.util.Properties)} + * is called after this class is loaded, the value will be out of sync with + * that System property. </p> + * + * @since Java 1.1 + */ + public static final String USER_HOME = getSystemProperty( USER_HOME_KEY ); + + /** + * <p>The <code>user.language</code> System Property. User's language code, + * such as <code>"en"</code>.</p> + * <p/> + * <p>Defaults to <code>null</code> if the runtime does not have security + * access to read this property or the property does not exist.</p> + * <p/> + * <p/> + * This value is initialized when the class is loaded. If [EMAIL PROTECTED] + * System#setProperty(String,String)} or [EMAIL PROTECTED] System#setProperties(java.util.Properties)} + * is called after this class is loaded, the value will be out of sync with + * that System property. </p> + * + * @since Java 1.2 + */ + public static final String USER_LANGUAGE = getSystemProperty( "user.language" ); + + /** + * <p>The <code>user.name</code> System Property. User's account name.</p> + * <p/> + * <p>Defaults to <code>null</code> if the runtime does not have security + * access to read this property or the property does not exist.</p> + * <p/> + * <p/> + * This value is initialized when the class is loaded. If [EMAIL PROTECTED] + * System#setProperty(String,String)} or [EMAIL PROTECTED] System#setProperties(java.util.Properties)} + * is called after this class is loaded, the value will be out of sync with + * that System property. </p> + * + * @since Java 1.1 + */ + public static final String USER_NAME = getSystemProperty( "user.name" ); + + /** + * <p>The <code>user.timezone</code> System Property. For example: + * <code>"America/Los_Angeles"</code>.</p> + * <p/> + * <p>Defaults to <code>null</code> if the runtime does not have security + * access to read this property or the property does not exist.</p> + * <p/> + * <p/> + * This value is initialized when the class is loaded. If [EMAIL PROTECTED] + * System#setProperty(String,String)} or [EMAIL PROTECTED] System#setProperties(java.util.Properties)} + * is called after this class is loaded, the value will be out of sync with + * that System property. </p> + * + * @since 2.1 + */ + public static final String USER_TIMEZONE = getSystemProperty( "user.timezone" ); + + // Java version + //----------------------------------------------------------------------- + // These MUST be declared after those above as they depend on the + // values being set up + + /** + * <p>Gets the Java version as a <code>float</code>.</p> + * <p/> + * <p>Example return values:</p> <ul> <li><code>1.2f</code> for JDK 1.2 + * <li><code>1.31f</code> for JDK 1.3.1 </ul> + * <p/> + * <p>The field will return zero if [EMAIL PROTECTED] #JAVA_VERSION} is + * <code>null</code>.</p> + * + * @since 2.0 + */ + public static final float JAVA_VERSION_FLOAT = getJavaVersionAsFloat(); + + /** + * <p>Gets the Java version as an <code>int</code>.</p> + * <p/> + * <p>Example return values:</p> <ul> <li><code>120</code> for JDK 1.2 + * <li><code>131</code> for JDK 1.3.1 </ul> + * <p/> + * <p>The field will return zero if [EMAIL PROTECTED] #JAVA_VERSION} is + * <code>null</code>.</p> + * + * @since 2.0 + */ + public static final int JAVA_VERSION_INT = getJavaVersionAsInt(); + + // Java version checks + //----------------------------------------------------------------------- + // These MUST be declared after those above as they depend on the + // values being set up + + /** + * <p>Is <code>true</code> if this is Java version 1.1 (also 1.1.x + * versions).</p> + * <p/> + * <p>The field will return <code>false</code> if [EMAIL PROTECTED] #JAVA_VERSION} is + * <code>null</code>.</p> + */ + public static final boolean IS_JAVA_1_1 = getJavaVersionMatches( "1.1" ); + + /** + * <p>Is <code>true</code> if this is Java version 1.2 (also 1.2.x + * versions).</p> + * <p/> + * <p>The field will return <code>false</code> if [EMAIL PROTECTED] #JAVA_VERSION} is + * <code>null</code>.</p> + */ + public static final boolean IS_JAVA_1_2 = getJavaVersionMatches( "1.2" ); + + /** + * <p>Is <code>true</code> if this is Java version 1.3 (also 1.3.x + * versions).</p> + * <p/> + * <p>The field will return <code>false</code> if [EMAIL PROTECTED] #JAVA_VERSION} is + * <code>null</code>.</p> + */ + public static final boolean IS_JAVA_1_3 = getJavaVersionMatches( "1.3" ); + + /** + * <p>Is <code>true</code> if this is Java version 1.4 (also 1.4.x + * versions).</p> + * <p/> + * <p>The field will return <code>false</code> if [EMAIL PROTECTED] #JAVA_VERSION} is + * <code>null</code>.</p> + */ + public static final boolean IS_JAVA_1_4 = getJavaVersionMatches( "1.4" ); + + /** + * <p>Is <code>true</code> if this is Java version 1.5 (also 1.5.x + * versions).</p> + * <p/> + * <p>The field will return <code>false</code> if [EMAIL PROTECTED] #JAVA_VERSION} is + * <code>null</code>.</p> + */ + public static final boolean IS_JAVA_1_5 = getJavaVersionMatches( "1.5" ); + + // Operating system checks + //----------------------------------------------------------------------- + // These MUST be declared after those above as they depend on the + // values being set up + // OS names from http://www.vamphq.com/os.html + // Selected ones included - please advise [email protected] + // if you want another added or a mistake corrected + + /** + * <p>Is <code>true</code> if this is AIX.</p> + * <p/> + * <p>The field will return <code>false</code> if <code>OS_NAME</code> is + * <code>null</code>.</p> + * + * @since 2.0 + */ + public static final boolean IS_OS_AIX = getOSMatches( "AIX" ); + + /** + * <p>Is <code>true</code> if this is HP-UX.</p> + * <p/> + * <p>The field will return <code>false</code> if <code>OS_NAME</code> is + * <code>null</code>.</p> + * + * @since 2.0 + */ + public static final boolean IS_OS_HP_UX = getOSMatches( "HP-UX" ); + + /** + * <p>Is <code>true</code> if this is Irix.</p> + * <p/> + * <p>The field will return <code>false</code> if <code>OS_NAME</code> is + * <code>null</code>.</p> + * + * @since 2.0 + */ + public static final boolean IS_OS_IRIX = getOSMatches( "Irix" ); + + /** + * <p>Is <code>true</code> if this is Linux.</p> + * <p/> + * <p>The field will return <code>false</code> if <code>OS_NAME</code> is + * <code>null</code>.</p> + * + * @since 2.0 + */ + public static final boolean IS_OS_LINUX = getOSMatches( "Linux" ) || getOSMatches( "LINUX" ); + + /** + * <p>Is <code>true</code> if this is Mac.</p> + * <p/> + * <p>The field will return <code>false</code> if <code>OS_NAME</code> is + * <code>null</code>.</p> + * + * @since 2.0 + */ + public static final boolean IS_OS_MAC = getOSMatches( "Mac" ); + + /** + * <p>Is <code>true</code> if this is Mac.</p> + * <p/> + * <p>The field will return <code>false</code> if <code>OS_NAME</code> is + * <code>null</code>.</p> + * + * @since 2.0 + */ + public static final boolean IS_OS_MAC_OSX = getOSMatches( "Mac OS X" ); + + /** + * <p>Is <code>true</code> if this is OS/2.</p> + * <p/> + * <p>The field will return <code>false</code> if <code>OS_NAME</code> is + * <code>null</code>.</p> + * + * @since 2.0 + */ + public static final boolean IS_OS_OS2 = getOSMatches( "OS/2" ); + + /** + * <p>Is <code>true</code> if this is Solaris.</p> + * <p/> + * <p>The field will return <code>false</code> if <code>OS_NAME</code> is + * <code>null</code>.</p> + * + * @since 2.0 + */ + public static final boolean IS_OS_SOLARIS = getOSMatches( "Solaris" ); + + /** + * <p>Is <code>true</code> if this is SunOS.</p> + * <p/> + * <p>The field will return <code>false</code> if <code>OS_NAME</code> is + * <code>null</code>.</p> + * + * @since 2.0 + */ + public static final boolean IS_OS_SUN_OS = getOSMatches( "SunOS" ); + + /** + * <p>Is <code>true</code> if this is a POSIX compilant system, as in any of + * AIX, HP-UX, Irix, Linux, MacOSX, Solaris or SUN OS.</p> + * <p/> + * <p>The field will return <code>false</code> if <code>OS_NAME</code> is + * <code>null</code>.</p> + * + * @since 2.1 + */ + public static final boolean IS_OS_UNIX = + IS_OS_AIX || IS_OS_HP_UX || IS_OS_IRIX || IS_OS_LINUX || + IS_OS_MAC_OSX || IS_OS_SOLARIS || IS_OS_SUN_OS; + + /** + * <p>Is <code>true</code> if this is Windows.</p> + * <p/> + * <p>The field will return <code>false</code> if <code>OS_NAME</code> is + * <code>null</code>.</p> + * + * @since 2.0 + */ + public static final boolean IS_OS_WINDOWS = getOSMatches( OS_NAME_WINDOWS_PREFIX ); + + /** + * <p>Is <code>true</code> if this is Windows 2000.</p> + * <p/> + * <p>The field will return <code>false</code> if <code>OS_NAME</code> is + * <code>null</code>.</p> + * + * @since 2.0 + */ + public static final boolean IS_OS_WINDOWS_2000 = getOSMatches( OS_NAME_WINDOWS_PREFIX, "5.0" ); + + /** + * <p>Is <code>true</code> if this is Windows 95.</p> + * <p/> + * <p>The field will return <code>false</code> if <code>OS_NAME</code> is + * <code>null</code>.</p> + * + * @since 2.0 + */ + public static final boolean IS_OS_WINDOWS_95 = getOSMatches( OS_NAME_WINDOWS_PREFIX + " 9", "4.0" ); + // JDK 1.2 running on Windows98 returns 'Windows 95', hence the above + + /** + * <p>Is <code>true</code> if this is Windows 98.</p> + * <p/> + * <p>The field will return <code>false</code> if <code>OS_NAME</code> is + * <code>null</code>.</p> + * + * @since 2.0 + */ + public static final boolean IS_OS_WINDOWS_98 = getOSMatches( OS_NAME_WINDOWS_PREFIX + " 9", "4.1" ); + // JDK 1.2 running on Windows98 returns 'Windows 95', hence the above + + /** + * <p>Is <code>true</code> if this is Windows ME.</p> + * <p/> + * <p>The field will return <code>false</code> if <code>OS_NAME</code> is + * <code>null</code>.</p> + * + * @since 2.0 + */ + public static final boolean IS_OS_WINDOWS_ME = getOSMatches( OS_NAME_WINDOWS_PREFIX, "4.9" ); + // JDK 1.2 running on WindowsME may return 'Windows 95', hence the above + + /** + * <p>Is <code>true</code> if this is Windows NT.</p> + * <p/> + * <p>The field will return <code>false</code> if <code>OS_NAME</code> is + * <code>null</code>.</p> + * + * @since 2.0 + */ + public static final boolean IS_OS_WINDOWS_NT = getOSMatches( OS_NAME_WINDOWS_PREFIX + " NT" ); + // Windows 2000 returns 'Windows 2000' but may suffer from same JDK1.2 problem + + /** + * <p>Is <code>true</code> if this is Windows XP.</p> + * <p/> + * <p>The field will return <code>false</code> if <code>OS_NAME</code> is + * <code>null</code>.</p> + * + * @since 2.0 + */ + public static final boolean IS_OS_WINDOWS_XP = getOSMatches( OS_NAME_WINDOWS_PREFIX, "5.1" ); + + //----------------------------------------------------------------------- + /** + * <p>SystemUtils instances should NOT be constructed in standard + * programming. Instead, the class should be used as + * <code>SystemUtils.FILE_SEPARATOR</code>.</p> + * <p/> + * <p>This constructor is public to permit tools that require a JavaBean + * instance to operate.</p> + */ + public SystemUtils() + { + // no init. + } + + //----------------------------------------------------------------------- + /** + * <p>Gets the Java version number as a <code>float</code>.</p> + * <p/> + * <p>Example return values:</p> <ul> <li><code>1.2f</code> for JDK 1.2 + * <li><code>1.31f</code> for JDK 1.3.1 </ul> + * + * @return the version, for example 1.31f for JDK 1.3.1 + * @deprecated Use [EMAIL PROTECTED] #JAVA_VERSION_FLOAT} instead. Method will be + * removed in Commons Lang 3.0. + */ + public static float getJavaVersion() + { + return JAVA_VERSION_FLOAT; + } + + + /** + * <p>Gets the Java version number as a <code>float</code>.</p> + * <p/> + * <p>Example return values:</p> <ul> <li><code>1.2f</code> for JDK 1.2 + * <li><code>1.31f</code> for JDK 1.3.1 </ul> + * <p/> + * <p>Patch releases are not reported. Zero is returned if [EMAIL PROTECTED] + * #JAVA_VERSION} is <code>null</code>.</p> + * + * @return the version, for example 1.31f for JDK 1.3.1 + */ + private static float getJavaVersionAsFloat() + { + if ( JAVA_VERSION == null ) + { + return 0f; + } + String str = JAVA_VERSION.substring( 0, 3 ); + if ( JAVA_VERSION.length() >= 5 ) + { + str = str + JAVA_VERSION.substring( 4, 5 ); + } + return Float.parseFloat( str ); + } + + + /** + * <p>Gets the Java version number as an <code>int</code>.</p> + * <p/> + * <p>Example return values:</p> <ul> <li><code>120</code> for JDK 1.2 + * <li><code>131</code> for JDK 1.3.1 </ul> + * <p/> + * <p>Patch releases are not reported. Zero is returned if [EMAIL PROTECTED] + * #JAVA_VERSION} is <code>null</code>.</p> + * + * @return the version, for example 131 for JDK 1.3.1 + */ + private static int getJavaVersionAsInt() + { + if ( JAVA_VERSION == null ) + { + return 0; + } + String str = JAVA_VERSION.substring( 0, 1 ); + str = str + JAVA_VERSION.substring( 2, 3 ); + if ( JAVA_VERSION.length() >= 5 ) + { + str = str + JAVA_VERSION.substring( 4, 5 ); + } + else + { + str = str + "0"; + } + return Integer.parseInt( str ); + } + + + /** + * <p>Decides if the java version matches.</p> + * + * @param versionPrefix the prefix for the java version + * @return true if matches, or false if not or can't determine + */ + private static boolean getJavaVersionMatches( String versionPrefix ) + { + if ( JAVA_VERSION == null ) + { + return false; + } + return JAVA_VERSION.startsWith( versionPrefix ); + } + + + /** + * <p>Decides if the operating system matches.</p> + * + * @param osNamePrefix the prefix for the os name + * @return true if matches, or false if not or can't determine + */ + private static boolean getOSMatches( String osNamePrefix ) + { + if ( OS_NAME == null ) + { + return false; + } + return OS_NAME.startsWith( osNamePrefix ); + } + + + /** + * <p>Decides if the operating system matches.</p> + * + * @param osNamePrefix the prefix for the os name + * @param osVersionPrefix the prefix for the version + * @return true if matches, or false if not or can't determine + */ + private static boolean getOSMatches( String osNamePrefix, String osVersionPrefix ) + { + if ( OS_NAME == null || OS_VERSION == null ) + { + return false; + } + return OS_NAME.startsWith( osNamePrefix ) && OS_VERSION.startsWith( osVersionPrefix ); + } + + //----------------------------------------------------------------------- + /** + * <p>Gets a System property, defaulting to <code>null</code> if the + * property cannot be read.</p> + * <p/> + * <p>If a <code>SecurityException</code> is caught, the return value is + * <code>null</code> and a message is written to <code>System.err</code>.</p> + * + * @param property the system property name + * @return the system property value or <code>null</code> if a security + * problem occurs + */ + private static String getSystemProperty( String property ) + { + try + { + return System.getProperty( property ); + } + catch ( SecurityException ex ) + { + // we are not allowed to look at this property + System.err.println( "Caught a SecurityException reading the system property '" + property + + "'; the SystemUtils property value will default to null." ); + return null; + } + } + + + /** + * <p>Is the Java version at least the requested version.</p> + * <p/> + * <p>Example input:</p> <ul> <li><code>1.2f</code> to test for JDK 1.2</li> + * <li><code>1.31f</code> to test for JDK 1.3.1</li> </ul> + * + * @param requiredVersion the required version, for example 1.31f + * @return <code>true</code> if the actual version is equal or greater than + * the required version + */ + public static boolean isJavaVersionAtLeast( float requiredVersion ) + { + return ( JAVA_VERSION_FLOAT >= requiredVersion ); + } + + + /** + * <p>Is the Java version at least the requested version.</p> + * <p/> + * <p>Example input:</p> <ul> <li><code>120</code> to test for JDK 1.2 or + * greater</li> <li><code>131</code> to test for JDK 1.3.1 or greater</li> + * </ul> + * + * @param requiredVersion the required version, for example 131 + * @return <code>true</code> if the actual version is equal or greater than + * the required version + * @since 2.0 + */ + public static boolean isJavaVersionAtLeast( int requiredVersion ) + { + return ( JAVA_VERSION_INT >= requiredVersion ); + } + + + /** + * Returns whether the [EMAIL PROTECTED] #JAVA_AWT_HEADLESS} value is + * <code>true</code>. + * + * @return <code>true</code> if <code>JAVA_AWT_HEADLESS</code> is + * <code>"true"</code>, <code>false</code> otherwise. + * @see #JAVA_AWT_HEADLESS + * @since Java 1.4 + */ + public static boolean isJavaAwtHeadless() + { + return JAVA_AWT_HEADLESS != null ? JAVA_AWT_HEADLESS.equals( Boolean.TRUE.toString() ) : false; + } + + + /** + * <p>Gets the Java home directory as a <code>File</code>.</p> + * + * @return a directory + * @throws SecurityException if a security manager exists and its + * <code>checkPropertyAccess</code> method doesn't + * allow access to the specified system property. + * @see System#getProperty(String) + */ + public static File getJavaHome() + { + return new File( System.getProperty( JAVA_HOME_KEY ) ); + } + + + /** + * <p>Gets the Java IO temporary directory as a <code>File</code>.</p> + * + * @return a directory + * @throws SecurityException if a security manager exists and its + * <code>checkPropertyAccess</code> method doesn't + * allow access to the specified system property. + * @see System#getProperty(String) + */ + public static File getJavaIoTmpDir() + { + return new File( System.getProperty( JAVA_IO_TMPDIR_KEY ) ); + } + + + /** + * <p>Gets the user directory as a <code>File</code>.</p> + * + * @return a directory + * @throws SecurityException if a security manager exists and its + * <code>checkPropertyAccess</code> method doesn't + * allow access to the specified system property. + * @see System#getProperty(String) + */ + public static File getUserDir() + { + return new File( System.getProperty( USER_DIR_KEY ) ); + } + + + /** + * <p>Gets the user home directory as a <code>File</code>.</p> + * + * @return a directory + * @throws SecurityException if a security manager exists and its + * <code>checkPropertyAccess</code> method doesn't + * allow access to the specified system property. + * @see System#getProperty(String) + */ + public static File getUserHome() + { + return new File( System.getProperty( USER_HOME_KEY ) ); + } + +}
