Eclipse Modeling Framework (EMF), representa el núcleo de la plataforma Eclipse para el desarrollo dirigido por modelos. EMF es un framework muy útil para el desarrollo de metamodelos, mediante una sintaxis abstracta, y también permite generar automáticamente clases de implementación en código Java para los elementos de los metamodelos.
En el presente artículo, inicialmente definiremos al metamodelo y al metamodelado, luego analizaremos el framework EMF, posteriormente estudiaremos las herramientas para construir metamodelos como Ecore y finalmente mostraremos un tutorial para la creación y prueba de un caso de estudio.
Metamodelo
Un metamodelo es un modelo que define un lenguaje para expresar modelos, en otras palabras un metamodelo es un Modelo de Modelos. Un modelo, por otro lado, es la abstracción de un fenómeno del mundo real, por lo tanto un metamodelo no es nada más que una abstracción de mayor nivel. Un modelo está conformado por su metamodelo de la misma manera que un programa de computación está conformado por la gramática del lenguaje de programación en el cual está escrito.
El metamodelado nos servirá para realizar el análisis, construcción y desarrollo de reglas, marcos de trabajo, restricciones, modelos y teoría aplicables para el modelado de un tipo predefinido de problemas. El metamodelado será la construcción de conceptos de un determinado dominio que típicamente involucra el estudio de salidas y entradas relacionadas estrechamente con su respectivo metamodelo.
El metamodelo de un lenguaje es una descripción de todos los conceptos que pueden usarse en el mismo. Por ejemplo, los conceptos de package, clase, atributo y operaciones aparecen en UML; los conceptos de métodos, constructores e interfaces en JAVA; los conceptos de tabla, columna y clave primaria son parte de SQL.
Cada elemento de un modelo es una instancia de una metaclase en el metamodelo. Una clase define a sus objetos y una metaclase define a los elementos del modelo. Como ejemplo, la siguiente figura representa a una porción del Metamodelo UML.
Porción de Metamodelo UML.
En el siguiente diagrama se muestra el metamodelo para representar al lenguaje SQL.
Metamodelo SQL
Por otra parte, a los metamodelos se les puede adicionar una serie de reglas de validación o restricciones conocidas como "constraints", los constraints se los expresa utilizando el lenguaje OCL.
Herramientas de Modelado en Eclipse
El Eclipse Modeling Framework más conocido como EMF, es el framework provisto por Eclipse para la creación de modelos y metamodelos, con facilidades para la generación automática de código y para la construcción de herramientas basadas en modelos.
EMF permite generar automáticamente clases Java que implementan elementos de nuestros modelos, además de clases adaptadoras que permiten visualizar y editar un modelo.
Las principales funcionalidades de EMF son:
- Diseñar metamodelos Ecore, con dos tipos de editores:
- Editor basado en una estructura de tipo árbol
- Editor visual, similar a un diagrama de clases UML
- Construir editores de modelos basados en una estructura de tipo árbol, EMF permite generar clases Java que permiten soportar al metamodelo y clases para testeo con JUnit.
- EMF, permite definir metamodelos basados en Ecore, en este framework los modelos pueden ser creados y modificados a partir de un metamodelo Ecore, también existe soporte para manejar la persistencia de modelos mediante serializacion XMI y además de un API para reflexión de objetos.
- EMF.Edit, este framework permite generar clases Java para editar un modelo EMF y consiste en:
- Clases que soportan edición de propiedades, proveedores de contenido (content and label provider), edición en Hojas de Propiedad (property sheets).
- Un framework de comandos para la construcción de un modelo EMF que incluye operaciones de “undo” y “redo”.
- EMF.Codegen, esta herramienta permite la generación de un editor completo a partir de un metamodelo Ecore.
Metamodelos Ecore
Ecore es el framework propuesto por la comunidad Eclipse que es una versión simplificada de MOF. Los metamodelos Ecore se almacenan en ficheros XMI con extensión .ecore.
Componentes de Ecore
Los componentes de Ecore se resumen en el siguiente diagrama:
Diagrama de componentes de Ecore
Los principales componentes de Ecore son los siguientes:
- EPackage: es un componente que permite organizar clases y tipos de datos.
- EClass: permite definir conceptos en el metamodelo
- EReference: permite definir asociación entre conceptos
- EAttribute: permite definir propiedades de los conceptos
- EDataType: define un tipo para un atributo como por ejemplo EString, EInt, EDouble, etc..
Los componentes Ecore tienen las siguientes relaciones, atributos y operaciones:
Diagrama Ecore de relaciones, atributos y operaciones.
Creación de un metamodelo Ecore
Para la creación de un metamodelo Ecore, utilizaremos el IDE Elipse Luna Modeling Tool, en el cual realizaremos las siguientes tareas:
- Creación de un proyecto de modelado EMF
- Diseño del metamodelo Ecore
- Generación de código Java, para el editor del metamodelo
- Validación y prueba de una instancia del metamodelo.
Metamodelo ejemplo
En este tutorial crearemos un metamodelo para representar una Maquina de Estado UML simple. Un diagrama de máquina de estado modela el comportamiento de un objeto, especificando la secuencia de eventos que la misma atraviesa durante su tiempo de vida en respuesta a dichos eventos.
Como ejemplo, el siguiente diagrama de máquina de estado muestra los estados que una puerta atraviesa durante su tiempo de vida.
La puerta puede estar en uno de tres estados: “Opened” (Abierta), “Closed” (Cerrada) o “Locked” (Bloqueada). Puede responder a cuatro eventos: Abrir, Cerrar, Bloquear y Desbloquear. Tener en cuenta que no todos los eventos son válidos en todos los estados, por ejemplo, si una puerta esta abierta, no se puede bloquear hasta que esté cerrada. También se debe tener en cuenta que una transición de estado puede tener una o más condiciones de guarda adjuntas. Si la puerta está abierta, esta solo puede responder al evento “Closed” si la condición doorWay->isEmpty es verdadera.
Los elementos que se modelaran de la máquina de estados son:
- Estados
- Estados Inicial y Final
- Transiciones
- Triggers de Transiciones
Creación del proyecto de Modelado
El primer paso es la creación de un proyecto de modelado vacío en el espacio de trabajo de Eclipse (Workspace). En el IDE seleccione las opciones “File” → “New” → “Other…” y elija “Eclipse Modeling Framework → Empty EMF Project”.
Presione “Next”, ingrese el nombre del proyecto “org.mda.ejemplo.StateMachine”, y luego presione “Finish”:
La parte esencial del proyecto de modelado es el modelo en sí, definido en formato Ecore. Presione click derecho en el folder del modelo y luego seleccione las opciones “New” → “Other…” → “Eclipse Modeling Framework → Ecore Model” → “Next”, luego ingrese el nombre del archivo Ecore “Statemachine.ecore”.
Presione “Finish” para crear el modelo. Esta acción abrirá el editor Ecore por defecto, el mismo permite definir el modelo en un árbol de elementos. Existen opciones adicionales para editar modelos Ecore que incluyen un editor gráfico, editor de texto, editores con anotaciones Java e incluso la importación de archivos de herramientas UML. Por el momento usaremos el editor por defecto y posteriormente habilitaremos el editor gráfico.
En el editor en árbol, usted puede crear y eliminar elementos del modelo así como la modificación de la estructura del modelo mediante operaciones drag-and-drop. Las propiedades de los elementos del modelo pueden ser modificadas en una segunda ventana la cual se abre presionando doble-click sobre el elemento raíz del modelo o presionando click-derecho → “Show Properties View”.
Ahora, definiremos el nombre y la propiedad URI del elemento “package” del modelo creado, utilizando la ventana de propiedades, escriba “Statemachine” en la propiedad “Name”, luego ingrese en la propiedad Ns Prefix: “org.mda.ejemplo.Statemachine” y en la propiedad Ns URI “http://org/mda/ejemplo/Statemachine”.
Para habilitar el editor gráfico del modelo, seleccione el archivo “Statemachine.ecore” del navegador, presione click-derecho y seleccione la opción “Initialize ecore_diagram diagram file”, ingrese el nombre del archivo del diagrama por defecto y presione “Finish”.
La acción habilitara el editor gráfico del modelo Ecore, con una paleta de herramientas al lado derecho que nos permite crear elementos de tipo EClass, EPackage, EAttribute, EOperation, EDataType, EEnum, EEnumLiteral, Asociation, Agregation, Generalization y otros.
Ahora, crearemos las siguientes clases, realizando operaciones drag-and-drop desde la paleta de herramientas al diagrama:
- La clase “Class”, permite definir la clase para la cual se elaborara la máquina de estados
- La clase “StatemachineUML”, es la clase principal de la máquina de estados, la cual contendrá estados y transiciones
- La clase “Declaration”, es una superclase de la cual se heredaran Estados y Transiciones
- Las clases “InitialState”, “FinalState” y “NormalState”, representan los estados de la máquina.
- La clase “Transition”, representa las transiciones de la máquina.
- La clase “TriggerEvent”, representa a los eventos que ejecutan una transición.
Como siguiente paso se definirán los atributos para las clases creadas, utilizando la opción “EAttribute” de la paleta de herramientas, realice una operación de drag-and-drop sobre una de las clases declaradas y escriba el nombre del atributo seguido de dos puntos y su tipo Ecore (por ejemplo “name : EString”), luego presione Enter, deje el diagrama de la siguiente manera:
Ahora definiremos las relaciones de herencia (“Generalization”), agregación (“Aggregation”) y asociación (“Association”) entre las clases.
Defina herencia (propiedad ESuperTypes) de “State” y “Transition” a “Declaration” y también de “InitialState”, “FinalState” y “NormalState” a “State”.
Defina una relación de agregación (clase EReference) de “StatemachineUML” a “Declaration”, ingrese el nombre de la relación como “elements” (propiedad “Name”), especifique la multiplicidad de la relación de 0 a muchos (propiedad “Upper Bound” a -1) ya que una máquina de estados puede contener muchos elementos declarativos (estados y transiciones), finalmente coloque la propiedad “Contaiment” a true.
Defina otra relación de agregación de “Transition” a “TriggerEvent”, coloque el nombre de la relación a “events”, especifique una relación de 0 a muchos ya que una transición puede ejecutar varios eventos, coloque la propiedad “Contaiment” a true.
Defina una relación de asociación desde “Transition” a “State”, la multiplicidad será de 0 a 1 y el nombre de la relación “source”.
Defina otra relación de asociación desde “Transition” a “State”, la multiplicidad será de 0 a 1 y el nombre de la relación “target”.
Finalmente defina una relación de agregación desde “StatemachineUML” a “Class”, la multiplicidad será de 0 a 1 y el nombre de la relación “class”, coloque la propiedad “Contaiment” a true.
Generación de Código Java
En este paso, generaremos las entidades desde el modelo Ecore, note que este proceso es iterativo, es decir que si se cambian, añaden o eliminan elementos del modelo uno puede regenerar las entidades nuevamente (opción “Reload…” del modelo generador).
Para generar las entidades, primero deberemos crear el modelo generador (“Generator Model”). Este modelo permite configurar varias propiedades antes de generar el código Java que permite manipular las entidades y crear un editor simple para el modelo. También podemos indicar que el código generado se crea como un proyecto Plugin de Eclipse con una serie que folders y paquetes Java.
Para crear el modelo generador, primeramente seleccione el archivo “Statemachine.ecore” del navegador, seleccione las opciones: File → “New” → “Other…” → “Eclipse Modeling Framework → EMF Generator Model” → “Next”, ingrese como nombre de archivo del modelo generador: Statemachine.genmodel.
Proceda con la siguiente página y seleccione “Ecore model” como el modelo a importar. Presione “Next”, si el modelo URI está vacío, presione “Browse Workspace…” y seleccione el modelo Statemachine.ecore de la carpeta “model”. Ingrese a la siguiente página y presione “Finish”.
En el nodo raíz del modelo generador, se pueden setear varias propiedades para generar el código Java. En todos los nodos del árbol del modelo generador se pueden setear propiedades para cada entidad a generar. Por ser la primera vez que generamos el código, utilizaremos los valores por defecto. EMF generara como máximo cuatro diferentes proyectos plug-in para el modelo indicado:
- Proyecto Model: este proyecto contiene todas las entidades, paquetes y clases de factoría que permiten crear objetos instanciados del modelo.
- Proyecto Edit: este proyecto contiene clases proveedoras (providers) para desplegar el modelo en una interfaz de usuario. Por ejemplo los providers ofrecen una etiqueta para cada elemento del modelo, los cuales pueden ser usados para desplegar una entidad mostrando un icono y su nombre.
- Proyecto Editor: este proyecto es un editor generado para crear y modificar instancias del modelo.
- Proyecto Test: contiene templetas que permiten escribir test de funcionalidad para el modelo.
Para generar estos plug-ins, presione click-derecho en el nodo raíz del modelo generador y seleccione la opción “Generate All”.
En el explorador de proyectos, deberán crearse los proyectos ya mencionados como muestra la siguiente figura:
Creación de un modelo ejemplo
Este paso consiste en crear un modelo ejemplo, para ello se ejecutara el proyecto plug-in, presione click-derecho en el proyecto que contiene el archivo Ecore y seleccione “Run as → Eclipse Application”. Esta opción ejecuta una nueva sesión del IDE Eclipse.
En la nueva sesión de IDE, crear un proyecto vacío seleccionando “File” → “New” → ”Other…” → “General” → “Project” coloque el nombre de StatemachineExample.
Presione click-derecho sobre el proyecto creado y seleccione “New” → “Other…” → “Example EMF Model Creation Wizards” → “Statemachine Model” → “Next” e ingrese “Puerta.statemachine” como nombre del modelo. Este archivo contendrá el modelo serializado en formato XMI.
Seleccione el objeto UML del modelo Ecore que representa al objeto de la máquina de estados, desde la cual se crearan los diferentes elementos del modelo, luego presione “Finish”.
El editor generado para manejar la instancia del modelo trabaja de forma similar al editor Ecore, los elementos del modelo pueden crearse presionando click-derecho y eligiendo las opciones “New child” o “New sibling”, mientras que los atributos pueden ser modificados desde la ventana de propiedades. A continuación se editara el modelo ejemplo del ciclo de vida de la Puerta, tal cual se muestra en el grafico del modelo ejemplo.
Resumen
El presente artículo introdujo al lector en el framework EMF, en el metamodelado con Ecore y mostró un caso práctico de estudio. Si bien los conceptos desarrollados son iniciales, nos sirven para introducirnos al mundo del MDA de forma práctica.
A manera de resumen podemos mencionar que EMF es un framework bastante amplio y es un proyecto que incluye nuevas tecnologías que amplían o complementan a EMF, como ser CDO, Compare, Model Query, Net4j, SDO, Teneo, EEF, Ecore Tools, etc.
Algunos recursos recomendados son:
- Eclipse Modeling Framework (EMF) – Tutorial de Lars Vogel
- Eclipse Modeling Framework (EMF) Eclipse Modeling Framework Technology (EMFT) de Juan Otero y Andres Quintana
- EMF Tutorial de Maximilian Koegel y Jonas Helming
Hasta la próxima…
Excelente mini-tutorial de MDE
ResponderEliminarcomo puedo convertir el codigo del Modelo a C++ utilizando Eclipse
ResponderEliminar