Gaudi::XMLFileCatalog Class Reference

This class constitutes the core of the XML based FileCatalog API for POOL. More...

#include <src/component/XMLFileCatalog.h>

Inheritance diagram for Gaudi::XMLFileCatalog:
Collaboration diagram for Gaudi::XMLFileCatalog:

Public Member Functions

 XMLFileCatalog (CSTR url, IMessageSvc *m)
 Create a catalog file, initialization of XercesC. More...
 
virtual ~XMLFileCatalog ()=default
 Destructor,. More...
 
virtual std::string createFID () const
 Catalog interface. More...
 
virtual CSTR connectInfo () const
 Access to connect string. More...
 
virtual void init ()
 Parse the DOM tree of the XML catalog. More...
 
virtual void commit ()
 Save DOM catalog to file. More...
 
virtual void rollback ()
 Save DOM catalog to file. More...
 
virtual bool readOnly () const
 Check if the catalog is read-only. More...
 
virtual bool dirty () const
 Check if the catalog should be updated. More...
 
virtual bool existsPFN (CSTR pfn) const
 Return the status of a physical file name. More...
 
virtual std::string lookupPFN (CSTR fid) const
 Lookup file identifier by physical file name. More...
 
virtual bool existsLFN (CSTR lfn) const
 Return the status of a logical file name. More...
 
virtual std::string lookupLFN (CSTR lfn) const
 Lookup file identifier by logical file name. More...
 
virtual bool existsFID (CSTR fid) const
 Return the status of a FileID. More...
 
virtual void getPFN (CSTR fid, Files &files) const
 Dump all physical file names of the catalog and their attributes associate to the FileID. More...
 
virtual void getLFN (CSTR fid, Files &files) const
 Dump all logical file names of the catalog associate to the FileID. More...
 
virtual void getFID (Strings &fids) const
 Dump all file Identifiers. More...
 
virtual void deleteFID (CSTR FileID) const
 Delete FileID Node from the catalog. More...
 
virtual void registerPFN (CSTR fid, CSTR pfn, CSTR ftype) const
 Create a FileID and Node of the physical file name with all the attributes. More...
 
virtual void registerLFN (CSTR fid, CSTR lfn) const
 Create a FileID and Node of the logical file name with all the attributes. More...
 
virtual void registerFID (CSTR fid) const
 Create a FileID and Node. More...
 
virtual void getMetaData (CSTR fid, Attributes &attr) const
 Dump all MetaData of the catalog for a given file ID. More...
 
virtual std::string getMetaDataItem (CSTR fid, CSTR name) const
 Access metadata item. More...
 
virtual void setMetaData (CSTR fid, CSTR name, CSTR value) const
 Insert/update metadata item. More...
 
virtual void dropMetaData (CSTR fid) const
 Drop all metadata of one FID. More...
 
virtual void dropMetaData (CSTR fid, CSTR attr) const
 Drop specified metadata item. More...
 
- Public Member Functions inherited from implements< Interfaces >
void * i_cast (const InterfaceID &tid) const override
 Implementation of IInterface::i_cast. More...
 
StatusCode queryInterface (const InterfaceID &ti, void **pp) override
 Implementation of IInterface::queryInterface. More...
 
std::vector< std::string > getInterfaceNames () const override
 Implementation of IInterface::getInterfaceNames. More...
 
 implements ()=default
 Default constructor. More...
 
 implements (const implements &)
 Copy constructor (zero the reference count) More...
 
implementsoperator= (const implements &)
 Assignment operator (do not touch the reference count). More...
 
 ~implements () override=default
 Virtual destructor. More...
 
unsigned long addRef () override
 Reference Interface instance. More...
 
unsigned long release () override
 Release Interface instance. More...
 
unsigned long refCount () const override
 Current reference count. More...
 
void * i_cast (const InterfaceID &tid) const override
 Implementation of IInterface::i_cast. More...
 
