Kiterjesztett EMF-modell készítése
Utolsó frissítés: 2004. június 29.
Ez az ismertető annak az EMF-modell készítése című dokumentumnak a folytatása, melyben előállítottunk egy egyszerű könyvtármodellt ("library"). Abban a részben bemutattuk, hogy milyen egyszerűen lehet Rose-modellből vagy Java felületfájlok készletéből EMF-modellt készíteni. Ebben a részben azt demonstráljuk, hogy hogyan lehet egy olyan EMF-modellt előállítani, amely egy már meglévő modellt terjeszt ki.
Először is tekintsük át a könyvtármodellt:
A könyvtármodellt most kiterjesztjük egy új, "schoollibrary" (iskolaikönyvtár) nevű csomag létrehozásával. Ez a csomag három osztályt tartalmaz, melyből kettő kiterjeszti a könyvtármodell osztályait:
Az ismertető részletesen bemutatja, hogy a "schoollibrary" csomagból hogyan lehet a már előállított modell felhasználásával EMF-modellt készíteni.
Az előző ismertetőhöz hasonlóan bemutatjuk az új modell előállítását Rose-modellből és Java-felületek készletéből is.
A képernyőfelvételek az Eclipse SDK 3.0 verziója és az EMF 2.0 verziója alapján készültek.
Tartalom
tartalom
0. lépés: Előfeltételek
A könyvtármodell és a szerkesztő az előző, EMF-modell készítése című ismertetőben készült el.
- Indítsa el az Eclipse alkalmazást és győződjön meg arról, hogy az alábbi három projekt jelen van az Erőforrás perspektíva Navigátor nézetében: "library", library.edit", és
"library.editor".

Amennyiben ezek a csomagok nem szerepelnek a felsorolásban, vegye át az előző ismertető anyagát, vagy tekintse át a Függeléket a két modell egy időben történő létrehozásához.
tartalom
1.a lépés: A modell importálása a Rose eszközből
Mentse a schoollibrary.mdl
Rose modellfájlt a munkaállomásán. Ez a "library" és a "schoollibrary" csomagot is tartalmazza.
Csomagok különféle modellek közötti megosztása esetén igazság szerint minden egyes csomagot saját .cat fájlba kellene helyeznünk és csak hivatkoznunk azokra egy .mdl fájlban. Az ismertető kedvéért azonban egyszerűen másodpéldányt készítettünk a "library" csomagról és egy modellfájlban kiterjesztettük azt. A generátor mindkét esetben ugyanúgy viselkedik, függetlenül attól, hogy a csomagokat egyetlen .mdl fájl tartalmazza vagy azok külső .cat fájlokra történő hivatkozással érhetők el.
Hozzon létre egy új EMF-projektet a munkaterületen:
- Nyissa meg a "Fájl/Új/Projekt..." párbeszédablakot.

- Bontsa ki az "Eclipse Modeling Framework" könyvtárat és jelölje ki az "EMF Projekt" fájlt. Kattintson a "Tovább" gombra.

- Nevezze el a projektet mondjuk "schoollibrary"-nek, majd kattintson a "Tovább" gombra.

- Jelölje ki a "Betöltés Rose osztálymodellből" és kattintson a "Tovább" gombra.

- Kattintson a "Tallózás" gombra és a fájl párbeszédablaka segítségével keresse meg a Rose modellfájlt. A rendszer megvizsgálja a fájlt és a generátormodellre alapértelmezett nevet javasol. A beviteli mezőben szükség szerint módosíthatja a nevet. Ezt követően kattintson a "Tovább" gombra.

- A Rose-modell két csomagot tartalmaz: egy "library" és egy "schoollibrary" nevűt. Jelölje ki azt a csomagot, amelyet elő szeretnénk állítani, vagyis a "schoollibrary"-t. Mivel azonban a "schoollibrary" hivatkozik a "library" osztályaira, az újrahasznosítás érdekében meg kell adni, hogy ez a modell hol található. Kattintson a "Tallózás" gombra.

- Az erőforrás kijelölése párbeszédablakban válassza ki azt a könyvtárat, amely a "library" modellt tartalmazza, majd jelölje meg a "library.genmodel" generátormodellt. Kattintson az "OK" gombra.

- Bontsa ki a "Library" modellt és jelölje ki a "Library" csomagot. A hibaüzenet eltűnik. Kattintson a "Befejezés" gombra.

