Gaudi Framework, version v23r2

Home   Generated: Thu Jun 28 2012
Public Member Functions | Private Member Functions | Private Attributes

DataSvcFileEntriesTool Class Reference

Tool to scan a transient store branch that collects all the objects that belong to the same source (file). More...

Inheritance diagram for DataSvcFileEntriesTool:
Inheritance graph
[legend]
Collaboration diagram for DataSvcFileEntriesTool:
Collaboration graph
[legend]

List of all members.

Public Member Functions

 DataSvcFileEntriesTool (const std::string &type, const std::string &name, const IInterface *parent)
 Standard constructor.
virtual ~DataSvcFileEntriesTool ()
 Destructor.
virtual StatusCode initialize ()
 Initialize the tool.
virtual StatusCode finalize ()
 Finalize the tool.
virtual const LeavesList & leaves () const
 Return the list of collected objects.
virtual void handle (const Incident &incident)
 Call-back function for the BeginEvent incident.

Private Member Functions

void i_collectLeaves ()
 Scan the data service starting from the node specified as Root.
void i_collectLeaves (IRegistry *reg)
 Scan the data service starting from the specified node.
IRegistryi_getRootNode ()
 Return the pointer to the IRegistry object associated to the node specified as Root.

Private Attributes

std::string m_dataSvcName
 Variable for the property DataService.
std::string m_rootNode
 Variable for the property Root.
bool m_scanOnBeginEvent
 Variable for the property ScanOnBeginEvent.
SmartIF< IIncidentSvcm_incidentSvc
 Pointer to the incident service.
SmartIF< IDataManagerSvcm_dataMgrSvc
 Pointer to the IDataManagerSvc interface of the data service.
SmartIF< IDataProviderSvcm_dataSvc
 Pointer to the IDataProviderSvc interface of the data service.
LeavesList m_leaves
 Internal cache for the list of objects found during the scan.
std::string m_initialBase
 File ID of the Root node.
bool m_ignoreOriginChange
 Variable for the property ScanOnBeginEvent.

Detailed Description

Tool to scan a transient store branch that collects all the objects that belong to the same source (file).

By default, the list of entries is cached and the cache is cleared at every BeginEvent incident.

Properties:
DataService (string): Name of the data service to use [EventDataSvc]
Root (string): Path to the element from which to start the scan [root of the data service]
ScanOnBeginEvent (bool): If the scan has to be started during the BeginEvent incident (true) or on demand (false, default)

Definition at line 26 of file DataSvcFileEntriesTool.cpp.


Constructor & Destructor Documentation

DataSvcFileEntriesTool::DataSvcFileEntriesTool ( const std::string type,
const std::string name,
const IInterface parent 
)

Standard constructor.

Definition at line 102 of file DataSvcFileEntriesTool.cpp.

                               :
   base_class(type, name, parent) {

  declareProperty("DataService", m_dataSvcName = "EventDataSvc",
      "Name of the data service to use");

  declareProperty("Root", m_rootNode,
      "Path to the element from which to start the scan");

  declareProperty("ScanOnBeginEvent", m_scanOnBeginEvent = false,
      "If the scan has to be started during the BeginEvent incident (true) or on demand (false, default)");

  declareProperty("IgnoreOriginChange", m_ignoreOriginChange = false,
      "Disable the detection of the change in the origin of object between the BeginEvent and the scan");
}
DataSvcFileEntriesTool::~DataSvcFileEntriesTool (  ) [virtual]

Destructor.

Definition at line 120 of file DataSvcFileEntriesTool.cpp.

{}

Member Function Documentation

StatusCode DataSvcFileEntriesTool::finalize (  ) [virtual]

Finalize the tool.

Reimplemented from AlgTool.

Definition at line 155 of file DataSvcFileEntriesTool.cpp.

                                           {
  // unregister from the incident service
  if (m_incidentSvc) {
    m_incidentSvc->removeListener(this, IncidentType::BeginEvent);
  }
  // Release the services
  m_incidentSvc.reset();
  m_dataMgrSvc.reset();
  m_dataSvc.reset();

  return AlgTool::finalize();
}
void DataSvcFileEntriesTool::handle ( const Incident incident ) [virtual]

Call-back function for the BeginEvent incident.

Clears the internal cache, cache the file ID of the Root node and, if the property ScanOnBeginEvent is set to true, scans the data service.

Definition at line 168 of file DataSvcFileEntriesTool.cpp.

                                                            {
  // Get the file id of the root node at every event
  IOpaqueAddress *addr = i_getRootNode()->address();
  if (addr)
    m_initialBase = addr->par()[0];
  else
    m_initialBase.clear(); // use empty file id if there is no address

  m_leaves.clear();
  if (m_scanOnBeginEvent) {
    MsgStream log(msgSvc(), name());
    log << MSG::VERBOSE << "::handle scanning on " << incident.type() << endmsg;
    i_collectLeaves();
  }
}
void DataSvcFileEntriesTool::i_collectLeaves (  ) [private]

Scan the data service starting from the node specified as Root.

Definition at line 201 of file DataSvcFileEntriesTool.cpp.

void DataSvcFileEntriesTool::i_collectLeaves ( IRegistry reg ) [private]

Scan the data service starting from the specified node.

todo: implement the scanning as an IDataStoreAgent

