|
Gaudi Framework, version v21r11 |
| Home | Generated: 30 Sep 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 214 of file XMLFileCatalog.cpp.
00214 { 00215 return createGuidAsString(); 00216 }
| virtual CSTR Gaudi::XMLFileCatalog::connectInfo | ( | ) | const [inline, virtual] |
| void XMLFileCatalog::init | ( | ) | [virtual] |
Parse the DOM tree of the XML catalog.
Definition at line 232 of file XMLFileCatalog.cpp.
00232 { 00233 string xmlFile = getfile(false); 00234 try{ 00235 if ( m_parser ) delete m_parser; 00236 m_parser = new XercesDOMParser; 00237 m_parser->setValidationScheme(XercesDOMParser::Val_Auto); 00238 m_parser->setDoNamespaces(false); 00239 DTDRedirect dtdinmem; 00240 m_parser->setEntityResolver(&dtdinmem); 00241 if ( ! m_errHdlr ) m_errHdlr = new ErrHandler(m_msgSvc); 00242 m_parser->setErrorHandler(m_errHdlr); 00243 if ( !xmlFile.empty() ) { 00244 m_parser->parse(xmlFile.c_str()); 00245 } 00246 else { 00247 const std::string& s = EmptyCatalog; 00248 MemBufInputSource src((const XMLByte*)s.c_str(),s.length(),"MemCatalog"); 00249 m_parser->parse(src); 00250 } 00251 m_doc = m_parser->getDocument(); 00252 } 00253 catch (const XMLException& e) { 00254 printError("XML parse error["+xmlFile+"]: "+_toString(e.getMessage())); 00255 } 00256 catch (const DOMException& e) { 00257 printError("XML parse error["+xmlFile+"]: "+_toString(e.getMessage())); 00258 } 00259 catch (...) { 00260 printError("UNKNOWN XML parse error in file "+xmlFile); 00261 } 00262 }
| void XMLFileCatalog::commit | ( | ) | [virtual] |
Save DOM catalog to file.
Definition at line 462 of file XMLFileCatalog.cpp.
00462 { 00463 try { 00464 if ( dirty() && !readOnly() ) { 00465 string xmlfile = getfile(true); 00466 XMLStr ii("LS"); 00467 DOMImplementation *imp = DOMImplementationRegistry::getDOMImplementation(ii); 00468 XMLFormatTarget *tar = new LocalFileFormatTarget(xmlfile.c_str()); 00469 #if _XERCES_VERSION <= 30000 00470 DOMWriter *wr = imp->createDOMWriter(); 00471 wr->setFeature(XMLUni::fgDOMWRTFormatPrettyPrint, true); 00472 wr->writeNode(tar, *m_doc); 00473 wr->release(); 00474 #else 00475 DOMLSOutput *output = imp->createLSOutput(); 00476 output->setByteStream(tar); 00477 DOMLSSerializer *wr = imp->createLSSerializer(); 00478 wr->getDomConfig()->setParameter(XMLStr("format-pretty-print"), true); 00479 wr->write(m_doc, output); 00480 output->release(); 00481 wr->release(); 00482 #endif 00483 delete tar; 00484 } 00485 } 00486 catch ( exception& e ) { 00487 printError(string("Cannot open output file:")+e.what()); 00488 } 00489 catch (...) { 00490 printError("Unknown IO rrror."); 00491 } 00492 }
| 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; }
| virtual bool Gaudi::XMLFileCatalog::existsPFN | ( | CSTR | pfn | ) | const [inline, virtual] |
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); }
| virtual bool Gaudi::XMLFileCatalog::existsLFN | ( | CSTR | lfn | ) | const [inline, virtual] |
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); }
| virtual bool Gaudi::XMLFileCatalog::existsFID | ( | CSTR | fid | ) | const [inline, virtual] |
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 286 of file XMLFileCatalog.cpp.
00286 { 00287 files.clear(); 00288 for(XMLCollection c(child(child(element(fid,false),PFNCOLL),PFNNODE), false); c; ++c) 00289 files.push_back(make_pair(c.attr(Attr_name),c.attr(Attr_ftype))); 00290 }
| void XMLFileCatalog::getLFN | ( | CSTR | fid, | |
| Files & | files | |||
| ) | const [virtual] |
Dump all logical file names of the catalog associate to the FileID.
Definition at line 292 of file XMLFileCatalog.cpp.
00292 { 00293 files.clear(); 00294 for(XMLCollection c(child(child(element(fid,false),LFNCOLL),LFNNODE), false); c; ++c) 00295 files.push_back(make_pair(c.attr(Attr_name),fid)); 00296 }
| void XMLFileCatalog::getFID | ( | Strings & | fids | ) | const [virtual] |
| void XMLFileCatalog::deleteFID | ( | CSTR | FileID | ) | const [virtual] |
Delete FileID Node from the catalog.
Definition at line 352 of file XMLFileCatalog.cpp.
00352 { 00353 DOMNode *pn = 0, *fn = element(fid); 00354 if ( fn ) pn = fn->getParentNode(); 00355 if ( pn ) pn->removeChild(fn); 00356 }
Create a FileID and Node of the physical file name with all the attributes.
Definition at line 404 of file XMLFileCatalog.cpp.
00404 { 00405 if ( !fid.empty() ) { 00406 std::pair<DOMElement*,DOMElement*> res = i_registerFID(fid); 00407 DOMElement* phyelem = res.second, *fnelem = 0; 00408 for(XMLCollection c(phyelem); c; ++c ) { 00409 char* nam = XMLString::transcode(c->getNodeName()); 00410 if ( nam == PFNNODE ) { 00411 XMLString::release(&nam); 00412 nam = XMLString::transcode(c->getAttribute(Attr_name)); 00413 if ( nam == pfn ) { 00414 XMLString::release(&nam); 00415 fnelem = c; 00416 break; 00417 } 00418 } 00419 XMLString::release(&nam); 00420 } 00421 if ( !fnelem ) { 00422 fnelem = getDoc(true)->createElement(PFNNODE); 00423 phyelem->appendChild(fnelem); 00424 fnelem->setAttribute(Attr_ftype,XMLStr(ftype)); 00425 fnelem->setAttribute(Attr_name,XMLStr(pfn)); 00426 fnelem->setIdAttribute(Attr_name, true); 00427 m_update = true; 00428 } 00429 return; 00430 } 00431 throw runtime_error("XMLFileCatalog> Cannot register PFN for invalid FID:"+fid); 00432 }
Create a FileID and Node of the logical file name with all the attributes.
Definition at line 434 of file XMLFileCatalog.cpp.
00434 { 00435 if ( !fid.empty() ) { 00436 std::pair<DOMElement*, DOMElement*> res = i_registerFID(fid); 00437 DOMElement* logelem = res.first, *fnelem = 0; 00438 for(XMLCollection c(logelem); c; ++c ) { 00439 char* nam = XMLString::transcode(c->getNodeName()); 00440 if ( nam == LFNNODE ) { 00441 XMLString::release(&nam); 00442 nam = XMLString::transcode(c->getAttribute(Attr_name)); 00443 if ( nam == lfn ) { 00444 XMLString::release(&nam); 00445 fnelem = c; 00446 break; 00447 } 00448 } 00449 } 00450 if ( !fnelem ) { 00451 fnelem = getDoc(true)->createElement(LFNNODE); 00452 logelem->appendChild(fnelem); 00453 fnelem->setAttribute(Attr_name,XMLStr(lfn)); 00454 fnelem->setIdAttribute(Attr_name, true); 00455 m_update = true; 00456 } 00457 return; 00458 } 00459 throw runtime_error("XMLFileCatalog> Cannot register LFN for invalid FID:"+fid); 00460 }
| void XMLFileCatalog::registerFID | ( | CSTR | fid | ) | const [virtual] |
Create a FileID and Node.
Definition at line 358 of file XMLFileCatalog.cpp.
00358 { 00359 if ( !fid.empty() ) { 00360 std::pair<DOMElement*, DOMElement*> res = i_registerFID(fid); 00361 if ( res.first == 0 || res.second == 0 ) { 00362 printError("Failed to register FID:"+fid); 00363 } 00364 return; 00365 } 00366 throw runtime_error("XMLFileCatalog> Cannot register LFN for invalid FID:"+fid); 00367 }
| void XMLFileCatalog::getMetaData | ( | CSTR | fid, | |
| Attributes & | attr | |||
| ) | const [virtual] |
Dump all MetaData of the catalog for a given file ID.
Definition at line 298 of file XMLFileCatalog.cpp.
00298 { 00299 attr.clear(); 00300 for(XMLCollection c(child(element(fid),MetaNode), false); c; ++c) 00301 attr.push_back(make_pair(c.attr(Attr_metaName),c.attr(Attr_metaValue))); 00302 if ( attr.size() > 0 ) 00303 attr.push_back(make_pair("guid",fid)); 00304 }
Insert/update metadata item.
Definition at line 316 of file XMLFileCatalog.cpp.
00316 { 00317 if ( !readOnly() ) { 00318 DOMNode* node = element(fid); 00319 DOMElement* mnod = (DOMElement*)child(node,MetaNode,Attr_metaName,attr); 00320 if (!mnod){ 00321 mnod = getDoc(true)->createElement(MetaNode); 00322 node->appendChild(mnod); 00323 mnod->setAttribute(Attr_metaName,XMLStr(attr)); 00324 } 00325 mnod->setAttribute(Attr_metaValue,XMLStr(val)); 00326 m_update = true; 00327 return; 00328 } 00329 printError("Cannot update readonly catalog!"); 00330 }
| 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 337 of file XMLFileCatalog.cpp.
00337 { 00338 vector<DOMNode*> gbc; 00339 DOMNode* fn = getDoc(true)->getElementById(XMLStr(fid)); 00340 for(XMLCollection c(child(fn,MetaNode)); c; ++c) 00341 if ( attr[0]=='*' || !c.attr(attr).empty() ) gbc.push_back(c); 00342 for(vector<DOMNode*>::iterator i=gbc.begin(); i != gbc.end(); i++) 00343 fn->removeChild(*i); 00344 }
| DOMDocument * XMLFileCatalog::getDoc | ( | bool | throw_if_no_exists = true |
) | const [private] |
Definition at line 218 of file XMLFileCatalog.cpp.
00218 { 00219 if ( !m_doc && throw_if_no_exists ) 00220 printError("The XML catalog was not started.",true); 00221 return m_doc; 00222 }
| string XMLFileCatalog::getfile | ( | bool | create | ) | [private] |
Definition at line 494 of file XMLFileCatalog.cpp.
00494 { 00495 string protocol, path; 00496 XMLURL xerurl; 00497 try{ 00498 xerurl = (const XMLCh*)XMLStr(m_file); 00499 protocol = _toString(xerurl.getProtocolName()); 00500 path = _toString(xerurl.getPath()); 00501 } 00502 catch (const XMLException& e ) { 00503 printError(_toString(e.getMessage())); 00504 } 00505 if ( protocol.empty() ) { 00506 printError("Missing protocol."); 00507 } 00508 else if ( protocol == "http" || protocol == "ftp" ) { 00509 m_rdOnly = true; 00510 } 00511 else if ( protocol == "file" ) { 00512 m_rdOnly = false; 00513 struct stat buff; 00514 int exist = ::stat(path.c_str(),&buff) != -1; 00515 if ( create && !exist ) { 00516 MsgStream log(m_msgSvc,"XMLCatalog"); 00517 log << MSG::INFO << "File '" << path << "' does not exist. New file created." << endmsg; 00518 ofstream out(path.c_str()); 00519 if( !m_rdOnly && out.is_open() ) { 00520 out << (CSTR)EmptyCatalog << endl; 00521 } 00522 else { 00523 printError("Problem creating file "+path); 00524 } 00525 out.close(); 00526 } 00527 else if ( exist ) { 00528 return path; 00529 } 00530 else if ( !create ) { 00531 return ""; 00532 } 00533 } 00534 else { 00535 printError(protocol + ": protocol not supported."); 00536 } 00537 return path; 00538 }
| void XMLFileCatalog::printError | ( | CSTR | msg, | |
| bool | throw_exc = true | |||
| ) | const [private] |
Definition at line 224 of file XMLFileCatalog.cpp.
00224 { 00225 MsgStream log(m_msgSvc,"XMLCatalog"); 00226 log << MSG::FATAL << msg << endmsg; 00227 if ( rethrow ) { 00228 throw runtime_error("XMLFileCatalog> "+msg); 00229 } 00230 }
| std::string Gaudi::XMLFileCatalog::lookupFID | ( | CSTR | lfn | ) | const [private] |
| DOMNode * XMLFileCatalog::element | ( | CSTR | fid, | |
| bool | print_err = true | |||
| ) | const [private] |
Definition at line 346 of file XMLFileCatalog.cpp.
00346 { 00347 DOMNode* node = getDoc(true)->getElementById(XMLStr(element_name)); 00348 if ( !node && print_err ) printError("Cannot find element:"+element_name); 00349 return node; 00350 }
| 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 369 of file XMLFileCatalog.cpp.
00369 { 00370 if ( !readOnly() ) { 00372 DOMElement *file = (DOMElement*)element(fid,false), *phyelem = 0, *logelem = 0; 00373 DOMDocument* doc = getDoc(true); 00374 if ( !file ) { 00375 DOMNode* fde = doc->getElementsByTagName(XMLStr("*"))->item(0); 00376 file = m_doc->createElement(XMLStr("File")); 00377 file->setAttribute(Attr_ID, XMLStr(fid)); 00378 file->setIdAttribute(Attr_ID, true); 00379 fde->appendChild(file); 00380 m_update = true; 00381 } 00382 for(XMLCollection c1(file); c1; ++c1 ) { 00383 char* nam = XMLString::transcode(c1->getNodeName()); 00384 if ( nam == PFNCOLL ) phyelem = c1; 00385 if ( nam == LFNCOLL ) logelem = c1; 00386 XMLString::release(&nam); 00387 } 00388 if ( !phyelem ) { 00389 phyelem = doc->createElement(PFNCOLL); 00390 file->appendChild(phyelem); 00391 m_update = true; 00392 } 00393 if ( !logelem ) { 00394 logelem = doc->createElement(LFNCOLL); 00395 file->appendChild(logelem); 00396 m_update = true; 00397 } 00398 return std::make_pair(logelem,phyelem); 00399 } 00400 printError("Cannot update readonly catalog!"); 00401 return std::pair<DOMElement*, DOMElement*>(0,0); 00402 }
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.