Eclipse Modeling Framewok (EMF) Distributed Systems Diego Sevilla Ruiz DITEC Facultad de Informática Murcia, October 2011 Diego Sevilla Ruiz (DITEC Facultad de Informática) Eclipse Modeling Framewok (EMF) Murcia, October 2011 1 / 52
Contents 1 Introduction 2 Modelado y metamodelado 3 Ecore Metamodelo Metamodelos Ecore EMF y Ecore en Eclipse 4 Generación del código del modelo Java: GenModel C++: EMF4CPP 5 Manejo de Modelos y Metamodelos Java C++ Diego Sevilla Ruiz (DITEC Facultad de Informática) Eclipse Modeling Framewok (EMF) Murcia, October 2011 2 / 52
Contents 1 Introduction 2 Modelado y metamodelado 3 Ecore Metamodelo Metamodelos Ecore EMF y Ecore en Eclipse 4 Generación del código del modelo Java: GenModel C++: EMF4CPP 5 Manejo de Modelos y Metamodelos Java C++ Diego Sevilla Ruiz (DITEC Facultad de Informática) Eclipse Modeling Framewok (EMF) Murcia, October 2011 3 / 52
Eclipse EMF The Eclipse Modeling Framework (EMF) is a powerful framework and code generation facility for building Java applications based on simple model definitions. Designed to make modeling practical and useful to the mainstream Java programmer, EMF unifies three important technologies: Java, XML, and UML. Software is focused on manipulating data that can be modeled, hence, models drive software development. This refcard will get you started with the Eclipse Modeling Framework. Essential EMF. Ed Merks & James Sugrue Diego Sevilla Ruiz (DITEC Facultad de Informática) Eclipse Modeling Framewok (EMF) Murcia, October 2011 4 / 52
Eclipse EMF (ii) Cohesive set of tools to support the model-based development (MDE) primarily in Java Defines a framework to easily describe relationships between data structures and transform the into language programming artifacts Define una equivalencia entre XSchema, (Meta)Modelo, UML y código Java anotado Provides a graphical editor for models Provides tools to extract information from programs and turn them into models (T2M), to generate executable code from models (M2T) and to do model transformations (M2M) Diego Sevilla Ruiz (DITEC Facultad de Informática) Eclipse Modeling Framewok (EMF) Murcia, October 2011 5 / 52
Contents 1 Introduction 2 Modelado y metamodelado 3 Ecore Metamodelo Metamodelos Ecore EMF y Ecore en Eclipse 4 Generación del código del modelo Java: GenModel C++: EMF4CPP 5 Manejo de Modelos y Metamodelos Java C++ Diego Sevilla Ruiz (DITEC Facultad de Informática) Eclipse Modeling Framewok (EMF) Murcia, October 2011 6 / 52
Modeling and metamodeling Un modelo: It is an abstract representation of a domain Captures the important elements and their relationships Los elementos de representación dependen del dominio Por ejemplo, en UML: Se representa el problema con clases y relaciones Se utilizan elementos gráficos para mostrarlos Diego Sevilla Ruiz (DITEC Facultad de Informática) Eclipse Modeling Framewok (EMF) Murcia, October 2011 7 / 52
Modelado y metamodelado (ii) Un metamodelo: Describe las características de los modelos en sí, y de los elementos que lo componen Por ejemplo, cualquier modelo UML contiene: Clases Atributos Operaciones Relaciones Herencia Dónde se describe las características de cada elemento estructural del modelo? Diego Sevilla Ruiz (DITEC Facultad de Informática) Eclipse Modeling Framewok (EMF) Murcia, October 2011 8 / 52
Modelado y metamodelado (iii) MOF Diego Sevilla Ruiz (DITEC Facultad de Informática) Eclipse Modeling Framewok (EMF) Murcia, October 2011 9 / 52
Contents 1 Introduction 2 Modelado y metamodelado 3 Ecore Metamodelo Metamodelos Ecore EMF y Ecore en Eclipse 4 Generación del código del modelo Java: GenModel C++: EMF4CPP 5 Manejo de Modelos y Metamodelos Java C++ Diego Sevilla Ruiz (DITEC Facultad de Informática) Eclipse Modeling Framewok (EMF) Murcia, October 2011 10 / 52
Ecore Es equivalente a MOF (EMOF) Especifica las características de las clases (EClass), sus características estructurales (EStructuralFeatures), atributos, operaciones, relaciones (herencia, referencia). Orientado a Java: Permite especificar tipos de datos básicos (Java) No permite el soporte de C++ (directamente). P. ej. no permite especificar la siferencia entre const o no, punteros, etc. Diego Sevilla Ruiz (DITEC Facultad de Informática) Eclipse Modeling Framewok (EMF) Murcia, October 2011 11 / 52
Diego Sevilla Ruiz (DITEC Facultad de Informática) Eclipse Modeling Framewok (EMF) Murcia, October 2011 12 / 52
Metamodelo: Discusión Nota: Se describen las características de los elementos del modelo de datos El elemento aglutinador (raíz) es el paquete (EPackage) El paquete contiene físicamente a sus elementos (especificación de containment) Los paquetes pueden estar contenidos en otros paquetes Hay una factoría (EFactory) por paquete que permite la creación de los elementos del modelo Las construcciones que describen a un conjunto de elementos (instancias) son clasificadores (EClassifiers): EClass y EDataType Diego Sevilla Ruiz (DITEC Facultad de Informática) Eclipse Modeling Framewok (EMF) Murcia, October 2011 13 / 52
Metamodelo: Discusión (ii) Las EClasses tienen superclases y están compuestas por características estructurales (EStructuralFeatures: EReference y EAttribute). Tanto las EReferences como los EAttributes pueden estar dotados de multiplicidad Los EDataTypes modelan tipos básicos o indivisibles del modelo de datos Los EReferences pueden estar contenidos (containment, no tienen entidad propia) o ser referencias estrictamente (punteros) Las Operations modelan operaciones del interfaz (aunque no se provee implementación para ellas) Todos los elementos heredan de ENamedElement (tienen nombre), y de EModelElement (elemento del modelo) Todo elemento del modelo puede tener asociadas anotaciones (EAnnotation): pares nombre/valor para especificaciones extra (p. ej. restricciones OCL ó cadenas de documentación) Diego Sevilla Ruiz (DITEC Facultad de Informática) Eclipse Modeling Framewok (EMF) Murcia, October 2011 14 / 52
EMF Tipos de datos (Datatypes) Diego Sevilla Ruiz (DITEC Facultad de Informática) Eclipse Modeling Framewok (EMF) Murcia, October 2011 15 / 52
EMF Metamodelos Ecore Diego Sevilla Ruiz (DITEC Facultad de Informática) Eclipse Modeling Framewok (EMF) Murcia, October 2011 16 / 52
Metamodelo: Discusión Nota: Se describen las características de cada clase (es una instancia del metamodelo de Ecore) Clasificadores del paquete Clases StructuralFeatures de las clases (EAttribtutes, EReferences, etc.) La clase Node tiene un atributo y dos referencias Los atributos sólo pueden ser EDataTypes, y siempre son contenidos La referencia children es contenida, mientras que parent es un «puntero» Nótese también la referencia eopposite La raíz así se convierte en un contenedor para todo el modelo Diego Sevilla Ruiz (DITEC Facultad de Informática) Eclipse Modeling Framewok (EMF) Murcia, October 2011 17 / 52
EMF Instancia de metamodelo Tree Diego Sevilla Ruiz (DITEC Facultad de Informática) Eclipse Modeling Framewok (EMF) Murcia, October 2011 18 / 52
Modelo (instancia): Discusión Nota: Se describen las instancias de los datos, organizados según el metamodelo Varias instancias de las clases Contienen los campos rellenos, lo que incluye los StructuralFeatures de las clases (EAttribtutes, EReferences, etc.) Los campos referencia opuestos (parent) se rellenan automáticamente (son relaciones conectadas, todo directo tiene su opuesto) Gracias al metamodelo, podemos recorrer la estructura siguiendo su semántica es decir, obteniendo el «Label» a través del método getlabel() de un nodo se puede seguir por los hijos con getchildren() (se verá después) Diego Sevilla Ruiz (DITEC Facultad de Informática) Eclipse Modeling Framewok (EMF) Murcia, October 2011 19 / 52
XMI: Serializado XML 1 < tree:node xmi:version =" 2.0 " xmlns:xmi =" http: // www. omg. org / XMI " 3 xmlns:tree =" http: // www. example. org / tree " label =" root "> 5 < children label ="A"> < children label ="X"/> 7 </ children > < children label ="B"> 9 < children label ="Y"/> </ children > 11 </ tree:node > Notas: Sigue la estructura jerárquica de contenido Las referencias se extraen del metamodelo y de la estructura Aseguran la integridad referencial gracias al metamodelo El metamodelo también se serializa a XMI (también es un modelo) Diego Sevilla Ruiz (DITEC Facultad de Informática) Eclipse Modeling Framewok (EMF) Murcia, October 2011 20 / 52
El editor de Metamodelos Crear proyecto New Other... Empty EMF Project Diego Sevilla Ruiz (DITEC Facultad de Informática) Eclipse Modeling Framewok (EMF) Murcia, October 2011 21 / 52
El editor de Metamodelos Nombre: es.um.emf.test Diego Sevilla Ruiz (DITEC Facultad de Informática) Eclipse Modeling Framewok (EMF) Murcia, October 2011 22 / 52
El editor de Metamodelos El directorio src contiene el código El directorio model contiene modelos y metamodelos Diego Sevilla Ruiz (DITEC Facultad de Informática) Eclipse Modeling Framewok (EMF) Murcia, October 2011 23 / 52
Crear metamodelo Ecore Tree (i) Dir. model Click derecho New... Ecore Modeling Framework Ecore model Diego Sevilla Ruiz (DITEC Facultad de Informática) Eclipse Modeling Framewok (EMF) Murcia, October 2011 24 / 52
Crear metamodelo Ecore Tree (ii) Diego Sevilla Ruiz (DITEC Facultad de Informática) Eclipse Modeling Framewok (EMF) Murcia, October 2011 25 / 52
Editor gráfico del metamodelo Tree.ecore Click derecho Initialize Ecore Diagram file... (Tree.ecorediag) Diego Sevilla Ruiz (DITEC Facultad de Informática) Eclipse Modeling Framewok (EMF) Murcia, October 2011 26 / 52
Editor Diego Sevilla Ruiz (DITEC Facultad de Informática) Eclipse Modeling Framewok (EMF) Murcia, October 2011 27 / 52
Editor gráfico Paleta Diego Sevilla Ruiz (DITEC Facultad de Informática) Eclipse Modeling Framewok (EMF) Murcia, October 2011 28 / 52
Propiedades del nodo raíz Ns Prefix Se utiliza como prefijo de namespace en el XMI Ns URI Identifica al metamodelo de forma unívoca universalmente El metamodelo se puede registrar (y encontrar) en Eclipse con ese nombre único Diego Sevilla Ruiz (DITEC Facultad de Informática) Eclipse Modeling Framewok (EMF) Murcia, October 2011 29 / 52
Editor de Ecore no visual Tree.ecore Botón derecho Open With... Simple Reflective Ecore Editor Diego Sevilla Ruiz (DITEC Facultad de Informática) Eclipse Modeling Framewok (EMF) Murcia, October 2011 30 / 52
Creando instancias dinámicas El metamodelo describe qué elementos van a existir en el modelo Podemos crear un modelo como una instancia del metamodelo Para cada clase del metamodelo (p. ej. Node) tendremos un conjunto de instancias (p. ej. A, B, X, etc.) iego Sevilla Ruiz (DITEC Facultad de Informática) Eclipse Modeling Framewok (EMF) Murcia, October 2011 31 / 52
Creando instancias dinámicas (ii) Node Botón derecho New child... Se rellenan las propiedades y las referencias Las referencias inversas se rellenan automáticamente Nótese la referencia al metamodelo El fichero es un fichero.xmi iego Sevilla Ruiz (DITEC Facultad de Informática) Eclipse Modeling Framewok (EMF) Murcia, October 2011 32 / 52
Contents 1 Introduction 2 Modelado y metamodelado 3 Ecore Metamodelo Metamodelos Ecore EMF y Ecore en Eclipse 4 Generación del código del modelo Java: GenModel C++: EMF4CPP 5 Manejo de Modelos y Metamodelos Java C++ Diego Sevilla Ruiz (DITEC Facultad de Informática) Eclipse Modeling Framewok (EMF) Murcia, October 2011 33 / 52
Generación del código del modelo Intuitivamente, una EClass del metamodelo se transformará en una clase del lenguaje de programación Las instancias de esas clases serán el modelo en tiempo de ejecución de los datos de nuestra aplicación Diego Sevilla Ruiz (DITEC Facultad de Informática) Eclipse Modeling Framewok (EMF) Murcia, October 2011 34 / 52
Genmodel Diego Sevilla Ruiz (DITEC Facultad de Informática) Eclipse Modeling Framewok (EMF) Murcia, October 2011 35 / 52
Genmodel Tree.ecore Botón derecho New... Eclipse Modeling Tools Ecore Generator model Tree.genmodel Next Seleccionar Ecore Model Nótese las posibilidades: Java anotado XML Schema Ecore... Next Seleccionar el modelo origen Tree.ecore Load Diego Sevilla Ruiz (DITEC Facultad de Informática) Eclipse Modeling Framewok (EMF) Murcia, October 2011 36 / 52
Genmodel Root packages Diego Sevilla Ruiz (DITEC Facultad de Informática) Eclipse Modeling Framewok (EMF) Murcia, October 2011 37 / 52
Genmodel en XMI 1 < genpackages prefix =" Tree " disposableproviderfactory =" true " ecorepackage =" Tree. ecore #/"> < genclasses ecoreclass =" Tree. ecore #// Node "> 3 < genfeatures createchild =" false " ecorefeature =" ecore:eattribute Tree. ecore #// Node / label "/> < genfeatures property =" None " notify =" false " createchild =" false " ecorefeature =" ecore:ereference Tree. ecore #// Node / parent "/> 5 < genfeatures property =" None " children =" true " createchild =" true " ecorefeature =" ecore: EReference Tree. ecore #// Node / children " />... Guarda los datos y parámetros necesarios para emprender la generación de código Nótese las referencias al metamodelo Tree.ecore (URNs) Conocido como decorador del Ecore (añade características a éste) Diego Sevilla Ruiz (DITEC Facultad de Informática) Eclipse Modeling Framewok (EMF) Murcia, October 2011 38 / 52
Generate Model Code Propiedades de Tree: Base Package es.um.emf.test Tree.genmodel/Tree, Botón derecho Generate Model Code Diego Sevilla Ruiz (DITEC Facultad de Informática) Eclipse Modeling Framewok (EMF) Murcia, October 2011 39 / 52
Model Code Paquete es.um.emf.test.tree: Interfaz puro Paquete es.um.emf.test.tree.impl: Implementación Paquete es.um.emf.test.tree.util: Utilidades iego Sevilla Ruiz (DITEC Facultad de Informática) Eclipse Modeling Framewok (EMF) Murcia, October 2011 40 / 52
Model Code Package 2 package es.um.emf. test. tree ; public interface TreePackage extends EPackage { 4 String ename = " tree "; String ens_uri = " urn :es.um.emf. test. tree "; 6 String ens_prefix = "es.um.emf. test. tree "; 8 TreePackage einstance = tree. impl. TreePackageImpl. init (); 10 // Singletons ( Ecore metamodel elements ) EClass getnode (); 12 EAttribute getnode_ Label (); EReference getnode_ Parent (); 14 EReference getnode_ Children (); 16 TreeFactory gettreefactory (); } // TreePackage Diego Sevilla Ruiz (DITEC Facultad de Informática) Eclipse Modeling Framewok (EMF) Murcia, October 2011 41 / 52
Model Code Factory 1 package es.um.emf. test. tree ; 3 public interface TreeFactory extends EFactory { 5 // Factory Singleton TreeFactory einstance = tree. impl. TreeFactoryImpl. init (); 7 // Create new nodes ( instances ) of the model Nodes 9 Node createnode (); 11 TreePackage gettreepackage (); 13 } // TreeFactory Diego Sevilla Ruiz (DITEC Facultad de Informática) Eclipse Modeling Framewok (EMF) Murcia, October 2011 42 / 52
Model Code Node 1 package es.um.emf. test. tree ; public interface Node extends EObject { 3 // Label get / set 5 String getlabel (); void setlabel ( String value ); 7 // Parent get / set 9 Node getparent (); void setparent ( Node value ); 11 // Children 13 EList < Node > getchildren (); 15 } // Node EList<Node> permite también añadir elementos a través de su método add(): node.getchildren().add(x) Diego Sevilla Ruiz (DITEC Facultad de Informática) Eclipse Modeling Framewok (EMF) Murcia, October 2011 43 / 52
C++ Con el plugin org.csu.emf4cpp.plugin instalado: Diego Sevilla Ruiz (DITEC Facultad de Informática) Eclipse Modeling Framewok (EMF) Murcia, October 2011 44 / 52
C++ Si no se elige wizard el código se genera en el subdirectorio src-gen Similar a la estructura en Java Se generan utilidades de compilación con CMake (CMakeLists.txt, tree.cmake) Paquete tree dentro del subdirectorio tree.hpp y.cpp tree.hpp Incluir el modelo en programas C++ tree/node.{hpp,cpp} Clase Node También Paquete y Factoría Diego Sevilla Ruiz (DITEC Facultad de Informática) Eclipse Modeling Framewok (EMF) Murcia, October 2011 45 / 52
C++ Model Code Package 1 namespace tree { 3 class TreePackage : public virtual :: ecore :: EPackage { 5 public : static TreePackage_ptr _instance (); 7 // EClassifiers methods 9 virtual :: ecore :: EClass_ptr getnode (); 11 // EStructuralFeatures methods virtual :: ecore :: EAttribute_ptr getnode label (); 13 virtual :: ecore :: EReference_ptr getnode parent (); virtual :: ecore :: EReference_ptr getnode children (); 15 protected : 17 static std :: auto_ptr < TreePackage > s_instance ; 19 TreePackage (); 21 // EClass instances :: ecore :: EClass_ptr m_nodeeclass ; 23 // EStructuralFeatures instances 25 :: ecore :: EAttribute_ptr m_node label ; :: ecore :: EReference_ptr m_node parent ; 27 :: ecore :: EReference_ptr m_node children ; }; 29 } // tree Diego Sevilla Ruiz (DITEC Facultad de Informática) Eclipse Modeling Framewok (EMF) Murcia, October 2011 46 / 52
C++ Model Code Factory 1 namespace tree { 3 class TreeFactory : public virtual :: ecore :: EFactory { 5 public : static TreeFactory_ ptr _ instance (); 7 9 virtual Node_ ptr createnode (); protected : 11 static std :: auto_ptr < TreeFactory > s_ instance ; 13 TreeFactory (); }; 15 } // tree Diego Sevilla Ruiz (DITEC Facultad de Informática) Eclipse Modeling Framewok (EMF) Murcia, October 2011 47 / 52
C++ Model Code Node 1 namespace tree { 3 class Node : public virtual :: ecore :: EObject { 5 public : Node (); 7 virtual ~ Node (); 9 virtual void _initialize (); 11 // Attributes :: ecore :: EString const & getlabel () const ; 13 void setlabel (:: ecore :: EString const & _label ); 15 // References :: tree :: Node_ptr getparent (); 17 void setparent (:: tree :: Node_ptr _parent ); 19 :: ecorecpp :: mapping :: EList < :: tree :: Node >& getchildren (); protected : 21 // Attributes :: ecore :: EString m_label ; 23 // References :: tree :: Node_ptr m_parent ; 25 :: ecorecpp :: mapping :: out_ptr < :: ecorecpp :: mapping :: EList < :: tree :: Node > > m_children ; 27 }; } // tree Diego Sevilla Ruiz (DITEC Facultad de Informática) Eclipse Modeling Framewok (EMF) Murcia, October 2011 48 / 52
Contents 1 Introduction 2 Modelado y metamodelado 3 Ecore Metamodelo Metamodelos Ecore EMF y Ecore en Eclipse 4 Generación del código del modelo Java: GenModel C++: EMF4CPP 5 Manejo de Modelos y Metamodelos Java C++ Diego Sevilla Ruiz (DITEC Facultad de Informática) Eclipse Modeling Framewok (EMF) Murcia, October 2011 49 / 52
Crear un modelo programáticamente Java TreeFactory tree = TreeFactory. einstance ; 2 Node root = tree. createnode (); root. setlabel (" Root "); 4 Node a = tree. createnode (); a. setlabel ("A"); 6 root. getchildren ().add (a); Node x = tree. createnode (); 8 x. setlabel ("X"); a. getchildren ().add (x); 10 Node b = tree. createnode (); b. setlabel ("B"); 12 root. getchildren ().add (b); Node y = tree. createnode (); 14 y. setlabel ("Y"); b. getchildren ().add (y); Diego Sevilla Ruiz (DITEC Facultad de Informática) Eclipse Modeling Framewok (EMF) Murcia, October 2011 50 / 52
C++ 1 using namespace tree ; 3 TreeFactory_ptr treefactory = TreeFactory :: _instance (); 5 // Create a Node std :: auto_ptr <Node > root ( treefactory ->createnode ()); 7 root ->setlabel (" Root "); 9 // Create node A Node_ptr a = treefactory ->createnode (); 11 catsaes ->setlabel ("A"); root ->getchildren (). push_back (a); 13 Node_ptr x = treefactory ->createnode (); 15 catsaes ->setlabel ("X"); a->getchildren (). push_back (x); 17 // Create node B 19 Node_ptr b = treefactory ->createnode (); catsaes ->setlabel ("B"); 21 root ->getchildren (). push_back (b); 23 Node_ptr y = treefactory ->createnode (); catsaes ->setlabel ("Y"); 25 b->getchildren (). push_back (y); 27 // Initialize the model umu -> _initialize (); 29 // ( model is deleted automatically ) Diego Sevilla Ruiz (DITEC Facultad de Informática) Eclipse Modeling Framewok (EMF) Murcia, October 2011 51 / 52
Referencias D. Steinberg, F. Budinsky, M. Paternostro, Ed Merks EMF: Eclipse Modeling Framework, 2nd Edition. Addison-Wesley Professional, 2009 Ed Merks, J. Sugrue Essential EMF (EclipseCon 09). http://cheat-sheets.biz/saved-copy/rc039-010d-emf.pdf M. Paternostro, K. Hussey Building RESTful Java Applications with EMF. http://www.slideshare.net/kenn.hussey/ building-restful-java-applications-with-emf A. Senac, D. Sevilla EMF4CPP. http://www.catedrasaes.org/trac/wiki/emf4cpp Diego Sevilla Ruiz (DITEC Facultad de Informática) Eclipse Modeling Framewok (EMF) Murcia, October 2011 52 / 52