Index: lams_learning/src/java/org/lamsfoundation/lams/learning/progress/ProgressEngine.java =================================================================== diff -u -r51fb2a37254f24bb2a805d4ffd54482c779f43fa -r81bec2c4c018269cb6a8d65212aae7e37b406fb3 --- lams_learning/src/java/org/lamsfoundation/lams/learning/progress/ProgressEngine.java (.../ProgressEngine.java) (revision 51fb2a37254f24bb2a805d4ffd54482c779f43fa) +++ lams_learning/src/java/org/lamsfoundation/lams/learning/progress/ProgressEngine.java (.../ProgressEngine.java) (revision 81bec2c4c018269cb6a8d65212aae7e37b406fb3) @@ -21,7 +21,6 @@ * **************************************************************** */ - package org.lamsfoundation.lams.learning.progress; import java.util.Date; @@ -76,20 +75,20 @@ * @throws ProgressException * if progress cannot be calculated successfully. */ - public LearnerProgress calculateProgress(User learner, Activity completedActivity, LearnerProgress learnerProgress) + public void calculateProgress(User learner, Activity completedActivity, LearnerProgress learnerProgress) throws ProgressException { if (learnerProgress.getParallelWaiting() == LearnerProgress.PARALLEL_WAITING_COMPLETE) { learnerProgress.setParallelWaiting(LearnerProgress.PARALLEL_NO_WAIT); } - return doCalculateProgress(learner, completedActivity, learnerProgress, new LinkedList()); + doCalculateProgress(learner, completedActivity, learnerProgress, new LinkedList()); } /** * Internal method used for recursion. Does the actual "work" of * calculateProgress. */ - private LearnerProgress doCalculateProgress(User learner, Activity completedActivity, - LearnerProgress learnerProgress, List completedActivityList) throws ProgressException { + private void doCalculateProgress(User learner, Activity completedActivity, LearnerProgress learnerProgress, + List completedActivityList) throws ProgressException { learnerProgress.setProgressState(completedActivity, LearnerProgress.ACTIVITY_COMPLETED, activityDAO); completedActivityList.add(completedActivity.getActivityId()); @@ -103,17 +102,16 @@ } populateCurrentCompletedActivityList(learnerProgress, completedActivityList); learnerProgress.setFinishDate(new Date()); - return setLessonComplete(learnerProgress, LearnerProgress.LESSON_IN_DESIGN_COMPLETE); + setLessonComplete(learnerProgress, LearnerProgress.LESSON_IN_DESIGN_COMPLETE); } else if (completedActivity.isFloating() && !completedActivity.getParentActivity().isParallelActivity()) { // special case - floating activity and not parallel activity (floating) child. - return learnerProgress; } else { Transition transition = completedActivity.getTransitionFrom(); if (transition != null) { - return progressCompletedActivity(learner, completedActivity, learnerProgress, transition, + progressCompletedActivity(learner, completedActivity, learnerProgress, transition, completedActivityList); } else { - return progressParentActivity(learner, completedActivity, learnerProgress, completedActivityList); + progressParentActivity(learner, completedActivity, learnerProgress, completedActivityList); } } } @@ -134,31 +132,30 @@ * @throws ProgressException * if the start point cannot be calculated successfully. */ - public LearnerProgress setUpStartPoint(LearnerProgress progress) throws ProgressException { + public void setUpStartPoint(LearnerProgress progress) throws ProgressException { LearningDesign ld = progress.getLesson().getLearningDesign(); if (progress.getLesson().getLockedForEdit()) { // special case - currently setting up the stop gates for live edit. - return clearProgressNowhereToGoNotCompleted(progress, "setUpStartPoint"); + clearProgressNowhereToGoNotCompleted(progress, "setUpStartPoint"); } else if (progress.isComplete()) { - return progress; + return; } else if (ld.getFirstActivity() == null) { throw new ProgressException("Could not find first activity for " + "learning design [" + ld.getTitle() + "], id[" + ld.getLearningDesignId().longValue() + "]"); } else if (progress.getCompletedActivities().containsKey(ld.getFirstActivity())) { // special case - recalculating the appropriate current activity. - return doCalculateProgress(progress.getUser(), ld.getFirstActivity(), progress, new LinkedList()); + doCalculateProgress(progress.getUser(), ld.getFirstActivity(), progress, new LinkedList()); } else if (canDoActivity(progress.getLesson(), ld.getFirstActivity())) { // normal case progress.setCurrentActivity(ld.getFirstActivity()); progress.setNextActivity(ld.getFirstActivity()); setActivityAttempted(progress, ld.getFirstActivity()); - return progress; } else { // special case - trying to get to a whole new activity (past the stop gate) // during a live edit - return clearProgressNowhereToGoNotCompleted(progress, "setUpStartPoint"); + clearProgressNowhereToGoNotCompleted(progress, "setUpStartPoint"); } } @@ -193,7 +190,7 @@ * Writes a warning to the log if callingMethod is not null. If it is null, * we assume the calling code has written out a warning/error already. */ - private LearnerProgress clearProgressNowhereToGoNotCompleted(LearnerProgress progress, String callingMethod) { + private void clearProgressNowhereToGoNotCompleted(LearnerProgress progress, String callingMethod) { if (callingMethod != null) { log.warn("Learner " + progress.getUser().getFullName() + "(" + progress.getUser().getUserId() + ") has a problem with the progress for lesson " + progress.getLesson().getLessonName() + "(" @@ -205,7 +202,6 @@ progress.setCurrentActivity(null); progress.setNextActivity(null); progress.setLessonComplete(LearnerProgress.LESSON_NOT_COMPLETE); - return progress; } /** @@ -254,9 +250,8 @@ * @return the learner progress data we calculated. * @throws ProgressException */ - private LearnerProgress progressCompletedActivity(User learner, Activity completedActivity, - LearnerProgress learnerProgress, Transition transition, List completedActivityList) - throws ProgressException { + private void progressCompletedActivity(User learner, Activity completedActivity, LearnerProgress learnerProgress, + Transition transition, List completedActivityList) throws ProgressException { Activity nextActivity = transition.getToActivity(); if (!learnerProgress.getCompletedActivities().containsKey(nextActivity)) { @@ -276,16 +271,13 @@ } } else { - return clearProgressNowhereToGoNotCompleted(learnerProgress, "progressCompletedActivity"); + clearProgressNowhereToGoNotCompleted(learnerProgress, "progressCompletedActivity"); } - return learnerProgress; - } else { // abnormal case: next activity already done. Must have jumped back to an earlier // optional activity, done another activity and then kept going - - return doCalculateProgress(learner, nextActivity, learnerProgress, completedActivityList); + doCalculateProgress(learner, nextActivity, learnerProgress, completedActivityList); } } @@ -336,7 +328,7 @@ "Error occurred in progress engine." + " Unexpected Null activity received when progressing" + " to the next activity within a incomplete parent activity:" + " Parent activity id [" + parent.getActivityId() + "]"); - learnerProgress = clearProgressNowhereToGoNotCompleted(learnerProgress, null); + clearProgressNowhereToGoNotCompleted(learnerProgress, null); } else if (isParallelWaitActivity(nextActivity)) { learnerProgress.setParallelWaiting(LearnerProgress.PARALLEL_WAITING); // learnerProgress.setNextActivity(null); @@ -346,7 +338,7 @@ setActivityAttempted(learnerProgress, nextActivity); populateCurrentCompletedActivityList(learnerProgress, completedActivityList); } else { - learnerProgress = clearProgressNowhereToGoNotCompleted(learnerProgress, "progressParentActivity"); + clearProgressNowhereToGoNotCompleted(learnerProgress, "progressParentActivity"); } } //recurvisely call back to calculateProgress to calculate completed Index: lams_learning/src/java/org/lamsfoundation/lams/learning/service/ICoreLearnerService.java =================================================================== diff -u -r72f92afa07d5c5d0e6051081a1d0e1890ce934d5 -r81bec2c4c018269cb6a8d65212aae7e37b406fb3 --- lams_learning/src/java/org/lamsfoundation/lams/learning/service/ICoreLearnerService.java (.../ICoreLearnerService.java) (revision 72f92afa07d5c5d0e6051081a1d0e1890ce934d5) +++ lams_learning/src/java/org/lamsfoundation/lams/learning/service/ICoreLearnerService.java (.../ICoreLearnerService.java) (revision 81bec2c4c018269cb6a8d65212aae7e37b406fb3) @@ -21,7 +21,6 @@ * **************************************************************** */ - package org.lamsfoundation.lams.learning.service; import java.util.List; @@ -93,7 +92,7 @@ * in case of problems. */ LearnerProgress getProgress(Integer learnerId, Long lessonId); - + /** * Get the last attempt ID for the given learner and lesson. */ @@ -111,8 +110,7 @@ * in case of problems. */ Object[] getStructuredActivityURLs(Integer learnerId, Long lessonId); - - + List getStructuredActivityURLs(Long lessonId); /** @@ -147,12 +145,10 @@ * identifies the activity just completed * @param learner * the Learner - * @return the bean containing the display data for the Learner * @throws LearnerServiceException * in case of problems. */ - LearnerProgress calculateProgress(Activity completedActivity, Integer learnerId, - LearnerProgress currentLearnerProgress); + void calculateProgress(Activity completedActivity, Integer learnerId, LearnerProgress learnerProgress); /** * Complete the activity in the progress engine and delegate to the progress engine to calculate the next activity @@ -165,9 +161,8 @@ * the activity is being run. * @param lessonId * lesson id - * @return the updated learner progress */ - LearnerProgress completeActivity(Integer learnerId, Activity activity, LearnerProgress progress); + void completeActivity(Integer learnerId, Activity activity, LearnerProgress progress); /** * If specified activity is set to produce ToolOutput, calculates and stores mark to gradebook. Index: lams_learning/src/java/org/lamsfoundation/lams/learning/service/LearnerService.java =================================================================== diff -u -r72f92afa07d5c5d0e6051081a1d0e1890ce934d5 -r81bec2c4c018269cb6a8d65212aae7e37b406fb3 --- lams_learning/src/java/org/lamsfoundation/lams/learning/service/LearnerService.java (.../LearnerService.java) (revision 72f92afa07d5c5d0e6051081a1d0e1890ce934d5) +++ lams_learning/src/java/org/lamsfoundation/lams/learning/service/LearnerService.java (.../LearnerService.java) (revision 81bec2c4c018269cb6a8d65212aae7e37b406fb3) @@ -86,7 +86,6 @@ import org.lamsfoundation.lams.tool.service.ILamsCoreToolService; import org.lamsfoundation.lams.usermanagement.User; import org.lamsfoundation.lams.usermanagement.service.IUserManagementService; -import org.springframework.dao.DataIntegrityViolationException; /** * This class is a facade over the Learning middle tier. @@ -351,8 +350,8 @@ public void createToolSessionsIfNecessary(Activity activity, LearnerProgress learnerProgress) { try { if ((activity != null) && activity.isToolActivity()) { - ToolActivity toolActivity = (ToolActivity) activity; - createToolSessionFor(toolActivity, learnerProgress.getUser(), learnerProgress.getLesson()); + lamsCoreToolService.createToolSession(learnerProgress.getUser(), (ToolActivity) activity, + learnerProgress.getLesson()); } } catch (RequiredGroupMissingException e) { LearnerService.log.warn("error occurred in 'createToolSessionFor':" + e.getMessage()); @@ -416,18 +415,17 @@ return retValue; } - - + @Override public List getStructuredActivityURLs(Long lessonId) { - Lesson lesson = getLesson(lessonId); - User learner = (User) lesson.getAllLearners().iterator().next(); - LearnerProgress learnerProgress = new LearnerProgress(learner, lesson); + Lesson lesson = getLesson(lessonId); + User learner = (User) lesson.getAllLearners().iterator().next(); + LearnerProgress learnerProgress = new LearnerProgress(learner, lesson); - ProgressBuilder builder = new ProgressBuilder(learnerProgress, activityDAO, activityMapping); - builder.parseLearningDesign(); - return builder.getActivityList(); - } + ProgressBuilder builder = new ProgressBuilder(learnerProgress, activityDAO, activityMapping); + builder.parseLearningDesign(); + return builder.getActivityList(); + } /** * @see org.lamsfoundation.lams.learning.service.ICoreLearnerService#chooseActivity(org.lamsfoundation.lams.usermanagement.User, @@ -542,13 +540,10 @@ * in case of problems. */ @Override - public LearnerProgress calculateProgress(Activity completedActivity, Integer learnerId, - LearnerProgress currentLearnerProgress) { + public void calculateProgress(Activity completedActivity, Integer learnerId, LearnerProgress learnerProgress) { try { - LearnerProgress learnerProgress = progressEngine.calculateProgress(currentLearnerProgress.getUser(), - completedActivity, currentLearnerProgress); + progressEngine.calculateProgress(learnerProgress.getUser(), completedActivity, learnerProgress); learnerProgressDAO.updateLearnerProgress(learnerProgress); - return learnerProgress; } catch (ProgressException e) { throw new LearnerServiceException(e.getMessage()); } @@ -609,12 +604,12 @@ * @return the updated learner progress */ @Override - public LearnerProgress completeActivity(Integer learnerId, Activity activity, LearnerProgress progress) { + public void completeActivity(Integer learnerId, Activity activity, LearnerProgress progress) { // load the progress again from DB - LearnerProgress nextLearnerProgress = learnerProgressDAO.getLearnerProgress(progress.getLearnerProgressId()); - if (nextLearnerProgress.getCompletedActivities().keySet().contains(activity)) { + progress = learnerProgressDAO.getLearnerProgress(progress.getLearnerProgressId()); + if (progress.getCompletedActivities().keySet().contains(activity)) { // progress was already updated by another thread, so prevent double processing - return nextLearnerProgress; + return; } // Need to synchronise the next bit of code so that if the tool calls @@ -628,7 +623,7 @@ // bottleneck synchronized (this) { if (activity == null) { try { - nextLearnerProgress = progressEngine.setUpStartPoint(progress); + progressEngine.setUpStartPoint(progress); } catch (ProgressException e) { LearnerService.log.error("error occurred in 'setUpStartPoint':" + e.getMessage(), e); throw new LearnerServiceException(e); @@ -637,16 +632,14 @@ } else { // load the activity again so it is attached to the current Hibernate session activity = getActivity(activity.getActivityId()); - nextLearnerProgress = calculateProgress(activity, learnerId, progress); + calculateProgress(activity, learnerId, progress); updateGradebookMark(activity, progress); } // } logEventService.logEvent(LogEvent.TYPE_LEARNER_ACTIVITY_FINISH, learnerId, activity.getLearningDesign().getLearningDesignId(), progress.getLesson().getLessonId(), activity.getActivityId()); - - return nextLearnerProgress; } /** @@ -657,7 +650,8 @@ @Override public LearnerProgress completeActivity(Integer learnerId, Activity activity, Long lessonId) { LearnerProgress currentProgress = getProgress(new Integer(learnerId.intValue()), lessonId); - return completeActivity(learnerId, activity, currentProgress); + completeActivity(learnerId, activity, currentProgress); + return currentProgress; } @Override @@ -912,37 +906,6 @@ // --------------------------------------------------------------------- /** - *

- * Create a lams tool session for learner against a tool activity. This will have concurrency issues interms of - * grouped tool session because it might be inserting some tool session that has already been inserted by other - * member in the group. If the unique_check is broken, we need to query the database to get the instance instead of - * inserting it. It should be done in the Spring rollback strategy. - *

- * - * Once lams tool session is inserted, we need to notify the tool to its own session. - * - * @param toolActivity - * @param learner - * @throws LamsToolServiceException - */ - private void createToolSessionFor(ToolActivity toolActivity, User learner, Lesson lesson) - throws RequiredGroupMissingException, ToolException { - // if the tool session already exists, createToolSession() will return null - ToolSession toolSession = null; - try { - toolSession = lamsCoreToolService.createToolSession(learner, toolActivity, lesson); - } catch (DataIntegrityViolationException e) { - LearnerService.log.warn( - "There was an attempt to create two tool sessions with the same name. Skipping further attempts as the session exists.", - e); - } - if (toolSession != null) { - toolActivity.getToolSessions().add(toolSession); - lamsCoreToolService.notifyToolsToCreateSession(toolSession, toolActivity); - } - } - - /** * Create an array of lesson dto based a list of lessons. * * @param lessons Index: lams_learning/src/java/org/lamsfoundation/lams/learning/web/util/LearningWebUtil.java =================================================================== diff -u -rd100f9edeabdfbba5c689674da620058c1a96178 -r81bec2c4c018269cb6a8d65212aae7e37b406fb3 --- lams_learning/src/java/org/lamsfoundation/lams/learning/web/util/LearningWebUtil.java (.../LearningWebUtil.java) (revision d100f9edeabdfbba5c689674da620058c1a96178) +++ lams_learning/src/java/org/lamsfoundation/lams/learning/web/util/LearningWebUtil.java (.../LearningWebUtil.java) (revision 81bec2c4c018269cb6a8d65212aae7e37b406fb3) @@ -21,7 +21,6 @@ * **************************************************************** */ - package org.lamsfoundation.lams.learning.web.util; import java.io.UnsupportedEncodingException; @@ -205,11 +204,10 @@ * */ public static ActionForward completeActivity(HttpServletRequest request, HttpServletResponse response, - ActivityMapping actionMappings, LearnerProgress currentProgress, Activity currentActivity, - Integer learnerId, ICoreLearnerService learnerService, boolean redirect) + ActivityMapping actionMappings, LearnerProgress progress, Activity currentActivity, Integer learnerId, + ICoreLearnerService learnerService, boolean redirect) throws LearnerServiceException, UnsupportedEncodingException { - LearnerProgress progress = currentProgress; Lesson lesson = progress.getLesson(); if (currentActivity == null) { @@ -221,7 +219,7 @@ return actionMappings.getCloseForward(currentActivity, lesson.getLessonId()); } else { - progress = learnerService.completeActivity(learnerId, currentActivity, progress); + learnerService.completeActivity(learnerId, currentActivity, progress); } if (currentActivity != null && (currentActivity.isFloating() || (currentActivity.getParentActivity() != null