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

生物技术

开发平台:

C/C++

  1. /*
  2.  * ===========================================================================
  3.  * PRODUCTION $Log: web_algo_init.cpp,v $
  4.  * PRODUCTION Revision 1000.3  2004/06/01 20:56:16  gouriano
  5.  * PRODUCTION PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.8
  6.  * PRODUCTION
  7.  * ===========================================================================
  8.  */
  9. /*  $Id: web_algo_init.cpp,v 1000.3 2004/06/01 20:56:16 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:  Auto-run plugin to initialize
  37.  *                    "web algorithms"
  38.  *
  39.  */
  40. #include <ncbi_pch.hpp>
  41. #include <objmgr/object_manager.hpp>
  42. #include <gui/core/idocument.hpp>
  43. #include <gui/core/plugin_utils.hpp>
  44. #include <gui/core/doc_manager.hpp>
  45. #include <gui/core/version.hpp>
  46. #include <gui/plugin/PluginInfo.hpp>
  47. #include <gui/plugin/PluginCommandSet.hpp>
  48. #include <gui/plugin/PluginCommand.hpp>
  49. #include <corelib/ncbifile.hpp>
  50. #include <corelib/ncbiapp.hpp>
  51. #include <corelib/ncbireg.hpp>
  52. #include <gui/core/plugin_registry.hpp>
  53. #include <gui/core/algo_factory.hpp>
  54. #include <gui/utils/system_path.hpp>
  55. #include "web_algo_init.hpp"
  56. #include "web_algo.hpp"
  57. #include <serial/objistr.hpp>
  58. #include <serial/objistrasn.hpp>
  59. #include <serial/objistrasnb.hpp>
  60. #include <serial/objistrxml.hpp>
  61. #include <serial/serial.hpp>
  62. #include <gui/utils/fetch_url.hpp>
  63. #include "plugin_info_from_reg.hpp"
  64. BEGIN_NCBI_SCOPE
  65. USING_SCOPE(objects);
  66. void CAlgoWebServiceInit::GetInfo(CPluginInfo& info)
  67. {
  68.     info.Reset();
  69.     // version info macro
  70.     info.SetInfo(CPluginVersion::eMajor, CPluginVersion::eMinor, 0,
  71.                  string(__DATE__) + " " + string(__TIME__),
  72.                  "CAlgoWebServiceInit", "", "", "");
  73.     // command info
  74.     info.SetCommands().AddAlgoCommand(eAlgoCommand_run);
  75.     info.SetAutorun(true);
  76. }
  77. // one instance of algo factory for all web algos
  78. static CAlgoFactory<CAlgoWebService> s_AlgoFactory_CAlgoWebService;
  79. void CAlgoWebServiceInit::RunCommand(CPluginMessage& msg)
  80. {
  81.     CPluginReply& reply = msg.SetReply();
  82.     string dir;
  83.     // load web algo plugins
  84.     x_LoadWebPlugins("<std>, <home>");
  85.     reply.SetStatus(eMessageStatus_success);
  86. }
  87. void CAlgoWebServiceInit::x_LoadWebPlugins(const string& path)
  88. {
  89.     list<string> paths;
  90.     NStr::Split(path, ", tnr", paths);
  91.     ITERATE (list<string>, iter, paths) {
  92.         string fname;
  93.         if (*iter == "<std>") {
  94.             fname = CSystemPath::ResolvePath(*iter, "etc/algo_urls");
  95.         } else if (*iter == "<home>") {
  96.             fname = CSystemPath::ResolvePath(*iter, "algo_urls");
  97.         } else {
  98.             fname = CSystemPath::ResolvePath(*iter, "");
  99.         }
  100.         if (fname.empty()) {
  101.             continue;
  102.         }
  103.         
  104.         CFile file(fname);
  105.         if (!file.Exists()) {
  106.             _TRACE("File " << fname << " does not exist");
  107.             continue;
  108.         }
  109.         CNcbiIfstream is(fname.c_str());
  110.         vector<string> urls;
  111.         string line;
  112.         while(getline(is, line)) {
  113.             line = NStr::TruncateSpaces(line);
  114.             if (line.empty() || line[0] == '#') {
  115.                 // skip blank lines and lines starting with '#'
  116.                 continue;
  117.             }
  118.             urls.push_back(line);
  119.         }
  120.         ITERATE (vector<string>, url, urls) {
  121.             //
  122.             // get PluginInfo by retrieving url
  123.             //
  124.             string std_in, std_out, std_err;
  125.             vector<string> arguments;
  126.             CFetchURL::Fetch(*url + "?action=info", std_out);
  127.             CNcbiIstrstream istr(std_out.c_str());
  128.             vector<CRef<CPluginInfo> > plugins;
  129.             // see if it's in registry format
  130.             try {
  131.                 PluginInfoFromRegistry(istr, plugins);
  132.             }
  133.             catch (...) {
  134.                 _TRACE(*url << " not valid as .ini format; "
  135.                        "trying asn1 text");
  136.                 // read as many PluginInfos as are present
  137.                 istr.seekg(0);
  138.                 auto_ptr<CObjectIStream> is
  139.                     (CObjectIStream::Open(eSerial_AsnText, istr));
  140.                 while (1) {
  141.                     CRef<CPluginInfo> info(new CPluginInfo);
  142.                     try {
  143.                         *is >> *info;
  144.                     }
  145.                     catch (...) {
  146.                         break;
  147.                     }
  148.                     plugins.push_back(info);
  149.                 }
  150.             }
  151.             int count = 0;
  152.             NON_CONST_ITERATE (vector<CRef<CPluginInfo> >, iter, plugins) {
  153.                 CRef<CPluginInfo>& info = *iter;
  154.                 CPluginCommandSet& cmds = info->SetCommands();
  155.                 if (!cmds.IsAlgo()) {
  156.                     LOG_POST(Error << "skipping " << *url <<
  157.                              "; invalid PluginInfo (not an algo)");
  158.                     continue;
  159.                 }
  160.                 
  161.                 CPluginCommand& args = *cmds.SetAlgo().front();
  162.                 
  163.                 // if __url not set, take this to signify
  164.                 // the url we just hit
  165.                 if (!args.HasArgument("__url")) {
  166.                     CPluginArg& arg = args.SetArgs()
  167.                         .AddDefaultArgument("__url",
  168.                                             "url",
  169.                                             CPluginArg::eString, *url);
  170.                     arg.SetHidden(1);  // url argument should be invisible
  171.                 }
  172.                 
  173.                 // for security, make sure no path name slips in from the net!
  174.                 if (args.HasArgument("__executable_path")) {
  175.                     LOG_POST(Info << "rejecting path " <<
  176.                              args["__executable_path"].AsString() <<
  177.                              " from url " << *url);
  178.                     args["__executable_path"].SetString("");
  179.                 }
  180.                 
  181.                 
  182.                 CPluginRegistry::RegisterPlugin
  183.                     (info, &s_AlgoFactory_CAlgoWebService);
  184.                 count++;
  185.                 LOG_POST(Info << "  registered "
  186.                          << args["__url"].AsString() << " as web algorithm");
  187.                 
  188.             }
  189.             LOG_POST(Info << "configured " << count << " plugins from url "
  190.                      << *url);
  191.         }
  192.     }
  193. }
  194.     
  195. END_NCBI_SCOPE
  196. /*
  197.  * ===========================================================================
  198.  * $Log: web_algo_init.cpp,v $
  199.  * Revision 1000.3  2004/06/01 20:56:16  gouriano
  200.  * PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.8
  201.  *
  202.  * Revision 1.8  2004/05/21 22:27:47  gorelenk
  203.  * Added PCH ncbi_pch.hpp
  204.  *
  205.  * Revision 1.7  2004/02/17 20:35:26  rsmith
  206.  * moved core/settings.[ch]pp and core/system_path.[ch]pp to config and utils, respectively.
  207.  *
  208.  * Revision 1.6  2004/01/07 17:39:03  vasilche
  209.  * Fixed include path to genbank loader.
  210.  *
  211.  * Revision 1.5  2003/12/04 00:36:54  jcherry
  212.  * Preserve order of plugin parameters specified in registry format
  213.  *
  214.  * Revision 1.4  2003/12/02 14:41:23  dicuccio
  215.  * Restored autorun
  216.  *
  217.  * Revision 1.3  2003/12/01 23:22:02  jcherry
  218.  * Added registry file format for plugin info
  219.  *
  220.  * Revision 1.2  2003/11/26 17:13:08  dicuccio
  221.  * Lots of code clean-up.  CHanged names of algorithms to CAlgoWebServices{Init}
  222.  *
  223.  * Revision 1.1  2003/11/25 19:08:51  jcherry
  224.  * Initial version
  225.  *
  226.  * ===========================================================================
  227.  */