29.06.2013 Views

Eclipse Modeling Framewok (EMF) - Distributed Systems

Eclipse Modeling Framewok (EMF) - Distributed Systems

Eclipse Modeling Framewok (EMF) - Distributed Systems

SHOW MORE
SHOW LESS

You also want an ePaper? Increase the reach of your titles

YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.

<strong>Eclipse</strong> <strong>Modeling</strong> <strong>Framewok</strong> (<strong>EMF</strong>)<br />

<strong>Distributed</strong> <strong>Systems</strong><br />

Diego Sevilla Ruiz<br />

DITEC<br />

Facultad de Informática<br />

Murcia, October 2011<br />

Diego Sevilla Ruiz (DITEC Facultad de Informática) <strong>Eclipse</strong> <strong>Modeling</strong> <strong>Framewok</strong> (<strong>EMF</strong>) Murcia, October 2011 1 / 52


Contents<br />

1 Introduction<br />

2 Modelado y metamodelado<br />

3 Ecore<br />

Metamodelo<br />

Metamodelos Ecore<br />

<strong>EMF</strong> y Ecore en <strong>Eclipse</strong><br />

4 Generación del código del modelo<br />

Java: GenModel<br />

C++: <strong>EMF</strong>4CPP<br />

5 Manejo de Modelos y Metamodelos<br />

Java<br />

C++<br />

Diego Sevilla Ruiz (DITEC Facultad de Informática) <strong>Eclipse</strong> <strong>Modeling</strong> <strong>Framewok</strong> (<strong>EMF</strong>) Murcia, October 2011 2 / 52


Contents<br />

1 Introduction<br />

2 Modelado y metamodelado<br />

3 Ecore<br />

Metamodelo<br />

Metamodelos Ecore<br />

<strong>EMF</strong> y Ecore en <strong>Eclipse</strong><br />

4 Generación del código del modelo<br />

Java: GenModel<br />

C++: <strong>EMF</strong>4CPP<br />

5 Manejo de Modelos y Metamodelos<br />

Java<br />

C++<br />

Diego Sevilla Ruiz (DITEC Facultad de Informática) <strong>Eclipse</strong> <strong>Modeling</strong> <strong>Framewok</strong> (<strong>EMF</strong>) Murcia, October 2011 3 / 52


<strong>Eclipse</strong> <strong>EMF</strong><br />

The <strong>Eclipse</strong> <strong>Modeling</strong> Framework (<strong>EMF</strong>) is a powerful framework and<br />

code generation facility for building Java applications based on simple<br />

model definitions. Designed to make modeling practical and useful to the<br />

mainstream Java programmer, <strong>EMF</strong> unifies three important technologies:<br />

Java, XML, and UML. Software is focused on manipulating data that can<br />

be modeled, hence, models drive software development. This refcard will<br />

get you started with the <strong>Eclipse</strong> <strong>Modeling</strong> Framework.<br />

Essential <strong>EMF</strong>. Ed Merks & James Sugrue<br />

Diego Sevilla Ruiz (DITEC Facultad de Informática) <strong>Eclipse</strong> <strong>Modeling</strong> <strong>Framewok</strong> (<strong>EMF</strong>) Murcia, October 2011 4 / 52


<strong>Eclipse</strong> <strong>EMF</strong> (ii)<br />

Cohesive set of tools to support the model-based development<br />

(MDE) primarily in Java<br />

Defines a framework to easily describe relationships between data<br />

structures and transform the into language programming artifacts<br />

Define una equivalencia entre XSchema, (Meta)Modelo, UML y<br />

código Java anotado<br />

Provides a graphical editor for models<br />

Provides tools to extract information from programs and turn them<br />

into models (T2M), to generate executable code from models (M2T)<br />

and to do model transformations (M2M)<br />

Diego Sevilla Ruiz (DITEC Facultad de Informática) <strong>Eclipse</strong> <strong>Modeling</strong> <strong>Framewok</strong> (<strong>EMF</strong>) Murcia, October 2011 5 / 52


Contents<br />

1 Introduction<br />

2 Modelado y metamodelado<br />

3 Ecore<br />

Metamodelo<br />

Metamodelos Ecore<br />

<strong>EMF</strong> y Ecore en <strong>Eclipse</strong><br />

