• osgi规范的核心代码,提供了众多接口和类实现

org.osgi.framework

  • 核心实现

Interface(接口)

Bundle(Bundle 相关)

  • 一个已安装的Bundle具有的行为
  • 被BundleImple实现
  • Activation Policy
    • Bundle的启动策略,通过autostart设置
      1. Stopped:不可被启动
      1. Started with eager activation:启动后立即被激活
      1. Start with declared activation:启动后,第一个类加载时被激活
  • 11种状态(变量)
      1. ACTIVE:Bundle正在运行
      1. INSTALLED:Bundle已经被安装,但还没有被解析
      1. RESOLVED:Bundle已经被解析,但还没有被启动
      1. SIGNERS_ALL:请求返回所有用于注册该Bundle的证书
      1. SIGNERS_TRUSTED:请求只返回用于注册该Bundle、且被框架信任的证书
      1. START_ACTIVATION_POLICY:启动该Bundle,并设置其启动策略为Start with declared activation
      1. START_TRANSIENT:启动该Bundle,但不修改其启动策略
      1. STARTING:该Bundle正在启动
      1. STOP_TRANSIENT:停止该Bundle,但不修改其启动策略
      1. STOPPING:该Bundle正在停止
      1. UNINSTALLED:该Bundle已经被卸载

BundleActivator(Bundle 相关)

  • 自定义Bundle的启动与停止
  • 要在Bundle的Manifest的header中指定,一个Bundle只能指定一个BundleActivator
  • 提供start和stop方法
    • start方法在该Bundle被启动时(starting)调用
    • stop方法在该Bundle被停止时(stopping)调用

BundleContext(Bundle 相关)

  • 一个Bundle在框架中的执行上下文
  • 上下用于授权访问其他方法,使得Bundle可以和框架交互
  • 提供的功能:
      1. 订阅框架发布的事件
      1. 注册服务对象
      1. 获取服务的引用
      1. 获取和释放引用对象
      1. 在框架中安装新的Bundle
      1. 获取框架中已安装的Bundle的列表
      1. 获取Bundle对象
      1. 对于框架为Bundle提供的持久性存储区域中的文件,为其创建问价对象
  • 作为BundleActivator.start和BundleActivator.stop的参数
  • BundleContext对象是单个Bundle专有的,不是多个Bundle共享的
  • 被BundleContextImpl实现

BundleListener(Bundle 相关)

  • BundleEvent的监听器
  • 触发BundleEvent时,BundleEvent被异步传输给BundleListener
  • 框架按顺序将BundleEvent传输给BundleListener
  • 被SynchronousBundleListener继承

SynchronousBundleListener(Bundle 相关)

  • 同步处理,即 Bundle 的生命周期处理中必须同步的处理完监听器后,才可以执行其它操作。

BundleReference(Bundle 相关)

  • Bundle的引用
  • 子接口
      1. BundleContext
      1. BundleRevision
      1. BundleRevisions
      1. BundleStartLevel
      1. BundleWiring
      1. FrameworkStartLevel
      1. FrameworkWiring
      1. ServiceReference<S>

ServiceReference(服务相关)

  • 服务的引用
  • 继承BundleReference
  • 框架从BundleContext.getServiceReference和BundleContext.getServiceReferences方法返回ServiceReference对象
  • 一个ServiceReference对象可以被多个Bundle共享,用以获取service的属性和service对象
  • 在框架中注册的每个service,都有唯一的ServiceRegistration对象,但可能拥有多个可区分的ServiceReference对象指向它
  • 提供的功能:
      1. 获取服务的属性
      1. 获取所有属性的键
      1. 获取注册该服务的Bundle
      1. 获取通过这个ServiceReference使用该服务的Bundle
      1. 判断当前ServiceReference对应的服务的Bundle,与指定的Bundle是否使用相同的包
      1. 比较两个ServiceReference

