Las fábricas de elementos se utilizan para volver a crear objetos de modelo de entorno de trabajo a partir de datos que se guardaron durante la conclusión del entorno de trabajo.
Antes de tratar detenidamente la extensión de fábrica de elementos, es preciso revisar un procedimiento general utilizado en la plataforma para añadir funciones específicas del conector a objetos de modelo de plataforma comunes.
Al examinar las diversas clases de entorno de trabajo, observará que muchas de las interfaces de entorno de trabajo amplían la interfaz IAdaptable.
Los conectores utilizan adaptadores para añadir funciones específicas a tipos ya existentes en el sistema. Por ejemplo, el entorno de trabajo podría añadir funciones a recursos de manera que respondan a una etiqueta y a una imagen que les represente en la UI. Es sabido que no es aconsejable añadir funciones específicas de la UI a objetos de bajo nivel, entonces ¿cómo se pueden añadir estas funciones a los tipos de recursos?
La plataforma define un procedimiento para consultar dinámicamente un objeto a fin de implementarle una interfaz concreta. Los conectores pueden registrar adaptadores que añaden funciones a los tipos ya existentes. De esta manera, el código de aplicación puede consultar más adelante si existe un adaptador concreto para un objeto cuando lo utiliza en un contexto específico. Si dicho objeto tiene un adaptador registrado, puede obtenerlo y utilizar las nuevas funciones definidas en él.
Al proporcionar un recurso para consultar dinámicamente un adaptador para un objeto, se aumenta la versatilidad del sistema a medida que evoluciona. Los conectores nuevos pueden registrar los nuevos adaptadores para tipos de plataforma sin tener que modificar las definiciones de los tipos originales. El patrón es preguntar a un objeto si tiene un adaptador concreto.
//a partir del objeto o, se desea realizar 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 que estamos utilizando, se devolverá nulo en relación al adaptador. Los clientes deben estar preparados para manejar este caso. Esto permite a los clientes manejar fácilmente el caso en el que no se ha registrado un adaptador esperado.
El editor de trabajo utiliza adaptadores para obtener información de la UI a partir de los tipos de plataforma básicos, como IResource. Esto protege a estos tipos de plataforma contra determinadas maneras de utilizar la UI y permite al entorno de trabajo desarrollar sus interfaces sin modificar las definiciones de dichos tipos.
Sin adaptadores, cualquier clase que se pudiera pasar a la API del entorno de trabajo debería implementar las interfaces UI. Esto llena desordenadamente las definiciones de clase y prepara una asociación sólida. Presenta dependencias circulares entre el núcleo y las clases de UI. Con los adaptadores, cada clase implementa IAdaptable y utiliza el registro del adaptador para que los conectores puedan ampliar las funciones de los tipos básicos.
Durante la utilización del código de entorno de trabajo, verá casos en los que se precisa un tipo para una adaptador. Todo este ocurre a fin de obtener un objeto que sepa cómo responder información orientada a la UI acerca de un tipo básico de plataforma.
Cuando el usuario concluye un entorno de trabajo, debe guardar el estado actual de los objetos de IAdaptable que se muestran en el entorno de trabajo. Esto se lleva a acabo guardando parámetros de datos primitivos del objeto en un formato especial, un IMemento, que se guarda de manera simple en el sistema de archivos. También se almacena el identificador de una fábrica que puede volver a crear el objeto a partir de un IMemento.
Cuando se reinicia la plataforma, el entorno de trabajo busca la fábrica de elementos asociada con el identificador de fábrica conocido en la interfaz IMemento. Busca la fábrica para comprobar el registro de conectores para contribuciones a la extensión org.eclipse.ui.elementFactories.
La marcación es bastante simple. Sólo se necesita especificar el identificador de la fábrica y la clase correspondiente que la implementa.
El segmento de código siguiente procede del plugin.xml del entorno de trabajo.
<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>