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

生物技术

开发平台:

C/C++

  1. /*
  2.  * ===========================================================================
  3.  * PRODUCTION $Log: plugin_utils.hpp,v $
  4.  * PRODUCTION Revision 1000.4  2004/04/12 18:12:51  gouriano
  5.  * PRODUCTION PRODUCTION: UPGRADED [CATCHUP_003] Dev-tree R1.44
  6.  * PRODUCTION
  7.  * ===========================================================================
  8.  */
  9. #ifndef GUI_CORE___PLUGIN_UTILS__HPP
  10. #define GUI_CORE___PLUGIN_UTILS__HPP
  11. /*  $Id: plugin_utils.hpp,v 1000.4 2004/04/12 18:12:51 gouriano Exp $
  12.  * ===========================================================================
  13.  *
  14.  *                            PUBLIC DOMAIN NOTICE
  15.  *               National Center for Biotechnology Information
  16.  *
  17.  *  This software/database is a "United States Government Work" under the
  18.  *  terms of the United States Copyright Act.  It was written as part of
  19.  *  the author's official duties as a United States Government employee and
  20.  *  thus cannot be copyrighted.  This software/database is freely available
  21.  *  to the public for use. The National Library of Medicine and the U.S.
  22.  *  Government have not placed any restriction on its use or reproduction.
  23.  *
  24.  *  Although all reasonable efforts have been taken to ensure the accuracy
  25.  *  and reliability of the software and data, the NLM and the U.S.
  26.  *  Government do not and cannot warrant the performance or results that
  27.  *  may be obtained by using this software or data. The NLM and the U.S.
  28.  *  Government disclaim all warranties, express or implied, including
  29.  *  warranties of performance, merchantability or fitness for any particular
  30.  *  purpose.
  31.  *
  32.  *  Please cite the author in any work or product based on this material.
  33.  *
  34.  * ===========================================================================
  35.  *
  36.  * Authors:  Mike DiCuccio
  37.  *
  38.  * File Description:
  39.  *    CPluginUtils -- utilities for managing the interface between the plugin
  40.  *                    architecture and the GBENCH framework
  41.  */
  42. #include <gui/core/selection_buffer.hpp>
  43. #include <gui/core/obj_convert.hpp>
  44. #include <gui/utils/reporter.hpp>
  45. #include <gui/plugin/PluginValue.hpp>
  46. #include <gui/plugin/AlgoCommand.hpp>
  47. #include <gui/plugin/DataCommand.hpp>
  48. #include <gui/plugin/ViewCommand.hpp>
  49. #include <serial/iterator.hpp>
  50. BEGIN_NCBI_SCOPE
  51. BEGIN_SCOPE(objects)
  52.     class CPluginArg;
  53.     class CPluginArgSet;
  54.     class CPluginCommand;
  55.     class CPluginInfo;
  56.     class CPluginMessage;
  57.     class CPluginReply;
  58.     class CPluginRequest;
  59.     class CScope;
  60.     class CSeq_align;
  61.     class CSeq_annot;
  62.     class CSeq_entry;
  63.     class CSeq_feat;
  64.     class CSeq_loc;
  65. END_SCOPE(objects)
  66. class CPluginHandle;
  67. class CPluginRegistry;
  68. class CConvertCache;
  69. //
  70. // class CPluginUtils is a place-holder class for static functions that
  71. // facilitate using the plugin architecture.
  72. //
  73. class NCBI_GUICORE_EXPORT CPluginUtils
  74. {
  75. public:
  76.     // generic argument list typedef
  77.     typedef list< CRef<objects::CPluginArg> > TArgs;
  78.     // typedef for ordered pairs of selectied items.  These are explicitly
  79.     // pairs because we in general need a scoe (document) to travel with the
  80.     // data model object
  81.     typedef pair< CConstRef<CObject>, CConstRef<IDocument> > TSelection;
  82.     // Fit a set of objects into a set of plugin arguments.  This version
  83.     // takes as its input a set of selections from a selection buffer.
  84.     static int FillArgs(objects::CPluginArgSet&    args,
  85.                         const TConstScopedObjects& selections);
  86.     // Fit a set of objects into a set of plugin arguments.  This version
  87.     // takes as its input a set of CPluginValues.  Only the object
  88.     // values will be processed.
  89.     static int FillArgs(objects::CPluginArgSet&           args,
  90.                         const objects::CPluginArg::TData::TArray& objects);
  91.     // Fit a set of objects into a set of plugin arguments.  This version
  92.     // takes as its input a document.
  93.     static int FillArgs(objects::CPluginArgSet& args,
  94.                         const IDocument& doc);
  95.     // this function performs a similar task to FillArgs(); however, instead of
  96.     // actually filling the set of arguments automatically, it returns true if
  97.     // any of the selections indicated *can* fit.  The primary use of this is
  98.     // to determine if a set of plugins could accept some of the selections
  99.     static bool CanFitArgs(const objects::CPluginArgSet& args,
  100.                            const IDocument& doc,
  101.                            CConvertCache* cache = NULL);
  102.     static bool CanFitArgs(const objects::CPluginArgSet& args,
  103.                            const CSelectionBuffer& buf,
  104.                            CConvertCache* cache = NULL);
  105.     static bool CanFitArgs(const objects::CPluginArgSet& args,
  106.                            const TConstScopedObjects& selections,
  107.                            CConvertCache* cache = NULL);
  108.     //
  109.     // plugin dispatching
  110.     //
  111.     enum EDispatchWhen {
  112.         eDispatch_Now,
  113.         eDispatch_Deferred
  114.     };
  115.     // call a plugin by name, passing in a selection buffer.  This version
  116.     // responds to algorithm commands.
  117.     static void CallPlugin(const string& plugin_name,
  118.                            objects::EAlgoCommand cmd,
  119.                            const CSelectionBuffer& selections,
  120.                            IReporter*       reporter = NULL,
  121.                            const string&    ctx_name = "",
  122.                            EDispatchWhen    when = eDispatch_Deferred);
  123.     // call a plugin by name, passing in a selection buffer.  This version
  124.     // responds to view commands.
  125.     static void CallPlugin(const string& plugin_name,
  126.                            objects::EDataCommand cmd,
  127.                            const CSelectionBuffer& selections,
  128.                            IReporter*       reporter = NULL,
  129.                            const string&    ctx_name = "",
  130.                            EDispatchWhen    when = eDispatch_Deferred);
  131.     // call a plugin by name, passing in a selection buffer.  This version
  132.     // responds to data commands.
  133.     static void CallPlugin(const string& plugin_name,
  134.                            objects::EViewCommand cmd,
  135.                            const CSelectionBuffer& selections,
  136.                            IReporter*       reporter = NULL,
  137.                            const string&    ctx_name = "",
  138.                            EDispatchWhen    when = eDispatch_Deferred);
  139.     // call a plugin by name, passing in a document.  This version
  140.     // responds to algorithm commands.
  141.     static void CallPlugin(const string& plugin_name,
  142.                            objects::EAlgoCommand cmd,
  143.                            const IDocument* doc = NULL,
  144.                            IReporter*       reporter = NULL,
  145.                            const string&    ctx_name = "",
  146.                            EDispatchWhen    when = eDispatch_Deferred);
  147.     // call a plugin by name, passing in a document.  This version
  148.     // responds to view commands.
  149.     static void CallPlugin(const string& plugin_name,
  150.                            objects::EDataCommand cmd,
  151.                            const IDocument* doc = NULL,
  152.                            IReporter*       reporter = NULL,
  153.                            const string&    ctx_name = "",
  154.                            EDispatchWhen    when = eDispatch_Deferred);
  155.     // call a plugin by name, passing in a document.  This version
  156.     // responds to data commands.
  157.     static void CallPlugin(const string& plugin_name,
  158.                            objects::EViewCommand cmd,
  159.                            const IDocument* doc = NULL,
  160.                            IReporter*       reporter = NULL,
  161.                            const string&    ctx_name = "",
  162.                            EDispatchWhen    when = eDispatch_Deferred);
  163.     // command through which all the CallPlugin(...) commands filter
  164.     static void CallPlugin(objects::CPluginMessage& msg,
  165.                            const TConstScopedObjects& selections,
  166.                            EDispatchWhen when = eDispatch_Deferred);
  167.     // call a plugin by name, passing in a fully qualified message object.
  168.     // This is the final recipient of all CallPlugin() commands, and will
  169.     // process the request non-interactively
  170.     static void CallPlugin(objects::CPluginMessage& msg,
  171.                            EDispatchWhen when = eDispatch_Deferred);
  172.     //
  173.     // argument validation functions
  174.     //
  175.     // validate an entire set of arguments
  176.     static bool IsValid(const objects::CPluginArgSet& args);
  177.     // validate a given argument.  This insures that the argument contains
  178.     // a valid value, and that this value meets the argument's constraints.
  179.     static bool IsValid(const objects::CPluginArg& arg);
  180.     // validate a single plugin value
  181.     static bool IsValid(const objects::CPluginValue& value);
  182.     // check the constraints on a given argument
  183.     static bool CheckConstraints(const objects::CPluginArg& arg,
  184.                                  CConvertCache* cache = NULL);
  185.     // individual constraint checking function.  This is used by
  186.     // CheckConstraints() as well as by CanFitArgs(), and its API
  187.     // is a bit odd as a result.
  188.     static bool CheckConstraints(const objects::CPluginArg& arg,
  189.                                  objects::CScope& scope, const CObject& obj,
  190.                                  CConvertCache* cache = NULL);
  191.     //
  192.     // object conversion functions
  193.     //
  194.     // convert an argument to a named container of items
  195.     static vector<string> ArgToStringVec(const objects::CPluginArg& arg);
  196.     // retrieve the plugin info object for a named plugin.
  197.     // this will throw if the plugin isn't found.
  198.     static const objects::CPluginInfo& GetInfo(const string& plugin_name);
  199.     // return a string describing an arbitrary object.  This is a single
  200.     // entry-point function that will determine the best possible label to use.
  201.     static string GetLabel(const CObject& obj, objects::CScope* scope);
  202. private:
  203.     static objects::CPluginCommand*
  204.     x_GetCommand(objects::CPluginRequest& request);
  205. };
  206. //
  207. // typedefs to make standard plugin args easier to deal with
  208. //
  209. BEGIN_SCOPE(plugin_args)
  210.     typedef list< pair< CConstRef<IDocument>,
  211.                         CConstRef<objects::CSeq_id> > >      TIdList;
  212.     typedef list< pair< CConstRef<IDocument>,
  213.                         CConstRef<objects::CSeq_feat> > >    TFeatList;
  214.     typedef list< pair< CConstRef<IDocument>,
  215.                         CConstRef<objects::CSeq_loc> > >     TLocList;
  216.     typedef list< pair< CConstRef<IDocument>,
  217.                         CConstRef<objects::CSeq_entry> > >   TEntryList;
  218.     typedef list< pair< CConstRef<IDocument>,
  219.                         CConstRef<objects::CSeq_align> > >   TAlignList;
  220.     typedef list< pair< CConstRef<IDocument>,
  221.                         CConstRef<objects::CSeq_annot> > >   TAnnotList;
  222.     typedef list< pair< CConstRef<IDocument>,
  223.                         CConstRef<objects::CBioseq> > >      TBioseqList;
  224. END_SCOPE(plugin_args)
  225. //
  226. // GetArgValue() offers simple, one-step conversion to a given argument type.
  227. // The default template assumes that the converted type derives from
  228. // CSerialObject.
  229. //
  230. template <class T>
  231. inline
  232. void GetArgValue(const objects::CPluginArg& arg,
  233.                  list< pair< CConstRef<IDocument>,
  234.                              CConstRef<T> > >& objs)
  235. {
  236.     CTypeConstIterator<objects::CPluginValue> iter(arg);
  237.     for ( ;  iter;  ++iter) {
  238.         CConstRef<IDocument> doc(iter->GetDocument());
  239.         CConstRef<CObject>   obj(iter->GetObject());
  240.         if ( !doc  ||  !obj ) {
  241.             continue;
  242.         }
  243.         CObjectConverter::TObjList obj_list;
  244.         CObjectConverter::Convert(doc->GetScope(), *obj, T::GetTypeInfo(),
  245.                                   obj_list);
  246.         ITERATE (CObjectConverter::TObjList, obj_iter, obj_list) {
  247.             CConstRef<T> ref(dynamic_cast<const T*>
  248.                              (obj_iter->GetPointer()));
  249.             if (ref) {
  250.                 objs.push_back(make_pair(doc, ref));
  251.             }
  252.         }
  253.     }
  254. }
  255. //
  256. // Specialization of GetArgValue for document types
  257. //
  258. template <>
  259. inline
  260. void GetArgValue(const objects::CPluginArg& arg,
  261.                  list< pair< CConstRef<IDocument>,
  262.                              CConstRef<IDocument> > >& objs)
  263. {
  264.     CTypeConstIterator<objects::CPluginValue> iter(arg);
  265.     for ( ;  iter;  ++iter) {
  266.         CConstRef<IDocument> doc(iter->GetDocument());
  267.         CConstRef<CObject>   obj(iter->GetObject());
  268.         if ( !doc  ||  !obj ) {
  269.             continue;
  270.         }
  271.         CObjectConverter::TObjList obj_list;
  272.         CObjectConverter::Convert(doc->GetScope(), *obj, "IDocument", obj_list);
  273.         ITERATE (CObjectConverter::TObjList, obj_iter, obj_list) {
  274.             CConstRef<IDocument> ref(dynamic_cast<const IDocument*>
  275.                                      (obj_iter->GetPointer()));
  276.             if (ref) {
  277.                 objs.push_back(make_pair(doc, ref));
  278.             }
  279.         }
  280.     }
  281. }
  282. //
  283. // Specialization of GetArgValue for generic CObject types
  284. //
  285. template <>
  286. inline
  287. void GetArgValue(const objects::CPluginArg& arg,
  288.                  list< pair< CConstRef<IDocument>,
  289.                              CConstRef<CObject> > >& objs)
  290. {
  291.     CTypeConstIterator<objects::CPluginValue> iter(arg);
  292.     for ( ;  iter;  ++iter) {
  293.         CConstRef<IDocument> doc(iter->GetDocument());
  294.         CConstRef<CObject>   obj(iter->GetObject());
  295.         if ( !doc  ||  !obj ) {
  296.             continue;
  297.         }
  298.         objs.push_back(make_pair(doc, obj));
  299.     }
  300. }
  301. END_NCBI_SCOPE
  302. /*
  303.  * ===========================================================================
  304.  * $Log: plugin_utils.hpp,v $
  305.  * Revision 1000.4  2004/04/12 18:12:51  gouriano
  306.  * PRODUCTION: UPGRADED [CATCHUP_003] Dev-tree R1.44
  307.  *
  308.  * Revision 1.44  2004/04/07 12:36:02  dicuccio
  309.  * Dropped CSelectionBuffer::TSelList in favor of TConstScopedObjects.  Altered
  310.  * CallPlugin API - added default IReporter*.  Removed unneeded #includes
  311.  *
  312.  * Revision 1.43  2004/01/27 18:27:59  dicuccio
  313.  * Code clean-up.  Removed unneeded headers.  Added new typedefs for alignment,
  314.  * annotation lists
  315.  *
  316.  * Revision 1.42  2004/01/21 12:38:17  dicuccio
  317.  * redesigned CObjectCOnverter API to eliminate temporary object creation
  318.  *
  319.  * Revision 1.41  2004/01/07 15:46:16  dicuccio
  320.  * Renamed GetObjectLabel() to GetLabel().  Changed calling semantics to more
  321.  * closely follow other label extraction functions
  322.  *
  323.  * Revision 1.40  2003/12/22 19:13:00  dicuccio
  324.  * Don't include the message queue - not needed
  325.  *
  326.  * Revision 1.39  2003/11/18 17:36:47  dicuccio
  327.  * Cleaned up some comments.  Added new FitArgs() API to take a set of
  328.  * CPluginValues
  329.  *
  330.  * Revision 1.38  2003/11/06 19:57:57  dicuccio
  331.  * Removed USING_SCOPE(objects).  Changed API for CallPlugin() - added optiona
  332.  * context parameter
  333.  *
  334.  * Revision 1.37  2003/11/04 17:13:14  dicuccio
  335.  * Added new default parameter to force calling of plugins immediately or use
  336.  * dispatch mechanism.  Removed templates from header - moved to private
  337.  * implementation
  338.  *
  339.  * Revision 1.36  2003/10/15 18:30:58  dicuccio
  340.  * Added optional conversion cache argument to CheckConstraints()
  341.  *
  342.  * Revision 1.35  2003/10/10 17:12:25  dicuccio
  343.  * Added optional arg to CanFitArgs() for object conversion cache
  344.  *
  345.  * Revision 1.34  2003/10/07 13:33:01  dicuccio
  346.  * Changed CPluginURL* to CPluginValue*.  Code clean-up; moved validation code out
  347.  * of xgbplugin and into plugin_utils.cpp
  348.  *
  349.  * Revision 1.33  2003/09/16 14:04:06  dicuccio
  350.  * Made private constraint checking function public
  351.  *
  352.  * Revision 1.32  2003/09/04 14:00:26  dicuccio
  353.  * Introduce IDocument and IView as abstract base classes.  Use IDocument instead
  354.  * of CDocument.
  355.  *
  356.  * Revision 1.31  2003/09/03 14:49:02  rsmith
  357.  * change namespace name from args to plugin_args to avoid clashes with variable names.
  358.  *
  359.  * Revision 1.30  2003/08/22 17:28:35  dicuccio
  360.  * Moved prototypes for conversion routines to .cpp file
  361.  *
  362.  * Revision 1.29  2003/08/21 12:14:01  dicuccio
  363.  * Added new typedefs for standard argument objects containers
  364.  *
  365.  * Revision 1.28  2003/08/19 18:51:44  friedman
  366.  * Added the follwing conversion functionclality to Convert:
  367.  *     doc -> seq-annot, bioseq -> seq-annot, seq-id -> seq-annot,
  368.  *     seq-loc -> seq-annot, seq-entry -> seq-annot, doc -> seq-align
  369.  *
  370.  * Revision 1.27  2003/08/05 16:58:39  dicuccio
  371.  * Changed calling conventions for plugin message queue - pass by reference, not
  372.  * CConstRef<>
  373.  *
  374.  * Revision 1.26  2003/07/31 16:42:29  dicuccio
  375.  * Changed calling semantics of CallPlugin() to permit calling a plugin with no
  376.  * selections
  377.  *
  378.  * Revision 1.25  2003/07/25 13:41:08  dicuccio
  379.  * Removed duplicated comment
  380.  *
  381.  * Revision 1.24  2003/07/24 13:11:00  dicuccio
  382.  * Added basic bioseq conversions
  383.  *
  384.  * Revision 1.23  2003/07/23 17:52:23  dicuccio
  385.  * Moved logic for validating arguments into CPluginUtils.
  386.  *
  387.  * Revision 1.22  2003/07/22 15:27:10  dicuccio
  388.  * Changed Convert() to perform one-to-many conversions.  Moved GetObjectLabel()
  389.  * from a static internal function of plugin_arg_dialog.cpp to a member of
  390.  * CPluginUtils
  391.  *
  392.  * Revision 1.21  2003/07/21 19:19:40  dicuccio
  393.  * Added an interface to check if a selection buffer can fit into a set of args
  394.  *
  395.  * Revision 1.20  2003/07/14 10:57:52  shomrat
  396.  * Plugin messageing system related changes
  397.  *
  398.  * Revision 1.19  2003/06/30 13:43:37  dicuccio
  399.  * Added API to call a plugin directly with a CPluginRequest object
  400.  *
  401.  * Revision 1.18  2003/06/26 15:32:01  dicuccio
  402.  * Moved GetURLValue() from PluginURL.hpp to plugin_utils.hpp - relieves one
  403.  * circular dependency betweein gui/gqplugin and gui/core/
  404.  *
  405.  * Revision 1.17  2003/06/25 16:59:41  dicuccio
  406.  * Changed CPluginHandle into a pointer-to-implementation (the previous
  407.  * implementation is now the pointer held).  Lots of #include file clean-ups.
  408.  *
  409.  * Revision 1.16  2003/06/20 14:44:36  dicuccio
  410.  * Revamped handling of plugin registration.  All plugin factories now derive
  411.  * from CPluginFactoryBase; CPluginFactory is a template.  There is a new
  412.  * requirement for derived plugin handlers of all types (each must implement a
  413.  * static function of the form 'static void GetInfo(CPluginInfo&)')
  414.  *
  415.  * Revision 1.15  2003/06/02 16:01:29  dicuccio
  416.  * Rearranged include/objects/ subtree.  This includes the following shifts:
  417.  *     - include/objects/alnmgr --> include/objtools/alnmgr
  418.  *     - include/objects/cddalignview --> include/objtools/cddalignview
  419.  *     - include/objects/flat --> include/objtools/flat
  420.  *     - include/objects/objmgr/ --> include/objmgr/
  421.  *     - include/objects/util/ --> include/objmgr/util/
  422.  *     - include/objects/validator --> include/objtools/validator
  423.  *
  424.  * Revision 1.14  2003/05/19 13:32:43  dicuccio
  425.  * Moved gui/core/plugin --> gui/plugin/
  426.  *
  427.  * Revision 1.13  2003/05/06 15:51:07  dicuccio
  428.  * Dropped identity object conversions in favor of a generic approach
  429.  *
  430.  * Revision 1.12  2003/05/05 12:39:59  dicuccio
  431.  * Added new interface function 9CanFitArgs()) for testing whether a group of
  432.  * selections or objects could possibly apply to a set of arguments
  433.  *
  434.  * Revision 1.11  2003/05/01 12:53:06  dicuccio
  435.  * Added conversion routines for {doc,seq-id,seq-loc,seq-feat} -> seq-entry
  436.  *
  437.  * Revision 1.10  2003/04/29 14:30:37  dicuccio
  438.  * Made main object conversion function public.  Changed SelectionsToArgs() ->
  439.  * FillArgs() and added a second interface that wraps filling arguments with
  440.  * just a document
  441.  *
  442.  * Revision 1.9  2003/04/24 16:13:13  dicuccio
  443.  * Large revision.  Added many new interface functions to handle object
  444.  * cats/conversion; simplified filling out of plugin arguments
  445.  *
  446.  * Revision 1.8  2003/04/16 20:11:29  dicuccio
  447.  * Added missing #include for CPluginException
  448.  *
  449.  * Revision 1.7  2003/04/16 18:16:17  dicuccio
  450.  * Added CallPlugin() methods to explicitly call plugins by name or plugin
  451.  * handle
  452.  *
  453.  * Revision 1.6  2003/03/25 14:20:47  dicuccio
  454.  * Changed export specifier from XGBPLUGIN to GUICORE
  455.  *
  456.  * Revision 1.5  2003/03/25 13:05:45  dicuccio
  457.  * Changed SelBufferToArgs() to return the number of unset arguments - used to
  458.  * determine if automated argument processing can continue.
  459.  *
  460.  * Revision 1.4  2003/02/26 14:33:21  dicuccio
  461.  * Major rewrite.  Most common cases of selection buffer-to-arguments should now
  462.  * work automatically, but there is still no manual fall-back.
  463.  *
  464.  * Revision 1.3  2003/02/24 13:00:17  dicuccio
  465.  * Renamed classes in plugin spec:
  466.  *     CArgSeg --> CPluginArgSet
  467.  *     CArgument --> CPluginArg
  468.  *     CPluginArgs --> CPluginCommand
  469.  *     CPluginCommands --> CPluginCommandSet
  470.  *
  471.  * Revision 1.2  2003/02/21 16:44:13  dicuccio
  472.  * Added Win32 export specifiers for new plugin library.  Fixed compilation
  473.  * issues for Win32.
  474.  *
  475.  * Revision 1.1  2003/02/20 19:44:06  dicuccio
  476.  * Created new plugin architecture, mediated via an ASN.1 spec.  Moved GBENCH
  477.  * framework over to use new plugin architecture.
  478.  *
  479.  * ===========================================================================
  480.  */
  481. #endif  // GUI_CORE___PLUGIN_UTILS__HPP