4 Generación del código del modelo<br />

Java: GenModel<br />

C++: <strong>EMF</strong>4CPP<br />

5 Manejo de Modelos y Metamodelos<br />

Java<br />

C++<br />

Diego Sevilla Ruiz (DITEC Facultad de Informática) <strong>Eclipse</strong> <strong>Modeling</strong> <strong>Framewok</strong> (<strong>EMF</strong>) Murcia, October 2011 6 / 52


<strong>Modeling</strong> and metamodeling<br />

Un modelo:<br />

It is an abstract representation of a domain<br />

Captures the important elements and their relationships<br />

Los elementos de representación dependen del dominio<br />

Por ejemplo, en UML:<br />

Se representa el problema con clases y relaciones<br />

Se utilizan elementos gráficos para mostrarlos<br />

Diego Sevilla Ruiz (DITEC Facultad de Informática) <strong>Eclipse</strong> <strong>Modeling</strong> <strong>Framewok</strong> (<strong>EMF</strong>) Murcia, October 2011 7 / 52


Modelado y metamodelado (ii)<br />

Un metamodelo:<br />

Describe las características de los modelos en sí, y de los elementos<br />

que lo componen<br />

Por ejemplo, cualquier modelo UML contiene:<br />

Clases<br />

Atributos<br />

Operaciones<br />

Relaciones<br />

Herencia<br />

¿Dónde se describe las características de cada elemento estructural<br />

del modelo?<br />

Diego Sevilla Ruiz (DITEC Facultad de Informática) <strong>Eclipse</strong> <strong>Modeling</strong> <strong>Framewok</strong> (<strong>EMF</strong>) Murcia, October 2011 8 / 52


Modelado y metamodelado (iii) – MOF<br />

Diego Sevilla Ruiz (DITEC Facultad de Informática) <strong>Eclipse</strong> <strong>Modeling</strong> <strong>Framewok</strong> (<strong>EMF</strong>) Murcia, October 2011 9 / 52


Contents<br />

1 Introduction<br />

2 Modelado y metamodelado<br />

3 Ecore<br />

Metamodelo<br />

Metamodelos Ecore<br />

<strong>EMF</strong> y Ecore en <strong>Eclipse</strong><br />

4 Generación del código del modelo<br />

Java: GenModel<br />

C++: <strong>EMF</strong>4CPP<br />

5 Manejo de Modelos y Metamodelos<br />

Java<br />

C++<br />

Diego Sevilla Ruiz (DITEC Facultad de Informática) <strong>Eclipse</strong> <strong>Modeling</strong> <strong>Framewok</strong> (<strong>EMF</strong>) Murcia, October 2011 10 / 52


Ecore<br />

Es equivalente a MOF (EMOF)<br />

Especifica las características de las clases (EClass), sus<br />

características estructurales (EStructuralFeatures), atributos,<br />

operaciones, relaciones (herencia, referencia).<br />

Orientado a Java:<br />

Permite especificar tipos de datos básicos (Java)<br />

No permite el soporte de C++ (directamente). P. ej. no permite<br />

especificar la siferencia entre const o no, punteros, etc.<br />

Diego Sevilla Ruiz (DITEC Facultad de Informática) <strong>Eclipse</strong> <strong>Modeling</strong> <strong>Framewok</strong> (<strong>EMF</strong>) Murcia, October 2011 11 / 52


Diego Sevilla Ruiz (DITEC Facultad de Informática) <strong>Eclipse</strong> <strong>Modeling</strong> <strong>Framewok</strong> (<strong>EMF</strong>) Murcia, October 2011 12 / 52


Metamodelo: Discusión<br />

Nota: Se describen las características de los elementos del modelo<br />

de datos<br />

El elemento aglutinador (raíz) es el paquete (EPackage)<br />

El paquete contiene físicamente a sus elementos (especificación de<br />

containment)<br />

Los paquetes pueden estar contenidos en otros paquetes<br />

Hay una factoría (EFactory) por paquete que permite la creación de<br />

los elementos del modelo<br />

Las construcciones que describen a un conjunto de elementos<br />

(instancias) son clasificadores (EClassifiers): EClass y EDataType<br />

