OSGi R4服务平台核心规范 :第七章 包管理服务规范(2)

 由  满江红开放技术研究组织 发布

版权说明

本文档版权归原作译者所有。 在免费、且无任何附加条件的前提下,可在网络媒体中自由传播。

如需部分或者全文引用,请事先征求作译者意见。

如果本文对您有些许帮助,表达谢意的最好方式,是将您发现的问题和文档改进意见及时反馈给作者。当然,倘若有时间和能力,能为技术群体无偿贡献自己的所学为最好的回馈。

本文档可从http://www.redsaga.com获取最新更新信息

7.5.3.public interface PackageAdmin

这个接口是一个框架服务,允许bunlde的开发人员审查框架中bundle的连接状态,同时提供了bundle之间的类加载网络的相关功能。

目前,只能允许有一个PackageAdmin的实例对象注册到框架。

更多信息可以参考 org.osgi.service.packageadmin.ExportedPackage[p.188]

org.osgi.service.packageadmin.RequiredBundle[p.193]

7.5.3.1.public static final int BUNDLETYPEFRAGMENT = 1

标志bundle的类型,描述bundle是否为一个片断bundle。
BUNDLE_TYPE_FRAGMENT的值为0x00000001。
since 1.2

7.5.3.2.public Bundle getBundle( Class clazz )

clazz 用于定位bundle的Class对象
返回加载指定类的bundle。返回的bundle必须使用了类加载器来加载指定的Class对象。如果指定的Class对象还没有被加载,则返回null值。
Returns 加载指定的类的bundle;如果指定类没有由任何bundle的类加载器加载,则返回null值。
since 1.2

7.5.3.3.public Bundle[] getBundle( String symbolicName, String versionRange )

symbolicName 需要的bundle的符号名称
versionRange 需要的bundle的版本范围,或者如果是所有版本则为null值
返回指定符号名称而且版本标记在指定的版本范围之内的bundle数组。如果没有安装指定的符号名称的bundle,那么返回null值。如果指定了版本范围,那么只返回符号名称一致并且版本标记在指定的版本范围之内的bundle。返回的bundle按照版本大小逆序排列,这样返回的第一个值具有最大的版本编号。
Returns 符合如下条件的bundle数组:和指定的名称匹配,并且在指定的版本范围之内,按照版本大小逆序排列。如果没有找到符合条件的bundle,返回null值。
See Also org.osgi.framework.Constants.BUNDLE_VERSION_ATTRIBUTE
since 1.2

7.5.3.4.public int getBundleType( Bundle bundle )

bundle 需要返回类型的bundle
返回指定bundle的特殊类型,bundle类型的值为 ●BUNDLE_TYPE_FRAGMENT
如果bundle的类型不是上述值,那么返回0x00000000
Returns bundle的类型
since 1.2

7.5.3.5.public ExportedPackage getExportedPackage( String name )

name 返回的导出包的名称
通过指定包名称来获得导出包。如果存在多个符合条件的导出包,那么返回具有最大版本标号的导出包。
Returns 导出包;如果没有指定名称的导出包,则返回null值。
See Also getExportedPackages(String)

7.5.3.6.public ExportedPackage getExportedPackage( String name )

bundle 返回的导出包所属的bundle,如果返回所有的导出包,则这个参数值为null。如果指定的是系统bundle(也就是说指定bundle的ID为0),那么这个方法返回由这个系统bundle所导出的所有包。返回值中也包括了通过系统属性org.osgi.framework.system.packages指定的包以及其他框架实现导出的包。
获取指定bundle的导出包。
Returns 导出包的数组,或者如果指定bundle没有导出包则返回null值。

7.5.3.7.public ExportedPackage[] getExportedPackages( String name )

name 返回的导出包的名称
通过指定包名称获得导出包
Returns 导出包数组;或者如果不存在指定名称的导出包,返回null值。
Since 1.2

7.5.3.8.public Bundle[] getFragments( Bundle bundle )

bundle 返回的片断所附加的附主bundle
返回指定bundle所附加的片断bundle数组。如果指定的bundle是一个片断,那么返回null值。如果没有片断附加在指定bundle之上,那么返回null值。这个方法并不会去尝试解析bundle,如果还没有解析指定bundle,那么返回null值。
Returns 指定bundle上附加的片断;如果bundle上没有附加片断或者指定bundle还没有解析,那么返回null值。
Since 1.2

7.5.3.9.public Bundle[] getHosts( Bundle bundle )

bundle 待返回其附主的bundle
指定片断所附加的附主bundle数组,如果指定bundle没有附加到其他bundle,或者指定bundle不是一个片断,那么返回null值。同时片断有可能只附加到一个bundle之上。
Returns 一个包含了附主bundle的数组;如果指定bundle没有附主,返回null
Since 1.2

7.5.3.10.public RequiredBundle[] getRequiredBundle( String symbolicName )

symbolicName bundle的符号名称或者null值来返回所有需求的bundle
返回指定符号名称的需求bundle数组,如果指定null,返回所有的需求bundle
Returns 需求bundle数组;或者如果不存在指定名称的需求bundle则返回null值
Since 1.2