StatusCode queryInterface (const InterfaceID &ti, void **pp) override
 Implementation of IInterface::queryInterface. More...
 
std::vector< std::string > getInterfaceNames () const override
 Implementation of IInterface::getInterfaceNames. More...
 
 implements ()=default
 Default constructor. More...
 
 implements (const implements &)
 Copy constructor (zero the reference count) More...
 
implementsoperator= (const implements &)
 Assignment operator (do not touch the reference count). More...
 
 ~implements () override=default
 Virtual destructor. More...
 
unsigned long addRef () override
 Reference Interface instance. More...
 
unsigned long release () override
 Release Interface instance. More...
 
unsigned long refCount () const override
 Current reference count. More...
 
- Public Member Functions inherited from extend_interfaces< Interfaces...>
 ~extend_interfaces () override=default
 Virtual destructor. More...
 
 ~extend_interfaces () override=default
 Virtual destructor. More...
 

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
 
std::unique_ptr< xercesc::XercesDOMParser > m_parser
 
std::unique_ptr< xercesc::ErrorHandler > m_errHdlr
 
std::string m_file
 
IMessageSvcm_msgSvc
 

Additional Inherited Members

- Public Types inherited from implements< Interfaces >
using base_class = implements< Interfaces...>
 Typedef to this class. More...
 
using extend_interfaces_base = extend_interfaces< Interfaces...>
 Typedef to the base of this class. More...
 
using iids = typename extend_interfaces_base::ext_iids
 
using base_class = implements< Interfaces...>
 Typedef to this class. More...
 
using extend_interfaces_base = extend_interfaces< Interfaces...>
 Typedef to the base of this class. More...
 
using iids = typename extend_interfaces_base::ext_iids
 
- Public Types inherited from extend_interfaces< Interfaces...>
using ext_iids = typename Gaudi::interface_list_cat< typename Interfaces::ext_iids...>::type
 take union of the ext_iids of all Interfaces... More...
 
using ext_iids = typename Gaudi::interface_list_cat< typename Interfaces::ext_iids...>::type
 take union of the ext_iids of all Interfaces... More...
 
- Protected Attributes inherited from implements< Interfaces >
unsigned long m_refCount = 0
 Reference counter. More...
 

Detailed Description

This class constitutes the core of the XML based FileCatalog API for POOL.

It uses the DOM model and the external XercesC library for parsing.

Definition at line 25 of file XMLFileCatalog.h.

Member Typedef Documentation

typedef const std::string& Gaudi::XMLFileCatalog::CSTR
protected

Definition at line 27 of file XMLFileCatalog.h.

Constructor & Destructor Documentation

XMLFileCatalog::XMLFileCatalog ( CSTR  url,
IMessageSvc m 
)

Create a catalog file, initialization of XercesC.

Definition at line 205 of file XMLFileCatalog.cpp.

206 : m_rdOnly(false),m_update(false),m_doc(0),
207  m_file(uri), m_msgSvc(m)
208 {
209 }
xercesc::DOMDocument * m_doc
IMessageSvc * m_msgSvc
virtual Gaudi::XMLFileCatalog::~XMLFileCatalog ( )
virtualdefault

Destructor,.

Member Function Documentation

DOMNode * XMLFileCatalog::child ( xercesc::DOMNode *  par,
CSTR  tag,
CSTR  attr = "",
CSTR  val = "" 
) const
private

Definition at line 303 of file XMLFileCatalog.cpp.

303  {
304  for(XMLCollection c(par); c; ++c ) {
305  if( c.tag() == tag ) {
306  if( !attr.empty() && c.attr(attr) != val) continue;
307  return c;
308  }
309  }
310  return 0;
311 }
tuple c
Definition: gaudirun.py:392
void XMLFileCatalog::commit ( )
virtual

Save DOM catalog to file.

Definition at line 459 of file XMLFileCatalog.cpp.

