Un Browser de hiérarchies de classes Java en Java I) Ressources nécessaires (langages, matériels, compétences) : - Java - API Swing - Java2d - Introspection II )Soit un développement Java découpé en un ensemble de paquetages, l’outil considéré doit : 1) Permettre de choisir un répertoire où sont localisés les fichiers compilés java les .class 2) Interroger les différentes classes par les possibilités d’introspection du langage et construire une hiérarchie représentant le graphe d’héritage entre classes et interfaces (un lien implements est un lien extends) 3) Afficher la hiérarchie reconstituée dans un browser. Pour un affichage joli, Il y a deux choses à prendre en compte : o Le rang du sommet (sa distance par rapport à la racine) o Minimiser le nombre d’arcs qui se coupent. o Un algorithme vous sera fourni pour ceci. 4) Ce browser doit permettre d’afficher les différents constituants d’une classe lorsque l’utilisateur clique sur l’une d’entre elles. 5) Ce browser doit permettre de déplacer ou d’inverser les classes d’un même rang afin d’optimiser manuellement le rendu graphique de la hiérarchie Recherche : Nous allons, dans ce chapitre, nous intéresser à la mise en oeuvre d'interfaces graphiques en Java. Comme nous allons le voir, il vous est possible de créer toutes sortes d'interfaces, et d'y inclure tous types de composants : des boutons, des case à cocher, des zones de saisie de texte, ... Mais vous pourrez aussi y inclure des composants plus complexes : des menus, des arbres déroulant, des boîtes de dialogue pour choisir des fichiers, des couleurs, ... Nous allons, tout au long des chapitres suivants, présenter les principales possibilités qui vous sont offertes. L'API Swing : SWING fut donc mis en place pour assurer 100% de portabilité (même un pixel doit avoir la même couleur). Le pari est gagné, mais à un coup non forcément négligeable : pour assurer cette portabilité, un bouton (au tout autre composant graphique) est dessiner non plus par l'OS, mais par Java (ce qui en terme de temps d'exécution à un prix). En fait, SWING est présenté comme étant écrit uniquement en Java. Bien entendu, il y a une petite triche : en effet, Java doit au moins être capable d'interagir avec l'OS pour pouvoir tracer un point (il faut donc autre chose que du 100% Java). Or c'est ce que font les classes de base de l'AWT (telles que Component, Container, ...). En conséquence, tous les composants de SWING dérive d'une classe de l'AWT. Notez une chose importante : les mécanismes de gestion d'évènements et de positionnent des composants de l'AWT restent utilisable avec SWING. Donc, certaines classes déjà utilisées avec l'AWT sont donc toujours d'actualité. En terme d'importation de package, cela implique qu'un programme SWING doit malgré tout importer certains packages de l'AWT. Dernières petites choses pouvant intervenir dans le choix d'une des deux API Swing est bien plus riche que l'AWT (même si un composant n'existe pas en natif sur l'OS, rien n'empêche de complètement le redessiner) - Si vous cherchez à mettre en place des applets, sachez que Swing n'est pas encore supporté par tous les navigateurs (on peut contourner le problème, nous y reviendrons). Créer des Arbres à l’aide de la classe swing : http://www.apl.jhu.edu/~hall/java/Swing-Tutorial/Swing-Tutorial-JTree.html L’API de Java2 : http://www.infres.enst.fr/docs/jdk1.4.0/api/ L'introspection (réflexion) permet à un programme Java de découvrir dynamiquement des informations sur une classe : Ainsi, les champs, constructeurs, méthodes et autres caractéristiques d'une classe peuvent être livrés sans connaissance préalable du code source d'une classe. Ce mécanisme introspectif est généralement utilisé par des outils de développement IDE (Integrated Development Environnement). Par exemple, les interpréteurs et inspecteurs d'objets de ces applications s'appuient largement sur cette technique. Les classes nécessaires à l'introspection sont contenues dans les paquetages java.lang et java.lang.reflect. Le paquetage java.lang.reflect possèdent plusieurs classes et interfaces permettant de mettre en oeuvre le mécanisme d'introspection. Les trois classes Field, Method et Constructor possèdent un modificateur final. La machine Virtuelle Java peut seulement créer des instances de ces classes. Ces objets sont utilisés pour manipuler les objets sous-jacents : o obtenir les informations d'introspection à propos des constructeurs et membres sous-jacents o obtenir et fixer les valeurs des champs o invoquer les méthodes sur les objets ou les classes, o créer de nouvelles instances des classes. La classe Array est également finale mais non-instanciable. Elle fournit des méthodes statiques qui permettent de créer de nouveaux tableaux et d'obtenir ou de fixer les éléments des tableaux. I) Cahier des charges : 1.1) Reformulation du sujet Le logiciel doit permettre de : - Ouvrir un dossier contenant des fichiers .class - Récupérer son contenu grâce à l’utilisation de la classe outil Introspection - Analyser le contenu - Construire un arbre hiérarchique de classes sélectionnées - Afficher l’arbre - Permettre de modifier l’affichage de manière à changer la position des classes affichées et de diminuer le nombre de coupures entre les branches de l’arbre et par conséquent d’optimiser la affichage et la compréhension du diagramme hiérarchique. - Cliquer sur une classe et obtenir l’affichage de sa spécification 1.2) Problèmes à résoudre Il y a plusieurs problèmes majeurs en matière de réalisation à resoudre : 1) L’ouverture des classes et la récupération des informations les caractérisant va nécessiter l’apprentissage de l’utilisation de la classe Introspection de la bibliothèque Java. 2) La contruction de l’arbre et son affichage 3) L’optimisation de l’affichage de l’arbre et par conséquent la recherche d’un algorithme permettant de minimiser le nombre de coupure entre les branches des feuilles du diagramme hiérarchique. 1.3) Contexte de la demande 1.4) Definition du domaine (attentes) Le logiciel devra permettre de : - Sélectionner un répertoire contenant des fichiers java compilés .class au travers de l’utilisation d’un explorer - Récupérer les caractéristiques (spécification) des fichiers .class sélectionnés afin de déterminer les liens d’héritages : 1. Classes racines 2. Classes Mères 3. Classes Filles 4. Liens ETRE 5. Liens AVOIR - Afficher les noms des classes et leurs liens graphiquement afin de représenter le graphe d’héritage : 1. une classe est représentée par un cadre contenant son nom 2. un lien est représenté par une flèche (lien ETRE) ou par une flèche en pointillé (lien AVOIR) entre deux classes 3. la couleur des classes varie en fonction de son type (classe abstraite, interface…). La couleur pour chaque type n’est pas encore définie et sera choisie par le client ou par nos soins. - Organiser les classes en fonction de leur niveau hiérarchique : 1. classe de même niveau à la même hauteur graphique (organisation automatique par étage) 2. classes de même niveau réorganisables manuellement par deux clicks pour sélectionner et un bouton inverser. - Accéder à la spécification d’une classe du diagramme hiérarchique en clickant sur le cadre contenant le nom de celle-ci et en l’affichant dans une autre fenêtre. Le logiciel ne devra pas permettre de : - Ouvrir des fichiers n’étant pas des fichiers java compilés (.class) Afficher constamment l’explorer du disque dans la fenêtre du logiciel Accéder à la spécification en modification 1.5) Eléments de qualité //screen shot appli 1.6) Services offerts à l’utilisateur 1.7) Contraintes matérielles et technologiques a) Compatibilité avec d’autres logiciels b) Contraintes de développement