RCP获取资源工具类

在RCP开发中,需要获取Bundle中的资源,或者跟目录的资源,一下工具类用于获取当前插件目录中的资源或者Workspace、以及安装目录下的资源,根据类的class对象获取类所在的插件,在插件中获取相应的资源。通过以下插件获取资源,如果资源在jar包中,获取以后会复制相应的资源到“configuration\org.eclipse.osgi\bundles”目录下对应的bundle目录中。


package cn.elwy.ide.config.util;

import java.io.File;
import java.net.URL;

import javax.swing.filechooser.FileSystemView;

import org.eclipse.core.runtime.FileLocator;
import org.eclipse.core.runtime.Path;
import org.eclipse.core.runtime.Platform;
import org.osgi.framework.Bundle;
import org.osgi.framework.FrameworkUtil;

import cn.elwy.common.exception.RunException;

/**
 * 获取资源工具类
 * @author huangsq
 * @version 2.0, 2014-01-12
 * @since 2.0, 2014-01-12
 */
public class ResourceUtil {

    public static File USER_DIR;
    public static File USER_HOME;
    /** 安装路径 */
    public static File INSTALL_PATH;
    /** 安装URL */
    public static URL INSTALL_URL;
    /** 产品路径 */
    public static File PRODUCT_PATH;
    /** 产品URL */
    public static URL PRODUCT_URL;
    /** 工作空间路径 */
    public static File WORKSPACE_PATH;
    /** 工作空间URL */
    public static URL WORKSPACE_URL;
    /** 插件配置文件目录 */
    public static File CONFIGURATION_PATH;
    /** 插件日志文件 */
    public static File LOG_FILE;

    static {
        init();
    }

    /**
     * 获取插件资源工具类的构造函数
     * @param pluginId 插件ID
     */
    private ResourceUtil() {
    }

    public static void init() {
        INSTALL_URL = getInstallURL();
        INSTALL_PATH = getInstallPath();
        PRODUCT_URL = getProductURL();
        PRODUCT_PATH = getProductPath();
        WORKSPACE_URL = getWorkspaceURL();
        WORKSPACE_PATH = getWorkspacePath();
        CONFIGURATION_PATH = getConfigurationPath();
        LOG_FILE = getLogFile();

        // 设置应用安装路径到系统属性
        System.setProperty("INSTALL_PATH", INSTALL_PATH.getAbsolutePath());
        // 设置插件路径到系统属性
        System.setProperty("PRODUCT_PATH", PRODUCT_PATH.getAbsolutePath());
        // 设置工作空间路径到系统属性
        System.setProperty("WORKSPACE_PATH", WORKSPACE_PATH.getAbsolutePath());
    }

    /** 获取系统运行目录 */
    public static File getUserDir() {
        if (USER_DIR == null) {
            USER_DIR = new File(System.getProperty("user.dir"));
        }
        return USER_DIR;
    }

    /** 获取用户根目录 */
    public static File getUserHome() {
        if (USER_HOME == null) {
            USER_HOME = new File(System.getProperty("user.home"));
        }
        return USER_HOME;
    }

    /** 获取桌面路径 */
    public static File getDesktopPath() {
        FileSystemView fsv = FileSystemView.getFileSystemView();
        return fsv.getHomeDirectory();
    }

    /** 获取我的文档路径 */
    public static File getDocumentsPath() {
        FileSystemView fsv = FileSystemView.getFileSystemView();
        return fsv.getDefaultDirectory();
    }

    /** 获取安装目录 */
    public static File getInstallPath() {
        if (INSTALL_PATH == null) {
            INSTALL_PATH = toFile(getInstallURL());
        }
        return INSTALL_PATH;
    }

    /** 获取安装路径 */
    public static URL getInstallURL() {
        if (INSTALL_URL == null) {
            INSTALL_URL = Platform.getInstallLocation().getURL();
        }
        return INSTALL_URL;
    }

    /** 获取工作空间根目录 */
    public static File getWorkspacePath() {
        if (WORKSPACE_PATH == null) {
            WORKSPACE_PATH = toFile(getWorkspaceURL());
        }
        return WORKSPACE_PATH;
    }

    /** 获取工作空间根目录 */
    public static URL getWorkspaceURL() {
        if (WORKSPACE_URL == null) {
            WORKSPACE_URL = Platform.getInstanceLocation().getURL();
        }
        return WORKSPACE_URL;
    }

    /** 获取产品根路径 */
    public static File getProductPath() {
        if (PRODUCT_PATH == null) {
            PRODUCT_PATH = toFile(getProductURL());
        }
        return PRODUCT_PATH;
    }

    /** 获取产品根目录 */
    public static URL getProductURL() {
        if (PRODUCT_URL == null) {
            PRODUCT_URL = toFileURL(Platform.getProduct().getDefiningBundle().getEntry(""));
        }
        return PRODUCT_URL;
    }

