1 / 42

Eclipse Patterns

Eclipse Patterns. Seminar Software Design Patterns. Agenda. Einführung in Eclipse IAdaptable Arbeitsbereichskern – Ressourcen Zustände persistent speichern mit Memento Lazy Loading mit virtuellen Proxies. Eclipse-Plattform. Eine Kurzeinführung. Eclipse.

harlan
Download Presentation

Eclipse Patterns

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. Eclipse Patterns Seminar Software Design Patterns

  2. Agenda • Einführung in Eclipse • IAdaptable • Arbeitsbereichskern – Ressourcen • Zustände persistent speichern mit Memento • Lazy Loading mit virtuellen Proxies Seminar Software Design Patterns Eclipse Patterns

  3. Eclipse-Plattform Eine Kurzeinführung Seminar Software Design Patterns Eclipse Patterns

  4. Eclipse • „The Eclipse Platform is an IDE for anything, and for nothing in particular“ (Eclipse Website) • Im November 2001 von IBM, Object Technology International (OTI) und acht weitern Firmen ins Leben gerufen • In der Zwischenzeit sind mehr als 50 Firmen beteiligt • Februar 2004: Umwandlung in eine unabhänige „not-for-profit corporation“ • Ende Juni 2004: Release 3.0, Eclipse als Rich Client Plattform Seminar Software Design Patterns Eclipse Patterns

  5. PDE JDT Plattform Was ist Eclipse ? • Eclipse verkörpert drei Dinge: • Eine JAVA Entwicklungsumgebung • Eine Plattform für Tool-Integration • Eine Open Source-Gemeinde • Das Eclipse SDK besteht aus drei Ebenen • Plattform • Java Development Tools (JDT) • Plug-In Development Environment (PDE) Seminar Software Design Patterns Eclipse Patterns

  6. Variabler Plugin Mechanismus Seminar Software Design Patterns Eclipse Patterns

  7. Laufzeitkern - IAdaptable Erweiterung von Schnittstellen Seminar Software Design Patterns Eclipse Patterns

  8. Ziel • Eclipse soll eine erweiterbare Plattform sein d.h. • zusätzliche Dienste oder Verhaltensweise müssen zu vorhandenen Klassen hinzugefügt werde können • API‘s müssen stabil bleiben (→ keine Interfaces abändern oder neue hinzufügen • Strenge Trennung von Benutzeroberfläche und nicht zum UI gehörenden Teilen • Nicht UI Schnittstellen dürfen nicht mit Details der Benutzeroberfläche verunreinigt werden  Wie erweitere ich die Definition einer Schnittstelle ohne die Definition der Basisschnittstelle zu ändern und ohne die Erweiterung offenzulegen Seminar Software Design Patterns Eclipse Patterns

  9. Beispiel IFile public interface IFile { … } public interface IPropertySource { … } • public interface IFile extends IPropertySource Probleme: • bei vielen Service-Schnittstellen aufgeblähte Interfaces • Soll die Properties Ansicht erst später hinzugeügt werden ist dies eine API Änderung • IFile sollte nicht von der Benutzeroberfläche wissen Seminar Software Design Patterns Eclipse Patterns

  10. Ziel AdaptierteKlasse Adapter Client SpezifischeOperation() Operation() Operation() Operation() Exkurs: Adapter (Wrapper) • Passe die Schnittstelle einer Klasse an eine andere von ihren Klienten erwartete Schnittstelle an. Spezifische Operation Seminar Software Design Patterns Eclipse Patterns

  11. Lösung: Erweiterungsobjekt • „Vorwegnehmen dass die Schnittstelle eines Objekts zukünftig erweitert werden muss. Nach dem Muster Erweiterungsobjekt kann man einer Klasse Schnittstellen hinzufügen und Clients können abfragen, ob ein Objekt eine bestimmte Erweiterung hat.“ • Möchte man dieses Muster implementieren stellen sich folgende Fragen • Möchte ich ein einzelnes Objekt oder eine Klasse erweitern. Bei einem klassenbasierten Mechanismus fügt man Verhalten (Methoden) der ganzen Klasse hinzu, kann aber keinen Zustand (Felder) hinzufügen • Wie wird eine Erweiterung beschrieben und identifiziert ? Seminar Software Design Patterns Eclipse Patterns

  12. Implementierung in Eclipse • Klassenbasierter Mechanismus • Zusätzliches Verhalten wird durch eine Schnittstelle beschrieben • Klassen die Anpassungsfähigkeit unterstützen implementieren die Schnittstelle IAdaptable public interface IAdaptable { public Object getAdapter(Class adapter); } Seminar Software Design Patterns Eclipse Patterns

  13. Beispiel für die Benutzung • Beispiel wie die Properties-Ansicht das momentan markierte Objekt nach seiner IPropertySource Schnittstelle abfragt org.eclipse.ui.views.properties/PropertySheetEntry IPropertySource getPropertySource(Object object){ … if (object instanceof IAdaptable) { IAdaptable a = (IAdaptable)object; return (IPropertySource)a.getAdapter( IPropertySource.class); } } Seminar Software Design Patterns Eclipse Patterns

  14. Verwendung von IAdaptable • Eine Klasse möchte zusätzliche Schnittstellen anbieten ohne sie in der API offen zu legen. Die Methode getAdapter() wird dann von der Klasse selbst implementiert. Fügt man neue Schnittstellen hinzu muss getAdapter() geändert werden. • Eine Klasse wird von außen erweitert um zusätzliche Dienste anzubieten. Dann ist keine Änderung in der Klasse notwendig, getAdapter() wird von einer Fabrik bereitgestellt. Seminar Software Design Patterns Eclipse Patterns

  15. Schnittstelle mit IAdaptable offen legen Methode getAdapter() in einer Klasse die IPropertySource unterstützt: Object getAdapter(Class adapter) { if(adapter.equals(IPropertySource.class) return new PropertySourceAdapter(this); if(adapter.equals(IShowInSource.class) return new ShowInSourceAdapter(this); return super.getAdapter(this); } Adapter Klasse die IPropertySource implementiert: public class PropertySourceAdapter implements IPropertySource { private IFile source; public PropertySourceAdapter(IFile source) { this.source=source; } … } Seminar Software Design Patterns Eclipse Patterns

  16. Adapterfabrik • Eine Klasse AdapterFactory mit den Adaptern implementieren die man einem bestimmten Typ hinzufügen möchte class FileAdapterFactory implements IAdapterFactory { public Class[] getAdapterList() { return new Class[] {IPropertySource.class}; } public Object getAdapter(Object o, Class adapter) { if(adapter == IPropertySource.class) return new FilePropertySource((IFile)o); return null; } //… } Seminar Software Design Patterns Eclipse Patterns

  17. Schnittstelle zu vorh. Typen hinzufügen • Die Fabrik für einen bestimmten Typ beim AdapterManager, den die Klasse Plattform bereitstellt, registrieren IAdapterManger manger = Platform.getAdapterManager(); IAdapterFactory factory = new FileAdapterFactory(); Manger.registerAdapter(factory,IFile.class); • Aufrufe von getAdapter() auf die Factory umleiten org.eclipse.core.internal.resources/File Object getAdapter(Class adapter) { Platform.getAdapterManager().getAdapter(this,adapter); } Seminar Software Design Patterns Eclipse Patterns

  18. Arbeitsbereichskern - Ressourcen Zugriff auf Dateisystemressourcen Seminar Software Design Patterns Eclipse Patterns

  19. Hintergrund • In Eclipse ist das Dateisystem dominant d.h. • Der Arbeitsbereich wird direkt auf das Dateisystem abgebildet so daß es kein zwischengelagertes Repository gibt • Änderungen auf Ressourcen entweder direkt im Dateisystem oder aus Eclipse heraus • Ressourcen-Plug-In unterstützt die Verwaltung eines Arbeitsbereiches und seiner Ressourcen Seminar Software Design Patterns Eclipse Patterns

  20. Ziel • Möglichkeit eine Ressource im Dateisystem zu verfolgen • Ressourcen ändern sich im Verlauf des Lebenszyklus durch: • Erstellung • Inhaltsänderung • Versionen • Löschen • Neue Erzeugung Seminar Software Design Patterns Eclipse Patterns

  21. Lösung Dateisystemzugriff • Zugriff auf Ressource über Handle und nicht direkt • Handle wirkt wie ein Schlüssel auf eine Ressource (Proxy) „Kontrolliere den Zugriff auf ein Objekt mithilfe eines vorgelagerten Stellvertreterobjekts“ • Handle speichert die Pfadinformationen der Ressource • Handles sind als Schnittstellen definiert • Handle kann auf nicht existierende Ressource verweisen • Handle speichert keinerlei Zustandsinformationen • Zustand erhält man durch erneutes abrufen des zugehörigen Info-Objekts (Brücke) „Entkopple eine Abstraktion von ihrer Implementation, so daß beide unabhängig voneinander variiert werden können“  Wie greife ich auf das Dateisystem zu? Seminar Software Design Patterns Eclipse Patterns

  22. org.eclipse.core.resources IWorkspaceRoot IProject IFolder IFile Umsetzung API IResource Proxy getFullPath() getMarker() getModificationStamp() getSessionProperty() … Brücke Nicht - API ResourceInfo Resource getResourceInfo() getMarker() getModificationStamp() … Seminar Software Design Patterns Eclipse Patterns

  23. Beispiel • Erzeugung eines untergeordneten Handles IProject project; IFolder folder = project.getFolder(„someFolder“); • Erzeugung einer Ressource folder.create(…); • Ein paar Handle-Operationen folder.getFullPath(); folder.getParent(); folder.exists(); … • Operationen die vom Vorhandensein der Ressource abhängig sind lösen eine CoreException – Ausnahme aus Seminar Software Design Patterns Eclipse Patterns

  24. Lösung Ressourcenänderung • Beobachten von Änderungen über Ressourcen-Listener • Welcher vom Arbeitsbereich zur Verfügung gestellt wird (Beobachter) • Beobachter registriert sich beim Arbeitsbereich (Subjekt)  Wie wird der Client über Änderungen informiert? Seminar Software Design Patterns Eclipse Patterns

  25. Umsetzung * IWorkspace ResourcenChangeListener addResourceChangeListener() removeResourceChangeListener() resourceChanged(IResourceChangeEvent) Beobachter: Subjekt Beobachter IResourceChangeListener beobachtet IWorkspace Seminar Software Design Patterns Eclipse Patterns

  26. Benachrichtigungsprinzip • Push-Modell • Subjekt schickt detaillierte Info von Änderungen an alle Beobachter egal ob von Interesse oder nicht (IResourceDelta) • Entsprechendes IResourceChangeEvent welches vom Listener empfangen wird enthält sämtliche Ressourcenabweichungen inklusive sämtlicher Änderungen untergeordneter Elemente * IResourceChangeEvent IResourceDelta getDelta() getResource() getKind() getResource() getKind() getAffectedChildren() Seminar Software Design Patterns Eclipse Patterns

  27. Benutzeroberflächeder Workbench 1 Zustände persistent speichern mit Memento Seminar Software Design Patterns Eclipse Patterns

  28. Ziel • Bewahrung von Kontinuität über Sitzungen hinweg • Wiederherstellung des letzten Zustandes • nach Sitzungsende • Neustart • Beim Öffnen von z.B. einer Java-Klassen • „User Continuity Rule“: Bewahren Sie den Zustand der Benutzeroberfläche zwischen zwei Sitzungen Seminar Software Design Patterns Eclipse Patterns

  29. Ziel visualisiert entsprechenden Editor starten Perspektive laden Position merken Seminar Software Design Patterns Eclipse Patterns

  30. Lösungsansatz • JDK bietet bereits Möglichkeit der Serialisierung • „implements Serializable“ • Wird jedoch von Eclipse nicht verwendet • Anfälligkeit gegenüber Änderungen überverschiedene Versionen hinweg • JDK • Eclipse-Klassenimplementierungen Seminar Software Design Patterns Eclipse Patterns

  31. Originator Memento setMemento(Memento m) createMemento(): Memento state getState() setState() state Lösung: Memento „Erfasse und externalisiere den internen Zustand eines Objektes, ohne seine Kapselung zu verletzen, sodass das Objekt später in diesen Zustand zurückversetzt werden kann.“ Caretaker erzeugt & verwendetMemento speichert Status Seminar Software Design Patterns Eclipse Patterns

  32. org.eclipse.ui/Memento public interface IMemento { void putString(String key, String value); String getString(String key); void putString(String key, Integer value); Integer getString(String key); IMemento createChild(String type); IMemento[] getChildren(String type); //… } IMemento-Objekt speichert Schlüssel/Wert-Paare einfacher Typen Struktur wird durch Baum von IMementos erzeugt IMemento-Struktur wird durch XML-basiertes Speicherformat realisiert Lösung in Eclipse: IMemento Seminar Software Design Patterns Eclipse Patterns

  33. Beispiel ResourceNavigator • Workbench übergibt ein IMemento-Objekt • Dieses Objekt wird vom Client gefüllt • Serialisierung durch Workbench • Keine symmetrische Wiederherstellung • Zustand wird über beim Start des Clients überinit() Methode empfangen Seminar Software Design Patterns Eclipse Patterns

  34. Beispiel ResourceNavigator cont. org.eclipse.ui.views/ResourceNavigator private static final String TAG_SELECTION="selection"; private static final String TAG_ELEMENT="element"; public void saveState(IMemento memento) { //… //save selection Object elemements[]= ((IStructuredSelection)viewer.getSelection()).toArray(); if (elements.length>0) { IMemento selectionMem=memento.createChild(TAG_SELECTION); for (int i=0; i<elements.length; i++) { IMemento elementMem=selectionMem.createChild(TAG_ELEMENT); elementMem.putString(TAG_PATH, ((IResource)elements[i]).getFullPath().toString()); } } } Seminar Software Design Patterns Eclipse Patterns

  35. Beispiel ResourceNavigator cont. org.eclipse.ui.views/ResourceNavigator IMemento memento; public void init(IViewSite site, IMemento memento) throws PartInitException { super.init(site, memento); this.memento=memento; } • Keine symmetrische Wiederherstellung • Empfang des Memento über init()-Methode Seminar Software Design Patterns Eclipse Patterns

  36. Benutzeroberflächeder Workbench 2 Lazy Loading mit virtuellen Proxies Seminar Software Design Patterns Eclipse Patterns

  37. Ziel • Einfügen von Menüs, Menübefehlen und Symbolleistenschaltflächen in Eclipse • Workbench als Paradebeispiel definiertviele Erweiterungspunkte • Resourcen-Einsparung durch punktgenauesLaden von Klassen  Implementierung der Lazy Loading-Regel Erweiterungspunkt: Architekturmechanismus, der die Erweiterbarkeit von Plugins öffentlich deklariert. Seminar Software Design Patterns Eclipse Patterns

  38. Lösung in Eclipse • Manifest-Datei plugin.xml • Definiert Eigenschaften eines Plugins • (Kontext-) Menüs, Schaltflächen, etc. • Views und Editoren • u.v.a. • Einsatz von virtuellen Proxies: • Workbench füllt ein PluginAction-Objekt mit Informationen im Manifest (Titel, Symbol, Tooltip) → Proxy-Objekt • Eigentliche Aktion kann Proxy nicht ausführen • Weiterleitung der run()-Anforderung an die eigentliche Erweiterungsklasse Seminar Software Design Patterns Eclipse Patterns

  39. Lazy Loading Auszug aus Plugin-Konfigurationsdatei plugin.xml: org.eclipse.team.cvs-ui/plugin.xml <extension point="org.eclipse.ui.actionSets"> <actionSet> … <action toolbarPath="Normal/CVS" label="Neuer Menüpunkt" tooltip="Mein hinzugefüger Menüpunk" icon="icons/icon.gif" class="contrib.MyMenuClass" id="contrib.MyMenuClass" </action> </actionSet> </extension> Seminar Software Design Patterns Eclipse Patterns

  40. IAction IActionDelegate MyMenuClass PluginAction run(IAction) selectionChanged(IAction, ISelection) run(IAction) selectionChanged(IAction, ISelection) run() selectionChanged(ISelection) Lazy Loading Proxy: Subjekt Proxy: eigentliches Subjekt Proxy PluginAction lädt die eigentliche Aktion Seminar Software Design Patterns Eclipse Patterns

  41. Ressources • Eclipse • Erich Gamma, Kent Beck: „Eclipse erweitern“,Addison-Wesley, 2004 • Sherry Shavor et. Al.: „Eclipse“, Addison-Wesley, 2004 • Erweiterungsobjekt/Erweiterungsschnittstelle • R. Martin: „Pattern Languages of Program Design 3“,Addison-Wesley, 1998 • D. Schmidt et. Al.: „Pattern-Oriented Software Architecture Volume 2: Patterns for Concurrent and Networked Objects“, Jon Wiley & Sons, 2000 Seminar Software Design Patterns Eclipse Patterns

  42. Vielen Dankfür dieAufmerksamkeit! Fragen ? Seminar Software Design Patterns Eclipse Patterns

More Related