270 likes | 356 Views
Odyssey-MDA: Uma Abordagem para a Transformação de Modelos de Componentes. Natanael Maia Ana Paula Blois Cláudia Werner Grupo de Reutilização de Software Novembro/2005. Roteiro. Introdução Arquitetura Orientada por Modelos (MDA) Abordagem Odyssey-MDA
E N D
Odyssey-MDA: Uma Abordagem para a Transformação de Modelos de Componentes Natanael Maia Ana Paula Blois Cláudia Werner Grupo de Reutilização de Software Novembro/2005
Roteiro • Introdução • Arquitetura Orientada por Modelos (MDA) • Abordagem Odyssey-MDA • Definição de plataformas e transformações • Modelagem e marcação dos modelos • Execução de transformações (exemplo EJB) • Geração de código • Ferramenta implementada • Considerações Finais Odyssey-MDA
Introdução • Desenvolvimento Baseado em Componentes • Reaproveitamento de esforço (Reutilização) • Ganho em qualidade e produtividade • Tecnologias • Surgem e evoluem muito rapidamente • Necessidade de evolução pode restringir a reutilização dos componentes obsoletos Odyssey-MDA
Arquitetura Orientada por Modelos • Abordagem que visa permitir: • Especificação do software de forma independente de uma plataforma (tecnologia) em particular • Realização de transformações para aplicação de conceitos de plataforma sobre a especificação inicial • Separação entre especificação da funcionalidade e a sua implementação numa tecnologia qualquer • Facilidade na obtenção da especificação do sistema na plataforma escolhida Odyssey-MDA
Arquitetura Orientada por Modelos • Conceitos • Plataforma: Conjunto de subsistemas e tecnologias que disponibilizam serviços através de interfaces e padrões de utilização • PIM – Platform Independent Model • PSM – Platform Specific Model • Transformações Modelo ↔ Modelo Modelo ↔ Texto Odyssey-MDA
Abordagem Odyssey-MDA • Definição de transformações bidirecionais • Execução das transformações sobre modelos de componentes independentes de plataforma (PIM) e obtenção dos modelos específicos para uma plataforma em particular (PSM) • Geração da implementação dos componentes na plataforma escolhida. Odyssey-MDA
Abordagem Odyssey-MDA • Padrões utilizados: • MOF – Linguagem abstrata que é usada para descrever outras linguagens • JMI – Permite a geração de interfaces Java para manipulação de elementos de um modelo cujo meta-modelo é descrito em MOF • XMI – Permite o intercâmbio (em XML) de modelos entre ferramentas (meta-modelo MOF) Odyssey-MDA
Definições de plataformas e transformações EJB Modelagem dos componentes Marcação do modelo Escolha da plataforma e execução de transformações Geração da implementação Abordagem Odyssey-MDA Odyssey-MDA
Plataformas e Transformações • Plataformas: • Conjunto de transformações • Conjunto de templates para geração de código fonte • Transformações: • Execução bidirecional • Atualização não destrutiva de modelos existentes • São definidas através de: • Mapeamentos • Finders • Mecanismos Odyssey-MDA
Mapeamentos Componente ↔ Componente Classe ↔ Componente Classe ↔ Interface etc. ClassifierMap * * FeatureMap Atributo ↔ Atributo Operação ↔ Atributo etc. * Classe ↔ Atributo Componente ↔ Operação Interface ↔ Atributo etc. ClassifierFeatureMap Odyssey-MDA
Finders • Selecionam elementos a serem transformados • Critérios de seleção de elementos: • Nome→ todas os elementos com nome “create” • Tipo → todas as Classes, Interfaces • Estereótipos → todos os elementos <<entity>> • Etiquetas → todos os elementos que tenham a etiqueta “persistent” com valor “true”. Odyssey-MDA
AttributeAttribute • AttributeOperation • OperationOperation • ClassInterface • ClassAttribute • ClassOperation • InterfaceInterface • InterfaceAttribute • InterfaceOperation • ComponentComponent • ComponentClass • ComponentInterface • ComponentAttribute • ComponentOperation • ClassClass Mecanismos • Transformam elementos do modelo de entrada em elementos do modelo de saída • São bidirecionais (forward e reverse) • Pré-definidos: Odyssey-MDA
<< component >> Cliente Cliente + nome : String + codigo : String + endereco : String ICliente Modelagem dos componentes • Componente PIM: Odyssey-MDA
<< component >> << entity >> Cliente << entity >> Cliente + nome : String + codigo : String + endereco : String ICliente Marcação do modelo • Componente PIM marcado: Odyssey-MDA
<< component >> << EJBEntityBeanComponent >> ClienteBean << component >> << entity >> Cliente ICliente Mapeamento: ClassifierMap Mecanismo: ComponentComponent Finder: esquerda: tipo(Component) Finder: esquerda: estereótipo(<<entity>>) Finder: direita: tipo(Component) Finder: direita: estereótipo(<<EJBEntityBeanComponent>>) << EJBEntityBean >> ClienteBean -idCliente:String -nome:String -codigo:String -endereco:String #entityContext:EntityContext ClientePK << entity >> Cliente -idCliente:String +hashCode():int +equals(other:Object):boolean + nome : String + codigo : String + endereco : String +ejbCreate():ClientePK +ejbPostCreate():void +ejbActivate():void +ejbLoad():void +ejbPassivate():void +ejbRemove():void +ejbStore():void +getAll():... +setAll(...):void Cliente << EJBRemoteInterface >> ClienteLocal << EJBLocalInterface >> ClienteHome << EJBLocalHomeInterface >> ClienteLocalHome << EJBHomeInterface >> +getAll():... +setAll(...):void +create():Cliente +findByPrimaryKey(...):... +create():ClienteLocal +findByPrimaryKey(...):... +getAll():... +setAll(...):void Execução da transformação Odyssey-MDA
<< component >> << EJBEntityBeanComponent >> ClienteBean << component >> << entity >> Cliente ICliente << EJBEntityBean >> ClienteBean -idCliente:String -nome:String -codigo:String -endereco:String #entityContext:EntityContext ClientePK << entity >> Cliente -idCliente:String +hashCode():int +equals(other:Object):boolean + nome : String + codigo : String + endereco : String +ejbCreate():ClientePK +ejbPostCreate():void +ejbActivate():void +ejbLoad():void +ejbPassivate():void +ejbRemove():void +ejbStore():void +getAll():... +setAll(...):void ClienteLocalHome << EJBHomeInterface >> ClienteLocal << EJBLocalInterface >> ClienteHome << EJBLocalHomeInterface >> Cliente << EJBRemoteInterface >> +getAll():... +setAll(...):void +create():Cliente +findByPrimaryKey(...):... +create():ClienteLocal +findByPrimaryKey(...):... +getAll():... +setAll(...):void Execução da transformação Mapeamento: ClassifierMap Mecanismo: ClassClass Finder: esquerda: tipo(Class) Finder: esquerda: estereótipo(<<entity>>) Finder: direita: tipo(Class) Finder: direita: estereótipo(<<EJBEntityBean>>) Odyssey-MDA
<< component >> << EJBEntityBeanComponent >> ClienteBean << component >> << entity >> Cliente ICliente << EJBEntityBean >> ClienteBean -idCliente:String -nome:String -codigo:String -endereco:String #entityContext:EntityContext ClientePK << entity >> Cliente -idCliente:String +hashCode():int +equals(other:Object):boolean + nome : String + codigo : String + endereco : String +ejbCreate():ClientePK +ejbPostCreate():void +ejbActivate():void +ejbLoad():void +ejbPassivate():void +ejbRemove():void +ejbStore():void +getAll():... +setAll(...):void ClienteLocalHome << EJBHomeInterface >> ClienteLocal << EJBLocalInterface >> ClienteHome << EJBLocalHomeInterface >> Cliente << EJBRemoteInterface >> +getAll():... +setAll(...):void +create():Cliente +findByPrimaryKey(...):... +create():ClienteLocal +findByPrimaryKey(...):... +getAll():... +setAll(...):void Execução da transformação Mapeamento: FeatureMap Mecanismo: AttributeAttribute Finder: esquerda: tipo(Attribute) Finder: direita: tipo(Attribute) Odyssey-MDA
<< component >> << EJBEntityBeanComponent >> ClienteBean << component >> << entity >> Cliente << component >> << entity >> Cliente ICliente << entity >> Cliente << entity >> Cliente << EJBEntityBean >> ClienteBean + nome : String + codigo : String + endereco : String + cidade : String + nome : String + codigo : String + endereco : String + cidade : String + numeroCartao : ClientePK -idCliente:String -nome:String -codigo:String -endereco:String -numeroCartao:String #entityContext:EntityContext -idCliente:String +hashCode():int +equals(other:Object):boolean +ejbCreate():ClientePK +ejbPostCreate():void +ejbActivate():void +ejbLoad():void +ejbPassivate():void +ejbRemove():void +ejbStore():void +getAll():... +setAll(...):void ClienteLocal << EJBLocalInterface >> ClienteHome << EJBLocalHomeInterface >> ClienteLocalHome << EJBHomeInterface >> Cliente << EJBRemoteInterface >> Execução reversa (não destrutiva) +getAll():... +setAll(...):void +create():Cliente +findByPrimaryKey(...):... +create():ClienteLocal +findByPrimaryKey(...):... +getAll():... +setAll(...):void Execução da transformação ICliente Odyssey-MDA
<< component >> << EJBEntityBeanComponent >> ClienteBean ClienteLocal << EJBLocalInterface >> +getAll():... +setAll(...):void << EJBEntityBean >> ClienteBean -idCliente:String -nome:String -codigo:String -endereco:String #entityContext:EntityContext Templates ClienteLocalHome << EJBHomeInterface >> +create():ClienteLocal +findByPrimaryKey(...):... +ejbCreate():ClientePK +ejbPostCreate():void +ejbActivate():void +ejbLoad():void +ejbPassivate():void +ejbRemove():void +ejbStore():void +getAll():... +setAll(...):void ClientePK -idCliente:String +hashCode():int +equals(other:Object):boolean ClienteHome << EJBLocalHomeInterface >> +create():Cliente +findByPrimaryKey(...):... Cliente << EJBRemoteInterface >> +getAll():... +setAll(...):void Código fonte (JAVA) Geração da Implementação Odyssey-MDA
Ferramenta Case Geração De Código Odyssey-MDA XMI XMI Ambiente de Reutilização Engenharia Reversa Especificações de Mapeamentos (XML) Plug-ins (Java/JMI) Ferramenta Odyssey-MDA • Framework para especificação e execução de transformações sobre modelos UML • PIM ↔ PIM , PIM ↔ PSM , PSM ↔ PSM Odyssey-MDA
Ferramenta Odyssey-MDA • Implementação dos mecanismos (Java/JMI): • Pré-definidos (built-ins) • Definidos pelo usuário (plug-ins) • Especificação dos mapeamentos (XML): • Seleção de elementos (finders) • Configuração dos mecanismos Odyssey-MDA
Ferramenta Odyssey-MDA • Stand-alone Odyssey-MDA
Ferramenta Odyssey-MDA • Odyssey-plug-in Odyssey-MDA
Considerações finais • Contribuições • Independência de ferramenta CASE • Transformações bidirecionais entre modelos • Extensão via plug-ins • Ferramenta de transformações de modelos e geração de código (Odyssey-MDA) • Trabalhos futuros • Utilização de outros meta-modelos baseados no MOF • Estudo de caso para avaliar a utilização da ferramenta Odyssey-MDA
Odyssey-MDA: Uma Abordagem para a Transformação de Modelos de Componentes {ntmaia, anablois, werner}@cos.ufrj.br Grupo de Reutilização de Software Novembro/2005
Properties • Permitem a configuração dos mecanismos utilizados nas transformações (built-ins/plug-ins) <property name="stereotype" value="EntityBean" direction="forward" /> <property name="nameTransformation" direction="forward" value="#CLASSIFIER_NAME#Bean" /> <property name="nameTransformation" direction="reverse"> <property name="input" value="#CLASSIFIER_NAME#" /> <property name="regex" value="(.*)Bean$" /> <property name="subst" value="$1" /> </property> Odyssey-MDA
Relacionamentos • A geração de relacionamentos entre os elementos gerados na transformação é configurada na especificação declarativa <relationship name="Dependency (entityBean -> entityRemoteInterface)" type="Dependency" direction="LEFT_TO_RIGHT"> <element id="entityRemoteInterface" /> <element id="entityBean" /> </relationship> Odyssey-MDA