Index: lams_common/src/java/org/lamsfoundation/lams/learningdesign/Activity.java =================================================================== diff -u -rfee6e64a584e9b1a7df005ba288332c49310fe7c -r0cd6d5f3a368eb1fa3a140d87b5b1664ee4aa88d --- lams_common/src/java/org/lamsfoundation/lams/learningdesign/Activity.java (.../Activity.java) (revision fee6e64a584e9b1a7df005ba288332c49310fe7c) +++ lams_common/src/java/org/lamsfoundation/lams/learningdesign/Activity.java (.../Activity.java) (revision 0cd6d5f3a368eb1fa3a140d87b5b1664ee4aa88d) @@ -514,5 +514,16 @@ return activityStrategy.areChildrenCompleted(this,learnerProgress); } - + /** + * Delegate to activity strategy to calculate what is the next activity + * within the parent activity. + * + * @param learnerProgress the progress data that record what has been + * completed + * @return true if all children are completed. + */ + public Activity getNextActivityByParent(Activity currentChild) + { + return activityStrategy.getNextActivityByParent(this,currentChild); + } } \ No newline at end of file Index: lams_common/src/java/org/lamsfoundation/lams/lesson/ActivityStrategy.java =================================================================== diff -u -rfee6e64a584e9b1a7df005ba288332c49310fe7c -r0cd6d5f3a368eb1fa3a140d87b5b1664ee4aa88d --- lams_common/src/java/org/lamsfoundation/lams/lesson/ActivityStrategy.java (.../ActivityStrategy.java) (revision fee6e64a584e9b1a7df005ba288332c49310fe7c) +++ lams_common/src/java/org/lamsfoundation/lams/lesson/ActivityStrategy.java (.../ActivityStrategy.java) (revision 0cd6d5f3a368eb1fa3a140d87b5b1664ee4aa88d) @@ -38,10 +38,13 @@ public abstract class ActivityStrategy { /** - * Check up all children status for a complex activity. - * @param activity - * @param learnerProgress - * @return + *

Check up all children completion status for a complex activity.

+ * Precondition: the activity should a complex activity that has children. + * + * @param activity the complex activity + * @param learnerProgress the progress data that record what has been + * completed + * @return true if all children are completed. */ public boolean areChildrenCompleted(Activity activity, LearnerProgress learnerProgress) { @@ -60,13 +63,23 @@ } /** - * @param numOfCompletedActivities - * @return + * Check up the children activity completion status against number of + * activities that has been completed within target complex activity. + * @param numOfCompletedActivities the number of completed activities in the + * progress data + * @return true if the completion condition is met. */ protected abstract boolean isComplete(int numOfCompletedActivities,ComplexActivity complexActivity); - - public abstract Activity getNextActivityFromParent(Activity activity); + /** + * This method get next activity that should be progressed against the + * requested incomplete parent activity. + * @param parent The requested incomplete parent activity. + * @param currentChild the current children we have just completed. + * + * @return the activity we should progress to. + */ + public abstract Activity getNextActivityByParent(Activity parent, Activity currentChild); } Index: lams_common/src/java/org/lamsfoundation/lams/lesson/OptionsActivityStrategy.java =================================================================== diff -u -rfee6e64a584e9b1a7df005ba288332c49310fe7c -r0cd6d5f3a368eb1fa3a140d87b5b1664ee4aa88d --- lams_common/src/java/org/lamsfoundation/lams/lesson/OptionsActivityStrategy.java (.../OptionsActivityStrategy.java) (revision fee6e64a584e9b1a7df005ba288332c49310fe7c) +++ lams_common/src/java/org/lamsfoundation/lams/lesson/OptionsActivityStrategy.java (.../OptionsActivityStrategy.java) (revision 0cd6d5f3a368eb1fa3a140d87b5b1664ee4aa88d) @@ -27,22 +27,31 @@ /** * + * Progress calculation strategy for options activity. * @author Jacky Fang 2005-2-24 * */ public class OptionsActivityStrategy extends ActivityStrategy { /** - * @see org.lamsfoundation.lams.lesson.ActivityStrategy#getNextActivityFromParent(Activity) + * Return the next activity for a incomplete options activity. In terms of + * incomplete option activity, the next activity will always be the option + * activity itself so as to display the options page again when the user + * finish one option. + * + * @see org.lamsfoundation.lams.lesson.ActivityStrategy#getNextActivityByParent(Activity, Activity) */ - public Activity getNextActivityFromParent(Activity activity) + public Activity getNextActivityByParent(Activity parent, Activity currentChild) { - // TODO Auto-generated method stub - return null; + return parent; } /** + * Return the completion status of children activities within a options + * activity. A option activity is marked as complete if the maximum + * number of options requirement is met. + * * @see org.lamsfoundation.lams.lesson.ActivityStrategy#isComplete(int, org.lamsfoundation.lams.learningdesign.ComplexActivity) */ protected boolean isComplete(int numOfCompletedActivities, ComplexActivity complexActivity) Index: lams_common/src/java/org/lamsfoundation/lams/lesson/ParallelActivityStrategy.java =================================================================== diff -u -rfee6e64a584e9b1a7df005ba288332c49310fe7c -r0cd6d5f3a368eb1fa3a140d87b5b1664ee4aa88d --- lams_common/src/java/org/lamsfoundation/lams/lesson/ParallelActivityStrategy.java (.../ParallelActivityStrategy.java) (revision fee6e64a584e9b1a7df005ba288332c49310fe7c) +++ lams_common/src/java/org/lamsfoundation/lams/lesson/ParallelActivityStrategy.java (.../ParallelActivityStrategy.java) (revision 0cd6d5f3a368eb1fa3a140d87b5b1664ee4aa88d) @@ -26,22 +26,30 @@ /** + * The progress calculation strategy for parallel activity. * * @author Jacky Fang 2005-2-24 * */ public class ParallelActivityStrategy extends ActivityStrategy { /** - * @see org.lamsfoundation.lams.lesson.ActivityStrategy#getNextActivityFromParent(Activity) + * Regarding incomplete parallel activity, the next activity will always + * be a waiting activity, which will finally translated into waiting + * message. + * + * @see org.lamsfoundation.lams.lesson.ActivityStrategy#getNextActivityByParent(Activity, Activity) */ - public Activity getNextActivityFromParent(Activity activity) + public Activity getNextActivityByParent(Activity activity, Activity currentChild) { - // TODO Auto-generated method stub - return null; + return new ParallelWaitActivity(); } /** + * Return the completion status of children activities within a parallel + * activity. A parallel activity is marked as complete if all children + * activities are completed. + * * @see org.lamsfoundation.lams.lesson.ActivityStrategy#isComplete(int, org.lamsfoundation.lams.learningdesign.ComplexActivity) */ protected boolean isComplete(int numOfCompletedActivities, ComplexActivity complexActivity) Index: lams_common/src/java/org/lamsfoundation/lams/lesson/SequenceActivityStrategy.java =================================================================== diff -u -rfee6e64a584e9b1a7df005ba288332c49310fe7c -r0cd6d5f3a368eb1fa3a140d87b5b1664ee4aa88d --- lams_common/src/java/org/lamsfoundation/lams/lesson/SequenceActivityStrategy.java (.../SequenceActivityStrategy.java) (revision fee6e64a584e9b1a7df005ba288332c49310fe7c) +++ lams_common/src/java/org/lamsfoundation/lams/lesson/SequenceActivityStrategy.java (.../SequenceActivityStrategy.java) (revision 0cd6d5f3a368eb1fa3a140d87b5b1664ee4aa88d) @@ -20,25 +20,48 @@ */ package org.lamsfoundation.lams.lesson; +import java.util.Iterator; +import java.util.Set; +import java.util.TreeSet; + import org.lamsfoundation.lams.learningdesign.Activity; +import org.lamsfoundation.lams.learningdesign.ActivityOrderComparator; import org.lamsfoundation.lams.learningdesign.ComplexActivity; +import org.lamsfoundation.lams.learningdesign.NullActivity; import org.lamsfoundation.lams.learningdesign.SequenceActivity; /** - * Activity calculation strategy for sequence activity. + * Progress calculation strategy for sequence activity. * * @author Jacky Fang 2005-2-24 * */ public class SequenceActivityStrategy extends ActivityStrategy { + /** - * @see org.lamsfoundation.lams.lesson.ActivityStrategy#getNextActivityFromParent(Activity) + *

Return the next activity for a incomplete options activity. For a + * sequence activity, the activity should be the next activity in the + * children activity set ordered by activity id.

+ * + * Pre-condition: the parent must have some incomplete children + * + * @see org.lamsfoundation.lams.lesson.ActivityStrategy#getNextActivityByParent(Activity, Activity) */ - public Activity getNextActivityFromParent(Activity activity) + public Activity getNextActivityByParent(Activity parent, Activity currentChild) { - // TODO Auto-generated method stub - return null; + Set children = new TreeSet(new ActivityOrderComparator()); + + children.addAll(((ComplexActivity)parent).getActivities()); + + for(Iterator i=children.iterator();i.hasNext();) + { + Activity curChild = (Activity)i.next(); + + if(curChild.getActivityId().longValue()==currentChild.getActivityId().longValue()) + return (Activity)i.next(); + } + return new NullActivity(); } /** Index: lams_common/test/java/org/lamsfoundation/lams/lesson/TestActivityStrategy.java =================================================================== diff -u -rfee6e64a584e9b1a7df005ba288332c49310fe7c -r0cd6d5f3a368eb1fa3a140d87b5b1664ee4aa88d --- lams_common/test/java/org/lamsfoundation/lams/lesson/TestActivityStrategy.java (.../TestActivityStrategy.java) (revision fee6e64a584e9b1a7df005ba288332c49310fe7c) +++ lams_common/test/java/org/lamsfoundation/lams/lesson/TestActivityStrategy.java (.../TestActivityStrategy.java) (revision 0cd6d5f3a368eb1fa3a140d87b5b1664ee4aa88d) @@ -52,12 +52,6 @@ protected void setUp() throws Exception { super.setUp(); - testSubOptionsActivityNB = activityDAO.getActivityByActivityId(TEST_NB_ACTIVITY_ID); - testSubOptionsActivityMC = activityDAO.getActivityByActivityId(TEST_MC_ACTIVITY_ID); - testSubParallelActivityQA = activityDAO.getActivityByActivityId(TEST_QA_ACTIVITY_ID); - testSubParallelActivityMB = activityDAO.getActivityByActivityId(TEST_MB_ACTIVITY_ID); - testSubSeuquencActivitySR = activityDAO.getActivityByActivityId(TEST_SR_ACTIVITY_ID); - testSubSeuqenceActivityQNA = activityDAO.getActivityByActivityId(TEST_QNA_ACTIVITY_ID); } /* @@ -79,6 +73,9 @@ public void testChildrenCompletedForParallelActivity() { + testSubParallelActivityQA = activityDAO.getActivityByActivityId(TEST_QA_ACTIVITY_ID); + testSubParallelActivityMB = activityDAO.getActivityByActivityId(TEST_MB_ACTIVITY_ID); + super.testLearnerProgress.setProgressState(testSubParallelActivityQA,LearnerProgress.ACTIVITY_COMPLETED); super.testLearnerProgress.setProgressState(testSubParallelActivityMB,LearnerProgress.ACTIVITY_COMPLETED); @@ -87,26 +84,37 @@ public void testChildrenInCompletedForParallelActivity() { + testSubParallelActivityQA = activityDAO.getActivityByActivityId(TEST_QA_ACTIVITY_ID); + super.testLearnerProgress.setProgressState(testSubParallelActivityQA,LearnerProgress.ACTIVITY_COMPLETED); assertTrue("should not be completed",!this.testParallelActivity.areChildrenCompleted(super.testLearnerProgress)); } public void testChildrenCompletedForSequenceActivity() { + testSubSeuquencActivitySR = activityDAO.getActivityByActivityId(TEST_SR_ACTIVITY_ID); + testSubSeuqenceActivityQNA = activityDAO.getActivityByActivityId(TEST_QNA_ACTIVITY_ID); + + super.testLearnerProgress.setProgressState(testSubSeuquencActivitySR,LearnerProgress.ACTIVITY_COMPLETED); super.testLearnerProgress.setProgressState(testSubSeuqenceActivityQNA,LearnerProgress.ACTIVITY_COMPLETED); assertTrue("should be completed",this.testSequenceActivity.areChildrenCompleted(super.testLearnerProgress)); } public void testChildrenInCompletedForSequenceActivity() { + testSubSeuquencActivitySR = activityDAO.getActivityByActivityId(TEST_SR_ACTIVITY_ID); + super.testLearnerProgress.setProgressState(testSubSeuquencActivitySR,LearnerProgress.ACTIVITY_COMPLETED); assertTrue("should not be completed",!this.testSequenceActivity.areChildrenCompleted(super.testLearnerProgress)); } public void testChildrenCompletedForOptionsActivity() { + testSubOptionsActivityNB = activityDAO.getActivityByActivityId(TEST_NB_ACTIVITY_ID); + testSubOptionsActivityMC = activityDAO.getActivityByActivityId(TEST_MC_ACTIVITY_ID); + super.testLearnerProgress.setProgressState(testSubOptionsActivityNB,LearnerProgress.ACTIVITY_COMPLETED); assertTrue("should be completed",this.testOptionsActivity.areChildrenCompleted(super.testLearnerProgress)); } @@ -116,4 +124,39 @@ assertTrue("should not be completed",!this.testOptionsActivity.areChildrenCompleted(super.testLearnerProgress)); } + public void testGetNextActivityBySequenceParentActivity() + { + testSubSeuquencActivitySR = activityDAO.getActivityByActivityId(TEST_SR_ACTIVITY_ID); + testSubSeuqenceActivityQNA = activityDAO.getActivityByActivityId(TEST_QNA_ACTIVITY_ID); + + Activity nextActivity = this.testSequenceActivity.getNextActivityByParent(testSubSeuquencActivitySR); + + assertNotNull("we should have a next activity",nextActivity); + assertEquals("it should be qna",this.testSubSeuqenceActivityQNA.getActivityId().longValue(),nextActivity.getActivityId().longValue()); + } + + public void testGetNextActivityByOptionsParentActivity() + { + testSubOptionsActivityNB = activityDAO.getActivityByActivityId(TEST_NB_ACTIVITY_ID); + + Activity nextActivity = this.testOptionsActivity.getNextActivityByParent(testSubOptionsActivityNB); + + assertNotNull("we should have a next activity",nextActivity); + assertEquals("it should be option activity itself", + this.testOptionsActivity.getActivityId().longValue(), + nextActivity.getActivityId().longValue()); + } + + public void testGetNextActivityByParallelParentActivity() + { + testSubParallelActivityQA = activityDAO.getActivityByActivityId(TEST_QA_ACTIVITY_ID); + + Activity nextActivity = this.testParallelActivity.getNextActivityByParent(testSubParallelActivityQA); + + assertNotNull("we should have a next activity",nextActivity); + + assertTrue("It should be kind of null activity",nextActivity.isNull()); + assertTrue("It should waiting activity",nextActivity instanceof ParallelWaitActivity); + + } }