Index: lams_monitoring/src/java/org/lamsfoundation/lams/monitoring/service/MonitoringService.java =================================================================== diff -u -rcbf56ec96d51e9fd1602f1112e9ec5fc029454fb -rfd491d915b9866b499b48eab5b642afb6227180e --- lams_monitoring/src/java/org/lamsfoundation/lams/monitoring/service/MonitoringService.java (.../MonitoringService.java) (revision cbf56ec96d51e9fd1602f1112e9ec5fc029454fb) +++ lams_monitoring/src/java/org/lamsfoundation/lams/monitoring/service/MonitoringService.java (.../MonitoringService.java) (revision fd491d915b9866b499b48eab5b642afb6227180e) @@ -1354,7 +1354,7 @@ // check if activity is already complete if ((learnerProgress != null) - && (activityId == -1L || learnerProgress.getCompletedActivities().containsKey(stopActivity))) { + && ((activityId == -1L) || learnerProgress.getCompletedActivities().containsKey(stopActivity))) { // if activityID == -1, then stopActivity == null and the method understands it return forceUncompleteActivity(learnerProgress, stopActivity); } @@ -1562,6 +1562,9 @@ learnerProgress.getCompletedActivities().remove(targetActivity); learnerProgress.getAttemptedActivities().put(targetActivity, completedActivityProgress.getStartDate()); + // grouping activities which need to be reset + Set groupings = new HashSet(); + // remove completed activities step by step, all the way from current to target activity do { if (currentActivity.isComplexActivity()) { @@ -1578,6 +1581,8 @@ } } } + } else if (currentActivity.isGroupingActivity()) { + groupings.add(currentActivity); } learnerProgress.getAttemptedActivities().remove(currentActivity); @@ -1603,11 +1608,26 @@ } else { // move backwards currentActivity = transitionTo.getFromActivity(); + if (currentActivity.isGroupingActivity()) { + groupings.add(currentActivity); + } } } while (!currentActivity.equals(targetActivity)); learnerProgressDAO.updateLearnerProgress(learnerProgress); + + User learner = learnerProgress.getUser(); + for (Activity groupingActivity : groupings) { + Grouping grouping = ((GroupingActivity) groupingActivity).getCreateGrouping(); + if (grouping.doesLearnerExist(learner)) { + // cancel existing grouping, so the learner has a chance to be grouped again + Group group = grouping.getGroupBy(learner); + group.getUsers().remove(learner); + groupDAO.saveGroup(group); + } + } + return messageService.getMessage(MonitoringService.FORCE_COMPLETE_STOP_MESSAGE_COMPLETED_TO_ACTIVITY, new Object[] { targetActivity.getTitle() }); }