Diego Sevilla Ruiz (DITEC Facultad de Informática) <strong>Eclipse</strong> <strong>Modeling</strong> <strong>Framewok</strong> (<strong>EMF</strong>) Murcia, October 2011 13 / 52


Metamodelo: Discusión (ii)<br />

Las EClasses tienen superclases y están compuestas por<br />

características estructurales (EStructuralFeatures: EReference y<br />

EAttribute).<br />

Tanto las EReferences como los EAttributes pueden estar dotados<br />

de multiplicidad<br />

Los EDataTypes modelan tipos básicos o indivisibles del modelo de<br />

datos<br />

Los EReferences pueden estar contenidos (containment, no tienen<br />

entidad propia) o ser referencias estrictamente (punteros)<br />

Las Operations modelan operaciones del interfaz (aunque no se<br />

provee implementación para ellas)<br />

Todos los elementos heredan de ENamedElement (tienen nombre), y<br />

de EModelElement (elemento del modelo)<br />

Todo elemento del modelo puede tener asociadas anotaciones<br />

(EAnnotation): pares nombre/valor para especificaciones extra (p. ej.<br />

restricciones OCL ó cadenas de documentación)<br />

Diego Sevilla Ruiz (DITEC Facultad de Informática) <strong>Eclipse</strong> <strong>Modeling</strong> <strong>Framewok</strong> (<strong>EMF</strong>) Murcia, October 2011 14 / 52


<strong>EMF</strong> – Tipos de datos (Datatypes)<br />

Diego Sevilla Ruiz (DITEC Facultad de Informática) <strong>Eclipse</strong> <strong>Modeling</strong> <strong>Framewok</strong> (<strong>EMF</strong>) Murcia, October 2011 15 / 52


<strong>EMF</strong> – Metamodelos Ecore<br />

Diego Sevilla Ruiz (DITEC Facultad de Informática) <strong>Eclipse</strong> <strong>Modeling</strong> <strong>Framewok</strong> (<strong>EMF</strong>) Murcia, October 2011 16 / 52


Metamodelo: Discusión<br />

Nota: Se describen las características de cada clase (es una<br />

instancia del metamodelo de Ecore)<br />

Clasificadores del paquete<br />

Clases<br />

StructuralFeatures de las clases (EAttribtutes, EReferences,<br />

etc.)<br />

La clase Node tiene un atributo y dos referencias<br />

Los atributos sólo pueden ser EDataTypes, y siempre son contenidos<br />

La referencia children es contenida, mientras que parent es un<br />

«puntero»<br />

Nótese también la referencia eOpposite<br />

La raíz así se convierte en un contenedor para todo el modelo<br />

Diego Sevilla Ruiz (DITEC Facultad de Informática) <strong>Eclipse</strong> <strong>Modeling</strong> <strong>Framewok</strong> (<strong>EMF</strong>) Murcia, October 2011 17 / 52


<strong>EMF</strong> – Instancia de metamodelo Tree<br />

Diego Sevilla Ruiz (DITEC Facultad de Informática) <strong>Eclipse</strong> <strong>Modeling</strong> <strong>Framewok</strong> (<strong>EMF</strong>) Murcia, October 2011 18 / 52


Modelo (instancia): Discusión<br />

Nota: Se describen las instancias de los datos, organizados según el<br />

metamodelo<br />

Varias instancias de las clases<br />

Contienen los campos rellenos, lo que incluye los<br />

StructuralFeatures de las clases (EAttribtutes, EReferences,<br />

etc.)<br />

Los campos referencia opuestos (parent) se rellenan automáticamente<br />

(son relaciones conectadas, todo directo tiene su opuesto)<br />

Gracias al metamodelo, podemos recorrer la estructura siguiendo su<br />

semántica<br />

es decir, obteniendo el «Label» a través del método getLabel() de un<br />

nodo<br />

se puede seguir por los hijos con getChildren()<br />

(se verá después)<br />

Diego Sevilla Ruiz (DITEC Facultad de Informática) <strong>Eclipse</strong> <strong>Modeling</strong> <strong>Framewok</strong> (<strong>EMF</strong>) Murcia, October 2011 19 / 52


XMI: Serializado XML<br />

1 < tree:Node xmi:version =" 2.0 "<br />

