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