Title: Transformaci
1Transformación de modelos con ATL
- Pau Giner
- OO-Method Research Group
- Department of Information Systems and Computation
- Technical University of Valencia, Spain
2Agenda
- Introducción
- Lenguajes de transformación de modelos
- Introducción a ATL
- ATL y Eclipse
- Tutorial 1
- Tutorial 2
- ATL al detalle
- Tutorial 3
- ATL Avanzado
- Referencias
3Introducción
- MDD sitúa los modelos en el centro del desarrollo
de software - Necesidad de operaciones para
- Mezclar A,B ? AB
- Modificar A?B
- Relacionar A??B
4Introducción
Metamodelo
Dónde encajan las transformaciones de modelos?
Motor de Transformación
Reglas de Transformación
Modelo
Metamodelo
Código Generado
Generador de código
Plantillas de Generación
5Tipos de Transformaciones de Modelos Criterios
- Según metamodelos origen y destino
- Endógenas el mismo metamodelo
- Mejora de la calidad del modelo optimización,
refactorización, simplificación - Exógenas distintos metamodelos
- Según el cambio de nivel de abstracción
- Síntesis Alto ? Bajo
- Ingeniería inversa Bajo ? Alto
- Migración En el mismo nivel
6Tipos de Transformaciones de Modelos
- Model Merging
- Model Modification
- Model Transformation
- Model Weaving/Linking
- Model Marking
7Model Merging
- Varios modelos se mezclan en uno
- Fácil de implementar
- Los metamodelos son los mismos
- Útil en modelado cooperativo
8Model Modification
- Los modelos se modifican (en tiempo de ejecución
o no) para añadir elementos - Mismo metamodelo
- No suele ser complejo de implementar
9Ejemplo
- Eliminación de relaciones de herencia redundantes
10Ejemplo
11Model Transformation
- Un modelo se transforma en otro. El modelo fuente
se mantiene sin cambios. - Modelos separados y metamodelos diferentes.
12Ejemplo
- Modelo de proceso de negocio a redes de Petri
para validación
13Model Weaving/Linking
- Dos o más modelos se correlacionan
- Los modelos originales permanecen sin
modificaciones - Es necesario proporcionar un modelo de weaving
- un metamodelo que defina los weavings
- No soportado por la mayoría de herramientas.
14Ejemplo
15Model Marking
- A veces se necesita proporcionar información
específica del metamodelo destino. - Se añaden etiquetas/marcas al modelo fuente. Esto
ensucia el modelo con conceptos específicos del
modelo destino. - MDA propone añadir marcas a los modelos, pero lo
soportan pocas herramientas. - Se recomienda mantener dicha información fuera
del modelo (por ejemplo en ficheros XML). El
motor de transformaciones ya utilizará dicha
información cuando ejecute las transformaciones.
16Agenda
- Introducción
- Lenguajes de transformación de modelos
- Introducción a ATL
- ATL y Eclipse
- Tutorial 1
- Tutorial 2
- ATL al detalle
- Tutorial 3
- ATL Avanzado
- Referencias
17Cómo especificar transformaciones?
- Existen varias dimensiones mediante las cuales
podemos distinguir las aproximaciones y lenguajes
de transformación M2M - Aproximación Conceptual Procedural, Funcional,
Declarativa/Relacional - Sintaxis Concreta Textual, Gráfica
- Directionalidad Unidirectional vs. Bidireccional
18Herramientas
- 3GL contra la API del Modelo (JavaEMF/MDR)
- Es complicado realizar modificaciones sencillas
- XSLT
- Sólo funciona con modelos basados en XML
- Escalabilidad limitada. No existen operaciones
sobre el metamodelo, solamente manipulan XML. - ATL Atlas Transformation Language
- Textual, usado en la práctica, con depurador
- QVT Query/Views/Transformations
- Estándar de OMG. Las implementaciones están
surgiendo lentamente. - MTF Model Transformation Framework
- Textual, declarativo, soportado por IBM, no es
open source - oAW xTend, Kermeta
- Extensiones simples para la creación d emodelos
19Alternativas principales
- ATL Atlas Transformation Language
- Solución para transformaciones m2m en la
comunidad Eclipse - MOF 2.0 QVT Query/Views/Transformations
- Estándar de la OMG
- Pocas implementaciones
- Solo de parte de la especificación
- QVT Operational Mappings
- Implementación OpenSource muy reciente
- SmartQVT
20Lenguajes para la transformación de modelos
- Qué aportan?
- Primitivas cercanas al dominio (son DSLs)
- Preservación del grafo de dependencias
- Correspondencia entre modelos origen y destino
- Facilidades para consultar los elementos
generados por una regla - Son modelos
21Ejemplo
22Agenda
- Introducción
- Lenguajes de transformación de modelos
- Introducción a ATL
- ATL y Eclipse
- Tutorial 1
- Tutorial 2
- ATL al detalle
- Tutorial 3
- ATL Avanzado
- Referencias
23ATL
- ATL es un subproyecto de Eclipse GMT
- Desarrollado por el INRIA en Francia
- requiere Eclipse como entorno de ejecución
- Independiente del tipo de metamodelo KM3, EMF,
MDR - Escalibilidad prioritaria
- Se ejecuta en su propia máquina virtual
- Soporte de la academia y la industria
- Usado por Airbus, NASA Jet Propulsion Laboratory,
Sodius - Proporciona herramientas para su uso
- Unidireccional
- from ? to
24ATL
- Diferencias entre modelos origen y destino
- Los modelos origen solo se pueden leer
- Los modelos destino solo pueden ser escritos
- Lenguaje híbrido Imperativo-Declarativo
- Declarativo
- Matched rules basadas en pattern-matching
- Lenguaje de navegación sin efectos laterales
(OCL-like) - Imperativo
- Called rules
- Action blocks
25Tipos de fichero ATL
- ATL module
- Conjunto de reglas de transformación
- Library
- Conjunto de funciones de ayuda que puede ser
importado - Query
- Consultas que obtienen un valor simple de un
modelo
26ATL Reglas de transformación
- Una regla declarativa especifica
- Un patrón origen que se buscará en los modelos
fuente, - Un patrón destino que se creará en el destino por
cada regla que haga matching. - Una regla imperativa es un procedimiento
- Se llama explícitamente
- Puede tomar argumentos
- Puede contener
- Un patrón declarativo,
- Un action block (secuencia de sentencias),
- Ambos.
27Patrón Origen
- El patrón origen está formado por
- Un conjunto etiquetado de elementos de los
metamodelos origen - Una guarda
- Expresión booleana a modo de filtro
- Se producirá un matching si se encuentran
elementos en los modelos origen que - Sean de los tipos especificados en el patrón,
- Satisfagan la guarda.
28Patrón Destino
- El patrón destino está compuesto de
- Elementos etiquetados del metamodelo destino
- Para cada elemento una inicialización de sus
propiedades - Para cada coincidencia se aplica el patrón
destino - Se crean los elementos destino
- Se inicializan sus propiedades
- Primero, evaluando el valor de las expresiones
- Después, asignando dicho valor a la propiedad
indicada
29Ejemplo de regla
- Las Clases marcadas como persistentes, se
transformarán en Tablas cuyo nombre será el
nombre de la clase original
30Ejemplo de regla
- Metamodelos
- Origen Diagrama de Clases
- Destino Modelo Relacional
- Patrón origen
- Elementos
- c Clase
- Guarda
- c.persistente
- Patrón destino
- Elementos
- tTabla
- Inicialización
- t.nombre ? c.nombre
31Orden de aplicación de las reglas
- Con las reglas declarativas permiten al
desarrollador despreocuparse del orden de
ejecución - No se especifica el orden de
- Aplicación de reglas
- Inicialización de propiedades
- Sin embargo, se mantiene el determinismo
- La ejecución de una regla no puede cambiar el
modelo origen - ? No puede alterar las coincidencias
- El modelo destino no es navegable
- ? La creación de un elemento no puede afectar el
valor de otro
32ATL Un vistazo a la sintaxis
- Transformación (ATL module)
- Cabecera
- Importación de librerías
- Helpers y Attributes
- Reglas
- Modos de ejecución
- Normal
- Refinamiento
33ATL Cabecera
- module module_name
- create output_models fromrefines input_models
- Se especifica
- Nombre del modulo
- Modelos y Metamodelos implicados
- OUT1 UML, OUT2 TraceModel
- Tipo de transformación
- Modelo nuevo
- Refinamiento
- En versiones recientes la palabra clave es
refining
34ATL Librerías
- uses lib_name
- Permiten la modularización y reutilización de
helpers - uses string
35ATL Helpers
- helper context context_type def
helper_name(parameters) return_type exp - Permiten extender el metamodelo con funciones y
atributos derivados - Son atributos si no se usan parámetros
- Las expresiones se definen en OCL
- El contexto es opcional
- El modulo ATL es el contexto por defecto
- Ej helper context Liga!Partido def nombre
String self.local.nombre ' -
'self.visitante.nombre
36ATL Reglas
- rule rule_name
- from in_var in_type (condition)
- using var1 var_type1 init_exp1 ... varn
var_typen init_expn - to
- out_var1 out_type1 ( bindings1 )
- ...
- out_varn out_typen ( bindingsn )
- do statements
37Agenda
- Introducción
- Lenguajes de transformación de modelos
- Introducción a ATL
- ATL y Eclipse
- Tutorial 1
- Tutorial 2
- ATL al detalle
- Tutorial 3
- ATL Avanzado
- Referencias
38ATL y Eclipse
- ADT ATL Development Tool
- Plugin para permitir el desarrollo de
transformaciones - Aporta editores, vistas, mecanismos de ejecución
y depuración de transformaciones.
39Perspectiva, Editor y Recursos
40Launch configuration
41Depurador
42Agenda
- Introducción
- Lenguajes de transformación de modelos
- Introducción a ATL
- ATL y Eclipse
- Tutorial 1
- Tutorial 2
- ATL al detalle
- Tutorial 3
- ATL Avanzado
- Referencias
43Tutorial 1
- Metamodelos
- Entrada Book
- Salida Publication
- Modelo de entrada
- libro.xmi
- Transformación
- Crear para cada Libro una Publicación cuyo
atributo nbPages sea la suma de las páginas de
los capítulos del libro.
44Cabecera
- module Book2Publication
- create OUT Publication from IN Book
- Los elementos create y from definen los modelos
de salida y entrada que se representan mediante
las variables OUT e IN
45Helpers
- Definimos un helper getSumPages que nos devuelva
el número de páginas de un libro - Sumando las páginas de cada capítulo
- helper context Book!Book def getSumPages()
Integer - self.chapters-gtcollect(cc.nbPages).sum()
- Los contextos se expresan como Metamodelo!Elemento
- Book!Book La clase Book del metamodelo Book
46Reglas
- rule Book2Publication
- from b Book!Book
- to out Publication!Publication(
- title lt- b.title,
- nbPages lt- b.getSumPages()
- )
47Reglas (con Guardas)
- Si añadimos el requisito de que solo se
transformen los libros con más de dos páginas - rule Book2Publication
- from b Book!Book ( b.getSumPages() gt 2)
- to
- out Publication!Publication (
- title lt- b.title,
- nbPages lt- b.getSumPages()
- )
48Mensajes de salida
- Todo elemento tiene la operación debug que
- Devolverá el propio elemento
- Por lo que no afectará a la computación
- Mostrará un mensaje por la consola
- Permitirá obtener mensajes de ayuda para el
desarrollador - Ej b.getSumPages().debug(paginas) gt 2
49Extras
- Depuración
- La perspectiva de depuración permite ejecutar
paso a paso las reglas - Queries
- Permiten calcular valores primitivos a partir de
elementos del modelo. - Ejemplo
- query caps Book!Chapter.allInstances()-gtsize().
toString() - El método writeTo(ficheroString) permite
escribir la cadena a un fichero
50Agenda
- Introducción
- Lenguajes de transformación de modelos
- Introducción a ATL
- ATL y Eclipse
- Tutorial 1
- Tutorial 2
- ATL al detalle
- Tutorial 3
- ATL Avanzado
- Referencias
51Tutorial 2 Liga2Quiniela
- Liga
- Equipos
- Jornadas
- Partidos
- Quiniela
- Quiniela
- Resultados JugadosPendientes
52Metamodelos
Quiniela.ecore
Liga.ecore
53Mappings
54Agenda
- Introducción
- Lenguajes de transformación de modelos
- Introducción a ATL
- ATL y Eclipse
- Tutorial 1
- Tutorial 2
- ATL al detalle
- Tutorial 3
- ATL Avanzado
- Referencias
55ATL al detalle
- Sistema de tipos
- Comentarios
- Expresiones declarativas
- Helpers
- Reglas
56Sistema de tipos
57OclType
- Sus instancias son los distintos tipos
- Operaciones
- allInstances()
- Devuelve el conjunto de las instancias de un tipo
- Book!Chapter.allInstances()
- allInstancesFrom(metamodelString)
- Devuelve las instancias contenidas en el modelo
- Book!Chapter.allInstancesFrom(IN)
58OclAny
- Cualquier objeto pertenece a OclAny
- Operaciones
- Comparación ltgt
- oclIsUndefined
- Indica sí self no está definido (análogo al null)
- oclIsKindOf(t oclType)
- Indica si self es instancia directa o indirecta
del tipo t - 3.oclIsKindOf(OclAny)
- oclIsTypeOf(toclType)
- Indica si self es instancia directa del tipo t
- 3. oclIsTypeOf(Integer)
59OclAny
- Operaciones
- toString()
- Versión textual del objeto
- oclType()
- Tipo del objeto
- asSequence(), asSet(), asBag()
- Convierte el objeto en secuencia, conjunto y
bolsa - refImmediateComposite
- Obtiene el objeto bajo el cual self está compuesto
60ATL Module
- Representa el módulo y solo tiene una instancia
thisModule - Permite definir helpers y atributos globales
- Operaciones
- resolveTemp(varoclAny, targetString)
- Permite determinar que patrón target se aplicará
a un objeto origen var. - Útil cuando no se desea aplicar el patrón por
defecto
61Primitive
- Tipos primitivos
- Boolean true, false
- Operadores lógicos and, or, xor, not
- implies(bBoolean) self ? b
- Numerical (Integer, Real)
- Comparación lt, gt, gt, gt
- Operadores , , -, /, div(x), max(x), min(x),
abs() - Particulares mod(x) para Integer y floor y
round para Real - Aritméticas cos, sin, toDegrees, toRadians, exp,
log, sqrt - String
62String
- Se define usando comillas simples
- Ej. ejemplo de cadena de carácteres
- Se indexa comenzando por el 1
- Operaciones
- size()
- concat(s String)
- Alternativamente puede usarse el operador
- substring(lowerInteger, upperInteger)
- Conversión toInteger, toReal, toSequence,
toUpper, toLower - Salida
- writeTo(fileString) escribe la cadena a un
fichero - Las rutas relativas se consideran desde el
directorio de eclipse - println() escribe en la salida estándar
63Collection
- Es un tipo abstracto que engloba a los 4 tipos de
colecciones - Set conjunto
- Sin duplicados y sin orden
- OrderedSet
- Sin duplicados y con orden
- Bag
- Con duplicados y sin orden
- Sequence
- Con duplicados y con orden
- Definición tipo_colección(tipo_elementos)
- Set(Integer)
- Instanciación tipo_colecciónelementos
- Set1,2,3
- La invocación de operaciones se realiza
utilizando -gt - 'Set1,2,3-gtsize()
64Collection
- Operaciones comunes
- size()
- includes(xoclAny)
- Devuelve true si x pertenece a la colección.
- excludes(xoclAny)
- Devuelve true si x no pertenece a la colección.
- count(xoclAny)
- Nº de veces que aparece x en la colección
- includesAll(c Collection)
- Devuelve true si todos los objetos de c
pertenecen a la colección - excludesAll(c Collection)
- Devuelve true si ninguno de los objetos de c
pertenecen a la colección - isEmpty(), notEmpty()
- sum()
- Aplica el operador a todos los elementos de la
colección - asBag(), asSequence(), asSet()
65Sequence
- union(c Colection)
- Devuelve una colección con la unión de los
contenidos - flatten()
- SequenceSet1,2,Set3,4 ? Sequence1,2,3,4
- append, prepend, insertAt(posInteger)
- Inserción al final, inicio o posición determinada
- first(), last(), at(posInteger)
- Recuperación del primer, último o elemento
indicado
66Set
- union, intersection
- self (sSet)
- Set con los elementos de self que no están en s
- Including(xoclAny), excluding(xoclAny)
- Devuelven un set con o sin el elemento x
- symetricDifference(sSet)
- Devuelve los elementos que están en self o en s
pero no en ambos
67Iterar sobre colecciones
- Facilidades para recorrer colecciones
- Colección-gtoperación(iteradores cuerpo)
- Operaciones
- exists
- Devuelve true si se cumple el cuerpo para algún
elemento - forAll
- Devuelve true si se cumple el cuerpo para todos
los elementos - one
- Devuelve true si se cumple el cuerpo para un
único elemento - isUnique
- Devuelve true si el cuerpo se evalúa a un valor
distinto para cada elemento
68Iterar sobre colecciones
- Operaciones
- any
- Devuelve un elemento que satisface el cuerpo, o
el valor OclUndfined - collect
- Devuelve una colección de elementos resultantes
de aplicar el cuerpo a cada uno de los elementos - select
- Devuelve el conjunto de elementos que satisfacen
el cuerpo - reject
- Devuelve el conjunto de elementos que no
satisfacen el cuerpo - sortedBy
- Devuelve una colección ordenada según el criterio
establecido en el cuerpo
69Iterar sobre colecciones
- Para casos más complejos
- Iterate(iterador variableinicialización
cuerpo) - Ejemplo
- Set1,2,3-gtiterate(e resInteger0 rese)
70Enumeraciones
- Para acceder a los literales de una enumeración
se utiliza el carácter - El tipo de numeración es inferido por el sistema
- Ej. dialt- Lunes
- Si el nombre del literal coincide con alguna
palabra reservada, se entrecomillará - Ej Integer
71Tuple
- Permiten definir valores compuestos
- Definición
- TupleType(var_name, var_type,)
- Ej. TupleType(aMM!Author, titleString)
- Uso
- Tuplevar_namevar_typevalue,
- Ej.TupletitleEl Aleph, authorb
72Map
- Define una tabla de mappings clave-valor
- Definición
- Map(key_type, value_type)
- Ej. Map(Integer, MM!Author)
- Uso
- Map(key,value),
- Ej. Map(1,aut1), (2,aut2)
73Map
- Operaciones
- get(key) ? value
- including(key,val)
- Nuevo Map, que incluye el valor indicado si no
contenía la clave key - Union(mMap)
- Nuevo Map, que incluye los elementos de m
- getKeys, getValues
- Colección con las claves o los valores
74Model Elements
- Los elementos definidos en los metamodelos se
consideran nuevos tipos de ATL - Los tipos se referencian a partir de su
metamodelo - Metamodel!class
- Ej Library!Author
- Navegación por punto
- Tanto para recorrer atributos como referencias
- Ej. aut1.nombre
- Test de vacío
- oclIsUndefined() para atributos con cardinalidad
0..1 - isEmpty() para atributos con cardinalidad
75Comentarios
- Se usa el doble guión
- Ejemplo --comentario
- Hasta el final de la línea
- En la primera línea del fichero, determinan el
compilador - -- _at_atlcompiler atl2006
- -- _at_atlcompiler atl2004
76Expresiones declarativas
- If
- Permite definir expresiones condicionales
- if condición then exp1 else exp2 endif
- No se puede omitir ninguna parte
- Representa decisiones sobre datos
- No control de flujo
- Ej if xgt3 then mayor que 3 else menor o igual
que 3 endif
77Expresiones declarativas
- Let
- Permite definir variables locales
- let nombre tipo inicialización in exp
- let a Integer 1 in a2
- Se pueden encadenar
- let aInteger1 inlet bInteger2 inab
- Facilitan la legibilidad y la depuración
78Expresiones declarativas
- Cuidado!!
- Las expresiones lógicas se evalúan completamente
- Problema
- not person.oclIsUndefined() and
person.namePepe - El acceso a name se realizará independientemente
de que person esté definida o no. - Produciendo el consecuente error en caso de no
estarlo - Suele darse en el cuerpo de los iteradores
- Solución
- if person.oclIsUndefined() then false else
person.namePepe endif
79Funciones auxiliares
- Permiten factorizar el código
- Se definen en base a un contexto
- Tipo de elementos sobre el que se puede aplicar
- El contexto por defecto es el módulo
- Se invocará el helper a partir de la variable
thisModule - Puede haber varios helpers con el mismo nombre
- En contextos distintos
- Existen dos tipos
- Helpers
- Aceptan parámetros
- Attributes
- No aceptan parámetros
- Más eficientes
80Helpers
- Helper
- helper context context_type def
helper_name(parameters) return_type exp - Attribute
- helper context context_type def helper_name
return_type exp
81Helpers
- Helper
- Definición
- helper context context_type def
helper_name(parameters) return_type exp - helper context Integer def suma(bInteger)Intege
r selfb - Uso 3.suma(2)
- Attribute
- Definición
- Como el helper pero sin parámetros
- helper context MM!Person def mayor Boolean
self.agegt18 - Uso p.mayor
82Helpers Limitaciones
- No se puede definir una colección como contexto
- Problema
- helper context Set(MM!Person) def
getYounger(ageInteger) Set(MM!Person) - Solución
- helper def getYpunger(s Set(MM!Person,
ageInteger) - En las librerías no se aceptan attributes
- Se debe definir toda función como helper
83Reglas ATL
- Código imperativo
- Matched Rules
- Called Rules
84Código Imperativo
- Se puede especificar código imperativo en
- Bloques imperativos
- Reglas (matched o called)
- Bloque imperativo
- Conjunto de sentencias imperativas separadas por
- Tipo de sentencia
- Asignación
- Target lt- exp
- Condición
- if(condición) sentencias else
sentencias? - Bucles
- for(iterador in colección) sentencias
- for(p in persons)
85Matched Rules
Patrón origen
- rule rule_name
- from in_var in_type (condition)
- using var1 var_type1 init_exp1 ...
- varn var_typen init_expn
- to
- out_var1 out_type1 ( bindings1 )
- ...
- out_varn out_typen ( bindingsn )
- do statements
-
Variables locales
Patrón destino
Bloque imperativo
86From Patrón Origen
- Determina los elementos origen sobre los que se
aplicará la regla - Ejemplo
- from pMM!Person
- Puede incluir condiciones para afectar solo a un
subconjunto de elementos - from pMM!Person( p.namePepe)
87Using Variables locales
- Permite definir variables locales a usar en
- La propia sección using
- Secciones to y do
- Ejemplo
- from cGeo!Circulousing piReal3.14 areaReal
pic.radio.square()
88To Patrón destino
- La sección to contiene un conjunto de patrones de
destino - El primero se considerará el patrón por defecto
- Los patrones se definen
- Indicando un elemento de destino
- Especificando su inicialización
- Hay dos tipos de patrones destino
- Simple
- Genera un elemento destino por regla
- Iterativo
- Genera un conjunto de elementos por regla
89Ejemplo Patrón destino Simple
- from b Book!Book
- to out Publication!Publication(
- title lt- b.title,
- nbPages lt- b.getSumPages()
- )
90Inicialización de referencias
- Podemos inicializar una referencia con
- Elemento destino creado por la propia regla
- El elemento generado por defecto por otra regla
- Elemento no generado por defecto de otra regla
91Inicialización de referencias
- Podemos inicializar una referencia con
- Elemento destino creado por la propia regla
- from cUML!Classto tablaDB!Table( name lt-
c.name, primaryKey lt- pk)pkDB!PrimaryKey(
)
92Inicialización de referencias
- Podemos inicializar una referencia con
- El elemento generado por defecto por otra regla
- rule model2schemafrom mUML!Modelto
sDB!Schema( name lt- m.name, tableslt-
m.classes)
rule class2table from c UML!Class to
tabla DB!Table( name lt- c.name )
93Inicialización de referencias
- Podemos inicializar una referencia con
- Elemento no generado por defecto de otra regla
- rule model2schemafrom mUML!Modelto
sDB!Schema( name lt- m.name, tableslt-
m.classes-gt collect(cthisModuleResolveTemp(c
,tabla))
rule class2table from c UML!Class to
o DB!Otro( ), tabla DB!Table( name lt-
c.name)
94Patrón destino Iterativo
- Permite generar un conjunto de elementos destino
a partir de un elemento orígen - Definición
- distinct tipo foreach(iterador)
- Ejemplo
- using nombres Sequence(String)Sequencea,b,
cto tablas distinct DB!Table foreach(e
in nombres)( name lt- e)
95Do Bloque Imperativo
- Las matched rules permiten incluir opcionalmente
bloques imperativos - Ejemplo
- helper def id Integer0
- rule class2tablefrom cUML!Classto
tDB!Table()do thisModule.id lt-
thisModule.id1 t.id lt-thisModule.id
96Lazy rules
- Variante de las matched rules
- Reglas declarativas que deben ser llamadas
explicitamente - En cada llamada generan elementos nuevos
- Salvo que se definan como unique lazy rule
- Ejemplo
- Definición
- lazy rule getTable from i UML!Class to rel
DB!Table ( ) - Llamada
- thisModule.getTable()
97Called Rules
- Reglas que se llaman explicitamente
- Sintaxis similar a las matched rules
- No tienen sección from
- La sección to es opcional
- Pueden aceptar parámetros
- Permiten definir un entrypoint
- Se ejecutará antes de la fase de matching
98Ejemplo Called Rules
- helper def schemaDB!SchemaOclUndefined
-
- entrypoint rule Schema()
- to sDB!Schema
- do
- thisModule.schemalt-s
-
99Agenda
- Introducción
- Lenguajes de transformación de modelos
- Introducción a ATL
- ATL y Eclipse
- Tutorial 1
- Tutorial 2
- ATL al detalle
- Tutorial 3
- ATL Avanzado
- Referencias
100Tutorial 3 Library2Mindmap
101Library
102Mindmap
103Transformación
- Los Autores y Empleados se presentarán como
Topics - Los topics de Autor con prioridad 5
- Los topics de Empleado con prioridad 0
- Habrá relaciones de tipo Dependency entre topics
sii - El topic origen es un autor y el destino un
empleado - El empleado está encargado de alguna estantería
dónde se encuentra algún libro del autor - Los topics de autores contendrán un Thread por
libro - Cada Thread contendrá un ThreadItem con el nombre
de la estantería que contiene el libro - Los Topics de Empleados contendrán un Thread por
cada estantería de la que se encargan
104Modelo de ejemplo
105Resultado Esperado
106Transformación
107Agenda
- Introducción
- Lenguajes de transformación de modelos
- Introducción a ATL
- ATL y Eclipse
- Tutorial 1
- Tutorial 2
- ATL al detalle
- Tutorial 3
- ATL Avanzado
- Referencias
108ATL Avanzado
- ATL 2006
- Nuevo compilador (frente a ATL 2004)
- Introduce diversas mejoras
- Múltiples patrones Origen
- Herencia de reglas
- Para usarlo el módulo debe contener en la primera
línea el comentario - -- _at_atlcompiler atl2006
- No soporta (todavía) el modo de ejecución de
refinamiento
109Múltiples patrones origen
- rule StructuralFeature
- from
- s KM3!StructuralFeature,
- c KM3!Class (
- c.allStructuralFeatures-gtincludes(s)
- and not c.isAbstract
- )
- to
- t ATL!Binding (
- propertyName lt- s.name,
- )
- -- ...
110Herencia de reglas
- Las reglas hijas deben afectar a un subconjunto
de los elementos de la regla padre - abstract rule R1
- -- ...
-
- rule R2 extends R1
- -- ...
-
111Problemas comunes (y soluciones!)
- Si algún literal o nombre de elemento coincide
con alguna palabra reservada, deberá
entrecomillarse - 1, Map
- No puede haber dos reglas con el mismo nombre
- Solo puede haber una regla por elemento del
metamodelo origen. - Se pueden definir varios objetivos alternativos,
pero para que se ejecuten deberá indicarse
explícitamente mediante resolveTemp. - resolveTemp no se puede ejecutar sobre
colecciones - Hay que usar collect para aplicarlo a los
elementos - Cuando hay varios modelos de salida si son del
mismo metamodelo no hay forma de determinar en
cual de los dos queremos crear elementos ya que
solo se indican los elementos a crear de la forma
MM!Elemento. - Solución definirlos como si fuesen de
metamodelos distintos y en la configuración
indicar que se trata del mismo.
112Agenda
- Introducción
- Lenguajes de transformación de modelos
- Introducción a ATL
- ATL y Eclipse
- Tutorial 1
- Tutorial 2
- ATL al detalle
- Tutorial 3
- ATL Avanzado
- Referencias
113Referencias
- ATL Documentation
- User Manual, Starter Guide
- http//www.eclipse.org/m2m/atl/doc/
- Open Model CourseWare
- http//www.eclipse.org/gmt/omcw/resources/chapter1
0/ - Ejemplos (unos 100)
- ATL Transformations
- http//www.eclipse.org/m2m/atl/atlTransformations/
- ATL Use Cases
- http//www.eclipse.org/m2m/atl/usecases/
- Problemas y soluciones
- http//wiki.eclipse.org/index.php/ATL_Language_Tro
ubleshooter