Element factories

Os Element factories são utilizados para recriar objetos de modelo do ambiente de trabalho com os dados salvos durante o encerramento do ambiente de trabalho.

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 modelos comuns da plataforma.

IAdaptables e adaptadores do ambiente de trabalho

Ao navegar pelas várias classes do ambiente de trabalho, notaremos que muitas das interfaces do ambiente de trabalho estendem a interface IAdaptable.

Os plug-ins utilizam adaptadores para incluir comportamento a tipos preexistentes no sistema. Por exemplo, o ambiente de trabalho talvez queira que os recursos respondam com um rótulo e uma imagem com finalidade de exibição. Sabemos que não é um bom design incluir comportamento específico da UI em objetos de nível inferior, portanto, como podemos incluir esse comportamento nos tipos de recurso?

Os plug-ins podem registrar adaptadores que incluem comportamento em tipos preexistentes. Em seguida, o código de aplicativo pode consultar se há um adaptador específico em um objeto. Se houver um registrado para ele, o aplicativo poderá obter o adaptador e utilizar os novos comportamentos definidos no adaptador.

Fornecendo um recurso para consultar dinamicamente a existência de um objeto em um adaptador, podemos 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 para pedir a um objeto um adaptador específico é o seguinte:

   //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 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. Haverá momentos em que um adaptador esperado não foi registrado.

O ambiente de trabalho utiliza adaptadores para obter informações sobre a UI dos tipos base da plataforma, como IResource. Os adaptadores protegem os tipos base do conhecimento específico da UI e permitem que o ambiente de trabalho desenvolva suas interfaces sem alterar as definições da base.

Sem adaptadores, qualquer classe que pudesse ser distribuída na API do ambiente de trabalho teria que implementar as interfaces da UI, o que aumentaria o número de definições de classes, introduziria acoplamento firme e criaria dependências circulares entre as classes do núcleo e 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 ambiente de trabalho, você verá casos em que um tipo de núcleo da plataforma é consultado para ver se há um adaptador. A consulta é utilizada para obter um objeto que saiba como responder informações orientadas pela UI sobre o tipo.

Element factories

Quando o ambiente de trabalho é encerrado pelo usuário, ele deve salvar o estado atual dos objetos IAdaptable mostrados no ambiente de trabalho. O estado de um objeto é armazenado salvando-se os parâmetros de dados primitivos do objeto em um formato especial, um IMemento. O ID de um factory que pode recriar o objeto a partir de um IMemento também é armazenado e os dados são salvos no sistema de arquivos.

Quando a plataforma é reiniciada, o ambiente de trabalho encontra o element factory associado ao ID do factory do IMemento. 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 fragmento de código a seguir é do plugin.xml do ambiente de trabalho.

<extension
         point="org.eclipse.ui.elementFactories">
      <factory 
            class="org.eclipse.ui.internal.model.ResourceFactory"
            id="org.eclipse.ui.internal.model.ResourceFactory">
  </factory>
      <factory 
            class="org.eclipse.ui.internal.model.WorkspaceFactory"
            id="org.eclipse.ui.internal.model.WorkspaceFactory">
  </factory>
      <factory 
            class="org.eclipse.ui.part.FileEditorInputFactory"
            id="org.eclipse.ui.part.FileEditorInputFactory">
  </factory>
      <factory 
            class="org.eclipse.ui.internal.dialogs.WelcomeEditorInputFactory"
            id="org.eclipse.ui.internal.dialogs.WelcomeEditorInputFactory">
  </factory>
      <factory 
            class="org.eclipse.ui.internal.WorkingSetFactory"
            id="org.eclipse.ui.internal.WorkingSetFactory">
  </factory>
 </extension>