Index: lams_learning/src/java/org/lamsfoundation/lams/learning/service/LearnerService.java =================================================================== RCS file: /usr/local/cvsroot/lams_learning/src/java/org/lamsfoundation/lams/learning/service/LearnerService.java,v diff -u -r1.89 -r1.89.2.1 --- lams_learning/src/java/org/lamsfoundation/lams/learning/service/LearnerService.java 29 Oct 2008 05:34:52 -0000 1.89 +++ lams_learning/src/java/org/lamsfoundation/lams/learning/service/LearnerService.java 17 Feb 2009 04:53:22 -0000 1.89.2.1 @@ -97,8 +97,9 @@ private ActivityMapping activityMapping; private IUserManagementService userManagementService; private ILessonService lessonService; + private static HashMap syncMap = new HashMap(); protected MessageService messageService; - + // --------------------------------------------------------------------- // Inversion of Control Methods - Constructor injection // --------------------------------------------------------------------- @@ -426,20 +427,49 @@ * org.lamsfoundation.lams.learningdesign.Activity) */ public LearnerProgress moveToActivity(Integer learnerId, Long lessonId, Activity fromActivity, Activity toActivity) { - LearnerProgress progress = learnerProgressDAO.getLearnerProgressByLearner(learnerId, lessonId); + + int count = 0; + LearnerProgress progress = null; - if (fromActivity != null) { - progress.setProgressState(fromActivity, LearnerProgress.ACTIVITY_ATTEMPTED, activityDAO); - } + // wait till lock is released + while(syncMap.containsKey(learnerId)) { + count++; + try { + Thread.sleep(1000); + + if(count > 100) { + throw new LearnerServiceException("Thread wait count exceeded limit."); + } + } catch (InterruptedException e1) { + throw new LearnerServiceException("While retrying to move activity, thread was interrupted.", e1); + } + } - if (toActivity != null) { - progress.setProgressState(toActivity, LearnerProgress.ACTIVITY_ATTEMPTED, activityDAO); - progress.setCurrentActivity(toActivity); - progress.setNextActivity(toActivity); - } + // lock + try { + syncMap.put(learnerId, lessonId); + progress = learnerProgressDAO.getLearnerProgressByLearner(learnerId, lessonId); + + if (fromActivity != null) { + progress.setProgressState(fromActivity, LearnerProgress.ACTIVITY_ATTEMPTED, activityDAO); + } + + if (toActivity != null) { + progress.setProgressState(toActivity, LearnerProgress.ACTIVITY_ATTEMPTED, activityDAO); + progress.setCurrentActivity(toActivity); + progress.setNextActivity(toActivity); + } - learnerProgressDAO.updateLearnerProgress(progress); - return progress; + learnerProgressDAO.updateLearnerProgress(progress); + } catch(Exception e) { + throw new LearnerServiceException(e.getMessage()); + } finally { + // remove lock + if(syncMap.containsKey(learnerId)) + syncMap.remove(learnerId); + } + + return progress; } /**