Index: lams_learning/lib/lams/lams.jar =================================================================== diff -u -r58a3a69656b21b5047527feab5777a6b9d5b2320 -r61ab8aad9c6a33202b47ca6089e89653b5131b09 Binary files differ Index: lams_learning/lib/lams/src/lams-src.zip =================================================================== diff -u -rf73c3d7878d6f6c013a43da96353e4e0983e1a61 -r61ab8aad9c6a33202b47ca6089e89653b5131b09 Binary files differ Index: lams_learning/src/java/org/lamsfoundation/lams/learning/progress/ProgressEngine.java =================================================================== diff -u -r58a3a69656b21b5047527feab5777a6b9d5b2320 -r61ab8aad9c6a33202b47ca6089e89653b5131b09 --- lams_learning/src/java/org/lamsfoundation/lams/learning/progress/ProgressEngine.java (.../ProgressEngine.java) (revision 58a3a69656b21b5047527feab5777a6b9d5b2320) +++ lams_learning/src/java/org/lamsfoundation/lams/learning/progress/ProgressEngine.java (.../ProgressEngine.java) (revision 61ab8aad9c6a33202b47ca6089e89653b5131b09) @@ -101,9 +101,21 @@ { learnerProgress.setPreviousActivity(completedActivity); learnerProgress.setCurrentActivity(transition.getToActivity()); - learnerProgress.setNextActivity(transition.getToActivity()); + + //we set the next activity to be the first child activity if it + //is a sequence activity. + if(transition.getToActivity().isSequenceActivity()) + { + Activity firstActivityInSequence = + ((SequenceActivity)transition.getToActivity()).getFirstActivityInSequenceActivity(); + learnerProgress.setNextActivity(firstActivityInSequence); + } + //set next activity as the activity follows the transition. + else + learnerProgress.setNextActivity(transition.getToActivity()); learnerProgress.setProgressState(transition.getToActivity(), LearnerProgress.ACTIVITY_ATTEMPTED); + learnerProgress.setParallelWaiting(false); return learnerProgress; } @@ -127,18 +139,28 @@ if (!parent.areChildrenCompleted(learnerProgress)) { Activity nextActivity = parent.getNextActivityByParent(completedActivity); - - if (nextActivity.isNull()) + + + if (!isNextActivityValid(nextActivity)) throw new ProgressException("Error occurred in progress engine." + " Unexpected Null activity received when progressing" + " to the next activity within a incomplete parent activity:" + " Parent activity id [" + parent.getActivityId() + "]"); - - learnerProgress.setNextActivity(nextActivity); - learnerProgress.setProgressState(nextActivity, - LearnerProgress.ACTIVITY_ATTEMPTED); + + if(isParallelWaitActivity(nextActivity)) + { + learnerProgress.setParallelWaiting(true); + learnerProgress.setNextActivity(null); + } + else + { + learnerProgress.setParallelWaiting(false); + learnerProgress.setNextActivity(nextActivity); + learnerProgress.setProgressState(nextActivity, + LearnerProgress.ACTIVITY_ATTEMPTED); + } } //recurvisely call back to calculateProgress to calculate completed //parent activity. @@ -152,4 +174,17 @@ return learnerProgress; } + /** + * @param nextActivity + * @return + */ + private boolean isNextActivityValid(Activity nextActivity) + { + return !nextActivity.isNull()||isParallelWaitActivity(nextActivity); + } + + private boolean isParallelWaitActivity(Activity nextActivity) + { + return nextActivity.getActivityTypeId().intValue()==ParallelWaitActivity.PARALLEL_WAIT_ACTIVITY_TYPE; + } } \ No newline at end of file Index: lams_learning/src/java/org/lamsfoundation/lams/learning/service/LearnerService.java =================================================================== diff -u -r58a3a69656b21b5047527feab5777a6b9d5b2320 -r61ab8aad9c6a33202b47ca6089e89653b5131b09 --- lams_learning/src/java/org/lamsfoundation/lams/learning/service/LearnerService.java (.../LearnerService.java) (revision 58a3a69656b21b5047527feab5777a6b9d5b2320) +++ lams_learning/src/java/org/lamsfoundation/lams/learning/service/LearnerService.java (.../LearnerService.java) (revision 61ab8aad9c6a33202b47ca6089e89653b5131b09) @@ -27,9 +27,10 @@ import org.lamsfoundation.lams.learning.progress.ProgressEngine; import org.lamsfoundation.lams.learning.progress.ProgressException; +import org.lamsfoundation.lams.learning.web.util.ActivityMapping; -import org.lamsfoundation.lams.learning.web.util.ActionMappings; + import org.lamsfoundation.lams.learningdesign.Activity; import org.lamsfoundation.lams.learningdesign.ToolActivity; @@ -58,7 +59,7 @@ private ProgressEngine progressEngine; private IToolSessionDAO toolSessionDAO; private ILamsToolService lamsToolService; - private ActionMappings actionMappings; + private ActivityMapping activityMappings; //--------------------------------------------------------------------- // Inversion of Control Methods - Constructor injection //--------------------------------------------------------------------- @@ -102,6 +103,10 @@ { this.lamsToolService = lamsToolService; } + + public void setActivityMappings(ActivityMapping activityMappings) { + this.activityMappings = activityMappings; + } //--------------------------------------------------------------------- // Service Methods //--------------------------------------------------------------------- @@ -185,7 +190,7 @@ LearnerProgress learnerProgress = learnerProgressDAO.getLearnerProgressByLearner(learner,lesson); learnerProgress = progressEngine.calculateProgress(learner, lesson, completedActivity,learnerProgress); - + learnerProgressDAO.updateLearnerProgress(learnerProgress); return learnerProgress; @@ -202,7 +207,7 @@ try { LearnerProgress nextLearnerProgress = calculateProgress(activity, learner, lesson); Activity nextActivity = nextLearnerProgress.getNextActivity(); - url = actionMappings.getActivityURL(nextActivity, nextLearnerProgress); + url = activityMappings.getActivityURL(nextActivity, nextLearnerProgress); } catch (ProgressException e) { // log e @@ -211,10 +216,6 @@ return url; } - - public void setActionMappings(ActionMappings actionMappings) { - this.actionMappings = actionMappings; - } //--------------------------------------------------------------------- // Helper Methods Index: lams_learning/test/java/WEB-INF/spring/learningApplicationContext.xml =================================================================== diff -u -r58a3a69656b21b5047527feab5777a6b9d5b2320 -r61ab8aad9c6a33202b47ca6089e89653b5131b09 --- lams_learning/test/java/WEB-INF/spring/learningApplicationContext.xml (.../learningApplicationContext.xml) (revision 58a3a69656b21b5047527feab5777a6b9d5b2320) +++ lams_learning/test/java/WEB-INF/spring/learningApplicationContext.xml (.../learningApplicationContext.xml) (revision 61ab8aad9c6a33202b47ca6089e89653b5131b09) @@ -19,6 +19,7 @@ + @@ -38,7 +39,7 @@ - + Index: lams_learning/test/java/org/lamsfoundation/lams/learning/service/TestLearnerService.java =================================================================== diff -u -r58a3a69656b21b5047527feab5777a6b9d5b2320 -r61ab8aad9c6a33202b47ca6089e89653b5131b09 --- lams_learning/test/java/org/lamsfoundation/lams/learning/service/TestLearnerService.java (.../TestLearnerService.java) (revision 58a3a69656b21b5047527feab5777a6b9d5b2320) +++ lams_learning/test/java/org/lamsfoundation/lams/learning/service/TestLearnerService.java (.../TestLearnerService.java) (revision 61ab8aad9c6a33202b47ca6089e89653b5131b09) @@ -66,9 +66,13 @@ private static final long TEST_QNA_ACTIVITY_ID = 24; private static final long TEST_OPTIONS_ACTIVITY_ID = 12; private static final long TEST_CNB_ACTIVITY_ID = 16; - private static final long TEST_Parallel_ACTIVITY_ID = 13; + private static final long TEST_PARALLEL_ACTIVITY_ID = 13; private static final long TEST_CQNA_ACTIVITY_ID = 18; - private static final long TEST_WAITING_ACTIVITY_ID = 0; + private static final long TEST_WAITING_ACTIVITY_ID = -1; + private static final long TEST_MB_ACTIVITY_ID = 19; + private static final long TEST_SEQUENCE_ACTIVITY_ID = 14; + private static final long TEST_SR_ACTIVITY_ID = 22; + private static final long TEST_SQNA_ACTIVITY_ID = 25; /* * @see TestCase#setUp() @@ -132,79 +136,114 @@ public void testCalculateProgress() throws ProgressException { - //progress from survey to notice board Activity testCompletedActivity = testProgress.getNextActivity(); + Activity testRootPreviousActivity = testProgress.getPreviousActivity(); + //progress from survey to notice board + testRootPreviousActivity = testCompletedActivity; testProgress = learnerService.calculateProgress(testCompletedActivity, testUser, testLesson); - assertLearnerProgress(testCompletedActivity,TEST_NB_ACTIVITY_ID,TEST_NB_ACTIVITY_ID,1,"nb","nb"); + assertLearnerProgress(testRootPreviousActivity,TEST_NB_ACTIVITY_ID,TEST_NB_ACTIVITY_ID,1,1,"nb","nb"); //progress from notice board to random grouping activity testCompletedActivity = testProgress.getNextActivity(); + testRootPreviousActivity = testCompletedActivity; testProgress = learnerService.calculateProgress(testCompletedActivity, testUser, testLesson); - assertLearnerProgress(testCompletedActivity,TEST_RGRP_ACTIVITY_ID,TEST_RGRP_ACTIVITY_ID,2,"random grouping","random grouping"); + assertLearnerProgress(testRootPreviousActivity,TEST_RGRP_ACTIVITY_ID,TEST_RGRP_ACTIVITY_ID,2,1,"random grouping","random grouping"); //progress from random grouping activity to chat testCompletedActivity = testProgress.getNextActivity(); + testRootPreviousActivity = testCompletedActivity; testProgress = learnerService.calculateProgress(testCompletedActivity, testUser, testLesson); - assertLearnerProgress(testCompletedActivity,TEST_CHAT_ACTIVITY_ID,TEST_CHAT_ACTIVITY_ID,3,"chat","chat"); + assertLearnerProgress(testRootPreviousActivity,TEST_CHAT_ACTIVITY_ID,TEST_CHAT_ACTIVITY_ID,3,1,"chat","chat"); //progress from chat to QNA testCompletedActivity = testProgress.getNextActivity(); + testRootPreviousActivity = testCompletedActivity; testProgress = learnerService.calculateProgress(testCompletedActivity, testUser, testLesson); - assertLearnerProgress(testCompletedActivity,TEST_QNA_ACTIVITY_ID,TEST_QNA_ACTIVITY_ID,4,"QNA","QNA"); + assertLearnerProgress(testRootPreviousActivity,TEST_QNA_ACTIVITY_ID,TEST_QNA_ACTIVITY_ID,4,1,"QNA","QNA"); //progress from QNA to options activity testCompletedActivity = testProgress.getNextActivity(); + testRootPreviousActivity = testCompletedActivity; testProgress = learnerService.calculateProgress(testCompletedActivity, testUser, testLesson); - assertLearnerProgress(testCompletedActivity,TEST_OPTIONS_ACTIVITY_ID,TEST_OPTIONS_ACTIVITY_ID,5,"OPTIONS","OPTIONS"); + assertLearnerProgress(testRootPreviousActivity,TEST_OPTIONS_ACTIVITY_ID,TEST_OPTIONS_ACTIVITY_ID,5,1,"OPTIONS","OPTIONS"); //progress from sub option(notice board) to parallel activity testCompletedActivity = ((OptionsActivity)testProgress.getCurrentActivity()).getChildActivityById(TEST_CNB_ACTIVITY_ID); + testRootPreviousActivity = testCompletedActivity.getParentActivity(); testProgress = learnerService.calculateProgress(testCompletedActivity, testUser, testLesson); - assertLearnerProgress(testCompletedActivity.getParentActivity(),TEST_Parallel_ACTIVITY_ID,TEST_Parallel_ACTIVITY_ID,7,"PARALLEL","PARALLEL"); + assertLearnerProgress(testRootPreviousActivity,TEST_PARALLEL_ACTIVITY_ID,TEST_PARALLEL_ACTIVITY_ID,7,1,"PARALLEL","PARALLEL"); //progress from sub parallel(QNA) to waiting -/** testCompletedActivity = ((ParallelActivity)testProgress.getCurrentActivity()).getChildActivityById(TEST_CQNA_ACTIVITY_ID); + testCompletedActivity = ((ParallelActivity)testProgress.getCurrentActivity()).getChildActivityById(TEST_CQNA_ACTIVITY_ID); + //the previous activity should not be changed. + testRootPreviousActivity = testProgress.getPreviousActivity(); testProgress = learnerService.calculateProgress(testCompletedActivity, testUser, testLesson); - assertLearnerProgress(testCompletedActivity,TEST_Parallel_ACTIVITY_ID,TEST_WAITING_ACTIVITY_ID,7,"PARALLEL","WAITING"); + assertLearnerProgress(testRootPreviousActivity,TEST_PARALLEL_ACTIVITY_ID,TEST_WAITING_ACTIVITY_ID,8,1,"PARALLEL","WAITING"); + assertTrue("verify waiting flag-should be waiting.",testProgress.isParallelWaiting()); + assertTrue("verify next activity",testProgress.getNextActivity()==null); -*/ + //progress from sub parallel(message board) to sub sequence activity(share resource) + testCompletedActivity = ((ParallelActivity)testProgress.getCurrentActivity()).getChildActivityById(TEST_MB_ACTIVITY_ID); + testRootPreviousActivity = testCompletedActivity.getParentActivity(); + testProgress = learnerService.calculateProgress(testCompletedActivity, + testUser, + testLesson); + assertLearnerProgress(testRootPreviousActivity,TEST_SEQUENCE_ACTIVITY_ID,TEST_SR_ACTIVITY_ID,10,1,"SEQUENCE","SHARE RESOURCE"); + assertTrue("verify waiting flag-should not be waiting",!testProgress.isParallelWaiting()); + + //progress from sub sequence(share resource) to sub sequence(QNA) + testCompletedActivity = testProgress.getNextActivity(); + testRootPreviousActivity = testProgress.getPreviousActivity(); + testProgress = learnerService.calculateProgress(testCompletedActivity, + testUser, + testLesson); + assertLearnerProgress(testRootPreviousActivity,TEST_SEQUENCE_ACTIVITY_ID,TEST_SQNA_ACTIVITY_ID,11,2,"SEQUENCE","QNA"); + + //progress sub sequence(QNA) to complete lesson + testCompletedActivity = testProgress.getNextActivity(); + testProgress = learnerService.calculateProgress(testCompletedActivity, + testUser, + testLesson); + assertTrue("verify lesson complete",testProgress.isLessonComplete()); } /** + * @param numberOfAttemptedAct TODO * @param testCompletedActivity */ - private void assertLearnerProgress(Activity testCompletedActivity, + private void assertLearnerProgress(Activity testRootPreviousActivity, long curActivityId, long nextActivityId, int numberOfCompletedActivities, + int numberOfAttemptedActivities, String currentAct, String nextAct) { assertEquals("verify the expected previous activity", - testCompletedActivity.getActivityId(), + testRootPreviousActivity.getActivityId(), testProgress.getPreviousActivity().getActivityId()); - assertEquals("verify the expected current activity - "+currentAct, curActivityId, testProgress.getCurrentActivity().getActivityId().longValue()); + //assert next activity, id is set to 0 if it is waiting activity assertEquals("verify the expected next activity - "+ nextAct, nextActivityId, - testProgress.getNextActivity().getActivityId().longValue()); + nextActivityId!=-1?testProgress.getNextActivity().getActivityId().longValue():-1); assertEquals("verify the completed activities",numberOfCompletedActivities,testProgress.getCompletedActivities().size()); - assertEquals("verify the attempted activities",1,testProgress.getAttemptedActivities().size()); + assertEquals("verify the attempted activities",numberOfAttemptedActivities,testProgress.getAttemptedActivities().size()); } }