- A rendszer létrehoz egy törzsmodellt (schoollibrary.ecore) és egy generátormodellt (schoollibrary.genmodel). Az utóbbi megjelenik a fő nézetben.

tartalom
1.b lépés: A modell meghatározása jegyzetekkel ellátott Java segítségével
Alább megadjuk a "schoollibrary" jegyzetekkel ellátott Java-felületeit. A generátormodellt a Rose-modell helyett ezekből a felületfájlokból is elő lehet állítani.
SchoolLibrary.java
package org.eclipse.example.schoollibrary;
import org.eclipse.example.library.Library;
/**
* @model
*/
public interface SchoolLibrary extends Library
{
/**
* @model
*/
String getLocation();
}
|
Asset.java
package org.eclipse.example.schoollibrary;
/**
* @model
*/
public interface Asset
{
/**
* @model
*/
float getValue();
}
|
SchoolBook.java
package org.eclipse.example.schoollibrary;
import org.eclipse.example.library.Book;
/**
* @model
*/
public interface SchoolBook extends Book, Asset
{
}
|
Hozzon létre egy új Java-projektet a munkaterületen:
- Nyissa meg a "Fájl/Új/Projekt..." párbeszédablakot.

- Bontsa ki a "Java" könyvtárat és jelölje ki a "Java Projekt" fájlt. Kattintson a "Tovább" gombra.

- Nevezze el a projektet mondjuk "schoollibrary"-nek, majd válassza a "Külön forrás- és kimeneti mappa létrehozása" lehetőséget. Ezt követően kattintson a "Tovább" gombra.

- Módosítsa az alapértelmezett kimeneti mappát "library/runtime" értékre, majd lépjen a "Projektek" lapra.

- Jelölje meg a "library" projektet a felépítési útvonal kötelező projektjeként, majd kattintson a "Befejezés" gombra.

- Az újonnan létrehozott Java-projekt a Csomagböngészőben látható.

Az előző ismertetőhöz hasonlóan létre lehetne hozni és begépelni felületeket, de e helyett bemutatjuk, hogy hogyan lehet azokat a schoollibrary.zip zipfájlból importálni. Mentse ezt a fájlt a munkaállomásán.
- Kattintson a jobb egérgombbal a "src" mappára, majd válassza az előugró menü "Importálás..." menüpontját.

- Jelölje meg a "Zipfájl"-t az importálás forrásaként, majd kattintson a "Tovább" gombra.

- Kattintson a "Tallózás" gombra és keresse meg a zipfájlt. Gondoskodjék arról, hogy a zipfájl teljes tartalma ki legyen választva. A könyvtárstruktúra kibontása után kattintson a "schoollibrary" mappára, hogy annak teljes tartalma láthatóvá váljék. Gondoskodjék róla, hogy a fájlok a "schoollibrary/src" mappába kerüljenek importálásra. Kattintson a "Befejezés" gombra.

- Bontsa ki a "src" mappát és figyelje meg, hogy a felületeket a rendszer importálta.

Hozza létre az EMF-modelleket:
- Kattintson a jobb egérgombbal a "src" mappára, majd válassza az előugró menü "Új/Egyéb..." menüpontját.

- Bontsa ki az "Eclipse Modeling Framework" könyvtárat és jelölje ki az "EMF Modellek" fájlt. Kattintson a "Tovább" gombra.

- Módosítsa mappát "schoollibrary/src/model" és a fájlnevet "schoollibrary.genmodel" értékre. Kattintson a "Tovább" gombra.

- Jelölje ki a "Betöltés jegyzetekkel ellátott Java modellből" lehetőséget és kattintson a "Tovább" gombra.

- Jelölje ki a "schoollibrary" csomagot és kattintson a "Befejezés" gombra.

- A rendszer létrehoz egy törzsmodellt (schoollibrary.ecore) és egy generátormodellt (schoollibrary.genmodel). Az utóbbi megjelenik a fő nézetben.

tartalom
2. lépés: Az EMF-modell és a szerkesztő kódjának előállítása
A generátormodell főobjektuma az egész modellt képviseli. Ennek a modellobjektumnak az utódai képviselik a modell csomagjait.
- A különféle elemek megjelenítéséhez bontsa ki a modellt. A "Library" csomag ikonján egy nyíl található, ami arra utal, hogy ez egy hivatkozás a már meglévő, könyvtár projektben definiált csomagra.

