TerraLib and TerraView Wiki Page

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Both sides previous revision Previous revision
Next revision
Previous revision
wiki:designimplementation:plugin [2014/09/10 13:12]
gribeiro
wiki:designimplementation:plugin [2014/09/10 13:33] (current)
gribeiro [TerraLib → Plugin]
Line 1: Line 1:
 ====== TerraLib → Plugin ====== ====== TerraLib → Plugin ======
 +
 +
 +===== Introduction =====
 +
 +A plugin is a computer program that interacts with a host application such as TerraView or TerraMA2 adding new capabilities/​functionalities to it. These functionalities are added, in general, at runtime. There are several terms used instead of plugin: plug-in, addin, add-in, addon, add-on, snap-in, extension or supplement, for more information on plugin definitions see [[http://​en.wikipedia.org/​wiki/​Plug-in_%28computing%29|Wikipedia]]. ​
 +
 +This module provides a basic framework for those who want to create plugins in the TerraLib Platform. Instead of a framework target to a specific application such as TerraView or TerraMA2, this plugin framework handles the extensions (plugins) and is capable of loading then dynamically. It provides the basic foundation to simplify the burden of dealing with plugins: check-up of dependencies,​ configuration reading, plugin management and startup/​shutdown actions. Besides that, this framework allows plugins written using other programming languages, meanly the ones supported in the [[language binding modules]]. For instance you can create plugins in Lua, Java or R.
 +
 +As pointed out by Vandevoorde (2006), for C and C++ programs plugins are typically implemented as shared libraries that are dynamically loaded (and sometimes unloaded) by the main program.
 +
 +The next section will explain in details the design of this module.
 +===== Design Rationale =====
 +
 +==== A simple example in C++ ====
 +
 +===== Implementation Details =====
  
 A classe ''​AbstractPlugin''​ define a interface básica das implementações de suporte a plugins. Todo plugin: A classe ''​AbstractPlugin''​ define a interface básica das implementações de suporte a plugins. Todo plugin:
Line 8: Line 24:
  
 <code cpp> <code cpp>
-class abstract_plugin ​: public boost::​noncopyable+class AbstractPlugin ​: public boost::​noncopyable
 { {
   public:   public:
  
     //! Default constructor.     //! Default constructor.
-    ​abstract_plugin() { }+    ​AbstractPlugin() { }
  
     //! Virtual destructor.     //! Virtual destructor.
-    virtual ~abstract_plugin() { }+    virtual ~ AbstractPlugin() { }
  
     //! Plugin information.     //! Plugin information.
-    virtual const plugin_info_t& info() const = 0;+    virtual const PluginInfo& info() const = 0;
  
     //! Tells if the plugin has been started.     //! Tells if the plugin has been started.
Line 87: Line 103:
 typedef std::​pair<​std::​string,​ std::​string>​ Parameter; typedef std::​pair<​std::​string,​ std::​string>​ Parameter;
 </​code>​ </​code>​
 +
 +<code cpp>
 +//! The base class for plugin engines.
 +class AbstractPluginEngine : public boost::​noncopyable
 +{
 +  public:
 +
 +    //! Default construtor.
 +    AbstractPluginEngine() { }
 +
 +    //! Virtual destructor.
 +    virtual ~ AbstractPluginEngine() { }
 +
 +    //! Every plugin engine must have a unique identifier.
 +    virtual const std::​string&​ id() const = 0;
 +
 +    //! The name of plugin engine with a brief title or description.
 +    virtual const std::​string&​ name() const = 0;
 +
 +    //! Load the informed plugin.
 +    /*!
 +      \param pinfo Information about the plugin to be loaded.
 +
 +      \exception plugin_engine_load_error It may throws an exception.
 +     */
 +    virtual std::​unique_ptr<​AbstractPlugin>​ load(const PluginInfo&​ pinfo) = 0;
 +
 +    //! Unload the informed plugin.
 +    /*!
 +      On success the informed plugin will be also destroyed ​
 +      and its pointer will be invalidated.
 +
 +      \exception plugin_engine_unload_error It may throws an exception.
 +     */
 +    virtual void unload(std::​unique_ptr<​AbstractPlugin>​ plugin) = 0;
 +};
 +</​code>​
 +
 +Plugins escritos na linguagem C++ possuem um suporte padrão para carga de bibliotecas dinâmicas e outros detalhes deste tipo de linguagem. A classe ''​CppPlugin''​ é a classe base para plugins escritos em C++ com este suporte.
 +
 +===== Final Remarks and Future Works =====
 +
 +===== References =====