xmlns:xmi =" http: // www . omg . org / XMI "<br />

3 xmlns:tree =" http: // www . example . org / tree "<br />

label =" root "><br />

5 < children label ="A"><br />

< children label ="X"/><br />

7 <br />

< children label ="B"><br />

9 < children label ="Y"/><br />

<br />

11 <br />

Notas:<br />

Sigue la estructura jerárquica de contenido<br />

Las referencias se extraen del metamodelo y de la estructura<br />

Aseguran la integridad referencial gracias al metamodelo<br />

El metamodelo también se serializa a XMI (también es un modelo)<br />

Diego Sevilla Ruiz (DITEC Facultad de Informática) <strong>Eclipse</strong> <strong>Modeling</strong> <strong>Framewok</strong> (<strong>EMF</strong>) Murcia, October 2011 20 / 52


El editor de Metamodelos – Crear proyecto<br />

New → Other... → Empty <strong>EMF</strong> Project<br />

Diego Sevilla Ruiz (DITEC Facultad de Informática) <strong>Eclipse</strong> <strong>Modeling</strong> <strong>Framewok</strong> (<strong>EMF</strong>) Murcia, October 2011 21 / 52


El editor de Metamodelos<br />

Nombre: es.um.emf.test<br />

Diego Sevilla Ruiz (DITEC Facultad de Informática) <strong>Eclipse</strong> <strong>Modeling</strong> <strong>Framewok</strong> (<strong>EMF</strong>) Murcia, October 2011 22 / 52


El editor de Metamodelos<br />

El directorio src contiene el código<br />

El directorio model contiene modelos y metamodelos<br />

Diego Sevilla Ruiz (DITEC Facultad de Informática) <strong>Eclipse</strong> <strong>Modeling</strong> <strong>Framewok</strong> (<strong>EMF</strong>) Murcia, October 2011 23 / 52


Crear metamodelo Ecore Tree (i)<br />

Dir. model Click derecho → New... → Ecore <strong>Modeling</strong> Framework →<br />

Ecore model<br />

Diego Sevilla Ruiz (DITEC Facultad de Informática) <strong>Eclipse</strong> <strong>Modeling</strong> <strong>Framewok</strong> (<strong>EMF</strong>) Murcia, October 2011 24 / 52


Crear metamodelo Ecore Tree (ii)<br />

Diego Sevilla Ruiz (DITEC Facultad de Informática) <strong>Eclipse</strong> <strong>Modeling</strong> <strong>Framewok</strong> (<strong>EMF</strong>) Murcia, October 2011 25 / 52


Editor gráfico del metamodelo<br />

Tree.ecore Click derecho → Initialize Ecore Diagram file...<br />

(Tree.ecorediag)<br />

Diego Sevilla Ruiz (DITEC Facultad de Informática) <strong>Eclipse</strong> <strong>Modeling</strong> <strong>Framewok</strong> (<strong>EMF</strong>) Murcia, October 2011 26 / 52


Editor<br />

Diego Sevilla Ruiz (DITEC Facultad de Informática) <strong>Eclipse</strong> <strong>Modeling</strong> <strong>Framewok</strong> (<strong>EMF</strong>) Murcia, October 2011 27 / 52


Editor gráfico – Paleta<br />

Diego Sevilla Ruiz (DITEC Facultad de Informática) <strong>Eclipse</strong> <strong>Modeling</strong> <strong>Framewok</strong> (<strong>EMF</strong>) Murcia, October 2011 28 / 52


Propiedades del nodo raíz<br />

Ns Prefix – Se utiliza como prefijo de namespace en el XMI<br />

Ns URI – Identifica al metamodelo de forma unívoca universalmente<br />

El metamodelo se puede registrar (y encontrar) en <strong>Eclipse</strong> con ese<br />

nombre único<br />

Diego Sevilla Ruiz (DITEC Facultad de Informática) <strong>Eclipse</strong> <strong>Modeling</strong> <strong>Framewok</strong> (<strong>EMF</strong>) Murcia, October 2011 29 / 52


Editor de Ecore no visual<br />

Tree.ecore → Botón derecho → Open With... → Simple Reflective<br />

Ecore Editor<br />