459  {
460  try {
461  if ( dirty() && !readOnly() ) {
462  string xmlfile = getfile(true);
463  XMLStr ii("LS");
464  DOMImplementation *imp = DOMImplementationRegistry::getDOMImplementation(ii);
465  std::unique_ptr<XMLFormatTarget> tar{ new LocalFileFormatTarget(xmlfile.c_str()) };
466 #if _XERCES_VERSION <= 30000
467  DOMWriter *wr = imp->createDOMWriter();
468  wr->setFeature(XMLUni::fgDOMWRTFormatPrettyPrint, true);
469  wr->writeNode(tar.get(), *m_doc);
470  wr->release();
471 #else
472  DOMLSOutput *output = imp->createLSOutput();
473  output->setByteStream(tar.get());
474  DOMLSSerializer *wr = imp->createLSSerializer();
475  wr->getDomConfig()->setParameter(XMLStr("format-pretty-print"), true);
476  wr->write(m_doc, output);
477  output->release();
478  wr->release();
479 #endif
480  }
481  }
482  catch ( exception& e ) {
483  printError(string("Cannot open output file:")+e.what());
484  }
485  catch (...) {
486  printError("Unknown IO rrror.");
487  }
488 }
virtual bool readOnly() const
Check if the catalog is read-only.
std::string getfile(bool create)
virtual bool dirty() const
Check if the catalog should be updated.
void printError(CSTR msg, bool throw_exc=true) const
xercesc::DOMDocument * m_doc
virtual CSTR Gaudi::XMLFileCatalog::connectInfo ( ) const
inlinevirtual

Access to connect string.

Definition at line 39 of file XMLFileCatalog.h.

39 { return m_file; }
std::string XMLFileCatalog::createFID ( ) const
virtual

Catalog interface.

Create file identifier using UUID mechanism.

Create file identifier using UUID mechanism

Definition at line 212 of file XMLFileCatalog.cpp.

212  {
213  return createGuidAsString();
214 }
std::string createGuidAsString()
Create file identifier using UUID mechanism.
void XMLFileCatalog::deleteFID ( CSTR  FileID) const
virtual

Delete FileID Node from the catalog.

Definition at line 349 of file XMLFileCatalog.cpp.

349  {
350  DOMNode *pn = nullptr, *fn = element(fid);
351  if ( fn ) pn = fn->getParentNode();
352  if ( pn ) pn->removeChild(fn);
353 }
xercesc::DOMNode * element(CSTR fid, bool print_err=true) const
virtual bool Gaudi::XMLFileCatalog::dirty ( ) const
inlinevirtual

Check if the catalog should be updated.

Definition at line 49 of file XMLFileCatalog.h.

49 { return m_update; }
virtual void Gaudi::XMLFileCatalog::dropMetaData ( CSTR  fid) const
inlinevirtual

Drop all metadata of one FID.

Definition at line 81 of file XMLFileCatalog.h.

81 { dropMetaData(fid,"*"); }
virtual void dropMetaData(CSTR fid) const
Drop all metadata of one FID.
void XMLFileCatalog::dropMetaData ( CSTR  fid,
CSTR  attr 
) const
virtual

Drop specified metadata item.

Definition at line 334 of file XMLFileCatalog.cpp.

334  {
335  vector<DOMNode*> gbc;
336  DOMNode* fn = getDoc(true)->getElementById(XMLStr(fid));
337  for(XMLCollection c{child(fn,MetaNode)}; c; ++c)
338  if ( attr[0]=='*' || !c.attr(attr).empty() ) gbc.push_back(c);
339  for(const auto &i : gbc)
340  fn->removeChild(i);
341 }
tuple c
Definition: gaudirun.py:392
xercesc::DOMNode * child(xercesc::DOMNode *par, CSTR tag, CSTR attr="", CSTR val="") const
xercesc::DOMDocument * getDoc(bool throw_if_no_exists=true) const
list i
Definition: ana.py:128
DOMNode * XMLFileCatalog::element ( CSTR  fid,
bool  print_err = true 
) const
private

