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