ServiceRegistration(服务相关)

  • 表示一个已经注册的服务
  • 当BundleContext.registerService方法被调用成功时,框架返回一个ServiceRegistration对象
  • ServiceRegistration对象应被要注册的Bundle私有使用,不能被其他Bundle共享
  • ServiceRegistration对象被用于更新服务属性和注销服务
  • 提供的功能:
      1. 获取该服务的引用
      1. 设置服务的属性
      1. 卸载服务

ServiceFactory(服务相关)

  • 工厂模式
  • 一个面向Bundle范围的服务
  • 提供两个方法:
      1. getService
      1. ungetService
  • 当注册一个服务时,可以用ServiceFactory对象替代Service对象,使得Bundle开发者可以为使用该服务的Bundle创建一个定制化的Service对象
  • 当一个Bundle请求一个Service对象,框架会调用getService方法返回一个Service对象给该Bundle
  • 这个返回的Service对象会被框架缓存直到该Bundle释放该服务,用于后续的对BundleContext.getService(ServiceReference)的调用
  • 当该Bundle对该服务的引用计数为0时,框架会调用ungetService方法
  • ServiceFactory对象只会被框架调用
  • 接口的实现:
    • notion image

ServiceListener(服务相关)

  • 被开发者实现的接口
  • ServiceEvent被触发时会被框架乱序传递(同步)给ServiceListener
  • 可根据包来源过滤ServiceEvent

AllServiceListener(服务相关)

  • 继承了ServiceListener接口
  • 不进行条件过滤

Class(类)

BundleEvent(Bundle 相关)

  • 框架中的事件,描述Bundle生命周期的变更
  • 异步传输
  • Bundle生命周期的类型
      1. INSTALLED:已安装
      1. STARTED:已启动
      1. STOPPED:已停止
      1. UPDATED:已更新
      1. UNINSTALLED:已卸载
      1. RESOLVED:已解析
      1. UNRESOLVED:未解析
      1. STARTING:正在启动
      1. STOPPING:正在停止
      1. LAZY_ACTIVATION:将被晚激活
  • 提供的功能:
      1. 创建一个指定类型的生命周期事件
      1. 获取生命周期发生变化的Bundle,即该事件的触发源
      1. 获取该生命周期事件的类型
      1. 获取该事件中的原始Bundle

ServiceEvent(服务相关)

  • 一个来自框架的事件,描述一个服务的生命周期的变化
  • 一个服务的生命周期发生变化时, ServiceEvent对象被传递给ServiceListeners和AllServiceListeners(同步传输)
  • 类型码(TypeCode)被用于标识一个事件的类型,以实现可扩展性

按文件描述(LiGuangChao分析总结)

AdminPermission.java

Class AdminPermission

