FAQ Oblig1
Dette dokumentet er ment som en slags FAQ for oblig 1, men jeg vil ogs? fors?ke ? gi litt forklaringer p? hva vi gj?r, og hvorfor vi gj?r det. Jeg har f?tt flest sp?rsm?l rundt EMF og GMF s? langt, s? det blir mest om det for n?, men jeg vil oppdatere denne FAQen fortl?pende. Nye sp?rsm?l vil havne nederst.Det kan ogs? v?re lurt ? ta en titt p? foilene fra gruppetimen 26/2.
Jeg gj?r oppmerksom at alt som st?r her bygger p? mine (Svein) erfaringer og forst?else av ting, det er derfor meget mulig at alt som st?r her ikke her 100% riktig i alle situasjoner.
Innhold:
En
kort overordnet forklaring p? hva vi driver med
Jeg
har laget metamodellen slik som det er vist i tutorialen, men f?r ikke generert
kode!! Hvorfor?
Jeg
f?r masse warnings i den genererte koden, g?r dette noe?
Jeg
f?r feil i koden som er generert fra genmodel. Hvorfor?
Hva
vil det si at noe er Diagram element?
Hvorfor
ser gmfgraph modellen min annerledes ut en den p? bildet?
Hvorfor
er ikke gmfmap modellen min lik den som vises i tutorialen?
Jeg
f?r ikke generert generator model (gmfgen). Hvorfor?
Jeg
f?r kun laget et eksemplar av hvert element i diagram editoren
Hvordan
lager jeg modellen input modellen til ATL transformajonen i opg 1a del 3?
Hvordan
lager jeg modellene og metamodellene til ATL transformasjonen?
Hvordan
lager jeg et ATL Prosjekt?
Jeg
har fulgt ATL tutorialen, men f?r ingen modell som resultat av transformasjonen
? Hvorfor?
Hvordan
velger jeg riktig metamodell i MOFScript?
Start
hjelp til MOFScript transformajonen
En kort overordnet forklaring p? hva vi driver med
Tutorialen som benyttes i obligen forklarer ikke s? godt hvorfor vi gj?r det vi gj?r, s? jeg tenkte ? gi en kort litt overordnet forklaring her. Jeg vil pr?ve ? forklare litt mer konkret under hvert sp?rsm?l.
Obligen begynner alts? med ? definere en metamodel for PIM4SOA informasjons modeller i opg 1. Vi kan p? en m?te si at vi definerer et spr?k for ? beskrive PIM4SOA informasjons modeller ? vi definerer et sett med konsepter/begreper (for eksempel. Document, Package osv.), og beskriver hvilket forhold disse kan ha til hverandre (for eksempel at Document er inneholdt i Package). Vi kan derfor si at metamodellen beskriver grammatikken for dette spr?ket, p? samme m?te som metamodellen for UML beskriver grammatikken til UML, og en metamodel for Java ville beskrive grammatikken til Java.
Denne metamodellen er imidlertid ikke nok til ? kunne bruke dette spr?ket p? en tilfredsstillende m?te. Vi har definert grammatikken for spr?ket, men vi har ikke sagt noe om hvordan begrepene konkret skal uttrykkes. Metamodellen sier for eksempel ingenting om hvordan et Document ?ser ut? ? skal det vises som en strek? En Node? Bokstaven ?Q??.... Vi har alts? ikke beskrevet den konkrete syntaksen. Det er dette vi ?nsker ? gj?re i del 2 av oppgave 1a; vi definerer et sett med figurer (gmfgraph) og et sett med verkt?y (gmftool). Disse m? mappes sammen med begrepene v?re fra metamodellen slik at vi f?r en m?te ? uttrykke v?rt PIM4SOA spr?k p?. Vi bestemmer alts? hvilke figurer som skal brukes til ? beskrive et konsept/begrep samtidig som vi gj?r det mulig ? lage denne figuren ved ? lage et creation tool for det. Til slutt oppretter vi en diagram editor slik at vi kan bruke spr?ket v?rt. Denne editoren kan vi bruke til ? lage Figurene vi definerte, basert p? grammatikken beskrevet i metamodellen v?r, slik at vi kan uttrykke oss korrekt i spr?ket v?rt. Vi trenger alts? b?de en metamodel og en grafisk definisjon for f? et fullverdig spr?k (Gjelder kun grafiske spr?k).
Grafiske modellerings spr?k er gjerne gode til ? modeller struktur p? en m?te som er enkel ? forst? for mennesker. N?r det gjelder oppf?rsel derimot er de gjerne litt mindre egnet.
Hvordan opprettes genmodel?
H?yreklikk p? ecore fila, og velg New -> Other -> Eclipse Modeling Framework -> EMF Modell.
Jeg har laget metamodellen slik som det er vist i tutorialen, men f?r ikke generert kode!! Hvorfor?
Dette kan skyldes flere ting, men det vanligeste er at ikke EType propertiet til attributer er satt og/eller at aggreations eller associations ikke har f?tt navn. Dette blir feil ettersom vi skal generere kode fra modellen v?r. Strukturen i koden blir logisk sett ganske lik det som vises i ecore modellen. Dersom man ikke har satt typen til en variabel vil derfor bli feil ? det blir rett og slett et tomrom i java koden der typen skulle st?tt. Det samme gjelder aggregations og associations ? dersom de ikke f?r navn blir det laget et variabel eller collection i javakoden uten navn.
En annen grunn kan v?re at EPackage elementet i Ecore fila ikke har f?tt navn - dette settes i Properties View og b?r ha liten forbokstav.
Dette kan ogs? skyldes at, det ligger noen ?skjulte? elementer i ecore fila, dvs elementer som ikke synes i ecore_diagramet. Dette skjer gjerne dersom man sletter en node med linker til seg. Linken blir da liggende i ecore fila under source elementet sitt men null som target element. For ? finne disse elementene kan man se gjennom ecore fila si.
Valider modell elementer i ecore fila ved ? h?yreklikke p? dem og s? velge validate. Dette vil avsl?re enkelte feil p? elementet, og dets sub elementer (visse feil oppdages riktignok ikke).
I tillegg er b?r genmodellen genereres i det prosjektet den skal ligge i, og ikke kopieres fra et annet prosjekt.
Jeg f?r masse warnings i den genererte koden, g?r dette noe?
Nei. Det spiller ingen rolle, og vi f?r ikke gjort noe med det heller. Advarselene skyldes gjerne at det importeres ting som ikke brukes, og at det ikke blir gitt type parametere p? Collection.
Jeg f?r feil i koden som er generert fra genmodel. Hvorfor?
Husk at man m? generere b?de model kode og edit kode. Model koden gj?r det mulig ? lage instanser av elementene i metamodellen fra Java. Dette brukes av edit koden, som blir en slags adapter mellom eclipse og metamodellen.
Dersom man har gnerert kode tidligere s? kan det bli problemer, ettersom det kan ligge igjen gamelt rusk og rask. Dersom en skal generere kode p? nytt b?r en derfor slette model koden (ligger under src mapp i prosjektet), plugin.xmi, MANIFEST.MF og edit prosjektet. Dersom en har generert editor kode og test kode b?r dette ogs? slettes.
Hva vil det si at noe er Diagram element?
Det elementet vi velger som diagram element er p? en m?te det elementet vi st?r inne i n?r vi modellerer i dagramet. Det vil si at vi kan lage elementer som er i target enden av en aggregation som g?r fra package elementet. Or ? bruke diagramet i tutorialen som eksempel, s? ser vi at Document (subtype av Package) kan ligge i Package via subPackages aggreationen, mens Element og Association via elements aggregationen (disse er subtype av PackageableElements).
Hvorfor ser gmfgraph modellen min annerledes ut en den p? bildet?
? Pass p? ? velge Package som diagram element. Velg s? Deselect All knappen, slik at ingen elementer er valgt. Huk s? av Entity, Association, og Document og deres attributer; de 3 valgene avgj?r om elementet skal v?re node, link, eller attibute. ![endif]>![if>
? Navnene som genereres blir ofte merkelige (slik det gjerne er med autogenererte ting). Begynn fra toppen og gi elementene navn som de som er vist i modellen. ![endif]>![if>
Om modellen er en smule annerledes spiller det ingen rolle. Du kan forandre p? modellen ved ? gi nye navn, slette elementer og legge til elementer ved ? h?yreklikke i modellen (se neste punkt for mer info).
Hva er gmfgraph?
(se ogs? foilene fra gruppe timen 26/2)
Gmfgraph er en modell som brukes til ? definere figurer til elementene i metamodellen. De har egentlig ingen ting med metamodel elementene ? gj?re i seg selv, og den eneste grunnen til at vi bruker en wizard for ? lage modellen er at vi skal f? litt hjelp p? veien. Vi kunne godt begynt fra scratch selv. Navnene i modellen er kun for ? gi oss selv litt bedre oversikt.
Gmfgraph modellen best?r av to deler (i allefall i v?rt tilfelle). F?rst oppretter man noen figurer under Figure Gallery. Disse kan v?re av mange forskjellige typer, men i v?rt tilfelle bruker vi Polyline Connection og Rectangle figurer. Navnene er kun for v?r egen del, slik at vi kan se forskjel p? dem. Under disse figurene legger vi ogs? til labels (disse labels er alts? festet til figuren de ligger under).
Nedenfor Figure Gallery ligger det noen Noder, Connections og Diagram Labels. For at disse skal kunne vises grafisk, m? vi beskrive hvordan disse skal se ut. Dette gj?res ved ? sette Figure referenasen i porperties view. Det kan ogs? v?re lurt ? gi disse forklarende navn.
Hva er gmftool?
(se ogs? foilene fra gruppe timen 26/2)
Gmftool er en modell som brukes til ? definere tools?. Denne har heller ingen ting ? gj?re med metamodellen v?r, og navnene her er ogs? kun for ? skille verkt?yene fra hverandre. Vi sier rett og slett at vi skal ha et vist antall verkt?y, og at disse skal ha to images ? et lite og et tort (regner med det store er det som vises i palletten, og det lille er det som spretter opp i ?snakke bobla? n?r man f?rer pekeren over et element i diagramet).
Hvorfor er ikke gmfmap modellen min lik den som vises i tutorialen?
? Pass p? ? velge package som diagram element. ![endif]>![if>
? Pass ogs? p? at du loader riktige modeller til mappingen. Dette kan bli galt dersom ikke navnene p? gmfgraph, gmftool og ecore. Gmftgrap, gftool og gmfmap b?r alle genereres ved ? h?yreklikke p? ecore fila og s? velge new osv. P? denne m?ten slipper man problemer med dette. ![endif]>![if>
? For?vrig gjelder det samme som for de andre modellene. Modellen som genereres er kun et utkast/forslag og kan endres s? mye man bare vil. Det som er viktig er at mappingene blir riktig (se nese punkt). ![endif]>![if>
Hva er gmfmap?
(se ogs? foilene fra gruppe timen 26/2)
Gmfmap er modellen som knytter verkt?yene (gmftool) og figurene (gmfgraph) til elementer i metamodellen v?r (PIM4SOA). Her gjelder det ? holde tunga litt rett i munnen. Vi m? ha en mapping for hvert element vi vil ha med fra metamodellen.
Top Node Reference inneholder en mapping med referanse til metamodellen. Top Node Reference<subpackages(Document)/Document> inneholder for eksempel en Node Mapping med referanse til elementet Document, som ligger under Collectionen subPackages (som beskrevet i metamodellen), denne Collectionen ligger i Package som er diagram element. Det er alts? Package vi ?st?r inni?. For ? beskrive hvilke figur Document skal representeres av, og hvilke verkt?y det skal lages av, ligger det en Node Mapping under Top Node Reference. Det er denne som knytter modellene sammen: Propertiet Element er en referanse til elementet i metamodellen, Diagram Node er en referanse til figuren i gmfgraph, Tool er en referanse til creation Toolet i gmftool. Dersom man har gitt litt fornuftige navn b?r derfor propertiene for Node Mapping for Document settes slik:
Element = EClass
Document
Diagram = Node Document
Tool = Creation Tool Document.
Label Mapping noden under Node Mapping lager en mapping mellom et attribut i metamodellen og en labell. Den s?rger alts? for at verdien som havner i labelen blir lagret et sted. Label Mapping for node mappingen for Document f?r der for f?lgende properties:
Diagram Label =
DocumentNameLabel
Features = EAttribute
name.
Verdien havner alts? I name attributtet til Document.
N?r det gjelder LinkMappingen, s? gjelder samme prinsippet her. For Association blir propertiene som f?lger:
Element = Eclass
Associations
Diagram Link = Connection
Association
Tool = Creation Tool Association
I tillegg m? Target Feature settes. Denne spesifiserer hvilket element i metamodellen som m?l-referanse:
Target Feature = Ereference container
Vi setter ikke source Feature her, ettersom Linken i v?rt tilfellet liger under Document (dette er spessifisert via elemets aggregationen som arves fra Package)
Dersom ikke dette hadde v?r tilfelle (som med Entity Associatio) m?te ogs? denne v?rt satt
Hva er gmfgen?
Gmfgen er en modell smo inneholder den informasjonen som trengs for ? generere diagram koden.
Jeg f?r ikke generert generator model (gmfgen). Hvorfor?
Det virker som om GMF til tider er sv?rt sensitiv n?r det gjelder navn p? filnavn (Dette skjer ikke altid, s? jeg er litt usikker p? akkurat hvorfor), og i navnet p? Epackage elementet i ecore fila. Den metoden som skal finne elementene i genmodellen finner dem rett og slett ikke av en eller annen grunn. Det virker som om store bokstaver og lange filnavn kan skape problemer. Det l?nner seg derfor ? v?re sv?rt forsiktig n?r man gir navn. Dersom filene heter feks ?PIM4SOA infomodel? foresl?r jeg at man bytter navn til feks pim4soa p? alle modellene.
En b?r derfor ogs? slette genmodellen, forandre navn (h?yreklikk -> refactor) p? ecore fila, gmfgraph fila, gmfmap fila og gmftool, til feks. pim4soa.ecore (s?rg ogs? for at propertiene til EPackage elementet stemmer med de nye navnene), pim4soa.gmfgraph etc.... N?r dette er gjort f?r man antageligvis noen feil i gmfmap, ettersom denne fortsatt har refereanser til de gamle navnene. Dette kan enkelt fikses ved ? ?pne fila som tekst fil (h?yreklikk -> open with), og deretter bytte ut de gamle navnenen med 'pim4soa'. Dette gj?res enkelt ved ? trykke ctrl + f, og deretter fylle ut Find: <gamelt navn> (uten extension), Replace With: <nytt navn> (uten extension). Trykk deretter Replace All. N? b?r alt v?re i orden, og man kan generere genmodellen p? nytt, og s? generere generator model og diagram code + model kode og edit kode fra genmodellen.
Jeg f?r kun laget et eksemplar av hvert element i diagram editoren
Dette skyldes at Upper Bound propertiet i aggregations er satt til ?1? (default verdien) istedenfor ?-1'. Sett deretter dette propertiet til ?-1? p? alle agregations ved ? h?yre klikke p? aggregationen og s? g? i properties view.
Hvordan lager jeg modellen input modellen til ATL transformajonen i opg 1a del 3?
Denne modellen inneholder alts? String og Integer, samt linken EntityAssociation i tillegg til det som ble laget i del 2.... Disse kan ikke opprette med den editoren vi lagde i del 2, men det er to relativt enkle ting man kan gj?re for ? f? det til:
1)
Den enkleste m?ten ? gj?re dette p? er ? ?pne fila som inneholder modellen man
lagde i del 2 ? alts? pim4soa modellen man tegnet i med den grafiske editoren.
Denne modellen ligger ved siden av den fila som inneholder informasjon om den
grafiske modellen. Dersom diagram fila heter <filnavn>.pim4soa_diagram,
vil modellen hete <filnavn>.pim4soa. Det er alts? dette som er modellen,
diagram fila inneholder kun informasjon omhvordan grafikken som viser modellen
ser ut. Ved hjelp av denne modellen kan modellinstanser opprettes uten den
grafiske definisjonen:
- H?yre-klikk p? Package elementet
- Legg til to stk ItemType
- Gi den ene navn ?Integer? og den andre navn ?String?
- G? s? gjennom modellen og sett alle type propertiet til alle attributes i modellen til enten String eller Integer (spiller ingen rolle hvilken)
- Legg s? til en Association under Package elementet.
- Velg ProductInfo som container og ProductRecord
som contained
Dette vil alts? endre selve pim4soa modellen, men vil ikke vises i den grafiske definisjonen ettersom det ikke er definert noen grafikk for dette. Pim4soa modellen kan s? kopieres til ATL prosjektet.
2) Den andre m?ten er ogs? relativt enkel, men krever litt mer jobb. Den er rett og slett ? endre gmfgen, gmftool og gmfmap slik at man kal legge til ItemTypes. Dette gj?res ved ? legge til en Rectangle ItemType Figur (med Label), Node ItemType, samt Diagram Label ItemType + gafikk for EntityAssociation i den grafiske modellen (Gj?r akkurat det samme som for Document eller Entity samt Association), legg s? til to tool igmftool, ? mapp det hele sammen i gmfmap (EntityAssociation er helt lik som Association, men me noen andre navn, samt at Source Feature m? settes). Dersom man forst?r hva man har gjort f?r er dette gjort p? 1-2-3, det er bare ? gj?re akkurat det samme som for de andre Nodenen (Entity og Document) og Linken. Generer s? gmfgen og diagram kode p? nytt og legg til 2 ItemTypes ? ?String? og ?Integer?. Sett s? type propertiet p? alle attributter til ? v?re enten String eller Integer. Til slutt kan man opprette ProductRecord entiteten og linke denne til ProductInformation.
Hvordan lager jeg modellene og metamodellene til ATL transformasjonen?
PIM4SOA metamodellen og input modellen lagde vi i del 1 og del 2. Metamodellen, og instanse modellen som ble laget i editoer (den fila som har samme filekstensjon som diagram fila minus ?_diagram?. Feks dersom diagram fila heter ?test.pim4soa_diagram? heter model fila ?test.pim4soa?), kan kopieres inn i ATL prosjektet (se ogs? punktet over). XSD metamodellen m? imidlertid opprettes Dette gj?res enkelt og greit ved ? tegne modellen som vises i i eksempelet p? samme m?te som PIM4SOA modellen ble laget. Husk navn p? aggregations, Upper Bound propertiet til aggregtations og typer til attributtenen. Valider modellen for ? sjekke at alt er riktig f?r du tar den i bruk. Man trenger ikke ? generere kode, men gj?r det gjerne dersom du vil (og pr?v ? lage instanser av modellen ved ? kj?re editor prosjektet), da dette er den beste m?ten ? sjekke at alt er riktig. Output modellen skal genereres basert p? disse 3 modellene slik som vi spessifiserer i transformasjons reglene i tutorialen.
Hvordan lager jeg et ATL Prosjekt?
For ? lage et ATL prosjekt m? en ha ATL installert (se installasjons guide). Man b?r ogs? bytte Perspective til ATL Perspective ? klikk p? knappen ?Open Perspective? ?verst i h?yre hj?rne og velg ?ATL perspective?. En vil n? f? muligheten til ? lage ATL prosjekter og ATL filer under File -> New.
MOFScript tips
? N?r man skriver MOFScript transformasjonen trenger man ikke gj?re den helt likt som i ATL ? Det viktegeste er at man f?r generert en model som ser riktig ut og at logikken bak transformasjonen virker fornuftig. ![endif]>![if>
? Man trenger ikke sette en referanse som verdi til type attributene (type = "//@xsd_complexType.0"). Bruk heller navnet p? typen (type = ?String"). Vi kan annta at navnet er unikt. ![endif]>![if>
Jeg har fulgt ATL tutorialen, men f?r ingen modell som resultat av transformasjonen ? Hvorfor?
Det er en liten feil i tutorialen: i steg 7 der det er bilde av ATL fila ?pnet i eclipse st?r det
module pim2xsd; -- Module Template
create OUT : XSDSchema
from IN : PIM4SOA;
Her defineres metamodellene som skal brukes. Vi definerer at XSDSchema er det navnet vi kaller xsd metamodellen i ATL programmet, og at vi kaller pim4soa metamodellen PIM4SOA. Dette er ikke feil i seg selv, ettersom man kan gi hvilke navn man vil her. Det som skaper problemer er at det brukes et annet navn for XSD metamodellen i resten av programmet, nemlig XSD:
rule Entity2ComplexType{
from
ent : PIM4SOA!Entity
to
ct : XSD ! XSDComplexType
Det som skjer her er at vi sier at vi skal mappen Entity elementet fra den metamodellen vi har kalt PIM4SOA (vi tilordner samtidig dette elementet til variabelen ent). I to klausulen sier vi s? at vi skal mappe dette til XSDComplexType fra metamodellen vi har kalt XSD (dette elementet tilordnes samtidig til variablen ct). Ettersom navnet XSD ikke er definert noe sted kaper dette imidlertid problemer. Du kan derfor enten sette OUT : XSD i toppen av fila (i s?fall m? du endre dette i runconfigurasjonen ogs?), eller du kan endre XSD til XSDSchema der dette navnet forekommer i koden.
Det kan ogs? hende det blir litt feil p? variabel navn etc i hennold til det som er i XSD metamodellen man har laget. I s?fall er det bare ? endre disse navnene til det som er definert i metamodellen.
Hvordan velger jeg riktig metamodell i MOFScript?
Legg metmodellen i metmodels mappa (\eclipse\plugins\org.sintef.mofscript.editor_1.2.0\repository\metamodels). N?r man s? lager en MOFScript fil og skriver
'texttransformation PIM4SOA2XSD (in pim4soa:' kan man trykke ctrl + space for ? velge metamodellen fra auto code completition listen i eclipse.
Start hjelp til MOFScript transformajonen
Transformasjonen kan sikkert skrives p? mange m?ter, men jeg foresl?r at man begynner med en main regel i konteksten Package, og s? plukker ut Association og ItemType elementer fra elements lista til Package f?r man mapper Dokument til XSDSchema. P? denne m?te er disse elementene tilgjengelig n?r de tengs senere:
var itemTypes : List;
var associations : List;
pim4soa.Package::main(){
associations = self.elements->select(association : pim4soa.Association);
itemTypes = self.elements->select(type : pim4soa.ItemType | !type.oclIsKindOf(pim4soa.Entity))
self.subpackages->forEach(doc : pim4soa.Document){
doc.Document2Schema()
}
}
I regelen som mapper Document til XSDSchema (her kalt Documetn2Schema) oppretter en s? en fil, slik at det for hvert Dokument i modellen lages et XSDSchema. Den teksten som skal genereres kan klippes ut fra resultatet av ATL transformasjonen og limes inn i de reglene som skal generere dem. For ? putte inn navnenen fra modellen putter en inn kode for dette innimellom teksten feks Document.name for ? f? ut navnet p? docuemtnet:
'<?xml version="1.0"
encoding="ISO-8859-1"?>
<xsdMetamodel:XSDSchema
xmi:version="2.0" xmlns:xmi="http://www.omg.org/XMI"
xmlns:xsdMetamodel="http:///XSDMetamodel/model"
document="' self.name '" targetNameSpace="' self.targetNameSpace
'">'
(self kommer ann p? hvilke kontekst man er i. I kode eksempelet over er self Package)
Ett model element som er del av XSDSchema modellen kan beskrives som f?lger
<xsd_complexType name="OrderHeader">
<xsd_attribute name="orderID" type="String"/>
<xsd_attribute name="issueDate" type="String"/>
</xsd_complexType>
Dette betyr at ComplexType elementet OrderHeader ligger i xsd_complexType listen i XSDSchema (trenger ikke si explisit at dette er et ComplexType element, ettersom denne listen kunn har elementer av en type). Vi ser ogs? at OrderHeader har to attributter. Disse ligger i xsd_attribute listen til ComplexType. Regelens om lager dette elementet m? alts? begynne med ? generere linjen:
<xsd_complexType name="OrderHeader"> // og selvf?lgelig putte inn navnet 'OrderHeader'
Deretter kalles regelen som mapper attributene, f?r den siste linjen genereres:
</xsd_complexType>
Dersom man er usikker p? hva som ligger i de forskjellige elementene i inputmodellen kan en bruke ctrl + space for ? f? en liste over attributer collections etc i elementet (som vanlig n?r man programmerer i eclipse). Man kan ogs? bruke stdout.println() for ? skrive ut verdier.