No Description
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

Model.java 7.4KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209
  1. package app.insa.clav.Core;
  2. import app.insa.clav.Messages.Message;
  3. import app.insa.clav.Messages.MessagePseudo;
  4. import app.insa.clav.Utils.TimerTaskResponseWait;
  5. import app.insa.clav.reseau.UDPInput;
  6. import app.insa.clav.reseau.UDPOutput;
  7. import java.beans.PropertyChangeEvent;
  8. import java.beans.PropertyChangeListener;
  9. import java.beans.PropertyChangeSupport;
  10. import java.io.IOException;
  11. import java.util.ArrayList;
  12. import java.net.*;
  13. import java.util.Timer;
  14. //Toutes les interactions avec l'utilisateur (pour tester)
  15. /**
  16. * Notre application principale. Une seule instance. représente le modèle du MVC
  17. */
  18. public class Model implements PropertyChangeListener{
  19. /**
  20. * Liste des utilisateurs connectés.
  21. */
  22. private ArrayList<Utilisateurs> userList;
  23. /**
  24. * Timer qui permet de planifier des éxécutions dans le temps
  25. */
  26. private Timer tim;
  27. /**
  28. * Notre interface UDP pour envoyer des messages
  29. */
  30. private UDPOutput UDPOut;
  31. /**
  32. * Interface UDP qui notifie quand un message est envoyé (observable)
  33. */
  34. private UDPInput UDPIn;
  35. /**
  36. * Infos sur notre utilisateur local
  37. */
  38. private Utilisateurs user;
  39. /**
  40. * Sert à stocker le pseudo de base quand on veut change de pseudo. Si la demande de pseudo est refusée, on revient à ce pseudo
  41. */
  42. private String ancienPseudo = "";
  43. /**
  44. * Observable, pour envoyer des notifications aux controleurs
  45. */
  46. private PropertyChangeSupport support;
  47. /**
  48. * Constructeur
  49. * @param id
  50. * Id de l'utilisateur (unique dans toutes les machines)
  51. * @param inputPort
  52. * Port d'input UDP
  53. * @param outputPort
  54. * Port d'Output UDP
  55. */
  56. /*
  57. ID 1 -> Listening on 6000, sending on 5000
  58. ID 2 -> Listening on 6001, sending on 5001
  59. ID 2 -> Listening on 6002, sending on 5002
  60. */
  61. public Model(int id, int inputPort, int outputPort){
  62. try {
  63. this.user = new Utilisateurs("NA", InetAddress.getLocalHost(), id, inputPort);
  64. this.UDPOut = new UDPOutput(InetAddress.getLocalHost(), outputPort);
  65. this.UDPIn = new UDPInput(user.getInetAddress(),inputPort);
  66. this.tim= new Timer();
  67. this.support = new PropertyChangeSupport(this);
  68. }
  69. catch (IOException e){
  70. System.out.println("IOException dans la creation de l'utilisateur local");
  71. e.printStackTrace();
  72. }
  73. this.userList = new ArrayList<Utilisateurs>();
  74. }
  75. /**
  76. * Ouvre le thread d'écoute en UDP et ajoute l'application en observateur de ce thread
  77. */
  78. public void openInputUDP(){
  79. UDPIn.start();
  80. this.UDPIn.addPropertyChangeListener(this);
  81. }
  82. /**
  83. * Ajout un listener avec un nom de propriété.
  84. *
  85. * Liste des propriete :
  86. *
  87. * "pseudoRefused" -> Demande de nouveau pseudo refusée
  88. * "userListUpdated" -> La liste des utilisateurs connectés à changé
  89. * "pseudoAccepted" -> nouveau pseudo accepte
  90. *
  91. *
  92. * @param pcl
  93. * Listener du controller qui a appelé la methode
  94. * @param propertyName
  95. */
  96. public void addPropertyChangeListener(PropertyChangeListener pcl, String propertyName){
  97. this.support.addPropertyChangeListener(propertyName, pcl);
  98. }
  99. /**
  100. * Envoi un messagePseudo de type 1 aux 3 machines de test
  101. */
  102. public void sendPseudoBroadcast(){
  103. try {
  104. if (user.getId() == 1 || user.getId() == 2) {
  105. MessagePseudo msg = new MessagePseudo(1, this.user.getInetAddress(), this.user.getPort(), InetAddress.getLocalHost(), 6002, this.user.getPseudo(),this.user.getId());
  106. UDPOut.sendMsg(msg);
  107. }
  108. if (user.getId() == 2 || user.getId() == 3) {
  109. MessagePseudo msg = new MessagePseudo(1, this.user.getInetAddress(), this.user.getPort(), InetAddress.getLocalHost(), 6000, this.user.getPseudo(),this.user.getId());
  110. UDPOut.sendMsg(msg);
  111. }
  112. if (user.getId() == 1 || user.getId() == 3) {
  113. MessagePseudo msg = new MessagePseudo(1, this.user.getInetAddress(), this.user.getPort(), InetAddress.getLocalHost(), 6001,this.user.getPseudo(),this.user.getId());
  114. UDPOut.sendMsg(msg);
  115. }
  116. }
  117. catch (UnknownHostException e){
  118. System.out.println(("exception Trouver host dans sendPseudoBroadcast"));
  119. e.printStackTrace();
  120. }
  121. }
  122. /**
  123. * Méthode appelée par le controleur quand la vue envoie un signal d'appuis bouton changer Pseudo
  124. * @param pseudo
  125. * Pseudo rentré par l'utilisateur
  126. * @return
  127. */
  128. public boolean choosePseudo(String pseudo){
  129. this.ancienPseudo = this.user.getPseudo();
  130. this.user.setPseudo(pseudo);
  131. this.UDPIn.setFilterValue(2,true);
  132. this.UDPIn.setFilterValue(3,true);
  133. this.sendPseudoBroadcast();
  134. this.tim.schedule(new TimerTaskResponseWait(this.UDPIn),1000);
  135. return true;
  136. }
  137. /**
  138. * Handler de notification (Obsevateur) pour le thread UDP.
  139. * @param evt
  140. * Evenement qui est envoyé avec la notification
  141. */
  142. public void propertyChange(PropertyChangeEvent evt){
  143. switch (evt.getPropertyName()){
  144. case "UDPInput":
  145. Message msgReceived = UDPIn.getMessageReceived();
  146. this.messageHandler(msgReceived);
  147. }
  148. }
  149. /**
  150. * Permet de faire les actions adéquates selon le type de message reçu. Appelé dans propertyChange
  151. * @param msg
  152. * message à analyser
  153. */
  154. public void messageHandler(Message msg){
  155. switch (msg.typeMessage){
  156. case 1 :
  157. MessagePseudo msgP1 = (MessagePseudo) msg;
  158. this.handleType1Message(msgP1);
  159. break;
  160. case 2 :
  161. MessagePseudo msgP2 = (MessagePseudo) msg;
  162. Utilisateurs newUser2 = new Utilisateurs(msgP2.pseudo,msgP2.srcIP,msgP2.id,msgP2.srcResponsePort);
  163. if (!this.userList.contains(newUser2)) {
  164. this.userList.add(newUser2);
  165. }
  166. break;
  167. case 3 :
  168. MessagePseudo msgP3 = (MessagePseudo) msg;
  169. Utilisateurs newUser3 = new Utilisateurs(msgP3.pseudo,msgP3.srcIP,msgP3.id,msgP3.srcResponsePort);
  170. if (!this.userList.contains(newUser3)) {
  171. this.userList.add(newUser3);
  172. }
  173. this.support.firePropertyChange("pseudoRefused",this.user.getPseudo(),this.ancienPseudo);
  174. this.user.setPseudo(this.ancienPseudo);
  175. break;
  176. default :
  177. System.out.println("Message de type inconnu");
  178. }
  179. }
  180. /**
  181. * Méthode appelée dans messageHandler pour répondre à un message de type 1
  182. * @param msg
  183. * Message à analyser
  184. */
  185. private void handleType1Message(MessagePseudo msg){
  186. MessagePseudo msgResponse;
  187. if (this.user.getPseudo().equals(msg.pseudo)){
  188. msgResponse = new MessagePseudo(3, this.user.getInetAddress(), this.user.getPort(), msg.srcIP, msg.srcResponsePort,this.user.getPseudo(),this.user.getId());
  189. }
  190. else{
  191. msgResponse = new MessagePseudo(2, this.user.getInetAddress(), this.user.getPort(), msg.srcIP, msg.srcResponsePort,this.user.getPseudo(),this.user.getId());
  192. }
  193. this.UDPOut.sendMsg(msgResponse);
  194. }
  195. }