一个包执行特定的特权管理操作或获得关于一个包的敏感信息的权限。此权限的操作是:
  • Class调用Bundle.loadClass
  • Execute调用
    • Bundle.start
    • Bundle.stop
    • BundleStartLevel.setStartLevel
  • extensionLifecycle调用
    • BundleContext.installBundle for extension bundles
    • Bundle.update for extension bundles
    • Bundle.uninstall for extension bundles
  • Lifecycle调用
    • BundleContext.installBundle
    • Bundle.update
    • Bundle.uninstall
  • listener 调用
    • BundleContext.addBundleListener for SynchronousBundleListener
    • BundleContext.removeBundleListener for SynchronousBundleListener
  • Metadata调用Bundle.getHeaders、Bundle.getLocation
  • Resolve调用FrameworkWiring.refreshBundles、FrameworkWiring.resolveBundles
  • Resource调用
    • Bundle.getResource
    • Bundle.getResources
    • Bundle.getEntry
    • Bundle.getEntryPaths
    • Bundle.findEntries
    • Bundle resource/entry URL creation
  • Startlevel调用FrameworkStartLevel.setStartLevel、FrameworkStartLevel.setInitialBundleStartLevel
  • Context调用Bundle.getBundleContext
  • Weave调用 
    • WovenClass.getBytes
    • WovenClass.setBytes
    • WovenClass.getDynamicImports for modification
  • 操作字符串:CLASS、CONTEXT 、EXECUTE、EXTENSIONLIFECYCLE、LIFECYCLE、LISTENER、METADATA、RESOLVE、RESOURCE、STARTLEVEL、WEAVE
  • AdminPermission();创建一个新的AdminPermission对象,它匹配所有bundle并具有所有操作。
  • AdminPermission(Bundle bundle, java.lang.String actions);创建一个新的被请求的AdminPermission对象,由必须执行checkPermission的代码使用。
  • AdminPermission(java.lang.String filter, java.lang.String actions);创建一个新的AdminPermission对象。
  • private static String createName(Bundle bundle);从一个Bundle中创建一个权限名,返回权限名字。
  • private void setTransients(Filter filter, int mask);由构造函数调用,并在反序列化时 调用。
  • private static int parseActions(String actions);将操作字符串解析为操作掩码;
  • private static Filter parseFilter(String filterString);将筛选器字符串解析为filter对象。
  • public boolean implies(Permission p);确定指定的权限是否由该对象隐含。这方法如果指定的权限不是,则抛出异常用一个bundle构造。P是所请求的权限。
  • boolean implies0(AdminPermission requested, int effective);内部暗示方法。由the   implies和the permission使用集合意味着方法。
  • public int hashCode();返回此对象的哈希码值。
  • private synchronized void writeObject(java.io.ObjectOutputStream s);调用WriteObject将此权限对象的状态保存到流。操作是序列化的,超类负责处理的名字。
  • private synchronized void readObject(java.io.ObjectInputStream s);对象中恢复此权限的状态流。
  • private Dictionary getProperties();方法加载一个字典这个bundle的过滤匹配属性。字典是这样缓存的这个查找只发生一次这个方法应该只在AdminPermission上调用用一个bundle构造。

Class AdminPermissionCollection

  • 存储一个AdminPermissions的集合。
  • public void add(Permission permission);向此权限集合添加权限。
  • public synchronized Enumeration elements();对象中的所有AdminPermission对象 的枚举容器。

Constants.java

  • 为OSGi环境系统属性、服务定义标准名称属性和Manifest头属性键。

FrameworkEvent.java

  • 框架的普通事件,它是一个异步事件。
  • private final Bundle bundle; 与事件相关的Bundle。
  • private final Throwable throwable;与事件相关的异常。
  • private final int type;事件的类型。
  • public final static int STARTED = 0x00000001; 框架已经启动。
  • public final static int ERROR = 0x00000002; 发生了一个错误。
  • public final static int PACKAGES_REFRESHED = 0x00000004;
  • PackageAdmin.refreshPackage操作已完成。当框架完成刷新包时触发此事件
  • 操作由调用PackageAdmin发起PackageAdmin.refreshPackages方法。
  • public final static int STARTLEVEL_CHANGED = 0x00000008;
  • StartLevel.setStartLevel操作已完成。当框架完成更改活动时,将触发此事件
  • StartLevel调用发起的Start level.setStartLevel方法。
  • public final static int WARNING = 0x00000010; 发生了警告。
  • public final static int INFO = 0x00000020; 已发生信息事件。
  • public final static int STOPPED = 0x00000040; 框架已经停止。当框架因停止而停止时,将触发此事件操作系统捆绑。
  • public final static int STOPPED_UPDATE = 0x00000080; 框架在更新期间已停止。
  • public final static int STOPPED_BOOTCLASSPATH_MODIFIED = 0x00000100; 框架已经停止,引导类路径已经更改。
  • public static int WAIT_TIMEOUT = 0x00000200; 框架在等待超时之前没有停止。
  • public FrameworkEvent(int type, Object source)创建一个框架事件
  • public FrameworkEvent(int type, Bundle bundle, Throwable throwable)根据特定的Boundle创建事件
  • public Throwable getThrowable()换回和事件相关的异常
  • public Bundle getBundle()返回和事件相关的Boundle
  • public int getType()返回事件的类型

