Index: lams_gradebook/src/java/org/lamsfoundation/lams/gradebook/dto/GBActivityGridRowDTO.java =================================================================== diff -u -r326536a361492c004c6747e17e096fd1dcff5254 -r26cce7618c8f32ad2ec6a31a85b63ca4de659d87 --- lams_gradebook/src/java/org/lamsfoundation/lams/gradebook/dto/GBActivityGridRowDTO.java (.../GBActivityGridRowDTO.java) (revision 326536a361492c004c6747e17e096fd1dcff5254) +++ lams_gradebook/src/java/org/lamsfoundation/lams/gradebook/dto/GBActivityGridRowDTO.java (.../GBActivityGridRowDTO.java) (revision 26cce7618c8f32ad2ec6a31a85b63ca4de659d87) @@ -25,29 +25,27 @@ import java.util.ArrayList; import java.util.Date; +import java.util.Set; import org.lamsfoundation.lams.gradebook.util.GBGridView; +import org.lamsfoundation.lams.learningdesign.CompetenceMapping; +import org.lamsfoundation.lams.learningdesign.ToolActivity; public class GBActivityGridRowDTO extends GradebookGridRowDTO { public static final String VIEW_USER = "userView"; public static final String VIEW_ACTIVITY = "activityView"; - String competences; - //String toolString; + private String competences; // Properties for user view - String status; - String output; - String activityUrl; - //double timeTaken; - String feedback; - Date startDate; + private String output; + private String activityUrl; + private Date startDate; - // Properties for activity view - String monitorUrl; - Long groupId; + private String monitorUrl; + private Long groupId; public Long getGroupId() { return groupId; @@ -57,7 +55,36 @@ this.groupId = groupId; } - public GBActivityGridRowDTO() { + public GBActivityGridRowDTO(ToolActivity activity, String groupName, Long groupId) { + + if (groupName != null && groupId != null) { + // Need to make the id unique, so appending the group id for this row + this.id = activity.getActivityId().toString() + "_" + groupId.toString(); + + this.groupId = groupId; + // If grouped acitivty, append group name + this.rowName = activity.getTitle() + " (" + groupName + ")"; + } else { + this.id = activity.getActivityId().toString(); + + this.rowName = activity.getTitle(); + } + + //Constructs the competences for this activity. + Set competenceMappings = activity.getCompetenceMappings(); + String competenceMappingsStr = ""; + if (competenceMappings != null) { + for (CompetenceMapping mapping : competenceMappings) { + competenceMappingsStr += mapping.getCompetence().getTitle() + ", "; + } + + // trim the last comma off + if (competenceMappingsStr.length() > 0) { + competenceMappingsStr = competenceMappingsStr.substring(0, competenceMappingsStr.lastIndexOf(",")); + } + } + + this.competences = competenceMappingsStr; } @Override @@ -114,14 +141,6 @@ return ret; } - public String getStatus() { - return status; - } - - public void setStatus(String status) { - this.status = status; - } - public String getOutput() { return output; } @@ -146,14 +165,6 @@ this.activityUrl = activityUrl; } - public String getFeedback() { - return feedback; - } - - public void setFeedback(String feedback) { - this.feedback = feedback; - } - public String getMonitorUrl() { return monitorUrl; } Index: lams_gradebook/src/java/org/lamsfoundation/lams/gradebook/dto/GBLessonGridRowDTO.java =================================================================== diff -u -r351695e545e0997681c3d5a5f1b60e18acff7e04 -r26cce7618c8f32ad2ec6a31a85b63ca4de659d87 --- lams_gradebook/src/java/org/lamsfoundation/lams/gradebook/dto/GBLessonGridRowDTO.java (.../GBLessonGridRowDTO.java) (revision 351695e545e0997681c3d5a5f1b60e18acff7e04) +++ lams_gradebook/src/java/org/lamsfoundation/lams/gradebook/dto/GBLessonGridRowDTO.java (.../GBLessonGridRowDTO.java) (revision 26cce7618c8f32ad2ec6a31a85b63ca4de659d87) @@ -32,17 +32,15 @@ public static final String VIEW_MONITOR = "monitorView"; public static final String VIEW_LEARNER = "learnerView"; - String subGroup; - String startDate; + private String subGroup; + private String startDate; // Only for monitor view - String gradebookMonitorURL; + private String gradebookMonitorURL; // Only for learner view - String gradebookLearnerURL; - String finishDate; - String status; - String feedback; + private String gradebookLearnerURL; + private String finishDate; public GBLessonGridRowDTO() { } @@ -133,22 +131,6 @@ public void setFinishDate(String finishDate) { this.finishDate = finishDate; } - - public String getStatus() { - return status; - } - - public void setStatus(String status) { - this.status = status; - } - - public String getFeedback() { - return feedback; - } - - public void setFeedback(String feedback) { - this.feedback = feedback; - } } Index: lams_gradebook/src/java/org/lamsfoundation/lams/gradebook/dto/GBUserGridRowDTO.java =================================================================== diff -u -r1aed494b3b9aeb79f7837c12b15cd1330b3020fa -r26cce7618c8f32ad2ec6a31a85b63ca4de659d87 --- lams_gradebook/src/java/org/lamsfoundation/lams/gradebook/dto/GBUserGridRowDTO.java (.../GBUserGridRowDTO.java) (revision 1aed494b3b9aeb79f7837c12b15cd1330b3020fa) +++ lams_gradebook/src/java/org/lamsfoundation/lams/gradebook/dto/GBUserGridRowDTO.java (.../GBUserGridRowDTO.java) (revision 26cce7618c8f32ad2ec6a31a85b63ca4de659d87) @@ -27,24 +27,29 @@ import java.util.Date; import org.lamsfoundation.lams.gradebook.util.GBGridView; +import org.lamsfoundation.lams.usermanagement.User; public class GBUserGridRowDTO extends GradebookGridRowDTO { - String status; - String feedback; - // For activity view - Date startDate; - String output; - String activityUrl; + private Date startDate; + private String output; + private String activityUrl; // For excel export - String firstName; - String lastName; - String currentActivity; + private String firstName; + private String lastName; + private String currentActivity; public GBUserGridRowDTO() { } + + public GBUserGridRowDTO(User user) { + this.id = user.getUserId().toString(); + this.rowName = user.getLastName() + " " + user.getFirstName(); + this.firstName = user.getFirstName(); + this.lastName = user.getLastName(); + } @Override public ArrayList toStringArray(GBGridView view) { @@ -90,22 +95,6 @@ return ret; } - public String getStatus() { - return status; - } - - public void setStatus(String status) { - this.status = status; - } - - public String getFeedback() { - return feedback; - } - - public void setFeedback(String feedback) { - this.feedback = feedback; - } - public String getOutput() { return output; } Index: lams_gradebook/src/java/org/lamsfoundation/lams/gradebook/dto/GradebookGridRowDTO.java =================================================================== diff -u -r1aed494b3b9aeb79f7837c12b15cd1330b3020fa -r26cce7618c8f32ad2ec6a31a85b63ca4de659d87 --- lams_gradebook/src/java/org/lamsfoundation/lams/gradebook/dto/GradebookGridRowDTO.java (.../GradebookGridRowDTO.java) (revision 1aed494b3b9aeb79f7837c12b15cd1330b3020fa) +++ lams_gradebook/src/java/org/lamsfoundation/lams/gradebook/dto/GradebookGridRowDTO.java (.../GradebookGridRowDTO.java) (revision 26cce7618c8f32ad2ec6a31a85b63ca4de659d87) @@ -25,7 +25,6 @@ import java.text.DateFormat; import java.text.DecimalFormat; -import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Date; @@ -35,32 +34,35 @@ public abstract ArrayList toStringArray(GBGridView view); - public static final String CELL_EMPTY = "-"; + protected static final String CELL_EMPTY = "-"; - public static final DateFormat DEFAULT_DATE_FORMAT = DateFormat.getDateTimeInstance(DateFormat.SHORT, + protected static final DateFormat DEFAULT_DATE_FORMAT = DateFormat.getDateTimeInstance(DateFormat.SHORT, DateFormat.SHORT); // The id for a row, might be activityId, userId, lessonID etc - public String id; + protected String id; // The name for the row, every gradebook row has some sort of name // Be it the user's name, the activity name, the lesson name etc - public String rowName; + protected String rowName; // A unit of time in milliseconds that determines the time taken for the corressponding task - public Long timeTaken; + protected Long timeTaken; // Another unit of time that represents average time taken for a corresponding task - public Long averageTimeTaken; + protected Long averageTimeTaken; // The mark for the corresponding gradebook grid row task - public Double mark; + protected Double mark; // Average mark for the corresponding task - public Double averageMark; + protected Double averageMark; // Number of marks available where applicable - public Long marksAvailable; + protected Long marksAvailable; + + protected String status; + protected String feedback; /** * A shared function to convert milliseconds into a readable string @@ -221,4 +223,20 @@ public void setMarksAvailable(Long marksAvailable) { this.marksAvailable = marksAvailable; } + + public String getStatus() { + return status; + } + + public void setStatus(String status) { + this.status = status; + } + + public String getFeedback() { + return feedback; + } + + public void setFeedback(String feedback) { + this.feedback = feedback; + } } Index: lams_gradebook/src/java/org/lamsfoundation/lams/gradebook/service/GradebookService.java =================================================================== diff -u -r351695e545e0997681c3d5a5f1b60e18acff7e04 -r26cce7618c8f32ad2ec6a31a85b63ca4de659d87 --- lams_gradebook/src/java/org/lamsfoundation/lams/gradebook/service/GradebookService.java (.../GradebookService.java) (revision 351695e545e0997681c3d5a5f1b60e18acff7e04) +++ lams_gradebook/src/java/org/lamsfoundation/lams/gradebook/service/GradebookService.java (.../GradebookService.java) (revision 26cce7618c8f32ad2ec6a31a85b63ca4de659d87) @@ -25,6 +25,7 @@ import java.text.DateFormat; import java.util.ArrayList; +import java.util.Collection; import java.util.Date; import java.util.HashMap; import java.util.HashSet; @@ -36,10 +37,10 @@ import java.util.Map; import java.util.Set; import java.util.SortedMap; -import java.util.SortedSet; import java.util.TimeZone; import java.util.TreeSet; +import org.apache.commons.collections.map.MultiKeyMap; import org.apache.commons.lang.StringUtils; import org.apache.log4j.Logger; import org.lamsfoundation.lams.dao.IBaseDAO; @@ -55,7 +56,6 @@ import org.lamsfoundation.lams.gradebook.util.LessonComparator; import org.lamsfoundation.lams.learningdesign.Activity; import org.lamsfoundation.lams.learningdesign.ActivityEvaluation; -import org.lamsfoundation.lams.learningdesign.CompetenceMapping; import org.lamsfoundation.lams.learningdesign.Group; import org.lamsfoundation.lams.learningdesign.Grouping; import org.lamsfoundation.lams.learningdesign.ToolActivity; @@ -102,10 +102,6 @@ private IActivityDAO activityDAO; private MessageService messageService; - /** - * @see org.lamsfoundation.lams.gradebook.service.IGradebookService#getGBActivityRowsForLearner(org.lamsfoundation.lams.lesson.Lesson, - * org.lamsfoundation.lams.usermanagement.User) - */ @SuppressWarnings("unchecked") public List getGBActivityRowsForLearner(Lesson lesson, User learner) { @@ -114,119 +110,92 @@ List gradebookActivityDTOs = new ArrayList(); - Map properties = new HashMap(); - properties.put("lesson", lesson); - properties.put("user", learner); - LearnerProgress learnerProgress = getLearnerProgress(lesson, learner); + Set activities = getLessonActivities(lesson); + for (ToolActivity activity : activities) { + + String groupName = null; + Long groupId = null; + if (activity.getGrouping() != null) { + Group group = activity.getGroupFor(learner); + if (group != null) { + groupName = group.getGroupName(); + groupId = group.getGroupId(); + } + } + GBActivityGridRowDTO activityDTO = new GBActivityGridRowDTO(activity, groupName, groupId); - Set activities = (Set) lesson.getLearningDesign().getActivities(); + // Set the possible marks if applicable + activityDTO.setMarksAvailable(this.getTotalMarksAvailable(activity)); - /* - * Hibernate CGLIB is failing to load the first activity in the sequence as a ToolActivity for some mysterious - * reason Causes a ClassCastException when you try to cast it, even if it is a ToolActivity. - * - * THIS IS A HACK to retrieve the first tool activity manually so it can be cast as a ToolActivity - if it is - * one - */ + GradebookUserActivity gradebookActivity = gradebookDAO.getGradebookUserDataForActivity( + activity.getActivityId(), learner.getUserId()); + if (gradebookActivity != null) { + activityDTO.setMark(gradebookActivity.getMark()); + activityDTO.setFeedback(gradebookActivity.getFeedback()); + } - Activity firstActivity = activityDAO.getActivityByActivityId(lesson.getLearningDesign().getFirstActivity() - .getActivityId()); + LearnerProgress learnerProgress = getLearnerProgress(lesson, learner); + // Setting status + activityDTO.setStartDate(getActivityStartDate(learnerProgress, activity, learner.getTimeZone())); + activityDTO.setTimeTaken(getActivityDuration(learnerProgress, activity)); + activityDTO.setStatus(getActivityStatusStr(learnerProgress, activity)); - if (firstActivity != null && firstActivity.isToolActivity() && firstActivity instanceof ToolActivity) { + // Setting averages + activityDTO.setAverageMark(gradebookDAO.getAverageMarkForActivity(activity.getActivityId())); + activityDTO.setAverageTimeTaken(gradebookDAO.getAverageDurationForActivity(activity.getActivityId())); - GBActivityGridRowDTO activityDTO = getGradebookActivityDTO((ToolActivity) firstActivity, learner, - learnerProgress); + // Get the tool outputs for this user if there are any + ToolSession toolSession = toolService.getToolSessionByLearner(learner, activity); + if (toolSession != null && learnerProgress != null) { + byte activityState = learnerProgress.getProgressState(activity); + if (activityState == LearnerProgress.ACTIVITY_ATTEMPTED + || activityState == LearnerProgress.ACTIVITY_COMPLETED) { + // Set the activityLearner URL for this gradebook activity + activityDTO.setActivityUrl(Configuration.get(ConfigurationKeys.SERVER_URL) + + activity.getTool().getLearnerProgressUrl() + "&userID=" + learner.getUserId() + + "&toolSessionID=" + toolSession.getToolSessionId().toString()); + activityDTO.setOutput(this.getToolOutputsStr(activity, toolSession, learner)); + } + } + gradebookActivityDTOs.add(activityDTO); } - - SortedSet sortedActivities = new TreeSet(activities); - - for (Activity activity : sortedActivities) { - if (activity.getActivityId().longValue() != firstActivity.getActivityId().longValue() - && activity instanceof ToolActivity) { - - GBActivityGridRowDTO activityDTO = getGradebookActivityDTO((ToolActivity) activity, learner, - learnerProgress); - gradebookActivityDTOs.add(activityDTO); - } - } + return gradebookActivityDTOs; } - /** - * @see org.lamsfoundation.lams.gradebook.service.IGradebookService#getGBActivityRowsForLesson(org.lamsfoundation.lams.lesson.Lesson) - */ @SuppressWarnings("unchecked") public List getGBActivityRowsForLesson(Lesson lesson) { logger.debug("Getting gradebook data for lesson: " + lesson.getLessonId()); List gradebookActivityDTOs = new ArrayList(); - Set activities = lesson.getLearningDesign().getActivities(); + Set activities = getLessonActivities(lesson); - /* - * Hibernate CGLIB is failing to load the first activity in the sequence as a ToolActivity for some mysterious - * reason Causes a ClassCastException when you try to cast it, even if it is a ToolActivity. - * - * THIS IS A HACK to retrieve the first tool activity manually so it can be cast as a ToolActivity - if it is - * one - */ - Activity firstActivity = activityDAO.getActivityByActivityId(lesson.getLearningDesign().getFirstActivity() - .getActivityId()); + for (ToolActivity activity : activities) { - if (firstActivity.isToolActivity() && firstActivity instanceof ToolActivity) { - Grouping grouping = firstActivity.getGrouping(); + Grouping grouping = activity.getGrouping(); if (grouping != null) { Set groups = grouping.getGroups(); if (groups != null) { for (Group group : groups) { - GBActivityGridRowDTO activityDTO = getGradebookActivityDTO((ToolActivity) firstActivity, - lesson, group.getGroupName(), group.getGroupId()); + GBActivityGridRowDTO activityDTO = getGradebookActivityDTO((ToolActivity) activity, lesson, + group.getGroupName(), group.getGroupId()); gradebookActivityDTOs.add(activityDTO); } } } else { - GBActivityGridRowDTO activityDTO = getGradebookActivityDTO((ToolActivity) firstActivity, lesson, null, - null); + GBActivityGridRowDTO activityDTO = getGradebookActivityDTO((ToolActivity) activity, lesson, null, null); gradebookActivityDTOs.add(activityDTO); } } - for (Activity activity : activities) { - if (activity.getActivityId().longValue() != firstActivity.getActivityId().longValue() - && activity instanceof ToolActivity) { - - Grouping grouping = activity.getGrouping(); - if (grouping != null) { - Set groups = grouping.getGroups(); - if (groups != null) { - - for (Group group : groups) { - GBActivityGridRowDTO activityDTO = getGradebookActivityDTO((ToolActivity) activity, lesson, - group.getGroupName(), group.getGroupId()); - gradebookActivityDTOs.add(activityDTO); - } - - } - } else { - GBActivityGridRowDTO activityDTO = getGradebookActivityDTO((ToolActivity) activity, lesson, null, - null); - gradebookActivityDTOs.add(activityDTO); - } - } - } - return gradebookActivityDTOs; - } - /** - * @see org.lamsfoundation.lams.gradebook.service.IGradebookService#getGBUserRowsForActivity(org.lamsfoundation.lams.lesson.Lesson, - * org.lamsfoundation.lams.learningdesign.Activity) - */ @SuppressWarnings("unchecked") public List getGBUserRowsForActivity(Lesson lesson, ToolActivity activity, Long groupId) { @@ -245,20 +214,17 @@ } if (learners != null) { + Map userToLearnerProgressMap = getUserToLearnerProgressMap(lesson); + Map userToGradebookUserLessonMap = getUserToGradebookUserActivityMap(activity); + Long totalMarksAvailable = getTotalMarksAvailable(activity); + for (User learner : learners) { - GBUserGridRowDTO gUserDTO = new GBUserGridRowDTO(); - gUserDTO.setRowName(learner.getLastName() + " " + learner.getFirstName()); - gUserDTO.setFirstName(learner.getFirstName()); - gUserDTO.setLastName(learner.getLastName()); - gUserDTO.setId(learner.getUserId().toString()); + GBUserGridRowDTO gUserDTO = new GBUserGridRowDTO(learner); - gUserDTO.setMarksAvailable(getTotalMarksAvailable(activity)); + gUserDTO.setMarksAvailable(totalMarksAvailable); - GradebookUserActivity gradebookUserActivity = gradebookDAO.getGradebookUserDataForActivity(activity - .getActivityId(), learner.getUserId()); - // Set the progress - LearnerProgress learnerProgress = getLearnerProgress(lesson, learner); + LearnerProgress learnerProgress = userToLearnerProgressMap.get(learner.getUserId()); gUserDTO.setStatus(getActivityStatusStr(learnerProgress, activity)); gUserDTO.setStartDate(getActivityStartDate(learnerProgress, activity, learner.getTimeZone())); gUserDTO.setTimeTaken(getActivityDuration(learnerProgress, activity)); @@ -279,6 +245,7 @@ } // Add marks and feedback + GradebookUserActivity gradebookUserActivity = userToGradebookUserLessonMap.get(learner.getUserId()); if (gradebookUserActivity != null) { gUserDTO.setFeedback(gradebookUserActivity.getFeedback()); gUserDTO.setMark(gradebookUserActivity.getMark()); @@ -289,12 +256,8 @@ } return gradebookUserDTOs; - } - /** - * @see org.lamsfoundation.lams.gradebook.service.IGradebookService#getGBUserRowsForLesson(org.lamsfoundation.lams.lesson.Lesson) - */ @SuppressWarnings("unchecked") public ArrayList getGBUserRowsForLesson(Lesson lesson) { @@ -304,16 +267,43 @@ Set learners = lesson.getAllLearners(); if (learners != null) { + + Map userToLearnerProgressMap = getUserToLearnerProgressMap(lesson); + Map userToGradebookUserLessonMap = getUserToGradebookUserLessonMap(lesson); for (User learner : learners) { - GBUserGridRowDTO gradebookUserDTO = populateGradebookUserDTO(learner, lesson); + LearnerProgress learnerProgress = userToLearnerProgressMap.get(learner.getUserId()); + GBUserGridRowDTO gradebookUserDTO = new GBUserGridRowDTO(learner); + + // Setting the status and time taken for the user's lesson + gradebookUserDTO.setStatus(getLessonStatusStr(learnerProgress)); + + // set current activity if available + if ((learnerProgress != null) && (learnerProgress.getCurrentActivity() != null)) { + gradebookUserDTO.setCurrentActivity(learnerProgress.getCurrentActivity().getTitle()); + } + + // calculate time taken + if (learnerProgress != null) { + if (learnerProgress.getStartDate() != null && learnerProgress.getFinishDate() != null) { + gradebookUserDTO.setTimeTaken(learnerProgress.getFinishDate().getTime() + - learnerProgress.getStartDate().getTime()); + } + } + + GradebookUserLesson gradebookUserLesson = userToGradebookUserLessonMap.get(learner.getUserId()); + if (gradebookUserLesson != null) { + gradebookUserDTO.setMark(gradebookUserLesson.getMark()); + gradebookUserDTO.setFeedback(gradebookUserLesson.getFeedback()); + } + gradebookUserDTOs.add(gradebookUserDTO); } + } } return gradebookUserDTOs; - } public ArrayList getGBUserRowsForOrganisation(Organisation organisation) { @@ -324,8 +314,10 @@ List learners = userService.getUsersFromOrganisation(organisation.getOrganisationId()); if (learners != null) { + for (User learner : learners) { - GBUserGridRowDTO gradebookUserDTO = populateGradebookUserDTO(learner, null); + + GBUserGridRowDTO gradebookUserDTO = new GBUserGridRowDTO(learner); gradebookUserDTOs.add(gradebookUserDTO); } } @@ -335,40 +327,22 @@ } - /** - * @see org.lamsfoundation.lams.gradebook.service.IGradebookService#getGradebookUserLesson(java.lang.Long, - * java.lang.Integer) - */ public GradebookUserLesson getGradebookUserLesson(Long lessonID, Integer userID) { return gradebookDAO.getGradebookUserDataForLesson(lessonID, userID); } - /** - * @see org.lamsfoundation.lams.gradebook.service.IGradebookService#getGradebookUserActivity(java.lang.Long, - * java.lang.Integer) - */ public GradebookUserActivity getGradebookUserActivity(Long activityID, Integer userID) { return gradebookDAO.getGradebookUserDataForActivity(activityID, userID); } - /** - * @see org.lamsfoundation.lams.gradebook.service.IGradebookService#getAverageMarkForActivity(java.lang.Long) - */ public Double getAverageMarkForActivity(Long activityID) { return gradebookDAO.getAverageMarkForActivity(activityID); } - /** - * @see org.lamsfoundation.lams.gradebook.service.IGradebookService#getAverageMarkForLesson(java.lang.Long) - */ public Double getAverageMarkForLesson(Long lessonID) { return gradebookDAO.getAverageMarkForLesson(lessonID); } - /** - * @see org.lamsfoundation.lams.gradebook.service.IGradebookService#updateUserLessonGradebookMark(org.lamsfoundation.lams.lesson.Lesson, - * org.lamsfoundation.lams.usermanagement.User, java.lang.Double) - */ public void updateUserLessonGradebookMark(Lesson lesson, User learner, Double mark) { if (lesson != null && learner != null) { GradebookUserLesson gradebookUserLesson = gradebookDAO.getGradebookUserDataForLesson(lesson.getLessonId(), @@ -382,11 +356,6 @@ } } - /** - * @see org.lamsfoundation.lams.gradebook.service.IGradebookService#updateUserActivityGradebookMark(org.lamsfoundation.lams.lesson.Lesson, - * org.lamsfoundation.lams.usermanagement.User, - * org.lamsfoundation.lams.learningdesign.Activity, java.lang.Double) - */ public void updateUserActivityGradebookMark(Lesson lesson, User learner, Activity activity, Double mark, Boolean markedInGradebook) { if (lesson != null && activity != null && learner != null && activity.isToolActivity()) { @@ -417,10 +386,6 @@ } } - /** - * @see org.lamsfoundation.lams.gradebook.service.IGradebookService#updateUserLessonGradebookFeedback(org.lamsfoundation.lams.lesson.Lesson, - * org.lamsfoundation.lams.usermanagement.User, java.lang.String) - */ public void updateUserLessonGradebookFeedback(Lesson lesson, User learner, String feedback) { GradebookUserLesson gradebookUserLesson = gradebookDAO.getGradebookUserDataForLesson(lesson.getLessonId(), @@ -434,10 +399,6 @@ gradebookDAO.insertOrUpdate(gradebookUserLesson); } - /** - * @see org.lamsfoundation.lams.gradebook.service.IGradebookService#updateUserActivityGradebookFeedback(org.lamsfoundation.lams.learningdesign.Activity, - * org.lamsfoundation.lams.usermanagement.User, java.lang.String) - */ public void updateUserActivityGradebookFeedback(Activity activity, User learner, String feedback) { GradebookUserActivity gradebookUserActivity = gradebookDAO.getGradebookUserDataForActivity(activity @@ -451,9 +412,6 @@ gradebookDAO.insertOrUpdate(gradebookUserActivity); } - /** - * @see org.lamsfoundation.lams.gradebook.service.IGradebookService#getGBLessonRows(org.lamsfoundation.lams.usermanagement.Organisation) - */ @SuppressWarnings("unchecked") public List getGBLessonRows(Organisation organisation, User user, User viewer, GBGridView view) { List lessonRows = new ArrayList(); @@ -535,125 +493,187 @@ return lessonRows; } + + public HashMap> getDataForExcelLessonGradebook(Lesson lesson) { + + HashMap> activityToUserDTOMap = new HashMap>(); - /** - * @see org.lamsfoundation.lams.gradebook.service.IGradebookService#getActivityViewDataForExcel(org.lamsfoundation.lams.lesson.Lesson) - */ - @SuppressWarnings("unchecked") - public ExcelCell[][] getActivityViewDataForExcel(Lesson lesson) { - ExcelCell[][] data = null; - if (lesson != null) { + Set learners = lesson.getAllLearners(); + if (learners == null) { + learners = new TreeSet(); + } + Map userToLearnerProgressMap = getUserToLearnerProgressMap(lesson); + List toolSessions = toolService.getToolSessionsByLesson(lesson); + Set activities = getLessonActivities(lesson); + Map activityToTotalMarkMap = getActivityToTotalMarkMap(activities); - Set activities = lesson.getLearningDesign().getActivities(); + for (ToolActivity activity : activities) { - Activity firstActivity = activityDAO.getActivityByActivityId(lesson.getLearningDesign().getFirstActivity() - .getActivityId()); + Map userToGradebookUserActivityMap = getUserToGradebookUserActivityMap(activity); + + List userDTOs = new ArrayList(); - HashMap> activityViewMap = new HashMap>(); + for (User learner : learners) { + GBUserGridRowDTO userDTO = new GBUserGridRowDTO(learner); - if (firstActivity != null && firstActivity.isToolActivity() && firstActivity instanceof ToolActivity) { + Long activityTotalMarks = activityToTotalMarkMap.get(activity.getActivityId()); + userDTO.setMarksAvailable(activityTotalMarks); - List userRows = getGBUserRowsForActivity(lesson, (ToolActivity) firstActivity, null); - activityViewMap.put(firstActivity, userRows); - } + // Set the progress + LearnerProgress learnerProgress = userToLearnerProgressMap.get(learner.getUserId()); + userDTO.setTimeTaken(getActivityDuration(learnerProgress, activity)); - SortedSet sortedActivities = new TreeSet(activities); + // find required toolSession from toolSessions (thus we don't querying DB and hence increasing + // efficiency). + ToolSession toolSession = null; + for (ToolSession dbToolSession : toolSessions) { + if (dbToolSession.getToolActivity().getActivityId().equals(activity.getActivityId()) + && dbToolSession.getLearners().contains(learner)) { + toolSession = dbToolSession; + } + } - for (Activity activity : sortedActivities) { - if (activity.getActivityId().longValue() != firstActivity.getActivityId().longValue() - && activity instanceof ToolActivity) { + // Get the tool outputs for this user if there are any. + if (toolSession != null && learnerProgress != null) { + // Set the activityLearner URL for this gradebook activity + byte activityState = learnerProgress.getProgressState(activity); + if (activityState == LearnerProgress.ACTIVITY_ATTEMPTED + || activityState == LearnerProgress.ACTIVITY_COMPLETED) { + userDTO.setActivityUrl(Configuration.get(ConfigurationKeys.SERVER_URL) + + activity.getTool().getLearnerProgressUrl() + "&userID=" + learner.getUserId() + + "&toolSessionID=" + toolSession.getToolSessionId().toString()); + userDTO.setOutput(this.getToolOutputsStr(activity, toolSession, learner)); + } + } - List userRows = getGBUserRowsForActivity(lesson, (ToolActivity) activity, null); - activityViewMap.put(activity, userRows); + // Add marks and feedback + GradebookUserActivity gradebookUserActivity = userToGradebookUserActivityMap.get(learner.getUserId()); + if (gradebookUserActivity != null) { + userDTO.setFeedback(gradebookUserActivity.getFeedback()); + userDTO.setMark(gradebookUserActivity.getMark()); + } + userDTOs.add(userDTO); } + activityToUserDTOMap.put(activity, userDTOs); + } - List rowList = new LinkedList(); + return activityToUserDTOMap; + } - for (Activity act : activityViewMap.keySet()) { + @SuppressWarnings("unchecked") + public ExcelCell[][] getActivityViewDataForExcel(HashMap> activityToUserDTOMap) { + ExcelCell[][] data = null; - ExcelCell[] activityTitleRow = new ExcelCell[5]; - activityTitleRow[0] = new ExcelCell(act.getTitle(), true); - rowList.add(activityTitleRow); - ExcelCell[] titleRow = new ExcelCell[5]; - titleRow[0] = new ExcelCell(getMessage("gradebook.export.last.name"), true); - titleRow[1] = new ExcelCell(getMessage("gradebook.export.first.name"), true); - titleRow[2] = new ExcelCell(getMessage("gradebook.export.time.taken.seconds"), true); - titleRow[3] = new ExcelCell(getMessage("gradebook.export.outputs"), true); - titleRow[4] = new ExcelCell(getMessage("gradebook.columntitle.mark"), true); - rowList.add(titleRow); + List rowList = new LinkedList(); - // Get the rest of the data - List userRows = activityViewMap.get(act); - for (GBUserGridRowDTO userRow : userRows) { - ExcelCell[] userDataRow = new ExcelCell[5]; + for (Activity activity : activityToUserDTOMap.keySet()) { - userDataRow[0] = new ExcelCell(userRow.getLastName(), false); - userDataRow[1] = new ExcelCell(userRow.getFirstName(), false); - userDataRow[2] = new ExcelCell(userRow.getTimeTakenSeconds(), false); - userDataRow[3] = new ExcelCell(userRow.getOutput(), false); - userDataRow[4] = new ExcelCell(userRow.getMark(), false); - rowList.add(userDataRow); - } + ExcelCell[] activityTitleRow = new ExcelCell[5]; + activityTitleRow[0] = new ExcelCell(activity.getTitle(), true); + rowList.add(activityTitleRow); + ExcelCell[] titleRow = new ExcelCell[5]; + titleRow[0] = new ExcelCell(getMessage("gradebook.export.last.name"), true); + titleRow[1] = new ExcelCell(getMessage("gradebook.export.first.name"), true); + titleRow[2] = new ExcelCell(getMessage("gradebook.export.time.taken.seconds"), true); + titleRow[3] = new ExcelCell(getMessage("gradebook.export.outputs"), true); + titleRow[4] = new ExcelCell(getMessage("gradebook.columntitle.mark"), true); + rowList.add(titleRow); - rowList.add(EMPTY_ROW); + // Get the rest of the data + List userRows = activityToUserDTOMap.get(activity); + for (GBUserGridRowDTO userRow : userRows) { + ExcelCell[] userDataRow = new ExcelCell[5]; + + userDataRow[0] = new ExcelCell(userRow.getLastName(), false); + userDataRow[1] = new ExcelCell(userRow.getFirstName(), false); + userDataRow[2] = new ExcelCell(userRow.getTimeTakenSeconds(), false); + userDataRow[3] = new ExcelCell(userRow.getOutput(), false); + userDataRow[4] = new ExcelCell(userRow.getMark(), false); + rowList.add(userDataRow); } - data = rowList.toArray(new ExcelCell[][] {}); - + rowList.add(EMPTY_ROW); } + + data = rowList.toArray(new ExcelCell[][] {}); + return data; } - /** - * @see org.lamsfoundation.lams.gradebook.service.IGradebookService#getUserViewDataForExcel(org.lamsfoundation.lams.lesson.Lesson) - */ @SuppressWarnings("unchecked") - public ExcelCell[][] getUserViewDataForExcel(Lesson lesson) { + public ExcelCell[][] getUserViewDataForExcel(HashMap> activityToUserDTOMap, Lesson lesson) { + Set learners = lesson.getAllLearners(); + if (learners == null) { + learners = new TreeSet(); + } ExcelCell[][] data = null; - if (lesson != null) { - Set learners = lesson.getAllLearners(); + List rowList = new LinkedList(); + for (User learner : learners) { - List rowList = new LinkedList(); - for (User learner : learners) { - List activityRows = getGBActivityRowsForLearner(lesson, learner); + List activityDTOs = new ArrayList(); + for (ToolActivity activity : activityToUserDTOMap.keySet()) { + + + List userDTOs = activityToUserDTOMap.get(activity); + GBUserGridRowDTO userDTO = null; + for (GBUserGridRowDTO dbUserDTO:userDTOs) { + if (dbUserDTO.getId().equals(learner.getUserId().toString())) { + userDTO = dbUserDTO; + } + } - ExcelCell[] activityTitleRow = new ExcelCell[4]; - activityTitleRow[0] = new ExcelCell(learner.getFullName(), true); - rowList.add(activityTitleRow); - - ExcelCell[] titleRow = new ExcelCell[4]; - titleRow[0] = new ExcelCell(getMessage("gradebook.export.activity"), true); - titleRow[1] = new ExcelCell(getMessage("gradebook.export.time.taken.seconds"), true); - titleRow[2] = new ExcelCell(getMessage("gradebook.export.outputs"), true); - titleRow[3] = new ExcelCell(getMessage("gradebook.columntitle.mark"), true); - rowList.add(titleRow); - - Iterator it = activityRows.iterator(); - while (it.hasNext()) { - GBActivityGridRowDTO activityRow = (GBActivityGridRowDTO) it.next(); - ExcelCell[] activityDataRow = new ExcelCell[4]; - activityDataRow[0] = new ExcelCell(activityRow.getRowName(), false); - activityDataRow[1] = new ExcelCell(activityRow.getTimeTakenSeconds(), false); - activityDataRow[2] = new ExcelCell(activityRow.getOutput(), false); - activityDataRow[3] = new ExcelCell(activityRow.getMark(), false); - rowList.add(activityDataRow); + String groupName = null; + Long groupId = null; + if (activity.getGrouping() != null) { + Group group = activity.getGroupFor(learner); + if (group != null) { + groupName = group.getGroupName(); + groupId = group.getGroupId(); + } } + GBActivityGridRowDTO activityDTO = new GBActivityGridRowDTO(activity, groupName, groupId); + activityDTO.setMarksAvailable(userDTO.getMarksAvailable()); + activityDTO.setStatus(userDTO.getStatus()); + activityDTO.setStartDate(userDTO.getStartDate()); + activityDTO.setTimeTaken(userDTO.getTimeTaken()); + activityDTO.setActivityUrl(userDTO.getActivityUrl()); + activityDTO.setOutput(userDTO.getOutput()); + activityDTO.setFeedback(userDTO.getFeedback()); + activityDTO.setMark(userDTO.getMark()); - rowList.add(EMPTY_ROW); + activityDTOs.add(activityDTO); } - data = rowList.toArray(new ExcelCell[][] {}); + ExcelCell[] activityTitleRow = new ExcelCell[4]; + activityTitleRow[0] = new ExcelCell(learner.getFullName(), true); + rowList.add(activityTitleRow); + ExcelCell[] titleRow = new ExcelCell[4]; + titleRow[0] = new ExcelCell(getMessage("gradebook.export.activity"), true); + titleRow[1] = new ExcelCell(getMessage("gradebook.export.time.taken.seconds"), true); + titleRow[2] = new ExcelCell(getMessage("gradebook.export.outputs"), true); + titleRow[3] = new ExcelCell(getMessage("gradebook.columntitle.mark"), true); + rowList.add(titleRow); + + for (GBActivityGridRowDTO activityRow : activityDTOs) { + ExcelCell[] activityDataRow = new ExcelCell[4]; + activityDataRow[0] = new ExcelCell(activityRow.getRowName(), false); + activityDataRow[1] = new ExcelCell(activityRow.getTimeTakenSeconds(), false); + activityDataRow[2] = new ExcelCell(activityRow.getOutput(), false); + activityDataRow[3] = new ExcelCell(activityRow.getMark(), false); + rowList.add(activityDataRow); + } + + rowList.add(EMPTY_ROW); } + + data = rowList.toArray(new ExcelCell[][] {}); return data; } - /** - * @see org.lamsfoundation.lams.gradebook.service.IGradebookService#getSummaryDataForExcel(org.lamsfoundation.lams.lesson.Lesson) - */ - @SuppressWarnings("unchecked") + @SuppressWarnings("unchecked") public ExcelCell[][] getSummaryDataForExcel(Lesson lesson) { ExcelCell[][] data = null; if (lesson != null) { @@ -737,9 +757,6 @@ return data; } - /** - * @see org.lamsfoundation.lams.gradebook.service.IGradebookService#getSummaryDataForExcel(org.lamsfoundation.lams.lesson.Lesson) - */ @SuppressWarnings("unchecked") public ExcelCell[][] getCourseDataForExcel(Integer userId, Integer organisationId) { Organisation organisation = (Organisation) baseDAO.find(Organisation.class, organisationId); @@ -825,10 +842,6 @@ return rowList.toArray(new ExcelCell[][] {}); } - /** - * @see org.lamsfoundation.lams.gradebook.service.IGradebookService#updateActivityMark(java.lang.Double, - * java.lang.String, java.lang.Integer, java.lang.Long) - */ public void updateActivityMark(Double mark, String feedback, Integer userID, Long toolSessionID, Boolean markedInGradebook) { ToolSession toolSession = toolService.getToolSessionById(toolSessionID); @@ -845,14 +858,41 @@ } } - /** - * @see org.lamsfoundation.lams.gradebook.service.IGradebookService#getActivityById(java.lang.Long) - */ public Activity getActivityById(Long activityID) { return activityDAO.getActivityByActivityId(activityID); } /** + * Returns lesson activities. It works almost the same as lesson.getLearningDesign().getActivities() except it solves + * problem with first activity unable to cast to ToolActivity. + */ + private Set getLessonActivities(Lesson lesson) { + Set activities = new TreeSet(); + Set toolActivities = new TreeSet(); + + /* + * Hibernate CGLIB is failing to load the first activity in the sequence as a ToolActivity for some mysterious + * reason Causes a ClassCastException when you try to cast it, even if it is a ToolActivity. + * + * THIS IS A HACK to retrieve the first tool activity manually so it can be cast as a ToolActivity - if it is + * one + */ + Activity firstActivity = activityDAO.getActivityByActivityId(lesson.getLearningDesign().getFirstActivity() + .getActivityId()); + activities.add(firstActivity); + activities.addAll(lesson.getLearningDesign().getActivities()); + + for (Activity activity : activities) { + if (activity instanceof ToolActivity) { + ToolActivity toolActivity = (ToolActivity) activity; + toolActivities.add(toolActivity); + } + } + + return toolActivities; + } + + /** * Returns list of GBUserGridRowDTOs, all of which will be displayed on 1 line on course export. * * @param learner @@ -862,15 +902,11 @@ private List getGBUserRowsForUser(User learner, List lessons, Integer organisationId) { List gradebookUserDTOs = new LinkedList(); - Map lessonLearnerProgressMap = getLessonLearnerProgressMap(learner, organisationId); - Map gradebookUserLessonMap = getGradebookUserLessonMap(learner, organisationId); + Map lessonLearnerProgressMap = getLessonToLearnerProgressMap(learner, organisationId); + Map gradebookUserLessonMap = getLessonToGradebookUserLessonMap(learner, organisationId); for (Lesson lesson : lessons) { - GBUserGridRowDTO gradebookUserDTO = new GBUserGridRowDTO(); - gradebookUserDTO.setId(learner.getUserId().toString()); - gradebookUserDTO.setRowName(learner.getLastName() + " " + learner.getFirstName()); - gradebookUserDTO.setFirstName(learner.getFirstName()); - gradebookUserDTO.setLastName(learner.getLastName()); + GBUserGridRowDTO gradebookUserDTO = new GBUserGridRowDTO(learner); //check if learner is participating in this lesson if (lesson.getAllLearners().contains(learner)) { @@ -906,52 +942,7 @@ return gradebookUserDTOs; } - - /** - * Fill up GBUserGridRowDTO with appropriate values. - * - * @param learner - * @param lessons - * @return - */ - private GBUserGridRowDTO populateGradebookUserDTO(User learner, Lesson lesson) { - GBUserGridRowDTO gradebookUserDTO = new GBUserGridRowDTO(); - gradebookUserDTO.setId(learner.getUserId().toString()); - gradebookUserDTO.setRowName(learner.getLastName() + " " + learner.getFirstName()); - gradebookUserDTO.setFirstName(learner.getFirstName()); - gradebookUserDTO.setLastName(learner.getLastName()); - - // Setting the status and time taken for the user's lesson - LearnerProgress learnerProgress = getLearnerProgress(lesson, learner); - gradebookUserDTO.setStatus(getLessonStatusStr(learnerProgress)); - - // set current activity if available - if ((learnerProgress != null) && (learnerProgress.getCurrentActivity() != null)) { - gradebookUserDTO.setCurrentActivity(learnerProgress.getCurrentActivity().getTitle()); - } - - // calculate time taken - if (learnerProgress != null) { - if (learnerProgress.getStartDate() != null && learnerProgress.getFinishDate() != null) { - gradebookUserDTO.setTimeTaken(learnerProgress.getFinishDate().getTime() - - learnerProgress.getStartDate().getTime()); - } - } - - if (lesson != null) { - GradebookUserLesson gradebookUserLesson = gradebookDAO.getGradebookUserDataForLesson(lesson.getLessonId(), - learner.getUserId()); - if (gradebookUserLesson != null) { - gradebookUserDTO.setMark(gradebookUserLesson.getMark()); - gradebookUserDTO.setFeedback(gradebookUserLesson.getFeedback()); - } - } - - return gradebookUserDTO; - - } - /** * Gets the internationalised date * @@ -1010,136 +1001,33 @@ private GBActivityGridRowDTO getGradebookActivityDTO(ToolActivity activity, Lesson lesson, String groupName, Long groupId) { - GBActivityGridRowDTO gactivityDTO = new GBActivityGridRowDTO(); - gactivityDTO.setId(activity.getActivityId().toString()); - - // Setting name - // If grouped acitivty, append group name - gactivityDTO.setRowName(activity.getTitle()); + GBActivityGridRowDTO activityDTO = new GBActivityGridRowDTO(activity, groupName, groupId); if (groupName != null && groupId != null) { - gactivityDTO.setGroupId(groupId); - gactivityDTO.setRowName(activity.getTitle() + " (" + groupName + ")"); - // Need to make the id unique, so appending the group id for this row - gactivityDTO.setId(activity.getActivityId().toString() + "_" + groupId.toString()); - // Setting averages for group - gactivityDTO.setAverageMark(gradebookDAO + activityDTO.setAverageMark(gradebookDAO .getAverageMarkForGroupedActivity(activity.getActivityId(), groupId)); - gactivityDTO.setAverageTimeTaken(gradebookDAO.getAverageDurationForGroupedActivity( + activityDTO.setAverageTimeTaken(gradebookDAO.getAverageDurationForGroupedActivity( activity.getActivityId(), groupId)); } else { // Setting averages for lesson - gactivityDTO.setAverageMark(gradebookDAO.getAverageMarkForActivity(activity.getActivityId())); - gactivityDTO.setAverageTimeTaken(gradebookDAO.getAverageDurationForActivity(activity.getActivityId())); + activityDTO.setAverageMark(gradebookDAO.getAverageMarkForActivity(activity.getActivityId())); + activityDTO.setAverageTimeTaken(gradebookDAO.getAverageDurationForActivity(activity.getActivityId())); } // Set the possible marks if applicable - gactivityDTO.setMarksAvailable(this.getTotalMarksAvailable(activity)); + activityDTO.setMarksAvailable(this.getTotalMarksAvailable(activity)); String monitorUrl = Configuration.get(ConfigurationKeys.SERVER_URL) + activity.getTool().getMonitorUrl() + "?" + AttributeNames.PARAM_CONTENT_FOLDER_ID + "=" + lesson.getLearningDesign().getContentFolderID() + "&" + AttributeNames.PARAM_TOOL_CONTENT_ID + "=" + activity.getToolContentId(); - gactivityDTO.setMonitorUrl(monitorUrl); + activityDTO.setMonitorUrl(monitorUrl); - // Get the competences for this activity - Set competenceMappings = activity.getCompetenceMappings(); - String competenceMappingsStr = ""; - if (competenceMappings != null) { - for (CompetenceMapping mapping : competenceMappings) { - competenceMappingsStr += mapping.getCompetence().getTitle() + ", "; - } - - // trim the last comma off - if (competenceMappingsStr.length() > 0) { - competenceMappingsStr = competenceMappingsStr.substring(0, competenceMappingsStr.lastIndexOf(",")); - } - } - gactivityDTO.setCompetences(competenceMappingsStr); - - return gactivityDTO; + return activityDTO; } /** - * Gets the GBActivityGridRowDTO for a given user and activity - * - * @param activity - * @param learner - * @param learnerProgress - * @return - */ - private GBActivityGridRowDTO getGradebookActivityDTO(ToolActivity activity, User learner, - LearnerProgress learnerProgress) { - - logger.debug("Getting gradebook data for activity: " + activity.getActivityId() + ". For user: " - + learner.getUserId()); - - GBActivityGridRowDTO gactivityDTO = new GBActivityGridRowDTO(); - gactivityDTO.setId(activity.getActivityId().toString()); - - // Set the title - // If it is a grouped activity, and the user has a group get the group title as well - gactivityDTO.setRowName(activity.getTitle()); - if (activity.getGrouping() != null) { - Group group = activity.getGroupFor(learner); - if (group != null) { - gactivityDTO.setRowName(activity.getTitle() + " (" + group.getGroupName() + ")"); - } - } - - // Set the possible marks if applicable - gactivityDTO.setMarksAvailable(this.getTotalMarksAvailable(activity)); - - GradebookUserActivity gradebookActivity = gradebookDAO.getGradebookUserDataForActivity( - activity.getActivityId(), learner.getUserId()); - if (gradebookActivity != null) { - gactivityDTO.setMark(gradebookActivity.getMark()); - gactivityDTO.setFeedback(gradebookActivity.getFeedback()); - } - - // Setting status - gactivityDTO.setStartDate(getActivityStartDate(learnerProgress, activity, learner.getTimeZone())); - gactivityDTO.setTimeTaken(getActivityDuration(learnerProgress, activity)); - gactivityDTO.setStatus(getActivityStatusStr(learnerProgress, activity)); - - // Setting averages - gactivityDTO.setAverageMark(gradebookDAO.getAverageMarkForActivity(activity.getActivityId())); - gactivityDTO.setAverageTimeTaken(gradebookDAO.getAverageDurationForActivity(activity.getActivityId())); - - // Get the competences for this activity - Set competenceMappings = activity.getCompetenceMappings(); - String competenceMappingsStr = ""; - if (competenceMappings != null) { - for (CompetenceMapping mapping : competenceMappings) { - competenceMappingsStr += mapping.getCompetence().getTitle() + ", "; - } - - // trim the last comma off - if (competenceMappingsStr.length() > 0) { - competenceMappingsStr = competenceMappingsStr.substring(0, competenceMappingsStr.lastIndexOf(",")); - } - } - gactivityDTO.setCompetences(competenceMappingsStr); - - // Get the tool outputs for this user if there are any - ToolSession toolSession = toolService.getToolSessionByLearner(learner, activity); - if (toolSession != null && learnerProgress != null) { - byte activityState = learnerProgress.getProgressState(activity); - if (activityState == LearnerProgress.ACTIVITY_ATTEMPTED - || activityState == LearnerProgress.ACTIVITY_COMPLETED) { - // Set the activityLearner URL for this gradebook activity - gactivityDTO.setActivityUrl(Configuration.get(ConfigurationKeys.SERVER_URL) - + activity.getTool().getLearnerProgressUrl() + "&userID=" + learner.getUserId() - + "&toolSessionID=" + toolSession.getToolSessionId().toString()); - gactivityDTO.setOutput(this.getToolOutputsStr(activity, toolSession, learner)); - } - } - - return gactivityDTO; - } - - /** * Gets either attempted or completed activity start time ajusted to monitor time zone. * * @param learnerProgress @@ -1327,7 +1215,6 @@ return null; } - @SuppressWarnings("unchecked") private LearnerProgress getLearnerProgress(Lesson lesson, User user) { if (lesson != null && user != null) { Map properties = new HashMap(); @@ -1344,9 +1231,69 @@ return null; } } + + /** + * Returns map containing (userId -> LearnerProgressMap) pairs. It serves merely for optimizing amount of db queries. + */ + private Map getUserToLearnerProgressMap(Lesson lesson) { + + if (lesson != null) { + String query = "select lp from LearnerProgress lp where lp.lesson.lessonId=?"; + List learnerProgressList = baseDAO.find(query, new Object[] { lesson.getLessonId() }); + + if (learnerProgressList != null && learnerProgressList.size() > 0) { + Map map = new HashMap(); + for (LearnerProgress learnerProgress : learnerProgressList) { + map.put(learnerProgress.getUser().getUserId(), learnerProgress); + } + return map; + } + } + + return new HashMap(); + } + + /** + * Returns map containing (userId -> GradebookUserActivity) pairs. It serves merely for optimizing amount of db queries. + */ + private Map getUserToGradebookUserActivityMap(Activity activity) { + + if (activity != null) { + String query = "select gua from GradebookUserActivity gua where gua.activity.activityId=?"; + List gradebookUserActivityList = baseDAO.find(query, new Object[] { activity.getActivityId() }); + + if (gradebookUserActivityList != null && gradebookUserActivityList.size() > 0) { + MultiKeyMap aa = new MultiKeyMap(); + + Map map = new HashMap(); + for (GradebookUserActivity gradebookUserActivity : gradebookUserActivityList) { + map.put(gradebookUserActivity.getLearner().getUserId(), gradebookUserActivity); + aa.put(gradebookUserActivity.getLearner().getUserId(), gradebookUserActivity.getLearner().getUserId(), gradebookUserActivity); + } + return map; + } + } + + return new HashMap(); + } + + /** + * Returns map containing (activityId -> TotalMarksAvailable) pairs. It serves merely for optimizing amount of db queries. + */ + private Map getActivityToTotalMarkMap(Collection activities) { + + Map map = new HashMap(); + for (ToolActivity activity : activities) { + map.put(activity.getActivityId(), getTotalMarksAvailable(activity)); + } + + return map; + } - @SuppressWarnings("unchecked") - private Map getLessonLearnerProgressMap(User user, Integer organisationId) { + /** + * Returns map containing (lessonId -> LearnerProgress) pairs. It serves merely for optimizing amount of db queries. + */ + private Map getLessonToLearnerProgressMap(User user, Integer organisationId) { if (user != null) { String query = "select lp from LearnerProgress lp where lp.user.userId=? and (lp.lesson.organisation.organisationId=? or lp.lesson.organisation.parentOrganisation.organisationId=?)"; @@ -1365,9 +1312,32 @@ return new HashMap(); } - @SuppressWarnings("unchecked") - private Map getGradebookUserLessonMap(User user, Integer organisationId) { + /** + * Returns map containing (userId -> GradebookUserLesson) pairs. It serves merely for optimizing amount of db queries. + */ + private Map getUserToGradebookUserLessonMap(Lesson lesson) { + if (lesson != null) { + String query = "select ul from GradebookUserLesson ul where ul.lesson.lessonId=?"; + List gradebookUserLessons = baseDAO.find(query, new Object[] { lesson.getLessonId() }); + + if (gradebookUserLessons != null && gradebookUserLessons.size() > 0) { + Map map = new HashMap(); + for (GradebookUserLesson gradebookUserLesson : gradebookUserLessons) { + map.put(gradebookUserLesson.getLearner().getUserId(), gradebookUserLesson); + } + return map; + } + } + + return new HashMap(); + } + + /** + * Returns map containing (lessonId -> GradebookUserLesson) pairs. It serves merely for optimizing amount of db queries. + */ + private Map getLessonToGradebookUserLessonMap(User user, Integer organisationId) { + if (user != null) { String query = "select ul from GradebookUserLesson ul where ul.learner.userId=? and (ul.lesson.organisation.organisationId=? or ul.lesson.organisation.parentOrganisation.organisationId=?)"; List gradebookUserLessons = baseDAO.find(query, new Object[] { user.getUserId(), organisationId, organisationId }); @@ -1393,7 +1363,6 @@ } // Getter and setter methods ----------------------------------------------- - public ILamsCoreToolService getToolService() { return toolService; } Index: lams_gradebook/src/java/org/lamsfoundation/lams/gradebook/service/IGradebookService.java =================================================================== diff -u -r351695e545e0997681c3d5a5f1b60e18acff7e04 -r26cce7618c8f32ad2ec6a31a85b63ca4de659d87 --- lams_gradebook/src/java/org/lamsfoundation/lams/gradebook/service/IGradebookService.java (.../IGradebookService.java) (revision 351695e545e0997681c3d5a5f1b60e18acff7e04) +++ lams_gradebook/src/java/org/lamsfoundation/lams/gradebook/service/IGradebookService.java (.../IGradebookService.java) (revision 26cce7618c8f32ad2ec6a31a85b63ca4de659d87) @@ -24,6 +24,7 @@ package org.lamsfoundation.lams.gradebook.service; import java.util.ArrayList; +import java.util.HashMap; import java.util.List; import org.lamsfoundation.lams.gradebook.GradebookUserActivity; @@ -203,14 +204,14 @@ * @param lesson * @return */ - public ExcelCell[][] getActivityViewDataForExcel(Lesson lesson); + public ExcelCell[][] getActivityViewDataForExcel(HashMap> activityToUserDTOMap); /** * Get the user view data in a 2d array format for an excel export * @param lesson * @return */ - public ExcelCell[][] getUserViewDataForExcel(Lesson lesson); + public ExcelCell[][] getUserViewDataForExcel(HashMap> activityToUserDTOMap, Lesson lesson); /** * Get the summary data in a 2s array for an excel export @@ -227,5 +228,7 @@ * @return */ ExcelCell[][] getCourseDataForExcel(Integer userId, Integer organisationId); + + HashMap> getDataForExcelLessonGradebook(Lesson lesson); } Index: lams_gradebook/src/java/org/lamsfoundation/lams/gradebook/web/action/GradebookMonitoringAction.java =================================================================== diff -u -r89ca0e8e23f9b0a9c38cede34a953697f31f0211 -r26cce7618c8f32ad2ec6a31a85b63ca4de659d87 --- lams_gradebook/src/java/org/lamsfoundation/lams/gradebook/web/action/GradebookMonitoringAction.java (.../GradebookMonitoringAction.java) (revision 89ca0e8e23f9b0a9c38cede34a953697f31f0211) +++ lams_gradebook/src/java/org/lamsfoundation/lams/gradebook/web/action/GradebookMonitoringAction.java (.../GradebookMonitoringAction.java) (revision 26cce7618c8f32ad2ec6a31a85b63ca4de659d87) @@ -23,8 +23,9 @@ /* $Id$ */ package org.lamsfoundation.lams.gradebook.web.action; -import java.util.Date; +import java.util.HashMap; import java.util.LinkedHashMap; +import java.util.List; import javax.servlet.ServletOutputStream; import javax.servlet.http.Cookie; @@ -37,11 +38,13 @@ import org.apache.struts.action.ActionForward; import org.apache.struts.action.ActionMapping; import org.lamsfoundation.lams.gradebook.dto.ExcelCell; +import org.lamsfoundation.lams.gradebook.dto.GBUserGridRowDTO; import org.lamsfoundation.lams.gradebook.service.IGradebookService; import org.lamsfoundation.lams.gradebook.util.GBGridView; import org.lamsfoundation.lams.gradebook.util.GradebookConstants; import org.lamsfoundation.lams.gradebook.util.GradebookUtil; import org.lamsfoundation.lams.learningdesign.Activity; +import org.lamsfoundation.lams.learningdesign.ToolActivity; import org.lamsfoundation.lams.lesson.Lesson; import org.lamsfoundation.lams.lesson.dto.LessonDetailsDTO; import org.lamsfoundation.lams.lesson.service.ILessonService; @@ -316,10 +319,11 @@ ExcelCell[][] summaryData = gradebookService.getSummaryDataForExcel(lesson); dataToExport.put(gradebookService.getMessage("gradebook.export.lesson.summary"), summaryData); - ExcelCell[][] activityData = gradebookService.getActivityViewDataForExcel(lesson); + HashMap> data = gradebookService.getDataForExcelLessonGradebook(lesson); + ExcelCell[][] activityData = gradebookService.getActivityViewDataForExcel(data); dataToExport.put(gradebookService.getMessage("gradebook.gridtitle.activitygrid"), activityData); - ExcelCell[][] userData = gradebookService.getUserViewDataForExcel(lesson); + ExcelCell[][] userData = gradebookService.getUserViewDataForExcel(data, lesson); dataToExport.put(gradebookService.getMessage("gradebook.export.learner.view"), userData); GradebookUtil.exportGradebookLessonToExcel(out, gradebookService.getMessage("gradebook.export.dateheader"),