2015-02-28 4 views
1

Я пытаюсь написать правила анализа парсера Apache в XML-файле (xmlrules). Но я не вижу что-то вроде PluginCreateRule в digester-rules.dtd. Возникает вопрос: (Как) Могу ли я объявить и ссылаться на плагин в файле правил xml?объявить плагин с digester xmlrules

ответ

0

Думаю, вам здесь не повезло.

Как вы видели, в 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()); 

Приветствия,

+0

Большое спасибо за помощь. После патча я получил исключение в стартовом элементе: org.apache.commons.digester3.RulesBase не может быть передан в org.apache.commons.digester3.plugins.PluginRules. Может быть, я где-то ошибся. Во всяком случае, я решил просто использовать object-create-rule, для правила plugin-create также потребуется атрибут 'include' для собственных файлов правил. Это слишком сложно для меня :( – Sky

+0

Нет проблем. Я обновил свой ответ, чтобы пройти исключение класса, но если вы можете получить то, что вам нужно, из доставленного пакета, то это почти всегда лучший способ: -) – Barney