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

生物技术

开发平台:

C/C++

  1. /*
  2.  * ===========================================================================
  3.  * PRODUCTION $Log: query.cpp,v $
  4.  * PRODUCTION Revision 1000.3  2004/06/01 20:56:52  gouriano
  5.  * PRODUCTION PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.6
  6.  * PRODUCTION
  7.  * ===========================================================================
  8.  */
  9. /*  $Id: query.cpp,v 1000.3 2004/06/01 20:56:52 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:  Mike DiCuccio
  35.  *
  36.  * File Description:
  37.  *
  38.  */
  39. #include <ncbi_pch.hpp>
  40. #include "query.hpp"
  41. #include "utils.hpp"
  42. #include <gui/plugin/PluginInfo.hpp>
  43. #include <gui/plugin/PluginRequest.hpp>
  44. #include <gui/plugin/PluginCommand.hpp>
  45. #include <gui/plugin/PluginCommandSet.hpp>
  46. #include <gui/plugin/PluginArgSet.hpp>
  47. #include <gui/plugin/PluginArg.hpp>
  48. #include <gui/core/version.hpp>
  49. #include <gui/core/idocument.hpp>
  50. #include <gui/core/plugin_utils.hpp>
  51. #include <gui/utils/app_popup.hpp>
  52. #include <corelib/ncbiapp.hpp>
  53. #include <corelib/ncbireg.hpp>
  54. #include <objmgr/util/feature.hpp>
  55. #include <objmgr/util/sequence.hpp>
  56. #include <objects/seqfeat/Org_ref.hpp>
  57. BEGIN_NCBI_SCOPE
  58. USING_SCOPE(ncbi::objects);
  59. // standard info boilerplate
  60. void CAlgoLinkOut_Query::x_AddStandardArgs(CPluginCommand& command)
  61. {
  62.     // database to search
  63.     command.AddDefaultArgument("db", "Database", CPluginArg::eString,
  64.                                "PubMed");
  65.     command.SetConstraint("db",
  66.         (*CPluginValueConstraint::CreateSet(),
  67.          "3D Domains",
  68.          "Books",
  69.          "GEO Data Sets",
  70.          "GEO",
  71.          "Genome",
  72.          "Journals",
  73.          "MeSH",
  74.          "NCBI Web Site",
  75.          "Nucleotide",
  76.          "Online Mendelian Inheritance in Man (OMIM)",
  77.          "Population Studies (PopSet)",
  78.          "Protein",
  79.          "PubMed Central (PMC)",
  80.          "PubMed",
  81.          "Structure",
  82.          "Taxonomy",
  83.          "UniGene",
  84.          "UniSTS"
  85.          "dbSNP"));
  86.     command.AddArgument("org", "Limit to organism", CPluginArg::eBoolean);
  87. }
  88. // run our plugin
  89. void CAlgoLinkOut_Query::x_RunCommand(CPluginMessage& msg)
  90. {
  91.     const CPluginCommand& args = msg.GetRequest().GetCommand();
  92.     CPluginReply& reply = msg.SetReply();
  93.     // retrieve the default link for Query
  94.     CNcbiApplication* app = CNcbiApplication::Instance();
  95.     _ASSERT(app);
  96.     const CNcbiRegistry& reg = app->GetConfig();
  97.     string query_url =
  98.         reg.GetString("LINKOUT", "Query",
  99.                       "http://www.ncbi.nlm.nih.gov/entrez/query.fcgi"
  100.                       "?cmd=<cmd>&db=<db>&term=<term>");
  101.     string terms;
  102.     string org;
  103.     bool org_limit = args["org"].AsBoolean();
  104.     //
  105.     // were we called with args = seq-id?
  106.     //
  107.     if (args.HasArgument("seq-id")) {
  108.         // retrieve the seq-id
  109.         plugin_args::TIdList ids;
  110.         GetArgValue(args["seq-id"], ids);
  111.         const CSeq_id&   id  = *ids.front().second;
  112.         const IDocument& doc = *ids.front().first;
  113.         // get a title from the sequence and use that as the terms
  114.         CBioseq_Handle handle = doc.GetScope().GetBioseqHandle(id);
  115.         if ( !handle ) {
  116.             reply.SetStatus(eMessageStatus_failed);
  117.             return;
  118.         }
  119.         terms = sequence::GetTitle(handle);
  120.         if (org_limit) {
  121.             CConstRef<COrg_ref> ref = GetOrganism(handle);
  122.             if (ref) {
  123.                 ref->GetLabel(&org);
  124.             }
  125.         }
  126.     }
  127.     //
  128.     // were we called with args = feat?
  129.     //
  130.     if (args.HasArgument("feat")) {
  131.         // retrieve the feature
  132.         plugin_args::TFeatList feats;
  133.         GetArgValue(args["feat"], feats);
  134.         const CSeq_feat& feat = *feats.front().second;
  135.         const IDocument& doc  = *feats.front().first;
  136.         // get a label from the feature and use that as the terms
  137.         feature::GetLabel(feat, &terms, feature::eContent, &doc.GetScope());
  138.         if (org_limit) {
  139.             CBioseq_Handle handle = doc.GetScope().GetBioseqHandle(feat.GetLocation());
  140.             CConstRef<COrg_ref> ref = GetOrganism(handle);
  141.             if (ref) {
  142.                 ref->GetLabel(&org);
  143.             }
  144.         }
  145.     }
  146.     //
  147.     // encode our white-space
  148.     if ( !org.empty() ) {
  149.         org = " AND "" + org + "" [ORGN]";
  150.         terms += org;
  151.     }
  152.     string::size_type pos = 0;
  153.     while ( (pos = terms.find_first_of(" ", pos)) != string::npos) {
  154.         terms[pos] = '+';
  155.     }
  156.     //
  157.     // retrieve the database
  158.     //
  159.     string db = args["db"].AsString();
  160.     //
  161.     // what command do we run?
  162.     //
  163.     string cmd = "search";
  164.     //
  165.     // finalize our URL and launch!
  166.     //
  167.     query_url = NStr::Replace(query_url, "<db>",   db);
  168.     query_url = NStr::Replace(query_url, "<term>", terms);
  169.     query_url = NStr::Replace(query_url, "<cmd>",  cmd);
  170.     if ( !CAppPopup::PopupURL(query_url) ) {
  171.         reply.SetStatus(eMessageStatus_failed);
  172.     } else {
  173.         reply.SetStatus(eMessageStatus_success);
  174.     }
  175. }
  176. END_NCBI_SCOPE
  177. /*
  178.  * ===========================================================================
  179.  * $Log: query.cpp,v $
  180.  * Revision 1000.3  2004/06/01 20:56:52  gouriano
  181.  * PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.6
  182.  *
  183.  * Revision 1.6  2004/05/21 22:27:48  gorelenk
  184.  * Added PCH ncbi_pch.hpp
  185.  *
  186.  * Revision 1.5  2004/01/27 18:45:27  dicuccio
  187.  * Added missing header files
  188.  *
  189.  * Revision 1.4  2003/11/04 17:49:24  dicuccio
  190.  * Changed calling parameters for plugins - pass CPluginMessage instead of paired
  191.  * CPluginCommand/CPluginReply
  192.  *
  193.  * Revision 1.3  2003/10/07 13:47:04  dicuccio
  194.  * Renamed CPluginURL* to CPluginValue*
  195.  *
  196.  * Revision 1.2  2003/09/25 17:49:17  dicuccio
  197.  * Cleaned up handling of org-refs - implemented private function to return the
  198.  * apporpriate COrg_ref.  Added virtual destructors where necessary
  199.  *
  200.  * Revision 1.1  2003/09/23 19:45:45  dicuccio
  201.  * Initial revision
  202.  *
  203.  * ===========================================================================
  204.  */