123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209 |
- package app.insa.clav.Core;
-
- import app.insa.clav.Messages.Message;
- import app.insa.clav.Messages.MessagePseudo;
- import app.insa.clav.Utils.TimerTaskResponseWait;
- import app.insa.clav.reseau.UDPInput;
- import app.insa.clav.reseau.UDPOutput;
-
- import java.beans.PropertyChangeEvent;
- import java.beans.PropertyChangeListener;
- import java.beans.PropertyChangeSupport;
- import java.io.IOException;
- import java.util.ArrayList;
- import java.net.*;
- import java.util.Timer;
- //Toutes les interactions avec l'utilisateur (pour tester)
-
- /**
- * Notre application principale. Une seule instance. représente le modèle du MVC
- */
- public class Model implements PropertyChangeListener{
-
- /**
- * Liste des utilisateurs connectés.
- */
- private ArrayList<Utilisateurs> userList;
- /**
- * Timer qui permet de planifier des éxécutions dans le temps
- */
- private Timer tim;
-
- /**
- * Notre interface UDP pour envoyer des messages
- */
- private UDPOutput UDPOut;
- /**
- * Interface UDP qui notifie quand un message est envoyé (observable)
- */
- private UDPInput UDPIn;
- /**
- * Infos sur notre utilisateur local
- */
- private Utilisateurs user;
- /**
- * Sert à stocker le pseudo de base quand on veut change de pseudo. Si la demande de pseudo est refusée, on revient à ce pseudo
- */
- private String ancienPseudo = "";
-
- /**
- * Observable, pour envoyer des notifications aux controleurs
- */
- private PropertyChangeSupport support;
-
- /**
- * Constructeur
- * @param id
- * Id de l'utilisateur (unique dans toutes les machines)
- * @param inputPort
- * Port d'input UDP
- * @param outputPort
- * Port d'Output UDP
- */
- /*
- ID 1 -> Listening on 6000, sending on 5000
- ID 2 -> Listening on 6001, sending on 5001
- ID 2 -> Listening on 6002, sending on 5002
- */
- public Model(int id, int inputPort, int outputPort){
- try {
- this.user = new Utilisateurs("NA", InetAddress.getLocalHost(), id, inputPort);
- this.UDPOut = new UDPOutput(InetAddress.getLocalHost(), outputPort);
- this.UDPIn = new UDPInput(user.getInetAddress(),inputPort);
- this.tim= new Timer();
- this.support = new PropertyChangeSupport(this);
- }
- catch (IOException e){
- System.out.println("IOException dans la creation de l'utilisateur local");
- e.printStackTrace();
- }
- this.userList = new ArrayList<Utilisateurs>();
- }
-
- /**
- * Ouvre le thread d'écoute en UDP et ajoute l'application en observateur de ce thread
- */
- public void openInputUDP(){
- UDPIn.start();
- this.UDPIn.addPropertyChangeListener(this);
- }
-
- /**
- * Ajout un listener avec un nom de propriété.
- *
- * Liste des propriete :
- *
- * "pseudoRefused" -> Demande de nouveau pseudo refusée
- * "userListUpdated" -> La liste des utilisateurs connectés à changé
- * "pseudoAccepted" -> nouveau pseudo accepte
- *
- *
- * @param pcl
- * Listener du controller qui a appelé la methode
- * @param propertyName
- */
- public void addPropertyChangeListener(PropertyChangeListener pcl, String propertyName){
- this.support.addPropertyChangeListener(propertyName, pcl);
- }
-
- /**
- * Envoi un messagePseudo de type 1 aux 3 machines de test
- */
- public void sendPseudoBroadcast(){
- try {
- if (user.getId() == 1 || user.getId() == 2) {
- MessagePseudo msg = new MessagePseudo(1, this.user.getInetAddress(), this.user.getPort(), InetAddress.getLocalHost(), 6002, this.user.getPseudo(),this.user.getId());
- UDPOut.sendMsg(msg);
- }
- if (user.getId() == 2 || user.getId() == 3) {
- MessagePseudo msg = new MessagePseudo(1, this.user.getInetAddress(), this.user.getPort(), InetAddress.getLocalHost(), 6000, this.user.getPseudo(),this.user.getId());
- UDPOut.sendMsg(msg);
- }
- if (user.getId() == 1 || user.getId() == 3) {
- MessagePseudo msg = new MessagePseudo(1, this.user.getInetAddress(), this.user.getPort(), InetAddress.getLocalHost(), 6001,this.user.getPseudo(),this.user.getId());
- UDPOut.sendMsg(msg);
- }
- }
- catch (UnknownHostException e){
- System.out.println(("exception Trouver host dans sendPseudoBroadcast"));
- e.printStackTrace();
- }
- }
-
- /**
- * Méthode appelée par le controleur quand la vue envoie un signal d'appuis bouton changer Pseudo
- * @param pseudo
- * Pseudo rentré par l'utilisateur
- * @return
- */
- public boolean choosePseudo(String pseudo){
- this.ancienPseudo = this.user.getPseudo();
- this.user.setPseudo(pseudo);
- this.UDPIn.setFilterValue(2,true);
- this.UDPIn.setFilterValue(3,true);
- this.sendPseudoBroadcast();
- this.tim.schedule(new TimerTaskResponseWait(this.UDPIn),1000);
- return true;
- }
-
- /**
- * Handler de notification (Obsevateur) pour le thread UDP.
- * @param evt
- * Evenement qui est envoyé avec la notification
- */
- public void propertyChange(PropertyChangeEvent evt){
- switch (evt.getPropertyName()){
- case "UDPInput":
- Message msgReceived = UDPIn.getMessageReceived();
- this.messageHandler(msgReceived);
- }
- }
-
- /**
- * Permet de faire les actions adéquates selon le type de message reçu. Appelé dans propertyChange
- * @param msg
- * message à analyser
- */
- public void messageHandler(Message msg){
- switch (msg.typeMessage){
- case 1 :
- MessagePseudo msgP1 = (MessagePseudo) msg;
- this.handleType1Message(msgP1);
- break;
- case 2 :
- MessagePseudo msgP2 = (MessagePseudo) msg;
- Utilisateurs newUser2 = new Utilisateurs(msgP2.pseudo,msgP2.srcIP,msgP2.id,msgP2.srcResponsePort);
- if (!this.userList.contains(newUser2)) {
- this.userList.add(newUser2);
- }
- break;
- case 3 :
- MessagePseudo msgP3 = (MessagePseudo) msg;
- Utilisateurs newUser3 = new Utilisateurs(msgP3.pseudo,msgP3.srcIP,msgP3.id,msgP3.srcResponsePort);
- if (!this.userList.contains(newUser3)) {
- this.userList.add(newUser3);
- }
- this.support.firePropertyChange("pseudoRefused",this.user.getPseudo(),this.ancienPseudo);
- this.user.setPseudo(this.ancienPseudo);
- break;
- default :
- System.out.println("Message de type inconnu");
- }
- }
-
- /**
- * Méthode appelée dans messageHandler pour répondre à un message de type 1
- * @param msg
- * Message à analyser
- */
- private void handleType1Message(MessagePseudo msg){
- MessagePseudo msgResponse;
- if (this.user.getPseudo().equals(msg.pseudo)){
- msgResponse = new MessagePseudo(3, this.user.getInetAddress(), this.user.getPort(), msg.srcIP, msg.srcResponsePort,this.user.getPseudo(),this.user.getId());
- }
- else{
- msgResponse = new MessagePseudo(2, this.user.getInetAddress(), this.user.getPort(), msg.srcIP, msg.srcResponsePort,this.user.getPseudo(),this.user.getId());
- }
- this.UDPOut.sendMsg(msgResponse);
- }
- }
|