Plug-ins y paquetes compuestos

La mecánica de soporte de plug-ins se implementa mediante la infraestructura OSGi. Desde este punto de vista, un plug-in es equivalente a un paquete compuesto OSGi. El paquete compuesto y sus clases asociadas especifican e implementan el proceso de la carga de clases Java, la gestión de prerrequisitos y el ciclo de vida del paquete compuesto. En el resto de esta descripción, utilizaremos los términos plug-in y paquete compuesto indistintamente, excepto al describir una clase determinada de la infraestructura.

Plugin

La clase Plugin representa un plug-in que se ejecuta en la plataforma. Es una ubicación adecuada para centralizar los aspectos del ciclo de vida y la semántica global de un plug-in. Un plug-in puede implementar una función especializada para los aspectos de inicio y detención de su ciclo de vida. Cada método de ciclo de vida incluye una referencia a un BundleContext que puede suministrar información adicional.

La parte de inicio del ciclo de vida merece una atención especial. Ya hemos visto que la información relativa a un plug-in puede obtenerse del archivo de manifiesto del plug-in sin necesidad de ejecutar el código del mismo. Generalmente, alguna acción de usuario en el entorno de trabajo provoca una cadena de eventos que requiere el inicio de un plug-in. Desde el punto de vista de una implementación, un plug-in nunca se inicia hasta que es necesario cargar una clase contenida en el plug-in.

El método start ha sido el lugar adecuado para implementar el comportamiento de inicialización y registro de un plug-in. Sin embargo, es importante tener en cuenta que el plug-in puede iniciarse en circunstancias muy diversas. Algo tan simple como obtener un icono para decorar un objeto puede provocar la carga de las clases del plug-in, iniciando con ello el propio plug-in. Una inicialización demasiado exigente puede provocar la carga del código y los datos del plug-in mucho antes de lo necesario. Por tanto, es importante observar atentamente las tareas de inicialización del plug-in y considerar alternativas para realizar la inicialización durante el arranque.

Contexto de paquete compuesto

La gestión del ciclo de vida es el punto en el que coinciden el término "paquete compuesto" de OSGi y el término "conector" de la plataforma. Cuando se inicia el plug-in, obtiene una referencia a un BundleContext desde el que puede obtener información relacionada con el plug-in. El BundleContext también puede utilizarse para obtener información acerca de otros paquetes compuestos/plug-ins del sistema.

BundleContext.getBundles() puede utilizarse para obtener una matriz de todos los paquetes compuestos del sistema. Puede registrarse escuchas de BundleEvent a fin de que el plug-in esté al tanto de los cambios producidos en el estado del ciclo de vida de otros paquetes compuestos. Consulte el javadoc de BundleContext y BundleEvent para obtener más información.

Antes de la versión 3.0, se suministraba un registro de plug-ins (IPluginRegistry) para proporcionar información similar. Por ejemplo, podía consultarse para obtener los descriptores de plug-in de todos los plug-ins del sistema. Este registro ha quedado obsoleto, y en su lugar debe utilizarse BundleContext para este propósito. El registro de plataforma se utiliza ahora exclusivamente para obtener información acerca de las extensiones y puntos de extensión.

Activador de paquetes compuestos

La interfaz BundleActivator define el comportamiento de inicio y detención implementado en la clase Plugin. Aunque la clase Plugin es una ubicación adecuada para implementar esta función, el desarrollador del plug-in tiene libertad absoluta para implementar la interfaz de BundleActivator en cualquier clase adecuada al diseño del plug-in. De hecho, el plug-in no necesita implementar esta interfaz en absoluto si no tiene necesidades específicas de gestión del ciclo de vida.

Paquetes compuestos

Debajo de todo plug-in, subyace un paquete compuesto OSGi gestionado por la infraestructura. El paquete compuesto es la unidad de modularidad de OSGi. En esencia, un paquete compuesto es simplemente una colección de archivos (recursos y código) instalados en la plataforma. Cada paquete compuesto tiene su propio cargador de clases Java e incluye un protocolo para iniciarse, detenerse y desinstalarse a sí mismo. Desde el punto de vista de la plataforma Eclipse, Bundle es simplemente una clase de implementación. Los desarrolladores de plug-ins no amplían la clase bundle, sino que utilizan Plugin u otra implementación de BundleActivator para representar el plug-in.