470 likes | 573 Views
Nyílt Fejlesztőrendszerek Domain specifikus nyelvek Eclipse Modeling Framework. Technológia részletesen. EMF - kódgenerálás. A generálás alapja a genmodel Platform specifikus Az ecore modell alapján készül részletes Létrejön Alapértelmezett editor Perzisztencia kezelés
E N D
Nyílt FejlesztőrendszerekDomain specifikus nyelvekEclipse Modeling Framework Technológia részletesen
EMF - kódgenerálás • A generálás alapja a genmodel • Platform specifikus • Az ecore modell alapján készül • részletes • Létrejön • Alapértelmezett editor • Perzisztencia kezelés • Modell manipuláció
EMF - kódgenerálás • Mi jön létre? • Néhány Eclipse plug-in • Minden esetre megoldás? • NEM! • Nem feltétlenül kényelmes editor • Nem feltétlenül elégséges „üzleti logika”
EMF – a generált komponensek • Tree editor • Modell manipuláció • Modell tárolás
EMF.Model • A modell kód a PIM 100%-os implementációja • Hatékony perzisztencia kezelés XML fájlok támogatásával • 100% folytonosság a modell és a kód között • Előre tudjuk mit kapunk • Általában nem akarjuk módosítani
EMF.Model • Lehetséges kiegészítések • Saját fájlformátum támogatás • Parser • Okos szerkesztő • Extra információk beszúrása a fájlokba • Kerülendő • Inkább legyen a PIM része
EMF.Model – EClass implementáció • A generált implementáció egy előre definiált keretrendszert terjeszt ki
EMF.Model – EClass implementáció • EAttribute -> get és set metódusok • EReference • „many” -> get metódus • „one” -> get és set metódus
EMF.Model – EClass implementáció • Minden osztály tartalmaz framework-specifikus elemeket • Reflektiv set/get • Kezőértékek tárolása és inicializálása
Az ecore keretrendszer • Igen összetett • Csak néhány elemét nézzük át • Általában csak egy kis részét kell megérteni a használathoz • Az EObject interfészt • A reflexiót • Az értesítési mechanizmust • A keretrendszer viselkedést az EObjectImpl és gyerekei valósítják meg
EObject interfész • Minden interfész ezt terjeszti ki
eClass() • Gyakran használt metódus • Minden üzleti objektum megkaphatja a saját EClass reprezentációját • Hasonló a Java getClass() hívásához • reflexió
eResource() • Egy objektumhoz rendelhetünk egy Resource példány • Resource eResource() • Az erőforrás a perzisztens tárat reprezentálja
EAttribute implementáció • Az attribútum get, set metódussá alakul • Általában nem akarjuk módosítani az implementációt
EReference implementáció • Hasonló az EAttribute-hoz • A típus itt egy másik objektum lesz • Néhány kiegészítés szükséges, ha nem tartalmazás jellegű reláció van • Az objektum más tárban is lehet • Referencia-feloldás • Ellenőrizni kell a kétirányú referenciák integritását • „opposite”
EOperation implementáció • Az ecore modellben metódusokat is megadhatunk • Nincs támogatás a szemantika definiálására • Ötlet: • Az ecore modellben definiáljuk a metódus • Nevét • Paramétereit, típusukat • Visszatérési típust • Implementáljuk Java-ban • A kódgenerátor csak vázat generál, amit kitöltünk
EOperation implementáció • Első generálásnál az EMF egy Exception-t dobó implementációt készít • Át kell venni a felügyeletet • Beállítjuk a @generated taget NOT-ra • Implementáljuk a metódust
EOperation implementáció • Ha definiáltunk egy metódust • Hozzáadja az interfészhez • Egy dummy implementációt készít az implementáló osztályban
Értesítés implementáció • Minden modell objektum támogatja az értesítés-küldést • Observer minta • Event objektumok az értesítésben • A genmodel-ben beállíthatjuk, hogy mi váltson ki értesítést
Értesítés implementáció • A megvalósítás részletei nem fontosak • Tipikusan sose akarjuk módosítani…
EMF.EDIT • Szerepe • A GUI és a modell szétválasztása • GUI független akciók implementálása • Nagyobb eséllyel módosítjuk • Módosítjuk az elem provider-t • Új parancsokat adunk hozzá
Generator minta • Minden modell objektumhoz egy adapter jön létre az EMF.Edit-ben • Neve: ItemProvider • Pl. ArtistItemProvider • Az item provider az org.eclipse.emf.edit.provider.ItemProviderAdapter • Alapértelmezett implementáció az alap funkcionalitáshoz • Általában felüldefiniáljuk bizonyos részét
Címkék változtatása • Tipikus példa a testre szabásra a címkék változtatása • A genmodel-ben megadhatjuk, hogy egy objektum mely attribútuma jelenjen meg címkeként • Mi van, ha többől akarjuk összerakni? • Változtatni kell a ItemProvider.getText-en • Megváltoztatjuk a @generated tag-et • Saját implementációt írunk
Ikon változtatása • Másik tipikus példa az ikonok megváltoztatása • A genmodel egy egyszerű ikont rendel minden elemhez • Az elemek az emf.edit/icons/obj16 és ctool16 könyvtárban találhatóak • Minden elemhez, illetve minden elem létrehozási lehetőséghez • A legegyszerűbb a fájlok lecserélése saját ikonra
Parancsok használata EMF.Edit-ben • Minden módosítás parancsokon (command) keresztül történik • Menü akció • Attribútum változtatás • Drag-n-drop • A keretrendszer generált és általános kód keverékét hsaználja • Common Command Framework (CCF) • EMF.Edit Generated Commands
Parancsok használata EMF.Edit-ben • A parancsok használata a template method mintára épül • Az ItemProvider implementálja a createCommand() metódust, a kéréseket továbbítja protected metódusaiknak • createAddCommand() • createRemoveCommand() • … • A módosítás során a protected metódusok egyikét módosítjuk általában
Parancsok használata EMF.Edit-ben : Példa • Egyszerű példa: loggolás hozzáadása • Bonyolultabb példák esetén az összetett parancsok módosítása is szükséges lehet
EMF.Editor • Az EMF.Editor generálja az SWT/JFace kódot a grafikus editorhoz • Két fő opció • Hagyjuk ahogy van • Újraimplementáljuk, mivel köze sincs ahhoz, amit akarunk
Mi generálódik? • Editor • Fastruktúra • Események – akciók összekötése • Workbench elemek beállítása • Menük • Varázsló (új modell…) • Plugin osztály
Konklúzió – EMF.Edit • Az editor a leggyengébb láncszem • Több próbálkozás van a javításra • Egyik: GEF – Graphical Editing Framework • Eclipse túránk következő állomása
Kódgenerálás a gyakorlatban - keretrendszerek • Eclipse • Eclipse Modeling Framework • Java Emitting Templates • J2EE • Velocity (Jakarta) • JSP (XML/HTML) • .NET • CodeDOM
CodeDOM • .NET alapú nyelvek kezelése • Forráskód – DOM – forráskód transzformációk • parser • code generator • nyelvek közötti fordítás • dinamikus forráskód-generálás és fordítás
Velocity/JSP • Velocity • Általános template nyelv • Java objektumok használata • Könnyen integrálható modellező eszközökbe • Szöveges kimenet • JSP • Elsősorban XML alapú dokumentumokhoz (Web) • J2EE-be integrált
Java Emitting Templates • Java Emitting Temlates (JET) • JSP alapú template nyelv • Szabad kimeneti formátum (Szöveges) • Java objektumok átadhatóak
JET példa <%@ jet package="hello" imports="java.util.*" class="XMLDemoTemplate" %> <% List elementList = (List) argument; %> <?xml version="1.0" encoding="UTF-8"?> <demo> <% for (Iterator i = elementList.iterator(); i.hasNext(); ) { %> <element><%=i.next().toString()%></element> <% } %> </demo>
JET példa <%@ jet package="hello" imports="java.util.*" class="XMLDemoTemplate" %> <% List elementList = (List) argument; %> <?xml version="1.0" encoding="UTF-8"?> <demo> <% for (Iterator i = elementList.iterator(); i.hasNext(); ) { %> <element><%=i.next().toString()%></element> <% } %> </demo> JET fejléc
JET példa <%@ jet package="hello" imports="java.util.*" class="XMLDemoTemplate" %> <% List elementList = (List) argument; %> <?xml version="1.0" encoding="UTF-8"?> <demo> <% for (Iterator i = elementList.iterator(); i.hasNext(); ) { %> <element><%=i.next().toString()%></element> <% } %> </demo> Bemenő paraméter definició
JET példa <%@ jet package="hello" imports="java.util.*" class="XMLDemoTemplate" %> <% List elementList = (List) argument; %> <?xml version="1.0" encoding="UTF-8"?> <demo> <% for (Iterator i = elementList.iterator(); i.hasNext(); ) { %> <element><%=i.next().toString()%></element> <% } %> </demo> Céldokumentum kezdete
JET példa <%@ jet package="hello" imports="java.util.*" class="XMLDemoTemplate" %> <% List elementList = (List) argument; %> <?xml version="1.0" encoding="UTF-8"?> <demo> <% for (Iterator i = elementList.iterator(); i.hasNext(); ) { %> <element><%=i.next().toString()%></element> <% } %> </demo> Ciklus a bemenő paraméter alapján
JET példa <%@ jet package="hello" imports="java.util.*" class="XMLDemoTemplate" %> <% List elementList = (List) argument; %> <?xml version="1.0" encoding="UTF-8"?> <demo> <% for (Iterator i = elementList.iterator(); i.hasNext(); ) { %> <element><%=i.next().toString()%></element> <% } %> </demo> Ciklusmag
Kódgenerálás - összefoglaló • A program-generálásból indult • UML -> Java, C++, …. • ma már széles körben használt • dokumentum generálás (web) • report generálás (XML, XLS, CSV, nyomtatás) • Széles körű támogatottság • EMF – JET • Velocity • CodeDOM • NEM CSAK az MDA környékén használható!
EMF extrák – UML • Org.eclipse.uml2 – UML2 plugin • Modell perzisztencia • Modell manipuláció • Default (tree) editor • Több ipari tool is használja • Egyszerű eyüttműködés!
Emf extrák - OCL • OCL kényszerek kezelése • Tetszőleges EMF modell felett • Meta- és példány szinten • Interaktív OCL editor • …
EMF extrák - query • Egyszerű, SQL szerű query api • Modellek elemek kinyerésére • Könnyen programozható • Rugalmas • Bővíthető
EMF extrák - reldb • Modell sorosítás/betöltés relációs adatbázisba • Hibernate alapú • HQL alapú lekérdezések • Projekt: Teneo (EMFT sub)