Index: lams_learning/lib/lams/lams.jar =================================================================== diff -u -red8afe78a454a4b3b9d2ae039ac12d7ad9dc809a -r32e9a495b2ccacfc4febc13648d255f466742a03 Binary files differ Index: lams_learning/src/java/org/lamsfoundation/lams/learning/web/action/LearnerAction.java =================================================================== diff -u -red8afe78a454a4b3b9d2ae039ac12d7ad9dc809a -r32e9a495b2ccacfc4febc13648d255f466742a03 --- lams_learning/src/java/org/lamsfoundation/lams/learning/web/action/LearnerAction.java (.../LearnerAction.java) (revision ed8afe78a454a4b3b9d2ae039ac12d7ad9dc809a) +++ lams_learning/src/java/org/lamsfoundation/lams/learning/web/action/LearnerAction.java (.../LearnerAction.java) (revision 32e9a495b2ccacfc4febc13648d255f466742a03) @@ -34,12 +34,13 @@ import org.lamsfoundation.lams.learning.service.ILearnerService; import org.lamsfoundation.lams.learning.service.LearnerServiceProxy; import org.lamsfoundation.lams.learning.web.bean.SessionBean; +import org.lamsfoundation.lams.learning.web.util.LearningWebUtil; import org.lamsfoundation.lams.lesson.LearnerProgress; import org.lamsfoundation.lams.lesson.Lesson; import org.lamsfoundation.lams.lesson.dto.LessonDTO; import org.lamsfoundation.lams.usermanagement.User; -import org.lamsfoundation.lams.util.WebUtil; + import org.lamsfoundation.lams.util.wddx.FlashMessage; import org.lamsfoundation.lams.util.wddx.WDDXProcessor; import org.lamsfoundation.lams.web.action.LamsDispatchAction; @@ -72,6 +73,7 @@ * path=".systemError" * handler="org.lamsfoundation.lams.util.CustomStrutsExceptionHandler" * @struts:action-forward name="displayActivity" path="/DisplayActivity.do" + * @struts:action-forward name="welcome" path=".welcome" * * ----------------XDoclet Tags-------------------- * @@ -82,20 +84,15 @@ // Instance variables //--------------------------------------------------------------------- private static Logger log = Logger.getLogger(LearnerAction.class); - - //--------------------------------------------------------------------- - // Class level constants - session attributes - //--------------------------------------------------------------------- private static final String PARAM_USER_ID = "userId"; private static final String PARAM_LESSON_ID = "lessonId"; private static final String ATTR_USERDATA = "user"; - //private static final String PARAM_LEARNER_PROGRESS="?learnerProgressId="; //--------------------------------------------------------------------- // Class level constants - Struts forward //--------------------------------------------------------------------- private static final String DISPLAY_ACTIVITY = "displayActivity"; - + private static final String WELCOME = "welcome"; /** *
The Struts dispatch method that retrieves all active lessons for a * requested user from flash. The returned is structured as dto format @@ -124,7 +121,7 @@ ILearnerService learnerService = LearnerServiceProxy.getLearnerService(getServlet().getServletContext()); //get learner. - User learner = getUserData(request); + User learner = LearningWebUtil.getUserData(request, getServlet().getServletContext()); if(log.isDebugEnabled()) log.debug("Getting active lessons for leaner:"+learner.getFullName()+"["+learner.getUserId()+"]"); @@ -169,13 +166,14 @@ ILearnerService learnerService = LearnerServiceProxy.getLearnerService(getServlet().getServletContext()); //get user and lesson based on request. - User learner = getUserData(request); - long lessonId = WebUtil.readLongParam(request,PARAM_LESSON_ID); - Lesson lesson = learnerService.getLesson(new Long(lessonId)); + User learner = LearningWebUtil.getUserData(request, getServlet().getServletContext()); + Lesson lesson = LearningWebUtil.getLessonData(request,getServlet().getServletContext()); + + if(log.isDebugEnabled()) log.debug("The learner ["+learner.getUserId()+"],["+learner.getFullName() - +"is joining the lesson ["+lessonId+"],["+lesson.getLessonName()+"]"); + +"is joining the lesson ["+lesson.getLessonId()+"],["+lesson.getLessonName()+"]"); //join user to the lesson on the server LearnerProgress learnerProgress = learnerService.joinLesson(learner,lesson); @@ -203,6 +201,8 @@ return null; } + + /** *
Exit the current lesson that is running in the leaner window. It * expects lesson id passed as parameter from flash component. @@ -226,8 +226,27 @@ HttpServletResponse response) throws IOException, ServletException { + if(log.isDebugEnabled()) + log.debug("Exiting lesson..."); + + //initialize service object + ILearnerService learnerService = LearnerServiceProxy.getLearnerService(getServlet().getServletContext()); + + SessionBean sessionBean = LearningWebUtil.getSessionBean(request,getServlet().getServletContext()); - return null; + if(log.isDebugEnabled()) + log.debug("Lesson id is: "+sessionBean.getLesson().getLessonId()); + + learnerService.exitLesson(sessionBean.getLearnerProgress()); + + //send acknowledgment to flash as it is triggerred by flash + String lessonExitted = WDDXProcessor.serialize(new FlashMessage("exitLesson",null)); + if(log.isDebugEnabled()) + log.debug("Sending Exit Lesson acknowledge message to flash:"+lessonExitted); + response.getWriter().print(lessonExitted); + + //forward to welcome page + return mapping.findForward(WELCOME); } /** @@ -260,41 +279,48 @@ HttpServletResponse response) throws IOException, ServletException { + if(log.isDebugEnabled()) + log.debug("Getting Flash progress data..."); + SessionBean sessionBean = LearningWebUtil.getSessionBean(request,getServlet().getServletContext()); + + String progressData = WDDXProcessor.serialize(new FlashMessage("getFlashProgressData", + sessionBean.getLearnerProgress().getLearnerProgressData())); + + if(log.isDebugEnabled()) + log.debug("Sending learner progress data to flash:"+progressData); + response.getWriter().print(progressData); + + //don't need to return a action forward because it sent the wddx packet + //back already. return null; } - - - + /** - * Helper method to retrieve the user data. We always load up from http - * session first to optimize the performance. If no session cache available, - * we load it from data source. + *
The struts dispatch action to view the activity. This will be called + * by flash progress bar to check up the activity component. The lams side + * will calculate the url and send a flash message back to the + * flash component.
+ * + * @param mapping An ActionMapping class that will be used by the Action class to tell + * the ActionServlet where to send the end-user. + * + * @param form The ActionForm class that will contain any data submitted + * by the end-user via a form. * @param request A standard Servlet HttpServletRequest class. - * @param surveyService the service facade of survey tool - * @return the user data value object + * @param response A standard Servlet HttpServletResponse class. + * @return An ActionForward class that will be returned to the ActionServlet indicating where + * the user is to go next. + * @throws IOException + * @throws ServletException */ - private User getUserData(HttpServletRequest request) + public ActionForward getLearnerActivityURL(ActionMapping mapping, + ActionForm form, + HttpServletRequest request, + HttpServletResponse response) throws IOException, + ServletException { - //retrieve complete user data from http session - User currentUser = (User) request.getSession() - .getAttribute(ATTR_USERDATA); - if(log.isDebugEnabled()&¤tUser!=null) - log.debug("user retrieved from http session:"+currentUser.getUserId()); - //if no session cache available, retrieve it from data source - if (currentUser == null) - { - int userId = WebUtil.readIntParam(request,PARAM_USER_ID); - currentUser = LearnerServiceProxy.getUserManagementService(getServlet().getServletContext()) - .getUserById(new Integer(userId)); - if(log.isDebugEnabled()&¤tUser!=null) - log.debug("user retrieved from database:"+currentUser.getUserId()); - - //create session cache - request.getSession().setAttribute(ATTR_USERDATA, currentUser); - } - return currentUser; + return null; } - } \ No newline at end of file Index: lams_learning/src/java/org/lamsfoundation/lams/learning/web/util/LearningWebUtil.java =================================================================== diff -u --- lams_learning/src/java/org/lamsfoundation/lams/learning/web/util/LearningWebUtil.java (revision 0) +++ lams_learning/src/java/org/lamsfoundation/lams/learning/web/util/LearningWebUtil.java (revision 32e9a495b2ccacfc4febc13648d255f466742a03) @@ -0,0 +1,131 @@ +/*************************************************************************** + * 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 javax.servlet.ServletContext; +import javax.servlet.http.HttpServletRequest; + +import org.apache.log4j.Logger; +import org.lamsfoundation.lams.learning.service.ILearnerService; +import org.lamsfoundation.lams.learning.service.LearnerServiceProxy; +import org.lamsfoundation.lams.learning.web.bean.SessionBean; +import org.lamsfoundation.lams.lesson.LearnerProgress; +import org.lamsfoundation.lams.lesson.Lesson; +import org.lamsfoundation.lams.usermanagement.User; +import org.lamsfoundation.lams.util.WebUtil; + + +/** + * + * @author Jacky Fang + * @since 2005-3-10 + * @version + * + */ +public class LearningWebUtil +{ + + private static Logger log = Logger.getLogger(LearningWebUtil.class); + //--------------------------------------------------------------------- + // Class level constants - session attributes + //--------------------------------------------------------------------- + private static final String PARAM_USER_ID = "userId"; + private static final String PARAM_LESSON_ID = "lessonId"; + private static final String ATTR_USERDATA = "user"; + + /** + * Helper method to retrieve the user data. We always load up from http + * session first to optimize the performance. If no session cache available, + * we load it from data source. + * @param request A standard Servlet HttpServletRequest class. + * @param servletContext the servlet container that has all resources + * @param surveyService the service facade of survey tool + * @return the user data value object + */ + public static User getUserData(HttpServletRequest request, ServletContext servletContext) + { + //retrieve complete user data from http session + User currentUser = (User) request.getSession() + .getAttribute(ATTR_USERDATA); + if(log.isDebugEnabled()&¤tUser!=null) + log.debug("user retrieved from http session:"+currentUser.getUserId()); + + //if no session cache available, retrieve it from data source + if (currentUser == null) + { + int userId = WebUtil.readIntParam(request,PARAM_USER_ID); + currentUser = LearnerServiceProxy.getUserManagementService(servletContext) + .getUserById(new Integer(userId)); + if(log.isDebugEnabled()&¤tUser!=null) + log.debug("user retrieved from database:"+currentUser.getUserId()); + + //create session cache + request.getSession().setAttribute(ATTR_USERDATA, currentUser); + } + return currentUser; + } + + /** + * Helper method to get lesson. + * + * @param request A standard Servlet HttpServletRequest class. + * @param learnerService leaner service facade. + * @param servletContext the servlet container that has all resources + * @return The requested lesson. + */ + public static Lesson getLessonData(HttpServletRequest request, ServletContext servletContext) + { + //initialize service object + ILearnerService learnerService = LearnerServiceProxy.getLearnerService(servletContext); + + long lessonId = WebUtil.readLongParam(request,PARAM_LESSON_ID); + return learnerService.getLesson(new Long(lessonId)); + } + + /** + * Helper method to get session bean. + * TODO resolve the duplicate code in activity action. + * @param request A standard Servlet HttpServletRequest class. + * @param servletContext the servlet container that has all resources + * @return The requested lesson. + */ + public static SessionBean getSessionBean(HttpServletRequest request,ServletContext servletContext) + { + SessionBean bean = (SessionBean)request.getSession().getAttribute(SessionBean.NAME); + + //create new one from database + if(bean ==null) + { + //initialize service object + ILearnerService learnerService = LearnerServiceProxy.getLearnerService(servletContext); + + User currentLearner = getUserData(request, servletContext); + Lesson lesson = getLessonData(request,servletContext); + LearnerProgress progress = learnerService.getProgress(currentLearner,lesson); + + bean = new SessionBean(currentLearner,lesson,progress); + } + return bean; + } + +} Index: lams_learning/test/java/org/lamsfoundation/lams/learning/web/action/DummyLessonAction.java =================================================================== diff -u -rf0f13cd7ba427bab1d37dc3a8a14e290c98245ef -r32e9a495b2ccacfc4febc13648d255f466742a03 --- lams_learning/test/java/org/lamsfoundation/lams/learning/web/action/DummyLessonAction.java (.../DummyLessonAction.java) (revision f0f13cd7ba427bab1d37dc3a8a14e290c98245ef) +++ lams_learning/test/java/org/lamsfoundation/lams/learning/web/action/DummyLessonAction.java (.../DummyLessonAction.java) (revision 32e9a495b2ccacfc4febc13648d255f466742a03) @@ -87,7 +87,7 @@ HttpServletResponse response) { ActivityForm activityForm = (ActivityForm) form; - SessionBean sessionBean = new SessionBean(); + SessionBean sessionBean = new SessionBean(null,null,null); IUserManagementService userService = getUserService(this.servlet.getServletContext()); User user = userService.getUserById(TEST_USER_ID); sessionBean.setLearner(user); Index: lams_learning/test/java/org/lamsfoundation/lams/learning/web/action/TestLearnerAction.java =================================================================== diff -u -red8afe78a454a4b3b9d2ae039ac12d7ad9dc809a -r32e9a495b2ccacfc4febc13648d255f466742a03 --- lams_learning/test/java/org/lamsfoundation/lams/learning/web/action/TestLearnerAction.java (.../TestLearnerAction.java) (revision ed8afe78a454a4b3b9d2ae039ac12d7ad9dc809a) +++ lams_learning/test/java/org/lamsfoundation/lams/learning/web/action/TestLearnerAction.java (.../TestLearnerAction.java) (revision 32e9a495b2ccacfc4febc13648d255f466742a03) @@ -38,6 +38,8 @@ private static final String TEST_USER_ID = "2"; private static final String TEST_LESSON_ID = "2"; + + private static SessionBean joinedLessonBean = null; /* * @see TestCase#setUp() */ @@ -96,11 +98,35 @@ verifyNoActionErrors(); - SessionBean bean = (SessionBean)httpSession.getAttribute(SessionBean.NAME); - assertNotNull("verify the session bean",bean); - assertEquals("verify the learner in the session bean",TEST_USER_ID,bean.getLearner().getUserId().toString()); - assertEquals("verify the lesson in the session bean",TEST_LESSON_ID,bean.getLesson().getLessonId().toString()); - assertNotNull("verify the learner progress",bean.getLearnerProgress()); + joinedLessonBean = (SessionBean)httpSession.getAttribute(SessionBean.NAME); + assertNotNull("verify the session bean",joinedLessonBean); + assertEquals("verify the learner in the session bean",TEST_USER_ID,joinedLessonBean.getLearner().getUserId().toString()); + assertEquals("verify the lesson in the session bean",TEST_LESSON_ID,joinedLessonBean.getLesson().getLessonId().toString()); + assertNotNull("verify the learner progress",joinedLessonBean.getLearnerProgress()); } + public void testGetFlashProgressData() + { + httpSession.setAttribute(SessionBean.NAME,joinedLessonBean); + addRequestParameter("method", "getFlashProgressData"); + addRequestParameter("userId", TEST_USER_ID); + addRequestParameter("lessonId", TEST_LESSON_ID); + + actionPerform(); + verifyNoActionErrors(); + } + + public void testExitLesson() + { + addRequestParameter("method", "exitLesson"); + addRequestParameter("userId", TEST_USER_ID); + addRequestParameter("lessonId", TEST_LESSON_ID); + + actionPerform(); + + verifyForward("welcome"); + verifyTilesForward("welcome",".welcome"); + verifyNoActionErrors(); + } + } Index: lams_learning/test/web/WEB-INF/struts/struts-config.xml =================================================================== diff -u -r47a0b22c0f3ff85ed2d419ad50912025d55c9cfa -r32e9a495b2ccacfc4febc13648d255f466742a03 --- lams_learning/test/web/WEB-INF/struts/struts-config.xml (.../struts-config.xml) (revision 47a0b22c0f3ff85ed2d419ad50912025d55c9cfa) +++ lams_learning/test/web/WEB-INF/struts/struts-config.xml (.../struts-config.xml) (revision 32e9a495b2ccacfc4febc13648d255f466742a03) @@ -156,6 +156,11 @@ path="/DisplayActivity.do" redirect="false" /> +