Ingeniería de Software

Practica 4: Arquitectura

En esta practica vamos a familiarizarnos con la arquitectura del sistema extensible a base de plug-ins. El objetivo de la practica es:
  1. Realizar un checkout del repositorio
  2. Entender la arquitectura
  3. Escribir un plug-in muy simple

Ejercicio 1: Checkout y ejecución de la arquitectura.

Lo primero que vamos a hacer es obtener una copia local de la arquitectura del sistema. Para ello vamos a utilizar un cliente de subversion. En un primer tiempo vamos a hacer esto desde la línea de comandos, y posteriormente lo haremos desde Eclipse.

Teclea svn --help para ver las distintas opciones que ofrece el cliente subversion.

Primero vamos a ver un listado del repositorio:

$svn ls svn://www.humbertocervantes.net

proyecto

$svn ls svn://www.humbertocervantes.net/proyecto

trunk
branches
tags

$ svn ls svn://
www.humbertocervantes.net/proyecto/trunk
build.xml
lib/
doc/
src/


Ahora vamos a hacer un checkout del trunk del proyecto:

$svn checkout svn://www.humbertocervantes.net/proyecto/trunk

A  trunk/doc
A  trunk/lib
A  trunk/src
A  trunk/src/mx
A  trunk/src/mx/uam
A  trunk/src/mx/uam/ingsoft

...

A  trunk/src/mx/uam/ingsoft/manejoproyecto
A  trunk/src/mx/uam/ingsoft/manejoproyecto/ManejadorProyectoImpl.java
A  trunk/res
A  trunk/res/manifest.mf
A  trunk/build.xml
Checked out revision 12.

$ cd trunk
$ ls
build.xml  doc  lib  res  src


Una vez que nos hayamos traido la versión actual, ya podemos compilarla.

$ant
...

run:
     [java] Lista de plugins instalados:
     [java] ----------------------------


En ese momento aparece una ventana con la aplicación. Al aprtetar Opciones>Plugins se puede apreciar una ventana que muestra la lista de plugins:



Ejercicio 2: Instalación de un Plug-In

Un Plug-In se materializa cómo un archivo JAR que contiene código ejecutable así como un conjunto de informaciones necesarias a la aplicación y que serán descritas más adelante. Una vez que hemos instalado la aplicación, es posible añadirle plug-ins de dos maneras distintas:
  • Manual: copiando un plugin en el directorio plugins
  • A través de la aplicación: usando el boton Instalar...
Instalar de cualquiera de los dos modos el plugin disponible en la dirección siguiente: http://www.humbertocervantes.net/plugins/pluginsimple.jar

  1. Ir a la lista de opciones (ahora debe aparecer un plug-in)
  2. Activarlo
  3. Ver que el plug-in introduce un menu en la aplicación principal.

Ejercicio 3: Comprensión de la arquitectura

Algunas de las clases más importantes de la arquitectura son:

Clase Principal

La clase principal se encarga de instanciar las diferentes implementaciones de las interfaces y de conectarlas entre ellas.

Clase ControladorImpl

Esta clase contiene una referencia hacia los modulos principales. A traves del controlador, los distintos módulos podrán controlar a la interfaz de usuario.

Clase AdministradorPluginsImpl

Esta clase es la clave de la infraestructura. Permite realizar la instalación, retiro, activación y desactivación de Plugins.
  • La clase recibe a traves de su constructor un directorio donde se almacenarán los plugins instalados.
  • La clase contiene un registro de plugins instalados
  • La clase permite instalar un plugin desde un URL, que puede representar desde un archivo local hasta un archivo en un sitio web distante.

Clase PluginInfo

Esta clase representa un plugin que esta cargado durante la ejecución de la aplicación, independientemente de si está activo o no. La clase permite obtener la información del plug-in que se define en su Manifest (ver adelante)

Abre las distintas clases y trata de entender la estructura a partir de la arquitectura descrita en clase. Comprueba lo visto en clase:
  1. Existe un package común para todas las interfaces
  2. Existe un package para cada modulo, dentro de este package se encuentra una implementación de la interfase
  3. Convenciones de códificación, de versiones, etc...

Ejercicio 4: Plug-ins

En este momento ya haz instalado un plug-in dentro del sistema. El siguiente ejercicio consiste en hacer tu mismo un plug-in. Como se dijo anteriormente un plug-in contiene lo siguiente en un archivo JAR:
  • Código fuente
  • Recursos asociados (por ejemplo íconos, etc...)
  • Meta-informaciones

