Index: lams_common/src/java/org/lamsfoundation/lams/lesson/LearnerProgress.java =================================================================== RCS file: /usr/local/cvsroot/lams_common/src/java/org/lamsfoundation/lams/lesson/LearnerProgress.java,v diff -u -r1.25.10.3 -r1.25.10.4 --- lams_common/src/java/org/lamsfoundation/lams/lesson/LearnerProgress.java 11 May 2016 07:07:26 -0000 1.25.10.3 +++ lams_common/src/java/org/lamsfoundation/lams/lesson/LearnerProgress.java 5 Jan 2017 11:19:30 -0000 1.25.10.4 @@ -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 =================================================================== RCS file: /usr/local/cvsroot/lams_learning/src/java/org/lamsfoundation/lams/learning/service/LearnerService.java,v diff -u -r1.112.2.16 -r1.112.2.17 --- lams_learning/src/java/org/lamsfoundation/lams/learning/service/LearnerService.java 15 Dec 2016 11:48:26 -0000 1.112.2.16 +++ lams_learning/src/java/org/lamsfoundation/lams/learning/service/LearnerService.java 5 Jan 2017 11:19:32 -0000 1.112.2.17 @@ -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;