Diego Sevilla Ruiz (DITEC Facultad de Informática) <strong>Eclipse</strong> <strong>Modeling</strong> <strong>Framewok</strong> (<strong>EMF</strong>) Murcia, October 2011 30 / 52


Creando instancias dinámicas<br />

El metamodelo describe qué<br />

elementos van a existir en el<br />

modelo<br />

Podemos crear un modelo como<br />

una instancia del metamodelo<br />

Para cada clase del<br />

metamodelo (p. ej. Node)<br />

tendremos un conjunto de<br />

instancias (p. ej. A, B, X, etc.)<br />

iego Sevilla Ruiz (DITEC Facultad de Informática) <strong>Eclipse</strong> <strong>Modeling</strong> <strong>Framewok</strong> (<strong>EMF</strong>) Murcia, October 2011 31 / 52


Creando instancias dinámicas (ii)<br />

Node → Botón derecho → New<br />

child...<br />

Se rellenan las propiedades y<br />

las referencias<br />

Las referencias inversas se<br />

rellenan automáticamente<br />

Nótese la referencia al<br />

metamodelo<br />

El fichero es un fichero .xmi<br />

iego Sevilla Ruiz (DITEC Facultad de Informática) <strong>Eclipse</strong> <strong>Modeling</strong> <strong>Framewok</strong> (<strong>EMF</strong>) Murcia, October 2011 32 / 52


Contents<br />

1 Introduction<br />

2 Modelado y metamodelado<br />

3 Ecore<br />

Metamodelo<br />

Metamodelos Ecore<br />

<strong>EMF</strong> y Ecore en <strong>Eclipse</strong><br />

4 Generación del código del modelo<br />

Java: GenModel<br />

C++: <strong>EMF</strong>4CPP<br />

5 Manejo de Modelos y Metamodelos<br />

Java<br />

C++<br />

Diego Sevilla Ruiz (DITEC Facultad de Informática) <strong>Eclipse</strong> <strong>Modeling</strong> <strong>Framewok</strong> (<strong>EMF</strong>) Murcia, October 2011 33 / 52


Generación del código del modelo<br />

Intuitivamente, una EClass del metamodelo se transformará en una<br />

clase del lenguaje de programación<br />

Las instancias de esas clases serán el modelo en tiempo de<br />

ejecución de los datos de nuestra aplicación<br />

Diego Sevilla Ruiz (DITEC Facultad de Informática) <strong>Eclipse</strong> <strong>Modeling</strong> <strong>Framewok</strong> (<strong>EMF</strong>) Murcia, October 2011 34 / 52


Genmodel<br />

Diego Sevilla Ruiz (DITEC Facultad de Informática) <strong>Eclipse</strong> <strong>Modeling</strong> <strong>Framewok</strong> (<strong>EMF</strong>) Murcia, October 2011 35 / 52


Genmodel<br />

Tree.ecore → Botón derecho → New... → <strong>Eclipse</strong> <strong>Modeling</strong> Tools →<br />

Ecore Generator model<br />

Tree.genmodel<br />

Next → Seleccionar<br />

Ecore Model<br />

Nótese las<br />

posibilidades:<br />

Java anotado<br />

XML Schema<br />

Ecore...<br />

Next → Seleccionar el<br />

modelo origen<br />

Tree.ecore → Load<br />

Diego Sevilla Ruiz (DITEC Facultad de Informática) <strong>Eclipse</strong> <strong>Modeling</strong> <strong>Framewok</strong> (<strong>EMF</strong>) Murcia, October 2011 36 / 52


Genmodel – Root packages<br />

Diego Sevilla Ruiz (DITEC Facultad de Informática) <strong>Eclipse</strong> <strong>Modeling</strong> <strong>Framewok</strong> (<strong>EMF</strong>) Murcia, October 2011 37 / 52


Genmodel en XMI<br />

1 < genPackages prefix =" Tree " disposableProviderFactory ="<br />

true " ecorePackage =" Tree . ecore #/"><br />

< genClasses ecoreClass =" Tree . ecore #// Node "><br />

3 < genFeatures createChild =" false " ecoreFeature ="<br />

ecore:EAttribute Tree . ecore #// Node / label "/><br />

< genFeatures property =" None " notify =" false "<br />

createChild =" false " ecoreFeature ="<br />

