Os Element factories são utilizados para recriar objetos de gabarito do workbench com os dados salvos durante o encerramento do workbench.
Antes de nos aprofundarmos na extensão do element factory, precisamos rever uma técnica geral utilizada na plataforma toda para incluir comportamento específico do plug-in nos objetos de gabaritos comuns de plataformas.
Ao navegar pelas várias classes do workbench, notaremos que muitas das interfaces do workbench estendem a interface IAdaptable.
Os plug-ins utilizam adaptadores para incluir comportamento a tipos preexistentes no sistema. Por exemplo, o workbench talvez queira incluir comportamento aos recursos, para que eles respondam com uma etiqueta e uma imagem para representarem-se na UI. Sabemos que não é um bom design incluir comportamento específico da UI a objetos de nível baixo, portanto, como podemos incluir esse comportamento aos tipos de recurso?
A plataforma define uma técnica para consultar dinamicamente um objeto para a sua implementação de uma interface específica. Os plug-ins podem registrar adaptadores que incluem comportamento a tipos preexistentes. Dessa maneira, o código do aplicativo pode posteriormente consultar um adaptador específico para um objeto, ao utilizá-lo em um determinado contexto. Se houver um registrado para ele, eles poderão obter o adaptador e utilizar os novos comportamentos definidos no adaptador.
Fornecendo um recurso para consultar dinamicamente um adaptador para um objeto, podemos também melhorar a flexibilidade do sistema à medida que ele evolui. Novos adaptadores podem ser registrados nos tipos de plataforma através de novos plug-ins, sem ter que alterar as definições dos tipos originais. O padrão é pedir a um objeto um adaptador específico.
//fornecido um objeto o, queremos fazer coisas do "workbench" com ele.
if (!(o instanceof IAdaptable)) {
return null;
}
IWorkbenchAdapter adapter = (IWorkbenchAdapter)o.getAdapter(IWorkbenchAdapter.class);
if (adapter == null)
return null;
// agora posso tratar o como um IWorkbenchAdapter
...
Se não há adaptador disponível registrado para o objeto, será retornado null como adaptador. Os clientes devem estar preparados para manipular esse caso. Isso permite aos clientes manipularem o caso de forma apropriada onde um adaptador esperado não foi registrado.
O workbench utiliza adaptadores para obter informações sobre a UI dos tipos base da plataforma, como IResource. Isso protege os tipos base do conhecimento específico da UI e permite ao workbench desenvolver suas interfaces sem alterar as definições da base.
Sem adaptadores, qualquer classe que possa ser distribuída na API do workbench teria que implementar as interfaces da UI. Isso confunde as definições de classe e introduz acoplamento estreito. Ele introduz dependências circulares entre o núcleo e as classes da UI. Com adaptadores, cada classe implementa IAdaptable e utiliza o registro do adaptador para permitir que os plug-ins estendam o comportamento dos tipos base.
Em todo o código do workbench, você verá casos nos quais é consultado um tipo para um adaptador. Isso tudo acontece para obter um objeto que saiba como responder informações orientadas pela UI sobre um tipo de núcleo da plataforma.
Quando o workbench é encerrado pelo usuário, ele deve salvar o estado atual dos objetos IAdaptable mostrados no workbench. Isso é feito salvando parâmetros de dados primitivos do objeto em um formato especial, um IMemento, que é facilmente salvo no sistema de arquivos. O ID de um factory que pode recriar o objeto a partir de um IMemento é também armazenado.
Quando a plataforma é reiniciada, o workbench encontra o element factory associado ao ID do factory conhecido no memento. Ele encontra o factory verificando a existência de contribuições para a extensão org.eclipse.ui.elementFactories no registro do plug-in.
A marcação é bem simples. Temos apenas que especificar o ID do factory e a classe correspondente que o implementa.
O snippet de código a seguir é do plugin.xml do workbench.
<extension
point = "org.eclipse.ui.elementFactories">
<factory id ="org.eclipse.ui.internal.model.ResourceFactory"
class="org.eclipse.ui.internal.model.ResourceFactory">
</factory>
<factory id ="org.eclipse.ui.internal.model.WorkspaceFactory"
class="org.eclipse.ui.internal.model.WorkspaceFactory">
</factory>
<factory id ="org.eclipse.ui.part.FileEditorInputFactory"
class="org.eclipse.ui.part.FileEditorInputFactory">
</factory>
<factory id ="org.eclipse.ui.internal.dialogs.WelcomeEditorInputFactory"
class="org.eclipse.ui.internal.dialogs.WelcomeEditorInputFactory">
</factory>
</extension>