Index: lams_build/lib/lams/lams-learning.jar =================================================================== diff -u -r5aff7aa069793bc34e60b304e69e9e9fceb996f5 -re5049e0948ac38f849ed086dfa9b8b7dfd8d76ae Binary files differ Index: lams_build/lib/lams/lams.jar =================================================================== diff -u -rfdd3269dc819d6a0a848cb7f3e190bdf270e4ea8 -re5049e0948ac38f849ed086dfa9b8b7dfd8d76ae Binary files differ Index: lams_common/src/java/org/lamsfoundation/lams/lesson/dao/ILessonDAO.java =================================================================== diff -u -r7e8b71604044e851c877e918e7d6570a9942a356 -re5049e0948ac38f849ed086dfa9b8b7dfd8d76ae --- lams_common/src/java/org/lamsfoundation/lams/lesson/dao/ILessonDAO.java (.../ILessonDAO.java) (revision 7e8b71604044e851c877e918e7d6570a9942a356) +++ lams_common/src/java/org/lamsfoundation/lams/lesson/dao/ILessonDAO.java (.../ILessonDAO.java) (revision e5049e0948ac38f849ed086dfa9b8b7dfd8d76ae) @@ -129,4 +129,10 @@ * @return the list of Lessons */ public List getPreviewLessonsBeforeDate(final Date startDate); + + /** + * Get the lesson that applies to this activity. Not all activities have an attached lesson. + */ + public Lesson getLessonForActivity(final long activityId); + } Index: lams_common/src/java/org/lamsfoundation/lams/lesson/dao/hibernate/LessonDAO.java =================================================================== diff -u -r7fe9774aaa83d47d9cd66dca7daf4a30cbb4f3ec -re5049e0948ac38f849ed086dfa9b8b7dfd8d76ae --- lams_common/src/java/org/lamsfoundation/lams/lesson/dao/hibernate/LessonDAO.java (.../LessonDAO.java) (revision 7fe9774aaa83d47d9cd66dca7daf4a30cbb4f3ec) +++ lams_common/src/java/org/lamsfoundation/lams/lesson/dao/hibernate/LessonDAO.java (.../LessonDAO.java) (revision e5049e0948ac38f849ed086dfa9b8b7dfd8d76ae) @@ -31,6 +31,7 @@ import org.hibernate.Query; import org.hibernate.Session; import org.hibernate.criterion.Expression; +import org.lamsfoundation.lams.learningdesign.Activity; import org.lamsfoundation.lams.learningdesign.LearningDesign; import org.lamsfoundation.lams.lesson.LearnerProgress; import org.lamsfoundation.lams.lesson.Lesson; @@ -58,6 +59,9 @@ private final static String COUNT_ACTIVE_LEARNERS = "select count(distinct progress.user.id)" + " from "+LearnerProgress.class.getName()+" progress" + " where progress.lesson.id = :lessonId"; + private final static String FIND_LESSON_FOR_ACTIVITY = "select lesson from " + + Lesson.class.getName()+" lesson, "+ Activity.class.getName() + " activity " + + " where activity.activityId=:activityId and activity.learningDesign=lesson.learningDesign"; /** * Retrieves the Lesson @@ -279,5 +283,20 @@ List lessons = this.getHibernateTemplate().find(FIND_PREVIEW_BEFORE_START_DATE,startDate); return lessons; } + /** + * Get the lesson that applies to this activity. Not all activities have an attached lesson. + */ + public Lesson getLessonForActivity(final long activityId) + { + HibernateTemplate hibernateTemplate = new HibernateTemplate(this.getSessionFactory()); + return (Lesson) hibernateTemplate.execute(new HibernateCallback() { + public Object doInHibernate(Session session) + throws HibernateException { + Query query = session.createQuery(FIND_LESSON_FOR_ACTIVITY); + query.setLong("activityId", activityId); + return query.uniqueResult(); + } + }); + } } Index: lams_learning/src/java/org/lamsfoundation/lams/learning/service/ILearnerService.java =================================================================== diff -u -ra0722fe03d763f9da5efc82987034d929e6a23a1 -re5049e0948ac38f849ed086dfa9b8b7dfd8d76ae --- lams_learning/src/java/org/lamsfoundation/lams/learning/service/ILearnerService.java (.../ILearnerService.java) (revision a0722fe03d763f9da5efc82987034d929e6a23a1) +++ lams_learning/src/java/org/lamsfoundation/lams/learning/service/ILearnerService.java (.../ILearnerService.java) (revision e5049e0948ac38f849ed086dfa9b8b7dfd8d76ae) @@ -28,12 +28,12 @@ import org.lamsfoundation.lams.learningdesign.Activity; import org.lamsfoundation.lams.learningdesign.GateActivity; -import org.lamsfoundation.lams.learningdesign.GroupingActivity; import org.lamsfoundation.lams.lesson.LearnerProgress; import org.lamsfoundation.lams.lesson.Lesson; import org.lamsfoundation.lams.lesson.dto.LearnerProgressDTO; import org.lamsfoundation.lams.lesson.dto.LessonDTO; import org.lamsfoundation.lams.usermanagement.User; +import org.lamsfoundation.lams.usermanagement.service.IUserManagementService; import org.lamsfoundation.lams.util.MessageService; /** * @@ -45,6 +45,9 @@ /** Get the I18N service. Used by actions for internationalising errors that go back to Flash */ public MessageService getMessageService(); + /** Get the user service. Used when the action needs the real user object, not just the userId */ + public IUserManagementService getUserManagementService(); + /** * Gets the lesson object for the given key. * @@ -105,11 +108,10 @@ * Calculates learner progress and returns the data required to be displayed to the learner (including URL(s)). * @param completedActivityID identifies the activity just completed * @param learner the Learner - * @param lessonId the Lesson in progress. * @return the bean containing the display data for the Learner * @throws LearnerServiceException in case of problems. */ - public LearnerProgress calculateProgress(Activity completedActivity, Integer learnerId, Long lessonId); + public LearnerProgress calculateProgress(Activity completedActivity, Integer learnerId); /** @@ -136,10 +138,9 @@ * * @param learnerId the learner who are running this activity in the design. * @param activity the activity is being run. - * @param lesson id the lesson this learner is currently in. * @return the url for next activity. */ - public String completeActivity(Integer learnerId,Long activityId,Long lessonId); + public String completeActivity(Integer learnerId,Long activityId); /** * Complete the activity in the progress engine and delegate to the progress @@ -149,10 +150,9 @@ * * @param learnerId the learner who are running this activity in the design. * @param activity the activity is being run. - * @param lessonId the lesson this learner is currently in. * @return the url for next activity. */ - public String completeActivity(Integer learnerId,Activity activity,Long lessonId); + public String completeActivity(Integer learnerId,Activity activity); /** * Retrieve all lessons that has been started, suspended or finished. All @@ -167,7 +167,8 @@ * Mark the learner progress as restarting to indicate the current learner * has exit the lesson. Doesn't use the cached progress object in case it * - * @param progressId the current learner progress. + * @param userId + * @param lessonId */ public void exitLesson(Long progressId); @@ -208,20 +209,18 @@ * Check up the gate status to go through the gate. This also updates the gate. * This method should be used when we do not have an grouping activity * that is already part of the Hibernate session. - * @param lessonId lesson id * @param gateid the gate that current learner is facing. It could be * synch gate, schedule gate or permission gate. * @param knocker the learner who wants to go through the gate. * @param forceGate if forceGate==true and the lesson is a preview lesson then the gate is opened straight away. * @return true if the gate is now open */ - public boolean knockGate(Long lessonId, Long gateActivityId, User knocker, boolean forceGate); + public boolean knockGate(Long gateActivityId, User knocker, boolean forceGate); /** * Check up the gate status to go through the gate. This also updates the gate. * This method should be used when we do have an grouping activity * that is already part of the Hibernate session. - * @param lessonId lesson id * @param gate the gate that current learner is facing. It could be * synch gate, schedule gate or permission gate. * Don't supply the actual gate from the cached web version @@ -230,5 +229,20 @@ * @param forceGate if forceGate==true and the lesson is a preview lesson then the gate is opened straight away. * @return true if the gate is now open */ - public boolean knockGate(Long lessonId, GateActivity gateActivity, User knocker, boolean forceGate); + public boolean knockGate(GateActivity gateActivity, User knocker, boolean forceGate); + + /** + * Get the learner url for a particular activity. + * + * @param learnerId + * @param activityId + */ + public String getLearnerActivityURL(Integer learnerId, Long activityId); + + /** + * Get the lesson for this activity. If the activity is not part of a lesson (ie is from an authoring + * design then it will return null. + */ + public Lesson getLessonByActivity(Activity activity); + } Index: lams_learning/src/java/org/lamsfoundation/lams/learning/service/LearnerService.java =================================================================== diff -u -ra0722fe03d763f9da5efc82987034d929e6a23a1 -re5049e0948ac38f849ed086dfa9b8b7dfd8d76ae --- lams_learning/src/java/org/lamsfoundation/lams/learning/service/LearnerService.java (.../LearnerService.java) (revision a0722fe03d763f9da5efc82987034d929e6a23a1) +++ lams_learning/src/java/org/lamsfoundation/lams/learning/service/LearnerService.java (.../LearnerService.java) (revision e5049e0948ac38f849ed086dfa9b8b7dfd8d76ae) @@ -35,7 +35,6 @@ 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; @@ -308,16 +307,14 @@ * to the learner. * @param completedActivityID identifies the activity just completed * @param learner the Learner - * @param lessonId the Lesson in progress. * @return the bean containing the display data for the Learner * @throws LamsToolServiceException * @throws LearnerServiceException in case of problems. */ - public LearnerProgress calculateProgress(Activity completedActivity, - Integer learnerId, - Long lessonId) + public LearnerProgress calculateProgress(Activity completedActivity,Integer learnerId) { - LearnerProgress learnerProgress = learnerProgressDAO.getLearnerProgressByLearner(learnerId,lessonId); + Lesson lesson = getLessonByActivity(completedActivity); + LearnerProgress learnerProgress = learnerProgressDAO.getLearnerProgressByLearner(learnerId,lesson.getLessonId()); try { @@ -346,32 +343,25 @@ lamsCoreToolService.updateToolSession(toolSession); - return completeActivity(new Integer(learnerId.intValue()), toolSession.getToolActivity(), toolSession.getLesson().getLessonId()); + return completeActivity(new Integer(learnerId.intValue()), toolSession.getToolActivity()); } /** - * @see org.lamsfoundation.lams.learning.service.ILearnerService#completeActivity(java.lang.Integer, java.lang.Long, java.lang.Long) + * @see org.lamsfoundation.lams.learning.service.ILearnerService#completeActivity(java.lang.Integer, java.lang.Long) */ - public String completeActivity(Integer learnerId,Long activityId,Long lessonId) { + public String completeActivity(Integer learnerId,Long activityId) { Activity activity = getActivity(activityId); - return completeActivity(learnerId, activity,lessonId); + return completeActivity(learnerId, activity); } /** * @see org.lamsfoundation.lams.learning.service.ILearnerService#completeActivity(java.lang.Integer, org.lamsfoundation.lams.learningdesign.Activity, java.lang.Long ) */ - public String completeActivity(Integer learnerId,Activity activity,Long lessonId) + public String completeActivity(Integer learnerId,Activity activity) { - //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, learnerId, lessonId); - LearningWebUtil.setLearnerProgress(nextLearnerProgress); + LearnerProgress nextLearnerProgress = calculateProgress(activity, learnerId); return activityMapping.getProgressURL(nextLearnerProgress); } catch (UnsupportedEncodingException e) @@ -443,7 +433,7 @@ } } else { - String error = "Grouping activity "+groupingActivityId+" learner "+learnerId+" does not exist. Cannot perform grouping."; + String error = "Grouping activity "+groupingActivity.getActivityId()+" learner "+learnerId+" does not exist. Cannot perform grouping."; log.error(error); throw new LearnerServiceException(error); } @@ -455,30 +445,31 @@ /** - * @see org.lamsfoundation.lams.learning.service.ILearnerService#knockGate(java.lang.Long, java.lang.Long, org.lamsfoundation.lams.usermanagement.User) + * @see org.lamsfoundation.lams.learning.service.ILearnerService#knockGate(java.lang.Long, org.lamsfoundation.lams.usermanagement.User) */ - public boolean knockGate(Long lessonId, Long gateActivityId, User knocker, boolean forceGate) { + public boolean knockGate(Long gateActivityId, User knocker, boolean forceGate) { GateActivity gate = (GateActivity) activityDAO.getActivityByActivityId(gateActivityId, GateActivity.class); if ( gate != null ) { - return knockGate(lessonId, gate,knocker, forceGate); + return knockGate(gate,knocker, forceGate); } String error = "Gate activity "+gateActivityId+" does not exist. Cannot knock on gate."; log.error(error); throw new LearnerServiceException(error); } /** - * @see org.lamsfoundation.lams.learning.service.ILearnerService#knockGate(java.lang.Long, org.lamsfoundation.lams.learningdesign.GateActivity, org.lamsfoundation.lams.usermanagement.User) + * @see org.lamsfoundation.lams.learning.service.ILearnerService#knockGate(org.lamsfoundation.lams.learningdesign.GateActivity, org.lamsfoundation.lams.usermanagement.User) */ - public boolean knockGate(Long lessonId, GateActivity gate, User knocker, boolean forceGate) + public boolean knockGate(GateActivity gate, User knocker, boolean forceGate) { + Lesson lesson = getLessonByActivity(gate); + //get all learners who have started the lesson - List lessonLearners = getActiveLearnersByLesson(lessonId); + List lessonLearners = getActiveLearnersByLesson(lesson.getLessonId()); boolean gateOpen = false; if ( forceGate ) { - Lesson lesson = getLesson(lessonId); if ( lesson.isPreviewLesson() ) { // special case for preview - if forceGate is true then brute force open the gate gateOpen = gate.forceGateOpen(); @@ -497,6 +488,43 @@ } + /** + * @see org.lamsfoundation.lams.learning.service.ILearnerService#getLearnerActivityURL(java.lang.Integer, java.lang.Long) + */ + public String getLearnerActivityURL(Integer learnerId, Long activityId) { + User learner = userManagementService.getUserById(learnerId); + Activity requestedActivity = getActivity(activityId); + Lesson lesson = getLessonByActivity(requestedActivity); + return activityMapping.calculateActivityURLForProgressView(lesson,learner,requestedActivity); + } + + /** + * @see org.lamsfoundation.lams.learning.service.ILearnerService#getActiveLearnersByLesson(long) + */ + public List getActiveLearnersByLesson(long lessonId) + { + return lessonService.getActiveLessonLearners(lessonId); + } + + /** + * @see org.lamsfoundation.lams.learning.service.ILearnerService#getCountActiveLessonLearners(long) + */ + public Integer getCountActiveLearnersByLesson(long lessonId) + { + return lessonService.getCountActiveLessonLearners(lessonId); + } + + /** + * Get the lesson for this activity. If the activity is not part of a lesson (ie is from an authoring + * design then it will return null. + */ + public Lesson getLessonByActivity(Activity activity) { + Lesson lesson = lessonDAO.getLessonForActivity(activity.getActivityId()); + if ( lesson == null ) { + log.warn("Tried to get lesson id for a non-lesson based activity. An error is likely to be thrown soon. Activity was "+activity); + } + return lesson; + } //--------------------------------------------------------------------- // Helper Methods //--------------------------------------------------------------------- @@ -580,20 +608,5 @@ return (LessonDTO[])lessonDTOList.toArray(new LessonDTO[lessonDTOList.size()]); } - /** - * @see org.lamsfoundation.lams.learning.service.ILearnerService#getActiveLearnersByLesson(long) - */ - public List getActiveLearnersByLesson(long lessonId) - { - return lessonService.getActiveLessonLearners(lessonId); - } - - /** - * @see org.lamsfoundation.lams.learning.service.ILearnerService#getCountActiveLessonLearners(long) - */ - public Integer getCountActiveLearnersByLesson(long lessonId) - { - return lessonService.getCountActiveLessonLearners(lessonId); - } } Index: lams_learning/src/java/org/lamsfoundation/lams/learning/web/action/ActivityAction.java =================================================================== diff -u -r0737cfe898d26d4143b69f182344b713c7f36158 -re5049e0948ac38f849ed086dfa9b8b7dfd8d76ae --- lams_learning/src/java/org/lamsfoundation/lams/learning/web/action/ActivityAction.java (.../ActivityAction.java) (revision 0737cfe898d26d4143b69f182344b713c7f36158) +++ lams_learning/src/java/org/lamsfoundation/lams/learning/web/action/ActivityAction.java (.../ActivityAction.java) (revision e5049e0948ac38f849ed086dfa9b8b7dfd8d76ae) @@ -50,11 +50,18 @@ public static final String ACTIVITY_REQUEST_ATTRIBUTE = "activity"; public static final String LEARNER_PROGRESS_REQUEST_ATTRIBUTE = "learnerprogress"; + + private ILearnerService learnerService = null; + protected ILearnerService getLearnerService() { + if (learnerService == null) + learnerService = LearnerServiceProxy.getLearnerService(getServlet().getServletContext()); + return learnerService; + } + public ActionForward setupProgressString(ActionForm actionForm, HttpServletRequest request) { - LearnerProgress learnerProgress = LearningWebUtil.getLearnerProgressByID(request, - getServlet().getServletContext()); + LearnerProgress learnerProgress = LearningWebUtil.getLearnerProgress(request,getLearnerService()); ActivityForm activityForm = (ActivityForm) actionForm; @@ -71,13 +78,6 @@ return null; } - /** - * Get the learner service. - */ - protected ILearnerService getLearnerService() { - ILearnerService learnerService = LearnerServiceProxy.getLearnerService(this.getServlet().getServletContext()); - return learnerService; - } /** * Get the ActionMappings. @@ -87,25 +87,6 @@ return (ActivityMapping)wac.getBean("activityMapping"); } - /** - * Get the current learner progress. The request attributes are checked - * first, if not in request then a new LearnerProgress is loaded using - * the LearnerService. The LearnerProgress is also stored in the - * session so that the Flash requests don't have to reload it. - */ - protected LearnerProgress getLearnerProgress(HttpServletRequest request) { - - return LearningWebUtil.getLearnerProgressByID(request,this.getServlet().getServletContext()); - } - - /** - * Sets the LearnerProgress in session so that the Flash requests don't - * have to reload it. - */ - protected void setLearnerProgress(HttpServletRequest request, LearnerProgress learnerProgress) { - LearningWebUtil.setLearnerProgress(learnerProgress); - } - private String getProgressSummary(LearnerProgress learnerProgress) { StringBuffer progressSummary = new StringBuffer(100); if ( learnerProgress == null ) { Index: lams_learning/src/java/org/lamsfoundation/lams/learning/web/action/ChooseActivityAction.java =================================================================== diff -u -r5aff7aa069793bc34e60b304e69e9e9fceb996f5 -re5049e0948ac38f849ed086dfa9b8b7dfd8d76ae --- lams_learning/src/java/org/lamsfoundation/lams/learning/web/action/ChooseActivityAction.java (.../ChooseActivityAction.java) (revision 5aff7aa069793bc34e60b304e69e9e9fceb996f5) +++ lams_learning/src/java/org/lamsfoundation/lams/learning/web/action/ChooseActivityAction.java (.../ChooseActivityAction.java) (revision e5049e0948ac38f849ed086dfa9b8b7dfd8d76ae) @@ -68,21 +68,22 @@ return mapping.findForward(ActivityMapping.DOUBLE_SUBMIT_ERROR); } + ILearnerService learnerService = getLearnerService(); + // Get learner and lesson details. Integer learner = LearningWebUtil.getUserId(); - LearnerProgress progress = getLearnerProgress(request); + LearnerProgress progress = LearningWebUtil.getLearnerProgress(request,learnerService); Lesson lesson = progress.getLesson(); - Activity activity = LearningWebUtil.getActivityFromRequest(request, getLearnerService()); + Activity activity = LearningWebUtil.getActivityFromRequest(request, learnerService); if (activity == null) { log.error(className+": No activity in request or session"); return mapping.findForward(ActivityMapping.ERROR); } - ILearnerService learnerService = getLearnerService(); progress = learnerService.chooseActivity(learner, lesson.getLessonId(), activity); - setLearnerProgress(request,progress); + LearningWebUtil.putLearnerProgressInRequest(request,progress); // need to do the choose first as the chooseActivity changes the progress details setupProgressString(actionForm, request); Index: lams_learning/src/java/org/lamsfoundation/lams/learning/web/action/CompleteActivityAction.java =================================================================== diff -u -r5aff7aa069793bc34e60b304e69e9e9fceb996f5 -re5049e0948ac38f849ed086dfa9b8b7dfd8d76ae --- lams_learning/src/java/org/lamsfoundation/lams/learning/web/action/CompleteActivityAction.java (.../CompleteActivityAction.java) (revision 5aff7aa069793bc34e60b304e69e9e9fceb996f5) +++ lams_learning/src/java/org/lamsfoundation/lams/learning/web/action/CompleteActivityAction.java (.../CompleteActivityAction.java) (revision e5049e0948ac38f849ed086dfa9b8b7dfd8d76ae) @@ -36,7 +36,6 @@ import org.lamsfoundation.lams.learning.web.util.LearningWebUtil; import org.lamsfoundation.lams.learningdesign.Activity; import org.lamsfoundation.lams.lesson.LearnerProgress; -import org.lamsfoundation.lams.lesson.Lesson; /** * @author daveg @@ -72,27 +71,26 @@ return mapping.findForward(ActivityMapping.DOUBLE_SUBMIT_ERROR); } + ILearnerService learnerService = getLearnerService(); + Integer learnerId = LearningWebUtil.getUserId(); - LearnerProgress progress = getLearnerProgress(request); - Lesson lesson = progress.getLesson(); - Activity activity = LearningWebUtil.getActivityFromRequest(request, getLearnerService()); + LearnerProgress progress = LearningWebUtil.getLearnerProgress(request, learnerService); + Activity activity = LearningWebUtil.getActivityFromRequest(request, learnerService); if (activity == null) { log.error(className+": No activity in request or session"); return mapping.findForward(ActivityMapping.ERROR); } - ILearnerService learnerService = getLearnerService(); - // Set activity as complete try { - progress = learnerService.calculateProgress(activity, learnerId, lesson.getLessonId()); + progress = learnerService.calculateProgress(activity, learnerId); } catch (LearnerServiceException e) { return mapping.findForward("error"); } LearningWebUtil.putActivityInRequest(request, progress.getNextActivity(), learnerService); - setLearnerProgress(request,progress); + LearningWebUtil.putLearnerProgressInRequest(request,progress); // need to do the calculateProgress first as the chooseActivity changes the progress details setupProgressString(actionForm, request); Index: lams_learning/src/java/org/lamsfoundation/lams/learning/web/action/DisplayActivityAction.java =================================================================== diff -u -r5aff7aa069793bc34e60b304e69e9e9fceb996f5 -re5049e0948ac38f849ed086dfa9b8b7dfd8d76ae --- lams_learning/src/java/org/lamsfoundation/lams/learning/web/action/DisplayActivityAction.java (.../DisplayActivityAction.java) (revision 5aff7aa069793bc34e60b304e69e9e9fceb996f5) +++ lams_learning/src/java/org/lamsfoundation/lams/learning/web/action/DisplayActivityAction.java (.../DisplayActivityAction.java) (revision e5049e0948ac38f849ed086dfa9b8b7dfd8d76ae) @@ -31,18 +31,21 @@ import org.apache.struts.action.ActionForm; import org.apache.struts.action.ActionForward; import org.apache.struts.action.ActionMapping; +import org.lamsfoundation.lams.learning.service.ILearnerService; import org.lamsfoundation.lams.learning.service.LearnerServiceProxy; import org.lamsfoundation.lams.learning.web.util.ActivityMapping; import org.lamsfoundation.lams.learning.web.util.LearningWebUtil; import org.lamsfoundation.lams.lesson.LearnerProgress; +import org.lamsfoundation.lams.util.WebUtil; +import org.lamsfoundation.lams.web.util.AttributeNames; /** - * Action class to display an activity. This is used when Flash calls the service to the - * learning process. It is needed to put the activity in the request, on which - * LoadToolActivityAction relies. If you try to go straight to LoadToolActivityAction - * then the activity won't be the request. + * Action class to display an activity. This is used when Flash calls starts of the + * learning process. It is needed to put the learner progress and the activity in the request, + * on which LoadToolActivityAction relies. If you try to go straight to LoadToolActivityAction + * then the data won't be in the request. * * XDoclet definition: * @@ -75,11 +78,22 @@ HttpServletRequest request, HttpServletResponse response) { + ILearnerService learnerService = getLearnerService(); + + // Flash can only send the lessonID as that is all it has... + Integer learnerId = LearningWebUtil.getUserId(); + Long lessonId = WebUtil.readLongParam(request,AttributeNames.PARAM_LESSON_ID, true ); + // hack until Flash changes its url - current sending progressId + if ( lessonId == null ) { + lessonId = WebUtil.readLongParam(request,"progressId"); + } + LearnerProgress learnerProgress = learnerService.getProgress(learnerId, lessonId); + + LearningWebUtil.putLearnerProgressInRequest(request, learnerProgress); - setupProgressString(actionForm, request); ActivityMapping actionMappings = LearnerServiceProxy.getActivityMapping(getServlet().getServletContext()); - LearnerProgress learnerProgress = LearningWebUtil.getLearnerProgressByID(request, getServlet().getServletContext()); - ActionForward forward =actionMappings.getProgressForward(learnerProgress,false,request,getLearnerService()); + ActionForward forward =actionMappings.getProgressForward(learnerProgress,false,request,learnerService); + setupProgressString(actionForm, request); if(log.isDebugEnabled()) log.debug(forward.toString()); Index: lams_learning/src/java/org/lamsfoundation/lams/learning/web/action/DisplayOptionsActivityAction.java =================================================================== diff -u -r5aff7aa069793bc34e60b304e69e9e9fceb996f5 -re5049e0948ac38f849ed086dfa9b8b7dfd8d76ae --- lams_learning/src/java/org/lamsfoundation/lams/learning/web/action/DisplayOptionsActivityAction.java (.../DisplayOptionsActivityAction.java) (revision 5aff7aa069793bc34e60b304e69e9e9fceb996f5) +++ lams_learning/src/java/org/lamsfoundation/lams/learning/web/action/DisplayOptionsActivityAction.java (.../DisplayOptionsActivityAction.java) (revision e5049e0948ac38f849ed086dfa9b8b7dfd8d76ae) @@ -35,6 +35,7 @@ import org.apache.struts.action.ActionForm; import org.apache.struts.action.ActionForward; import org.apache.struts.action.ActionMapping; +import org.lamsfoundation.lams.learning.service.ILearnerService; import org.lamsfoundation.lams.learning.web.bean.ActivityURL; import org.lamsfoundation.lams.learning.web.form.OptionsActivityForm; @@ -72,8 +73,9 @@ OptionsActivityForm form = (OptionsActivityForm)actionForm; ActivityMapping actionMappings = getActivityMapping(); - LearnerProgress learnerProgress = getLearnerProgress(request); - Activity activity = LearningWebUtil.getActivityFromRequest(request, getLearnerService()); + ILearnerService learnerService = getLearnerService(); + LearnerProgress learnerProgress = LearningWebUtil.getLearnerProgress(request, learnerService); + Activity activity = LearningWebUtil.getActivityFromRequest(request, learnerService); if (!(activity instanceof OptionsActivity)) { log.error(className+": activity not OptionsActivity "+activity.getActivityId()); return mapping.findForward(ActivityMapping.ERROR); @@ -111,7 +113,6 @@ this.saveToken(request); - // need to do the calculateProgress first as the chooseActivity changes the progress details setupProgressString(form, request); String forward = "displayOptions"; Index: lams_learning/src/java/org/lamsfoundation/lams/learning/web/action/DisplayToolActivityAction.java =================================================================== diff -u -r1290c6550e900eba41bd51803e59f2a7af0b521b -re5049e0948ac38f849ed086dfa9b8b7dfd8d76ae --- lams_learning/src/java/org/lamsfoundation/lams/learning/web/action/DisplayToolActivityAction.java (.../DisplayToolActivityAction.java) (revision 1290c6550e900eba41bd51803e59f2a7af0b521b) +++ lams_learning/src/java/org/lamsfoundation/lams/learning/web/action/DisplayToolActivityAction.java (.../DisplayToolActivityAction.java) (revision e5049e0948ac38f849ed086dfa9b8b7dfd8d76ae) @@ -30,6 +30,7 @@ import org.apache.struts.action.ActionForm; import org.apache.struts.action.ActionForward; import org.apache.struts.action.ActionMapping; +import org.lamsfoundation.lams.learning.service.ILearnerService; import org.lamsfoundation.lams.learning.web.util.ActivityMapping; import org.lamsfoundation.lams.learning.web.util.LearningWebUtil; import org.lamsfoundation.lams.learningdesign.Activity; @@ -63,8 +64,9 @@ //ActivityForm form = (ActivityForm)actionForm; ActivityMapping actionMappings = getActivityMapping(); - LearnerProgress learnerProgress = getLearnerProgress(request); - Activity activity = LearningWebUtil.getActivityFromRequest(request, getLearnerService()); + ILearnerService learnerService = getLearnerService(); + LearnerProgress learnerProgress = LearningWebUtil.getLearnerProgress(request, learnerService); + Activity activity = LearningWebUtil.getActivityFromRequest(request, learnerService); if (!(activity instanceof ToolActivity)) { log.error(className+": activity not ToolActivity"); Index: lams_learning/src/java/org/lamsfoundation/lams/learning/web/action/DummyLearnerAction.java =================================================================== diff -u -rdf5800a31c32417e062928bfca21c1b2c2ed1472 -re5049e0948ac38f849ed086dfa9b8b7dfd8d76ae --- lams_learning/src/java/org/lamsfoundation/lams/learning/web/action/DummyLearnerAction.java (.../DummyLearnerAction.java) (revision df5800a31c32417e062928bfca21c1b2c2ed1472) +++ lams_learning/src/java/org/lamsfoundation/lams/learning/web/action/DummyLearnerAction.java (.../DummyLearnerAction.java) (revision e5049e0948ac38f849ed086dfa9b8b7dfd8d76ae) @@ -158,7 +158,7 @@ log.debug("The learner ["+learner+"] joined lesson. The" +"progress data is:"+learnerProgress.toString()); - LearningWebUtil.setLearnerProgress(learnerProgress); + LearningWebUtil.putLearnerProgressInRequest(request, learnerProgress); return mapping.findForward(DISPLAY_ACTIVITY); } Index: lams_learning/src/java/org/lamsfoundation/lams/learning/web/action/GateAction.java =================================================================== diff -u -ra0722fe03d763f9da5efc82987034d929e6a23a1 -re5049e0948ac38f849ed086dfa9b8b7dfd8d76ae --- lams_learning/src/java/org/lamsfoundation/lams/learning/web/action/GateAction.java (.../GateAction.java) (revision a0722fe03d763f9da5efc82987034d929e6a23a1) +++ lams_learning/src/java/org/lamsfoundation/lams/learning/web/action/GateAction.java (.../GateAction.java) (revision e5049e0948ac38f849ed086dfa9b8b7dfd8d76ae) @@ -42,9 +42,11 @@ import org.lamsfoundation.lams.learningdesign.PermissionGateActivity; import org.lamsfoundation.lams.learningdesign.ScheduleGateActivity; import org.lamsfoundation.lams.learningdesign.SynchGateActivity; -import org.lamsfoundation.lams.lesson.LearnerProgress; +import org.lamsfoundation.lams.lesson.Lesson; +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; /** @@ -119,69 +121,38 @@ HttpServletResponse response) throws IOException, ServletException { - LearnerProgress learnerProgress = LearningWebUtil.getLearnerProgressByID(request, - getServlet().getServletContext()); - //validate pre-condition. - validateLearnerProgress(learnerProgress); - boolean forceGate = WebUtil.readBooleanParam(request,PARAM_FORCE_GATE_OPEN,false); + Long activityId = WebUtil.readLongParam(request, AttributeNames.PARAM_ACTIVITY_ID); //initialize service object ILearnerService learnerService = LearnerServiceProxy.getLearnerService(getServlet().getServletContext()); - Integer totalNumActiveLearners = learnerService.getCountActiveLearnersByLesson(learnerProgress.getLesson().getLessonId()); + Activity activity = learnerService.getActivity(activityId); + Lesson lesson = learnerService.getLessonByActivity(activity); + User learner = LearningWebUtil.getUser(learnerService); + + Integer totalNumActiveLearners = learnerService.getCountActiveLearnersByLesson(lesson.getLessonId()); //knock the gate - boolean gateOpen = learnerService.knockGate(learnerProgress.getLesson().getLessonId(), - learnerProgress.getNextActivity().getActivityId(), - learnerProgress.getUser(),forceGate); + 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) { - String nextActivityUrl = learnerService.completeActivity(learnerProgress.getUser().getUserId(), - learnerProgress.getNextActivity().getActivityId(), - learnerProgress.getLesson().getLessonId()); - // get the update - LearningWebUtil.setLearnerProgress(learnerService.getProgressById(learnerProgress.getLearnerProgressId())); + String nextActivityUrl = learnerService.completeActivity(learner.getUserId(),activityId); response.sendRedirect(nextActivityUrl); return null; } //if the gate is closed, ask the learner to wait ( updating the cached learner progress on the way ) else { - learnerProgress = learnerService.getProgressById(learnerProgress.getLearnerProgressId()); - LearningWebUtil.setLearnerProgress(learnerProgress); - return findViewByGateType(mapping, (DynaActionForm)form, learnerProgress.getCurrentActivity(), totalNumActiveLearners, learnerProgress.getLesson().isPreviewLesson()); + return findViewByGateType(mapping, (DynaActionForm)form, activity, totalNumActiveLearners, lesson.isPreviewLesson()); } } //--------------------------------------------------------------------- // Helper methods //--------------------------------------------------------------------- /** - * @param learnerProgress - */ - private void validateLearnerProgress(LearnerProgress learnerProgress) - { - if(learnerProgress ==null) - throw new LearnerServiceException("Can't perform grouping without knowing" + - " the learner progress."); - - if(!isNextActivityValid(learnerProgress)) - throw new LearnerServiceException("Error in progress engine. Getting " - +learnerProgress.getNextActivity().toString() - +" where it should be gate activity"); - } - - /** - * @param learnerProgress - * @return - */ - private boolean isNextActivityValid(LearnerProgress learnerProgress) - { - return learnerProgress.getNextActivity()!=null&&(learnerProgress.getNextActivity().isGateActivity()); - } - - /** * Dispatch view the according to the gate type. * * @param mapping An ActionMapping class that will be used by the Action @@ -203,6 +174,7 @@ if ( gate != null ) { gateForm.set("totalLearners",totalNumActiveLearners); gateForm.set("previewLesson",isPreviewLesson); + gateForm.set("activityId",gate.getActivityId()); if(gate.isSynchGate()) return viewSynchGate(mapping,gateForm,(SynchGateActivity)gate); else if(gate.isScheduleGate()) Index: lams_learning/src/java/org/lamsfoundation/lams/learning/web/action/GroupingAction.java =================================================================== diff -u -ra0722fe03d763f9da5efc82987034d929e6a23a1 -re5049e0948ac38f849ed086dfa9b8b7dfd8d76ae --- lams_learning/src/java/org/lamsfoundation/lams/learning/web/action/GroupingAction.java (.../GroupingAction.java) (revision a0722fe03d763f9da5efc82987034d929e6a23a1) +++ lams_learning/src/java/org/lamsfoundation/lams/learning/web/action/GroupingAction.java (.../GroupingAction.java) (revision e5049e0948ac38f849ed086dfa9b8b7dfd8d76ae) @@ -124,21 +124,19 @@ HttpServletResponse response) throws IOException, ServletException { - LearnerProgress learnerProgress = LearningWebUtil.getLearnerProgressByID(request, - getServlet().getServletContext()); - validateLearnerProgress(learnerProgress); boolean forceGroup = WebUtil.readBooleanParam(request,PARAM_FORCE_GROUPING,false); //initialize service object ILearnerService learnerService = LearnerServiceProxy.getLearnerService(getServlet().getServletContext()); + LearnerProgress learnerProgress = LearningWebUtil.getLearnerProgress(request, learnerService); + validateLearnerProgress(learnerProgress); boolean groupingDone = learnerService.performGrouping(learnerProgress.getLesson().getLessonId(), learnerProgress.getNextActivity().getActivityId(), LearningWebUtil.getUserId(),forceGroup); LearningWebUtil.putActivityInRequest(request, learnerProgress.getNextActivity(), learnerService); - LearningWebUtil.setLessonId(learnerProgress.getLesson().getLessonId()); DynaActionForm groupForm = (DynaActionForm)form; groupForm.set("previewLesson",learnerProgress.getLesson().isPreviewLesson()); @@ -196,19 +194,14 @@ HttpServletResponse response) throws IOException, ServletException { - LearnerProgress learnerProgress = LearningWebUtil.getLearnerProgressByUser(request, - getServlet().getServletContext()); //initialize service object ILearnerService learnerService = LearnerServiceProxy.getLearnerService(getServlet().getServletContext()); + LearnerProgress learnerProgress = LearningWebUtil.getLearnerProgress(request,learnerService); Activity groupingActivity = LearningWebUtil.getActivityFromRequest(request,learnerService); - String nextActivityUrl = learnerService.completeActivity(learnerProgress.getUser().getUserId(), - groupingActivity, - learnerProgress.getLesson().getLessonId()); - + groupingActivity); response.sendRedirect(nextActivityUrl); - return null; } //--------------------------------------------------------------------- Index: lams_learning/src/java/org/lamsfoundation/lams/learning/web/action/LearnerAction.java =================================================================== diff -u -r6f11dd80335ff2b8a2d06d21f1a49b307ed233c1 -re5049e0948ac38f849ed086dfa9b8b7dfd8d76ae --- lams_learning/src/java/org/lamsfoundation/lams/learning/web/action/LearnerAction.java (.../LearnerAction.java) (revision 6f11dd80335ff2b8a2d06d21f1a49b307ed233c1) +++ lams_learning/src/java/org/lamsfoundation/lams/learning/web/action/LearnerAction.java (.../LearnerAction.java) (revision e5049e0948ac38f849ed086dfa9b8b7dfd8d76ae) @@ -159,7 +159,7 @@ log.debug("The learner ["+learner+"] joined lesson. The" +"porgress data is:"+learnerProgress.toString()); - LearningWebUtil.setLearnerProgress(learnerProgress); + LearningWebUtil.putLearnerProgressInRequest(request,learnerProgress); //serialize a acknowledgement flash message with the path of display next //activity @@ -209,7 +209,7 @@ FlashMessage message = null; try { - LearnerProgress learnerProgress = LearningWebUtil.getLearnerProgressByUser(request,getServlet().getServletContext()); + LearnerProgress learnerProgress = LearningWebUtil.getLearnerProgress(request,learnerService); if(log.isDebugEnabled()) log.debug("Exiting lesson, lesson id is: "+learnerProgress.getLesson().getLessonId()); @@ -313,11 +313,7 @@ Integer learnerId = LearningWebUtil.getUserId(); ILearnerService learnerService = LearnerServiceProxy.getLearnerService(getServlet().getServletContext()); - Long lessonId = WebUtil.readLongParam(request,AttributeNames.PARAM_LESSON_ID,true); - if ( lessonId == null ) { - // temporary code until Flash gets updated to send the lessonID parameter - lessonId = WebUtil.readLongParam(request,LearningWebUtil.PARAM_PROGRESS_ID); - } + Long lessonId = WebUtil.readLongParam(request,AttributeNames.PARAM_LESSON_ID ); LearnerProgressDTO learnerProgress = learnerService.getProgressDTOByLessonId(lessonId, learnerId); message = new FlashMessage("getFlashProgressData",learnerProgress); @@ -380,7 +376,7 @@ Activity requestedActivity = learnerService.getActivity(new Long(activityId)); //preparing tranfer object for flash - LearnerProgress learnerProgress = LearningWebUtil.getLearnerProgressByUser(request,getServlet().getServletContext()); + LearnerProgress learnerProgress = LearningWebUtil.getLearnerProgress(request,learnerService); ProgressActivityDTO activityDTO = new ProgressActivityDTO(new Long(activityId), activityMapping.calculateActivityURLForProgressView(learnerProgress.getLesson(),learner,requestedActivity)); //send data back to flash. Index: lams_learning/src/java/org/lamsfoundation/lams/learning/web/action/LoadToolActivityAction.java =================================================================== diff -u -r1290c6550e900eba41bd51803e59f2a7af0b521b -re5049e0948ac38f849ed086dfa9b8b7dfd8d76ae --- lams_learning/src/java/org/lamsfoundation/lams/learning/web/action/LoadToolActivityAction.java (.../LoadToolActivityAction.java) (revision 1290c6550e900eba41bd51803e59f2a7af0b521b) +++ lams_learning/src/java/org/lamsfoundation/lams/learning/web/action/LoadToolActivityAction.java (.../LoadToolActivityAction.java) (revision e5049e0948ac38f849ed086dfa9b8b7dfd8d76ae) @@ -31,6 +31,7 @@ import org.apache.struts.action.ActionForm; import org.apache.struts.action.ActionForward; import org.apache.struts.action.ActionMapping; +import org.lamsfoundation.lams.learning.service.ILearnerService; import org.lamsfoundation.lams.learning.service.LearnerServiceProxy; import org.lamsfoundation.lams.learning.web.bean.ActivityURL; import org.lamsfoundation.lams.learning.web.form.ActivityForm; @@ -73,8 +74,9 @@ ActivityForm form = (ActivityForm)actionForm; ActivityMapping actionMappings = LearnerServiceProxy.getActivityMapping(this.getServlet().getServletContext()); - LearnerProgress learnerProgress = getLearnerProgress(request); - Activity activity = LearningWebUtil.getActivityFromRequest(request, getLearnerService()); + ILearnerService learnerService = getLearnerService(); + LearnerProgress learnerProgress = LearningWebUtil.getLearnerProgress(request,learnerService); + Activity activity = LearningWebUtil.getActivityFromRequest(request, learnerService); form.setActivityId(activity.getActivityId()); Index: lams_learning/src/java/org/lamsfoundation/lams/learning/web/util/ActivityMapping.java =================================================================== diff -u -r5aff7aa069793bc34e60b304e69e9e9fceb996f5 -re5049e0948ac38f849ed086dfa9b8b7dfd8d76ae --- lams_learning/src/java/org/lamsfoundation/lams/learning/web/util/ActivityMapping.java (.../ActivityMapping.java) (revision 5aff7aa069793bc34e60b304e69e9e9fceb996f5) +++ lams_learning/src/java/org/lamsfoundation/lams/learning/web/util/ActivityMapping.java (.../ActivityMapping.java) (revision e5049e0948ac38f849ed086dfa9b8b7dfd8d76ae) @@ -27,8 +27,6 @@ import java.io.Serializable; import java.io.UnsupportedEncodingException; import java.net.URLEncoder; -import java.util.Iterator; -import java.util.Set; import javax.servlet.http.HttpServletRequest; @@ -121,9 +119,13 @@ if (progress.isLessonComplete()) { // If lesson complete forward to lesson complete action. This action will - // cause a client request to clear ALL frames. + // cause a client request to clear ALL frames. Need to append the progress + // id as getting to the end from an activity can't have the progress in the request + // and there isn't an activity from which we can determine the lesson and hence + // the progress. String strutsAction = this.getActivityMappingStrategy() .getLessonCompleteAction(); + strutsAction = WebUtil.appendParameterToURL(strutsAction, LearningWebUtil.PARAM_PROGRESS_ID, progress.getLearnerProgressId().toString()); actionForward = this.strutsActionToForward(strutsAction, null, redirect); @@ -198,9 +200,13 @@ if (progress.isLessonComplete()) { // If lesson complete forward to lesson complete action. This action will - // cause a client request to clear ALL frames. + // cause a client request to clear ALL frames. Need to append the progress + // id as getting to the end from an activity can't have the progress in the request + // and there isn't an activity from which we can determine the lesson and hence + // the progress. String strutsAction = this.getActivityMappingStrategy() .getLessonCompleteAction(); + strutsAction = WebUtil.appendParameterToURL(strutsAction, LearningWebUtil.PARAM_PROGRESS_ID, progress.getLearnerProgressId().toString()); return activityURL = strutsActionToURL(strutsAction, null, true); } else Index: lams_learning/src/java/org/lamsfoundation/lams/learning/web/util/LearningWebUtil.java =================================================================== diff -u -rdf5800a31c32417e062928bfca21c1b2c2ed1472 -re5049e0948ac38f849ed086dfa9b8b7dfd8d76ae --- lams_learning/src/java/org/lamsfoundation/lams/learning/web/util/LearningWebUtil.java (.../LearningWebUtil.java) (revision df5800a31c32417e062928bfca21c1b2c2ed1472) +++ lams_learning/src/java/org/lamsfoundation/lams/learning/web/util/LearningWebUtil.java (.../LearningWebUtil.java) (revision e5049e0948ac38f849ed086dfa9b8b7dfd8d76ae) @@ -24,15 +24,16 @@ /* $$Id$$ */ package org.lamsfoundation.lams.learning.web.util; -import javax.servlet.ServletContext; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpSession; +import org.apache.log4j.Logger; import org.lamsfoundation.lams.learning.service.ILearnerService; -import org.lamsfoundation.lams.learning.service.LearnerServiceProxy; import org.lamsfoundation.lams.learning.web.action.ActivityAction; import org.lamsfoundation.lams.learningdesign.Activity; import org.lamsfoundation.lams.lesson.LearnerProgress; +import org.lamsfoundation.lams.lesson.Lesson; +import org.lamsfoundation.lams.usermanagement.User; import org.lamsfoundation.lams.usermanagement.dto.UserDTO; import org.lamsfoundation.lams.util.WebUtil; import org.lamsfoundation.lams.web.session.SessionManager; @@ -49,20 +50,16 @@ public class LearningWebUtil { -// private static Logger log = Logger.getLogger(LearningWebUtil.class); + private static Logger log = Logger.getLogger(LearningWebUtil.class); //--------------------------------------------------------------------- // Class level constants - session attributes //--------------------------------------------------------------------- public static final String PARAM_PROGRESS_ID = "progressID"; /** * Helper method to retrieve the user data. Gets the id from the user details - * in the session then retrieves the real user object. - * - * @param request A standard Servlet HttpServletRequest class. - * @param servletContext the servlet container that has all resources - * @param surveyService the service facade of survey tool - * @return the user data value object + * in the shared session + * @return the user id */ public static Integer getUserId() { @@ -72,101 +69,77 @@ } /** - * Helper method to get lesson id. - * - * @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. + * Helper method to retrieve the user data. Gets the id from the user details + * in the shared session then retrieves the real user object. */ - public static Long getLessonId(HttpServletRequest request) + public static User getUser(ILearnerService learnerService) { HttpSession ss = SessionManager.getSession(); - Long lessonId = (Long)ss.getAttribute(AttributeNames.PARAM_LESSON_ID); - - if(lessonId ==null) - { - // not in the session - is it in the request? - lessonId = WebUtil.readLongParam(request,AttributeNames.PARAM_LESSON_ID,true); - } - return lessonId; + UserDTO learner = (UserDTO) ss.getAttribute(AttributeNames.USER); + return learner != null ? learnerService.getUserManagementService().getUserById(learner.getUserID()) : null; } - - /** - * Put the lesson id in the user's special session object, so that - * it can be retrieved by getLessonId() - * - * @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 setLessonId(Long lessonId) - { - HttpSession ss = SessionManager.getSession(); - if ( lessonId != null ) { - ss.setAttribute(AttributeNames.PARAM_LESSON_ID, lessonId); - } else { - ss.removeAttribute(AttributeNames.PARAM_LESSON_ID); - } - } - /** - * Put the learner progress in the user's special session object. + * Put the learner progress in the request. This allows some optimisation between the + * code that updates the progress and the next action which will access the progress. */ - public static void setLearnerProgress(LearnerProgress progress) { - HttpSession ss = SessionManager.getSession(); + public static void putLearnerProgressInRequest(HttpServletRequest request, LearnerProgress progress) { if ( progress != null ) { - ss.setAttribute(ActivityAction.LEARNER_PROGRESS_REQUEST_ATTRIBUTE, progress); + request.setAttribute(ActivityAction.LEARNER_PROGRESS_REQUEST_ATTRIBUTE, progress); } else { - ss.removeAttribute(ActivityAction.LEARNER_PROGRESS_REQUEST_ATTRIBUTE); + request.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. + * Get the current learner progress. Check the request - in some cases it may be there. + * + * If not, the learner progress id might be in the request (if we've just come from complete activity). + * If so, get it from the db using the learner progress. + * + * If the learner progress id isn't available, then we have to look it up using activity + * based on the activity / activity id in the request. */ - public static LearnerProgress getLearnerProgressByID(HttpServletRequest request,ServletContext servletContext) { - HttpSession ss = SessionManager.getSession(); - LearnerProgress learnerProgress = (LearnerProgress)ss.getAttribute(ActivityAction.LEARNER_PROGRESS_REQUEST_ATTRIBUTE); + public static LearnerProgress getLearnerProgress(HttpServletRequest request, ILearnerService learnerService) { + LearnerProgress learnerProgress = (LearnerProgress)request.getAttribute(ActivityAction.LEARNER_PROGRESS_REQUEST_ATTRIBUTE); + if ( learnerProgress != null ) { + if ( log.isDebugEnabled() ) { + log.debug("getLearnerProgress: found progress in the request"); + } + return learnerProgress; + } 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)); - setLearnerProgress(learnerProgress); + Long learnerProgressId = WebUtil.readLongParam(request,LearningWebUtil.PARAM_PROGRESS_ID, true); + // temp hack until Flash side updates it call. + if ( learnerProgressId == null ) { + learnerProgressId = WebUtil.readLongParam(request,"progressId", true); + } + + if ( learnerProgressId != null ) { + learnerProgress = learnerService.getProgressById(new Long(learnerProgressId)); + if ( learnerProgress != null && log.isDebugEnabled() ) { + log.debug("getLearnerProgress: found progress via progress id"); + } + } } - return learnerProgress; - } - /** - * Get the current learner progress. The http session attributes are checked - * first, if not in request then a new LearnerProgress is loaded by user - * and lesson 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 getLearnerProgressByUser(HttpServletRequest request,ServletContext servletContext) { - 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); - Integer currentLearner = getUserId(); - Long lessonId = getLessonId(request); - learnerProgress = learnerService.getProgress(currentLearner,lessonId); - setLearnerProgress(learnerProgress); + Integer learnerId = getUserId(); + Activity act = getActivityFromRequest(request, learnerService); + Lesson lesson = learnerService.getLessonByActivity(act); + learnerProgress = learnerService.getProgress(learnerId, lesson.getLessonId()); + if ( learnerProgress != null && log.isDebugEnabled() ) { + log.debug("getLearnerProgress: found progress via learner id and activity"); + } } + + putLearnerProgressInRequest(request, learnerProgress); return learnerProgress; } - + /** * Get the activity from request. We assume there is a parameter coming in * if there is no activity can be found in the http request. Then the Index: lams_learning/test/java/org/lamsfoundation/lams/learning/service/TestLearnerService.java =================================================================== diff -u -ra0722fe03d763f9da5efc82987034d929e6a23a1 -re5049e0948ac38f849ed086dfa9b8b7dfd8d76ae --- lams_learning/test/java/org/lamsfoundation/lams/learning/service/TestLearnerService.java (.../TestLearnerService.java) (revision a0722fe03d763f9da5efc82987034d929e6a23a1) +++ lams_learning/test/java/org/lamsfoundation/lams/learning/service/TestLearnerService.java (.../TestLearnerService.java) (revision e5049e0948ac38f849ed086dfa9b8b7dfd8d76ae) @@ -199,17 +199,15 @@ //progress from survey to synch gate testRootPreviousActivity = testCompletedActivity; testProgress = learnerService.calculateProgress(testCompletedActivity, - testUser.getUserId(), - testLesson.getLessonId()); + testUser.getUserId()); assertLearnerProgress(testRootPreviousActivity,TEST_SYNCHGATE_ACTIVITY_UIID,TEST_SYNCHGATE_ACTIVITY_UIID,1,1,"sycn-gate","sycn-gate"); assertEquals("verify temp completed activities",1,testProgress.getCurrentCompletedActivitiesList().size()); //progress from synch gate to notebook testCompletedActivity = testProgress.getNextActivity(); testRootPreviousActivity = testCompletedActivity; testProgress = learnerService.calculateProgress(testCompletedActivity, - testUser.getUserId(), - testLesson.getLessonId()); + testUser.getUserId()); assertLearnerProgress(testRootPreviousActivity,TEST_NOTEBOOK_ACTIVITY_UIID,TEST_NOTEBOOK_ACTIVITY_UIID,2,1,"random grouping","random grouping"); assertEquals("verify temp completed activities",1,testProgress.getCurrentCompletedActivitiesList().size()); @@ -218,17 +216,15 @@ testCompletedActivity = testProgress.getNextActivity(); testRootPreviousActivity = testCompletedActivity; testProgress = learnerService.calculateProgress(testCompletedActivity, - testUser.getUserId(), - testLesson.getLessonId()); + testUser.getUserId()); assertLearnerProgress(testRootPreviousActivity,TEST_RGRP_ACTIVITY_UIID,TEST_RGRP_ACTIVITY_UIID,3,1,"random grouping","random grouping"); assertEquals("verify temp completed activities",1,testProgress.getCurrentCompletedActivitiesList().size()); //progress from random grouping activity to schedule gate testCompletedActivity = testProgress.getNextActivity(); testRootPreviousActivity = testCompletedActivity; testProgress = learnerService.calculateProgress(testCompletedActivity, - testUser.getUserId(), - testLesson.getLessonId()); + testUser.getUserId()); assertLearnerProgress(testRootPreviousActivity,TEST_SCHEDULE_GATE_ACTIVITY_UIID,TEST_SCHEDULE_GATE_ACTIVITY_UIID,4,1,"schedule gate","schedule gate"); assertEquals("verify temp completed activities",1,testProgress.getCurrentCompletedActivitiesList().size()); @@ -237,17 +233,15 @@ testCompletedActivity = testProgress.getNextActivity(); testRootPreviousActivity = testCompletedActivity; testProgress = learnerService.calculateProgress(testCompletedActivity, - testUser.getUserId(), - testLesson.getLessonId()); + testUser.getUserId()); assertLearnerProgress(testRootPreviousActivity,TEST_CHAT_ACTIVITY_UIID,TEST_CHAT_ACTIVITY_UIID,5,1,"chat","chat"); assertEquals("verify temp completed activities",1,testProgress.getCurrentCompletedActivitiesList().size()); //progress from chat activity to QNA testCompletedActivity = testProgress.getNextActivity(); testRootPreviousActivity = testCompletedActivity; testProgress = learnerService.calculateProgress(testCompletedActivity, - testUser.getUserId(), - testLesson.getLessonId()); + testUser.getUserId()); assertLearnerProgress(testRootPreviousActivity,TEST_QNA_ACTIVITY_UIID,TEST_QNA_ACTIVITY_UIID,6,1,"QNA","QNA"); assertEquals("verify temp completed activities",1,testProgress.getCurrentCompletedActivitiesList().size()); @@ -256,26 +250,23 @@ testCompletedActivity = testProgress.getNextActivity(); testRootPreviousActivity = testCompletedActivity; testProgress = learnerService.calculateProgress(testCompletedActivity, - testUser.getUserId(), - testLesson.getLessonId()); + testUser.getUserId()); assertLearnerProgress(testRootPreviousActivity,TEST_PERMISSION_GATE_ACTIVITY_UIID,TEST_PERMISSION_GATE_ACTIVITY_UIID,7,1,"permission gate","permission gate"); assertEquals("verify temp completed activities",1,testProgress.getCurrentCompletedActivitiesList().size()); //progress from permission gate to options activity testCompletedActivity = testProgress.getNextActivity(); testRootPreviousActivity = testCompletedActivity; testProgress = learnerService.calculateProgress(testCompletedActivity, - testUser.getUserId(), - testLesson.getLessonId()); + testUser.getUserId()); assertLearnerProgress(testRootPreviousActivity,TEST_OPTIONS_ACTIVITY_UIID,TEST_OPTIONS_ACTIVITY_UIID,8,1,"OPTIONS","OPTIONS"); assertEquals("verify temp completed activities",1,testProgress.getCurrentCompletedActivitiesList().size()); //progress from sub option(notice board) to parallel activity testCompletedActivity = ((OptionsActivity)testProgress.getCurrentActivity()).getChildActivityById(TEST_CNB_ACTIVITY_ID); testRootPreviousActivity = testCompletedActivity.getParentActivity(); testProgress = learnerService.calculateProgress(testCompletedActivity, - testUser.getUserId(), - testLesson.getLessonId()); + testUser.getUserId()); assertLearnerProgress(testRootPreviousActivity,TEST_PARALLEL_ACTIVITY_UIID,TEST_PARALLEL_ACTIVITY_UIID,10,1,"PARALLEL","PARALLEL"); assertEquals("verify temp completed activities",2,testProgress.getCurrentCompletedActivitiesList().size()); @@ -284,8 +275,7 @@ //the previous activity should not be changed. testRootPreviousActivity = testProgress.getPreviousActivity(); testProgress = learnerService.calculateProgress(testCompletedActivity, - testUser.getUserId(), - testLesson.getLessonId()); + testUser.getUserId()); assertLearnerProgress(testRootPreviousActivity,TEST_PARALLEL_ACTIVITY_UIID,TEST_WAITING_ACTIVITY_UIID,11,1,"PARALLEL","WAITING"); assertTrue("verify waiting flag-should be waiting.",testProgress.isParallelWaiting()); assertTrue("verify next activity",testProgress.getNextActivity()==null); @@ -295,8 +285,7 @@ testCompletedActivity = ((ParallelActivity)testProgress.getCurrentActivity()).getChildActivityById(TEST_MB_ACTIVITY_ID); testRootPreviousActivity = testCompletedActivity.getParentActivity(); testProgress = learnerService.calculateProgress(testCompletedActivity, - testUser.getUserId(), - testLesson.getLessonId()); + testUser.getUserId()); assertLearnerProgress(testRootPreviousActivity,TEST_SEQUENCE_ACTIVITY_UIID,TEST_SR_ACTIVITY_UIID,13,1,"SEQUENCE","SHARE RESOURCE"); assertTrue("verify waiting flag-should not be waiting",!testProgress.isParallelWaiting()); assertEquals("verify temp completed activities",2,testProgress.getCurrentCompletedActivitiesList().size()); @@ -305,16 +294,14 @@ testCompletedActivity = testProgress.getNextActivity(); testRootPreviousActivity = testProgress.getPreviousActivity(); testProgress = learnerService.calculateProgress(testCompletedActivity, - testUser.getUserId(), - testLesson.getLessonId()); + testUser.getUserId()); assertLearnerProgress(testRootPreviousActivity,TEST_SEQUENCE_ACTIVITY_UIID,TEST_SQNA_ACTIVITY_UIID,14,2,"SEQUENCE","QNA"); assertEquals("verify temp completed activities",1,testProgress.getCurrentCompletedActivitiesList().size()); //progress sub sequence(QNA) to complete lesson testCompletedActivity = testProgress.getNextActivity(); testProgress = learnerService.calculateProgress(testCompletedActivity, - testUser.getUserId(), - testLesson.getLessonId()); + testUser.getUserId()); assertTrue("verify lesson complete",testProgress.isLessonComplete()); assertEquals("verify temp completed activities",1,testProgress.getCurrentCompletedActivitiesList().size()); } @@ -347,7 +334,7 @@ //get sync gate GateActivity synchGate = (GateActivity)learnerService.getActivity(new Long(TEST_SYNCHGATE_ACTIVITY_ID)); - boolean gateOpen = learnerService.knockGate(Test_Lesson_ID, synchGate.getActivityId(),testUser,false); + boolean gateOpen = learnerService.knockGate(synchGate.getActivityId(),testUser,false); assertTrue("gate is closed",!gateOpen); synchGate = (GateActivity)learnerService.getActivity(new Long(TEST_SYNCHGATE_ACTIVITY_ID)); @@ -362,7 +349,7 @@ //get sync gate GateActivity synchGate = (GateActivity)learnerService.getActivity(new Long(TEST_SYNCHGATE_ACTIVITY_ID)); - boolean gateOpen = learnerService.knockGate(Test_Lesson_ID, synchGate.getActivityId(),testUser2,false); + boolean gateOpen = learnerService.knockGate(synchGate.getActivityId(),testUser2,false); assertTrue("gate is closed",gateOpen); synchGate = (GateActivity)learnerService.getActivity(new Long(TEST_SYNCHGATE_ACTIVITY_ID)); Index: lams_learning/test/java/org/lamsfoundation/lams/learning/web/action/TestGateAction.java =================================================================== diff -u -rf59da4f03c7449d42d559af803ac5a2093a89803 -re5049e0948ac38f849ed086dfa9b8b7dfd8d76ae --- lams_learning/test/java/org/lamsfoundation/lams/learning/web/action/TestGateAction.java (.../TestGateAction.java) (revision f59da4f03c7449d42d559af803ac5a2093a89803) +++ lams_learning/test/java/org/lamsfoundation/lams/learning/web/action/TestGateAction.java (.../TestGateAction.java) (revision e5049e0948ac38f849ed086dfa9b8b7dfd8d76ae) @@ -88,7 +88,6 @@ addRequestParameter(AttributeNames.PARAM_ACTIVITY_ID,TEST_GATE_ACTIVITY_ID); addRequestParameter(AttributeNames.PARAM_LESSON_ID, TEST_LESSON_ID); - initializeLearnerProgress(); actionPerform(); verifyNoActionErrors(); @@ -102,21 +101,9 @@ addRequestParameter(AttributeNames.PARAM_ACTIVITY_ID,TEST_GATE_ACTIVITY_ID); addRequestParameter(AttributeNames.PARAM_LESSON_ID, TEST_LESSON_ID); - initializeLearnerProgress(); actionPerform(); verifyNoActionErrors(); } - /** - * - */ - private void initializeLearnerProgress() - { - Activity activity = LearningWebUtil.getActivityFromRequest(request,learnerService); - LearnerProgress learnerProgress = LearningWebUtil.getLearnerProgressByID(request,context); - learnerProgress.setNextActivity(activity); - httpSession.setAttribute(ActivityAction.LEARNER_PROGRESS_REQUEST_ATTRIBUTE, - learnerProgress); - } } Index: lams_learning/test/java/org/lamsfoundation/lams/learning/web/action/TestGroupingAction.java =================================================================== diff -u -rf59da4f03c7449d42d559af803ac5a2093a89803 -re5049e0948ac38f849ed086dfa9b8b7dfd8d76ae --- lams_learning/test/java/org/lamsfoundation/lams/learning/web/action/TestGroupingAction.java (.../TestGroupingAction.java) (revision f59da4f03c7449d42d559af803ac5a2093a89803) +++ lams_learning/test/java/org/lamsfoundation/lams/learning/web/action/TestGroupingAction.java (.../TestGroupingAction.java) (revision e5049e0948ac38f849ed086dfa9b8b7dfd8d76ae) @@ -86,7 +86,6 @@ addRequestParameter(AttributeNames.PARAM_ACTIVITY_ID,TEST_RGRP_ACTIVITY_ID); addRequestParameter(AttributeNames.PARAM_LESSON_ID, TEST_LESSON_ID); - initializeLearnerProgress(); actionPerform(); verifyNoActionErrors(); @@ -125,16 +124,4 @@ verifyNoActionErrors(); } - /** - * - */ - private void initializeLearnerProgress() - { - Activity activity = LearningWebUtil.getActivityFromRequest(request,learnerService); - LearnerProgress learnerProgress = LearningWebUtil.getLearnerProgressByID(request,context); - learnerProgress.setNextActivity(activity); - httpSession.setAttribute(ActivityAction.LEARNER_PROGRESS_REQUEST_ATTRIBUTE, - learnerProgress); - } - } Index: lams_learning/test/java/org/lamsfoundation/lams/learning/web/action/TestLearnerAction.java =================================================================== diff -u -rf59da4f03c7449d42d559af803ac5a2093a89803 -re5049e0948ac38f849ed086dfa9b8b7dfd8d76ae --- lams_learning/test/java/org/lamsfoundation/lams/learning/web/action/TestLearnerAction.java (.../TestLearnerAction.java) (revision f59da4f03c7449d42d559af803ac5a2093a89803) +++ lams_learning/test/java/org/lamsfoundation/lams/learning/web/action/TestLearnerAction.java (.../TestLearnerAction.java) (revision e5049e0948ac38f849ed086dfa9b8b7dfd8d76ae) @@ -122,9 +122,6 @@ addRequestParameter(AttributeNames.PARAM_LESSON_ID, TEST_LESSON_ID); actionPerform(); - - verifyForward("welcome"); - verifyTilesForward("welcome",".welcome"); verifyNoActionErrors(); } Index: lams_learning/web/gate/gateNext.jsp =================================================================== diff -u -ra0722fe03d763f9da5efc82987034d929e6a23a1 -re5049e0948ac38f849ed086dfa9b8b7dfd8d76ae --- lams_learning/web/gate/gateNext.jsp (.../gateNext.jsp) (revision a0722fe03d763f9da5efc82987034d929e6a23a1) +++ lams_learning/web/gate/gateNext.jsp (.../gateNext.jsp) (revision e5049e0948ac38f849ed086dfa9b8b7dfd8d76ae) @@ -1,4 +1,4 @@ - + Index: lams_learning/web/grouping/wait.jsp =================================================================== diff -u -ra0722fe03d763f9da5efc82987034d929e6a23a1 -re5049e0948ac38f849ed086dfa9b8b7dfd8d76ae --- lams_learning/web/grouping/wait.jsp (.../wait.jsp) (revision a0722fe03d763f9da5efc82987034d929e6a23a1) +++ lams_learning/web/grouping/wait.jsp (.../wait.jsp) (revision e5049e0948ac38f849ed086dfa9b8b7dfd8d76ae) @@ -28,7 +28,7 @@
- +/grouping.do?method=performGrouping&activityID=${activity.activityId}

@@ -37,12 +37,12 @@ - &force=true - - - - - + &force=true + + + + + Index: lams_learning/web/layout/gateLayout.jsp =================================================================== diff -u -r57e83f8443e586e862dae836429599459eade2c0 -re5049e0948ac38f849ed086dfa9b8b7dfd8d76ae --- lams_learning/web/layout/gateLayout.jsp (.../gateLayout.jsp) (revision 57e83f8443e586e862dae836429599459eade2c0) +++ lams_learning/web/layout/gateLayout.jsp (.../gateLayout.jsp) (revision e5049e0948ac38f849ed086dfa9b8b7dfd8d76ae) @@ -27,7 +27,7 @@ <%@ taglib uri="tags-lams" prefix="lams" %> <%@ taglib uri="tags-fmt" prefix="fmt" %> - + @@ -37,7 +37,7 @@ <c:out value="${pageTitle}" /> - +