Los Conectores dinámicos proporcionan la capacidad de insertar y eliminar conectores en una instancia en ejecución de Eclipse. Los Conectores 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 conectores.
Es posible que un conector 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 conectores 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 escuchador estará enganchado o que no se cobrará nada 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 conector para una vista específica, asegúrese primero de que la vista siga allí.
Como desarrollador de conectores, 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 escuchador 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 conectores 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 conector 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) { // registry specific logic }
} 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.