使用digester xmlrules声明插件

时间:2015-02-28 09:17:57

标签: apache-commons-digester

我尝试在xml文件(xmlrules)中编写Apache digester解析规则。但是我没有在digester-rules.dtd中看到像PluginCreateRule这样的东西。问题是:(如何)我可以在xml规则文件中声明和引用插件吗?

1 个答案:

答案 0 :(得分:0)

我认为你在这里运气不好。

正如您所见,DTD文件中没有plugin-create-rule。此外,Digester使用自己来解析XML规则,并且digester configuration itself中没有提及plugin-create-rule

查看该代码,添加该规则似乎非常简单,所以我不确定是否因为没有人添加它,或者因为有一些实施中的问题并不是很明显。

我会去补丁来实现这一点,但这些天似乎有little activity in Digester开发......

<强>更新

是的 - 创建支持此功能的基本实现似乎相当简单:

  • binder/PluginCreateRuleBuilder添加方法以支持按类名创建,而不仅仅是类实例(仅复制ObjectCreateBuilder中的代码)。
  • 添加一个新的xmlrules/PluginCreateRule课程(再次,基于ObjectCreateRule,其中大部分被丢弃)。
  • 将规则添加到XmlRulesModule
  • 将规则添加到DTD。

完整补丁文件here

使用Digester Plugin doco中的示例和以下XML

进行测试
<digester-rules>
  <pattern value="pipeline">
    <object-create-rule classname="Pipeline"/>
    <pattern value="source">
      <call-method-rule methodname="setSource" paramcount="1"/>
      <call-param-rule paramnumber="0" attrname="file"/>
    </pattern>
    <pattern value="transform">
      <plugin-create-rule pluginclass="Transform"/>
    </pattern>
    <pattern value="destination">
      <call-method-rule methodname="setDest" paramcount="1"/>
      <call-param-rule paramnumber="0" attrname="file"/>
    </pattern>
  </pattern>
</digester-rules>

请注意,这只是一个基本的概念验证,但如果你想这样做,应该给你一些工作。此外,还有更多选项可用于创建未涵盖的插件,并且是完整解决方案所必需的,因此此补丁(当前状态)不适合提交回Digester项目。

更新2

要调用它,您需要在创建消化器时将PluginRules实例传递给加载器:

DigesterLoader loader = DigesterLoader.newLoader(new FromXmlRulesModule() {
  ...
});

Digester digester= loader.newDigester(new PluginRules());

干杯,