Generování modelu EMF

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):

Model UML knihovny

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.


Obsah

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


 obsah

Krok 0: Nezbytné předpoklady

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.


 obsah

Krok 1a: Importovat model z Rose

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:


 obsah

Krok 1b: Definovat model pomocí anotovaného prostředí Java

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šší.


Java/Compiler/Compiler Compliance Level


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í".

Vytvořit model EMF:


 obsah

Krok 2: Vygenerovat kód modelu EMF

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


 obsah

Krok 3: Vygenerovat editor pro model

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ě:


 obsah

Krok 4: Spustit vygenerovaný editor

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.


obsah