Index: lams_common/src/java/org/lamsfoundation/lams/tool/service/LamsToolService.java =================================================================== diff -u -rc29ff780a741e2a1014a2d00a1c6f109c57d6d4e -r6cb043085b0ff20f830c077e00ef63cbc37154e0 --- lams_common/src/java/org/lamsfoundation/lams/tool/service/LamsToolService.java (.../LamsToolService.java) (revision c29ff780a741e2a1014a2d00a1c6f109c57d6d4e) +++ lams_common/src/java/org/lamsfoundation/lams/tool/service/LamsToolService.java (.../LamsToolService.java) (revision 6cb043085b0ff20f830c077e00ef63cbc37154e0) @@ -24,16 +24,22 @@ package org.lamsfoundation.lams.tool.service; import java.io.IOException; +import java.util.Date; import java.util.HashSet; import java.util.List; +import java.util.Map; import java.util.Set; import org.apache.log4j.Logger; import org.hibernate.Hibernate; import org.hibernate.proxy.HibernateProxy; import org.lamsfoundation.lams.learningdesign.Activity; +import org.lamsfoundation.lams.learningdesign.FloatingActivity; import org.lamsfoundation.lams.learningdesign.ToolActivity; import org.lamsfoundation.lams.learningdesign.Transition; +import org.lamsfoundation.lams.lesson.CompletedActivityProgress; +import org.lamsfoundation.lams.lesson.LearnerProgress; +import org.lamsfoundation.lams.lesson.service.ILessonService; import org.lamsfoundation.lams.tool.IToolVO; import org.lamsfoundation.lams.tool.Tool; import org.lamsfoundation.lams.tool.ToolOutput; @@ -65,6 +71,7 @@ public IToolSessionDAO toolSessionDAO; public IToolContentDAO toolContentDAO; private ILamsCoreToolService lamsCoreToolService; + private ILessonService lessonService; @Override public Set getAllPotentialLearners(long toolSessionId) throws LamsToolServiceException { @@ -150,7 +157,7 @@ ToolSession toolSession = this.getToolSession(toolSessionId); ToolActivity specifiedActivity = toolSession.getToolActivity(); - Activity leaderSelectionActivity = getNearestLeaderSelectionActivity(specifiedActivity); + Activity leaderSelectionActivity = getNearestLeaderSelectionActivity(specifiedActivity, learnerId, toolSession.getLesson().getLessonId()); // check if there is leaderSelectionTool available if (leaderSelectionActivity != null) { @@ -173,7 +180,7 @@ * Finds the nearest Leader Select activity. Works recursively. Tries to find Leader Select activity in the previous * activities set first, and then inside the parent set. */ - private static Activity getNearestLeaderSelectionActivity(Activity activity) { + private Activity getNearestLeaderSelectionActivity(Activity activity, Integer userId, Long lessonId) { // check if current activity is Leader Select one. if so - stop searching and return it. Class activityClass = Hibernate.getClass(activity); @@ -193,19 +200,47 @@ if (LEADER_SELECTION_TOOL_SIGNATURE.equals(toolActivity.getTool().getToolSignature())) { return activity; } + + //in case of floating activity + } else if (activityClass.equals(FloatingActivity.class)) { + LearnerProgress learnerProgress = lessonService.getUserProgressForLesson(userId, lessonId); + Map completedActivities = learnerProgress.getCompletedActivities(); + + //find the earliest finished Leader Select Activity + Date leaderSelectActivityFinishDate = null; + Activity leaderSelectionActivity = null; + for (Activity completedActivity : completedActivities.keySet()) { + + if (completedActivity instanceof ToolActivity) { + ToolActivity completedToolActivity = (ToolActivity) completedActivity; + if (LEADER_SELECTION_TOOL_SIGNATURE.equals(completedToolActivity.getTool().getToolSignature())) { + Date finishDate = completedActivities.get(completedActivity).getFinishDate(); + + if ((leaderSelectActivityFinishDate == null) + || (finishDate.compareTo(leaderSelectActivityFinishDate) < 0)) { + leaderSelectionActivity = completedToolActivity; + leaderSelectActivityFinishDate = completedActivities.get(completedActivity).getFinishDate(); + } + + } + } + + } + + return leaderSelectionActivity; } // check previous activity Transition transitionTo = activity.getTransitionTo(); if (transitionTo != null) { Activity fromActivity = transitionTo.getFromActivity(); - return getNearestLeaderSelectionActivity(fromActivity); + return getNearestLeaderSelectionActivity(fromActivity, userId, lessonId); } // check parent activity Activity parent = activity.getParentActivity(); if (parent != null) { - return getNearestLeaderSelectionActivity(parent); + return getNearestLeaderSelectionActivity(parent, userId, lessonId); } return null; @@ -257,4 +292,8 @@ public void setLamsCoreToolService(ILamsCoreToolService lamsCoreToolService) { this.lamsCoreToolService = lamsCoreToolService; } + + public void setLessonService(ILessonService lessonService) { + this.lessonService = lessonService; + } } Index: lams_common/src/java/org/lamsfoundation/lams/toolApplicationContext.xml =================================================================== diff -u -r4a144a22d63a90c971cbb07a7079e3b74cf144d2 -r6cb043085b0ff20f830c077e00ef63cbc37154e0 --- lams_common/src/java/org/lamsfoundation/lams/toolApplicationContext.xml (.../toolApplicationContext.xml) (revision 4a144a22d63a90c971cbb07a7079e3b74cf144d2) +++ lams_common/src/java/org/lamsfoundation/lams/toolApplicationContext.xml (.../toolApplicationContext.xml) (revision 6cb043085b0ff20f830c077e00ef63cbc37154e0) @@ -68,6 +68,7 @@ +