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