IPRO - Projet (version non définitive 03/05/19)
Gestion d'inventaire de matériel informatique pédagogique

#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) :

Les affichages doivent permettre de savoir par exemple :

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

#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

#3.4. Critères de notation

#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 :

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
- …
InputStreamReaderOutputStreamWriter
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 :

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.

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