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:

Könyvtár UML-modellje

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 iskolaikönyvtár UML-modellje

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

1. lépés: A modell importálása a Rose eszközből vagy A modell meghatározása jegyzetekkel ellátott Java segítségével
2. lépés: Az EMF-modell és a szerkesztő kódjának előállítása
3. lépés: Az előállított szerkesztő futtatása
4. lépés: A szerkesztő módosítása
Függelék: A modell előállításának egy alternatív módja


 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.

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:


 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:

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.

Hozza létre az EMF-modelleket:


 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ó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 "schoollibrary" modell varázslója segítségével most létre lehet hozni a modell új példányát.

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.

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.

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.

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.

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.

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.

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.

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ő.

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