Poslední aktualizace: 18. června 2007
Tento výukový program je podrobný popis procesu vytváření modelu EMF a vygenerování jednoduchého editoru modelů. Při procházení tohoto výukového programu zjistíte, do jaké míry EMF usnadňuje přechod od jednoduché definice modelu k plně funkčnímu editoru pro tento model.
Model, který budeme generovat, vypadá v UML takto (popis tohoto modelu viz Přehled rámce Eclipse Modeling Framework):
Ukážeme si, jakým způsobem lze vygenerovat model EMF z některého ze dvou různých zdrojů: modelu Rational Rose nebo sady anotovaných rozhraní a tříd jazyka Java.
Snímky obrazovky jsou založeny na Eclipse SDK verze a EMF verze 2.3.0 RC3.
| Krok 0: | Nezbytné předpoklady |
| Krok 1: | Importovat model z Rose, nebo Definovat model pomocí anotovaného prostředí Java |
| Krok 2: | Vygenerovat kód modelu EMF |
| Krok 3: | Vygenerovat editor pro model |
| Krok 4: | Spustit vygenerovaný editor |
Balík EMF Runtime obsahuje generátor EMF a řadu souvisejících modulů plug-in. Po instalaci balíku ověřte, zda jsou k dispozici ve vašem prostředí Eclipse:



Další moduly plug-in EMF nejsou v rámci tohoto výukového programu nezbytné. Mohou a nemusí se objevit, podle toho, které balíky EMF jste nainstalovali.
Soubor Rose pro model knihovny lze nalézt zde: library.mdl. Uložte jej někam na vaši pracovní stanici.
Vytvořte nový projekt EMF v pracovním prostoru:








Namísto importování modelu ze schématu Rose je možno začít sadou rozhraní a tříd prostředí Java, které odpovídají třídám, nebo ve výčtu uvedeným typům v modelu knihovny. Tento kód je pouhé minimum potřebné ke znázornění požadovaných funkcí. Na jeho základě bude sestaven model Ecore a model generátoru, které budou poté řídit generování zbývajícího kódu. Kód je anotován pomocí značek "@model" v komentářích dokumentace Javadoc kvůli specifikaci jiných než výchozích hodnot pro atributy a odkazy objektů Ecore.
Počínaje verzí EMF 2.3 můžete definovat anotovaná rozhraní Java pomocí generických typů a výčtů Java 5.0. Oba přístupy si na příslušných místech ukážeme. Chcete-li používat jazyk Java 5.0, zkontrolujte, zda je hodnota "Java/Compiler/Compiler Compliance Level" platformy Eclipse nastavena na "5.0" nebo vyšší.

Toto jsou rozhraní, která popisují model knihovny:
Library.java (Java 1.4)
package org.eclipse.example.library; import java.util.List; /** * @model */ public interface Library { /** * @model */ String getName(); /** * @model type="Writer" containment="true" */ List getWriters(); /** * @model type="Book" containment="true" */ List getBooks(); }Library.java (Java 5.0)
package org.eclipse.example.library; import java.util.List; /** * @model */ public interface Library { /** * @model */ String getName(); /** * @model containment="true" */ List<Writer> getWriters(); /** * @model containment="true" */ List<Book> getBooks(); }Book.java
package org.eclipse.example.library; /** * @model */ public interface Book { /** * @model */ String getTitle(); /** * @model default="100" */ int getPages(); /** * @model */ BookCategory getCategory(); /** * @model opposite="books" */ Writer getAuthor(); }Writer.java (Java 1.4)
package org.eclipse.example.library; /** * @model */ public interface Writer { /** * @model */ String getName(); /** * @model type="Book" opposite="author" */ java.util.List getBooks(); }Writer.java (Java 5.0)
package org.eclipse.example.library; /** * @model */ public interface Writer { /** * @model */ String getName(); /** * @model opposite="author" */ java.util.List<Book> getBooks(); }BookCategory.java (Java 1.4)
package org.eclipse.example.library; /** * @model */ public class BookCategory { /** * @model name="Mystery" */ public static final int MYSTERY = 0; /** * @model name="ScienceFiction" */ public static final int SCIENCE_FICTION = 1; /** * @model name="Biography" */ public static final int BIOGRAPHY = 2; }BookCategory.java (Java 5.0)
package org.eclipse.example.library; /** * @model */ public enum BookCategory { /** * @model name="Mystery" */ MYSTERY, /** * @model name="ScienceFiction" */ SCIENCE_FICTION, /** * @model name="Biography" */ BIOGRAPHY; }
Vytvořte nový prázdný projekt EMF v pracovním prostoru:




