1 /*  $Id: cdd_loader.cpp 629836 2021-04-22 12:44:58Z ivanov $
2  * ===========================================================================
3  *
4  *                            PUBLIC DOMAIN NOTICE
5  *               National Center for Biotechnology Information
6  *
7  *  This software/database is a "United States Government Work" under the
8  *  terms of the United States Copyright Act.  It was written as part of
9  *  the author's official duties as a United States Government employee and
10  *  thus cannot be copyrighted.  This software/database is freely available
11  *  to the public for use. The National Library of Medicine and the U.S.
12  *  Government have not placed any restriction on its use or reproduction.
13  *
14  *  Although all reasonable efforts have been taken to ensure the accuracy
15  *  and reliability of the software and data, the NLM and the U.S.
16  *  Government do not and cannot warrant the performance or results that
17  *  may be obtained by using this software or data. The NLM and the U.S.
18  *  Government disclaim all warranties, express or implied, including
19  *  warranties of performance, merchantability or fitness for any particular
20  *  purpose.
21  *
22  *  Please cite the author in any work or product based on this material.
23  *
24  * ===========================================================================
25  *
26  * Author: Aleksey Grichenko
27  *
28  * File Description: CDD file data loader
29  *
30  * ===========================================================================
31  */
32 
33 #include <ncbi_pch.hpp>
34 #include <corelib/ncbistd.hpp>
35 #include <corelib/plugin_manager_impl.hpp>
36 #include <corelib/plugin_manager_store.hpp>
37 #include <serial/serial.hpp>
38 #include <objects/seqloc/Seq_id.hpp>
39 #include <objects/id2/id2__.hpp>
40 #include <objmgr/data_loader_factory.hpp>
41 #include <objmgr/impl/data_source.hpp>
42 #include <objmgr/impl/tse_loadlock.hpp>
43 #include <objtools/data_loaders/cdd/cdd_loader/cdd_loader.hpp>
44 #include <objtools/data_loaders/cdd/cdd_loader/cdd_loader_impl.hpp>
45 #include <objtools/data_loaders/cdd/id2cdd_params.h>
46 
47 
48 BEGIN_NCBI_SCOPE
49 
50 class CObject;
51 
52 BEGIN_SCOPE(objects)
53 
54 class CDataLoader;
55 
56 BEGIN_LOCAL_NAMESPACE;
57 
58 class CLoaderFilter : public CObjectManager::IDataLoaderFilter {
59 public:
IsDataLoaderMatches(CDataLoader & loader) const60     bool IsDataLoaderMatches(CDataLoader& loader) const {
61         return dynamic_cast<CCDDDataLoader*>(&loader) != 0;
62     }
63 };
64 
65 
66 class CRevoker {
67 public:
~CRevoker()68     ~CRevoker() {
69         CLoaderFilter filter;
70         CObjectManager::GetInstance()->RevokeDataLoaders(filter);
71     }
72 };
73 static CSafeStatic<CRevoker> s_Revoker(CSafeStaticLifeSpan(
74     CSafeStaticLifeSpan::eLifeLevel_AppMain,
75     CSafeStaticLifeSpan::eLifeSpan_Long));
76 
77 END_LOCAL_NAMESPACE;
78 
79 
80 /////////////////////////////////////////////////////////////////////////////
81 // CCDDDataLoader
82 /////////////////////////////////////////////////////////////////////////////
83 
84 
SLoaderParams(void)85 CCDDDataLoader::SLoaderParams::SLoaderParams(void)
86     : m_Compress(false),
87       m_PoolSoftLimit(DEFAULT_CDD_POOL_SOFT_LIMIT),
88       m_PoolAgeLimit(DEFAULT_CDD_POOL_AGE_LIMIT),
89       m_ExcludeNucleotides(DEFAULT_CDD_EXCLUDE_NUCLEOTIDES)
90 {
91 }
92 
93 
94 static const char* kCDDLoaderName = "CDDDataLoader";
95 static const char* kCDDLoaderParamName = "CDD_Loader";
96 
97 
SLoaderParams(const TPluginManagerParamTree & params)98 CCDDDataLoader::SLoaderParams::SLoaderParams(const TPluginManagerParamTree& params)
99 {
100     const TParamTree* node = params.FindSubNode(kCDDLoaderParamName);
101 
102     CConfig conf(node);
103 
104     m_ServiceName = conf.GetString(kCDDLoaderParamName,
105         NCBI_ID2PROC_CDD_PARAM_SERVICE_NAME,
106         CConfig::eErr_NoThrow,
107         DEFAULT_CDD_SERVICE_NAME);
108 
109     m_Compress = conf.GetBool(kCDDLoaderParamName,
110         NCBI_ID2PROC_CDD_PARAM_COMPRESS_DATA,
111         CConfig::eErr_NoThrow,
112         false);
113 
114     m_PoolSoftLimit = conf.GetInt(kCDDLoaderParamName,
115         NCBI_ID2PROC_CDD_PARAM_POOL_SOFT_LIMIT,
116         CConfig::eErr_NoThrow, DEFAULT_CDD_POOL_SOFT_LIMIT);
117 
118     m_PoolAgeLimit = conf.GetInt(kCDDLoaderParamName,
119         NCBI_ID2PROC_CDD_PARAM_POOL_AGE_LIMIT,
120         CConfig::eErr_NoThrow, DEFAULT_CDD_POOL_AGE_LIMIT);
121 
122     m_ExcludeNucleotides = conf.GetBool(kCDDLoaderParamName,
123         NCBI_ID2PROC_CDD_PARAM_EXCLUDE_NUCLEOTIDES,
124         CConfig::eErr_NoThrow, DEFAULT_CDD_EXCLUDE_NUCLEOTIDES);
125 
126 }
127 
128 
~SLoaderParams(void)129 CCDDDataLoader::SLoaderParams::~SLoaderParams(void)
130 {
131 }
132 
133 
RegisterInObjectManager(CObjectManager & om,CObjectManager::EIsDefault is_default,CObjectManager::TPriority priority)134 CCDDDataLoader::TRegisterLoaderInfo CCDDDataLoader::RegisterInObjectManager(
135     CObjectManager& om,
136     CObjectManager::EIsDefault is_default,
137     CObjectManager::TPriority priority)
138 {
139     SLoaderParams params;
140     TMaker maker(params);
141     CDataLoader::RegisterInObjectManager(om, maker, is_default, priority);
142     return maker.GetRegisterInfo();
143 }
144 
145 
RegisterInObjectManager(CObjectManager & om,const TParamTree & param_tree,CObjectManager::EIsDefault is_default,CObjectManager::TPriority priority)146 CCDDDataLoader::TRegisterLoaderInfo CCDDDataLoader::RegisterInObjectManager(
147     CObjectManager& om,
148     const TParamTree& param_tree,
149     CObjectManager::EIsDefault is_default,
150     CObjectManager::TPriority priority)
151 {
152     SLoaderParams params(param_tree);
153     TMaker maker(params);
154     CDataLoader::RegisterInObjectManager(om, maker, is_default, priority);
155     return maker.GetRegisterInfo();
156 }
157 
158 
RegisterInObjectManager(CObjectManager & om,const SLoaderParams & params,CObjectManager::EIsDefault is_default,CObjectManager::TPriority priority)159 CCDDDataLoader::TRegisterLoaderInfo CCDDDataLoader::RegisterInObjectManager(
160     CObjectManager& om,
161     const SLoaderParams& params,
162     CObjectManager::EIsDefault is_default,
163     CObjectManager::TPriority priority)
164 {
165     TMaker maker(params);
166     CDataLoader::RegisterInObjectManager(om, maker, is_default, priority);
167     return maker.GetRegisterInfo();
168 }
169 
170 
GetLoaderNameFromArgs(const SLoaderParams & params)171 string CCDDDataLoader::GetLoaderNameFromArgs(const SLoaderParams& params)
172 {
173     return kCDDLoaderName;
174 }
175 
176 
GetLoaderNameFromArgs(void)177 string CCDDDataLoader::GetLoaderNameFromArgs(void)
178 {
179     SLoaderParams params;
180     return GetLoaderNameFromArgs(params);
181 }
182 
183 
CCDDDataLoader(const string & loader_name,const SLoaderParams & params)184 CCDDDataLoader::CCDDDataLoader(const string& loader_name,
185                                const SLoaderParams& params)
186     : CDataLoader(loader_name)
187 {
188     m_Impl = new CCDDDataLoader_Impl(params);
189 }
190 
191 
~CCDDDataLoader(void)192 CCDDDataLoader::~CCDDDataLoader(void)
193 {
194 }
195 
196 
197 CDataLoader::TTSE_LockSet
GetRecords(const CSeq_id_Handle & idh,EChoice choice)198 CCDDDataLoader::GetRecords(const CSeq_id_Handle& idh, EChoice choice)
199 {
200     TTSE_LockSet locks;
201     return locks;
202 }
203 
204 
205 CDataLoader::TTSE_LockSet
GetOrphanAnnotRecordsNA(const CSeq_id_Handle & idh,const SAnnotSelector * sel,TProcessedNAs * processed_nas)206 CCDDDataLoader::GetOrphanAnnotRecordsNA(const CSeq_id_Handle& idh,
207     const SAnnotSelector* sel,
208     TProcessedNAs* processed_nas)
209 {
210     TSeq_idSet ids;
211     ids.insert(idh);
212     return m_Impl->GetBlobBySeq_ids(ids, *GetDataSource());
213 }
214 
215 
216 CDataLoader::TTSE_LockSet
GetOrphanAnnotRecordsNA(const TSeq_idSet & ids,const SAnnotSelector * sel,TProcessedNAs * processed_nas)217 CCDDDataLoader::GetOrphanAnnotRecordsNA(const TSeq_idSet& ids,
218     const SAnnotSelector* sel,
219     TProcessedNAs* processed_nas)
220 {
221     return m_Impl->GetBlobBySeq_ids(ids, *GetDataSource());
222 }
223 
224 
GetDefaultPriority(void) const225 CObjectManager::TPriority CCDDDataLoader::GetDefaultPriority(void) const
226 {
227     return CObjectManager::kPriority_Replace;
228 }
229 
230 
231 /////////////////////////////////////////////////////////////////////////////
232 // CCDDBlobId
233 /////////////////////////////////////////////////////////////////////////////
234 
235 
CCDDBlobId(CTempString str_id)236 CCDDBlobId::CCDDBlobId(CTempString str_id)
237 {
238     try {
239         str_id >> Get();
240     }
241     catch (...) {
242     }
243 }
244 
245 
CCDDBlobId(const CID2_Blob_Id & blob_id)246 CCDDBlobId::CCDDBlobId(const CID2_Blob_Id& blob_id)
247 {
248     m_Id2BlobId.Reset(new CID2_Blob_Id);
249     m_Id2BlobId->Assign(blob_id);
250 }
251 
252 
Get(void) const253 const CID2_Blob_Id& CCDDBlobId::Get(void) const
254 {
255     if (!m_Id2BlobId) {
256         m_Id2BlobId.Reset(new CID2_Blob_Id());
257     }
258     return *m_Id2BlobId;
259 }
260 
261 
Get(void)262 CID2_Blob_Id& CCDDBlobId::Get(void)
263 {
264     if (!m_Id2BlobId) {
265         m_Id2BlobId.Reset(new CID2_Blob_Id());
266     }
267     return *m_Id2BlobId;
268 }
269 
270 
ToString(void) const271 string CCDDBlobId::ToString(void) const
272 {
273     string ret;
274     if (!IsEmpty())
275     {
276         ret << *m_Id2BlobId;
277     }
278     return ret;
279 }
280 
281 
operator <(const CBlobId & blob_id) const282 bool CCDDBlobId::operator<(const CBlobId& blob_id) const
283 {
284     const CCDDBlobId* cdd = dynamic_cast<const CCDDBlobId*>(&blob_id);
285     return cdd  &&  *this < *cdd;
286 }
287 
288 
operator ==(const CBlobId & blob_id) const289 bool CCDDBlobId::operator==(const CBlobId& blob_id) const
290 {
291     const CCDDBlobId* cdd = dynamic_cast<const CCDDBlobId*>(&blob_id);
292     return cdd  &&  *this == *cdd;
293 }
294 
295 
296 #define CMP_MEMBER(NAME) \
297     do { \
298         T##NAME v1 = Get##NAME(); \
299         T##NAME v2 = blob_id.Get##NAME(); \
300         if (v1 != v2) return v1 < v2; \
301     } while (0)
302 
303 
operator <(const CCDDBlobId & blob_id) const304 bool CCDDBlobId::operator<(const CCDDBlobId& blob_id) const
305 {
306     // NULL is less than any blob-id.
307     if (IsEmpty()) return !blob_id.IsEmpty();
308 
309     CMP_MEMBER(Sat);
310     CMP_MEMBER(SubSat);
311     CMP_MEMBER(SatKey);
312     CMP_MEMBER(Version);
313     return false;
314 }
315 
316 
operator ==(const CCDDBlobId & blob_id) const317 bool CCDDBlobId::operator==(const CCDDBlobId& blob_id) const
318 {
319     if (IsEmpty()) return blob_id.IsEmpty();
320     return GetSat() == blob_id.GetSat()
321         && GetSubSat() == blob_id.GetSubSat()
322         && GetSatKey() == blob_id.GetSatKey()
323         && GetVersion() == blob_id.GetVersion();
324 }
325 
326 
327 /////////////////////////////////////////////////////////////////////////////
328 // CCDDDataLoader_Impl
329 /////////////////////////////////////////////////////////////////////////////
330 
331 
CCDDDataLoader_Impl(const CCDDDataLoader::SLoaderParams & params)332 CCDDDataLoader_Impl::CCDDDataLoader_Impl(const CCDDDataLoader::SLoaderParams& params)
333     : m_ClientPool(
334         params.m_ServiceName,
335         params.m_PoolSoftLimit,
336         params.m_PoolAgeLimit,
337         params.m_ExcludeNucleotides)
338 {
339 }
340 
341 
~CCDDDataLoader_Impl(void)342 CCDDDataLoader_Impl::~CCDDDataLoader_Impl(void)
343 {
344 }
345 
346 
347 CDataLoader::TTSE_LockSet
GetBlobBySeq_ids(const TSeq_idSet & ids,CDataSource & ds)348 CCDDDataLoader_Impl::GetBlobBySeq_ids(const TSeq_idSet& ids, CDataSource& ds)
349 {
350     CDataLoader::TTSE_LockSet ret;
351     TBlob blob = m_ClientPool.GetBlobBySeq_ids(ids);
352     if (!blob.data) return ret;
353 
354     CRef<CCDDBlobId> cdd_blob_id(new CCDDBlobId(blob.info->GetBlob_id()));
355     CDataLoader::TBlobId blob_id(cdd_blob_id);
356     CTSE_LoadLock load_lock = ds.GetTSE_LoadLock(blob_id);
357     if (!load_lock.IsLoaded()) {
358         CRef<CSeq_entry> entry(new CSeq_entry);
359         entry->SetSet().SetSeq_set();
360         entry->SetAnnot().push_back(blob.data);
361         load_lock->SetName("CDD");
362         load_lock->SetSeq_entry(*entry);
363         load_lock.SetLoaded();
364     }
365     if (load_lock.IsLoaded()) {
366         ret.insert(load_lock);
367     }
368     return ret;
369 }
370 
371 
372 END_SCOPE(objects)
373 
374 // ===========================================================================
375 
376 USING_SCOPE(objects);
377 
DataLoaders_Register_CDD(void)378 void DataLoaders_Register_CDD(void)
379 {
380     RegisterEntryPoint<CDataLoader>(NCBI_EntryPoint_DataLoader_Cdd);
381 }
382 
383 
384 const string kDataLoader_Cdd_DriverName("cdd");
385 
386 class CCDD_DataLoaderCF : public CDataLoaderFactory
387 {
388 public:
CCDD_DataLoaderCF(void)389     CCDD_DataLoaderCF(void)
390         : CDataLoaderFactory(kDataLoader_Cdd_DriverName) {}
~CCDD_DataLoaderCF(void)391     virtual ~CCDD_DataLoaderCF(void) {}
392 
393 protected:
394     virtual CDataLoader* CreateAndRegister(
395         CObjectManager& om,
396         const TPluginManagerParamTree* params) const;
397 };
398 
399 
CreateAndRegister(CObjectManager & om,const TPluginManagerParamTree * params) const400 CDataLoader* CCDD_DataLoaderCF::CreateAndRegister(
401     CObjectManager& om,
402     const TPluginManagerParamTree* params) const
403 {
404     if ( !ValidParams(params) ) {
405         // Use constructor without arguments
406         return CCDDDataLoader::RegisterInObjectManager(om).GetLoader();
407     }
408     if (params) {
409         return CCDDDataLoader::RegisterInObjectManager(
410             om,
411             *params,
412             GetIsDefault(params),
413             GetPriority(params)).GetLoader();
414     }
415     // IsDefault and Priority arguments may be specified
416     return CCDDDataLoader::RegisterInObjectManager(
417         om,
418         GetIsDefault(params),
419         GetPriority(params)).GetLoader();
420 }
421 
422 
NCBI_EntryPoint_DataLoader_Cdd(CPluginManager<CDataLoader>::TDriverInfoList & info_list,CPluginManager<CDataLoader>::EEntryPointRequest method)423 void NCBI_EntryPoint_DataLoader_Cdd(
424     CPluginManager<CDataLoader>::TDriverInfoList&   info_list,
425     CPluginManager<CDataLoader>::EEntryPointRequest method)
426 {
427     CHostEntryPointImpl<CCDD_DataLoaderCF>::NCBI_EntryPointImpl(info_list, method);
428 }
429 
430 
NCBI_EntryPoint_xloader_cdd(CPluginManager<objects::CDataLoader>::TDriverInfoList & info_list,CPluginManager<objects::CDataLoader>::EEntryPointRequest method)431 void NCBI_EntryPoint_xloader_cdd(
432     CPluginManager<objects::CDataLoader>::TDriverInfoList&   info_list,
433     CPluginManager<objects::CDataLoader>::EEntryPointRequest method)
434 {
435     NCBI_EntryPoint_DataLoader_Cdd(info_list, method);
436 }
437 
438 
439 END_NCBI_SCOPE
440