Meta-informaciones

Las Meta-Informaciones son informaciones que proveer información del plug-in y le permiten a la aplicación instanciarlo. Estas informaciones se describen en un archivo de texto llamado un manifest. El manifest siempre se incluye en un archivo JAR (cuando no se incluye es generado de forma automática) y contiene conjuntos de atributos con un  nombre y un valor. Los atributos que se deben especificar para un plug-in son los siguientes:
  • Nombre-Plugin: atributo obligatorio que identifica al plug-in dentro de la aplicación
  • Clase-Plugin: atributo obligatorio que identifica la clase principal del plug-in (la clase que implementa la interfaz Plugin)
  • Autor-Plugin: atributo opcional que describe al autor del plug-in
  • Version-Plugin: atributo opcional que describe la version del plug-in
  • Inicia-Activo: atributo opcional que define si el plugin es activado al arrancar la aplicación.

Nombre-Plugin: PluginSimple
Clase-Plugin: mx.uam.plugin.PluginSimple
Autor-Plugin: Humberto Cervantes
Version-Plugin: 1.0.0
Inicia-Activo: false
Ejemplo de archivo manifest.mf


NOTA: Recuerda que en la práctica 2 vimos un ejemplo de cargado tardío en donde nosotros pasabamos a la aplicación un nombre de clase como argumento al momento de ejecución y eso permitia a la aplicación cargar la clase. El atributo Clase-Plugin cumple exactamente con el mismo propósito.

Clase principal

La clase principal del plugin es una clase que implementa la interfaz Plugin que tiene los metodos siguientes:

public interface Plugin
{
    /**
     * El metodo inicializa le da al plugin un contexto
     * que le permite interactuar con la aplicación
     *
     * @param ctxt El contexto
     */
    public void inicializa(Contexto ctxt);
    
    /**
     * El metodo activa hace que las funcionalidades del
     * plug-in esten accesibles
     *
     */
    public void activa();
    
    /**
     * El metodo desactiva hace que las funcionalidades del
     * plug-in no esten accesibles
     *
     */
    public void desactiva();
}

Ciclo de vida del plugin

Un plugin es inicializado una sola vez, pero puede ser activado y desactivado multiples veces durante la ejecución.
  • Incializa: Al arrancar la aplicación, el metodo inicializa es llamado si el plug-in está instalado. El contexto que recibe el plug-in le permite interactuar con la aplicación, por ejemplo para mostrar un mensaje o incluir un menu.
  • activa: El metodo activa es llamado si se pide que se active el plug-in o al principio si el atributo Inicia-Activo tiene como valor true.
  • desactiva: El metodo desactiva es llamado si se pide que se desactive el plugin o bien si la aplicación va a ser apagada.

A hacer:

El ejercicio de esta práctica consiste en hacer un plug-in simple. Para ello debes efectuar los pasos siguientes:
  1. Crear un nuevo proyecto que tenga directorios src, lib, doc y su build.xml
  2. En el directorio lib, incluir el archivo comun.jar
  3. Crear un package para la clase de implementación del plugin
  4. Crear una clase que implemente la interfaz Plugin. En un primer tiempo, la implementación puede sólo mostrar trazas usando la instrucción System.out.println
  5. Crear un archivo manifest.mf que contenga los atributos asociados a un plugin
  6. Modificar tu target package para que, a parte de los binarios, se incluya el manifest y que a la salida genere un JAR que será el plugin
  7. Lanzar el ejecutable de la arquitectura y probar que tu plugin funciona (aparecen las trazas en la consola).
  8. Modificar el plugin para que muestre los mensajes dentro de la ventana de la aplicación. Para ello, checar la clase Contexto que recibe el plug-in, de ahi obtener una referencia hacia la interfaz de usuario (ver la interface asociada) y utilizar sus métodos
  9. Intentar modificar el plugin para que incluya un menu en la aplicación. Metodo agregaMenu de la interfaz de usuario.
A entregar: archivo .jar obtenido a partir del target dist.

Síntesis:

En esta práctica hemos realizado:
  • Checkout de svn
  • Comprehensión de la arquitectura
  • Creación de un plug-in



Ultima actualización: 8 Febrero 2005
contacto: hcm@xanum.uam.mx
Homepage