Con el objetivo de consolidar todas las características explicadas sobre ATL y poder comprender mejor las reglas que definirán las transformaciones de HL7 a UML, se considera oportuno exponer un ejemplo adaptado de los que se proporcionan en [ATLw], la página web de ATL.
En el ejemplo, lo que se pretende es pasar de un metamodelo que representa familias, a otro que representa personas. De modo que lo expuesto en el ejemplo 15.7, pase a ser lo que se expresa en el 15.8.
Familia García
169
Madre: Berta
Hijo: Carlos
Hija: Diana
Ejemplo 15.7 Elementos del metamodelo de familias
Sr. Andrés García
Sra. Berta García
Sr. Carlos García
Sra. Diana García
Ejemplo 15.8 Elementos del metamodelo de personas
Lo primero que se debe hacer es diseñar ambos metamodelos. El de familias se encuentra en la figura 15.2, mientras que el de personas se muestra en la 15.3.
Figura 15.2 Metamodelo de familias
Figura 15.3 Metamodelo de personas
El siguiente paso, consiste en obtener una instancia XML del metamodelo de familias que contenga la información de una familia de la que queramos obtener instancias del metamodelo de personas. En este caso, se utilizará la instancia XML descrita en el ejemplo 15.9, que representa a la familia descrita anteriormente en ejemplo 15.7.
170 <?xml version=”1.0” enconding=”ISO-8859-1”?>
<xmi:XMI xmi:version=”2.0” xmlns:xmi=http://www.omg.org/XMI xmlns=”Familias”>
<Familia apellido=“García”>
<padre nombre=“Andrés”>
<madre nombre=“Berta”>
<hijos nombre=“Carlos”>
<hijas nombre=“Diana”>
</Familia> </xmi:XMI>
Ejemplo 15.9 Instanciación XML del metamodelo de familias
Como se puede comprobar, la estructura del fichero XML mostrado es ligeramente diferente a la de los ficheros XML instancias del metamodelo de HL7 mostrados en el capítulo 14, ya que en el ejemplo de la web de ATL no se usan identificadores numéricos para referenciar objetos, sino que se incluyen otros elementos dentro de una etiqueta más general. Esto no presenta ningún problema ni nos impide utilizar nuestros ficheros XML con reglas ATL. Son simplemente diferentes formas de describir instancias en XML, pero igualmente válidas.
Una vez se tienen las instancias XML que se desean convertir y ambos metamodelos, se está en disposición de poder definir las reglas de transformación en un módulo ATL, que se explica a continuación.
15.3.1 Cabecera
La cabecera del módulo, se define tal y como se muestra en el ejemplo 15.10.
Module FamiliasAPersonas;
Create OUT : Personas from IN : Familias;
Ejemplo 15.10 Definición de la cabecera ATL en el ejemplo de familias y personas
15.3.2 Helpers
Para facilitar la definición de las reglas de conversión, en este caso, se ha optado por utilizar un par de helpers. El primero, retorna un booleano, indicando si un miembro de la familia es mujer o no (ejemplo 15.11), y el segundo, a partir de un miembro, retorna un string que representa el apellido de su familia (ejemplo 15.12). En estos helpers, aparecen llamadas a la función oclIsUndefined(), que retorna lo mismo que en OCL, es decir, un booleano que toma el valor de verdadero cuando el objeto mediante la cual es invocada existe y falso en caso contrario.
171
helper context Familias!Miembro def: esMujer() : Boolean =
if not self.madreDeFamilia.oclIsUndefined() then true else
if not self.hijaDeLaFamilia.oclIsUndefined() then true else false
endif endif;
Ejemplo 15.11 Definición del helper esMujer() en el ejemplo de familias y personas
helper context Familias!Miembro def: apellidoFamilia() : String =
if not self.padreDeFamilia.oclIsUndefined() then
self.padreDefamilia.apellido
else
if not self.madreDeFamilia.oclIsUndefined() then self.madreDeFamilia.apellido
else
if not self.hijoDeLaFamilia.oclIsUndefined() then self.hijoDeLaFamilia.apellido else self.hijaDeLaFamilia.apellido endif endif endif;
Ejemplo 15.12 Definición del helper apellidoFamilia() en el ejemplo de familias y personas
15.3.3 Reglas de transformación
En este ejemplo, se definen dos reglas de transformación. La primera es la que se muestra en el ejemplo 15.13. En ella, la condición que encontramos en la sección from, incluye a todos los miembros de familias que no sean mujeres, vemos que esto se define en una sola línea gracias a haber definido anteriormente el helper esMujer(). Por otro lado, en la sección to, se crea una instancia de la clase Hombre del metamodelo Personas y a su atributo nombreCompleto, se le asigna la concatenación del nombre del miembro del que proviene y del apellido de su familia.
rule MiembroAHombre { from
m: Familias!Miembro (not m.esMujer()) to
h: Personas!Hombre (
nombreCompleto <- m.nombre + „ „ + m.apellido )
}
172 La segunda regla es muy parecida a la anterior, aunque en esta ocasión en la sección from se incluyen a todos los miembros de familias que sean mujeres y en la to, se crea una instancia de Mujer en lugar de Hombre (ejemplo 15.14).
rule MiembroAMujer { from
mi: Familias!Miembro (mi.esMujer()) to
mu: Personas!Mujer (
nombreCompleto <- mi.nombre + „ „ + mi.apellido )
}
Ejemplo 15.14 Regla de transformación MiembroAMujer del ejemplo de familias y personas
15.3.4 Resultado
En el ejemplo 15.15, se muestra el fichero XML resultante de la conversión. La información contenida es la que ya se mostró anteriormente.
<?xml version="1.0” encoding=”ISO-8859-1” ?>
<xmi:XMI xmi:version=”2.0” xmlns:xmi=http://www.omg.org/XMI xmlns="Personas">
<Hombre nombreCompleto=“Andrés García” /> <Hombre nombreCompleto=“Carlos García” /> <Mujer nombreCompleto=“Berta García” /> <Mujer nombreCompleto=“Diana García” /> </xmi:XMI>
Ejemplo 15.15 Fichero XML resultante de la conversión en el ejemplo de familias y personas
En resumen, a partir de una instancia XML de un metamodelo inicial, se ha obtenido una instancia XML de un metamodelo destino y para ello, antes se han tenido que definir ambos metamodelos, la instancia XML del metamodelo fuente y las reglas de transformación.
173
16 CONVERSIÓN DE LOS ELEMENTOS HL7 A UML
En este capítulo, se explica todo aquello que tiene que ver con la fase del proyecto en la que se escriben las reglas de transformación de ATL. Concretamente, se muestra cómo se construyen las reglas de conversión para cada uno de los elementos del metamodelo de HL7, teniendo en cuenta las transformaciones que hacen las herramientas ya existentes, y se explican ejemplos de ficheros UML resultantes.