Procédé de création d'un graphe d'approximation des comportements de l'interface homme-machine d'une application.
Arrière-plan de l'invention
La présente invention se rapporte à un procédé de création d'un graphe d'approximation des comportements de l'interface homme- machine d'une application.
Elle se rapporte également à un ordinateur mettant en œuvre ce procédé.
De façon privilégiée, le procédé selon l'invention permet, à partir d'une application compilée J2ME/MIDP (application Java pour le téléphone mobile), d'extraire un graphe d'approximation des comportements de l'interface présentée par cette application, c'est-à-dire un automate dont les états sont une approximation des différents écrans que présentera l'application lors de son exécution et dont les transitions sont les événements qui font passer d'un écran à un autre. Ce graphe est une approximation finie du graphe idéal des comportements de l'application qui est infini. L'invention trouvera ainsi une utilisation privilégiée par les équipes de validation d'applications téléchargeables.
En effet, les développeurs de telles applications transmettent généralement les applications sous forme de code fermé sans la moindre spécification de leur fonctionnement.
Le procédé a pour but de fournir à ces évaluateurs un embryon de spécification extrait directement du code compilé. Elle permet en particulier de connaître l'ensemble des écrans disponibles et des transitions activables.
Ce graphe peut servir de base à d'autres outils qui renchériront par d'autres analyses. Le domaine technique de l'invention est celui de l'analyse automatique de programmes et plus particulièrement des interfaces homme-machine, ces programmes étant écrits dans des langages orientés objet à "bytecode" typé (un "bytecode" est un code compilé, voir ci- dessous). On rappelle qu'un langage typé est un langage permettant de vérifier, avant exécution, que l'ensemble des données manipulées respecte
des règles de bonne formation de telle sorte que ladite exécution ne pourra devenir incontrôlée.
L'invention s'appliquera à l'évaluation d'applications écrites dans le langage de programmation Java qui utilise les bibliothèques MIDP. L'invention s'applique également à d'autres bytecodes typés
(.net en particulier) et à d'autres environnements graphiques reposant sur la description de l'interface homme-machine par des objets graphiques et des gestionnaires d'événements (Java AWT par exemple).
L'invention s'applique principalement aux tests d'applications pour lesquelles on ne dispose pas du code exécutable.
Elle peut aussi s'appliquer aux tests d'applications pour lesquelles on dispose du code source mais pas d'une spécification.
On rappellera tout d'abord que le langage Java est un langage orienté objet. Un programme Java est constitué d'un ensemble de définition de "classes". Chaque classe peut être instanciée à l'exécution en des "objets" qui sont des structures dynamiques contenant des "champs" qui sont des variables locales propres à l'objet et des "méthodes" qui sont des procédures propres à la classe.
Un nouvel objet est créé par une instruction spéciale du langage qui prend en paramètre le nom de la classe qui sert de modèle.
La compilation d'un programme Java génère un pseudo-langage machine appelé "bytecode Java" exécutable efficacement par un environnement d'exécution appelé "machine virtuelle".
Comme le langage source, le bytecode Java est un langage typé.
La vérification du bytecode par la machine virtuelle avant son exécution est la base des mécanismes de sécurité. Ceci repose en effet sur des invariants de la forme : tel morceau de code ne pourra être exécuté que si tel autre morceau de contrôle l'a été auparavant. On rappelle également que le profil MIDP est un ensemble de bibliothèques spécialisées pour l'utilisation de la plate-forme J2ME sur les téléphones portables. Pour plus d'informations, l'homme du métier pourra se reporter à la spécification (Java Spécification Request) intitulée "Mobile information device profile (MIDP)", version 2.0, Java Community Process, novembre 2002.
MIDP fournit en particulier les interfaces avec le terminal : la gestion des connexions réseau, l'interface homme-machine et l'accès à un espace de données persistant. MIDP s'appuie sur la version J2ME/CLDC du langage Java, telle que définie dans la spécification (Java Spécification Request) intitulée" Connectée! limited device configuration (CLDC)", version 1.1, Java Community Process, 2002. Il s'agit d'une version allégée du langage, dans laquelle, en particulier :
- il n'est pas possible de charger de nouvelles bibliothèques dynamiquement : l'application est définie dans son intégralité par le code chargé, et
- il n'y a pas d'accès à des API de réflexivité (API permettant de manipuler directement le code de l'application et contenues dans le package java.lang.reflect) sur le code permettant de construire dynamiquement des appels de méthodes. De façon connue, le contenu d'un écran dans une application
MIDP est défini par le contenu d'un objet "écran" de la classe javax. microédition. Icdui.Screen en MIDP.
Ce contenu peut être spécialisé en enregistrant d'autres objets (par exemple des items dans un formulaire) à l'aide de méthodes particulières à cet objet. Parmi ces objets, on identifie :
- les "commandes" qui définissent des boutons logiciels affichés sur l'écran. L'utilisateur peut les sélectionner via les boutons réels du clavier. L'appui sur un bouton logiciel déclenche un événement,
- les "objets de gestion" ou "d'écoute d'événement" ("//stener"' en anglais) qui contiennent une méthode appelée à chaque événement. par "événement" on comprendra toute action de l'utilisateur ou de l'environnement qui déclenche une exécution de code dans l'application, par exemple la pression d'un bouton par l'utilisateur ou la fin d'une temporisation. Lorsque l'utilisateur sélectionne un des boutons logiciels affichés à l'écran, la méthode d'écoute de l'écran courant est appelée, avec pour paramètres l'objet décrivant l'écran courant et l'objet décrivant le bouton logiciel.
Cette méthode contient normalement à la fois le code du calcul de l'action à effectuer et un appel de méthode mettant en place l'écran suivant.
Pour l'analyse de code source, on connaît des méthodes dites de "reverse engineering" qui partent du code source d'une application pour reconstruire des éléments d'une spécification et permettre le "reengineering" du code. Un exemple est la suite d'outils de Lexient accessible sur
Internet à l'adresse http://www.lexientcorp.com/, 2004 qui permet d'extraire des informations de programme C, C++ et Java.
Selon cette méthode, l'unité manipulée est le morceau de code et il n'y a pas de notion d'instance ou de classe d'instance attachée. L'outil permet donc de visualiser où sont utilisés les différents morceaux de code mais pas de recréer une structure dynamique.
D'autres méthodes, par exemple celle décrite dans l'article de N. Mansurov et R. Probert intitulé "Dynamic scenario-based approach to reengineering of legacy télécommunication software' in R. Dssouli, G. V. Bochmann, et Y. Lahav, éditeurs, 9ème SDL Forum, Montréal, juin 1999, Elsevier Science Publishers B.V. (North-Holland), reposent sur le développement d'outils extrayant des automates représentant une spécification d'un système à partir d'un ensemble de traces d'exécutions.
De tels outils nécessitent des traces et donc d'exécuter des tests. Ils ne sont pas utilisables préalablement à une campagne de tests. L'invention permet de résoudre les problèmes précédents.
Objet et résumé de l'invention
A cet effet, elle vise, selon un premier aspect, un procédé de création d'un graphe d'approximation des comportements de l'interface homme-machine d'une application, l'application étant écrite dans un langage orienté objet à classes avec bytecode typé s'exécutant dans l'environnement d'exécution d'un terminal muni d'un dispositif d'affichage, l'application manipulant des objets-écran représentant le contenu à un instant donné du dispositif d'affichage, chaque objet-écran étant associé par une méthode d'association à un objet-gestionnaire-d'événement comportant une méthode de rappel définie pour la classe de l'objet- gestionnaire-d'événement et appelée directement par l'environnement d'exécution. Ce procédé comprend :
- une étape au cours de laquelle on définit au moins un représentant d'écrans à chaque instruction de l'application dans laquelle un objet-écran est instancié ;
- une étape au cours de laquelle on définit au moins un représentant de gestionnaires à chaque instruction de l'application dans laquelle un objet- gestionnaire-d'évènement est instancié ;
- une première phase au cours de laquelle on identifie, pour chaque représentant d'écrans, les représentants de gestionnaires qui ont été définis pour l'instanciation d'un objet-gestionnaire-d'évènement associé à un objet-écran pour l'instanciatîon duquel ce représentant d'écrans a été défini ;
- une deuxième phase au cours de laquelle on identifie, pour chaque groupe de représentants de gestionnaires qui ont été définis pour l'instanciation d'objets-gestionnaire-d'événement comportant une même méthode de rappel, les représentants d'écrans qui ont été définis pour les objets-écran qui sont mis en place lors de l'exécution de cette méthode de rappel, et
- une étape de création d'un graphe comprenant des nœuds illustrant chacun un représentant d'écrans, et des arcs reliant chacun un nœud dit "origine" à un nœud dit "destination" si et seulement si il existe un représentant de gestionnaires tel que :
- ce représentant de gestionnaires a été identifié au cours de la première phase pour le représentant d'écran illustré par le nœud "origine" ; et - le représentant d'écran illustré par le nœud "destination" a été identifié au cours de la deuxième phase pour ce représentant de gestionnaires.
En conséquence, le procédé de création de graphe selon l'invention permet d'obtenir, par une succession d'étapes totalement automatique, une approximation du graphe des comportements comportant toutes les transitions qui font passer d'un écran à un autre
(une telle approximation est dite "conservatrice").
Ce résultat est particulièrement avantageux car les méthodes manuelles connues à ce jour, et par lesquelles les développeurs opèrent par tâtonnement, en partant d'un point d'entrée et en remontant d'une manière ou d'une autre dans le code, ne permettent pas de garantir
l'exhaustivité du graphe, cette exhaustivité étant en pratique très difficile à obtenir pour une application complexe.
Dans un mode de réalisation particulier, le langage orienté objet à classes peut être le langage Java, l'environnement d'exécution l'environnement MIDP, et le terminal un téléphone portable.
L'invention peut également s'appliquer aux applications pour téléphones portables dans WINDOWS ME conforme au standard .NET proposé par la société MICROSOFT.
Le graphe d'approximation des comportements peut être défini de la façon suivante :
- les nœuds du graphe représentent des ensembles d'objets écrans codant des écrans pour être affichés lors de l'exécution de l'application et caractérisés par une propriété commune. Un objet écran ne peut être représenté que par un seul nœud ; - les arcs orientés du graphe reliant un nœud "origine" à un nœud "destination" illustrent la possibilité d'une transition d'un écran décrit par un objet-origine à un écran décrit par un objet-destination suite à la survenance d'un événement.
Dans l'art antérieur, les seules approximations du graphe des comportements connues sont construites "à la main" lors de tests d'exécution de l'application et en observant les actions qui ont été exécutées lors de chaque test.
L'invention permet donc avantageusement d'automatiser la création d'une approximation du graphe idéal, et ce sans avoir à exécuter l'application.
L'invention permet également de fournir un graphe des comportements illustrant le fonctionnement exhaustif d'une application, alors que dans les méthodes connues de l'état de la technique il existe toujours un risque que certaines fonctionnalités de l'application n'aient pas été testées.
Préférentiellement, pour mettre en œuvre la première phase, on détermine les instructions de l'application où il est fait appel à la méthode d'association, et on détermine pour chaque appel à cette méthode : - les représentants d'écrans qui ont été définis pour l'instanciation des objets-écran qui peuvent être passés en argument dans cet appel, et
- les représentants de gestionnaires qui ont été définis pour l'instanciation des objets-gestionnaire-d'événement qui peuvent être passés en argument dans cet appel.
Dans un mode préféré de réalisation de l'invention, au cours de la deuxième phase, on détermine au préalable pour chaque méthode de rappel :
- les instructions de l'application où est instancié un objet-gestionnaire- d'évènement comportant cette méthode de rappel ;
- les représentants de gestionnaires qui ont été définis pour l'instanciation de ces objets-gestionnaire-d'évènement ;
- les appels à la méthode de changement d'écran pouvant intervenir lors de l'exécution de cette méthode de rappel, et
- les représentants d'écrans qui ont été définis pour l'instanciation des objets-écran qui peuvent être passés en argument dans chacun de ces appels à la méthode de changement d'écran.
Préférentiellement, on détermine au préalable, pour chaque représentant de gestionnaires, les variables déclarées dans l'application pouvant contenir un objet-gestionnaire-d'évènement pour l'instanciation duquel ce représentant de gestionnaires a été défini. Cette opération est connue dans la littérature anglo-saxonne sous le nom de "points-to analysé, que l'on peut traduire par "analyse de pointage". Pour le langage Java, cette opération peut être mise en œuvre directement sur le bytecode. Le résultat de cette analyse peut être représenté par un "graphe d'analyse de pointage" reliant chacun des points du code où sont créés des objets aux points du code où ces objets sont utilisés. On notera que le graphe d'analyse de pointage et le graphe d'approximation des comportements de l'application correspondent à deux notions bien distinctes ; plus précisément, on extrait des informations du premier pour construire le second. De façon préférée et similaire, on détermine au préalable, pour chaque représentant d'écrans, les variables déclarées dans l'application pouvant contenir un objet-écran pour l'instanciation duquel ce représentant d'écrans a été défini.
Selon une implémentation préférée, les différentes étapes du procédé sont déterminées par des instructions de programmes d'ordinateurs.
En conséquence, l'invention vise aussi un programme d'ordinateur sur un support d'informations, ce programme comportant des instructions adaptées à la mise en œuvre du procédé de création de graphe mentionné ci-dessus. Ce programme peut utiliser n'importe quel langage de programmation, et être sous la forme de code source, code objet, ou de code intermédiaire entre code source et code objet, tel que dans une forme partiellement compilée, ou dans n'importe quelle autre forme souhaitable. L'invention vise aussi un support d'informations lisible par un ordinateur, et comportant des instructions d'un programme d'ordinateur tel que mentionné ci-dessus.
Le support d'informations peut être n'importe quelle entité ou dispositif capable de stocker le programme. Par exemple, le support peut comporter un moyen de stockage, tel qu'une ROM, par exemple un CD
ROM ou une ROM de circuit microélectronique, ou encore un moyen d'enregistrement magnétique, par exemple une disquette (floppy dise) ou un disque dur.
D'autre part, le support d'informations peut être un support transmissible tel qu'un signal électrique ou optique, qui peut être acheminé via un câble électrique ou optique, par radio ou par d'autres moyens. Le programme selon l'invention peut être en particulier téléchargé sur un réseau de type Internet.
Alternativement, le support d'informations peut être un circuit intégré dans lequel le programme est incorporé, le circuit étant adapté pour exécuter ou pour être utilisé dans l'exécution du procédé en question.
L'invention vise aussi un ordinateur comportant le support d'enregistrement mentionné brièvement ci-dessus.
Brève description des dessins
D'autres caractéristiques et avantages de la présente invention ressortiront de la description faite ci-dessous, en référence à l'annexe et aux dessins qui en illustrent un exemple de réalisation dépourvu de tout caractère limitatif, et dans lesquels :
- l'annexe 1 est un exemple de code source d'un programme d'ordinateur pour le codage du comportement de l'interface homme- machine d'une application ;
- les figures 1 à 3 représentent, sous forme d'organigrammes, les principales étapes d'un procédé de création de graphe conforme à l'invention dans un mode particulier de réalisation ;
- la figure 4 représente un ordinateur 10 conforme à l'invention ; et
- la figure 5 représente le graphe d'approximation des comportements correspondant au code source donné en exemple à l'annexe 1.
Description détaillée d'un mode de réalisation
Les figures 1 à 3 représentent sous forme d'organigrammes les principales étapes d'un procédé de création d'un graphe d'approximation des comportements conforme à l'invention dans un mode particulier de réalisation.
Dans l'exemple décrit ici, nous construirons le graphe d'approximation des comportements pour le code source donné à l'annexe 1.
De façon connue, une "suite" de "midlets" est constituée par un ensemble de classes compilées et stockées ensemble dans un fichier d'archivé.
Une "midlet" est un point d'entrée dans cet ensemble. Dans cet exemple, les références entre parenthèses, par exemple (II), identifient des points dans le code. Ils sont placés immédiatement après l'instruction qu'ils étiquettent (en général un appel de méthode ou une comparaison).
Dans un premier temps (instructions II, 12, 13), on déclare des variables screenl, screen2, screen3 qui sont des contenus d'écran de type formulaire (Form) et qui contiendront des informations à afficher.
On déclare ensuite (instructions 14, 15, 16) trois commandes qui représentent des boutons permettant de passer d'un écran à l'autre de l'affichage. Chaque commande est caractérisée par le texte qui s'affiche sur le bouton.
On déclare ensuite une variable "display" qui contient un pointeur sur l'objet représentant l'écran. C'est cet objet dont on modifie le contenu pour changer l'affichage.
La méthode Test2 est le constructeur de la classe Test2. Elle est appelée au lancement de la midlet pour créer une instance.
On met à jour la variable "display" et on ajoute à chacun des écrans leur message en enrobant celui-ci dans un objet héritant de la classe Item spécialisée pour l'affichage des chaînes de caractères (Stringltem). On enregistre ensuite les différents boutons dans des écrans.
Ainsi, l'homme du métier reconnaîtra aux instructions 17, 18 et 19 que le bouton "ok" est disponible dans les trois écrans screenl, screen2, screen3.
On crée ensuite, aux instructions 113 et 114, des objets gestionnaires d'événement (CmdListenerl et CmdListener2), et on associe un de ces objets gestionnaires d'événement à chacun des formulaires.
A chaque fois que l'utilisateur pressera un bouton, l'objet gestionnaire d'événement associé au formulaire concerné sera appelé.
Les objets écran sont associés aux objets gestionnaires d'événement aux instructions 115 à 117, par une méthode d'association setCommandListener.
Les trois fonctions suivantes startApp, pauseApp et destroyApp définissent les actions réalisées lors des transitions entre les différents états du cycle de vie d'une midlet, la midlet étant contrôlée par un gestionnaire à l'intérieur du terminal (par exemple un téléphone).
La fonction startApp met en place le premier formulaire visible, à savoir l'écran screenl (instruction 118).
On déclare ensuite les classes définissant les gestionnaires d'événement. Ces classes implémentent l'interface CommandListener, ce qui signifie qu'elles contiennent une méthode commandAction respectant le type donné ci-dessous, c'est-à-dire prenant en argument une commande et un contenu d'écran (par exemple un formulaire) et ne retournant aucune information. Ces méthodes sont appelées lorsqu'une touche est pressée. Le premier argument est alors le nom du bouton virtuel activé et le deuxième argument le contenu d'écran qui était à l'affichage.
Le comportement choisi est sélectionné en utilisant ces deux informations.
Ainsi, si le bouton est "exit", on arrête la midlet par une procédure d'arrêt standard (instructions 119 et 126). Si le bouton est "help" (instructions 120 et 127), on affiche l'aide
(instructions 121 et 128).
Enfin si le bouton est "ok" :
- dans le premier objet-gestionnaire (instruction 122), on affiche l'écran screenl (instruction 124) ou l'écran screen2 (instruction 125) en fonction de l'écran dont on vient (instruction 123) ;
- dans le second objet-gestionnaire (instruction 129), on affiche systématiquement l'écran screenl.
La figure 4 représente un ordinateur (ou évaluateur) conforme à l'invention. Il comporte un support d'enregistrement (une mémoire) sur lequel est enregistré un programme d'ordinateur comprenant des instructions pour mettre en œuvre le procédé de graphe selon l'invention, dont les principales étapes sont données aux figures 1 à 3 dans ce mode préféré de réalisation.
L'évaluateur 10 ne reçoit pas le code source de l'annexe 1, mais une version compilée constituée de deux fichiers :
- un fichier texte (test2.jad) décrivant la midlet, ce fichier étant aussi appelé fichier JAD (pour Java Descriptor) ; et
- un fichier contenant le code compilé de midlet. Il s'agit d'une archive Java contenant le code de chacune des classes. Dans l'exemple décrit ici, son nom est test2.jar.
On va maintenant décrire les principales étapes du procédé de création selon l'invention pour construire le graphe d'approximation des comportements de l'interface homme-machine de l'application dont le code source est donné à l'annexe 1. Cette application est écrite dans un langage orienté objet à classe qui s'exécute dans l'environnement d'exécution d'un terminal muni d'un dispositif d'affichage, par exemple un téléphone mobile.
Comme décrit précédemment, cette application manipule trois objets écran screenl, screen2, screen3 représentant le contenu à un instant donné de ce dispositif d'affichage.
Chaque objet écran est associé par la méthode d'association setCommandListener à un objet gestionnaire d'événement CmdListenerl ou CmdListener2.
Ces objets gestionnaires d'événement CmdListenerl, CmdListener2 comportent une méthode de rappel
CmdListenerl. commandAction et CmdListener2.commandAction, ces méthodes étant définies pour la classe de l'objet gestionnaire d'événement.
Ces méthodes de rappel sont appelées directement par l'environnement d'exécution, à savoir MIDP dans l'exemple de réalisation décrit ici.
Au cours d'une première étape ElO, on définit un représentant d'écran à chaque instruction de l'application dans laquelle un objet écran est instancié. Ainsi, on définit trois représentants d'écran, respectivement II,
12, 13, correspondant aux instructions de l'application dans lesquelles les objets écran screenl, screen2, screen3 sont respectivement instanciés.
Cette étape ElO est suivie par une étape E20 au cours de laquelle on définit un représentant de gestionnaire à chaque instruction de l'application dans laquelle un objet gestionnaire d'événement est instancié.
Dans l'exemple décrit ici, ces représentants de gestionnaire sont respectivement 113 et 114 correspondant aux instructions 113 et 114 d'instanciation des objets gestionnaires d'événement CmdListenerl et CmdListener2. Cette étape E20 est suivie par une étape E21 au cours de laquelle on détermine, par une analyse de pointage, toutes les instructions de l'application où il est fait appel à la méthode d'association.
Dans l'exemple décrit ici, ces instructions sont les instructions 115, 116 et 117 faisant appel à la méthode d'association setCommandListener.
Cette étape E21 est suivie par une boucle constituée par les étapes E22 à E28, la boucle étant mise en œuvre pour chaque instruction 115, 116 et 117 identifiée à l'étape précédente E21.
Plus précisément, cette boucle comporte une première étape E23 au cours de laquelle on détermine, pour chaque représentant d'écran
II, 12, 13, toutes les variables déclarées dans l'application pouvant
contenir un objet écran screenl, screen2, screen3 pour l'instanciation duquel son représentant d'écran a été défini.
L'homme du métier comprendra que ces variables qui sont implicites dans le code source de l'annexe 1 sont en effet avantageusement explicitées dans le bytecode précompilé.
Cette étape E23 est suivie par une étape E24 au cours de laquelle on recherche les objets écran contenus dans ces variables.
Dans l'exemple décrit ici, les arguments objet écran sont respectivement screenl, screen2 et screen3 pour les instructions 115, 116 et 117 d'appel à la méthode d'association setCommandListener.
Cette étape E24 est suivie par une étape E25 au cours de laquelle on identifie les représentants d'écran définis pour l'instanciation des objets d'écran identifiés à l'étape précédente E24.
Ces représentants d'écran sont respectivement II, 12 et 13 pour les arguments objet écran screenl, screen2 et screen3.
Cette étape E25 est suivie par une étape E26 au cours de laquelle on identifie les variables déclarées dans l'application qui peuvent contenir un objet gestionnaire d'événement, ces variables étant explicites dans le bytecode. Cette étape E26 est suivie par une étape E27 au cours de laquelle on identifie les objets gestionnaires d'événement contenus dans ces variables.
Dans l'exemple décrit ici, ces objets gestionnaires d'événement sont respectivement CmdListenerl, CmdListener2 et CmdListenerl pour les instructions 115, 116 et 117.
L'étape E27 est suivie par une étape E28 au cours de laquelle on identifie les représentants de gestionnaires qui ont été définis par l'instanciation des objets gestionnaires d'événement identifiés à l'étape précédente E27. Ces représentants de gestionnaires sont respectivement 113 et
114 pour les arguments objets gestionnaires CmdListenerl et CmdListener2.
La boucle constituée par les étapes E22 à E28 s'arrête après le traitement des trois instructions d'appel à la méthode d'association. Cette boucle permet de mettre en œuvre une première phase
E30 qui va maintenant être décrite en référence à la figure 2.
Cette première phase E30 est constituée par une boucle d'étapes E301 à E304.
Cette boucle est mise en œuvre pour chaque appel à la méthode d'association setCommandListener 115, 116, 117. Elle comporte une première étape E302 au cours de laquelle on identifie les représentants d'écran associés à cet appel.
Dans l'exemple décrit ici, pour les appels 115, 116 et 117 respectivement, les représentants d'écran identifiés à l'étape E302 sont respectivement II, 12 et 13. L'étape E302 est suivie par une étape E303 au cours de laquelle on identifie les représentants de gestionnaire d'événement associé à cet appel, à savoir dans cet exemple 113 pour 115 et 117 et 114 pour 116.
L'étape E303 est suivie par une étape E304 au cours de laquelle on associe chacun des représentants d'écran identifié à l'étape E302 à chacun des représentant de gestionnaire identifié à l'étape E303.
Dans cet exemple, on associe :
• II et 113 dans l'itération correspondant à 115 ;
• 12 et 114 dans l'itération correspondant à 116 ; et
• 13 et 113 dans l'itération correspondant à 117. Le "Tableaul" ci-dessous résume le résultat de la première phase E30.
Tableaul
La première phase E30 est suivie par une deuxième phase E40 qui va maintenant être décrite en référence à la figure 3.
Dans le mode préféré de réalisation décrit ici, cette deuxième phase E40 est constituée par une boucle E31 à E39 mise en œuvre pour chaque méthode de rappel CmdListenerl.commandAction et CmdListener2.commandAction.
Cette boucle comporte une première étape E32 au cours de laquelle on identifie tous les objets gestionnaires d'événement comportant cette méthode de rappel. Ainsi, dans l'exemple décrit ici, pour les
méthodes de rappel CmdListenerl.commandAction et CmdListener2.commandAction, ces objets gestionnaires d'événement sont respectivement CmdListenerl et Cmdl_istener2.
L'étape E32 est suivie par une étape E33 au cours de laquelle on identifie les instructions où sont instanciés ces objets du gestionnaire d'événement.
Dans l'exemple décrit ici, ces instructions sont respectivement 113 et 114 pour les objets gestionnaires d'événement CmdListenerl et CmdListener2. Cette étape E33 est suivie par une étape E34 au cours de laquelle on identifie les représentants de gestionnaire définis pour l'instanciation de ces gestionnaires d'événement.
Dans cet exemple, les représentants sont respectivement les instructions 113 et 114. L'étape E34 est suivie par une étape E36 au cours de laquelle on identifie les instructions d'appel à la méthode de changement d'écran (setCurrent) qui peuvent intervenir lors de l'exécution de ces méthodes de rappel.
Dans l'exemple décrit ici, les instructions setCurrent pouvant intervenir lors de l'exécution de la méthode CmdListenerl.commandAction (respectivement CmdListener2.commandAction) sont les instructions 118, 121, 124 et 125 (respectivement 128 et 129).
Cette étape E36 est suivie par une étape E38 au cours de laquelle on détermine les objets écran qui peuvent être passés en argument dans chacun de ces appels à la méthode de changement d'écran setCurrent.
Dans cet exemple :
- pour l'appel de l'instruction 118, cet objet est screenl ;
- pour l'appel de la ligne 121 cet objet est screen3 ; - pour l'appel de la ligne 124, cet objet est screenl ;
- pour l'appel de la ligne 125, cet objet est screen2 ;
- pour l'appel de la ligne 128, cet objet est screen3 ;
- pour l'appel de la ligne 129, cet objet est screenl.
L'étape E38 est suivie par une étape E39 au cours de laquelle on identifie les représentants d'écran définis pour l'instanciation de cet objet d'écran.
Comme précisé plusieurs fois ci-dessus, les représentants des écrans screenl, screen2 et screen3 sont respectivement les instructions II, 12 et 13.
Cette boucle E31 à E39 se termine lorsque chaque méthode de rappel a été traitée.
Le "Tableau2" résume le résultat de cette deuxième phase E40.
Tableau2
La deuxième phase E40 est suivie par une étape E50 au cours de laquelle on crée le graphe d'approximation des comportements de l'interface homme-machine de l'application.
Le graphe se déduit directement à partir des "Tableaul" et "Tableau2". Ce graphe est représenté à la figure 5.
Il comporte un certain nombre de nœuds Nl, N2, N3 illustrant chacun un représentant d'écran II, 12, 13.
Ce graphe comporte également des arcs reliant chacun un nœud dit "origine" à un nœud dit "destination" si et seulement si il existe un représentant de gestionnaire 113, 114, tel que :
- le représentant de gestionnaire a été identifié au cours de la première phase E30 pour le représentant d'écran illustré par le nœud origine, et
- le représentant d'écran illustré par le nœud destination a été identifié au cours de la deuxième phase E40 pour le représentant de gestionnaire.
Ce graphe comporte par exemple un arc α ayant pour origine le nœud Nl illustrant le représentant d'écran II et pour destination le nœud N3 illustrant le représentant d'écran 13, car il existe un représentant gestionnaire 113 identifié au cours de la première phase E30 pour le représentant d'écran II (2eme colonne du "Tableaul") ; et le représentant d'écran 13 illustré par le nœud destination N3 a été identifié au cours de la deuxième phase E40 pour le représentant de gestionnaire 113 (4eme ligne du "Tableau2").
ANNEXE 1
import javax.microedition.midlet.*; import javax.microedition.lcdui.*;
public class Test2 extends MIDIet { static Form screenl = new Form("Ecran 1"),(I1) screen2 = new Form("Ecran 2"),(I2) screen3 = new Form("Aide");(I3) static Command exitCmd = new Command("Exit", Command.EXIT, 2);(I4) static Command okCmd = new Command("OK", Command.OK, 1);(I5) static Command helpCmd = new Command("Help", Command.OK, 1);(I6)
private String infolMsg = "Pressez OK pour passer a l'écran 2 ou Help"; private String info2Msg =" Choix : boucler, lire l'aide et sortir"; private String info3Msg = "L'aide. Pressez sur OK";
Display display;
public Test2() { display = Display.getDisplay(this); screenl. append(new StringItem("",infolMsg)); screen2.append(new StringItem("",info2Msg)); screen3.append(new StringItem("",info3Msg));
screenl. addCommand(okCmd);(I7) screen2.addCommand(okCmd);(I8) screen3.addCommand(okCmd);(I9)
screenl. addCommand(helpCmd);(I10) screen2.addCommand(helpCmd);(Ill)
screen2.addCommand(exitCmd);(I12)
CommandListener cmdListenerl = new CmdListenerl();(I13) CommandListener cmdListener2 = new CmdListener2();(I14)
screenl.setCommandListener(cmdListenerl);(I15) screen2.setCommandListener(cmdListener2);(I16) screen3.setCommandListener(cmdListenerl);(I17)
public void startApp() { display.setCurrent(screenl);(I18) }
public void pauseApp() {}
public void destroyApp(boolean unconditional) {}
class CmdListenerl implements CommandListener { public void commandAction(Command crnd, Displayable d) { if (cmd == exitCmd)(I19) { destroyApp(true); notifyDestroyed(); } else if (cmd == helpCmd)(I20) display.setCurrent(screen3);(I21) else if ((cmd= =okCmd)(I22) && (d==screen3)(I23)) display.setCurrent(screeniχi24); else display.setCurrent(screen2);(I25) } } class CmdListener2 implements CommandListener { public void commandAction(Command cmd, Displayable d) { if (cmd == exitCmd)(I26) { destroyApp(true); notifyDestroyed(); } else if (cmd == helpCmd)(I27) display.setCurrent(screen3)(I28); else display.setCurrent(screenl)(I29); } } }