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

生物技术

开发平台:

C/C++

  1. /*
  2.  * ===========================================================================
  3.  * PRODUCTION $Log: plugin_args_as_strs.cpp,v $
  4.  * PRODUCTION Revision 1000.3  2004/06/01 20:56:09  gouriano
  5.  * PRODUCTION PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.9
  6.  * PRODUCTION
  7.  * ===========================================================================
  8.  */
  9. /*  $Id: plugin_args_as_strs.cpp,v 1000.3 2004/06/01 20:56:09 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.  * Authors:  Josh Cherry
  35.  *
  36.  * File Description:  Convert plugin arguments to key/value string pairs
  37.  *
  38.  */
  39. #include <ncbi_pch.hpp>
  40. #include "plugin_args_as_strs.hpp"
  41. #include <corelib/ncbistd.hpp>
  42. #include <gui/core/idocument.hpp>
  43. #include <gui/core/plugin_utils.hpp>
  44. #include <gui/plugin/PluginValue.hpp>
  45. #include <gui/plugin/PluginInfo.hpp>
  46. #include <gui/plugin/PluginCommandSet.hpp>
  47. #include <gui/plugin/PluginValueConstraint.hpp>
  48. #include <gui/core/version.hpp>
  49. #include <gui/objutils/utils.hpp>
  50. #include <objmgr/seq_vector.hpp>
  51. #include <objmgr/util/sequence.hpp>
  52. #include <objmgr/seq_vector.hpp>
  53. #include <cgi/ncbicgi.hpp>
  54. #include <util/regexp.hpp>
  55. BEGIN_NCBI_SCOPE
  56. USING_SCOPE(objects);
  57. // conversion of values for non-object types
  58. static string s_ArgToStr(const CPluginValue& value)
  59. {
  60.     switch (value.Which()) {
  61.     case CPluginValue::e_Integer:
  62.         return NStr::IntToString(value.AsInteger());
  63.     case CPluginValue::e_Double:
  64.         return NStr::DoubleToString(value.AsDouble());
  65.     case CPluginValue::e_String:
  66.         return value.AsString();
  67.     case CPluginValue::e_Boolean:
  68.         return NStr::IntToString(value.AsBoolean());
  69.     default:
  70.         throw logic_error("Couldn't convert this type of "
  71.                           "CPluginValue to string");
  72.     }
  73. }
  74. void PluginArgsAsStrs(const CPluginArgSet::Tdata& argset,
  75.                       vector<string>& keys,
  76.                       vector<string>& values)
  77. {
  78.     keys.clear();
  79.     values.clear();
  80.     
  81.     ITERATE (CPluginArgSet::Tdata, arg_iter, argset) {
  82.         const CPluginArg& arg = **arg_iter;
  83.         string name = arg.GetName();
  84.         if (NStr::StartsWith(name, "__")) {
  85.             // these are for internal use only
  86.             continue;
  87.         }
  88.         if (arg.IsEmpty()) {
  89.             if (arg.GetOptional()) {
  90.                 // OK for optional argument to be empty
  91.                 continue;
  92.             } else {
  93.                 throw logic_error("empty non-optional argument " + name);
  94.             }
  95.         }
  96.         if (!CPluginUtils::IsValid(arg)) {
  97.             throw logic_error("invalid argument " + name);
  98.         }
  99.         string value;
  100.         if (arg.GetType() == CPluginArg::eObject) {
  101.             if (!(arg.GetObjectSubtype() == "Seq-loc")) {
  102.                 throw logic_error("can't handle non-Seq-loc eObject");
  103.             }
  104.             plugin_args::TLocList locs;
  105.             GetArgValue(arg, locs);
  106.             ITERATE (plugin_args::TLocList, iter, locs) {
  107.                 const CSeq_loc&  loc = *iter->second;
  108.                 const IDocument& doc = *iter->first;
  109.                 try {
  110.                     CBioseq_Handle handle = 
  111.                         doc.GetScope().GetBioseqHandle(loc);
  112.                     CSeqVector vec = handle
  113.                         .GetSequenceView(loc, CBioseq_Handle::eViewConstructed,
  114.                                          CBioseq_Handle::eCoding_Iupac);
  115.                     string seq;
  116.                     vec.GetSeqData(0, vec.size(), seq);
  117.                     NStr::ToUpper(seq);
  118.                     // write sequence, title, and short title as a
  119.                     // cgi query string; this will wind up as a
  120.                     // cgi string within a cgi string (doubly escaped)
  121.                     value = "short_title=" 
  122.                         + URL_EncodeString(doc.GetShortTitle())
  123.                         + "&title="
  124.                         + URL_EncodeString(doc.GetTitle())
  125.                         + "&seq=" + seq;
  126.                     keys.push_back(name);
  127.                     values.push_back(value);
  128.                 }
  129.                 catch (...) {
  130.                     string str = CPluginUtils::GetLabel(loc, &doc.GetScope());
  131.                     LOG_POST(Error << "Error processing location " << str);
  132.                 }
  133.             }
  134.         } else {
  135.             if (arg.GetData().IsSingle()) {
  136.                 value = s_ArgToStr(arg.GetData().GetSingle());
  137.                 keys.push_back(name);
  138.                 values.push_back(value);
  139.             } else {
  140.                 const CPluginArg_Base::C_Data::TArray& value_list = 
  141.                     arg.GetData().GetArray();
  142.                 ITERATE (CPluginArg_Base::C_Data::TArray,
  143.                          value_iter, value_list) {
  144.                     value = s_ArgToStr(**value_iter);
  145.                     keys.push_back(name);
  146.                     values.push_back(value);
  147.                 }
  148.             }
  149.         }
  150.     }
  151. }
  152. END_NCBI_SCOPE
  153. /*
  154.  * ===========================================================================
  155.  * $Log: plugin_args_as_strs.cpp,v $
  156.  * Revision 1000.3  2004/06/01 20:56:09  gouriano
  157.  * PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.9
  158.  *
  159.  * Revision 1.9  2004/05/21 22:27:47  gorelenk
  160.  * Added PCH ncbi_pch.hpp
  161.  *
  162.  * Revision 1.8  2004/05/20 12:38:29  dicuccio
  163.  * Added missing includes previously acquired through gui/objutils/utils.hpp (seq_vector.hpp, alignment manager
  164.  *
  165.  * Revision 1.7  2004/05/15 03:17:04  ucko
  166.  * Add missing #includes (formerly indirect?)
  167.  *
  168.  * Revision 1.6  2004/05/03 13:05:42  dicuccio
  169.  * gui/utils --> gui/objutils where needed
  170.  *
  171.  * Revision 1.5  2004/01/07 15:50:39  dicuccio
  172.  * Adjusted for API change in CPluginUtils::GetLabel().  Standardized exception
  173.  * reporting in algorithms.
  174.  *
  175.  * Revision 1.4  2003/12/02 15:30:34  jcherry
  176.  * Differentiate between empty and invalid arguments
  177.  *
  178.  * Revision 1.3  2003/12/01 23:14:34  jcherry
  179.  * Don't throw if an optional argument is invalid
  180.  *
  181.  * Revision 1.2  2003/11/26 17:13:08  dicuccio
  182.  * Lots of code clean-up.  CHanged names of algorithms to
  183.  * CAlgoWebServices{Init}
  184.  *
  185.  * Revision 1.1  2003/11/25 19:08:52  jcherry
  186.  * Initial version
  187.  *
  188.  * ===========================================================================
  189.  */