Sidst opdateret: 31. maj 2006
Dette øveprogram er en opfølgning på Generér en EMF-model, hvori der genereres en simpel model ved navn library. I det øveprogram viste vi, hvordan en EMF-model meget let kan genereres fra en Rose-model eller et sæt Java-grænsefladefiler. I dette øveprogram gennemgår vi genereringen af en EMF-model, der udvider en eksisterende model.
Vi ser først tilbage på modellen library:
Vi vil nu udvide denne library-model ved at oprette en ny pakke, schoollibrary. Pakken indeholder tre klasser, hvoraf to udvider klasser i library-modellen:
Dette øveprogram viser trin for trin, hvordan du kan generere en EMF-model ud fra pakken schoollibrary ved at bruge modellen library, som du allerede har oprettet. Lige som i det foregående øveprogram vil vi demonstrere oprettelsen af den nye model fra en Rose-model og fra et sæt Java-grænseflader.
Skærmbillederne er fra version 3.2.0 RC6 af Eclipse SDK og version 2.2.0 RC6a af EMF.
Trin 1: | Importér modellen fra Rose eller Definér modellen ved hjælp af annoteret Java |
Trin 2: | Generér kode til EMF-model og editor |
Trin 3: | Udfør den genererede editor |
Trin 4: | Revidér editoren |
Appendiks: | En anden måde at generere modellen på |
Modellen library og editoren til den blev genereret i det foregående øveprogram,Generér en EMF-model.
Hvis disse tre pakker ikke findes på listen, må du gennemgå det foregående øveprogram eller se, hvordan du opretter begge modeller på én gang, under Appendiks.
Gem Rose-modelfilen schoollibrary.mdl et sted på din arbejdsstation. Den indeholder både pakken library og pakken schoollibrary.
Når pakker deles mellem forskellige modeller, bør man egentlig placere hver pakke i dens egen .cat-fil eller blot referere til pakkerne i en .mdl-fil. I dette øveprogram har vi imidlertid blot kopieret og udvidet
library-pakken i en enkelt modelfil. Generatoren fungerer på præcis samme måde, uanset om pakkerne er indeholdt i en enkelt.mdl-fil, eller der refereres til dem i eksterne .cat-filer.
Opret et nyt EMF-projekt i arbejdsområdet:
Her er de annoterede Java-grænseflader til pakken schoollibrary. Vi kan generere EMF-modellen ud fra disse grænsefladefiler i stedet for en Rose-model.
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 { }
Opret et nyt, tomt EMF-projekt i arbejdsområdet:
Tilføj en plugin-afhængighed af det eksisterende library-projekt:
Du kunne oprette og indtaste grænsefladerne som i det foregående øveprogram, men vi vil i stedet vise, hvordan du importerer dem fra ZIP-filen schoollibrary.zip. Gem denne fil et sted på arbejdsstationen eller i et tomt projekt i arbejdsområdet.
Opret EMF-modellen:
I generatormodellen vises et rodobjekt, der repræsenterer hele modellen. Dette modelobjekts underordnede repræsenterer pakkerne i modellen.
Koden skulle automatisk blive kompileret under genereringen og bør blive kompileret igen, hver gang den ændres. Hvis du har deaktiveret automatisk bygning i indstillingerne for arbejdsbænken, skal du huske at bygge koden igen, hver gang den ændres.
Når du vil teste de nye plugins, skal du starte en forekomst mere af Eclipse. Disse plugins skal udføres på denne arbejdsbænk.
Guiden Schoollibrary Model kan nu bruges til at oprette en ny forekomst af modellen.
Rodobjektet i denne editor svarer til ressourcen My.schoollibrary. Bemærk, at objektet under det faktisk er School Library.
Afslut den ekstra forekomst af Eclipse, og gå tilbage til den oprindelige udviklingsarbejdsbænk.
I denne del af øveprogrammet vises, hvordan den genererede kode kan ændres. Vi vil blot ændre en etiket i den genererede editor, men gøre det på et par forskellige, illustrative måder.
Først foretager vi en ændring i generatormodellen, hvilket vil påvirke den kode, der genereres.
Følgende tabel indeholder en oversigt over de filer, der genereres med menupunkterne "Generér modelkode", "Generér redigeringskode", "Generér editorkode" og Generér testkode" på de forskellige objekters kontekstafhængige menu. Menupunktet "Generér alle" svarer til at vælge alle tre menupunkter.
Generér modelkode | Generér redigeringskode | Generér editorkode | Generér testkode | |
Model <M> |
MANIFEST.MF build.properties plugin.properties plugin.xml <M>Plugin.java * ...plus filerne til hver pakke |
MANIFEST.MF build.properties plugin.properties plugin.xml <M>EditPlugin.java ...plus filerne til hver pakke |
MANIFEST.MF build.properties plugin.properties plugin.xml <M>EditorPlugin.java <M>EditorAdvisor.java * ...plus filerne til hver pakke |
MANIFEST.MF build.properties plugin.properties plugin.xml <M>AllTests.java ...plus filerne til hver pakke |
Pakke <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 * <P>XMLProcessor.java * ...plus filerne til hver klasse og enum og til modellen |
<P>ItemProviderAdaptorFactory.java ...plus filerne til hver klasse og til modellen |
<P>Editor.java <P>ModelWizard.java <P>ActionBarContributor.java ...plus filerne til modellen |
<P>Tests.java <P>Example.java ...plus filerne til hver klasse og til modellen |
Klasse <K> |
<K>.java <K>Impl.java ...plus filerne til pakken |
<K>ItemProvider.java ...plus filerne til pakken |
<K>Test.java ...plus filerne til pakken |
|
Enum <E> |
<E>.java ...plus filerne til pakken |
* Disse filer genereres ikke som standard.
Vi kan nu teste vores ændring.
Antag nu, at du ikke bryder dig om præfikset "School Library" i etiketten og vil af med det. Det kan du kun gøre ved at redigere koden, men det gøres nemt.
Som beskrevet i Oversigt over EMF.Edit-struktur bruger EMF.Edit bl.a. elementudbydere til at afgøre, hvilken etiket der skal bruges til en given type objekt. Det gøres nærmere bestemt af metoden getText(), og det er den, vi skal ændre.
Vi har ændret implementeringen af getText() fra det, der oprindeligt blev genereret. Egenskaben Etiketfunktion for klassen SchoolLibrary påvirker ikke længere den genererede kode. Det skyldes, at vi har fjernet Javadoc-koden @generated, hvilket forhindrer metoden i at blive overskrevet under kodegenereringen.
Antag nu, at du endnu ikke har bestemt, om værdien af attributten Placering eller attributten Navn skal vises i editoren. Du vil gerne senere kunne ændre det via generatormodellen. Men du ved i hvert fald, at du ikke vil have vist præfikset "School Library". Du vil i bund og grund gerne beholde den genererede implementering, så den er til rådighed for en manuelt kodet metode, som fjerner præfikset fra de data, den returnerer. Den nye metode skal kaldes "getText()", så den genererede metode skal omdøbes.
Det giver EMF-kodegeneratoren heldigvis mulighed for: Når den skal til at generere en metode, der ville være i konflikt med en metode, som ikke indeholder koden @generated, søger den efter en metode med samme navn plus suffikset "Gen". Hvis metoden findes og indeholder koden "@generated", genereres implementeringen ind i denne metode i stedet.
Du kan gå tilbage til generatormodellen, ændre egenskaben Etiketfunktion og kontrollere, at det ganske rigtigt påvirker den genererede kode.
Hvis du ikke allerede har genereret library-basismodellen og dens editor i særskilte projekter, kan du generere både modellen library og schoollibrary i samme sæt projekter i et enkelt trin. Det kan enten gøres fra Rose-modellen eller fra sættet med annoterede Java-grænseflader.
Hvis udgangspunktet er en Rose-model, er fremgangsmåden den samme som beskrevet ovenfor, bortset fra at begge pakker vælges til kodegenereringen.
Hvis udgangspunktet er annoterede Java-grænseflader, importeres begge pakker i et enkelt, tomt EMF-projekt, før der foretages nogen kodegenerering.
Når du starter runtime-arbejdsområdet, bemærker du måske en enkelt lille forskel i editoren for modellen library i forhold til dengang, det blev genereret særskilt uden modellen schoollibrary.
Bemærk, at der er tre typer underordnede til rådighed, hvor der i det foregående øveprogram kun var to. "School Book", som kommer fra pakken schoollibrary, findes også. Den kendte kodegeneratoren ikke tidligere, da den genererede elementudbyderen til Library. Nu kender basispakken alt til den pakke, der udvider den, eftersom de to pakker er genereret sammen.