/*
 * Copyright (c) 2011, 2014, Oracle and/or its affiliates. All rights reserved.
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
 *
 * This code is free software; you can redistribute it and/or modify it
 * under the terms of the GNU General Public License version 2 only, as
 * published by the Free Software Foundation.  Oracle designates this
 * particular file as subject to the "Classpath" exception as provided
 * by Oracle in the LICENSE file that accompanied this code.
 *
 * This code is distributed in the hope that it will be useful, but WITHOUT
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
 * version 2 for more details (a copy is included in the LICENSE file that
 * accompanied this code).
 *
 * You should have received a copy of the GNU General Public License version
 * 2 along with this work; if not, write to the Free Software Foundation,
 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
 *
 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
 * or visit www.oracle.com if you need additional information or have any
 * questions.
 */

package com.sun.javafx;

import java.security.AccessController;
import java.security.PrivilegedAction;
import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;
import java.io.IOException;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.Properties;

public class PlatformUtil {

    // NOTE: since this class can be initialized by application code in some
    // cases, we must encapsulate all calls to System.getProperty("...") in
    // a doPrivileged block except for standard JVM properties such as
    // os.name, os.version, os.arch, java.vm.name, etc.

    private static final String os = System.getProperty("os.name");
    private static final String version = System.getProperty("os.version");
    private static final boolean embedded;
    private static final String embeddedType;
    private static final boolean useEGL;
    private static final boolean doEGLCompositing;
    // a property used to denote a non-default impl for this host
    private static String javafxPlatform;

    static {
        javafxPlatform = AccessController.doPrivileged((PrivilegedAction<String>) () -> System.getProperty("javafx.platform"));
        loadProperties();
        embedded = AccessController.doPrivileged((PrivilegedAction<Boolean>) () -> Boolean.getBoolean("com.sun.javafx.isEmbedded"));
        embeddedType = AccessController.doPrivileged((PrivilegedAction<String>) () -> System.getProperty("embedded"));
        useEGL = AccessController.doPrivileged((PrivilegedAction<Boolean>) () -> Boolean.getBoolean("use.egl"));
        if (useEGL) {
            doEGLCompositing = AccessController.doPrivileged((PrivilegedAction<Boolean>) () -> Boolean.getBoolean("doNativeComposite"));
        } else
            doEGLCompositing = false;
    }

