Este documento presenta una lección sobre el lenguaje de transformación de modelos Atlas Transformation Language (ATL). Se introducen conceptos clave como módulos ATL, tipos de datos primitivos y de colecciones en ATL, así como operaciones y características de estos tipos. También se explican conceptos como reglas ATL, helpers y atributos y cómo se pueden usar para transformar modelos.
BÀI 1 Những khái niệm đầu tiên về HTML5 - Giáo trình FPTMasterCode.vn
Định nghĩa về HTML5
Tổng quát về cú pháp của HTML5
Một số thành phần mới của HTML5
Tổng quan về HTML5 API (giao diện lập trình ứng
dụng) và công nghệ hỗ trợ
Giới thiệu CSS3
Định nghĩa về HTML5
Tổng quát về cú pháp của HTML5
Một số thành phần mới của HTML5
Tổng quan về HTML5 API (giao diện lập trình ứng
dụng) và công nghệ hỗ trợ
Giới thiệu CSS3
69 câu hỏi phỏng vấn kỹ sư Công nghệ Thông tinVu Hung Nguyen
Bộ 69 câu hỏi phỏng vấn giành cho kỹ sư công nghệ thông tin.
Đối tượng hưởng lợi:
- Người đi phỏng vấn: Biết được những câu hay bị hỏi
- Người phỏng vấn: Có một bộ câu hỏi phỏng vấn cơ bản làm cơ sở
TECNOLÓGICO NACIONAL DE MÉXICO
Ingeniería en Sistemas Computacionales
Fundamentos de Programación
Unidad IV: Arreglos (Vectores)
Retícula ISIC-2010-224: Programa: AED-1285
Este documento presenta una introducción a Scala y Apache Spark. Incluye información sobre la instalación de Scala y Apache Spark, una introducción al lenguaje Scala cubriendo cadenas, números, clases implícitas y más, y finalmente una introducción a Apache Spark con un ejemplo en Scala.
BÀI 1 Những khái niệm đầu tiên về HTML5 - Giáo trình FPTMasterCode.vn
Định nghĩa về HTML5
Tổng quát về cú pháp của HTML5
Một số thành phần mới của HTML5
Tổng quan về HTML5 API (giao diện lập trình ứng
dụng) và công nghệ hỗ trợ
Giới thiệu CSS3
Định nghĩa về HTML5
Tổng quát về cú pháp của HTML5
Một số thành phần mới của HTML5
Tổng quan về HTML5 API (giao diện lập trình ứng
dụng) và công nghệ hỗ trợ
Giới thiệu CSS3
69 câu hỏi phỏng vấn kỹ sư Công nghệ Thông tinVu Hung Nguyen
Bộ 69 câu hỏi phỏng vấn giành cho kỹ sư công nghệ thông tin.
Đối tượng hưởng lợi:
- Người đi phỏng vấn: Biết được những câu hay bị hỏi
- Người phỏng vấn: Có một bộ câu hỏi phỏng vấn cơ bản làm cơ sở
TECNOLÓGICO NACIONAL DE MÉXICO
Ingeniería en Sistemas Computacionales
Fundamentos de Programación
Unidad IV: Arreglos (Vectores)
Retícula ISIC-2010-224: Programa: AED-1285
Este documento presenta una introducción a Scala y Apache Spark. Incluye información sobre la instalación de Scala y Apache Spark, una introducción al lenguaje Scala cubriendo cadenas, números, clases implícitas y más, y finalmente una introducción a Apache Spark con un ejemplo en Scala.
Procesamiento de datos a gran escala con Apache SparkSoftware Guru
Apache Spark es un framework para procesamiento de datos en paralelo que permite el procesamiento de los mismos en la memoria. Es hasta 100x más rápido que Apache Hadoop. Hoy en día las aplicaciones estarán pensadas para DataWorkflows y Spark te permite esta interacción con esos datos ya sea en Scala o Python. Adicionalmente puedes aplicar una seríe de Transformaciones a esos datos y aplicar procesamiento en Grafos (GraphX) Machine Learning (MLLib)
Sistemas de producción: Introducción a CLIPSfmartin6
Este documento resume los conceptos básicos de los sistemas de producción y la herramienta CLIPS. Explica que un sistema de producción consta de una base de hechos, una base de reglas y un motor de inferencia. Describe los componentes de CLIPS como reglas, hechos, plantillas, variables y funciones. Presenta ejemplos de cómo identificar animales y clasificar triángulos usando reglas y restricciones en CLIPS.
Este documento describe conceptos avanzados de programación como métodos, clases estáticas, la clase Math, declaración de métodos con múltiples parámetros, y arreglos. Explica cómo los métodos permiten dividir un programa en partes más pequeñas, evitar la repetición de código, y facilitar la depuración y reutilización. También describe cómo declarar y llamar métodos, incluyendo métodos estáticos y sobrecargados, y cómo declarar, crear y pasar arreglos a métodos.
Este documento describe los diferentes tipos de datos en R, incluyendo datos atómicos (caracteres, numéricos, enteros, complejos y lógicos), vectores, listas, matrices, dataframes y factores. Explica cómo crear y manipular objetos de cada tipo, así como funciones útiles como class(), str() y summary() para obtener información sobre los objetos. También cubre conversiones entre tipos de datos usando funciones como as.character() e is.list().
Este documento presenta una introducción a la programación orientada a objetos en Python. Explica conceptos clave como clases, objetos, atributos, métodos, constructores y variables de instancia. También muestra ejemplos de cómo definir una clase Circle que modela un círculo, crear instancias de objetos Circle y acceder a sus atributos y métodos.
El documento describe las características principales del lenguaje de programación Ruby. Ruby es un lenguaje interpretado, orientado a objetos y de tipado dinámico. No requiere declaraciones de variables y tiene una sintaxis simple. Todo en Ruby es un objeto y admite características como clases, herencia, métodos, bloques e iteradores.
El documento describe las características principales del lenguaje de programación Ruby. Ruby es un lenguaje interpretado, orientado a objetos y de tipado dinámico. No requiere declaraciones de variables y tiene una sintaxis simple. Todo en Ruby es un objeto y admite características como clases, herencia, métodos, iteradores, bloques, expresiones regulares y manejo de excepciones.
Este documento describe algunas clases predefinidas en Java como String, Math y las clases envoltorio. La clase String permite manipular cadenas de caracteres mediante métodos como length(), substring(), equals(), etc. La clase Math contiene constantes y métodos estáticos para operaciones matemáticas como seno, coseno, logaritmos, raíz cuadrada y generación de números aleatorios. Las clases envoltorio como Integer, Float y Double permiten tratar valores elementales como objetos con funcionalidades adicionales.
Django es un framework web popular escrito en Python que sigue el patrón MVC. Proporciona herramientas como un ORM, sistema de plantillas, administrador de contenido, autenticación incorporada y más. Django usa una arquitectura MTV donde las vistas reemplazan a los controladores y las plantillas a las vistas. Esto permite crear aplicaciones web de forma rápida y eficiente siguiendo principios como DRY.
Este documento presenta una práctica sobre encapsulamiento y abstracción que incluye implementar las estructuras de datos pila y cola en Python. Se pide desarrollar funciones para invertir cadenas y sumar elementos de colas usando pilas o colas, y evaluar expresiones en notación posfija. También se propone resolver un ejercicio sobre cadenas balanceadas usando estas estructuras de datos.
Este documento describe el concepto de Result Set, el cual contiene filas de datos de una consulta SQL y permite acceder a los valores de las columnas de cada fila a través de métodos get. Un cursor se mueve a través de las filas del Result Set y los métodos next() y getXXX() se usan para moverse entre filas y obtener valores de columnas respectivamente. El documento también recomienda cómo crear e iterar sobre un Result Set en Java.
El documento describe arrays unidimensionales y sus aplicaciones. Introduce arrays como una colección de elementos homogéneos agrupados de forma consecutiva en memoria, donde cada elemento tiene un índice que lo identifica. Explica cómo declarar y acceder a arrays, así como conceptos como el tamaño y longitud de un array. También cubre el paso de arrays como parámetros y la creación de arrays de objetos.
El documento explica el algoritmo de ordenamiento por burbuja (bubble sort), uno de los métodos más simples y antiguos para ordenar una lista de elementos. Funciona comparando pares adyacentes de elementos e intercambiándolos si están en el orden equivocado, repitiendo este proceso hasta que la lista quede completamente ordenada. Se incluye un ejemplo en C# que implementa este algoritmo para ordenar un arreglo de números.
Swift es un nuevo lenguaje de programación seguro, moderno y potente desarrollado por Apple para crear aplicaciones en iOS y OS X. Algunas características clave de Swift incluyen gestión automática de memoria, sintaxis sencilla, tipos y clases mejorados, y compatibilidad con Objective-C. Swift también introduce nuevos conceptos como closures, opciones y genéricos.
El documento presenta una introducción a los conceptos básicos de la programación orientada a objetos. Explica las diferencias entre la programación procedural y la orientada a objetos, y define conceptos clave como clases, objetos, herencia, polimorfismo y encapsulamiento. También describe brevemente los beneficios de la programación orientada a objetos como la reutilización de código, el mantenimiento y la extensibilidad.
Este documento proporciona un repaso de conceptos básicos de programación como clases, arrays, estructuras de datos, excepciones, herencia y polimorfismo. El objetivo es refrescar estos conocimientos y practicarlos. Incluye temas, bibliografía, ejemplos y ejercicios para reforzar los conceptos clave de programación en Java.
Este documento describe T2, una herramienta para el testeo automático de unidades en Java. T2 genera secuencias aleatorias de llamadas a métodos y asignaciones de atributos para probar una clase. Los usuarios pueden agregar especificaciones "in-code" y modelos de aplicación para guiar la generación de pruebas. Se ha demostrado que T2 encuentra errores de manera efectiva con un bajo costo.
Este documento presenta una introducción al lenguaje de transformación de modelos Atlas Transformation Language (ATL). Explica los conceptos básicos de ATL como módulos, reglas, helpers y librerías. También describe los diferentes tipos de reglas en ATL como reglas emparejadas, reglas perezosas y reglas llamadas, así como la estructura y sintaxis de estas reglas. El objetivo final es transformar modelos de entrada en modelos de salida mediante la especificación de correspondencias entre elementos de los metamodelos de entrada y salida.
Herencia es uno de los pilares en la Programacion Orientada a Objetos.
En esta diapositiva se muestra los principios de herencia y su implementacion en Java con clases abstractas e interfaces
Introdución a las Arquitecturas Dirigidas por ModelosRicardo Tesoriero
Este documento presenta una introducción a los métodos avanzados de desarrollo de software. Explica que los métodos tradicionales de desarrollo de software son caros y propensos a errores, por lo que se necesitan nuevos enfoques. Además, describe cómo la industria del software ha estado elevando los niveles de abstracción y reutilización a lo largo de los años para mejorar la productividad y la calidad. Finalmente, introduce el concepto de Arquitectura Dirigida por Modelos como un nuevo enfoque prometedor.
Este documento presenta Acceleo, un lenguaje de transformación de modelos a texto. Explica los principales componentes de Acceleo como módulos, plantillas, consultas y ayudantes. Detalla el uso de plantillas para generar texto, bucles, condiciones y asignaciones. También cubre consultas OCL para extraer información de los modelos.
Más contenido relacionado
Similar a Transformaciones modelo a modelo: ATL (ParteII)
Procesamiento de datos a gran escala con Apache SparkSoftware Guru
Apache Spark es un framework para procesamiento de datos en paralelo que permite el procesamiento de los mismos en la memoria. Es hasta 100x más rápido que Apache Hadoop. Hoy en día las aplicaciones estarán pensadas para DataWorkflows y Spark te permite esta interacción con esos datos ya sea en Scala o Python. Adicionalmente puedes aplicar una seríe de Transformaciones a esos datos y aplicar procesamiento en Grafos (GraphX) Machine Learning (MLLib)
Sistemas de producción: Introducción a CLIPSfmartin6
Este documento resume los conceptos básicos de los sistemas de producción y la herramienta CLIPS. Explica que un sistema de producción consta de una base de hechos, una base de reglas y un motor de inferencia. Describe los componentes de CLIPS como reglas, hechos, plantillas, variables y funciones. Presenta ejemplos de cómo identificar animales y clasificar triángulos usando reglas y restricciones en CLIPS.
Este documento describe conceptos avanzados de programación como métodos, clases estáticas, la clase Math, declaración de métodos con múltiples parámetros, y arreglos. Explica cómo los métodos permiten dividir un programa en partes más pequeñas, evitar la repetición de código, y facilitar la depuración y reutilización. También describe cómo declarar y llamar métodos, incluyendo métodos estáticos y sobrecargados, y cómo declarar, crear y pasar arreglos a métodos.
Este documento describe los diferentes tipos de datos en R, incluyendo datos atómicos (caracteres, numéricos, enteros, complejos y lógicos), vectores, listas, matrices, dataframes y factores. Explica cómo crear y manipular objetos de cada tipo, así como funciones útiles como class(), str() y summary() para obtener información sobre los objetos. También cubre conversiones entre tipos de datos usando funciones como as.character() e is.list().
Este documento presenta una introducción a la programación orientada a objetos en Python. Explica conceptos clave como clases, objetos, atributos, métodos, constructores y variables de instancia. También muestra ejemplos de cómo definir una clase Circle que modela un círculo, crear instancias de objetos Circle y acceder a sus atributos y métodos.
El documento describe las características principales del lenguaje de programación Ruby. Ruby es un lenguaje interpretado, orientado a objetos y de tipado dinámico. No requiere declaraciones de variables y tiene una sintaxis simple. Todo en Ruby es un objeto y admite características como clases, herencia, métodos, bloques e iteradores.
El documento describe las características principales del lenguaje de programación Ruby. Ruby es un lenguaje interpretado, orientado a objetos y de tipado dinámico. No requiere declaraciones de variables y tiene una sintaxis simple. Todo en Ruby es un objeto y admite características como clases, herencia, métodos, iteradores, bloques, expresiones regulares y manejo de excepciones.
Este documento describe algunas clases predefinidas en Java como String, Math y las clases envoltorio. La clase String permite manipular cadenas de caracteres mediante métodos como length(), substring(), equals(), etc. La clase Math contiene constantes y métodos estáticos para operaciones matemáticas como seno, coseno, logaritmos, raíz cuadrada y generación de números aleatorios. Las clases envoltorio como Integer, Float y Double permiten tratar valores elementales como objetos con funcionalidades adicionales.
Django es un framework web popular escrito en Python que sigue el patrón MVC. Proporciona herramientas como un ORM, sistema de plantillas, administrador de contenido, autenticación incorporada y más. Django usa una arquitectura MTV donde las vistas reemplazan a los controladores y las plantillas a las vistas. Esto permite crear aplicaciones web de forma rápida y eficiente siguiendo principios como DRY.
Este documento presenta una práctica sobre encapsulamiento y abstracción que incluye implementar las estructuras de datos pila y cola en Python. Se pide desarrollar funciones para invertir cadenas y sumar elementos de colas usando pilas o colas, y evaluar expresiones en notación posfija. También se propone resolver un ejercicio sobre cadenas balanceadas usando estas estructuras de datos.
Este documento describe el concepto de Result Set, el cual contiene filas de datos de una consulta SQL y permite acceder a los valores de las columnas de cada fila a través de métodos get. Un cursor se mueve a través de las filas del Result Set y los métodos next() y getXXX() se usan para moverse entre filas y obtener valores de columnas respectivamente. El documento también recomienda cómo crear e iterar sobre un Result Set en Java.
El documento describe arrays unidimensionales y sus aplicaciones. Introduce arrays como una colección de elementos homogéneos agrupados de forma consecutiva en memoria, donde cada elemento tiene un índice que lo identifica. Explica cómo declarar y acceder a arrays, así como conceptos como el tamaño y longitud de un array. También cubre el paso de arrays como parámetros y la creación de arrays de objetos.
El documento explica el algoritmo de ordenamiento por burbuja (bubble sort), uno de los métodos más simples y antiguos para ordenar una lista de elementos. Funciona comparando pares adyacentes de elementos e intercambiándolos si están en el orden equivocado, repitiendo este proceso hasta que la lista quede completamente ordenada. Se incluye un ejemplo en C# que implementa este algoritmo para ordenar un arreglo de números.
Swift es un nuevo lenguaje de programación seguro, moderno y potente desarrollado por Apple para crear aplicaciones en iOS y OS X. Algunas características clave de Swift incluyen gestión automática de memoria, sintaxis sencilla, tipos y clases mejorados, y compatibilidad con Objective-C. Swift también introduce nuevos conceptos como closures, opciones y genéricos.
El documento presenta una introducción a los conceptos básicos de la programación orientada a objetos. Explica las diferencias entre la programación procedural y la orientada a objetos, y define conceptos clave como clases, objetos, herencia, polimorfismo y encapsulamiento. También describe brevemente los beneficios de la programación orientada a objetos como la reutilización de código, el mantenimiento y la extensibilidad.
Este documento proporciona un repaso de conceptos básicos de programación como clases, arrays, estructuras de datos, excepciones, herencia y polimorfismo. El objetivo es refrescar estos conocimientos y practicarlos. Incluye temas, bibliografía, ejemplos y ejercicios para reforzar los conceptos clave de programación en Java.
Este documento describe T2, una herramienta para el testeo automático de unidades en Java. T2 genera secuencias aleatorias de llamadas a métodos y asignaciones de atributos para probar una clase. Los usuarios pueden agregar especificaciones "in-code" y modelos de aplicación para guiar la generación de pruebas. Se ha demostrado que T2 encuentra errores de manera efectiva con un bajo costo.
Este documento presenta una introducción al lenguaje de transformación de modelos Atlas Transformation Language (ATL). Explica los conceptos básicos de ATL como módulos, reglas, helpers y librerías. También describe los diferentes tipos de reglas en ATL como reglas emparejadas, reglas perezosas y reglas llamadas, así como la estructura y sintaxis de estas reglas. El objetivo final es transformar modelos de entrada en modelos de salida mediante la especificación de correspondencias entre elementos de los metamodelos de entrada y salida.
Herencia es uno de los pilares en la Programacion Orientada a Objetos.
En esta diapositiva se muestra los principios de herencia y su implementacion en Java con clases abstractas e interfaces
Similar a Transformaciones modelo a modelo: ATL (ParteII) (20)
Introdución a las Arquitecturas Dirigidas por ModelosRicardo Tesoriero
Este documento presenta una introducción a los métodos avanzados de desarrollo de software. Explica que los métodos tradicionales de desarrollo de software son caros y propensos a errores, por lo que se necesitan nuevos enfoques. Además, describe cómo la industria del software ha estado elevando los niveles de abstracción y reutilización a lo largo de los años para mejorar la productividad y la calidad. Finalmente, introduce el concepto de Arquitectura Dirigida por Modelos como un nuevo enfoque prometedor.
Este documento presenta Acceleo, un lenguaje de transformación de modelos a texto. Explica los principales componentes de Acceleo como módulos, plantillas, consultas y ayudantes. Detalla el uso de plantillas para generar texto, bucles, condiciones y asignaciones. También cubre consultas OCL para extraer información de los modelos.
Modelos de Marcas en Arquitecturas dirigidas por ModelosRicardo Tesoriero
Este documento trata sobre los modelos de marcado y las marcas. Explica que las marcas son extensiones livianas de los modelos que capturan información adicional necesaria para las transformaciones sin contaminar los modelos. También define que un modelo de marcado establece la relación entre las marcas de la misma forma que los metamodelos lo hacen con los modelos. Finalmente, discute formas de marcado, aplicaciones de marcas y la relación entre marcas y elementos de los modelos.
Este documento trata sobre las transformaciones de modelos en arquitecturas dirigidas por modelos. Explica brevemente las capas de abstracción, repasa la transformación de modelos y presenta un ejemplo informal de la transformación entre un modelo de análisis y uno de diseño para un sistema bancario. Luego define conceptos como funciones y reglas de transformación para mapear modelos de una forma reutilizable.
Este documento presenta una introducción a las arquitecturas dirigidas por modelos y la construcción de lenguajes. Explica que los meta-modelos definen lenguajes de una manera abstracta y que el Meta Object Facility (MOF) y los perfiles de UML son enfoques comunes para definir formalmente la sintaxis y semántica de un lenguaje específico. También cubre conceptos como estereotipos, restricciones y notaciones gráficas que son elementos clave en la construcción de lenguajes.
MOF básico para Arquitecturas dirigidas por ModelosRicardo Tesoriero
El documento describe la arquitectura Meta Object Facility (MOF) 2.0, que es el fundamento para la gestión de metadatos independientes de plataforma en el enfoque Modelo Dirigido por Arquitectura (MDA). MOF 2.0 unifica los conceptos de modelado con UML 2.0 y define dos variantes principales: EMOF (MOF esencial) y CMOF (MOF completo). El documento también explica varios paquetes como Reflection, Identifiers y Extension que proveen capacidades de extensión a los meta-modelos.
Este documento introduce los conceptos básicos de los meta-modelos y su relación con los modelos. Explica que un meta-modelo especifica los elementos de un lenguaje de modelado y permite definir transformaciones entre modelos. Además, describe la arquitectura de cuatro capas que incluye objetos, modelos, meta-modelos y meta-meta-modelos, siendo este último nivel especificado por MOF. Finalmente, concluye explicando los usos principales de los meta-modelos como declarar lenguajes de modelado y definir transformaciones entre modelos.
Este documento presenta una introducción al lenguaje Object Constraint Language (OCL). Explica que OCL es un lenguaje para especificar restricciones en modelos UML. Luego resume los orígenes y motivaciones de OCL, sus tipos de datos básicos, el uso de contexto y self, e introduce conceptos como invariantes, pre y post-condiciones. Finalmente, proporciona ejemplos de cómo usar OCL para definir restricciones en un modelo.
Este documento presenta una lección sobre arquitecturas dirigidas por modelos. Explica conceptos clave como abstracción, clasificación, generalización y diferentes tipos de modelos. También discute la importancia de construir modelos para simplificar la comprensión de sistemas complejos y cómo los modelos pueden usarse para comunicar ideas de manera más efectiva.
Terminología y conceptos en Arquitecturas dirigidas por ModelosRicardo Tesoriero
Este documento presenta un resumen de los conceptos clave de las Arquitecturas Dirigidas por Modelos (MDA). Explica que una MDA separa la especificación funcional de un sistema de los detalles de implementación en una plataforma específica. Define conceptos como modelo, meta-modelo, plataforma e introduce los puntos de vista independiente de plataforma (PIM) y específico de plataforma (PSM) que son clave en MDA.
Distributing user interfaces. 4th Distributed User Interfaces Workshop on 14t...Ricardo Tesoriero
Presentation of "Distributing User Interfaces" as invited talk by Prof. Dr. Ricardo Tesoriero on the 4th Workshop on Distributed User Interfaces in the 14th International Conference on Web Engineering ICWE 2014
This document describes UsiXML model editors for creating and editing four types of models: task models, domain models, context models, and abstract user interface models. It provides an overview of the model editors' key features, including support for editing multiple heterogeneous models simultaneously, model validation, and model persistence in XMI format. Screenshots display the tree and component views available for each model editor.
1. Prof. Dr. Ricardo TESORIERO – Departamento de Sistemas Informáticos- Universidad de Castilla-La Mancha
[ricardo.tesoriero@uclm.es]
Métodos Avanzados de Desarrollo de Software
Asignatura Optativa de 4º Año
Grado en Informática
Departamento de Sistemas Informáticos
Universidad de Castilla-La Mancha
Métodos avanzados de
desarrollo de software
Tema IX: Arquitecturas dirigidas por Modelos.
Atlas Transformation Language (ATL) - Parte II
2. Prof. Dr. Ricardo TESORIERO – Departamento de Sistemas Informáticos- Universidad de Castilla-La Mancha
[ricardo.tesoriero@uclm.es]
Índice
• Repaso
• Tipos de Datos
• ATL Modules
• Primitivos
• Colecciones
• Tipos
• Operaciones
• Iteradores
• Enumeraciones
• Tuplas
• Mapas
• Modelos
• Comentarios
• Expresiones
declarativas
• ATL Helpers
• Atributos
• Reglas
3. Prof. Dr. Ricardo TESORIERO – Departamento de Sistemas Informáticos- Universidad de Castilla-La Mancha
[ricardo.tesoriero@uclm.es]
Repaso
• ATL define 3 tipos de unidades
• ATL modules (transformaciones modelo a modelo)
• ATL queries (transformaciones a tipos primitivos)
• ATL libraries (librerías)
• Estas unidades están compuestas de una combinación de:
• Atributos
• ATL helpers
• Reglas
• Matched rules
• Called rules
• Lazy rules
• Todos estos elementos se definen con OCL
4. Prof. Dr. Ricardo TESORIERO – Departamento de Sistemas Informáticos- Universidad de Castilla-La Mancha
[ricardo.tesoriero@uclm.es]
Tipos de datos
No está definida en OCL
Module o Query
5. Prof. Dr. Ricardo TESORIERO – Departamento de Sistemas Informáticos- Universidad de Castilla-La Mancha
[ricardo.tesoriero@uclm.es]
Tipos de datos: OclType y OclAny
• OclType
• Instancias de tipos de OCL
• Operaciones:
• allInstances(): Todas las instancias de self
• allInstancesFrom(metamodel:String): Todas las instancias de un tipo en un meta-modelo
• OclAny
• Operaciones de comparación: = , <>
• oclIsUndefined(): true si self está indefinido
• oclIsKindOf(t:oclType): true si self es instancia de t o uno de sus subtipos
• oclIsTypeOf(t:oclType): true si self es instancia de t
• toString(): devuelve un String de self
• oclType(): devuelve el oclType de self
• asSequence(), asSet(), as Bag(): devuelve una secuencia, un conjunto o una bolsa conteniendo
a self.
• output(s:String): escribe el string s en la consola Eclipse (sólo en bloques imperativos)
• debug(s:String): devuelve self y escribe s en la consola
• refSetValue(name:String, val:oclAny): operación reflexiva que permite establecer la
característica identificada por name con el valor value.
• refGetValue(name:String): operación reflexiva que devuelve el valor de la propiedad name de
self
• refImmediateComposite(): es una operación reflexiva que devuelve el contenedor inmediato
de self
• refInvokeOperation(opName:String; String args:Sequence): operación reflexiva que permite
invocar la operación self llamada opName con la secuencia de parámetros definida por args.
6. Prof. Dr. Ricardo TESORIERO – Departamento de Sistemas Informáticos- Universidad de Castilla-La Mancha
[ricardo.tesoriero@uclm.es]
ATL Module
• ATL Module
• Representa una ATL unit (module y query)
• thisModule: Permite acceder a los helpers y los atributos
• resolveTemp(var, target_pattern_name): Permite referenciar, desde
una regla ATL, cualquier elemento del modelo destino generados a
partir de un elemento dado del modelo fuente generado por una
matched rule
• var: variable que contiene el elemento del modelo fuente a partir del
cual se produce el elemento destino
• target_pattern_name: string del nombre del patrón destino (ya lo
veremos más adelante)
• Nota: Esta operación debe llamarse desde thisModule.
• Puede llamarse desde:
• Target patterns y secciones do de cualquier matched rule
• Target patterns y secciones do de una called rule ejecutada luego de la fase de
matching
7. Prof. Dr. Ricardo TESORIERO – Departamento de Sistemas Informáticos- Universidad de Castilla-La Mancha
[ricardo.tesoriero@uclm.es]
Análisis de casos 1 y 2
• Caso 1:
rule Case1 {
from i : MM_A!ClassA
to
o_1 : MM_B!Class1 (linkToClass2 <- o_2),
o_2 : MM_B!Class2 (...)
}
• Caso 2:
rule Case2_R1 {
from i : MM_A!ClassA
to
o_1 : MM_B!Class1 (linkToClass2 <- i.linkToClassB)
}
rule Case2_R2 {
from i : MM_A!ClassB
to
o_1 : MM_B!Class2 (...), …
}
ClassA Class1
Class2
linkToClass2
ClassA Class1
Class2
linkToClass2
ClassB
linkToClassB
8. Prof. Dr. Ricardo TESORIERO – Departamento de Sistemas Informáticos- Universidad de Castilla-La Mancha
[ricardo.tesoriero@uclm.es]
Análisis Caso 3
rule Case3_R1 {
from i : MM_A!ClassA
to
o_1 : MM_B!Class1 (linkToClass2 <- thisModule.resolveTemp(i.linkToClassB, 'o_n'))
}
rule Case3_R2 {
from in : MM_A!ClassB
to
o_1 : MM_B!Class3 (...),
...
o_n : MM_B!Class2 (...),
...
}
ClassA Class1
Class2
linkToClass2
ClassB
linkToClassB
Class3
9. Prof. Dr. Ricardo TESORIERO – Departamento de Sistemas Informáticos- Universidad de Castilla-La Mancha
[ricardo.tesoriero@uclm.es]
TIPOS PRIMITIVOS
ATL
10. Prof. Dr. Ricardo TESORIERO – Departamento de Sistemas Informáticos- Universidad de Castilla-La Mancha
[ricardo.tesoriero@uclm.es]
Tipos de datos primitivos
• Se definen 4 tipos
• Integer
• Real
• Boolean
• String
• Boolean define:
• and, or, xor, not
• implies (b:Boolean): devuelve la implicación lógica
• String define
• size(): devuelve el tamaño de self
• concat(s: String): devuelve la concatenación de s con self
• substring (lower:Integer, upper:Integer) devuelve el String definido entre lower y upper de self
• toInteger() y toReal()
• <, >, =>,=<: devuelve la comparación
• + : concatena Strings
• toUpper(), toLower(): devuelve una copia de String en mayúsculas o minúsculas
• toSequence(): devuelve una secuencia de caracteres
• trim(): devuelve una copia de self con la omisión de (‘ ’,’t’, ‘n’, ‘f’, ‘r’)
• startsWith(s:String), endWith(s:String): devuelve true si self empieza o termina con s.
• indexOf(s:String), lastIndex(s:String): devuelve un entero dentro del self con la primera o última
ocurrencia de s en self
11. Prof. Dr. Ricardo TESORIERO – Departamento de Sistemas Informáticos- Universidad de Castilla-La Mancha
[ricardo.tesoriero@uclm.es]
Tipos de datos primitivos II
• String (cont.)
• split(regex:String) devuelve una secuencia de strings de self de acuerdo a las expresiones
regulares definidas por regex (Java).
• replaceAll(c1:String, c2:String) devuelve una copia de self en la que cada ocurrencia del
carácter c1 se reemplaza por el carácter c2 (Notar que aunque se usan strings para c1 y c2
sólo se toma el primer carácter de dichos strings.
• regexReplaceAll(regEx:String, replacement:String): devuelve una copia de self en la que cada
substring que se corresponde con regEx se reemplaza con replacement
• writeToFile(filename:String): escribe el string en un archivo
• println(): Imprime el string en el output
• Numéricos
• Operadores de comparación: <,>,=>, =<
• Operadores binarios: *,+,-,/,div, max(), min()
• Operadores unarios: abs()
• mod() enteros
• floor(), round() reales
• cos(), sin (), tan(), acos(), asin()
• toDegrees(), to Radians()
• exp(), log(), sqrt()
12. Prof. Dr. Ricardo TESORIERO – Departamento de Sistemas Informáticos- Universidad de Castilla-La Mancha
[ricardo.tesoriero@uclm.es]
COLECCIONES
ATL
13. Prof. Dr. Ricardo TESORIERO – Departamento de Sistemas Informáticos- Universidad de Castilla-La Mancha
[ricardo.tesoriero@uclm.es]
Tipos de datos de colecciones
• Provee
• Set (sin duplicados, sin orden)
• OrderedSet (sin duplicados, ordenada)
• Bag (con duplicados, sin orden)
• Sequence (con duplicados, ordenada)
• Se usan como las templates de C++ o los generics de Java
• Declaración
• collection_type(element_datatype)
• Instanciación
• collection_type{elements}
14. Prof. Dr. Ricardo TESORIERO – Departamento de Sistemas Informáticos- Universidad de Castilla-La Mancha
[ricardo.tesoriero@uclm.es]
Operaciones en Collection
• Uso
• self->operation_name(parameters)
• Operaciones
• size(): número de elementos de self
• includes(o: oclAny): devuelve true si o está en self
• excludes(o: oclAny): devuelve true si o no está en self
• count (o: oclAny): devuelve la cantidad de veces que o ocurren en self
• includesAll(c:Collection): devuelve true si todos los objetos de c están en self
• excludesAll(c:Collection): devuelve true si ninguno de los objetos de c están
en self
• isEmpty(): devuelve true si la colección está vacía
• notEmpty(): devuelve true si la colección no está vacía
• sum(): devuelve el valor que representa la suma de todos los elementos en
self. Los elementos deben soportar (+)
• asBag(): devuelve un Bag con los elementos de self
• asSequence(): devuelve una Sequence con los elementos de self
• asSet(): devuelve un Set con los elementos de self
15. Prof. Dr. Ricardo TESORIERO – Departamento de Sistemas Informáticos- Universidad de Castilla-La Mancha
[ricardo.tesoriero@uclm.es]
Operaciones de Sequence
• union(c:Collection): devuelve una secuencia con los elementos de self seguida
de los de c
• flatten(): devuelve una secuencia con que contiene los hijos de las colecciones
contenidas en self
• append(o:oclAny): devuelve una copia de self con el elemento o al final
• prepend(o:oclAny): devuelve una copia de self con el elemento o al principio
• insertAt(n:Integer, o:oclAny): devuelve una copia de self con el elemento o en la
posición n
• subSequence(lower:Integer, upper:Integer): devuelve la secuencia de elementos
de self comprendida entre lower y upper
• at(n:Integer): devuelve el elemento en n de self
• indexOf(o:oclAny): devuelve el primer índice de o en self
• first(): devuelve el primer elemento de self
• last(): devuelve el último elemento de self
• including(o:oclAny): devuelve una copia de self con el elemento o al final
• excluding(o:oclAny): devuelve una copia de self con todas las ocurrencias de o en
self removidas
16. Prof. Dr. Ricardo TESORIERO – Departamento de Sistemas Informáticos- Universidad de Castilla-La Mancha
[ricardo.tesoriero@uclm.es]
Operaciones de Set
• union(c:Collection): devuelve un Set compuesto con los y los de c sin
duplicados
• intersection(c:Collection): devuelve un Set con los elementos que
aparecen en self y c
• - (s:Set): devuelve un Set compuesto de los elementos de self que no
están en s
• including(o:oclAny): devuelve una copia de self con el elemento o
• excluding(o:oclAny): devuelve una copia de self sin el elemento o
• symetricDifference(s:Set): devuelve un Set compuesto por los
elementos que están en self o s pero no en ambos
• flatten() no está definido
17. Prof. Dr. Ricardo TESORIERO – Departamento de Sistemas Informáticos- Universidad de Castilla-La Mancha
[ricardo.tesoriero@uclm.es]
Operaciones en OrderedSet
• append(o:oclAny): devuelve una copia de self con el elemento o al final, si no está
• prepend(o:oclAny): devuelve una copia de self con el elemento o al principio, si no está
• insertAt(n:Integer, o:oclAny): devuelve una copia de self con el elemento o en la posición n,
si no está
• subOrderedSet(lower:Integer, upper:Integer): devuelve una subSecuencia de self desde
lowes hasta upper
• at(n:Integer): devuelve el elemento en n de self
• indexOf(o:oclAny): devuelve el primer índice de o en self
• first(): devuelve el primer elemento de self
• last(): devuelve el último elemento de self
• union(c:Collection): devuelve un OrderedSet compuesto de los elementos de self seguidos
de los de c con los duplicados removidos
• flatten(): devuelve on OrderedSet que contiene los hijos de las colecciones contenidas en
self
• including (o:oclAny): devuelve una copia de self con el elemento o añadido al final de la
colección
• excluding (o:oclAny): devuelve una copia de self con el elemento o removido
18. Prof. Dr. Ricardo TESORIERO – Departamento de Sistemas Informáticos- Universidad de Castilla-La Mancha
[ricardo.tesoriero@uclm.es]
Iteradores
• La definición de una expresión iterativa define:
• La colección a iterar (colección fuente)
• Las variables de iteraciín (iteradores)
• La expresión pasada como parámetro (cuerpo)
• La sintaxis es la siguiente
source->operation_name(iterators|body)
• Expresiones iterativas
• exists(body): devuelve true si body evalúa a true para al menos un elemento de la colección fuente
• forAll(body): devuelve true si body evalúa a true para todos los elementos de la colección fuente
• isUnique(body): devuelve true si body devuelve un elemento para cada elemento de la colección
fuente
• any(body): devuelve un elemento de la colección fuente para el que body se evalua true, si ninguno
lo hace => oclUndefined
• one(body): devuelve true si body evalúa a true para un único elementos de la colección fuente
• collect(body): devuelve una colección de elementos cuyos resultados es la aplicaicón de body a cada
uno de los elementos de la colección fuente
• select(body): devuelve el subconjunto de elementos de la colección fuente que evalúan body a true
• reject(body): devuelve el subconjunto de elementos de la colección fuente que evalúan body a false
• sortedBy(body): devuelve una colección ordenada de acurdo al body del menor al mayor, los
elementos de la colección fuente deben definir deben definir el operador <
• El iterate
• source->iterate(iterator, varaible_declaration=init_exp| body)
19. Prof. Dr. Ricardo TESORIERO – Departamento de Sistemas Informáticos- Universidad de Castilla-La Mancha
[ricardo.tesoriero@uclm.es]
Enumeración y tuplas
• Enumeraciones
• Definición de literales
• Gender:Female
• #Female
• Tuplas
• Declaración:
TupleType(var_name1 : var_type1, ..., var_namen : var_typen)
• Ejemplo:
TupleType(a : MMAuthor!Author, title : String, editor : String)
• Instanciación
Tuple{var_name1 [: var_type1]? = init_exp1, ..., var_namen [:
var_typen]? = init_expn}
• Ejemplo:
Tuple{editor : String = 'ATL Eds.', title : String = 'ATL Manual', a :
MMAuthor!Author = anAuthor}
• Ejemplo (recuperar datos):
Tuple{editor : String = 'ATL Eds.', title : String = 'ATL Manual', a :
MMAuthor!Author = anAuthor}.title
20. Prof. Dr. Ricardo TESORIERO – Departamento de Sistemas Informáticos- Universidad de Castilla-La Mancha
[ricardo.tesoriero@uclm.es]
Map, modelos y comentarios
• Adicional a OCL
• Declaración:
Map(key_type, value_type)
• Ejemplo:
Map(Integer, MMAuthor!Author)
• Instanciación
Map{(key1, value1), ..., (keyn, valuen) }
• Ejemplo
Map{(0, anAuthor1), (1, anAuthor2)}
• Operaciones
• get(key:oclAny): devuelve el valor asociado a key en el Map self.
• including(key:oclAny, val: oclAny): devuelve una copia de self en el par (key, val) ha sido
insertado
• union(m:Map): devuelve un Map conteniendo todos los elementos de self en los que se
agregan los elementos de m que no aparencen en self.
• getKeys(): devuelve un Set que contienen todas las claves de self
• getValues(): devuelve un Bag que contiene todos los valores de self
• Modelos
• Acceso a características (.)
• Comentarios
• -- Comentario
21. Prof. Dr. Ricardo TESORIERO – Departamento de Sistemas Informáticos- Universidad de Castilla-La Mancha
[ricardo.tesoriero@uclm.es]
Expresiones declarativas
• El if
• Sintaxis
if condition then exp1 else exp2 endif
• Ejemplo:
if 3 > 2 then 'three is greater than two‘ else
'this case should never occur' endif
• El let
• Sintaxis:
let var_name : var_type = var_init_exp in exp
• Ejemplo:
let x :Real =
if aNumber > 0 then aNumber.sqrt()
else aNumber.square() endif
in let y : Real = 2 in x/y
22. Prof. Dr. Ricardo TESORIERO – Departamento de Sistemas Informáticos- Universidad de Castilla-La Mancha
[ricardo.tesoriero@uclm.es]
Tips…
• not person.oclIsUndefined() and person.name = 'Isabel‘
• if person.oclIsUndefined() then false
else person.name= 'Isabel' endif
• collection->select(person | not person.oclIsUndefined() and
person.name = 'Isabel')
• collection->select(person |
if person.oclIsUndefined() then false
else person.name = 'Isabel'endif)
• collection
->select(person | not person.oclIsUndefined())
->select(person | person.name = 'Isabel')
23. Prof. Dr. Ricardo TESORIERO – Departamento de Sistemas Informáticos- Universidad de Castilla-La Mancha
[ricardo.tesoriero@uclm.es]
HELPERS Y ATRIBUTOS
ATL
24. Prof. Dr. Ricardo TESORIERO – Departamento de Sistemas Informáticos- Universidad de Castilla-La Mancha
[ricardo.tesoriero@uclm.es]
ATL Helpers y attributes
• ATL Helper
• Sintaxis
• helper [context context_type]? def : helper_name(parameters) :
return_type = exp;
• parameter_name : parameter_type
• Ejemplo
• helper def : averageLowerThan(s : Sequence(Integer), value : Real) :
Boolean = let avg : Real = s->sum()/s->size() in avg < value;
• ATL Attribute
• Sintaxis
• helper [context context]? def : attribute_name : return_type = exp;
• Ejemplo
helper def : getYoungest : MMPerson!Person =
let allPersons : Sequence(MMPerson!Person) =
MMPerson!Person.allInstances()->asSequence() in
allPersons->iterate(p; y : MMPerson!Person = allPersons->first() |
if p.age < y.age then p else y endif);
26. Prof. Dr. Ricardo TESORIERO – Departamento de Sistemas Informáticos- Universidad de Castilla-La Mancha
[ricardo.tesoriero@uclm.es]
REGLAS
ATL
27. Prof. Dr. Ricardo TESORIERO – Departamento de Sistemas Informáticos- Universidad de Castilla-La Mancha
[ricardo.tesoriero@uclm.es]
ATL Rules
Código imperativo
• Puede ser incluido en:
• Matched Rules
• Called Rules
• Lazy Rules
• La asignación
target <- exp;
• Ejemplo
helper def: counter : Integer = 0;
thisModule.counter <- thisModule.counter + 1;
28. Prof. Dr. Ricardo TESORIERO – Departamento de Sistemas Informáticos- Universidad de Castilla-La Mancha
[ricardo.tesoriero@uclm.es]
ATL Rules
Código imperativo
• IF
if(condition) {
statements1
}
[else {
statements2
}]?
• Ejemplo
if(aPerson.gender = #male) {
thisModule.menNb <- thisModule.menNb + 1;
thisModule.men->including(aPerson);
}
• FOR
for(iterator in collection) {
statements
}
• Ejemplo
for(p in MMPerson!Person.allInstances()) {
if(p.gender = #male)
thisModule.men->including(aPerson);
else
thisModule.women->including(aPerson);
}
29. Prof. Dr. Ricardo TESORIERO – Departamento de Sistemas Informáticos- Universidad de Castilla-La Mancha
[ricardo.tesoriero@uclm.es]
Limitaciones
• No se pueden declarar variables en bloques imperativos
• Las variables que pueden ser utilizadas en estos bloques son:
• Elementos de modelo fuente y destino declarados en la matched
rule local
• Elementos del modelo destino declarados en la called rule local
• Variables declaradas localmente (ej. en la rule)
• Atributos declarados en el contexto del módulo ATL
30. Prof. Dr. Ricardo TESORIERO – Departamento de Sistemas Informáticos- Universidad de Castilla-La Mancha
[ricardo.tesoriero@uclm.es]
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_var2 : distinct out_type2 foreach(e in
collection)(bindings2),
...
out_varn : out_typen (bindingsn)
[do {
statements
}]?
}
Unique
Obligatorio
Opcional
31. Prof. Dr. Ricardo TESORIERO – Departamento de Sistemas Informáticos- Universidad de Castilla-La Mancha
[ricardo.tesoriero@uclm.es]
Patrón fuente
Variables locales
• Un único patrón fuente
from p : MMPerson!Person (p.name = 'Smith')
• Variables locales
from c : GeometricElement!Circle
using {
pi : Real = 3.14;
area : Real = pi * c.radius.square();
}
variable tipo condición
32. Prof. Dr. Ricardo TESORIERO – Departamento de Sistemas Informáticos- Universidad de Castilla-La Mancha
[ricardo.tesoriero@uclm.es]
Patrón destino simple
• Como mínimo 1 patrón destino
• Para más de 1 => ,
• El primero se considera default
• Existen 2 tipos de patrones destino:
1. Simples
2. Iterativos
33. Prof. Dr. Ricardo TESORIERO – Departamento de Sistemas Informáticos- Universidad de Castilla-La Mancha
[ricardo.tesoriero@uclm.es]
Ejemplo patrón destino simple
rule Journal2Book {
from j : Biblio!Journal
to b : Biblio!Book (
title <- j.title + '_(' + j.vol + '):' + j.num,
authors <- j.articles->collect(e | e.authors)->flatten()->asSet()
chapters <- j.articles,
pagesNb <- j.articles->collect(e | e.pagesNb)->sum()
)}
variable tipo
rule Article2Chapter {
from j : Biblio!Article
to b : Biblio!Chapter (...)
}
34. Prof. Dr. Ricardo TESORIERO – Departamento de Sistemas Informáticos- Universidad de Castilla-La Mancha
[ricardo.tesoriero@uclm.es]
Patrón de destino iterativo
(Colecciones)
• Permiten generar colecciones de elementos destino del
mismo tipo para el mismo elemento fuente
• Se utiliza la palabra distinct
• Produce un elemento destino por cada elemento dado en una
colección ordenada
• La colección junto con e se introduce por medio de la palabra
foreach
35. Prof. Dr. Ricardo TESORIERO – Departamento de Sistemas Informáticos- Universidad de Castilla-La Mancha
[ricardo.tesoriero@uclm.es]
Ejemplo patrón iterativo destino
iterativo
using {
coll : Sequence(String) = Sequence{'a', 'b', 'c'};
}
to cells : distinct Table!Cell foreach(e in coll)(
content <- e,
id <- coll->indexOf(e)
)
a b c
0 1 2
36. Prof. Dr. Ricardo TESORIERO – Departamento de Sistemas Informáticos- Universidad de Castilla-La Mancha
[ricardo.tesoriero@uclm.es]
Ejemplo patrón iterativo destino
iterativo anidado
• La colección origen y destino deben ser iguales en tamaño
using {
coll : Sequence(String) =
Sequence{'Score1', 'Score2', 'Total'};
}
to
tab : Table!Table (lines <- t_lines),
t_lines : distinct Table!Line foreach(e in coll)
(id <- coll->indexOf(e),caption <- line_captions),
line_captions : distinct Table!Caption foreach(e in coll)
(content <- e)
content: String
37. Prof. Dr. Ricardo TESORIERO – Departamento de Sistemas Informáticos- Universidad de Castilla-La Mancha
[ricardo.tesoriero@uclm.es]
Asignación de referencias
• Existen 3 casos de inicialización de características:
1. Asignar una referencia a un elemento del modelo destino
generado por la regla
2. Asignar una referencia a un elemento de modelo destino de
otra regla
3. Asignar una referencia a elemento de destino no default en
otra regla
38. Prof. Dr. Ricardo TESORIERO – Departamento de Sistemas Informáticos- Universidad de Castilla-La Mancha
[ricardo.tesoriero@uclm.es]
Análisis de casos 1 y 2
• Caso 1:
rule Case1 {
from i : MM_A!ClassA
to
o_1 : MM_B!Class1 (linkToClass2 <- o_2),
o_2 : MM_B!Class2 (...)
}
• Caso 2:
rule Case2_R1 {
from i : MM_A!ClassA
to
o_1 : MM_B!Class1 (linkToClass2 <- i.linkToClassB)
}
rule Case2_R2 {
from i : MM_A!ClassB
to
o_1 : MM_B!Class2 (...), …
}
ClassA Class1
Class2
linkToClass2
ClassA Class1
Class2
linkToClass2
ClassB
linkToClassB
39. Prof. Dr. Ricardo TESORIERO – Departamento de Sistemas Informáticos- Universidad de Castilla-La Mancha
[ricardo.tesoriero@uclm.es]
Análisis Caso 3
rule Case3_R1 {
from i : MM_A!ClassA
to
o_1 : MM_B!Class1 (linkToClass2 <- thisModule.resolveTemp(i.linkToClassB, 'o_n'))
}
rule Case3_R2 {
from in : MM_A!ClassB
to
o_1 : MM_B!Class3 (...),
...
o_n : MM_B!Class2 (...),
...
}
ClassA Class1
Class2
linkToClass2
ClassB
linkToClassB
Class3
40. Prof. Dr. Ricardo TESORIERO – Departamento de Sistemas Informáticos- Universidad de Castilla-La Mancha
[ricardo.tesoriero@uclm.es]
Bloques imperativos en rules
helper def : id : Integer = 0;
...
rule Journal2Book {
from
j : Biblio!Journal
to
b : Biblio!Book (...)
do {
thisModule.id <- thisModule.id + 1;
b.id <- thisModule.id;
}}
41. Prof. Dr. Ricardo TESORIERO – Departamento de Sistemas Informáticos- Universidad de Castilla-La Mancha
[ricardo.tesoriero@uclm.es]
Called Rules
[entrypoint]? rule rule_name(parameters){]?
[using {
var1 : var_type1 = init_exp1;
...
varn : var_typen = init_expn;
}]?
[to
out_var1 : out_type1 (bindings1),
out_var2 : distinct out_type2 foreach(e in collection)
(bindings2),
...
out_varn : out_typen (bindingsn)]?
[do {
statements
}]?
}
opcional
obligatorio
• Permiten generar elementos de modelo destino desde bloques imperativos (salvo los marcados
con entrypoint)
• No pueden ser llamadas main
• El nombre no debe coincidir con el de ningún helper
• Sólo puede haber un solo entrypoint
• Las marcadas con entrypoint se invocan al comienzo de la transformación
42. Prof. Dr. Ricardo TESORIERO – Departamento de Sistemas Informáticos- Universidad de Castilla-La Mancha
[ricardo.tesoriero@uclm.es]
Ejemplo Lazy Rule
lazy rule getCross {
from
i: ecore!EObject
to
rel: metamodel!Relationship (
)
}
rule Example {
from
s : ecore!EObject
to
t : metamodel!Node (
name <- s.toString(),
edge <- thisModule.getCross(s)
)
}
MÁS DE UNA VEZ…
rule Example {
from
o2 : ecore!EObject
to
t : metamodel!Node (
name <- o.toString(),
edges <- ecore!EClass.allInstancesFrom('yourmodel')
->collect(e | thisModule.getCross(e))
}
EObject Relationship
Node
name:String
edge
ecore metamodel
edge
EClass
43. Prof. Dr. Ricardo TESORIERO – Departamento de Sistemas Informáticos- Universidad de Castilla-La Mancha
[ricardo.tesoriero@uclm.es]
Herencia de reglas
Definición
abstract rule A {
from [fromA]
using [usingA]
to [toA]
do [doA]
}
rule B extends A {
from [fromB]
using [usingB]
to [toB]
do [doB]
}
rule C extends B {
from [fromC]
using [usingC]
to [toC]
do [doC]
}
Resultado
rule B {
from [fromB]
using [usingB]
to [toA.bindings union toB.bindings]
do [doB]
}
rule C {
from [fromC]
using [usingC]
to [toA.bindings union toB.bindings
union toC.bindings]
do [doC]
}
44. Prof. Dr. Ricardo TESORIERO – Departamento de Sistemas Informáticos- Universidad de Castilla-La Mancha
[ricardo.tesoriero@uclm.es]
Referencias
1. ATL User Guide: Overview of Atlas Transformation Language.
http://wiki.eclipse.org/ATL/User_Guide_-
_Overview_of_the_Atlas_Transformation_Language.
2. ATL User Guide: The ATL Language.
http://wiki.eclipse.org/ATL/User_Guide_-
_The_ATL_Language