Index: lams_build/lib/lams/lams.jar =================================================================== RCS file: /usr/local/cvsroot/lams_build/lib/lams/lams.jar,v diff -u -r1.420.2.86 -r1.420.2.87 Binary files differ Index: lams_common/src/java/org/lamsfoundation/lams/tool/service/ILamsToolService.java =================================================================== RCS file: /usr/local/cvsroot/lams_common/src/java/org/lamsfoundation/lams/tool/service/ILamsToolService.java,v diff -u -r1.26.2.5 -r1.26.2.6 --- lams_common/src/java/org/lamsfoundation/lams/tool/service/ILamsToolService.java 11 May 2016 07:07:27 -0000 1.26.2.5 +++ lams_common/src/java/org/lamsfoundation/lams/tool/service/ILamsToolService.java 16 Aug 2016 19:04:12 -0000 1.26.2.6 @@ -23,6 +23,7 @@ package org.lamsfoundation.lams.tool.service; import java.io.IOException; +import java.util.Set; import org.lamsfoundation.lams.tool.IToolVO; import org.lamsfoundation.lams.tool.Tool; @@ -38,6 +39,8 @@ * @author Ozgur Demirtas 24/06/2005 */ public interface ILamsToolService { + public static final String LEADER_SELECTION_TOOL_SIGNATURE = "lalead11"; + IToolVO getToolByID(Long toolId); IToolVO getToolBySignature(final String toolSignature); @@ -101,6 +104,11 @@ Long getLeaderUserId(Long toolSessionId, Integer learnerId); /** + * Returns leaders' userIds for all tool sessions from the given Leader Selection Tool. + */ + Set getLeaderUserId(Long leaderSelectionActivityId); + + /** * Get a count of all the users that would be returned by getUsersForActivity(Long toolSessionId); */ Integer getCountUsersForActivity(Long toolSessionId); Index: lams_common/src/java/org/lamsfoundation/lams/tool/service/LamsToolService.java =================================================================== RCS file: /usr/local/cvsroot/lams_common/src/java/org/lamsfoundation/lams/tool/service/LamsToolService.java,v diff -u -r1.29.2.7 -r1.29.2.8 --- lams_common/src/java/org/lamsfoundation/lams/tool/service/LamsToolService.java 15 Jun 2016 08:02:53 -0000 1.29.2.7 +++ lams_common/src/java/org/lamsfoundation/lams/tool/service/LamsToolService.java 16 Aug 2016 19:04:12 -0000 1.29.2.8 @@ -29,6 +29,7 @@ import java.util.List; import java.util.Map; import java.util.Set; +import java.util.TreeSet; import org.apache.commons.lang.StringUtils; import org.apache.log4j.Logger; @@ -43,9 +44,6 @@ import org.lamsfoundation.lams.learningdesign.dao.IActivityDAO; import org.lamsfoundation.lams.lesson.CompletedActivityProgress; import org.lamsfoundation.lams.lesson.LearnerProgress; -import org.lamsfoundation.lams.lesson.Lesson; -import org.lamsfoundation.lams.lesson.dao.ILearnerProgressDAO; -import org.lamsfoundation.lams.lesson.dao.ILessonDAO; import org.lamsfoundation.lams.lesson.service.ILessonService; import org.lamsfoundation.lams.tool.IToolVO; import org.lamsfoundation.lams.tool.Tool; @@ -71,7 +69,6 @@ private static Logger log = Logger.getLogger(LamsToolService.class); // Leader selection tool Constants - private static final String LEADER_SELECTION_TOOL_SIGNATURE = "lalead11"; private static final String LEADER_SELECTION_TOOL_OUTPUT_NAME_LEADER_USERID = "leader.user.id"; private IActivityDAO activityDAO; @@ -241,6 +238,25 @@ return leaderUserId; } + @Override + @SuppressWarnings("unchecked") + public Set getLeaderUserId(Long leaderSelectionActivityId) { + Activity activity = activityDAO.getActivityByActivityId(leaderSelectionActivityId); + List toolSessions = toolSessionDAO.getToolSessionByActivity(activity); + Set result = new TreeSet(); + for (ToolSession toolSession : toolSessions) { + ToolOutput output = lamsCoreToolService.getOutputFromTool(LEADER_SELECTION_TOOL_OUTPUT_NAME_LEADER_USERID, + toolSession, null); + + // check if tool produced output + if ((output != null) && (output.getValue() != null)) { + result.add(output.getValue().getLong()); + } + } + + return result; + } + /** * Finds the nearest Leader Select activity. Works recursively. Tries to find Leader Select activity in the previous * activities set first, and then inside the parent set. Index: lams_monitoring/src/java/org/lamsfoundation/lams/monitoring/web/MonitoringAction.java =================================================================== RCS file: /usr/local/cvsroot/lams_monitoring/src/java/org/lamsfoundation/lams/monitoring/web/MonitoringAction.java,v diff -u -r1.118.2.46 -r1.118.2.47 --- lams_monitoring/src/java/org/lamsfoundation/lams/monitoring/web/MonitoringAction.java 11 Aug 2016 13:19:14 -0000 1.118.2.46 +++ lams_monitoring/src/java/org/lamsfoundation/lams/monitoring/web/MonitoringAction.java 16 Aug 2016 19:04:49 -0000 1.118.2.47 @@ -65,6 +65,7 @@ import org.lamsfoundation.lams.learningdesign.LearningDesign; import org.lamsfoundation.lams.learningdesign.OptionsWithSequencesActivity; import org.lamsfoundation.lams.learningdesign.SequenceActivity; +import org.lamsfoundation.lams.learningdesign.ToolActivity; import org.lamsfoundation.lams.learningdesign.Transition; import org.lamsfoundation.lams.learningdesign.exception.LearningDesignException; import org.lamsfoundation.lams.lesson.LearnerProgress; @@ -77,6 +78,7 @@ import org.lamsfoundation.lams.monitoring.service.MonitoringServiceProxy; import org.lamsfoundation.lams.security.ISecurityService; import org.lamsfoundation.lams.tool.exception.LamsToolServiceException; +import org.lamsfoundation.lams.tool.service.ILamsToolService; import org.lamsfoundation.lams.usermanagement.Organisation; import org.lamsfoundation.lams.usermanagement.Role; import org.lamsfoundation.lams.usermanagement.User; @@ -134,6 +136,8 @@ private static ILearnerService learnerService; + private static ILamsToolService toolService; + private static MessageService messageService; private Integer getUserId() { @@ -1092,9 +1096,19 @@ // Fetch number of learners at each activity ArrayList activityIds = new ArrayList(); + Set leaders = new TreeSet(); for (Activity activity : activities) { activityIds.add(activity.getActivityId()); + // find leaders from Leader Selection Tool + if (activity.isToolActivity()) { + ToolActivity toolActivity = (ToolActivity) activity; + if (ILamsToolService.LEADER_SELECTION_TOOL_SIGNATURE + .equals(toolActivity.getTool().getToolSignature())) { + leaders.addAll(getToolService().getLeaderUserId(activity.getActivityId())); + } + } } + Map learnerCounts = getMonitoringService() .getCountLearnersCurrentActivities(activityIds.toArray(new Long[activityIds.size()])); @@ -1142,19 +1156,35 @@ List latestLearners = getMonitoringService().getLearnersLatestByActivity(activity.getActivityId(), MonitoringAction.LATEST_LEARNER_PROGRESS_ACTIVITY_DISPLAY_LIMIT, null); + // insert leaders as first of learners + for (Long leaderId : leaders) { + for (User learner : latestLearners) { + if (learner.getUserId().equals(leaderId.intValue())) { + latestLearners = MonitoringAction.insertHighlightedLearner(learner, latestLearners, + MonitoringAction.LATEST_LEARNER_PROGRESS_ACTIVITY_DISPLAY_LIMIT); + break; + } + } + } + + // insert the searched learner as the first one if ((searchedLearnerProgress != null) && (searchedLearnerProgress.getCurrentActivity() != null) && activity.getActivityId() .equals(searchedLearnerProgress.getCurrentActivity().getActivityId())) { // put the searched learner in front - latestLearners = MonitoringAction.insertSearchedLearner(searchedLearnerProgress.getUser(), + latestLearners = MonitoringAction.insertHighlightedLearner(searchedLearnerProgress.getUser(), latestLearners, MonitoringAction.LATEST_LEARNER_PROGRESS_ACTIVITY_DISPLAY_LIMIT); } // parse learners into JSON format if (!latestLearners.isEmpty()) { JSONArray learnersJSON = new JSONArray(); for (User learner : latestLearners) { - learnersJSON.put(WebUtil.userToJSON(learner)); + JSONObject userJSON = WebUtil.userToJSON(learner); + if (leaders.contains(learner.getUserId().longValue())) { + userJSON.put("leader", true); + } + learnersJSON.put(userJSON); } activityJSON.put("learners", learnersJSON); @@ -1179,7 +1209,7 @@ if ((searchedLearnerProgress != null) && searchedLearnerProgress.isComplete()) { // put the searched learner in front - completedLearners = MonitoringAction.insertSearchedLearner(searchedLearnerProgress.getUser(), + completedLearners = MonitoringAction.insertHighlightedLearner(searchedLearnerProgress.getUser(), completedLearners, MonitoringAction.LATEST_LEARNER_PROGRESS_LESSON_DISPLAY_LIMIT); } for (User learner : completedLearners) { @@ -1415,6 +1445,15 @@ return MonitoringAction.messageService; } + private ILamsToolService getToolService() { + if (MonitoringAction.toolService == null) { + WebApplicationContext ctx = WebApplicationContextUtils + .getRequiredWebApplicationContext(getServlet().getServletContext()); + MonitoringAction.toolService = (ILamsToolService) ctx.getBean("lamsToolService"); + } + return MonitoringAction.toolService; + } + /** * Set whether or not the presence available button is available in learner. Expects parameters lessonID and * presenceAvailable. @@ -1554,7 +1593,7 @@ /** * Puts the searched learner in front of other learners in the list. */ - private static List insertSearchedLearner(User searchedLearner, List latestLearners, int limit) { + private static List insertHighlightedLearner(User searchedLearner, List latestLearners, int limit) { latestLearners.remove(searchedLearner); LinkedList updatedLatestLearners = new LinkedList(latestLearners); updatedLatestLearners.addFirst(searchedLearner); Index: lams_monitoring/web/includes/javascript/monitorLesson.js =================================================================== RCS file: /usr/local/cvsroot/lams_monitoring/web/includes/javascript/monitorLesson.js,v diff -u -r1.44.2.34 -r1.44.2.35 --- lams_monitoring/web/includes/javascript/monitorLesson.js 15 Aug 2016 10:20:12 -0000 1.44.2.34 +++ lams_monitoring/web/includes/javascript/monitorLesson.js 16 Aug 2016 19:04:49 -0000 1.44.2.35 @@ -1105,7 +1105,8 @@ 'height' : 16, 'width' : 16, 'xlink:href' : LAMS_URL + 'images/icons/' - + (learner.id == sequenceSearchedLearner ? 'user_red.png' : 'user.png'), + + (learner.id == sequenceSearchedLearner ? 'user_red.png' + : (learner.leader ? 'user_online.png' : 'user.png')), 'style' : 'cursor : pointer' }, null, appendTarget); appendXMLElement('title', null, learnerDisplayName, element);