Generování rozšířeného modelu EMF

Poslední aktualizace: 29. červen 2004

Tento výukový program je pokračováním Generování modelu EMF, ve kterém je generován jednoduchý model knihovny. V tomto výukovém programu bylo znázorněno, jak je možno jednoduchým způsobem vygenerovat model EMF z modelu Rose nebo sady souborů rozhraní jazyka Java. V tomto výukovém programu bude předvedeno, jakým způsobem vygenerovat model EMF, který rozšiřuje model stávající.

Nejdříve návrat k modelu knihovny:

Model UML knihovny

Nyní bude tento model knihovny rozšířen vytvořením nového balíčku, školní knihovny. Tento balíček obsahuje tři třídy, přičemž dvě z nich rozšiřují třídy v modelu knihovny:

Model UML školní knihovny

Tento výukový program postupně předvede, jakým způsobem vygenerovat model EMF tohoto balíčku školní knihovny, pomocí modelu knihovny, který jste již vytvořili. Jako u předchozího výukového programu bude předvedeno vytvoření tohoto nového modelu z modelu Rose a ze sady rozhraní jazyka Java.

Screenshoty jsou založeny na Eclipse SDK verze 3.0 a EMF verze 2.0.


Obsah

Krok 1: Importovat model z Rose, nebo Definovat model pomocí anotovaného prostředí Java
Krok 2: Generovat model EMF a kód editoru
Krok 3: Spustit vygenerovaný editor
Krok 4: Upravit editor
Dodatek: Alternativní způsob generování modelu


 obsah

Krok 0: Vstupní specifikace

Model knihovny a editor byly vygenerovány v předchozím výukovém programu, Generování modelu EMF.

Pokud tyto balíčky nejsou uvedeny, budete nuceni projít předchozí výukový program, nebo si přečíst Dodatek, obsahující informace o tom, jak vytvořit oba modely najednou.


 obsah

Krok 1a: Importovat model z Rose

Uložte soubor modelu Rose schoollibrary.mdl někam na vaši pracovní stanici. Soubor obsahuje balíčky knihovny a školní knihovny.

Při sdílení balíčků mezi různými modely by se měl každý balíček umístit do samostatného souboru .cat a odkaz na něj by měl být v souboru .mdl. Nicméně, pro účely tohoto výukového programu byl duplikován a rozšířen balíček knihovny v jednom modelovém souboru. Generátor se chová stejně, ať jsou balíčky obsaženy v jednom souboru .mdl, nebo se na ně odkazuje v externích souborech .cat.

Vytvořte nový projekt EMF v pracovním prostoru:


 obsah

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

Zde se nacházejí anotovaná rozhraní Java pro balíček školní knihovny. Je možno vygenerovat model generátoru z tohoto souboru rozhraní namísto modelu Rose.

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
{
}

Vytvořte nový projekt v jazyce Java v pracovním prostoru:

Je možno vytvořit a zapsat rozhraní jako v předchozím výukovém programu, avšak namísto toho, bude znázorněno, jakým způsobem se mohou importovat ze souboru schoollibrary.zip. Uložte tento soubor někam na vaši pracovní stanici.

Vytvořte modely EMF:


 obsah

Krok 2: Vygenerujte model EMF a kód editoru

Model generátoru zobrazuje kořenový objekt, představující celý model. Podřízené prvky tohoto modelového objektu představují balíčky v modelu.

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, nezapomeňte provést nové sestavení kódu při každé jeho změně.


 obsah

Krok 3: Spusťte vygenerovaný editor

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

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

Kořenový objekt v tomto editoru odpovídá prostředku My.schoollibrary. Vezměte na vědomí, že objekt pod ním je opravdu školní knihovna.

Uzavřete běhovou pracovní plochu a vraťte se na původní vývojovou pracovní plochu.


 obsah

Krok 4: Upravit editor

Tato část výukového programu předvede, jakým způsobem se má upravit generovaný kód. Mění se pouze jmenovka v generovaném editoru, avšak zde bude tento postup proveden poněkud odlišným názorným způsobem.

Nejdříve se provedou změny v modelu generátoru, které ovlivní generovaný kód.

Je možno prozkoumat časové značky u vygenerovaných souborů, abyste se přesvědčili, že byla opravdu vygenerována pouze SchoolLibraryItemProvider.java.

Následující tabulka shrnuje soubory, které byly vygenerovány položkami "Vygenerovat modelový kód", "Generovat kód modelu" a "Generovat kód editoru" v kontextově citlivých nabídkách různých objektů. Položka nabídky "Vygenerovat vše" odpovídá výběru všech tří položek nabídky.

  Generovat kód modelu Generovat editační kód Generovat kód editoru
