Index: lams_learning/src/java/org/lamsfoundation/lams/learning/web/action/ActivityAction.java =================================================================== diff -u -r0cbb25df35aa6fc1339d195f69b1aeef7a372680 -rec41df86451fb6307b8f9600958646ab4f4774bd --- lams_learning/src/java/org/lamsfoundation/lams/learning/web/action/ActivityAction.java (.../ActivityAction.java) (revision 0cbb25df35aa6fc1339d195f69b1aeef7a372680) +++ lams_learning/src/java/org/lamsfoundation/lams/learning/web/action/ActivityAction.java (.../ActivityAction.java) (revision ec41df86451fb6307b8f9600958646ab4f4774bd) @@ -30,7 +30,7 @@ import org.lamsfoundation.lams.learning.service.DummyLearnerService; import org.lamsfoundation.lams.learning.web.bean.SessionBean; import org.lamsfoundation.lams.learning.web.form.ActivityForm; -import org.lamsfoundation.lams.learning.web.util.ActionMappings; +import org.lamsfoundation.lams.learning.web.util.ActivityMapping; import org.lamsfoundation.lams.usermanagement.*; import org.lamsfoundation.lams.lesson.*; @@ -61,9 +61,9 @@ /** * Get the ActionMappings. */ - protected ActionMappings getActionMappings() { + protected ActivityMapping getActivityMapping() { WebApplicationContext wac = WebApplicationContextUtils.getRequiredWebApplicationContext(this.getServlet().getServletContext()); - return (ActionMappings)wac.getBean("actionMappings"); + return (ActivityMapping)wac.getBean("activityMapping"); } /** Index: lams_learning/src/java/org/lamsfoundation/lams/learning/web/action/ChooseActivity.java =================================================================== diff -u -r4ed305ca5a1ce5c51ab76815077b59a6fa8987b4 -rec41df86451fb6307b8f9600958646ab4f4774bd --- lams_learning/src/java/org/lamsfoundation/lams/learning/web/action/ChooseActivity.java (.../ChooseActivity.java) (revision 4ed305ca5a1ce5c51ab76815077b59a6fa8987b4) +++ lams_learning/src/java/org/lamsfoundation/lams/learning/web/action/ChooseActivity.java (.../ChooseActivity.java) (revision ec41df86451fb6307b8f9600958646ab4f4774bd) @@ -34,7 +34,7 @@ import org.lamsfoundation.lams.lesson.LearnerProgress; import org.lamsfoundation.lams.lesson.Lesson; import org.lamsfoundation.lams.usermanagement.User; -import org.lamsfoundation.lams.learning.web.util.ActionMappings; +import org.lamsfoundation.lams.learning.web.util.ActivityMapping; /** * @author daveg @@ -59,19 +59,19 @@ HttpServletRequest request, HttpServletResponse response) { ActivityForm form = (ActivityForm) actionForm; - ActionMappings actionMappings = getActionMappings(); + ActivityMapping actionMappings = getActivityMapping(); SessionBean sessionBean = getSessionBean(request); if (sessionBean == null) { // forward to the no session error page - return mapping.findForward(ActionMappings.NO_SESSION_ERROR); + return mapping.findForward(ActivityMapping.NO_SESSION_ERROR); } // check token if (!this.isTokenValid(request, true)) { // didn't come here from options page log.info(className+": No valid token in request"); - return mapping.findForward(ActionMappings.DOUBLE_SUBMIT_ERROR); + return mapping.findForward(ActivityMapping.DOUBLE_SUBMIT_ERROR); } // Get learner @@ -83,7 +83,7 @@ if (activity == null) { log.error(className+": No activity in request or session"); - return mapping.findForward(ActionMappings.ERROR); + return mapping.findForward(ActivityMapping.ERROR); } ILearnerService learnerService = getLearnerService(request); Index: lams_learning/src/java/org/lamsfoundation/lams/learning/web/action/CompleteActivity.java =================================================================== diff -u -r4ed305ca5a1ce5c51ab76815077b59a6fa8987b4 -rec41df86451fb6307b8f9600958646ab4f4774bd --- lams_learning/src/java/org/lamsfoundation/lams/learning/web/action/CompleteActivity.java (.../CompleteActivity.java) (revision 4ed305ca5a1ce5c51ab76815077b59a6fa8987b4) +++ lams_learning/src/java/org/lamsfoundation/lams/learning/web/action/CompleteActivity.java (.../CompleteActivity.java) (revision ec41df86451fb6307b8f9600958646ab4f4774bd) @@ -34,7 +34,7 @@ import org.lamsfoundation.lams.lesson.LearnerProgress; import org.lamsfoundation.lams.lesson.Lesson; import org.lamsfoundation.lams.usermanagement.User; -import org.lamsfoundation.lams.learning.web.util.ActionMappings; +import org.lamsfoundation.lams.learning.web.util.ActivityMapping; /** * @author daveg @@ -62,19 +62,19 @@ HttpServletRequest request, HttpServletResponse response) { ActivityForm form = (ActivityForm)actionForm; - ActionMappings actionMappings = getActionMappings(); + ActivityMapping actionMappings = getActivityMapping(); SessionBean sessionBean = getSessionBean(request); if (sessionBean == null) { // forward to the no session error page - return mapping.findForward(ActionMappings.NO_SESSION_ERROR); + return mapping.findForward(ActivityMapping.NO_SESSION_ERROR); } // check token if (!this.isTokenValid(request, true)) { // didn't come here from options page log.info(className+": No valid token in request"); - return mapping.findForward(ActionMappings.DOUBLE_SUBMIT_ERROR); + return mapping.findForward(ActivityMapping.DOUBLE_SUBMIT_ERROR); } // Get learner @@ -86,7 +86,7 @@ if (activity == null) { log.error(className+": No activity in request or session"); - return mapping.findForward(ActionMappings.ERROR); + return mapping.findForward(ActivityMapping.ERROR); } ILearnerService learnerService = getLearnerService(request); Index: lams_learning/src/java/org/lamsfoundation/lams/learning/web/action/DisplayActivity.java =================================================================== diff -u -r4ed305ca5a1ce5c51ab76815077b59a6fa8987b4 -rec41df86451fb6307b8f9600958646ab4f4774bd --- lams_learning/src/java/org/lamsfoundation/lams/learning/web/action/DisplayActivity.java (.../DisplayActivity.java) (revision 4ed305ca5a1ce5c51ab76815077b59a6fa8987b4) +++ lams_learning/src/java/org/lamsfoundation/lams/learning/web/action/DisplayActivity.java (.../DisplayActivity.java) (revision ec41df86451fb6307b8f9600958646ab4f4774bd) @@ -30,7 +30,7 @@ import org.lamsfoundation.lams.learning.web.form.ActivityForm; import org.lamsfoundation.lams.usermanagement.*; -import org.lamsfoundation.lams.learning.web.util.ActionMappings; +import org.lamsfoundation.lams.learning.web.util.ActivityMapping; import org.lamsfoundation.lams.learningdesign.*; import org.lamsfoundation.lams.lesson.*; @@ -58,12 +58,12 @@ HttpServletRequest request, HttpServletResponse response) { ActivityForm form = (ActivityForm) actionForm; - ActionMappings actionMappings = getActionMappings(); + ActivityMapping actionMappings = getActivityMapping(); SessionBean sessionBean = getSessionBean(request); if (sessionBean == null) { // forward to the no session error page - return mapping.findForward(ActionMappings.NO_SESSION_ERROR); + return mapping.findForward(ActivityMapping.NO_SESSION_ERROR); } // Get learner Index: lams_learning/src/java/org/lamsfoundation/lams/learning/web/action/DisplayLoadToolActivity.java =================================================================== diff -u -r4ed305ca5a1ce5c51ab76815077b59a6fa8987b4 -rec41df86451fb6307b8f9600958646ab4f4774bd --- lams_learning/src/java/org/lamsfoundation/lams/learning/web/action/DisplayLoadToolActivity.java (.../DisplayLoadToolActivity.java) (revision 4ed305ca5a1ce5c51ab76815077b59a6fa8987b4) +++ lams_learning/src/java/org/lamsfoundation/lams/learning/web/action/DisplayLoadToolActivity.java (.../DisplayLoadToolActivity.java) (revision ec41df86451fb6307b8f9600958646ab4f4774bd) @@ -33,7 +33,7 @@ import org.lamsfoundation.lams.learningdesign.*; import org.lamsfoundation.lams.lesson.*; -import org.lamsfoundation.lams.learning.web.util.ActionMappings; +import org.lamsfoundation.lams.learning.web.util.ActivityMapping; /** * Action class to forward the user to a Tool using an intermediate loading page. @@ -58,13 +58,13 @@ HttpServletRequest request, HttpServletResponse response) { ActivityForm form = (ActivityForm)actionForm; - ActionMappings actionMappings = getActionMappings(); + ActivityMapping actionMappings = getActivityMapping(); LearnerProgress learnerProgress = getLearnerProgress(request, form); Activity activity = getActivity(request, form, learnerProgress); if (!(activity instanceof ToolActivity)) { log.error(className+": activity not ToolActivity"); - return mapping.findForward(ActionMappings.ERROR); + return mapping.findForward(ActivityMapping.ERROR); } ToolActivity toolActivity = (ToolActivity)activity; Index: lams_learning/src/java/org/lamsfoundation/lams/learning/web/action/DisplayNotebookEntry.java =================================================================== diff -u -r3ebc3946a5086e35a6be9a325f9d3207bdb6fdc8 -rec41df86451fb6307b8f9600958646ab4f4774bd --- lams_learning/src/java/org/lamsfoundation/lams/learning/web/action/DisplayNotebookEntry.java (.../DisplayNotebookEntry.java) (revision 3ebc3946a5086e35a6be9a325f9d3207bdb6fdc8) +++ lams_learning/src/java/org/lamsfoundation/lams/learning/web/action/DisplayNotebookEntry.java (.../DisplayNotebookEntry.java) (revision ec41df86451fb6307b8f9600958646ab4f4774bd) @@ -29,7 +29,7 @@ import org.apache.struts.action.ActionMapping; import org.lamsfoundation.lams.learning.web.bean.SessionBean; import org.lamsfoundation.lams.learning.web.form.NotebookForm; -import org.lamsfoundation.lams.learning.web.util.ActionMappings; +import org.lamsfoundation.lams.learning.web.util.ActivityMapping; import org.lamsfoundation.lams.notebook.NotebookEntry; import org.lamsfoundation.lams.notebook.service.INotebookService; import org.lamsfoundation.lams.notebook.service.NotebookServiceProxy; @@ -59,7 +59,7 @@ SessionBean sessionBean = getSessionBean(request); if (sessionBean == null) { // forward to the no session error page - return mapping.findForward(ActionMappings.NO_SESSION_ERROR); + return mapping.findForward(ActivityMapping.NO_SESSION_ERROR); } NotebookEntry notebookEntry; @@ -72,7 +72,7 @@ // check whether user in session has access to this notebook entry if (!notebookEntry.isViewable(sessionBean.getLearner())) { log.error(className+": User with Id "+sessionBean.getLearner().getUserId()+" does not have access to NotebookEntry with Id "+notebookEntry.getNotebookEntryId()); - return mapping.findForward(ActionMappings.NO_ACCESS_ERROR); + return mapping.findForward(ActivityMapping.NO_ACCESS_ERROR); } } notebookForm.setNotebookEntry(notebookEntry); Index: lams_learning/src/java/org/lamsfoundation/lams/learning/web/action/DisplayOptionsActivity.java =================================================================== diff -u -r4ed305ca5a1ce5c51ab76815077b59a6fa8987b4 -rec41df86451fb6307b8f9600958646ab4f4774bd --- lams_learning/src/java/org/lamsfoundation/lams/learning/web/action/DisplayOptionsActivity.java (.../DisplayOptionsActivity.java) (revision 4ed305ca5a1ce5c51ab76815077b59a6fa8987b4) +++ lams_learning/src/java/org/lamsfoundation/lams/learning/web/action/DisplayOptionsActivity.java (.../DisplayOptionsActivity.java) (revision ec41df86451fb6307b8f9600958646ab4f4774bd) @@ -38,7 +38,7 @@ import org.lamsfoundation.lams.learningdesign.Activity; import org.lamsfoundation.lams.learningdesign.OptionsActivity; import org.lamsfoundation.lams.lesson.LearnerProgress; -import org.lamsfoundation.lams.learning.web.util.ActionMappings; +import org.lamsfoundation.lams.learning.web.util.ActivityMapping; /** * Action class to display an OptionsActivity. @@ -66,13 +66,13 @@ HttpServletRequest request, HttpServletResponse response) { OptionsActivityForm form = (OptionsActivityForm)actionForm; - ActionMappings actionMappings = getActionMappings(); + ActivityMapping actionMappings = getActivityMapping(); LearnerProgress learnerProgress = getLearnerProgress(request, form); Activity activity = getActivity(request, form, learnerProgress); if (!(activity instanceof OptionsActivity)) { log.error(className+": activity not OptionsActivity "+activity.getActivityId()); - return mapping.findForward(ActionMappings.ERROR); + return mapping.findForward(ActivityMapping.ERROR); } OptionsActivity optionsActivity = (OptionsActivity)activity; Index: lams_learning/src/java/org/lamsfoundation/lams/learning/web/action/DisplayParallelActivity.java =================================================================== diff -u -r4ed305ca5a1ce5c51ab76815077b59a6fa8987b4 -rec41df86451fb6307b8f9600958646ab4f4774bd --- lams_learning/src/java/org/lamsfoundation/lams/learning/web/action/DisplayParallelActivity.java (.../DisplayParallelActivity.java) (revision 4ed305ca5a1ce5c51ab76815077b59a6fa8987b4) +++ lams_learning/src/java/org/lamsfoundation/lams/learning/web/action/DisplayParallelActivity.java (.../DisplayParallelActivity.java) (revision ec41df86451fb6307b8f9600958646ab4f4774bd) @@ -33,7 +33,8 @@ import org.lamsfoundation.lams.learningdesign.*; import org.lamsfoundation.lams.lesson.*; -import org.lamsfoundation.lams.learning.web.util.ActionMappings; +import org.lamsfoundation.lams.learning.web.util.ActivityMapping; +import org.lamsfoundation.lams.learning.web.util.ParallelActivityMappingStrategy; /** * Action class to display a ParallelActivity. @@ -59,13 +60,14 @@ HttpServletRequest request, HttpServletResponse response) { ActivityForm form = (ActivityForm)actionForm; - ActionMappings actionMappings = getActionMappings(); + ActivityMapping actionMappings = getActivityMapping(); + actionMappings.setActivityMappingStrategy(new ParallelActivityMappingStrategy()); LearnerProgress learnerProgress = getLearnerProgress(request, form); Activity activity = getActivity(request, form, learnerProgress); if (!(activity instanceof ParallelActivity)) { log.error(className+": activity not ParallelActivity "+activity.getActivityId()); - return mapping.findForward(ActionMappings.ERROR); + return mapping.findForward(ActivityMapping.ERROR); } ParallelActivity parallelActivity = (ParallelActivity)activity; @@ -84,7 +86,7 @@ } if (activityURLs.size() == 0) { log.error(className+": No sub-activity URLs for activity "+activity.getActivityId()); - return mapping.findForward(ActionMappings.ERROR); + return mapping.findForward(ActivityMapping.ERROR); } form.setActivityURLs(activityURLs); Index: lams_learning/src/java/org/lamsfoundation/lams/learning/web/action/DisplayToolActivity.java =================================================================== diff -u -r4ed305ca5a1ce5c51ab76815077b59a6fa8987b4 -rec41df86451fb6307b8f9600958646ab4f4774bd --- lams_learning/src/java/org/lamsfoundation/lams/learning/web/action/DisplayToolActivity.java (.../DisplayToolActivity.java) (revision 4ed305ca5a1ce5c51ab76815077b59a6fa8987b4) +++ lams_learning/src/java/org/lamsfoundation/lams/learning/web/action/DisplayToolActivity.java (.../DisplayToolActivity.java) (revision ec41df86451fb6307b8f9600958646ab4f4774bd) @@ -30,7 +30,7 @@ import org.lamsfoundation.lams.learningdesign.*; import org.lamsfoundation.lams.lesson.*; -import org.lamsfoundation.lams.learning.web.util.ActionMappings; +import org.lamsfoundation.lams.learning.web.util.ActivityMapping; /** * Action class to forward the user to a Tool. @@ -55,13 +55,13 @@ HttpServletRequest request, HttpServletResponse response) { ActivityForm form = (ActivityForm)actionForm; - ActionMappings actionMappings = getActionMappings(); + ActivityMapping actionMappings = getActivityMapping(); LearnerProgress learnerProgress = getLearnerProgress(request, form); Activity activity = getActivity(request, form, learnerProgress); if (!(activity instanceof ToolActivity)) { log.error(className+": activity not ToolActivity"); - return mapping.findForward(ActionMappings.ERROR); + return mapping.findForward(ActivityMapping.ERROR); } ToolActivity toolActivity = (ToolActivity)activity; @@ -71,7 +71,7 @@ response.sendRedirect(url); } catch (java.io.IOException e) { - return mapping.findForward(ActionMappings.ERROR); + return mapping.findForward(ActivityMapping.ERROR); } return null; } Index: lams_learning/src/java/org/lamsfoundation/lams/learning/web/action/SaveNotebookEntry.java =================================================================== diff -u -r3ebc3946a5086e35a6be9a325f9d3207bdb6fdc8 -rec41df86451fb6307b8f9600958646ab4f4774bd --- lams_learning/src/java/org/lamsfoundation/lams/learning/web/action/SaveNotebookEntry.java (.../SaveNotebookEntry.java) (revision 3ebc3946a5086e35a6be9a325f9d3207bdb6fdc8) +++ lams_learning/src/java/org/lamsfoundation/lams/learning/web/action/SaveNotebookEntry.java (.../SaveNotebookEntry.java) (revision ec41df86451fb6307b8f9600958646ab4f4774bd) @@ -29,7 +29,7 @@ import org.apache.struts.action.ActionMapping; import org.lamsfoundation.lams.learning.web.bean.SessionBean; import org.lamsfoundation.lams.learning.web.form.NotebookForm; -import org.lamsfoundation.lams.learning.web.util.ActionMappings; +import org.lamsfoundation.lams.learning.web.util.ActivityMapping; import org.lamsfoundation.lams.notebook.NotebookEntry; import org.lamsfoundation.lams.notebook.service.INotebookService; import org.lamsfoundation.lams.notebook.service.NotebookServiceException; @@ -60,7 +60,7 @@ SessionBean sessionBean = getSessionBean(request); if (sessionBean == null) { // forward to the no session error page - return mapping.findForward(ActionMappings.NO_SESSION_ERROR); + return mapping.findForward(ActivityMapping.NO_SESSION_ERROR); } INotebookService notebookService = NotebookServiceProxy.getNotebookService(this.servlet.getServletContext()); @@ -75,7 +75,7 @@ // check whether user in session has access to update this notebook entry if (!notebookEntry.isUpdateable(sessionBean.getLearner())) { log.error(className+": User with Id "+sessionBean.getLearner().getUserId()+" does not have access to NotebookEntry with Id "+notebookEntry.getNotebookEntryId()); - return mapping.findForward(ActionMappings.NO_ACCESS_ERROR); + return mapping.findForward(ActivityMapping.NO_ACCESS_ERROR); } } @@ -86,7 +86,7 @@ } catch (NotebookServiceException e) { log.error(className+": NootebookServiceException saving notebook entry", e); - return mapping.findForward(ActionMappings.ERROR); + return mapping.findForward(ActivityMapping.ERROR); } return mapping.findForward("displayEntry"); Fisheye: Tag ec41df86451fb6307b8f9600958646ab4f4774bd refers to a dead (removed) revision in file `lams_learning/src/java/org/lamsfoundation/lams/learning/web/util/ActionMappings.java'. Fisheye: No comparison available. Pass `N' to diff? Fisheye: Tag ec41df86451fb6307b8f9600958646ab4f4774bd refers to a dead (removed) revision in file `lams_learning/src/java/org/lamsfoundation/lams/learning/web/util/ActionMappingsWithToolWait.java'. Fisheye: No comparison available. Pass `N' to diff? Index: lams_learning/src/java/org/lamsfoundation/lams/learning/web/util/ActivityMapping.java =================================================================== diff -u --- lams_learning/src/java/org/lamsfoundation/lams/learning/web/util/ActivityMapping.java (revision 0) +++ lams_learning/src/java/org/lamsfoundation/lams/learning/web/util/ActivityMapping.java (revision ec41df86451fb6307b8f9600958646ab4f4774bd) @@ -0,0 +1,291 @@ +/* +Copyright (C) 2005 LAMS Foundation (http://lamsfoundation.org) + +This program is free software; you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation; either version 2 of the License, or +(at your option) any later version. + +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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 +USA + +http://www.gnu.org/licenses/gpl.txt +*/ + +package org.lamsfoundation.lams.learning.web.util; + +import java.io.Serializable; +import java.net.URLEncoder; + +import org.apache.struts.action.ActionForward; +import org.apache.struts.action.ForwardingActionForward; +import org.apache.struts.action.RedirectingActionForward; +import org.lamsfoundation.lams.learningdesign.Activity; +import org.lamsfoundation.lams.learningdesign.ParallelActivity; +import org.lamsfoundation.lams.learningdesign.ToolActivity; +import org.lamsfoundation.lams.lesson.LearnerProgress; +import org.lamsfoundation.lams.tool.Tool; +import org.lamsfoundation.lams.tool.ToolSession; +import org.lamsfoundation.lams.tool.service.ILamsToolService; +import org.lamsfoundation.lams.tool.service.LamsToolServiceException; + +/** + * This class contains the standard struts action mappings for errors as + * well as methods that get required Action/URL to display an Activity or + * LearnerProgress. + * + * In order to return a URL this class needs to know the baseURL. This can + * be set using in the application context. + * + * @author daveg + * + */ +public class ActivityMapping implements Serializable { + + /* These are global struts forwards. */ + public static final String ERROR = "error"; + public static final String NO_SESSION_ERROR = "noSessionError"; + public static final String NO_ACCESS_ERROR = "noAccessError"; + public static final String DOUBLE_SUBMIT_ERROR = "doubleSubmitError"; + + private ActivityMappingStrategy activityMappingStrategy = new ActivityMappingStrategy(); + + private ILamsToolService toolService; + private String baseURL; + + + /** + * Creates a Struts ActionForward to display an activity. + * @param activity, the Activity to be displayed + * @param progress, the LearnerProgress associated with the Activity and learner + */ + public ActionForward getActivityForward(Activity activity, LearnerProgress progress, boolean redirect) { + ActionForward actionForward = null; + + //String strutsAction = getActivityAction(activity, progress); + String strutsAction = this.activityMappingStrategy.getActivityAction(activity, progress); + if (activity instanceof ToolActivity) { + // always use redirect false for a ToolActivity as ToolDisplayActivity + // does it's own redirect + actionForward = strutsActionToForward(strutsAction, activity, false); + } + else { + actionForward = strutsActionToForward(strutsAction, activity, redirect); + } + + return actionForward; + } + + /** + * Creates a Struts ActionForward to display a next activity. If the + * previous activity was a ParallelActivity then the frames will be + * cleared. + * @param progress, the LearnerProgress associated with the Activity and learner + * @param redirect, If true a RedirectActionForward is used + * @return + */ + public ActionForward getProgressForward(LearnerProgress progress, boolean redirect) { + ActionForward actionForward = null; + + // TODO: lesson complete client request to clear frames + if (progress.isLessonComplete()) { + // If lesson complete forward to lesson complete action. This action will + // cause a client request to clear ALL frames. + String strutsAction = this.getActivityMappingStrategy().getLessonCompleteAction(); + actionForward = this.strutsActionToForward(strutsAction, null, redirect); + } + else { + Activity nextActivity = progress.getNextActivity(); + Activity previousActivity = progress.getPreviousActivity(); + Activity currentActivity = progress.getCurrentActivity(); + + if (progress.isParallelWaiting()) { + // progress is waiting, goto waiting page + String strutsAction = this.getActivityMappingStrategy().getWaitingAction(); + actionForward = this.strutsActionToForward(strutsAction, null, redirect); + } + else { + // display next activity + if (previousActivity instanceof ParallelActivity) { + // if previous activity was a parallel activity then we need to + // clear frames. + String strutsAction = "/requestDisplay.do"; + String activityURL = this.getActivityURL(nextActivity, progress); + strutsAction += "?url="+activityURL; + actionForward = strutsActionToForward(strutsAction, null, redirect); + } + else { + actionForward = getActivityForward(nextActivity, progress, redirect); + } + } + } + + return actionForward; + } + + /** + * Generates an ActivityURL for an Activity using it's progress. The URL is for + * the client and so includes hostname etc. + * Note that the URL could also be a wait message or a jsp to clear the frames. + * @param activity, the Activity to be displayed + * @param progress, the LearnerProgress associated with the Activity and learner + */ + public String getActivityURL(Activity activity, LearnerProgress progress) { + String activityURL = null; + + if (activity instanceof ToolActivity) { + activityURL = getToolURL((ToolActivity)activity, progress); + } + else { + // use LAMS action + String strutsAction = null; + strutsAction = this.activityMappingStrategy.getActivityAction(activity, progress); + activityURL = strutsActionToURL(strutsAction, activity, true); + } + + return activityURL; + } + + /** + * Generates an ActivityURL for the next Activity using it's progress. The URL + * is for the client and so includes hostname etc. + * Note that this method always returns a LAMS URLs, if a ToolActivity is next + * the URL will be the action for displaying the tool. + * Note that the URL could also be a wait message or a jsp to clear the frames. + * @param progress, the current LearnerProgress. + */ + public String getProgressURL(LearnerProgress progress) { + String activityURL = null; + + // TODO: lesson complete + if (progress.isLessonComplete()) { + // If lesson complete forward to lesson complete action. This action will + // cause a client request to clear ALL frames. + String strutsAction = this.getActivityMappingStrategy().getLessonCompleteAction(); + activityURL = strutsActionToURL(strutsAction, null, true); + } + else { + Activity nextActivity = progress.getNextActivity(); + Activity previousActivity = progress.getPreviousActivity(); + Activity currentActivity = progress.getCurrentActivity(); + + if (progress.isParallelWaiting()) { + // progress is waiting, goto waiting page + String strutsAction = this.getActivityMappingStrategy().getWaitingAction(); + activityURL = strutsActionToURL(strutsAction, null, true); + } + else { + // display next activity + activityURL = this.getActivityURL(nextActivity, progress); + if (previousActivity instanceof ParallelActivity) { + // if previous activity was a parallel activity then we need to + // clear frames. + String strutsAction = "/requestDisplay.do"; + String redirectURL = strutsActionToURL(strutsAction, null, true); + activityURL = URLEncoder.encode(activityURL); + activityURL = redirectURL+"?url="+activityURL; + } + } + } + + return activityURL; + } + + + /** + * Generates an ActivityURL for a Tool Activity. The URL is for the tool and + * not for the tool loading page. The URL also includes toolSessionId and all + * other required data. + * @param activity, the ToolActivity to be displayed + * @param progress, the current LearnerProgress, used to get activity status + */ + public String getToolURL(ToolActivity activity, LearnerProgress progress) { + Tool tool = activity.getTool(); + String url = tool.getLearnerUrl(); + + ToolSession toolSession; + try { + // Get tool session using learner and activity + toolSession = toolService.getToolSession(progress.getUser(), activity); + } + catch (LamsToolServiceException e) { + // TODO: should throw exception here + return null; + } + + // Append toolSessionId to tool URL + Long toolSessionId = toolSession.getToolSessionId(); + url += "?toolSessionId="+toolSessionId; + + return url; + } + + + /** + * Creates a URL for a struts action and an activity. + * @param strutsAction, the struts action path. + * @param activity, the activity the action is for. + * @param useContext, if true prepends the server and context to the URL. + */ + protected String strutsActionToURL(String strutsAction, Activity activity, boolean useContext) { + String url = strutsAction; + + if (activity != null) { + String query = "?activityId="+activity.getActivityId(); + url += query; + } + if (useContext) { + String lamsUrl = getLamsURL(); + url = lamsUrl+url; + } + + return url; + } + + private String getLamsURL() { + return baseURL; + } + + /** + * Creates a Struts ActionForward for an action and activity. + * @param strutsAction, the struts action + * @param activity, activity that is being displayed + * @param redirect, should the action be a client redirect + * @return + */ + protected ActionForward strutsActionToForward(String strutsAction, Activity activity, boolean redirect) { + ActionForward actionForward; + if (redirect) { + String activityURL = strutsActionToURL(strutsAction, activity, false); + actionForward = new RedirectingActionForward(activityURL); + } + else { + actionForward = new ForwardingActionForward(strutsAction); + } + + return actionForward; + } + + public void setToolService(ILamsToolService toolService) { + this.toolService = toolService; + } + + public void setBaseURL(String baseURL) { + this.baseURL = baseURL; + } + + public ActivityMappingStrategy getActivityMappingStrategy() { + return activityMappingStrategy; + } + + public void setActivityMappingStrategy(ActivityMappingStrategy activityMappingStrategy) { + this.activityMappingStrategy = activityMappingStrategy; + } +} Index: lams_learning/src/java/org/lamsfoundation/lams/learning/web/util/ActivityMappingStrategy.java =================================================================== diff -u --- lams_learning/src/java/org/lamsfoundation/lams/learning/web/util/ActivityMappingStrategy.java (revision 0) +++ lams_learning/src/java/org/lamsfoundation/lams/learning/web/util/ActivityMappingStrategy.java (revision ec41df86451fb6307b8f9600958646ab4f4774bd) @@ -0,0 +1,89 @@ +/* +Copyright (C) 2005 LAMS Foundation (http://lamsfoundation.org) + +This program is free software; you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation; either version 2 of the License, or +(at your option) any later version. + +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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 +USA + +http://www.gnu.org/licenses/gpl.txt +*/ + +package org.lamsfoundation.lams.learning.web.util; + +import java.io.Serializable; + +import org.lamsfoundation.lams.learningdesign.Activity; +import org.lamsfoundation.lams.learningdesign.ComplexActivity; +import org.lamsfoundation.lams.learningdesign.GateActivity; +import org.lamsfoundation.lams.learningdesign.GroupingActivity; +import org.lamsfoundation.lams.learningdesign.OptionsActivity; +import org.lamsfoundation.lams.learningdesign.ParallelActivity; +import org.lamsfoundation.lams.learningdesign.SimpleActivity; +import org.lamsfoundation.lams.learningdesign.ToolActivity; +import org.lamsfoundation.lams.lesson.LearnerProgress; + +/** + * @author daveg + * + */ +public class ActivityMappingStrategy implements Serializable { + + /** + * Returns the struts action used to display the specified activity. + * @param activity, Activity to be displayed + * @param progress, LearnerProgress for the activity, used to check activity status + * @return String representing a struts action + */ + protected String getActivityAction(Activity activity, LearnerProgress progress) { + String strutsAction = null; + + if (activity instanceof ComplexActivity) { + if (activity instanceof ParallelActivity) { + strutsAction = "/DisplayParallelActivity.do"; + } + else if (activity instanceof OptionsActivity) { + strutsAction = "/DisplayOptionsActivity.do"; + } + } + else if (activity instanceof SimpleActivity) { + if (activity instanceof GroupingActivity) { + // this probably means a wait URL + } + if (activity instanceof GateActivity) { + // not completed so return wait URL + } + if (activity instanceof ToolActivity) { + // get tool URL + //strutsAction = "/DisplayLoadToolActivity.do"; + strutsAction = "/DisplayToolActivity.do"; + } + } + return strutsAction; + } + + /** + * Returns the struts action for displaying the parallel wait. + */ + protected String getWaitingAction() { + return "/parallelWait.do"; + } + + /** + * Returns the struts action for displaying lesson complete. + */ + protected String getLessonCompleteAction() { + return "/lessonComplete.do"; + } + +} Index: lams_learning/src/java/org/lamsfoundation/lams/learning/web/util/ParallelActivityMappingStrategy.java =================================================================== diff -u --- lams_learning/src/java/org/lamsfoundation/lams/learning/web/util/ParallelActivityMappingStrategy.java (revision 0) +++ lams_learning/src/java/org/lamsfoundation/lams/learning/web/util/ParallelActivityMappingStrategy.java (revision ec41df86451fb6307b8f9600958646ab4f4774bd) @@ -0,0 +1,60 @@ +/* +Copyright (C) 2005 LAMS Foundation (http://lamsfoundation.org) + +This program is free software; you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation; either version 2 of the License, or +(at your option) any later version. + +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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 +USA + +http://www.gnu.org/licenses/gpl.txt +*/ + +package org.lamsfoundation.lams.learning.web.util; + +import org.lamsfoundation.lams.learningdesign.Activity; +import org.lamsfoundation.lams.learningdesign.ComplexActivity; +import org.lamsfoundation.lams.learningdesign.GateActivity; +import org.lamsfoundation.lams.learningdesign.GroupingActivity; +import org.lamsfoundation.lams.learningdesign.NullActivity; +import org.lamsfoundation.lams.learningdesign.OptionsActivity; +import org.lamsfoundation.lams.learningdesign.ParallelActivity; +import org.lamsfoundation.lams.learningdesign.SimpleActivity; +import org.lamsfoundation.lams.learningdesign.ToolActivity; +import org.lamsfoundation.lams.lesson.LearnerProgress; +import org.lamsfoundation.lams.lesson.LessonCompleteActivity; +import org.lamsfoundation.lams.lesson.ParallelWaitActivity; + +/** + * @author daveg + * + */ +public class ParallelActivityMappingStrategy extends ActivityMappingStrategy { + + /** + * Returns the struts action used to display the specified activity. + * @param activity, Activity to be displayed + * @param progress, LearnerProgress for the activity, used to check activity status + * @return String representing a struts action + */ + protected String getActivityAction(Activity activity, LearnerProgress progress) { + String strutsAction = null; + if (progress.getProgressState(activity) == LearnerProgress.ACTIVITY_COMPLETED) { + strutsAction = "/parallelWait.do"; + } + else { + strutsAction = super.getActivityAction(activity, progress); + } + return strutsAction; + } + +} Index: lams_learning/test/java/org/lamsfoundation/lams/learning/web/action/DummyToolAction.java =================================================================== diff -u -r36c2ed010b8a3893b895d781be1a219f2380e62d -rec41df86451fb6307b8f9600958646ab4f4774bd --- lams_learning/test/java/org/lamsfoundation/lams/learning/web/action/DummyToolAction.java (.../DummyToolAction.java) (revision 36c2ed010b8a3893b895d781be1a219f2380e62d) +++ lams_learning/test/java/org/lamsfoundation/lams/learning/web/action/DummyToolAction.java (.../DummyToolAction.java) (revision ec41df86451fb6307b8f9600958646ab4f4774bd) @@ -33,8 +33,8 @@ import org.lamsfoundation.lams.learning.service.LearnerServiceProxy; import org.lamsfoundation.lams.learning.service.DummyLearnerService; import org.lamsfoundation.lams.learning.web.form.DummyToolForm; -import org.lamsfoundation.lams.learning.web.util.ActionMappings; -import org.lamsfoundation.lams.learning.web.util.ActionMappingsWithToolWait; +import org.lamsfoundation.lams.learning.web.util.ActivityMapping; +import org.lamsfoundation.lams.learning.web.util.ActivityMappingWithToolWait; /**