7.5.3.11.public RequiredBundle[] getRequiredBundle( String symbolicName )

bundle 待更新或者移除导出包的bundle,或者是null值表示所有自从上次调用本方法之后更新或者卸载了的bundle。
强制更新(代替)或者移除制定bundle的导出包。
如果没有指定bundle,本方法将对自从上次调用该方法之后进行了更新或者卸载的bundle的导出包进行更新或者移除。不同的框架实现也许所实现的技术会不一样。一种允许的实现就是停止并重启框架。
这个方法会立即返回给调用者,并且在另外的线程中执行以下步骤:
1.从指定bundle开始计算一个bundle的集合。如果没有指定bundle,那么就从上次调用本方法后更新或者卸载了的bundle开始计算。如果任何bundle和集合中的bundle的包有连接(wired),那么就将此bundle添加到当前集合。如果没有任何bundle和集合中的包有连接,那么就完成了集合的构建。在集合中,可能还包括了已经卸载了但是还导出包的bundle。
2.通过调用Bundle.stop方法停止集合中处于ACTIVE状态的bundle。
3.集合中处于RESOLVED状态的bundle是未解析的,状态转为INSTALLED状态。这个步骤的目的是使集合中不存在RESOLVED状态的bundle。
4.移除集合中处于UNINSTALLED状态的bundle,并从框架中完全删除。
5.调用Bundle.start方法启动在原来步骤2中处于ACTIVE状态的bundle,使得重启bundle所需求的bundle得到解析。由于上述步骤的操作,可能导致的结果就是,原来导出的包已经改变了。因此,一些bundle可能会保持未解析直到其他的bundle提供了合适的导出包安装在框架中。
6.发出框架事件:FrameworkEvent.PACKAGES_REFRESHED。
对于上述步骤中所抛出的任何异常,框架产生一个类型ERROR的框架事件。产生这些事件的源bundle也是这个框架事件所指定的bundle。如果没有指定bundle,那么就使用SystemBundle作为源bundle。
Returns 需求bundle数组;或者如果不存在指定名称的需求bundle则返回null值
Throws SecurityException — 如果Java允许环境支持权限而调用者没有权限:AdminPermission[SystemBundle, RESOLVE]

7.5.3.12.public boolean resolveBundle( Bundle[] bundle )

bundle 待解析的bundle,如果为null表示在框架中安装的所有未解析的bundle。
解析指定bundle。框架尝试解析指定的未解析的bundle。这个方法的调用可能会导致并不包含在指定bundle数组中的bundle得到解析。这个方法的一个可行实现就是解析框架中所有未解析的bundle。
如果参数指定为null值,那么框架尝试解析所有未解析bundle。这个方法的调用绝不能导致任何bundle的刷新、停止或启动。所有操作完成才能返回
Returns 如果所有指定的bundle都得到解析,返回true。
Throws SecurityException —如果Java允许环境支持权限而调用者没有权限:AdminPermission[SystemBundle, RESOLVE]
Since 1.2

7.5.4.public interface RequiredBundle

需求bundle。实现了这个接口的类对象由包管理服务创建。
术语需求bundle(required bundle)是指一个已经解析的了带有符号名称的bundle而不是一个片断。也就是,一个bundle可能被其他bundle所需要,而当前这个bundle不一定被其他bundle所需要。
这个对象所提供的的需求bundle的信息可能会改变。如果一个RequiredBundle对象所引用的bundle的一个导出包通过调用PackageAdmin.refreshPackages()方法进行了更新或者移除,那么这个RequiredBundle对象就成为一个过期对象。如果对象已经过期,那么它的getSymbolicName()方法和getVersion()方法可以返回正常值,而方法isRemovalPending()返回true,getBundle()和getRequiringBundle()方法返回null值。
Since 1.2

7.5.4.1.public Bundle getBundle( )####

返回这个需求bundle所关联的bundle。
Returns 该bundle,或者如果这个RequiredBundle对象过期,返回null值

7.5.4.2.public Bundle[] getRequiringBundle( )

返回需要当前需求bundle的所有bundle的数组。
如果一个bundle需要当前需求bundle,然后其他bundle重新导出了这个需求bundle,那么对于所有对重新导出bundle有需求的bundle都包括的返回数组中。
Returns 需要当前需求bundle的bundle数组,或者如果当前RequiredBundle对象过期,返回null值

7.5.4.3.public String getSymbolicName( )

返回需求bundle的符号名称
Returns 需求bundle的符号名称

7.5.4.4.public Version getVersion( )

需求bundle的版本。
Returns 需求bundle的版本。
如果没有可用的版本信息,返回Version.emptyVersion。

7.5.4.5.public boolean isRemovalPending( )

如果RequiredBundle对象关联的bundle已经更新或者卸载,那么返回true。
Returns 返回true,如果需求bundle已经更新或者卸载,或者RequiredBundle对象已经过期。
其他情况则返回false。
查看评论