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 27KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719
  1. package app.insa.clav.Core;
  2. import app.insa.clav.Messages.Message;
  3. import app.insa.clav.Messages.MessageInit;
  4. import app.insa.clav.Messages.MessagePseudo;
  5. import app.insa.clav.Reseau.*;
  6. import javafx.application.Application;
  7. import javafx.application.Platform;
  8. import java.beans.PropertyChangeEvent;
  9. import java.beans.PropertyChangeListener;
  10. import java.beans.PropertyChangeSupport;
  11. import java.io.IOException;
  12. import java.nio.charset.StandardCharsets;
  13. import java.util.*;
  14. import java.net.*;
  15. //Toutes les interactions avec l'utilisateur (pour tester)
  16. /**
  17. * Notre application principale. Une seule instance. représente le modèle du MVC
  18. */
  19. public class Model implements PropertyChangeListener{
  20. /**
  21. * Liste des utilisateurs connectés.
  22. */
  23. private List<Utilisateurs> userList;
  24. private ServletConnection servCon;
  25. /**
  26. * Timer qui permet de planifier des éxécutions dans le temps
  27. */
  28. private Timer tim;
  29. private Timer tim2s;
  30. /**
  31. * Notre interface UDP pour envoyer des messages
  32. */
  33. private UDPOutput UDPOut;
  34. /**
  35. * Interface UDP qui notifie quand un message est envoyé (observable)
  36. */
  37. private UDPInput UDPIn;
  38. /**
  39. * Infos sur notre utilisateur local
  40. */
  41. public Utilisateurs user;
  42. /**
  43. * Sert à stocker le pseudo de base quand on veut change de pseudo. Si la demande de pseudo est refusée, on revient à ce pseudo
  44. */
  45. private String ancienPseudo = "";
  46. /**
  47. * Observable, pour envoyer des notifications aux controleurs
  48. */
  49. private PropertyChangeSupport support;
  50. /**
  51. * Instance of the Model (Singleton Design Pattern)
  52. */
  53. private static Model instance = null;
  54. /**
  55. * Vrai si pseudo ok, faux sinon
  56. */
  57. private boolean isPseudoOk = true;
  58. /**
  59. * List of all TCPChatConnextions that are used
  60. */
  61. private ArrayList<TCPChatConnection> listTCPConnection;
  62. /**
  63. * Instance of TCPListener to listen for chat oppening demands
  64. */
  65. private TCPListener tcpListener;
  66. private DataBaseAccess dbAccess;
  67. private String addrBroadcast;
  68. private int portListening;
  69. private Application app;
  70. public Model(String addrBroadcast, int portListening, Application app, String addrBdd, String userBdd, String mdpBdd, String nomBdd, String urlServeur) {
  71. this.addrBroadcast = addrBroadcast;
  72. this.portListening = portListening;
  73. try {
  74. this.user = new Utilisateurs("NA", InetAddress.getLocalHost(), 0, 0);
  75. this.tcpListener = new TCPListener(user.getId());
  76. this.user.setTcpListeningPort(this.tcpListener.getPort());
  77. this.tim= new Timer();
  78. this.tim2s= new Timer();
  79. this.support = new PropertyChangeSupport(this);
  80. }
  81. catch (IOException e){
  82. System.out.println("IOException dans la creation du modele");
  83. e.printStackTrace();
  84. }
  85. this.userList = Collections.synchronizedList(new ArrayList<>());
  86. this.listTCPConnection = new ArrayList<TCPChatConnection>();
  87. this.dbAccess = DataBaseAccess.getInstance(addrBdd, userBdd, mdpBdd, nomBdd);
  88. this.app = app;
  89. this.servCon = ServletConnection.getInstance(urlServeur);
  90. }
  91. public void configModelIndoor(){
  92. try {
  93. boolean founded = false;
  94. InetAddress addrBcst = InetAddress.getByName(this.addrBroadcast);
  95. InetAddress addrLocal = null;
  96. final Enumeration<NetworkInterface> interfaces = NetworkInterface.getNetworkInterfaces();
  97. while (interfaces.hasMoreElements() && !founded) {
  98. NetworkInterface networkInterface = interfaces.nextElement();
  99. if (!networkInterface.isLoopback() && networkInterface.isUp()) {
  100. List<InterfaceAddress> addressesInterface = networkInterface.getInterfaceAddresses();
  101. //System.out.println(addressesInterface.toString());
  102. Iterator<InterfaceAddress> addressesInterfaceIterator = addressesInterface.iterator();
  103. while (addressesInterfaceIterator.hasNext()) {
  104. InterfaceAddress addresseInterface = addressesInterfaceIterator.next();
  105. if (addresseInterface.getBroadcast() != null && addresseInterface.getBroadcast().equals(addrBcst)) {
  106. founded = true;
  107. addrLocal = addresseInterface.getAddress();
  108. }
  109. }
  110. }
  111. }
  112. //System.out.println("Addresse de broadcast : " + addrBcst.toString() + "\nAddresse de l'utilisateur local : " + addrLocal.toString());
  113. this.user.setOutdoor(false);
  114. this.user.setInetAddress(addrLocal);
  115. this.tcpListener = new TCPListener(this.user.getInetAddress(), user.getId());
  116. this.user.setTcpListeningPort(this.tcpListener.getPort());
  117. this.UDPOut = new UDPOutput(addrBcst, this.user.getInetAddress(), this.portListening);
  118. this.UDPIn = new UDPInput(this.portListening);
  119. }
  120. catch (IOException e){
  121. System.out.println("IOException dans la creation du modele");
  122. e.printStackTrace();
  123. }
  124. this.openInputUDP();
  125. this.openTCPListener();
  126. }
  127. /**
  128. * @param addrBroadcast
  129. * adresse de broadcast du réseau
  130. * @param portListening
  131. * port d'ecoute UDP
  132. * @param app
  133. * L'application elle meme
  134. * @param addrBdd
  135. * L'adresse de la base de donnee
  136. * @param userBdd
  137. * L'utilisateur de la BDD
  138. * @param mdpBdd
  139. * Le mot de passe qui lui est associé
  140. * @return
  141. */
  142. public static Model getInstance(String addrBroadcast, int portListening, Application app, String addrBdd, String userBdd, String mdpBdd, String nomBdd, String urlServeur){
  143. synchronized(Model.class){
  144. if (instance == null) {
  145. instance = new Model(addrBroadcast, portListening, app, addrBdd, userBdd, mdpBdd, nomBdd, urlServeur);
  146. }
  147. }
  148. return instance;
  149. }
  150. /**
  151. * getInstance, but no parameters (dont crete if not existing
  152. * @return instance of Model
  153. */
  154. public static Model getInstance(){
  155. if (instance == null) {
  156. System.out.println("ATTENTION : getInstance null renvoyé");
  157. }
  158. return instance;
  159. }
  160. /**
  161. * Ouvre le thread d'écoute en UDP et ajoute l'application en observateur de ce thread
  162. */
  163. public void openInputUDP(){
  164. UDPIn.start();
  165. this.UDPIn.addPropertyChangeListener(this);
  166. }
  167. public void openTCPListener(){
  168. tcpListener.start();
  169. this.tcpListener.addPropertyChangeListener(this);
  170. }
  171. /**
  172. * permet de sauvegarder un socket TCP clanvardage qui vient d'être créé
  173. * @param co
  174. */
  175. public void addTCPConnexion(TCPChatConnection co){
  176. this.listTCPConnection.add(co);
  177. co.addPropertyChangeListener(this);
  178. }
  179. /**
  180. * Ajout un listener avec un nom de propriété.
  181. *
  182. * Liste des propriete :
  183. *
  184. * "pseudoRefused" -> Demande de nouveau pseudo refusée
  185. * "userListUpdated" -> La liste des utilisateurs connectés à changé
  186. * "pseudoAccepted" -> nouveau pseudo accepte
  187. *
  188. *
  189. * @param pcl
  190. * Listener du controller qui a appelé la methode
  191. * @param propertyName
  192. */
  193. public void addPropertyChangeListener(PropertyChangeListener pcl, String propertyName){
  194. this.support.addPropertyChangeListener(propertyName, pcl);
  195. }
  196. public void deletePropertyChangeListener(PropertyChangeListener pcl, String propertyName){
  197. this.support.removePropertyChangeListener(propertyName,pcl);
  198. }
  199. /**
  200. * Envoi un messagePseudo de type 1
  201. */
  202. public void sendPseudoBroadcast(){
  203. //System.out.println("Demande de validaton du pseudo : " + this.user.getPseudo());
  204. MessagePseudo msg = new MessagePseudo(1, this.user.getInetAddress(), this.user.getPseudo(), 0, this.user.getId());
  205. //System.out.println("Message envoyé : " + msg.toString());
  206. UDPOut.sendBrdcst(msg);
  207. }
  208. /**
  209. * Envoi message de type 4 (confirmation pseudo)
  210. */
  211. public void sendPseudoValideBroadcast(){
  212. //System.out.println("Confirmation du pseudo : " + this.user.getPseudo());
  213. MessagePseudo msg = new MessagePseudo(4, this.user.getInetAddress(), this.user.getPseudo(), this.user.getTcpListeningPort(), this.user.getId());
  214. //System.out.println("Message envoyé : " + msg.toString());
  215. UDPOut.sendBrdcst(msg);
  216. //UDPIn.printFilter();
  217. }
  218. /**
  219. * Méthode appelée par le controleur quand la vue envoie un signal d'appuis bouton changer Pseudo (indoor)
  220. * @param pseudo
  221. * Pseudo rentré par l'utilisateur
  222. */
  223. public void choosePseudo(String pseudo, boolean isConfirmationNeeded){
  224. this.ancienPseudo = this.user.getPseudo();
  225. this.user.setPseudo(pseudo);
  226. this.UDPIn.setFilterValue(2, true);
  227. this.UDPIn.setFilterValue(3, true);
  228. this.sendPseudoBroadcast();
  229. this.tim.schedule(new TimerTaskResponseWait(isConfirmationNeeded), 2000);
  230. ArrayList<Utilisateurs> outdoorUsers = servCon.getRemoteActiveUsers();
  231. for (Utilisateurs newUser : outdoorUsers) {
  232. if (newUser.getPseudo().equals(this.user.getPseudo())) {
  233. this.isPseudoOk = false;
  234. this.user.setPseudo(this.ancienPseudo);
  235. this.ancienPseudo = "";
  236. this.support.firePropertyChange("pseudoRefused", this.user.getPseudo(), this.ancienPseudo);
  237. }
  238. synchronized (userList) {
  239. if (!this.userList.contains(newUser)) {
  240. this.userList.add(newUser);
  241. Collections.sort(this.userList);
  242. this.support.firePropertyChange("newUserConnected", -1, -2);
  243. }
  244. }
  245. }
  246. }
  247. /**
  248. * Méthode appelée par le controleur quand la vue envoie un signal d'appuis bouton changer Pseudo
  249. * @param pseudo
  250. * Pseudo rentré par l'utilisateur
  251. */
  252. public void choosePseudoOutdoor(String pseudo, boolean isConfirmationNeeded){
  253. this.ancienPseudo = this.user.getPseudo();
  254. this.user.setPseudo(pseudo);
  255. this.tim.schedule(new TimerTaskResponseWait(isConfirmationNeeded), 2000);
  256. ArrayList<Utilisateurs> users = servCon.getAllActiveUsers();
  257. for (Utilisateurs newUser : users) {
  258. if (newUser.getPseudo().equals(this.user.getPseudo())) {
  259. this.isPseudoOk = false;
  260. this.user.setPseudo(this.ancienPseudo);
  261. this.ancienPseudo = "";
  262. this.support.firePropertyChange("pseudoRefused", this.user.getPseudo(), this.ancienPseudo);
  263. }
  264. synchronized (userList) {
  265. if (!this.userList.contains(newUser)) {
  266. this.userList.add(newUser);
  267. Collections.sort(this.userList);
  268. this.support.firePropertyChange("newUserConnected", -1, -2);
  269. }
  270. }
  271. }
  272. }
  273. /** Sets the id
  274. * @param id
  275. */
  276. public void setUserId(int id){
  277. this.user.setId(id);
  278. }
  279. /** Creates a Chat Room and TCPConnection between remote id and local id when local user initiates it
  280. * @param remoteId
  281. * @param remotePseudo
  282. */
  283. public void createChatFromLocalRequest(int remoteId, String remotePseudo){
  284. boolean isChatAlreadyCreated = false;
  285. for (TCPChatConnection tcpCo : listTCPConnection){
  286. if (tcpCo.remoteUserId == remoteId){
  287. isChatAlreadyCreated = true;
  288. break;
  289. }
  290. }
  291. if (!isChatAlreadyCreated) {
  292. synchronized (userList) {
  293. for (Utilisateurs u : userList) {
  294. if (u.getPseudo().equals(remotePseudo)) {
  295. MessageInit msgInit = new MessageInit(7, user.getInetAddress(), u.getInetAddress(), u.getTcpListeningPort(), user.getId());
  296. TCPChatConnection tcpCo = new TCPChatConnection(msgInit, u.getInetAddress(), u.getTcpListeningPort(), u.getId());
  297. listTCPConnection.add(tcpCo);
  298. }
  299. }
  300. }
  301. }
  302. }
  303. /**
  304. * Handler de notification (Obsevateur) pour le thread UDP.
  305. * @param evt
  306. * Evenement qui est envoyé avec la notification
  307. */
  308. public void propertyChange(PropertyChangeEvent evt){
  309. switch (evt.getPropertyName()){
  310. case "UDPInput":
  311. Message msgReceived = UDPIn.getMessageReceived();
  312. this.messageHandler(msgReceived);
  313. break;
  314. case "chatCreated" :
  315. TCPChatConnection tcpCo = this.tcpListener.getTCPChatConnection();
  316. tcpCo.addPropertyChangeListener(this);
  317. this.listTCPConnection.add(tcpCo);
  318. break;
  319. }
  320. }
  321. /**
  322. * Permet de faire les actions adéquates selon le type de message reçu. Appelé dans propertyChange
  323. * @param msg
  324. * message à analyser
  325. */
  326. public void messageHandler(Message msg){
  327. switch (msg.typeMessage){
  328. case 1 :
  329. MessagePseudo msgP1 = (MessagePseudo) msg;
  330. this.handleType1Message(msgP1);
  331. break;
  332. case 2 :
  333. MessagePseudo msgP2 = (MessagePseudo) msg;
  334. //System.out.println("Message de type 2 reçu : " + msgP2.toString());
  335. Utilisateurs newUser2 = new Utilisateurs(msgP2.pseudo,msgP2.srcIP,msgP2.id, msgP2.portEcouteTCP);
  336. //System.out.println("Utilisateur créé : " + newUser2.toString());
  337. synchronized (userList) {
  338. if (!this.userList.contains(newUser2)) {
  339. this.userList.add(newUser2);
  340. Collections.sort(this.userList);
  341. this.support.firePropertyChange("newUserConnected", -1, -2);
  342. }
  343. }
  344. break;
  345. case 3 :
  346. MessagePseudo msgP3 = (MessagePseudo) msg;
  347. //System.out.println("Message de type 3 reçu : " + msgP3.toString());
  348. this.isPseudoOk = false;
  349. this.user.setPseudo(this.ancienPseudo);
  350. this.ancienPseudo = "";
  351. this.support.firePropertyChange("pseudoRefused",this.user.getPseudo(),this.ancienPseudo);
  352. //System.out.println("After pseudo refused");
  353. break;
  354. case 4:
  355. MessagePseudo msgP4 = (MessagePseudo) msg;
  356. //System.out.println("Message de type 4 reçu : " + msgP4.toString());
  357. if (msgP4.id != this.user.getId()) {
  358. Utilisateurs newUser4 = new Utilisateurs(msgP4.pseudo,msgP4.srcIP,msgP4.id, msgP4.portEcouteTCP);
  359. newUser4.setOutdoor(false);
  360. //System.out.println("Utilisateur créé : " + newUser4.toString());
  361. synchronized (userList) {
  362. this.userList.remove(newUser4);
  363. this.userList.add(newUser4);
  364. Collections.sort(this.userList);
  365. }
  366. this.support.firePropertyChange("newUserConnected",-1,newUser4.getId());
  367. }
  368. break;
  369. case 7 :
  370. MessagePseudo msgP7 = (MessagePseudo) msg;
  371. Utilisateurs User7 = new Utilisateurs(msgP7.pseudo,msgP7.srcIP,msgP7.id, msgP7.portEcouteTCP);
  372. synchronized (userList) {
  373. this.userList.remove(User7);
  374. }
  375. this.support.firePropertyChange("newUserConnected",-1,-2);
  376. break;
  377. default :
  378. //System.out.println("Message de type inconnu");
  379. }
  380. }
  381. /**
  382. * Méthode appelée dans messageHandler pour répondre à un message de type 1
  383. * @param msg
  384. * Message à analyser
  385. */
  386. private void handleType1Message(MessagePseudo msg){
  387. MessagePseudo msgResponse;
  388. //System.out.println("Message de type 1 reçu : " + msg.toString());
  389. if (msg.id != this.user.getId()) {
  390. if (this.user.getPseudo().equals(msg.pseudo)){
  391. msgResponse = new MessagePseudo(3, null, msg.pseudo, 0, 0);
  392. //System.out.println("Pseudo pas OK, on envoi : " + msgResponse.toString());
  393. } else{
  394. msgResponse = new MessagePseudo(2, this.user.getInetAddress(),this.user.getPseudo(), this.user.getTcpListeningPort(), this.user.getId());
  395. //System.out.println("Pseudo OK, on envoi : " + msgResponse.toString());
  396. }
  397. this.UDPOut.sendMsg(msgResponse, msg.srcIP);
  398. } else {
  399. //System.out.println("Moi-même -> IGNORED");
  400. }
  401. }
  402. /**
  403. * @return the list of users
  404. */
  405. public List<Utilisateurs> getUserList(){
  406. synchronized (userList) {
  407. return userList;
  408. }
  409. }
  410. /** returns connected the user identified by the id
  411. * @param id
  412. * @return User identified by id
  413. */
  414. public Utilisateurs getUserFromId(int id){
  415. Utilisateurs res = null;
  416. synchronized (userList) {
  417. for (Utilisateurs u : userList) {
  418. if (u.getId() == id) {
  419. res = u;
  420. break;
  421. }
  422. }
  423. }
  424. return res;
  425. }
  426. /** Returns connected user identified by pseudo
  427. * @param pseudo
  428. * @return User identified by pseudo
  429. */
  430. public Utilisateurs getUserFromPseudo(String pseudo){
  431. Utilisateurs res = null;
  432. synchronized (userList) {
  433. for (Utilisateurs u : userList) {
  434. if (u.getPseudo().equals(pseudo)) {
  435. res = u;
  436. break;
  437. }
  438. }
  439. }
  440. return res;
  441. }
  442. /**
  443. * Sends a deconnection Messages (type 7) in broadcast
  444. */
  445. public void sendDeconnectionMessage() {
  446. if (!this.user.isOutdoor()) {
  447. MessagePseudo msg = new MessagePseudo(7, this.user.getInetAddress(), this.user.getPseudo(), this.user.getTcpListeningPort(), this.user.getId());
  448. UDPOut.sendBrdcst(msg);
  449. servCon.submitDeconnectionIndoor(this.user);
  450. }
  451. else{
  452. //System.out.println("Send deco Outdoor sent");
  453. servCon.submitDeconnectionOutdoor(this.user);
  454. }
  455. try {
  456. this.app.stop();
  457. Platform.exit();
  458. System.exit(0);
  459. } catch (Exception e) {
  460. System.out.println("Erreur lors de l'envoi du message de deconnexion'");
  461. }
  462. }
  463. /** Closes the Chat Connection when asked
  464. * @param tcpCo
  465. */
  466. public void notifyCloseChat(TCPChatConnection tcpCo) {
  467. this.listTCPConnection.remove(tcpCo);
  468. Socket link = tcpCo.getSocket();
  469. try {
  470. link.close();
  471. } catch (IOException e) {
  472. System.out.println("Erreur lors de la fermeture du Chat");
  473. }
  474. }
  475. public void deleteHistory(String remotePseudo) {
  476. int remoteId = this.getUserFromPseudo(remotePseudo).getId();
  477. for (TCPChatConnection tcpCo : this.listTCPConnection){
  478. if (tcpCo.remoteUserId == remoteId){
  479. this.listTCPConnection.remove(tcpCo);
  480. tcpCo.sendCloseChat();
  481. Socket link = tcpCo.getSocket();
  482. try {
  483. link.close();
  484. } catch (IOException e) {
  485. e.printStackTrace();
  486. }
  487. break;
  488. }
  489. }
  490. this.dbAccess.deleteHistory(remoteId,user.getId());
  491. }
  492. public void startTim2s() {
  493. tim2s.scheduleAtFixedRate(new TimerTaskCheckUsers(), 2000, 2000);
  494. }
  495. /**
  496. * Classe interne au model pour au bout d'une seconde d'envoi de demande pseudo type 1,
  497. * on desactive les filtes et on met à jour la vue.
  498. */
  499. class TimerTaskResponseWait extends TimerTask {
  500. boolean isConfirmationNeeded;
  501. /**
  502. * @param isConfirmationNeeded if true, will send type 4 messages in broadcast else does not send
  503. */
  504. public TimerTaskResponseWait(boolean isConfirmationNeeded) {
  505. this.isConfirmationNeeded = isConfirmationNeeded;
  506. }
  507. /**
  508. * Quand la seconde s'est écoulée, on met les filtres à faux pour ne plus prendre en compte les messages de type 2 et 3
  509. */
  510. public void run() {
  511. if (!user.isOutdoor()) {
  512. UDPIn.setFilterValue(2, false);
  513. UDPIn.setFilterValue(3, false);
  514. }
  515. if (isPseudoOk){
  516. //envoi message de type 4 pour confirmer.
  517. support.firePropertyChange("pseudoValide",ancienPseudo,user.getPseudo());
  518. if (!user.isOutdoor()) {
  519. UDPIn.setFilterValue(1,true);
  520. }
  521. if (isConfirmationNeeded){
  522. if (!user.isOutdoor()) {
  523. sendPseudoValideBroadcast();
  524. servCon.submitConnectionIndoor(user);
  525. }
  526. else{
  527. servCon.submitConnectionOutdoor(user);
  528. }
  529. }
  530. }
  531. else{
  532. isPseudoOk = true; //On reinitialise cet attribut.
  533. }
  534. }
  535. }
  536. /**
  537. * Classe interne au model check si tout les utilisateurs sont toujours présents
  538. */
  539. class TimerTaskCheckUsers extends TimerTask {
  540. public void run() {
  541. //System.out.println(user);
  542. synchronized (userList) {
  543. Date currentDate = new Date();
  544. if (user.isOutdoor()) {
  545. System.out.println("Timer task 2s Outdoor");
  546. servCon.submitConnectionOutdoor(user);
  547. ArrayList<Utilisateurs> servUserList = servCon.getAllActiveUsers();
  548. ArrayList<Utilisateurs> userListToRemove = new ArrayList<>();
  549. ArrayList<Utilisateurs> userListToAdd = new ArrayList<>();
  550. ArrayList<Utilisateurs> userListWatched = new ArrayList<>();
  551. for (Iterator<Utilisateurs> iter = userList.iterator(); iter.hasNext(); ) {
  552. Utilisateurs userloop = iter.next();
  553. Utilisateurs userfound = null;
  554. for (Utilisateurs userExtloop : servUserList) {
  555. if (userExtloop.getId() == userloop.getId()) {
  556. userfound = userExtloop;
  557. break;
  558. }
  559. }
  560. if (userfound == null) {
  561. userListToRemove.add(userloop);
  562. } else {
  563. userListWatched.add(userfound);
  564. if (userfound.userToOld(currentDate)) {
  565. userListToRemove.add(userloop);
  566. if (userfound.isOutdoor()) {
  567. servCon.submitDeconnectionOutdoor(userfound);
  568. } else {
  569. servCon.submitDeconnectionIndoor(userfound);
  570. }
  571. } else {
  572. userListToRemove.add(userloop);
  573. userListToAdd.add(userfound);
  574. }
  575. }
  576. }
  577. userList.removeAll(userListToRemove);
  578. servUserList.removeAll(userListWatched);
  579. servUserList.remove(user);
  580. userListToAdd.addAll(servUserList);
  581. userList.addAll(userListToAdd);
  582. } else {
  583. // On previent qu'on existe
  584. System.out.println("Timer task 2s Indoor");
  585. System.out.println("UserList " + userList.toString());
  586. sendPseudoValideBroadcast();
  587. servCon.submitConnectionIndoor(user);
  588. ArrayList<Utilisateurs> utilisateursExternes = servCon.getRemoteActiveUsers();
  589. ArrayList<Utilisateurs> userListToRemove = new ArrayList<>();
  590. ArrayList<Utilisateurs> userListToAdd = new ArrayList<>();
  591. ArrayList<Utilisateurs> userListExternWatched = new ArrayList<>();
  592. for (Iterator<Utilisateurs> iter = userList.iterator(); iter.hasNext(); ) {
  593. Utilisateurs userloop = iter.next();
  594. if (userloop.isOutdoor()) {
  595. Utilisateurs userfound = null;
  596. for (Utilisateurs userExtloop : utilisateursExternes) {
  597. if (userExtloop.getId() == userloop.getId()) {
  598. userfound = userExtloop;
  599. break;
  600. }
  601. }
  602. if (userfound == null) {
  603. userListToRemove.add(userloop);
  604. } else {
  605. userListExternWatched.add(userfound);
  606. if (userfound.userToOld(currentDate)) {
  607. userListToRemove.add(userloop);
  608. servCon.submitDeconnectionOutdoor(userfound);
  609. } else {
  610. userListToRemove.add(userloop);
  611. userListToAdd.add(userfound);
  612. }
  613. }
  614. } else {
  615. if (userloop.userToOld(currentDate)) {
  616. userListToRemove.add(userloop);
  617. servCon.submitDeconnectionIndoor(userloop);
  618. }
  619. }
  620. }
  621. userList.removeAll(userListToRemove);
  622. utilisateursExternes.removeAll(userListExternWatched);
  623. userListToAdd.addAll(utilisateursExternes);
  624. userList.addAll(userListToAdd);
  625. }
  626. }
  627. Collections.sort(userList);
  628. support.firePropertyChange("newUserConnected",-1,-2);
  629. }
  630. }
  631. /** if (user.isOutdoor()) {
  632. userList = servCon.getAllActiveUsers();
  633. } else {
  634. ArrayList<Utilisateurs> userListToRemove = new ArrayList<>();
  635. for (Iterator<Utilisateurs> iter = userList.iterator(); iter.hasNext(); ) {
  636. Utilisateurs userloop = iter.next();
  637. if (userloop.isOutdoor()) {
  638. //System.out.println("OUAIP CA DECNNE");
  639. userListToRemove.add(userloop);
  640. }
  641. }
  642. //System.out.println(userListToRemove);
  643. userList.removeAll(userListToRemove);
  644. userList.addAll(servCon.getRemoteActiveUsers());
  645. }
  646. support.firePropertyChange("newUserConnected",-1,-2);
  647. *
  648. *
  649. *
  650. *
  651. *
  652. *
  653. *
  654. *
  655. */
  656. }