.. Copyright (C) 2005 - 2013 Eric Van Dewoestine
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see .
Architecture
============
The eclim architecture is pretty straight forward. Commands issued by a user
in vim are relayed via nailgun_ to the running eclim daemon and the proper
command implementation is then located and executed.
Here is a diagram showing the sequence in a bit more detail:
.. uml::
skinparam monochrome true
hide footbox
box "Vim"
participant ".vim"
participant eclim.vim
end box
participant nailgun
box "Eclipse / Eclimd"
participant Main
participant Services
participant ""
end box
".vim" -> eclim.vim : eclim#Execute
activate eclim.vim
eclim.vim -> nailgun
activate nailgun
nailgun -> Main : main
activate Main
Main -> Services : getCommand
Services --> Main
Main -> "" : execute
"" --> Main
Main --> nailgun
nailgun --> eclim.vim
eclim.vim --> ".vim"
deactivate Main
deactivate nailgun
deactivate eclim.vim
The commands which are executed on the eclimd side are also fairly simple.
They accept an object containing the command line parameters passed into the
eclim invocation and then return an object (String, Collection, etc) which is
converted to a json response. Below is a simple class diagram showing the
hierarchy of a couple typical commands.
.. uml::
skinparam monochrome true
skinparam circled {
CharacterFontSize 0
CharacterRadius 0
}
Command <|.. AbstractCommand
AbstractCommand <|-- PingCommand
AbstractCommand <|-- ShutdownCommand
class Command <> {
Object execute(CommandLine)
}
AbstractCommand : Preferences getPreferences()
PingCommand : Object execute(CommandLine)
ShutdownCommand : Object execute(CommandLine)
Another important aspect of eclim's architecture is support for plugins.
Plugins for eclim are bundled as eclipse plugins with their auto start
attribute set to false. When the eclim daemon starts it will locate and load
any eclipse plugin with an 'org.eclim.' prefix.
When a plugin is loaded, eclim will locate the plugin's required resources
provider and invoke its initialize method which will then inject its resources
(messages, command options, etc) into eclim and register any new commands.
Here is graphical representation of this process:
.. uml::
skinparam monochrome true
hide footbox
participant ""
participant EclimApplication
participant PluginResources
participant Services
"" -> EclimApplication : start
activate EclimApplication
EclimApplication -> EclimApplication : loadPlugins
activate EclimApplication
EclimApplication -> PluginResources : initialize
activate PluginResources
PluginResources -> Services : addPluginResources
PluginResources -> Services : registerCommand
PluginResources --> EclimApplication
deactivate PluginResources
deactivate EclimApplication
deactivate EclimApplication
EclimApplication --> ""
.. _nailgun: http://www.martiansoftware.com/nailgun/