HCE project C++ developers source code library  1.1.1
HCE project developer library
 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 
19 namespace HCE
20 {
21 namespace sphinx
22 {
23 //-----------------------------------------------------------------------------
25 :pOutDoc(nullptr), errorMsg(""), _IsError(false)
26 {
27  pOutDoc = new Poco::XML::Document;
29  pOutDoc->appendChild(pRoot);
30 }
31 //-----------------------------------------------------------------------------
32 bool SphinxDataFile::append(std::istream& is)
33 {
34  errorMsg.clear();
35  try
36  {
37  Poco::XML::InputSource sourceDoc(is);
38  Poco::XML::DOMParser parser;
39  Poco::AutoPtr<Poco::XML::Document> pDoc = parser.parse(&sourceDoc);
40  Poco::XML::NodeIterator it_doc(pDoc, Poco::XML::NodeFilter::SHOW_ALL);
41  Poco::XML::Node* pNode = it_doc.nextNode();
42  Poco::XML::Node* docNode = pNode;
43 
44  while (pNode)
45  {
46  if (pNode->nodeName() == sphinx_data_source_const::documentTag)
47  {
48  docNode = pNode;
49  Poco::AutoPtr<Poco::XML::Element> pDocElem = static_cast<Poco::XML::Element*>(pOutDoc->importNode(docNode, true));
50  pRoot->appendChild(pDocElem);
51  }
52  pNode = it_doc.nextNode();
53  }
54 
55  _IsError = false;
56  }
57  catch(Poco::Exception& e)
58  {
59  errorMsg = e.displayText();
60  _IsError = true;
61  }
62 
63  return !_IsError;
64 }
65 //-----------------------------------------------------------------------------
66 void SphinxDataFile::save(std::ostream& os)
67 {
68  Poco::XML::DOMWriter writer;
69  writer.setNewLine("\n");
70  writer.setOptions(Poco::XML::XMLWriter::PRETTY_PRINT | Poco::XML::XMLWriter::WRITE_XML_DECLARATION);
71  writer.writeNode(os, pOutDoc);
72 }
73 //-----------------------------------------------------------------------------
74 std::ostream& operator << (std::ostream& os, const SphinxDataFile& dataFile)
75 {
76  const_cast<SphinxDataFile&>(dataFile).save(os);
77  return os;
78 }
79 //-----------------------------------------------------------------------------
80 size_t SphinxDataFile::documentCount(std::istream& is)
81 {
82  size_t count = 0;
83  errorMsg.clear();
84  try
85  {
86  Poco::XML::InputSource sourceDoc(is);
87  Poco::XML::DOMParser parser;
88  Poco::AutoPtr<Poco::XML::Document> pDoc = parser.parse(&sourceDoc);
89  Poco::XML::NodeIterator it_doc(pDoc, Poco::XML::NodeFilter::SHOW_ALL);
90  Poco::XML::Node* pNode = it_doc.nextNode();
91 
92  while (pNode)
93  {
94  if (pNode->nodeName() == sphinx_data_source_const::documentTag)
95  {
96  Poco::AutoPtr<Poco::XML::NamedNodeMap> pMap = pNode->attributes();
97  if (!pMap.isNull())
98  {
99  for (size_t i=0;i<pMap->length();++i)
100  {
101  if (pMap->item(i)->nodeValue().empty())
102  pMap->item(i)->setNodeValue("0");
103  }
104  ++count;
105  }
106  }
107  pNode = it_doc.nextNode();
108  }
109  _IsError = false;
110  }
111  catch(Poco::Exception& e)
112  {
113  errorMsg = e.displayText();
114  _IsError = true;
115  }
116  return count;
117 }
118 //-----------------------------------------------------------------------------
119 bool SphinxDataFile::validateData(std::istream& is)
120 {
121  errorMsg.clear();
122  try
123  {
124  Poco::XML::InputSource sourceDoc(is);
125  Poco::XML::DOMParser parser;
126  Poco::AutoPtr<Poco::XML::Document> pDoc = parser.parse(&sourceDoc);
127  Poco::XML::NodeIterator it_doc(pDoc, Poco::XML::NodeFilter::SHOW_ALL);
128  Poco::XML::Node* pNode = it_doc.nextNode();
129 
130  while (pNode)
131  {
132  if (pNode->nodeName() == sphinx_data_source_const::documentTag)
133  {
134  Poco::AutoPtr<Poco::XML::NamedNodeMap> pMap = pNode->attributes();
135  if (!pMap.isNull())
136  {
137  for (size_t i=0;i<pMap->length();++i)
138  {
139  if (pMap->item(i)->nodeName()==sphinx_data_source_const::documentIdAttrTag && pMap->item(i)->nodeValue().empty())
140  throw Poco::Exception("Bad xml source: '"+pNode->nodeName()+" "+pMap->item(i)->nodeName()+"=' is empty.");
141 
142  else if (pMap->item(i)->nodeName()==sphinx_data_source_const::documentIdAttrTag && !pMap->item(i)->nodeValue().empty())
143  {
144  try
145  {
146  std::stoull(pMap->item(i)->nodeValue());
147  }
148  catch(std::exception& e)
149  {
150  throw Poco::Exception("Bad xml source: '"+pNode->nodeName()+" "+pMap->item(i)->nodeName()+"=' cannot be convert to unsigned long long.");
151  }
152  }
153  }
154  }
155  else
156  throw Poco::Exception("Bad xml source: '"+pNode->nodeName()+"' have empty attribute list.");
157  }
158  pNode = it_doc.nextNode();
159  }
160  _IsError = false;
161  }
162  catch(Poco::Exception& e)
163  {
164  errorMsg = e.displayText();
165  _IsError = true;
166  }
167  return !_IsError;
168 }
169 //-----------------------------------------------------------------------------
170 //-----------------------------------------------------------------------------
171 } // namespace sphinx
172 } // namespace HCE
173