ecore:EReference Tree . ecore #// Node / parent "/><br />

5 < genFeatures property =" None " children =" true "<br />

createChild =" true " ecoreFeature ="<br />

ecore:EReference Tree . ecore #// Node / children "<br />

/><br />

...<br />

Guarda los datos y parámetros necesarios para emprender la<br />

generación de código<br />

Nótese las referencias al metamodelo Tree.ecore (URNs)<br />

Conocido como decorador del Ecore (añade características a éste)<br />

Diego Sevilla Ruiz (DITEC Facultad de Informática) <strong>Eclipse</strong> <strong>Modeling</strong> <strong>Framewok</strong> (<strong>EMF</strong>) Murcia, October 2011 38 / 52


Generate Model Code<br />

Propiedades de Tree: Base Package → es.um.emf.test<br />

Tree.genmodel/Tree, Botón derecho → Generate Model Code<br />

Diego Sevilla Ruiz (DITEC Facultad de Informática) <strong>Eclipse</strong> <strong>Modeling</strong> <strong>Framewok</strong> (<strong>EMF</strong>) Murcia, October 2011 39 / 52


Model Code<br />

Paquete es.um.emf.test.tree:<br />

Interfaz puro<br />

Paquete<br />

es.um.emf.test.tree.impl:<br />

Implementación<br />

Paquete<br />

es.um.emf.test.tree.util:<br />

Utilidades<br />

iego Sevilla Ruiz (DITEC Facultad de Informática) <strong>Eclipse</strong> <strong>Modeling</strong> <strong>Framewok</strong> (<strong>EMF</strong>) Murcia, October 2011 40 / 52


Model Code – Package<br />

2<br />

package es.um.emf . test . tree ;<br />

public interface TreePackage extends EPackage {<br />

4 String eNAME = " tree ";<br />

String eNS_URI = " urn :es.um.emf . test . tree ";<br />

6 String eNS_PREFIX = "es.um.emf . test . tree ";<br />

8 TreePackage eINSTANCE = tree . impl .<br />

TreePackageImpl . init ();<br />

10 // Singletons ( Ecore metamodel elements )<br />

EClass getNode ();<br />

12 EAttribute getNode_Label ();<br />

EReference getNode_Parent ();<br />

14 EReference getNode_Children ();<br />

16 TreeFactory getTreeFactory ();<br />

} // TreePackage<br />

Diego Sevilla Ruiz (DITEC Facultad de Informática) <strong>Eclipse</strong> <strong>Modeling</strong> <strong>Framewok</strong> (<strong>EMF</strong>) Murcia, October 2011 41 / 52


Model Code – Factory<br />

1 package es.um.emf . test . tree ;<br />

3 public interface TreeFactory extends EFactory {<br />

5 // Factory Singleton<br />

TreeFactory eINSTANCE = tree . impl .<br />

TreeFactoryImpl . init ();<br />

7<br />

// Create new nodes ( instances ) of the model<br />

Nodes<br />

9 Node createNode ();<br />

11 TreePackage getTreePackage ();<br />

13 } // TreeFactory<br />

Diego Sevilla Ruiz (DITEC Facultad de Informática) <strong>Eclipse</strong> <strong>Modeling</strong> <strong>Framewok</strong> (<strong>EMF</strong>) Murcia, October 2011 42 / 52


Model Code – Node<br />

1 package es.um.emf . test . tree ;<br />

public interface Node extends EObject {<br />

3<br />

// Label get / set<br />

5 String getLabel ();<br />

void setLabel ( String value );<br />

7<br />

// Parent get / set<br />

9 Node getParent ();<br />

void setParent ( Node value );<br />

11<br />

// Children<br />

13 EList getChildren ();<br />

15 } // Node<br />

EList permite también añadir elementos a través de su<br />

método add(): node.getChildren().add(x)<br />

Diego Sevilla Ruiz (DITEC Facultad de Informática) <strong>Eclipse</strong> <strong>Modeling</strong> <strong>Framewok</strong> (<strong>EMF</strong>) Murcia, October 2011 43 / 52


C++<br />

Con el plugin org.csu.emf4cpp.plugin instalado:<br />

