Universidad Abierta Interamericana Maestría en Tecnología Informática Transformaciones de Modelos Luis Perdomo,  Vicente T...
Agenda <ul><li>Mecanismos para definir transformaciones M2M. </li></ul><ul><li>Requisitos para los lenguajes M2M. </li></u...
<ul><li>Manipulación Directa </li></ul><ul><li>Reglas de transformación, manejo de trazas y otras facilidades definidas de...
<ul><li>Operacional </li></ul><ul><li>Similar a manipulación directa. Soporte más orientado a transformación de modelos. <...
<ul><li>Relacional </li></ul><ul><li>Resolución de restricciones (relaciones matemáticas). </li></ul><ul><li>Transformació...
<ul><li>Basada en transformaciones de Grafos </li></ul><ul><li>Basados en la teoría de transformaciones de grafos. </li></...
<ul><li>Híbrida </li></ul><ul><li>Combinan diferentes técnicas. </li></ul><ul><li>Propuestas combinadas como componentes s...
<ul><li>Traza de Transformación </li></ul><ul><li>Huella o rastro en el tiempo de ejecución de una transformación. </li></...
<ul><li>Propagación de Cambios </li></ul><ul><li>Si una transformación modifica el modelo origen, las modificaciones deben...
<ul><li>Relaciones Preexistentes </li></ul><ul><li>Caso: modelos de origen y destino existen antes de la transformación. <...
<ul><li>Actualización Incremental </li></ul><ul><li>Se debe poder aproximar qué reglas de las transformaciones serán aplic...
<ul><li>“ Política de Conservación” </li></ul><ul><li>Respetar los cambios realizados por los modeladores al producirse un...
<ul><li>Construcción Incremental </li></ul><ul><li>Los elementos del modelo destino podrían ser construidos incrementalmen...
<ul><li>“ Dividir para Conquistar” </li></ul><ul><li>Definir transformaciones más simples a partir de una mas compleja. </...
<ul><li>Estándar OMG para describir transformaciones. </li></ul><ul><li>Naturaleza híbrida, relacional y operacional. </li...
<ul><li>Comprende tres lenguajes M2M: </li></ul><ul><ul><li>RELATIONS </li></ul></ul><ul><ul><li>CORE </li></ul></ul><ul><...
<ul><ul><li>Todos los paquetes nombrados dependen de EsscentialOCL y EsscentialMOF </li></ul></ul>Estándar QVT
<ul><li>Arquitectura de dos niveles: </li></ul><ul><ul><li>Lenguaje RELATIONS: </li></ul></ul><ul><ul><ul><li>Amigable par...
Languaje Relations <ul><li>Lenguaje RELATIONS: </li></ul><ul><ul><ul><li>Especificación declarativa de las relaciones entr...
Languaje Relations <ul><li>Lenguaje RELATIONS: </li></ul><ul><ul><li>TRANSFORMACIÓN: </li></ul></ul><ul><ul><ul><li>Conjun...
Languaje Relations <ul><li>Lenguaje RELATIONS: </li></ul><ul><ul><li>TRANSFORMACIÓN: </li></ul></ul><ul><ul><ul><li>Puede ...
Languaje Relations <ul><li>Lenguaje RELATIONS: </li></ul><ul><ul><li>RELACIONES: </li></ul></ul><ul><ul><ul><li>Restriccio...
Languaje Relations <ul><li>Lenguaje RELATIONS: </li></ul><ul><ul><li>RELACIONES: </li></ul></ul><ul><ul><ul><li>Tipos de r...
Languaje Relations <ul><li>Lenguaje RELATIONS: </li></ul><ul><ul><li>DOMINIO: </li></ul></ul><ul><ul><ul><li>Variable con ...
Languaje Relations <ul><li>Sintaxis abstracta </li></ul>1 2 3
Languaje Relations <ul><li>Paquete QVT Base – Transformation </li></ul><ul><li>Superclases: </li></ul><ul><ul><li>Package ...
Languaje Relations <ul><li>Paquete QVT Base – Transformation </li></ul><ul><li>Asociaciones: </li></ul><ul><ul><li>modelPa...
Languaje Relations <ul><li>Paquete QVT Base – Rule </li></ul><ul><li>Superclases: </li></ul><ul><ul><li>NamedElement </li>...
Languaje Relations <ul><li>Paquete QVT Base – Rule </li></ul><ul><li>Asociaciones: </li></ul><ul><ul><li>domain: Domain [*...
Languaje Relations <ul><li>Paquete QVT Base – Domain </li></ul><ul><li>Superclases: </li></ul><ul><ul><li>NamedElement </l...
Languaje Relations <ul><li>Paquete QVT Base – Domain </li></ul><ul><li>Asociaciones: </li></ul><ul><ul><li>rule: Rule [1] ...
Languaje Relations <ul><li>Paquete QVT Relations – RelationalTransformation </li></ul>2 <ul><li>Superclases: </li></ul><ul...
Languaje Relations <ul><li>Paquete QVT Relations – RelationalTransformation </li></ul>2 <ul><li>Asociaciones: </li></ul><u...
Languaje Relations <ul><li>Paquete QVT Relations – Relation </li></ul>2 <ul><li>Superclases: </li></ul><ul><ul><li>Rule </...
Languaje Relations <ul><li>Paquete QVT Relations – Relation </li></ul>2 <ul><li>Asociaciones: </li></ul><ul><li>variable: ...
Languaje Relations <ul><li>Paquete QVT Template – TemplateExp </li></ul>3 <ul><li>Superclases: </li></ul><ul><ul><li>Liter...
Languaje Relations <ul><li>Paquete QVT Template – TemplateExp </li></ul>3 <ul><li>Asociaciones: </li></ul><ul><ul><li>bind...
<ul><li>Break !  </li></ul>
QVT Operacional
QVT Operacional <ul><li>Dos mecanismos de implementación </li></ul><ul><ul><li>Lenguaje estándar Operational Mappings </li...
QVT Operacional <ul><li>Transformación Operacional </li></ul><ul><ul><li>Definición de una transformación unidireccional, ...
QVT Operacional <ul><li>Estructura de una Transformación Operacional </li></ul><ul><li>transformation  Uml2Rdbms ( in  uml...
QVT Operacional <ul><li>Mapping Operation </li></ul><ul><ul><li>Operación que implementa una correspondencia entre uno o m...
QVT Operacional <ul><li>Estructura de una Mapping Operation </li></ul><ul><li>mapping Package::packageToSchema() : Schema ...
Ejemplo con QVT Declarativo <ul><li>Objetivo : transformar el PIM del Sistema de Ventas de Libros por Internet </li></ul><...
Ejemplo con QVT Declarativo <ul><li>Metamodelo de UML simplificado </li></ul>
Ejemplo con QVT Declarativo <ul><li>Metamodelo relacional simplificado </li></ul>
Transformación de UML a relacional <ul><li>Se genera un esquema por cada paquete </li></ul><ul><li>Se genera una tabla por...
Transformación de UML a relacional <ul><li>Se genera un esquema por cada paquete </li></ul><ul><li>Se genera una tabla por...
Transformación de UML a relacional <ul><li>transformation  PIM2PSMREL(uml:UMLModel, rdbms:RelModel) { </li></ul><ul><li>to...
Transformación de UML a relacional <ul><li>Se genera un esquema por cada paquete </li></ul><ul><li>Se genera una tabla por...
Transformación de UML a relacional <ul><li>top relation  ClassToTable { </li></ul><ul><li>cn : String; </li></ul><ul><li>c...
Transformación de UML a relacional <ul><li>Se genera un esquema por cada paquete </li></ul><ul><li>Se genera una tabla por...
Transformación de UML a relacional <ul><li>relation  ClassToPrimaryKey { </li></ul><ul><li>cn : String; </li></ul><ul><li>...
Transformación de UML a relacional <ul><li>Se genera un esquema por cada paquete </li></ul><ul><li>Se genera una tabla por...
Transformación de UML a relacional <ul><li>top relation  AttributeToColumn { </li></ul><ul><li>aName, attributeType, colum...
Transformación de UML a relacional <ul><li>Se genera un esquema por cada paquete </li></ul><ul><li>Se genera una tabla por...
Transformación de UML a relacional <ul><li>top relation  AssociationToForeignKey { </li></ul><ul><li>an, fkn, fcn, multNot...
Transformación de UML a relacional <ul><li>enforce domain  rdbms fk : RelModel::ForeignKey { </li></ul><ul><li>name = fkn,...
Transformación de UML a relacional <ul><li>when  { </li></ul><ul><li>ClassToPrimaryKey(class2, pKey); </li></ul><ul><li>Pa...
Transformación de UML a Java Beans <ul><li>Se genera un paquete Java por cada paquetes UML </li></ul><ul><li>Se genera una...
Transformación de UML a Java Beans <ul><li>Se genera un paquete Java por cada paquetes UML </li></ul><ul><li>Se genera una...
Transformación de UML a Java Beans <ul><li>transformation  PIM2PSMJava(uml:UMLModel, java:UMLModel) { </li></ul><ul><li>to...
Transformación de UML a Java Beans <ul><li>Se genera un paquete Java por cada paquetes UML </li></ul><ul><li>Se genera una...
Transformación de UML a Java Beans <ul><li>top relation  ClassToJavaClass{ </li></ul><ul><li>className, stName : String; <...
Transformación de UML a Java Beans <ul><li>Se genera un paquete Java por cada paquetes UML </li></ul><ul><li>Se genera una...
Transformación de UML a Java Beans <ul><li>top relation  AttributeToJavaAttribute{ </li></ul><ul><li>attrName : String; </...
Transformación de UML a Java Beans <ul><li>Se genera un paquete Java por cada paquetes UML </li></ul><ul><li>Se genera una...
Transformación de UML a Java Beans <ul><li>top relation  PersistentClassToJavaIDClass{ </li></ul><ul><li>checkonly domain ...
Transformación de UML a Java Beans <ul><li>Se genera un paquete Java por cada paquetes UML </li></ul><ul><li>Se genera una...
Transformación de UML a Java Beans <ul><li>top relation  ClassToDAOComponent{ </li></ul><ul><li>className, agName : String...
Transformación de UML a Java Beans <ul><li>enforce domain  java dc : UMLModel::Class{ </li></ul><ul><li>namespace = tarPac...
Transformación de UML a Java Beans <ul><li>Se genera un paquete Java por cada paquetes UML </li></ul><ul><li>Se genera una...
Transformación de UML a Java Beans <ul><li>top relation  DAOComponentToDAOOperations{ </li></ul><ul><li>checkonly domain  ...
Transformación de UML a Java Beans <ul><li>…… </li></ul><ul><li>enforce domain  java javaClass : UMLModel::Class{ </li></u...
Transformación de UML a Java Beans <ul><li>Se genera un paquete Java por cada paquetes UML </li></ul><ul><li>Se genera una...
Transformación de UML a Java Beans <ul><li>top relation  FacadeToImpl{ </li></ul><ul><li>className : String; </li></ul><ul...
Transformación de UML a Java Beans <ul><li>…… </li></ul><ul><li>enforce domain  java facadeClass : UMLModel::Class{ </li><...
Conclusiones <ul><li>La aplicación de MDD resulta productiva cuando: </li></ul><ul><ul><li>El proceso de transformación es...
<ul><li>Muchas gracias! </li></ul>
Upcoming SlideShare
Loading in...5
×

Lenguajes para definir transformaciones

1,114

Published on

Presentación mostrada en la cátedra Transformaciones de Modelos de la Maestría en Tecnología Informática de la UAI.

Published in: Technology, Education
0 Comments
1 Like
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total Views
1,114
On Slideshare
0
From Embeds
0
Number of Embeds
1
Actions
Shares
0
Downloads
3
Comments
0
Likes
1
Embeds 0
No embeds

No notes for slide

Transcript of "Lenguajes para definir transformaciones"

  1. 1. Universidad Abierta Interamericana Maestría en Tecnología Informática Transformaciones de Modelos Luis Perdomo, Vicente Tommasi - Mayo 2010
  2. 2. Agenda <ul><li>Mecanismos para definir transformaciones M2M. </li></ul><ul><li>Requisitos para los lenguajes M2M. </li></ul><ul><li>Estándar QVT. </li></ul><ul><li>QVT Declarativo. </li></ul><ul><li>QVT Operacional. </li></ul><ul><li>Ejemplo formal con QVT declarativo. </li></ul><ul><ul><li>Transformación UML a Relacional. </li></ul></ul><ul><ul><li>Transformación UML a Java Beans. </li></ul></ul>
  3. 3. <ul><li>Manipulación Directa </li></ul><ul><li>Reglas de transformación, manejo de trazas y otras facilidades definidas desde cero por el usuario (Java). </li></ul><ul><ul><li>Básica. </li></ul></ul><ul><ul><li>Poca ayuda para definir y ejecutar transformaciones. </li></ul></ul><ul><ul><li>Puede llegar a mejorarse con librerías y frameworks. </li></ul></ul>Mecanismos para definir transformaciones M2M 1
  4. 4. <ul><li>Operacional </li></ul><ul><li>Similar a manipulación directa. Soporte más orientado a transformación de modelos. </li></ul><ul><li>Solución típica: agregar facilidades a un lenguaje de modelado para expresar transformaciones. </li></ul><ul><ul><li>Ofrece formalismo de metamodelo ejecutable. </li></ul></ul><ul><ul><li>Asistencia evolutiva en las transformaciones. </li></ul></ul><ul><ul><li>QVT Opperational Mappings. </li></ul></ul>Mecanismos para definir transformaciones M2M 2
  5. 5. <ul><li>Relacional </li></ul><ul><li>Resolución de restricciones (relaciones matemáticas). </li></ul><ul><li>Transformación = restricciones entre modelo de origen y destino. </li></ul><ul><ul><li>Equilibrio entre flexibilidad y expresividad declarativa. </li></ul></ul><ul><ul><li>Su poder depende del mecanismo para resolver restricciones. </li></ul></ul><ul><ul><li>Limitados por los tipos de restricciones a verificar. </li></ul></ul><ul><ul><li>QVT Relations. </li></ul></ul>Mecanismos para definir transformaciones M2M 3
  6. 6. <ul><li>Basada en transformaciones de Grafos </li></ul><ul><li>Basados en la teoría de transformaciones de grafos. </li></ul><ul><li>Actúan sobre grafos tipados, etiquetados y con atributos (modelos de clases simples). </li></ul><ul><ul><li>Intuitivos y declarativos. </li></ul></ul><ul><ul><li>Carencia en terminación. </li></ul></ul><ul><ul><li>No son grafos “ordenados” </li></ul></ul><ul><ul><li>Aplicables a modelos con colecciones sin orden. </li></ul></ul>Mecanismos para definir transformaciones M2M 4
  7. 7. <ul><li>Híbrida </li></ul><ul><li>Combinan diferentes técnicas. </li></ul><ul><li>Propuestas combinadas como componentes separados o reglas individuales. </li></ul><ul><ul><li>Permite combinar conceptos y paradigmas. </li></ul></ul><ul><ul><li>Promisorio. </li></ul></ul><ul><ul><li>QVT  naturaleza híbrida </li></ul></ul>Mecanismos para definir transformaciones M2M 5 QVT CORE QVT RELATIONS QVT OPERATIONAL MAPPINGS
  8. 8. <ul><li>Traza de Transformación </li></ul><ul><li>Huella o rastro en el tiempo de ejecución de una transformación. </li></ul><ul><li>Permitir determinar que elementos ya han sido calculados por otras reglas. </li></ul>Requisitos para los lenguajes M2M 1
  9. 9. <ul><li>Propagación de Cambios </li></ul><ul><li>Si una transformación modifica el modelo origen, las modificaciones deben ser propagadas al modelo destino. </li></ul><ul><li>Solo se deberán realizar los cambios requeridos en el modelo destino existente (no desde cero). </li></ul>Requisitos para los lenguajes M2M 2
  10. 10. <ul><li>Relaciones Preexistentes </li></ul><ul><li>Caso: modelos de origen y destino existen antes de la transformación. </li></ul><ul><li>Se debe modificar el modelo destino para respetar las relaciones preexistentes con el de origen. </li></ul><ul><li>No existe traza de transformación. </li></ul>Requisitos para los lenguajes M2M 3
  11. 11. <ul><li>Actualización Incremental </li></ul><ul><li>Se debe poder aproximar qué reglas de las transformaciones serán aplicadas nuevamente y sobre que subconjunto de elementos del modelo. </li></ul>Requisitos para los lenguajes M2M 4
  12. 12. <ul><li>“ Política de Conservación” </li></ul><ul><li>Respetar los cambios realizados por los modeladores al producirse una nueva transformación. </li></ul>Requisitos para los lenguajes M2M 5
  13. 13. <ul><li>Construcción Incremental </li></ul><ul><li>Los elementos del modelo destino podrían ser construidos incrementalmente. </li></ul><ul><li>Ejemplo: primero las clases, luego las asociaciones, etc. </li></ul>Requisitos para los lenguajes M2M 6
  14. 14. <ul><li>“ Dividir para Conquistar” </li></ul><ul><li>Definir transformaciones más simples a partir de una mas compleja. </li></ul>Requisitos para los lenguajes M2M 7
  15. 15. <ul><li>Estándar OMG para describir transformaciones. </li></ul><ul><li>Naturaleza híbrida, relacional y operacional. </li></ul>Estándar QVT
  16. 16. <ul><li>Comprende tres lenguajes M2M: </li></ul><ul><ul><li>RELATIONS </li></ul></ul><ul><ul><li>CORE </li></ul></ul><ul><ul><li>OPERATIONAL MAPPINGS </li></ul></ul><ul><li>Tres paquetes principales: </li></ul><ul><ul><li>QVTBASE: estructuras comunes para transformaciones. </li></ul></ul><ul><ul><li>QVTRELATION: patrones template. </li></ul></ul><ul><ul><li>QVTOPERATIONAL: extiende QVTRELATION. </li></ul></ul>Estándar QVT
  17. 17. <ul><ul><li>Todos los paquetes nombrados dependen de EsscentialOCL y EsscentialMOF </li></ul></ul>Estándar QVT
  18. 18. <ul><li>Arquitectura de dos niveles: </li></ul><ul><ul><li>Lenguaje RELATIONS: </li></ul></ul><ul><ul><ul><li>Amigable para el usuario. </li></ul></ul></ul><ul><ul><ul><li>Soporta Pattern Matching y Templates. </li></ul></ul></ul><ul><ul><ul><li>Trazas de transformación creadas implícitamente. </li></ul></ul></ul><ul><ul><ul><li>Soporta propagación de cambios. </li></ul></ul></ul><ul><ul><li>Lenguaje CORE: </li></ul></ul><ul><ul><ul><li>Definido por extensiones minimales de EMOF y OCL. </li></ul></ul></ul><ul><ul><ul><li>No soporta Pattern Matching. </li></ul></ul></ul><ul><ul><ul><li>Trazas no se generan automáticamente. </li></ul></ul></ul>QVT Declarativo
  19. 19. Languaje Relations <ul><li>Lenguaje RELATIONS: </li></ul><ul><ul><ul><li>Especificación declarativa de las relaciones entre modelos MOF. </li></ul></ul></ul><ul><ul><ul><li>Elementos: </li></ul></ul></ul><ul><ul><li>TRANSFORMACIÓN </li></ul></ul><ul><ul><li>RELACIONES </li></ul></ul><ul><ul><li>DOMINIOS </li></ul></ul>
  20. 20. Languaje Relations <ul><li>Lenguaje RELATIONS: </li></ul><ul><ul><li>TRANSFORMACIÓN: </li></ul></ul><ul><ul><ul><li>Conjunto de relaciones que deben cumplirse. </li></ul></ul></ul><ul><ul><li>Ejemplo: </li></ul></ul><ul><ul><ul><ul><li>uml declara a SimpleUML como su metamodelo. </li></ul></ul></ul></ul><ul><ul><ul><ul><li>rdbms declara a SimpleRDBMS como su metamodelo. </li></ul></ul></ul></ul>transformation umlRdbms(uml:SimpleUML,rdbms:SimpleRBDMS){} Nombre de la declaración Modelos tipados
  21. 21. Languaje Relations <ul><li>Lenguaje RELATIONS: </li></ul><ul><ul><li>TRANSFORMACIÓN: </li></ul></ul><ul><ul><ul><li>Puede ser invocada para: </li></ul></ul></ul><ul><ul><ul><ul><li>Chequear consistencia entre modelos (CHECKONLY). </li></ul></ul></ul></ul><ul><ul><ul><ul><li>Modificar un modelo forzando consistencia (ENFORCE). </li></ul></ul></ul></ul><ul><ul><ul><li>Ejemplo: </li></ul></ul></ul><ul><ul><ul><li>SOLO SE FUERZA EL MODELO DESTINO!!! </li></ul></ul></ul>relation PackageToSchema{ checkonly domain uml p:Package {name=pn} enforce domain rdbms s:Schema {name=pn} }
  22. 22. Languaje Relations <ul><li>Lenguaje RELATIONS: </li></ul><ul><ul><li>RELACIONES: </li></ul></ul><ul><ul><ul><li>Restricciones que deben cumplir los elementos de los modelos. </li></ul></ul></ul><ul><ul><ul><li>Definidas por dos o mas DOMINIOS y predicados WHEN y WHERE. </li></ul></ul></ul><ul><ul><ul><li>Ejemplo: </li></ul></ul></ul>relation ClassToTable { domain uml c:Class { namespace = p:Package {}, kind=‘Persistent’, name=cn } domain rdbms t:Table { schema = s:Schema{}, name=cn, column = cl:Column { name=cn+’_tid’, type=‘NUMBER’ }, primaryKey = k:PrimaryKey { name=cn+’_pk’, column=cl } } when { PackageToSchema (p, s); } where { AttributeToColumn (c, t) } }
  23. 23. Languaje Relations <ul><li>Lenguaje RELATIONS: </li></ul><ul><ul><li>RELACIONES: </li></ul></ul><ul><ul><ul><li>Tipos de relaciones: </li></ul></ul></ul><ul><ul><ul><ul><li>Top-Level: la ejecución de la transformación implica que se ejecuten todas. </li></ul></ul></ul></ul><ul><ul><ul><ul><li>No Top-Level: solo se ejecutan cuando son invocadas. </li></ul></ul></ul></ul><ul><ul><ul><li>Ejemplo: </li></ul></ul></ul>transformation umlRdbms(uml:SimpleUML,rdbms:SimpleRBDMS){ top relation PackageToSchema {…} top relation ClassToTable {…} relation AttributeToColumn {…} } TOP-LEVEL NO TOP-LEVEL
  24. 24. Languaje Relations <ul><li>Lenguaje RELATIONS: </li></ul><ul><ul><li>DOMINIO: </li></ul></ul><ul><ul><ul><li>Variable con tipo que tiene su correspondencia en un modelo de un tipo dado. </li></ul></ul></ul><ul><ul><ul><li>Posee un patrón (restricciones y variables) que los elementos de un modelo asocian a distintas variables que lo satisface ( PATTERN MATCHING ) </li></ul></ul></ul><ul><ul><ul><li>Ejemplo: </li></ul></ul></ul><ul><ul><ul><li>A partir de este patrón se crean los objetos en el modelo destino. </li></ul></ul></ul>domain uml c:Class { namespace = p:Package {}, kind=‘Persistent’, name=cn }
  25. 25. Languaje Relations <ul><li>Sintaxis abstracta </li></ul>1 2 3
  26. 26. Languaje Relations <ul><li>Paquete QVT Base – Transformation </li></ul><ul><li>Superclases: </li></ul><ul><ul><li>Package </li></ul></ul><ul><ul><li>Class </li></ul></ul>1
  27. 27. Languaje Relations <ul><li>Paquete QVT Base – Transformation </li></ul><ul><li>Asociaciones: </li></ul><ul><ul><li>modelParameter: TypedModel [*] {composes} </li></ul></ul><ul><ul><li>rule: Rule [*] {compose} </li></ul></ul><ul><ul><li>extends: Transformation [0..1] </li></ul></ul>1
  28. 28. Languaje Relations <ul><li>Paquete QVT Base – Rule </li></ul><ul><li>Superclases: </li></ul><ul><ul><li>NamedElement </li></ul></ul>1
  29. 29. Languaje Relations <ul><li>Paquete QVT Base – Rule </li></ul><ul><li>Asociaciones: </li></ul><ul><ul><li>domain: Domain [*] {composes} </li></ul></ul><ul><ul><li>transformation: Transformation [1] </li></ul></ul><ul><ul><li>overrides: Rule [0..1] </li></ul></ul>1
  30. 30. Languaje Relations <ul><li>Paquete QVT Base – Domain </li></ul><ul><li>Superclases: </li></ul><ul><ul><li>NamedElement </li></ul></ul>1
  31. 31. Languaje Relations <ul><li>Paquete QVT Base – Domain </li></ul><ul><li>Asociaciones: </li></ul><ul><ul><li>rule: Rule [1] </li></ul></ul><ul><ul><li>typedModel: TypedModel [0..1] </li></ul></ul>1
  32. 32. Languaje Relations <ul><li>Paquete QVT Relations – RelationalTransformation </li></ul>2 <ul><li>Superclases: </li></ul><ul><ul><li>Transformation (from QVTBase) </li></ul></ul><ul><ul><li>NamedElement </li></ul></ul>
  33. 33. Languaje Relations <ul><li>Paquete QVT Relations – RelationalTransformation </li></ul>2 <ul><li>Asociaciones: </li></ul><ul><ul><li>ownedKey: Key [*] {composes} </li></ul></ul>
  34. 34. Languaje Relations <ul><li>Paquete QVT Relations – Relation </li></ul>2 <ul><li>Superclases: </li></ul><ul><ul><li>Rule </li></ul></ul><ul><li>Atributos: </li></ul><ul><ul><li>isTopLevel : Boolean </li></ul></ul>
  35. 35. Languaje Relations <ul><li>Paquete QVT Relations – Relation </li></ul>2 <ul><li>Asociaciones: </li></ul><ul><li>variable: Variable [*] {composes} </li></ul><ul><li>domain: Domain [*] {composes} </li></ul><ul><li>when: Pattern [0..1] {composes} </li></ul><ul><li>where: Pattern [0..1] {composes} </li></ul><ul><li>operationalImpl: RelationImplementation [*] {composes} </li></ul>
  36. 36. Languaje Relations <ul><li>Paquete QVT Template – TemplateExp </li></ul>3 <ul><li>Superclases: </li></ul><ul><ul><li>LiteralExp </li></ul></ul>
  37. 37. Languaje Relations <ul><li>Paquete QVT Template – TemplateExp </li></ul>3 <ul><li>Asociaciones: </li></ul><ul><ul><li>bindsTo: Variable [0..1] {composes} </li></ul></ul><ul><ul><li>Where: OclExpression [0..1] {composes} </li></ul></ul>
  38. 38. <ul><li>Break ! </li></ul>
  39. 39. QVT Operacional
  40. 40. QVT Operacional <ul><li>Dos mecanismos de implementación </li></ul><ul><ul><li>Lenguaje estándar Operational Mappings </li></ul></ul><ul><ul><ul><li>Extensión de OCL </li></ul></ul></ul><ul><ul><li>Implementación no estándar o black-box </li></ul></ul><ul><ul><ul><li>Escritas en otro lenguaje, invocadas por QVT </li></ul></ul></ul>
  41. 41. QVT Operacional <ul><li>Transformación Operacional </li></ul><ul><ul><li>Definición de una transformación unidireccional, expresada imperativamente. </li></ul></ul><ul><ul><li>Tiene una signatura indicando los modelos involucrados en la transformación. </li></ul></ul><ul><ul><li>Define una operación entry, llamada “main”: código inicial a ser ejecutado. </li></ul></ul><ul><ul><li>La signatura es obligatoria, pero no así su implementación (permite implementaciones black-box). </li></ul></ul>
  42. 42. QVT Operacional <ul><li>Estructura de una Transformación Operacional </li></ul><ul><li>transformation Uml2Rdbms ( in uml:UML, out rdbms:RDBMS) { </li></ul><ul><li>main () { </li></ul><ul><li>uml. objectsOfType (Package)-> map packageToSchema(); </li></ul><ul><li>} </li></ul><ul><li>… </li></ul><ul><li>mapping Package::packageToSchema() : Schema … </li></ul><ul><li>… more mapping operations … </li></ul><ul><li>… helpers… </li></ul><ul><li>… </li></ul><ul><li>} </li></ul>Signatura: Declara el nombre de la transformación y los metamodelos de origen y destino (indicados por in y out ) Punto de entrada: La ejecución de la transformación empieza aquí, ejecutando el cuerpo de main Elementos de la Transformación: La lógica de la transformación está compuesta por mapping operations y helpers . recuperar la lista de los objetos tipo paquete, y sobre cada uno aplicar la operación de mapeo llamada packageToSchema()
  43. 43. QVT Operacional <ul><li>Mapping Operation </li></ul><ul><ul><li>Operación que implementa una correspondencia entre uno o más elementos del modelo fuente y uno o más elementos del modelo destino. </li></ul></ul><ul><ul><li>Tiene una pre condición (cláusula when), el cuerpo del mapping y una post condición (su cláusula where). </li></ul></ul><ul><ul><li>Puede no incluir un cuerpo (permite implementación black-box). </li></ul></ul><ul><ul><li>El cuerpo se estructura en tres secciones opcionales: </li></ul></ul><ul><ul><ul><li>de inicialización, usada para crear los elementos de salida </li></ul></ul></ul><ul><ul><ul><li>intermedia, para asignarle valores a los elementos de salida </li></ul></ul></ul><ul><ul><ul><li>de finalización, para definir código que se ejecute antes de salir del cuerpo </li></ul></ul></ul>
  44. 44. QVT Operacional <ul><li>Estructura de una Mapping Operation </li></ul><ul><li>mapping Package::packageToSchema() : Schema </li></ul><ul><li>when { self.name.startingWith() <> &quot;_&quot;} </li></ul><ul><li>{ name := self.name;     table := self.ownedElement->map class2table(); </li></ul><ul><li>} </li></ul>Guarda: La Guarda es una expresión OCL usada para filtrar los elementos de origen de un determinado tipo. Cuerpo de la Operación: Contiene expresiones para inicializar las propiedades del elemento de destino. Cuando la operación se ejecuta sobre un elemento de origen, se usa la variable self para referenciarlo y se crea el tipo de destino. Entonces se ejecuta la operación. Tipo del elemento de origen Nombre de la operación Tipo del elemento de destino Signatura
  45. 45. Ejemplo con QVT Declarativo <ul><li>Objetivo : transformar el PIM del Sistema de Ventas de Libros por Internet </li></ul><ul><li>Modelos del PSM: </li></ul><ul><ul><li>PSM relacional para la base de datos </li></ul></ul><ul><ul><li>PSM para cada una de las capas del MVC </li></ul></ul><ul><li>Primero : metamodelos del modelo de inicio y el modelo de destino de la transformación: </li></ul><ul><ul><li>Metamodelo UML simplificado </li></ul></ul><ul><ul><li>Metamodelo relacional simplificado </li></ul></ul>
  46. 46. Ejemplo con QVT Declarativo <ul><li>Metamodelo de UML simplificado </li></ul>
  47. 47. Ejemplo con QVT Declarativo <ul><li>Metamodelo relacional simplificado </li></ul>
  48. 48. Transformación de UML a relacional <ul><li>Se genera un esquema por cada paquete </li></ul><ul><li>Se genera una tabla por cada clase </li></ul><ul><li>Se generan las claves primarias </li></ul><ul><li>Los atributos se transforman en columnas </li></ul><ul><li>Se agrega una foreignKey por cada relación &quot;1..*&quot; </li></ul>
  49. 49. Transformación de UML a relacional <ul><li>Se genera un esquema por cada paquete </li></ul><ul><li>Se genera una tabla por cada clase </li></ul><ul><li>Se generan las claves primarias </li></ul><ul><li>Los atributos se transforman en columnas </li></ul><ul><li>Se agrega una foreignKey por cada relación &quot;1..*&quot; </li></ul>1
  50. 50. Transformación de UML a relacional <ul><li>transformation PIM2PSMREL(uml:UMLModel, rdbms:RelModel) { </li></ul><ul><li>top relation PackageToSchema { </li></ul><ul><li>pn : String; </li></ul><ul><li>checkonly domain uml p : UMLModel::Package {name = pn}; </li></ul><ul><li>enforce domain rdbms s : RelModel::Schema { name = pn}; </li></ul><ul><li>} </li></ul>Signatura de la transformación Dos modelos tipados top : es una relation top-level relation : 2 o más dominios y un par de predicados when y where dominio: variable con tipo, puede corresponder con un modelo de un tipo dado patrón: un paquete con un nomnbre patrón: un esquema con un nombre checkonly: puede ser solamente leído enforce: forzar consistencia, creando/modificando los elementos del modelo rdbms
  51. 51. Transformación de UML a relacional <ul><li>Se genera un esquema por cada paquete </li></ul><ul><li>Se genera una tabla por cada clase </li></ul><ul><li>Se generan las claves primarias </li></ul><ul><li>Los atributos se transforman en columnas </li></ul><ul><li>Se agrega una foreignKey por cada relación &quot;1..*&quot; </li></ul>2
  52. 52. Transformación de UML a relacional <ul><li>top relation ClassToTable { </li></ul><ul><li>cn : String; </li></ul><ul><li>checkonly domain uml c : UMLModel::Class { </li></ul><ul><li>namespace = p : UMLModel::Package {}, </li></ul><ul><li>stereotype = s : UMLModel::Stereotype {name='persistent'}, </li></ul><ul><li>isAbstract = false , </li></ul><ul><li>name = cn </li></ul><ul><li>}; </li></ul><ul><li>enforce domain rdbms t : RelModel::Table { </li></ul><ul><li>schema = sch : RelModel::Schema {}, </li></ul><ul><li>name = cn, </li></ul><ul><li>column = newColumn : RelModel::Column { </li></ul><ul><li>name = cn.firstToLower()+'ID', type = 'INTEGER' }, </li></ul><ul><li>primaryKey = k : RelModel::PrimaryKey { </li></ul><ul><li>column = newColumn : RelModel::Column{} </li></ul><ul><li>} </li></ul><ul><li>}; </li></ul><ul><li>when { PackageToSchema(p, sch); } </li></ul><ul><li>where { ClassToPrimaryKey(c, k);} </li></ul><ul><li>} </li></ul>relation : 2 o más dominios y un par de predicados when y where patrón: una clase con un espacio de nombres p, de tipo persistente, no abstracta y con un nombre cn patrón: una tabla con un esquema sch, nombre cn, una columna newColumn cuyo nombre se forma en base al nombre de la clase y que se define como clave primaria when: previo a su aplicación debe satisfacerse la relación PackageToSchema where: siempre que la relación ClassToTable se establezca, la relación AttributeToColumn debe establecerse también
  53. 53. Transformación de UML a relacional <ul><li>Se genera un esquema por cada paquete </li></ul><ul><li>Se genera una tabla por cada clase </li></ul><ul><li>Se generan las claves primarias </li></ul><ul><li>Los atributos se transforman en columnas </li></ul><ul><li>Se agrega una foreignKey por cada relación &quot;1..*&quot; </li></ul>3
  54. 54. Transformación de UML a relacional <ul><li>relation ClassToPrimaryKey { </li></ul><ul><li>cn : String; </li></ul><ul><li>checkonly domain uml c : UMLModel::Class { </li></ul><ul><li>name = cn </li></ul><ul><li>}; </li></ul><ul><li>enforce domain rdbms k : UMLModel::PrimaryKey { </li></ul><ul><li>name = cn.firstToLower() + '_pk' </li></ul><ul><li>}; </li></ul><ul><li>} </li></ul>no top-level , se debe cumplir cuando son invocadas, directamente o en where
  55. 55. Transformación de UML a relacional <ul><li>Se genera un esquema por cada paquete </li></ul><ul><li>Se genera una tabla por cada clase </li></ul><ul><li>Se generan las claves primarias </li></ul><ul><li>Los atributos se transforman en columnas </li></ul><ul><li>Se agrega una foreignKey por cada relación &quot;1..*&quot; </li></ul>4
  56. 56. Transformación de UML a relacional <ul><li>top relation AttributeToColumn { </li></ul><ul><li>aName, attributeType, columnType: String; </li></ul><ul><li>checkonly domain uml attribute : UMLModel::Attribute { </li></ul><ul><li>owner = class : UMLModel::Class{}, </li></ul><ul><li>name = aName, </li></ul><ul><li>type = attrType :UMLModel::PrimitiveDataType {name = attributeType} </li></ul><ul><li>}; </li></ul><ul><li>enforce domain rdbms column : RelModel::Column { </li></ul><ul><li>owner = table :RelModel::Table{}, </li></ul><ul><li>name = aName, </li></ul><ul><li>type = columnType </li></ul><ul><li>}; </li></ul><ul><li>when { </li></ul><ul><li>ClassToTable(class,table); </li></ul><ul><li>} </li></ul><ul><li>where { </li></ul><ul><li>columnType = primitiveTypeToRelType(attributeType); </li></ul><ul><li>} </li></ul><ul><li>} </li></ul>String UML -> VARCHAR[255] Integer UML -> INTEGER Date UML -> DATE Real UML -> DECIMAL(10,2)
  57. 57. Transformación de UML a relacional <ul><li>Se genera un esquema por cada paquete </li></ul><ul><li>Se genera una tabla por cada clase </li></ul><ul><li>Se generan las claves primarias </li></ul><ul><li>Los atributos se transforman en columnas </li></ul><ul><li>Se agrega una foreignKey por cada relación &quot;1..*&quot; </li></ul>5
  58. 58. Transformación de UML a relacional <ul><li>top relation AssociationToForeignKey { </li></ul><ul><li>an, fkn, fcn, multNotN : String; </li></ul><ul><li>checkonly domain uml a : UMLModel::Association { </li></ul><ul><li>namespace = p : UMLModel::Package {}, </li></ul><ul><li>name = an, </li></ul><ul><li>associationEnd = ae1 : UMLModel::AssociationEnd { </li></ul><ul><li>multiplicity = multNotN, </li></ul><ul><li>class = class1 : UMLModel::Class { </li></ul><ul><li>stereotype = st1 : UMLModel::Stereotype{name = 'persistent' } </li></ul><ul><li>} </li></ul><ul><li>}, </li></ul><ul><li>associationEnd = ae2 : UMLModel::AssociationEnd { </li></ul><ul><li>multiplicity = '*', </li></ul><ul><li>class = class2 : UMLModel::Class { </li></ul><ul><li>stereotype = st2 : UMLModel::Stereotype{name = 'persistent' } </li></ul><ul><li>} </li></ul><ul><li>} </li></ul><ul><li>}; </li></ul>2 association ends: una con multiplicidad ‘*’ y la otra <> ‘*’
  59. 59. Transformación de UML a relacional <ul><li>enforce domain rdbms fk : RelModel::ForeignKey { </li></ul><ul><li>name = fkn, </li></ul><ul><li>owner = destTbl : RelModel::Table { </li></ul><ul><li>schema = s : RelModel::Schema {} </li></ul><ul><li>}, </li></ul><ul><li>column = fc : RelModel::Column { </li></ul><ul><li>name = fcn, </li></ul><ul><li>type = 'INTEGER', </li></ul><ul><li>owner = destTbl </li></ul><ul><li>}, </li></ul><ul><li>refersTo = pKey : RelModel::PrimaryKey { </li></ul><ul><li>owner = destTbl : RelModel::Table {} </li></ul><ul><li>} </li></ul><ul><li>}; </li></ul>
  60. 60. Transformación de UML a relacional <ul><li>when { </li></ul><ul><li>ClassToPrimaryKey(class2, pKey); </li></ul><ul><li>PackageToSchema(p, s); </li></ul><ul><li>ClassToTable(class2, destTbl); </li></ul><ul><li>multNotN <> '*'; </li></ul><ul><li>} </li></ul><ul><li>where { </li></ul><ul><li>fkn = class1.name.firstToLower()+'ID'; </li></ul><ul><li>fcn = fkn; </li></ul><ul><li>} </li></ul><ul><li>} </li></ul><ul><li>} </li></ul>
  61. 61. Transformación de UML a Java Beans <ul><li>Se genera un paquete Java por cada paquetes UML </li></ul><ul><li>Se genera una clase Java por cada clase del dominio </li></ul><ul><li>Los atributos UML se transforman en atributos Java con métodos de acceso </li></ul><ul><li>Se agregan los identificadores a las clases persistentes del dominio </li></ul><ul><li>A partir de las clases UML se generan los DAOs </li></ul><ul><li>Se generan las operaciones de acceso a datos en los DAOs </li></ul><ul><li>Se transforma la clase facade a la clase que la implementa </li></ul>
  62. 62. Transformación de UML a Java Beans <ul><li>Se genera un paquete Java por cada paquetes UML </li></ul><ul><li>Se genera una clase Java por cada clase del dominio </li></ul><ul><li>Los atributos UML se transforman en atributos Java con métodos de acceso </li></ul><ul><li>Se agregan los identificadores a las clases persistentes del dominio </li></ul><ul><li>A partir de las clases UML se generan los DAOs </li></ul><ul><li>Se generan las operaciones de acceso a datos en los DAOs </li></ul><ul><li>Se transforma la clase facade a la clase que la implementa </li></ul>1
  63. 63. Transformación de UML a Java Beans <ul><li>transformation PIM2PSMJava(uml:UMLModel, java:UMLModel) { </li></ul><ul><li>top relation PackageToPackage { </li></ul><ul><li>pn : String; </li></ul><ul><li>checkonly domain uml srcPackage:UMLModel::Package {name=pn}; </li></ul><ul><li>enforce domain java tarPackage : UMLModel::Package {name=pn}; </li></ul><ul><li>} </li></ul>los metamodelos de origen y destino son en este caso UML
  64. 64. Transformación de UML a Java Beans <ul><li>Se genera un paquete Java por cada paquetes UML </li></ul><ul><li>Se genera una clase Java por cada clase del dominio </li></ul><ul><li>Los atributos UML se transforman en atributos Java con métodos de acceso </li></ul><ul><li>Se agregan los identificadores a las clases persistentes del dominio </li></ul><ul><li>A partir de las clases UML se generan los DAOs </li></ul><ul><li>Se generan las operaciones de acceso a datos en los DAOs </li></ul><ul><li>Se transforma la clase facade a la clase que la implementa </li></ul>2
  65. 65. Transformación de UML a Java Beans <ul><li>top relation ClassToJavaClass{ </li></ul><ul><li>className, stName : String; </li></ul><ul><li>checkonly domain uml umlClass : UMLModel::Class{ </li></ul><ul><li>namespace = srcPackage : UMLModel::Package{}, </li></ul><ul><li>name = className, </li></ul><ul><li>stereotype = s1 : UMLModel::Stereotype{name = 'model'}, </li></ul><ul><li>stereotype = s2 : UMLModel::Stereotype{name = stName} </li></ul><ul><li>}; </li></ul><ul><li>enforce domain java javaClass : UMLModel::Class{ </li></ul><ul><li>namespace = tarPackage : UMLModel::Package{}, </li></ul><ul><li>name = className </li></ul><ul><li>}; </li></ul><ul><li>when { </li></ul><ul><li>PackageToPackage(srcPackage,tarPackage) and (stName <> 'facade'); </li></ul><ul><li>} </li></ul><ul><li>} </li></ul>transformo en Java Beans las clases que son model pero que no son façade (el Bookstore)
  66. 66. Transformación de UML a Java Beans <ul><li>Se genera un paquete Java por cada paquetes UML </li></ul><ul><li>Se genera una clase Java por cada clase del dominio </li></ul><ul><li>Los atributos UML se transforman en atributos Java con métodos de acceso </li></ul><ul><li>Se agregan los identificadores a las clases persistentes del dominio </li></ul><ul><li>A partir de las clases UML se generan los DAOs </li></ul><ul><li>Se generan las operaciones de acceso a datos en los DAOs </li></ul><ul><li>Se transforma la clase facade a la clase que la implementa </li></ul>3
  67. 67. Transformación de UML a Java Beans <ul><li>top relation AttributeToJavaAttribute{ </li></ul><ul><li>attrName : String; </li></ul><ul><li>checkonly domain uml umlAttr : UMLModel::Attribute{ </li></ul><ul><li>owner = umlClass : UMLModel::Class{}, </li></ul><ul><li>name = attrName </li></ul><ul><li>}; </li></ul><ul><li>enforce domain java javaAttr : UMLModel::Attribute{ </li></ul><ul><li>owner = javaClass : UMLModel::Class{ </li></ul><ul><li>feature = getter : UMLModel::Operation{ </li></ul><ul><li>name = 'get' + attrName.firstToUpper() </li></ul><ul><li>}, </li></ul><ul><li>feature = setter : UMLModel::Operation{ </li></ul><ul><li>name = 'set' + attrName.firstToUpper() </li></ul><ul><li>} </li></ul><ul><li>}, </li></ul><ul><li>name = attrName </li></ul><ul><li>}; </li></ul><ul><li>when { </li></ul><ul><li>ClassToJavaClass(umlClass, javaClass); </li></ul><ul><li>} </li></ul><ul><li>} </li></ul>template para armar los getters y setters
  68. 68. Transformación de UML a Java Beans <ul><li>Se genera un paquete Java por cada paquetes UML </li></ul><ul><li>Se genera una clase Java por cada clase del dominio </li></ul><ul><li>Los atributos UML se transforman en atributos Java con métodos de acceso </li></ul><ul><li>Se agregan los identificadores a las clases persistentes del dominio </li></ul><ul><li>A partir de las clases UML se generan los DAOs </li></ul><ul><li>Se generan las operaciones de acceso a datos en los DAOs </li></ul><ul><li>Se transforma la clase facade a la clase que la implementa </li></ul>4
  69. 69. Transformación de UML a Java Beans <ul><li>top relation PersistentClassToJavaIDClass{ </li></ul><ul><li>checkonly domain uml umlClass : UMLModel::Class{ </li></ul><ul><li>stereotype = s : UMLModel::Stereotype{ </li></ul><ul><li>name = 'persistent' </li></ul><ul><li>} </li></ul><ul><li>}; </li></ul><ul><li>enforce domain java javaClass : UMLModel::Class{ </li></ul><ul><li>feature = attr : UMLModel::Attribute{ </li></ul><ul><li>name = umlClass.name.firstToLower() + 'ID', </li></ul><ul><li>type = pdt : UMLModel::PrimitiveDataType{ </li></ul><ul><li>namespace = javaClass.namespace, </li></ul><ul><li>name = 'Integer' </li></ul><ul><li>} </li></ul><ul><li>} </li></ul><ul><li>}; </li></ul><ul><li>when { </li></ul><ul><li>ClassToJavaClass(umlClass, javaClass); </li></ul><ul><li>} </li></ul><ul><li>} </li></ul>este es el atributo que va a corresponder con la columna ID de la tabla
  70. 70. Transformación de UML a Java Beans <ul><li>Se genera un paquete Java por cada paquetes UML </li></ul><ul><li>Se genera una clase Java por cada clase del dominio </li></ul><ul><li>Los atributos UML se transforman en atributos Java con métodos de acceso </li></ul><ul><li>Se agregan los identificadores a las clases persistentes del dominio </li></ul><ul><li>A partir de las clases UML se generan los DAOs </li></ul><ul><li>Se generan las operaciones de acceso a datos en los DAOs </li></ul><ul><li>Se transforma la clase facade a la clase que la implementa </li></ul>5
  71. 71. Transformación de UML a Java Beans <ul><li>top relation ClassToDAOComponent{ </li></ul><ul><li>className, agName : String; </li></ul><ul><li>checkonly domain uml uc : UMLModel::Class{ </li></ul><ul><li>namespace = srcPackage : UMLModel::Package{}, </li></ul><ul><li>name = className, </li></ul><ul><li>isAbstract = false , </li></ul><ul><li>stereotype = s : UMLModel::Stereotype{name ='persistent'}, </li></ul><ul><li>associationEnd = assoEnd1 :UMLModel::AssociationEnd{ </li></ul><ul><li>association = asso : UMLModel::Association{ </li></ul><ul><li>associationEnd = assoEnd2:UMLModel::AssociationEnd{ </li></ul><ul><li>aggregation = ak : UMLModel::AggregationKind{kind = agName} </li></ul><ul><li>} </li></ul><ul><li>} </li></ul><ul><li>} </li></ul><ul><li>}; </li></ul>toma las clases persistentes y no abstractas
  72. 72. Transformación de UML a Java Beans <ul><li>enforce domain java dc : UMLModel::Class{ </li></ul><ul><li>namespace = tarPackage : UMLModel::Package{}, </li></ul><ul><li>name = className + 'DAO', </li></ul><ul><li>stereotype = st : UMLModel::Stereotype{ </li></ul><ul><li>namespace = tarPackage, </li></ul><ul><li>name = ‘interface’ </li></ul><ul><li>} </li></ul><ul><li>}; </li></ul><ul><li>when { </li></ul><ul><li>PackageToPackage(srcPackage,tarPackage) and (assoEnd1 <> assoEnd2) and (agName <> 'composite'); </li></ul><ul><li>} </li></ul><ul><li>} </li></ul>enforce domain java dc : UMLModel::Class{ namespace = tarPackage : UMLModel::Package{}, name = className + 'DAO', stereotype = st : UMLModel::Stereotype{ namespace = tarPackage, name = ‘interface’ } }; when { PackageToPackage(srcPackage,tarPackage) and (assoEnd1 <> assoEnd2) and (agName <> 'composite'); } } los DAO son los la parte del todo de la relación, no la de la parte los DAO son definidos como interfaces
  73. 73. Transformación de UML a Java Beans <ul><li>Se genera un paquete Java por cada paquetes UML </li></ul><ul><li>Se genera una clase Java por cada clase del dominio </li></ul><ul><li>Los atributos UML se transforman en atributos Java con métodos de acceso </li></ul><ul><li>Se agregan los identificadores a las clases persistentes del dominio </li></ul><ul><li>A partir de las clases UML se generan los DAOs </li></ul><ul><li>Se generan las operaciones de acceso a datos en los DAOs </li></ul><ul><li>Se transforma la clase facade a la clase que la implementa </li></ul>6
  74. 74. Transformación de UML a Java Beans <ul><li>top relation DAOComponentToDAOOperations{ </li></ul><ul><li>checkonly domain uml class : UMLModel::Class{ }; </li></ul><ul><li>enforce domain java javaClass : UMLModel::Class{ </li></ul><ul><li>feature = oper1 : UMLModel::Operation{ </li></ul><ul><li> name = 'get' + class.name.firstToUpper() + 'List' </li></ul><ul><li>} </li></ul><ul><li>}; </li></ul><ul><li>enforce domain java javaClass : UMLModel::Class{ </li></ul><ul><li>feature = oper2 : UMLModel::Operation{ </li></ul><ul><li> name = 'get' + class.name.firstToUpper() + 'ByKeyword' </li></ul><ul><li>} </li></ul><ul><li>}; </li></ul><ul><li>enforce domain java javaClass : UMLModel::Class{ </li></ul><ul><li>feature = oper3 : UMLModel::Operation{ </li></ul><ul><li> name = 'update' + class.name.firstToUpper() </li></ul><ul><li>} </li></ul><ul><li>}; </li></ul><ul><li>…… </li></ul>Puedo tener varios enforce , en este caso son 4, uno por cada servico que provee el DAO: para obtener todas las instancias, para buscar por clave, para actualizar y para insertar una nueva instancia
  75. 75. Transformación de UML a Java Beans <ul><li>…… </li></ul><ul><li>enforce domain java javaClass : UMLModel::Class{ </li></ul><ul><li>feature = oper4 : UMLModel::Operation{ </li></ul><ul><li> name = 'insert' + class.name.firstToUpper() </li></ul><ul><li>} </li></ul><ul><li>}; </li></ul><ul><li>when { </li></ul><ul><li>ClassToDAOComponent(class, javaClass); </li></ul><ul><li>} </li></ul><ul><li>} </li></ul>
  76. 76. Transformación de UML a Java Beans <ul><li>Se genera un paquete Java por cada paquetes UML </li></ul><ul><li>Se genera una clase Java por cada clase del dominio </li></ul><ul><li>Los atributos UML se transforman en atributos Java con métodos de acceso </li></ul><ul><li>Se agregan los identificadores a las clases persistentes del dominio </li></ul><ul><li>A partir de las clases UML se generan los DAOs </li></ul><ul><li>Se generan las operaciones de acceso a datos en los DAOs </li></ul><ul><li>Se transforma la clase facade a la clase que la implementa </li></ul>7
  77. 77. Transformación de UML a Java Beans <ul><li>top relation FacadeToImpl{ </li></ul><ul><li>className : String; </li></ul><ul><li>checkonly domain uml uc : UMLModel::Class{ </li></ul><ul><li>namespace = srcPackage : UMLModel::Package{}, </li></ul><ul><li>name = className, </li></ul><ul><li>stereotype = s : UMLModel::Stereotype{ </li></ul><ul><li> name = 'facade' </li></ul><ul><li>} </li></ul><ul><li>}; </li></ul><ul><li>enforce domain java implClass : UMLModel::Class{ </li></ul><ul><li>namespace = tarPackage : UMLModel::Package{}, </li></ul><ul><li>name = className + 'Impl' </li></ul><ul><li>}; </li></ul><ul><li>…… </li></ul>tiene 2 enforce : uno crea la interface y otro la implementación
  78. 78. Transformación de UML a Java Beans <ul><li>…… </li></ul><ul><li>enforce domain java facadeClass : UMLModel::Class{ </li></ul><ul><li>namespace = tarPackage : UMLModel::Package{}, </li></ul><ul><li>name = className + 'Facade', </li></ul><ul><li>stereotype = s : UMLModel::Stereotype{ </li></ul><ul><li> namespace = tarPackage : UMLModel::Package {}, </li></ul><ul><li> name = 'interface' </li></ul><ul><li>} </li></ul><ul><li>}; </li></ul><ul><li>when { </li></ul><ul><li>PackageToPackage(srcPackage,tarPackage); </li></ul><ul><li>} </li></ul><ul><li>} </li></ul>
  79. 79. Conclusiones <ul><li>La aplicación de MDD resulta productiva cuando: </li></ul><ul><ul><li>El proceso de transformación es complejo (controladores y vistas). </li></ul></ul><ul><ul><li>La transformación sin ser compleja implica gran cantidad de trabajo rutinario (modelo relacional y Java Beans). </li></ul></ul><ul><li>QVT es el estándar de OMG para transformaciones M2M. En conjunto, lenguaje híbrido. </li></ul><ul><li>La epecificación QVT sufrió varias revisiones, y contempla muchos casos, resultando en un documento complejo. </li></ul><ul><li>El soporte de herramientas para implementar QVT es todavía insuficiente. </li></ul>
  80. 80. <ul><li>Muchas gracias! </li></ul>

×