org.eclipse.ui.elementFactories

Il factory degli elementi viene utilizzato per ricreare oggetti modello del workbench dai dati salvati durante la chiusura del workbench.

Prima di analizzare l'estensione factory di un elemento, è necessario rivedere una tecnica generale utilizzata in tutta la piattaforma per aggiungere uno specifico comportamento plug-in ai comuni oggetti modello della piattaforma.

IAdaptable e adattatori del workbench

Durante l'esplorazione di varie classi, è possibile osservare che molte interfacce del workbench estendono l'interfaccia IAdaptable.

I plug-in aggiungono uno specifico comportamento a tipi preesistenti nel sistema mediante adattatori. Ad esempio, il workbench può aggiungere un comportamento ad alcune risorse affinché generino un'etichetta e un'immagine che le rappresenti nella UI. Poiché in una buona progettazione i comportamenti specifici di interfaccia utente non vengono aggiunti a oggetti di basso livello, come si può aggiungere questo comportamento ai tipi di risorse?

La piattaforma definisce una tecnica per ricercare in maniera dinamica un oggetto perché implementi una particolare interfaccia. I plug-in possono registrare adattatori che aggiungono un comportamento a tipi preesistenti. In questo modo, il codice di applicazione può successivamente ricercare un adattatore specifico per un oggetto se utilizzato in un determinato contesto. Se esiste un adattatore registrato, i plug-in possono prelevarlo e utilizzare i nuovi comportamenti in esso definiti.

Utilizzando una funzionalità per ricercare in maniera dinamica un adattatore per un oggetto, è anche possibile migliorare la flessibilità del sistema mentre si evolve. Nuovi adattatori possono essere registrati per tipi di piattaforme da nuovi plug-in senza bisogno di modificare le definizioni dei tipi originali. Il modello prevede la richiesta di un oggetto per un particolare adattatore.

//dato un oggetto o, utilizzarlo per un'attività del "workbench".
if (!(o instanceof IAdaptable)) {
    return null;
}
IWorkbenchAdapter adapter = (IWorkbenchAdapter)o.getAdapter(IWorkbenchAdapter.class);
if (adapter == null)
    return null;
// adesso o può essere considerato un IWorkbenchAdapter
...

Se non vi è alcun adattatore registrato per l'oggetto, come adattatore verrà restituito null. I client devono essere preparati a gestire questo caso. In questo modo i client possono gestire regolarmente il caso in cui un adattatore previsto non è stato registrato.

Il workbench utilizza adattatori per ottenere informazioni UI dai tipi di piattaforma base, come IResource. Questo adattatore protegge i tipi base da conoscenze particolari dell'interfaccia utente e consente al workbench di evolvere le sue interfacce senza modificare le definizioni della base.

Senza adattatori, qualsiasi classe messa in circolazione nell'API del workbench dovrebbe implementare le interfacce UI. In questo modo, verrebbero prodotte inutili definizioni di classe e verrebbe introdotta una stretta associazione. Verrebbero, inoltre, generate dipendenze circolari tra il nucleo e le classi di interfaccia utente. Con gli adattatori, invece, ciascuna classe implementa IAdaptable e utilizza il registro dell'adattatore per consentire ai plug-in di estendere il comportamento dei tipi base.

In tutto il codice del workbench sono riscontrabili casi in cui un tipo è ricercato per un adattatore. Sono tutti casi finalizzati a ottenere un oggetto che sia in grado di rispondere alle informazioni relative al tipo principale di piattaforma orientate all'interfaccia utente.

Factory degli elementi

Il workbench, quando viene arrestato dall'utente, deve salvare lo stato corrente degli oggetti IAdaptable in esso visualizzati. L'operazione viene effettuata salvando i parametri dati primitivi dell'oggetto in uno speciale formato, IMemento, che è salvato con facilità nel file system. Viene, inoltre, memorizzato anche l'id di un factory che può ricreare l'oggetto dal formato IMemento.

Al riavvio della piattaforma, il workbench riconosce il factory dell'elemento associato all'id del factory conosciuto nel promemoria. Il riconoscimento viene effettuato controllando il registro plug-in dei contributi all'estensione org.eclipse.ui.elementFactories.

Il tag è abbastanza semplice. È sufficiente specificare l'id del factory e la corrispondente classe di implementazione dello stesso.

Il seguente frammento di codice proviene dal workbench plugin.xml.

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