Diego Sevilla Ruiz (DITEC Facultad de Informática) <strong>Eclipse</strong> <strong>Modeling</strong> <strong>Framewok</strong> (<strong>EMF</strong>) Murcia, October 2011 44 / 52


C++<br />

Si no se elige wizard el código se<br />

genera en el subdirectorio src-gen<br />

Similar a la estructura en Java<br />

Se generan utilidades de compilación<br />

con CMake (CMakeLists.txt,<br />

tree.cmake)<br />

Paquete tree dentro del subdirectorio<br />

tree<br />

.hpp y .cpp<br />

tree.hpp – Incluir el modelo en<br />

programas C++<br />

tree/Node.{hpp,cpp} – Clase Node<br />

También Paquete y Factoría<br />

Diego Sevilla Ruiz (DITEC Facultad de Informática) <strong>Eclipse</strong> <strong>Modeling</strong> <strong>Framewok</strong> (<strong>EMF</strong>) Murcia, October 2011 45 / 52


C++ Model Code – Package<br />

1 namespace tree<br />

{<br />

3 class TreePackage : public virtual :: ecore :: EPackage<br />

{<br />

5 public :<br />

static TreePackage_ptr _instance ();<br />

7<br />

// EClassifiers methods<br />

9 virtual :: ecore :: EClass_ptr getNode ();<br />

11 // EStructuralFeatures methods<br />

virtual :: ecore :: EAttribute_ptr getNode__label ();<br />

13 virtual :: ecore :: EReference_ptr getNode__parent ();<br />

virtual :: ecore :: EReference_ptr getNode__children ();<br />

15<br />

protected :<br />

17 static std :: auto_ptr < TreePackage > s_instance ;<br />

19 TreePackage ();<br />

21 // EClass instances<br />

:: ecore :: EClass_ptr m_NodeEClass ;<br />

23<br />

// EStructuralFeatures instances<br />

25 :: ecore :: EAttribute_ptr m_Node__label ;<br />

:: ecore :: EReference_ptr m_Node__parent ;<br />

27 :: ecore :: EReference_ptr m_Node__children ;<br />

};<br />

29 } // tree<br />

Diego Sevilla Ruiz (DITEC Facultad de Informática) <strong>Eclipse</strong> <strong>Modeling</strong> <strong>Framewok</strong> (<strong>EMF</strong>) Murcia, October 2011 46 / 52


C++ Model Code – Factory<br />

1 namespace tree<br />

{<br />

3 class TreeFactory : public virtual :: ecore ::<br />

EFactory<br />

{<br />

5 public :<br />

static TreeFactory_ptr _instance ();<br />

7<br />

9<br />

virtual Node_ptr createNode ();<br />

protected :<br />

11 static std :: auto_ptr < TreeFactory > s_instance<br />

;<br />

13 TreeFactory ();<br />

};<br />

15 } // tree<br />

Diego Sevilla Ruiz (DITEC Facultad de Informática) <strong>Eclipse</strong> <strong>Modeling</strong> <strong>Framewok</strong> (<strong>EMF</strong>) Murcia, October 2011 47 / 52


C++ Model Code – Node<br />

1 namespace tree<br />

{<br />

3 class Node : public virtual :: ecore :: EObject<br />

{<br />

5 public :<br />

Node ();<br />

7 virtual ~ Node ();<br />

9 virtual void _initialize ();<br />

11 // Attributes<br />

:: ecore :: EString const & getLabel () const ;<br />

13 void setLabel (:: ecore :: EString const & _label );<br />

15 // References<br />

:: tree :: Node_ptr getParent ();<br />

17 void setParent (:: tree :: Node_ptr _parent );<br />

19 :: ecorecpp :: mapping :: EList < :: tree :: Node >& getChildren ();<br />

protected :<br />

21 // Attributes<br />

:: ecore :: EString m_label ;<br />

23 // References<br />

:: tree :: Node_ptr m_parent ;<br />

25 :: ecorecpp :: mapping :: out_ptr < :: ecorecpp :: mapping :: EList < :: tree :: Node ><br />

><br />

m_children ;<br />

27 };<br />

} // tree<br />

Diego Sevilla Ruiz (DITEC Facultad de Informática) <strong>Eclipse</strong> <strong>Modeling</strong> <strong>Framewok</strong> (<strong>EMF</strong>) Murcia, October 2011 48 / 52


