Index: lams_learning/src/java/org/lamsfoundation/lams/learning/presence/PresenceWebsocketServer.java =================================================================== RCS file: /usr/local/cvsroot/lams_learning/src/java/org/lamsfoundation/lams/learning/presence/Attic/PresenceWebsocketServer.java,v diff -u -r1.1.2.2 -r1.1.2.3 --- lams_learning/src/java/org/lamsfoundation/lams/learning/presence/PresenceWebsocketServer.java 5 Apr 2016 10:02:20 -0000 1.1.2.2 +++ lams_learning/src/java/org/lamsfoundation/lams/learning/presence/PresenceWebsocketServer.java 12 Apr 2016 12:02:53 -0000 1.1.2.3 @@ -110,7 +110,7 @@ } /** - * Cheks for stale connections and feeds the opened ones with messages and roster. + * Feeds opened websockets with messages and roster. */ private void send(Long lessonId, String nickName) { Long lastSendTime = lastSendTimes.get(lessonId); @@ -137,18 +137,6 @@ continue; } - // check whether the connection is not stale - if (!websocket.session.isOpen()) { - // remove the closed connection - websocketIterator.remove(); - - if (PresenceWebsocketServer.log.isDebugEnabled()) { - PresenceWebsocketServer.log.debug( - "User " + websocket.nickName + " left Presence Chat with lessonId: " + lessonId); - } - continue; - } - // the connection is valid, carry on JSONObject responseJSON = new JSONObject(); @@ -268,20 +256,37 @@ if (PresenceWebsocketServer.log.isDebugEnabled()) { PresenceWebsocketServer.log - .debug("User " + websocket.nickName + " entered Chat with toolSessionId: " + lessonId); + .debug("User " + websocket.nickName + " entered Presence Chat with lesson ID: " + lessonId); } } /** * If there was something wrong with the connection, put it into logs. */ @OnClose - public void unregisterUser(CloseReason reason) { - if (!(reason.getCloseCode().equals(CloseCodes.GOING_AWAY) - || reason.getCloseCode().equals(CloseCodes.NORMAL_CLOSURE))) { - PresenceWebsocketServer.log.warn("Abnormal Presence Chat websocket close. Code: " + reason.getCloseCode() - + ". Reason: " + reason.getReasonPhrase()); + public void unregisterUser(Session session, CloseReason reason) { + Long lessonId = Long.valueOf(session.getRequestParameterMap().get(AttributeNames.PARAM_LESSON_ID).get(0)); + Set lessonWebsockets = PresenceWebsocketServer.websockets.get(lessonId); + synchronized (lessonWebsockets) { + Iterator websocketIterator = lessonWebsockets.iterator(); + while (websocketIterator.hasNext()) { + Websocket websocket = websocketIterator.next(); + if (websocket.session.equals(session)) { + websocketIterator.remove(); + break; + } + } } + + if (PresenceWebsocketServer.log.isDebugEnabled()) { + PresenceWebsocketServer.log.debug( + "User " + session.getUserPrincipal().getName() + " left Presence Chat with lessonId: " + lessonId + + (!(reason.getCloseCode().equals(CloseCodes.GOING_AWAY) + || reason.getCloseCode().equals(CloseCodes.NORMAL_CLOSURE)) + ? ". Abnormal close. Code: " + reason.getCloseCode() + ". Reason: " + + reason.getReasonPhrase() + : "")); + } } /**