- Egy lépésben előállíthatja a modellben található összes csomag modellkódját és a szerkesztőket, ha a jobb egérgombbal rákattint a gyökérelemre és kiválasztja az előugró menü "Valamennyi előállítása" menüpontját.

- A a "schoollibrary", "schoollibrary.edit" és "schoollibrary.editor" projektek kódja elkészül. A hivatkozott könyvtármodell kódját a rendszer nem állítja elő.

A kódot a rendszer az előállítást követően automatikusan fordítja és - változás esetén - újrafordítja. Ha az automatikus felépítést a munkaterület beállításaiban letiltotta, módosítás esetén a kódot saját kezűleg kell újraépítenie.
tartalom
3. lépés: Az előállított szerkesztő futtatása
Az új bedolgozók teszteléséhez az Eclipse egy második példányát, az úgynevezett futtató munkaterületét kell elindítani. A bedolgozók ezen a munkaterületen fognak futni.
- A "Futtatás" eszköztár legördülő menüjén válassza ki a "Futtatás mint/Futtatási munkaterület" menüpontot.

- Várja meg, amíg az Eclipse platform második példánya elindul. Nyissa meg a "Súgó/Eclipse platform névjegye" párbeszédablakot, kattintson a "Bedolgozó információk" gombra, majd győződjön meg arról, hogy az előállított bedolgozók jelen vannak.

A "schoollibrary" modell varázslója segítségével most létre lehet hozni a modell új példányát.
- Nyissa meg a "Fájl/Új/Projekt..." párbeszédablakot. Bontsa ki az "Egyszerű" mappát, jelölje ki a "Projekt" elemet, majd kattintson a "Tovább" gombra. Nevezze el a projektet és kattintson a "Befejezés" gombra.

- Kattintson a jobb egérgombbal a projektre, majd válassza az előugró menü "Új/Egyéb..." menüpontját.

- Bontsa ki az "EMF-modell létrehozás varázsló - példák" könyvtárat és jelölje ki a "schoollibrary modell" fájlt. Kattintson a "Tovább" gombra.

- Adja meg a "schoollibrary" modell fájlnevét. Gondoskodjék róla, hogy a fájl kiterjesztése ".schoollibrary". Ezt követően kattintson a "Tovább" gombra.

- Jelölje meg a "SchoolLibrary" csomagot modellobjektumként és kattintson a "Befejezés" gombra.

- Az újonnan létrehozott modell megjelenik a fő nézetben.

A szerkesztőben a főobjektum a "My.schoollibrary" erőforrásnak felel meg.
Figyelje meg, hogy a mögötte álló objektum valóban iskolai könyvtár.
- Bontsa ki a "platform:/resource/librarytest/My.schoollibrary" erőforrást a
"School Library" objektum láthatóvá tétele érdekében, majd jelölje azt ki.

- Ha a Tulajdonságok nézet nem látható, akkor kattintson a jobb egérgombbal a "School Library" objektumra, majd válassza az előugró menü "Tulajdonságok nézet megjelenítése" menüpontját. Adja meg a "Hely" és "Név" attribútumok értékeit.

- Kattintson a jobb egérgombbal az iskolai könyvtárra, majd válassza az előugró menü "Új utód" menüpontját.
Figyelje meg, hogy az iskolai könyvtárban három különböző objektumot lehet létrehozni: a "Writer" (Író), a "Book" (Könyv), és a "School Book" (Iskolai Könyv) objektumokat. A "Writer" és "Book" objektumok a "library" csomagban, míg a "SchoolBook" a "schoollibrary" csomagban van meghatározva.

- Hozzon létre néhány írót, egy könyvet és egy iskolai könyvet. Figyelje meg, hogy a "SchoolBook" örökli a "Book" összes attribútumát, és - várakozásainknak megfelelően - egy többletjellemzőt is felvesz ("Érték").

- Mentse a modellt.

Lépjen ki a futtató munkaterületből és térjen vissza az eredeti, fejlesztési munkaterületre.
tartalom
4. lépés: A szerkesztő módosítása
Ebben a részben bemutatjuk, hogy az előállított kódot hogyan kell módosítani. Csak egy címkét fogunk módosítani, de ezt különféleképpen tesszük az illusztráció kedvéért.
Először a generátormodellt módosítjuk, amely hatással van az előállított kódra.
- Jelölje ki a "SchoolLibrary" osztályt az iskolai könyvtár modelljében.
A Tulajdonságok nézetben a "Címke jellemzője" értékét módosítsa a "hely: EString" attribútumra. Ez azt határozza meg, hogy a "SchoolLibrary" objektumok címkéi melyik jellemzőt használják.

