Index: lams_learning/build.xml =================================================================== RCS file: /usr/local/cvsroot/lams_learning/build.xml,v diff -u -r1.25 -r1.26 --- lams_learning/build.xml 5 Mar 2007 07:52:42 -0000 1.25 +++ lams_learning/build.xml 28 Jun 2007 06:49:36 -0000 1.26 @@ -235,6 +235,7 @@ + @@ -327,6 +328,7 @@ + Index: lams_learning/conf/language/lams/ApplicationResources.properties =================================================================== RCS file: /usr/local/cvsroot/lams_learning/conf/language/lams/ApplicationResources.properties,v diff -u -r1.2 -r1.3 --- lams_learning/conf/language/lams/ApplicationResources.properties 8 May 2007 02:40:01 -0000 1.2 +++ lams_learning/conf/language/lams/ApplicationResources.properties 28 Jun 2007 06:50:15 -0000 1.3 @@ -75,6 +75,10 @@ mynotes.entry.no.title.label =No Title message.progress.broken =An error has occurred and you cannot continue without LAMS recalculating your current activity. A staff member may be editing the lesson. message.progress.broken.try.resume =Please select 'Resume' or close and reopen this window to continue. If this error re-occurs, wait a few minutes and then try again. - - +label.branching.wait.message=You have stopped at a branching point. You cannot continue until your branch is selected in monitoring. +label.branching.refresh.message=Click Next if you are told that the branch has been selected. This page will refresh automatically in 1 minute. +label.branching.preview.message=As this is a preview, clicking Next will select the first branch and continue. +label.branching.title=Branching +label.sequence.empty.message=There are no activities to complete in this section. Click Next to continue. + #======= End labels: Exported 69 labels for en AU ===== Index: lams_learning/conf/language/lams/ApplicationResources_en_AU.properties =================================================================== RCS file: /usr/local/cvsroot/lams_learning/conf/language/lams/ApplicationResources_en_AU.properties,v diff -u -r1.2 -r1.3 --- lams_learning/conf/language/lams/ApplicationResources_en_AU.properties 8 May 2007 02:40:01 -0000 1.2 +++ lams_learning/conf/language/lams/ApplicationResources_en_AU.properties 28 Jun 2007 06:50:15 -0000 1.3 @@ -75,6 +75,11 @@ mynotes.entry.no.title.label =No Title message.progress.broken =An error has occurred and you cannot continue without LAMS recalculating your current activity. A staff member may be editing the lesson. message.progress.broken.try.resume =Please select 'Resume' or close and reopen this window to continue. If this error re-occurs, wait a few minutes and then try again. +label.branching.wait.message=You have stopped at a branching point. You cannot continue until your branch is selected in monitoring. +label.branching.refresh.message=Click Next if you are told that the branch has been selected. This page will refresh automatically in 1 minute. +label.branching.preview.message=As this is a preview, clicking Next will select the first branch and continue. +label.branching.title=Branching +label.sequence.empty.message=There are no activities to complete in this section. Click Next to continue. #======= End labels: Exported 69 labels for en AU ===== Index: lams_learning/conf/xdoclet/struts-forms.xml =================================================================== RCS file: /usr/local/cvsroot/lams_learning/conf/xdoclet/struts-forms.xml,v diff -u -r1.10 -r1.11 --- lams_learning/conf/xdoclet/struts-forms.xml 9 May 2007 00:59:43 -0000 1.10 +++ lams_learning/conf/xdoclet/struts-forms.xml 28 Jun 2007 06:50:15 -0000 1.11 @@ -22,3 +22,12 @@ + + + + + + + + + Index: lams_learning/src/java/org/lamsfoundation/lams/learning/learningApplicationContext.xml =================================================================== RCS file: /usr/local/cvsroot/lams_learning/src/java/org/lamsfoundation/lams/learning/learningApplicationContext.xml,v diff -u -r1.20 -r1.21 --- lams_learning/src/java/org/lamsfoundation/lams/learning/learningApplicationContext.xml 1 Feb 2007 03:42:58 -0000 1.20 +++ lams_learning/src/java/org/lamsfoundation/lams/learning/learningApplicationContext.xml 28 Jun 2007 06:49:59 -0000 1.21 @@ -20,25 +20,23 @@ - - - - - - - - - - - - - - - - - + - + + + + + + + + + + + + + + + PROPAGATION_REQUIRED @@ -82,11 +80,11 @@ - + - + Index: lams_learning/src/java/org/lamsfoundation/lams/learning/progress/ProgressEngine.java =================================================================== RCS file: /usr/local/cvsroot/lams_learning/src/java/org/lamsfoundation/lams/learning/progress/ProgressEngine.java,v diff -u -r1.25 -r1.26 --- lams_learning/src/java/org/lamsfoundation/lams/learning/progress/ProgressEngine.java 11 Jun 2007 23:43:00 -0000 1.25 +++ lams_learning/src/java/org/lamsfoundation/lams/learning/progress/ProgressEngine.java 28 Jun 2007 06:49:59 -0000 1.26 @@ -34,7 +34,6 @@ import org.lamsfoundation.lams.learningdesign.LearningDesign; import org.lamsfoundation.lams.learningdesign.ParallelActivity; import org.lamsfoundation.lams.learningdesign.SequenceActivity; -import org.lamsfoundation.lams.learningdesign.BranchingActivity; import org.lamsfoundation.lams.learningdesign.Transition; import org.lamsfoundation.lams.learningdesign.dao.IActivityDAO; import org.lamsfoundation.lams.lesson.LearnerProgress; @@ -46,6 +45,8 @@ * The Progress Engine controls how a learner progresses * through a sequence. * + * Code must be re-entrant, as there is one progress engine object called by a singleton LearnerService. + * * @author chris, Jacky */ public class ProgressEngine @@ -55,14 +56,6 @@ private IActivityDAO activityDAO; /** - * Holds a list of completed activity ids in one recursive move to next - * task calculation. For example, if a parallel activity A has two children - * B,C. Assume B has been finished first. The complete of C will also - * result in the completion of A. Therefore, completedActivityList - * will hold B and C. - */ - private List completedActivityList = new LinkedList(); - /** * Method determines next step for a learner based on the activity * they have just completed. Will clear the Parallel Waiting Complete value if it is currently set. * @param learner The User who is progressing through the Lesson. @@ -80,15 +73,16 @@ if ( learnerProgress.getParallelWaiting() == LearnerProgress.PARALLEL_WAITING_COMPLETE ) { learnerProgress.setParallelWaiting(LearnerProgress.PARALLEL_NO_WAIT); } - return doCalculateProgress(learner, completedActivity, learnerProgress); + return doCalculateProgress(learner, completedActivity, learnerProgress, new LinkedList()); } /** Internal method used for recursion. Does the actual "work" of calculateProgress. */ private LearnerProgress doCalculateProgress(User learner, Activity completedActivity, - LearnerProgress learnerProgress) throws ProgressException + LearnerProgress learnerProgress, + List completedActivityList) throws ProgressException { - learnerProgress.setProgressState(completedActivity, + learnerProgress.setProgressState(completedActivity, LearnerProgress.ACTIVITY_COMPLETED, activityDAO); completedActivityList.add(completedActivity.getActivityId()); @@ -98,11 +92,13 @@ return progressCompletedActivity(learner, completedActivity, learnerProgress, - transition); + transition, + completedActivityList); else return progressParentActivity(learner, completedActivity, - learnerProgress); + learnerProgress, + completedActivityList); } /** @@ -132,7 +128,7 @@ +"]"); } else if ( progress.getCompletedActivities().contains(ld.getFirstActivity()) ) { // special case - recalculating the appropriate current activity. - return doCalculateProgress(progress.getUser(), ld.getFirstActivity(), progress); + return doCalculateProgress(progress.getUser(), ld.getFirstActivity(), progress, new LinkedList()); } else if ( canDoActivity(progress.getLesson(), ld.getFirstActivity()) ) { // normal case progress.setCurrentActivity(ld.getFirstActivity()); @@ -190,7 +186,7 @@ } /** Set the current activity as attempted. If it is a parallel activity, mark its children as attempted too. */ - private void setActivityAttempted(LearnerProgress progress, Activity activity) { + public void setActivityAttempted(LearnerProgress progress, Activity activity) { progress.setProgressState(activity,LearnerProgress.ACTIVITY_ATTEMPTED, activityDAO); activity.setReadOnly(true); @@ -224,7 +220,8 @@ private LearnerProgress progressCompletedActivity(User learner, Activity completedActivity, LearnerProgress learnerProgress, - Transition transition) throws ProgressException + Transition transition, + List completedActivityList) throws ProgressException { Activity nextActivity = transition.getToActivity(); @@ -233,23 +230,12 @@ learnerProgress.setPreviousActivity(completedActivity); - populateCurrentCompletedActivityList(learnerProgress); + populateCurrentCompletedActivityList(learnerProgress, completedActivityList); if ( canDoActivity(learnerProgress.getLesson(), nextActivity) ) { learnerProgress.setCurrentActivity(nextActivity); - - //we set the next activity to be the first child activity if it - //is a sequence activity. - if(nextActivity.isSequenceActivity()) - { - SequenceActivity sequence = (SequenceActivity) activityDAO.getActivityByActivityId(nextActivity.getActivityId(), SequenceActivity.class); - Activity firstActivityInSequence = sequence.getFirstActivityInSequenceActivity(); - learnerProgress.setNextActivity(firstActivityInSequence); - } - //set next activity as the activity follows the transition. - else - learnerProgress.setNextActivity(nextActivity); + learnerProgress.setNextActivity(nextActivity); setActivityAttempted(learnerProgress, nextActivity); if ( learnerProgress.getParallelWaiting() == LearnerProgress.PARALLEL_WAITING ) learnerProgress.setParallelWaiting(LearnerProgress.PARALLEL_WAITING_COMPLETE ); @@ -264,7 +250,7 @@ // abnormal case: next activity already done. Must have jumped back to an earlier // optional activity, done another activity and then kept going - return doCalculateProgress(learner,nextActivity,learnerProgress); + return doCalculateProgress(learner,nextActivity,learnerProgress, completedActivityList); } } @@ -288,7 +274,8 @@ */ private LearnerProgress progressParentActivity(User learner, Activity completedActivity, - LearnerProgress learnerProgress) throws ProgressException + LearnerProgress learnerProgress, + List completedActivityList) throws ProgressException { Activity parent = completedActivity.getParentActivity(); @@ -319,13 +306,13 @@ { learnerProgress.setParallelWaiting(LearnerProgress.PARALLEL_WAITING); // learnerProgress.setNextActivity(null); - populateCurrentCompletedActivityList(learnerProgress); + populateCurrentCompletedActivityList(learnerProgress, completedActivityList); } else if ( canDoActivity(learnerProgress.getLesson(), nextActivity) ) { learnerProgress.setNextActivity(nextActivity); setActivityAttempted(learnerProgress, nextActivity); - populateCurrentCompletedActivityList(learnerProgress); + populateCurrentCompletedActivityList(learnerProgress, completedActivityList); } else { learnerProgress = clearProgressNowhereToGoNotCompleted(learnerProgress, "progressParentActivity"); @@ -335,7 +322,7 @@ //parent activity. else { learnerProgress.setPreviousActivity(complexParent); - doCalculateProgress(learner, parent, learnerProgress); + doCalculateProgress(learner, parent, learnerProgress, completedActivityList); if ( learnerProgress.getParallelWaiting() == LearnerProgress.PARALLEL_WAITING ) learnerProgress.setParallelWaiting(LearnerProgress.PARALLEL_WAITING_COMPLETE ); } @@ -354,7 +341,7 @@ * transition. * @param learnerProgress */ - private void populateCurrentCompletedActivityList(LearnerProgress learnerProgress) + private void populateCurrentCompletedActivityList(LearnerProgress learnerProgress, List completedActivityList) { learnerProgress.setCurrentCompletedActivitiesList(completedActivityList); completedActivityList.clear(); Index: lams_learning/src/java/org/lamsfoundation/lams/learning/service/ICoreLearnerService.java =================================================================== RCS file: /usr/local/cvsroot/lams_learning/src/java/org/lamsfoundation/lams/learning/service/ICoreLearnerService.java,v diff -u -r1.7 -r1.8 --- lams_learning/src/java/org/lamsfoundation/lams/learning/service/ICoreLearnerService.java 15 May 2007 23:39:53 -0000 1.7 +++ lams_learning/src/java/org/lamsfoundation/lams/learning/service/ICoreLearnerService.java 28 Jun 2007 06:49:59 -0000 1.8 @@ -29,7 +29,9 @@ import org.lamsfoundation.lams.learning.progress.ProgressEngine; import org.lamsfoundation.lams.learning.progress.ProgressException; import org.lamsfoundation.lams.learningdesign.Activity; +import org.lamsfoundation.lams.learningdesign.BranchingActivity; import org.lamsfoundation.lams.learningdesign.GateActivity; +import org.lamsfoundation.lams.learningdesign.SequenceActivity; import org.lamsfoundation.lams.lesson.LearnerProgress; import org.lamsfoundation.lams.lesson.Lesson; import org.lamsfoundation.lams.lesson.dto.LearnerProgressDTO; @@ -258,4 +260,19 @@ * @return updated Learner Progress */ public LearnerProgress moveToActivity(Integer learnerId, Long lessonId, Activity fromActivity, Activity toActivity); + + /** + * Work out which branch to which a user should go. If the current lesson is a preview lesson, it will force + * the user to a branch if at all possible. + * + * @param lesson current lesson. + * @param BranchingActivity the branching activity + * @param learnerId the learner who triggers the grouping. + * @param forceBranch if true and the lesson is a preview lesson then the branching is done irrespective of + * whether the teacher has set up all the mappings, allocated learner to branch, etc + * @return SequenceActivity that forms the branch if known, null if still awaiting teacher input. + * @throws LearnerServiceException + */ + public SequenceActivity determineBranch(Lesson lesson, BranchingActivity branchingActivity, Integer learnerId) throws LearnerServiceException; + } Index: lams_learning/src/java/org/lamsfoundation/lams/learning/service/LearnerService.java =================================================================== RCS file: /usr/local/cvsroot/lams_learning/src/java/org/lamsfoundation/lams/learning/service/LearnerService.java,v diff -u -r1.64 -r1.65 --- lams_learning/src/java/org/lamsfoundation/lams/learning/service/LearnerService.java 29 May 2007 11:13:52 -0000 1.64 +++ lams_learning/src/java/org/lamsfoundation/lams/learning/service/LearnerService.java 28 Jun 2007 06:49:59 -0000 1.65 @@ -35,9 +35,14 @@ import org.lamsfoundation.lams.learning.progress.ProgressException; import org.lamsfoundation.lams.learning.web.util.ActivityMapping; import org.lamsfoundation.lams.learningdesign.Activity; +import org.lamsfoundation.lams.learningdesign.BranchingActivity; import org.lamsfoundation.lams.learningdesign.GateActivity; +import org.lamsfoundation.lams.learningdesign.Group; +import org.lamsfoundation.lams.learningdesign.GroupBranchActivityEntry; import org.lamsfoundation.lams.learningdesign.Grouping; import org.lamsfoundation.lams.learningdesign.GroupingActivity; +import org.lamsfoundation.lams.learningdesign.ParallelActivity; +import org.lamsfoundation.lams.learningdesign.SequenceActivity; import org.lamsfoundation.lams.learningdesign.ToolActivity; import org.lamsfoundation.lams.learningdesign.dao.IActivityDAO; import org.lamsfoundation.lams.learningdesign.dao.IGroupingDAO; @@ -85,11 +90,17 @@ // Inversion of Control Methods - Constructor injection //--------------------------------------------------------------------- - /** Creates a new instance of LearnerService */ - public LearnerService(ProgressEngine progressEngine) - { + /** Creates a new instance of LearnerService*/ + public LearnerService(ProgressEngine progressEngine) { this.progressEngine = progressEngine; } + + /** Creates a new instance of LearnerService. To be used by Spring, assuming the Spring + * will set up the progress engine via method injection. If you are creating the bean manually + * then use the other constructor. */ + public LearnerService() { + } + //--------------------------------------------------------------------- // Inversion of Control Methods - Method injection //--------------------------------------------------------------------- @@ -347,15 +358,11 @@ public LearnerProgress chooseActivity(Integer learnerId, Long lessonId, Activity activity) { LearnerProgress progress = learnerProgressDAO.getLearnerProgressByLearner(learnerId, lessonId); - - activity.setReadOnly(true); - activityDAO.insertOrUpdate(activity); - - progress.setProgressState(activity, LearnerProgress.ACTIVITY_ATTEMPTED, activityDAO); + progressEngine.setActivityAttempted(progress, activity); progress.setCurrentActivity(activity); - progress.setNextActivity(activity); + progress.setNextActivity(activity); + learnerProgressDAO.saveLearnerProgress(progress); - return progress; } @@ -543,18 +550,13 @@ } else if ( forceGrouping ) { // preview case for chosen grouping - Lesson lesson = getLesson(lessonId); - if ( lesson.isPreviewLesson() ) { - ArrayList learnerList = new ArrayList(); - learnerList.add(learner); - lessonService.performGrouping(groupingActivity, (String)null, learnerList); - groupingDone = true; - } + Lesson lesson = getLesson(lessonId); + groupingDone = forceGrouping(lesson, grouping, learner); } } } else { - String error = "Grouping activity "+groupingActivity.getActivityId()+" learner "+learnerId+" does not exist. Cannot perform grouping."; + String error = "Grouping activity "+groupingActivity+" learner "+learnerId+" does not exist. Cannot perform grouping."; log.error(error); throw new LearnerServiceException(error); } @@ -563,6 +565,17 @@ } return groupingDone; } + + private boolean forceGrouping(Lesson lesson, Grouping grouping, User learner) { + boolean groupingDone = false; + if ( lesson.isPreviewLesson() ) { + ArrayList learnerList = new ArrayList(); + learnerList.add(learner); + lessonService.performGrouping(grouping, (String)null, learnerList); + groupingDone = true; + } + return groupingDone; + } /** @@ -693,4 +706,94 @@ return (LessonDTO[])lessonDTOList.toArray(new LessonDTO[lessonDTOList.size()]); } + /** + * @throws LearnerServiceException + * @see org.lamsfoundation.lams.learning.service.ICoreLearnerService#determineBranch(org.lamsfoundation.lams.lesson.Lesson, org.lamsfoundation.lams.learningdesign.BranchingActivity, java.lang.Integer) + */ + public SequenceActivity determineBranch(Lesson lesson, BranchingActivity branchingActivity, Integer learnerId) throws LearnerServiceException + { + User learner = (User)userManagementService.findById(User.class,learnerId); + if ( learner == null ) { + String error = "determineBranch: learner "+learnerId+" does not exist. Cannot determine branch."; + log.error(error); + throw new LearnerServiceException(error); + } + + if ( branchingActivity.isToolBranchingActivity() ) { + String message = "Tool based branching not yet supported. Activity was "+branchingActivity; + log.error(message); + throw new LearnerServiceException(message); + + } else { + // assume either isGroupBranchingActivity() || isChosenBranchingActivity() ) + // in both cases, the branch is based on the group the learner is in. + try { + return determineGroupBasedBranch(lesson, branchingActivity, learner); + + } catch ( LessonServiceException e ) { + String message = "determineBranch failed due to "+e.getMessage(); + log.error(message,e); + throw new LearnerServiceException("determineBranch failed due to "+e.getMessage(), e); + } + } + } + + private SequenceActivity determineGroupBasedBranch(Lesson lesson, BranchingActivity branchingActivity, User learner) + { + SequenceActivity sequenceActivity = null; + + if ( branchingActivity.getGrouping()!=null ) { + Grouping grouping = branchingActivity.getGrouping(); + + // If the user is in a group, then check if the group is assigned to a sequence activity. If it + // is then we are done and we return the sequence + Group group = grouping.getGroupBy(learner); + if ( group == null && lesson.isPreviewLesson()) { + // if it is preview, we force the user into a group. + if (forceGrouping(lesson, grouping, learner) ) { + group = grouping.getGroupBy(learner); + } + if ( log.isDebugEnabled() ) + log.debug("Forced the user into group "+group+" for branching purposes."); + } + + if ( group != null ) { + Iterator branchesIterator = group.getBranchActivities().iterator(); + while (sequenceActivity==null && branchesIterator.hasNext()) { + GroupBranchActivityEntry branchActivityEntry = (GroupBranchActivityEntry) branchesIterator.next(); + if ( branchActivityEntry.getBranchingActivity().equals(branchingActivity) ) + sequenceActivity = branchActivityEntry.getBranchSequenceActivity(); + } + if ( sequenceActivity == null && lesson.isPreviewLesson()) { + // how do we force them into a branch ? do we just pick one ? is that good enough for preview ? + Iterator iter= branchingActivity.getActivities().iterator(); + if (iter.hasNext()) { + sequenceActivity = (SequenceActivity) iter.next(); + } + if ( log.isDebugEnabled() ) + log.debug("Forced the user into branch"+sequenceActivity); + } + } + + if ( sequenceActivity != null ) { + if ( log.isDebugEnabled()) { + log.debug("Found branch "+sequenceActivity.getActivityId()+":"+ sequenceActivity.getTitle() + +" for branching activity "+branchingActivity.getActivityId()+":"+ branchingActivity.getTitle() + +" for learner "+learner.getUserId()+":"+learner.getLogin()); + } + } + + } + + return sequenceActivity; + } + + public ProgressEngine getProgressEngine() { + return progressEngine; + } + + public void setProgressEngine(ProgressEngine progressEngine) { + this.progressEngine = progressEngine; + } + } Index: lams_learning/src/java/org/lamsfoundation/lams/learning/web/action/ActivityAction.java =================================================================== RCS file: /usr/local/cvsroot/lams_learning/src/java/org/lamsfoundation/lams/learning/web/action/ActivityAction.java,v diff -u -r1.26 -r1.27 --- lams_learning/src/java/org/lamsfoundation/lams/learning/web/action/ActivityAction.java 9 May 2007 00:59:43 -0000 1.26 +++ lams_learning/src/java/org/lamsfoundation/lams/learning/web/action/ActivityAction.java 28 Jun 2007 06:49:58 -0000 1.27 @@ -97,14 +97,6 @@ return null; } - /** - * Get the ActionMappings. - */ - protected ActivityMapping getActivityMapping() { - WebApplicationContext wac = WebApplicationContextUtils.getRequiredWebApplicationContext(this.getServlet().getServletContext()); - return (ActivityMapping)wac.getBean("activityMapping"); - } - private String getProgressSummary(LearnerProgress learnerProgress) { StringBuffer progressSummary = new StringBuffer(100); if ( learnerProgress == null ) { Index: lams_learning/src/java/org/lamsfoundation/lams/learning/web/action/BranchingActivityAction.java =================================================================== RCS file: /usr/local/cvsroot/lams_learning/src/java/org/lamsfoundation/lams/learning/web/action/BranchingActivityAction.java,v diff -u -r1.1 -r1.2 --- lams_learning/src/java/org/lamsfoundation/lams/learning/web/action/BranchingActivityAction.java 11 Jun 2007 23:43:00 -0000 1.1 +++ lams_learning/src/java/org/lamsfoundation/lams/learning/web/action/BranchingActivityAction.java 28 Jun 2007 06:49:58 -0000 1.2 @@ -24,27 +24,23 @@ /* $$Id$$ */ package org.lamsfoundation.lams.learning.web.action; -import java.util.ArrayList; -import java.util.Iterator; -import java.util.List; -import java.util.Set; - import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.apache.struts.action.ActionForm; import org.apache.struts.action.ActionForward; import org.apache.struts.action.ActionMapping; +import org.apache.struts.action.DynaActionForm; import org.lamsfoundation.lams.learning.service.ICoreLearnerService; -import org.lamsfoundation.lams.learning.web.bean.ActivityURL; -import org.lamsfoundation.lams.learning.web.form.OptionsActivityForm; +import org.lamsfoundation.lams.learning.service.LearnerServiceProxy; import org.lamsfoundation.lams.learningdesign.Activity; import org.lamsfoundation.lams.learningdesign.BranchingActivity; -import org.lamsfoundation.lams.learningdesign.OptionsActivity; +import org.lamsfoundation.lams.learningdesign.SequenceActivity; import org.lamsfoundation.lams.lesson.LearnerProgress; import org.lamsfoundation.lams.learning.web.util.ActivityMapping; import org.lamsfoundation.lams.learning.web.util.LearningWebUtil; +import org.lamsfoundation.lams.web.action.LamsDispatchAction; /** * Action class to display an OptionsActivity. @@ -53,69 +49,93 @@ * * XDoclet definition: * - * @struts:action path="/branching" name="optionsActivityForm" - * input="/Activity.do" validate="false" scope="request" + * @struts:action path="/branching" + * name="BranchingForm" + * parameter="method" + * validate="false" * - * @struts:action-forward name="displayBranching" path=".branchingActivity" + * @struts:action-forward name="displayBranchingWait" path=".branchingActivityWait" * */ -public class BranchingActivityAction extends ActivityAction { +public class BranchingActivityAction extends LamsDispatchAction { + public static final String CHOSEN_TYPE = "chosen"; + public static final String GROUP_BASED_TYPE = "group"; + public static final String TOOL_BASED_TYPE = "tool"; + private ICoreLearnerService learnerService = null; + + protected ICoreLearnerService getLearnerService() { + if (learnerService == null) + learnerService = LearnerServiceProxy.getLearnerService(getServlet().getServletContext()); + return learnerService; + } + /** * Gets an options activity from the request (attribute) and forwards to * the display JSP. */ - public ActionForward execute( + public ActionForward performBranching( ActionMapping mapping, ActionForm actionForm, HttpServletRequest request, HttpServletResponse response) { - OptionsActivityForm form = (OptionsActivityForm)actionForm; - ActivityMapping actionMappings = getActivityMapping(); - - ICoreLearnerService learnerService = getLearnerService(); + + ActivityMapping actionMappings = LearningWebUtil.getActivityMapping(this.getServlet().getServletContext()); + getLearnerService(); // initialise the learner service, if necessary + LearnerProgress learnerProgress = LearningWebUtil.getLearnerProgress(request, learnerService); Activity activity = LearningWebUtil.getActivityFromRequest(request, learnerService); - if (!(activity instanceof BranchingActivity)) { + Integer learnerId = LearningWebUtil.getUserId(); + + ActionForward forward = null; + + if (activity == null) { + learnerProgress = learnerService.joinLesson(learnerId, learnerProgress.getLesson().getLessonId()); + forward = actionMappings.getActivityForward(activity, learnerProgress, true); + + } else if (!(activity instanceof BranchingActivity)) { log.error(className+": activity not BranchingActivity "+activity.getActivityId()); - return mapping.findForward(ActivityMapping.ERROR); - } + forward = mapping.findForward(ActivityMapping.ERROR); + + } else { - BranchingActivity branchingActivity = (BranchingActivity)activity; - form.setActivityID(branchingActivity.getActivityId()); + BranchingActivity branchingActivity = (BranchingActivity)activity; + SequenceActivity branch = learnerService.determineBranch(learnerProgress.getLesson(), + branchingActivity, learnerId); - List activityURLs = new ArrayList(); - Set subActivities = branchingActivity.getActivities(); - Iterator i = subActivities.iterator(); - int completedCount = 0; - while (i.hasNext()) { - Activity subActivity = (Activity)i.next(); - ActivityURL activityURL = new ActivityURL(); - String url = actionMappings.getActivityURL(subActivity); - activityURL.setUrl(url); - activityURL.setActivityId(subActivity.getActivityId()); - activityURL.setTitle(subActivity.getTitle()); - activityURL.setDescription(subActivity.getDescription()); - if (learnerProgress.getProgressState(subActivity) == LearnerProgress.ACTIVITY_COMPLETED) { - activityURL.setComplete(true); - completedCount++; + if ( branch == null ) { + // goto waiting page + DynaActionForm groupForm = (DynaActionForm)actionForm; + groupForm.set("activityID", activity.getActivityId()); + groupForm.set("progressID", learnerProgress.getLearnerProgressId()); + groupForm.set("previewLesson",learnerProgress.getLesson().isPreviewLesson()?Boolean.TRUE:Boolean.FALSE); + groupForm.set("showFinishButton", Boolean.TRUE); + groupForm.set("title", activity.getTitle()); + + if ( branchingActivity.isChosenBranchingActivity() ) { + groupForm.set("type", CHOSEN_TYPE); + } else if ( branchingActivity.isGroupBranchingActivity() ) { + groupForm.set("type", GROUP_BASED_TYPE); + } else if ( branchingActivity.isToolBranchingActivity() ) { + groupForm.set("type", TOOL_BASED_TYPE); + } + + forward = mapping.findForward("displayBranchingWait"); + } else { + // forward to the sequence activity. + if ( log.isDebugEnabled() ) { + log.debug("Branching: selecting the branch "+branch+" for user "+learnerId); + } + + // Set the branch as the current part of the sequence and display it + learnerProgress = learnerService.chooseActivity(learnerId, learnerProgress.getLesson().getLessonId(), branch); + forward = actionMappings.getActivityForward(branch, learnerProgress, true); } - activityURLs.add(activityURL); } - form.setActivityURLs(activityURLs); - - form.setDescription(branchingActivity.getDescription()); - form.setTitle(branchingActivity.getTitle()); - form.setLessonID(learnerProgress.getLesson().getLessonId()); - form.setProgressID(learnerProgress.getLearnerProgressId()); - - this.saveToken(request); - - setupProgressString(form, request); - String forward = "displayBranching"; - return mapping.findForward(forward); + LearningWebUtil.putLearnerProgressInRequest(request,learnerProgress); + return forward; } } Index: lams_learning/src/java/org/lamsfoundation/lams/learning/web/action/ChooseActivityAction.java =================================================================== RCS file: /usr/local/cvsroot/lams_learning/src/java/org/lamsfoundation/lams/learning/web/action/ChooseActivityAction.java,v diff -u -r1.14 -r1.15 --- lams_learning/src/java/org/lamsfoundation/lams/learning/web/action/ChooseActivityAction.java 9 May 2007 00:59:42 -0000 1.14 +++ lams_learning/src/java/org/lamsfoundation/lams/learning/web/action/ChooseActivityAction.java 28 Jun 2007 06:49:58 -0000 1.15 @@ -59,7 +59,7 @@ ActionForm actionForm, HttpServletRequest request, HttpServletResponse response) { - ActivityMapping actionMappings = getActivityMapping(); + ActivityMapping actionMappings = LearningWebUtil.getActivityMapping(this.getServlet().getServletContext()); // check token if (!this.isTokenValid(request, true)) { Index: lams_learning/src/java/org/lamsfoundation/lams/learning/web/action/CompleteActivityAction.java =================================================================== RCS file: /usr/local/cvsroot/lams_learning/src/java/org/lamsfoundation/lams/learning/web/action/CompleteActivityAction.java,v diff -u -r1.15 -r1.16 --- lams_learning/src/java/org/lamsfoundation/lams/learning/web/action/CompleteActivityAction.java 9 May 2007 00:59:41 -0000 1.15 +++ lams_learning/src/java/org/lamsfoundation/lams/learning/web/action/CompleteActivityAction.java 28 Jun 2007 06:49:58 -0000 1.16 @@ -73,7 +73,7 @@ ActionForm actionForm, HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException { - ActivityMapping actionMappings = getActivityMapping(); + ActivityMapping actionMappings = LearningWebUtil.getActivityMapping(this.getServlet().getServletContext()); ICoreLearnerService learnerService = getLearnerService(); Index: lams_learning/src/java/org/lamsfoundation/lams/learning/web/action/DisplayOptionsActivityAction.java =================================================================== RCS file: /usr/local/cvsroot/lams_learning/src/java/org/lamsfoundation/lams/learning/web/action/DisplayOptionsActivityAction.java,v diff -u -r1.17 -r1.18 --- lams_learning/src/java/org/lamsfoundation/lams/learning/web/action/DisplayOptionsActivityAction.java 15 May 2007 23:39:53 -0000 1.17 +++ lams_learning/src/java/org/lamsfoundation/lams/learning/web/action/DisplayOptionsActivityAction.java 28 Jun 2007 06:49:58 -0000 1.18 @@ -71,7 +71,7 @@ HttpServletRequest request, HttpServletResponse response) { OptionsActivityForm form = (OptionsActivityForm)actionForm; - ActivityMapping actionMappings = getActivityMapping(); + ActivityMapping actionMappings = LearningWebUtil.getActivityMapping(this.getServlet().getServletContext()); ICoreLearnerService learnerService = getLearnerService(); LearnerProgress learnerProgress = LearningWebUtil.getLearnerProgress(request, learnerService); Index: lams_learning/src/java/org/lamsfoundation/lams/learning/web/action/DisplayToolActivityAction.java =================================================================== RCS file: /usr/local/cvsroot/lams_learning/src/java/org/lamsfoundation/lams/learning/web/action/DisplayToolActivityAction.java,v diff -u -r1.12 -r1.13 --- lams_learning/src/java/org/lamsfoundation/lams/learning/web/action/DisplayToolActivityAction.java 17 Sep 2006 06:17:57 -0000 1.12 +++ lams_learning/src/java/org/lamsfoundation/lams/learning/web/action/DisplayToolActivityAction.java 28 Jun 2007 06:49:58 -0000 1.13 @@ -62,7 +62,7 @@ setupProgressString(actionForm, request); //ActivityForm form = (ActivityForm)actionForm; - ActivityMapping actionMappings = getActivityMapping(); + ActivityMapping actionMappings = LearningWebUtil.getActivityMapping(this.getServlet().getServletContext()); ICoreLearnerService learnerService = getLearnerService(); LearnerProgress learnerProgress = LearningWebUtil.getLearnerProgress(request, learnerService); Index: lams_learning/src/java/org/lamsfoundation/lams/learning/web/action/GateAction.java =================================================================== RCS file: /usr/local/cvsroot/lams_learning/src/java/org/lamsfoundation/lams/learning/web/action/GateAction.java,v diff -u -r1.15 -r1.16 --- lams_learning/src/java/org/lamsfoundation/lams/learning/web/action/GateAction.java 9 May 2007 00:59:43 -0000 1.15 +++ lams_learning/src/java/org/lamsfoundation/lams/learning/web/action/GateAction.java 28 Jun 2007 06:49:58 -0000 1.16 @@ -102,14 +102,6 @@ /** Input parameter. Boolean value */ public static final String PARAM_FORCE_GATE_OPEN = "force"; - /** - * Get the ActionMappings. - */ - protected ActivityMapping getActivityMapping() { - WebApplicationContext wac = WebApplicationContextUtils.getRequiredWebApplicationContext(this.getServlet().getServletContext()); - return (ActivityMapping)wac.getBean("activityMapping"); - } - //--------------------------------------------------------------------- // Struts Dispatch Method //--------------------------------------------------------------------- @@ -136,7 +128,7 @@ //initialize service object ICoreLearnerService learnerService = LearnerServiceProxy.getLearnerService(getServlet().getServletContext()); Activity activity = learnerService.getActivity(activityId); - ActivityMapping actionMappings = getActivityMapping(); + ActivityMapping actionMappings = LearningWebUtil.getActivityMapping(this.getServlet().getServletContext()); User learner = LearningWebUtil.getUser(learnerService); Lesson lesson = learnerService.getLesson(lessonId); Index: lams_learning/src/java/org/lamsfoundation/lams/learning/web/action/GroupingAction.java =================================================================== RCS file: /usr/local/cvsroot/lams_learning/src/java/org/lamsfoundation/lams/learning/web/action/GroupingAction.java,v diff -u -r1.26 -r1.27 --- lams_learning/src/java/org/lamsfoundation/lams/learning/web/action/GroupingAction.java 9 May 2007 00:59:40 -0000 1.26 +++ lams_learning/src/java/org/lamsfoundation/lams/learning/web/action/GroupingAction.java 28 Jun 2007 06:49:58 -0000 1.27 @@ -106,14 +106,6 @@ public static final String WAIT_GROUP = "waitGroup"; public static final String SHOW_GROUP = "showGroup"; - /** - * Get the ActionMappings. - */ - protected ActivityMapping getActivityMapping() { - WebApplicationContext wac = WebApplicationContextUtils.getRequiredWebApplicationContext(this.getServlet().getServletContext()); - return (ActivityMapping)wac.getBean("activityMapping"); - } - //--------------------------------------------------------------------- // Struts Dispatch Method //--------------------------------------------------------------------- @@ -271,8 +263,9 @@ // so manually resume the progress. The completeActivity code can cope with a missing activity. return LearningWebUtil.completeActivity(request, response, - getActivityMapping(), progress, groupingActivity, - learnerId, learnerService, true); + LearningWebUtil.getActivityMapping(this.getServlet().getServletContext()), + progress, groupingActivity, + learnerId, learnerService, true); } } Index: lams_learning/src/java/org/lamsfoundation/lams/learning/web/action/LoadToolActivityAction.java =================================================================== RCS file: /usr/local/cvsroot/lams_learning/src/java/org/lamsfoundation/lams/learning/web/action/LoadToolActivityAction.java,v diff -u -r1.13 -r1.14 --- lams_learning/src/java/org/lamsfoundation/lams/learning/web/action/LoadToolActivityAction.java 17 Sep 2006 06:17:57 -0000 1.13 +++ lams_learning/src/java/org/lamsfoundation/lams/learning/web/action/LoadToolActivityAction.java 28 Jun 2007 06:49:58 -0000 1.14 @@ -39,6 +39,7 @@ import org.lamsfoundation.lams.learning.web.util.LearningWebUtil; import org.lamsfoundation.lams.learningdesign.Activity; import org.lamsfoundation.lams.lesson.LearnerProgress; +import org.lamsfoundation.lams.web.util.AttributeNames; /** * Action class to forward the user to a Tool using an intermediate loading page. Can handle @@ -57,7 +58,6 @@ public class LoadToolActivityAction extends ActivityAction { public static final String DEFINE_LATER = "previewDefineLater"; - public static final String PARAM_ACTIVITY_TITLE = "activityTitle"; public static final String PARAM_ACTIVITY_URL = "activityURL"; /** @@ -87,7 +87,7 @@ if ( activity.getDefineLater() && learnerProgress.getLesson().isPreviewLesson() ) { // preview define later - request.setAttribute(PARAM_ACTIVITY_TITLE, activity.getTitle()); + request.setAttribute(AttributeNames.PARAM_TITLE, activity.getTitle()); request.setAttribute(PARAM_ACTIVITY_URL, url); return mapping.findForward("previewDefineLater"); } else { Index: lams_learning/src/java/org/lamsfoundation/lams/learning/web/action/SequenceActivityAction.java =================================================================== RCS file: /usr/local/cvsroot/lams_learning/src/java/org/lamsfoundation/lams/learning/web/action/SequenceActivityAction.java,v diff -u --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ lams_learning/src/java/org/lamsfoundation/lams/learning/web/action/SequenceActivityAction.java 28 Jun 2007 06:49:59 -0000 1.1 @@ -0,0 +1,113 @@ +/**************************************************************** + * Copyright (C) 2005 LAMS Foundation (http://lamsfoundation.org) + * ============================================================= + * License Information: http://lamsfoundation.org/licensing/lams/2.0/ + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2.0 + * as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 + * USA + * + * http://www.gnu.org/licenses/gpl.txt + * **************************************************************** + */ + +/* $$Id: SequenceActivityAction.java,v 1.1 2007/06/28 06:49:59 fmalikoff Exp $$ */ +package org.lamsfoundation.lams.learning.web.action; + +import java.util.ArrayList; +import java.util.Iterator; +import java.util.List; +import java.util.Set; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +import org.apache.struts.action.ActionForm; +import org.apache.struts.action.ActionForward; +import org.apache.struts.action.ActionMapping; +import org.apache.struts.action.DynaActionForm; +import org.lamsfoundation.lams.learning.service.ICoreLearnerService; +import org.lamsfoundation.lams.learning.web.bean.ActivityURL; +import org.lamsfoundation.lams.learning.web.form.ActivityForm; +import org.lamsfoundation.lams.learning.web.form.OptionsActivityForm; + +import org.lamsfoundation.lams.learningdesign.Activity; +import org.lamsfoundation.lams.learningdesign.OptionsActivity; +import org.lamsfoundation.lams.learningdesign.SequenceActivity; +import org.lamsfoundation.lams.lesson.LearnerProgress; +import org.lamsfoundation.lams.learning.web.util.ActivityMapping; +import org.lamsfoundation.lams.learning.web.util.LearningWebUtil; +import org.lamsfoundation.lams.web.util.AttributeNames; + +/** + * Action class to display a sequence activity. + * + * Normally this will display the first activity inside a sequence activity. + * If there are no activities within the sequence activity then it will display + * an "empty" message. + * + * @struts:action path="/SequenceActivity" name="activityForm" + * validate="false" scope="request" + * + * @struts:action-forward name="empty" path=".sequenceActivityEmpty" + * + */ +public class SequenceActivityAction extends ActivityAction { + + + /** + * Gets an sequence activity from the request (attribute) and forwards to + * either the first activity in the sequence activity or the "empty" JSP. + */ + public ActionForward execute( + ActionMapping mapping, + ActionForm actionForm, + HttpServletRequest request, + HttpServletResponse response) { + + ActivityForm form = (ActivityForm)actionForm; + ActivityMapping actionMappings = LearningWebUtil.getActivityMapping(this.getServlet().getServletContext()); + Integer learnerId = LearningWebUtil.getUserId(); + + ICoreLearnerService learnerService = getLearnerService(); + LearnerProgress learnerProgress = LearningWebUtil.getLearnerProgress(request, learnerService); + Activity activity = LearningWebUtil.getActivityFromRequest(request, learnerService); + if (!(activity instanceof SequenceActivity)) { + log.error(className+": activity not SequenceActivity "+activity.getActivityId()); + return mapping.findForward(ActivityMapping.ERROR); + } + + ActionForward forward = null; + SequenceActivity sequenceActivity = (SequenceActivity)activity; + Activity firstActivityInSequence = sequenceActivity.getFirstActivityInSequenceActivity(); + + if ( firstActivityInSequence != null && ! firstActivityInSequence.isNull() ) { + // Set the first activity as the current activity and display it + learnerProgress = learnerService.chooseActivity(learnerId, learnerProgress.getLesson().getLessonId(), firstActivityInSequence); + forward = actionMappings.getActivityForward(firstActivityInSequence, learnerProgress, true); + LearningWebUtil.putActivityInRequest(request, firstActivityInSequence, learnerService); + } else { + request.setAttribute(AttributeNames.PARAM_ACTIVITY_ID, activity.getActivityId()); + request.setAttribute(AttributeNames.PARAM_TITLE, activity.getTitle()); + request.setAttribute(AttributeNames.PARAM_LESSON_ID, learnerProgress.getLesson().getLessonId()); + request.setAttribute(AttributeNames.PARAM_LEARNER_PROGRESS_ID, learnerProgress.getLearnerProgressId()); + setupProgressString(form, request); + forward = mapping.findForward("empty"); + } + + LearningWebUtil.putLearnerProgressInRequest(request,learnerProgress); + return forward; + + } + +} Index: lams_learning/src/java/org/lamsfoundation/lams/learning/web/util/ActivityMappingStrategy.java =================================================================== RCS file: /usr/local/cvsroot/lams_learning/src/java/org/lamsfoundation/lams/learning/web/util/ActivityMappingStrategy.java,v diff -u -r1.15 -r1.16 --- lams_learning/src/java/org/lamsfoundation/lams/learning/web/util/ActivityMappingStrategy.java 11 Jun 2007 23:43:00 -0000 1.15 +++ lams_learning/src/java/org/lamsfoundation/lams/learning/web/util/ActivityMappingStrategy.java 28 Jun 2007 06:49:58 -0000 1.16 @@ -52,9 +52,13 @@ strutsAction = "/DisplayParallelActivity.do"; else if (activity.isOptionsActivity()) strutsAction = "/DisplayOptionsActivity.do"; - else { - // probably a branching activity + else if (activity.isBranchingActivity()){ strutsAction = "/LoadToolActivity.do"; + } else if ( activity.isSequenceActivity() ) { + strutsAction = "/SequenceActivity.do"; + } else { + // unexpected type, try the tool loading page - that will work for system tools + strutsAction = "/LoadToolActivity.do"; } } else // should be a simple activity - can handle tool, gates and grouping Index: lams_learning/src/java/org/lamsfoundation/lams/learning/web/util/LearningWebUtil.java =================================================================== RCS file: /usr/local/cvsroot/lams_learning/src/java/org/lamsfoundation/lams/learning/web/util/LearningWebUtil.java,v diff -u -r1.18 -r1.19 --- lams_learning/src/java/org/lamsfoundation/lams/learning/web/util/LearningWebUtil.java 18 May 2007 07:19:57 -0000 1.18 +++ lams_learning/src/java/org/lamsfoundation/lams/learning/web/util/LearningWebUtil.java 28 Jun 2007 06:49:58 -0000 1.19 @@ -26,6 +26,7 @@ import java.io.UnsupportedEncodingException; +import javax.servlet.ServletContext; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpSession; @@ -43,6 +44,8 @@ import org.lamsfoundation.lams.util.WebUtil; import org.lamsfoundation.lams.web.session.SessionManager; import org.lamsfoundation.lams.web.util.AttributeNames; +import org.springframework.web.context.WebApplicationContext; +import org.springframework.web.context.support.WebApplicationContextUtils; /** @@ -121,6 +124,7 @@ Long learnerProgressId = WebUtil.readLongParam(request,LearningWebUtil.PARAM_PROGRESS_ID, true); // temp hack until Flash side updates it call. if ( learnerProgressId == null ) { + log.error("Flash client still using progressId, instead of progressID in a learner call"); learnerProgressId = WebUtil.readLongParam(request,"progressId", true); } @@ -130,6 +134,7 @@ log.debug("getLearnerProgress: found progress via progress id"); } } + } if (learnerProgress == null) @@ -165,6 +170,10 @@ activity = learnerService.getActivity(new Long(activityId)); + if ( activity != null ) { + // getActivityFromRequest() may be called multiple times, so make it quicker next time + request.setAttribute(ActivityAction.ACTIVITY_REQUEST_ATTRIBUTE, activity); + } } return activity; } @@ -215,4 +224,13 @@ return actionMappings.getProgressForward(progress, redirect, false, request, learnerService); } + /** + * Get the ActionMappings. + */ + public static ActivityMapping getActivityMapping(ServletContext context) { + WebApplicationContext wac = WebApplicationContextUtils.getRequiredWebApplicationContext(context); + return (ActivityMapping)wac.getBean("activityMapping"); + } + + } Fisheye: Tag 1.2 refers to a dead (removed) revision in file `lams_learning/web/branchingActivity.jsp'. Fisheye: No comparison available. Pass `N' to diff? Index: lams_learning/web/previewDefineLater.jsp =================================================================== RCS file: /usr/local/cvsroot/lams_learning/web/Attic/previewDefineLater.jsp,v diff -u -r1.7 -r1.8 --- lams_learning/web/previewDefineLater.jsp 28 Sep 2006 23:29:23 -0000 1.7 +++ lams_learning/web/previewDefineLater.jsp 28 Jun 2007 06:50:42 -0000 1.8 @@ -33,7 +33,7 @@

