Index: lams_tool_leader/.classpath =================================================================== diff -u -r0fdf00ad8ffebc0cc6d79de96a216c08ce0d4cdf -rac8b64b03ce6d8c718e55823f23fd995159b7ca0 --- lams_tool_leader/.classpath (.../.classpath) (revision 0fdf00ad8ffebc0cc6d79de96a216c08ce0d4cdf) +++ lams_tool_leader/.classpath (.../.classpath) (revision ac8b64b03ce6d8c718e55823f23fd995159b7ca0) @@ -25,5 +25,6 @@ + Index: lams_tool_leader/build.xml =================================================================== diff -u -r17ddd3aac11d9fecc83159a9c829e989754accfb -rac8b64b03ce6d8c718e55823f23fd995159b7ca0 --- lams_tool_leader/build.xml (.../build.xml) (revision 17ddd3aac11d9fecc83159a9c829e989754accfb) +++ lams_tool_leader/build.xml (.../build.xml) (revision ac8b64b03ce6d8c718e55823f23fd995159b7ca0) @@ -4,4 +4,23 @@ + + + + + ${ant.project.name}: Copying additional Java classes to WAR + + + Index: lams_tool_leader/src/java/org/lamsfoundation/lams/tool/leaderselection/service/ILeaderselectionService.java =================================================================== diff -u -r2f725f8ef2aa09a2663b2335bf67213074426d11 -rac8b64b03ce6d8c718e55823f23fd995159b7ca0 --- lams_tool_leader/src/java/org/lamsfoundation/lams/tool/leaderselection/service/ILeaderselectionService.java (.../ILeaderselectionService.java) (revision 2f725f8ef2aa09a2663b2335bf67213074426d11) +++ lams_tool_leader/src/java/org/lamsfoundation/lams/tool/leaderselection/service/ILeaderselectionService.java (.../ILeaderselectionService.java) (revision ac8b64b03ce6d8c718e55823f23fd995159b7ca0) @@ -24,8 +24,10 @@ package org.lamsfoundation.lams.tool.leaderselection.service; +import java.io.IOException; import java.util.List; +import org.apache.tomcat.util.json.JSONException; import org.lamsfoundation.lams.notebook.model.NotebookEntry; import org.lamsfoundation.lams.tool.leaderselection.model.Leaderselection; import org.lamsfoundation.lams.tool.leaderselection.model.LeaderselectionSession; @@ -50,8 +52,10 @@ * * @param userId * @param toolSessionId + * @throws IOException + * @throws JSONException */ - void setGroupLeader(Long userId, Long toolSessionId); + void setGroupLeader(Long userId, Long toolSessionId) throws JSONException, IOException; /** * Makes a copy of the default content and assigns it a newContentID Index: lams_tool_leader/src/java/org/lamsfoundation/lams/tool/leaderselection/service/LeaderselectionService.java =================================================================== diff -u -rd1d97d8c7da9ec5a96332afba14fa04970882bf9 -rac8b64b03ce6d8c718e55823f23fd995159b7ca0 --- lams_tool_leader/src/java/org/lamsfoundation/lams/tool/leaderselection/service/LeaderselectionService.java (.../LeaderselectionService.java) (revision d1d97d8c7da9ec5a96332afba14fa04970882bf9) +++ lams_tool_leader/src/java/org/lamsfoundation/lams/tool/leaderselection/service/LeaderselectionService.java (.../LeaderselectionService.java) (revision ac8b64b03ce6d8c718e55823f23fd995159b7ca0) @@ -24,6 +24,7 @@ package org.lamsfoundation.lams.tool.leaderselection.service; +import java.io.IOException; import java.util.ArrayList; import java.util.Date; import java.util.List; @@ -67,6 +68,7 @@ import org.lamsfoundation.lams.tool.leaderselection.util.LeaderselectionConstants; import org.lamsfoundation.lams.tool.leaderselection.util.LeaderselectionException; import org.lamsfoundation.lams.tool.leaderselection.util.LeaderselectionToolContentHandler; +import org.lamsfoundation.lams.tool.leaderselection.web.actions.LearningWebsocketServer; import org.lamsfoundation.lams.tool.service.ILamsToolService; import org.lamsfoundation.lams.usermanagement.User; import org.lamsfoundation.lams.usermanagement.dto.UserDTO; @@ -332,7 +334,7 @@ /* ********** ILeaderselectionService Methods ********************************* */ @Override - public void setGroupLeader(Long userUid, Long toolSessionId) { + public void setGroupLeader(Long userUid, Long toolSessionId) throws JSONException, IOException { if ((userUid == null) || (toolSessionId == null)) { return; } @@ -347,6 +349,8 @@ session.setGroupLeader(newLeader); saveOrUpdateSession(session); + + LearningWebsocketServer.sendPageRefreshRequest(toolSessionId); } @Override Index: lams_tool_leader/src/java/org/lamsfoundation/lams/tool/leaderselection/web/actions/LearningAction.java =================================================================== diff -u -r2f725f8ef2aa09a2663b2335bf67213074426d11 -rac8b64b03ce6d8c718e55823f23fd995159b7ca0 --- lams_tool_leader/src/java/org/lamsfoundation/lams/tool/leaderselection/web/actions/LearningAction.java (.../LearningAction.java) (revision 2f725f8ef2aa09a2663b2335bf67213074426d11) +++ lams_tool_leader/src/java/org/lamsfoundation/lams/tool/leaderselection/web/actions/LearningAction.java (.../LearningAction.java) (revision ac8b64b03ce6d8c718e55823f23fd995159b7ca0) @@ -34,6 +34,7 @@ import org.apache.struts.action.ActionForm; import org.apache.struts.action.ActionForward; import org.apache.struts.action.ActionMapping; +import org.apache.tomcat.util.json.JSONException; import org.lamsfoundation.lams.learning.web.util.LearningWebUtil; import org.lamsfoundation.lams.tool.ToolAccessMode; import org.lamsfoundation.lams.tool.ToolSessionManager; @@ -123,9 +124,10 @@ /** * Sets current user as a leader of a group. + * @throws JSONException */ public ActionForward becomeLeader(ActionMapping mapping, ActionForm form, HttpServletRequest request, - HttpServletResponse response) throws IOException { + HttpServletResponse response) throws IOException, JSONException { initService(); Long toolSessionId = new Long(request.getParameter(AttributeNames.PARAM_TOOL_SESSION_ID)); LeaderselectionSession session = service.getSessionBySessionId(toolSessionId); Index: lams_tool_leader/src/java/org/lamsfoundation/lams/tool/leaderselection/web/actions/LearningWebsocketServer.java =================================================================== diff -u --- lams_tool_leader/src/java/org/lamsfoundation/lams/tool/leaderselection/web/actions/LearningWebsocketServer.java (revision 0) +++ lams_tool_leader/src/java/org/lamsfoundation/lams/tool/leaderselection/web/actions/LearningWebsocketServer.java (revision ac8b64b03ce6d8c718e55823f23fd995159b7ca0) @@ -0,0 +1,100 @@ +package org.lamsfoundation.lams.tool.leaderselection.web.actions; + +import java.io.IOException; +import java.util.Collections; +import java.util.HashSet; +import java.util.Map; +import java.util.Set; +import java.util.TreeMap; + +import javax.websocket.CloseReason; +import javax.websocket.CloseReason.CloseCodes; +import javax.websocket.OnClose; +import javax.websocket.OnOpen; +import javax.websocket.Session; +import javax.websocket.server.ServerEndpoint; + +import org.apache.log4j.Logger; +import org.apache.tomcat.util.json.JSONException; +import org.apache.tomcat.util.json.JSONObject; +import org.lamsfoundation.lams.web.util.AttributeNames; + +/** + * Sends leader has been selected event to the learners. + * + * @author Marcin Cieslak + * @author Andrey Balan + */ +@ServerEndpoint("/learningWebsocket") +public class LearningWebsocketServer { + + private static Logger log = Logger.getLogger(LearningWebsocketServer.class); + + private static final Map> websockets = Collections + .synchronizedMap(new TreeMap>()); + + /** + * Registeres the Learner for processing by SendWorker. + */ + @OnOpen + public void registerUser(Session websocket) throws JSONException, IOException { + Long toolSessionId = Long + .valueOf(websocket.getRequestParameterMap().get(AttributeNames.PARAM_TOOL_SESSION_ID).get(0)); + Set sessionWebsockets = websockets.get(toolSessionId); + if (sessionWebsockets == null) { + sessionWebsockets = Collections.synchronizedSet(new HashSet()); + websockets.put(toolSessionId, sessionWebsockets); + } + sessionWebsockets.add(websocket); + + if (log.isDebugEnabled()) { + log.debug("User " + websocket.getUserPrincipal().getName() + + " entered Leader Selection with toolSessionId: " + toolSessionId); + } + } + + /** + * When user leaves the activity. + */ + @OnClose + public void unregisterUser(Session websocket, CloseReason reason) { + Long toolSessionId = Long + .valueOf(websocket.getRequestParameterMap().get(AttributeNames.PARAM_TOOL_SESSION_ID).get(0)); + websockets.get(toolSessionId).remove(websocket); + + if (log.isDebugEnabled()) { + // If there was something wrong with the connection, put it into logs. + log.debug("User " + websocket.getUserPrincipal().getName() + " left Leader Selection with Tool Session ID: " + + toolSessionId + + (!(reason.getCloseCode().equals(CloseCodes.GOING_AWAY) + || reason.getCloseCode().equals(CloseCodes.NORMAL_CLOSURE)) + ? ". Abnormal close. Code: " + reason.getCloseCode() + ". Reason: " + + reason.getReasonPhrase() + : "")); + } + } + + /** + * This method is called when leader has just been selected and all non-leaders should refresh their pages in order + * to see new leader name and a Finish button. + */ + public static void sendPageRefreshRequest(Long toolSessionId) throws JSONException, IOException { + Set sessionWebsockets = websockets.get(toolSessionId); + if (sessionWebsockets == null) { + return; + } + // make a copy of the websocket collection so it does not get blocked while sending messages + sessionWebsockets = new HashSet(sessionWebsockets); + + JSONObject responseJSON = new JSONObject(); + responseJSON.put("pageRefresh", true); + String response = responseJSON.toString(); + + for (Session websocket : sessionWebsockets) { + if (websocket.isOpen()) { + websocket.getBasicRemote().sendText(response); + } + } + } + +} \ No newline at end of file Index: lams_tool_leader/src/java/org/lamsfoundation/lams/tool/leaderselection/web/actions/MonitoringAction.java =================================================================== diff -u -r2f725f8ef2aa09a2663b2335bf67213074426d11 -rac8b64b03ce6d8c718e55823f23fd995159b7ca0 --- lams_tool_leader/src/java/org/lamsfoundation/lams/tool/leaderselection/web/actions/MonitoringAction.java (.../MonitoringAction.java) (revision 2f725f8ef2aa09a2663b2335bf67213074426d11) +++ lams_tool_leader/src/java/org/lamsfoundation/lams/tool/leaderselection/web/actions/MonitoringAction.java (.../MonitoringAction.java) (revision ac8b64b03ce6d8c718e55823f23fd995159b7ca0) @@ -24,13 +24,16 @@ package org.lamsfoundation.lams.tool.leaderselection.web.actions; +import java.io.IOException; + import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.apache.log4j.Logger; import org.apache.struts.action.ActionForm; import org.apache.struts.action.ActionForward; import org.apache.struts.action.ActionMapping; +import org.apache.tomcat.util.json.JSONException; import org.lamsfoundation.lams.tool.leaderselection.dto.LeaderselectionDTO; import org.lamsfoundation.lams.tool.leaderselection.dto.LeaderselectionSessionDTO; import org.lamsfoundation.lams.tool.leaderselection.model.Leaderselection; @@ -108,9 +111,11 @@ /** * Save selected users as a leaders + * @throws IOException + * @throws JSONException */ public ActionForward saveLeaders(ActionMapping mapping, ActionForm form, HttpServletRequest request, - HttpServletResponse response) { + HttpServletResponse response) throws JSONException, IOException { String sessionMapID = request.getParameter(LeaderselectionConstants.ATTR_SESSION_MAP_ID); SessionMap sessionMap = (SessionMap) request.getSession() .getAttribute(sessionMapID); Index: lams_tool_leader/web/pages/learning/leaderselection.jsp =================================================================== diff -u -r81a1bebac96f545fd87b1c957388fdc87ac5da4e -rac8b64b03ce6d8c718e55823f23fd995159b7ca0 --- lams_tool_leader/web/pages/learning/leaderselection.jsp (.../leaderselection.jsp) (revision 81a1bebac96f545fd87b1c957388fdc87ac5da4e) +++ lams_tool_leader/web/pages/learning/leaderselection.jsp (.../leaderselection.jsp) (revision ac8b64b03ce6d8c718e55823f23fd995159b7ca0) @@ -2,37 +2,50 @@ - - @@ -60,27 +73,31 @@ - - - Refresh - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + - - - - @@ -113,20 +130,15 @@ + - - - - -