Index: lams_learning/src/java/org/lamsfoundation/lams/learning/service/LearnerService.java =================================================================== diff -u -rd61e53f3f98df777cb3006fe79f844214d40d073 -r7d5e18b6ddc40f4de3d34eefa114afc297724289 --- lams_learning/src/java/org/lamsfoundation/lams/learning/service/LearnerService.java (.../LearnerService.java) (revision d61e53f3f98df777cb3006fe79f844214d40d073) +++ lams_learning/src/java/org/lamsfoundation/lams/learning/service/LearnerService.java (.../LearnerService.java) (revision 7d5e18b6ddc40f4de3d34eefa114afc297724289) @@ -35,6 +35,7 @@ import org.lamsfoundation.lams.learning.progress.ProgressEngine; import org.lamsfoundation.lams.learning.progress.ProgressException; import org.lamsfoundation.lams.learning.web.util.ActivityMapping; +import org.lamsfoundation.lams.learning.web.util.LearningWebUtil; import org.lamsfoundation.lams.learningdesign.Activity; import org.lamsfoundation.lams.learningdesign.GateActivity; import org.lamsfoundation.lams.learningdesign.Grouping; @@ -47,7 +48,6 @@ import org.lamsfoundation.lams.lesson.dao.ILearnerProgressDAO; import org.lamsfoundation.lams.lesson.dao.ILessonDAO; import org.lamsfoundation.lams.lesson.dto.LessonDTO; -import org.lamsfoundation.lams.tool.ToolContentIDGenerator; import org.lamsfoundation.lams.tool.ToolSession; import org.lamsfoundation.lams.tool.dao.IToolSessionDAO; import org.lamsfoundation.lams.tool.exception.LamsToolServiceException; @@ -240,7 +240,7 @@ /** - * Returns the current progress data of the User. + * Returns the current progress data of the User. * @param learner the Learner * @param lesson the Lesson to get progress from. * @return LearnerProgess contains the learner's progress for the lesson. @@ -331,9 +331,15 @@ public String completeActivity(User learner,Activity activity,Lesson lesson) { //build up the url for next activity. + + // need to update the learner progress in the special user's session or the Flash + // side won't be notified of the correct progress (via the display activity screen). + // this isn't nice as the service layer is calling the web layer, but as this + // is triggered from a tool calling completeToolSession, its a bit hard to avoid. try { LearnerProgress nextLearnerProgress = calculateProgress(activity, learner,lesson); + LearningWebUtil.setLearnerProgress(nextLearnerProgress); return activityMapping.getProgressURL(nextLearnerProgress); } catch (UnsupportedEncodingException e) Index: lams_learning/src/java/org/lamsfoundation/lams/learning/web/action/DisplayActivityAction.java =================================================================== diff -u -rcdb910b6cd3de106725e2c22ded380c5c0fab650 -r7d5e18b6ddc40f4de3d34eefa114afc297724289 --- lams_learning/src/java/org/lamsfoundation/lams/learning/web/action/DisplayActivityAction.java (.../DisplayActivityAction.java) (revision cdb910b6cd3de106725e2c22ded380c5c0fab650) +++ lams_learning/src/java/org/lamsfoundation/lams/learning/web/action/DisplayActivityAction.java (.../DisplayActivityAction.java) (revision 7d5e18b6ddc40f4de3d34eefa114afc297724289) @@ -24,16 +24,18 @@ /* $$Id$$ */ package org.lamsfoundation.lams.learning.web.action; -import javax.servlet.http.*; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; import org.apache.log4j.Logger; import org.apache.struts.action.ActionForm; import org.apache.struts.action.ActionForward; import org.apache.struts.action.ActionMapping; import org.lamsfoundation.lams.learning.service.LearnerServiceProxy; - +import org.lamsfoundation.lams.learning.web.form.ActivityForm; import org.lamsfoundation.lams.learning.web.util.ActivityMapping; import org.lamsfoundation.lams.learning.web.util.LearningWebUtil; +import org.lamsfoundation.lams.learningdesign.Activity; import org.lamsfoundation.lams.lesson.LearnerProgress; @@ -61,7 +63,7 @@ // Instance variables //--------------------------------------------------------------------- private static Logger log = Logger.getLogger(DisplayActivityAction.class); - + /** * Gets an activity from the request (attribute) and forwards onto a * display action using the ActionMappings class. If no activity is @@ -78,15 +80,56 @@ //SessionBean sessionBean = LearningWebUtil.getSessionBean(request,getServlet().getServletContext()); LearnerProgress learnerProgress = LearningWebUtil.getLearnerProgressByID(request, getServlet().getServletContext()); + String progressSummary = getProgressSummary(learnerProgress); + if(log.isDebugEnabled()) - log.debug("Entering display activity: the session bean is" - + learnerProgress.toString()); + log.debug("Entering display activity: progress summary is "+progressSummary); + ActivityForm activityForm = (ActivityForm) actionForm; + activityForm.setProgressSummary(progressSummary); ActionForward forward =actionMappings.getProgressForward(learnerProgress,false,request,getLearnerService()); if(log.isDebugEnabled()) log.debug(forward.toString()); return forward; } + + private String getProgressSummary(LearnerProgress learnerProgress) { + StringBuffer progressSummary = new StringBuffer(100); + if ( learnerProgress == null ) { + progressSummary.append("attempted=&completed=¤t="); + } else { + progressSummary.append("attempted="); + boolean first = true; + for ( Object obj : learnerProgress.getAttemptedActivities() ) { + Activity activity = (Activity ) obj; + if ( ! first ) { + progressSummary.append("_"); + } else { + first = false; + } + progressSummary.append(activity.getActivityId()); + } + + progressSummary.append("&completed="); + first = true; + for ( Object obj : learnerProgress.getCompletedActivities() ) { + Activity activity = (Activity ) obj; + if ( ! first ) { + progressSummary.append("_"); + } else { + first = false; + } + progressSummary.append(activity.getActivityId()); + } + + progressSummary.append("¤t="); + Activity currentActivity = learnerProgress.getCurrentActivity(); + if ( currentActivity != null ) { + progressSummary.append(currentActivity.getActivityId()); + } + } + return progressSummary.toString(); + } } \ No newline at end of file Index: lams_learning/src/java/org/lamsfoundation/lams/learning/web/action/DummyLearnerAction.java =================================================================== diff -u -rd61e53f3f98df777cb3006fe79f844214d40d073 -r7d5e18b6ddc40f4de3d34eefa114afc297724289 --- lams_learning/src/java/org/lamsfoundation/lams/learning/web/action/DummyLearnerAction.java (.../DummyLearnerAction.java) (revision d61e53f3f98df777cb3006fe79f844214d40d073) +++ lams_learning/src/java/org/lamsfoundation/lams/learning/web/action/DummyLearnerAction.java (.../DummyLearnerAction.java) (revision 7d5e18b6ddc40f4de3d34eefa114afc297724289) @@ -60,7 +60,7 @@ * type="org.lamsfoundation.lams.learning.service.LearnerServiceException" * path=".systemError" * handler="org.lamsfoundation.lams.learning.util.CustomStrutsExceptionHandler" - * @struts:action-forward name="controlActivity" path="/dummyControlBottomFrame.jsp" + * @struts:action-forward name="controlActivity" path="/dummyControlFrame.jsp" * @struts:action-forward name="displayActivity" path="/DisplayActivity.do" * * ----------------XDoclet Tags-------------------- Index: lams_learning/src/java/org/lamsfoundation/lams/learning/web/action/GroupingAction.java =================================================================== diff -u -rcdb910b6cd3de106725e2c22ded380c5c0fab650 -r7d5e18b6ddc40f4de3d34eefa114afc297724289 --- lams_learning/src/java/org/lamsfoundation/lams/learning/web/action/GroupingAction.java (.../GroupingAction.java) (revision cdb910b6cd3de106725e2c22ded380c5c0fab650) +++ lams_learning/src/java/org/lamsfoundation/lams/learning/web/action/GroupingAction.java (.../GroupingAction.java) (revision 7d5e18b6ddc40f4de3d34eefa114afc297724289) @@ -127,10 +127,7 @@ currentLearners); LearningWebUtil.putActivityInRequest(request, learnerProgress.getNextActivity(), learnerService); - request.getSession().setAttribute(LearningWebUtil.ATTR_USER_DATA, - learnerProgress.getUser()); - request.getSession().setAttribute(LearningWebUtil.ATTR_LESSON_DATA, - learnerProgress.getLesson()); + LearningWebUtil.setLessonData(learnerProgress.getLesson()); return mapping.findForward(VIEW_GROUPING); } Index: lams_learning/src/java/org/lamsfoundation/lams/learning/web/action/LearnerAction.java =================================================================== diff -u -r1b7715f272ef3db3dc231af149f519b944b73349 -r7d5e18b6ddc40f4de3d34eefa114afc297724289 --- lams_learning/src/java/org/lamsfoundation/lams/learning/web/action/LearnerAction.java (.../LearnerAction.java) (revision 1b7715f272ef3db3dc231af149f519b944b73349) +++ lams_learning/src/java/org/lamsfoundation/lams/learning/web/action/LearnerAction.java (.../LearnerAction.java) (revision 7d5e18b6ddc40f4de3d34eefa114afc297724289) @@ -204,15 +204,7 @@ log.debug("The learner ["+learner.getUserId()+"] joined lesson. The" +"porgress data is:"+learnerProgress.toString()); - // TODO replace with JBOSS cache - //LessonLearnerDataManager.cacheLessonUser(getServlet().getServletContext(), - // lesson,learner); - - //setup session attributes - //request.getSession().setAttribute(SessionBean.NAME,new SessionBean(learner, - // lesson, - // learnerProgress)); - request.getSession().setAttribute(ActivityAction.LEARNER_PROGRESS_REQUEST_ATTRIBUTE,learnerProgress); + LearningWebUtil.setLearnerProgress(learnerProgress); //serialize a acknowledgement flash message with the path of display next //activity Index: lams_learning/src/java/org/lamsfoundation/lams/learning/web/form/ActivityForm.java =================================================================== diff -u -rcdb910b6cd3de106725e2c22ded380c5c0fab650 -r7d5e18b6ddc40f4de3d34eefa114afc297724289 --- lams_learning/src/java/org/lamsfoundation/lams/learning/web/form/ActivityForm.java (.../ActivityForm.java) (revision cdb910b6cd3de106725e2c22ded380c5c0fab650) +++ lams_learning/src/java/org/lamsfoundation/lams/learning/web/form/ActivityForm.java (.../ActivityForm.java) (revision 7d5e18b6ddc40f4de3d34eefa114afc297724289) @@ -24,10 +24,11 @@ /* $$Id$$ */ package org.lamsfoundation.lams.learning.web.form; +import java.util.ArrayList; +import java.util.List; + import javax.servlet.http.HttpServletRequest; -import java.util.*; -import org.apache.struts.action.ActionErrors; import org.apache.struts.action.ActionForm; import org.apache.struts.action.ActionMapping; import org.lamsfoundation.lams.learning.web.bean.ActivityURL; @@ -49,21 +50,10 @@ /** List of ActivityURL, will only contain one if a simple activity */ private List activityURLs; + /** Progress summary suitable for Flash. In the form attempted=13_14&completed=10_11¤t=12.*/ + private String progressSummary; /** - * Method validate - * @param mapping - * @param request - * @return ActionErrors - */ - public ActionErrors validate( - ActionMapping mapping, - HttpServletRequest request) { - - throw new UnsupportedOperationException("Generated method 'validate(...)' not implemented."); - } - - /** * Method reset * @param mapping * @param request @@ -91,4 +81,12 @@ this.activityURLs = new ArrayList(); this.activityURLs.add(activityUrl); } + + public String getProgressSummary() { + return progressSummary; + } + + public void setProgressSummary(String progressSummary) { + this.progressSummary = progressSummary; + } } \ No newline at end of file Index: lams_learning/src/java/org/lamsfoundation/lams/learning/web/util/LearningWebUtil.java =================================================================== diff -u -rcdb910b6cd3de106725e2c22ded380c5c0fab650 -r7d5e18b6ddc40f4de3d34eefa114afc297724289 --- lams_learning/src/java/org/lamsfoundation/lams/learning/web/util/LearningWebUtil.java (.../LearningWebUtil.java) (revision cdb910b6cd3de106725e2c22ded380c5c0fab650) +++ lams_learning/src/java/org/lamsfoundation/lams/learning/web/util/LearningWebUtil.java (.../LearningWebUtil.java) (revision 7d5e18b6ddc40f4de3d34eefa114afc297724289) @@ -57,10 +57,8 @@ //--------------------------------------------------------------------- // Class level constants - session attributes //--------------------------------------------------------------------- - public static final String PARAM_USER_ID = "userId"; + public static final String ATTR_LESSON_DATA = "lesson"; public static final String PARAM_LESSON_ID = "lessonId"; - public static final String ATTR_USER_DATA = "user"; - public static final String ATTR_LESSON_DATA ="lesson"; public static final String PARAM_ACTIVITY_ID = "activityId"; public static final String PARAM_PROGRESS_ID = "progressId"; @@ -100,21 +98,41 @@ */ public static Lesson getLessonData(HttpServletRequest request, ServletContext servletContext) { - Lesson lesson = (Lesson)request.getAttribute(ATTR_LESSON_DATA); + HttpSession ss = SessionManager.getSession(); + Lesson lesson = (Lesson)ss.getAttribute(ATTR_LESSON_DATA); if(lesson ==null) { //initialize service object ILearnerService learnerService = LearnerServiceProxy.getLearnerService(servletContext); long lessonId = WebUtil.readLongParam(request,PARAM_LESSON_ID); lesson = learnerService.getLesson(new Long(lessonId)); -// TODO don't cache it currently - would do it via jboss cache! -// request.getSession().setAttribute(ATTR_LESSON_DATA,lesson); + setLessonData(lesson); } return lesson; } + /** + * Put the lesson data in the user's special session object, so that + * it can be retrieved by getLessonData() + * + * @param request A standard Servlet HttpServletRequest class. + * @param learnerService leaner service facade. + * @param servletContext the servlet container that has all resources + * @return The requested lesson. + */ + public static void setLessonData(Lesson lesson) + { + HttpSession ss = SessionManager.getSession(); + if ( lesson != null ) { + ss.setAttribute(ATTR_LESSON_DATA, lesson); + } else { + ss.removeAttribute(ATTR_LESSON_DATA); + } + } + + /** * Helper method to get session bean. * TODO resolve the duplicate code in activity action. * @param request A standard Servlet HttpServletRequest class. @@ -144,26 +162,34 @@ } /** + * Put the learner progress in the user's special session object. + */ + public static void setLearnerProgress(LearnerProgress progress) { + HttpSession ss = SessionManager.getSession(); + if ( progress != null ) { + ss.setAttribute(ActivityAction.LEARNER_PROGRESS_REQUEST_ATTRIBUTE, progress); + } else { + ss.removeAttribute(ActivityAction.LEARNER_PROGRESS_REQUEST_ATTRIBUTE); + } + } + + /** * Get the current learner progress. The http session attributes are checked * first, if not in request then a new LearnerProgress is loaded by id using * the LearnerService. The LearnerProgress is also stored in the * session so that the Flash requests don't have to reload it. */ public static LearnerProgress getLearnerProgressByID(HttpServletRequest request,ServletContext servletContext) { - //TODO need to be retrieved from proper cache when caching done properly. - LearnerProgress learnerProgress = (LearnerProgress)request.getSession().getAttribute(ActivityAction.LEARNER_PROGRESS_REQUEST_ATTRIBUTE); + HttpSession ss = SessionManager.getSession(); + LearnerProgress learnerProgress = (LearnerProgress)ss.getAttribute(ActivityAction.LEARNER_PROGRESS_REQUEST_ATTRIBUTE); if (learnerProgress == null) { //initialize service object ILearnerService learnerService = LearnerServiceProxy.getLearnerService(servletContext); - long learnerProgressId = WebUtil.readLongParam(request,LearningWebUtil.PARAM_PROGRESS_ID); - learnerProgress = learnerService.getProgressById(new Long(learnerProgressId)); - -// TODO don't cache it currently - would do it via jboss cache! -// request.getSession().setAttribute(ActivityAction.LEARNER_PROGRESS_REQUEST_ATTRIBUTE,learnerProgress); + setLearnerProgress(learnerProgress); } return learnerProgress; } @@ -175,20 +201,17 @@ */ public static LearnerProgress getLearnerProgressByUser(HttpServletRequest request,ServletContext servletContext) { - LearnerProgress learnerProgress = (LearnerProgress)request.getSession().getAttribute(ActivityAction.LEARNER_PROGRESS_REQUEST_ATTRIBUTE); + HttpSession ss = SessionManager.getSession(); + LearnerProgress learnerProgress = (LearnerProgress)ss.getAttribute(ActivityAction.LEARNER_PROGRESS_REQUEST_ATTRIBUTE); if (learnerProgress == null) { //initialize service object ILearnerService learnerService = LearnerServiceProxy.getLearnerService(servletContext); - User currentLearner = getUserData(servletContext); Lesson lesson = getLessonData(request,servletContext); - learnerProgress = learnerService.getProgress(currentLearner,lesson); - -// TODO don't cache it currently - would do it via jboss cache! -// request.getSession().setAttribute(ActivityAction.LEARNER_PROGRESS_REQUEST_ATTRIBUTE,learnerProgress); + setLearnerProgress(learnerProgress); } return learnerProgress; } Index: lams_learning/test/java/org/lamsfoundation/lams/learning/web/action/TestGateAction.java =================================================================== diff -u -rcdb910b6cd3de106725e2c22ded380c5c0fab650 -r7d5e18b6ddc40f4de3d34eefa114afc297724289 --- lams_learning/test/java/org/lamsfoundation/lams/learning/web/action/TestGateAction.java (.../TestGateAction.java) (revision cdb910b6cd3de106725e2c22ded380c5c0fab650) +++ lams_learning/test/java/org/lamsfoundation/lams/learning/web/action/TestGateAction.java (.../TestGateAction.java) (revision 7d5e18b6ddc40f4de3d34eefa114afc297724289) @@ -87,7 +87,6 @@ { addRequestParameter("method", "knockGate"); addRequestParameter(LearningWebUtil.PARAM_PROGRESS_ID,TEST_LERNER_PROGRESS_ID); - addRequestParameter(LearningWebUtil.PARAM_USER_ID, TEST_LEARNER_ID); addRequestParameter(LearningWebUtil.PARAM_ACTIVITY_ID,TEST_GATE_ACTIVITY_ID); addRequestParameter(LearningWebUtil.PARAM_LESSON_ID, TEST_LESSON_ID); @@ -104,7 +103,6 @@ { addRequestParameter("method", "knockGate"); addRequestParameter(LearningWebUtil.PARAM_PROGRESS_ID,TEST_LERNER_PROGRESS_ID); - addRequestParameter(LearningWebUtil.PARAM_USER_ID, TEST_LEARNER_ID); addRequestParameter(LearningWebUtil.PARAM_ACTIVITY_ID,TEST_GATE_ACTIVITY_ID); addRequestParameter(LearningWebUtil.PARAM_LESSON_ID, TEST_LESSON_ID); @@ -139,7 +137,6 @@ if(!singleUser) { request.getSession().removeAttribute("user"); - addRequestParameter(LearningWebUtil.PARAM_USER_ID, "1"); User testUser2 = LearningWebUtil.getUserData(context); LessonLearnerDataManager.cacheLessonUser(context,lesson,testUser2); } Index: lams_learning/test/java/org/lamsfoundation/lams/learning/web/action/TestGroupingAction.java =================================================================== diff -u -rcdb910b6cd3de106725e2c22ded380c5c0fab650 -r7d5e18b6ddc40f4de3d34eefa114afc297724289 --- lams_learning/test/java/org/lamsfoundation/lams/learning/web/action/TestGroupingAction.java (.../TestGroupingAction.java) (revision cdb910b6cd3de106725e2c22ded380c5c0fab650) +++ lams_learning/test/java/org/lamsfoundation/lams/learning/web/action/TestGroupingAction.java (.../TestGroupingAction.java) (revision 7d5e18b6ddc40f4de3d34eefa114afc297724289) @@ -85,7 +85,6 @@ { addRequestParameter("method", "performGrouping"); addRequestParameter(LearningWebUtil.PARAM_PROGRESS_ID,TEST_LERNER_PROGRESS_ID); - addRequestParameter(LearningWebUtil.PARAM_USER_ID, TEST_LEARNER_ID); addRequestParameter(LearningWebUtil.PARAM_ACTIVITY_ID,TEST_RGRP_ACTIVITY_ID); addRequestParameter(LearningWebUtil.PARAM_LESSON_ID, TEST_LESSON_ID); @@ -108,7 +107,6 @@ public void testViewGrouping() { addRequestParameter("method", "viewGrouping"); - addRequestParameter(LearningWebUtil.PARAM_USER_ID, TEST_LEARNER_ID); addRequestParameter(LearningWebUtil.PARAM_LESSON_ID, TEST_LESSON_ID); LearningWebUtil.putActivityInRequest(request,groupingActivity,learnerService); @@ -125,7 +123,6 @@ public void testCompleteActivity() { addRequestParameter("method", "completeActivity"); - addRequestParameter(LearningWebUtil.PARAM_USER_ID, TEST_LEARNER_ID); addRequestParameter(LearningWebUtil.PARAM_LESSON_ID, TEST_LESSON_ID); request.setAttribute(ActivityAction.ACTIVITY_REQUEST_ATTRIBUTE,groupingActivity); Index: lams_learning/test/java/org/lamsfoundation/lams/learning/web/action/TestLearnerAction.java =================================================================== diff -u -rcdb910b6cd3de106725e2c22ded380c5c0fab650 -r7d5e18b6ddc40f4de3d34eefa114afc297724289 --- lams_learning/test/java/org/lamsfoundation/lams/learning/web/action/TestLearnerAction.java (.../TestLearnerAction.java) (revision cdb910b6cd3de106725e2c22ded380c5c0fab650) +++ lams_learning/test/java/org/lamsfoundation/lams/learning/web/action/TestLearnerAction.java (.../TestLearnerAction.java) (revision 7d5e18b6ddc40f4de3d34eefa114afc297724289) @@ -81,7 +81,6 @@ public void testGetActiveLessons() { addRequestParameter("method", "getActiveLessons"); - addRequestParameter(LearningWebUtil.PARAM_USER_ID, TEST_USER_ID); actionPerform(); @@ -91,7 +90,6 @@ public void testJoinLesson() { addRequestParameter("method", "joinLesson"); - addRequestParameter(LearningWebUtil.PARAM_USER_ID, TEST_USER_ID); addRequestParameter(LearningWebUtil.PARAM_LESSON_ID, TEST_LESSON_ID); actionPerform(); @@ -112,7 +110,6 @@ { httpSession.setAttribute(ActivityAction.LEARNER_PROGRESS_REQUEST_ATTRIBUTE,testLearnerProgress); addRequestParameter("method", "getFlashProgressData"); - addRequestParameter(LearningWebUtil.PARAM_USER_ID, TEST_USER_ID); addRequestParameter(LearningWebUtil.PARAM_LESSON_ID, TEST_LESSON_ID); actionPerform(); @@ -122,7 +119,6 @@ public void testExitLesson() { addRequestParameter("method", "exitLesson"); - addRequestParameter(LearningWebUtil.PARAM_USER_ID, TEST_USER_ID); addRequestParameter(LearningWebUtil.PARAM_LESSON_ID, TEST_LESSON_ID); actionPerform(); @@ -135,7 +131,6 @@ public void testGetLearnerActivityURL() { addRequestParameter("method", "getLearnerActivityURL"); - addRequestParameter(LearningWebUtil.PARAM_USER_ID, TEST_USER_ID); addRequestParameter(LearningWebUtil.PARAM_ACTIVITY_ID, TEST_ACTIVITY_ID); actionPerform();