1.背景
原实现中,在接口事件是与单据类型关联的.当一种单据类型对应多个抽取规则,需要各自的事件处理方式,程序就无法适应了.
要求抽取事件和抽取规则关联.
修改后的逻辑如下:
.仍允许按单据类型设置接口事件.
.如果规则指定了自己的事件处理逻辑,则采用本规则设置,否则采用单据类型的设置.
.当未指定单据类型的事件处理命令时,采用第1个规则的设置.(兼容性考虑)
2.代码修改
代码已在trunk上修改.
(1)增加定义
CRule增加成员.
CEventCmd *on_before_get_;
CEventCmd *on_after_get_;
(2)读配置
pElement = (DOMElement*)GetChildNodeByTagName(pRootElement,"BeforeGet");
this->on_before_get_ = dynamic_cast<CEventCmd*>(sti_->get_event_cmd(EVENT_EXTRACTION_BEGIN));
if (pElement) {
CEventCmd *cmd = new CEventCmd;
if (cmd->Load(pRootElement,"BeforeGet")); {
delete cmd;
return -1;
}
if (this->on_before_get_==0) {
sti_->set_event_cmd(EVENT_EXTRACTION_BEGIN,cmd);
}
this->on_before_get_ = cmd;
}
pElement = (DOMElement*)GetChildNodeByTagName(pRootElement,"AfterGet");
this->on_after_get_ = dynamic_cast<CEventCmd*>(sti_->get_event_cmd(EVENT_EXTRACTION_END));
if (pElement) {
CEventCmd *cmd = cmd = new CEventCmd;
if (cmd->Load(pRootElement,"AfterGet")) {
delete cmd;
return -1;
}
if (this->on_after_get_)
sti_->set_event_cmd(EVENT_EXTRACTION_END,cmd);
this->on_after_get_ = cmd;
}
(3)使用
CEventCmd *on_before_get = this->on_before_get_; /// dynamic_cast<CEventCmd*>(sti_->get_event_cmd(EVENT_EXTRACTION_BEGIN));
CEventCmd *on_after_get = this->on_after_get_; ///dynamic_cast<CEventCmd*>(sti_->get_event_cmd(EVENT_EXTRACTION_END));
3.todo
注意事项:
.das(或gyb2.0)的代码未修改,需要时调整
.新引入的成员变量在单据类型设置了事件处理命令时对象在程序结束时未销毁
.目前只处理了:EVENT_EXTRACTION_BEGIN,EVENT_EXTRACTION_END这2个事件.
.是否将来有这种情形:指定了单据类型的接口事件,但某个规则不执行任何命令.目前的情况是必然执行单据类型指定的命令.