Examen de programmation en Java Vendredi 13 janvier 2006 Nom : Prénom : Les différentes parties sont indépendantes. Vous pouvez faire la partie consacrée aux évenements même si vous n’avez pas fait la construction de l’interface graphique, de même pour la partie réseau. Documents authorisés : polycopiés de cours, TD, TP et corrections de TP. Résumé Le but de ce contrôle est la réalisation d’un client mail simple 1 Interfaces graphiques 1.1 Résultat voulu Le resultat final est présenté dans les figures 1 et 2 (en fin de document). 1.2 Panneau d’envoi de mail Le panneau d’envoi de mail doit avoir l’aspect présenté en figure 3. Complétez le code ci-dessous pour obtenir ce résultat (il n’est pas nécessaire de créer une fenêtre puisque ce panneau sera placé dans un panneau à onglets). import java.awt.*; import java.util.Date; import javax.swing.*; public class PanneauNouveauMessage extends JPanel { protected protected protected protected JPanel pChamps; JPanel pBoutons; JLabel lDe, lPour, lDate, lSujet; JTextField tfPour, tfSujet; 1 protected JTextArea taMessage; protected JButton bEnvoyer, bAnnuler; private ApplicationMail amParent; public PanneauNouveauMessage(ApplicationMail parent){ super(); amParent = parent; lDate = new JLabel(new Date().toString()); taMessage.setBorder( BorderFactory.createTitledBorder("Corps du message")); pChamps = new JPanel(); pChamps.setLayout(new GridBagLayout()); GridBagConstraints gb = new GridBagConstraints(); 2 pBoutons = new JPanel(); pBoutons.setLayout(new GridLayout(0,2)); 3 this.setLayout(new BorderLayout()); } } 1.3 Panneau de lecture des mails Le panneau de lecture des mails doit avoir l’aspect présenté en figure 4. Les labels lXXValeur sont vides pour l’instant mais ils doivent quand même être mis en place. L’objet bmListeMessages stocke les messages sous la forme d’un tableau accessible par la méthode getMails. Complétez le code ci-dessous pour obtenir ce résultat (il n’est pas nécessaire de créer une fenêtre puisque ce panneau sera placé dans un panneau à onglets). import java.awt.*; import javax.swing.*; public class PanneauMessagesRecus extends JSplitPane { protected JScrollPane spPanneauScroll, spMessages; protected JPanel pMessage; protected JTextArea taCorpsMessage; protected JLabel lDe, lPour, lDate, lSujet; protected JLabel lDeValeur, lPourValeur, lDateValeur, lSujetValeur; protected JList lMessages; protected BoiteMail bmListeMessages; private ApplicationMail amParent; 4 public PanneauMessagesRecus(ApplicationMail parent){ super(); amParent = parent; lDeValeur = new JLabel(); lPourValeur = new JLabel(); lDateValeur = new JLabel(); lSujetValeur = new JLabel(); pMessage = new JPanel(); 5 pMessage.setLayout(new GridBagLayout()); GridBagConstraints gb = new GridBagConstraints(); bmListeMessages = new BoiteMail(); bmListeMessages.ajouteMail(new Message("bob@mail. com", "[email protected]", "12/12/2003", "Nothing", " Bonjour \n Comment vas-tu ? \n Bob")); bmListeMessages.ajouteMail(new Message("bill@mail. com", "[email protected]", "31/12/2005", "Happy new year", "Hi \n Happy new year 2006 \n Bill")); lMessages = new JList(bmListeMessages.getMails()); spMessages = new JScrollPane(lMessages); 6 this.setOrientation(JSplitPane.VERTICAL_SPLIT); this.setTopComponent( ); this.setBottomComponent( ); } } 1.4 Application complète Les deux panneaux étant crées, complétez le code ci-dessous pour obtenir l’affichage des figures 1 et 2. import javax.swing.*; public class ApplicationMail extends JTabbedPane { protected PanneauNouveauMessage pnm; protected PanneauMessagesRecus pmr; public ApplicationMail(){ super(); pnm = new PanneauNouveauMessage(this); pmr = new PanneauMessagesRecus(this); this.addTab( this.addTab( , , } public static void main(String[] args) { JFrame fen = new JFrame(); fen.setContentPane( ); fen.setTitle("Client mail"); } } 7 ); ); 2 Gestion des évènements 2.1 Les classes Message et Boite Les mails sont représentés par des objets de la classe Message : public class Message { private private private private private String String String String String de; pour; date; sujet; corps; public Message(String sDe, String sPour, String sDate, String sSujet, String sCorps) { de = sDe; pour = sPour; date = sDate; sujet = sSujet; corps = sCorps; } public String getCorps() { return corps; } public String getDate() { return date; } public String getDe() { return de; } public String getPour() { return pour; } public String getSujet() { return sujet; } public void SendMail(){ // Partie qui envoie le mail } public String toString() { return ("De : " + de + " le : " + date); } } Dans le panneau de lecture des mails on trouve un objet de la classe Boite (objet bmListeMessages) qui permet de stocker plusieurs messages : import java.util.*; 8 public class BoiteMail { private ArrayList mails; public BoiteMail(){ mails = new ArrayList(); } public Object[] getMails() { return mails.toArray(); } public void ajouteMail(Message m){ if (!mails.contains(m)){ mails.add(m); } } } 2.2 Panneau d’envoi de mail Vous devez implémenter les gestionnaires d’évènements pour les deux boutons. Pour le bouton ”Annuler”, les différents champs composant le message doivent être effacés. Pour le bouton ”Envoyer”, vous devez construire un objet de type Message à partir des différents champs utiles. L’expediteur est : [email protected]. Ensuite, vous utilisez la méthode SendMail de la classe Message pour envoyer le message. Après l’envoi du message, une boite de dialogue doit apparaitre pour prévenir l’utilisateur que le message a bien été envoyé. Complétez le code ci-dessous pour obtenir les comportement voulus : import java.awt.*; import java.util.Date; import javax.swing.*; public class PanneauNouveauMessage extends JPanel { // ... public PanneauNouveauMessage(ApplicationMail parent){ super(); amParent = parent; // Construction de l’interface graphique // ... // Gestion des évènements bEnvoyer.addActionListener( ); bAnnuler.addActionListener( ); } private class ActionEnvoyer implements ActionListener{ public void actionPerformed(ActionEvent e) { 9 } } private class ActionAnnuler implements ActionListener{ public void actionPerformed(ActionEvent e) { } } } 2.3 Panneau de lecture des messages Dans le panneau de lecture des messages deux composants vont gérer des évènements. Lorsqu’un message est sélectionné dans la liste des messages, les différents éléments le composant doivent être affichés dans les éléments lDeValeur, lPourValeur, lDateValeur, lSujetValeur et taCorpsMessage. Quand l’utilisateur clique sur le corps du message le panneau d’envoi de message doit s’afficher pour rédiger une réponse. Le sujet du nouveau message est le sujet du message sélectionné précédé de ”Re : ”, la date est la date actuelle, le destinataire et l’expéditeur sont inversés. Le corps du message reprend le corps du message sélectionné précédé de ”–Début du message original–” et suivit de ”–Fin du 10 message original–” (l’utilisateur pourra saisir son texte avant ou après le message originale, ne vous en occupez pas !). Complétez les extraits de code proposés ci-dessous pour obtenir ces fonctionnalités : import java.awt.*; import javax.swing.*; public class PanneauMessagesRecus extends JSplitPane { // ... public PanneauMessagesRecus(ApplicationMail parent){ super(); amParent = parent; // Construction de l’interface graphique // ... // Gestion des évènements lMessages.addListSelectionListener( ); taCorpsMessage.addMouseListener( ); } public class auditeurList implements ListSelectionListener{ public void valueChanged(ListSelectionEvent e) { } } public class auditeurCorpsMessage implements MouseListener{ public void mouseClicked(MouseEvent e) { 11 } public public public public void void void void mousePressed(MouseEvent e) {} mouseReleased(MouseEvent e) {} mouseEntered(MouseEvent e) {} mouseExited(MouseEvent e) {} } } 3 Programmation réseau 3.1 Le protocole SMTP Le protocole SMTP est un protocole qui permet d’envoyer des mails. Après connexion à un serveur de mails, on doit utiliser plusieurs commandes pour envoyer un mail. Le principe d’envoi/réception des commandes est le même que pour le protocole HTTP vu en TP. – Envoyer HELO suivi d’un nom de domaine serveur.fr par exemple : HELO serveur.fr – Envoyer MAIL FROM : suivi de l’adresse mail de l’expéditeur entre < et > : MAIL FROM : <[email protected]> – Envoyer RCPT TO : suivi du mail du destinataire compris entre < et > : RCPT TO : <[email protected]> – Envoyer DATA pour envoyer le corps du message. Le corps du message reprend les adresses du destinataire et de l’expéditeur ainsi que le sujet du message. Après ces quatre champs, on ajoute une ligne blanche. Le corps du message est alors envoyé terminé par une ligne ne comportant qu’un seul point : DATA from : <[email protected]> to : <[email protected]> subject : ”Test du protocole SMTP” Un exemple de mail pour tester le protocole SMPT 12 A bientot . – Terminer la session par l’envoi de la commande QUIT 3.2 Application à notre application Le serveur de mails est smtp.serveur.fr sur le port 25. Complétez la classe Message pour pouvoir envoyer un mail : public class Message { private String de; private String pour; private String date; private String sujet; private String corps; //... public void SendMail(){ } } Remarque : Si dans une application vous avez besoin d’envoyer un mail, il existe une classe ”toute prête” de Java pour ceci... 13 F IG . 1 – Application finale : reception des mails 14 F IG . 2 – Application finale : redaction des mails 15 F IG . 3 – Panneau d’envoi des mails 16 F IG . 4 – Panneau de lecture des mails 17