- A módosítás életbe léptetéséhez a kódot nem kell ismételten előállítani.
Ehhez csak a "SchoolLibrary" elemszolgáltató osztályát kell újra elkészíteni. Mentse a módosításokat, kattintson a jobb egérgombbal a "SchoolLibrary" objektumra, majd válassza az előugró menü "Szerkesztés kódjának előállítása" menüpontját. A teljes kód ismételt előállítása sem okoz kárt, csak hosszabb ideig tart.

Vizsgálja meg az előállított fájlok utolsó módosítási időpontját, hogy meggyőződhessen arról, hogy csak a SchoolLibraryItemProvider.java fájl készült el ismételten.
Az alábbi táblázat összesítve mutatja be a különböző objektumok helyzetérzékeny menüjén található "Modellkód előállítása", "Szerkesztés kódjának előállítása" és "Szerkesztő kódjának előállítása" menüpontok kiválasztása által előállított fájlokat. A "Valamennyi előállítása" menüpont mindhárom előző menüpont kiválasztásával egyenértékű.
|
Modellkód előállítása |
Szerkesztés kódjának előállítása |
Szerkesztő kódjának előállítása |
Modell <M> |
plugin.xml
<M>Plugin.java *
...és az összes csomag fájljai
|
plugin.xml
plugin.properties
<M>EditPlugin.java
...és az összes csomag fájljai
|
plugin.xml
plugin.properties
<M>EditorPlugin.java
...és az összes csomag fájljai
|
Csomag <C> |
<C>Package.java
<C>PackageImpl.java
<C>Factory.java
<C>FactoryImpl.java
<C>Switch.java
<C>AdaptorFactory.java
<C>ResourceImpl.java *
<C>ResourceFactoryImpl.java *
<C>Validator.java *
...és az összes osztály és "enum" fájljai
|
<C>ItemProviderAdaptorFactory.java
...és az összes osztály fájljai
|
<C>Editor.java
<C>ModelWizard.java
<C>ActionBarContributor.java
|
Osztály <O> |
<O>.java
<O>Impl.java
|
<O>ItemProvider.java |
|
Enum <E> |
<E>.java |
|
|
* Ezek a fájlok alapértelmezésben nem készülnek el.
Most le tudjuk tesztelni a módosítást.
- Indítsa el ismételten a futtató munkaterületet és nyissa meg a "My.schoollibrary" erőforrást. Bontsa ki az erőforrás objektumot és jelölje ki az iskolai könyvtárat. Figyelje meg, hogy a címkén az iskolai könyvtár neve helyett annak helye látható.

Tételezzük fel, hogy Ön nem szereti a címke "School Library" előtagját és ezért el szeretné azt távolítani. Ennek egyetlen módja a kód módosítása, de ezt a változtatást könnyű elvégezni.
Az EMF.Edit
keretrendszer áttekintése című dokumentumban leírtaknak megfelelően az EMF.Edit az elemszolgáltatókat többek között arra használja, hogy eldöntse, melyik címkét jelenítse meg egy adott típusú objektum esetén. Nevezetesen a getText() metódus végzi ezt el, és ezt kell módosítanunk.
- A Csomagböngészőben bontsa ki a "schoollibrary.edit" projektet. Keresse meg és nyissa meg a "SchoolLibraryItemProvider.java" fájlt.

- A Vázlat nézetben keresse meg és jelölje ki a "getText()" metódust.

- A Java-szerkesztő kurzora kijelöli a metódust.

- A "return" utasításból távolítsa el a második getString() hívást, mely megelőzi a külsőleg elérhetővé tett osztálynév karaktersorozatot. Annak érdekében, hogy a módosítás ne vesszen el a kód újbóli előállításakor, a "@generated" Javadoc-címkét is el kell távolítani.

- Mentse a módosítást, ismételten indítsa el a futtató munkaterületet, majd nyissa meg a "My.schoollibrary" fájlt. Figyelje meg, hogy az iskolai könyvtár címkéje most csak a hely attribútum értékét tartalmazza.