FrameworkListener.java

  • 框架的监听器
  • public void frameworkEvent(FrameworkEvent event); 接收一个通用的FrameworkEvent对象的通知。

FrameworkUtil.java

  • private FrameworkUtil() {}
  • public static Filter createFilter(String filter)throws InvalidSyntaxException创建一个过滤器

PackagePermission.java

CLASS PackagePermission

  • 包导入或导出包的权限。
  • 操作字符串:EXPORT、EXPORTONLY、IMPORT。
  • public PackagePermission(String name, String actions);创建一个新的
  • PackagePermission对象。
  • public PackagePermission(String name, Bundle exportingBundle, String actions);创建一个新的被请求使用的PackagePermission对象。
  • PackagePermission(String name, int mask);PackagePermissionCollection使用的包私有构造函数。
  • private void setTransients(String name, int mask);由构造函数调用,并在反序列化时调用。
  • private static int parseActions(String actions);将操作字符串解析为操作掩码。
  • private static Filter parseFilter(String filterString);将筛选器字符串解析为filter对象。

CLASS PackagePermissionCollection

  • 存储一组PackagePermission权限。

ServiceEvent.java

用于描述服务生命周期的变更。这个事件被同步传输。
  • serialVersionUID:用来表明类的不同版本的兼容性。
  • private final ServiceReference reference;对在其生命周期中发生更改的服务的引用。
  • private final int type;服务生命周期更改的类型。
  • public final static int REGISTERED = 0x00000001;已注册
  • public final static int MODIFIED = 0x00000002;已注册服务的属性被修改
  • public final static int UNREGISTERING = 0x00000004;注销服务。
  • public final static int MODIFIED_ENDMATCH = 0x00000008;已注册的服务的属性已被修改和新属性不再匹配监听器的过滤器。
  • public ServiceEvent(int type, ServiceReference reference)创建一个新的服务事件对象。
  • public ServiceReference getServiceReference()返回对其中发生更改的服务的引用生命周期。
  • public int getType()返回事件的类型。已注册、已修改、已注销、修改并不再匹配监听器的过滤器。

ServiceFactory.java

  • 允许在 OSGi 环境提供自定义的服务对象。当注册服务时,一个 ServiceFactory可以用于替代服务对象。可以根据需要返回真正的服务对象,类似于服务代理。
  • public Object getService(Bundle bundle,ServiceRegistration registration);获取服务对象,将被缓存
  • public void ungetService(Bundle bundle,ServiceRegistration registration, Object service);释放一个服务对象。

ServiceListener.java

  • 监听器会根据权限过滤。
  • public void serviceChanged(ServiceEvent event);接收服务发生生命周期更改的通知。

ServicePermission.java

CLASS ServicePermission

  • 绑定包注册或获取服务的权限。
  • 操作字符串:GET、REGISTER

CLASS ServicePermissionCollection

  • 存储一组ServicePermission权限。

ServiceReference.java

  • public Object getProperty(String key); 获取服务的属性。
  • public String[]getPropertyKeys();获取所有属性键.
  • public Bundle getBundle();获取注册服务的Bundle
  • public Bundle[] getUsingBundles();获取通过这个服务引用使用服务的Bundle。
  • public boolean isAssignableTo(Bundle bundle, String className);判断注册当前服务引用对应的服务的Bundle和指定的Bundle,对于指定的类是否使用相同的包。
  • public int compareTo(Object reference);比较

ServiceRegistration.java

  • 表示一个已经被注册的服务。当 BundleContext.registerService 方法调用成功时,框架`返回一个该对象。这个对象由注册服务的 Bundle 拥有且不与其它 Bundle 共享。它用于更新服务和卸载服务。
  • public ServiceReference getReference();获取一个引用
  • public void setProperties(Dictionary properties);设置服务属性
  • public void unregister();卸载服务
Loading...