Mit Factory-Dienstprogrammen für Elemente können Workbench-Modellobjekte aus Daten erneut erstellt werden, die während der Beendigung der Workbench gespeichert wurden.
Bevor näher auf die Erweiterung für die Factory-Dienstprogramme für Elemente eingegangen wird, erhalten Sie zunächst einen Überblick über das allgemeine Verfahren, über das in der gesamten Plattform ein Plug-in-spezifisches Verhalten zu allgemeinen Plattformmodellobjekten hinzugefügt werden kann.
Beim Anzeigen der unterschiedlichen Workbench-Klassen werden Sie feststellen, dass viele Workbench-Schnittstellen die Schnittstelle IAdaptable erweitern.
Plug-ins verwenden Adapter, um bereits im System vorhandenen Typen ein spezifisches Verhalten hinzuzufügen. In der Workbench könnte es z. B. erforderlich sein, dass Ressourcen eine Bezeichnung und ein Image für die Darstellung zur Verfügung stellen. Sie wissen bereits, dass das Hinzufügen einer benutzerschnittstellenspezifischen Funktionsweise zu Objekten auf niedrigen Ebenen wenig sinnvoll ist. Daher stellt sich nun die Frage, wie Sie eine solche Funktionsweise zu Ressourcentypen hinzufügen können.
Plug-ins können Adapter registrieren, die bereits vorhandenen Typen eine bestimmte Funktionsweise hinzufügen können. Anschließend kann ein Objekt dann über den Anwendungscode nach einem bestimmten Adapter abgefragt werden. Wenn ein Adapter für das Objekt registriert ist, kann der Adapter abgerufen und die neue, im Adapter definierte Funktionsweise verwendet werden.
Durch das Bereitstellen einer Funktion, die einen Adapter für ein Objekt dynamisch abfragen kann, kann auch die Flexibilität des Systems im Zuge seiner weiteren Entwicklung verbessert werden. Neue Adapter können durch neue Plug-ins für Plattformtypen registriert werden, ohne dass die Definitionen der Originaltypen geändert werden müssen. Das Muster zur Abfrage eines Objektes nach einem bestimmten Adapter lautet wie folgt:
//given an object o, we want to do "workbench" things with it. if (!(o instanceof IAdaptable)) { return null; } IWorkbenchAdapter adapter = (IWorkbenchAdapter)o.getAdapter(IWorkbenchAdapter.class); if (adapter == null) return null; // now I can treat o as an IWorkbenchAdapter ...
Wenn für das betreffende Objekt kein Adapter registriert ist, wird als Adapter ein Nullwert zurückgegeben. Clients müssen auf die Verarbeitung dieses Falls vorbereitet werden. Unter bestimmten Umständen kann ein erwarteter Adapter nicht registriert worden sein.
Die Workbench verwendet Adapter, um aus den Basistypen der Plattform wie beispielsweise IResource Informationen zur Benutzerschnittstelle abzufragen. Adapter schirmen die Basistypen von speziellen Kenntnissen zur Benutzerschnittstelle ab und ermöglichen der Workbench die Entwicklung ihrer Schnittstellen, ohne dass die grundlegenden Definitionen geändert werden müssen.
Ohne Adapter müssten alle Klassen, die in der Workbench-API übergeben werden, die Schnittstellen für die Benutzerschnittstelle implementieren. Hierdurch würden die Klassendefinitionen erhöht, enge Kopplungen verursacht und Schleifenabhängigkeiten zwischen den Kernklassen und den Klassen der Benutzerschnittstelle erzeugt werden. Werden hingegen Adapter verwendet, implementiert jede Klasse IAdaptable und verwendet die Adapterregistrierung, damit das Verhalten der Basistypen durch Plug-ins ergänzt werden kann.
Überall im Workbench-Code können Sie Fälle finden, in denen ein zentraler Typ der Plattform nach einem Adapter abgefragt wird. Mit dieser Abfrage wird ein Objekt abgerufen, das benutzerschnittstellenorientierte Informationen über den Typ bereitstellen kann.
Wenn die Workbench durch den Benutzer beendet wird, muss sie den aktuellen Status der in der Workbench angezeigten Objekte für IAdaptable speichern. Der Status eines Objekts wird gespeichert, indem Basisdatenparameter des Objekts in einem speziellen Format (Objekt IMemento) gespeichert werden. Außerdem wird die ID eines Factory-Dienstprogramms gespeichert, mit dem das Objekt aus einem Objekt IMemento erneut erstellt werden kann. Die entsprechenden Daten werden im Dateisystem abgelegt.
Wenn die Plattform erneut gestartet wird, sucht die Workbench das Factory-Dienstprogramm für das Element, dessen ID der Factory-ID im Objekt IMemento zugeordnet ist. Zu diesem Zweck wird geprüft, ob die Plug-in-Registrierung Ergänzungen für die Erweiterung org.eclipse.ui.elementFactories enthält.
Die Befehlsdatei ist ziemlich einfach. Es müssen lediglich die ID des Factory-Dienstprogramms und die entsprechende Klasse angegeben werden, die das Factory-Dienstprogramm implementiert.
Der folgende Codeausschnitt stammt aus der Datei plugin.xml für die Workbench.
<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>