ch-approach.tex 47 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915
  1. % vim:spell spelllang=fr
  2. \chapter{Transformations de modèles par réécriture}
  3. \label{ch:approach}
  4. %15p
  5. %\todo{
  6. %\begin{itemize}
  7. % \item Représentation de modèles dans le monde des grammaires. Il faut faire
  8. % une petite partie de préambule pour expliquer que l'on amène les modèles dans
  9. % le monde des grammaires pour utiliser des outils/techniques existant.
  10. % Certains transposent les techniques dans le monde des modèles. nous :
  11. % \begin{itemize}
  12. % \item métamodèle $\leftrightarrow$ signature ;
  13. % \item modèle $\leftrightarrow$ terme ;
  14. % \item génération d'une signature à partir d'un MM
  15. % \item création de termes représentant un modèle / ou chargement d'un modèle
  16. % directement mappé comme un terme $\rightarrow technique, non ? dans l'autre
  17. % partie ?$
  18. % \item transformation d'un terme (représentant donc une transformation de
  19. % modèle) $\rightarrow$ oui, c'est l'approche, trivial
  20. % \item le terme résultant peut ensuite être utilisé comme tout modèle
  21. % (mapping cible) $\rightarrow$ oui, trivial quand on a expliqué l'approche
  22. % \end{itemize}
  23. % \item Décomposition = approche compositionnelle
  24. % \item Résolution - réconciliation
  25. % \item Outil pour exprimer une transformation de modèle en Tom
  26. % \begin{itemize}
  27. % \item Extension du langage Tom
  28. % \begin{itemize}
  29. % \item syntaxe : \lex{\%transformation}, \lex{\%resolve}, \lex{\%tracelink}
  30. % \item illustration :??? ou alors on met le cas d'utilisation ici pour
  31. % expliquer ?
  32. % \end{itemize}
  33. % \item{Évolutions}
  34. % \begin{itemize}
  35. % \item[Modularité : ] cf. resolve modulaire, j'ai un proto qui est fait,
  36. % mais pas tant de réflexion que ça
  37. % \item[Traçabilité : ] ici je ne parle pas trop de la traçabilité liée aux
  38. % spéc mais plus la traçabilité technique/interne. Le "\%resolvelink" de
  39. % \%tracelink, + éventuellement une traçabilité type "log complet"
  40. % \item[Expressivité : ] simplification de syntaxe (traversal, arguments,
  41. % patterns, multi sources et cibles), lien avec le travail de Christophe ?
  42. % \end{itemize}
  43. % \end{itemize}
  44. % \item Travaux connexes : approche classique en MDE, outils, différences
  45. %\end{itemize}}
  46. %\todo{approche classique, à la QVT (resolve) ; à mettre ; Mais ce qui est moins classique : côté hybride 1. entre DSL et GPL ; 2. usages
  47. %d'outils d'un espace technologique pour appliquer des transformations de
  48. %modèles d'un autre espace technologique.}
  49. Dans ce chapitre, nous expliquons l'approche que nous avons adoptée pour mettre
  50. en œuvre les transformations de modèles. Dans la
  51. section~\ref{approach:sec:hybride}, nous présentons l'aspect hybride de notre
  52. approche, les choix liés ainsi que son intérêt. Nous abordons ensuite la
  53. problématique de la représentation des modèles dans notre approche dans la
  54. section~\ref{approach:sec:representation}. Nous expliquons dans la
  55. section~\ref{approach:sec:approche} les mécanismes en jeu pour notre approche
  56. de transformation de modèles par réécriture.
  57. %\ttodo{
  58. % \begin{itemize}
  59. % \item approche hybride : avantages + transfo par réécriture changement
  60. % d'espace technique ; hybride car GPL+DSL, changement d'espace technique,
  61. % non lié à une techno même si la première implém' l'est (extensible)
  62. % \item représentation de modèles
  63. % \item explication de l'approche classique décomposition+réconciliation avec
  64. % les \emph{placeholders}
  65. % \item avantages : modularité, traçabilité, expressivité
  66. % \end{itemize}
  67. %}
  68. \section{Choix et intérêt d'une approche hybride}
  69. \label{approach:sec:hybride}
  70. Si le principe de la transformation elle-même est un principe qui peut sembler
  71. classique, car adopté par d'autres outils tels que {\qvt} ou {\atl}, notre
  72. environnement de travail est très différent de celui des autres outils, ce qui
  73. fait l'originalité de notre approche. %En effet, nous nous plaçons dans un
  74. %environnement technique au croisement de plusieurs langages et technologies.
  75. Comme nous l'avons vu dans le chapitre~\ref{ch:notions}, il existe de multiples
  76. approches pour implémenter des transformations de modèles. L'un des choix
  77. possibles est d'opter pour une approche par programmation en utilisant un
  78. langage généraliste tel que {\java}. On lui adjoint un \emph{framework} et un
  79. ensemble de bibliothèques pour faciliter la représentation et la manipulation
  80. de modèles, notamment {\emf}. Ensuite, la transformation revient à l'écriture
  81. d'un programme qui charge un modèle en entrée et produit un modèle en sortie.
  82. Cette approche présente certains avantages. Les langages généralistes sont
  83. habituellement plus accessibles à la plupart des développeurs tant par le fait
  84. qu'une formation d'informaticien comprend généralement l'apprentissage de
  85. langages généralistes que par le fait que ces langages suivent des paradigmes
  86. de programmation bien identifiés. En outre, cette plus grande accessibilité a
  87. aussi pour effet de faciliter le développement de communautés, ainsi que
  88. d'outils d'aide au développement (IDE, bibliothèques, etc.) et de
  89. documentation. Ces effets entretiennent alors le cercle vertueux de la facilité
  90. d'accès. À l'opposé, il peut être difficile ou long d'implémenter une
  91. transformation complexe alors qu'un langage dédié proposerait les constructions
  92. adéquates pour ce type de tâche.
  93. Une deuxième possibilité est de suivre les recommandations {\mda} qui
  94. encouragent l'utilisation de {\dsl}. Cela a l'avantage d'être exactement adapté
  95. à la tâche visée. L'inconvénient est que les {\dsl} ont généralement une
  96. visibilité plus limitée, avec des communautés plus petites et un outillage
  97. moins étoffé. De plus, la compétence est plus difficile à trouver ou induit des
  98. coûts de formation plus élevés.
  99. Notre approche est une approche hybride, pour combler le fossé entre les
  100. langages généralistes et dédiés, afin de bénéficier du meilleur des deux
  101. mondes. Nous proposons d'utiliser le langage {\tom} pour exprimer des
  102. transformations de modèles, ce qui nous permet de nous intégrer dans des
  103. langages généralistes tout en apportant des fonctionnalités supplémentaires par
  104. ses constructions. Comme présenté dans le chapitre~\ref{ch:tom}, {\tom} repose
  105. sur le calcul de réécriture et implémente la fonctionnalité de \emph{stratégie
  106. de réécriture}, ce qui permet de découpler les règles métier du parcours des
  107. structures de données. Nous proposons donc de transformer des modèles par
  108. réécriture, en nous appuyant sur les stratégies. Manipulant des termes, il nous
  109. faut représenter les modèles sous cette forme pour pouvoir les transformer.
  110. Nous avons aussi fait le choix d'une intégration dans un environnement de
  111. production pouvant être considéré comme typique, à savoir l'écosystème {\java}.
  112. De plus, nous avons choisi de travailler dans un premier temps avec une
  113. technologie courante et très utilisée ---~{\emf}~--- qui devient un standard
  114. \emph{de fait}.
  115. Partant de ces choix et de nos contraintes, notre approche consiste à exprimer
  116. un modèle {\emf} sous la forme d'un terme puis à le transformer par réécriture.
  117. Nous opérons donc des transformations de modèles en changeant d'espace
  118. technologique pour pouvoir nous appuyer sur nos méthodes et outils déjà
  119. éprouvés. Nous décrivons le premier aspect de notre approche ---~la
  120. représentation des modèles~--- dans la
  121. section~\ref{approach:sec:representation}, puis nous détaillons les principes
  122. mis en œuvre dans une transformation dans la
  123. section~\ref{approach:sec:approche}.
  124. %Notre approche consi
  125. %
  126. %En effet, dans un contexte industriel
  127. %contexte économique, réduction des coûts
  128. %et la représentation choisie pour les modèles porte à conséquences sur les outils.
  129. \section{Représentation de modèles par une signature algébrique}
  130. \label{approach:sec:representation}
  131. %\ttodo{ici on explique l'on représente les modèles sous forme de termes. On a
  132. %donc aussi des MM, mais cela se présente sous la forme d'une signature (ex :
  133. %gom vs .ecore}
  134. Réécrivant des termes, la première étape de notre approche est d'élaborer une
  135. représentation adéquate des modèles. Compte tenu de ce besoin et de notre
  136. approche, nous procédons en premier lieu par à un changement d'espace
  137. technologique. Un métamodèle dans le monde des modèles correspond à une
  138. signature dans celui des termes, tandis qu'un modèle ---~conforme à son
  139. métamodèle~--- correspond à un terme ---~conforme à sa signature
  140. algébrique~---. Lors de ce changement, un aspect \emph{a priori} problématique
  141. de notre représentation sous forme de terme d'un modèle vient du fait qu'un
  142. terme est une structure arborescente tandis qu'un modèle est généralement vu
  143. comme un graphe (un ensemble de nœuds et d'arcs). Une transformation de modèle
  144. est donc une fonction de transformation de graphe qu'il faut encoder dans notre
  145. contexte. L'un des aspects de notre approche est d'opérer une transformation
  146. préalable permettant de considérer une transformation de modèles comme une
  147. transformation de termes. Cela est possible étant donné que l'on obtient un
  148. arbre de recouvrement par la relation de composition, ce qui nous permet
  149. d'établir une vue adéquate des modèles sous la forme d'un terme.
  150. Nous avons donc développé un outil ---~appelé {\tomemf}~--- que nous décrivons
  151. techniquement dans le chapitre~\ref{ch:outils}, et qui, pour un métamodèle
  152. {\emf} {\ecore} donné, produit sa signature algébrique {\tom} correspondante,
  153. utilisable dans un programme {\tomjava}. Bien que cet outil repose pour le
  154. moment sur une technologie particulière, il est tout à fait possible de
  155. l'étendre ou d'écrire un outil similaire adapté à d'autres technologies.
  156. Dans notre représentation, pour chaque métaclasse, une sorte lui correspond,
  157. ainsi qu'un opérateur. Une métaclasse pouvant avoir des attributs et des
  158. opérations, l'opérateur a les champs correspondants. Les relations sont
  159. représentées par des attributs simples dans le cas d'associations. Dans le cas
  160. de relations de composition, des sortes et opérateurs variadiques additionnels
  161. sont créés, et un attribut de ce type est ajouté à l'opérateur ayant la
  162. relation de composition.
  163. Pour illustrer notre propos, considérons un métamodèle simple permettant de
  164. décrire des graphes (figure~\ref{fig:graphmm}). Un graphe (\emph{Graph}) est
  165. composé de \emph{Nodes} et d'\emph{Arcs}. Chaque arc a un poids, une source et
  166. une cible. Ces extrémités sont de type \emph{Node}, un \emph{Node} pouvant
  167. avoir plusieurs arcs entrants et sortants.
  168. \begin{figure}[h]%[fig:graphmm]{Métamodèle de graphe.}%[H] %[!h]
  169. \begin{center}
  170. \input{figures/graphmm}
  171. \caption{Métamodèle des graphes.}
  172. \label{fig:graphmm}
  173. \end{center}
  174. \end{figure}
  175. La représentation sous forme de signature algébrique de ce métamodèle est alors
  176. donnée par le listing~\ref{code:signalgGraph}. Les métaclasses \emph{Graph},
  177. \emph{Node} et \emph{Arc} ont chacune une sorte qui lui correspond (nous avons
  178. conservé les même noms). Un opérateur ---~préfixé par \texttt{op} dans
  179. l'exemple~--- est associé à chacune d'entre elles. Les attributs présents dans
  180. les métaclasses sont bien reportés au niveau des opérateurs (\texttt{name} et
  181. \texttt{weight}). Les relations d'association sont traduites par des paramètres
  182. additionnels : l'opérateur \texttt{opArc} possède ainsi deux paramètres
  183. supplémentaires \texttt{source} et \texttt{target}. Le cas des relations de
  184. composition (relations \texttt{nodes} et \texttt{arcs}) est traité par la
  185. création d'opérateurs variadiques (\texttt{opNodeList} et \texttt{opArcList}
  186. dans notre exemple) ainsi que de leurs sortes associées (\texttt{NodeList} et
  187. \texttt{ArcList}).
  188. \begin{figure}[H]
  189. \centering
  190. \input{code/signalgGraph}
  191. % \caption{}
  192. % \label{code:signalgGraph}
  193. \end{figure}
  194. Grâce à ce changement d'espace technologique, nous encodons la fonction qui
  195. transforme un modèle non plus comme une fonction de réécriture de graphe, mais
  196. comme une fonction de réécriture de termes.
  197. %Dans notre approche de transformation par réécriture, nous représentons les
  198. %métamodèles sous la forme de signature algébrique. Plutôt que de parler de
  199. %métaclasses et de métarelations, nous parlons
  200. %
  201. %\ttodo{signature $\leftrightarrow$ métamodèle ; terme $\leftrightarrow$ modèle
  202. %; métaclasses contiennent des operations et des attributs ; peuvent être liées
  203. %par des métarelations (association ou composition)}
  204. \FloatBarrier
  205. \section{Transformation de modèles par réécriture}
  206. \label{approach:sec:approche}
  207. %\todo{à bouger}
  208. %Étant en mesure de représenter des modèles sous forme de termes ---~et donc de
  209. %voir une transformation de modèles non plus comme de la réécriture de graphe
  210. %mais comme de la réécriture de terme, nous pouvons
  211. Étant en mesure de représenter des modèles sous forme de termes, nous pouvons
  212. décrire notre approche pour les transformer. Son principe est similaire à celui
  213. de l'approche de {\qvt} et {\atl} et peut sembler classique dans le domaine des
  214. modèles. Toutefois, ce n'est pas le cas dans l'environnement dans lequel nous
  215. évoluons, et plus généralement dans le domaine des outils de transformation
  216. généralistes dédiés aux arbres. Habituellement, à l'instar d'un compilateur, les
  217. outils de transformation d'arbres procèdent à des parcours et à des
  218. modifications successives sur un arbre qui est passé de phase en phase de
  219. l'outil.
  220. Dans notre approche, nous décomposons les transformations en deux phases
  221. distinctes. La première est une transformation par parties qui consiste à créer
  222. les éléments cibles du modèle résultant ainsi que des éléments additionnels que
  223. nous appelons \emph{éléments resolve}, en référence au \emph{resolve} de {\qvt}
  224. et au \emph{resolveTemp} d'{\atl}. Ces éléments permettent de faire référence à
  225. des éléments qui n'ont pas encore été créés par la transformation. La seconde
  226. phase, quant à elle, a pour objectif de rendre le modèle cible résultat
  227. cohérent, c'est-à-dire conforme au métamodèle cible en éliminant les éléments
  228. \emph{resolve} et en les remplaçant par des références vers les éléments
  229. effectivement créés par la transformation. Cette seconde phase n'ajoute aucun
  230. nouvel élément cible au résultat.
  231. Pour illustrer notre propos dans ce chapitre, nous nous appuierons sur un
  232. exemple visuel permettant de bien comprendre le mécanisme de
  233. \emph{décomposition-résolution}. Supposons que nous souhaitons transformer une
  234. séquence \texttt{A;B} textuelle en sa forme graphique correspondante comme
  235. décrit par la Figure~\ref{fig:simpleApproachExample}. Dans cet exemple, le
  236. choix des couleurs des connecteurs est arbitraire : nous aurions très bien pu
  237. choisir de colorer le cercle en vert et le carré en bleu. Supposons donc que ce
  238. découpage est spécifié et imposé.
  239. \begin{figure}[h]
  240. \begin{center}
  241. \input{figures/simpleApproachExample}
  242. \caption{Transformation du modèle source \texttt{A;B} en un modèle cible graphique.}
  243. \label{fig:simpleApproachExample}
  244. \end{center}
  245. \end{figure}
  246. %Chacune de ces phases peut être vue comme une fonction que nous composons par
  247. %la suite pour former une transformation.
  248. %\noindent En instanciant notre approche avec le cas d'étude SimplePDLToPetriNet, nous
  249. %obtenons : %$SimplePDLToPetriNet$ comme la composée de $Transformer$ et de
  250. %%$Resolve$, avec $MM_{SimplePDL}$, $MM_{PetriNet_{resolve}}$ et $MM_{PetriNet}$
  251. %%respectivement les métamodèles source, étendu et cible :
  252. %\begin{tabbing}
  253. % $SimplePDLToPetriNet$ \= $ : MM_{SimplePDL} \rightarrow MM_{PetriNet}$\\
  254. % $Transformer$ \> $ : MM_{SimplePDL} \rightarrow MM_{PetriNet_{resolve}}$\\
  255. % $Resolve$ \> $ : MM_{PetriNet_{resolve}} \rightarrow MM_{PetriNet}$\\
  256. % $SimplePDLToPetriNet $ \> $ = Resolve \circ Transformer$\\
  257. %\end{tabbing}
  258. %Appliquée au processus $p_{root}$ (illustré Figure~\ref{fig:simplepdlusecase})
  259. %conforme à $MM_{SimplePDL}$ (Figure~\ref{fig:simplepdlmmodel}), cette
  260. %transformation produira un réseau de Petri $pn$ (illustré
  261. %Figure~\ref{fig:petrinetusecase}) conforme à $MM_{PetriNet}$
  262. %(Figure~\ref{fig:petrinetmmodel}), en passant par le résultat intermédiaire
  263. %$pn_{resolve}$ conforme au métamodèle $MM_{PetriNet_{resolve}}$. On obtient
  264. %donc :
  265. %\begin{flushleft}
  266. % $SimplePDLToPetriNet(p_{root}) = Resolve(Transformer(p_{root}))$, avec\\
  267. % $Transformer(p_{root}) = pn_{resolve}$ et\\
  268. % $Resolve(p_{resolve}) = pn$
  269. %\end{flushleft}
  270. %La Figure~\ref{fig:mmresolveinst} instancie le schéma d'extension du
  271. %métamodèle cible au cas d'étude : le métamodèle cible est enrichi
  272. %d'une métaclasse \emph{ResolvePT} pour pouvoir créer des éléments
  273. %intermédiaires \emph{resolve} qui jouent temporairement le role d'une
  274. %\emph{Transition} obtenue à partir d'une source \emph{Process}.
  275. %\begin{figure}[h]
  276. % \begin{center}
  277. % \input{figures/mmresolveinst}
  278. % \caption{Instanciation du schéma d'extension du métamodèle cible pour le cas d'étude SimplePDLToPetriNetPetriNet.}
  279. % \label{fig:mmresolveinst}
  280. % \end{center}
  281. %\end{figure}
  282. \subsection{Approche compositionnelle}%\todo{Transformations élémentaires} vs \todo{(OLD) Approche compositionnelle}}
  283. \label{approach:subsec:composition}
  284. %\todo{Note : Décomposition en transformations élémentaires == définitions,
  285. %ajouter la description de l'exemple "A ; B" ?}
  286. Une fois le problème de la représentation des modèles résolu, il est possible
  287. d'instancier un modèle (création d'un terme conforme à la signature algébrique)
  288. et d'opérer une transformation sur le terme le représentant.
  289. L'écriture d'une transformation de modèles peut se faire par une approche
  290. procédurale \emph{monolithique}. L'utilisateur construit la transformation par
  291. étapes (\emph{transformation steps}), dont l'ordre s'impose naturellement
  292. %\ttodo{non, détailler, exemple à illustrer visuellement}
  293. en fonction des besoins des différents éléments : par exemple, la
  294. transformation décrite dans la Figure~\ref{fig:simpleApproachExample} peut se
  295. décomposer en trois étapes que nous illustrons dans la
  296. Figure~\ref{fig:approachSimpleRules}.
  297. \begin{figure}[h]
  298. \centering
  299. \begin{tabular}{c|c|c}
  300. %\begin{subfigure}[A]{0.30\textwidth}
  301. \begin{subfigure}{0.30\textwidth}
  302. \centering
  303. \input{figures/approachRuleA}
  304. \subcaption{}
  305. \end{subfigure}
  306. &
  307. %\begin{subfigure}[seq]{0.30\textwidth}
  308. \begin{subfigure}{0.30\textwidth}
  309. \centering
  310. \input{figures/approachRuleSeq}
  311. \subcaption{}
  312. \end{subfigure}
  313. &
  314. %\begin{subfigure}[B]{0.30\textwidth}
  315. \begin{subfigure}{0.30\textwidth}
  316. \centering
  317. \input{figures/approachRuleB}
  318. \subcaption{}
  319. \end{subfigure}
  320. \end{tabular}
  321. \caption{Règles de transformation de \texttt{A}, \texttt{;} et \texttt{B}.}
  322. \label{fig:approachSimpleRules}
  323. \end{figure}
  324. La transformation de \texttt{A} (étape (a)) donne un hexagone et un cercle
  325. rouges connectés, celle de \texttt{B} (étape (c)) un pentagone et un
  326. connecteur bleus, celle de \texttt{;} (étape (b)) produit un triangle
  327. et un carré connectés verts, ainsi qu'un connecteur supplémentaire. Pour qu'un
  328. connecteur ou arc puisse être créé, il est nécessaire de connaître chaque
  329. extrémité. Ainsi, la transformation de \texttt{A} ne pose aucun souci
  330. particulier : un seul arc est créé entre deux éléments créés (hexagone et
  331. cercle) dans cette même étape de transformation. En revanche, la
  332. transformation de \texttt{B} en un pentagone est censée aussi construire un arc
  333. dont l'une des extrémités (petit carré) n'est pas créée dans cette étape de
  334. transformation. Il est donc nécessaire que l'étape de transformation
  335. construisant cette deuxième extrémité se déroule avant celle produisant l'arc
  336. (c). Le carré servant de seconde extrémité à l'arc est construit dans l'étape
  337. de transformation de \texttt{;} qui devra donc être exécutée avant (c). Nous
  338. notons que cette étape génère un autre arc dont l'une des extrémités n'est pas
  339. connue dans (b). L'étape de transformation produisant cette extrémité d'arc
  340. qui nous intéresse (petit cercle) est (a). Il est donc naturel d'exécuter (a)
  341. avant (b). Finalement, pour que cette transformation puisse être exécutée sans
  342. qu'il n'y ait de problème d'éléments manquant, l'utilisateur doit adopter les
  343. étapes de transformation dans l'ordre suivant : (a), puis (b), puis (c). S'il
  344. ne respecte pas cet ordre, il sera confronté au problème de création d'éléments
  345. avec des informations manquantes.
  346. Cependant, cette approche n'est pas toujours possible, notamment lorsque l'on
  347. manipule des structures cycliques. Lorsqu'elle est possible, elle nécessite une
  348. parfaite expertise ainsi qu'une connaissance globale de la transformation pour
  349. être capable d'organiser les différentes étapes. De plus, avec une telle
  350. méthode une transformation sera généralement monolithique. Elle sera donc peu
  351. générique et le code peu réutilisable, l'encodage du parcours du modèle ainsi
  352. que les transformations étant {\adhoc}. Généralement, le parcours du modèle
  353. sera encodé par des boucles et de la récursivité, et un traitement particulier
  354. sera déclenché lorsqu'un élément donné sera détecté. Parcours et traitement
  355. seront donc étroitement liés. La moindre modification du métamodèle source ou
  356. cible implique donc de repenser la transformation.
  357. Nous souhaitons au contraire faciliter le développement et la maintenance du
  358. code que l'utilisateur écrit pour une transformation, tout en le rendant
  359. réutilisable pour une autre transformation. Il est donc important d'adopter
  360. une méthode permettant une grande modularité du code.
  361. Notre approche est d'opérer une transformation par parties : il faut d'abord
  362. décomposer une transformation complexe en transformations les plus simples (ce
  363. que nous nommons \emph{transformations élémentaires} ou \emph{définitions}).
  364. Chacune d'entre elles est décrite par une règle ou un ensemble de règles. La
  365. transformation globale est ensuite construite en utilisant ces transformations
  366. élémentaires. Mais dans ce cas se pose le problème de la dépendance des
  367. définitions entre elles, ainsi que de l'utilisation d'éléments issus d'une
  368. transformation élémentaire dans une autre transformation élémentaire. Ce qui a
  369. des conséquences sur l'ordre d'application des définitions : il peut être
  370. absolument nécessaire qu'une partie de la transformation soit effectuée pour
  371. que les autres étapes puissent être appliquées. De plus, par souci
  372. d'utilisabilité, nous ne souhaitons pas que l'utilisateur ait besoin de se
  373. soucier de l'ordre d'application des transformations élémentaires. Nous
  374. souhaitons qu'il se concentre uniquement sur la partie métier de la
  375. transformation. Il faut donc mettre en œuvre un mécanisme permettant de
  376. résoudre les dépendances.
  377. Dans notre contexte, nous effectuons des transformations dites
  378. \emph{out-place}, ce qui signifie que le modèle source n'est pas modifié. Le
  379. modèle cible résultant est construit au fur et à mesure de la transformation,
  380. et n'est pas obtenu par modifications successives du modèle source
  381. ---~transformation \emph{in-place}, comme le font les outils
  382. VIATRA~\cite{Varro2002} / VIATRA2~\cite{Varro2007} et
  383. GrGen.NET~\cite{Jakumeit2010} par exemple. Partant de ce constat, les
  384. transformations élémentaires composant notre transformation n'entretiennent
  385. aucune dépendance dans le sens où la sortie d'une transformation élémentaire
  386. n'est pas l'entrée d'une autre transformation élémentaire. Dans notre approche
  387. compositionnelle, chaque sortie d'une transformation élémentaire est une partie
  388. du résultat final.
  389. %\todo{[maintenant, faut parler des \emph{éléments resolve}}
  390. Dans l'exemple, nous conservons la décomposition proposée dans la
  391. Figure~\ref{fig:approachSimpleRules} en trois règles simples. Nous avons
  392. décomposé une transformation complexe en \emph{définitions} indépendantes et
  393. nous pouvons les appliquer. Subsiste cependant le problème de l'usage dans une
  394. \emph{définition} d'éléments créés dans une autre \emph{définition}. Comme
  395. l'ordre d'écriture et d'application des transformations élémentaires ne doit
  396. pas être une contrainte pour l'utilisateur, nous avons choisi de résoudre ce
  397. problème par l'introduction d'éléments temporaires ---~éléments dits
  398. \emph{resolve}~--- qui font office d'éléments cibles durant la transformation,
  399. et qui sont substitués en fin de transformation lors d'une seconde phase. Cette
  400. dénomination fait évidemment référence au \emph{resolve} de {\qvt} et au
  401. \emph{resolveTemp} de {\atl}.
  402. Partant du principe que toutes les transformations élémentaires peuvent être
  403. déclenchées indépendamment dans n'importe quel ordre (voire en parallèle), il
  404. faut être en mesure de fournir un élément cible lorsque le traitement d'une
  405. \emph{définition} le nécessite. Nous proposons donc de construire un terme
  406. temporaire représentant l'élément final qui a été ou qui sera construit lors de
  407. l'application d'une autre \emph{définition}. Ce terme doit pouvoir être intégré
  408. dans le modèle cible temporaire pour être manipulé en lieu et place du terme
  409. ciblé censé être construit dans une autre \emph{définition}. Il doit donc
  410. respecter les contraintes de types du métamodèle cible tout en portant des
  411. informations supplémentaires telles qu'un identifiant, une référence à
  412. l'élément source d'origine et une référence à l'élément cible. Nous étendons
  413. donc le métamodèle cible $MM_t$ afin que ces contraintes soient respectées et
  414. que le modèle intermédiaire résultant soit conforme à un métamodèle cible
  415. étendu, noté $MM_{t_{resolve}}$. Ainsi, tout élément \emph{resolve}
  416. $e_{t_{resolve}}^i$ du modèle intermédiaire enrichi $m_{t_{resolve}}$ sera de
  417. type un sous-type de l'élément ciblé $e_t^i$ du modèle cible $m_t$. Les
  418. éléments $e_{t_{resolve}}^i$ sont les éléments $e_t^i$ décorés d'une
  419. information sur le nom de l'élément cible représenté ainsi que d'une
  420. information sur l'élément source dont ils sont issus. En termes de métamodèle
  421. (Figure~\ref{fig:mmresolve}), pour tout élément cible $e_t^i$ ---~instance d'un
  422. élément $E_t^i$ du métamodèle cible $MM_t$~--- issu d'un élément source $e_s^j$
  423. ---~instance du métamodèle source $MM_s$~--- et nécessitant un élément
  424. \emph{resolve} $e_{t_{resolve}}^i$ durant la transformation, un élément
  425. $E_{t_{resolve}}^i$ est créé dans le métamodèle étendu $MM_{t_{resolve}}$. Cet
  426. élément hérite de l'élément cible $E_t^i$.\\
  427. \begin{figure}[h]
  428. \begin{center}
  429. \input{figures/mmresolve}
  430. \caption{Schéma d'extension du métamodèle cible par l'ajout d'éléments intermédiaires \emph{resolve}.}
  431. \label{fig:mmresolve}
  432. \end{center}
  433. \end{figure}
  434. Cette première phase produit donc un modèle cible non conforme au métamodèle
  435. cible $MM_t$ de la transformation globale, mais conforme au métamodèle cible
  436. étendu $MM_{t_{resolve}}$. Elle peut s'écrire sous la forme d'une fonction $c: MM_s
  437. \rightarrow MM_{t_{resolve}}$ qui crée des éléments cible à partir des éléments
  438. du modèle source.
  439. %\todo{[ici faut illustrer avec un cas concret tiré de l'exemple, comme pour
  440. %l'exemple TSI ; Figure~\ref{fig:approachSimpleRulesResolve}]}\\
  441. La Figure~\ref{fig:approachSimpleRulesResolve} permet d'illustrer le mécanisme
  442. des éléments \emph{resolve}. Nous reprenons la
  443. Figure~\ref{fig:approachSimpleRules} décrivant les trois \emph{définitions}
  444. composant notre transformation exemple, et nous intégrons les \emph{éléments
  445. resolve} (représentés par des formes en pointillés). Précédemment, nous avons
  446. vu que nous pouvions appliquer la \emph{définition} (a) complètement
  447. indépendamment étant donné qu'elle ne nécessite aucun résultat ou partie de
  448. résultat issu d'une autre \emph{définition}. Cette étape ne change donc pas et
  449. ne crée aucun \emph{élément résolve}. La \emph{définition} (b) nécessite en
  450. revanche un cercle rouge -- normalement créé dans la \emph{définition} (a) --
  451. pour pouvoir créer un arc. Un élément dont le type (\emph{cercle pointillé})
  452. est sous-type de l'élément cible (\emph{cercle}) est donc créé. Nous serons
  453. donc par la suite en mesure de manipuler le \emph{cercle pointillé} comme un
  454. \emph{cercle} classique et de filtrer sur tous les cercles, en pointillés ou
  455. non. La couleur donnée à un \emph{élément resolve} dans la
  456. Figure~\ref{fig:approachSimpleRulesResolve} permet de représenter l'information
  457. de la \emph{définition} d'origine de l'élément ciblé par l'\emph{élément
  458. resolve} et donc d'encoder le lien entre les deux éléments. Le même principe
  459. est appliqué à la \emph{définition} (c) qui nécessite un élément normalement
  460. créé dans la définition (b), d'où la génération d'un élément de type
  461. \emph{carré pointillé} vert.
  462. \begin{figure}[h]
  463. \centering
  464. \begin{tabular}{c|c|c}
  465. %\begin{subfigure}[A]{0.30\textwidth}
  466. \begin{subfigure}{0.30\textwidth}
  467. \centering
  468. \input{figures/approachRuleA}
  469. \subcaption{}
  470. \end{subfigure}
  471. &
  472. %\begin{subfigure}[seq]{0.30\textwidth}
  473. \begin{subfigure}{0.30\textwidth}
  474. \centering
  475. \input{figures/approachRuleSeqResolve}
  476. \subcaption{}
  477. \end{subfigure}
  478. &
  479. %\begin{subfigure}[B]{0.30\textwidth}
  480. \begin{subfigure}{0.30\textwidth}
  481. \centering
  482. \input{figures/approachRuleBResolve}
  483. \subcaption{}
  484. \end{subfigure}
  485. \end{tabular}
  486. \caption{Règles de transformation de \texttt{A}, \texttt{;} et \texttt{B}
  487. effectives avec la construction d'\emph{éléments resolve} (en pointillés
  488. colorés).}
  489. \label{fig:approachSimpleRulesResolve}
  490. \end{figure}
  491. %\begin{figure}[h]
  492. % \begin{center}
  493. % \input{figures/resolvePWD}
  494. % \end{center}
  495. % \caption{Illustration du mécanisme \emph{resolve} avec les réseaux de Petri images d'une \texttt{WorkDefinition} et d'un \texttt{Process}.}
  496. % \label{fig:resolveEx}
  497. %\end{figure}
  498. Durant cette première phase de transformation par parties, chaque
  499. \emph{définition} a produit un ensemble d'éléments tous disjoints, les éléments
  500. censés provenir d'autres \emph{définitions} ayant été représentés par des
  501. éléments \emph{resolve}. %plusieurs de fonction {n,a} -> {n,a}
  502. Nous encodons les \emph{définitions} par des stratégies de réécriture que nous
  503. composons avec d'autres stratégies. Il en résulte une stratégie plus complexe
  504. qui encode cette première phase de transformation. Dans notre exemple de
  505. transformation \emph{Text2Picture}, nous avons identifié trois
  506. \emph{définitions} ---~(a), (b) et (c)~--- qui seront encodées respectivement
  507. par les stratégies $S_a$, $S_b$ et $S_c$. Nous les combinons avec la séquence
  508. et une stratégie de parcours ---~\emph{TopDown} ici~--- pour former la
  509. stratégie $S_{phase1} = TopDown(Seq(S_a,S_b,S_c))$.
  510. \subsection{Résolution - réconciliation}
  511. %\todo{[on arrive à la phase \emph{resolve}]}
  512. \label{approach:subsec:reconciliation}
  513. L'application des transformations élémentaires sur le modèle source a produit
  514. un résultat intermédiaire non conforme au métamodèle cible $MM_t$, car composé
  515. de plusieurs résultats partiels incluant des \emph{éléments resolve}, comme
  516. illustré par la Figure~\ref{fig:approachIntermediateResult}.
  517. \begin{figure}[h]
  518. \begin{center}
  519. \input{figures/approachIntermediateResult}
  520. \caption{Résultat intermédiaire de la transformation, avant phase de \emph{résolution}.}
  521. \label{fig:approachIntermediateResult}
  522. \end{center}
  523. \end{figure}
  524. Pour obtenir un résultat cohérent conforme au métamodèle cible, il est
  525. nécessaire d'effectuer un traitement sur ce résultat intermédiaire. C'est ce
  526. que nous appelons la phase de \emph{résolution} ou \emph{réconciliation}, dont
  527. le but est de fusionner des éléments disjoints pour les rendre identiques. Elle
  528. consiste à parcourir le terme résultant, à trouver les éléments temporaires
  529. \emph{resolve}, puis à reconstruire un terme résultat en remplaçant ces termes
  530. temporaires par les termes qu'ils étaient censés remplacer. Étant donné que
  531. toutes les \emph{définitions} ont été appliquées, nous sommes certains que
  532. l'élément final existe, et qu'il peut se substituer à l'élément temporaire
  533. examiné.
  534. %\ttodo{mettre le schéma de la phase de résolution :
  535. %Figure~\ref{fig:approachResolutionPhase} ou
  536. %Figure~\ref{fig:approachResolutionPhase2} ?}
  537. %\begin{figure}[h]
  538. % \begin{center}
  539. % \input{figures/approachResolutionPhase}
  540. % \caption{Phase de \emph{résolution}.}
  541. % \label{fig:approachResolutionPhase}
  542. % \end{center}
  543. %\end{figure}
  544. \begin{figure}[h]
  545. \begin{center}
  546. \input{figures/approachResolutionPhase2}
  547. \caption{Phase de \emph{résolution}.}
  548. \label{fig:approachResolutionPhase2}
  549. \end{center}
  550. \end{figure}
  551. Cette phase de résolution est elle-même encodée par une stratégie $S_{phase2}$
  552. qui réécrit un terme-\emph{resolve} (c'est-à-dire la représentation d'un modèle
  553. contenant des éléments intermédiaires \emph{resolve} sous la forme d'un terme)
  554. en terme cible, conforme à la signature cible.
  555. Ce remplacement est possible grâce aux informations supplémentaires qui
  556. enrichissent le type cible ainsi qu'aux informations que nous sauvegardons
  557. durant la transformation. Ces informations additionnelles sont des informations
  558. sur les relations existant entre les éléments cibles et les éléments sources
  559. dont ils sont issus. Elles sont obtenues par le biais d'actions explicites de
  560. la part de l'utilisateur : tout terme créé dans une transformation peut être
  561. tracé sur demande. C'est ce qu'illustre la
  562. Figure~\ref{fig:approachSimpleRulesTrace} : les jetons colorés correspondent à
  563. une action explicite de trace d'un terme qui a été créé dans la
  564. \emph{définition}. Ainsi, dans cet exemple, l'utilisateur a marqué un élément
  565. dans la \emph{définition} (a) qui correspond à l'élément ciblé par
  566. l'\emph{élément resolve} de la définition (b). Il en est de même avec l'élément
  567. de type \emph{carré} des \emph{définitions} (b) et (c).
  568. \begin{figure}[h]
  569. \centering
  570. \begin{tabular}{c|c|c}
  571. %\begin{subfigure}[A]{0.30\textwidth}
  572. \begin{subfigure}{0.30\textwidth}
  573. \centering
  574. \input{figures/approachRuleATrace}
  575. \subcaption{}
  576. \end{subfigure}
  577. &
  578. %\begin{subfigure}[seq]{0.30\textwidth}
  579. \begin{subfigure}{0.30\textwidth}
  580. \centering
  581. \input{figures/approachRuleSeqResolveTrace}
  582. \subcaption{}
  583. \end{subfigure}
  584. &
  585. %\begin{subfigure}[B]{0.30\textwidth}
  586. \begin{subfigure}{0.30\textwidth}
  587. \centering
  588. \input{figures/approachRuleBResolve}
  589. \subcaption{}
  590. \end{subfigure}
  591. \end{tabular}
  592. \caption{Règles de transformation de \texttt{A}, \texttt{;} et \texttt{B}
  593. effectives, avec traçage des éléments correspondant à un \emph{élément resolve}
  594. d'une autre \emph{définition} (token coloré de la couleur du résultat d'une
  595. \emph{définition)}.}
  596. \label{fig:approachSimpleRulesTrace}
  597. \end{figure}
  598. Une autre approche possible eût été de tracer systématiquement tous les termes
  599. créés, mais nous avons fait ce choix dans le but d'améliorer la lisibilité de
  600. la trace. %\ttodo{revoir tout ça, ça va changer}
  601. Toutes ces informations
  602. supplémentaires constituent ce que nous appelons le modèle de lien. Il
  603. maintient tout au long de la transformation des relations entre les éléments
  604. sources et les éléments cibles qui en sont issus.
  605. Dans ce cas précis, le traçage des liens a eu un usage purement mécanique pour
  606. permettre la résolution de liens. Cependant, outre cet usage pour la phase de
  607. résolution, le construction dédiée au marquage de termes et le modèle de lien
  608. nous permettent d'assurer la traçabilité de la transformation à des fins de
  609. vérification \emph{a posteriori}. Nous traitons de ce sujet dans le
  610. chapitre~\ref{ch:traceability}.
  611. Ainsi, une transformation $T$ est la composée de deux fonctions $c : MM_s
  612. \rightarrow MM_{t_{resolve}}$ et $r : MM_{t_{resolve}} \rightarrow MM_t$. La
  613. transformation complète $T : MM_s \rightarrow MM_t$ est donc définie par $T = r
  614. \circ c$. L'encodage d'une telle fonction dans notre approche est une stratégie
  615. $S$ mettant en séquence les deux stratégies représentant chaque phase, qui
  616. peut se résumer par $S = Seq(S_{phase1}, S_{phase2})$.
  617. Outre les avantages évoqués en début de chapitre, un des intérêts de cette
  618. approche compositionnelle reposant sur les stratégies de réécriture apparait
  619. immédiatement : reposant sur les stratégies de réécriture, nous bénéficions
  620. naturellement de la modularité intrinsèque à ce concept que le langage de
  621. stratégies de {\tom} implémente. Il est ainsi possible de réutiliser les
  622. \emph{définitions} dans une autre transformation, sans adaptation lourde du
  623. code. On pourrait imaginer que la phase de résolution devienne bloquante dans
  624. ce cas, cependant, comme nous le verrons dans la description de
  625. l'implémentation de notre approche (chapitre~\ref{ch:outils}), cette phase est
  626. générée et peut aussi être générée sous la forme de plusieurs stratégies
  627. distinctes ---~plus simples~--- réutilisables dans le cadre d'une autre
  628. transformation.
  629. %\begin{figure}[h]
  630. % \begin{center}
  631. % \input{figures/mmresolveinst}
  632. % \caption{Instanciation du schéma d'extension du métamodèle cible pour
  633. % l'exemple Text2Picture.}
  634. % \label{fig:mmresolveinst}
  635. % \end{center}
  636. %\end{figure}
  637. %\section{\todo{ici ? }Travail connexe}
  638. %\todo{QVT, ATL, scheduling, réconciliation de références, }
  639. %
  640. %Cette approche
  641. %\section{\todo{FROM TSI}}
  642. %
  643. %\todo{Note : Reprendre \textbf{en gros} la section "approche" de TSI. MAIS,
  644. %séparer en deux parties, et dissoudre la formalisation dans l'explication.}
  645. %
  646. %
  647. %\subsection{Formalisation de l'approche \ttodo{à dissoudre}}
  648. %\label{sec:formalisation}
  649. %formalisation ?
  650. %Dans notre approche, une transformation $T$ est donc constituée de deux
  651. %phases distinctes qui peuvent être vues comme des fonctions. La première
  652. %phase $c: MM_s \rightarrow MM_{t_{resolve}}$ consiste à créer des
  653. %éléments cible à partir des éléments du modèle source. Des
  654. %éléments \emph{resolve} étant créés et intégrés au résultat
  655. %durant cette phase, le modèle résultant est conforme au métamodèle
  656. %cible étendu, noté $MM_{t_{resolve}}$.\\
  657. %Cette extension du métamodèle cible passe par un enrichissement du type
  658. %cible (ajout d'informations additionnelles). Ainsi, tout élément
  659. %\emph{resolve} $e_{t_{resolve}}^i$ du modèle intermédiaire enrichi
  660. %$m_{t_{resolve}}$ sera de type un sous-type de l'élément associé $e_t^i$
  661. %du modèle cible $m_t$. Les éléments $e_{t_{resolve}}^i$ sont les
  662. %éléments $e_t^i$ décorés d'une information sur le nom de l'élément
  663. %cible représenté ainsi que d'une information sur l'élément source dont
  664. %ils sont issus. En termes de métamodèle (Figure~\ref{fig:mmresolve}), pour
  665. %tout élément cible $e_t^i$ -- instance d'un élément $E_t^i$ du
  666. %métamodèle cible $MM_t$ -- issu d'un élément source $e_s^j$ -- instance
  667. %du métamodèle source $MM_s$ -- et nécessitant un élément
  668. %\emph{resolve} $e_{t_{resolve}}^i$ durant la transformation, un élément
  669. %$E_{t_{resolve}}^i$ est créé dans le métamodèle étendu
  670. %$MM_{t_{resolve}}$. Cet élément hérite de l'élément cible $E_t^i$.
  671. %
  672. %\begin{figure}[h]
  673. % \begin{center}
  674. % \input{figures/mmresolve}
  675. % \caption{Schéma d'extension du métamodèle cible par l'ajout d'éléments intermédiaires \emph{resolve}.}
  676. % \label{fig:mmresolve}
  677. % \end{center}
  678. %\end{figure}
  679. %
  680. %\noindent La seconde phase $r : MM_{t_{resolve}} \rightarrow MM_t$ consiste à
  681. %éliminer ces éléments intermédiaires.\\
  682. %La transformation complète $T : MM_s \rightarrow MM_t$ est
  683. %définie par $T = r \circ c$.
  684. %
  685. %\noindent En instanciant notre approche avec le cas d'étude SimplePDLToPetriNet, nous
  686. %obtenons : %$SimplePDLToPetriNet$ comme la composée de $Transformer$ et de
  687. %%$Resolve$, avec $MM_{SimplePDL}$, $MM_{PetriNet_{resolve}}$ et $MM_{PetriNet}$
  688. %%respectivement les métamodèles source, étendu et cible :
  689. %\begin{tabbing}
  690. % $SimplePDLToPetriNet$ \= $ : MM_{SimplePDL} \rightarrow MM_{PetriNet}$\\
  691. % $Transformer$ \> $ : MM_{SimplePDL} \rightarrow MM_{PetriNet_{resolve}}$\\
  692. % $Resolve$ \> $ : MM_{PetriNet_{resolve}} \rightarrow MM_{PetriNet}$\\
  693. % $SimplePDLToPetriNet $ \> $ = Resolve \circ Transformer$\\
  694. %\end{tabbing}
  695. %Appliquée au processus $p_{root}$ (illustré Figure~\ref{fig:simplepdlusecase})
  696. %conforme à $MM_{SimplePDL}$ (Figure~\ref{fig:simplepdlmmodel}), cette
  697. %transformation produira un réseau de Petri $pn$ (illustré
  698. %Figure~\ref{fig:petrinetusecase}) conforme à $MM_{PetriNet}$
  699. %(Figure~\ref{fig:petrinetmmodel}), en passant par le résultat intermédiaire
  700. %$pn_{resolve}$ conforme au métamodèle $MM_{PetriNet_{resolve}}$. On obtient
  701. %donc :
  702. %\begin{flushleft}
  703. % $SimplePDLToPetriNet(p_{root}) = Resolve(Transformer(p_{root}))$, avec\\
  704. % $Transformer(p_{root}) = pn_{resolve}$ et\\
  705. % $Resolve(p_{resolve}) = pn$
  706. %\end{flushleft}
  707. %La Figure~\ref{fig:mmresolveinst} instancie le schéma d'extension du
  708. %métamodèle cible au cas d'étude : le métamodèle cible est enrichi
  709. %d'une métaclasse \emph{ResolvePT} pour pouvoir créer des éléments
  710. %intermédiaires \emph{resolve} qui jouent temporairement le role d'une
  711. %\emph{Transition} obtenue à partir d'une source \emph{Process}.
  712. %\begin{figure}[h]
  713. % \begin{center}
  714. % \input{figures/mmresolveinst}
  715. % \caption{Instanciation du schéma d'extension du métamodèle cible pour le cas d'étude SimplePDLToPetriNetPetriNet.}
  716. % \label{fig:mmresolveinst}
  717. % \end{center}
  718. %\end{figure}
  719. \section{Validation par un cas d'étude}
  720. Pour valider la proposition, nous nous sommes appuyés sur une étude
  721. de cas : la transformation \emph{SimplePDLToPetriNet}. Nous ne rentrons pour le
  722. moment pas dans les détails et n'expliquons pas précisément les métamodèles des
  723. formalismes considérés. Nous préciserons la cas dans le
  724. chapitre~\ref{ch:traceability} qui suit, puis nous le développerons dans son
  725. intégralité dans le chapitre~\ref{ch:usecase} avec son implémentation. Pour
  726. résumer cette étude de cas, l'objectif est de transformer des processus
  727. génériques décrits dans le formalisme SimplePDL en leur représentation sous la
  728. forme de réseaux de Petri. Par exemple, la
  729. figure~\ref{fig:simplesimplepdlprocess} décrit un processus simple nommé
  730. \emph{root} composé de deux activités : \emph{A} et \emph{B}. Ces deux
  731. activités sont liées par une contrainte de précédence \emph{startToFinish}
  732. (\emph{s2f}). Cela signifie que l'activité \emph{A} doit avoir commencé pour
  733. pouvoir terminer l'activité \emph{B}.
  734. \begin{figure}[h]
  735. \begin{center}
  736. \input{figures/simplesimplepdlprocess}
  737. \caption{Exemple de processus SimplePDL.}
  738. \label{fig:simplesimplepdlprocess}
  739. \end{center}
  740. \end{figure}
  741. Ce processus générique peut s'exprimer sous la forme d'un réseau de Petri tel
  742. qu'illustré par la figure~\ref{fig:simplepetrinetprocess} suivante. Les places
  743. sont représentées par des cercles rouges, les transitions par des carrés bleus
  744. et les arcs par des flèches. %Les nœuds en pointillés sont des éléments
  745. %intermédiaires \emph{resolve}.
  746. Les flèches en pointillés sont des arcs de synchronisation, celles en trait
  747. plein noir sont des arcs normaux créés dans des différentes \emph{définitions},
  748. la flèche verte est un arc obtenu par la \emph{définition} transformant la
  749. séquence (qui impose la contrainte de précédence). Dans ce réseau de Petri,
  750. lorsque la première transition de $P_{root}$ est franchie, le jeton de la
  751. première place est ajouté à la seconde place de $P_{root}$. Un jeton est aussi
  752. ajouté aux premières places des réseaux $A$ et $B$, ce qui a pour effet de
  753. démarrer les tâches. La transition $t_{finish}$ de $B$ ne peut être franchie
  754. que si $A$ a démarré.
  755. \begin{figure}[h]
  756. \begin{center}
  757. \input{figures/simplepetrinetprocess}
  758. \caption{Réseau de Petri correspondant au processus décrit par la
  759. figure~\ref{fig:simplesimplepdlprocess}.}
  760. \label{fig:simplepetrinetprocess}
  761. \end{center}
  762. \end{figure}
  763. Cette transformation peut être décomposée en trois \emph{définitions}. Chacune
  764. d'entre elles produit un réseau de Petri. Nous les représentons toutes les
  765. trois dans la figure~\ref{fig:atomicpn} qui suit (les nœuds en pointillés sont
  766. des éléments intermédiaires \emph{resolve}).
  767. \begin{figure}
  768. \begin{center}
  769. \input{figures/atomicpn}
  770. \caption{Transformations élémentaires composant \texttt{SimplePDLToPetriNet}.}
  771. \label{fig:atomicpn}
  772. \end{center}
  773. \end{figure}
  774. Dans cette version du cas d'étude, le mécanisme de création d'éléments
  775. temporaires \emph{resolve} est utilisé dans le cadre de deux
  776. \emph{définitions}, celle qui transforme les \emph{WorkDefinitions} et celle
  777. qui transforme les \emph{WorkSequences}. Le mécanisme de marquage est quant à
  778. lui utilisé dans la \emph{définition} qui transforme les \emph{Process} afin
  779. d'effectuer la correspondance avec les éléments \emph{resolve} créés dans la
  780. transformation élémentaire qui prend en entrée une \emph{WorkDefinition}. Des
  781. éléments sont aussi tracés dans cette dernière pour assurer la résolution avec
  782. les éléments intermédiaires produits dans la \emph{définition} qui transforme
  783. les \emph{Worksequences}. Nous avons mis en œuvre ce mécanisme global de
  784. résolution que nous détaillons techniquement dans le chapitre~\ref{ch:outils}.
  785. Le mécanisme de marquage (ou traçage) est une forme de traçabilité, la
  786. traçabilité \emph{interne} (ou \emph{technique}) qui est étroitement liée à
  787. l'implémentation de la transformation.
  788. %\FloatBarrier
  789. \section{Synthèse} \label{ch:approach:synth}
  790. Dans ce chapitre, nous avons présenté notre approche pour transformer les
  791. modèles. Elle est hybride étant donné qu'il ne s'agit pas d'utiliser uniquement
  792. un langage généraliste ou un langage dédié, mais d'avoir une approche
  793. intermédiaire où nous intégrons des constructions dédiées au sein d'un langage
  794. généraliste. Ce procédé est rendu possible par l'utilisation du langage {\tom}
  795. présenté dans le chapitre~\ref{ch:tom} et qui repose sur le calcul de
  796. réécriture. Une telle approche a l'avantage de pouvoir faire bénéficier
  797. l'utilisateur du meilleur des deux mondes des langages généralistes et dédiés à
  798. la fois. Ainsi, l'utilisateur développant une transformation en {\tomjava} aura
  799. les constructions spécifiques aux transformations de modèles tout en conservant
  800. l'outillage existant de {\java}.
  801. Nous avons aussi expliqué que notre approche se base sur la réécriture de
  802. termes. Compte tenu du fait que nous transformons des modèles, notre approche
  803. commence par un changement d'espace technologique rendu possible grâce à un
  804. outil de génération d'ancrages formels que nous avons développé. Il nous permet
  805. de représenter des modèles {\ecore} sous la forme de termes, que nous pouvons
  806. ensuite parcourir et transformer avec des stratégies de réécriture. Ces
  807. stratégies de réécriture encodent les transformations élémentaires composant la
  808. transformation globale, elle-même encodée par une stratégie de réécriture. Dans
  809. un but d'accessibilité de l'approche et des outils pour les utilisateurs, nous
  810. avons choisi de proposer une méthode permettant à l'utilisateur de ne pas avoir
  811. à gérer l'ordonnancement des pas d'exécution. Notre solution à ce problème est
  812. l'introduction d'éléments intermédiaires dits \emph{resolve} qui jouent le rôle
  813. d'éléments cibles tant que ces derniers ne sont pas créés. Une transformation
  814. selon notre approche est donc composée de deux phases distinctes : la première
  815. où les éléments cibles et cibles intermédiaires sont créés, et la seconde qui
  816. consiste à \emph{résoudre} les liens, c'est-à-dire à supprimer les éléments
  817. intermédiaires et à remplacer les liens pointant vers eux par des liens vers
  818. les éléments cibles qu'ils représentaient.
  819. % vim:spell spelllang=fr