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

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

版权说明

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

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

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

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

7.包管理服务规范

版本号: 1.2

7.1简介

bundle可以将包提供给其他bundle。这种导出建立了导出包的bundle和使用导出包的bundle之间的依赖关系。当对导出包的bundle进行卸载或者更新,那么需要对它共享的包进行决策处理。

Package Admin服务给管理代理提供了这种决策的接口。

7.1.1.要点

●信息(Information) – 包管理服务必须提供所有包的共享状态信息。包括importerbundle和exporterbundle的信息。

●策略(Policy) – 当对bundle进行更新和卸载时,包管理服务必须要允许管理代理通过策略来共享包。

●最小更新(Minimal update) – 当强制刷新包时,只有依赖于这个包的bundle才会重新启动。

7.1.2.名词

●PackageAdmin – 对框架共享包进行访问的接口。

●ExportedPackage – 提供包信息和它的共享状态的接口。

●RequiredBundle – 提供了对需求bundle的绑定信息的接口。

●管理代理(Management Agent) – 操作者提供的bundle,实现了操作者指定的策略。

7.1.3.操作

框架的系统bundle应该为管理代理提供了包管理服务。包管理服务必须要由系统bundle注册在接口org.osgi.service.packageadmin.PackageAdmin之下。它必须提供对框架中包共享、片断以及需求的bundle的内部结构进行访问的机制。这是一个可选的单态模式的服务,因此,在任何时候,最多只能有一个包管理服务。

框架必须要保证卸载或者更新后的bundle导出的包的共享完整性。管理代理则可以通过包管理服务来强制框架刷新这些包。可以采用一直使用安装的bundle最近导出的包这样一种策略,这种策略的实现可以通过管理代理监听框架关于卸载或者更新bundle的事件,如果发生了这样的事件,则通过包管理服务对这些bundle的包进行更新。

7.2包管理

通过包管理服务服务允许管理代理定义包共享的管理策略。提供了共享包状态的检测,并允许管理代理来刷新包并在必要情况下停止或者重启bundle。

7.2.1.包共享

在类PackageAdmin中提供了以下方法: ●getExportedPackage(String) – 返回一个提供了请求包信息的导出包。可以用这些信息来确定对包的更新。

●getExportedPackages(Bundle) – 返回指定的bundle导出的包列表。

●refreshPackages(Bundle[]) – 管理代理通过调用这个方法来刷新指定bundle的所有导出包。实际上这个过程是异步进行的。当所有的包的刷新完毕之后,框架发送一个Framework.PACKAGES_REFRESHED 信号。

●resolveBundle(Bundle[]) –框架尝试解析指定的bundle。

7.2.2.Bundle信息

在框架的API中,只有通过Bundle接口,bundle才可以在框架中扮演不同角色。包管理服务提供了对这种结构信息的访问。 ●getBundle(Class) – 返回指定类的加载器所在的bundle。

●getBundle(String,String) – 通过指定的bundle符号名称和版本标记来查找符合条件的所有bundle。如果版本标记为null值,那么返回所有符号名称为指定值的bundle。

●getBundleType(Bundle) – 返回bundle的类型。这是位类型的,定义了如下类型:
●resolveBundle(Bundle[]) –框架尝试解析指定的bundle。

7.2.3.片断和需求的bundle

包管理服务提供了对由需求bundle和附主片断组成的网状结构的访问。 ●getFragments(Bundle) – 返回以片断形式附加到指定bundle的所有bundle的列表。如果没有附加的片断,则返回null值。

●getHosts(Bundle) – 返回指定片断bundle的附主bundle。参数中的bundle必须要是一个bundle片断,否则返回null值。

●getRequiredBundle(String) – 返回和指定名称匹配的RequiredBundle对象的数组列表,如果给定名称为null值则返回所有的RequiredBundle对象。RequiredBundle对象提供了一个需求bundle的结构信息。

7.2.4.导出包

对象ExportedPackage提供了共享包的信息。这些对象提供了导入导出包的bundle的详细信息。管理代理可以使用这些信息进行决策。

7.2.5.更新包和启动级别服务

