hd

FLowFileReader.cpp 5.2KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190
  1. #include "StdAfx.h"
  2. #include "FLowFileReader.h"
  3. #include "FlowDataProvider.h."
  4. #include "FlowTemplate.h"
  5. #include "FlowTemplateMgr.h"
  6. #include "CellBase.h"
  7. CFLowFileReader::CFLowFileReader(CFlowTemplateMgr* pTemplateMgr) : m_pTemplateMgr(pTemplateMgr)
  8. {
  9. ASSERT(m_pTemplateMgr != NULL);
  10. }
  11. CFLowFileReader::~CFLowFileReader(void)
  12. {
  13. }
  14. /*****************************************************************
  15. **【函数名称】 __open
  16. **【函数功能】 打开流程文件
  17. **【参数】 FileName:文件名
  18. FlowDoc:XML文档模板
  19. **【返回值】 成功true,失败false
  20. ****************************************************************/
  21. bool CFLowFileReader::__open( LPCTSTR FileName, FLOW_DOC_PTR& FlowDoc )
  22. {
  23. bool res = false;
  24. try
  25. {
  26. //创建IXMLDOMDocument接口
  27. HRESULT hr = FlowDoc.CreateInstance(_uuidof(MSXML2::DOMDocument60));
  28. if (FAILED(hr))
  29. {
  30. ILogger::getInstance().log(LOG_CLASS_BUSI, LOG_LEVEL_ERROR, _T("{FileReader}: 创建流程文件读取对象失败, 请检查XML环境"));
  31. return false;
  32. }
  33. ILogger::getInstance().log(LOG_CLASS_BUSI, LOG_LEVEL_NORMAL, _T("{FileReader}: 开始解析流程文件[%s]"), FileName);
  34. _variant_t varXml(FileName);
  35. //加载文件
  36. if(FALSE == (BOOL)FlowDoc->load(varXml))
  37. {
  38. ILogger::getInstance().log(LOG_CLASS_BUSI, LOG_LEVEL_ERROR, _T("{FileReader}: 打开流程文件[%s]失败"), FileName);
  39. return false;
  40. }
  41. else
  42. {
  43. res = true;
  44. }
  45. }
  46. catch (_com_error &e)
  47. {
  48. ILogger::getInstance().log(LOG_CLASS_BUSI, LOG_LEVEL_ERROR, _T("{FileReader}: 打开流程文件[%s]时出现异常, %s"), FileName, e.ErrorMessage());
  49. }
  50. catch (...)
  51. {
  52. ILogger::getInstance().log(LOG_CLASS_BUSI, LOG_LEVEL_ERROR, _T("{FileReader}: 打开流程文件[%s]时出现未知异常"), FileName);
  53. }
  54. return res;
  55. }
  56. /*****************************************************************
  57. **【函数名称】 __parseCell
  58. **【函数功能】 解析Cell信息
  59. **【参数】 FlowDoc:XML文档模板
  60. FlowTemplate:cell所属的模板
  61. **【返回值】 成功true,失败false
  62. ****************************************************************/
  63. bool CFLowFileReader::__parseCell( FLOW_DOC_PTR& FlowDoc, CFlowTemplate& FlowTemplate )
  64. {
  65. CString CellXpath;
  66. CellXpath.Format(_T("%s[@%s='%s']/%s"), XPATH_IVR_NODE, FLOW_ATTRIBUTE_NAME, FlowTemplate.name(), XPATH_CELL);
  67. FLOW_LIST_PTR CellList = NULL;
  68. CellList = FlowDoc->selectNodes(CellXpath.GetBuffer(0));
  69. ASSERT(CellList != NULL);
  70. if(CellList == NULL || CellList->Getlength() == 0)
  71. {
  72. ILogger::getInstance().log(LOG_CLASS_BUSI, LOG_LEVEL_ERROR, _T("{FileReader}: 流程[%s]中不包含任何有效节点"), FlowTemplate.name());
  73. return false;
  74. }
  75. //依次解析所有节点
  76. for(int i = 0; i < CellList->Getlength(); ++i)
  77. {
  78. FLOW_ELEMENT_PTR CellElement = CellList->Getitem(i);
  79. // 创建流程数据提供器
  80. CFlowDataProvider Provider(FlowDoc, CellElement, &FlowTemplate);
  81. CString CellName;
  82. Provider.getData(CELL_ATTRIBUTE_NAME, CellName);
  83. // 创建节点对象
  84. CCellBase* pCell = CCellBase::createCell(CellName);
  85. ASSERT(pCell != NULL);
  86. if(pCell == NULL)
  87. {
  88. ILogger::getInstance().log(LOG_CLASS_BUSI, LOG_LEVEL_WARNING, _T("{FileReader}: 创建流程[%s]附属节点[%s]失败"), FlowTemplate.name(), CellName);
  89. return false;
  90. }
  91. if(pCell->fillData(Provider))
  92. FlowTemplate.accept(pCell->position(), pCell);
  93. else
  94. return false;
  95. }
  96. return true;
  97. }
  98. /*****************************************************************
  99. **【函数名称】 __generateFlow
  100. **【函数功能】 生成流程
  101. **【参数】 FlowDoc:XML文档模板
  102. FlowList:流程列表
  103. **【返回值】 成功true,失败false
  104. ****************************************************************/
  105. bool CFLowFileReader::__generateFlow( FLOW_DOC_PTR& FlowDoc, FLOW_LIST_PTR& FlowList )
  106. {
  107. bool Res = true;
  108. //依次创建所有流程
  109. for(int i = 0; i < FlowList->Getlength(); ++i)
  110. {
  111. FLOW_ELEMENT_PTR FlowElement = FlowList->Getitem(i);
  112. // 创建流程数据提供器
  113. CFlowDataProvider Provider(FlowDoc, FlowElement);
  114. // 创建流程对象
  115. CFlowTemplate* pTemplate = m_pTemplateMgr->createTemplate(Provider);
  116. ASSERT(pTemplate != NULL);
  117. if(pTemplate == NULL)
  118. {
  119. ILogger::getInstance().log(LOG_CLASS_BUSI, LOG_LEVEL_NORMAL, _T("{FileReader}: 解析流程文件过程中创建模板失败"));
  120. continue;
  121. }
  122. ILogger::getInstance().log(LOG_CLASS_BUSI, LOG_LEVEL_NORMAL, _T("{FileReader}: 正在解析流程[%s]"), pTemplate->name());
  123. Res &= __parseCell(FlowDoc, *pTemplate);
  124. }
  125. return Res;
  126. }
  127. /*****************************************************************
  128. **【函数名称】 read
  129. **【函数功能】 读取流程文件
  130. **【参数】 FileName:文件名
  131. **【返回值】 成功true,失败false
  132. ****************************************************************/
  133. bool CFLowFileReader::read( LPCTSTR FileName )
  134. {
  135. FLOW_DOC_PTR pDoc;
  136. if(!__open(FileName, pDoc))
  137. return false;
  138. try
  139. {
  140. FLOW_LIST_PTR FlowList = NULL;
  141. FlowList = pDoc->selectNodes(XPATH_IVR_NODE);
  142. ASSERT(FlowList != NULL);
  143. if(FlowList == NULL || FlowList->Getlength() == 0)
  144. {
  145. ILogger::getInstance().log(LOG_CLASS_BUSI, LOG_LEVEL_ERROR, _T("{FileReader}: 流程文件中不包含任何有效流程, 请检查流程文件[%s]"), FileName);
  146. return false;
  147. }
  148. return __generateFlow(pDoc, FlowList);
  149. }
  150. catch (_com_error &e)
  151. {
  152. ILogger::getInstance().log(LOG_CLASS_BUSI, LOG_LEVEL_ERROR, _T("{FileReader}:解析流程文件[%s]时出现异常, %s"), FileName, e.ErrorMessage());
  153. }
  154. catch (...)
  155. {
  156. ILogger::getInstance().log(LOG_CLASS_BUSI, LOG_LEVEL_ERROR, _T("{FileReader}: 解析流程文件[%s]时出现未知异常"), FileName);
  157. }
  158. return false;
  159. }