:: Enseignements :: ESIPE :: E4INFO :: 2012-2013 :: Java Avancé ::
[LOGO]

Exam de Java Avance (session de Juillet)


Exercice 1 - PaymentProcessor

On souhaite écrire un programme permettant d'effectuer des mouvements financiers entre des comptes.
Le fichier accounts.txt contient une liste de compte sous la forme d'un quadruplet (numéro du compte, prénom, nom et solde du compte), le premier et le dernier sont des entiers long et les autres de chaine de caractère au format US-ASCII 8bits.
Le fichier records.txt est une liste de mouvement financier sous la forme d'un triplet (somme d'argent à transférer, compte1, compte2), tous des entiers long, qui indique qu'il faut transférer la somme d'argent du compte1 au compte2.
On cherche à appliquer les mouvements financiers du fichier records.txt sur les comptes décrit dans accounts.txt et de ressortir un état de chaque compte indiquant le solde de celui-ci ainsi que les 3 dernières opérations (3 doit être une constante du programme pour pouvoir être changé si nécessaire) de transfert d'argent (vers le compte ou à partir de ce compte).
Le fichier process-out.txt correspond à la sortie attendu du programme, celui-ci liste les comptes dans le même ordre que le fichier accounts.txt et pour chaque compte affiche le prénom et le nom du possesseur du compte, son solde après les mouvements, ainsi que les 3 dernières opérations effectuées sur ce compte.
Voici un exemple pour le compte de john black
    john black -202839
      john black --> 1245 --> micky mc'diamond
      jill torturo --> 2798 --> john black
      john black --> 2079 --> june baggins
   

Il vous est donc demander de créer un programme Java qui permet de produire en sortie exactement la même sortie que celle enregistrer dans le fichier process-out.txt.
De plus, comme le fichier records.txt contient trop d'information pour être monter en mémoire sous forme d'une liste, il vous est demandé de créer une méthode loadAsIterator (à mettre dans la bonne classe) qui renverra chaque ligne du fichier à chaque appel hasNext/next sur l'itérateur.
Voici son prototype:
Iterator<Record> loadAsIterator(BufferedReader reader, XXX)
avec XXX le ou les paramètres supplémentaires que vous désirez.

Il est très important que votre programme soit correctement designé, avec ni trop de classes ni pas assez, que la responsabilité de chaque classe soit clairement établie, que la visibilité des méthodes, constructeurs, champs soit adaptés, qu'il n'y est pas de code non-utilisé, que les commentaire de documentation soient écrit en Anglais, que les resources fichiers ouvertes soient correctement fermés même en cas d'exception, que les exceptions soient correctement gérés, et bien-sûr que la méthode loadAsIterator soit utilisée et que la sortie du programme soit la bonne.

Les fichiers sont accounts.txt, records.txt et process-out.txt

Quelques indications:
Un chemin d'un fichier dans une arborescence est gérée par la classe java.nio.file.Path, pour créer un object de classe Path on peut utiliser la classe factory java.nio.file.Paths, un fichier texte en lecture est géré par la classe BufferedReader, la classe java.nio.charset.StandardCharsets définie les charsets standards.
Utiliser la syntaxe try-with-resources est une bonne idée.
La méthode String.split() existe !