$treeview $search $mathjax $extrastylesheet
otsdaq
v2_03_00
$projectbrief
|
$projectbrief
|
$searchbox |
00001 /* 00002 * RegisterSequencerInfoReader.cpp 00003 * 00004 * Created on: Jul 29, 2015 00005 * Author: parilla 00006 */ 00007 00008 #include "otsdaq-core/ConfigurationDataFormats/RegisterSequencerInfoReader.h" 00009 #include "otsdaq-core/Macros/CoutHeaderMacros.h" 00010 #include "otsdaq-core/MessageFacility/MessageFacility.h" 00011 #include "otsdaq-core/XmlUtilities/ConvertFromXML.h" 00012 00013 #include <iostream> 00014 #include <stdexcept> 00015 #include <xercesc/dom/DOMElement.hpp> 00016 #include <xercesc/dom/DOMNodeList.hpp> 00017 00018 using namespace ots; 00019 00020 RegisterSequencerInfoReader::RegisterSequencerInfoReader() 00021 { 00022 try 00023 { 00024 xercesc::XMLString::release(&rootTag_); 00025 xercesc::XMLString::release(&headerTag_); 00026 xercesc::XMLString::release(&typeTag_); 00027 xercesc::XMLString::release(&extensionTableNameTag_); 00028 xercesc::XMLString::release(&nameTag_); 00029 xercesc::XMLString::release(&dataSetTag_); 00030 xercesc::XMLString::release(&versionTag_); 00031 xercesc::XMLString::release(&commentDescriptionTag_); 00032 xercesc::XMLString::release(&createdByUserTag_); 00033 xercesc::XMLString::release(&componentNameTag_); 00034 xercesc::XMLString::release(®isterNameTag_); 00035 xercesc::XMLString::release(®isterValueTag_); 00036 xercesc::XMLString::release(&sequenceNumberTag_); 00037 xercesc::XMLString::release(&stateTag_); 00038 } 00039 catch(...) 00040 { 00041 TLOG(TLVL_ERROR, __FILE__) 00042 << "Unknown exception encountered in TagNames destructor" 00043 << " "; 00044 } 00045 } 00046 00047 RegisterSequencerInfoReader::~RegisterSequencerInfoReader() 00048 { 00049 // TODO Auto-generated destructor stub 00050 } 00051 00052 //============================================================================== 00053 void RegisterSequencerInfoReader::initPlatform(void) 00054 { 00055 try 00056 { 00057 xercesc::XMLPlatformUtils::Initialize(); // Initialize Xerces infrastructure 00058 } 00059 catch(xercesc::XMLException& e) 00060 { 00061 TLOG(TLVL_ERROR, __FILE__) 00062 << "XML toolkit initialization error: " << XML_TO_CHAR(e.getMessage()) 00063 << " "; 00064 // throw exception here to return ERROR_XERCES_INIT 00065 } 00066 } 00067 00068 //============================================================================== 00069 void RegisterSequencerInfoReader::terminatePlatform(void) 00070 { 00071 try 00072 { 00073 xercesc::XMLPlatformUtils::Terminate(); // Terminate after release of memory 00074 } 00075 catch(xercesc::XMLException& e) 00076 { 00077 TLOG(TLVL_ERROR, __FILE__) 00078 << "XML toolkit teardown error: " << XML_TO_CHAR(e.getMessage()) << " "; 00079 } 00080 } 00081 00082 //============================================================================== 00083 xercesc::DOMNode* RegisterSequencerInfoReader::getNode(XMLCh* tagName, 00084 xercesc::DOMNode* parent, 00085 unsigned int itemNumber) 00086 { 00087 return getNode(tagName, dynamic_cast<xercesc::DOMElement*>(parent), itemNumber); 00088 } 00089 00090 //============================================================================== 00091 xercesc::DOMNode* RegisterSequencerInfoReader::getNode(XMLCh* tagName, 00092 xercesc::DOMElement* parent, 00093 unsigned int itemNumber) 00094 { 00095 xercesc::DOMNodeList* nodeList = parent->getElementsByTagName(tagName); 00096 if(!nodeList) 00097 { 00098 throw(std::runtime_error(std::string("Can't find ") + XML_TO_CHAR(tagName) + 00099 " tag!")); 00100 std::cout << __COUT_HDR_FL__ 00101 << (std::string("Can't find ") + XML_TO_CHAR(tagName) + " tag!") 00102 << std::endl; 00103 } 00104 // std::cout << __COUT_HDR_FL__<< "Name: " << 00105 // XML_TO_CHAR(nodeList->item(itemNumber)->getNodeName()) << std::endl; if( 00106 // nodeList->item(itemNumber)->getFirstChild() != 0 ) 00107 // std::cout << __COUT_HDR_FL__<< "Value: " << 00108 // XML_TO_CHAR(nodeList->item(itemNumber)->getFirstChild()->getNodeValue()) << 00109 // std::endl; 00110 return nodeList->item(itemNumber); 00111 } 00112 00113 //============================================================================== 00114 xercesc::DOMElement* RegisterSequencerInfoReader::getElement(XMLCh* tagName, 00115 xercesc::DOMNode* parent, 00116 unsigned int itemNumber) 00117 { 00118 return dynamic_cast<xercesc::DOMElement*>(getNode(tagName, parent, itemNumber)); 00119 } 00120 00121 //============================================================================== 00122 xercesc::DOMElement* RegisterSequencerInfoReader::getElement(XMLCh* tagName, 00123 xercesc::DOMElement* parent, 00124 unsigned int itemNumber) 00125 { 00126 return dynamic_cast<xercesc::DOMElement*>(getNode(tagName, parent, itemNumber)); 00127 } 00128 00129 //============================================================================== 00130 void RegisterSequencerInfoReader::read(RegisterBase& configuration) 00131 { 00132 /* 00133 std::string configurationDataDir = std::string(getenv("CONFIGURATION_DATA_PATH")) + 00134 "/" + configuration.getTypeName() + "RegisterSequencer/"; 00135 //"/ConfigurationInfo/"; 00136 std::string configFile = configurationDataDir + "/0/" + configuration.getTypeName() + 00137 "RegisterSequencer" + ".xml"; 00138 //std::cout << __COUT_HDR_FL__ << configFile << std::endl; 00139 00140 struct stat fileStatus; 00141 00142 int iretStat = stat(configFile.c_str(), &fileStatus); 00143 if( iretStat == ENOENT ) 00144 ); 00145 else if( iretStat == ENOTDIR ) 00146 ); 00147 else if( iretStat == ELOOP ) 00148 ); 00149 else if( iretStat == EACCES ) 00150 ); 00151 else if( iretStat == ENAMETOOLONG ) 00152 ); 00153 00154 XercesDOMParser* parser = new XercesDOMParser; 00155 // Configure DOM parser. 00156 parser->setValidationScheme(XercesDOMParser::Val_Auto);//Val_Never 00157 parser->setDoNamespaces ( true ); 00158 parser->setDoSchema ( true ); 00159 parser->useCachedGrammarInParse ( false ); 00160 00161 DOMTreeErrorReporter* errorHandler = new DOMTreeErrorReporter() ; 00162 parser->setErrorHandler(errorHandler); 00163 try 00164 { 00165 parser->parse( configFile.c_str() ); 00166 00167 // no need to free this pointer - owned by the parent parser object 00168 DOMDocument* xmlDocument = parser->getDocument(); 00169 00170 // Get the top-level element: Name is "root". No attributes for "root" 00171 DOMElement* elementRoot = xmlDocument->getDocumentElement(); 00172 if( !elementRoot ) 00173 throw(std::runtime_error( "empty XML document" )); 00174 00175 //<CONFIGURATION> 00176 DOMElement* configurationElement = getElement(configurationTag_, elementRoot, 0); 00177 if( configuration.getConfigurationName() != 00178 XML_TO_CHAR(configurationElement->getAttribute(configurationNameAttributeTag_)) ) 00179 { 00180 00181 std::cout << __COUT_HDR_FL__ << "In " << configFile << " the configuration 00182 name " << 00183 XML_TO_CHAR(configurationElement->getAttribute(configurationNameAttributeTag_)) 00184 << " doesn't match the the class configuration name " << 00185 configuration.getConfigurationName() << " "; assert(0); 00186 } 00187 //<DATA> 00188 DOMNodeList* viewNodeList = configurationElement->getElementsByTagName(dataTag_); 00189 bool storageTypeFound = false; 00190 for( XMLSize_t view = 0; view < viewNodeList->getLength(); view++ ) 00191 { 00192 if( !viewNodeList->item(view)->getNodeType() || 00193 viewNodeList->item(view)->getNodeType() != DOMNode::ELEMENT_NODE )//true is not 0 && 00194 is element continue; 00195 00196 configuration.getMockupViewP()->setName(XML_TO_CHAR(viewElement->getAttribute(viewNameAttributeTag_))); 00197 DOMElement * componentNameElement = dynamic_cast< xercesc::DOMElement* 00198 >(viewNodeList->getElementByTagName(typeNameTag_ )); DOMElement * 00199 registerNameElement = dynamic_cast< xercesc::DOMElement* 00200 >(viewNodeList->getElementByTagName(registerNameTag_ )); DOMElement * 00201 registerValueElement = dynamic_cast< xercesc::DOMElement* 00202 >(viewNodeList->getElementByTagName(registerValueTag_ )); DOMElement * 00203 sequenceNumberElement = dynamic_cast< xercesc::DOMElement* 00204 >(viewNodeList->getElementByTagName(sequenceNumberTag_ )); DOMElement * stateElement 00205 = dynamic_cast< xercesc::DOMElement* >(viewNodeList->getElementByTagName(stateTag_ 00206 )); 00207 configuration.getMockupRegisterViewP()->getRegistersSequencerInfoPointer()->push_back( 00208 ViewRegisterSequencerInfo(XML_TO_CHAR(componentNameElement ), 00209 XML_TO_CHAR(registerNameElement ), 00210 XML_TO_CHAR(registerValueElement ), 00211 XML_TO_CHAR(sequenceNumberElement ), 00212 XML_TO_CHAR(stateElement ))); 00213 //</DATA> 00214 00215 } 00216 if( !storageTypeFound ) 00217 { 00218 std::cout << __COUT_HDR_FL__ << "The type defined in CONFIGURATION_TYPE (" 00219 << getenv("CONFIGURATION_TYPE") << ") doesn't match with any of the types 00220 defined in " << configFile << " "; assert(0); 00221 } 00222 00223 //</CONFIGURATION> 00224 } 00225 catch( xercesc::XMLException& e ) 00226 { 00227 ostringstream errBuf; 00228 errBuf << "Error parsing file: " << XML_TO_CHAR(e.getMessage()) << flush; 00229 } 00230 delete parser; 00231 delete errorHandler; 00232 */ 00233 } 00234 00235 //============================================================================== 00236 void RegisterSequencerInfoReader::read(RegisterBase* configuration) 00237 { 00238 read(*configuration); 00239 }