我一直在使用OSGi配置管理在我们的程序中实现一些基本的配置功能。我现在开始研究MetaType服务规范,因为我需要每个配置属性的类型信息。
我不清楚这两个服务是如何交互的。配置管理处理本质上是非类型化的键/值对。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);我的问题是:
发布于 2018-11-13 13:25:51
配置管理和MetaType服务是独立但相关的规范。它们之间并没有很强的联系,我认为这可能是帮助回答你的问题的主要要点之一。
本质上,配置管理是配置记录的存储。每个配置记录都有一个唯一的持久标识符( PID ),如果配置记录是用于工厂配置的,那么它也有一个工厂PID。然后,配置记录还包含许多键值对,其中键始终是一个字符串,并且该值是一组有限的类型之一。
另一方面,元类型是提供配置定义的工具。它们描述了配置中键和值的预期布局,包括与给定键关联的值的类型、该值的最小/最大大小、允许值的枚举列表以及潜在的默认值。每个键/值定义保存在属性定义中,并将它们组合在一个对象类定义中,对象类定义与PID相关联。
重要的区别是Metatype不知道运行时的配置实际上是什么(它只是关于配置应该是什么形状的信息)。类似地,Configuration不知道配置应该是什么形状,它只知道当前的值。
因此:
给定AttributeDefinition;如何检索基础属性的实际值?我知道它的名字,但不知道它的价值。
您需要识别与包含属性定义的ObjectClassDefinition关联的PID,然后使用它在configuration中查找相关的配置字典。如果OCD用于工厂PID,则需要确定要查看的工厂PID配置中的哪些配置。
如何枚举当前存在的所有包(活动和非活动)中所有组件的元类型信息?我知道如何通过configurations接口列出所有配置。它可能有一种从配置到MetaTypeInformation的方法吗?
MetaTypeService是OSGi服务注册表中的一个服务,您可以使用它为给定的包请求MetaTypeInformation。如果您依次请求每个包的元类型信息,那么您将得到您正在寻找的信息。配置管理和元类型之间没有硬链接,因此配置对象无法知道它是否存在元类型。
https://stackoverflow.com/questions/53276730
复制相似问题