jdicmanager.java

来自「jdic,显著提高swing性能的插件」· Java 代码 · 共 357 行

JAVA
357
字号
/* * Copyright (C) 2004 Sun Microsystems, Inc. All rights reserved. Use is * subject to license terms. *  * This program is free software; you can redistribute it and/or modify * it under the terms of the Lesser GNU General Public License as * published by the Free Software Foundation; either version 2 of the * License, or (at your option) any later version. *  * This program 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 for more details. *  * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 * USA. */package org.jdesktop.jdic.init;import java.io.File;import java.io.IOException;import java.lang.reflect.Field;import java.lang.reflect.Method;import java.net.MalformedURLException;import java.net.URL;import java.net.URLClassLoader;import org.jdesktop.jdic.browser.internal.WebBrowserUtil;import com.sun.jnlp.JNLPClassLoader;/** * Initialization manager for JDIC to set the environment variables or * initialize the set up for native libraries and executable files. * <p> * There are 3 modes of operation: WebStart, file system, and .jar file. * <p> * When using WebStart, please specify a .jar file(jdic-native.jar) with the * native libraries for your platform to be loaded by WebStart in your JNPL. * This class will find the unjared native libraries and executables, and use * them directly. * <p> * If not in WebStart, the system will expect the native libraries to be located * in directory at the root of the classpath or .jar containing this class. *  * @author Michael Samblanet * @author Paul Huang * @author George Zhang * @author Michael Shan * @since July 29, 2004 */public class JdicManager {    private boolean isShareNativeInitialized = false;    private boolean isBrowserNativeInitialized = false;        /** If the current platform is Windows */    boolean isWindows =         (System.getProperty("os.name").indexOf("Windows") >= 0) ?         true : false;        /** The environment variable for library path setting */    String libPathEnv = isWindows ? "PATH" : "LD_LIBRARY_PATH";    /** The path for the JDIC native files (jdic.dll/libjdic.so, etc) */    String nativeLibPath = null;    /** Singleton instance of this class */    private static JdicManager sSingleton = null;    /**     * Private constructor to prevent public construction.     */    private JdicManager() {    }    /**     * Returns a singleton instance of <code>JdicManager</code>.     */    public static synchronized JdicManager getManager() {        if (sSingleton == null) {            sSingleton = new JdicManager();        }        return sSingleton;    }    /**     * Initializes the shared native file settings for all the JDIC components/     * packages. Set necessary environment variables for the shared native     * library and executable files, including *.dll files on Windows, and *.so     * files on Unix.     *      * @exception JdicInitException Generic initialization exception     */    public void initShareNative() throws JdicInitException {        WebBrowserUtil.trace("init share native..... ");        // If the shared native file setting was already initialized,        // just return.        if (isShareNativeInitialized) {             return;        }        try {            // Find the root path of this class.            String jwsVersion = System.getProperty("javawebstart.version");            if (jwsVersion != null) {                //loaded by JWS                WebBrowserUtil.trace("Loaded by JavaWebStart,version is "                                + jwsVersion);                //native libs will be loaded by webstart automatically                nativeLibPath = caculateNativeLibPathBySunJWS();                return;            } else {                //running url of current class                                                                  String runningURL =(                    new URL(JdicManager.class                        .getProtectionDomain()                        .getCodeSource()                        .getLocation(),                        ".")                ).openConnection().getPermission().getName();                //running path of current class                String runningPath = (new File(runningURL)).getCanonicalPath();                nativeLibPath = caculateNativeLibPath(runningPath);                // Add the binary path (including jdic.dll or libjdic.so) to                // "java.library.path", since we need to use the native methods                // in class InitUtility.                String newLibPath = nativeLibPath + File.pathSeparator                    + System.getProperty("java.library.path");                System.setProperty("java.library.path", newLibPath);                Field fieldSysPath = ClassLoader.class                    .getDeclaredField("sys_paths");                fieldSysPath.setAccessible(true);                if (fieldSysPath != null) {                    fieldSysPath.set(System.class.getClassLoader(), null);                }            }        } catch (Throwable e) {            throw new JdicInitException(e);        }        isShareNativeInitialized = true;    }    /**     * To keep the using of crossplatform version of JDIC     *      * @throws MalformedURLException     * @throws JdicInitException     *       */    private String caculateNativeLibPath(String runningPath)        throws MalformedURLException, JdicInitException    {        String platformPath = runningPath + File.separator + getPlatform();        File jdicStubJarFile = new File(platformPath + File.separator            + "jdic_stub.jar");        if (!jdicStubJarFile.exists()) {            //not cross platform version            return runningPath;        } else {            //cross platform version            String architecturePath = platformPath + File.separator                + getArchitecture();            ClassLoader cl = getClass().getClassLoader();            if (!(cl instanceof URLClassLoader)) {                //not URLClassLoader,omit it,in case the stub jar has been                // set to claspath                String exceptionInfo =                    "We detect that you are not using java.net.URLClassLoader for cross platform versoin, "                    + "you have to set jdic_stub.jar manually!";                WebBrowserUtil.error(exceptionInfo);                return architecturePath;//return the native lib path            }                                //set stub jars to classpath            URLClassLoader urlCl = (URLClassLoader) cl;            try {                Method addURLMethod = URLClassLoader.class.getDeclaredMethod(                    "addURL",                    new Class[] { URL.class });                addURLMethod.setAccessible(true);                addURLMethod.invoke(                    urlCl,                    new Object[] { jdicStubJarFile.toURL() } );                return architecturePath;//return the native lib path            } catch (Throwable t) {                t.printStackTrace();                throw new JdicInitException(                    "Error, could not add URL to system classloader");            }        }    }    /**     * Initialize native libs' running path if loaded by webstart.This method     * only works for sun webstart implementaion,for other webstart     * implementations, you have to rewrite this method.     *      * @throws IOException     * @throws JdicInitException     */    private String caculateNativeLibPathBySunJWS() throws IOException,                    JdicInitException    {        String jdicLibFolder = null;        ClassLoader cl = this.getClass().getClassLoader();        if (cl instanceof JNLPClassLoader) {            JNLPClassLoader jnlpCl = (JNLPClassLoader) cl;            String jdicLibURL = jnlpCl.findLibrary("jdic");//get lib path by classloder            jdicLibFolder = (new File(jdicLibURL)).getParentFile().getCanonicalPath();            WebBrowserUtil.trace("running path " + nativeLibPath);            isShareNativeInitialized = true;        } else {            // only run well for sun jre            throw new JdicInitException(                "Unexpected ClassLoader for webstart, only com.sun.jnlp.JNLPClassLoader is supported.");        }        return jdicLibFolder;    }    /**     * Return the canonical name of the platform. This value is derived from the     * System property os.name.     *      * @return The platform string.     */    private static String getPlatform() {        // See list of os names at: http://lopica.sourceforge.net/os.html        // or at: http://www.tolstoy.com/samizdat/sysprops.html        String osname = System.getProperty("os.name");        if (osname.startsWith("Windows")) {                return "windows";        }        return canonical(osname);    }    /**     * Return the name of the architecture. This value is determined by the     * System property os.arch.     *      * @return The architecture string.     */    private static String getArchitecture() {        String arch = System.getProperty("os.arch");        if (arch.endsWith("86")) {                return "x86";        }        return canonical(arch);    }    /**     * @param value     *            The value to be canonicalized.     * @return The value with all '/', '\' and ' ' replaced with '_', and all     *         uppercase characters replaced with lower case equivalents.     */    private static String canonical(String value) {        WebBrowserUtil.trace("value:" + value);        WebBrowserUtil.trace("canonical:"                        + value.toLowerCase().replaceAll("[\\\\/ ]", "_"));        return value.toLowerCase().replaceAll("[\\\\/ ]", "_");    }    /**     * Initializes the native file settings for the JDIC Browser component      * (package <code>org.jdecktop.jdic.browser</code>). Set necessary      * environment variables for the Browser specific native library and      * executable files, including *.exe files on Windows, and mozembed-<os>-gtk*      * files on Unix.     *      * @exception JdicInitException Generic initialization exception     */    public void initBrowserNative() throws JdicInitException {        // The Browser component is used.        // If the Browser specific native file setting was already initialized,         // just return.        if (isBrowserNativeInitialized) {            return;        }        try {            // Pre-append the JDIC binary path to PATH(on Windows) or             // LD_LIBRARY_PATH(on Unix).                     String binaryPath = getBinaryPath();                        InitUtility.preAppendEnv(libPathEnv, binaryPath);             String browserPath = WebBrowserUtil.getBrowserPath();            if (browserPath == null) {                throw new JdicInitException(                    "Can't locate the native browser path!");            }                        if (WebBrowserUtil.isDefaultBrowserMozilla()) {                // Mozilla is the default/embedded browser.                // Use the user defined value or the mozilla binary                // path as the value of MOZILLA_FIVE_HOME env variable.                String envMFH = InitUtility.getEnv("MOZILLA_FIVE_HOME");                if (envMFH == null) {                    File browserFile = new File(browserPath);                    if (browserFile.isDirectory()) {                        envMFH = browserFile.getCanonicalPath();                    } else {                        envMFH = browserFile.getCanonicalFile().getParent();                    }                                    }                                if (!isWindows) {                    // On Unix, add the binary path to PATH.                    InitUtility.preAppendEnv("PATH", binaryPath);                    // When running on webstart, the browser binary will lose                    // "x" permission after extracted from .jar file.                    String embedBinary = WebBrowserUtil.getEmbedBinaryName();                    Runtime.getRuntime().exec("chmod a+x "+                             binaryPath + File.separator + embedBinary);                                    } else {                                   // Mozilla on Windows, reset MOZILLA_FIVE_HOME to the GRE                     // directory path:                      //   [Common Files]\mozilla.org\GRE\1.x_BUILDID,                     // if Mozilla installs from a .exe package.                    //                                    String xpcomPath = envMFH + File.separator + "xpcom.dll";                                            if (!(new File(xpcomPath).isFile())) {                        // Mozilla installs from a .exe package. Check the                         // installed GRE directory.                        String mozGreHome                             = WebBrowserUtil.getMozillaGreHome();                        if (mozGreHome == null) {                            throw new JdicInitException(                                "Can't locate the GRE directory of the " +                                "installed Mozilla binary: " + envMFH);                        }                                               envMFH = mozGreHome;                    }                }                              InitUtility.setEnv("MOZILLA_FIVE_HOME", envMFH);                InitUtility.preAppendEnv(libPathEnv, envMFH);            } // end - Mozilla is the default/embedded browser.        } catch (Throwable e) {            throw new JdicInitException(e);        }                isBrowserNativeInitialized = true;    }    public String getBinaryPath() {        //WebBrowserUtil.trace("native lib path " + nativeLibPath);        return nativeLibPath;    }}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?