Eclipse Model Framework: cosa fina oiga

Eclipse, además de un IDE para Java fantástico, es también una plataforma para el desarrollo de aplicaciones. Estas o bien pueden ser plugins (como el que estoy haciendo yo), o aplicaciones RCP como pueden ser Cool Imaging Project, de unos compañeros que también están compitiendo en el CUSL (saludos!!). El caso es que al ser Eclipse al 99% modular, se presta a ser extendido. La Wikipedia tiene un artículo muy interesante sobre Eclipse, en developer.com hablan de su arquitectura, y en el libro The Java Developer's Guide To Eclipse (muy muy recomendable) hay muchísima más información. Como a veces lo más sencillo es una imagen, he tomado prestada una imagen de ese libro que es representativa de la arquitectura de Eclipse

Quizá el componente más usado de Eclipse es JDT, porque de un modo u otro todos los que desarrollamos sobre Eclipse lo utilizamos. Pero con la tendencia actual de ver a Eclipse como un framework de desarrollo de aplicaciones han aparecido proyectos alrededor que son muy interesantes, como por ejemplo BIRT, Mylyn, DTP... si, todo son siglas ;-)

Uno de estos componentes que me está siendo especialmente útil es EMF, que responde a Eclipse Modeling Framework Project. En plan rápido, EMF es un framework para el modelado y gemeración de código para construir herramientas y otras aplicaciones basadas en un modelo de datos estructurado. Desde la especificación de un modelo descrita en XMI, EMF proporciona herramientas y soporte para generar un conjunto de clases Java para el modelo, además de clases adapter para soportar la visualización y la edición del modelo. Como imagino que esta descripción tampoco es muy útil, y hay sitios donde pueden explicar con más criterio que yo en qué consiste EMF, voy a intentar explicar porqué es útil para mi proyecto.

Imaginemos que estamos desarrollando una aplicación en la que hemos identificado un modelo de datos relativamente complejo, y que debemos ser capaces de serializar y deserializar desde XML. Por ejemplo este, descrito en UML, y que modela parte del soporte para Casos de Uso que tiene eOPSOA:

Este modelo se podría implementar sin problemas en Java, pero sería una tarea cuanto menos dolorosa. Y si a esto añadimos el asunto de la serialización/deserialización en XML, listeners, adapters... etc., nos podemos dar cuenta que no es un asunto trivial.

Si desarrollamos un plugin para Eclipse, una aplicación RCP, o simplemente una programa Java, nos puede resolver la vida. Entre otras muchas cosas, con EMF podemos hacer:

  • Describir el modelo de datos a alto nivel. P.e. podemos usar un diagrama de Rational Rose, un diagrama UML, XSD, interfaces Java anotadas... etc. para construir un fichero ecore con el modelo de datos de nuestro sistema.
  • Con el fichero ecore, podemos generar un fichero genmodel que a su vez puede ser usado para generar el código Java que describe nuestro modelo. Crea además un editor en línea de comandos y otro gráfico como plugins de Eclipse. Todo eso sin tener que escribir una línea de código ;-)
  • Con el código que hemos generado, podemos serializar/deserializar nuestro modelo a XMI y XML, tenemos relaciones entre objetos, notificaciones, notificaciones inversas, adaptadores... etc. Todo ello como he comentado out-of-the-box, solo con la descripción a alto nivel de nuestro modelo y sin escribir (casi) una sola línea de código.
  • Podemos manipular el código generado, y si en un futuro hay cambios en el modelo, se puede recargar y regenerar el código, respetándose nuestros cambios.
  • Podemos usar los ficheros ecore y genmodel anteriores para crear un editor gráfico (en plan pinchaiconos, copiar y arrastrar) con GMF.
  • Y bueno, muchas cosas más que no sé ni creo que vaya a necesitar en un futuro cercano, pero que parecen cosa fina oiga.
A mí al menos, me ha resuelto la vida. Si le echáis un ojo a mi SVN, el plugin org.uclm.eopsoa.core es prácticamente un modelo EMF un poquito grande, y todo el código Java que me genera automáticamente. Si queréis comenzar con esto hay bastante información disponible en Internet, pero lo suyo es comenzar mirando la documentación de EMF, leer la guía para programadores, e intentar hacer los tutoriales. Hay una chuleta de referencia que viene muy bien, y si sabes que te vas a pegar mucho han sacado hace poco la segunda versión del libro EMF: Eclipse Modeling Framework. No es barato pero cubre mucho mucho mucho más de lo que puedas encontrar en Internet, y es extremadamente útil.

