|
Gaudi Framework, version v21r8 |
| Home | Generated: 17 Mar 2010 |
#include <XMLFileCatalog.h>


Public Member Functions | |
| XMLFileCatalog (CSTR url, IMessageSvc *m) | |
| Create a catalog file, initialization of XercesC. | |
| virtual | ~XMLFileCatalog () |
| Destructor,. | |
| virtual std::string | createFID () const |
| Catalog interface. | |
| virtual CSTR | connectInfo () const |
| Access to connect string. | |
| virtual void | init () |
| Parse the DOM tree of the XML catalog. | |
| virtual void | commit () |
| Save DOM catalog to file. | |
| virtual void | rollback () |
| Save DOM catalog to file. | |
| virtual bool | readOnly () const |
| Check if the catalog is read-only. | |
| virtual bool | dirty () const |
| Check if the catalog should be updated. | |
| virtual bool | existsPFN (CSTR pfn) const |
| Return the status of a physical file name. | |
| virtual std::string | lookupPFN (CSTR fid) const |
| Lookup file identifier by physical file name. | |
| virtual bool | existsLFN (CSTR lfn) const |
| Return the status of a logical file name. | |
| virtual std::string | lookupLFN (CSTR lfn) const |
| Lookup file identifier by logical file name. | |
| virtual bool | existsFID (CSTR fid) const |
| Return the status of a FileID. | |
| virtual void | getPFN (CSTR fid, Files &files) const |
| Dump all physical file names of the catalog and their attributes associate to the FileID. | |
| virtual void | getLFN (CSTR fid, Files &files) const |
| Dump all logical file names of the catalog associate to the FileID. | |
| virtual void | getFID (Strings &fids) const |
| Dump all file Identifiers. | |
| virtual void | deleteFID (CSTR FileID) const |
| Delete FileID Node from the catalog. | |
| virtual void | registerPFN (CSTR fid, CSTR pfn, CSTR ftype) const |
| Create a FileID and Node of the physical file name with all the attributes. | |
| virtual void | registerLFN (CSTR fid, CSTR lfn) const |
| Create a FileID and Node of the logical file name with all the attributes. | |
| virtual void | registerFID (CSTR fid) const |
| Create a FileID and Node. | |
| virtual void | getMetaData (CSTR fid, Attributes &attr) const |
| Dump all MetaData of the catalog for a given file ID. | |
| virtual std::string | getMetaDataItem (CSTR fid, CSTR name) const |
| Access metadata item. | |
| virtual void | setMetaData (CSTR fid, CSTR name, CSTR value) const |
| Insert/update metadata item. | |
| virtual void | dropMetaData (CSTR fid) const |
| Drop all metadata of one FID. | |
| virtual void | dropMetaData (CSTR fid, CSTR attr) const |
| Drop specified metadata item. | |
Protected Types | |
| typedef const std::string & | CSTR |
Private Member Functions | |
| xercesc::DOMDocument * | getDoc (bool throw_if_no_exists=true) const |
| std::string | getfile (bool create) |
| void | printError (CSTR msg, bool throw_exc=true) const |
| std::string | lookupFID (CSTR lfn) const |
| xercesc::DOMNode * | element (CSTR fid, bool print_err=true) const |
| xercesc::DOMNode * | child (xercesc::DOMNode *par, CSTR tag, CSTR attr="", CSTR val="") const |
| std::pair< xercesc::DOMElement *, xercesc::DOMElement * > | i_registerFID (CSTR fid) const |
Private Attributes | |
| bool | m_rdOnly |
| bool | m_update |
| xercesc::DOMDocument * | m_doc |
| xercesc::XercesDOMParser * | m_parser |
| xercesc::ErrorHandler * | m_errHdlr |
| std::string | m_file |
| IMessageSvc * | m_msgSvc |
It uses the DOM model and the external XercesC library for parsing.
Definition at line 25 of file XMLFileCatalog.h.
typedef const std::string& Gaudi::XMLFileCatalog::CSTR [protected] |
Definition at line 27 of file XMLFileCatalog.h.
| XMLFileCatalog::XMLFileCatalog | ( | CSTR | url, | |
| IMessageSvc * | m | |||
| ) |
| XMLFileCatalog::~XMLFileCatalog | ( | ) | [virtual] |
| std::string XMLFileCatalog::createFID | ( | ) | const [virtual] |
Catalog interface.
Create file identifier using UUID mechanism.
Create file identifier using UUID mechanism
Definition at line 207 of file XMLFileCatalog.cpp.
00207 { 00208 return createGuidAsString(); 00209 }
| virtual CSTR Gaudi::XMLFileCatalog::connectInfo | ( | ) | const [inline, virtual] |
| void XMLFileCatalog::init | ( | ) | [virtual] |
Parse the DOM tree of the XML catalog.
Definition at line 225 of file XMLFileCatalog.cpp.
00225 { 00226 string xmlFile = getfile(false); 00227 try{ 00228 if ( m_parser ) delete m_parser; 00229 m_parser = new XercesDOMParser; 00230 m_parser->setValidationScheme(XercesDOMParser::Val_Auto); 00231 m_parser->setDoNamespaces(false); 00232 DTDRedirect dtdinmem; 00233 m_parser->setEntityResolver(&dtdinmem); 00234 if ( ! m_errHdlr ) m_errHdlr = new ErrHandler(m_msgSvc); 00235 m_parser->setErrorHandler(m_errHdlr); 00236 if ( !xmlFile.empty() ) { 00237 m_parser->parse(xmlFile.c_str()); 00238 } 00239 else { 00240 const std::string& s = EmptyCatalog; 00241 MemBufInputSource src((const XMLByte*)s.c_str(),s.length(),"MemCatalog"); 00242 m_parser->parse(src); 00243 } 00244 m_doc = m_parser->getDocument(); 00245 } 00246 catch (const XMLException& e) { 00247 printError("XML parse error["+xmlFile+"]: "+_toString(e.getMessage())); 00248 } 00249 catch (const DOMException& e) { 00250 printError("XML parse error["+xmlFile+"]: "+_toString(e.getMessage())); 00251 } 00252 catch (...) { 00253 printError("UNKNOWN XML parse error in file "+xmlFile); 00254 } 00255 }
| void XMLFileCatalog::commit | ( | ) | [virtual] |
Save DOM catalog to file.
Definition at line 455 of file XMLFileCatalog.cpp.
00455 { 00456 try { 00457 if ( dirty() && !readOnly() ) { 00458 string xmlfile = getfile(true); 00459 XMLStr ii("LS"); 00460 DOMImplementation *imp = DOMImplementationRegistry::getDOMImplementation(ii); 00461 DOMWriter *wr = ((DOMImplementationLS*)imp)->createDOMWriter(); 00462 XMLFormatTarget *tar = new LocalFileFormatTarget(xmlfile.c_str()); 00463 wr->setFeature(XMLUni::fgDOMWRTFormatPrettyPrint, true); 00464 wr->writeNode(tar, *m_doc); 00465 wr->release(); 00466 delete tar; 00467 } 00468 } 00469 catch ( exception& e ) { 00470 printError(string("Cannot open output file:")+e.what()); 00471 } 00472 catch (...) { 00473 printError("Unknown IO rrror."); 00474 } 00475 }
| virtual void Gaudi::XMLFileCatalog::rollback | ( | ) | [inline, virtual] |
| virtual bool Gaudi::XMLFileCatalog::readOnly | ( | ) | const [inline, virtual] |
Check if the catalog is read-only.
Definition at line 47 of file XMLFileCatalog.h.
00047 { return m_rdOnly; }
| virtual bool Gaudi::XMLFileCatalog::dirty | ( | ) | const [inline, virtual] |
Check if the catalog should be updated.
Definition at line 49 of file XMLFileCatalog.h.
00049 { return m_update; }
Return the status of a physical file name.
Definition at line 51 of file XMLFileCatalog.h.
00051 { return element(pfn,false) != 0; }
| virtual std::string Gaudi::XMLFileCatalog::lookupPFN | ( | CSTR | fid | ) | const [inline, virtual] |
Lookup file identifier by physical file name.
Definition at line 53 of file XMLFileCatalog.h.
00053 { return lookupFID(fid); }
Return the status of a logical file name.
Definition at line 55 of file XMLFileCatalog.h.
00055 { return element(lfn,false) != 0; }
| virtual std::string Gaudi::XMLFileCatalog::lookupLFN | ( | CSTR | lfn | ) | const [inline, virtual] |
Lookup file identifier by logical file name.
Definition at line 57 of file XMLFileCatalog.h.
00057 { return lookupFID(lfn); }
Return the status of a FileID.
Definition at line 59 of file XMLFileCatalog.h.
00059 { return element(fid,false) != 0; }
| void XMLFileCatalog::getPFN | ( | CSTR | fid, | |
| Files & | files | |||
| ) | const [virtual] |
Dump all physical file names of the catalog and their attributes associate to the FileID.
Definition at line 279 of file XMLFileCatalog.cpp.
00279 { 00280 files.clear(); 00281 for(XMLCollection c(child(child(element(fid,false),PFNCOLL),PFNNODE), false); c; ++c) 00282 files.push_back(make_pair(c.attr(Attr_name),c.attr(Attr_ftype))); 00283 }
| void XMLFileCatalog::getLFN | ( | CSTR | fid, | |
| Files & | files | |||
| ) | const [virtual] |
Dump all logical file names of the catalog associate to the FileID.
Definition at line 285 of file XMLFileCatalog.cpp.
00285 { 00286 files.clear(); 00287 for(XMLCollection c(child(child(element(fid,false),LFNCOLL),LFNNODE), false); c; ++c) 00288 files.push_back(make_pair(c.attr(Attr_name),fid)); 00289 }
| void XMLFileCatalog::getFID | ( | Strings & | fids | ) | const [virtual] |
| void XMLFileCatalog::deleteFID | ( | CSTR | FileID | ) | const [virtual] |
Delete FileID Node from the catalog.
Definition at line 345 of file XMLFileCatalog.cpp.
00345 { 00346 DOMNode *pn = 0, *fn = element(fid); 00347 if ( fn ) pn = fn->getParentNode(); 00348 if ( pn ) pn->removeChild(fn); 00349 }
Create a FileID and Node of the physical file name with all the attributes.
Definition at line 397 of file XMLFileCatalog.cpp.
00397 { 00398 if ( !fid.empty() ) { 00399 std::pair<DOMElement*,DOMElement*> res = i_registerFID(fid); 00400 DOMElement* phyelem = res.second, *fnelem = 0; 00401 for(XMLCollection c(phyelem); c; ++c ) { 00402 char* nam = XMLString::transcode(c->getNodeName()); 00403 if ( nam == PFNNODE ) { 00404 XMLString::release(&nam); 00405 nam = XMLString::transcode(c->getAttribute(Attr_name)); 00406 if ( nam == pfn ) { 00407 XMLString::release(&nam); 00408 fnelem = c; 00409 break; 00410 } 00411 } 00412 XMLString::release(&nam); 00413 } 00414 if ( !fnelem ) { 00415 fnelem = getDoc(true)->createElement(PFNNODE); 00416 phyelem->appendChild(fnelem); 00417 fnelem->setAttribute(Attr_ftype,XMLStr(ftype)); 00418 fnelem->setAttribute(Attr_name,XMLStr(pfn)); 00419 fnelem->setIdAttribute(Attr_name); 00420 m_update = true; 00421 } 00422 return; 00423 } 00424 throw runtime_error("XMLFileCatalog> Cannot register PFN for invalid FID:"+fid); 00425 }
Create a FileID and Node of the logical file name with all the attributes.
Definition at line 427 of file XMLFileCatalog.cpp.
00427 { 00428 if ( !fid.empty() ) { 00429 std::pair<DOMElement*, DOMElement*> res = i_registerFID(fid); 00430 DOMElement* logelem = res.first, *fnelem = 0; 00431 for(XMLCollection c(logelem); c; ++c ) { 00432 char* nam = XMLString::transcode(c->getNodeName()); 00433 if ( nam == LFNNODE ) { 00434 XMLString::release(&nam); 00435 nam = XMLString::transcode(c->getAttribute(Attr_name)); 00436 if ( nam == lfn ) { 00437 XMLString::release(&nam); 00438 fnelem = c; 00439 break; 00440 } 00441 } 00442 } 00443 if ( !fnelem ) { 00444 fnelem = getDoc(true)->createElement(LFNNODE); 00445 logelem->appendChild(fnelem); 00446 fnelem->setAttribute(Attr_name,XMLStr(lfn)); 00447 fnelem->setIdAttribute(Attr_name); 00448 m_update = true; 00449 } 00450 return; 00451 } 00452 throw runtime_error("XMLFileCatalog> Cannot register LFN for invalid FID:"+fid); 00453 }
| void XMLFileCatalog::registerFID | ( | CSTR | fid | ) | const [virtual] |
Create a FileID and Node.
Definition at line 351 of file XMLFileCatalog.cpp.
00351 { 00352 if ( !fid.empty() ) { 00353 std::pair<DOMElement*, DOMElement*> res = i_registerFID(fid); 00354 if ( res.first == 0 || res.second == 0 ) { 00355 printError("Failed to register FID:"+fid); 00356 } 00357 return; 00358 } 00359 throw runtime_error("XMLFileCatalog> Cannot register LFN for invalid FID:"+fid); 00360 }
| void XMLFileCatalog::getMetaData | ( | CSTR | fid, | |
| Attributes & | attr | |||
| ) | const [virtual] |
Dump all MetaData of the catalog for a given file ID.
Definition at line 291 of file XMLFileCatalog.cpp.
00291 { 00292 attr.clear(); 00293 for(XMLCollection c(child(element(fid),MetaNode), false); c; ++c) 00294 attr.push_back(make_pair(c.attr(Attr_metaName),c.attr(Attr_metaValue))); 00295 if ( attr.size() > 0 ) 00296 attr.push_back(make_pair("guid",fid)); 00297 }
Insert/update metadata item.
Definition at line 309 of file XMLFileCatalog.cpp.
00309 { 00310 if ( !readOnly() ) { 00311 DOMNode* node = element(fid); 00312 DOMElement* mnod = (DOMElement*)child(node,MetaNode,Attr_metaName,attr); 00313 if (!mnod){ 00314 mnod = getDoc(true)->createElement(MetaNode); 00315 node->appendChild(mnod); 00316 mnod->setAttribute(Attr_metaName,XMLStr(attr)); 00317 } 00318 mnod->setAttribute(Attr_metaValue,XMLStr(val)); 00319 m_update = true; 00320 return; 00321 } 00322 printError("Cannot update readonly catalog!"); 00323 }
| virtual void Gaudi::XMLFileCatalog::dropMetaData | ( | CSTR | fid | ) | const [inline, virtual] |
Drop all metadata of one FID.
Definition at line 81 of file XMLFileCatalog.h.
00081 { dropMetaData(fid,"*"); }
Drop specified metadata item.
Definition at line 330 of file XMLFileCatalog.cpp.
00330 { 00331 vector<DOMNode*> gbc; 00332 DOMNode* fn = getDoc(true)->getElementById(XMLStr(fid)); 00333 for(XMLCollection c(child(fn,MetaNode)); c; ++c) 00334 if ( attr[0]=='*' || !c.attr(attr).empty() ) gbc.push_back(c); 00335 for(vector<DOMNode*>::iterator i=gbc.begin(); i != gbc.end(); i++) 00336 fn->removeChild(*i); 00337 }
| DOMDocument * XMLFileCatalog::getDoc | ( | bool | throw_if_no_exists = true |
) | const [private] |
Definition at line 211 of file XMLFileCatalog.cpp.
00211 { 00212 if ( !m_doc && throw_if_no_exists ) 00213 printError("The XML catalog was not started.",true); 00214 return m_doc; 00215 }
| string XMLFileCatalog::getfile | ( | bool | create | ) | [private] |
Definition at line 477 of file XMLFileCatalog.cpp.
00477 { 00478 string protocol, path; 00479 XMLURL xerurl; 00480 try{ 00481 xerurl = (const XMLCh*)XMLStr(m_file); 00482 protocol = _toString(xerurl.getProtocolName()); 00483 path = _toString(xerurl.getPath()); 00484 } 00485 catch (const XMLException& e ) { 00486 printError(_toString(e.getMessage())); 00487 } 00488 if ( protocol.empty() ) { 00489 printError("Missing protocol."); 00490 } 00491 else if ( protocol == "http" || protocol == "ftp" ) { 00492 m_rdOnly = true; 00493 } 00494 else if ( protocol == "file" ) { 00495 m_rdOnly = false; 00496 struct stat buff; 00497 int exist = ::stat(path.c_str(),&buff) != -1; 00498 if ( create && !exist ) { 00499 MsgStream log(m_msgSvc,"XMLCatalog"); 00500 log << MSG::INFO << "File '" << path << "' does not exist. New file created." << endmsg; 00501 ofstream out(path.c_str()); 00502 if( !m_rdOnly && out.is_open() ) { 00503 out << (CSTR)EmptyCatalog << endl; 00504 } 00505 else { 00506 printError("Problem creating file "+path); 00507 } 00508 out.close(); 00509 } 00510 else if ( exist ) { 00511 return path; 00512 } 00513 else if ( !create ) { 00514 return ""; 00515 } 00516 } 00517 else { 00518 printError(protocol + ": protocol not supported."); 00519 } 00520 return path; 00521 }
Definition at line 217 of file XMLFileCatalog.cpp.
00217 { 00218 MsgStream log(m_msgSvc,"XMLCatalog"); 00219 log << MSG::FATAL << msg << endmsg; 00220 if ( rethrow ) { 00221 throw runtime_error("XMLFileCatalog> "+msg); 00222 } 00223 }
| std::string Gaudi::XMLFileCatalog::lookupFID | ( | CSTR | lfn | ) | const [private] |
Definition at line 339 of file XMLFileCatalog.cpp.
00339 { 00340 DOMNode* node = getDoc(true)->getElementById(XMLStr(element_name)); 00341 if ( !node && print_err ) printError("Cannot find element:"+element_name); 00342 return node; 00343 }
| xercesc::DOMNode* Gaudi::XMLFileCatalog::child | ( | xercesc::DOMNode * | par, | |
| CSTR | tag, | |||
| CSTR | attr = "", |
|||
| CSTR | val = "" | |||
| ) | const [private] |
It creates a new node File with name = fid in the XML file catalog
Definition at line 362 of file XMLFileCatalog.cpp.
00362 { 00363 if ( !readOnly() ) { 00365 DOMElement *file = (DOMElement*)element(fid,false), *phyelem = 0, *logelem = 0; 00366 DOMDocument* doc = getDoc(true); 00367 if ( !file ) { 00368 DOMNode* fde = doc->getElementsByTagName(XMLStr("*"))->item(0); 00369 file = m_doc->createElement(XMLStr("File")); 00370 file->setAttribute(Attr_ID, XMLStr(fid)); 00371 file->setIdAttribute(Attr_ID); 00372 fde->appendChild(file); 00373 m_update = true; 00374 } 00375 for(XMLCollection c1(file); c1; ++c1 ) { 00376 char* nam = XMLString::transcode(c1->getNodeName()); 00377 if ( nam == PFNCOLL ) phyelem = c1; 00378 if ( nam == LFNCOLL ) logelem = c1; 00379 XMLString::release(&nam); 00380 } 00381 if ( !phyelem ) { 00382 phyelem = doc->createElement(PFNCOLL); 00383 file->appendChild(phyelem); 00384 m_update = true; 00385 } 00386 if ( !logelem ) { 00387 logelem = doc->createElement(LFNCOLL); 00388 file->appendChild(logelem); 00389 m_update = true; 00390 } 00391 return std::make_pair(logelem,phyelem); 00392 } 00393 printError("Cannot update readonly catalog!"); 00394 return std::pair<DOMElement*, DOMElement*>(0,0); 00395 }
bool Gaudi::XMLFileCatalog::m_rdOnly [private] |
Definition at line 92 of file XMLFileCatalog.h.
bool Gaudi::XMLFileCatalog::m_update [mutable, private] |
Definition at line 93 of file XMLFileCatalog.h.
xercesc::DOMDocument* Gaudi::XMLFileCatalog::m_doc [private] |
Definition at line 94 of file XMLFileCatalog.h.
xercesc::XercesDOMParser* Gaudi::XMLFileCatalog::m_parser [private] |
Definition at line 95 of file XMLFileCatalog.h.
xercesc::ErrorHandler* Gaudi::XMLFileCatalog::m_errHdlr [private] |
Definition at line 96 of file XMLFileCatalog.h.
std::string Gaudi::XMLFileCatalog::m_file [private] |
Definition at line 97 of file XMLFileCatalog.h.
IMessageSvc* Gaudi::XMLFileCatalog::m_msgSvc [private] |
Definition at line 98 of file XMLFileCatalog.h.