domingo, enero 19, 2014

Metodología para la adición de nuevas extensiones a gvSIG

Por: Alexis Fajardo Moya


Las extensiones son la vía en la que los complementos extienden a Andami. Toda clase que implemente a la interfaz com.iver.andami.plugins.IExtension es una extensión, aunque esta clase no debe ser implementada directamente, para ello se provee la clase abstracta que la implementa com.iver.andami.plugins.Extension y de la cual deben heredar las extensiones que se deseen añadir.
Durante la inicialización, Andami instancia a cada una de las extensiones definidas. Las extensiones son capaces de agregar controles (herramientas, barras de herramientas y menús) a la interfaz de usuario; cuando se ejecuta un click en alguno de estos controles o alguno de ellos es modificado, se invoca al método execute() de la extensión asociada. Las extensiones pueden controlar también si los controles definidos están habilitados o no, y cuando son visibles o no.
Aun cuando se implemente esta interfaz para añadir una nueva extensión, es necesario definirla con un constructor vacío porque esta será invocada para crear una instancia de la extensión durante la inicialización.
Aquellos complementos bien instalados se crearán una instancia por cada extensión del complemento.
Cada vez que se cambia el foco de la venta activa y cada vez que se ejecuta el método execute(), Andami chequea los métodos isEnabled() e isVisible() de cada extensión, para decidir cuál de ellas deben estar habilitadas y visibles.
El método execute() será llamado desde el hilo de la interfaz de usuario (GUI), por tanto la GUI será bloqueada durante la ejecución del código implementado en el método; por tanto la ejecución debe ser rápida. En caso de que se inicie un proceso extenso desde execute(), un nuevo hilo debe ser inicializado.
Normalmente las extensiones no deben implementar directamente a la interfaz IExtension, sino heredar de la clase abstracta Extension.
A continuación se muestran los métodos que componen a la interfaz IExtension y su explicación:
  • void initialize(): Método donde se implementa el código de la inicialización de la extensión
  • void postInitialize(): Método donde se implementa la post inicialización de la extensión. Este código se ejecuta por Andami después de inicializar todas las extensiones.
  • void Terminate(): Método que se ejecuta al terminar la ejecución de Andami.
  • void Execute(String actionCommand): Este método se ejecuta al presionar el click del mouse sobre alguno de los controles definidos por la extensión (menús, herramientas, etc.). El parámetro actionCommand es útil para diferenciar los eventos generados por los controles añadidos por la misma extensión.
  • boolean isEnabled(): Método que se invoca para chequear si es habilitada o no la extensión y sus controles asociados. Los controles deshabilitados se muestran en color gris claro.
  • boolean isVisible(): Método que se invoca para chequear la visibilidad de la extensión y sus controles asociados.
  • IExtensionStatus getStatus(),
  • IExtensionStatus getStatus(IExtension extension): Devuelve el estado de la extensión, que será consultada para chequear si la extensión posee algún dato sin salvar a alguna tarea asociada ejecutándose de fondo.
Una vez implementadas todas las clases extensiones que se desean añadir en el complemento, es necesario definir en el archivo “./config/config.xml” los parámetros de cada una de las extensiones. En el tag <extensions> del archivo xml de configuración del complemento se definen las propiedades de cada una de las extensiones del complemento teniendo en cuenta el siguiente prototipo:
<extension
class-name=”Nombre de la clase que implementa una extension. Ejemplo: uclv.extsdf.NetCDFRasterAnimationExtension
description=”Descripción de la extensión
active=”true o false, que define si la extensión se activa o no
priority=”Valor numérico que define la prioridad de la extensión en la carga inicial”>
<menu <!--Define un menú en la GUI-->
text=”Texto del menú, los niveles se definen mediante ‘/’. Las extensiones que poseen la misma ruta son agrupados en el mismo menú en la GUI.
key=””
mnemonic=”Método nemotécnico
tooltip=”Texto breve que explica la funcionalidad del menú. Se muestra al pasar el puntero del mouse sobre el menú.
action-command=”cadena de texto que se pasa al método execute() de la clase que implementa una extensión.”
icon=”Icono del menú”>
</menu>
<tool-bar <!--Define una barra de herramienta en la GUI-->
name="Nombre de la barra de herramienta. Este mismo valor puede ser empleado en la declaración de otras extensiones para agrupar todos los controles del complemento en una misma barra de herramientas."
position="valor numérico que define la posición de esta barra de herramienta en la barra de herramienta general de gvSIG">
<action-tool <!--define una herramienta de la barra de herramienta-->
icon="imagen del botón de la barra de herramienta"
tooltip="Texto breve que explica la funcionalidad de la herramienta. Se muestra al pasar el puntero del mouse sobre el icono de la herramienta."
action-command="Cadena de texto que se pasa al método execute() de la clase que implementa una extensión"
position="Valor numérico que define la posición de la herramienta en la barra de herramienta."/>
</tool-bar>
</extension>
Todas las funcionalidades que se deseen añadir en el complemento como extensiones de gvSIG pueden seguir tres estrategias:
  • Implementar cada funcionalidad como una extensión (cada funcionalidad implementa a la clase abstracta Extension) y luego se añade la especificación de cada una de las extensiones en el archivo de configuración del complemento,
  • Implementar todas las funcionalidades en una única extensión y diferenciarlas mediante el parámetro action-command, o
  • La combinación de las dos anteriores.
Resulta válido aclarar que los controles que se implementan para una extensión poseen el mismo action-command.

No hay comentarios.:

Publicar un comentario