• Nenhum resultado encontrado

Transformações ATL

No documento Inês Carvalho Nunes Simão (27179) (páginas 132-138)

8. Especificação da LDE para a Abordagem Theme-SPL

8.6 Transformações ATL

Após criadas as duas LDEs são definidas regras de transformação, cujo objectivo é gerar, através dos modelos da abordagem Theme-SPL, uma visualização do modelo de features. Para efectuar a transformação recorreu-se ao metamodelo utilizado para a LDE gráfica, ou seja, o ficheiro Theme-SPL.ecore (Figura 8.1) e através de regras de transformação, utilizando o metamodelo FeatureModel.ecore (Figura 8.2), gera-se o editor gráfico para o modelo de features.

O código ATL apresentado em seguida consiste num Header Section e em dezasseis Rules. O primeiro contém o nome do módulo (Theme-SPL) e os metamodelos de origem (Theme-SPL) e destino (FM). Em cada regra, para cada instância de Theme-SPL cria uma instância do modelo de features (FM). As heurísticas de mapeamento referidas são as definidas na secção 5.3.

module ThemeSPL; -- Module Template

create OUT : FM from IN : Theme-SPL;

A regra para cada instância da abordagem Theme-SPL cria uma instância do modelo de features no qual, a ligação containsFeature do modelo de features corresponde à união de todos os nós representados em Theme-SPL, e a ligação containsRelation do modelo de features corresponde à união de todos os links representados em Theme-SPL.

111 rule FeatureModel{ from p:Theme-SPL!ThemeApproach to out: FM!FeatureModel(

containsFeature<-Set Theme!Entity.allInstancesFrom('IN')} ->union (Set {Theme!Themes.allInstancesFrom('IN')}) ->union (Set {Theme!Aspect.allInstancesFrom('IN')}) ->union (Set {Theme!ThemeGroup.allInstancesFrom('IN')}) ->union (Set {Theme!GroupedTheme.allInstancesFrom('IN')}) ->union (Set {Theme!RootTheme.allInstancesFrom('IN')}), containsRelation<-Set {Theme!Obligatory.allInstancesFrom('IN')}

->union (Set {Theme!Alternative.allInstancesFrom('IN')}) ->union (Set {Theme!Part_of.allInstancesFrom('IN')}) ->union (Set {Theme!Crosscuting.allInstancesFrom('IN')}) ->union (Set {Theme!Alternative_or.allInstancesFrom('IN')}) ->union (Set {Theme!Alternative_xor.allInstancesFrom('IN')}) ->union (Set {Theme!Excludes.allInstancesFrom('IN')}) ->union (Set {Theme!Require.allInstancesFrom('IN')}) )}

A regra seguinte é obtida através da heurística de mapeamento HM.1. Para cada instância RootTheme do metamodelo de origem, cria uma instância RootFeature do metamodelo de destino, na qual o nome da raiz do modelo de features corresponde ao nome da raiz de Theme-SPL.

rule RootThemeToRootFeature {

from

p: Theme-SPL!RootTheme

to

out: FM!RootFeature (nameF <- p.name)}

A regra seguinte é obtida através da heurística de mapeamento HM.2. A regra, para cada instância Aspect do metamodelo de origem, cria uma instância Feature do metamodelo de destino, na qual o nome da feature corresponde ao nome do aspecto.

rule AspectToFeature {

from

p: Theme-SPL!Aspect

to

out: FM!Feature ( nameF <- p.name)}

Esta regra é obtida através da heurística de mapeamento HM.2. A regra, para cada instância Entity do metamodelo de origem, cria uma instância Feature do metamodelo de destino, na qual o nome da feature corresponde ao nome da entidade.

