Go to the documentation of this file.00001
00002
00011 #include <xercesc/util/PlatformUtils.hpp>
00012
00013 #include <xercesc/dom/DOMDocument.hpp>
00014 #include <xercesc/dom/DOMNodeList.hpp>
00015
00016 #include <sstream>
00017 #include <stdexcept>
00018
00019 #include "DQM/EcalBarrelMonitorDbModule/interface/MonitorXMLParser.h"
00020
00021 MonitorXMLParser::MonitorXMLParser( const std::string& fromFile ) {
00022
00023 try{
00024
00025 xercesc::XMLPlatformUtils::Initialize();
00026
00027 }catch( xercesc::XMLException& e ){
00028
00029 char* message = xercesc::XMLString::transcode( e.getMessage() ) ;
00030
00031 std::cerr << "XML toolkit initialization error: " << message << std::endl;
00032
00033 xercesc::XMLString::release( &message );
00034
00035 exit( ERROR_XERCES_INIT );
00036
00037 }
00038
00039 xmlFile_ = fromFile;
00040 parser_ = new xercesc::XercesDOMParser();
00041 tags_ = new TagNames();
00042
00043 }
00044
00045
00046
00047 MonitorXMLParser::~MonitorXMLParser() throw() {
00048
00049 try{
00050 xercesc::XMLPlatformUtils::Terminate();
00051 } catch ( xercesc::XMLException& e ){
00052 char* message = xercesc::XMLString::transcode( e.getMessage() );
00053 std::cerr << "XML toolkit teardown error: " << message << std::endl;
00054 xercesc::XMLString::release( &message ) ;
00055 }
00056
00057 }
00058
00059
00060
00061
00062
00063 void MonitorXMLParser::handleElement( xercesc::DOMElement* element ){
00064
00065 if( xercesc::XMLString::equals( tags_->TAG_ME, element->getTagName() ) ) {
00066
00067 char* c;
00068 std::stringstream s;
00069 DB_ME me;
00070 bool meok;
00071
00072 meok = false;
00073
00074 xercesc::DOMNodeList* d1Nodes = element->getElementsByTagName( tags_->TAG_1D );
00075 const XMLSize_t d1Count = d1Nodes->getLength();
00076
00077 for( XMLSize_t d1Index = 0; d1Index < d1Count; ++d1Index ){
00078
00079 xercesc::DOMNode* d1Node = d1Nodes->item( d1Index ) ;
00080
00081 xercesc::DOMElement* d1Element = dynamic_cast< xercesc::DOMElement* >( d1Node ) ;
00082
00083 const XMLCh* d1titleXMLCh = d1Element->getAttribute( tags_->ATTR_TITLE ) ;
00084 c = xercesc::XMLString::transcode( d1titleXMLCh );
00085 me.type = "th1d";
00086 me.title = c;
00087 meok = true;
00088 xercesc::XMLString::release( &c );
00089
00090 const XMLCh* d1xbinsXMLCh = d1Element->getAttribute( tags_->ATTR_XBINS ) ;
00091 c = xercesc::XMLString::transcode( d1xbinsXMLCh );
00092 s.clear(); s.str( c );
00093 s >> me.xbins;
00094 xercesc::XMLString::release( &c );
00095
00096 const XMLCh* d1xfromXMLCh = d1Element->getAttribute( tags_->ATTR_XFROM ) ;
00097 c = xercesc::XMLString::transcode( d1xfromXMLCh );
00098 s.clear(); s.str( c );
00099 s >> me.xfrom;
00100 xercesc::XMLString::release( &c );
00101
00102 const XMLCh* d1xtoXMLCh = d1Element->getAttribute( tags_->ATTR_XTO ) ;
00103 c = xercesc::XMLString::transcode( d1xtoXMLCh );
00104 s.clear(); s.str( c );
00105 s >> me.xto;
00106 xercesc::XMLString::release( &c );
00107
00108 const XMLCh* d1ncycleXMLCh = d1Element->getAttribute( tags_->ATTR_NCYCLE ) ;
00109 c = xercesc::XMLString::transcode( d1ncycleXMLCh );
00110 s.clear(); s.str( c );
00111 s >> me.ncycle;
00112 xercesc::XMLString::release( &c );
00113
00114 const XMLCh* d1loopXMLCh = d1Element->getAttribute( tags_->ATTR_LOOP ) ;
00115 c = xercesc::XMLString::transcode( d1loopXMLCh );
00116 s.clear(); s.str( c );
00117 s >> me.loop;
00118 xercesc::XMLString::release( &c );
00119
00120 me.ybins = 0;
00121 me.yfrom = 0.0;
00122 me.yto = 0.0;
00123 me.zbins = 0;
00124 me.zfrom = 0.0;
00125 me.zto = 0.0;
00126
00127 }
00128
00129 xercesc::DOMNodeList* d2Nodes = element->getElementsByTagName( tags_->TAG_2D );
00130 const XMLSize_t d2Count = d2Nodes->getLength();
00131
00132 for( XMLSize_t d2Index = 0; d2Index < d2Count; ++d2Index ){
00133
00134 xercesc::DOMNode* d2Node = d2Nodes->item( d2Index ) ;
00135
00136 xercesc::DOMElement* d2Element = dynamic_cast< xercesc::DOMElement* >( d2Node ) ;
00137
00138 const XMLCh* d2titleXMLCh = d2Element->getAttribute( tags_->ATTR_TITLE ) ;
00139 c = xercesc::XMLString::transcode( d2titleXMLCh );
00140 me.type = "th2d";
00141 me.title = c;
00142 meok = true;
00143 xercesc::XMLString::release( &c );
00144
00145 const XMLCh* d2xbinsXMLCh = d2Element->getAttribute( tags_->ATTR_XBINS ) ;
00146 c = xercesc::XMLString::transcode( d2xbinsXMLCh );
00147 s.clear(); s.str( c );
00148 s >> me.xbins;
00149 xercesc::XMLString::release( &c );
00150
00151 const XMLCh* d2xfromXMLCh = d2Element->getAttribute( tags_->ATTR_XFROM ) ;
00152 c = xercesc::XMLString::transcode( d2xfromXMLCh );
00153 s.clear(); s.str( c );
00154 s >> me.xfrom;
00155 xercesc::XMLString::release( &c );
00156
00157 const XMLCh* d2xtoXMLCh = d2Element->getAttribute( tags_->ATTR_XTO ) ;
00158 c = xercesc::XMLString::transcode( d2xtoXMLCh );
00159 s.clear(); s.str( c );
00160 s >> me.xto;
00161 xercesc::XMLString::release( &c );
00162
00163 const XMLCh* d2ybinsXMLCh = d2Element->getAttribute( tags_->ATTR_YBINS ) ;
00164 c = xercesc::XMLString::transcode( d2ybinsXMLCh );
00165 s.clear(); s.str( c );
00166 s >> me.ybins;
00167 xercesc::XMLString::release( &c );
00168
00169 const XMLCh* d2yfromXMLCh = d2Element->getAttribute( tags_->ATTR_YFROM ) ;
00170 c = xercesc::XMLString::transcode( d2yfromXMLCh );
00171 s.clear(); s.str( c );
00172 s >> me.yfrom;
00173 xercesc::XMLString::release( &c );
00174
00175 const XMLCh* d2ytoXMLCh = d2Element->getAttribute( tags_->ATTR_YTO ) ;
00176 c = xercesc::XMLString::transcode( d2ytoXMLCh );
00177 s.clear(); s.str( c );
00178 s >> me.yto;
00179 xercesc::XMLString::release( &c );
00180
00181 const XMLCh* d2ncycleXMLCh = d2Element->getAttribute( tags_->ATTR_NCYCLE ) ;
00182 c = xercesc::XMLString::transcode( d2ncycleXMLCh );
00183 s.clear(); s.str( c );
00184 s >> me.ncycle;
00185 xercesc::XMLString::release( &c );
00186
00187 const XMLCh* d2loopXMLCh = d2Element->getAttribute( tags_->ATTR_LOOP ) ;
00188 c = xercesc::XMLString::transcode( d2loopXMLCh );
00189 s.clear(); s.str( c );
00190 s >> me.loop;
00191 xercesc::XMLString::release( &c );
00192
00193 me.zbins = 0;
00194 me.zfrom = 0.0;
00195 me.zto = 0.0;
00196
00197 }
00198
00199 xercesc::DOMNodeList* tpNodes = element->getElementsByTagName( tags_->TAG_TPROFILE );
00200 const XMLSize_t tpCount = tpNodes->getLength();
00201
00202 for( XMLSize_t tpIndex = 0; tpIndex < tpCount; ++tpIndex ){
00203
00204 xercesc::DOMNode* tpNode = tpNodes->item( tpIndex ) ;
00205
00206 xercesc::DOMElement* tpElement = dynamic_cast< xercesc::DOMElement* >( tpNode ) ;
00207
00208 const XMLCh* tptitleXMLCh = tpElement->getAttribute( tags_->ATTR_TITLE ) ;
00209 c = xercesc::XMLString::transcode( tptitleXMLCh );
00210 me.type = "tprofile";
00211 me.title = c;
00212 meok = true;
00213 xercesc::XMLString::release( &c );
00214
00215 const XMLCh* tpxbinsXMLCh = tpElement->getAttribute( tags_->ATTR_XBINS ) ;
00216 c = xercesc::XMLString::transcode( tpxbinsXMLCh );
00217 s.clear(); s.str( c );
00218 s >> me.xbins;
00219 xercesc::XMLString::release( &c );
00220
00221 const XMLCh* tpxfromXMLCh = tpElement->getAttribute( tags_->ATTR_XFROM ) ;
00222 c = xercesc::XMLString::transcode( tpxfromXMLCh );
00223 s.clear(); s.str( c );
00224 s >> me.xfrom;
00225 xercesc::XMLString::release( &c );
00226
00227 const XMLCh* tpxtoXMLCh = tpElement->getAttribute( tags_->ATTR_XTO ) ;
00228 c = xercesc::XMLString::transcode( tpxtoXMLCh );
00229 s.clear(); s.str( c );
00230 s >> me.xto;
00231 xercesc::XMLString::release( &c );
00232
00233 const XMLCh* tpybinsXMLCh = tpElement->getAttribute( tags_->ATTR_YBINS ) ;
00234 c = xercesc::XMLString::transcode( tpybinsXMLCh );
00235 s.clear(); s.str( c );
00236 s >> me.ybins;
00237 xercesc::XMLString::release( &c );
00238
00239 const XMLCh* tpyfromXMLCh = tpElement->getAttribute( tags_->ATTR_YFROM ) ;
00240 c = xercesc::XMLString::transcode( tpyfromXMLCh );
00241 s.clear(); s.str( c );
00242 s >> me.yfrom;
00243 xercesc::XMLString::release( &c );
00244
00245 const XMLCh* tpytoXMLCh = tpElement->getAttribute( tags_->ATTR_YTO ) ;
00246 c = xercesc::XMLString::transcode( tpytoXMLCh );
00247 s.clear(); s.str( c );
00248 s >> me.yto;
00249 xercesc::XMLString::release( &c );
00250
00251 const XMLCh* tpncycleXMLCh = tpElement->getAttribute( tags_->ATTR_NCYCLE ) ;
00252 c = xercesc::XMLString::transcode( tpncycleXMLCh );
00253 s.clear(); s.str( c );
00254 s >> me.ncycle;
00255 xercesc::XMLString::release( &c );
00256
00257 const XMLCh* tploopXMLCh = tpElement->getAttribute( tags_->ATTR_LOOP ) ;
00258 c = xercesc::XMLString::transcode( tploopXMLCh );
00259 s.clear(); s.str( c );
00260 s >> me.loop;
00261 xercesc::XMLString::release( &c );
00262
00263 me.zbins = 0;
00264 me.zfrom = 0.0;
00265 me.zto = 0.0;
00266
00267 }
00268
00269 xercesc::DOMNodeList* tp2dNodes = element->getElementsByTagName( tags_->TAG_TPROFILE2D );
00270 const XMLSize_t tp2dCount = tp2dNodes->getLength();
00271
00272 for( XMLSize_t tp2dIndex = 0; tp2dIndex < tp2dCount; ++tp2dIndex ){
00273
00274 xercesc::DOMNode* tp2dNode = tp2dNodes->item( tp2dIndex ) ;
00275
00276 xercesc::DOMElement* tp2dElement = dynamic_cast< xercesc::DOMElement* >( tp2dNode ) ;
00277
00278 const XMLCh* tp2dtitleXMLCh = tp2dElement->getAttribute( tags_->ATTR_TITLE ) ;
00279 c = xercesc::XMLString::transcode( tp2dtitleXMLCh );
00280 me.type = "tprofile2d";
00281 me.title = c;
00282 meok = true;
00283 xercesc::XMLString::release( &c );
00284
00285 const XMLCh* tp2dxbinsXMLCh = tp2dElement->getAttribute( tags_->ATTR_XBINS ) ;
00286 c = xercesc::XMLString::transcode( tp2dxbinsXMLCh );
00287 s.clear(); s.str( c );
00288 s >> me.xbins;
00289 xercesc::XMLString::release( &c );
00290
00291 const XMLCh* tp2dxfromXMLCh = tp2dElement->getAttribute( tags_->ATTR_XFROM ) ;
00292 c = xercesc::XMLString::transcode( tp2dxfromXMLCh );
00293 s.clear(); s.str( c );
00294 s >> me.xfrom;
00295 xercesc::XMLString::release( &c );
00296
00297 const XMLCh* tp2dxtoXMLCh = tp2dElement->getAttribute( tags_->ATTR_XTO ) ;
00298 c = xercesc::XMLString::transcode( tp2dxtoXMLCh );
00299 s.clear(); s.str( c );
00300 s >> me.xto;
00301 xercesc::XMLString::release( &c );
00302
00303 const XMLCh* tp2dybinsXMLCh = tp2dElement->getAttribute( tags_->ATTR_YBINS ) ;
00304 c = xercesc::XMLString::transcode( tp2dybinsXMLCh );
00305 s.clear(); s.str( c );
00306 s >> me.ybins;
00307 xercesc::XMLString::release( &c );
00308
00309 const XMLCh* tp2dyfromXMLCh = tp2dElement->getAttribute( tags_->ATTR_YFROM ) ;
00310 c = xercesc::XMLString::transcode( tp2dyfromXMLCh );
00311 s.clear(); s.str( c );
00312 s >> me.yfrom;
00313 xercesc::XMLString::release( &c );
00314
00315 const XMLCh* tp2dytoXMLCh = tp2dElement->getAttribute( tags_->ATTR_YTO ) ;
00316 c = xercesc::XMLString::transcode( tp2dytoXMLCh );
00317 s.clear(); s.str( c );
00318 s >> me.yto;
00319 xercesc::XMLString::release( &c );
00320
00321 const XMLCh* tp2dzbinsXMLCh = tp2dElement->getAttribute( tags_->ATTR_ZBINS ) ;
00322 c = xercesc::XMLString::transcode( tp2dzbinsXMLCh );
00323 s.clear(); s.str( c );
00324 s >> me.zbins;
00325 xercesc::XMLString::release( &c );
00326
00327 const XMLCh* tp2dzfromXMLCh = tp2dElement->getAttribute( tags_->ATTR_ZFROM ) ;
00328 c = xercesc::XMLString::transcode( tp2dzfromXMLCh );
00329 s.clear(); s.str( c );
00330 s >> me.zfrom;
00331 xercesc::XMLString::release( &c );
00332
00333 const XMLCh* tp2dztoXMLCh = tp2dElement->getAttribute( tags_->ATTR_ZTO ) ;
00334 c = xercesc::XMLString::transcode( tp2dztoXMLCh );
00335 s.clear(); s.str( c );
00336 s >> me.zto;
00337 xercesc::XMLString::release( &c );
00338
00339 const XMLCh* tp2dncycleXMLCh = tp2dElement->getAttribute( tags_->ATTR_NCYCLE ) ;
00340 c = xercesc::XMLString::transcode( tp2dncycleXMLCh );
00341 s.clear(); s.str( c );
00342 s >> me.ncycle;
00343 xercesc::XMLString::release( &c );
00344
00345 const XMLCh* tp2dloopXMLCh = tp2dElement->getAttribute( tags_->ATTR_LOOP ) ;
00346 c = xercesc::XMLString::transcode( tp2dloopXMLCh );
00347 s.clear(); s.str( c );
00348 s >> me.loop;
00349 xercesc::XMLString::release( &c );
00350
00351 }
00352
00353
00354 xercesc::DOMNodeList* qNodes = element->getElementsByTagName( tags_->TAG_QUERY );
00355 const XMLSize_t qCount = qNodes->getLength();
00356
00357 for( XMLSize_t qIndex = 0; qIndex < qCount; ++qIndex ){
00358
00359 xercesc::DOMNode* qNode = qNodes->item( qIndex ) ;
00360
00361 xercesc::DOMElement* qElement = dynamic_cast< xercesc::DOMElement* >( qNode ) ;
00362
00363 const XMLCh* nameXMLCh = qElement->getAttribute( tags_->ATTR_NAME ) ;
00364 c = xercesc::XMLString::transcode( nameXMLCh );
00365
00366 const XMLCh* argXMLCh = qElement->getAttribute( tags_->ATTR_ARG ) ;
00367 char* d = xercesc::XMLString::transcode( argXMLCh );
00368
00369 const XMLCh* aliasXMLCh = qElement->getAttribute( tags_->ATTR_ALIAS ) ;
00370 char* e = xercesc::XMLString::transcode( aliasXMLCh );
00371
00372 DbQuery tmpQuery;
00373 tmpQuery.query = c;
00374 tmpQuery.arg = d;
00375 tmpQuery.alias = e;
00376
00377 me.queries.push_back( tmpQuery );
00378
00379 xercesc::XMLString::release( &c );
00380 xercesc::XMLString::release( &d );
00381 xercesc::XMLString::release( &e );
00382
00383
00384 }
00385
00386 if( meok ) DBMonitoringElements_.push_back( me );
00387
00388 }
00389 }
00390
00391
00392
00393
00394 void MonitorXMLParser::load() throw( std::runtime_error ) {
00395
00396 parser_->setValidationScheme( xercesc::XercesDOMParser::Val_Never );
00397 parser_->setDoNamespaces( false );
00398 parser_->setDoSchema( false );
00399 parser_->setLoadExternalDTD( false );
00400
00401 try{
00402
00403 parser_->parse( xmlFile_.c_str() );
00404
00405 xercesc::DOMDocument* xmlDoc = parser_->getDocument();
00406
00407 xercesc::DOMElement* dbe = xmlDoc->getDocumentElement();
00408
00409 if( NULL == dbe ){
00410 throw( std::runtime_error( "empty XML document" ) ) ;
00411 }
00412
00413 if( xercesc::XMLString::equals( tags_->TAG_DBE, dbe->getTagName() ) ) {
00414
00415 xercesc::DOMNodeList* children = dbe->getChildNodes();
00416 const XMLSize_t nodeCount = children->getLength();
00417
00418 for( XMLSize_t ix = 0 ; ix < nodeCount ; ++ix ){
00419 xercesc::DOMNode* currentNode = children->item( ix );
00420 if( NULL == currentNode ){
00421
00422 continue;
00423 }
00424
00425 if( xercesc::DOMNode::ELEMENT_NODE != currentNode->getNodeType() ){
00426 continue;
00427 }
00428
00429 xercesc::DOMElement* currentElement = dynamic_cast< xercesc::DOMElement* >( currentNode );
00430
00431 handleElement( currentElement );
00432
00433 }
00434 }
00435
00436 }catch( xercesc::XMLException& e ){
00437
00438 char* message = xercesc::XMLString::transcode( e.getMessage() );
00439
00440 std::ostringstream buf ;
00441 buf << "Error parsing file: " << message << std::endl;
00442
00443 xercesc::XMLString::release( &message );
00444
00445 throw( std::runtime_error( buf.str() ) );
00446
00447 }catch( const xercesc::DOMException& e ){
00448
00449 char* message = xercesc::XMLString::transcode( e.getMessage() );
00450
00451 std::ostringstream buf;
00452 buf << "Encountered DOM Exception: " << message << std::endl;
00453
00454 xercesc::XMLString::release( &message );
00455
00456 throw( std::runtime_error( buf.str() ) );
00457
00458 }
00459
00460 return;
00461
00462 }
00463