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