No sé si os habré convencido, pero para terminar voy a comentar algunas cosas que he aprendido durante estos meses usando EMF:

  • En los tutoriales apenas se comenta, pero la forma más cómoda para crear un modelo EMF es editando el fichero ecore con el editor. Muestra un árbol con los elementos, se pueden añadir/eliminar nuevos hijos, y manipular las propiedades en el properties view. Las interfaces Java anotadas son útiles porque proveen de una perspectiva más cercana a la que podemos tener los programadores, pero es mucho más fácil meter la pata y se pierde flexibilidad. Además, que si tu modelo EMF es un poco complejo es un rollo recordar las 80 anotaciones que quizá te hagan falta.
  • Procura tener tu modelo EMF lo más limpio, expresivo y rico posible. Si te ves modificando mucho código autogenerado, suele ser señal de que necesitas trabajar más tu modelo.
  • El nombre de los atributos va a tener mucho que ver en cómo se va a generar el fichero XMI/XML de persistencia del modelo. No te agobies demasiado si alguna etiqueta queda algo rara; mejor tener una API cómoda para trabajar. Y si alguien tiene que usar tu XML, siempre podrá usar a su vez EMF y entonces te agradecerá las decisiones que hayas tomado.
  • NUNCA, NUNCA pienses que no vas a tener que regenerar el modelo (y el código) y muevas paquetes, cambies nombres a clases sin que se entere EMF. Suele pasar cuando en tu proyecto usas una convención de nombres de interfaces/clases distinta a la que genera EMF, y con las facilidades de refactorización que provee Eclipse puede ser goloso liarse la manta a la cabeza, y moverlo y cambiarlo todo de sitio. Pero aunque no quieras, tarde o temprano vas a tener que modificar tu modelo, y al final tendrás un pisto y perderás tiempo.
Espero que este post haya sido útil, si alguien quiere comentar lo que fuera es bienvenido :-)

7 comentarios:

valentine sagara dijo...

que bien, yo tambien utilizo emf; ya no me siento tan solo

cada vez me enamoro más de la tecnología que va apareciendo sobre eclipse.

gmf es otra joya(basa en emf; para crear editores graficos), y cdo para la persistencia de los modelos en bases relaciones (no solo relacionales), y un montón más

suerte

deivis dijo...

La verdad es que es una gozada si. Después de superar la curva de aprendizaje de EMF se hacen las cosas rapidísimo, y en un plis puedes tener un modelo muy muy completo que de otra forma te llevaría semanas. También me llama mucho la atención JET, que es un sistema de plantillas que se puede usar con EMF. Imagina que p.e. quieres volcar un modelo EMF en qué se yo... en un CSV, o en lo que se te ocurra. Pues JET te permite hacerlo de forma fácil! Y no solo eso, sino cosas muy complejas. Un compañero del trabajo usa EMF para crear metamodelos que a su vez crean modelos que crean programas, pa fliparlo jeje.

Si después de presentar el proyecto me dan la oportunidad de seguir trabajando con eOPSOA, tengo claro que usaré GMF para crear un editor gráfico para el asunto de la definición de los UC, que con texto se puede hacer pero creo que es más práctico de otra forma, ya os contaré por aquí :-)

Quiti dijo...

Hola, una pregunta David, yo estoy haciendo un trabajo y necesito emplear EMF y MOFScript. Necesito pasar de un modelo a codigo, es decir pasar de un metamodelo OLAP y generar su codigo SQL, no se si estoy en lo correcto pero para esto necesito el metamodelo SQL cierto?, pero no lo consigo completo, no se si me puedes ayudar. Gracias

deivis dijo...

Buenas Quiti

Si te soy sincero no tengo casi ni idea de lo que comentas, el uso que hago de EMF en mi proyecto es muy básico. En un futuro es posible que trabaje más con modelado y metamodelado, pero por ahora no te puedo ayudar...

Sé que existe un proyecto llamado Teneo, la pequeña descripción que hacen de él en la página de Eclipse dice:

Teneo is a database persistency solution for EMF using Eclipselink or Hibernate. It supports automatic creation of EMF to Relational Mappings and the related database schemas. The solution contains a runtime layer to support specific EMF features. EMF Objects can be stored and retrieved using advanced queries (HQL or EJB-QL). EMF resource implementations are provided for integration with EMF Editors. The persistence logic and mapping can be controlled using EJB3/JPA-like annotations. Most of the EJB3/JPA mapping standard is supported.

Pero nunca lo he tocado, ni sé si tiene algo que ver con tu labor, lo siento :-(

¡Mucha suerte!

yanet dijo...

Hola necesito su ayuda, como hago una interfaz donde pueda inserta el diagrama de mi modelo, algo tipo UML, donde tenga iconitos, Pero tmb donde pueda inserta un modelo q saque de un metamodelo.

deivis dijo...

Buenas Janet

Lo que necesitas es el framework GMF de Eclipse. Permite construir editores gráficos que den soporte a metamodelos Ecore.

Lo único que puedo hacer por ayudarte es indicarte el framework correcto, porque tengo muy poca experiencia en GMF. Si quieres comenzar a ver el tema, te aconsejo que comiences con la documentación de GMF, e intentes seguir uno de sus tutoriales. Está en inglés, pero no es para nada complejo, y si tienes los conceptos básicos de EMF asimilados no tendrás problemas para seguirlo.

¡Buena suerte! :-)

yanet dijo...

Gracias David, lo checaré, creo q te estaré molestando con algunas dudas, es la primera vez q voy a trabajar con GMF, podrias pasarme tu correo, tienes msn.