object_manager.hpp
上传用户:yhdzpy8989
上传日期:2007-06-13
资源大小:13604k
文件大小:9k
源码类别:

生物技术

开发平台:

C/C++

  1. /*
  2.  * ===========================================================================
  3.  * PRODUCTION $Log: object_manager.hpp,v $
  4.  * PRODUCTION Revision 1000.1  2004/04/12 17:27:18  gouriano
  5.  * PRODUCTION PRODUCTION: UPGRADED [CATCHUP_003] Dev-tree R1.20
  6.  * PRODUCTION
  7.  * ===========================================================================
  8.  */
  9. #ifndef OBJECT_MANAGER__HPP
  10. #define OBJECT_MANAGER__HPP
  11. /*  $Id: object_manager.hpp,v 1000.1 2004/04/12 17:27:18 gouriano Exp $
  12. * ===========================================================================
  13. *
  14. *                            PUBLIC DOMAIN NOTICE
  15. *               National Center for Biotechnology Information
  16. *
  17. *  This software/database is a "United States Government Work" under the
  18. *  terms of the United States Copyright Act.  It was written as part of
  19. *  the author's official duties as a United States Government employee and
  20. *  thus cannot be copyrighted.  This software/database is freely available
  21. *  to the public for use. The National Library of Medicine and the U.S.
  22. *  Government have not placed any restriction on its use or reproduction.
  23. *
  24. *  Although all reasonable efforts have been taken to ensure the accuracy
  25. *  and reliability of the software and data, the NLM and the U.S.
  26. *  Government do not and cannot warrant the performance or results that
  27. *  may be obtained by using this software or data. The NLM and the U.S.
  28. *  Government disclaim all warranties, express or implied, including
  29. *  warranties of performance, merchantability or fitness for any particular
  30. *  purpose.
  31. *
  32. *  Please cite the author in any work or product based on this material.
  33. *
  34. * ===========================================================================
  35. *
  36. * Authors:
  37. *           Andrei Gourianov
  38. *           Aleksey Grichenko
  39. *           Michael Kimelman
  40. *           Denis Vakatov
  41. *
  42. * File Description:
  43. *           Object manager manages data objects,
  44. *           provides them to Scopes when needed
  45. *
  46. * ---------------------------------------------------------------------------
  47. * $Log: object_manager.hpp,v $
  48. * Revision 1000.1  2004/04/12 17:27:18  gouriano
  49. * PRODUCTION: UPGRADED [CATCHUP_003] Dev-tree R1.20
  50. *
  51. * Revision 1.20  2004/03/24 18:30:28  vasilche
  52. * Fixed edit API.
  53. * Every *_Info object has its own shallow copy of original object.
  54. *
  55. * Revision 1.19  2004/03/16 15:47:26  vasilche
  56. * Added CBioseq_set_Handle and set of EditHandles
  57. *
  58. * Revision 1.18  2003/09/30 16:21:59  vasilche
  59. * Updated internal object manager classes to be able to load ID2 data.
  60. * SNP blobs are loaded as ID2 split blobs - readers convert them automatically.
  61. * Scope caches results of requests for data to data loaders.
  62. * Optimized CSeq_id_Handle for gis.
  63. * Optimized bioseq lookup in scope.
  64. * Reduced object allocations in annotation iterators.
  65. * CScope is allowed to be destroyed before other objects using this scope are
  66. * deleted (feature iterators, bioseq handles etc).
  67. * Optimized lookup for matching Seq-ids in CSeq_id_Mapper.
  68. * Added 'adaptive' option to objmgr_demo application.
  69. *
  70. * Revision 1.17  2003/08/04 17:04:27  grichenk
  71. * Added default data-source priority assignment.
  72. * Added support for iterating all annotations from a
  73. * seq-entry or seq-annot.
  74. *
  75. * Revision 1.16  2003/06/30 18:41:05  vasilche
  76. * Removed unused commented code.
  77. *
  78. * Revision 1.15  2003/06/19 18:23:44  vasilche
  79. * Added several CXxx_ScopeInfo classes for CScope related information.
  80. * CBioseq_Handle now uses reference to CBioseq_ScopeInfo.
  81. * Some fine tuning of locking in CScope.
  82. *
  83. * Revision 1.13  2003/04/09 16:04:29  grichenk
  84. * SDataSourceRec replaced with CPriorityNode
  85. * Added CScope::AddScope(scope, priority) to allow scope nesting
  86. *
  87. * Revision 1.12  2003/03/26 20:59:22  grichenk
  88. * Removed commented-out code
  89. *
  90. * Revision 1.11  2003/03/11 14:15:49  grichenk
  91. * +Data-source priority
  92. *
  93. * Revision 1.10  2003/01/29 22:03:43  grichenk
  94. * Use single static CSeq_id_Mapper instead of per-OM model.
  95. *
  96. * Revision 1.9  2002/12/26 20:51:35  dicuccio
  97. * Added Win32 export specifier
  98. *
  99. * Revision 1.8  2002/08/28 17:05:13  vasilche
  100. * Remove virtual inheritance
  101. *
  102. * Revision 1.7  2002/06/04 17:18:32  kimelman
  103. * memory cleanup :  new/delete/Cref rearrangements
  104. *
  105. * Revision 1.6  2002/05/28 18:01:10  gouriano
  106. * DebugDump added
  107. *
  108. * Revision 1.5  2002/05/06 03:30:36  vakatov
  109. * OM/OM1 renaming
  110. *
  111. * Revision 1.4  2002/02/21 19:27:00  grichenk
  112. * Rearranged includes. Added scope history. Added searching for the
  113. * best seq-id match in data sources and scopes. Updated tests.
  114. *
  115. * Revision 1.3  2002/01/23 21:59:29  grichenk
  116. * Redesigned seq-id handles and mapper
  117. *
  118. * Revision 1.2  2002/01/16 16:26:36  gouriano
  119. * restructured objmgr
  120. *
  121. * Revision 1.1  2002/01/11 19:04:02  gouriano
  122. * restructured objmgr
  123. *
  124. *
  125. * ===========================================================================
  126. */
  127. #include <corelib/ncbiobj.hpp>
  128. #include <corelib/ncbimtx.hpp>
  129. #include <objmgr/data_loader_factory.hpp>
  130. #include <set>
  131. #include <map>
  132. BEGIN_NCBI_SCOPE
  133. BEGIN_SCOPE(objects)
  134. class CDataSource;
  135. class CDataLoader;
  136. class CDataLoaderFactory;
  137. class CSeq_entry;
  138. class CBioseq;
  139. class CSeq_id;
  140. class CScope;
  141. class CScope_Impl;
  142. /////////////////////////////////////////////////////////////////////////////
  143. // CObjectManager
  144. class NCBI_XOBJMGR_EXPORT CObjectManager : public CObject
  145. {
  146. public:
  147.     CObjectManager(void);
  148.     virtual ~CObjectManager(void);
  149. public:
  150.     typedef CRef<CDataSource> TDataSourceLock;
  151.     typedef int TPriority;
  152. // configuration functions
  153. // this data is always available to scopes -
  154. // by name - in case of data loader
  155. // or by address - in case of Seq_entry
  156.     // whether to put data loader or TSE to the default group or not
  157.     enum EIsDefault {
  158.         eDefault,
  159.         eNonDefault
  160.     };
  161.     enum EPriority {
  162.         kPriority_NotSet = -1
  163.     };
  164.     // Register existing data loader.
  165.     // NOTE:  data loader must be created in the heap (ie using operator new).
  166.     void RegisterDataLoader(CDataLoader& loader,
  167.                             EIsDefault   is_default = eNonDefault,
  168.                             TPriority priority = kPriority_NotSet);
  169.     // Register data loader factory.
  170.     // NOTE:  client has no control on when data loader is created or deleted.
  171.     void RegisterDataLoader(CDataLoaderFactory& factory,
  172.                             EIsDefault          is_default = eNonDefault,
  173.                             TPriority priority = kPriority_NotSet);
  174.     // RegisterDataLoader(*new CSimpleDataLoaderFactory<TDataLoader>(name), ...
  175.     void RegisterDataLoader(TFACTORY_AUTOCREATE factory,
  176.                             const string& loader_name,
  177.                             EIsDefault   is_default = eNonDefault,
  178.                             TPriority priority = kPriority_NotSet);
  179.     // Revoke previously registered data loader.
  180.     // Return FALSE if the loader is still in use (by some scope).
  181.     // Throw an exception if the loader is not registered with this ObjMgr.
  182.     bool RevokeDataLoader(CDataLoader& loader);
  183.     bool RevokeDataLoader(const string& loader_name);
  184.     // Register top-level seq_entry
  185.     //void RegisterTopLevelSeqEntry(CSeq_entry& top_entry);
  186.     //CConstRef<CBioseq> GetBioseq(const CSeq_id& id);
  187.     virtual void DebugDump(CDebugDumpContext ddc, unsigned int depth) const;
  188. protected:
  189. // functions for scopes
  190.     void RegisterScope(CScope_Impl& scope);
  191.     void RevokeScope  (CScope_Impl& scope);
  192.     typedef set<TDataSourceLock> TDataSourcesLock;
  193.     TDataSourceLock AcquireDataLoader(CDataLoader& loader);
  194.     TDataSourceLock AcquireDataLoader(const string& loader_name);
  195.     TDataSourceLock AcquireTopLevelSeqEntry(CSeq_entry& top_entry);
  196.     void AcquireDefaultDataSources(TDataSourcesLock& sources);
  197.     bool ReleaseDataSource(TDataSourceLock& data_source);
  198. private:
  199. // these are for Object Manager itself
  200. // nobody else should use it
  201.     TDataSourceLock x_RegisterTSE(CSeq_entry& top_entry);
  202.     TDataSourceLock x_RegisterLoader(CDataLoader& loader,
  203.                                      TPriority priority,
  204.                                      EIsDefault   is_default = eNonDefault,
  205.                                      bool         no_warning = false);
  206.     CDataLoader* x_GetLoaderByName(const string& loader_name) const;
  207.     TDataSourceLock x_FindDataSource(const CObject* key);
  208.     TDataSourceLock x_RevokeDataLoader(CDataLoader* loader);
  209.     
  210. private:
  211.     typedef set< TDataSourceLock >                  TSetDefaultSource;
  212.     typedef map< string, CDataLoader* >             TMapNameToLoader;
  213.     typedef map< const CObject* , TDataSourceLock > TMapToSource;
  214.     typedef set< CScope_Impl* >                     TSetScope;
  215.     TSetDefaultSource   m_setDefaultSource;
  216.     TMapNameToLoader    m_mapNameToLoader;
  217.     TMapToSource        m_mapToSource;
  218.     TSetScope           m_setScope;
  219.     
  220.     typedef CMutex      TRWLock;
  221.     typedef CMutexGuard TReadLockGuard;
  222.     typedef CMutexGuard TWriteLockGuard;
  223.     mutable TRWLock     m_OM_Lock;
  224.     mutable TRWLock     m_OM_ScopeLock;
  225.     friend class CScope_Impl;
  226.     friend class CDataSource; // To get id-mapper
  227. };
  228. END_SCOPE(objects)
  229. END_NCBI_SCOPE
  230. #endif // OBJECT_MANAGER__HPP