Definition at line 343 of file XMLFileCatalog.cpp.

343  {
344  DOMNode* node = getDoc(true)->getElementById(XMLStr(element_name));
345  if ( !node && print_err ) printError("Cannot find element:"+element_name);
346  return node;
347 }
void printError(CSTR msg, bool throw_exc=true) const
xercesc::DOMDocument * getDoc(bool throw_if_no_exists=true) const
virtual bool Gaudi::XMLFileCatalog::existsFID ( CSTR  fid) const
inlinevirtual

Return the status of a FileID.

Definition at line 59 of file XMLFileCatalog.h.

59 { return element(fid,false) != 0; }
xercesc::DOMNode * element(CSTR fid, bool print_err=true) const
virtual bool Gaudi::XMLFileCatalog::existsLFN ( CSTR  lfn) const
inlinevirtual

Return the status of a logical file name.

Definition at line 55 of file XMLFileCatalog.h.

55 { return element(lfn,false) != 0; }
xercesc::DOMNode * element(CSTR fid, bool print_err=true) const
virtual bool Gaudi::XMLFileCatalog::existsPFN ( CSTR  pfn) const
inlinevirtual

Return the status of a physical file name.

Definition at line 51 of file XMLFileCatalog.h.

51 { return element(pfn,false) != 0; }
xercesc::DOMNode * element(CSTR fid, bool print_err=true) const
DOMDocument * XMLFileCatalog::getDoc ( bool  throw_if_no_exists = true) const
private

Definition at line 216 of file XMLFileCatalog.cpp.

216  {
217  if ( !m_doc && throw_if_no_exists )
218  printError("The XML catalog was not started.",true);
219  return m_doc;
220 }
void printError(CSTR msg, bool throw_exc=true) const
xercesc::DOMDocument * m_doc
void XMLFileCatalog::getFID ( Strings &  fids) const
virtual

Dump all file Identifiers.

Definition at line 276 of file XMLFileCatalog.cpp.

276  {
277  fids.clear();
278  DOMNode* fde = getDoc(true)->getElementsByTagName(XMLStr("*"))->item(0);
279  for(XMLCollection c(child(fde,"File"), false); c; ++c)
280  fids.push_back(c.attr(Attr_ID));
281 }
tuple c
Definition: gaudirun.py:392
xercesc::DOMNode * child(xercesc::DOMNode *par, CSTR tag, CSTR attr="", CSTR val="") const
xercesc::DOMDocument * getDoc(bool throw_if_no_exists=true) const
string XMLFileCatalog::getfile ( bool  create)
private

Definition at line 490 of file XMLFileCatalog.cpp.

490  {
491  string protocol, path;
492  XMLURL xerurl;
493  try{
494  xerurl = (const XMLCh*)XMLStr(m_file);
495  protocol = _toString(xerurl.getProtocolName());
496  path = _toString(xerurl.getPath());
497  }
498  catch (const XMLException& e ) {
499  printError(_toString(e.getMessage()));
500  }
501  if ( protocol.empty() ) {
502  printError("Missing protocol.");
503  }
504  else if ( protocol == "http" || protocol == "ftp" ) {
505  m_rdOnly = true;
506  }
507  else if ( protocol == "file" ) {
508  m_rdOnly = false;
509  struct stat buff;
510  int exist = ::stat(path.c_str(),&buff) != -1;
511  if ( create && !exist ) {
512  MsgStream log(m_msgSvc,"XMLCatalog");
513  log << MSG::INFO << "File '" << path << "' does not exist. New file created." << endmsg;
514  ofstream out{path};
515  if( !m_rdOnly && out.is_open() ) {
516  out << (CSTR)EmptyCatalog << endl;
517  }
518  else {
519  printError("Problem creating file "+path);
520  }
521  out.close();
522  }
523  else if ( exist ) {
524  return path;
525  }
526  else if ( !create ) {
527  return "";
528  }
529  }
530  else {
531  printError(protocol + ": protocol not supported.");
532  }
533  return path;
534 }
Definition of the MsgStream class used to transmit messages.
Definition: MsgStream.h:24
MsgStream & endmsg(MsgStream &s)
MsgStream Modifier: endmsg. Calls the output method of the MsgStream.
Definition: MsgStream.h:244
list path
Definition: __init__.py:15
const std::string & CSTR
void printError(CSTR msg, bool throw_exc=true) const
IMessageSvc * m_msgSvc
void XMLFileCatalog::getLFN ( CSTR  fid,
Files &  files 
) const
virtual

