Index: lams_learning/src/java/org/lamsfoundation/lams/learning/export/service/PortfolioBuilder.java =================================================================== diff -u -re7046600ee8bfa53d053e0aee33a16b52ad0e8e2 -r0a50c865925ec0818895cbc9c4ce3b6e0beefa9c --- lams_learning/src/java/org/lamsfoundation/lams/learning/export/service/PortfolioBuilder.java (.../PortfolioBuilder.java) (revision e7046600ee8bfa53d053e0aee33a16b52ad0e8e2) +++ lams_learning/src/java/org/lamsfoundation/lams/learning/export/service/PortfolioBuilder.java (.../PortfolioBuilder.java) (revision 0a50c865925ec0818895cbc9c4ce3b6e0beefa9c) @@ -107,11 +107,11 @@ } /** Prepares to process children */ - public void startComplexActivity(ComplexActivity activity) throws LearningDesignProcessorException { + public boolean startComplexActivity(ComplexActivity activity) throws LearningDesignProcessorException { // Create a new current activity list, putting the old current one on the stack. activityListStack.push(currentPortfolioList); currentPortfolioList = new ArrayList(); - + return true; } /** Creates an ActivityPortfolio and sets up the list of its children. Doesn't create an entry if there are no children. */ Index: lams_learning/src/java/org/lamsfoundation/lams/learning/progress/ProgressBuilder.java =================================================================== diff -u -r472bcb813040efc160e074021be5c71c15455f00 -r0a50c865925ec0818895cbc9c4ce3b6e0beefa9c --- lams_learning/src/java/org/lamsfoundation/lams/learning/progress/ProgressBuilder.java (.../ProgressBuilder.java) (revision 472bcb813040efc160e074021be5c71c15455f00) +++ lams_learning/src/java/org/lamsfoundation/lams/learning/progress/ProgressBuilder.java (.../ProgressBuilder.java) (revision 0a50c865925ec0818895cbc9c4ce3b6e0beefa9c) @@ -38,6 +38,7 @@ import org.lamsfoundation.lams.learningdesign.dao.IActivityDAO; import org.lamsfoundation.lams.learningdesign.exception.LearningDesignProcessorException; import org.lamsfoundation.lams.lesson.LearnerProgress; +import org.lamsfoundation.lams.lesson.Lesson; import org.lamsfoundation.lams.usermanagement.User; /** Creates a basic tree of the user's current progress - what is completed, urls to jump back to completed activities, etc */ @@ -51,7 +52,8 @@ ArrayList mainActivityList; ArrayStack activityListStack; ArrayList currentActivityList; - String forwardToLearnerURL; + String forceLearnerURL; + boolean previewMode; /** Create the builder. Supply all the data that will be needed to parse the design and build the portfolio entries. * @@ -80,30 +82,45 @@ this.currentActivityList = mainActivityList; this.activityListStack = new ArrayStack(5); - // setup the basic call to the learner screen, ready just to put the activity id on the end. Saves calculating it for every activity - this.forwardToLearnerURL = "/learning/learner.do?method=forwardToLearner" - +"&userID="+user.getUserId()+"lessonID="+progress.getLesson().getLessonId()+"&activityID="; + Lesson lesson = progress.getLesson(); + previewMode = lesson.isPreviewLesson(); + if ( previewMode) { + // setup the basic call to the learner screen, ready just to put the activity id on the end. Saves calculating it for every activity + this.forceLearnerURL = "learner.do?method=forceMoveRedirect&lessonID=" + +progress.getLesson().getLessonId()+"&destActivityID="; + } + } /** Prepares to process children */ - public void startComplexActivity(ComplexActivity activity) throws LearningDesignProcessorException { + public boolean startComplexActivity(ComplexActivity activity) throws LearningDesignProcessorException { // Create a new current activity list, putting the old current one on the stack. activityListStack.push(currentActivityList); currentActivityList = new ArrayList(); + + if ( activity.isSequenceActivity() ) { + return ( progress.getProgressState(activity) != LearnerProgress.ACTIVITY_NOT_ATTEMPTED ); + } + return true; } + /** Creates an ActivityURL and sets up the list of its children. */ public void endComplexActivity(ComplexActivity activity) throws LearningDesignProcessorException { ActivityURL complexActivityURL = createActivityURL(activity); - if ( complexActivityURL.getStatus()!=LearnerProgress.ACTIVITY_NOT_ATTEMPTED && currentActivityList.size()>0 ) { + // don't want to show a branch if it isn't being done + if ( complexActivityURL.getStatus()!=LearnerProgress.ACTIVITY_NOT_ATTEMPTED || ! (activity.isSequenceActivity() + && activity.getParentActivity() != null && activity.getParentActivity().isBranchingActivity()) ) { complexActivityURL.setChildActivities(currentActivityList); + currentActivityList = (ArrayList) activityListStack.pop(); + currentActivityList.add(complexActivityURL); + } else { + currentActivityList = (ArrayList) activityListStack.pop(); } - currentActivityList = (ArrayList) activityListStack.pop(); - currentActivityList.add(complexActivityURL); } public void startSimpleActivity(SimpleActivity activity) throws LearningDesignProcessorException { @@ -133,7 +150,11 @@ log.error(error); throw new LearningDesignProcessorException(error); } - return LearningWebUtil.getActivityURL( activityMapping, progress, activity, false); + ActivityURL activityURL = LearningWebUtil.getActivityURL( activityMapping, progress, activity, false); + if ( activityURL.getStatus() == LearnerProgress.ACTIVITY_NOT_ATTEMPTED ) { + activityURL.setUrl( previewMode? forceLearnerURL+activity.getActivityId() : null); + } + return activityURL; } /** Get the list of all the activity progress DTOs, which in turn may contain other activity progress DTOs */ Index: lams_learning/src/java/org/lamsfoundation/lams/learning/service/ICoreLearnerService.java =================================================================== diff -u -r472bcb813040efc160e074021be5c71c15455f00 -r0a50c865925ec0818895cbc9c4ce3b6e0beefa9c --- lams_learning/src/java/org/lamsfoundation/lams/learning/service/ICoreLearnerService.java (.../ICoreLearnerService.java) (revision 472bcb813040efc160e074021be5c71c15455f00) +++ lams_learning/src/java/org/lamsfoundation/lams/learning/service/ICoreLearnerService.java (.../ICoreLearnerService.java) (revision 0a50c865925ec0818895cbc9c4ce3b6e0beefa9c) @@ -98,10 +98,10 @@ * Returns the current progress data, in the DTO format required by the jsp progress screen, of the User. * @param learnerId the Learner's userID * @param lessonId the Lesson to get progress from. - * @return progressList contains the learner's progress for the lesson. + * @return Array of two objects. [0] List, [1] Activity ID of the current activity * @throws LearnerServiceException in case of problems. */ - public List getStructuredActivityURLs(Integer learnerId, Long lessonId); + public Object[] getStructuredActivityURLs(Integer learnerId, Long lessonId); /** Index: lams_learning/src/java/org/lamsfoundation/lams/learning/service/LearnerService.java =================================================================== diff -u -r472bcb813040efc160e074021be5c71c15455f00 -r0a50c865925ec0818895cbc9c4ce3b6e0beefa9c --- lams_learning/src/java/org/lamsfoundation/lams/learning/service/LearnerService.java (.../LearnerService.java) (revision 472bcb813040efc160e074021be5c71c15455f00) +++ lams_learning/src/java/org/lamsfoundation/lams/learning/service/LearnerService.java (.../LearnerService.java) (revision 0a50c865925ec0818895cbc9c4ce3b6e0beefa9c) @@ -364,14 +364,20 @@ /** * @see org.lamsfoundation.lams.learning.service.ICoreLearnerService#getStructuredProgressDTOs(java.lang.Long, java.lang.Long) */ - public List getStructuredActivityURLs(Integer learnerId, Long lessonId) { + public Object[] getStructuredActivityURLs(Integer learnerId, Long lessonId) { LearnerProgress progress = learnerProgressDAO.getLearnerProgressByLearner(learnerId, lessonId); Lesson lesson = progress.getLesson(); ProgressBuilder builder = new ProgressBuilder(progress, activityDAO, activityMapping); builder.parseLearningDesign(); - return builder.getActivityList(); + List list = builder.getActivityList(); + + Object[] retValue = new Object[2]; + retValue[0] = list; + retValue[1] = progress.getCurrentActivity() !=null ? progress.getCurrentActivity().getActivityId() : null; + + return retValue; } Index: lams_learning/src/java/org/lamsfoundation/lams/learning/web/action/LearnerAction.java =================================================================== diff -u -r472bcb813040efc160e074021be5c71c15455f00 -r0a50c865925ec0818895cbc9c4ce3b6e0beefa9c --- lams_learning/src/java/org/lamsfoundation/lams/learning/web/action/LearnerAction.java (.../LearnerAction.java) (revision 472bcb813040efc160e074021be5c71c15455f00) +++ lams_learning/src/java/org/lamsfoundation/lams/learning/web/action/LearnerAction.java (.../LearnerAction.java) (revision 0a50c865925ec0818895cbc9c4ce3b6e0beefa9c) @@ -499,13 +499,15 @@ Long lessonId = WebUtil.readLongParam(request,AttributeNames.PARAM_LESSON_ID ); ICoreLearnerService learnerService = LearnerServiceProxy.getLearnerService(getServlet().getServletContext()); - List progressList = learnerService.getStructuredActivityURLs(learnerId, lessonId); - request.setAttribute("progressList", progressList); + Object[] ret = learnerService.getStructuredActivityURLs(learnerId, lessonId);; + request.setAttribute("progressList", (List)ret[0]); + request.setAttribute("currentActivityID", ret[1]); + return mapping.findForward("displayProgress"); } /** - * Forces a move to a destination Activity in the learning sequence. + * Forces a move to a destination Activity in the learning sequence, returning a WDDX packet * * @param mapping An ActionMapping class that will be used by the Action class to tell * the ActionServlet where to send the end-user. @@ -524,11 +526,62 @@ HttpServletResponse response) throws IOException, ServletException { FlashMessage flashMessage = null; - - //initialize service object + ICoreLearnerService learnerService = LearnerServiceProxy.getLearnerService(getServlet().getServletContext()); ActivityMapping activityMapping = LearnerServiceProxy.getActivityMapping(this.getServlet().getServletContext()); + Long lessonId = WebUtil.readLongParam(request,AttributeNames.PARAM_LESSON_ID); + + try { + forceMoveShared(request, learnerService,lessonId); + flashMessage = new FlashMessage("forceMove", activityMapping.getDisplayActivityAction(null)); + } catch (Exception e) { + flashMessage = handleException(e, "forceMove", learnerService); + } + + PrintWriter writer = response.getWriter(); + writer.println(flashMessage.serializeMessage()); + return null; + + } + + /** + * Forces a move to a destination Activity in the learning sequence, redirecting to the new + * page rather than returning a WDDX packet. + * + * @param mapping An ActionMapping class that will be used by the Action class to tell + * the ActionServlet where to send the end-user. + * @param form The ActionForm class that will contain any data submitted + * by the end-user via a form. + * @param request A standard Servlet HttpServletRequest class. + * @param response A standard Servlet HttpServletResponse class. + * @return An ActionForward class that will be returned to the ActionServlet indicating where + * the user is to go next. + * @throws IOException + * @throws ServletException + */ + public ActionForward forceMoveRedirect(ActionMapping mapping, + ActionForm form, + HttpServletRequest request, + HttpServletResponse response) throws IOException, + ServletException { ICoreLearnerService learnerService = LearnerServiceProxy.getLearnerService(getServlet().getServletContext()); + ActivityMapping activityMapping = LearnerServiceProxy.getActivityMapping(this.getServlet().getServletContext()); + Long lessonId = WebUtil.readLongParam(request,AttributeNames.PARAM_LESSON_ID); + + try { + forceMoveShared(request, learnerService,lessonId); + return redirectToURL(mapping, response, "/learning" + activityMapping.getDisplayActivityAction(lessonId)); + } catch (Exception e) { + log.error("Exception throw doing force move",e); + throw new ServletException(e); + } + } + /** + * @param request + * @return + */ + private void forceMoveShared(HttpServletRequest request, ICoreLearnerService learnerService, Long lessonId) { + //getting requested object according to coming parameters Integer learnerId = LearningWebUtil.getUserId(); @@ -552,35 +605,22 @@ toActivityId = null; } - //force complete - try { - long lessonId = WebUtil.readLongParam(request,AttributeNames.PARAM_LESSON_ID); - - Activity fromActivity = null; - Activity toActivity = null; - - if(fromActivityId != null) - fromActivity = learnerService.getActivity(fromActivityId); - - if(toActivityId != null) - toActivity = learnerService.getActivity(toActivityId); - - learnerService.moveToActivity(learnerId, new Long(lessonId), fromActivity, toActivity); - - if ( log.isDebugEnabled() ) { - log.debug("Force move for learner "+learnerId+" lesson "+lessonId+". "); - } - flashMessage = new FlashMessage("forceMove", activityMapping.getDisplayActivityAction(null)); - } catch (Exception e) { - flashMessage = handleException(e, "forceMove", learnerService); - } - String message = flashMessage.serializeMessage(); - - PrintWriter writer = response.getWriter(); - writer.println(message); - return null; + + Activity fromActivity = null; + Activity toActivity = null; - } + if(fromActivityId != null) + fromActivity = learnerService.getActivity(fromActivityId); + + if(toActivityId != null) + toActivity = learnerService.getActivity(toActivityId); + + learnerService.moveToActivity(learnerId, lessonId, fromActivity, toActivity); + + if ( log.isDebugEnabled() ) { + log.debug("Force move for learner "+learnerId+" lesson "+lessonId+". "); + } + } /** * Get AuditService bean.