Definition at line 206 of file DataSvcFileEntriesTool.cpp.

                                                           {
  MsgStream log(msgSvc(), name());
  // I do not put sanity checks on the pointers because I know how I'm calling the function
  IOpaqueAddress *addr = reg->address();
  if (addr) { // we consider only objects that are in a file
    if (outputLevel() <= MSG::VERBOSE)
      log << MSG::VERBOSE << "::i_collectLeaves added " << reg->identifier() << endmsg;
    m_leaves.push_back(reg->object()); // add this object
    // Origin of the current object
    const std::string& base = addr->par()[0];
    // Compare with the origin seen during BeginEvent
    if ( !m_ignoreOriginChange && (m_initialBase != base) )
      throw GaudiException("Origin of data has changed ('"
                           + m_initialBase + "' !=  '" + base
                           + "'), probably OutputStream was called before "
                               "InputCopyStream: check options",
                           name(), StatusCode::FAILURE);

    std::vector<IRegistry*> lfs; // leaves of the current object
    StatusCode sc = m_dataMgrSvc->objectLeaves(reg, lfs);
    if (sc.isSuccess()) {
      for(std::vector<IRegistry*>::iterator i = lfs.begin(); i != lfs.end(); ++i)  {
        // Continue if the leaf has the same database as the parent
        if ( (*i)->address() && (*i)->address()->par()[0] == base )  {
          DataObject* obj = 0;
          sc = m_dataSvc->retrieveObject(reg, (*i)->name(), obj);
          if (sc.isSuccess())  {
            i_collectLeaves(*i);
          } else {
            throw GaudiException("Cannot get " + (*i)->identifier() + " from " + m_dataSvcName, name(), StatusCode::FAILURE);
          }
        }
      }
    }
  }
}
IRegistry * DataSvcFileEntriesTool::i_getRootNode (  ) [private]

Return the pointer to the IRegistry object associated to the node specified as Root.

Definition at line 191 of file DataSvcFileEntriesTool.cpp.

                                                 {
  DataObject * obj = 0;
  StatusCode sc = m_dataSvc->retrieveObject(m_rootNode, obj);
  if (sc.isFailure()) {
    throw GaudiException("Cannot get " + m_rootNode + " from " + m_dataSvcName, name(), StatusCode::FAILURE);
  }
  return obj->registry();
}
StatusCode DataSvcFileEntriesTool::initialize (  ) [virtual]

Initialize the tool.

Reimplemented from AlgTool.

Definition at line 122 of file DataSvcFileEntriesTool.cpp.

                                             {
  StatusCode sc = AlgTool::initialize();
  if (sc.isFailure()) return sc;

  // Retrieve the pointer to the needed services.

  m_incidentSvc = serviceLocator()->service("IncidentSvc");
  if ( ! m_incidentSvc ) {
    MsgStream log(msgSvc(), name());
    log << MSG::ERROR << "Cannot get IncidentSvc" << endmsg;
    return StatusCode::FAILURE;
  }

  m_dataMgrSvc = m_dataSvc = serviceLocator()->service(m_dataSvcName);
  if ( ! m_dataSvc || ! m_dataMgrSvc ) {
    MsgStream log(msgSvc(), name());
    log << MSG::ERROR << "Cannot get IDataProviderSvc+IDataManagerSvc " << m_dataSvcName << endmsg;
    return StatusCode::FAILURE;
  }

  // Register ourself to the incident service as listener for BeginEvent
  m_incidentSvc->addListener(this, IncidentType::BeginEvent);

  // If the Root node is not specified, take the name from the data service itself.
  if (m_rootNode.empty()) {
    m_rootNode = m_dataMgrSvc->rootName();
  }

  // Clear the cache (in case the instance is re-initilized).
  m_leaves.clear();
  return StatusCode::SUCCESS;
}
const IDataStoreLeaves::LeavesList & DataSvcFileEntriesTool::leaves (  ) const [virtual]

Return the list of collected objects.

If the scan was not yet done since the last BeginEvent incident, it is done when calling this function. The result of the scan is cached.

Definition at line 184 of file DataSvcFileEntriesTool.cpp.

                                                                        {
  if (m_leaves.empty()) {
    const_cast<DataSvcFileEntriesTool*>(this)->i_collectLeaves();
  }
  return m_leaves;
}

Member Data Documentation

Pointer to the IDataManagerSvc interface of the data service.

Definition at line 65 of file DataSvcFileEntriesTool.cpp.

Pointer to the IDataProviderSvc interface of the data service.

Definition at line 67 of file DataSvcFileEntriesTool.cpp.

Variable for the property DataService.

Definition at line 56 of file DataSvcFileEntriesTool.cpp.

Variable for the property ScanOnBeginEvent.

Definition at line 88 of file DataSvcFileEntriesTool.cpp.

Pointer to the incident service.

Definition at line 63 of file DataSvcFileEntriesTool.cpp.

File ID of the Root node.

It is cached every BeginEvent to be compared with the one seen during the collection of the leaves, to avoid that the collection is altered by previous calls to an OutputStream.

Definition at line 85 of file DataSvcFileEntriesTool.cpp.

LeavesList DataSvcFileEntriesTool::m_leaves [private]

Internal cache for the list of objects found during the scan.

Definition at line 70 of file DataSvcFileEntriesTool.cpp.

Variable for the property Root.

Definition at line 58 of file DataSvcFileEntriesTool.cpp.

Variable for the property ScanOnBeginEvent.

Definition at line 60 of file DataSvcFileEntriesTool.cpp.


The documentation for this class was generated from the following file:
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Defines

Generated at Thu Jun 28 2012 23:27:36 for Gaudi Framework, version v23r2 by Doxygen version 1.7.2 written by Dimitri van Heesch, © 1997-2004