:: Enseignements :: ESIPE :: E4INFO :: 2011-2012 :: Java Réseau I - Concurrence et E/S ::
[LOGO]

Examen de concurrence - Session de Septembre


Exercice 1 - Log it!

On cherche à écrire une classe Java qui permet de logger sur la console ou dans un fichier un ensemble de chaînes de caractères. Cette classe doit être thread-safe être programmé dans les rêgles de l'art.

La classe Logger possède les constructeurs et méthodes suivantes :
  • Un constructeur qui prend un Writer en paramètre et qui écrira les chaines de caractère dans celui-ci.
  • Un autre constructeur qui prend un chemin (Path) et un jeu de caractères (Charset) et qui écrit les chaines de caractères dans le fichier correspondant en utilisant le charset spécifié.
  • Une méthode createLog qui permet de créer un objet Log qui servira à écrire les chaines de caractère. Un log est attaché à la thread qui la créé et il ne peut y avoir qu'un seul log par thread.
  • La méthode getLog permet de récupérer le log de la thread qui appel la méthode, celui-ci devant être créer au préalable par createLog.
  • La méthode close qui ferme l'ensemble des logs créer à partir de ce Logger.
De plus, l'interface Log possède les méthodes suivantes :
  • La méthode log qui permet de transmettre une chaine de caractère, celle-ci ne sera pas écrite immédiatement mais stockée et l'ensemble des chaines de caractères stocké sera écrite lors de la fermeture du log (soit en appelant la méthode close sur un Log ou sur le Logger. Seul la thread qui a créer l'objet Log a le droit d'utiliser la méthode log, et de plus le Log ne doit pas être fermé.
  • La méthode isClosed indique si le Log est fermé ou non, cette méthode peut être appelée par n'importe qu'elle thread.
  • La méthode close qui ferme le Log et donc déclenche l'écriture des chaines de caractères précédemment stockées (comme la méthode close peut être appelée plusieurs fois, l'écriture ne se fait qu'au premier appel). Cette méthode est appelable par n'importe quelle thread.



Les tests unitaires suivant permettent de valider la semantique du Logger, notez qu'il ne valide pas le fait que la classe est bien thread-safe.