Index: lams_monitoring/src/java/org/lamsfoundation/lams/monitoring/service/IMonitoringService.java =================================================================== RCS file: /usr/local/cvsroot/lams_monitoring/src/java/org/lamsfoundation/lams/monitoring/service/IMonitoringService.java,v diff -u -r1.70 -r1.71 --- lams_monitoring/src/java/org/lamsfoundation/lams/monitoring/service/IMonitoringService.java 9 Nov 2007 08:16:23 -0000 1.70 +++ lams_monitoring/src/java/org/lamsfoundation/lams/monitoring/service/IMonitoringService.java 15 Feb 2008 07:13:21 -0000 1.71 @@ -35,6 +35,7 @@ import org.lamsfoundation.lams.learningdesign.GroupingActivity; import org.lamsfoundation.lams.learningdesign.ScheduleGateActivity; import org.lamsfoundation.lams.learningdesign.exception.LearningDesignProcessorException; +import org.lamsfoundation.lams.lesson.LearnerProgress; import org.lamsfoundation.lams.lesson.Lesson; import org.lamsfoundation.lams.lesson.service.LessonServiceException; import org.lamsfoundation.lams.tool.exception.LamsToolServiceException; @@ -611,5 +612,7 @@ */ public List getLearnersHaveAttemptedActivity(Activity activity) throws LessonServiceException; + /** Get the record of the learner's progress for a particular lesson */ + public LearnerProgress getLearnerProgress(Integer learnerId, Long lessonId); } Index: lams_monitoring/src/java/org/lamsfoundation/lams/monitoring/service/MonitoringService.java =================================================================== RCS file: /usr/local/cvsroot/lams_monitoring/src/java/org/lamsfoundation/lams/monitoring/service/MonitoringService.java,v diff -u -r1.126 -r1.127 --- lams_monitoring/src/java/org/lamsfoundation/lams/monitoring/service/MonitoringService.java 12 Feb 2008 04:09:27 -0000 1.126 +++ lams_monitoring/src/java/org/lamsfoundation/lams/monitoring/service/MonitoringService.java 15 Feb 2008 07:13:21 -0000 1.127 @@ -1432,10 +1432,9 @@ + AttributeNames.PARAM_ACTIVITY_ID + "=" + activityID + "&" + AttributeNames.PARAM_LESSON_ID + "=" + lessonID + "&" + AttributeNames.PARAM_USER_ID + "=" + learnerUserID; - } else if (activity.isBranchingActivity()) { - activity = (BranchingActivity)activity; + } else if (activity.isSystemToolActivity()) { url = lamsCoreToolService.getToolLearnerProgressURL(lessonID, activity, learner); - } + } log.debug("url: "+url); return url; } @@ -2333,5 +2332,9 @@ public List getLearnersHaveAttemptedActivity(Activity activity) throws LessonServiceException { return lessonService.getLearnersHaveAttemptedActivity(activity); } + + public LearnerProgress getLearnerProgress(Integer learnerId, Long lessonId) { + return learnerService.getProgress(learnerId, lessonId); + } } \ No newline at end of file Index: lams_monitoring/src/java/org/lamsfoundation/lams/monitoring/web/ComplexLearnerProgressAction.java =================================================================== RCS file: /usr/local/cvsroot/lams_monitoring/src/java/org/lamsfoundation/lams/monitoring/web/ComplexLearnerProgressAction.java,v diff -u -r1.3 -r1.4 --- lams_monitoring/src/java/org/lamsfoundation/lams/monitoring/web/ComplexLearnerProgressAction.java 14 Feb 2008 06:43:30 -0000 1.3 +++ lams_monitoring/src/java/org/lamsfoundation/lams/monitoring/web/ComplexLearnerProgressAction.java 15 Feb 2008 07:13:21 -0000 1.4 @@ -30,6 +30,7 @@ import java.util.List; import java.util.Set; import java.util.TreeSet; +import java.util.Vector; import javax.servlet.ServletException; import javax.servlet.http.HttpServletRequest; @@ -48,6 +49,8 @@ import org.lamsfoundation.lams.learningdesign.ComplexActivity; import org.lamsfoundation.lams.learningdesign.ParallelActivity; import org.lamsfoundation.lams.learningdesign.SequenceActivity; +import org.lamsfoundation.lams.lesson.LearnerProgress; +import org.lamsfoundation.lams.monitoring.ContributeActivityDTO; import org.lamsfoundation.lams.monitoring.service.IMonitoringService; import org.lamsfoundation.lams.monitoring.service.MonitoringServiceProxy; import org.lamsfoundation.lams.usermanagement.User; @@ -82,79 +85,137 @@ IMonitoringService monitoringService = MonitoringServiceProxy.getMonitoringService(getServlet().getServletContext()); Activity activity = monitoringService.getActivityById(activityID); - IUserManagementService userService = (IUserManagementService)WebApplicationContextUtils - .getRequiredWebApplicationContext(getServlet().getServletContext()).getBean("userManagementService"); - User learner = (User)userService.findById(User.class, userID); - HttpSession ss = SessionManager.getSession(); UserDTO user = (UserDTO) ss.getAttribute(AttributeNames.USER); - if (activity.isOptionsActivity() || activity.isBranchingActivity()) { + if (activity.isParallelActivity()) { + + ArrayList urls = new ArrayList(); + ParallelActivity parallelActivity = (ParallelActivity)activity; + Set parallels = parallelActivity.getActivities(); + Iterator i = parallels.iterator(); + while (i.hasNext()) { + Activity a = (Activity)i.next(); + // get learner progress url for this parallel activity + urls.add(monitoringService.getLearnerActivityURL(lessonID, a.getActivityId(), userID, user.getUserID())); + } + request.setAttribute("parallelUrls", urls); + return mapping.findForward("parallelProgress"); + } + + else { - HashMap startedMap = new HashMap(); + HashMap statusMap = new HashMap(); HashMap urlMap = new HashMap(); + LearnerProgress learnerProgress = monitoringService.getLearnerProgress(userID, lessonID); + request.setAttribute("hasSequenceActivity", false); + List subActivities = new ArrayList(); - ComplexActivity complexActivity = (ComplexActivity)activity; - - Set subActivities = new TreeSet(new ActivityOrderComparator()); - Iterator i = complexActivity.getActivities().iterator(); + if (activity.isOptionsActivity() || activity.isBranchingActivity()) { - // iterate through each optional or branching activity - while (i.hasNext()) { - Activity aNext = (Activity)i.next(); - - // make sure have castable object, not a CGLIB class - Activity a = monitoringService.getActivityById(aNext.getActivityId()); - subActivities.add(a); + ComplexActivity complexActivity = (ComplexActivity)activity; + + Iterator i = complexActivity.getActivities().iterator(); - List users = monitoringService.getLearnersHaveAttemptedActivity(a); - startedMap.put(a.getActivityId(), ( users.contains(learner) ? true : false ) ); - if (a.isSequenceActivity()) { - - request.setAttribute("hasSequenceActivity", true); - // map learner progress urls of each activity in the sequence - SequenceActivity sequenceActivity = (SequenceActivity) a; - Set set = sequenceActivity.getActivities(); - Iterator iterator = set.iterator(); - while (iterator.hasNext()) { - Activity child = (Activity)iterator.next(); - users = monitoringService.getLearnersHaveAttemptedActivity(child); - boolean hasAttempted = users.contains(learner); - startedMap.put(child.getActivityId(), ( hasAttempted ? true : false ) ); - if (hasAttempted) { - // learner progress url - urlMap.put(child.getActivityId(), - monitoringService.getLearnerActivityURL(lessonID, child.getActivityId(), userID, user.getUserID())); - } + // iterate through each optional or branching activity + while (i.hasNext()) { + Activity aNext = (Activity)i.next(); + + // make sure have castable object, not a CGLIB class + Activity a = monitoringService.getActivityById(aNext.getActivityId()); + ContributeActivityDTO dto = new ContributeActivityDTO(a); + subActivities.add(dto); + + statusMap.put(a.getActivityId(), learnerProgress.getProgressState(a)); + + if (a.isSequenceActivity()) { + request.setAttribute("hasSequenceActivity", true); + // map learner progress urls of each activity in the sequence + SequenceActivity sequenceActivity = (SequenceActivity) a; + dto.setChildActivities(new Vector ()); + processSequenceChildren(lessonID, userID, + monitoringService, user, statusMap, urlMap, + learnerProgress, sequenceActivity, dto, null); } } + + } else if ( activity.isSequenceActivity() ) { + + SequenceActivity sequenceActivity = (SequenceActivity) activity; + processSequenceChildren(lessonID, userID, + monitoringService, user, statusMap, urlMap, + learnerProgress, sequenceActivity, null, subActivities); + + } else { + log.error("ComplexLearnerProgress trying to deal with a activity type it doesn't expect. Activity is "+activity); + return null; } - + // learner progress urls for children of the sequence activities request.setAttribute("urlMap", urlMap); // boolean flags for whether an activity is started - request.setAttribute("startedMap", startedMap); + request.setAttribute("statusMap", statusMap); // set of child activities request.setAttribute("subActivities", subActivities); // main activity title request.setAttribute("activityTitle", activity.getTitle()); - + return mapping.findForward("complexProgress"); - } else if (activity.isParallelActivity()) { - ArrayList urls = new ArrayList(); - ParallelActivity parallelActivity = (ParallelActivity)activity; - Set parallels = parallelActivity.getActivities(); - Iterator i = parallels.iterator(); - while (i.hasNext()) { - Activity a = (Activity)i.next(); - // get learner progress url for this parallel activity - urls.add(monitoringService.getLearnerActivityURL(lessonID, a.getActivityId(), userID, user.getUserID())); - } - request.setAttribute("parallelUrls", urls); - return mapping.findForward("parallelProgress"); } - return null; } + + /** + * Process the children of the sequence. Best done by traversing the transitions, with the first + * activity being the default activity for the sequence. + * + * If the page is for a SequenceActivity the subActivities list should be included as a parameter and + * parentContributeActivityDTO will be null. + * + * If the page is for a Branching or Optional Sequence activity then subActivities will be null + * (as the sequence activities go in the subactivities list) but parentContributeActivityDTO should not + * be null. + * + * @param lessonID + * @param userID + * @param monitoringService + * @param user + * @param statusMap + * @param urlMap + * @param learnerProgress + * @param sequenceActivity + * @param subActivities + * @param parentContributeActivityDTO + * @throws IOException + */ + private void processSequenceChildren(Long lessonID, Integer userID, + IMonitoringService monitoringService, UserDTO user, + HashMap statusMap, HashMap urlMap, + LearnerProgress learnerProgress, SequenceActivity sequenceActivity, + ContributeActivityDTO parentContributeActivityDTO, List subActivities) + throws IOException { + Activity child = sequenceActivity.getDefaultActivity(); + while ( child != null ) { + Byte status = learnerProgress.getProgressState(child); + statusMap.put(child.getActivityId(),status); + if (status.equals(LearnerProgress.ACTIVITY_ATTEMPTED) || status.equals(LearnerProgress.ACTIVITY_COMPLETED)) { + // learner progress url + urlMap.put(child.getActivityId(), + monitoringService.getLearnerActivityURL(lessonID, child.getActivityId(), userID, user.getUserID())); + } + + ContributeActivityDTO dto = new ContributeActivityDTO(child); + if ( subActivities != null ) + subActivities.add(dto); + if ( parentContributeActivityDTO != null ) + parentContributeActivityDTO.getChildActivities().add(dto); + + if ( child.getTransitionFrom() != null ) { + child = child.getTransitionFrom().getToActivity(); + } else { + child = null; + } + } + } } \ No newline at end of file Index: lams_monitoring/web/complexProgress.jsp =================================================================== RCS file: /usr/local/cvsroot/lams_monitoring/web/complexProgress.jsp,v diff -u -r1.1 -r1.2 --- lams_monitoring/web/complexProgress.jsp 14 Jan 2008 23:33:33 -0000 1.1 +++ lams_monitoring/web/complexProgress.jsp 15 Feb 2008 07:13:30 -0000 1.2 @@ -9,34 +9,49 @@ - + - - + + + + + + + + + + + + + +
- - ">">
- -

- - - - + +

- + + + + +

    - - + +
  • - + + "> - - + + - + +