Dump all logical file names of the catalog associate to the FileID.

Definition at line 289 of file XMLFileCatalog.cpp.

289  {
290  files.clear();
291  for(XMLCollection c(child(child(element(fid,false),LFNCOLL),LFNNODE), false); c; ++c)
292  files.emplace_back(c.attr(Attr_name),fid);
293 }
tuple c
Definition: gaudirun.py:392
xercesc::DOMNode * element(CSTR fid, bool print_err=true) const
xercesc::DOMNode * child(xercesc::DOMNode *par, CSTR tag, CSTR attr="", CSTR val="") const
void XMLFileCatalog::getMetaData ( CSTR  fid,
Attributes &  attr 
) const
virtual

Dump all MetaData of the catalog for a given file ID.

Definition at line 295 of file XMLFileCatalog.cpp.

295  {
296  attr.clear();
297  for(XMLCollection c(child(element(fid),MetaNode), false); c; ++c)
298  attr.emplace_back(c.attr(Attr_metaName),c.attr(Attr_metaValue));
299  if ( attr.size() > 0 )
300  attr.emplace_back("guid",fid);
301 }
tuple c
Definition: gaudirun.py:392
xercesc::DOMNode * element(CSTR fid, bool print_err=true) const
xercesc::DOMNode * child(xercesc::DOMNode *par, CSTR tag, CSTR attr="", CSTR val="") const
string XMLFileCatalog::getMetaDataItem ( CSTR  fid,
CSTR  name 
) const
virtual

Access metadata item.

Definition at line 329 of file XMLFileCatalog.cpp.

329  {
330  XMLCollection c(child(getDoc(true)->getElementById(XMLStr(fid)),MetaNode,Attr_metaName,attr));
331  return c ? c.attr(attr) : string("");
332 }
tuple c
Definition: gaudirun.py:392
xercesc::DOMNode * child(xercesc::DOMNode *par, CSTR tag, CSTR attr="", CSTR val="") const
xercesc::DOMDocument * getDoc(bool throw_if_no_exists=true) const
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 283 of file XMLFileCatalog.cpp.

283  {
284  files.clear();
285  for(XMLCollection c(child(child(element(fid,false),PFNCOLL),PFNNODE), false); c; ++c)
286  files.emplace_back(c.attr(Attr_name),c.attr(Attr_ftype));
287 }
tuple c
Definition: gaudirun.py:392
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< DOMElement *, DOMElement * > XMLFileCatalog::i_registerFID ( CSTR  fid) const
private

It creates a new node File with name = fid in the XML file catalog

Definition at line 366 of file XMLFileCatalog.cpp.

