Index: lams_common/src/java/org/lamsfoundation/lams/util/hibernate/HibernateSessionManager.java =================================================================== diff -u -radcbeeb5329b4ec39e5655084d3eaf480d00bb59 -r18a207719c2aa30f683987fd0bb9176521b704de --- lams_common/src/java/org/lamsfoundation/lams/util/hibernate/HibernateSessionManager.java (.../HibernateSessionManager.java) (revision adcbeeb5329b4ec39e5655084d3eaf480d00bb59) +++ lams_common/src/java/org/lamsfoundation/lams/util/hibernate/HibernateSessionManager.java (.../HibernateSessionManager.java) (revision 18a207719c2aa30f683987fd0bb9176521b704de) @@ -21,7 +21,7 @@ /** * Makes sure that an open Hibernate session is bound to current thread. */ - public static void openSession() { + public static void openSession() throws IllegalStateException { SessionFactory sessionFactory = HibernateSessionManager.getSessionFactory(); // this call does not only fetch current session // if an open session is missing from Context, it creates it and binds it @@ -39,15 +39,10 @@ } } - public static void closeSession() { - try { - Session session = HibernateSessionManager.getSessionFactory().getCurrentSession(); - if (session.isOpen()) { - session.close(); - } - } catch (IllegalStateException e) { - // ignore this as session is already in closed state, that's why we got the exception - // it usually happens on server shutdown - see LDEV-4802 + public static void closeSession() throws IllegalStateException { + Session session = HibernateSessionManager.getSessionFactory().getCurrentSession(); + if (session.isOpen()) { + session.close(); } } Index: lams_learning/src/java/org/lamsfoundation/lams/learning/command/CommandWebsocketServer.java =================================================================== diff -u -r62aaf160878735888d077bf28fac3c1989bb8fbd -r18a207719c2aa30f683987fd0bb9176521b704de --- lams_learning/src/java/org/lamsfoundation/lams/learning/command/CommandWebsocketServer.java (.../CommandWebsocketServer.java) (revision 62aaf160878735888d077bf28fac3c1989bb8fbd) +++ lams_learning/src/java/org/lamsfoundation/lams/learning/command/CommandWebsocketServer.java (.../CommandWebsocketServer.java) (revision 18a207719c2aa30f683987fd0bb9176521b704de) @@ -42,14 +42,15 @@ // how ofter the thread runs private static final long CHECK_INTERVAL = 5000; // mapping lessonId -> timestamp when the check was last performed, so the thread does not run too often - private final Map lastSendTimes = new TreeMap(); + private final Map lastSendTimes = new TreeMap<>(); @Override public void run() { while (!stopFlag) { - // websocket communication bypasses standard HTTP filters, so Hibernate session needs to be initialised manually - HibernateSessionManager.openSession(); try { + // websocket communication bypasses standard HTTP filters, so Hibernate session needs to be initialised manually + HibernateSessionManager.openSession(); + Iterator>> entryIterator = CommandWebsocketServer.websockets .entrySet().iterator(); @@ -75,16 +76,18 @@ } while (entry != null); Thread.sleep(SendWorker.CHECK_INTERVAL); + } catch (IllegalStateException e) { + // do nothing as server is probably shutting down and we could not obtain Hibernate session } catch (Exception e) { // error caught, but carry on CommandWebsocketServer.log.error("Error in Command Websocket Server worker thread", e); } finally { - HibernateSessionManager.closeSession(); try { + HibernateSessionManager.closeSession(); Thread.sleep(SendWorker.CHECK_INTERVAL); - } catch (InterruptedException e) { - log.warn("Stopping Command Websocket worker thread"); + } catch (IllegalStateException | InterruptedException e) { stopFlag = true; + log.warn("Stopping Command Websocket worker thread"); } } } @@ -115,7 +118,7 @@ private static Logger log = Logger.getLogger(CommandWebsocketServer.class); private static final SendWorker sendWorker = new SendWorker(); - private static final Map> websockets = new ConcurrentHashMap>(); + private static final Map> websockets = new ConcurrentHashMap<>(); static { // run the singleton thread @@ -130,7 +133,7 @@ Long lessonId = Long.valueOf(websocket.getRequestParameterMap().get(AttributeNames.PARAM_LESSON_ID).get(0)); Map sessionWebsockets = CommandWebsocketServer.websockets.get(lessonId); if (sessionWebsockets == null) { - sessionWebsockets = new ConcurrentHashMap(); + sessionWebsockets = new ConcurrentHashMap<>(); CommandWebsocketServer.websockets.put(lessonId, sessionWebsockets); } Index: lams_tool_chat/src/java/org/lamsfoundation/lams/tool/chat/web/controller/LearningWebsocketServer.java =================================================================== diff -u -r903574fa3e87a5a85057a975acfe6ccfba0b9de0 -r18a207719c2aa30f683987fd0bb9176521b704de --- lams_tool_chat/src/java/org/lamsfoundation/lams/tool/chat/web/controller/LearningWebsocketServer.java (.../LearningWebsocketServer.java) (revision 903574fa3e87a5a85057a975acfe6ccfba0b9de0) +++ lams_tool_chat/src/java/org/lamsfoundation/lams/tool/chat/web/controller/LearningWebsocketServer.java (.../LearningWebsocketServer.java) (revision 18a207719c2aa30f683987fd0bb9176521b704de) @@ -85,6 +85,7 @@ try { // websocket communication bypasses standard HTTP filters, so Hibernate session needs to be initialised manually HibernateSessionManager.openSession(); + Iterator>> entryIterator = LearningWebsocketServer.websockets.entrySet() .iterator(); // go throus Tool Session and update registered users with messages and roster @@ -104,16 +105,18 @@ lastSendTimes.remove(toolSessionId); } } + } catch (IllegalStateException e) { + // do nothing as server is probably shutting down and we could not obtain Hibernate session } catch (Exception e) { // error caught, but carry on LearningWebsocketServer.log.error("Error in Chat worker thread", e); } finally { - HibernateSessionManager.closeSession(); try { + HibernateSessionManager.closeSession(); Thread.sleep(SendWorker.CHECK_INTERVAL); - } catch (InterruptedException e) { - LearningWebsocketServer.log.warn("Stopping Chat worker thread"); + } catch (IllegalStateException | InterruptedException e) { stopFlag = true; + LearningWebsocketServer.log.warn("Stopping Chat worker thread"); } } } @@ -183,7 +186,7 @@ private long lastDBCheckTime = 0; // Learners who are currently active - private final TreeMap activeUsers = new TreeMap(); + private final TreeMap activeUsers = new TreeMap<>(); private Roster(Long toolSessionId) { this.toolSessionId = toolSessionId; @@ -196,7 +199,7 @@ * @throws JsonProcessingException */ private ArrayNode getRosterJSON() throws JsonProcessingException, IOException { - TreeMap localActiveUsers = new TreeMap(); + TreeMap localActiveUsers = new TreeMap<>(); Set sessionWebsockets = LearningWebsocketServer.websockets.get(toolSessionId); // find out who is active locally for (Websocket websocket : sessionWebsockets) { Index: lams_tool_doku/src/java/org/lamsfoundation/lams/tool/dokumaran/web/controller/LearningWebsocketServer.java =================================================================== diff -u -r1cef918442124e8d987a285095a7504e3bc00461 -r18a207719c2aa30f683987fd0bb9176521b704de --- lams_tool_doku/src/java/org/lamsfoundation/lams/tool/dokumaran/web/controller/LearningWebsocketServer.java (.../LearningWebsocketServer.java) (revision 1cef918442124e8d987a285095a7504e3bc00461) +++ lams_tool_doku/src/java/org/lamsfoundation/lams/tool/dokumaran/web/controller/LearningWebsocketServer.java (.../LearningWebsocketServer.java) (revision 18a207719c2aa30f683987fd0bb9176521b704de) @@ -15,8 +15,6 @@ import javax.websocket.server.ServerEndpoint; import org.apache.log4j.Logger; - - import org.lamsfoundation.lams.tool.dokumaran.DokumaranConstants; import org.lamsfoundation.lams.tool.dokumaran.model.Dokumaran; import org.lamsfoundation.lams.tool.dokumaran.service.IDokumaranService; @@ -52,6 +50,7 @@ try { // websocket communication bypasses standard HTTP filters, so Hibernate session needs to be initialised manually HibernateSessionManager.openSession(); + Iterator>> entryIterator = LearningWebsocketServer.websockets.entrySet() .iterator(); // go through activities and update registered learners with reports and vote count @@ -80,16 +79,18 @@ } } } + } catch (IllegalStateException e) { + // do nothing as server is probably shutting down and we could not obtain Hibernate session } catch (Exception e) { // error caught, but carry on LearningWebsocketServer.log.error("Error in Dokumaran worker thread", e); } finally { - HibernateSessionManager.closeSession(); try { + HibernateSessionManager.closeSession(); Thread.sleep(SendWorker.CHECK_INTERVAL); - } catch (InterruptedException e) { - LearningWebsocketServer.log.warn("Stopping Dokumaran worker thread"); + } catch (IllegalStateException | InterruptedException e) { stopFlag = true; + LearningWebsocketServer.log.warn("Stopping Dokumaran worker thread"); } } } Index: lams_tool_leader/src/java/org/lamsfoundation/lams/tool/leaderselection/web/controller/LearningWebsocketServer.java =================================================================== diff -u -r9b4a3799f9589dbda9a792e10a4ebd649db1e3db -r18a207719c2aa30f683987fd0bb9176521b704de --- lams_tool_leader/src/java/org/lamsfoundation/lams/tool/leaderselection/web/controller/LearningWebsocketServer.java (.../LearningWebsocketServer.java) (revision 9b4a3799f9589dbda9a792e10a4ebd649db1e3db) +++ lams_tool_leader/src/java/org/lamsfoundation/lams/tool/leaderselection/web/controller/LearningWebsocketServer.java (.../LearningWebsocketServer.java) (revision 18a207719c2aa30f683987fd0bb9176521b704de) @@ -47,6 +47,7 @@ try { // websocket communication bypasses standard HTTP filters, so Hibernate session needs to be initialised manually HibernateSessionManager.openSession(); + Iterator>> entryIterator = LearningWebsocketServer.websockets.entrySet() .iterator(); // go through activities and update registered learners with reports and vote count @@ -66,16 +67,18 @@ LearningWebsocketServer.sendPageRefreshRequest(toolSessionId); } } + } catch (IllegalStateException e) { + // do nothing as server is probably shutting down and we could not obtain Hibernate session } catch (Exception e) { // error caught, but carry on log.error("Error in Leader worker thread", e); } finally { - HibernateSessionManager.closeSession(); try { + HibernateSessionManager.closeSession(); Thread.sleep(SendWorker.CHECK_INTERVAL); - } catch (InterruptedException e) { - log.warn("Stopping Leader worker thread"); + } catch (IllegalStateException | InterruptedException e) { stopFlag = true; + LearningWebsocketServer.log.warn("Stopping Leader worker thread"); } } } Index: lams_tool_mindmap/src/java/org/lamsfoundation/lams/tool/mindmap/web/controller/LearningWebsocketServer.java =================================================================== diff -u -r96068ffc66514c1d25e9adeb96acfa164ab29dd5 -r18a207719c2aa30f683987fd0bb9176521b704de --- lams_tool_mindmap/src/java/org/lamsfoundation/lams/tool/mindmap/web/controller/LearningWebsocketServer.java (.../LearningWebsocketServer.java) (revision 96068ffc66514c1d25e9adeb96acfa164ab29dd5) +++ lams_tool_mindmap/src/java/org/lamsfoundation/lams/tool/mindmap/web/controller/LearningWebsocketServer.java (.../LearningWebsocketServer.java) (revision 18a207719c2aa30f683987fd0bb9176521b704de) @@ -56,6 +56,7 @@ try { // websocket communication bypasses standard HTTP filters, so Hibernate session needs to be initialised manually HibernateSessionManager.openSession(); + Iterator>> entryIterator = LearningWebsocketServer.websockets.entrySet() .iterator(); // go through activities and update registered learners with reports and vote count @@ -71,16 +72,18 @@ } SendWorker.send(toolSessionId, null, null); } + } catch (IllegalStateException e) { + // do nothing as server is probably shutting down and we could not obtain Hibernate session } catch (Exception e) { // error caught, but carry on LearningWebsocketServer.log.error("Error in Mindmap worker thread", e); } finally { - HibernateSessionManager.closeSession(); try { + HibernateSessionManager.closeSession(); Thread.sleep(SendWorker.CHECK_INTERVAL); - } catch (InterruptedException e) { - LearningWebsocketServer.log.warn("Stopping Mindmap worker thread"); + } catch (IllegalStateException | InterruptedException e) { stopFlag = true; + LearningWebsocketServer.log.warn("Stopping Mindmap worker thread"); } } } Index: lams_tool_scratchie/src/java/org/lamsfoundation/lams/tool/scratchie/web/controller/LearningWebsocketServer.java =================================================================== diff -u -r9b4a3799f9589dbda9a792e10a4ebd649db1e3db -r18a207719c2aa30f683987fd0bb9176521b704de --- lams_tool_scratchie/src/java/org/lamsfoundation/lams/tool/scratchie/web/controller/LearningWebsocketServer.java (.../LearningWebsocketServer.java) (revision 9b4a3799f9589dbda9a792e10a4ebd649db1e3db) +++ lams_tool_scratchie/src/java/org/lamsfoundation/lams/tool/scratchie/web/controller/LearningWebsocketServer.java (.../LearningWebsocketServer.java) (revision 18a207719c2aa30f683987fd0bb9176521b704de) @@ -56,6 +56,7 @@ try { // websocket communication bypasses standard HTTP filters, so Hibernate session needs to be initialised manually HibernateSessionManager.openSession(); + Iterator>> entryIterator = LearningWebsocketServer.websockets.entrySet() .iterator(); // go through activities and update registered learners with reports and vote count @@ -122,16 +123,18 @@ SendWorker.send(toolSessionId); } } + } catch (IllegalStateException e) { + // do nothing as server is probably shutting down and we could not obtain Hibernate session } catch (Exception e) { // error caught, but carry on log.error("Error in Scratchie worker thread", e); } finally { - HibernateSessionManager.closeSession(); try { + HibernateSessionManager.closeSession(); Thread.sleep(SendWorker.CHECK_INTERVAL); - } catch (InterruptedException e) { - log.warn("Stopping Scratchie worker thread"); + } catch (IllegalStateException | InterruptedException e) { stopFlag = true; + LearningWebsocketServer.log.warn("Stopping Scratchie worker thread"); } } } @@ -140,7 +143,6 @@ /** * Feeds websockets with scratched answers. */ - @SuppressWarnings("unchecked") private static void send(Long toolSessionId) throws IOException { ObjectNode responseJSON = JsonNodeFactory.instance.objectNode(); @@ -152,7 +154,7 @@ // do not init variables below until it's really needed Map itemCache = null; ObjectNode itemJSON = null; - for (ScratchieAnswer answer : (Set) item.getAnswers()) { + for (ScratchieAnswer answer : item.getAnswers()) { if (answer.isScratched()) { // answer is scratched, check if it is present in cache if (itemCache == null) { @@ -227,8 +229,8 @@ sessionWebsockets.add(websocket); if (log.isDebugEnabled()) { - log.debug("User " + websocket.getUserPrincipal().getName() - + " entered Scratchie with toolSessionId: " + toolSessionId); + log.debug("User " + websocket.getUserPrincipal().getName() + " entered Scratchie with toolSessionId: " + + toolSessionId); } } @@ -243,8 +245,8 @@ if (log.isDebugEnabled()) { // If there was something wrong with the connection, put it into logs. - log.debug("User " + websocket.getUserPrincipal().getName() - + " left Scratchie with Tool Session ID: " + toolSessionId + log.debug("User " + websocket.getUserPrincipal().getName() + " left Scratchie with Tool Session ID: " + + toolSessionId + (!(reason.getCloseCode().equals(CloseCodes.GOING_AWAY) || reason.getCloseCode().equals(CloseCodes.NORMAL_CLOSURE)) ? ". Abnormal close. Code: " + reason.getCloseCode() + ". Reason: " Index: lams_tool_scribe/src/java/org/lamsfoundation/lams/tool/scribe/web/controller/LearningWebsocketServer.java =================================================================== diff -u -r3a932581b82347c4b65a2255dce5bf19d8e63c0a -r18a207719c2aa30f683987fd0bb9176521b704de --- lams_tool_scribe/src/java/org/lamsfoundation/lams/tool/scribe/web/controller/LearningWebsocketServer.java (.../LearningWebsocketServer.java) (revision 3a932581b82347c4b65a2255dce5bf19d8e63c0a) +++ lams_tool_scribe/src/java/org/lamsfoundation/lams/tool/scribe/web/controller/LearningWebsocketServer.java (.../LearningWebsocketServer.java) (revision 18a207719c2aa30f683987fd0bb9176521b704de) @@ -66,6 +66,7 @@ try { // websocket communication bypasses standard HTTP filters, so Hibernate session needs to be initialised manually HibernateSessionManager.openSession(); + Iterator>> entryIterator = LearningWebsocketServer.websockets.entrySet() .iterator(); // go through activities and update registered learners with reports and vote count @@ -89,16 +90,18 @@ SendWorker.send(toolSessionId, null); } + } catch (IllegalStateException e) { + // do nothing as server is probably shutting down and we could not obtain Hibernate session } catch (Exception e) { // error caught, but carry on LearningWebsocketServer.log.error("Error in Scribe worker thread", e); } finally { - HibernateSessionManager.closeSession(); try { + HibernateSessionManager.closeSession(); Thread.sleep(SendWorker.CHECK_INTERVAL); - } catch (InterruptedException e) { - LearningWebsocketServer.log.warn("Stopping Scribe worker thread"); + } catch (IllegalStateException | InterruptedException e) { stopFlag = true; + LearningWebsocketServer.log.warn("Stopping Scribe worker thread"); } } } @@ -140,7 +143,7 @@ ArrayNode reportsJSON = JsonNodeFactory.instance.arrayNode(); synchronized (sessionCache) { - for (ScribeReportEntry storedReport : (Set) scribeSession.getScribeReportEntries()) { + for (ScribeReportEntry storedReport : scribeSession.getScribeReportEntries()) { Long uid = storedReport.getUid(); String cachedReportText = sessionCache.reports.get(uid); String storedReportText = HtmlUtils.htmlEscape(storedReport.getEntryText()); @@ -259,7 +262,7 @@ /** * Receives a message sent by Learner via a websocket. - * + * * @throws IOException * @throws JsonProcessingException */