200 likes | 331 Views
Løsningsforslag til MOFScript oppgave. Metamodellen. Input modellen. Resultatet (1). Resultatet (2). package library; import java.util.ArrayList; class Book { public String name; public String iSBN; public Book(String name, String iSBN){ this .name = name;
E N D
Resultatet (2) package library; import java.util.ArrayList; class Book { public String name; public String iSBN; public Book(String name, String iSBN){ this.name = name; this.iSBN = iSBN; } }
Resultatet (4) package library; import java.util.ArrayList; class LibrarySystem { private ArrayList books; private ArrayList customers; public LibrarySystem(ArrayList books, ArrayList customers){ this.books = books; this.customers = customers; } public Book findBook (String name){ returnnull; } public Person findCustomer (String id){ returnnull; } publicvoid rentBook (Book book, Person person){ } }
Resultatet (4) package library; import java.util.ArrayList; class Person { public String name; publicint age; public String id; public Person(String name, int age, String id){ this.name = name; this.age = age; this.id = id; } }
Signaturen - Sier hvilken metamodel som brukes: ”classModel” - Gir et alias til metamodellen: ”mdl” texttransformation ExampleTransformation (in mdl:"classModel") {.... ....
Main() - Itererer gjennom alle pakkene i modellen o g kaller mapPackage for hver av dem. mdl.Model::main () { self.ownedPackages->forEach(package : mdl.Package){ package.mapPackage() } }
mapPackage() - Itererer gjennom alle classer i pakken, og kaller mapClass for hver av dem mdl.Package::mapPackage(){ self.ownedClasses->forEach(class : mdl.Class){ class.mapClass(self.name) } }
mapClass() (1) • Lager en fil med navnet pakken + ’/’ + navnet på klassen + ’.java’ • Skriver ’package <package.name> + ;’ til fila • Skriver ’import java.util.ArrayList;’ til fila • Skriver klasse signaturen til fila • Itererer gjennom alle attributtene til klassen, og kaller mapAttribute() for hver av dem • Kaller på createConstructor() • Itererer gjennom alle operasjoner i klassen og kaller mapOperation() for hver av dem
mapClass() (2) mdl.Class::mapClass(packageName : String){ file(packageName + "/" + self.name + ".java") 'package ' + packageName + '; import java.util.ArrayList; class ' self.name.firstToUpper() ' {' self.ownedAttrtibutes->forEach(attribute : mdl.Attribute){ attribute.mapAttribute() } self.createConstructor() self.ownedOperations->forEach(operation : mdl.Operation){ operation.mapOperation() } ' }' }
createConstructor() (1) • Skriver en konstruktør signatur til filen • Bruker navnet fra klassen i modellen som navn på konstruktøren og attributtene som parametere • Skriver kode i kroppen til konstruktøren, slik at attributtene får verdiene som ligger i parameterene.
createConstructor() (2) mdl.Class::createConstructor(){ '\n\n\tpublic ' self.name '(' self.ownedAttrtibutes->forEach(attribute : mdl.Attribute){ if(attribute.multivalued){ 'ArrayList ' attribute.name.firstToLower() }else{ attribute.type.name ' ' attribute.name.firstToLower() } if(self.ownedAttrtibutes.last() != attribute){ ', ’ } } '){\n\t\t' self.ownedAttrtibutes->forEach(attribute : mdl.Attribute){ 'this.'attribute.name.firstToLower() ' = ' attribute.name.firstToLower() ';\n\t\t’ } '\n\t}’ }
mapAttribute() (1) • Dersom attributtet er public skrives ’public ’ til fila • Ellers skrives ’private ’ • Dersom attributtet er multivalued skrives ’ ArrayList ’ til fila etterfulg at navnet på attributtet • Ellers skrives navnet på typen til attributtet til fila etterfulg at navnet på attributtet
mapAttribute() (2) mdl.Attribute::mapAttribute(){ if(self.public){ '\n\tpublic ' }else{ '\n\tprivate ' } if(self.multivalued){ 'ArrayList 'self.name.firstToLower() ';' }else{ self.type.name ' ' self.name.firstToLower() ';' } }
mapOperation (1) • Signaturen på metoden opprettes • Dersom operasjonen er public skrives ’public ’ til fila • Ellers skrives ’private ’ • Dersom retur typen til operasjonen ikke er satt skrives ’void ’ til fila • Ellers skrivs navnet på typen til retur verdien • navnet på operasjonen skrives til fila, etterfulgt av ’(’ • Type og navn på parametere skrives til fila med ’, ’ mellom hver parameter • Det hele acsluttes med at ’){’ skrives til fil • Kroppen på metoden opprettes • Setter ingenting dersom metoden ikke har noen retur type. • Setter ’return null;’ dersom den har en retur type
mapOperation() (2) mdl.Operation::mapOperation(){ '\n\n\t’ if(self.public){ 'public ' }else{ 'private ' } if(self.returnType = null){ 'void ' }else{ self.returnType.name ' ' } self.name ' (' self.ownedParameters->forEach(parameter : mdl.Parameter){ parameter.mapParameter() if(self.ownedParameters.last() != parameter){ ', ' } } '){\n\t\t' if(self.returnType != null){ '\n\t\treturn null;' } '\n\t}’ }
mapParameter() - Skriver typen til parameteret og navnet til parameteret til fila, med et mellomrom imellom mdl.Parameter::mapParameter(){ self.type.name ’ ’ self.name.firstToLower() }