Plug-ins dinámicos

Los Plug-ins dinámicos proporcionan la capacidad de insertar y eliminar plug-ins en una instancia en ejecución de Eclipse. Los Plug-ins dinámicos son un componente reutilizable con el potencial de descargarse, que proporciona una manera sencilla de ayudarle a hacer un seguimiento de las entradas y salidas de los plug-ins.

Es posible que un plug-in dinámico no permanezca como tal durante toda la vida de la aplicación, por lo que, cuando el componente desaparezca, es esencial asegurarse de que se realice una limpieza completa. Cuando los escuchas están enganchados al entorno de trabajo y los elementos están registrados, permanecen después de concluir el sistema y estos plug-ins deben saber que tienen que realizar la limpieza.

La suposición de que al arrancar, bastará una lectura de todas las implementaciones del punto de extensión para la vida de la aplicación, es falsa, ya que no funcionará. Debe asegurarse de que el escucha estará enganchado o que la memoria caché no se utiliza para que se escuchen los cambios del registro. Es importante entender que los elementos del entorno de trabajo no son necesariamente estáticos; en realidad, son transitorios y podrían desaparecer en cualquier momento. Si escribe un plug-in para una vista específica, asegúrese primero de que la vista siga allí.

Como desarrollador de plug-ins, tiene que asegurarse de que cualquier extensión que pueda utilizar esté autorizada a aparecer y desaparecer en cualquier momento dado. Cuando desaparezca, debe reconocer su desaparición limpiando las estructuras internas que puedan representar las extensiones y eliminar cualquier artefacto de UI que puedan dirigir. Cuando aparezca, debe aumentar sus estructuras internas y posiblemente crear nuevos artefactos de UI. Suponga que la aplicación lee del registro y tiene una extensión, crea un registro para ella y le asigna su ubicación. A su conclusión, debería recibir una notificación de que es necesario realizar una limpieza. Además, un escucha anunciará cuándo llegan elementos nuevos y los creará.

org.eclipse.core.runtime.dynamicHelpers.IExtensionTracker e interfaces asociadas proporcionan un mecanismo por el que los desarrolladores de plug-ins pueden hacer fácilmente un seguimiento de la entrada y salida de extensiones y gestionar los recursos generados por esas acciones.

En el ejemplo siguiente se da por supuesto que tiene un punto de extensión en el plug-in denominado widgets y que utiliza IExtensionTracker. Internamente, tiene WidgetDescriptors que encapsulan las extensiones de widget y un WidgetRegistry para gestionarlas.



	public class WidgetRegistry implements IExtensionChangeHandler {

	
	
	  public WidgetRegistry() {
		
		IExtensionTracker tracker = PlatformUI.getWorkbench()
	
  	.getExtensionTracker();
IExtensionPoint point = Platform.getExtensionRegistry() .getExtensionPoint("my.plugin.namespace", "widget");
IExtension[] extensions = point.getExtensions();
// rellenado inicial
for (int i = 0; i < extensions.length; i++) { addExtension(tracker, extensions[i]);
} tracker
.registerHandler(this, tracker
.createExtensionPointFilter(point)); } public void addExtension(IExtensionTracker tracker, IExtension extension){ WidgetDescriptor descriptor = new WidgetDescriptor(extension); tracker.registerObject(extension, descriptor,
IExtensionTracker.REF_STRONG); addToInternalStructure(descriptor) } private void addToInternalStructure(WidgetDescriptor descriptor) { // lógica específica del registro } public void removeExtension(IExtension extension, Object[] objects) { for (int i = 0; i < objects.length; i++) { WidgetDescriptor descriptor = (WidgetDescriptor) objects[i];
removeFromInternalStructure(descriptor);
}
} private void removeFromInternalStructure(WidgetDescriptor descriptor) { // lógica específica del registro }
} public void dispose() { PlatformUI.getWorkbench() .getExtensionTracker().unregisterHandler(this)
} }

En este ejemplo, la UI de plataforma proporciona instancias de IExtensionTracker en diversos niveles del entorno de trabajo. Si hace un seguimiento de objetos que viven dependiendo de la vida del entorno de trabajo, debe utilizar el seguidor proporcionado por IWorkbench.getExtensionTracker(). Si los objetos son relevantes para ventanas o páginas determinadas del entorno de trabajo, debe utilizar los seguidores proporcionados por IWorkbenchWindow.getExtensionTracker() o IWorkbenchPage.getExtensionTracker(). Por ejemplo, el entorno de trabajo hace un seguimiento de los descriptores de vista en el nivel de entorno de trabajo, pero hace un seguimiento de instancias de vista reales en el nivel de página del entorno de trabajo. Los manejadores pueden registrarse para puntos de extensión determinados si se proporciona una instancia de IFilter a IExtensionTracker.registerHandler(). Sólo se llamará al manejador cuando las extensiones que coinciden con el objeto IFilter se añadan o se eliminen.

Se llamará a este método cuando una extensión entre en el tiempo de ejecución. Entonces, el manejador tendrá la oportunidad de incorporar la nueva extensión a su modelo asociado. Cualquier objeto creado en el IExtension proporcionado para esta interfaz debe registrarse para el seguidor a través de IExtensionTracker.registerObject(). Se llamará a este método cuando una extensión abandone el tiempo de ejecución. Los objetos registrados anteriormente para la extensión se pasarán como argumentos. A continuación, el manejador puede limpiar y desechar los objetos como sea necesario. Es recomendable eliminar el registro de los manejadores para que no haya fugas en los registros.