Buenas a todos, en el post de hoy continuaremos la cadena de post sobre desarrollo con DSL Tools y diseñaremos el resto del DSL que comenzamos la semana pasada. Después, contaremos como se diseña la interface gráfica de nuestro DSL.
Para el ejemplo que hemos utilizado y en el que vamos a desarrollar un dsl que nos permita automatizar la generación de ficheros XML, requeriremos una serie de elementos que nos permitan generar un árbol abstracto que simule las etiquetas del árbol XML. Estos elementos serán representados por nodos y atributos. Cada nodo puede tener cero o más atributos. Además, los nodos pueden ser de tres tipos, nodo raíz, nodo hoja, o nodo normal. El nodo raíz podrá tener 0 o más hijos. El nodo hoja no podrá tener hijos. Y los nodos normales tendrán padre y cero o más hijos. Este efecto lo conseguiremos jugando con las cardinalidades.
Ahora aprovecharemos el esqueleto del modelo proporcionado y modificaremos los nombres y atributos de las clases hasta dejarlos como en la captura de pantalla que se verá a continuación.
Cambios a realizar:
- Cambiar el nombre del modelo (en la clase “domain class”) de ExampleModel a ModeloDocXml.
- Cambiar el nombre de la clase ExampleElement a Nodo. Cambiar el nombre de su atributo Name a Nombre. Y añadirle los atributos Campo (string), Raiz (boolean), Hoja (boolean), con los que identificaremos el tipo de nodo del que se trata.
- Modificaremos el nombre Elements a Nodos de la Reference Relationship que une ModeloDocXml con Nodo. Y que utilizaremos posteriormente para identificar el número de nodos que contiene nuestro modelo.
- Además añadiremos una clase nueva a la que le daremos de nombre Atributo y le añadiremos los atributos Nombre e Identificador. Que uniremos a la clase nodo con un Embbeding Relationship. Modificaremos finalmente la cardinalidad de manera que un nodo pueda tener cero o mas atributos.
Tras realizar estos cambios deberíamos tener nuestro modelo terminado:
Ahora llega la hora de diseñar la interface que tendrá nuestro modelo. En la parte derecha veréis que hay un diagrama paralelo llamado Diagram Elements, en él se diseñará la interface de nuestro modelo.
Para aclararnos renombraremos la forma ExampleShape a NodoShape. El ExampleConnector a NodoConnector y el LanguageDiagram a XmlGeneratorDiagram.
Como partimos nuestro modelo de un esqueleto, ya está diseñada la interface de la clase nodo, y de la flecha que se utiliza para unir los nodos. Ahora queda diseñar la interface de los atributos que puede tener un nodo. Para ello arrastraremos desde la toolbox un Geometry Shape y un Connector a los que renombraremos como AtributoShape y AtributoConnector. Ahora pulsaremos botón derecho sobre Decorator en la clase AtributoShape y añadiremos un atributo NameDecorator, lo que nos permitirá poner un nombre en el atributo, durante el diseño de nuestro modelo. Tras realizar estos cambios deberíais tener lo siguiente:
Y el resultado final sería el siguiente:
Ahora debemos asociar la clase Atributo y el conector que le une con la clase Nodo, con sus correspondientes shape. Para ello utilizaremos la herramienta de la toolbox Diagram Element Map.
Una vez hecho esto pincharemos en la flecha que une la clase Atributo con AtributoShape y accederemos a la pestaña Decorator Maps, donde marcaremos la casilla NameDecorator como muestra la siguiente imagen y seleccionaremos en Display Property el atributo Nombre. De esta manera conseguiremos que dentro del nodo en el modelo muestre el atributo Nombre:
Ahora iremos a la pestaña General y comprobaremos que el Parent Element Map está apuntando al ModelDocXml desde donde hereda, para que posteriormente desde el código del programa podamos acceder a sus atributos:
Finalmente, y como función únicamente estética podremos modificar el aspecto de los nodos y atributos del modelo jugando con las distintas posibilidades que ofrecen desde su correspondiente menú propiedades, colores, formas de los nodos, etc:
Esto es todo por hoy, en el próximo post generaremos la toolbox que contendrá todos los elementos de nuestro DSL y la probaremos.
Hasta el próximo post, saludos!
"