Index: lams_build/lib/lams/lams.jar =================================================================== diff -u -rc4e67ef9e2b2cbed54f54e96807f820a4a2e9e1f -r0ad005fccfb4565f26a51ccd1bb1c24d0666aa6e Binary files differ Index: lams_common/src/java/org/lamsfoundation/lams/tool/service/ILamsToolService.java =================================================================== diff -u -r51fb2a37254f24bb2a805d4ffd54482c779f43fa -r0ad005fccfb4565f26a51ccd1bb1c24d0666aa6e --- lams_common/src/java/org/lamsfoundation/lams/tool/service/ILamsToolService.java (.../ILamsToolService.java) (revision 51fb2a37254f24bb2a805d4ffd54482c779f43fa) +++ lams_common/src/java/org/lamsfoundation/lams/tool/service/ILamsToolService.java (.../ILamsToolService.java) (revision 0ad005fccfb4565f26a51ccd1bb1c24d0666aa6e) @@ -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 =================================================================== diff -u -rce9f4e0c6d1e5814bf0dcb0fa16ae888a8c854a3 -r0ad005fccfb4565f26a51ccd1bb1c24d0666aa6e --- lams_common/src/java/org/lamsfoundation/lams/tool/service/LamsToolService.java (.../LamsToolService.java) (revision ce9f4e0c6d1e5814bf0dcb0fa16ae888a8c854a3) +++ lams_common/src/java/org/lamsfoundation/lams/tool/service/LamsToolService.java (.../LamsToolService.java) (revision 0ad005fccfb4565f26a51ccd1bb1c24d0666aa6e) @@ -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 =================================================================== diff -u -rd19a95db673b7cf90351de4d567299c5fa86b450 -r0ad005fccfb4565f26a51ccd1bb1c24d0666aa6e --- lams_monitoring/src/java/org/lamsfoundation/lams/monitoring/web/MonitoringAction.java (.../MonitoringAction.java) (revision d19a95db673b7cf90351de4d567299c5fa86b450) +++ lams_monitoring/src/java/org/lamsfoundation/lams/monitoring/web/MonitoringAction.java (.../MonitoringAction.java) (revision 0ad005fccfb4565f26a51ccd1bb1c24d0666aa6e) @@ -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 =================================================================== diff -u -r233d5788c376fd3dd6fc22221c3e290a8ed5fc69 -r0ad005fccfb4565f26a51ccd1bb1c24d0666aa6e --- lams_monitoring/web/includes/javascript/monitorLesson.js (.../monitorLesson.js) (revision 233d5788c376fd3dd6fc22221c3e290a8ed5fc69) +++ lams_monitoring/web/includes/javascript/monitorLesson.js (.../monitorLesson.js) (revision 0ad005fccfb4565f26a51ccd1bb1c24d0666aa6e) @@ -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);