366  {
367  if ( !readOnly() ) {
369  DOMElement *file = (DOMElement*)element(fid,false), *phyelem = 0, *logelem = 0;
370  DOMDocument* doc = getDoc(true);
371  if ( !file ) {
372  DOMNode* fde = doc->getElementsByTagName(XMLStr("*"))->item(0);
373  file = m_doc->createElement(XMLStr("File"));
374  file->setAttribute(Attr_ID, XMLStr(fid));
375  file->setIdAttribute(Attr_ID, true);
376  fde->appendChild(file);
377  m_update = true;
378  }
379  for(XMLCollection c1(file); c1; ++c1 ) {
380  char* nam = XMLString::transcode(c1->getNodeName());
381  if ( nam == PFNCOLL ) phyelem = c1;
382  if ( nam == LFNCOLL ) logelem = c1;
383  XMLString::release(&nam);
384  }
385  if ( !phyelem ) {
386  phyelem = doc->createElement(PFNCOLL);
387  file->appendChild(phyelem);
388  m_update = true;
389  }
390  if ( !logelem ) {
391  logelem = doc->createElement(LFNCOLL);
392  file->appendChild(logelem);
393  m_update = true;
394  }
395  return std::make_pair(logelem,phyelem);
396  }
397  printError("Cannot update readonly catalog!");
398  return std::pair<DOMElement*, DOMElement*>(0,0);
399 }
virtual bool readOnly() const
Check if the catalog is read-only.
xercesc::DOMNode * element(CSTR fid, bool print_err=true) const
void printError(CSTR msg, bool throw_exc=true) const
xercesc::DOMDocument * m_doc
xercesc::DOMDocument * getDoc(bool throw_if_no_exists=true) const
list file
Definition: ana.py:160
void XMLFileCatalog::init ( )
virtual

Parse the DOM tree of the XML catalog.

Definition at line 230 of file XMLFileCatalog.cpp.

230  {
231  string xmlFile = getfile(false);
232  try{
233  m_parser.reset( new XercesDOMParser );
234  m_parser->setValidationScheme(XercesDOMParser::Val_Auto);
235  m_parser->setDoNamespaces(false);
236  DTDRedirect dtdinmem;
237  m_parser->setEntityResolver(&dtdinmem);
238  if ( ! m_errHdlr ) m_errHdlr.reset( new ErrHandler(m_msgSvc) );
239  m_parser->setErrorHandler(m_errHdlr.get());
240  if ( !xmlFile.empty() ) {
241  m_parser->parse(xmlFile.c_str());
242  }
243  else {
244  const std::string& s = EmptyCatalog;
245  MemBufInputSource src((const XMLByte*)s.c_str(),s.length(),"MemCatalog");
246  m_parser->parse(src);
247  }
248  m_doc = m_parser->getDocument();
249  }
250  catch (const XMLException& e) {
251  printError("XML parse error["+xmlFile+"]: "+_toString(e.getMessage()));
252  }
253  catch (const DOMException& e) {
254  printError("XML parse error["+xmlFile+"]: "+_toString(e.getMessage()));
255  }
256  catch (...) {
257  printError("UNKNOWN XML parse error in file "+xmlFile);
258  }
259 }
std::string getfile(bool create)
std::unique_ptr< xercesc::XercesDOMParser > m_parser
void printError(CSTR msg, bool throw_exc=true) const
std::unique_ptr< xercesc::ErrorHandler > m_errHdlr
xercesc::DOMDocument * m_doc
string s
Definition: gaudirun.py:246
IMessageSvc * m_msgSvc
string XMLFileCatalog::lookupFID ( CSTR  lfn) const
private

Definition at line 261 of file XMLFileCatalog.cpp.

261  {
262  std::string result;
263  DOMNode* e = element(fid,false);
264  e = e ? e->getParentNode() : 0; // Mode up to <logical>
265  e = e ? e->getParentNode() : 0; // Mode up to <File>
266  if ( e ) {
267  if ( e->getAttributes() ) { // Need to check this. The node may be no DOMElement
268  char* nam = XMLString::transcode(((DOMElement*)e)->getAttribute(Attr_ID));
269  if ( nam ) result = nam;
270  XMLString::release(&nam);
271  }
272  }
273  return result;
274 }
xercesc::DOMNode * element(CSTR fid, bool print_err=true) const
virtual std::string Gaudi::XMLFileCatalog::lookupLFN ( CSTR  lfn) const
inlinevirtual

