Index: lams_learning/src/java/org/lamsfoundation/lams/learning/service/ILearnerService.java =================================================================== diff -u -rfdfe33f9febbb6d1b96a2f84b6902f7f8f628ad9 -r715f8fde307b93cafb4b879577610d159684aaf6 --- lams_learning/src/java/org/lamsfoundation/lams/learning/service/ILearnerService.java (.../ILearnerService.java) (revision fdfe33f9febbb6d1b96a2f84b6902f7f8f628ad9) +++ lams_learning/src/java/org/lamsfoundation/lams/learning/service/ILearnerService.java (.../ILearnerService.java) (revision 715f8fde307b93cafb4b879577610d159684aaf6) @@ -117,7 +117,7 @@ * @param lesson the lesson this learner is currently in. * @return the url for next activity. */ - public String completelActivity(User learner,Activity activity,Lesson lesson); + public String completeActivity(User learner,Activity activity,Lesson lesson); /** * Retrieve all lessons that has been started, suspended or finished. All Index: lams_learning/src/java/org/lamsfoundation/lams/learning/service/LearnerService.java =================================================================== diff -u -rfdfe33f9febbb6d1b96a2f84b6902f7f8f628ad9 -r715f8fde307b93cafb4b879577610d159684aaf6 --- lams_learning/src/java/org/lamsfoundation/lams/learning/service/LearnerService.java (.../LearnerService.java) (revision fdfe33f9febbb6d1b96a2f84b6902f7f8f628ad9) +++ lams_learning/src/java/org/lamsfoundation/lams/learning/service/LearnerService.java (.../LearnerService.java) (revision 715f8fde307b93cafb4b879577610d159684aaf6) @@ -291,13 +291,13 @@ lamsCoreToolService.updateToolSession(toolSession); - return completelActivity(learner, toolSession.getToolActivity(), toolSession.getLesson()); + return completeActivity(learner, toolSession.getToolActivity(), toolSession.getLesson()); } /** - * @see org.lamsfoundation.lams.learning.service.ILearnerService#completelActivity(org.lamsfoundation.lams.usermanagement.User, org.lamsfoundation.lams.learningdesign.Activity, org.lamsfoundation.lams.lesson.Lesson) + * @see org.lamsfoundation.lams.learning.service.ILearnerService#completeActivity(org.lamsfoundation.lams.usermanagement.User, org.lamsfoundation.lams.learningdesign.Activity, org.lamsfoundation.lams.lesson.Lesson) */ - public String completelActivity(User learner,Activity activity,Lesson lesson) + public String completeActivity(User learner,Activity activity,Lesson lesson) { //build up the url for next activity. try Index: lams_learning/src/java/org/lamsfoundation/lams/learning/web/action/GateAction.java =================================================================== diff -u -rfdfe33f9febbb6d1b96a2f84b6902f7f8f628ad9 -r715f8fde307b93cafb4b879577610d159684aaf6 --- lams_learning/src/java/org/lamsfoundation/lams/learning/web/action/GateAction.java (.../GateAction.java) (revision fdfe33f9febbb6d1b96a2f84b6902f7f8f628ad9) +++ lams_learning/src/java/org/lamsfoundation/lams/learning/web/action/GateAction.java (.../GateAction.java) (revision 715f8fde307b93cafb4b879577610d159684aaf6) @@ -23,6 +23,7 @@ package org.lamsfoundation.lams.learning.web.action; import java.io.IOException; +import java.util.List; import javax.servlet.ServletException; import javax.servlet.http.HttpServletRequest; @@ -32,27 +33,41 @@ import org.apache.struts.action.ActionForm; import org.apache.struts.action.ActionForward; import org.apache.struts.action.ActionMapping; +import org.lamsfoundation.lams.learning.service.ILearnerService; +import org.lamsfoundation.lams.learning.service.LearnerServiceException; +import org.lamsfoundation.lams.learning.service.LearnerServiceProxy; +import org.lamsfoundation.lams.learning.web.util.LearningWebUtil; +import org.lamsfoundation.lams.learning.web.util.LessonLearnerDataManager; +import org.lamsfoundation.lams.learningdesign.GateActivity; +import org.lamsfoundation.lams.lesson.LearnerProgress; import org.lamsfoundation.lams.web.action.LamsDispatchAction; /** + *
The action servlet that deals with gate activity. This class allows the + * learner to knock gate when they reach the gate. The knocking process will + * be triggered by the lams progress engine in the first place. The learner + * can also trigger the knocking process by clicking on the button on the + * waiting page.
* + *Learner will progress to the next activity if the gate is open. Otherwise, + * the learner should see the waiting page.
+ * * @author Jacky Fang * @since 2005-4-7 * @version 1.1 * * ----------------XDoclet Tags-------------------- * - * @struts:action name = "GroupingForm" - * path="/grouping" + * @struts:action path="/gate" * parameter="method" * validate="false" * @struts.action-exception key="error.system.learner" scope="request" * type="org.lamsfoundation.lams.learning.service.LearnerServiceException" * path=".systemError" * handler="org.lamsfoundation.lams.util.CustomStrutsExceptionHandler" - * @struts:action-forward name="viewGrouping" path="/grouping.do?method=viewGrouping" - * @struts:action-forward name="showGroup" path=".grouping" + * + * @struts:action-forward name="waiting" path=".gateWaiting" * ----------------XDoclet Tags-------------------- */ public class GateAction extends LamsDispatchAction @@ -63,11 +78,14 @@ //--------------------------------------------------------------------- private static Logger log = Logger.getLogger(GateAction.class); + //--------------------------------------------------------------------- + // Class level constants - Struts forward + //--------------------------------------------------------------------- + private static final String WAITING = "waiting"; //--------------------------------------------------------------------- // Struts Dispatch Method //--------------------------------------------------------------------- - /** * * @param mapping @@ -78,12 +96,65 @@ * @throws IOException * @throws ServletException */ - public ActionForward checkUpGate(ActionMapping mapping, - ActionForm form, - HttpServletRequest request, - HttpServletResponse response) throws IOException, + public ActionForward knockGate(ActionMapping mapping, + ActionForm form, + HttpServletRequest request, + HttpServletResponse response) throws IOException, ServletException { - return mapping.findForward(null); + LearnerProgress learnerProgress = LearningWebUtil.getLearnerProgressByID(request, + getServlet().getServletContext()); + //validate pre-condition. + validateLearnerProgress(learnerProgress); + + //initialize service object + ILearnerService learnerService = LearnerServiceProxy.getLearnerService(getServlet().getServletContext()); + //get all learners in the lesson + List currentLessonLearners = LessonLearnerDataManager.getAllLessonLearners(getServlet().getServletContext(), + learnerProgress.getLesson().getLessonId().longValue(), + learnerService); + //knock the gate + boolean gateOpen = learnerService.knockGate((GateActivity)learnerProgress.getNextActivity(), + learnerProgress.getUser(), + currentLessonLearners); + //if the gate is open, let the learner go to the next activity. + if(gateOpen) + { + String nextActivityUrl = learnerService.completeActivity(learnerProgress.getUser(), + learnerProgress.getNextActivity(), + learnerProgress.getLesson()); + response.sendRedirect(nextActivityUrl); + return null; + } + //if the gate is closed, ask the learner to wait + else + return mapping.findForward(WAITING); } + + //--------------------------------------------------------------------- + // Helper method + //--------------------------------------------------------------------- + /** + * @param learnerProgress + */ + private void validateLearnerProgress(LearnerProgress learnerProgress) + { + if(learnerProgress ==null) + throw new LearnerServiceException("Can't perform grouping without knowing" + + " the learner progress."); + + if(!isNextActivityValid(learnerProgress)) + throw new LearnerServiceException("Error in progress engine. Getting " + +learnerProgress.getNextActivity().toString() + +" where it should be grouping activity"); + } + + /** + * @param learnerProgress + * @return + */ + private boolean isNextActivityValid(LearnerProgress learnerProgress) + { + return learnerProgress.getNextActivity()!=null&&(learnerProgress.getNextActivity() instanceof GateActivity); + } } Index: lams_learning/src/java/org/lamsfoundation/lams/learning/web/action/GroupingAction.java =================================================================== diff -u -r1ac030743cfd5c1a1479311197a02821dbc85cbc -r715f8fde307b93cafb4b879577610d159684aaf6 --- lams_learning/src/java/org/lamsfoundation/lams/learning/web/action/GroupingAction.java (.../GroupingAction.java) (revision 1ac030743cfd5c1a1479311197a02821dbc85cbc) +++ lams_learning/src/java/org/lamsfoundation/lams/learning/web/action/GroupingAction.java (.../GroupingAction.java) (revision 715f8fde307b93cafb4b879577610d159684aaf6) @@ -194,7 +194,7 @@ Activity groupingActivity = LearningWebUtil.getActivityFromRequest(request,learnerService); - String nextActivityUrl = learnerService.completelActivity(learnerProgress.getUser(), + String nextActivityUrl = learnerService.completeActivity(learnerProgress.getUser(), groupingActivity, learnerProgress.getLesson()); Index: lams_learning/test/java/org/lamsfoundation/lams/learning/web/action/TestGateAction.java =================================================================== diff -u --- lams_learning/test/java/org/lamsfoundation/lams/learning/web/action/TestGateAction.java (revision 0) +++ lams_learning/test/java/org/lamsfoundation/lams/learning/web/action/TestGateAction.java (revision 715f8fde307b93cafb4b879577610d159684aaf6) @@ -0,0 +1,159 @@ +/*************************************************************************** + * 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.action; + +import org.apache.log4j.Logger; +import org.lamsfoundation.lams.AbstractLamsStrutsTestCase; +import org.lamsfoundation.lams.learning.service.ILearnerService; +import org.lamsfoundation.lams.learning.web.util.LearningWebUtil; +import org.lamsfoundation.lams.learning.web.util.LessonLearnerDataManager; +import org.lamsfoundation.lams.learningdesign.Activity; +import org.lamsfoundation.lams.lesson.LearnerProgress; +import org.lamsfoundation.lams.lesson.Lesson; +import org.lamsfoundation.lams.usermanagement.User; + + +/** + * + * @author Jacky Fang + * @since 2005-4-7 + * @version 1.1 + * + */ +public class TestGateAction extends AbstractLamsStrutsTestCase +{ + //--------------------------------------------------------------------- + // Instance variables + //--------------------------------------------------------------------- + private static Logger log = Logger.getLogger(TestGateAction.class); + + private static final String TEST_LERNER_PROGRESS_ID = "1"; + private static final String TEST_LEARNER_ID = "2"; + private static final String TEST_LESSON_ID = "2"; + + private ILearnerService learnerService; + + private static final String TEST_GATE_ACTIVITY_ID = "31"; + /** + * Constructor for TestGateAction. + * @param testName + */ + public TestGateAction(String testName) + { + super(testName,getContextConfigLocation()); + } + /** + * @see org.lamsfoundation.lams.AbstractLamsStrutsTestCase#getContextConfigLocation() + */ + private static String getContextConfigLocation() + { + return "/org/lamsfoundation/lams/lesson/lessonApplicationContext.xml " + +"/org/lamsfoundation/lams/tool/toolApplicationContext.xml " + +"/org/lamsfoundation/lams/learningdesign/learningDesignApplicationContext.xml " + +"/WEB-INF/spring/applicationContext.xml " + +"/WEB-INF/spring/learningApplicationContext.xml"; + } + + /* + * @see AbstractLamsStrutsTestCase#setUp() + */ + protected void setUp() throws Exception + { + super.setUp(); + setConfigFile("/WEB-INF/struts/struts-config.xml"); + setRequestPathInfo("/gate.do"); + + learnerService = (ILearnerService)this.wac.getBean("learnerService"); + } + + /* + * @see AbstractLamsStrutsTestCase#tearDown() + */ + protected void tearDown() throws Exception + { + super.tearDown(); + } + + public void testKnockClosedGate() + { + addRequestParameter("method", "knockGate"); + addRequestParameter(LearningWebUtil.PARAM_PROGRESS_ID,TEST_LERNER_PROGRESS_ID); + addRequestParameter(LearningWebUtil.PARAM_USER_ID, TEST_LEARNER_ID); + addRequestParameter(LearningWebUtil.PARAM_ACTIVITY_ID,TEST_GATE_ACTIVITY_ID); + addRequestParameter(LearningWebUtil.PARAM_LESSON_ID, TEST_LESSON_ID); + + initializeLearnerProgress(); + initializeUserMap(false); + + actionPerform(); + + verifyNoActionErrors(); + verifyTilesForward("waiting",".gateWaiting"); + } + + public void testKnockOpenGate() + { + addRequestParameter("method", "knockGate"); + addRequestParameter(LearningWebUtil.PARAM_PROGRESS_ID,TEST_LERNER_PROGRESS_ID); + addRequestParameter(LearningWebUtil.PARAM_USER_ID, TEST_LEARNER_ID); + addRequestParameter(LearningWebUtil.PARAM_ACTIVITY_ID,TEST_GATE_ACTIVITY_ID); + addRequestParameter(LearningWebUtil.PARAM_LESSON_ID, TEST_LESSON_ID); + + initializeLearnerProgress(); + initializeUserMap(true); + + actionPerform(); + + verifyNoActionErrors(); + + } + /** + * + */ + private void initializeLearnerProgress() + { + Activity activity = LearningWebUtil.getActivityFromRequest(request,learnerService); + LearnerProgress learnerProgress = LearningWebUtil.getLearnerProgressByID(request,context); + learnerProgress.setNextActivity(activity); + httpSession.setAttribute(ActivityAction.LEARNER_PROGRESS_REQUEST_ATTRIBUTE, + learnerProgress); + } + /** + * + */ + private void initializeUserMap(boolean singleUser) + { + User testUser = LearningWebUtil.getUserData(request,context); + Lesson lesson = LearningWebUtil.getLessonData(request,context); + LessonLearnerDataManager.cacheLessonUser(context,lesson,testUser); + + if(!singleUser) + { + request.getSession().removeAttribute("user"); + addRequestParameter(LearningWebUtil.PARAM_USER_ID, "1"); + User testUser2 = LearningWebUtil.getUserData(request,context); + LessonLearnerDataManager.cacheLessonUser(context,lesson,testUser2); + } + + } +} Index: lams_learning/test/java/org/lamsfoundation/lams/learning/web/action/TestGroupingAction.java =================================================================== diff -u -r1ac030743cfd5c1a1479311197a02821dbc85cbc -r715f8fde307b93cafb4b879577610d159684aaf6 --- lams_learning/test/java/org/lamsfoundation/lams/learning/web/action/TestGroupingAction.java (.../TestGroupingAction.java) (revision 1ac030743cfd5c1a1479311197a02821dbc85cbc) +++ lams_learning/test/java/org/lamsfoundation/lams/learning/web/action/TestGroupingAction.java (.../TestGroupingAction.java) (revision 715f8fde307b93cafb4b879577610d159684aaf6) @@ -46,7 +46,7 @@ { private static final String TEST_LERNER_PROGRESS_ID = "1"; - private static final String TEST_RGRP_ACTIVITY_ID = "28"; + private static final String TEST_RGRP_ACTIVITY_ID = "29"; private static final String TEST_LEARNER_ID = "2"; private static final String TEST_LESSON_ID = "2"; private static Activity groupingActivity; @@ -103,7 +103,6 @@ initializeUserMap(); - actionPerform(); verifyNoActionErrors(); Index: lams_learning/test/java/org/lamsfoundation/lams/learning/web/action/TestLearnerAction.java =================================================================== diff -u -r06dd563d92f6e9e88c76b708f5d9aeb3a61d4dcb -r715f8fde307b93cafb4b879577610d159684aaf6 --- lams_learning/test/java/org/lamsfoundation/lams/learning/web/action/TestLearnerAction.java (.../TestLearnerAction.java) (revision 06dd563d92f6e9e88c76b708f5d9aeb3a61d4dcb) +++ lams_learning/test/java/org/lamsfoundation/lams/learning/web/action/TestLearnerAction.java (.../TestLearnerAction.java) (revision 715f8fde307b93cafb4b879577610d159684aaf6) @@ -44,7 +44,7 @@ private static final String TEST_USER_ID = "2"; private static final String TEST_LESSON_ID = "2"; - private static final String TEST_ACTIVITY_ID = "26"; + private static final String TEST_ACTIVITY_ID = "27"; //private static SessionBean joinedLessonBean = null; private static LearnerProgress testLearnerProgress = null; Index: lams_learning/test/web/WEB-INF/struts/struts-config.xml =================================================================== diff -u -rccf8e0ceeba756591580b17142823a8eba4d773c -r715f8fde307b93cafb4b879577610d159684aaf6 --- lams_learning/test/web/WEB-INF/struts/struts-config.xml (.../struts-config.xml) (revision ccf8e0ceeba756591580b17142823a8eba4d773c) +++ lams_learning/test/web/WEB-INF/struts/struts-config.xml (.../struts-config.xml) (revision 715f8fde307b93cafb4b879577610d159684aaf6) @@ -50,7 +50,8 @@ http://www.gnu.org/licenses/gpl.txt --> - +