Slide 1

Slide 1 text

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

Slide 2

Slide 2 text

jgs Frameworks vs Libraries

Slide 3

Slide 3 text

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

Slide 4

Slide 4 text

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?

Slide 5

Slide 5 text

jgs 564 00010100 Eric Gamma

Slide 6

Slide 6 text

jgs Next Model-Driven Development

Slide 7

Slide 7 text

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.

Slide 8

Slide 8 text

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

Slide 9

Slide 9 text

jgs 564 00010100 MDD Development Process

Slide 10

Slide 10 text

jgs 564 00010100 MDD Development Process

Slide 11

Slide 11 text

jgs 564 00010100 MDD Development Process

Slide 12

Slide 12 text

jgs 564 00010100 MDD Development Process

Slide 13

Slide 13 text

jgs 0. The Tool: Eclipse Modeling Framework

Slide 14

Slide 14 text

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

Slide 15

Slide 15 text

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

Slide 16

Slide 16 text

jgs 564 00010100 Download Eclipse Modeling Tools

Slide 17

Slide 17 text

jgs 564 00010100 Eclipse Modeling Tools

Slide 18

Slide 18 text

jgs 1. Define the Model

Slide 19

Slide 19 text

jgs 564 00010100 Model UML Class Diagram Description

Slide 20

Slide 20 text

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

Slide 21

Slide 21 text

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

Slide 22

Slide 22 text

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.

Slide 23

Slide 23 text

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

Slide 24

Slide 24 text

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”

Slide 25

Slide 25 text

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

Slide 26

Slide 26 text

jgs 2. Code Generation

Slide 27

Slide 27 text

jgs 564 00010100 Eclipse Modeling Framework

Slide 28

Slide 28 text

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.

Slide 29

Slide 29 text

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

Slide 30

Slide 30 text

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

Slide 31

Slide 31 text

jgs 564 00010100 Step 3 :: Generate Code

Slide 32

Slide 32 text

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

Slide 33

Slide 33 text

jgs 3. Code

Slide 34

Slide 34 text

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

Slide 35

Slide 35 text

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();

Slide 36

Slide 36 text

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

Slide 37

Slide 37 text

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

Slide 38

Slide 38 text

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

Slide 39

Slide 39 text

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

Slide 40

Slide 40 text

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

Slide 41

Slide 41 text

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

Slide 42

Slide 42 text

jgs 564 00010100 Questions

Slide 43

Slide 43 text

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

Slide 44

Slide 44 text

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.