hce-node application  1.4.3
HCE Hierarchical Cluster Engine node application
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros
SphinxDataFile.cpp
Go to the documentation of this file.
1 #include <Poco/DOM/DOMParser.h>
2 #include <Poco/DOM/DOMWriter.h>
3 
4 #include <Poco/DOM/NodeIterator.h>
5 #include <Poco/DOM/NodeFilter.h>
6 #include <Poco/DOM/AutoPtr.h>
7 #include <Poco/DOM/NamedNodeMap.h>
8 #include <Poco/XML/XMLWriter.h>
9 
10 #include <Poco/SharedPtr.h>
11 #include <Poco/AutoPtr.h>
12 
13 #include <fstream>
14 #include <sstream>
15 
16 #include "SphinxDataFile.hpp"
17 #include "SphinxDataSource.hpp"
18 #include "SphinxMessageConst.hpp"
19 
20 namespace HCE
21 {
22 namespace sphinx
23 {
24 //-----------------------------------------------------------------------------
26 :pOutDoc(nullptr), errorMsg(""), _IsError(false)
27 {
28  pOutDoc = new Poco::XML::Document;
30  pOutDoc->appendChild(pRoot);
31 }
32 //-----------------------------------------------------------------------------
33 bool SphinxDataFile::append(std::istream& is)
34 {
35  errorMsg.clear();
36  try
37  {
38  Poco::XML::InputSource sourceDoc(is);
39  Poco::XML::DOMParser parser;
40  Poco::AutoPtr<Poco::XML::Document> pDoc = parser.parse(&sourceDoc);
41  Poco::XML::NodeIterator it_doc(pDoc, Poco::XML::NodeFilter::SHOW_ALL);
42  Poco::XML::Node* pNode = it_doc.nextNode();
43  Poco::XML::Node* docNode = pNode;
44 
45  while (pNode)
46  {
47  if (pNode->nodeName() == sphinx_data_source_const::documentTag)
48  {
49  docNode = pNode;
50  Poco::AutoPtr<Poco::XML::Element> pDocElem = static_cast<Poco::XML::Element*>(pOutDoc->importNode(docNode, true));
51  pRoot->appendChild(pDocElem);
52  }
53  pNode = it_doc.nextNode();
54  }
55 
56  _IsError = false;
57  }
58  catch(Poco::Exception& e)
59  {
60  errorMsg = e.displayText();
61  _IsError = true;
62  }
63 
64  return !_IsError;
65 }
66 //-----------------------------------------------------------------------------
67 void SphinxDataFile::save(std::ostream& os)
68 {
69  Poco::XML::DOMWriter writer;
70  writer.setNewLine("\n");
71  writer.setOptions(Poco::XML::XMLWriter::PRETTY_PRINT | Poco::XML::XMLWriter::WRITE_XML_DECLARATION);
72  writer.writeNode(os, pOutDoc);
73 }
74 //-----------------------------------------------------------------------------
75 std::ostream& operator << (std::ostream& os, const SphinxDataFile& dataFile)
76 {
77  const_cast<SphinxDataFile&>(dataFile).save(os);
78  return os;
79 }
80 //-----------------------------------------------------------------------------
81 size_t SphinxDataFile::documentCount(std::istream& is)
82 {
83  size_t count = 0;
84  errorMsg.clear();
85  try
86  {
87  Poco::XML::InputSource sourceDoc(is);
88  Poco::XML::DOMParser parser;
89  Poco::AutoPtr<Poco::XML::Document> pDoc = parser.parse(&sourceDoc);
90  Poco::XML::NodeIterator it_doc(pDoc, Poco::XML::NodeFilter::SHOW_ALL);
91  Poco::XML::Node* pNode = it_doc.nextNode();
92 
93  while (pNode)
94  {
95  if (pNode->nodeName() == sphinx_data_source_const::documentTag)
96  {
97  Poco::AutoPtr<Poco::XML::NamedNodeMap> pMap = pNode->attributes();
98  if (!pMap.isNull())
99  {
100  for (size_t i=0;i<pMap->length();++i)
101  {
102  if (pMap->item(i)->nodeValue().empty())
103  pMap->item(i)->setNodeValue("0");
104  }
105  ++count;
106  }
107  }
108  pNode = it_doc.nextNode();
109  }
110  _IsError = false;
111  }
112  catch(Poco::Exception& e)
113  {
114  errorMsg = e.displayText();
115  _IsError = true;
116  }
117  return count;
118 }
119 //-----------------------------------------------------------------------------
120 bool SphinxDataFile::validateData(std::istream& is)
121 {
122  errorMsg.clear();
123  try
124  {
125  Poco::XML::InputSource sourceDoc(is);
126  Poco::XML::DOMParser parser;
127  Poco::AutoPtr<Poco::XML::Document> pDoc = parser.parse(&sourceDoc);
128  Poco::XML::NodeIterator it_doc(pDoc, Poco::XML::NodeFilter::SHOW_ALL);
129  Poco::XML::Node* pNode = it_doc.nextNode();
130 
131  while (pNode)
132  {
133  if (pNode->nodeName() == sphinx_data_source_const::documentTag)
134  {
135  Poco::AutoPtr<Poco::XML::NamedNodeMap> pMap = pNode->attributes();
136  if (!pMap.isNull())
137  {
138  for (size_t i=0;i<pMap->length();++i)
139  {
140  if (pMap->item(i)->nodeName()==sphinx_data_source_const::documentIdAttrTag && pMap->item(i)->nodeValue().empty())
141  throw Poco::Exception(message_const::badXmlSource+message_const::space+pNode->nodeName()+message_const::point+
143 
144  else if (pMap->item(i)->nodeName()==sphinx_data_source_const::documentIdAttrTag && !pMap->item(i)->nodeValue().empty())
145  {
146  try
147  {
148  std::stoull(pMap->item(i)->nodeValue());
149  }
150  catch(std::exception& e)
151  {
152  throw Poco::Exception(message_const::badXmlSource+message_const::space+pNode->nodeName()+message_const::point+
154  }
155  }
156  }
157  }
158  else
160  }
161  pNode = it_doc.nextNode();
162  }
163  _IsError = false;
164  }
165  catch(Poco::Exception& e)
166  {
167  errorMsg = e.displayText();
168  _IsError = true;
169  }
170  return !_IsError;
171 }
172 //-----------------------------------------------------------------------------
173 //-----------------------------------------------------------------------------
174 } // namespace sphinx
175 } // namespace HCE
176