otsdaq  v2_04_01
RegisterConfigurationInfoReader.cpp
1 /*
2  * RegisterConfigurationInfoReader.cpp
3  *
4  * Created on: Jul 28, 2015
5  * Author: parilla
6  */
7 
8 #include "otsdaq-core/ConfigurationDataFormats/RegisterConfigurationInfoReader.h"
9 #include "otsdaq-core/ConfigurationDataFormats/RegisterBase.h"
10 #include "otsdaq-core/XmlUtilities/ConvertFromXML.h"
11 #include "otsdaq-core/XmlUtilities/DOMTreeErrorReporter.h"
12 
13 #include <sys/stat.h>
14 #include <iostream>
15 #include <xercesc/dom/DOMElement.hpp>
16 #include <xercesc/dom/DOMNode.hpp>
17 #include <xercesc/dom/DOMNodeList.hpp>
18 #include <xercesc/parsers/XercesDOMParser.hpp>
19 #include <xercesc/util/XMLString.hpp>
20 
21 using namespace ots;
22 
23 RegisterConfigurationInfoReader::RegisterConfigurationInfoReader()
24 {
25  // TODO Auto-generated constructor stub
26  initPlatform();
27  rootTag_ = xercesc::XMLString::transcode("ROOT");
28  headerTag_ = xercesc::XMLString::transcode("HEADER");
29  typeTag_ = xercesc::XMLString::transcode("TYPE");
30  extensionTableNameTag_ = xercesc::XMLString::transcode("EXTENSION_TABLE_NAME");
31  nameTag_ = xercesc::XMLString::transcode("NAME");
32  dataSetTag_ = xercesc::XMLString::transcode("DATA_SET");
33  versionTag_ = xercesc::XMLString::transcode("VERSION");
34  commentDescriptionTag_ = xercesc::XMLString::transcode("COMMENT_DESCRIPTION");
35  createdByUserTag_ = xercesc::XMLString::transcode("CREATED_BY_USER");
36  dataTag_ = xercesc::XMLString::transcode("DATA");
37  typeNameTag_ = xercesc::XMLString::transcode("TYPE_NAME");
38  registerNameTag_ = xercesc::XMLString::transcode("REGISTER_NAME");
39  baseAddressTag_ = xercesc::XMLString::transcode("BASE_ADDRESS");
40  sizeTag_ = xercesc::XMLString::transcode("REGISTER_SIZE");
41  accessTag_ = xercesc::XMLString::transcode("ACCESS");
42 }
43 
44 RegisterConfigurationInfoReader::~RegisterConfigurationInfoReader()
45 {
46  try
47  {
48  xercesc::XMLString::release(&rootTag_);
49  xercesc::XMLString::release(&headerTag_);
50  xercesc::XMLString::release(&typeTag_);
51  xercesc::XMLString::release(&extensionTableNameTag_);
52  xercesc::XMLString::release(&nameTag_);
53  xercesc::XMLString::release(&dataSetTag_);
54  xercesc::XMLString::release(&versionTag_);
55  xercesc::XMLString::release(&commentDescriptionTag_);
56  xercesc::XMLString::release(&createdByUserTag_);
57  xercesc::XMLString::release(&typeNameTag_);
58  xercesc::XMLString::release(&registerNameTag_);
59  xercesc::XMLString::release(&baseAddressTag_);
60  xercesc::XMLString::release(&sizeTag_);
61  xercesc::XMLString::release(&accessTag_);
62  }
63  catch(...)
64  {
65  __MOUT_ERROR__ << "Unknown exception encountered in TagNames destructor"
66  << " ";
67  }
68  terminatePlatform(); // TODO Auto-generated destructor stub
69 }
70 
71 //==============================================================================
72 void RegisterConfigurationInfoReader::initPlatform(void)
73 {
74  try
75  {
76  xercesc::XMLPlatformUtils::Initialize(); // Initialize Xerces infrastructure
77  }
78  catch(xercesc::XMLException& e)
79  {
80  __MOUT_ERROR__ << "XML toolkit initialization error: "
81  << XML_TO_CHAR(e.getMessage()) << " ";
82  // throw exception here to return ERROR_XERCES_INIT
83  }
84 }
85 
86 //==============================================================================
87 void RegisterConfigurationInfoReader::terminatePlatform(void)
88 {
89  try
90  {
91  xercesc::XMLPlatformUtils::Terminate(); // Terminate after release of memory
92  }
93  catch(xercesc::XMLException& e)
94  {
95  __MOUT_ERROR__ << "XML toolkit teardown error: " << XML_TO_CHAR(e.getMessage())
96  << " ";
97  }
98 }
99 
100 //==============================================================================
101 xercesc::DOMNode* RegisterConfigurationInfoReader::getNode(XMLCh* tagName,
102  xercesc::DOMNode* parent,
103  unsigned int itemNumber)
104 {
105  return getNode(tagName, dynamic_cast<xercesc::DOMElement*>(parent), itemNumber);
106 }
107 
108 //==============================================================================
109 xercesc::DOMNode* RegisterConfigurationInfoReader::getNode(XMLCh* tagName,
110  xercesc::DOMElement* parent,
111  unsigned int itemNumber)
112 {
113  xercesc::DOMNodeList* nodeList = parent->getElementsByTagName(tagName);
114  if(!nodeList)
115  {
116  throw(std::runtime_error(std::string("Can't find ") + XML_TO_CHAR(tagName) +
117  " tag!"));
118  std::cout << __COUT_HDR_FL__
119  << (std::string("Can't find ") + XML_TO_CHAR(tagName) + " tag!")
120  << std::endl;
121  }
122  // std::cout << __COUT_HDR_FL__<< "Name: " <<
123  // XML_TO_CHAR(nodeList->item(itemNumber)->getNodeName()) << std::endl; if(
124  // nodeList->item(itemNumber)->getFirstChild() != 0 )
125  // std::cout << __COUT_HDR_FL__<< "Value: " <<
126  // XML_TO_CHAR(nodeList->item(itemNumber)->getFirstChild()->getNodeValue()) <<
127  // std::endl;
128  return nodeList->item(itemNumber);
129 }
130 
131 //==============================================================================
132 xercesc::DOMElement* RegisterConfigurationInfoReader::getElement(XMLCh* tagName,
133  xercesc::DOMNode* parent,
134  unsigned int itemNumber)
135 {
136  return dynamic_cast<xercesc::DOMElement*>(getNode(tagName, parent, itemNumber));
137 }
138 
139 //==============================================================================
140 xercesc::DOMElement* RegisterConfigurationInfoReader::getElement(
141  XMLCh* tagName, xercesc::DOMElement* parent, unsigned int itemNumber)
142 {
143  return dynamic_cast<xercesc::DOMElement*>(getNode(tagName, parent, itemNumber));
144 }
145 
146 //==============================================================================
147 void RegisterConfigurationInfoReader::read(RegisterBase& configuration)
148 {
149  /*
150  std::string configurationDataDir = std::string(getenv("CONFIGURATION_DATA_PATH")) +
151  "/" + configuration.getTypeName() + "RegisterConfiguration/";
152  //"/ConfigurationInfo/";
153  std::string configFile = configurationDataDir + "/0/" + configuration.getTypeName() +
154  "RegisterConfiguration" + ".xml"; struct stat fileStatus;
155 
156  int iretStat = stat(configFile.c_str(), &fileStatus);
157  if( iretStat == ENOENT )
158  );
159  else if( iretStat == ENOTDIR )
160  );
161  else if( iretStat == ELOOP )
162  );
163  else if( iretStat == EACCES )
164  );
165  else if( iretStat == ENAMETOOLONG )
166  );
167 
168  xercesc::XercesDOMParser* parser = new xercesc::XercesDOMParser;
169  // Configure DOM parser.
170  parser->setValidationScheme(xercesc::XercesDOMParser::Val_Auto);//Val_Never
171  parser->setDoNamespaces ( true );
172  parser->setDoSchema ( true );
173  parser->useCachedGrammarInParse ( false );
174 
175  DOMTreeErrorReporter* errorHandler = new DOMTreeErrorReporter() ;
176  parser->setErrorHandler(errorHandler);
177  try
178  {
179  parser->parse( configFile.c_str() );
180 
181  // no need to free this pointer - owned by the parent parser object
182  xercesc::DOMDocument* xmlDocument = parser->getDocument();
183 
184  // Get the top-level element: Name is "root". No attributes for "root"
185  xercesc::DOMElement* elementRoot = xmlDocument->getDocumentElement();
186  if( !elementRoot )
187  throw(std::runtime_error( "empty XML document" ));
188 
189  //<CONFIGURATION>
190  xercesc::DOMElement* configurationElement = getElement(registerNameTag_,
191  elementRoot, 0); if( configuration.getConfigurationName() !=
192  XML_TO_CHAR(configurationElement->getAttribute(configurationNameAttributeTag_)) )
193  {
194 
195  std::cout << __COUT_HDR_FL__ << "In " << configFile << " the configuration
196  name " <<
197  XML_TO_CHAR(configurationElement->getAttribute(configurationNameAttributeTag_))
198  << " doesn't match the the class configuration name " <<
199  configuration.getConfigurationName() << " "; assert(0);
200  }
201  //<DATA>
202  xercesc::DOMNodeList* viewNodeList =
203  configurationElement->getElementsByTagName(dataTag_); bool storageTypeFound = false;
204  for( XMLSize_t view = 0; view < viewNodeList->getLength(); view++ )
205  {
206  if( !viewNodeList->item(view)->getNodeType() ||
207  viewNodeList->item(view)->getNodeType() != xercesc::DOMNode::ELEMENT_NODE )//true is
208  not 0 && is element continue;
209 
210  auto viewElement = dynamic_cast<xercesc::DOMElement*>(viewNodeList->item(view));
211  //configuration.getMockupViewP()->setName(XML_TO_CHAR(viewElement->getAttribute(viewNameAttributeTag_)));
212  xercesc::DOMElement * typeNameElement = dynamic_cast< xercesc::DOMElement*
213  >(viewElement->getElementsByTagName(typeNameTag_ )->item(0));
214  xercesc::DOMElement * registerNameElement = dynamic_cast<
215  xercesc::DOMElement* >(viewElement->getElementsByTagName(registerNameTag_
216  )->item(0)); xercesc::DOMElement * baseAddressElement = dynamic_cast<
217  xercesc::DOMElement* >(viewElement->getElementsByTagName(baseAddressTag_
218  )->item(0)); xercesc::DOMElement * sizeElement = dynamic_cast<
219  xercesc::DOMElement* >(viewElement->getElementsByTagName(sizeTag_ )->item(0));
220  xercesc::DOMElement * accessElement = dynamic_cast<
221  xercesc::DOMElement* >(viewElement->getElementsByTagName(accessTag_ )->item(0));
222  configuration.getMockupViewP()->getRegistersInfoPointer()->push_back(
223  ViewRegisterInfo(XML_TO_CHAR(typeNameElement->getNodeValue() ),
224  XML_TO_CHAR(registerNameElement->getNodeValue() ),
225  XML_TO_CHAR(baseAddressElement->getNodeValue() ),
226  XML_TO_CHAR(sizeElement->getNodeValue() ),
227  XML_TO_CHAR(accessElement->getNodeValue() )));
228  //</DATA>
229 
230  }
231  if( !storageTypeFound )
232  {
233  std::cout << __COUT_HDR_FL__ << "The type defined in CONFIGURATION_TYPE ("
234  << getenv("CONFIGURATION_TYPE") << ") doesn't match with any of the types
235  defined in " << configFile << " "; assert(0);
236  }
237 
238  //</CONFIGURATION>
239  }
240  catch( xercesc::XMLException& e )
241  {
242  std::ostringstream errBuf;
243  errBuf << "Error parsing file: " << XML_TO_CHAR(e.getMessage()) << std::flush;
244  }
245  delete parser;
246  delete errorHandler;*/
247 }
248 
249 //==============================================================================
250 void RegisterConfigurationInfoReader::read(RegisterBase* configuration)
251 {
252  read(*configuration);
253 }