OSGi配置管理和MetaType服务



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

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

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

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

在检索所需捆绑包的MetaTypeInformation对象后,我可以访问包含在MetatypeXML定义中的所有信息。特别是,可以访问ObjectClassDefinition:

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

我的问题是:

  • 给定AttributeDefinition;如何检索基础财产的实际价值?我知道它的名字,但不知道它的价值
  • 如何枚举当前存在的所有捆绑包(活动和非活动(中所有组件的元类型信息?我知道如何通过配置管理界面列出所有配置。也许有一种方法可以从配置中获取MetaTypeInformation

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

配置管理员本质上是配置记录的存储。每个配置记录都有一个唯一的持久标识符(PID(,如果配置记录用于工厂配置,那么它也将有一个工厂PID。然后,配置记录还包含许多键值对,其中键始终是String,值是一组有限类型中的一个。

另一方面,元类型是一种用于提供配置定义的工具。这些描述了配置中键和值的预期布局,包括与给定键关联的值的类型、值的最小/最大大小、允许值的枚举列表,以及潜在的默认值。每个键/值定义都保存在一个属性定义中,并且这些键/值被分组在一个对象类定义中,该对象类定义与PID相关联。

重要的区别在于,Metatype对运行时的配置实际上是什么一无所知(它只是关于配置应该是什么形状的信息(。类似地,配置管理员不知道配置应该是什么形状,只知道当前的值是什么。

因此:

给定AttributeDefinition;如何检索基础财产的实际价值?我知道它的名字,但不知道它的价值。

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

如何枚举当前存在的所有捆绑包(活动和非活动(中所有组件的元类型信息?我知道如何通过配置管理界面列出所有配置。也许有一种方法可以从配置中获取MetaTypeInformation?

MetaTypeService是OSGi服务注册表中的一个服务,您可以使用它来请求给定捆绑包的MetaTypeInformation。如果你依次询问每个捆绑包的元类型信息,那么你就会得到你想要的信息。Configuration Admin和Metatype之间没有硬链接,因此Configuration对象无法知道它是否存在元类型。

最新更新