Index: lams_common/src/java/org/lamsfoundation/lams/commonContext.xml =================================================================== diff -u -r5540073d41b09023132de765ea353e297a50e524 -r31bce49235ce48b8f2b5367aa7153d4341664287 --- lams_common/src/java/org/lamsfoundation/lams/commonContext.xml (.../commonContext.xml) (revision 5540073d41b09023132de765ea353e297a50e524) +++ lams_common/src/java/org/lamsfoundation/lams/commonContext.xml (.../commonContext.xml) (revision 31bce49235ce48b8f2b5367aa7153d4341664287) @@ -555,8 +555,9 @@ - PROPAGATION_REQUIRED,readOnly - PROPAGATION_REQUIRED,readOnly + PROPAGATION_REQUIRED + PROPAGATION_REQUIRED + PROPAGATION_REQUIRED Index: lams_common/src/java/org/lamsfoundation/lams/security/SecurityDAO.java =================================================================== diff -u -r8830dd5050d233d69e83a761594e3ef9ed30b028 -r31bce49235ce48b8f2b5367aa7153d4341664287 --- lams_common/src/java/org/lamsfoundation/lams/security/SecurityDAO.java (.../SecurityDAO.java) (revision 8830dd5050d233d69e83a761594e3ef9ed30b028) +++ lams_common/src/java/org/lamsfoundation/lams/security/SecurityDAO.java (.../SecurityDAO.java) (revision 31bce49235ce48b8f2b5367aa7153d4341664287) @@ -24,8 +24,7 @@ import java.io.Serializable; -import org.hibernate.Query; -import org.hibernate.SQLQuery; +import org.hibernate.query.Query; import org.lamsfoundation.lams.dao.hibernate.LAMSBaseDAO; import org.lamsfoundation.lams.lesson.Lesson; import org.lamsfoundation.lams.usermanagement.Organisation; @@ -75,11 +74,8 @@ @Override public boolean hasOrgRole(Integer orgId, Integer userId, String... roles) { - Query query = getSession().createQuery(SecurityDAO.CHECK_ORG_ROLE); - query.setParameter("orgId", orgId); - query.setParameter("userId", userId); - query.setParameterList("roles", roles); - return !query.setCacheable(true).list().isEmpty(); + return !doFindByNamedParam(SecurityDAO.CHECK_ORG_ROLE, new String[] { "orgId", "userId", "roles" }, + new Object[] { orgId, userId, roles }).isEmpty(); } @Override @@ -96,9 +92,9 @@ @Override public boolean isLessonLearner(Long lessonId, Integer userId) { - SQLQuery query = getSession().createSQLQuery(SecurityDAO.CHECK_LESSON_LEARNER); - query.setLong("lessonId", lessonId); - query.setInteger("user_id", userId); + Query query = getSession().createSQLQuery(SecurityDAO.CHECK_LESSON_LEARNER); + query.setParameter("lessonId", lessonId); + query.setParameter("user_id", userId); return !query.list().isEmpty(); } Index: lams_learning/src/java/org/lamsfoundation/lams/learning/presence/PresenceWebsocketServer.java =================================================================== diff -u -rf3e44aee5373a1233080ea5acd1cb5959bb46544 -r31bce49235ce48b8f2b5367aa7153d4341664287 --- lams_learning/src/java/org/lamsfoundation/lams/learning/presence/PresenceWebsocketServer.java (.../PresenceWebsocketServer.java) (revision f3e44aee5373a1233080ea5acd1cb5959bb46544) +++ lams_learning/src/java/org/lamsfoundation/lams/learning/presence/PresenceWebsocketServer.java (.../PresenceWebsocketServer.java) (revision 31bce49235ce48b8f2b5367aa7153d4341664287) @@ -1,6 +1,7 @@ package org.lamsfoundation.lams.learning.presence; import java.io.IOException; +import java.util.Collection; import java.util.Date; import java.util.Iterator; import java.util.List; @@ -121,6 +122,10 @@ try { ArrayNode rosterJSON = roster.getRosterJSON(); for (Session websocket : lessonWebsockets) { + if (!websocket.isOpen()) { + PresenceWebsocketServer.removeWebsocket(websocket, lessonWebsockets); + continue; + } // if this run is meant only for one learner, skip the others String websocketNickName = (String) websocket.getUserProperties().get(PARAM_NICKNAME); if ((nickName != null) && !nickName.equals(websocketNickName)) { @@ -279,14 +284,7 @@ public void unregisterUser(Session websocket) { Long lessonId = (Long) websocket.getUserProperties().get(AttributeNames.PARAM_LESSON_ID); Set lessonWebsockets = PresenceWebsocketServer.websockets.get(lessonId); - Iterator sessionIterator = lessonWebsockets.iterator(); - while (sessionIterator.hasNext()) { - Session storedSession = sessionIterator.next(); - if (storedSession.equals(websocket)) { - sessionIterator.remove(); - break; - } - } + PresenceWebsocketServer.removeWebsocket(websocket, lessonWebsockets); if (PresenceWebsocketServer.log.isDebugEnabled()) { PresenceWebsocketServer.log.debug("User " + websocket.getUserProperties().get(PARAM_NICKNAME) @@ -398,6 +396,20 @@ return messagesJSON; } + private static void removeWebsocket(Session websocket, Collection lessonWebsockets) { + if (lessonWebsockets == null) { + return; + } + Iterator sessionIterator = lessonWebsockets.iterator(); + while (sessionIterator.hasNext()) { + Session storedSession = sessionIterator.next(); + if (storedSession.equals(websocket)) { + sessionIterator.remove(); + break; + } + } + } + private static ObjectNode buildMessageJSON(PresenceChatMessage message) { ObjectNode messageJSON = JsonNodeFactory.instance.objectNode(); messageJSON.put("uid", message.getUid());