OSGi配置管理员和MetaType服务

时间:2018-11-13 08:26:48

标签: osgi

我一直在使用OSGi Configuration Admin在我们的程序中实现一些基本的配置功能。现在,我开始研究MetaType Service规范,因为我需要每个配置属性的类型信息。

我不清楚这两种服务如何相互作用。配置管理员处理本质上未键入的键/值对。 MetaType服务知道配置属性的名称和类型(除其他外),但不知道其值。我的目标是为具有配置和相应元类型信息的所有组件动态生成配置/首选项对话框。根据MetaType服务规范,该服务旨在涵盖此确切的用例。所以我认为应该不太困难

我可以使用以下示例代码来检索元类型信息:

ServiceReference metatypeRef = bundleContext.getServiceReference(MetaTypeService.class.getName());
MetaTypeService service = (MetaTypeService) bundleContext.getService(metatypeRef);
MetaTypeInformation information = service.getMetaTypeInformation(myBundle);

在检索了所需捆绑软件的MetaTypeInformation对象之后,我可以访问元类型XML定义中包含的所有信息。特别是,可以访问ObjectClassDefinition:

ObjectClassDefinition ocd = information.getObjectClassDefinition(pid, null);
AttributeDefinition[] attributes = ocd.getAttributeDefinitions(ObjectClassDefinition.ALL);

我的问题是:

  • 给出AttributeDefinition;如何获取基础属性的实际值?我知道它的名字,但不知道它的值。
  • 如何枚举当前存在的所有捆绑软件(活动和非活动)中所有组件的元类型信息?我知道如何通过Configuration Admin界面列出所有配置。是否有办法从配置中获取MetaTypeInformation?

1 个答案:

答案 0 :(得分:2)

Configuration Admin和MetaType服务是单独的但相关的规范。它们之间没有硬链接,我认为这可能是有助于回答您的问题的主要要点之一。

本质上,Configuration Admin是配置记录的存储。每个配置记录都有一个唯一的永久标识符(PID),如果该配置记录是针对工厂配置的,则它还将具有一个工厂PID。然后,配置记录还包含许多键值对,其中键始终是字符串,并且值是一组有限的类型之一。

另一方面,

元类型是提供配置定义的工具。这些描述了配置中键和值的预期布局,包括诸如与给定键关联的值的类型,值的最小/最大大小,允许值的枚举列表以及可能的默认值之类的内容。每个键/值定义都保存在“属性定义”中,并且在“对象类定义”中将它们组合在一起,该对象类定义与PID关联。

重要的区别是Metatype对运行时配置实际上是什么一无所知(只是有关配置应为何种形状的信息)。同样,Configuration Admin对配置应该是什么形状一无所知,只知道当前的值是什么。

因此:

  

给出AttributeDefinition;如何获取基础属性的实际值?我知道它的名字,但不知道它的值。

您需要标识与包含属性定义的ObjectClassDefinition关联的PID,然后使用它在Configuration Admin中找到相关的配置字典。如果OCD用于工厂PID,则需要确定要查看该工厂PID的哪些配置。

  

如何枚举当前存在的所有捆绑软件(活动和非活动)中所有组件的元类型信息?我知道如何通过Configuration Admin界面列出所有配置。是否有办法从配置中获取MetaTypeInformation?

MetaTypeService是OSGi服务注册表中的一项服务,可用于请求给定捆绑软件的MetaTypeInformation。如果您依次要求每个捆绑软件的元类型信息,那么您将获得所需的信息。 Configuration Admin和Metatype之间没有硬链接,因此Configuration对象无法知道是否存在元类型。