rule EntityToFeature {

from

p: Theme-SPL!Entity

to

112

Esta regra é obtida através da heurística de mapeamento HM.2. A regra, para cada instância Themes do metamodelo de origem, cria uma instância Feature do metamodelo de destino, na qual o nome da feature corresponde ao nome do tema.

rule ThemesToFeature {

from

p: Theme-SPL!Themes

to

out: FM!Feature ( nameF <- p.name)}

A seguinte regra é obtida através da heurística de mapeamento HM.3. A regra, para cada instância ThemeGroup do metamodelo de origem, cria uma instância FeatureGroup do metamodelo de destino, na qual o nome da feature group corresponde ao nome do theme group e a cardinalidade do grupo é uma String que contém o número mínimo e máximo de temas que o grupo pode ter, separados por ‘...’. É necessário que o número mínimo seja sempre menor que o máximo para apresentar a cardinalidade ao utilizador.

rule ThemeGroupToFeatureGroup { from p: Theme-SPL!ThemeGroup to out: FM!FeatureGroup ( nameF <- p.name,

groupCardinality<- if(p.min <=p.max)

then p.min+'..'+p.max

else ''

endif)}

Esta regra é obtida através da heurística de mapeamento HM.4. A regra, para cada instância GroupedTheme do metamodelo de origem, cria uma instância GroupedFeature do metamodelo de destino, na qual o nome da grouped feature corresponde ao nome do grouped theme.

rule GroupedThemeToGroupedFeature {

from

p: Theme-SPL!GroupedTheme

to

out: FM!GroupedFeature (nameF <- p.name)}

A regra seguinte é obtida através da heurística de mapeamento HM.5. A regra, para cada instância Part_of do metamodelo de origem, cria uma instância Mandatory do metamodelo de destino, na qual a ligação origem, source feature, corresponde à ligação LinkToNodeFrom, e à ligação destino, target feature, corresponde a ligação LinkToNodeTo. A correspondência entre ligações é efectuada de acordo com as

113

propriedades Souce Feature e Target Feature definidas no GMFMAP, como é exemplo a Figura 8.5.

rule Part_of{

from

p: Theme-SPL!Part_of

to

out:FM!Mandatory( sourceFeature <-p. LinkToNodeFrom, targetFeature <- p. LinkToNodeTo)}

Esta regra é obtida através da heurística de mapeamento HM.5. A regra, para cada instância Obligatory do metamodelo de origem, cria uma instância Mandatory do metamodelo de destino, na qual a ligação origem, source feature, corresponde à ligação LinkToNodeFrom, e à ligação destino, target feature, corresponde a ligação LinkToNodeTo.

rule Obligatory{

from

p: Theme-SPL!Obligatory

to

out:FM!Mandatory( sourceFeature <-p. LinkToNodeFrom, targetFeature <- p. LinkToNodeTo)}

Esta regra é obtida através da heurística de mapeamento HM.6. A regra, para cada instância Alternative do metamodelo de origem, cria uma instância Optional do metamodelo de destino, na qual a ligação origem, source feature, corresponde à ligação LinkToNodeFrom, e a ligação destino, target feature, corresponde à ligação LinkToNodeTo.

rule Alternative{

from

p: Theme-SPL!Alternative

to

out:FM!Optional( sourceFeature <-p. LinkToNodeFrom, targetFeature <- p. LinkToNodeTo)}

Esta regra é obtida através da heurística de mapeamento HM.7. A regra, para cada instância Alternative_or do metamodelo de origem, cria uma instância Alternative_or do metamodelo de destino, na qual a ligação origem, source feature, corresponde à ligação alternativeToThemeGroup, e a ligação destino, target feature, corresponde à ligação alternativeToGroupedTheme.

rule Alternative_or{

from

114

to

out:FM!Alternative_or(sourceFeature <-p.alternativeToThemeGroup, targetFeature <- p.alternativeToGroupedTheme )}

Esta regra é obtida através da heurística de mapeamento HM.8. A regra, para cada instância Alternative_xor do metamodelo de origem, cria uma instância Alternative_xor do metamodelo de destino, na qual a ligação origem, source feature, corresponde à ligação alternativeToThemeGroup, e a ligação destino, target feature, corresponde à ligação alternativeToGroupedTheme.

rule Alternative_xor{

from

p: Theme-SPL!Alternative_xor

to

out:FM!Alternative_xor( sourceFeature <-p.alternativeToThemeGroup, targetFeature <- p.alternativeToGroupedTheme)}

Esta regra é obtida através da heurística de mapeamento HM.9. A regra, para cada instância Crosscuting do metamodelo de origem, cria uma instância Mandatory do metamodelo de destino, se o tipo de ligação de crosscuting for “Obligatory”. A ligação origem, source feature, corresponde à ligação crosscutingToTheme, e a ligação destino, target feature, corresponde à ligação crosscutingToAspect.

rule CrosscutingObligatory{

from

p: Theme-SPL!Crosscuting (p.type = 'Obligatory')

to

out:FM!Mandatory( sourceFeature <-p.crosscutingToTheme, targetFeature <- p. crosscutingToAspect)}

Esta regra é obtida através da heurística de mapeamento HM.9. Esta regra é obtida através da heurística de mapeamento HM.9. A regra, para cada instância Crosscuting do metamodelo de origem, cria uma instância Optional do metamodelo de destino, se o tipo de ligação de crosscuting for “Alternative”. A ligação origem, source feature, corresponde à ligação crosscutingToTheme, e a ligação destino, target feature, corresponde à ligação crosscutingToAspect.

rule CrosscutingAlternative{

from

p: Theme-SPL!Crosscuting (p.type = 'Alternative') to

out:FM!Optional( sourceFeature <-p.crosscutingToTheme, targetFeature <- p.crosscutingToAspect)}

115

Esta regra é obtida através da heurística de mapeamento HM.10. A regra, para cada instância Require do metamodelo de origem, cria uma instância Require do metamodelo de destino, na qual a ligação origem, source feature, corresponde à ligação LinkToNodeFrom, e a ligação destino, target feature, corresponde à ligação LinkToNodeTo, e o id do modelo de features corresponde ao id de Theme-SPL.

rule Requires{

from

p: Theme-SPL!Require

to

out:FM!Require( sourceFeature <- p. LinkToNodeFrom, targetFeature <- p. LinkToNodeTo, id <- p.id)}

Esta regra é obtida através da heurística de mapeamento HM.10. A regra, para cada instância Excludes do metamodelo de origem, cria uma instância Exclude do metamodelo de destino, na qual a ligação origem, source feature, corresponde à ligação LinkToNodeFrom, e a ligação destino, target feature, corresponde à ligação LinkToNodeTo, e o id do modelo de features corresponde ao id de Theme-SPL.

rule Excludes{

from

p: Theme-SPL!Excludes

to

out:FM!Exclude( sourceFeature <-p. LinkToNodeFrom, targetFeature <- p. LinkToNodeTo, id <- p.id)}

8.7 Sumário

Neste capítulo foram descritos os passos de criação da ferramenta, nomeadamente qual a estratégia utilizada para abordar o problema, o desenho de ambos os modelos Ecore e quais os resultados obtidos, mais concretamente os editores criados e quais os conceitos que implementam. Foi também apresentado o código ATL usado para a transformação dos modelos Theme-SPL para o modelo de features.

116

No documento Inês Carvalho Nunes Simão (27179) (páginas 132-138)