Fábricas de elementos

Las fábricas de elementos permiten volver a crear los objetos del modelo de entorno de trabajo a partir de los datos que se guardaron durante la conclusión del entorno de trabajo.

Antes de explicar detenidamente la extensión de fábrica de elementos, tenemos que revisar una técnica general utilizada en la plataforma que permite añadir un comportamiento específico del conector a los objetos comunes del modelo de la plataforma.

Interfaz IAdaptable y adaptadores del entorno de trabajo

Al examinar las diversas clases de entorno de trabajo, observará que muchas de las interfaces del entorno de trabajo amplían la interfaz IAdaptable.

Los conectores utilizan adaptadores para añadir un comportamiento específico a los tipos preexistentes del sistema. Por ejemplo, el entorno de trabajo podría tener recursos que devolvieran una etiqueta y una imagen con fines de visualización. Teniendo en cuenta que no conviene añadir un comportamiento específico de la UI a los objetos de bajo nivel, ¿cómo podremos añadir este comportamiento a los tipos de recursos?

Los conectores pueden registrar adaptadores que añadan un comportamiento a los tipos preexistentes. Luego, el código de la aplicación puede consultar un objeto para obtener un adaptador concreto. Si hay uno que esté registrado, la aplicación puede obtener el adaptador y utilizar los comportamientos nuevos definidos en él.

Al proporcionar un servicio para consultar dinámicamente un adaptador para obtener un objeto, podemos aumentar la flexibilidad del sistema a medida que evoluciona. Se pueden registrar adaptadores nuevos para los tipos de plataforma mediante conectores nuevos, sin que haga falta cambiar las definiciones de los tipos originales. El patrón que permite consultar un objeto para obtener un adaptador concreto es el siguiente:

   //dado un objeto o, deseamos hacer operaciones de "entorno de trabajo" con él.
   if (!(o instanceof IAdaptable)) {
            return null;
   }
   IWorkbenchAdapter adapter = (IWorkbenchAdapter)o.getAdapter(IWorkbenchAdapter.class);
   if (adapter == null)
            return null;
// ahora se puede tratar o como un IWorkbenchAdapter
   ...

Si no existe ningún adaptador registrado para el objeto en cuestión, se devolverá el valor null como adaptador. Los clientes deben estar preparados para manejar este caso. Puede suceder que un adaptador esperado no haya sido registrado.

El entorno de trabajo utiliza los adaptadores para obtener información de la UI a partir de los tipos básicos de la plataforma, como puede ser la interfaz IResource. Los adaptadores apantallan los tipos básicos frente al conocimiento específico de la UI y permiten que el entorno de trabajo vaya desarrollando sus interfaces sin que haga falta cambiar las definiciones de la base.

Sin los adaptadores, las clases que pudieran pasarse en la API del entorno de trabajo tendrían que implementar las interfaces de la UI, lo que aumentaría el número de definiciones de clases, introduciría un acoplamiento estrecho y crearía dependencias circulares entre las clases del núcleo y las clases de la UI. Con los adaptadores, cada clase implementa IAdaptable y utiliza el registro de adaptadores para permitir a los conectores ampliar el comportamiento de los tipos básicos.

En todo el código del entorno de trabajo, verá casos en los que se consulta un tipo del núcleo de la plataforma para obtener un adaptador. La consulta permite obtener un objeto que sepa cómo devolver información orientada a la UI sobre el tipo.

Fábricas de elementos

Cuando el usuario concluye el entorno de trabajo, este debe guardar el estado actual de los objetos IAdaptable que se muestran en él. El estado de un objeto se almacena guardando los parámetros de datos primitivos del objeto con un formato especial, llamado recordatorio (IMemento). También se almacena el ID de una fábrica que pueda volver a crear el objeto a partir de una interfaz IMemento, y los datos se guardan en el sistema de archivos.

Cuando se reinicia la plataforma, el entorno de trabajo localiza la fábrica de elementos asociada al ID de fábrica del recordatorio IMemento. Para localizar la fábrica, comprueba si en el registro de conectores hay contribuciones a la extensión org.eclipse.ui.elementFactories.

Los códigos XML son bastante simples. Tan solo tenemos que especificar el ID de la fábrica y la correspondiente clase que implementa la fábrica.

El siguiente fragmento de código procede del archivo plugin.xml del entorno de trabajo.

<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>