Contents<br />

1 Introduction<br />

2 Modelado y metamodelado<br />

3 Ecore<br />

Metamodelo<br />

Metamodelos Ecore<br />

<strong>EMF</strong> y Ecore en <strong>Eclipse</strong><br />

4 Generación del código del modelo<br />

Java: GenModel<br />

C++: <strong>EMF</strong>4CPP<br />

5 Manejo de Modelos y Metamodelos<br />

Java<br />

C++<br />

Diego Sevilla Ruiz (DITEC Facultad de Informática) <strong>Eclipse</strong> <strong>Modeling</strong> <strong>Framewok</strong> (<strong>EMF</strong>) Murcia, October 2011 49 / 52


Crear un modelo programáticamente – Java<br />

TreeFactory tree = TreeFactory . eINSTANCE ;<br />

2 Node root = tree . createNode ();<br />

root . setLabel (" Root ");<br />

4 Node a = tree . createNode ();<br />

a. setLabel ("A");<br />

6 root . getChildren ().add (a);<br />

Node x = tree . createNode ();<br />

8 x. setLabel ("X");<br />

a. getChildren ().add (x);<br />

10 Node b = tree . createNode ();<br />

b. setLabel ("B");<br />

12 root . getChildren ().add (b);<br />

Node y = tree . createNode ();<br />

14 y. setLabel ("Y");<br />

b. getChildren ().add (y);<br />

Diego Sevilla Ruiz (DITEC Facultad de Informática) <strong>Eclipse</strong> <strong>Modeling</strong> <strong>Framewok</strong> (<strong>EMF</strong>) Murcia, October 2011 50 / 52


C++<br />

1 using namespace tree ;<br />

3 TreeFactory_ptr treeFactory = TreeFactory :: _instance ();<br />

5 // Create a Node<br />

std :: auto_ptr root ( treeFactory -> createNode ());<br />

7 root -> setLabel (" Root ");<br />

9 // Create node A<br />

Node_ptr a = treeFactory -> createNode ();<br />

11 catSAES -> setLabel ("A");<br />

root -> getChildren (). push_back (a);<br />

13<br />

Node_ptr x = treeFactory -> createNode ();<br />

15 catSAES -> setLabel ("X");<br />

a-> getChildren (). push_back (x);<br />

17<br />

// Create node B<br />

19 Node_ptr b = treeFactory -> createNode ();<br />

catSAES -> setLabel ("B");<br />

21 root -> getChildren (). push_back (b);<br />

23 Node_ptr y = treeFactory -> createNode ();<br />

catSAES -> setLabel ("Y");<br />

25 b-> getChildren (). push_back (y);<br />

27 // Initialize the model<br />

umu -> _initialize ();<br />

29<br />

// ( model is deleted automatically )<br />

Diego Sevilla Ruiz (DITEC Facultad de Informática) <strong>Eclipse</strong> <strong>Modeling</strong> <strong>Framewok</strong> (<strong>EMF</strong>) Murcia, October 2011 51 / 52


Referencias<br />

D. Steinberg, F. Budinsky, M. Paternostro, Ed Merks<br />

<strong>EMF</strong>: <strong>Eclipse</strong> <strong>Modeling</strong> Framework, 2nd Edition.<br />

Addison-Wesley Professional, 2009<br />

Ed Merks, J. Sugrue<br />

Essential <strong>EMF</strong> (<strong>Eclipse</strong>Con’09).<br />

http://cheat-sheets.biz/saved-copy/rc039-010d-emf.pdf<br />

M. Paternostro, K. Hussey<br />

Building RESTful Java Applications with <strong>EMF</strong>.<br />

http://www.slideshare.net/kenn.hussey/<br />

building-restful-java-applications-with-emf<br />

A. Senac, D. Sevilla<br />

<strong>EMF</strong>4CPP.<br />

http://www.catedrasaes.org/trac/wiki/<strong>EMF</strong>4CPP<br />

Diego Sevilla Ruiz (DITEC Facultad de Informática) <strong>Eclipse</strong> <strong>Modeling</strong> <strong>Framewok</strong> (<strong>EMF</strong>) Murcia, October 2011 52 / 52

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!