| /******************************************************************************* |
| * Copyright (c) 2009, 2013 Oracle. All rights reserved. |
| * This program and the accompanying materials are made available under the |
| * terms of the Eclipse Public License v1.0, which accompanies this distribution |
| * and is available at http://www.eclipse.org/legal/epl-v10.html. |
| * |
| * Contributors: |
| * Oracle - initial API and implementation |
| ******************************************************************************/ |
| package org.eclipse.jpt.common.utility.internal; |
| |
| import java.io.PrintStream; |
| import java.util.Map; |
| import org.eclipse.jpt.common.utility.internal.comparator.ComparatorTools; |
| |
| /** |
| * Various system utility methods. |
| * @see System#getProperty(String) |
| */ |
| @SuppressWarnings("nls") |
| public final class SystemTools { |
| |
| // ********** JVM ********** |
| |
| /** |
| * Return whether the current JVM is IBM's. |
| */ |
| public static boolean jvmIsIBM() { |
| return jvmIs("IBM"); |
| } |
| |
| /** |
| * Return whether the current JVM is Oracle's (or Sun's). |
| */ |
| public static boolean jvmIsOracle() { |
| return jvmIsSun(); |
| } |
| |
| /** |
| * Return whether the current JVM is Sun's (or Oracle's). |
| */ |
| public static boolean jvmIsSun() { |
| return jvmIsStrictlySun() || jvmIsStrictlyOracle(); |
| } |
| |
| /** |
| * Return whether the current JVM is <em>strictly</em> Oracle's |
| * (as opposed to Sun's). |
| */ |
| public static boolean jvmIsStrictlyOracle() { |
| return jvmIs("Oracle"); |
| } |
| |
| /** |
| * Return whether the current JVM is <em>strictly</em> Sun's |
| * (as opposed to Oracle's). |
| */ |
| public static boolean jvmIsStrictlySun() { |
| return jvmIs("Sun"); |
| } |
| |
| private static boolean jvmIs(String jvmVendorName) { |
| return System.getProperty("java.vendor").startsWith(jvmVendorName); |
| } |
| |
| |
| // ********** Java specification version ********** |
| |
| /** |
| * Return whether the Java specification version of the current JVM |
| * is greater than the specified version (e.g. <code>"1.5"</code>). |
| * <p> |
| * This is useful for a test that should fail if it encounters a newer |
| * JVM than what the current code supports, serving as a reminder to the |
| * developers. :-) |
| */ |
| public static boolean javaSpecificationVersionIsGreaterThan(String version) { |
| return ComparatorTools.integerVersionComparator().compare(javaSpecificationVersion(), version) > 0; |
| } |
| |
| /** |
| * Return whether the Java specification version of the current JVM |
| * is less than or equal to the specified version (e.g. <code>"1.5"</code>). |
| */ |
| public static boolean javaSpecificationVersionIsLessThanOrEqualTo(String version) { |
| return ! javaSpecificationVersionIsGreaterThan(version); |
| } |
| |
| /** |
| * Return whether the Java specification version of the current JVM |
| * is less than the specified version (e.g. <code>"1.5"</code>). |
| */ |
| public static boolean javaSpecificationVersionIsLessThan(String version) { |
| return ComparatorTools.integerVersionComparator().compare(javaSpecificationVersion(), version) < 0; |
| } |
| |
| /** |
| * Return whether the Java specification version of the current JVM |
| * is greater than or equal to the specified version (e.g. <code>"1.5"</code>). |
| */ |
| public static boolean javaSpecificationVersionIsGreaterThanOrEqualTo(String version) { |
| return ! javaSpecificationVersionIsLessThan(version); |
| } |
| |
| /** |
| * Return the Java specification version of the current JVM. |
| */ |
| public static String javaSpecificationVersion() { |
| return System.getProperty("java.specification.version"); |
| } |
| |
| |
| // ********** file encoding ********** |
| |
| /** |
| * Return whether the current file encoding is Microsoft Windows |
| * (i.e. "Cp1252"). |
| */ |
| public static boolean fileEncodingIsWindows() { |
| return fileEncoding().equals("Cp1252"); |
| } |
| |
| /** |
| * Return whether the current file encoding is UTF-8. |
| */ |
| public static boolean fileEncodingIsUTF8() { |
| return fileEncoding().equals("UTF-8"); |
| } |
| |
| private static String fileEncoding() { |
| return System.getProperty("file.encoding"); |
| } |
| |
| |
| // ********** O/S ********** |
| |
| /** |
| * Return whether the current operating system is Microsoft Windows. |
| */ |
| public static boolean osIsWindows() { |
| return osIs("Windows"); |
| } |
| |
| /** |
| * Return whether the current operating system is Linux. |
| */ |
| public static boolean osIsLinux() { |
| return osIs("Linux"); |
| } |
| |
| /** |
| * Return whether the current operating system is Mac OS X. |
| */ |
| public static boolean osIsMac() { |
| return osIs("Mac"); |
| } |
| |
| private static boolean osIs(String osName) { |
| return System.getProperty("os.name").indexOf(osName) != -1; |
| } |
| |
| |
| // ********** thread dump ********** |
| |
| /** |
| * Print all the current threads' stack traces on a string and return the |
| * resulting string. |
| * @see Thread#getAllStackTraces() |
| */ |
| public static String allThreadsToString() { |
| StringBuilder sb = new StringBuilder(5000); |
| dumpAllThreadsOn(sb); |
| return sb.toString(); |
| } |
| |
| /** |
| * Dump all the current threads' stack traces to the specified string |
| * builder. |
| * @see Thread#getAllStackTraces() |
| */ |
| public static void dumpAllThreadsOn(StringBuilder sb) { |
| Map<Thread, StackTraceElement[]> stackTraces = Thread.getAllStackTraces(); |
| for (Map.Entry<Thread, StackTraceElement[]> entry : stackTraces.entrySet()) { |
| sb.append(entry.getKey().getName()); |
| sb.append(StringTools.CR); |
| for (StackTraceElement element : entry.getValue()) { |
| sb.append(element); |
| sb.append(StringTools.CR); |
| } |
| sb.append(StringTools.CR); |
| } |
| } |
| |
| /** |
| * Dump all the current threads' stack traces to the |
| * {@link System#out system console}. |
| * @see Thread#getAllStackTraces() |
| */ |
| public static void dumpAllThreads() { |
| synchronized (System.out) { |
| dumpAllThreadsOn(System.out); |
| } |
| } |
| |
| /** |
| * Dump all the current threads' stack traces to the specified stream. |
| * @see Thread#getAllStackTraces() |
| */ |
| public static void dumpAllThreadsOn(PrintStream stream) { |
| Map<Thread, StackTraceElement[]> stackTraces = Thread.getAllStackTraces(); |
| for (Map.Entry<Thread, StackTraceElement[]> entry : stackTraces.entrySet()) { |
| stream.println(entry.getKey().getName()); |
| for (StackTraceElement element : entry.getValue()) { |
| stream.println(element); |
| } |
| stream.println(); |
| } |
| } |
| |
| |
| // ********** constructor ********** |
| |
| /** |
| * Suppress default constructor, ensuring non-instantiability. |
| */ |
| private SystemTools() { |
| super(); |
| throw new UnsupportedOperationException(); |
| } |
| } |