【问题标题】:How to map service factory PIDs to their `ObjectClassDefinition`如何将服务工厂 PID 映射到它们的“ObjectClassDefinition”
【发布时间】:2018-08-20 16:00:45
【问题描述】:

在 OSGi R6 中,我希望以编程方式验证用户提供的字符串配置属性以及服务工厂 PID,以根据声明它配置此 PID 的任何可配置@Component(或ManagedServiceFactory)所支持的内容,例如@Component(configurationPid=some.service.factory.pid, ...)。此外,我想以某种方式将有效的 String 属性转换为其适当的属性类型。翻阅 OSGi 纲要,似乎 Metatype Service 就是我要找的。​​p>

如果正确,请给出以下内容:

  • 适用的组件使用组件属性类型来指定它们的配置
  • 组件属性类型用@ObjectClassDefinition注解
  • 组件用@Designate注解,映射到适用的@ObjectClassDefinition

这是将工厂 PID 映射到其ObjectClassDefinition 的最直接方式吗:

  • 致电BundleContext.getBundles()。对于每个捆绑包,请致电 MetaTypeService.getMetaTypeInformation(Bundle)
  • 对于每个返回的 MetaTypeInformation 调用 MetaTypeInformation.getFactoryPids() 并过滤我关心的工厂 PID。
  • 对于适用的MetaTypeInformation,调用MetaTypeInformation.getObjectClassDefinition(String, String) 以获取ObjectClassDefinition,使用默认或特定区域设置。

(切向,上述每次执行似乎都很昂贵,因此缓存捆绑 ID,将它们映射到关联的工厂 PID,并以某种方式保持缓存最新似乎是合适的。)

或者,是否有一些其他的 OSGi 魔法可以通过服务工厂 PID 以编程方式查询,它返回的内容比上述过程更快地到达 ObjectClassDefinition

更新 1

退后一步,我正在为我的每个可配置组件编写一个围绕 ConfigurationAdmin 的 CRUD 包装器。我试图避免createFoodeleteFooupdateFoocreateBar,...我的应用程序恰好适合 URI。所以我的工作方法是使用元类型服务,传入一个解析的 URI 查询 (Map<String, List<String>>),然后使用元类型服务来验证和重建这些值,循环回到 OP。 (另一方面,对我来说似乎不是一个漂亮的黑客攻击。)

另一种方法是使用aQute.bnd.annotations.metatype.Configurable.createConfigurable(Class, Map),我更喜欢它!直到我看到this bnd GitHub comment

bnd 元类型注释在 bnd 3.2 中已弃用,并将在 bnd 4.0 中删除。这些注释被 OSGi 元类型注释替换。

所以如果它很快就会消失,我不想依赖那个包。我查看了 Felix 做了什么,不想使用他们等效的 Configurable 类。我对不同的方法都很感兴趣!

更新 2

为了进一步减少这种情况,我想在调用 ConfigurationAdmin.createFactoryConfig 之前验证可能由用户提供的键/值配置属性,以确保它们适用于某些配置 pid。也许这有点矫枉过正?

【问题讨论】:

    标签: osgi


    【解决方案1】:

    我曾经创建了一个类,它接受配置类,创建一个代理,然后使用这个代理来获取方法的名称和类型。它是这样使用的:

     ConfigHelper<Config> helper = new ConfigHelper( Config.class, "my.pid");
     int port = helper.get().port(); // get the configuration
     helper.set( helper.get().port(),  1000);
     helper.update();
    

    您从get 获得的代理将在调用其中一个方法时记录该方法。在set 方法上,它将使用最后调用的代理方法来识别属性。然后它将根据方法的返回值将给定值转换为属性类型。 bnd 转换器非常适合这个,但我认为 Felix 现在有一个标准的 OSGi 转换器。 (这是基于bnd转换器的思想。)

    然后将方法名称用作属性。必要的名称修饰在 OSGi 规范中定义。这允许您使用下划线、Java 关键字和带点的名称。

    因此,这将允许您往返配置。不用担心类型,它们会自动归位。

    更新这是在我更好地理解问题后更新的

    更新2https://github.com/aQute-os/biz.aQute.osgi.util/tree/master/biz.aQute.osgi.configuration.util添加了一个示例

    【讨论】:

    • 嗨,彼得!我不认为我清楚地传达了自己。使用上面的示例,仅给定隐式配置 pid "MyComponent",其他捆绑包中的其他组件如何将此配置 pid 动态映射到 ObjectClassDefinition 实例?
    • 我更新了 OP 以反映根本的愿望。这一切都可能是红鲱鱼,也可能不是。我不知道:-/
    • ConfigHelper 似乎可以解决我的需求;请在某处发布代码!
    • 为什么不使用 OSGi 规范中的转换器? osgi.org/specification/osgi.cmpn/7.0.0/util.converter.html
    猜你喜欢
    • 2012-04-12
    • 2018-05-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多