Динамические модули

Динамические модули предоставляют возможность добавления и удаления модулей активного экземпляра Eclipse. Динамический модуль представляет собой многоразовый компонент с возможностью выгрузки, позволяющий эффективно отслеживать добавление и удаление модулей.

Динамический модуль не обязательно должен существовать в течение всего жизненного цикла приложения. Таким образом, важно убедиться, что при удалении компонента выполняется соответствующая очистка. Если обработчики событий связаны с рабочей средой, то в случае регистрации элементов они сохраняются в рабочей среде после завершения работы и модули должны знать о необходимости очистки.

Предположение, что при загрузке просмотр реализаций точки расширения достаточен для всего времени существования приложения, неверно, поскольку такой подход неприменим. Для отслеживания изменений, вносимых в реестр, убедитесь, что обработчик событий установлен, либо не применяется кэш. Обратите внимание, что в состав рабочей среды входят не только статические элементы. Фактически некоторые элементы являются временными и могут быть удалены в любой момент. Если вы разрабатываете модуль для конкретной панели, в первую очередь проверьте, что панель существует.

Разработчик модуля должен убедиться, что все расширения, которые предполагается использовать, можно добавлять и удалять в любой момент. При удалении следует очистить все внутренние структуры, представляющие расширения, и убрать связанные артефакты пользовательского интерфейса. При добавлении следует добавить внутренние структуры и при возможности создать новые артефакты пользовательского интерфейса. Предположим, что приложение считывает данные из реестра и связано с расширением. Вы можете создать для него запись и указать для нее расположение. В результате будет выдано уведомление о необходимости очистки. Кроме того, получатель запросов будет уведомлять о передаче новых элементов и создавать их.

org.eclipse.core.runtime.dynamicHelpers.IExtensionTracker и связанные интерфейсы предоставляют механизм, с помощью которого разработчики модулей могут эффективно отслеживать расширения и управлять ресурсами, созданными в результате таких действий.

В следующем примере предполагается, что в виджетах, вызываемых модулем, используется точка расширения, а также применяется IExtensionTracker. В состав внутренней структуры входит WidgetDescriptors, инкапсулирующий расширения виджетов, и WidgetRegistry, управляющий ими.



	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();
// начальное заполнение
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) { // логика реестра } 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)
} }

В этом примере пользовательский интерфейс платформы предоставляет экземпляры IExtensionTracker на различных уровнях рабочей среды. Для отслеживания объектов, существующих в течение всего жизненного цикла рабочей среды, следует использовать трассировщик, предоставленный IWorkbench.getExtensionTracker(). Если объекты связаны с конкретными окнами или страницами рабочей среды, следует использовать трассировщики, предоставленные IWorkbenchWindow.getExtensionTracker() или IWorkbenchPage.getExtensionTracker(). Например, рабочая среда отслеживает дескрипторы панелей на уровней рабочей среды, однако конкретные экземпляры панелей отслеживаются на уровне страницы рабочей среды. Пользовательские разработчики можно зарегистрировать в конкретных точках расширения, предоставив экземпляр IFilter функции IExtensionTracker.registerHandler(). Обработчик вызывается только в случае добавления или удаления расширений, соответствующих объекту IFilter.

Этот метод вызывается в случае активации расширения в рабочей среде. При этом обработчик может встроить новое расширение в связанную модель. Объекты, созданные на основе IExtension, предоставленного этому интерфейсу, подлежат регистрации в трассировщике с помощью IExtensionTracker.registerObject(). Этот метод вызывается в случае завершения обработки расширения рабочей средой. Все объекты, зарегистрированные в расширении, передаются в качестве аргументов. Обработчик может выполнять очистку объектов. Во избежание утечки памяти из реестров регистрацию обработчиков рекомендуется отменять.