Az eredetileg előállított getText() megvalósítását módosítottuk. A generátormodell SchoolLibrary osztályának címkejellemző tulajdonsága nincs többé hatással az előállított kódra. Ez azért van, mert eltávolítottuk a "@generated" Javadoc-címkét, mely megakadályozza a metódus kódelőállítás alatti felülírását.
Tételezzük fel, hogy Ön még nem döntötte el, hogy a szerkesztő a hely attribútum vagy a név attribútum értékét jelenítse-e meg. Azt szeretné inkább, ha lehetőség volna a generátormodellen keresztüli későbbi módosításra. Azt azonban tudja, hogy a "School Library" előtagot nem szeretné megjeleníteni. Alapjában véve azt szeretné, ha az előállított megvalósítás rendelkezésére állna egy olyan kézileg kódolt metódusnak, amely eltávolítja a visszaadott értékből az előtagot. Az új metódus neve "getText()" kell, hogy legyen, tehát az előállított metódust át kell nevezni.
Szerencsére az EMF kódgenerátor ezt támogatja: ha egy előállítandó metódus ütközik egy "@generated" címke nélküli metódussal, akkor a rendszer megkeresi a "Gen" utótaggal ellátott, egyező nevű metódust. Ha létezik ilyen metódus és az tartalmazza a "@generated" címkét, akkor a megvalósítás ebben a metódusban készül el.
- Módosítsa a getText() metódus nevét "getTextGen()" értékre úgy, hogy közben a @generated" címke sértetlen maradjon. Annak bemutatására, hogy a metódus tényleg újra elkészül, távolítsa el a metódustörzset és helyettesítse azt egy "return" utasítással. Hozzon létre egy olyan getText() metódust, amely a getTextGen() által visszaadott karaktersorozatból eltávolítja az előtagot.

- Mentse a SchoolLibraryItemProvider.java fájlt, váltson vissza a generátormodellre, jelölje ki a "SchoolLibrary" objektumot és újból állítsa elő a kódot.

- Váltson vissza a SchoolLibraryItemProvider.java fájl getTextGen() metódusára.
Figyelje meg, hogy a rendszer visszaállította az eredeti megvalósítást.

Ha most visszavált a generátormodellre, módosítja a címkejellemző tulajdonságot és ismételten előállítja a kódot, akkor meggyőződhet arról, hogy a módosítás valóban hatással van az előállított kódra.
tartalom
Függelék: A modell előállításának alternatív módja
Ha az alapszintű könyvtármodell és annak szerkesztője nem különálló projektekben készült el, akkor a könyvtár és iskolai könyvtár modelleket ugyanabba a projektkészletbe egyetlen lépésben elő lehet állítani. Ezt Rose-modellből és jegyzetekkel ellátott Java-felületek készletéből is végre lehet hajtani.
Ha a Rose-modellel indítunk, akkor a folyamat megegyezik a fent leírtakkal, kivéve, hogy mindkét csomagot ki kell jelölni kódkészítés céljára.
- Az Új projekt varázsló utolsó oldalán egy csomag helyett válassza ki a "library" és a
"schoollibrary" csomagot is.

Ha jegyzetekkel ellátott Java-felületekkel indítunk, akkor a rendszer kódkészítés előtt mindkét csomagot egy Java-projektbe importálja.
- Importálja a csomagokat a library.zip és
schoollibrary.zip fájlokból.
- Az Új modellek varázsló utolsó oldalán válassza ki a "library" és a
"schoollibrary" csomagot.

Amikor az új szerkesztő tesztelése céljából elindítja a futtató munkaterületet, akkor egy apró különbséget vehet észre a "library" modell szerkesztőjében ahhoz az állapothoz viszonyítva, amikor azt a "schoollibrary" modellből külön állítottuk elő.
- Hozzon létre vagy nyisson meg egy könyvtármodellt, bontsa ki az erőforrás objektumot, majd kattintson a jobb egérgombbal a "Library" objektumra. Válassza az "Új utód" menüpontot.

Figyelje meg, hogy most három típusú leszármazott áll rendelkezésre az előző ismertető kettőjével szemben. Nevezetesen most a "schoollibrary" csomagból származó "School Book" is megtalálható. A kódgenerátor ennek nem volt tudatában, amikor előzőleg a "Library" elemszolgáltatóját előállította. Most viszont - mivel a két csomagot egyszerre állítottuk elő - az alapszintű csomagnak tudomása van a kiterjesztő csomagról.
tartalom