CMS 3D CMS Logo

/data/refman/pasoursint/CMSSW_4_4_5_patch3/src/DQM/EcalBarrelMonitorDbModule/src/MonitorXMLParser.cc

Go to the documentation of this file.
00001 // $Id: MonitorXMLParser.cc,v 1.8 2008/04/08 18:32:10 dellaric Exp $
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 } // handleElement()
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           // null node...
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 } // load()
00463