Index: lams_learning/src/java/org/lamsfoundation/lams/learning/web/action/CompleteActivityAction.java =================================================================== RCS file: /usr/local/cvsroot/lams_learning/src/java/org/lamsfoundation/lams/learning/web/action/CompleteActivityAction.java,v diff -u -r1.14.4.2 -r1.14.4.3 --- lams_learning/src/java/org/lamsfoundation/lams/learning/web/action/CompleteActivityAction.java 10 Apr 2007 05:03:21 -0000 1.14.4.2 +++ lams_learning/src/java/org/lamsfoundation/lams/learning/web/action/CompleteActivityAction.java 10 Apr 2007 23:32:52 -0000 1.14.4.3 @@ -81,31 +81,20 @@ Activity activity = LearningWebUtil.getActivityFromRequest(request, learnerService); LearnerProgress progress = LearningWebUtil.getLearnerProgress(request, learnerService); - Lesson lesson = progress.getLesson(); - if ( lesson.getLockedForEdit() || activity == null ) { - // something has gone wrong - maybe due to Live Edit. No more activity so try to resume - Long lessonID = WebUtil.readLongParam(request, AttributeNames.PARAM_LESSON_ID); - progress = learnerService.joinLesson(learnerId, lessonID); - - } else if ( progress.getCompletedActivities().contains(activity) ){ - response.sendRedirect(actionMappings.getCloseURL()); - return null; - } else { - // Set activity as complete - try { - progress = learnerService.completeActivity(learnerId, activity,progress); - } - catch (LearnerServiceException e) { - return mapping.findForward("error"); - } + String progressURL = null; + // Set activity as complete + try { + progressURL = LearningWebUtil.completeActivity(request, response, + actionMappings, progress, activity, + learnerId, learnerService); } - - LearningWebUtil.putActivityInRequest(request, progress.getNextActivity(), learnerService); - LearningWebUtil.putLearnerProgressInRequest(request,progress); + catch (LearnerServiceException e) { + return mapping.findForward("error"); + } setupProgressString(actionForm, request); - response.sendRedirect(actionMappings.getProgressURL(progress)); + response.sendRedirect(progressURL); return null; } Index: lams_learning/src/java/org/lamsfoundation/lams/learning/web/action/GateAction.java =================================================================== RCS file: /usr/local/cvsroot/lams_learning/src/java/org/lamsfoundation/lams/learning/web/action/GateAction.java,v diff -u -r1.14.4.3 -r1.14.4.4 --- lams_learning/src/java/org/lamsfoundation/lams/learning/web/action/GateAction.java 10 Apr 2007 05:03:20 -0000 1.14.4.3 +++ lams_learning/src/java/org/lamsfoundation/lams/learning/web/action/GateAction.java 10 Apr 2007 23:32:52 -0000 1.14.4.4 @@ -138,38 +138,33 @@ Activity activity = learnerService.getActivity(activityId); ActivityMapping actionMappings = getActivityMapping(); - if ( activity == null ) { - // if this is a temporary stop gate, created for Live Edit, the activity will have been deleted when Live Edit finished - // so manually resume the progress. The completeActivity code can cope with a missing activity. - LearnerProgress progress = learnerService.completeActivity(LearningWebUtil.getUserId(),(Activity)null,lessonId); - String nextActivityUrl = actionMappings.getProgressURL(progress); - response.sendRedirect(nextActivityUrl); - return null; - - } else { - - User learner = LearningWebUtil.getUser(learnerService); - Lesson lesson = learnerService.getLesson(lessonId); + User learner = LearningWebUtil.getUser(learnerService); + Lesson lesson = learnerService.getLesson(lessonId); + if ( activity != null ) { + Integer totalNumActiveLearners = learnerService.getCountActiveLearnersByLesson(lesson.getLessonId()); //knock the gate boolean gateOpen = learnerService.knockGate(activityId,learner,forceGate); - - // if the gate is open, let the learner go to the next activity ( updating the cached learner progress on the way ) - // pass only the ids in to completeActivity, so that the service level looks up the objects. - // if we reuse our cached entries, hibernate may throw session errors (if the objects are CGLIB entities). - if(gateOpen) - { - LearnerProgress progress = learnerService.completeActivity(LearningWebUtil.getUserId(),activity,lesson.getLessonId()); - String nextActivityUrl = actionMappings.getProgressURL(progress); - response.sendRedirect(nextActivityUrl); - return null; - } + //if the gate is closed, ask the learner to wait ( updating the cached learner progress on the way ) - else { + if ( ! gateOpen) { return findViewByGateType(mapping, (DynaActionForm)form, activity, totalNumActiveLearners, lesson); } } + + // gate is open, so let the learner go to the next activity ( updating the cached learner progress on the way ) + // don't use LearningWebUtil.getLearnerProgress(request, learnerService) as it may try to get the lesson + // from the activity and the activity may be null (if this was a system stop gate). + LearnerProgress learnerProgress = (LearnerProgress)request.getAttribute(ActivityAction.LEARNER_PROGRESS_REQUEST_ATTRIBUTE); + if ( learnerProgress == null ) { + learnerProgress = learnerService.getProgress(learner.getUserId(), lessonId); + } + String progressURL = LearningWebUtil.completeActivity(request, response, + actionMappings, learnerProgress, activity, + learner.getUserId(), learnerService); + response.sendRedirect(progressURL); + return null; } //--------------------------------------------------------------------- Index: lams_learning/src/java/org/lamsfoundation/lams/learning/web/action/GroupingAction.java =================================================================== RCS file: /usr/local/cvsroot/lams_learning/src/java/org/lamsfoundation/lams/learning/web/action/GroupingAction.java,v diff -u -r1.24.4.2 -r1.24.4.3 --- lams_learning/src/java/org/lamsfoundation/lams/learning/web/action/GroupingAction.java 10 Apr 2007 05:03:21 -0000 1.24.4.2 +++ lams_learning/src/java/org/lamsfoundation/lams/learning/web/action/GroupingAction.java 10 Apr 2007 23:32:52 -0000 1.24.4.3 @@ -49,6 +49,7 @@ import org.lamsfoundation.lams.lesson.LearnerProgress; import org.lamsfoundation.lams.lesson.Lesson; import org.lamsfoundation.lams.tool.ToolAccessMode; +import org.lamsfoundation.lams.usermanagement.User; import org.lamsfoundation.lams.util.WebUtil; import org.lamsfoundation.lams.web.action.LamsDispatchAction; import org.lamsfoundation.lams.web.util.AttributeNames; @@ -265,16 +266,16 @@ { //initialize service object ICoreLearnerService learnerService = LearnerServiceProxy.getLearnerService(getServlet().getServletContext()); - LearnerProgress learnerProgress = LearningWebUtil.getLearnerProgress(request,learnerService); + LearnerProgress progress = LearningWebUtil.getLearnerProgress(request, learnerService); Activity groupingActivity = LearningWebUtil.getActivityFromRequest(request,learnerService); - Lesson lesson = learnerService.getLessonByActivity(groupingActivity); + Integer learnerId = LearningWebUtil.getUserId(); // so manually resume the progress. The completeActivity code can cope with a missing activity. - LearnerProgress progress = learnerService.completeActivity(learnerProgress.getUser().getUserId(), - groupingActivity, lesson.getLessonId()); - String nextActivityUrl = getActivityMapping().getProgressURL(progress); - response.sendRedirect(nextActivityUrl); - return null; + String progressURL = LearningWebUtil.completeActivity(request, response, + getActivityMapping(), progress, groupingActivity, + learnerId, learnerService); + response.sendRedirect(progressURL); + return null; } } Index: lams_learning/src/java/org/lamsfoundation/lams/learning/web/util/LearningWebUtil.java =================================================================== RCS file: /usr/local/cvsroot/lams_learning/src/java/org/lamsfoundation/lams/learning/web/util/LearningWebUtil.java,v diff -u -r1.16 -r1.16.4.1 --- lams_learning/src/java/org/lamsfoundation/lams/learning/web/util/LearningWebUtil.java 17 Sep 2006 06:17:57 -0000 1.16 +++ lams_learning/src/java/org/lamsfoundation/lams/learning/web/util/LearningWebUtil.java 10 Apr 2007 23:33:02 -0000 1.16.4.1 @@ -24,11 +24,15 @@ /* $$Id$$ */ package org.lamsfoundation.lams.learning.web.util; +import java.io.UnsupportedEncodingException; + import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpSession; import org.apache.log4j.Logger; import org.lamsfoundation.lams.learning.service.ICoreLearnerService; +import org.lamsfoundation.lams.learning.service.LearnerServiceException; import org.lamsfoundation.lams.learning.web.action.ActivityAction; import org.lamsfoundation.lams.learningdesign.Activity; import org.lamsfoundation.lams.lesson.LearnerProgress; @@ -172,8 +176,37 @@ public static void putActivityInRequest(HttpServletRequest request, Activity activity, ICoreLearnerService learnerService) { - Activity realActivity = learnerService.getActivity(activity.getActivityId()); - request.setAttribute(ActivityAction.ACTIVITY_REQUEST_ATTRIBUTE, realActivity); + if ( activity != null ) { + Activity realActivity = learnerService.getActivity(activity.getActivityId()); + request.setAttribute(ActivityAction.ACTIVITY_REQUEST_ATTRIBUTE, realActivity); + } else { + request.setAttribute(ActivityAction.ACTIVITY_REQUEST_ATTRIBUTE, null); + } } + /** "Complete" an activity from the web layer's perspective. Used for CompleteActivityAction and the Gate and Grouping actions. + * Calls the learningService to actually complete the activity and progress. + * @throws UnsupportedEncodingException + * + */ + public static String completeActivity(HttpServletRequest request, HttpServletResponse response, + ActivityMapping actionMappings, LearnerProgress currentProgress, Activity currentActivity, + Integer learnerId, ICoreLearnerService learnerService) throws LearnerServiceException, UnsupportedEncodingException { + + LearnerProgress newProgress=null; + Lesson lesson = currentProgress.getLesson(); + + if ( lesson.getLockedForEdit() || currentActivity == null ) { + newProgress = learnerService.joinLesson(learnerId, lesson.getLessonId()); + } else if ( currentProgress.getCompletedActivities().contains(currentActivity) ){ + return actionMappings.getCloseURL(); + } else { + // Set activity as complete + newProgress = learnerService.completeActivity(learnerId, currentActivity,currentProgress); + } + + LearningWebUtil.putActivityInRequest(request, newProgress.getNextActivity(), learnerService); + LearningWebUtil.putLearnerProgressInRequest(request,newProgress); + return actionMappings.getProgressURL(newProgress); + } }