Index: lams_common/src/java/org/lamsfoundation/lams/lesson/LearnerProgress.java =================================================================== diff -u -r51fb2a37254f24bb2a805d4ffd54482c779f43fa -rbdf9ae9c42902b4b2a275fdc787e1814368c8fb2 --- lams_common/src/java/org/lamsfoundation/lams/lesson/LearnerProgress.java (.../LearnerProgress.java) (revision 51fb2a37254f24bb2a805d4ffd54482c779f43fa) +++ lams_common/src/java/org/lamsfoundation/lams/lesson/LearnerProgress.java (.../LearnerProgress.java) (revision bdf9ae9c42902b4b2a275fdc787e1814368c8fb2) @@ -36,6 +36,7 @@ import org.apache.commons.lang.builder.EqualsBuilder; import org.apache.commons.lang.builder.HashCodeBuilder; import org.apache.commons.lang.builder.ToStringBuilder; +import org.apache.log4j.Logger; import org.lamsfoundation.lams.learningdesign.Activity; import org.lamsfoundation.lams.learningdesign.ActivityOrderComparator; import org.lamsfoundation.lams.learningdesign.ComplexActivity; @@ -64,6 +65,8 @@ public class LearnerProgress implements Serializable { private static final long serialVersionUID = -7866830317967062822L; + private static Logger log = Logger.getLogger(LearnerProgress.class); + //--------------------------------------------------------------------- // Class level constants //--------------------------------------------------------------------- @@ -346,17 +349,28 @@ // remove activity from current set byte oldState = getProgressState(activity); if (oldState == state) { + log.debug("Progress " + this.getLearnerProgressId() + " does not change state " + state + " of activity " + + activity.getActivityId()); // no real change, forget the rest of the method return; } Date activityStartDate = attemptedActivities.get(activity); - + if (activityStartDate == null) { + log.warn("Progress " + this.getLearnerProgressId() + " found NULL start date of activity " + + activity.getActivityId()); + } if (oldState == LearnerProgress.ACTIVITY_NOT_ATTEMPTED) { + log.debug("Progress " + this.getLearnerProgressId() + " does not remove not attempted activity " + + activity.getActivityId()); ; } else if (oldState == LearnerProgress.ACTIVITY_ATTEMPTED) { + log.debug("Progress " + this.getLearnerProgressId() + " removes attempted activity " + + activity.getActivityId()); this.attemptedActivities.remove(activity); } else if (oldState == LearnerProgress.ACTIVITY_COMPLETED) { + log.debug("Progress " + this.getLearnerProgressId() + " removes completed activity " + + activity.getActivityId()); this.completedActivities.remove(activity); if (activity.isComplexActivity()) { ComplexActivity complex = (ComplexActivity) activityDAO @@ -371,10 +385,16 @@ // add activity to new set if (state == LearnerProgress.ACTIVITY_NOT_ATTEMPTED) { + log.debug("Progress " + this.getLearnerProgressId() + " does not add not attempted activity " + + activity.getActivityId()); ; } else if (state == LearnerProgress.ACTIVITY_ATTEMPTED) { + log.debug( + "Progress " + this.getLearnerProgressId() + " adds attempted activity " + activity.getActivityId()); this.attemptedActivities.put(activity, new Date()); } else if (state == LearnerProgress.ACTIVITY_COMPLETED) { + log.debug( + "Progress " + this.getLearnerProgressId() + " adds completed activity " + activity.getActivityId()); this.completedActivities.put(activity, new CompletedActivityProgress(this, activity, activityStartDate, new Date())); } Index: lams_learning/src/java/org/lamsfoundation/lams/learning/service/LearnerService.java =================================================================== diff -u -r81bec2c4c018269cb6a8d65212aae7e37b406fb3 -rbdf9ae9c42902b4b2a275fdc787e1814368c8fb2 --- lams_learning/src/java/org/lamsfoundation/lams/learning/service/LearnerService.java (.../LearnerService.java) (revision 81bec2c4c018269cb6a8d65212aae7e37b406fb3) +++ lams_learning/src/java/org/lamsfoundation/lams/learning/service/LearnerService.java (.../LearnerService.java) (revision bdf9ae9c42902b4b2a275fdc787e1814368c8fb2) @@ -604,9 +604,9 @@ * @return the updated learner progress */ @Override - public void completeActivity(Integer learnerId, Activity activity, LearnerProgress progress) { + public synchronized void completeActivity(Integer learnerId, Activity activity, LearnerProgress progress) { // load the progress again from DB - progress = learnerProgressDAO.getLearnerProgress(progress.getLearnerProgressId()); + // progress = learnerProgressDAO.getLearnerProgress(progress.getLearnerProgressId()); if (progress.getCompletedActivities().keySet().contains(activity)) { // progress was already updated by another thread, so prevent double processing return;