Lookup file identifier by logical file name.

Definition at line 57 of file XMLFileCatalog.h.

57 { return lookupFID(lfn); }
std::string lookupFID(CSTR lfn) const
virtual std::string Gaudi::XMLFileCatalog::lookupPFN ( CSTR  fid) const
inlinevirtual

Lookup file identifier by physical file name.

Definition at line 53 of file XMLFileCatalog.h.

53 { return lookupFID(fid); }
std::string lookupFID(CSTR lfn) const
void XMLFileCatalog::printError ( CSTR  msg,
bool  throw_exc = true 
) const
private

Definition at line 222 of file XMLFileCatalog.cpp.

222  {
223  MsgStream log(m_msgSvc,"XMLCatalog");
224  log << MSG::FATAL << msg << endmsg;
225  if ( rethrow ) {
226  throw runtime_error("XMLFileCatalog> "+msg);
227  }
228 }
Definition of the MsgStream class used to transmit messages.
Definition: MsgStream.h:24
MsgStream & endmsg(MsgStream &s)
MsgStream Modifier: endmsg. Calls the output method of the MsgStream.
Definition: MsgStream.h:244
IMessageSvc * m_msgSvc
virtual bool Gaudi::XMLFileCatalog::readOnly ( ) const
inlinevirtual

Check if the catalog is read-only.

Definition at line 47 of file XMLFileCatalog.h.

47 { return m_rdOnly; }
void XMLFileCatalog::registerFID ( CSTR  fid) const
virtual

Create a FileID and Node.

Definition at line 355 of file XMLFileCatalog.cpp.

355  {
356  if ( !fid.empty() ) {
357  std::pair<DOMElement*, DOMElement*> res = i_registerFID(fid);
358  if ( res.first == 0 || res.second == 0 ) {
359  printError("Failed to register FID:"+fid);
360  }
361  return;
362  }
363  throw runtime_error("XMLFileCatalog> Cannot register LFN for invalid FID:"+fid);
364 }
void printError(CSTR msg, bool throw_exc=true) const
std::pair< xercesc::DOMElement *, xercesc::DOMElement * > i_registerFID(CSTR fid) const
void XMLFileCatalog::registerLFN ( CSTR  fid,
CSTR  lfn 
) const
virtual

Create a FileID and Node of the logical file name with all the attributes.

Definition at line 431 of file XMLFileCatalog.cpp.

431  {
432  if ( !fid.empty() ) {
433  std::pair<DOMElement*, DOMElement*> res = i_registerFID(fid);
434  DOMElement* logelem = res.first, *fnelem = 0;
435  for(XMLCollection c(logelem); c; ++c ) {
436  char* nam = XMLString::transcode(c->getNodeName());
437  if ( nam == LFNNODE ) {
438  XMLString::release(&nam);
439  nam = XMLString::transcode(c->getAttribute(Attr_name));
440  if ( nam == lfn ) {
441  XMLString::release(&nam);
442  fnelem = c;
443  break;
444  }
445  }
446  }
447  if ( !fnelem ) {
448  fnelem = getDoc(true)->createElement(LFNNODE);
449  logelem->appendChild(fnelem);
450  fnelem->setAttribute(Attr_name,XMLStr(lfn));
451  fnelem->setIdAttribute(Attr_name, true);
452  m_update = true;
453  }
454  return;
455  }
456  throw runtime_error("XMLFileCatalog> Cannot register LFN for invalid FID:"+fid);
457 }
tuple c
Definition: gaudirun.py:392
xercesc::DOMDocument * getDoc(bool throw_if_no_exists=true) const
std::pair< xercesc::DOMElement *, xercesc::DOMElement * > i_registerFID(CSTR fid) const
void XMLFileCatalog::registerPFN ( CSTR  fid,
CSTR  pfn,
CSTR  ftype 
) const
virtual