当调用方法refreshPackages(Bundle[])时,bundle可能会停止运行并随后再启动。如果存在启动级别服务,那么启动bundle必须不能违背启动级别的约束。这也就是说具有更高的启动级别的bundle必须要在具有较低启动级别的bundle停止之前停止运行。同理,在较低启动级别的bundle都启动完成之前,不能启动高层bundle。参阅启动顺序一节。

7.3安全

包管理服务是一个很容易就造成滥用的系统服务,这是由于它提供了对框架内部结构的访问。很多bundle都有权限: ServicePermission[org.osgi.service.packageadmin.PackageAdmin, GET]

这是由于对于调用改变框架环境的任何方法都必须要有权限: AdminPermission[System Bundle,RESOLVE]

而bundle都不一定要有权限: ServicePermission [org.osgi.service.packageadmin.PackageAdmin,REGISTER]

因为只有框架本身才应该注册这样的系统服务。

这个服务是由管理代理来使用的。

7.4更改

包管理实现了在模块层介绍的新特性:

●getExportedPackages(String) – 提供了通过名称来访问导出包。

●resolveBundle(Bundle[]) – 强制解析一系列的bundle。

●getFragments(Bundle) –返回和指定bundle相关的片断。

●getHosts(Bundle) – 返回指定bundle的附主。

●getRequiredBundle(String) – 返回指定符号名称的RequiredBundle 对象组。

●getBundle(String,String) – 返回指定符号名称和版本标记的bundle。

●getBundleType(Bundle) – 返回bundle的类型;目前只支持类型为片断的情况。

7.5.org.osgi.service.packageadmin

OSGi包管理包,规范版本为1.2。

如果bundle需要使用这些包,那么在它的manifest中的Import-Package必须要列出使用的包名称,例如:

Import-Package: org.osgi.service.packageadmin; version=1.2

7.5.1.概要

●ExportedPackage – 一个导出包。[p.188]

●PackageAdmin – 框架服务,允许bundle开发人员来检查框架中bundle的包连接状态,也包括和bundle之间的类加载网络相关的功能。[p.190]

●RequiredBundle – 一个需求bundle。[p.193]

7.5.2.public interface ExportedPackage

一个导出包。实现了这个接口的类由包管理服务来创建对象。

术语exported package表示从一个解析的bundle中导出的包。这个包不一定和其他bundle建立了连接。

由这个对象提供的导出包的信息是可以修改的。如果ExportedPackage所引用的包由于调用PackageAdmin的refreshPackages方法之后进行了更新或者移除,那么这个ExportedPackage就变成一个过期的对象。如果这个对象过期了,那么它的getName()和getVersion()方法继续返回正常的值,isRemovalPending()方法返回true,getExportingBundle() 方法和 getImportingBundle()方法返回null值。

7.5.2.1.public Bundle getExportingBundle( )

返回和这个导出包相关的包的导出bundle
Returns 导出bundle,或者如果当前的ExportedPackage对象过期,则返回null值

7.5.2.2.public Bundle[] getImportingBundle( )

返回和这个导出包建立了连接的所有解析了的bundle数组。在此假定如果一个bundle需要与导出包关联的导出bundle,那么这个bundle是连接到了返回的值bundle的导出包。参阅方法RequiredBundle.getRequiringBundle()。
Returns 和当前导出包建立了连接的的已经解析的bundle数组,或者如果当前的ExportedPackage对象过期,则返回null值

7.5.2.3.public String getName( )

返回和这个导出包相关的包的名称
Returns 导出包的名称

7.5.2.4.public String getSpecificationVersion( )

返回导出包的版本
Returns 导出包的版本,如果没有版本信息则返回null值。
Deprecated 从1.2后已过时。由方法getVersion代替

7.5.2.5.public Version getVersion( )

返回导出包的版本
Returns 导出包的版本,如果没有版本信息则返回Version.emptyVersion值。
Since 1.2

7.5.2.6.public boolean isRemovalPending( )

如果这个ExportedPackage对象关联的包由一个已经更新或者卸载的bundle导出,则返回true
Returns 如果这个ExportedPackage对象关联的包由一个已经更新或者卸载的bundle导出,或者ExportedPackage对象已经过期,返回true;否则返回false。
查看评论