Gaudi Framework, version v20r4

Generated: 8 Jan 2009

InputCopyStream.cpp

Go to the documentation of this file.
00001 // $Id: InputCopyStream.cpp,v 1.2 2006/01/10 20:09:27 hmd Exp $
00002 #define GAUDISVC_PERSISTENCYSVC_INPUTCOPYSTREAM_CPP
00003 
00004 // Framework include files
00005 #include "GaudiKernel/AlgFactory.h"
00006 #include "GaudiKernel/IRegistry.h"
00007 #include "GaudiKernel/IDataManagerSvc.h"
00008 #include "GaudiKernel/IDataProviderSvc.h"
00009 #include "GaudiKernel/IOpaqueAddress.h"
00010 #include "GaudiKernel/DataStoreItem.h"
00011 #include "GaudiKernel/DataObject.h"
00012 #include "GaudiKernel/MsgStream.h"
00013 #include "InputCopyStream.h"
00014 
00015 // Define the algorithm factory for the standard output data writer
00016 DECLARE_ALGORITHM_FACTORY(InputCopyStream)
00017 
00018 // Standard Constructor
00019 InputCopyStream::InputCopyStream(const std::string& name, ISvcLocator* pSvcLocator)
00020  : OutputStream(name, pSvcLocator)
00021 {
00022   m_doPreLoad      = false;
00023   m_doPreLoadOpt   = false;
00024   m_itemNames.push_back("/Event#99999");
00025 }
00026 
00027 // Standard Destructor
00028 InputCopyStream::~InputCopyStream()   {
00029 }
00030 
00031 // Place holder to create configurable data store agent
00032 StatusCode InputCopyStream::collectLeaves(IRegistry* dir, int level)    {
00033   if ( level < m_currentItem->depth() )   {
00034     if ( dir )  {
00035       // dir->object != 0, because was retrived in previous recursion
00036       m_objects.push_back(dir->object());
00037       if ( dir->address() )  {
00038         std::vector<IRegistry*> lfs;
00039         const std::string& dbase = dir->address()->par()[0];
00040         // Cololect all pending leaves
00041         StatusCode iret, sc = m_pDataManager->objectLeaves(dir,lfs);
00042         if ( sc.isSuccess() )  {
00043           std::vector<IRegistry*>::iterator i=lfs.begin();
00044           for(; i!=lfs.end(); ++i)  {
00045             // Continue if the leaf has the same database as the parent
00046             if ( (*i)->address() && (*i)->address()->par()[0] == dbase )  {
00047               DataObject* obj = 0;
00048               iret = m_pDataProvider->retrieveObject(dir, (*i)->name(), obj);
00049               if (  iret.isSuccess() )  {
00050                 iret = collectLeaves(*i, level+1);
00051               }
00052               if ( !iret.isSuccess() )  {
00053                 sc = iret;
00054               }
00055             }
00056           }
00057         }
00058         return sc;
00059       }
00060     }
00061     return StatusCode::FAILURE;
00062   }
00063   return StatusCode::SUCCESS;
00064 }
00065 
00067 StatusCode InputCopyStream::collectObjects()   {
00068   MsgStream log(msgSvc(), name());
00069   StatusCode status = StatusCode::SUCCESS;
00070   Items::iterator i;
00071   // Traverse the tree and collect the requested objects
00072   for ( i = m_itemList.begin(); i != m_itemList.end(); i++ )    {
00073     DataObject* obj = 0;
00074     m_currentItem = (*i);
00075     StatusCode iret = m_pDataProvider->retrieveObject(m_currentItem->path(), obj);
00076     if ( iret.isSuccess() )  {
00077       iret = collectLeaves(obj->registry(), 0);
00078     }
00079     if ( !iret.isSuccess() )  {
00080       log << MSG::ERROR << "Cannot write mandatory object(s) (Not found) " 
00081           << m_currentItem->path() << endmsg;
00082       status = iret;
00083     }
00084   }
00085   // Traverse the tree and collect the requested objects (tolerate missing itmes here)
00086   for ( i = m_optItemList.begin(); i != m_optItemList.end(); i++ )    {
00087     DataObject* obj = 0;
00088     m_currentItem = (*i);
00089     StatusCode iret = m_pDataProvider->retrieveObject(m_currentItem->path(), obj);
00090     if ( iret.isSuccess() )  {
00091       iret = collectLeaves(obj->registry(), 0);
00092     }
00093     if ( !iret.isSuccess() )    {
00094       log << MSG::DEBUG << "Ignore request to write non-mandatory object(s) " 
00095           << m_currentItem->path() << endmsg;
00096     }
00097   }
00098   return status;
00099 }

Generated at Thu Jan 8 17:44:24 2009 for Gaudi Framework, version v20r4 by Doxygen version 1.5.6 written by Dimitri van Heesch, © 1997-2004