`un carnet d\`adresse en Java populaire

Transcription

`un carnet d\`adresse en Java populaire
Institut de la Francophonie pour l’Informatique
RAPPORT DU PROJET
GÉNIE LOGICIEL AVANCÉ
Sujet : « Implémentation d'un carnet d'adresse en Java »
Réalisé par:
 NGUYEN Van Tho
 KASEREKA KABUNGA Selain
Hanoï, Décembre 2012
TABLE DES MATIERES
TABLE DES MATIERES ....................................................................................................... 2
1.
INTRODUCTION ............................................................................................................. 3
2.
SPECIFICATION DE L'APPLICATION ....................................................................... 3
3. LES EXIGENCES FONCTIONNELLES ET NON FONCTIONNELLES DE
L'APPLICATION ..................................................................................................................... 4
3.1. Exigences fonctionnelles ..................................................................................... 4
a.
Diagramme de cas d’utilisation ........................................................................... 5
3.2. Les exigences non-fonctionnelles de l’application ....................................... 6
4.
LA CONCEPTION ........................................................................................................... 7
4.1. Diagramme de classe ............................................................................................... 7
4.2. Diagramme de séquence ......................................................................................... 7
5.
a.
Création d’un contact ............................................................................................ 8
b.
Rechercher un contact ......................................................................................... 8
c.
Modifier un contact ................................................................................................ 9
d.
Supprimer un contact............................................................................................ 9
IMPLEMENTATION ET TEST .................................................................................... 10
5.1. Solution technique .................................................................................................. 10
a.
Le choix de la plate forme de développement ................................................ 10
b.
Le choix du langage de programmation .......................................................... 10
c.
La base de données .......................................................................................... 10
5.2. Le test d’acceptation .............................................................................................. 10
6.
CONCLUSION ............................................................................................................... 13
7.
CODE SOURCE ............................................................................................................ 14
1. INTRODUCTION
C’est dans le cadre du cours de Génie logiciel avancé que nous avons réalisé
ce travail. Le but poursuivi est de revoir les concepts de la modélisation avec
UML et la programmation orientée - objet avec Java et aussi de se familiariser
à l'environnement de développement intégré (IDE) « libre » (Open Source)
ECLIPSE.
Jadis les notions de gestion par les technologies de l'information et de la
communication n'existaient pas, la gestion d'informations était totalement
manuelle et plusieurs désavantages de cette façon de faire se sont vite fait
remarquer par plusieurs indices. Nous pouvons citer le gaspillage de temps
dans la gestion, la sécurité des informations non garantie, les erreurs dans les
calculs rendant ainsi le résultat biaisé, etc.
Cet outil que nous développons n'est qu'un petit programme qui permet à un
utilisateur de gérer ses contacts grâce à un carnet d’adresse.
2. SPECIFICATION DE L'APPLICATION
Le projet que nous concevons et réalisons dans ce travail est un gestionnaire
de carnet d’adresse. Les entrées de ce carnet sont : le nom de la personne,
ses numéros de téléphone et ses adresses (travail et domicile).
Ce gestionnaire fournit à l'utilisateur les fonctionnalités suivantes:

Créer une nouvelle personne;

Chercher et afficher tous les numéros de téléphone et l’adresse d'une
personne étant donné que son nom est entré à partir du clavier;

Supprimer une personne de la liste étant donné que son nom est entré
à partir du clavier;

Chercher et modifier les numéros de téléphone et l’adresse d'une
personne étant donné que son nom est entré à partir du clavier;

Afficher la liste de toutes les personnes enregistrées dans la base de
données (nom, numéros de téléphone, adresses).
3. LES EXIGENCES FONCTIONNELLES ET NON FONCTIONNELLES
DE L'APPLICATION
3.1. Exigences fonctionnelles
Notre application se base sur plusieurs exigences fonctionnelles que nous
pouvons décrire dans le tableau ci-dessous :
EF 1.0
Ajouter une personne
EF 5.1
Le système doit demander de saisir des informations sur la personne
EF 5.2
Le système doit enregistrer la personne
EF 5.3
Le système doit attribuer un identifiant à cette personne
EF 2.0
Rechercher une personne
EF 2.1
EF 2.2
Le système doit demander de saisir le nom de la personne à
chercher
Le système doit permettre de vérifier une personne
EF 3.0
Modifier une personne
EF 3.1
Le système doit permettre de modifier une personne
EF 3.2
Le système doit permettre d’enregistrer les nouvelles informations
sur la personne
EF 4.0
Supprimer une personne
EF 4.1
Le système doit permettre de supprimer une personne
EF 4.2
Le système doit demander la confirmation de suppression
EF 5.0
Afficher
EF 5.1
Le système doit permettre d’afficher une personne
EF 5.2
Le système doit permettre d’afficher toute les personnes
Tableau 1. Tableau des exigences fonctionnelles
a. Diagramme de cas d’utilisation
Ci-dessous nous présentons le diagramme de cas d’utilisation pour montrer
l’interaction entre l’utilisateur (gestionnaire de carnet d’adresse) et le système :
Figure 1. Diagramme de cas d’utilisation
Ci-dessous nous présentons le tableau des relations dans le diagramme de
cas d’utilisation :
Type
1.Erreur ! Include
Signet
non
défini.
2.Erreur ! Include
Signet
non
défini.
3.Erreur ! Association
Signet
non
défini.
4.Erreur ! Include
Signet
non
défini.
5.Erreur ! Association
Signet
non
défini.
6.Erreur ! Association
From
To
Afficher une
Rechercher une personne
personne (Use Case) (UseCase)
Modifier une
Rechercher une personne
personne (Use Case) (UseCase)
Gestionnaire (Actor)
Modifier une personne
(UseCase)
Supprimer une
Rechercher une personne
personne (Use Case) (UseCase)
Gestionnaire (Actor)
Afficher toutes les
personnes (UseCase)
Gestionnaire (Actor)
Afficher une personne
Signet
non
défini.
7.Erreur ! Association Gestionnaire (Actor)
Signet
non
défini.
8.Erreur ! Association Gestionnaire (Actor)
Signet
non
défini.
9.Erreur ! Association Gestionnaire (Actor)
Signet
non
défini.
(UseCase)
Supprimer une personne
(UseCase)
Ajouter une personne
(UseCase)
Ajouter une personne
(UseCase)
Tableau 2. Les relations dans le diagramme de cas d’utilisation
3.2. Les exigences non-fonctionnelles de l’application
Ci-dessous nous présentons un tableau qui présente les exigences non
fonctionnelles, leur description et leur numéro d’exigence fonctionnelle
utilisées.
Description
EF utilisée
ENF 1.0 Le taux pour qu’un échec survienne lors Toutes les exigences
d’une opération sur le système doit être
très faible soit 0.0001%
ENF 2.0 Le système doit être disponible durant Toutes les exigences
toutes les opérations
ENF 3.0 En cas de défaillance, le système ne Toutes les exigences
devra pas causer de dommages
matériels
ENF 4.0 En cas d’erreurs venant de l’utilisateur, Toutes les exigences
les données ne doivent subir aucun
changement,
la
disponibilité
des
données doit être garantie.
ENF 5.0 Le système doit avoir au plus 3 Toutes les exigences
secondes comme temps de réponse à
une opération.
Tableau 3. Tableau des exigences non fonctionnelles
4. LA CONCEPTION
4.1. Diagramme de classe
Voici le diagramme de classe de notre application :
Figure 2. Diagramme de classe
4.2. Diagramme de séquence
Dans ce point nous présentons les opérations qui se font sur le système via le
diagramme de séquence :
a. Création d’un contact
Figure 3. Diagramme de séquence pour la création d’un contact
b. Rechercher un contact
Figure 4. Diagramme de séquence pour la recherche d’un contact
c. Modifier un contact
Figure 4. Diagramme de séquence pour la modification d’un contact
d. Supprimer un contact
Figure 5. Diagramme de séquence pour la suppression d’un contact
5. IMPLEMENTATION ET TEST
5.1. Solution technique
a. Le choix de la plate forme de développement
Pour implémenter notre application nous avons utilisé Eclipse IDE, qui est un
environnement de développement intégré libre extensible, universel et polyvalent,
permettant potentiellement de créer des projets de développement mettant en œuvre
n'importe quel langage de programmation.
b. Le choix du langage de programmation
Le langage utilisé pour l’implémentation de cette application est le langage java. Ce
langage complètement orienté objet. Java permet et pousse à développer les
applications d'une façon orientée objet et permet d'avoir une application bien
structurée, modulable, maintenable beaucoup plus facilement et efficace.
c. La base de données
Comme signifié dans les pages précédentes nous avons utilisé SQLite qui est un
formidable moteur de base de données, ne nécessitant pratiquement aucune
administration, portable (tous systèmes) et accessible de pratiquement tous les
langages (C, C++, Java, Python...). Contrairement à mySQL, SQLite ne nécessite
pas la mise en place d'un service.
La structure de notre table est la suivante :
Nom des champs
id
name
Type
INTEGER PRIMARY KEY
TEXT
home_phone
work_phone
TEXT
TEXT
home_address
work_address
TEXT
TEXT
5.2. Le test d’acceptation
Dans cette partie nous soumettons à notre programme un jeu de données pour le
tester. Ces opérations englobent l’ensemble d’opérations qui seront faites par
l’utilisateur (gestionnaire pour notre cas).

Enregistrer un contact
Grace a cette interface l’utilisateur a la possibilité de saisir les informations sur le
contact et les enregistrer.
Signalons aussi que l’utilisateur doit remplir tous les champs obligatoires avant
d’enregistrer. Cette fenêtre montre un exemple ou l’utilisateur click sur enregistrer
sans respecter cette condition :

Rechercher un contact
A partir ce cette interface l’utilisateur écrit une partie ou l’intégralité du nom a
chercher dans son carnet d’adresse :

Sélectionner un contact
6. CONCLUSION
Dans ce document nous présentons le logiciel que nous avons réalisé. Ce
programme permet de gérer un carnet d’adresse. Pour la partie modélisation nous
avons utilisé UML. Les opérations, dans ce petit logiciel, sont faites en interaction
avec sqlite3. Pour tester le bon fonctionnement des méthodes nous avons utilisé
JUnit. Ce programme marche très bien et répond aux exigences décrites dans le
cahier de charge.
Cependant, ce programme peut être amélioré dans l’avenir pour permettre la prise
en charge par exemple de plus de deux numéros de téléphone et deux adresses
pour un contact enregistré dans le système, la prise en charge des groupes ou
catégorie des contacts.
7. EXTRAIT DU CODE SOURCE
Dans ce point nous présentons un extrait du code source de l’application
/**
* get connection to sqlite database
* @return connection
*/
private Connection getConnection(){
Connection connection = null;
try {
Class.forName(SQLITE_DRIVER);
connection = DriverManager.getConnection(DB_NAME);
} catch (ClassNotFoundException e) {
e.printStackTrace();
return null;
} catch (SQLException e) {
e.printStackTrace();
return null;
}
return connection;
}
/**
* delete a person
* delete a person from database and from model data
* @param id of person
* @param index
* @return boolean
*/
public boolean delete(int id, int index){
Connection connection = getConnection();
if(connection == null){
//error handle
return false;
}
PreparedStatement preparedStatement;
try {
preparedStatement = connection.prepareStatement( "DELETE FROM " +
"person WHERE id = ?");
preparedStatement.setInt(1, id);
preparedStatement.execute();
preparedStatement.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
return false;
}finally{
try {
connection.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
//remove this person from model data
persons.remove(index);
//update jtable UI
fireTableRowsDeleted(index, index);
//fireTableDataChanged();
return true;
}
/**
* update information for a person
* @param person
* @param index : index of person in model data
* @return boolean
*/
public boolean update(Person person, int index){
Connection connection = getConnection();
if(connection == null){
//error handle
return false;
}
PreparedStatement preparedStatement;
try {
preparedStatement = connection.prepareStatement( "UPDATE " +
"person set name = ?, home_phone = ? , work_phone = ?, home_address =
?, work_address = ?" +
" WHERE id = ?");
preparedStatement.setString(1, person.getName());
preparedStatement.setString(2, person.getHomePhone());
preparedStatement.setString(3, person.getWorkPhone());
preparedStatement.setString(4, person.getHomeAddress());
preparedStatement.setString(5, person.getWorkAddress());
preparedStatement.setInt(6, person.getId());
preparedStatement.execute();
preparedStatement.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
return false;
}finally{
try {
connection.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
//update model data
persons.set(index, person);
//update jtable UI
fireTableRowsUpdated(index, index);
//fireTableDataChanged();
return true;
}
public boolean insert(Person person){
if (person == null){
return false;
}
Connection connection = getConnection();
if(connection == null){
//error handle
return false;
}
PreparedStatement preparedStatement;
try {
preparedStatement = connection.prepareStatement( "INSERT INTO " +
"person(name, home_phone, work_phone, home_address, work_address)"
+
"VALUES (?, ?, ?, ?, ?)");
preparedStatement.setString(1, person.getName());
preparedStatement.setString(2, person.getHomePhone());
preparedStatement.setString(3, person.getWorkPhone());
preparedStatement.setString(4, person.getHomeAddress());
preparedStatement.setString(5, person.getWorkAddress());
preparedStatement.execute();
preparedStatement.close();
} catch (SQLException e) {
e.printStackTrace();
return false;
}finally{
try {
connection.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
persons.add(person);
fireTableRowsInserted(persons.size() - 1, persons.size() - 1);
//fireTableDataChanged();
return true;
}
/**
* get a list of Person, if searchName is empty, return all
* if searchName is not empty, return all the persons whose name contains searchName
* @param searchName
* @return list of Person
*/
public List<Person> getPersons(String searchName){
List<Person> persons= new ArrayList<Person>();
Connection connection = getConnection();
if(connection == null){
//error handle
return null;
}
PreparedStatement preparedStatement;
try {
String sql = "SELECT * FROM person ";
if(!searchName.isEmpty()){
sql += " WHERE name like '%" + searchName + "%'";
}
preparedStatement = connection.prepareStatement(sql);
ResultSet resultSet = preparedStatement.executeQuery();
while (resultSet.next()) {
int id = resultSet.getInt("id");
System.out.println(id);
String name = resultSet.getString("name");
String homePhone = resultSet.getString("home_phone");
String workPhone = resultSet.getString("work_phone");
String homeAddress = resultSet.getString("home_address");
String workAddress = resultSet.getString("work_address");
Person person = new Person(name, homePhone, workPhone, homeAddress,
workAddress);
person.setId(id);
persons.add(person);
}
preparedStatement.close();
} catch (SQLException e) {
e.printStackTrace();
return null;
}finally{
try {
connection.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
return persons;
}