在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();
}
}