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