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