此文说明org.eclipse.core.runtime下的几个常用类,他们为插件开发提供了便捷的方法. *Assert,参数校验 ---在插件开发中,经常需要对参数做校验,如NullPointer...
此文说明org.eclipse.core.runtime下的几个常用类,他们为插件开发提供了便捷的方法.
*Assert,参数校验
---在插件开发中,经常需要对参数做校验,如NullPointerException,IllegalArgumentException异常等.一般的代码方式如if(arg==null) throw new RuntimeException("msg").
简化这类代码的方式使用org.eclipse.core.runtime.Assert,如上改写成Assert.isNotNull(arg,"msg").
---org.eclipse.jface.util.Assert与runtime中的Assert功能一样,只是被废弃了.
---和java的assert关键字不同在于,java的assert抛出Error异常.
*Path,处理文件路径,绝对或相对路径
---fromOSString和new Path(pathString);
构造path;并且在windows操作符时,若pathString有'\\',则转换为'/';
---String getFileExtension(),文件后缀
---File toFile(),转换为文件
Path方法测试//在xp下测试代码
Path path =new Path("D:\\lx\\TestLocale.java");
System.out.println(path.toOSString()); //D:\lx\TestLocale.java
System.out.println(path.toPortableString()); //D:/lx/TestLocale.java
System.out.println(path.segment(0)); //lx
System.out.println(path.segment(1)); //TestLocale.java
System.out.println(path.isAbsolute()); //true
System.out.println(path.isRoot()); //false
System.out.println(path.isUNC()); //false
System.out.println(path.getFileExtension()); //java
System.out.println(path.getDevice()); //D:
System.out.println(path.makeRelative().toOSString()); //D:lx\TestLocale.java
System.out.println(path.makeAbsolute().toOSString()); //D:\lx\TestLocale.java
System.out.println(path.removeLastSegments(1).toOSString()); //D:\lx
System.out.println(path.removeFirstSegments(1).toOSString()); //D:TestLocale.java
Path path =new Path("home/dzh/lx/TestLocale.java");
System.out.println(path.toOSString()); //home\dzh\lx\TestLocale.java
System.out.println(path.toPortableString()); //home/dzh/lx/TestLocale.java
System.out.println(path.segment(0)); //home
System.out.println(path.segment(1)); //dzh
System.out.println(path.isAbsolute()); //false
System.out.println(path.isRoot()); //false
System.out.println(path.isUNC()); //false
System.out.println(path.getFileExtension()); //java
System.out.println(path.getDevice()); //null
System.out.println(path.makeRelative().toOSString()); //home\dzh\lx\TestLocale.java
System.out.println(path.makeAbsolute().toOSString()); //\home\dzh\lx\TestLocale.java
System.out.println(path.removeLastSegments(2).toOSString()); //home\dzh
System.out.println(path.removeFirstSegments(2).toOSString()); //lx\TestLocale.java
*FileLocator,查找bundle中的文件
---File getBundleFile(Bundle bundle),获取bundle文件
getBundleFile源码public static File getBundleFile(Bundle bundle) throws IOException {
URL rootEntry = bundle.getEntry("/"); //$NON-NLS-1$
rootEntry = resolve(rootEntry); //利用resolve协议转换
if ("file".equals(rootEntry.getProtocol())) //$NON-NLS-1$
return new File(rootEntry.getPath());
if ("jar".equals(rootEntry.getProtocol())) { //$NON-NLS-1$
String path = rootEntry.getPath();
if (path.startsWith("file:")) {
// strip off the file: and the !/
path = path.substring(5, path.length() - 2);
return new File(path);
}
}
throw new IOException("Unknown protocol"); //$NON-NLS-1$
}
这里提供了一种获取bundle内文件的方法:url =bundle.getEntry()—>url =resolve(url)--->new File(url.getPath()).
---URL find(Bundle bundle, IPath path, Map override),返回bundle中内容的url,协议bundleentry
path是相对bundle的Path,如new Path("META-INF/MANIFEST.MF");支持一些特殊标识使用,
$nl$ - for language specific information
$os$ - for operating system specific information
$ws$ - for windowing system specific information
如new Path("$nl$/plugin.properties"),特殊标识的含义请见注释说明.
override的作用如其名用于替换默认的环境信息;在overriade=null或没有这个特殊标志定义时,对前面的特殊标志解释采用默认环境的设置,否则overrdie中记录的信息优先级高于默认值.
注意:
a.查询范围是bundle和bundle的所有fragment.
---URL[] findEntries(Bundle bundle, IPath path, Map override)
从bundle和它的fragment中查找对应的path,并返回url.
---InputStream openStream(Bundle bundle, IPath file, boolean substituteArgs)
获取bundle中对应文件的InputSteam.
substituteArgs为true表示支持特殊标识,false则表示不支持特殊标识.
从源码看
openStream源码public static final InputStream openStream(Bundle bundle, IPath file, boolean substituteArgs) throws IOException {
URL url = null;
if (!substituteArgs) {
url = findInPlugin(bundle, file, null);
if (url == null)
url = findInFragments(bundle, file, null);
} else {
url = FindSupport.find(bundle, file);
}
if (url != null)
return url.openStream();
throw new IOException("Cannot find " + file.toString()); //$NON-NLS-1$
}
---URL resolve(URL url)和URL toFileURL(URL url),协议转换
2者利用URLConverter服务实现将bundleentry:之类转换为file:等格式,转换后就可将此url作为其他类的参数了,如File(url.getPath());
osgi的URLConverter服务还没研究过,暂不论.