$30 off During Our Annual Pro Sale. View Details »

CSE564 Lecture 24

CSE564 Lecture 24

Software Design
Model-Driven Development I
(202211)

Javier Gonzalez-Sanchez
PRO

September 24, 2020
Tweet

More Decks by Javier Gonzalez-Sanchez

Other Decks in Programming

Transcript

  1. jgs
    CSE 564
    Software Design
    Lecture 23: Model-Driven Development
    Dr. Javier Gonzalez-Sanchez
    [email protected]
    javiergs.engineering.asu.edu | javiergs.com
    PERALTA 230U
    Office Hours: By appointment

    View Slide

  2. jgs
    Frameworks vs Libraries

    View Slide

  3. jgs
    564 00010100
    Johnson (1997)
    § Component represent code reuse
    A framework is a reusable design represented by a set of components and
    the way they interact.
    A framework implement an architecture
    § Framework = Components + Design + Domain Specific Solution

    View Slide

  4. jgs
    564 00010100
    Framework vs Library
    § Inversion of Control: the framework determines the flow of control
    i.e., reuse of main
    § Model-View-Controller - a framework or an architectural pattern?

    View Slide

  5. jgs
    564 00010100
    Eric Gamma

    View Slide

  6. jgs
    Next
    Model-Driven Development

    View Slide

  7. jgs
    564 00010100
    Definition
    Model-driven software development (MDD)
    § Write and implement software quickly, effectively and at minimum cost.
    § The approach focuses on the construction of a software model.
    § The model (text or graphic) specifies how the software system should work
    before the code is generated.
    § The software is created automatically (translate the model to code)
    § Tested and then deployed.

    View Slide

  8. jgs
    564 00010100
    MDD Development Process
    http://www.theenterprisearchitect.eu/blog/2009/08/05/a-metaphor-for-model-driven-engineering/

    View Slide

  9. jgs
    564 00010100
    MDD Development Process

    View Slide

  10. jgs
    564 00010100
    MDD Development Process

    View Slide

  11. jgs
    564 00010100
    MDD Development Process

    View Slide

  12. jgs
    564 00010100
    MDD Development Process

    View Slide

  13. jgs
    0. The Tool: Eclipse Modeling Framework

    View Slide

  14. jgs
    564 00010100
    Eclipse
    § Eclipse is a universal platform for integrating development tools
    § Architecture based on plug-ins
    § SWT (Standard Widget Toolkit) is a generic graphics and GUI widget set
    § JFace is set of UI frameworks for common UI tasks
    § Workbench and Workspace are core – Editors, Views, and Perspectives

    View Slide

  15. jgs
    564 00010100
    Eclipse Modeling Framework
    2. Model specification
    (it is stored as XMI
    but defined as text or
    diagram). A subset of
    UML class diagrams
    semantics
    1. EMF provides tools
    and runtime
    environment.
    3. Translate to Java
    Classes and Interfaces

    View Slide

  16. jgs
    564 00010100
    Download Eclipse Modeling Tools

    View Slide

  17. jgs
    564 00010100
    Eclipse Modeling Tools

    View Slide

  18. jgs
    1. Define the Model

    View Slide

  19. jgs
    564 00010100
    Model
    UML Class Diagram
    Description

    View Slide

  20. jgs
    564 00010100
    Step 1 :: Project
    § Create an empty modeling project in your workspace
    File → New → Other… and choose Empty EMF Project
    § Click Next, enter a name for the project, e.g., org.eclipse.example.mymodel, and hit
    Finish

    View Slide

  21. jgs
    564 00010100
    Step 2 :: Model
    § Please right click the model folder in your new modeling project then
    New → Other… → Ecore Model, then click Next and give the ecore file the name
    myModel.ecore.
    § It will open in the default Ecore editor, which allows the definition of Ecore models in
    a tree-based view

    View Slide

  22. jgs
    564 00010100
    Step 2 :: Model :: Package
    § Give the package of your new model a name and an URI. This will be done in the
    properties view. The URI is used to identify the model later.
    Name the package myModel,
    Set the Ns Prefix to org.eclipse.example.myModel
    and the Ns URI to https://org/eclipse/example/myModel.

    View Slide

  23. jgs
    564 00010100
    Step 2 :: Model :: Classes and Attributes
    § Define model elements as children of the root package by right clicking on the
    myModel package and on the EClass respectively
    Add EClass as children, New Child → EClass
    Add EAttribute as children, New Child → EAttribute

    View Slide

  24. jgs
    564 00010100
    Step 2 :: Model :: Relationships
    § EReference between Course and Student, New Child → EReference
    EType of the reference to “Student”
    upper bound to “-1”, the equivalent of “many”.
    set the property Containment to “true”

    View Slide

  25. jgs
    564 00010100
    Step 2 :: Model :: Relationships
    § EReference between Student and Computer, New Child → EReference
    EType of the reference to “Computer”
    upper bound to “1” (default)
    set the property Containment to “false”
    § Save all

    View Slide

  26. jgs
    2. Code Generation

    View Slide

  27. jgs
    564 00010100
    Eclipse Modeling Framework

    View Slide

  28. jgs
    564 00010100
    Generator Model
    § Create a generator model. This allows to configure properties for the code
    generation that are not part of the model itself.
    § Generate a maximum of four different plugins for a defined model:
    1. Model plugin contains all entities, packages and factories to create instances of
    the model.
    2. Edit plugin contains providers to display a model in a UI. For example, the
    providers offer a label for every model element, which can be used to display an
    entity showing an icon and a name.
    3. Editor plugin is a generated example editor to create and modify instances of a
    model.
    4. Test plugin contains templates to write tests cases for a model.

    View Slide

  29. jgs
    564 00010100
    Step 3 :: Generate Code
    § Right click the model folder in the project then
    § New → Other… → EMF Generator Model → Next
    § and enter myModel.genmodel as the file name.
    § Select Ecore model as the model importer.
    § select Browse Workspace… and select our previously created myModel.ecore

    View Slide

  30. jgs
    564 00010100
    Step 3 :: Generate Code
    § Based on the generator model, we can now generate the source code.
    § EMF allows you to generate 4 different plugins.
    § To generate the plugins, right-click on the root node of the genmodel and
    select the plugin. For our tutorial, please select “generate all”.

    View Slide

  31. jgs
    564 00010100
    Step 3 :: Generate Code

    View Slide

  32. jgs
    564 00010100
    Step 3 :: Generate Code
    Could you create a class
    diagram for the package
    myModel?

    View Slide

  33. jgs
    3. Code

    View Slide

  34. jgs
    564 00010100
    § For each class in your model, there is a corresponding generated
    § Java interface
    § Java implementation class
    § For each package, there is a
    § XXXPackage interface and implementation class
    § XXXFactory interface and implementation class

    View Slide

  35. jgs
    564 00010100
    § These are singletons, to access the instances use
    § XXXPackage.eINSTANCE
    § XXXFactory.eINSTANCE
    § Use the Factory to create instances of your model classes, e.g:
    TaskList t = ExampleFactory.eINSTANCE.createTaskList();
    § Use the Package to access the meta-model definition, e.g:
    EClass c = ExamplePackage.eINSTANCE.getTaskList();
    List attrs = c.getEAttributes();

    View Slide

  36. jgs
    564 00010100
    Interfaces
    package myModel;
    public interface Course extends EObject {
    String getName();
    void setName(String value);
    EList getStudents();
    }
    public interface Student extends EObject {
    String getName();
    void setName(String value);
    int getGpa();
    void setGpa(int value);
    boolean isHasScholarship();
    void setHasScholarship(boolean value);
    Computer getComputer();
    void setComputer(Computer value);
    }
    public interface Computer extends EObject {
    String getBrand();
    void setBrand(String value);
    }

    View Slide

  37. jgs
    564 00010100
    Interfaces
    package myModel;
    public interface MyModelFactory extends EFactory {
    MyModelFactory eINSTANCE = myModel.impl.MyModelFactoryImpl.init();
    Course createCourse();
    Student createStudent();
    Computer createComputer();
    MyModelPackage getMyModelPackage();
    }
    public interface MyModelPackage extends EPackage {
    String eNAME = "myModel";
    String eNS_URI = "https://org/eclipse/example/myModel";
    String eNS_PREFIX = "org.eclipse.example.myModel";
    MyModelPackage eINSTANCE = myModel.impl.MyModelPackageImpl.init();
    // more ...
    }

    View Slide

  38. jgs
    564 00010100
    Classes :: Course
    package myModel.impl;
    public class CourseImpl extends MinimalEObjectImpl.Container implements Course {
    protected static final String NAME_EDEFAULT = null;
    protected String name = NAME_EDEFAULT;
    protected EList students;
    protected CourseImpl() {
    super();
    }
    @Override
    protected EClass eStaticClass() {
    return MyModelPackage.Literals.COURSE;
    }
    @Override
    public String getName() {
    return name;
    }
    @Override
    public void setName(String newName) {
    String oldName = name;
    name = newName;
    if (eNotificationRequired())
    eNotify(new ENotificationImpl(this, Notification.SET, MyModelPackage.COURSE__NAME, oldName, name));
    }
    // continue ...

    View Slide

  39. jgs
    564 00010100
    Classes :: Course
    @Override
    public EList getStudents() {
    if (students == null) {
    students = new EObjectContainmentEList
    (Student.class, this, MyModelPackage.COURSE__STUDENTS);
    }
    return students;
    }
    // more ...
    @Override
    public String toString() {
    if (eIsProxy()) return super.toString();
    StringBuilder result = new StringBuilder(super.toString());
    result.append(" (name: ");
    result.append(name);
    result.append(')’);
    return result.toString();
    }
    }

    View Slide

  40. jgs
    564 00010100
    Classes :: Student
    package myModel.impl;
    public class StudentImpl extends MinimalEObjectImpl.Container implements Student {
    protected boolean hasScholarship = HAS_SCHOLARSHIP_EDEFAULT;
    protected Computer computer;
    @Override
    public void setComputer(Computer newComputer) {
    Computer oldComputer = computer;
    computer = newComputer;
    if (eNotificationRequired())
    eNotify(new ENotificationImpl
    (this, Notification.SET, MyModelPackage.STUDENT__COMPUTER, oldComputer, computer));
    }
    @Override
    public Computer getComputer() {
    if (computer != null && computer.eIsProxy()) {
    InternalEObject oldComputer = (InternalEObject)computer;
    computer = (Computer)eResolveProxy(oldComputer);
    if (computer != oldComputer) {
    if (eNotificationRequired())
    eNotify(new ENotificationImpl
    (this, Notification.RESOLVE, MyModelPackage.STUDENT__COMPUTER, oldComputer, computer));
    }
    }
    return computer;
    }
    }

    View Slide

  41. jgs
    564 00010100
    Why is This Better than Writing POJOs?
    § plain old Java object (POJO)
    § We have generated over 1,000 LOC,
    § Even very simple code is considered to be worth $1 per LOC. So, $1,000
    just by clicking some buttons

    View Slide

  42. jgs
    564 00010100
    Questions

    View Slide

  43. jgs
    564 00010100
    Reference
    § Eclipse Modeling Framework by Frank Budinsky
    § EMF project on eclipse.org

    View Slide

  44. jgs
    CSE 564 Computer Systems Fundamentals
    Javier Gonzalez-Sanchez
    [email protected]
    Fall 2020
    Disclaimer. These slides can only be used as study material for the class CSE564 at ASU. They cannot be distributed or used for another purpose.

    View Slide