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