Index: lams_monitoring/src/java/org/lamsfoundation/lams/monitoring/MonitoringConstants.java =================================================================== RCS file: /usr/local/cvsroot/lams_monitoring/src/java/org/lamsfoundation/lams/monitoring/MonitoringConstants.java,v diff -u -r1.4 -r1.5 --- lams_monitoring/src/java/org/lamsfoundation/lams/monitoring/MonitoringConstants.java 24 Jan 2006 04:59:51 -0000 1.4 +++ lams_monitoring/src/java/org/lamsfoundation/lams/monitoring/MonitoringConstants.java 30 Jan 2006 05:31:20 -0000 1.5 @@ -32,5 +32,6 @@ public static final String JOB_START_LESSON = "startScheduleLessonJob"; public static final String JOB_FINISH_LESSON = "finishScheduleLessonJob"; public static final String PARAM_LESSON_START_DATE = "lessonStartDate"; - public static final String PARAM_LESSON_FINISH_DATE = "lessonFinishDate";; + public static final String PARAM_LESSON_FINISH_DATE = "lessonFinishDate"; + public static final String PARAM_LEARNER_ID = "learnerID"; } Index: lams_monitoring/src/java/org/lamsfoundation/lams/monitoring/monitoringApplicationContext.xml =================================================================== RCS file: /usr/local/cvsroot/lams_monitoring/src/java/org/lamsfoundation/lams/monitoring/monitoringApplicationContext.xml,v diff -u -r1.7 -r1.8 --- lams_monitoring/src/java/org/lamsfoundation/lams/monitoring/monitoringApplicationContext.xml 24 Jan 2006 03:30:34 -0000 1.7 +++ lams_monitoring/src/java/org/lamsfoundation/lams/monitoring/monitoringApplicationContext.xml 30 Jan 2006 05:31:20 -0000 1.8 @@ -51,6 +51,7 @@ + Index: lams_monitoring/src/java/org/lamsfoundation/lams/monitoring/service/IMonitoringService.java =================================================================== RCS file: /usr/local/cvsroot/lams_monitoring/src/java/org/lamsfoundation/lams/monitoring/service/IMonitoringService.java,v diff -u -r1.30 -r1.31 --- lams_monitoring/src/java/org/lamsfoundation/lams/monitoring/service/IMonitoringService.java 27 Jan 2006 06:44:10 -0000 1.30 +++ lams_monitoring/src/java/org/lamsfoundation/lams/monitoring/service/IMonitoringService.java 30 Jan 2006 05:31:20 -0000 1.31 @@ -119,8 +119,9 @@ * @param lessonId * @param activityId force complete to this activity(this activity will be force complete as well). * If null value, force will complete all activities in this lesson. + * @return success message. */ - public void forceCompleteLessonByUser(Integer learnerId,long lessonId,Long activityId); + public String forceCompleteLessonByUser(Integer learnerId,long lessonId,Long activityId); /** * Archive the specified the lesson. When archived, the data is retained Index: lams_monitoring/src/java/org/lamsfoundation/lams/monitoring/service/MonitoringService.java =================================================================== RCS file: /usr/local/cvsroot/lams_monitoring/src/java/org/lamsfoundation/lams/monitoring/service/MonitoringService.java,v diff -u -r1.38 -r1.39 --- lams_monitoring/src/java/org/lamsfoundation/lams/monitoring/service/MonitoringService.java 27 Jan 2006 06:44:10 -0000 1.38 +++ lams_monitoring/src/java/org/lamsfoundation/lams/monitoring/service/MonitoringService.java 30 Jan 2006 05:31:20 -0000 1.39 @@ -34,9 +34,8 @@ import org.apache.log4j.Logger; import org.lamsfoundation.lams.authoring.service.IAuthoringService; import org.lamsfoundation.lams.learning.service.ILearnerService; -import org.lamsfoundation.lams.learning.service.LearnerService; -import org.lamsfoundation.lams.learning.web.util.LessonLearnerDataManager; import org.lamsfoundation.lams.learningdesign.Activity; +import org.lamsfoundation.lams.learningdesign.ActivityVisitor; import org.lamsfoundation.lams.learningdesign.ComplexActivity; import org.lamsfoundation.lams.learningdesign.GateActivity; import org.lamsfoundation.lams.learningdesign.Group; @@ -556,27 +555,29 @@ * @throws LamsToolServiceException * @see org.lamsfoundation.lams.monitoring.service.IMonitoringService#forceCompleteLessonByUser(Integer,long,long) */ - public void forceCompleteLessonByUser(Integer learnerId,long lessonId,Long activityId) + public String forceCompleteLessonByUser(Integer learnerId,long lessonId,Long activityId) { -// LearnerProgress learnerProcess = learnerProgressDAO.getLearnerProgressByLearner(learner,lesson); - List currentLessonLearners = learnerService.getActiveLearnersByLesson(lessonId); + + List currentLessonLearners = learnerService.getActiveLearnersByLesson(lessonId); User learner = userDAO.getUserById(learnerId); Lesson newLesson = lessonDAO.getLesson(new Long(lessonId)); Set activities = newLesson.getLearningDesign().getActivities(); /* - Every check need check session Gate -- LearnerService.knockGate(GateActivity gate, User knocker, List lessonLearners) Y - continue N - Stop Group -- getGroup -> exist? Y - continue N - PermissionGroup - Stop - RandomGroup - create group, create tool session. + RandomGroup - create group, then complete it and continue. */ - String stopReason = null; + String stopReason = "Success to complete to the end of lesson"; for (Iterator i = activities.iterator(); i.hasNext();) { - Activity activity = (Activity) i.next(); + Activity actProxy = (Activity) i.next(); + //reload activity to get real object instead of CGLIB proxy + Activity activity = activityDAO.getActivityByActivityId(actProxy.getActivityId()); + if (activity.isGroupingActivity()){ GroupingActivity groupActivity = (GroupingActivity) activity; Grouping grouping = groupActivity.getCreateGrouping(); @@ -586,22 +587,30 @@ if(grouping.isRandomGrouping()){ //for random grouping, create then complete it. Continue learnerService.performGrouping(groupActivity,currentLessonLearners); - grouping = groupActivity.getCreateGrouping(); - myGroup = grouping.getGroupBy(learner); +// grouping = groupActivity.getCreateGrouping(); +// myGroup = grouping.getGroupBy(learner); learnerService.completeActivity(learner,activity,newLesson); + log.debug("Grouping activity [" + activity.getActivityId() + "] is completed."); + }else{ + //except random grouping, stop here + stopReason = "Force complete stop at non-grouped grouping activity [" + groupActivity + "]"; + break; } - //except random grouping, stop here - stopReason = "Force complete stop at non-grouped grouping activity [" + groupActivity + "]"; - break; + }else{ + //if group already exist + learnerService.completeActivity(learner,activity,newLesson); + log.debug("Grouping activity [" + activity.getActivityId() + "] is completed."); } }else if ( activity.isGateActivity() ) { GateActivity gate = (GateActivity) activity; if(learnerService.knockGate(gate,learner,currentLessonLearners)){ //the gate is opened, continue to next activity to complete learnerService.completeActivity(learner,activity,newLesson); + log.debug("Gate activity [" + gate.getActivityId() + "] is completed."); }else{ //the gate is closed, stop here stopReason = "Force complete stop at gate activity [" + gate + "]"; + break; } }else{ //left: toolActivity and complexActivity @@ -610,7 +619,9 @@ try { ToolSession toolSession = lamsCoreToolService.getToolSessionByActivity(learner,toolActivity); learnerService.completeToolSession(toolSession.getToolSessionId(),new Long(learnerId.intValue())); + log.debug("Tool activity [" + activity.getActivityId() + "] is completed."); } catch (LamsToolServiceException e) { + throw new MonitoringServiceException(e); } }else if(activity.isComplexActivity()){ //for complex activities:SEQUENCE ACTIVITY,PARALLEL ACTIVITY,OPTIONS ACTIVITY @@ -621,6 +632,7 @@ Activity act = (Activity) iter.next(); forceCompleteLessonByUser(learnerId,lessonId,act.getActivityId()); } + log.debug("Complex activity [" + activity.getActivityId() + "] is completed."); } } @@ -632,6 +644,7 @@ } } + return stopReason; } 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.15 -r1.16 --- lams_monitoring/src/java/org/lamsfoundation/lams/monitoring/web/MonitoringAction.java 24 Jan 2006 04:59:51 -0000 1.15 +++ lams_monitoring/src/java/org/lamsfoundation/lams/monitoring/web/MonitoringAction.java 30 Jan 2006 05:31:20 -0000 1.16 @@ -396,6 +396,52 @@ return outputPacket(mapping,request,response,message,"details"); } + /** + *

+ *

+ *

+ * This action need a lession ID, Learner ID and Activity ID as input. Activity ID is optional, if it is + * null, all activities for this learner will complete to as end as possible. + *

+ * @param form + * @param request A standard Servlet HttpServletRequest class. + * @param response A standard Servlet HttpServletResponse class. + * @return An ActionForward + * @throws IOException + * @throws ServletException + */ + public ActionForward forceComplete(ActionMapping mapping, + ActionForm form, + HttpServletRequest request, + HttpServletResponse response) throws IOException, + ServletException{ + FlashMessage flashMessage = null; + this.monitoringService = MonitoringServiceProxy.getMonitoringService(getServlet().getServletContext()); + //get parameters + Long activityId = null; + String actId = request.getParameter(AttributeNames.PARAM_ACTIVITY_ID); + if(actId != null) + try{ + activityId = new Long(Long.parseLong(actId)); + }catch(Exception e){ + activityId = null; + } + long lessonId = WebUtil.readLongParam(request,AttributeNames.PARAM_LESSON_ID); + Integer learnerId = new Integer(WebUtil.readIntParam(request,MonitoringConstants.PARAM_LEARNER_ID)); + + //force complete + try { + String message = monitoringService.forceCompleteLessonByUser(learnerId,lessonId,activityId); + flashMessage = new FlashMessage("removeLesson",message); + } catch (Exception e) { + flashMessage = new FlashMessage("forceComplete", + "Error occurs :" + e.toString(), + FlashMessage.ERROR); + } + String message = flashMessage.serializeMessage(); + return outputPacket(mapping,request,response,message,"details"); + + } public ActionForward getAllLessons(ActionMapping mapping, ActionForm form, HttpServletRequest request,