#1. Présentation
Le but du projet est de réaliser une application en java qui mette en oeuvre les concepts objets vus en cours.
Le thème retenu est un gestionnaire d'emprunt de matériel. Le sujet représente les besoins parfois imprécis d’un client. Il sera nécessaire de reformaliser certains points afin de les traduire en classe. Certaines classes peuvent être reprises des TP précédents (mais ce n'est pas obligatoire).
#2. Détails de l'application
#2.1. Eléments composant l'application
Certaines matières enseignées à l‘école nécessitent un matériel spécifique. A cet effet, l’établissement (ou des institutions partenaires) ont acheté divers produits, prêtés ensuite aux étudiants pendant la durée des cours, ou à d'autres occasions. Ces achats sont égalements empruntables par des enseignants-chercheurs ou des startups. On veut garder un inventaire à jour de ce matériel.
Le matériel peut avoir été acheté par une des institutions partenaires : ENSIIE, TSP, C19 ou UEVE (Univ. Evry).
Parmi les matériels disponibles on trouve pour l'instant : téléphones, tablettes, webcams, capteurs de profondeur (kinect 1 et 2, leap motion…), casques de réalité virtuelle (oculus rift, htc vive) et manettes de ces casques, manettes de jeu, souris et casques audio.
On a besoin de conserver au moins : identifiant unique, nom, marque, institution propriétaire, date et prix d'achat, état (fonctionnel, HS, problème…).
Chaque type possède également des caractéristiques particulières selon les cas : OS, taille, connectique, résolution…
Les emprunteurs peuvent être : étudiants JIN, étudiants 2A ENSIIE, startup C19, enseignant… On doit connaitre au moins : nom, prénom, adresse, numéro téléphone et mail
A une date donnée et pour une raison identifiée (ex. projet JIN, UE JIN, UE 2A ENSIIE, projet personnel, startup, démo ponctuelle…) un emprunteur peut emprunter un ou plusieurs matériels. Il s'engage à le rendre avant une date précise. Il peut faire plusieurs emprunts.
Enfin, le matériel peut être stocké en différents lieux des institutions (concrêtement des armoires dans des salles ou des bureaux), avec un responsable qui possède la clé.
#2.2. Fonctionnalités attendues
L’application doit permettre à un utilisateur de gérer l'inventaire, en particulier (mais pas uniquement) :
- afficher le matériel
- total
- disponible
- emprunté
- selon leur type
- afficher les emprunts
- totaux
- selon la raison d'emprunt
- par emprunteur
- en retard
- afficher les lieux de stockage
- ajouter/modifier (attention aux contraintes)
- un matériel
- possibilité d'ajout de matériels par lot (ex. 10 nouveaux téléphones identiques)
- un lieu de stockage
- un emprunt
- un utilisateur
- un matériel
- autres fonctions utiles
- rendre un emprunt
Les affichages doivent permettre de savoir par exemple :
- quel est le contenu du stock de la salle 269 ?
- quel est le contenu du stock total ?
- liste des emprunts en cours ?
- liste des emprunts de tel type de matériel en cours ?
- liste des emprunts par une personne ?
- liste des emprunts en retard ?
- qui possède le matériel avec tel identifiant ?
- quel téléphone android de taille > 5 est disponible ?
- liste du matériel qui acheté depuis plus de 2 ans ?
Cette gestion se fera via la console (peu ergonomique) ou dans une interface graphique (bibliothèque de votre choix ex. swing, javafx…). Dans les 2 cas vous ferez attention à l'ergonomie pour ne pas irriter le correcteur lors des tests.
Les données devront être conservées entre 2 lancements de l'application
- pour simplifier sous forme de fichiers texte dans un format texte de votre choix (ex. csv, xml, json…)
- ou bien via un autre mécanisme de sauvegarde/chargement (sérialization, base de donnée…)
#3. Modalités de rendu
#3.1. Travail en binôme (pas de monôme)
Il y aura 16 binômes.
#3.2. Planning
Voir site web
NB : Si le travail en séances ne suffit pas il devra être complété par du travail personnel
#3.3. Rendus attendus
- Document de conception pour le xxx
- noms du binôme
- diagramme de classe simplifié : classes/interfaces, attributs, noms des méthodes
- Archive Jar exécutable pour le jeudi 27 juin 14h contenant
- l'ensemble des sources
- readme.txt contenant les instructions nécessaires à la bonne utilisation du programme
- javadoc
- Soutenance de présentation du projet le jeudi 27 juin 14h
#3.4. Critères de notation
- Application fonctionnelle
- Le programme doit fonctionner sous windows 10 avec java 8, sans autre installation nécessaire
- Nombre et qualité des fonctionnalités disponibles
- Architecture et code
- Architecture bien conçue
- Maîtrise des concepts vus en cours
- Commentaires/documentation
#4. Indications
#4.1. Entrées/Sorties console
#4.1.1. Package java.io
(source http://thecodersbreakfast.net)
Le package java.io
est composé de nombreuses classes, mais elles peuvent être réparties en 4 catégories,
selon qu'elles réalisent des opérations :
- de lecture ou d'écriture
- sur des données textuelles ou binaires
On peut ainsi les placer sur un graphe à 4 quadrants, chacun étant gouverné par une classe abstraite :
LECTURE | ECRITURE | |
---|---|---|
TEXTE | Reader | Writer |
BINAIRE | InputStream | OutputStream |
Ces classes abstraites sont ensuite implémentées par différentes classes concrètes spécialisées.
Leur quadrant d'appartenance se déduit de leur suffixe (-Reader
, -Writer
, -InputStream
ou -OutputStream
) :
LECTURE | ECRITURE | |
---|---|---|
Reader | Writer | |
- BufferedReader | - BufferedWriter | |
- StringReader | - StringWriter | |
TEXTE | - CharArrayReader | - CharArrayWriter |
- FileReader | - FileWriter | |
- … | - PrintWriter | |
- … | ||
↑ InputStreamReader ↑ | ↓ OutputStreamWriter ↓ | |
InputStream | OutputStream | |
- FileInputStream | - FileOutputStream | |
BINAIRE | - ByteArrayInputStream | - ByteArrayOutputStream |
- ObjectInputStream | - ObjectOutputStream | |
- PipedInputStream | - PipedOutputStream | |
- … | - … | |
Il existe également 2 classes qui permettent de faire le pont entre les données binaires et les données textuelles :
InputStreamReader
propose une interface de typeReader
(texte) sur des données provenant d'unInputStream
(binaire). Elle est particulièrement pratique lorsqu'une classe (ex:Socket
) fournit unInputStream
alors que vous savez que les données transmises seront de type texte.OutputStreamWriter
permettra d'utiliser les API de typeWriter
pour produire des données binaires propres à transiter par unOutputStream
.
Rq : Pour que les classes InputStreamReader
et OutputStreamWriter
puissent convertir efficacement des données
textuelles en binaire (et réciproquement), il est nécessaire de leur fournir en paramètre de constructeur un java.nio.charset.Charset
, qui encapsule les algorithmes d'encodage, exemple :
InputStream in = System.in;
Charset charset = Charset.forName("UTF-8");
InputStreamReader reader = new InputStreamReader(in, charset);
#4.1.2. Utilisation
Le package java.io
est construit sur le principe de composition du pattern Décorateur.
Certaines classes lisent/écrivent réellement les données sur/depuis un certain medium (fichier, réseau, buffer mémoire…) : elles sont donc toujours en bout de chaîne. D'autres en revanche ne font que manipuler ou observer les données qui transitent sur la chaîne de lecture/écriture : ce sont les décorateurs.
- Par exemple,
FileWriter
,ByteArrayInputStream
, ouStringReader
sont des classes de bout de chaîne - En revanche,
BufferedReader
,LineNumberReader
ouObjectOutputStream
sont des décorateurs.
Pour composer une chaîne de lecture ou d‘écriture, il faut sélectionner une classe de bout de chaîne permettant de lire ou d’écrire sur le medium cible, puis de brancher dessus autant de décorateurs que nécessaire pour obtenir les fonctionnalités souhaitées. Le branchement d'un élément sur le suivant s'effectue habituellement en le passant le second comme paramètre du constructeur du premier.
Exemples :
Lire les lignes d'un fichier texte, en comptant les lignes (LineNumberReader → BufferedReader → FileReader) :
FileReader fr = new FileReader("/path/to/file");
BufferedReader reader = new BufferedReader(fr);
LineNumberReader counter = new LineNumberReader(reader);
String line = null;
while ((line = counter.readLine()) != null) {
int lineNum = counter.getLineNumber();
System.out.println(lineNum + " : " + line);
}
counter.close();
Lire une ligne de texte saisie dans la console. System.in est de type InputStream, il faut donc le convertir (BufferedReader → InputStreamReader → InputStream fourni par System.in) :
InputStream in = System.in;
InputStreamReader isr = new InputStreamReader(in, Charset.forName("UTF-8"));
BufferedReader reader = new BufferedReader(isr);
String line = reader.readLine(); // exception à gérer ici
System.out.println(line);
reader.close();
Rq : il n'est pas nécessaire de passer par des variables intermédiaires