Я пытаюсь написать правила анализа парсера Apache в XML-файле (xmlrules). Но я не вижу что-то вроде PluginCreateRule в digester-rules.dtd. Возникает вопрос: (Как) Могу ли я объявить и ссылаться на плагин в файле правил xml?объявить плагин с digester xmlrules
ответ
Думаю, вам здесь не повезло.
Как вы видели, в DTD-файле нет plugin-create-rule
. Кроме того, Digester использует себя для анализа XML-правил, и нет упоминания о plugin-create-rule
в digester configuration itself.
При взгляде на этот код было бы довольно просто добавить это правило, поэтому я не уверен, что он был оставлен только потому, что никто не стал добавлять его или потому, что есть некоторые проблемы с реализацией, которая не сразу очевидна.
я бы пойти на патч, чтобы реализовать это, но, как представляется, little activity in Digester развитие в эти дни ...
Update
Да - кажется, достаточно просто создать базовую реализацию, которая поддерживает это:
- Добавить способ
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.
Update 2
Для вызова этого вам необходимо пройти PluginRules
экземпляр загрузчика при создании варочного:
DigesterLoader loader = DigesterLoader.newLoader(new FromXmlRulesModule() {
...
});
Digester digester= loader.newDigester(new PluginRules());
Приветствия,
Большое спасибо за помощь. После патча я получил исключение в стартовом элементе: org.apache.commons.digester3.RulesBase не может быть передан в org.apache.commons.digester3.plugins.PluginRules. Может быть, я где-то ошибся. Во всяком случае, я решил просто использовать object-create-rule, для правила plugin-create также потребуется атрибут 'include' для собственных файлов правил. Это слишком сложно для меня :( – Sky
Нет проблем. Я обновил свой ответ, чтобы пройти исключение класса, но если вы можете получить то, что вам нужно, из доставленного пакета, то это почти всегда лучший способ: -) – Barney