    /** 获取产品配置根目录 */
    public static File getConfigurationPath() {
        if (CONFIGURATION_PATH == null) {
            CONFIGURATION_PATH = toFile(Platform.getConfigurationLocation().getURL());
        }
        return CONFIGURATION_PATH;
    }

    /** 获取产品LOG路径 */
    public static File getLogFile() {
        if (LOG_FILE == null) {
            LOG_FILE = Platform.getLogFileLocation().toFile();
        }
        return LOG_FILE;
    }

    /** 获取插件绝对路径 */
    public static File getStateLocation(Bundle bundle) {
        return Platform.getStateLocation(bundle).toFile();
    }

    /**
     * 先获取安装根路径下的资源,如果不存在则获取配置插件目录下的资源,如果不存在最后获取产品插件下的资源,如果不存在指定的资源将返回null
     * @param filePath 相对于插件的路径
     * @return
     */
    public static URL getResource(String filePath) {
        return getResource((Class) null, filePath);
    }

    /**
     * 先获取安装根路径下的资源,如果不存在则获取配置插件目录下的资源,如果不存在则获取当前插件目录下的资源,
     * 如果不存在最后获取产品插件下的资源,如果不存在指定的资源将返回null
     * @param clazz 插件下的类
     * @param filePath 相对于插件的路径
     * @return
     */
    public static URL getResource(Class clazz, String filePath) {
        URL url = getResource(getInstallURL(), filePath);
        if (url != null) {
            return url;
        }
        if (clazz != null) {
            url = getPluginResource(clazz, filePath);
            if (url != null) {
                return url;
            }
        }
        return getPluginResource(ResourceUtil.class, filePath);
    }

    /**
     * 获取相对于URL的资源
     * @param url 查找路径
     * @param filePath 文件路径
     * @return
     */
    public static URL getResource(URL url, String filePath) {
        filePath = getFilePath(filePath);
        try {
            URL resource = new URL(url, filePath);
            File file = toFile(resource);
            if (file != null && file.exists()) {
                return resource;
            }
        } catch (Exception e) {
            throw new RunException(e);
        }
        return null;
    }

    /**
     * 先获取安装根路径下的资源,如果不存在则获取配置插件目录下的资源,如果不存在最后获取产品插件下的资源,如果不存在指定的资源将返回null
     * @param filePath 相对于插件的路径
     * @return
     */
    public static File getResourceFile(String filePath) {
        return getResourceFile((Class) null, filePath);
    }

    /**
     * 先获取安装根路径下的资源,如果不存在则获取配置插件目录下的资源,如果不存在则获取当前插件目录下的资源,
     * 如果不存在最后获取产品插件下的资源,如果不存在指定的资源将返回null
     * @param clazz 插件下的类
     * @param filePath 相对于插件的路径
     * @return
     */
    public static File getResourceFile(Class clazz, String filePath) {
        return toFile(getResource(clazz, filePath));
    }

    /**
     * 获取相对于URL的资源
     * @param url 查找路径
     * @param filePath 文件路径
     * @return
     */
    public static File getResourceFile(URL url, String filePath) {
        return toFile(getResource(url, filePath));
    }

    /**
     * 获取相对于插件的URL资源,如果不存在指定的资源将返回null
     * @param clazz 所在插件的类
     * @param filePath 相对于插件的路径
     * @return
     */
    public static URL getPluginResource(Class clazz, String filePath) {
        Bundle bundle = FrameworkUtil.getBundle(clazz);
        return getPluginResource(bundle, filePath);
    }

    /**
     * 获取相对于插件的URL资源,如果不存在指定的资源将返回null
     * @param pluginId 插件ID
     * @param filePath 相对于插件的路径
     * @return
     */
    public static URL getPluginResource(String pluginId, String filePath) {
        return getPluginResource(Platform.getBundle(pluginId), filePath);
    }

    /**
     * 获取相对于插件的URL资源,如果不存在指定的资源将返回null
     * @param bundle 插件Bundle
     * @param filePath 相对于插件的路径
     * @return
     */
    public static URL getPluginResource(Bundle bundle, String filePath) {
        return toFileURL(bundle.getEntry(getFilePath(filePath)));
    }

    /**
     * 获取相对于插件的URL资源,如果不存在指定的资源将返回null
     * @param pluginId 插件ID
     * @param filePath
     * @return
     */
    public static File getPluginResourceFile(String pluginId, String filePath) {
        return toFile(getPluginResource(pluginId, filePath));
    }

    /**
     * 获取相对于插件的URL资源,如果不存在指定的资源将返回null
     * @param clazz 所在插件的类
     * @param filePath
     * @return
     */
    public static File getPluginResourceFile(Class clazz, String filePath) {
        return toFile(getPluginResource(clazz, filePath));
    }

    /**
     * 获取相对于插件的URL资源,如果不存在指定的资源将返回null
     * @param filePath
     * @return
     */
    public static File getPluginResourceFile(Bundle bundle, String filePath) {
        return toFile(getPluginResource(bundle, filePath));
    }

