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