Os plug-ins dinâmicos facultam a capacidade de inserir e remover plug-ins de uma instância Eclipse em execução. Componentes reutilizáveis com o potencial de serem descarregados, os plug-ins dinâmicos constituem uma maneira fácil de ajudar a acompanhar as actividades dos plug-ins.
Um plug-in dinâmico poderá não permanecer durante toda a vida da aplicação, de modo que é essencial garantir que quando o componente desaparece fica tudo limpo. Quando os ouvintes são ligados à Área de trabalho e são registados artigos, estes ficam lá depois do encerramento, de modo que os plug-ins devem saber que é necessária uma limpeza.
Pensar que, no arranque, uma leitura de todas as implementações de pontos de extensão é suficiente durante a vida da aplicação é erróneo e não irá funcionar. É necessário garantir que o ouvinte está ligado ou que nada é colocado em memória cache, de modo a que as alterações ao registo sejam ouvidas. É importante compreender que os artigos na área de trabalho não são forçosamente estáticos, pois na verdade são transitórios e podem desaparecer em qualquer altura. Se escrever um plug-in para uma vista específica primeiro, assegure-se de que a vista ainda lá se encontra.
Como programador de plug-ins é necessário garantir que as extensões utilizadas têm permissão para aparecer e desaparecer em dado momento. Quando desaparecem, deve reconhecer-lhes o desaparecimento limpando as estruturas internas que possam representam as extensões e removendo artefactos de UI que estas possam conduzir. Quando aparecem, deve aumentar-se-lhes as estruturas internas e possivelmente criar novos artefactos de UI. Parta do princípio de que a sua aplicação está a ler o registo e tem uma extensão, poderá criar um registo para ela e atribuir-lhe uma localização. Aquando da conclusão, será notificado(a) da necessidade de uma limpeza. Além disso, um ouvinte anunciará a entrada de novos artigos e criá-los-á.
O org.eclipse.core.runtime.dynamicHelpers.IExtensionTracker e interfaces associadas facultam um mecanismo com o qual os programadores de plug-ins podem facilmente acompanhar as actividades das extensões e gerir os recursos geradios por tais acções.
O exemplo seguinte presume que se dispõe de um ponto de extensão no plug-in chamado widgets e que se utiliza oIExtensionTracker. Internamente, há WidgetDescriptors que englobam extensões de widgets e um WidgetRegistry para as gerir.
public class WidgetRegistry implements IExtensionChangeHandler { public WidgetRegistry() { IExtensionTracker tracker = PlatformUI.getWorkbench() .getExtensionTracker();
IExtensionPoint point = Platform.getExtensionRegistry() .getExtensionPoint("omeu.plugin.namespace", "widget");
IExtension[] extensions = point.getExtensions();
// initial population
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) { // registry specific logic } 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)
} }
Neste exemplo, a UI da plataforma proporciona instâncias de IExtensionTracker a diversos níveis da área de trabalho. Se acompanhar objectos que existem durante a vida da área de trabalho, deve utilizar o tracker facultado por IWorkbench.getExtensionTracker(). Se os seus objectos forem relevantes para determinadas janelas ou páginas da área de trabalho, deve utilizar os trackers facultados por IWorkbenchWindow.getExtensionTracker() ou IWorkbenchPage.getExtensionTracker(). Por exemplo, a área de trabalho acompanha descritores de vistas ao nível da área de trabalho mas acompanha vistas de instâncias propriamente ditas ao nível de página de área de trabalho. As suas rotinas de tratamento poderão estar registadas junto de determinados pontos de extensão mediante uma instância IFilter para IExtensionTracker.registerHandler(). A sua rotina de tratamento só será chamada quando forem adicionadas ou removidas extensões correspondentes ao objecto IFilter.
Quando uma extensão entra no tempo de execução, este método é chamado. A sua rotina de tratamento tem assim a oportunidade de incorporar a nova extensão no seu modelo associado. Quaisquer objectos criados com base na IExtension facultada a esta interface devem ser registados junto do tracker através de IExtensionTracker.registerObject(). Quando uma extensão sai do tempo de execução, este método é chamado. Quaisquer objectos anteriormente registados junto da extensão serão transmitidos como argumentos. A sua rotina de tratamento poderá limpar e inutilizar os objectos conforme o necessário. É boa prática anular registo de rotinas de tratamento para que os registos não tenham fugas.