Post on 13-Jan-2016
description
Transformación de modelos con ATL
Pau GinerPau Giner
OO-Method Research GroupDepartment of Information Systems and Computation
Technical University of Valencia, Spain
Transformación de modelos con ATL 2/113
Agenda 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
Transformación de modelos con ATL 3/113
ATL
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
Transformación de modelos con ATL 4/113
Tipos de fichero ATL
ATL moduleConjunto de reglas de transformación
LibraryConjunto de funciones de ayuda que puede ser
importado Query
Consultas que obtienen un valor simple de un modelo
Transformación de modelos con ATL 5/113
ATL: 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.
Transformación de modelos con ATL 6/113
Patrón Origen
El patrón origen está formado por:Un conjunto etiquetado de elementos de los
metamodelos origenUna 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.
Transformación de modelos con ATL 7/113
Patró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
Transformación de modelos con ATL 8/113
Ejemplo de regla
“Las Clases marcadas como persistentes, se transformarán en Tablas cuyo nombre será el nombre de la clase original”
Clase
nombrepersistente
Tabla
nombre
Transformación de modelos con ATL 9/113
Ejemplo de regla
Metamodelos Origen: Diagrama de Clases Destino: Modelo Relacional
Patrón origen Elementos
c: Clase Guarda
c.persistente Patrón destino
Elementos t:Tabla
Inicialización t.nombre c.nombre
Clase
nombrepersistente
Tabla
nombre
Transformación de modelos con ATL 10/113
Orden 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
Transformación de modelos con ATL 11/113
ATL: Un vistazo a la sintaxis
Transformación (ATL module):Cabecera Importación de libreríasHelpers y AttributesReglas
Modos de ejecuciónNormalRefinamiento
Transformación de modelos con ATL 12/113
ATL: Cabecera
module module_name;
create output_models [from|refines] 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
Transformación de modelos con ATL 13/113
ATL: Librerías
uses lib_name;
Permiten la modularización y reutilización de helpersuses string
Transformación de modelos con ATL 14/113
ATL: Helpers
helper [context context_type] def : helper_name(parameters) :
return_type = exp; Permiten extender el metamodelo con funciones y
atributos derivadosSon atributos si no se usan parámetrosLas expresiones se definen en OCLEl 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;
Transformación de modelos con ATL 15/113
ATL: 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 }]}
Transformación de modelos con ATL 16/113
Agenda 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
Transformación de modelos con ATL 17/113
Tutorial 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.
Transformación de modelos con ATL 18/113
Cabecera
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
Transformación de modelos con ATL 19/113
Helpers
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->collect(c|c.nbPages).sum(); Los contextos se expresan como Metamodelo!
Elemento Book!Book: La clase Book del metamodelo Book
Transformación de modelos con ATL 20/113
Reglas
rule Book2Publication {from b : Book!Bookto out : Publication!Publication( title <- b.title, nbPages <- b.getSumPages())}
Transformación de modelos con ATL 21/113
Reglas (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() > 2) to out : Publication!Publication ( title <- b.title, nbPages <- b.getSumPages() )}
Transformación de modelos con ATL 22/113
Mensajes de salida
Todo elemento tiene la operación debug queDevolverá 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’) > 2
Transformación de modelos con ATL 23/113
Extras
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()->size().toString(); El método writeTo(fichero:String) permite escribir la cadena a un
fichero
Transformación de modelos con ATL 24/113
Agenda 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
Transformación de modelos con ATL 25/113
ATL al detalle
Sistema de tipos Comentarios Expresiones declarativas Helpers Reglas
Transformación de modelos con ATL 26/113
Sistema de tipos
Transformación de modelos con ATL 27/113
OclType
Sus instancias son los distintos tipos Operaciones
allInstances() Devuelve el conjunto de las instancias de un tipo
Book!Chapter.allInstances()
allInstancesFrom(metamodel:String) Devuelve las instancias contenidas en el modelo
Book!Chapter.allInstancesFrom(‘IN’)
Transformación de modelos con ATL 28/113
OclAny
Cualquier objeto pertenece a OclAny Operaciones
Comparación: = <> 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(t:oclType) Indica si self es instancia directa del tipo t
3. oclIsTypeOf(Integer)
Transformación de modelos con ATL 29/113
OclAny
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
Transformación de modelos con ATL 30/113
ATL Module
Representa el módulo y solo tiene una instancia: thisModule
Permite definir helpers y atributos “globales” Operaciones
resolveTemp(var:oclAny, target:String) Permite determinar que patrón target se aplicará a un
objeto origen var. Útil cuando no se desea aplicar el patrón por defecto
Transformación de modelos con ATL 31/113
Primitive
Tipos primitivos Boolean: true, false
Operadores lógicos: and, or, xor, not implies(b:Boolean): self b
Numerical (Integer, Real) Comparación: <, >, =>, >= 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
Transformación de modelos con ATL 32/113
String
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(lower:Integer, upper:Integer) Conversión: toInteger, toReal, toSequence, toUpper, toLower Salida
writeTo(file:String): escribe la cadena a un fichero Las rutas relativas se consideran desde el directorio de eclipse
println(): escribe en la salida estándar
Transformación de modelos con ATL 33/113
Collection
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ón{elementos}
Set{1,2,3} La invocación de operaciones se realiza utilizando ‘->’
'Set{1,2,3}->size()
Transformación de modelos con ATL 34/113
Collection
Operaciones comunes size() includes(x:oclAny)
Devuelve true si x pertenece a la colección. excludes(x:oclAny)
Devuelve true si x no pertenece a la colección. count(x:oclAny)
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()
Transformación de modelos con ATL 35/113
Sequence
union(c: Colection) Devuelve una colección con la unión de los contenidos
flatten() Sequence{Set{1,2},Set{3,4}} Sequence{1,2,3,4}
append, prepend, insertAt(pos:Integer) Inserción al final, inicio o posición determinada
first(), last(), at(pos:Integer) Recuperación del primer, último o elemento indicado
Transformación de modelos con ATL 36/113
Set
union, intersection self –(s:Set)
Set con los elementos de self que no están en s
Including(x:oclAny), excluding(x:oclAny) Devuelven un set con o sin el elemento x
symetricDifference(s:Set) Devuelve los elementos que están en self o en s pero no
en ambos
Transformación de modelos con ATL 37/113
Iterar sobre colecciones
Facilidades para recorrer colecciones Colección->operació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
Transformación de modelos con ATL 38/113
Iterar 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
Transformación de modelos con ATL 39/113
Iterar sobre colecciones
Para casos más complejos… Iterate(iterador; variable=inicialización | cuerpo)
EjemploSet{1,2,3}->iterate(e; res:Integer=0 | res+e)
Transformación de modelos con ATL 40/113
Enumeraciones
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.: dia<- #Lunes
Si el nombre del literal coincide con alguna palabra reservada, se entrecomillará
Ej: #”Integer”
Para comparar mp.kind <> #out
Transformación de modelos con ATL 41/113
Tuple
Permiten definir valores compuestos Definición
TupleType(var_name, var_type,…)Ej.: TupleType(a:MM!Author, title:String)
UsoTuple{var_name[:var_type]=value,…}Ej.:Tuple{title=‘El Aleph’, author=b}
Transformación de modelos con ATL 42/113
Map
Define una tabla de mappings clave-valor Definición
Map(key_type, value_type)Ej.: Map(Integer, MM!Author)
UsoMap{(key,value),…}Ej.: Map{(1,aut1), (2,aut2)}
Transformación de modelos con ATL 43/113
Map
Operaciones get(key) value including(key,val)
Nuevo Map, que incluye el valor indicado si no contenía la clave key
Union(m:Map) Nuevo Map, que incluye los elementos de m
getKeys, getValues Colección con las claves o los valores
Transformación de modelos con ATL 44/113
Model 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 *
Transformación de modelos con ATL 45/113
Comentarios
Se usa el doble guiónEjemplo: --comentario
Hasta el final de la línea En la primera línea del fichero, determinan el
compilador-- @atlcompiler atl2006 -- @atlcompiler atl2004
Transformación de modelos con ATL 46/113
Expresiones declarativas
IfPermite definir expresiones condicionales if condición then exp1 else exp2 endif
No se puede omitir ninguna parteRepresenta decisiones sobre datos
No control de flujoEj: if x>3 then ‘mayor que 3’ else ‘menor o igual
que 3’ endif
Transformación de modelos con ATL 47/113
Expresiones declarativas
Let Permite definir variables locales let nombre : tipo = inicialización in exp let a: Integer = 1 in a+2 Se pueden encadenar
let a:Integer=1 inlet b:Integer=2 ina+b
Facilitan la legibilidad y la depuración
Transformación de modelos con ATL 48/113
Expresiones declarativas
Cuidado!! Las expresiones lógicas se evalúan completamente Problema
not person.oclIsUndefined() and person.name=‘Pepe’ 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.name=‘Pepe’ endif
Transformación de modelos con ATL 49/113
Funciones 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
Transformación de modelos con ATL 50/113
Helpers
Helper helper [context context_type] def : helper_name(parameters) :
return_type = exp; Attribute
helper [context context_type] def : helper_name : return_type = exp;
Transformación de modelos con ATL 51/113
Helpers
Helper Definición
helper [context context_type] def : helper_name(parameters) : return_type = exp;
helper context Integer def: suma(b:Integer):Integer= self*b; Uso: 3.suma(2)
Attribute Definición
Como el helper pero sin parámetros helper context MM!Person def: mayor: Boolean= self.age>=18
Uso: p.mayor
Transformación de modelos con ATL 52/113
Helpers: Limitaciones
No se puede definir una colección como contexto Problema
helper context Set(MM!Person) def: getYounger(age:Integer): Set(MM!Person)…
Solución helper def getYpunger(s: Set(MM!Person, age:Integer)…
En las librerías no se aceptan attributes Se debe definir toda función como helper
Transformación de modelos con ATL 53/113
Reglas ATL
Código imperativo Matched Rules Called Rules
Transformación de modelos con ATL 54/113
Có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 <- exp; Condición
if(condición) { sentencias;} [else {sentencias;}]? Bucles
for(iterador in colección) { sentencias;} for(p in persons){…}
Transformación de modelos con ATL 55/113
Matched Rules
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 }]}
Patrón origen
Variables locales
Patrón destino
Bloque imperativo
Transformación de modelos con ATL 56/113
From: Patrón Origen
Determina los elementos origen sobre los que se aplicará la regla
Ejemplofrom p:MM!Person
Puede incluir condiciones para afectar solo a un subconjunto de elementosfrom p:MM!Person( p.name=‘Pepe’)
Transformación de modelos con ATL 57/113
Using: Variables locales
Permite definir variables locales a usar en La propia sección using Secciones to y do
Ejemplo from c:Geo!Circulo
using{pi:Real=3.14area:Real=pi*c.radio.square()
}
Transformación de modelos con ATL 58/113
To: 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
Transformación de modelos con ATL 59/113
Ejemplo: Patrón destino Simple
from b : Book!Book
to out : Publication!Publication(
title <- b.title,
nbPages <- b.getSumPages()
)
Transformación de modelos con ATL 60/113
Inicialización de referencias
Podemos inicializar una referencia conElemento destino creado por la propia reglaEl elemento generado por defecto por otra reglaElemento no generado por defecto de otra regla
Transformación de modelos con ATL 61/113
Inicialización de referencias
Podemos inicializar una referencia con Elemento destino creado por la propia regla
from c:UML!Classto tabla:DB!Table( name <- c.name, primaryKey <- pk)pk:DB!PrimaryKey(
…)
Transformación de modelos con ATL 62/113
Inicialización de referencias
Podemos inicializar una referencia conEl elemento generado por defecto por otra regla
rule model2schema{from m:UML!Modelto s:DB!Schema( name <- m.name, tables<- m.classes)}
rule class2table{ from c: UML!Class to tabla: DB!Table(
name <- c.name)
}
Transformación de modelos con ATL 63/113
Inicialización de referencias
Podemos inicializar una referencia conElemento no generado por defecto de otra regla
rule model2schema{from m:UML!Modelto s:DB!Schema( name <- m.name, tables<- m.classes-> collect(c|thisModuleResolveTemp(c,’tabla’))}
rule class2table{ from c: UML!Class to o: DB!Otro( … ), tabla: DB!Table(
name <- c.name)}
Transformación de modelos con ATL 64/113
Patró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)=Sequence{‘a’,’b’,’c’}}
to tablas: distinct DB!Table foreach(e in nombres)(
name <- e)
Transformación de modelos con ATL 65/113
Do: Bloque Imperativo
Las matched rules permiten incluir opcionalmente bloques imperativos
Ejemplo helper def id: Integer=0;
… rule class2table{
from c:UML!Classto t:DB!Table(…)do{ thisModule.id <- thisModule.id+1; t.id <-thisModule.id; }}
Transformación de modelos con ATL 66/113
Lazy 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()
Transformación de modelos con ATL 67/113
Called Rules
Reglas que se llaman explicitamente Sintaxis similar a las matched rules
No tienen sección fromLa sección to es opcionalPueden aceptar parámetrosPermiten definir un entrypoint
Se ejecutará antes de la fase de matching
Transformación de modelos con ATL 68/113
Ejemplo: Called Rules
helper def: schema:DB!Schema=OclUndefined
…
entrypoint rule Schema(){
to s:DB!Schema
do{
thisModule.schema<-s
}
}
Transformación de modelos con ATL 69/113
Agenda 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
Transformación de modelos con ATL 70/113
Tutorial 3: Library2Mindmap
Transformación de modelos con ATL 71/113
Library
Transformación de modelos con ATL 72/113
Mindmap
Transformación de modelos con ATL 73/113
Transformació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
Transformación de modelos con ATL 74/113
Modelo de ejemplo
Transformación de modelos con ATL 75/113
Resultado Esperado
Transformación de modelos con ATL 76/113
Transformación
Transformación de modelos con ATL 77/113
Agenda 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
Transformación de modelos con ATL 78/113
ATL 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:
-- @atlcompiler atl2006
No soporta (todavía) el modo de ejecución de refinamiento
Transformación de modelos con ATL 79/113
Múltiples patrones origen
rule StructuralFeature {from
s : KM3!StructuralFeature,c : KM3!Class (
c.allStructuralFeatures->includes(s)and not c.isAbstract
)to
t : ATL!Binding (propertyName <- s.name,
)-- ...
}
Transformación de modelos con ATL 80/113
Herencia de reglas
Las reglas hijas deben afectar a un subconjunto de los elementos de la regla padre
abstract rule R1 {-- ...
}rule R2 extends R1 {-- ...
}
Transformación de modelos con ATL 81/113
Problemas 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.
Transformación de modelos con ATL 82/113
Agenda 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
Transformación de modelos con ATL 83/113
Referencias
ATL Documentation User Manual, Starter Guide… http://www.eclipse.org/m2m/atl/doc/
Open Model CourseWare http://www.eclipse.org/gmt/omcw/resources/chapter10/
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_Troubleshooter