    /**
     * 插件的URL转换成File
     * @param url 插件的URL
     * @return
     */
    public static File toFile(URL url) {
        if (url == null) {
            return null;
        } else {
            Path path = new Path(url.getFile());
            return path.toFile();
        }
    }

    /**
     * 插件的URL转换成URL
     * @param url 插件的URL
     * @return
     */
    public static URL toFileURL(URL url) {
        if (url == null) {
            return null;
        }
        try {
            return FileLocator.toFileURL(url);
        } catch (Exception e) {
            throw new RunException(e);
        }
    }

    private static String getFilePath(String filePath) {
        if (filePath != null && filePath.length() > 0) {
            if (filePath.startsWith("/")) {
                filePath = filePath.substring(1);
            }
        }
        return filePath;
    }

    public static String test() {
        StringBuffer sb = new StringBuffer();
        sb.append("--------------------Start TestUtil--------------------" + "\r\n");
        // String installPath = TestUtil.getInstallPath();
        // sb.append("getInstallPath: " + installPath + "\r\n");
        sb.append("--------------------Start RCPPath--------------------" + "\r\n");
        // sb.append("bundle: " + bundle + "\r\n");
        sb.append("INSTALL_URL: " + INSTALL_URL + "\r\n");
        sb.append("INSTALL_PATH: " + INSTALL_PATH + "\r\n");
        sb.append("PRODUCT_URL: " + PRODUCT_URL + "\r\n");
        sb.append("WORKSPACE_URL: " + WORKSPACE_URL + "\r\n");
        sb.append("WORKSPACE_PATH: " + WORKSPACE_PATH + "\r\n");
        sb.append("CONFIGURATION_PATH: " + CONFIGURATION_PATH + "\r\n");
        sb.append("LOG_FILE: " + LOG_FILE + "\r\n");
        // sb.append("getPluginPath: " + getPluginPath() + "\r\n");
        sb.append("getInstallPath: " + getInstallPath() + "\r\n");
        sb.append("getUserHomePath: " + getUserHome() + "\r\n");
        sb.append("getDesktopPath:" + getDesktopPath() + "\r\n");
        sb.append("getDocumentsPath:" + getDocumentsPath() + "\r\n");
        sb.append("getUserDirPath: " + getUserDir() + "\r\n");

        // sb.append("getStatePath: " + getStateLocation() + "\r\n");
        sb.append("getWorkspacePath: " + getWorkspacePath() + "\r\n");
        sb.append("getConfigurationRootPath: " + getConfigurationPath() + "\r\n");
        sb.append("getLogFileRoot: " + getLogFile() + "\r\n");

        String pId = "cn.elwy.common";
        sb.append("getResourceFile('/'): " + getPluginResourceFile(pId, "/") + "\r\n");
        sb.append("getResourceFile('../'): " + getPluginResourceFile(pId, "../") + "\r\n");
        sb.append("getResourceFile('/src/'): " + getPluginResourceFile(pId, "/src/") + "\r\n");
        sb.append("getResourceFile('notexist/'): " + getPluginResourceFile(pId, "/notexist/") + "\r\n");
        sb.append("getResourceFile('plugin.xml'): " + getPluginResourceFile(pId, "plugin.xml") + "\r\n");

        sb.append("getResourceFile('/'): " + getResourceFile("/") + "\r\n");
        sb.append("getResourceFile('../'): " + getResourceFile("../") + "\r\n");
        sb.append("getResourceFile('/src/'): " + getResourceFile("/src/") + "\r\n");
        sb.append("getResourceFile('theme/'): " + getResourceFile("theme/") + "\r\n");
        sb.append("getResourceFile('notexist/'): " + getResourceFile("/notexist/") + "\r\n");
        sb.append("getResourceFile('icons'): " + getResourceFile("icons") + "\r\n");
        sb.append("getResourceFile('/content/root.css'): " + getResourceFile("/content/root.css") + "\r\n");
        sb.append("getResourceFile('plugin.xml'): " + getResourceFile("plugin.xml") + "\r\n");
        // sb.append("getClassPath: " + getClassPath(BundlePathUtil.class)+ "\r\n");
        // sb.append("getClassPath(com): " + getResourceFile(BundlePathUtil.class, "com")+ "\r\n");
        // sb.append("getClassPath(/com/): " + getResourceFile(BundlePathUtil.class, "/com/")+ "\r\n");
        // sb.append("getClassPath(../com): " + getResourceFile(BundlePathUtil.class, "../com")+ "\r\n");
        // sb.append("getClassPath(../conf): " + getResourceFile(BundlePathUtil.class, "../conf")+ "\r\n");
        sb.append("--------------------End RCPPath--------------------" + "\r\n");

        return sb.toString();
    }

}




你可能感兴趣的:(Java,eclipse,SWT/JFace,RCP)