Modell Alapú Szoftverfejlesztés Eclipse-szel
Miről lesz szó? Három Eclipse projekt 1. EMF Eclipse Modeling Framework modellközpontú szoftverfejlesztés ami a modellben benne van, azt nem kell kézzel megírni 2. GEF Graphical Editing Framework magas szintű grafikus eszközkészlet pl. gráf típusú hálózatoknál mozgatás, kijelölés, összekötés 3. GMF Graphical Modeling Framework EMF + GEF szisztematikus összeházasítása
1. Eclipse Modeling Framework (EMF) Előadás anyaga http://www.eclipse.org/emf/doc/ Modellező Keretrendszer Kód generálása modell alapján, iteratívan Modell relációk betartatásával (számosságok, kétirányú relációk stb.) Adatmodell szerviz funkciók mentés/betöltés (XML perzisztencia) Reflexió Dinamikusan módosítható adatmodell Segédletek UI készítéséhez Eclipse Property Sheet Változásértesítés (notification) Mi az a modell? Adatmodell: Objektumok, attribútumok Relációk Constraint-ek Műveletek tkp. az osztálydiagram Modellformátum: annotated Java.ecore (XML/XMI) Rational Rose
Modell formátumok Book Title: String pages: Int Annotated Java /** * @model */ public interface Book /** * @model */ String gettitle(); /** * @model */ int getpages(); <ecore:epackage xmi:version="2.0" xmlns:xmi="http://www.omg.org/xmi" xmlns:xsi="http://www.w3.org/2001/xmlschema-instance" xmlns:ecore="http://www.eclipse.org/emf/2002/ecore" XMI name="library "nsuri="http:///library.ecore" nsprefix="library"> <eclassifiers xsi:type="ecore:eclass" name="book"> <estructuralfeatures xsi:type="ecore:eattribute" name="title" etype="ecore:edatatype http://www.eclipse.org/emf/2002/ecore#//estring"/> <estructuralfeatures xsi:type="ecore:eattribute" name="pages" etype="ecore:edatatype http://www.eclipse.org/emf/2002/ecore#//eint"/> </eclassifiers> </ecore:epackage> XML Schema <xsd:schema targetnamespace="http:///library.ecore" xmlns="http:///library.ecore" xmlns:xsd="http://www.w3.org/2001/xmlschema"> <xsd:complextype name="book"> <xsd:sequence> <xsd:element name="title" type="xsd:string"/> <xsd:element name="pages" type="xsd:integer"/> </xsd:sequence> </xsd:complextype> </xsd:schema>
Generált kód Book Title: String pages: Int Java interface public interface Book extends EObject String gettitle(); void settitle(string value); int getpages(); void setpages(int value); Java implementation public class BookImpl extends EObjectImpl implements Book... protected static final int PAGES_EDEFAULT = 0; protected int pages = PAGES_EDEFAULT; public int getpages() return pages; public void setpages(int newpages) int oldpages = pages; pages = newpages; if (enotificationrequired()) enotify(new ENotificationImpl(this, Notification.SET,..., oldpages, pages));...
Generált kód: relációk, tartalmazás Library Name: String Library 1 0..* books Book Title: String pages: Int books author 0..* 1 Writer Name: String Tartalmazás public EList getbooks() if (books == null) books = new EobjectContainmentEList (Book.class, this,...); return books; public NotificationChain basicsetauthor(..) Writer oldauthor = author; author = newauthor; if (enotificationrequired()) ENotificationImpl notification = new ENotificationImpl(this,...); if (msgs == null) msgs = notification; else msgs.add(notification); return msgs; Kétirányú reláció public void setauthor(writer newauthor) if (newauthor!= author) NotificationChain msgs = null; if (author!= null) msgs = ((InternalEObject)author). einverseremove(this,..., msgs); if (newauthor!= null) msgs = ((InternalEObject)newAuthor). einverseadd(this,..., msgs); msgs = basicsetauthor(newauthor, msgs); if (msgs!= null) msgs.dispatch(); else if (enotificationrequired()) enotify(new ENotificationImpl(this,...));
Továbbá... Factories public interface LibraryFactory extends EFactory LibraryFactory einstance = new LibraryFactoryImpl(); Book createbook(); Writer createwriter(); Library createlibrary(); LibraryPackage getlibrarypackage(); Használat LibraryFactory factory = LibraryFactory.eINSTANCE; Book book = factory.createbook(); Writer writer = factory.createwriter(); writer.setname("william Shakespeare"); book.settitle("king Lear"); book.setauthor(writer); A metódus törzseket az Impl osztályokban meg kell írni! Módosítások védelme /** *... * @generated NOT */ public String gettitle() // módosítás... return title; Értesítés kérése I. Adapter bookobserver =... book.eadapters().add(bookobserver); EObject someobject =...; Értesítés kérése II. AdapterFactory someadapterfactory =...; Object requiredtype =...; if(someadapterfactory.isfactoryfortype(requiredtype)) Adapter theadapter = someadapterfactory.adapt(someobject, requiredtype);...
Valamint... A kódgenerátor intelligens, jól paraméterezhető, és ha kell a sablonok is módosíthatók Nem említettük: EMF.Edit: további wrapper osztályok az Impl. fölé: CommandStack magasszintű modell szerk. Parancsokhoz Eclipse Property Sheet + attribútum szerkesztő segédletek enotification IViewerNotification... tkp. részletkérdés, mert elfedhető a GMF-fel EMF.Editor: hibrid grafikus/szöveges TreeView editor... használjuk inkább a GMF-et
2. Graphical Editing Framework (GEF) Előadás anyaga http://www.eclipse.org/gef/reference/gef Tutorial 2005.ppt Eclipse Runtime-ban futó grafikus alkalmazásokat készítő keretrendszer Bővíthető, magas szintű eszköztár a leggyakoribb igényeknek megfelelő funkcionalitás megvalósításával RCP ui.views Platform Runtime SWT GEF Draw2D
Vizualizáció GEF Célkitűzések Modell grafikus megjelenítése Szerkesztés : modell-felhasználó interakció megteremtése GUI beviteli eszközök (egér, bill.) kezelése, Bevitt input modell szintű értelmezése Parancsok, undo/redo Modell változások kezelése Integráció Eclipse környezetbe Menük, billentyűkombinációk, Toolbar-ok, Wizard-ok Property Sheet szerkesztő Eclipse integráció: - gazdag editor/workbench szemléletű eszközkészletet ad - de csak Eclipse RCP-ben használható
GEF Architektúra Interaction Layer Model-to-View mapping Workbench Integration Rendering Layout Scaling Native (SWT) Layer
Egyszerű példa, grafikus lehetőségek 1 2 3 4 5 6 7 8 9 10 11 12 Display d = new Display(); Shell shell = new Shell(d); shell.setlayout(new FillLayout()); FigureCanvas canvas = new FigureCanvas(shell); canvas.setcontents(new Label("Hello World")); shell.settext( draw2d ); shell.open(); while (!shell.isdisposed()) while (!d.readanddispatch()) d.sleep(); 2 13 6 4 5 BorderLayout Left XYLayout Top Center Bottom Right Canvas/Figure hierarcha 2 4 3 1 5 FlowLayout 1 2 3 4 6 ToolbarLayout Bővíthető Layout Manager -ek 12,8,20,10 30,20,27,14 1 2 3
További lehetőségek Koordináta-transzformációk, zoom, nézetek Szöveg-megjelenítés: Rich text a org.eclipse.draw2d.text-ből Keretek, színek, sortörés, font-ok, offset API stb... Label : text + icon, grafikus elemhez kötötten (pl. vonal közepe felett ) Connection: speciális Figure forrás/cél anchor Router-ek Anchor Location Labels placed using ConnectionLocators Midpoint Endpoint v u Fig 2 PolylineConnection (pl. Fan, Bendpoint, Manhattan, ShortestPath) Fig 1 PolygonDecoration 2 1-4 -3-2 -1-1 -2
Model-View-Controller Model Root (Diagram) Children Diagram EditPart fig fig fig A tartalmazás reláció tükröződik, de nem feltétlen kell 1-1-1 megfeleltetés (azért nem árt...) Model EditPart Factory EditParts GraphicalViewer Figures @#!
EditPart-ok készítése AbstractGraphicalEditPart-ból származtatva: 1. createfigure() - Figure megrajzolása (draw2d/swt) 2. refreshvisuals() - modell állapotának lekérdezése, grafika frissítése 3. getmodelchildren() - megfelelő modell objektum gyermekeinek lekérdezése Az editpart-okat be kell csatolni a modell változás-értesítés mechanizmusába: az editpart felelőssége, hogy intelligensen kitalálja, mely gyermekén kell refreshvisuals()-t hívni (újrarajzolni) GEF objektumok becsatolása EMF notification láncba problémás, de megoldható. Automatikus (generált) megoldást majd a GMF ad.
Szerkesztő parancsok életútja Tool Tool EditPart EditPolicy SWT Events Requests Requests showfeedback() erasefeedback() getcommand() Commands Commands EditPolicy Request Command EditPart-hoz rendelhető logika pl. figure anchorpoint-jára kattitva connection mozgató parancs visszaadása? Stack Stack Commands Tool Több grafikus elemre hivatkozó művelet vezénylő állapotgépe pl. creationtool: Palettából Canvas-ra DnD visszajelzéssel
Big Picture EditDomain EditPartViewer EditPartViewer EditPartViewer 1. acts on Model 2. events 3. request 4. command Palette CommandStack Active Tool Tool1 Tool2 Tool3 5. execute Command Command Command Command 6. modifies
3. Graphical Modeling Framework (GMF) EMF + GEF szisztematikus összeházasítása Kiindulás: EMF osztálydiagram Eredmény: GEF alkalmazás (plugin) A szükséges kód generálása 50-100%-ban automatikus, wizard-okkal fél-grafikus editorokkal támogatott (Fél)automatikusan generálja azt a glue kódot és alkalmazás logikát, amit unalmas lenne megírni Grafikus Eclipse alkalmazások fejlesztésében Segít? Nagyon sokat Korlátoz? Kicsit
GMF fejlesztés menete Domain Model: class diagram Domain Gen Model: EMF kódgenerátor paraméterek Graphical Def Model: Figure definíciók (modellek) Tooling Model: GEF Tool -ok Mapping Model: Figure Model elem Tool összerendelés Diagram Gen Model: GMF kódgenerátor paraméterek