Vytvořte první rozhraní prostředí Java:





Stejným způsobem vytvořte další dvě rozhraní (Book.java a Writer.java) a třídu (BookCategory.java). Pro vytvoření třídy vyberte z rozevírací nabídky volbu "Nový/Třída", namísto volby "Nový/Rozhraní".






Model generátoru zobrazuje kořenový objekt, představující celý model. Tento modelový objekt má podřízené prvky, které představují jeho balíky, jejichž podřízené prvky dále představují klasifikátory (třídy a datové typy, včetně ve výčtu uvedených typů). Podřízené prvky tříd jsou atributy tříd, odkazy a operace, podřízené prvky ve výčtu uvedených typů jsou výčtové literály.



Ve většině případů není nutno měnit výchozí hodnoty vlastností, avšak tyto volby mohou poskytovat velký podíl na řízení kódu, který je generován. Za zmínku stojí druhá volba na výše uvedeném obrázku, "Úroveň shody". Pokud jste zvolili využití nových konstrukcí zavedených ve verzi Java 5.0 v anotovaných rozhraních Java nebo chcete generovat kód využívající generické typy, zkontrolujte, zda je tato volba nastavena na hodnotu "5.0" nebo vyšší. Její počáteční hodnota je založena na vlastnosti úroveň shody kompilátoru, který byla ilustrována výše v kroku 0.
Model generátoru je také místo, ve kterém budete zahajovat generování kódu. Klepnutím pravým tlačítkem myši na objekt v modelu je možno vygenerovat kód pro tento objekt.


Po vygenerování budou vytvořena (pokud byl model importován z Rose) nebo dokončena (pokud byl model definován pomocí anotovaného prostředí Java) rozhraní tříd a třída výčtu a bude vytvořena nová dvojice rozhraní pro samotný balík a pro továrnu. Přibudou také dva nové balíky s příponami "impl" a "util", které obsahují implementace rozhraní a další třídy obslužného programu, a oba typy souborů typu manifest pro modul plug-in modelu: "plugin.xml" a "MANIFEST.MF".
Pokud definujete model pomocí anotovaného prostředí Java, může se zobrazit varování v pohledu problémů: "Import java.util.List se nikdy nepoužívá". Toto varování se očekává a nebude vám bránit pokračovat na další krok.
Pokud model změníte, lze jej znovu vygenerovat a provedené změny budou sloučeny s jakýmikoli ručně provedenými úpravami, které jste u kódu provedli. Je možno také selektivně vygenerovat podmnožinu kódu modelu tak, že klepnete pravým tlačítkem myši na balík, třídu nebo objekt výčtu a v rozevírací nabídce vyberete volbu "Generovat kód modelu".
Pro kterýkoli model je možno vygenerovat plně funkční editor Eclipse. Ve výchozím nastavení je rozdělen mezi dva moduly plug-in: modul plug-in pro úpravy obsahuje adaptéry poskytující strukturovaný pohled a provádějící příkazovou úpravu modelových objektů, modul plug-in "editor" poskytuje uživatelské rozhraní pro editor a průvodce.



Obecně platí, že pokud si přejete vygenerovat moduly plug-in modelu, editace a editoru v rámci jednoho kroku, můžete to provést pomocí volby "Vygenerovat vše" v rozevírací nabídce.
Tím se rovněž vytvoří modul plug-in testů obsahující kostry testu JUnit pro provádění libovolných dočasných funkcí a operací definovaných v modelu. Tento model žádné neobsahuje, ale obecně budete muset vyplnit těla těchto testů sami. Modul plug-in testů obsahuje také jednoduchou ukázku třídy, která ukazuje postup načtení a ověření platnosti modelu v samostatné aplikaci.
Kód by se měl zkompilovat automaticky při svém vygenerování a při každé změně by se měl zkompilovat znovu. Pokud vypnete volbu automatického sestavování v předvolbách pracovní plochy, máte možnost kompilaci zahájit ručně:




Pro otestování nových modulů plug-in musí být spuštěna druhá instance Eclipse. Moduly plug-in poběží na této pracovní ploše.


Nyní je možno použít průvodce modelu Knihovna pro vytvoření nové instance modelu.








Kořenový objekt v tomto editoru odpovídá prostředku My.library. Pod ním leží jednoduchá knihovna, objekt vybraný jako modelový objekt v průvodci.







