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

生物技术

开发平台:

C/C++

  1. /*
  2.  * ===========================================================================
  3.  * PRODUCTION $Log: PluginConfigValues.cpp,v $
  4.  * PRODUCTION Revision 1000.2  2004/06/01 20:43:00  gouriano
  5.  * PRODUCTION PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.4
  6.  * PRODUCTION
  7.  * ===========================================================================
  8.  */
  9. /* $Id: PluginConfigValues.cpp,v 1000.2 2004/06/01 20:43:00 gouriano Exp $
  10.  * ===========================================================================
  11.  *
  12.  *                            PUBLIC DOMAIN NOTICE
  13.  *               National Center for Biotechnology Information
  14.  *
  15.  *  This software/database is a "United States Government Work" under the
  16.  *  terms of the United States Copyright Act.  It was written as part of
  17.  *  the author's official duties as a United States Government employee and
  18.  *  thus cannot be copyrighted.  This software/database is freely available
  19.  *  to the public for use. The National Library of Medicine and the U.S.
  20.  *  Government have not placed any restriction on its use or reproduction.
  21.  *
  22.  *  Although all reasonable efforts have been taken to ensure the accuracy
  23.  *  and reliability of the software and data, the NLM and the U.S.
  24.  *  Government do not and cannot warrant the performance or results that
  25.  *  may be obtained by using this software or data. The NLM and the U.S.
  26.  *  Government disclaim all warranties, express or implied, including
  27.  *  warranties of performance, merchantability or fitness for any particular
  28.  *  purpose.
  29.  *
  30.  *  Please cite the author in any work or product based on this material.
  31.  *
  32.  * ===========================================================================
  33.  *
  34.  * Author:  Robert G. Smith
  35.  *
  36.  * File Description:
  37.  *   CPluginConfigValues represents one named set of key/value pairs
  38.  *   used to configure a plugin. It is identified by its 'item' and 'style' strings.
  39.  *   It is intended that 'item' would refer to the type of the data and 'style'
  40.  *   to particular saved data values. i.e. all those CPluginConfigValues that have
  41.  *   the same 'item' would have the same 'key's and structure in their 'keyvals'.
  42.  *
  43.  *   The values and in the key/value pairs can be strings or recursive lists of 
  44.  *   key/value pairs.  Values at nested levels can be accessed and modified by 
  45.  *   using compound keys (e.g. "algo.blast.database"). 
  46.  *
  47.  * Remark:
  48.  *   This code was originally generated by application DATATOOL
  49.  *   using specifications from the data definition file
  50.  *   'plugin.asn'.
  51.  */
  52. // standard includes
  53. // generated includes
  54. #include <ncbi_pch.hpp>
  55. #include <gui/config/PluginConfigValues.hpp>
  56. #include <gui/config/KeyValue.hpp>
  57. #include <gui/config/PluginConfigID.hpp>
  58. // generated classes
  59. BEGIN_NCBI_SCOPE
  60. BEGIN_objects_SCOPE // namespace ncbi::objects::
  61. //
  62. // simple functor to check if a type matches a given value
  63. //
  64. struct SConfigIdTypeMatches
  65. {
  66.     SConfigIdTypeMatches(const string& val) : m_Key(val) {}
  67.     bool operator() (const CRef<CPluginConfigID>& cid) const
  68.     {
  69.         return cid->TypeMatches(m_Key);
  70.     }
  71. private:
  72.     const string& m_Key;
  73. };
  74. // destructor
  75. CPluginConfigValues::~CPluginConfigValues(void)
  76. {
  77. }
  78. // merge the other_pcv with this one, over writing values in this one
  79. // when the key is the same.
  80. CPluginConfigValues& CPluginConfigValues::Merge(const CPluginConfigValues& other_pcv)
  81. {
  82.     // we do not over write the key fields, the type and style.
  83.     // usually this will be called with the PCVs with the same key fields.
  84.     if (this == &other_pcv)
  85.         return *this;
  86.         
  87. /*     // TODO? merge refer-to based on a paramter.
  88.     // make optional refer-to-style the same as in our argument.
  89.     if (other_pcv.CanGetRefer_to_style()) {
  90.         SetRefer_to_style(other_pcv.GetRefer_to_style());
  91.     } else if (! other_pcv.IsSetRefer_to_style()) {
  92.         ResetRefer_to_style();
  93.     }
  94. */    
  95.     if (other_pcv.CanGetByKey()) {
  96.         const TData::TKeyvals& other_data = other_pcv.GetData().GetKeyvals();
  97.         ITERATE(TData::TKeyvals, other_kv_it, other_data) {
  98.             const CKeyValue& other_kv = **other_kv_it;
  99.             if (other_kv.CanGetKey()) {
  100.                 CKeyValue& my_kv = AddKey(other_kv.GetKey());
  101.                 my_kv.Merge(other_kv);
  102.             }
  103.         }
  104.     } else if (other_pcv.CanGetByType()) {
  105.         const TData::TInclude& other_data = other_pcv.GetData().GetInclude();
  106.         ITERATE(TData::TInclude, other_id_it, other_data) {
  107.             AddPCId(**other_id_it);
  108.         }
  109.     }
  110.     return *this;
  111. }
  112.     
  113. // Given a key of type: "label.label2.label3"
  114. // search our nested hierarchy of key-value pairs and return the pair that corresponds.
  115. const CKeyValue& CPluginConfigValues::GetKeyvalueByKey(const string & key, const string& delim) const
  116. {
  117.     // Split the key into the part before the first delimiter and the part after.
  118.     string key1, key2;
  119.     NStr::SplitInTwo(key, delim, key1, key2);
  120.     _ASSERT( ! key1.empty()); // no empty key parts.
  121.     
  122.     // using the first part of the key, find the key/value pair that corresponds.
  123.     const CKeyValue::C_Val::TKeyvals& keyvals = GetData().GetKeyvals();    
  124.     CKeyValue::C_Val::TKeyvals::const_iterator kv_it = 
  125.         CKeyValue::s_FindKeyvalueByKey(key1, keyvals);
  126.     if (kv_it == keyvals.end())
  127.         ThrowUnassigned(1);
  128.     const CKeyValue& keyvalue = **kv_it;     
  129.     
  130.     // more key? Tell the key/value to look deeper within.
  131.     if ( ! key2.empty())  {
  132.         return keyvalue.GetKeyvalueByKey(key2, delim);
  133.     }
  134.     return keyvalue;
  135. }
  136. const CPluginConfigID& CPluginConfigValues::GetPCIdByType(const string& type) const
  137. {
  138.     // _ASSERT(CanGetByType());
  139.     
  140.     const TData::TInclude& pcIds = GetData().GetInclude();
  141.     
  142.     TData::TInclude::const_iterator pcId_it =
  143.         find_if(pcIds.begin(), pcIds.end(), 
  144.                SConfigIdTypeMatches(type));
  145.     if (pcId_it == pcIds.end()) {
  146.         ThrowUnassigned(1);
  147.     }
  148.     return **pcId_it;
  149.     
  150. }
  151. /// Return a list of all the keys or types in this PCC.
  152. /// use delim to separate parts of a hierachical key 
  153. void CPluginConfigValues::GetAllKeys(CKeyValue::TKeyList& key_list, const string& delim ) const
  154. {
  155.     if (CanGetData()) {
  156.         if (GetData().IsKeyvals()) {
  157.             ITERATE(TData::TKeyvals, kv_it, GetData().GetKeyvals()) {
  158.                 (*kv_it)->GetAllKeys(key_list, kEmptyStr, delim);
  159.             }
  160.         } else if (GetData().IsInclude()) {
  161.             ITERATE(TData::TInclude, incl_it, GetData().GetInclude()) {
  162.                 const CPluginConfigID &pcid = **incl_it;
  163.                 if (pcid.CanGetType()) {
  164.                     key_list.push_back(pcid.GetType());
  165.                 }
  166.             }
  167.         }
  168.     }
  169. }
  170. CKeyValue& CPluginConfigValues::AddKey(const string& key, const string& delim)
  171. {
  172.     // Split the key into the part before the first delimiter and the part after.
  173.     string key1, key2;
  174.     NStr::SplitInTwo(key, delim, key1, key2);
  175.     _ASSERT( ! key1.empty()); // no empty key parts.
  176.     
  177.     // add the first key to my list of key-values.
  178.     CKeyValue& keyvalue = CKeyValue::s_AddKey(key1, SetData().SetKeyvals());
  179.     if ( ! key2.empty()) {
  180.         // add the rest of the key to the key-value just added (or found).
  181.         return keyvalue.AddKey(key2);
  182.     }
  183.     return keyvalue;
  184. }
  185. CPluginConfigID& CPluginConfigValues::AddPCId(const string& type, const string& style)
  186. {
  187.     TData::TInclude& pcIds = SetData().SetInclude();
  188.     
  189.     TData::TInclude::iterator pcId_it =
  190.         find_if(pcIds.begin(), pcIds.end(),
  191.                SConfigIdTypeMatches(type));
  192.     if (pcId_it == pcIds.end()) {
  193.         CRef<CPluginConfigID> pcId_new(new CPluginConfigID(type, style));
  194.         pcIds.push_back(pcId_new);
  195.         return *pcId_new;
  196.     }
  197.     (*pcId_it)->SetStyle(style);
  198.     return **pcId_it;
  199. }
  200. // delete key value pairs.
  201. bool CPluginConfigValues::DelKeyval(const string & key, const string& delim)
  202. {
  203.     if ( ! SetData().IsKeyvals()) {
  204.         // recursion following include's requires PluginConfigCache.
  205.         return false;
  206.     }
  207.     
  208.     // Split the key into the part before the first delimiter and the part after.
  209.     string key1, key2;
  210.     NStr::SplitInTwo(key, delim, key1, key2);
  211.     _ASSERT( ! key1.empty()); // no empty key parts.
  212.     
  213.     // using the first part of the key, find the key/value pair that corresponds.
  214.     TData::TKeyvals& keyvals = SetData().SetKeyvals();    
  215.     TData::TKeyvals::iterator kv_it = 
  216.         CKeyValue::s_FindKeyvalueByKey(key1, keyvals);
  217.     if (kv_it == keyvals.end()) {
  218.         return false;
  219.     }
  220.     
  221.     // found what we were looking for. Delete it.
  222.     if ( key2.empty())  {
  223.         keyvals.erase(kv_it);
  224.         return true;
  225.     }
  226.     // Tell the KeyValue to delete the rest of the key.
  227.     if ((*kv_it)->DelKeyval(key2, delim)) {
  228.         // found and deleted. Now, is *kv_it itself empty?
  229.         if ((*kv_it)->GetVal().GetKeyvals().empty()) {
  230.             keyvals.erase(kv_it);
  231.         }
  232.         return true;
  233.     }
  234.     return false;
  235. }
  236. END_objects_SCOPE // namespace ncbi::objects::
  237. END_NCBI_SCOPE
  238. /*
  239. * ===========================================================================
  240. *
  241. * $Log: PluginConfigValues.cpp,v $
  242. * Revision 1000.2  2004/06/01 20:43:00  gouriano
  243. * PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.4
  244. *
  245. * Revision 1.4  2004/05/21 22:27:39  gorelenk
  246. * Added PCH ncbi_pch.hpp
  247. *
  248. * Revision 1.3  2004/04/20 14:06:39  rsmith
  249. * add GetAllKeys method.
  250. *
  251. * Revision 1.2  2003/11/21 12:49:12  rsmith
  252. * Add ability to delete values by key.
  253. *
  254. * Revision 1.1  2003/10/10 17:43:04  rsmith
  255. * moved from gui/plugin to gui/config
  256. *
  257. * Revision 1.7  2003/08/19 18:36:08  rsmith
  258. * use SplitInTwo instead of duplicating code.
  259. *
  260. * Revision 1.6  2003/08/19 18:12:05  rsmith
  261. * can always add anything. CanAddKeys() and CanAddPCId() only advisory.
  262. *
  263. * Revision 1.5  2003/08/13 20:36:47  rsmith
  264. * get rid of include of find_if.hpp
  265. *
  266. * Revision 1.4  2003/08/13 20:24:20  rsmith
  267. * Merge method and get rid of FindIf
  268. *
  269. * Revision 1.3  2003/08/06 13:10:31  dicuccio
  270. * Replaced std::find_if() with FindIf() - work-around for MSVC's broken STL
  271. * implementation (no const_mem_fun1_t<>)
  272. *
  273. * Revision 1.2  2003/08/05 19:01:36  rsmith
  274. * change members used in mem_fun to satisfy certain compilers.
  275. *
  276. * Revision 1.1  2003/08/05 17:35:59  rsmith
  277. * Classes to allow saving of plugin's configuration values as ASN.1.
  278. *
  279. *
  280. * ===========================================================================
  281. */
  282. /* Original file checksum: lines: 64, chars: 1904, CRC32: 7925bcd */