    private static final boolean ANDROID = "android".equals(javafxPlatform) || "Dalvik".equals(System.getProperty("java.vm.name"));
    private static final boolean WINDOWS = os.startsWith("Windows");
    private static final boolean WINDOWS_VISTA_OR_LATER = WINDOWS && versionNumberGreaterThanOrEqualTo(6.0f);
    private static final boolean WINDOWS_7_OR_LATER = WINDOWS && versionNumberGreaterThanOrEqualTo(6.1f);
    private static final boolean MAC = os.startsWith("Mac");
    private static final boolean LINUX = os.startsWith("Linux") && !ANDROID;
    private static final boolean SOLARIS = os.startsWith("SunOS");
    private static final boolean IOS = os.startsWith("iOS");

    
Utility method used to determine whether the version number as reported by system properties is greater than or equal to a given value.
Params:
  • value – The value to test against.
Returns:false if the version number cannot be parsed as a float, otherwise the comparison against value.
/** * Utility method used to determine whether the version number as * reported by system properties is greater than or equal to a given * value. * * @param value The value to test against. * @return false if the version number cannot be parsed as a float, * otherwise the comparison against value. */
private static boolean versionNumberGreaterThanOrEqualTo(float value) { try { return Float.parseFloat(version) >= value; } catch (Exception e) { return false; } }
Returns true if the operating system is a form of Windows.
/** * Returns true if the operating system is a form of Windows. */
public static boolean isWindows(){ return WINDOWS; }
Returns true if the operating system is at least Windows Vista(v6.0).
/** * Returns true if the operating system is at least Windows Vista(v6.0). */
public static boolean isWinVistaOrLater(){ return WINDOWS_VISTA_OR_LATER; }
Returns true if the operating system is at least Windows 7(v6.1).
/** * Returns true if the operating system is at least Windows 7(v6.1). */
public static boolean isWin7OrLater(){ return WINDOWS_7_OR_LATER; }
Returns true if the operating system is a form of Mac OS.
/** * Returns true if the operating system is a form of Mac OS. */
public static boolean isMac(){ return MAC; }
Returns true if the operating system is a form of Linux.
/** * Returns true if the operating system is a form of Linux. */
public static boolean isLinux(){ return LINUX; } public static boolean useEGL() { return useEGL; } public static boolean useEGLWindowComposition() { return doEGLCompositing; } public static boolean useGLES2() { String useGles2 = "false"; useGles2 = AccessController.doPrivileged((PrivilegedAction<String>) () -> System.getProperty("use.gles2")); if ("true".equals(useGles2)) return true; else return false; }
Returns true if the operating system is a form of Unix, including Linux.
/** * Returns true if the operating system is a form of Unix, including Linux. */
public static boolean isSolaris(){ return SOLARIS; }
Returns true if the operating system is a form of Linux or Solaris
/** * Returns true if the operating system is a form of Linux or Solaris */
public static boolean isUnix(){ return LINUX || SOLARIS; }
Returns true if the platform is embedded.
/** * Returns true if the platform is embedded. */
public static boolean isEmbedded() { return embedded; }
Returns a string with the embedded type - ie eglx11, eglfb, dfb or null.
/** * Returns a string with the embedded type - ie eglx11, eglfb, dfb or null. */
public static String getEmbeddedType() { return embeddedType; }
Returns true if the operating system is iOS
/** * Returns true if the operating system is iOS */
public static boolean isIOS(){ return IOS; } private static void loadPropertiesFromFile(final File file) { Properties p = new Properties(); try { InputStream in = new FileInputStream(file); p.load(in); in.close(); } catch (IOException e) { e.printStackTrace(); } if (javafxPlatform == null) { javafxPlatform = p.getProperty("javafx.platform"); } String prefix = javafxPlatform + "."; int prefixLength = prefix.length(); boolean foundPlatform = false; for (Object o : p.keySet()) { String key = (String) o; if (key.startsWith(prefix)) { foundPlatform = true; String systemKey = key.substring(prefixLength); if (System.getProperty(systemKey) == null) { String value = p.getProperty(key); System.setProperty(systemKey, value); } } } if (!foundPlatform) { System.err.println( "Warning: No settings found for javafx.platform='" + javafxPlatform + "'"); } }
Returns the directory containing the JavaFX runtime, or null if the directory cannot be located
/** Returns the directory containing the JavaFX runtime, or null * if the directory cannot be located */
private static File getRTDir() { try { String theClassFile = "PlatformUtil.class"; Class theClass = PlatformUtil.class; URL url = theClass.getResource(theClassFile); if (url == null) return null; String classUrlString = url.toString(); if (!classUrlString.startsWith("jar:file:") || classUrlString.indexOf('!') == -1) { return null; } // Strip out the "jar:" and everything after and including the "!" String s = classUrlString.substring(4, classUrlString.lastIndexOf('!')); // Strip everything after the last "/" or "\" to get rid of the jar filename int lastIndexOfSlash = Math.max( s.lastIndexOf('/'), s.lastIndexOf('\\')); return new File(new URL(s.substring(0, lastIndexOfSlash + 1)).getPath()) .getParentFile(); } catch (MalformedURLException e) { return null; } } private static void loadProperties() { final String vmname = System.getProperty("java.vm.name"); final String arch = System.getProperty("os.arch"); if (! (javafxPlatform != null || (arch != null && arch.equals("arm")) || (vmname != null && vmname.indexOf("Embedded") > 0))) { return; } AccessController.doPrivileged((PrivilegedAction<Void>) () -> { final File rtDir = getRTDir(); final String propertyFilename = "javafx.platform.properties"; File rtProperties = new File(rtDir, propertyFilename); // First look for javafx.platform.properties in the JavaFX runtime // Then in the installation directory of the JRE if (rtProperties.exists()) { loadPropertiesFromFile(rtProperties); return null; } String javaHome = System.getProperty("java.home"); File javaHomeProperties = new File(javaHome, "lib" + File.separator + propertyFilename); if (javaHomeProperties.exists()) { loadPropertiesFromFile(javaHomeProperties); return null; } String javafxRuntimePath = System.getProperty("javafx.runtime.path"); File javafxRuntimePathProperties = new File(javafxRuntimePath, File.separator + propertyFilename); if (javafxRuntimePathProperties.exists()) { loadPropertiesFromFile(javafxRuntimePathProperties); return null; } return null; }); } public static boolean isAndroid() { return ANDROID; } }