Index: lams_monitoring/src/java/org/lamsfoundation/lams/monitoring/LearnerProgressBatchDTO.java =================================================================== diff -u --- lams_monitoring/src/java/org/lamsfoundation/lams/monitoring/LearnerProgressBatchDTO.java (revision 0) +++ lams_monitoring/src/java/org/lamsfoundation/lams/monitoring/LearnerProgressBatchDTO.java (revision b7cec35daf3ceab433021f88c904e707b4512061) @@ -0,0 +1,73 @@ +/**************************************************************** + * 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$ */ +package org.lamsfoundation.lams.monitoring; + +import java.util.Vector; + +import org.lamsfoundation.lams.lesson.LearnerProgress; + +/** + * Return the details of the Learner Progress batching - how many learner progress entries exist for this lesson, + * how many in a batch, how many batches available and the first batch of users. + */ +public class LearnerProgressBatchDTO { + + private Vector learnerProgressList; + private Integer batchSize; + private Integer numBatches; + private Integer numAllLearnerProgress; + + public LearnerProgressBatchDTO(Vector progress, int batchSize, int numAllLearnerProgress) { + this.learnerProgressList = progress; + this.batchSize = batchSize; + this.numAllLearnerProgress = numAllLearnerProgress; + + // integer division truncates, so convert to floating point first. + double batchSizeAsDouble = (double) batchSize; + double numAllLearnerProgressAsDouble = (double) numAllLearnerProgress; + double numBatchesDouble = numAllLearnerProgressAsDouble / batchSizeAsDouble; + numBatchesDouble = Math.ceil(numBatchesDouble); + + numBatches = (int) numBatchesDouble; + if ( numBatches < 1 ) { + numBatches = 1; + } + } + + public Vector getLearnerProgressList() { + return learnerProgressList; + } + + public Integer getBatchSize() { + return batchSize; + } + + public Integer getNumBatches() { + return numBatches; + } + + public Integer getNumAllLearnerProgress() { + return numAllLearnerProgress; + } +} Index: lams_monitoring/src/java/org/lamsfoundation/lams/monitoring/monitoringApplicationContext.xml =================================================================== diff -u -r9481bb9c6f8c0e4d6fbed6b230a41c77feda64c6 -rb7cec35daf3ceab433021f88c904e707b4512061 --- lams_monitoring/src/java/org/lamsfoundation/lams/monitoring/monitoringApplicationContext.xml (.../monitoringApplicationContext.xml) (revision 9481bb9c6f8c0e4d6fbed6b230a41c77feda64c6) +++ lams_monitoring/src/java/org/lamsfoundation/lams/monitoring/monitoringApplicationContext.xml (.../monitoringApplicationContext.xml) (revision b7cec35daf3ceab433021f88c904e707b4512061) @@ -39,6 +39,7 @@ + Index: lams_monitoring/src/java/org/lamsfoundation/lams/monitoring/service/IMonitoringService.java =================================================================== diff -u -reb02d23e4734503baf51538aefd7e345b0c45ec4 -rb7cec35daf3ceab433021f88c904e707b4512061 --- lams_monitoring/src/java/org/lamsfoundation/lams/monitoring/service/IMonitoringService.java (.../IMonitoringService.java) (revision eb02d23e4734503baf51538aefd7e345b0c45ec4) +++ lams_monitoring/src/java/org/lamsfoundation/lams/monitoring/service/IMonitoringService.java (.../IMonitoringService.java) (revision b7cec35daf3ceab433021f88c904e707b4512061) @@ -318,6 +318,32 @@ public String getAllLearnersProgress(Long lessonID, Integer userID)throws IOException; /** + * This method returns a batch of progress information of learners + * in a given Lesson. It returns the first batch of users, using the learner's name as the + * sorting order. The batch size is determined by the LEARNER_PROGRESS_BATCH size + * in the database. + * + * @param lessonID The lesson_id of the Lesson whose progress information is required + * @param userID The user id of the user requesting the progress details + * @return String The requested information in wddx format + * @throws IOException + */ + public String getInitialLearnersProgress(Long lessonID, Integer userID)throws IOException; + + /** + * This method returns the next batch of progress information of learners + * in a given Lesson. The batch size is determined by the LEARNER_PROGRESS_BATCH size + * in the database, and the next batch starts at after the supplied user_id + * + * @param lessonID The lesson_id of the Lesson whose progress information is required + * @param lastUserID The user id of the last user from the previous batch + * @param userID The user id of the user requesting the progress details + * @return String The requested information in wddx format + * @throws IOException + */ + public String getAdditionalLearnersProgress(Long lessonID, Integer lastUserID, Integer userID)throws IOException; + + /** * This method is called when the user clicks the 'Contribute' tab in the * monitoring enviornment. It returns a list of activities "in the * order" they have to be performed and with additional information as to Index: lams_monitoring/src/java/org/lamsfoundation/lams/monitoring/service/MonitoringService.java =================================================================== diff -u -reb02d23e4734503baf51538aefd7e345b0c45ec4 -rb7cec35daf3ceab433021f88c904e707b4512061 --- lams_monitoring/src/java/org/lamsfoundation/lams/monitoring/service/MonitoringService.java (.../MonitoringService.java) (revision eb02d23e4734503baf51538aefd7e345b0c45ec4) +++ lams_monitoring/src/java/org/lamsfoundation/lams/monitoring/service/MonitoringService.java (.../MonitoringService.java) (revision b7cec35daf3ceab433021f88c904e707b4512061) @@ -68,11 +68,13 @@ import org.lamsfoundation.lams.lesson.LearnerProgress; import org.lamsfoundation.lams.lesson.Lesson; import org.lamsfoundation.lams.lesson.LessonClass; +import org.lamsfoundation.lams.lesson.dao.ILearnerProgressDAO; import org.lamsfoundation.lams.lesson.dao.ILessonClassDAO; import org.lamsfoundation.lams.lesson.dao.ILessonDAO; import org.lamsfoundation.lams.lesson.dto.LessonDetailsDTO; import org.lamsfoundation.lams.lesson.service.ILessonService; import org.lamsfoundation.lams.lesson.service.LessonServiceException; +import org.lamsfoundation.lams.monitoring.LearnerProgressBatchDTO; import org.lamsfoundation.lams.monitoring.MonitoringConstants; import org.lamsfoundation.lams.tool.ToolSession; import org.lamsfoundation.lams.tool.exception.LamsToolServiceException; @@ -128,14 +130,16 @@ private static final long numMilliSecondsInADay = 24 * 60 * 60 * 1000; private static final String AUDIT_LEARNER_PORTFOLIO_SET = "audit.learner.portfolio.set"; private static final String AUDIT_LESSON_CREATED_KEY = "audit.lesson.created"; - + private static final int DEFAULT_LEARNER_PROGRESS_BATCH_SIZE = 15; + private ILessonDAO lessonDAO; private ILessonClassDAO lessonClassDAO; private ITransitionDAO transitionDAO; private IActivityDAO activityDAO; private IBaseDAO baseDAO; private ILearningDesignDAO learningDesignDAO; private IGroupingDAO groupingDAO; + private ILearnerProgressDAO learnerProgressDAO; private IAuthoringService authoringService; private ICoreLearnerService learnerService; private ILessonService lessonService; @@ -225,7 +229,16 @@ { this.lessonDAO = lessonDAO; } + /** + * @param learnerProgressDAO The learnerProgressDAO to set. + */ + public void setLearnerProgressDAO(ILearnerProgressDAO learnerProgressDAO) + { + this.learnerProgressDAO = learnerProgressDAO; + } + + /** * @param userDAO */ public void setBaseDAO(IBaseDAO baseDAO) { @@ -1283,15 +1296,15 @@ } /** * (non-Javadoc) - * @see org.lamsfoundation.lams.monitoring.service.IMonitoringService#getAllLearnersProgress(java.lang.Long) + * @see org.lamsfoundation.lams.monitoring.service.IMonitoringService#getAllLearnersProgress(java.lang.Long, java.lang.Integer) */ public String getAllLearnersProgress(Long lessonID, Integer userID)throws IOException { Lesson lesson = lessonDAO.getLesson(lessonID); - checkOwnerOrStaffMember(userID, lesson, "get all learners progress"); - - Vector progressData = new Vector(); - FlashMessage flashMessage; - if(lesson!=null){ + FlashMessage flashMessage; + + if(lesson!=null){ + checkOwnerOrStaffMember(userID, lesson, "get all learners progress"); + Vector progressData = new Vector(); Iterator iterator = lesson.getLearnerProgresses().iterator(); while(iterator.hasNext()){ LearnerProgress learnerProgress = (LearnerProgress)iterator.next(); @@ -1305,8 +1318,71 @@ } return flashMessage.serializeMessage(); } - /** + * (non-Javadoc) + * @see org.lamsfoundation.lams.monitoring.service.IMonitoringService#getInitialLearnersProgress(java.lang.Long, java.lang.Integer) + */ + public String getInitialLearnersProgress(Long lessonID, Integer userID)throws IOException { + Lesson lesson = lessonDAO.getLesson(lessonID); + FlashMessage flashMessage; + + if(lesson!=null){ + checkOwnerOrStaffMember(userID, lesson, "get first batch of learners progress details"); + Vector progressData = new Vector(); + + int batchSize = Configuration.getAsInt(ConfigurationKeys.LEARNER_PROGRESS_BATCH_SIZE); + if ( batchSize < 1 ) + batchSize = DEFAULT_LEARNER_PROGRESS_BATCH_SIZE; + + Iterator iterator = learnerProgressDAO.getBatchLearnerProgress(lessonID, null, batchSize).iterator(); + while(iterator.hasNext()){ + LearnerProgress learnerProgress = (LearnerProgress)iterator.next(); + progressData.add(learnerProgress.getLearnerProgressData()); + } + + Integer numAllLearnerProgress = learnerProgressDAO.getNumAllLearnerProgress(lessonID); + LearnerProgressBatchDTO dto = new LearnerProgressBatchDTO(progressData, batchSize, numAllLearnerProgress); + + flashMessage = new FlashMessage("getInitialLearnersProgress",dto); + }else{ + flashMessage = new FlashMessage("getInitialLearnersProgress", + messageService.getMessage("NO.SUCH.LESSON",new Object[]{lessonID}), + FlashMessage.ERROR); + } + return flashMessage.serializeMessage(); + } + /** + * (non-Javadoc) + * @see org.lamsfoundation.lams.monitoring.service.IMonitoringService#getAdditionalLearnersProgress(java.lang.Long, java.lang.Integer, java.lang.Integer) + */ + public String getAdditionalLearnersProgress(Long lessonID, Integer lastUserID, Integer userID)throws IOException { + Lesson lesson = lessonDAO.getLesson(lessonID); + FlashMessage flashMessage; + + if(lesson!=null){ + checkOwnerOrStaffMember(userID, lesson, "get next batch of learners progress details"); + Vector progressData = new Vector(); + + User lastUser = (User)baseDAO.find(User.class,lastUserID); + int batchSize = Configuration.getAsInt(ConfigurationKeys.LEARNER_PROGRESS_BATCH_SIZE); + if ( batchSize < 1 ) + batchSize = DEFAULT_LEARNER_PROGRESS_BATCH_SIZE; + + Iterator iterator = learnerProgressDAO.getBatchLearnerProgress(lessonID, lastUser, batchSize).iterator(); + while(iterator.hasNext()){ + LearnerProgress learnerProgress = (LearnerProgress)iterator.next(); + progressData.add(learnerProgress.getLearnerProgressData()); + } + flashMessage = new FlashMessage("getAdditionalLearnersProgress",progressData); + }else{ + flashMessage = new FlashMessage("getAdditionalLearnersProgress", + messageService.getMessage("NO.SUCH.LESSON",new Object[]{lessonID}), + FlashMessage.ERROR); + } + return flashMessage.serializeMessage(); + } + + /** * @see org.lamsfoundation.lams.monitoring.service.IMonitoringService#getActivityById(Long) */ public Activity getActivityById(Long activityId) Index: lams_monitoring/src/java/org/lamsfoundation/lams/monitoring/web/MonitoringAction.java =================================================================== diff -u -rd9f9e33ff90f8ff1a0077688ad3ee5dbc233c209 -rb7cec35daf3ceab433021f88c904e707b4512061 --- lams_monitoring/src/java/org/lamsfoundation/lams/monitoring/web/MonitoringAction.java (.../MonitoringAction.java) (revision d9f9e33ff90f8ff1a0077688ad3ee5dbc233c209) +++ lams_monitoring/src/java/org/lamsfoundation/lams/monitoring/web/MonitoringAction.java (.../MonitoringAction.java) (revision b7cec35daf3ceab433021f88c904e707b4512061) @@ -636,14 +636,15 @@ writer.println(wddxPacket); return null; } + /** Get the learner progress data for all learners in a lesson. This is called by the sequence tab in monitoring */ public ActionForward getAllLearnersProgress(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response)throws IOException{ String wddxPacket; IMonitoringService monitoringService = MonitoringServiceProxy.getMonitoringService(getServlet().getServletContext()); try{ - Long lessonID = new Long(WebUtil.readLongParam(request,"lessonID")); + Long lessonID = WebUtil.readLongParam(request,"lessonID",false); wddxPacket = monitoringService.getAllLearnersProgress(lessonID, getUserId()); }catch (Exception e) { wddxPacket = handleException(e, "getAllLearnersProgress", monitoringService).serializeMessage(); @@ -653,6 +654,43 @@ writer.println(wddxPacket); return null; } + /** Get the first batch of learner progress data learners in a lesson. This is called by the learner progress tab in monitoring */ + public ActionForward getInitialLearnersProgress(ActionMapping mapping, + ActionForm form, + HttpServletRequest request, + HttpServletResponse response)throws IOException{ + String wddxPacket; + IMonitoringService monitoringService = MonitoringServiceProxy.getMonitoringService(getServlet().getServletContext()); + try{ + Long lessonID = WebUtil.readLongParam(request,"lessonID",false); + wddxPacket = monitoringService.getInitialLearnersProgress(lessonID, getUserId()); + }catch (Exception e) { + wddxPacket = handleException(e, "getInitialLearnersProgress", monitoringService).serializeMessage(); + } + + PrintWriter writer = response.getWriter(); + writer.println(wddxPacket); + return null; + } + /** Get a followup batch of learner progress data learners in a lesson. This is called by the learner progress tab in monitoring */ + public ActionForward getAdditionalLearnersProgress(ActionMapping mapping, + ActionForm form, + HttpServletRequest request, + HttpServletResponse response)throws IOException{ + String wddxPacket; + IMonitoringService monitoringService = MonitoringServiceProxy.getMonitoringService(getServlet().getServletContext()); + try{ + Long lessonID = WebUtil.readLongParam(request,"lessonID",false); + Integer lastUserID = WebUtil.readIntParam(request,"lastUserID",false); + wddxPacket = monitoringService.getAdditionalLearnersProgress(lessonID, lastUserID, getUserId()); + }catch (Exception e) { + wddxPacket = handleException(e, "getAdditionalLearnersProgress", monitoringService).serializeMessage(); + } + + PrintWriter writer = response.getWriter(); + writer.println(wddxPacket); + return null; + } public ActionForward getAllContributeActivities(ActionMapping mapping, ActionForm form, HttpServletRequest request,