GUI Modeler - SNIper
Document d'Architecture Logicielle
Version
<1.1>
Historique des Révisions
Date |
Version |
Description |
Auteur |
17/11/2001 |
1.0 |
Création |
ISI3_BE1 |
23/01/2002 |
1.1 |
Ajout d'informations liées à l'architecture et au développement |
ISI3_BE1 |
|
|
|
|
Table des matières
1. Introduction 4
1.1 Objectif 4
1.2 Portée 4
1.3 Références 4
2. Représentation de l’architecture 4
2.1 Le format XML 4
2.1.1 Introduction 4
2.1.2 Avantages 4
2.1.3 Moyens envisagés 4
2.1.4 Outils existant 5
2.2 Alternatives 5
3. Buts de l’architecture et Contraintes 6
4. Vue des cas d’utilisation 6
4.1 Réalisation des cas d’utilisation 6
4.1.1 Cas d’utilisation 6
4.1.2 Diagrammes de séquence 7
5. Vue Logique 9
5.1 Couches 9
5.2 Contenu 9
5.3 Paquetages de conception significatifs du point de vue
de l’architecture 9
6. Vue Implémentation 10
6.1 Contenu 10
6.2 Couches 10
7. Vue données 11
8. Taille & Performance 11
9. Qualité 12
9.1 Architecture 12
9.2 Généricité 12
9.2.1 Interfaces 12
9.2.2 Classes abstraites 13
Document d'Architecture
Logicielle
Ce document est destine aux analystes et aux concepteurs.
· Document Vision v1.0 – ISI3_BE1
· Glossaire v1.0 – ISI3_BE1
La mise en œuvre de la persistance des diagrammes est une partie importante de l’architecture. Les diagrammes sont représentés de façon interne sous forme de fichier. Le format proposé est le XML.
Comme
HTML (Hypertext Markup Language) XML est un langage de balisage, c'est-à-dire
un langage qui présente de l'information encadrée par des balises. Mais
contrairement à HTML, qui présente un jeu limité de balises principalement
destinées à la présentation (titre, paragraphe, image, lien hypertexte, etc.),
XML est un métalangage, qui va permettre d'inventer à volonté de nouvelles
balises pour isoler toutes les informations nécessaires.
Exemple de texte au format XML :
<?xml
version="1.0"?>
<personne>
<name>
Ryan, Mad Dog Madden
</name>
</personne>
· Le principal concerne la possibilité de représenter la plupart des données dans ce format
· Etant un simple fichier texte, la taille de ce dernier est minime
· Largement étendu, ce format est normalisé et de plus en plus utilisé
Il est nécessaire d’implémenter ou de réutiliser un module permettant la conversion d’objets JAVA en XML et vice-versa. Une bibliothèque existante, Castor, permet de réaliser ces conversions.
Comme cité précédemment, Castor est un outil permettent la conversion d’objets de type JAVA en flux XML.
· Il est dû au groupe Exolab
· Son code source est accessible librement et l’utilisation de ce logiciel est gratuite
· Composé seulement d’un fichier, cet outil est en fait une bibliothèque utilisable facilement
Cet outil étant très ciblé, les fonctionnalités sont réduites. Sa seule fonction est la conversion d’objets de JAVA vers XML et vice-versa. La bibliothèque sera donc utilisée dans son ensemble, et sans aucune modification de son code.
Exemple :
Prenons l’exemple d’un objet nommé « personne ». Il possède 3 attributs : son nom, de type « chaîne de caractères », sa date de naissance, de type « Date », et un parent de type « personne ».
Pour cet exemple, les attributs de cette personne son valorisés comme suit :
- nom : « Pierre »
- date de naissance : 01-02-1950
- père :
§ nom : « Paul »
§ date de naissance : 10-10-1970
Voici le texte obtenu après la conversion de l’objet au format XML par Castor :
<?xml
version="1.0"?>
<personne>
<date-of-birth>1950-02-01T00:00:00.000</date-of-birth>
<pere>
<date-of-birth>1970-10-10T00:00:00.000</date-of-birth>
<nom>Paul</nom>
</pere>
<nom>Pierre</nom>
</personne>
Aucune alternative n’a encore été étudiée.
Les tests que nous avons effectués ayant été concluants, aucune alternative ne sera étudiée.
· Le système de fichier utilisé doit pouvoir être réutilisé dans les modules futurs.
· Le format de fichier est important dans le sens où il intervient en plus dans les cas de création et de sauvegarde de SEF, de génération automatique de SEF …
· Le code réutilisé doit être entièrement libre de droit.
· Le principal but de l’architecture choisie est de ne pas avoir à re-concevoir cette même architecture ainsi que le format de fichier dans les prochains incréments.
Les cas d’utilisation critiques pour l’architecture sont ceux liés à la gestion des fichiers et l’impression.
Voici les diagrammes d’interactions les concernant
Description globale des paquetages de l'application :
Le paquetage
« objetsmetiers » est le plus significatif pour l’architecture car
les classes qu’il contient ont dû faire l’objet d’une description pour la
persistance (cf. 7-
Vue données).
Nous avons aussi défini des classes jouant le rôle d’intermédiaire entre SNIper et Castor. Ces classes sont les suivantes :
La version finale de Sniper se présentera sous la forme d’un fichier .jar.
Celui-ci sera exécuté par la commande java –jar sniper.jar (si sniper.jar est le nom du fichier livré).
La persistance se fait à l’aide de l’outil « Castor » qui permet de transformer un objet en flux XML. Pour cela, cet outil a besoin d’un fichier, nommé « fichier de mapping », qui lui permet de faire la concordance entre l’objet lui-même et son équivalent en XML. Dans ce fichier , on décrit la structure (attributs) de tous les objets qu’on veut convertir via Castor, et on indique le nom de méthode d’accès à ces attributs.
Voici un extrait du « mapping » pour l’objet UDSaisie :
<?xml
version="1.0" ?> <!DOCTYPE mapping (View Source for
full doctype...)> - <mapping> - <class name="sniper.objetsmetiers.UDSaisie" access="shared"> - <field name="nbUDSaisie_" type="integer"
set-method="setNbUDSaisie"
get-method="getNbUDSaisie"
required="false"
direct="false"
lazy="false"> <bind-xml name="nb-Ud-Saisie" node="element" /> </field> - <field name="label_" type="java.lang.String"
set-method="setLabel"
get-method="getLabel"
required="false"
direct="false"
lazy="false"> <bind-xml name="label" node="element" /> </field> - <field name="x_" type="integer"
set-method="setX"
get-method="getX"
required="false"
direct="false"
lazy="false"> <bind-xml name="x"
node="element"
/> </field> … </class> </mapping> |
Le logiciel risque d’être plus lent sur les postes Unix que sur les postes Windows. Il devra néanmoins être utilisable sur les deux types de plate-forme.
L’architecture choisie et ce document seront réutilisés pour les prochains incréments et le développement des prochains modules : le format de fichier est choisi pour être compatible avec l’éditeur de SEF (SEF Control) et le visionneur d’interfaces (GUI Viewer).
L’héritage multiple n’existe pas en Java. Aussi est-il judicieux d’utiliser au maximum des interfaces plutôt que des classes abstraites, lorsque ceci est possible.
Lors de la première itération, nous avons décidé de produire un code relativement générique et permettant par la suite de minimiser les modifications de ce code. Aussi nous avons fait usage d’interfaces permettant une généricité importante. Voici une partie du diagramme de classe montrant la généricité du modèle de conception, au niveau des objets métiers :
Le diagramme SNI contient des éléments SNI. ElementSNI est une interface. Tous les éléments à insérer dans un SNI par la suite devront implémenter cette interface. Ainsi, il n’est pas nécessaire de modifier le code. En ce qui concerne ce code, en voici un extrait concernant l’affichage d’un SNI chargé à partir d’un fichier préalablement sauvegardé. On remarque que seules sont utilisés les classes génériques et les interfaces.
public void associerDessinSNI() {
…
try {
for (int i = 0; i < getSNI().getElementsSNI().size(); i++) {
String s;
/* les elements
sont dans un tableau. On récupère les éléments un par un */
ElementSNI elt = (ElementSNI) getSNI().getElementsSNI().elementAt(i);
/* on récupère
ici la classe correspondant à l’élément que l’on vient de récupérer. Par
exemple :
sniper.objetsmetiers.UDSaisie
*/
s = elt.getClass().getName();
tab[0] = elt.getClass();
s = "sniper.gui.representation.Dessin" +
s.substring(21, s.length());
c = Class.forName(s);
paramsConstructeur[0] = elt;
/* on crée un nouvel
objet correspondant à l’élément à insérer dans le SNI.
Le
paramètre « paramsConstructeur » contient la liste des paramètres
nécessaires au dessin
de l’objet
dans le SNI. En effet, la liste des paramètres n’est pas la même pour une UD
que
pour une
liaison entre 2 UD */
DessinElement d = (DessinElement) c.getConstructor(tab).newInstance(paramsConstructeur);
/* cet objet
créé est maintenant inséré dans le dessin du SNI */
getPanneauSNI().ajouterEltDessin(d);
d.afficher(elt.getParamsAfficher());
}
}
catch (Exception e) {
…
}
}
Lorsque des attributs ont été nécessaires, nous avons remplacé l’interface par une classe abstraite. C’est le cas de la classe UD. Toute UD possède les mêmes attributs qui sont :
- un label
- une position sur l’axe des « x »
- une position sur l’axe des « y »
- une largeur
- une hauteur
Toutes les UD spécifiques hériteront donc, comme UDSaisie, de la classe abstraite UD.