- +

Index: lams_learning/web/WEB-INF/struts/tiles-defs.xml =================================================================== RCS file: /usr/local/cvsroot/lams_learning/web/WEB-INF/struts/Attic/tiles-defs.xml,v diff -u -r1.26 -r1.27 --- lams_learning/web/WEB-INF/struts/tiles-defs.xml 9 May 2007 00:59:43 -0000 1.26 +++ lams_learning/web/WEB-INF/struts/tiles-defs.xml 28 Jun 2007 06:50:42 -0000 1.27 @@ -39,6 +39,11 @@ + + + + + @@ -56,6 +61,9 @@ + + + @@ -125,4 +133,14 @@ + + + + + + + + + + \ No newline at end of file Index: lams_learning/web/branching/wait.jsp =================================================================== RCS file: /usr/local/cvsroot/lams_learning/web/branching/wait.jsp,v diff -u --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ lams_learning/web/branching/wait.jsp 28 Jun 2007 06:50:42 -0000 1.1 @@ -0,0 +1,58 @@ +<%-- +Copyright (C) 2005 LAMS Foundation (http://lamsfoundation.org) +License Information: http://lamsfoundation.org/licensing/lams/2.0/ + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License version 2 as + published by the Free Software Foundation. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 + USA + + http://www.gnu.org/licenses/gpl.txt +--%> + +<%@ taglib uri="tags-html" prefix="html" %> +<%@ taglib uri="tags-bean" prefix="bean" %> +<%@ taglib uri="tags-logic" prefix="logic" %> +<%@ taglib uri="tags-core" prefix="c" %> +<%@ taglib uri="tags-fmt" prefix="fmt" %> +<%@ taglib uri="tags-lams" prefix="lams" %> + + /branching.do?method=performBranching&type=${BranchingForm.map.type}&activityID=${BranchingForm.map.activityID}&progressID=${BranchingForm.map.progressID} + + + + +
+ +

+ +

 

+ +

+ +

+ + + &force=true +

+
+ +
+ +
+ +
+ + + +
Index: lams_learning/web/layout/branchingWaitLayout.jsp =================================================================== RCS file: /usr/local/cvsroot/lams_learning/web/layout/branchingWaitLayout.jsp,v diff -u --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ lams_learning/web/layout/branchingWaitLayout.jsp 28 Jun 2007 06:50:42 -0000 1.1 @@ -0,0 +1,48 @@ +<%-- +Copyright (C) 2005 LAMS Foundation (http://lamsfoundation.org) +License Information: http://lamsfoundation.org/licensing/lams/2.0/ + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License version 2 as + published by the Free Software Foundation. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 + USA + + http://www.gnu.org/licenses/gpl.txt +--%> + +<%@ page language="java" pageEncoding="UTF-8" contentType="text/html;charset=utf-8" %> +<%@ taglib uri="tags-bean" prefix="bean"%> +<%@ taglib uri="tags-html" prefix="html"%> +<%@ taglib uri="tags-tiles" prefix="tiles"%> +<%@ taglib uri="tags-core" prefix="c"%> +<%@ taglib uri="tags-lams" prefix="lams" %> +<%@ taglib uri="tags-fmt" prefix="fmt" %> + + + + + + <fmt:message key="${label.branching.title}"/> + + /branching.do?method=performBranching&type=${BranchingForm.map.type}&activityID=${BranchingForm.map.activityID}&progressID=${BranchingForm.map.progressID} + + &force=true + + + + + + + + + + Index: lams_learning/web/sequence/empty.jsp =================================================================== RCS file: /usr/local/cvsroot/lams_learning/web/sequence/Attic/empty.jsp,v diff -u --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ lams_learning/web/sequence/empty.jsp 28 Jun 2007 06:50:42 -0000 1.1 @@ -0,0 +1,36 @@ + +<%@ page language="java" pageEncoding="UTF-8" contentType="text/html;charset=utf-8" %> +<%@ taglib uri="tags-bean" prefix="bean"%> +<%@ taglib uri="tags-html" prefix="html"%> +<%@ taglib uri="tags-core" prefix="c"%> +<%@ taglib uri="tags-fmt" prefix="fmt" %> +<%@ taglib uri="tags-lams" prefix="lams" %> + +
+

+ + + +

 

+ +

+ + + + + + +
+ +
+ +
+ +

 

+
+ + + + +