Create a FileID and Node of the physical file name with all the attributes.

Definition at line 401 of file XMLFileCatalog.cpp.

401  {
402  if ( !fid.empty() ) {
403  std::pair<DOMElement*,DOMElement*> res = i_registerFID(fid);
404  DOMElement* phyelem = res.second, *fnelem = 0;
405  for(XMLCollection c(phyelem); c; ++c ) {
406  char* nam = XMLString::transcode(c->getNodeName());
407  if ( nam == PFNNODE ) {
408  XMLString::release(&nam);
409  nam = XMLString::transcode(c->getAttribute(Attr_name));
410  if ( nam == pfn ) {
411  XMLString::release(&nam);
412  fnelem = c;
413  break;
414  }
415  }
416  XMLString::release(&nam);
417  }
418  if ( !fnelem ) {
419  fnelem = getDoc(true)->createElement(PFNNODE);
420  phyelem->appendChild(fnelem);
421  fnelem->setAttribute(Attr_ftype,XMLStr(ftype));
422  fnelem->setAttribute(Attr_name,XMLStr(pfn));
423  fnelem->setIdAttribute(Attr_name, true);
424  m_update = true;
425  }
426  return;
427  }
428  throw runtime_error("XMLFileCatalog> Cannot register PFN for invalid FID:"+fid);
429 }
tuple c
Definition: gaudirun.py:392
xercesc::DOMDocument * getDoc(bool throw_if_no_exists=true) const
std::pair< xercesc::DOMElement *, xercesc::DOMElement * > i_registerFID(CSTR fid) const
virtual void Gaudi::XMLFileCatalog::rollback ( )
inlinevirtual

Save DOM catalog to file.

Definition at line 45 of file XMLFileCatalog.h.

45 { if ( dirty() ) init(); }
virtual void init()
Parse the DOM tree of the XML catalog.
virtual bool dirty() const
Check if the catalog should be updated.
void XMLFileCatalog::setMetaData ( CSTR  fid,
CSTR  name,
CSTR  value 
) const
virtual

Insert/update metadata item.

Definition at line 313 of file XMLFileCatalog.cpp.

313  {
314  if ( !readOnly() ) {
315  DOMNode* node = element(fid);
316  DOMElement* mnod = (DOMElement*)child(node,MetaNode,Attr_metaName,attr);
317  if (!mnod){
318  mnod = getDoc(true)->createElement(MetaNode);
319  node->appendChild(mnod);
320  mnod->setAttribute(Attr_metaName,XMLStr(attr));
321  }
322  mnod->setAttribute(Attr_metaValue,XMLStr(val));
323  m_update = true;
324  return;
325  }
326  printError("Cannot update readonly catalog!");
327 }
virtual bool readOnly() const
Check if the catalog is read-only.
xercesc::DOMNode * element(CSTR fid, bool print_err=true) const
xercesc::DOMNode * child(xercesc::DOMNode *par, CSTR tag, CSTR attr="", CSTR val="") const
void printError(CSTR msg, bool throw_exc=true) const
xercesc::DOMDocument * getDoc(bool throw_if_no_exists=true) const

Member Data Documentation

xercesc::DOMDocument* Gaudi::XMLFileCatalog::m_doc
private

Definition at line 94 of file XMLFileCatalog.h.

std::unique_ptr<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.

std::unique_ptr<xercesc::XercesDOMParser> Gaudi::XMLFileCatalog::m_parser
private

Definition at line 95 of file XMLFileCatalog.h.

bool Gaudi::XMLFileCatalog::m_rdOnly
private

Definition at line 92 of file XMLFileCatalog.h.

bool Gaudi::XMLFileCatalog::m_update
mutableprivate

Definition at line 93 of file XMLFileCatalog.h.


The documentation for this class was generated from the following files: