\appendix %code, métamodèles et modèles bruts \Annex{Étude de cas : Transformation SimplePDLToPetriNet} \section{Code de la transformation \emph{SimplePDLToPetriNet}} \label{annexe:pdl2pn} Ce code est accessible sur le dépôt officiel du projet {\tom} : \url{https://gforge.inria.fr/scm/?group\_id=78}. Pour plus d'informations sur le sujet, le lecteur pourra aussi se référer à la documentation en ligne accessible sur cette page : \url{http://tom.loria.fr/wiki/index.php5/Documentation:Playing\_with\_EMF}. \lstinputlisting[basicstyle={\ttfamily\scriptsize},name=simplepdltopetrinet,numberstyle=\tiny,numbers=left,numberblanklines=true,frame=tb,firstnumber=1,firstline=1,lastline=295]{code/simplepdltopetrinet/SimplePDLToPetriNet.t} %,caption=TODO,label=code:simplepdl2pni,captionpos=b \section{Modèle source} \label{annexe:pdl2pn:msrc} %\begin{codesource} % \input{code/simplepdltopetrinet/models/DefaultSimplePDLInstance.xmi} %\end{codesource} Cette transformation a été testée avec de nombreux modèles. Le modèle donné par le listing~\ref{inputsimplepdl2pn} est le modèle donné en exemple dans la section~\ref{sec:simplepdl2pn} du chapitre~\ref{ch:usecase}. Il s'agit aussi du modèle par défaut de la transformation dans le cas où aucun modèle n'est passé en paramètre (c'est en fait le modèle équivalent directement construit en {\tom} sans chargement de fichier). \lstinputlisting[basicstyle={\ttfamily\scriptsize},name=inputmodelsimplepdl2pn,frame=tb,firstnumber=1,firstline=1,captionpos=b,caption=Modèle source de l'exemple pour la transformation SimplePDLToPetriNet (format \texttt{.xmi}),label=inputsimplepdl2pn]{code/simplepdltopetrinet/models/DefaultSimplePDLInstance.xmi} % \section{Modèle résultant} \label{annexe:pdl2pn:mtgt} %\input{} Le modèle source donné précédemment produit le modèle cible suivant~\ref{outputsimplepdl2pn}, qui est en fait le réseau de Petri résultant de la transformation, sérialisé sous la forme d'un fichier au format compatible avec l'entrée du \emph{model-checker} {\tina}~\cite{Berthomieu2004} (il est aussi affiché directement sur la sortie standard) : %la sortie suivante %~\ref{outputsimplepdl2pn}, qui est en fait le réseau de Petri résultant %de la transformation, affiché dans un format compatible avec l'entrée du %\emph{model-checker} {\tina} (il est aussi sérialisé sous la forme d'un fichier %\texttt{.net}) : \lstinputlisting[basicstyle={\ttfamily\scriptsize},name=outputsimplepdl2pn,frame=tb,firstnumber=1,firstline=1,captionpos=b,caption=Modèle cible résultant de la transformation SimplePDLToPetriNet (format lisible par {\tina}),label=outputsimplepdl2pn]{code/simplepdltopetrinet/resultingPetri.net} % %\lstinputlisting[basicstyle={\ttfamily\scriptsize},name=outputsimplepdl2pn,frame=tb,firstnumber=1,firstline=47,lastline=64,captionpos=b,caption=Sortie de la transformation SimplePDLToPetriNet au format {\tina},label=outputsimplepdl2pn]{code/simplepdltopetrinet/expected_result} %\pagebreak %Sérialisé en \texttt{.xmi}, le modèle cible obtenu est celui donné par le %listing~\ref{outputmodelsimplepdl2pn} : % %\lstinputlisting[basicstyle={\ttfamily\scriptsize},name=outputmodelsimplepdl2pn,frame=tb,firstnumber=1,firstline=1,label=outputmodelsimplepdl2pn]{code/simplepdltopetrinet/resultingPetrinet.xmi} %%\lstinputlisting[basicstyle={\ttfamily\scriptsize},name=outputmodelsimplepdl2pn,frame=tb,firstnumber=1,firstline=1,captionpos=b,caption=Modèle cible résultant de la transformation SimplePDLToPetriNet\, sérialisé au format \texttt{.xmi},label=outputmodelsimplepdl2pn]{code/simplepdltopetrinet/resultingPetrinet.xmi} \section{Vérification du résultat} \label{annexe:pdl2pn:mc} La boîte à outils {\tina}\footnote{\url{http://projects.laas.fr/tina}} (version 3.1.0) a été utilisée pour vérifier le modèle résultant de la transformation de modèle \emph{SimplePDLToPetriNet}. \subsubsection{Procédure} Le résultat de la transformation est un réseau de Petri dans un format lisible par {\tina} (fichier \texttt{result.net}. La procédure ci-après permet de reproduire l'expérience : \begin{enumerate} \item Visualisation du réseau de Petri :\\ \verb+~/tina-3.1.0/bin/nd result.net+ (sauvegarde au format \texttt{.ndr}) \item Construction du graphe d'atteignabilité :\\ \verb+~/tina-3.1.0/bin/tina -C result.ndr result.ktz+ (le format \texttt{.ktz} est un format binaire propriétaire) \item Vérification de propriétés :\\ \verb+~/tina-3.1.0/bin/selt result.ktz prop.ltl >> result.selt+ (le fichier \texttt{prop.ltl} décrit ci-après contient les formules et les propriétés à vérifier) \end{enumerate} \subsubsection{Formule et propriétés} \lstinputlisting[basicstyle={\ttfamily\scriptsize},name=properties,numberstyle=\tiny,numbers=left,numberblanklines=true,frame=tb,firstnumber=1,firstline=1,captionpos=b,caption=Formule et propriétés LTL à vérifier sur le modèle résulatnt de la transformation SimplePDLToPetriNet,label=properties]{code/simplepdltopetrinet/tina/tocheck.ltl} Le listing~\ref{properties} contient une formule et quatre propriétés exprimées en LTL afin de pouvoir être utilisées avec {\tina}. Nous les décrivons ci-après, dans l'ordre : \begin{itemize} %\item \verb+op finished = T /\ A_finished /\ B_finished /\ C_finished /\ D_finished;+ \item[\textbf{ligne 1 :}] Il s'agit de la formule définissant l'opérateur \emph{finished} comme $\top \wedge A_{finished} \wedge B_{finished} \wedge C_{finished} \wedge D_{finished}$. Cela signifie que l'on considère le processus complet terminé lorsque toutes les activités le composant sont terminées (lorsqu'il y a un jeton dans chaque place $finished$ des activités $A$, $B$, $C$ et $D$). %\item \verb+[] (finished => dead);+ \item[\textbf{ligne 3 :} $\square (finished \Rightarrow dead)$.] Cette première propriété signifie que tout processus dans son état final est terminé. %\todo{FALSE} %\item \verb+[] (dead => finished);+ \item[\textbf{ligne 4 :} $\square (dead \Rightarrow finished)$.] Cette deuxième propriété peut être traduite par \og tout processus terminé est dans son état final\fg{} (correction partielle). %\todo{TRUE} %\item \verb+[] <> dead ;+ \item[\textbf{ligne 5 :} $\square \lozenge dead$.] Cette troisième propriété est la propriété de terminaison qui assure que \og toute exécution se termine \fg{}. %\todo{TRUE} %\item \verb+- <> finished;+ \item[\textbf{ligne 6 :} $\neg \lozenge finished$.] Cette quatrième propriété peut être traduite par \og l'état final n'est jamais atteint \fg{} et revient à vérifier la propriété de consistance faible (existence d'au moins une exécution du processus).%\todo{FALSE} \end{itemize} Note : \texttt{dead} est une propriété prédéfinie vraie uniquement sur les états de blocage. %Rappel % P : P vraie au départ du chemin (pour l'état initial) %square P : P vraie tout au long du chemin %diamond P : P vraie une fois au moins le long du chemin % square diamond P : P vraie infiniment souvent % %dead : deadlock property %finished : défini par l'utilisateur %aide : %http://homepages.laas.fr/francois/POLYS/ENSEIGNEMENT/MC2/ltl.php \pagebreak \subsubsection{Résultat fourni par {\textsf{selt}\xspace}} Nous avons vérifié les propriétés données précédemment sur le réseau de Petri généré en utilisant \texttt{selt} (partie de {\tina}). Le résultat est le suivant : \lstinputlisting[basicstyle={\ttfamily\scriptsize},name=mcresult,numberstyle=\tiny,numbers=left,numberblanklines=true,frame=tb,firstnumber=1,firstline=1,captionpos=b,caption=Résultat fourni par \texttt{selt} pour les propriétés et le réseau de Petri fourni dans notre exemple,label=mcresult]{code/simplepdltopetrinet/tina/tocheck.selt} Ainsi, les propriétés 2 et 3 sont vérifiées. En revanche, les propriétés 1 et 4 sont fausses, \texttt{selt} exhibe donc un contre-exemple pour chacune. Dans le cas de la quatrième propriété, une évaluation à \emph{False} permet d'affirmer que le processus est faiblement consistant (le contre-exemple donne une exécution correcte du processus). \Annex{Étude de cas : aplatissement d'une hiérarchie de classes} \section{Code de la transformation} \label{annexe:flattening} \subsection{Version 1 : transformation en {\java}+{\emf}} \label{annexe:flattening:v1} %\input{code/flattening/V0_notom_UMLClassesFlattening.java} \lstinputlisting[basicstyle={\ttfamily\scriptsize},name=v1flattening,numberstyle=\tiny,numbers=left,numberblanklines=true,frame=tb,firstnumber=1,firstline=1]{code/flattening/V1_notom_UMLClassesFlattening.java} %\lstinputlisting[basicstyle={\ttfamily\scriptsize},name=simplepdltopetrinet,numberstyle=\tiny,numbers=left,numberblanklines=true,frame=tb,firstnumber=1,firstline=1,lastline=295,label=code:v0flattening,caption=Implémentation de la transformation d'aplatissement de hiérarchie de classes en Java]{code/flattening/V0.java} \subsection{Version 2 : transformation en {\tomjava} simple (+{\emf})} \label{annexe:flattening:v2} %\input{code/flattening/V2_nostrat_UMLClassesFlattening.t} Cette version est légèrement plus longue que la version précédente étant donné que nous avons intégré la création d'un modèle par défaut dans le cas où aucun modèle source n'est donné en argument du programme. \lstinputlisting[basicstyle={\ttfamily\scriptsize},name=v2flattening,numberstyle=\tiny,numbers=left,numberblanklines=true,frame=tb,firstnumber=1,firstline=1]{code/flattening/V2_nostrat_UMLClassesFlattening.t} \subsection{Version 3 : transformation en {\tomjava} avec stratégies (+{\emf})} \label{annexe:flattening:v3} Comme pour la version précédente, nous avons intégré la création d'un modèle par défaut dans le cas où aucun modèle source n'est donné en paramètre, d'où sa taille de code légèrement supérieure à la première version. %\input{code/flattening/V3_stratnotransfo_UMLClassesFlattening.t} \lstinputlisting[basicstyle={\ttfamily\scriptsize},name=v3flattening,numberstyle=\tiny,numbers=left,numberblanklines=true,frame=tb,firstnumber=1,firstline=1]{code/flattening/V3_stratnotransfo_UMLClassesFlattening.t} \subsection{Version 4 : transformation en {\tomjava} avec les nouvelles constructions (+{\emf})} \label{annexe:flattening:v4} %\input{code/flattening/V4_transfo_UMLClassesFlattening.t} \lstinputlisting[basicstyle={\ttfamily\scriptsize},name=v3flattening,numberstyle=\tiny,numbers=left,numberblanklines=true,frame=tb,firstnumber=1,firstline=1]{code/flattening/V4_transfo_UMLClassesFlattening.t} \Annex{Implémentation ATL de SimplePDLToPetriNet} \label{annexe:atlpdl2pn} \lstinputlisting[basicstyle={\ttfamily\scriptsize},name=atlpdl2pn,numberstyle=\tiny,numbers=left,numberblanklines=true,frame=tb,firstnumber=1,firstline=1]{code/simplepdltopetrinet.atl}