NFP121 - JFOD
Transcription
NFP121 - JFOD
NFP121 Programmation avancée. Session de Février 2014-durée : 3 heures Tous documents papiers autorisés Cnam / Paris-HTO & FOD/Nationale Sommaire : Question 1 (7 points) : Patron MailBox Question 2 (4 points) : Patron Observateur Question 3 (5 points) : Persistance Question 4 (4 points) : Interface graphique Question1 : Patron MailBox L’ E-mail est un exemple classique de l’usage de ce patron. Ce patron permet de délivrer des messages, de les mémoriser, jusqu’à ce que leur(s) destinataire(s) les relève. Ci-dessous, en syntaxe UML/BlueJ, une architecture possible de classes Java reflétant ce Patron : Cette architecture, simplifiée, est constituée de l’interface IMailBox, (dont les commentaires (javadoc) sont à lire attentivement), d’une implémentation MailBox, (ce qui est demandé) et d’une classe de tests unitaires TestMailBox fournie (à lire tout aussi attentivement…). L’interface IMailBox ci-dessous, propose les opérations : • d’inscription d’un destinataire de messages (add), • d’envoi d’un message à un seul destinataire (post), • d’envoi d’un message à plusieurs destinataires (post), • de relevé des nouveaux messages pour un destinataire (load), • d'obtention de tous les messages pour un destinataire (getAllMessages), • d'obtention de tous les messages lus pour un destinataire (getReadMessages), • d’obtention d’un itérateur sur la liste des destinataires inscrits (iterator). NFP121-examen-février-2014 1/15 public interface IMailBox extends Iterable<String>, Serializable{ /** Inscription d'un destinataire. * L’inscription est obligatoire afin de recevoir des messages. * nota bene: Pas d'homonyme possible. * @param dest le destinataire le nom de l’utilisateur * @throws Exception si le destinataire est déjà inscrit ou un homonyme est en place * @return this */ public IMailBox add(String dest) throws Exception; /** Dépôt d'un Message pour un destinataire. * @param message le message envoyé. * @param dest le destinataire du message * @throws Exception si le destinataire est inconnu, pas encore inscrit * @return this */ public IMailBox post(IMessage message, String dest) throws Exception; /** Dépôt d'un Message pour plusieurs destinataires. * @param message le message envoyé. * @param dest les destinataires du message. * @throws Exception si au moins un des destinataires est inconnu * @return this */ public IMailBox post(IMessage message, String[] dest) throws Exception; /** Relevé de certains messages pour ce destinataire. * @param dest le nom du destinataire. * @return une liste contenant les nouveaux messages, depuis le dernier relevé, * depuis le dernier appel de cette méthode. * @throws Exception si le destinataire est inconnu, pas encore inscrit */ public List<IMessage> load(String dest) throws Exception; /** Obtention d'un itérateur sur la liste des destinataires inscrits. * @return un itérateur, parcours des inscrits */ public Iterator<String> iterator(); /** Obtention d'une copie de la liste des messages pour ce destinataire. * @param dest le nom du destinataire * @return la liste des messages * @throws Exception si le nom du destinataire est inconnu */ public List<IMessage> getAllMessages(String dest) throws Exception; /** Obtention d'une copie de la liste des messages lus * pour ce destinataire. * @param dest le nom du destinataire * @return la liste des messages * @throws Exception si le nom du destinataire est inconnu */ public List<IMessage> getReadMessages(String dest) throws Exception; } L’interface IMessage : public interface IMessage extends Serializable{ void setContent(String content); // le contenu du message String getContent(); String getSource(); // la source, l'émetteur du message } NFP121-examen-février-2014 2/15 La classe abstraite AbstractMessage : public abstract class AbstractMessage implements IMessage{ protected String source; public AbstractMessage( String source){ this.source = source; } public String getSource(){return source;} public abstract void setContent(String content); public abstract String getContent(); } Ci-dessous, un extrait de la classe TestMailBox : une classe de tests unitaires, à lire attentivement avant de répondre à cette question. public class TestMailBox extends junit.framework.TestCase{ private static class StringMessage extends AbstractMessage{ private String text; public StringMessage(String source, String text){ super(source); this.text = text;} public void setContent(final String text){ this.text = text;} public String getContent(){ return text;} } public void testScenario1() throws Exception{ IMailBox mb = new MailBox(); mb.add("a").add("b").add("c").add("d"); // 4 destinataires : a,b,c,d StringMessage msg1 = new StringMessage("src1","mail_1"); mb.post(msg1,"a"); List<IMessage> liste = mb.load("a"); assertTrue(liste.size()==1); // un seul message lu assertEquals(msg1.getContent(),liste.get(0).getContent()); StringMessage msg2 = new StringMessage("src2","mail_2"); mb.post(msg2,"a"); liste = mb.load("a"); assertTrue(liste.size()==1); // un seul message depuis le dernier relevé assertEquals(msg2.getContent(),liste.get(0).getContent()); StringMessage msg3 = new StringMessage("src3","mail_3"); mb.post(msg3,new String[]{"a","b","c","d"}); liste = mb.load("a"); assertTrue(liste.size()==1); // un seul message depuis le dernier relevé assertEquals(msg3.getContent(),liste.get(0).getContent()); StringMessage msg4 = new StringMessage("src4","mail_4"); mb.post(msg4,new String[]{"a","b","c"}); liste = mb.load("b"); assertTrue(liste.size()==2); // deux messages lus assertEquals(msg3.getContent(),liste.get(0).getContent()); assertEquals(msg4.getContent(),liste.get(1).getContent()); liste = mb.getAllMessages("a"); // au total 4 messages reçus assertTrue(liste.size()==4); liste = mb.getReadMessages("a"); assertTrue(liste.size()==3); // au total 3 messages lus } public void testScenario2() throws Exception{ IMailBox mb = new MailBox(); mb.add("a").add("b").add("c").add("d"); // 4 destinataires : a,b,c,d StringMessage msg1 = new StringMessage("s1","mail_1"); // une source : s1 assertEquals("s1",msg1.getSource()); assertEquals("mail_1",msg1.getContent()); try{ mb.post(msg1,"x"); NFP121-examen-février-2014 3/15 fail("une exception destinataire inconnu est attendue !"); }catch(Exception e){ try{ mb.post(msg1,new String[]{"a","b","x","c"}); fail(" x est inconnu, une exception doit etre levée, a,b et c sont bien inscrits"); }catch(Exception e1){ assertEquals(msg1.getContent(),mb.load("a").get(0).getContent()); assertEquals(msg1.getContent(),mb.load("b").get(0).getContent()); assertNotNull(mb.getAllMessages("c")); assertEquals(1,mb.getAllMessages("c").size()); assertEquals(msg1.getContent(),mb.load("c").get(0).getContent()); } } } } Question) Ecrivez une implémentation complète de la classe MailBox. Certaines documentations d’interfaces et de classes sont en annexe. Vous pouvez détacher la dernière page de cet énoncé, la joindre à votre copie en n'oubliant pas de reporter le numéro de celle-ci. Question2 : Patron Observateur Un destinataire préalablement inscrit souhaite maintenant être notifié dès qu’un message à son attention est déposé dans la boîte aux lettres. L’architecture de la question précédente s’est enrichie de deux nouvelles interfaces MailBoxListener et IMailBoxNotification, soit en syntaxe UML/BlueJ: L’interface IMailBoxNotification, propose une seule méthode permettant d’inscrire les clients en vue d’une notification. public interface IMailBoxNotification extends IMailBox{ /** Inscription d'un observateur(Listener) auprès d'un destinataire. * Rappel: pas d'homonyme possible. * Plusieurs observateurs sont possibles par destinataire. * @param listener l'observateur, notifié à chaque réception de courrier * @param dest le nom de l’utilisateur * @throws Exception si le destinataire n'est pas déjà inscrit */ public void addMailBoxListener(String dest, MailBoxListener listener) throws Exception; } L’interface MailBoxListener, implémentée par les destinataires souhaitant être notifiés, est donnée cidessous, cette interface contient la méthode onMessage, déclenchée à chaque réception d’un message : public interface MailBoxListener{ public void onMessage(IMessage msg) throws Exception; } NFP121-examen-février-2014 4/15 Ci-dessous un extrait de la classe TestMailBoxNotification : une classe de tests unitaires ( à lire attentivement avant de répondre à cette question). public class TestMailBoxNotification extends junit.framework.TestCase{ private static class StringMessage extends AbstractMessage{ private String text; public StringMessage(String source, String text){ super(source); this.text = text;} public void setContent(String text){ this.text = (String)text; } public String getContent(){ return text;} } private class MockListener implements MailBoxListener{ // un listener pour les tests private List<IMessage> notifications = new ArrayList<IMessage>(); public void onMessage(IMessage msg) throws Exception{ notifications.add(msg); // ajout du message à la liste à chaque réception } public List<IMessage> getNotifications(){ // lecture de la liste pour vérifications return notifications; } } public void testScenario1() throws Exception{ IMailBoxNotification mb = new MailBoxNotification(); MockListener listenerA = new MockListener(); mb.add("a"); mb.addMailBoxListener("a", listenerA); // un destinataire : a StringMessage msg = new StringMessage("s","mail_1"); mb.post(msg,"a"); assertEquals(msg.getContent(),listenerA.getNotifications().get(0).getContent()); List<IMessage> mails = mb.load("a"); assertEquals(msg.getContent(),mails.get(0).getContent()); } public void testScenario2() throws Exception{ IMailBoxNotification mb = new MailBoxNotification(); mb.add("a").add("b").add("c").add("d"); MockListener listenerA = new MockListener(); mb.addMailBoxListener("a", listenerA); // un destinataire : a MockListener listenerB = new MockListener(); mb.addMailBoxListener("b", listenerB); // un destinataire : b MockListener listenerC1 = new MockListener(); mb.addMailBoxListener("c", listenerC1); // un destinataire : c MockListener listenerC2 = new MockListener(); mb.addMailBoxListener("c", listenerC2); // le meme c avec un écouteur de plus StringMessage msg = new StringMessage("s","mail_1"); mb.post(msg,new String[]{"a","b","c"}); assertEquals(msg.getContent(),listenerC1.getNotifications().get(0).getContent()); List<IMessage> mails = mb.load("c"); assertEquals(msg.getContent(),mails.get(0).getContent()); assertEquals(msg.getContent(),listenerC2.getNotifications().get(0).getContent()); assertEquals(msg.getContent(),mails.get(0).getContent()); } } Question) Ecrivez une implémentation complète de la classe MailBoxNotification. Certaines documentations d’interfaces et de classes sont en annexe. NFP121-examen-février-2014 5/15 Question3 : Persistance La persistance de la boîte aux lettres est assurée par un fichier selon un mode choisi à l’exécution par l’utilisateur. Seuls les messages non lus d'une boîte aux lettres sont sauvegardés. Deux modes sont ici possibles, une persistance à l'aide de la sérialisation en java d'une part et la génération d'un fichier au format XML d'autre part. L’architecture proposée en syntaxe UML/BlueJ: La classe abstraite PersistentMode propose les méthodes de sauvegarde et de restitution d'une instance de boîte aux lettes. public abstract class PersistentMode{ /** Sauvegarde d'une instance de boîte aux lettres. * Seuls les messages non lus sont sauvegardés. * @param mb la boîte mail * @param fileName le nom du fichier * @throws Exception levée d'une exception pour toute anomalie */ public abstract void writeMailBox(MailBox mb, String fileName) throws Exception; /** Restitution d'une instance de boîte aux lettres. * @param fileName le nom du fichier * @throws Exception levée d'une exception pour toute anomalie * @return la boîte mail préalablement sauvegardée. */ public abstract MailBox readMailBox(String fileName) throws Exception; } La classe StringMessage reflète le type des messages utilisé à cette question. public class StringMessage extends AbstractMessage { private String text; public StringMessage(String source){ super(source);} public void setContent(final String text){ this.text = text; } public String getContent(){ return text;} public boolean equals(Object obj){ StringMessage sm = (StringMessage)obj; return getSource().equals(sm.getSource()) && getContent().equals(sm.getContent()); } public String toString(){ return getSource() + ":" + getContent(); } } Ci-dessous un extrait de la classe TestPersistence, en une méthode de tests des deux modes de persistance, à lire attentivement avant de répondre à cette question. NFP121-examen-février-2014 6/15 public void testDeuxModes() throws Exception{ MailBox mb = new MailBox(); mb.add("a").add("b").add("c").add("d"); // 4 destinataires : a,b,c,d StringMessage msg1 = new StringMessage("s1"); msg1.setContent("mail_1"); mb.post(msg1,new String[]{"a","b","c"}); for(int i=1; i<3; i++){ StringMessage msg = new StringMessage("src"+i); msg.setContent("mail_src"+i); mb.post(msg,new String[]{"a","b","c","d"}); } mb.load("a"); // lecture des messages pour "a" PersistentMode pm = new SerializationMode(); pm.writeMailBox(mb,"mailbox.ser"); IMailBox mb1 = pm.readMailBox("mailbox.ser"); // // // // assertEquals(0, mb1.getAllMessages("a").size()); // assertEquals(3, mb1.getAllMessages("b").size()); // sérialisation java sauvegarde restitution vérification pas de messages non lus 3 messages non lus pm = new XMLMode(); // au format XML // sauvegarde, ci-dessous le contenu du fichier pm.writeMailBox(mb,"mailbox.xml"); mb1 = pm.readMailBox("mailbox.xml"); // restitution // vérification assertEquals(0, mb1.load("a").size()); assertEquals(3, mb1.load("b").size()); assertEquals(3, mb1.load("c").size()); assertEquals(2, mb1.load("d").size()); List<IMessage> messages = mb.getAllMessages("d"); messages.removeAll(mb.getReadMessages("d")); assertEquals(2, messages.size()); // 2 messages non lus pour "d" } Le contenu du fichier XML, nommé "mailbox.xml", issu de l'exécution de la méthode de tests est présenté cidessous. Ce fichier respecte une DTD non présentée ici. <?xml version="1.0" encoding="UTF-8"?> <mailbox> <destinataire nom="a" > </destinataire> <destinataire nom="b" > <message class_msg="question3.StringMessage" </message> <message class_msg="question3.StringMessage" </message> <message class_msg="question3.StringMessage" </message> </destinataire> <destinataire nom="c" > <message class_msg="question3.StringMessage" </message> <message class_msg="question3.StringMessage" </message> <message class_msg="question3.StringMessage" </message> </destinataire> <destinataire nom="d" > <message class_msg="question3.StringMessage" </message> <message class_msg="question3.StringMessage" </message> </destinataire> source="s1" content="mail_1" class_content="java.lang.String"> source="src1" content="mail_src1" class_content="java.lang.String"> source="src2" content="mail_src2" class_content="java.lang.String"> source="s1" content="mail_1" class_content="java.lang.String"> source="src1" content="mail_src1" class_content="java.lang.String"> source="src2" content="mail_src2" class_content="java.lang.String"> source="src1" content="mail_src1" class_content="java.lang.String"> source="src2" content="mail_src2" class_content="java.lang.String"> </mailbox> Les attributs de la balise <message> permettent d'identifier le type des messages et leur contenu, les classes des messages possibles (attribut class_msg) possèdent toutes un constructeur d'arité une (un seul paramètre), ce paramètre est de type String et représente la source du message (attribut source). Les contenus des messages sont NFP121-examen-février-2014 7/15 de type String (attribut content), notez que l'attribut class_content est installé afin de permettre une évolution future vers d'autres types de contenus de message, ici il sera toujours de type String. Sur ce fichier XML engendré par l'exécution de la méthode de tests unitaires, soit une persistance de la boite aux lettres par la sauvegarde des messages non lus, nous indique que : - Le destinataire "a" n'a plus de messages non lus, - Le destinataire "b" a trois messages non lus, - Les émetteurs sont respectivement "s1","src1", "src2", - Les contenus des messages sont de type String ("mail-1","mail_src1","mail_src2"), - Et cetera ... Question 3.1) Ecrivez complètement la classe SerializationMode Question 3.2) Ecrivez uniquement la méthode de restitution d'une boîte aux lettres, soit en complétant la méthode readMailBox de la classe XMLMode ci-dessous: public class XMLMode extends PersistentMode{ public void writeMailBox(IMailBox mb, String fileName) throws Exception{ // n'est pas demandée ... } public IMailBox readMailBox(String fileName) throws Exception{ // à compléter pour cette question } Question4: Une interface graphique Une interface graphique en Swing a été développée dans le but de "tester" une instance de boîte aux lettres et sa persistance. Deux tests sont proposés: Test de l'envoi de messages : L'utilisateur/testeur entre un contenu de message, un nom de destinataire et au clic sur le bouton « envoyer », le message est posté, la fenêtre de résultat est réactualisée par l'affichage de cette boîte aux lettres au format XML. Test de la réception: L'utilisateur/testeur clique sur le bouton « relever » alors la liste des messages reçus pour ce destinataire sont relevés et affichés dans la fenêtre de résultat, suivie de la boîte aux lettres sauvegardée au format XML. Les exceptions levées sont affichées dans la fenêtre résultante (usage de getMessage(), issue de la classe Exception) Ci-dessous, un exemple d'affichage, après l'envoi du message "examen NFP121" aux 3 destinataires "a","b","c" suivi du message "question4" aux destinataires "a" et "c". Les messages sont de type question4.StringMessage, classe à l'identique de StringMessage de la question3. NFP121-examen-février-2014 8/15 Ci-dessous, un autre exemple d'affichage, après la relève des messages de "a", ici la liste contient les deux messages envoyés, confer ci-dessous à la première ligne [IHM:examen NFP121, IHM:question4]. Au format XML la boîte aux lettres sauvegardées puis restituée. Ci-dessous, à nouveau un exemple d'affichage, après une nouvelle relève des messages de "a", la liste résultante est vide (il n'y a pas eu de messages reçus entre temps). Ci-dessous une exception est affichée, le destinataire nommé « f » n’est pas encore inscrit … NFP121-examen-février-2014 9/15 L'interface graphique, les déclarations des composants graphiques, sont ci-dessous: public class IHM extends JFrame { private private private private private JTextArea JTextField JButton JTextField JButton resultat = new JTextArea("", 7,60); message = new JTextField(" un message...",24); envoi = new JButton("envoyer"); destinataire = new JTextField("a",4); relève = new JButton("relever"); private IMailBox mb; private PersistentMode persistent; public IHM() { this.setTitle("IHM de test MailBox"); this.mb = new MailBox(); this.persistent = new XMLMode(); Container container = this.getContentPane(); container.setLayout(new BorderLayout()); container.add(resultat, BorderLayout.NORTH); JPanel panel = new JPanel(); panel.setLayout(new FlowLayout()); panel.add(new JLabel("message:")); panel.add(message); panel.add(envoi); panel.add(new JLabel("destinataire:")); panel.add(destinataire); panel.add(relève); container.add(panel, BorderLayout.SOUTH); this.envoi.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent ae) { / * à compléter en question4.1 */ IHM.this.pack(); } }); this.relève.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent ae) { / * à compléter en question4.2 */ IHM.this.pack(); } }); this.pack(); this.setVisible(true); } public static void main() { new IHM(); } // extrait de : // http://stackoverflow.com/questions/326390/how-to-create-a-java-string-from-the-contents-of-a-file private static String readFile(String fileName) throws Exception{ return new Scanner( new File(fileName) ).useDelimiter("\\A").next(); } } Question4-1) Proposer le comportement de cette interface au clic sur le bouton . Question4-2) Proposer le comportement de cette interface au clic sur le bouton NFP121-examen-février-2014 . 10/15 Nota bene : Une idée de la solution sera en ligne à cette URL : http://jfod.cnam.fr/NFP121/annales/2014_fevrier/ Annexes ava.util Interface Collection<E> public interface Collection<E> extends Iterable<E> Method Summary boolean add(E e) Ensures that this collection contains the specified element (optional operation). boolean addAll(Collection<? extends E> c) Adds all of the elements in the specified collection to this collection (optional operation). void clear() Removes all of the elements from this collection (optional operation). boolean contains(Object o) Returns true if this collection contains the specified element. boolean containsAll(Collection<?> c) Returns true if this collection contains all of the elements in the specified collection. boolean equals(Object o) Compares the specified object with this collection for equality. int hashCode() Returns the hash code value for this collection. boolean isEmpty() Returns true if this collection contains no elements. Iterator<E> iterator() Returns an iterator over the elements in this collection. boolean remove(Object o) Removes a single instance of the specified element from this collection, if it is present (optional operation). boolean removeAll(Collection<?> c) Removes all of this collection's elements that are also contained in the specified collection (optional operation). boolean retainAll(Collection<?> c) Retains only the elements in this collection that are contained in the specified collection (optional operation). int size() Returns the number of elements in this collection. Object[] toArray() Returns an array containing all of the elements in this collection. <T> T[] toArray(T[] a) Returns an array containing all of the elements in this collection; the runtime type of the returned array is that of the specified array. java.util interface List<E> partielle NFP121-examen-février-2014 11/15 All Superinterfaces: Collection<E>, Iterable<E> All Known Implementing Classes: LinkedList, … ArrayList, Vector public interface List<E> extends Collection<E> Method Summary boolean add(E e) Appends the specified element to the end of this list (optional operation). void clear() Removes all of the elements from this list (optional operation). boolean contains(Object o) Returns true if this list contains the specified element. boolean isEmpty() Returns true if this list contains no elements. E get(int index) Returns the element at the specified position in this list. Iterator<E> iterator() Returns an iterator over the elements in this list in proper sequence. boolean remove(Object o) Removes the first occurrence of the specified element from this list, if it is present (optional operation). int size() Returns the number of elements in this list. java.util. Interface Map<K,V> partielle See Also: HashMap, TreeMap, Hashtable Nested Class Summary static interface Map.Entry<K,V> A map entry (key-value pair). Method Summary void clear() Removes all mappings from this map (optional operation). boolean containsKey(Object key) Returns true if this map contains a mapping for the specified key. boolean containsValue(Object value) Returns true if this map maps one or more keys to the specified value. Set<Map.Entry<K,V>> entrySet() Returns a set view of the mappings contained in this map. boolean equals(Object o) Compares the specified object with this map for equality. V get(Object key) Returns the value to which this map maps the specified key. int hashCode() Returns the hash code value for this map. NFP121-examen-février-2014 12/15 boolean isEmpty() Returns true if this map contains no key-value mappings. Set<K> keySet() Returns a set view of the keys contained in this map. V put(K key, V value) Associates the specified value with the specified key in this map (optional operation). void putAll(Map<? extends K,? extends V> t) Copies all of the mappings from the specified map to this map (optional operation). V remove(Object key) Removes the mapping for this key from this map if it is present (optional operation). int size() Returns the number of key-value mappings in this map. Collection<V> values() Returns a collection view of the values contained in this map. java.lang Class String Constructor Summary String() Initializes a newly created String object so that it represents an empty character sequence. String(String original) Initializes a newly created String object so that it represents the same sequence of characters as the argument; in other words, the newly created string is a copy of the argument string. java.io Class ObjectOutputStream Constructor Summary ObjectOutputStream(OutputStream out) Creates an ObjectOutputStream that writes to the specified OutputStream. Method Summary void writeObject(Object obj) Write the specified object to the ObjectOutputStream. java.io Class ObjectInputStream Constructor Summary ObjectInputStream(InputStream out) Method Summary Object readObject(Object obj) org.xml.sax.helpers Class XMLReaderFactory java.lang.Object org.xml.sax.helpers.XMLReaderFactory NFP121-examen-février-2014 13/15 This class contains static methods for creating an XML reader from an explicit class name, or based on runtime defaults: try { XMLReader myReader = XMLReaderFactory.createXMLReader(); } catch (SAXException e) { System.err.println(e.getMessage()); } org.xml.sax Interface XMLReader Method Summary ContentHandler getContentHandler() Return the current content handler. void setContentHandler(ContentHandler handler) Allow an application to register a content event handler. org.xml.sax.helpers Class DefaultHandler Constructor Summary DefaultHandler() Method Summary void characters(char[] ch, int start, int length) Receive notification of character data inside an element. void startElement(String uri, String localName, String qName, Attributes attributes) Receive notification of the start of an element. void endElement(String uri, String localName, String qName) Receive notification of the end of an element. org.xml.sax Interface Attributes Method Summary String getLocalName(int index) Look up an attribute's local name by index. String getValue(int index) Look up an attribute's value by index. int getLength() Return the number of attributes in the list. NFP121-examen-février-2014 14/15 Numéro de copie: import java.util.*; public class MailBox implements IMailBox{ public MailBox(){ public IMailBox add(String dest) throws Exception{ public IMailBox post(IMessage message, String dest) throws Exception{ public IMailBox post(IMessage message, String[] destinataires) throws Exception{ public List<IMessage> load(String dest) throws Exception{ public Iterator<String> iterator(){ public List<IMessage> getAllMessages(String destinataire) throws Exception { public List<IMessage> getReadMessages(String destinataire) throws Exception { NFP121-examen-février-2014 15/15