1 / 20

Løsningsforslag til MOFScript oppgave

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;

Download Presentation

Løsningsforslag til MOFScript oppgave

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. Løsningsforslag til MOFScript oppgave

  2. Metamodellen

  3. Input modellen

  4. Resultatet (1)

  5. 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; } }

  6. 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){ } }

  7. 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; } }

  8. Transformasjonen

  9. Signaturen - Sier hvilken metamodel som brukes: ”classModel” - Gir et alias til metamodellen: ”mdl” texttransformation ExampleTransformation (in mdl:"classModel") {.... ....

  10. 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() } }

  11. 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) } }

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

  13. 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() } ' }' }

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

  15. 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}’ }

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

  17. 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() ';' } }

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

  19. 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}’ }

  20. mapParameter() - Skriver typen til parameteret og navnet til parameteret til fila, med et mellomrom imellom mdl.Parameter::mapParameter(){ self.type.name ’ ’ self.name.firstToLower() }

More Related