Model <M> plugin.xml
<M>Plugin.java *
...plus soubory pro každý balíček
plugin.xml
plugin.properties
<M>EditPlugin.java
...plus soubory pro každý balíček
plugin.xml
plugin.properties
<M>EditorPlugin.java
...plus soubory pro každý balíček
Balíček <P> <P>Package.java
<P>PackageImpl.java
<P>Factory.java
<P>FactoryImpl.java
<P>Switch.java
<P>AdaptorFactory.java
<P>ResourceImpl.java *
<P>ResourceFactoryImpl.java *
<P>Validator.java *
...plus soubory pro každou třídu a výčet
<P>ItemProviderAdaptorFactory.java
...plus soubory pro každou třídu
<P>Editor.java
<P>ModelWizard.java
<P>ActionBarContributor.java
Třída <C> <C>.java
<C>Impl.java
<C>ItemProvider.java  
Výčet <E> <E>.java    

* Tyto soubory nejsou ve výchozím nastavení vygenerovány.

Nyní je možno otestovat provedenou změnu.

Předpokládejte, že si nepřejete mít předponu "Školní knihovny" ve jmenovce a chcete se jí zbavit. Jediným způsobem, jak to provést, je upravit kód, avšak jedná se o jednoduchou změnu.

Jak je popsáno v přehledu EMF.Edit Framework, EMF.Edit používá poskytovatele položek mimo jiné k určování, která jmenovka se má pro daný typ objektu zobrazit. Především se jedná o metodu getText(), která tuto operaci provádí a kterou je nutno změnit.

Byla změněna implementace metody getText() z původně vygenerované. Vlastnost funkce jmenovky na třídě školní knihovny v modelu generátoru nemá již žádný vliv na vygenerovaný kód. Je tomu tak proto, že byla odstraněna značka @generated dokumentace Javadoc, která brání v přepsání této metody během generování kódu.

Nyní předpokládejte, že jste se dosud nerozhodli, zda by měl editor zobrazit hodnotu atributu umístění, nebo atributu názvu. Místo toho chcete, abyste později měli možnost měnit atributy prostřednictvím modelu generátoru. Nicméně, nepřejete si zobrazit předponu "školní knihovny". V podstatě si přejete zachovat vygenerovanou implementaci tak, aby byla k dispozici pro použití metodou ručního kódování, která odstraňuje předponu ze všech výsledků, které vrací. Nová metoda se musí nazývat "getText()", proto je třeba vygenerovanou metodu přejmenovat.

Naštěstí generátor kódu EMF podporuje tuto funkci: pokud by se metoda, kterou se chystá vygenerovat, dostala do konfliktu s metodou, která nemá značku @generated, vyhledá metodu se stejným názvem plus příponou "Gen". Pokud metoda existuje a je opatřena značkou "@generated", implementace bude namísto toho vygenerována do této metody.

Je možno se vrátit zpět k modelu generátoru, změnit vlastnost funkce jmenovky, regenerovat kód a ověřit, zda to opravdu ovlivňuje vygenerovaný kód.


 obsah

Dodatek: Alternativní způsob generování modelu

Pokud již základní model knihovny nemá svůj editor vygenerovaný v oddělených projektech, máte možnost najednou vygenerovat modely knihovny a školní knihovny do stejné sady projektů. Je možné to provést z modelu Rose, nebo sady anotovaných rozhraní Java.

Počínaje modelem Rose je proces stejný, jak bylo popsáno výše, s výjimkou toho, že jsou oba balíčky vybrány pro generování kódu.

Počínaje anotovanými rozhraními jazyka Java jsou oba balíčky importovány do jednoho projektu jazyka Java před jakýmkoli generováním kódu.

Pokud spustíte běhovou pracovní plochu pro otestování nového editoru, můžete si všimnout jedné malé odlišnosti v editoru pro model knihovny v porovnání se samostatným generováním z modelu školní knihovny.

Všimněte si, že jsou k dispozici tři typy podřízených prvků, přičemž v předchozím výukovém programu byly pouze dva typy. Konkrétně je přidán typ"Učebnice", který pochází z balíčku školní knihovny. Předtím o tom generátor kódu během generování poskytovatele položek pro knihovnu nevěděl. Nyní, protože byly společně vygenerovány dva balíčky, základní balíček ví vše o balíčku, který ho rozšiřuje.


obsah