Index: lams_build/lib/lams/lams.jar =================================================================== diff -u -r9f419a19d1664fcd4a85c03c89e81d0137f60f5d -r6a93b1b03ef0e2e65d7376991ad3ccca9cd6aef4 Binary files differ Index: lams_common/src/java/org/lamsfoundation/lams/lesson/dao/ILearnerProgressDAO.java =================================================================== diff -u -r9f419a19d1664fcd4a85c03c89e81d0137f60f5d -r6a93b1b03ef0e2e65d7376991ad3ccca9cd6aef4 --- lams_common/src/java/org/lamsfoundation/lams/lesson/dao/ILearnerProgressDAO.java (.../ILearnerProgressDAO.java) (revision 9f419a19d1664fcd4a85c03c89e81d0137f60f5d) +++ lams_common/src/java/org/lamsfoundation/lams/lesson/dao/ILearnerProgressDAO.java (.../ILearnerProgressDAO.java) (revision 6a93b1b03ef0e2e65d7376991ad3ccca9cd6aef4) @@ -84,30 +84,30 @@ * @param activity * @return List */ - List getLearnerProgressReferringToActivity(Activity activity); + List getLearnerProgressReferringToActivity(Activity activity); /** - * Get progress for learners who most recently entered the activity. + * Get learners who most recently entered the activity. */ - List getLearnerProgressLatestByActivity(Long activityId, Integer limit); + List getLearnersLatestByActivity(Long activityId, Integer limit, Integer offset); /** - * Get progress for learners who are at the activity at the moment. + * Get learners who are at the given activities at the moment. */ - List getLearnerProgressByActivity(Long activityId, Integer limit, Integer offset); + List getLearnersByActivities(Long[] activityIds, Integer limit, Integer offset); /** - * Get progress for learners who most recently finished the lesson. + * Get learners who most recently finished the lesson. */ - List getCompletedLearnerProgressLatestForLesson(Long lessonId, Integer limit); + List getLearnersLatestCompletedForLesson(Long lessonId, Integer limit, Integer offset); /** * Get all the learner progress records for a lesson where the progress is marked as completed. * * @param lessonId * @return List */ - List getCompletedLearnerProgressForLesson(Long lessonId); + List getCompletedLearnerProgressForLesson(Long lessonId); /** * Get all the learner progress records for a lesson. Index: lams_common/src/java/org/lamsfoundation/lams/lesson/dao/ILessonDAO.java =================================================================== diff -u -r4020e48e252d3a5a9ace181e62bb78900f05128b -r6a93b1b03ef0e2e65d7376991ad3ccca9cd6aef4 --- lams_common/src/java/org/lamsfoundation/lams/lesson/dao/ILessonDAO.java (.../ILessonDAO.java) (revision 4020e48e252d3a5a9ace181e62bb78900f05128b) +++ lams_common/src/java/org/lamsfoundation/lams/lesson/dao/ILessonDAO.java (.../ILessonDAO.java) (revision 6a93b1b03ef0e2e65d7376991ad3ccca9cd6aef4) @@ -28,7 +28,6 @@ import org.lamsfoundation.lams.dao.IBaseDAO; import org.lamsfoundation.lams.lesson.Lesson; -import org.lamsfoundation.lams.lesson.dto.LessonDetailsDTO; import org.lamsfoundation.lams.usermanagement.User; /** @@ -42,7 +41,7 @@ * Retrieves the Lesson * * @param lessonId - * identifies the lesson to get + * identifies the lesson to get * @return the lesson */ public Lesson getLesson(Long lessonId); @@ -56,7 +55,7 @@ * Gets all lessons that are active for a learner. TODO to be removed when the dummy interface is no longer needed * * @param learner - * a User that identifies the learner. + * a User that identifies the learner. * @return a Set with all active lessons in it. */ public List getActiveLessonsForLearner(User learner); @@ -65,26 +64,26 @@ * Gets all lessons that are active for a learner, in a given organisation * * @param learnerId - * a User that identifies the learner. + * a User that identifies the learner. * @param organisationId - * the desired organisation . + * the desired organisation . * @return a List with all active lessons in it. */ - public List getActiveLessonsForLearner(final Integer learnerId, final Integer organisationID); + public List getActiveLessonsForLearner(Integer learnerId, Integer organisationID); /** * Saves or Updates a Lesson. * * @param lesson - * the Lesson to save + * the Lesson to save */ public void saveLesson(Lesson lesson); /** * Deletes a Lesson permanently. * * @param lesson - * the Lesson to remove. + * the Lesson to remove. */ public void deleteLesson(Lesson lesson); @@ -100,7 +99,7 @@ * lessons. * * @param userID - * The user_id of the user + * The user_id of the user * @return List The list of Lessons for the given user */ public List getLessonsCreatedByUser(Integer userID); @@ -110,101 +109,112 @@ * lessons or preview lessons. This is the list of lessons that a user may monitor/moderate/manage. * * @param user - * a User that identifies the teacher/staff member. + * a User that identifies the teacher/staff member. * @return a List with all appropriate lessons in it. */ - public List getLessonsForMonitoring(final int userID, final int organisationID); + public List getLessonsForMonitoring(int userID, int organisationID); /** * Returns the all the learners that have started the requested lesson. * * @param lessonId - * the id of the requested lesson. + * the id of the requested lesson. * @return the list of learners. */ - public List getActiveLearnerByLesson(final long lessonId); + public List getActiveLearnerByLesson(long lessonId); /** * Returns the all the learners that have started the requested lesson and are in the given group. * * @param lessonId - * the id of the requested lesson. + * the id of the requested lesson. * @param groupId - * the id of the requested group. + * the id of the requested group. * @return the list of learners. */ - public List getActiveLearnerByLessonAndGroup(final long lessonId, final long groupId); + public List getActiveLearnerByLessonAndGroup(long lessonId, long groupId); /** * Returns the count of all the learners that have started the requested lesson. * * @param lessonId - * the id of the requested lesson. + * the id of the requested lesson. * @return the count of the learners. */ - public Integer getCountActiveLearnerByLesson(final long lessonId); + public Integer getCountActiveLearnerByLesson(long lessonId); /** + * Returns the count of all the learners that are a part of the lesson class. + */ + public Integer getCountLearnerByLesson(long lessonId); + + /** * Get all the preview lessons more with the creation date before the given date. * * @param startDate - * UTC date + * UTC date * @return the list of Lessons */ - public List getPreviewLessonsBeforeDate(final Date startDate); + public List getPreviewLessonsBeforeDate(Date startDate); /** * Get the lesson that applies to this activity. Not all activities have an attached lesson. */ - public Lesson getLessonForActivity(final long activityId); + public Lesson getLessonForActivity(long activityId); /** - * Gets all non-removed lessons for a user in an org; set userRole parameter to learner if you want lessons where user is in the - * learner list, or to monitor if in the staff list. + * Gets all non-removed lessons for a user in an org; set userRole parameter to learner if you want lessons where + * user is in the learner list, or to monitor if in the staff list. * - * @param userId a user id that identifies the user. - * @param orgId an org id that identifies the organisation. - * @param userRole return lessons where user is learner or monitor. or returns all lessons in case of group manager + * @param userId + * a user id that identifies the user. + * @param orgId + * an org id that identifies the organisation. + * @param userRole + * return lessons where user is learner or monitor. or returns all lessons in case of group manager * * @return a List containing a list of tuples containing lesson details and the lesson completed flag for the user. */ - public List getLessonsByOrgAndUserWithCompletedFlag(final Integer userId, final Integer orgId, final Integer userRole); - + public List getLessonsByOrgAndUserWithCompletedFlag(Integer userId, Integer orgId, + Integer userRole); + /** - * Gets all non-removed lessons for a user in a group including sub-groups + * Gets all non-removed lessons for a user in a group including sub-groups * - * @param userId a user id that identifies the user. - * @param orgId an org id that identifies the organisation. + * @param userId + * a user id that identifies the user. + * @param orgId + * an org id that identifies the organisation. * @return a List containing a list of tuples containing lesson details and the lesson completed flag for the user. */ - public List getLessonsByGroupAndUser(final Integer userId, final Integer orgId); + public List getLessonsByGroupAndUser(Integer userId, Integer orgId); /** * Gets all non-removed lessons for a group. * * @param orgId * @return */ - public List getLessonsByGroup(final Integer orgId); - + public List getLessonsByGroup(Integer orgId); + /** * Get lessons based on learning designs where the original learning design has the given id. * * @param ldId * @param orgId * @return list of lessons */ - public List getLessonsByOriginalLearningDesign(final Long ldId, final Integer orgId); + public List getLessonsByOriginalLearningDesign(Long ldId, Integer orgId); /** * Finds out which lesson the given tool content belongs to and returns its monitoring users. * * @param sessionId - * tool session ID + * tool session ID * @return list of teachers that monitor the lesson which contains the tool with given session ID */ public List getMonitorsByToolSessionId(Long sessionId); - + /** * Gets lesson for tools based on toolSessionID * Index: lams_common/src/java/org/lamsfoundation/lams/lesson/dao/hibernate/LearnerProgressDAO.java =================================================================== diff -u -r9f419a19d1664fcd4a85c03c89e81d0137f60f5d -r6a93b1b03ef0e2e65d7376991ad3ccca9cd6aef4 --- lams_common/src/java/org/lamsfoundation/lams/lesson/dao/hibernate/LearnerProgressDAO.java (.../LearnerProgressDAO.java) (revision 9f419a19d1664fcd4a85c03c89e81d0137f60f5d) +++ lams_common/src/java/org/lamsfoundation/lams/lesson/dao/hibernate/LearnerProgressDAO.java (.../LearnerProgressDAO.java) (revision 6a93b1b03ef0e2e65d7376991ad3ccca9cd6aef4) @@ -54,7 +54,8 @@ private final static String LOAD_COMPLETED_PROGRESS_BY_LESSON = "from LearnerProgress p where p.lessonComplete > 0 and p.lesson.id = :lessonId"; - private final static String LOAD_LATEST_COMPLETED_PROGRESS_BY_LESSON = "from LearnerProgress p where p.lessonComplete > 0 and p.lesson.id = :lessonId ORDER BY p.finishDate DESC"; + private final static String LOAD_LEARNERS_LATEST_COMPLETED_BY_LESSON = "SELECT p.user FROM LearnerProgress p WHERE " + + "p.lessonComplete > 0 and p.lesson.id = :lessonId ORDER BY p.finishDate DESC"; private final static String COUNT_COMPLETED_PROGRESS_BY_LESSON = "select count(*) from LearnerProgress p " + " where p.lessonComplete > 0 and p.lesson.id = :lessonId"; @@ -79,13 +80,13 @@ private final static String LOAD_PROGRESSES_BY_LESSON_LIST = "FROM LearnerProgress progress WHERE " + " progress.lesson.lessonId IN (:lessonIds)"; - private final static String LOAD_LATEST_PROGRESS_BY_ACTIVITY = "SELECT prog.learner_progress_id FROM lams_learner_progress AS prog " + private final static String LOAD_LEARNERS_LATEST_BY_ACTIVITY = "SELECT prog.user_id FROM lams_learner_progress AS prog " + "JOIN lams_progress_attempted AS att USING (learner_progress_id) " + "WHERE prog.current_activity_id = :activityId AND att.activity_id = :activityId " + "ORDER BY att.start_date_time DESC"; - private final static String LOAD_PROGRESS_BY_ACTIVITY = "FROM LearnerProgress p WHERE " - + " p.currentActivity.id = :activityId"; + private final static String LOAD_LEARNERS_BY_ACTIVITIES = "SELECT p.user FROM LearnerProgress p WHERE " + + " p.currentActivity.id IN (:activityIds)"; @Override public LearnerProgress getLearnerProgress(Long learnerProgressId) { @@ -136,41 +137,42 @@ @SuppressWarnings("unchecked") @Override - public List getLearnerProgressLatestByActivity(final Long activityId, final Integer limit) { + public List getLearnersLatestByActivity(final Long activityId, final Integer limit, final Integer offset) { final HibernateTemplate hibernateTemplate = new HibernateTemplate(this.getSessionFactory()); - return (List) hibernateTemplate.execute(new HibernateCallback() { + return (List) hibernateTemplate.execute(new HibernateCallback() { @Override public Object doInHibernate(Session session) throws HibernateException { - Query query = session.createSQLQuery(LearnerProgressDAO.LOAD_LATEST_PROGRESS_BY_ACTIVITY) + Query query = session.createSQLQuery(LearnerProgressDAO.LOAD_LEARNERS_LATEST_BY_ACTIVITY) .setLong("activityId", activityId); if (limit != null) { query.setMaxResults(limit); } + if (offset != null) { + query.setFirstResult(offset); + } // first query fetches only progress IDs List result = query.list(); - // fetch Learner progress objects and return them - List learnerProgresses = new LinkedList(); - for (BigInteger learnerProgressId : result) { - learnerProgresses.add((LearnerProgress) hibernateTemplate.get(LearnerProgress.class, - learnerProgressId.longValue())); + // fetch user objects and return them + List learners = new LinkedList(); + for (BigInteger userId : result) { + learners.add((User) hibernateTemplate.get(User.class, userId.intValue())); } - return learnerProgresses; + return learners; } }); } @SuppressWarnings("unchecked") @Override - public List getLearnerProgressByActivity(final Long activityId, final Integer limit, - final Integer offset) { + public List getLearnersByActivities(final Long[] activityIds, final Integer limit, final Integer offset) { final HibernateTemplate hibernateTemplate = new HibernateTemplate(this.getSessionFactory()); - return (List) hibernateTemplate.execute(new HibernateCallback() { + return (List) hibernateTemplate.execute(new HibernateCallback() { @Override public Object doInHibernate(Session session) throws HibernateException { - Query query = session.createQuery(LearnerProgressDAO.LOAD_PROGRESS_BY_ACTIVITY).setLong("activityId", - activityId); + Query query = session.createQuery(LearnerProgressDAO.LOAD_LEARNERS_BY_ACTIVITIES) + .setParameterList("activityIds", activityIds); if (limit != null) { query.setMaxResults(limit); } @@ -184,17 +186,21 @@ @SuppressWarnings("unchecked") @Override - public List getCompletedLearnerProgressLatestForLesson(final Long lessonId, final Integer limit) { + public List getLearnersLatestCompletedForLesson(final Long lessonId, final Integer limit, + final Integer offset) { HibernateTemplate hibernateTemplate = new HibernateTemplate(this.getSessionFactory()); - return (List) hibernateTemplate.execute(new HibernateCallback() { + return (List) hibernateTemplate.execute(new HibernateCallback() { @Override public Object doInHibernate(Session session) throws HibernateException { - Query query = session.createQuery(LearnerProgressDAO.LOAD_LATEST_COMPLETED_PROGRESS_BY_LESSON) + Query query = session.createQuery(LearnerProgressDAO.LOAD_LEARNERS_LATEST_COMPLETED_BY_LESSON) .setLong("lessonId", lessonId); if (limit != null) { query.setMaxResults(limit); } + if (offset != null) { + query.setFirstResult(offset); + } return query.list(); } }); @@ -214,6 +220,7 @@ }); } + @SuppressWarnings("unchecked") @Override public List getLearnerProgressForLesson(final Long lessonId) { HibernateTemplate hibernateTemplate = new HibernateTemplate(this.getSessionFactory()); @@ -227,11 +234,12 @@ }); } + @SuppressWarnings("unchecked") @Override - public List getLearnerProgressForLesson(final Long lessonId, final List userIds) { + public List getLearnerProgressForLesson(final Long lessonId, final List userIds) { HibernateTemplate hibernateTemplate = new HibernateTemplate(this.getSessionFactory()); - return (List) hibernateTemplate.execute(new HibernateCallback() { + return (List) hibernateTemplate.execute(new HibernateCallback() { @Override public Object doInHibernate(Session session) throws HibernateException { return session.createQuery(LearnerProgressDAO.LOAD_PROGRESS_BY_LESSON_AND_USER_IDS) Index: lams_common/src/java/org/lamsfoundation/lams/lesson/dao/hibernate/LessonDAO.java =================================================================== diff -u -r4020e48e252d3a5a9ace181e62bb78900f05128b -r6a93b1b03ef0e2e65d7376991ad3ccca9cd6aef4 --- lams_common/src/java/org/lamsfoundation/lams/lesson/dao/hibernate/LessonDAO.java (.../LessonDAO.java) (revision 4020e48e252d3a5a9ace181e62bb78900f05128b) +++ lams_common/src/java/org/lamsfoundation/lams/lesson/dao/hibernate/LessonDAO.java (.../LessonDAO.java) (revision 6a93b1b03ef0e2e65d7376991ad3ccca9cd6aef4) @@ -64,34 +64,42 @@ + "and l.learningDesign.copyTypeID != " + LearningDesign.COPY_TYPE_PREVIEW + " " + "and l.lessonStateId = " + Lesson.STARTED_STATE + " " + "and l.organisation.organisationId = ? " + " order by l.lessonName"; private final static String LESSONS_BY_GROUP = "from " + Lesson.class.getName() - + " where organisation.organisationId=? and lessonStateId <= 6"; - private final static String LESSON_BY_SESSION_ID = "select lesson from Lesson lesson, ToolSession session where " + - "session.lesson=lesson and session.toolSessionId=:toolSessionID"; + + " where organisation.organisationId=? and lessonStateId <= 6"; + private final static String LESSON_BY_SESSION_ID = "select lesson from Lesson lesson, ToolSession session where " + + "session.lesson=lesson and session.toolSessionId=:toolSessionID"; + private final static String COUNT_LEARNERS_CLASS = "SELECT COUNT(*) FROM lams_lesson AS lesson " + + "JOIN lams_grouping AS grouping ON lesson.class_grouping_id = grouping.grouping_id " + + "JOIN lams_group AS gr USING (grouping_id) JOIN lams_user_group AS ug USING (group_id) " + + "WHERE lesson_id = :lessonId"; /** * Retrieves the Lesson. Used in instances where it cannot be lazy loaded so it forces an initialize. * * @param lessonId - * identifies the lesson to get + * identifies the lesson to get * @return the lesson */ + @Override public Lesson getLesson(Long lessonId) { Lesson lesson = (Lesson) getHibernateTemplate().get(Lesson.class, lessonId); return lesson; } + @Override public Lesson getLessonWithJoinFetchedProgress(final Long lessonId) { HibernateTemplate hibernateTemplate = new HibernateTemplate(this.getSessionFactory()); return (Lesson) hibernateTemplate.execute(new HibernateCallback() { + @Override public Object doInHibernate(Session session) throws HibernateException { - return session.createCriteria(Lesson.class).add(Restrictions.like("lessonId", lessonId)).setFetchMode( - "learnerProgresses", FetchMode.JOIN).uniqueResult(); + return session.createCriteria(Lesson.class).add(Restrictions.like("lessonId", lessonId)) + .setFetchMode("learnerProgresses", FetchMode.JOIN).uniqueResult(); } }); } /** Get all the lessons in the database. This includes the disabled lessons. */ + @Override public List getAllLessons() { return getHibernateTemplate().loadAll(Lesson.class); } @@ -100,14 +108,16 @@ * Gets all lessons that are active for a learner. * * @param learner - * a User that identifies the learner. + * a User that identifies the learner. * @return a List with all active lessons in it. */ + @Override public List getActiveLessonsForLearner(final User learner) { List lessons = null; HibernateTemplate hibernateTemplate = new HibernateTemplate(this.getSessionFactory()); lessons = (List) hibernateTemplate.execute(new HibernateCallback() { + @Override public Object doInHibernate(Session session) throws HibernateException { Query query = session.getNamedQuery("activeLessonsAllOrganisations"); query.setInteger("userId", learner.getUserId().intValue()); @@ -122,16 +132,18 @@ * Gets all lessons that are active for a learner, in a given organisation * * @param learnerId - * a User that identifies the learner. + * a User that identifies the learner. * @param organisationId - * the desired organisation. + * the desired organisation. * @return a List with all active lessons in it. */ + @Override public List getActiveLessonsForLearner(final Integer learnerId, final Integer organisationId) { List lessons = null; HibernateTemplate hibernateTemplate = new HibernateTemplate(this.getSessionFactory()); lessons = (List) hibernateTemplate.execute(new HibernateCallback() { + @Override public Object doInHibernate(Session session) throws HibernateException { Query query = session.getNamedQuery("activeLessons"); query.setInteger("userId", learnerId); @@ -140,17 +152,19 @@ return result; } }); - return (List)lessons; + return lessons; } /** * @see org.lamsfoundation.lams.lesson.dao.ILessonDAO#getActiveLearnerByLesson(long) */ + @Override public List getActiveLearnerByLesson(final long lessonId) { List learners = null; HibernateTemplate hibernateTemplate = new HibernateTemplate(this.getSessionFactory()); learners = (List) hibernateTemplate.execute(new HibernateCallback() { + @Override public Object doInHibernate(Session session) throws HibernateException { Query query = session.getNamedQuery("activeLearners"); query.setLong("lessonId", lessonId); @@ -164,11 +178,13 @@ /** * @see org.lamsfoundation.lams.lesson.dao.ILessonDAO#getActiveLearnerByLessonAndGroup(long, long) */ + @Override public List getActiveLearnerByLessonAndGroup(final long lessonId, final long groupId) { List learners = null; HibernateTemplate hibernateTemplate = new HibernateTemplate(this.getSessionFactory()); learners = (List) hibernateTemplate.execute(new HibernateCallback() { + @Override public Object doInHibernate(Session session) throws HibernateException { Query query = session.getNamedQuery("activeLearnersByGroup"); query.setLong("lessonId", lessonId); @@ -184,23 +200,40 @@ * @see org.lamsfoundation.lams.lesson.dao.ILessonDAO#getActiveLearnerByLesson(long) Note: Hibernate 3.1 * query.uniqueResult() returns Integer, Hibernate 3.2 query.uniqueResult() returns Long */ + @Override public Integer getCountActiveLearnerByLesson(final long lessonId) { HibernateTemplate hibernateTemplate = new HibernateTemplate(this.getSessionFactory()); return (Integer) hibernateTemplate.execute(new HibernateCallback() { + @Override public Object doInHibernate(Session session) throws HibernateException { Query query = session.createQuery(LessonDAO.COUNT_ACTIVE_LEARNERS); query.setLong("lessonId", lessonId); Object value = query.uniqueResult(); - return new Integer(((Number) value).intValue()); + return ((Number) value).intValue(); } }); } + @Override + public Integer getCountLearnerByLesson(final long lessonId) { + HibernateTemplate hibernateTemplate = new HibernateTemplate(this.getSessionFactory()); + return (Integer) hibernateTemplate.execute(new HibernateCallback() { + @Override + public Object doInHibernate(Session session) throws HibernateException { + Query query = session.createSQLQuery(LessonDAO.COUNT_LEARNERS_CLASS); + query.setLong("lessonId", lessonId); + Object value = query.uniqueResult(); + return ((Number) value).intValue(); + } + }); + } + /** * f Saves or Updates a Lesson. * * @param lesson */ + @Override public void saveLesson(Lesson lesson) { getHibernateTemplate().save(lesson); } @@ -210,6 +243,7 @@ * * @param lesson */ + @Override public void deleteLesson(Lesson lesson) { getHibernateTemplate().delete(lesson); } @@ -219,6 +253,7 @@ * * @see org.lamsfoundation.lams.lesson.dao.ILessonDAO#updateLesson(org.lamsfoundation.lams.lesson.Lesson) */ + @Override public void updateLesson(Lesson lesson) { getHibernateTemplate().update(lesson); } @@ -228,9 +263,10 @@ * lessons. * * @param userID - * The user_id of the user + * The user_id of the user * @return List The list of Lessons for the given user */ + @Override public List getLessonsCreatedByUser(Integer userID) { List lessons = this.getHibernateTemplate().find(LessonDAO.FIND_LESSON_BY_CREATOR, userID); return lessons; @@ -241,14 +277,16 @@ * lessons or preview lessons. This is the list of lessons that a user may monitor/moderate/manage. * * @param user - * a User that identifies the teacher/staff member. + * a User that identifies the teacher/staff member. * @return a List with all appropriate lessons in it. */ + @Override public List getLessonsForMonitoring(final int userID, final int organisationID) { List lessons = null; HibernateTemplate hibernateTemplate = new HibernateTemplate(this.getSessionFactory()); lessons = (List) hibernateTemplate.execute(new HibernateCallback() { + @Override public Object doInHibernate(Session session) throws HibernateException { Query query = session.getNamedQuery("lessonsForMonitoring"); query.setInteger("userId", userID); @@ -264,9 +302,10 @@ * Get all the preview lessons more with the creation date before the given date. * * @param startDate - * UTC date + * UTC date * @return the list of Lessons */ + @Override public List getPreviewLessonsBeforeDate(final Date startDate) { List lessons = this.getHibernateTemplate().find(LessonDAO.FIND_PREVIEW_BEFORE_START_DATE, startDate); return lessons; @@ -275,9 +314,11 @@ /** * Get the lesson that applies to this activity. Not all activities have an attached lesson. */ + @Override public Lesson getLessonForActivity(final long activityId) { HibernateTemplate hibernateTemplate = new HibernateTemplate(this.getSessionFactory()); return (Lesson) hibernateTemplate.execute(new HibernateCallback() { + @Override public Object doInHibernate(Session session) throws HibernateException { Query query = session.createQuery(LessonDAO.FIND_LESSON_FOR_ACTIVITY); query.setLong("activityId", activityId); @@ -290,13 +331,16 @@ * @see org.lamsfoundation.lams.lesson.dao.ILessonDAO#getLessonsByOrgAndUserWithCompletedFlag(Integer, Integer, * boolean) */ - public List getLessonsByOrgAndUserWithCompletedFlag(final Integer userId, final Integer orgId, final Integer userRole) { + @Override + public List getLessonsByOrgAndUserWithCompletedFlag(final Integer userId, final Integer orgId, + final Integer userRole) { List dtos = null; HibernateTemplate hibernateTemplate = new HibernateTemplate(this.getSessionFactory()); dtos = (List) hibernateTemplate.execute(new HibernateCallback() { + @Override public Object doInHibernate(Session session) throws HibernateException { - + String queryName; if (Role.ROLE_MONITOR.equals(userRole)) { queryName = "staffLessonsByOrgAndUserWithCompletedFlag"; @@ -306,7 +350,7 @@ // in case of Role.ROLE_GROUP_MANAGER queryName = "allLessonsByOrgAndUserWithCompletedFlag"; } - + Query query = session.getNamedQuery(queryName); query.setInteger("userId", userId.intValue()); query.setInteger("orgId", orgId.intValue()); @@ -316,15 +360,17 @@ }); return dtos; } - + /** * @see org.lamsfoundation.lams.lesson.dao.ILessonDAO#getLessonsByOrgAndUserWithCompletedFlag(Integer, Integer, * boolean) */ + @Override public List getLessonsByGroupAndUser(final Integer userId, final Integer orgId) { List dtos = null; HibernateTemplate hibernateTemplate = new HibernateTemplate(this.getSessionFactory()); dtos = (List) hibernateTemplate.execute(new HibernateCallback() { + @Override public Object doInHibernate(Session session) throws HibernateException { Query query = session.getNamedQuery("lessonsByOrgAndUserWithChildOrgs"); query.setInteger("userId", userId.intValue()); @@ -335,14 +381,16 @@ }); return dtos; } - + + @Override public List getLessonsByGroup(final Integer orgId) { return this.getHibernateTemplate().find(LessonDAO.LESSONS_BY_GROUP, orgId); } /** * @see org.lamsfoundation.lams.lesson.dao.ILessonDAO#getLessonsByOriginalLearningDesign(Integer) */ + @Override public List getLessonsByOriginalLearningDesign(final Long ldId, final Integer orgId) { Object[] args = { ldId.longValue(), orgId.intValue() }; List lessons = this.getHibernateTemplate().find(LessonDAO.LESSONS_WITH_ORIGINAL_LEARNING_DESIGN, args); @@ -352,17 +400,20 @@ /** * @see org.lamsfoundation.lams.lesson.dao.ILessonDAO#getMonitorsByToolSessionId(Long) */ + @Override public List getMonitorsByToolSessionId(Long sessionId) { return this.getHibernateTemplate().findByNamedQueryAndNamedParam("monitorsByToolSessionId", "sessionId", sessionId); } - + /** * @see org.lamsfoundation.lams.lesson.dao.ILessonDAO#getLessonDetailsFromSessionID(java.lang.Long) */ + @Override public Lesson getLessonFromSessionID(final Long toolSessionID) { HibernateTemplate hibernateTemplate = new HibernateTemplate(this.getSessionFactory()); return (Lesson) hibernateTemplate.execute(new HibernateCallback() { + @Override public Object doInHibernate(Session session) throws HibernateException { Query query = session.createQuery(LessonDAO.LESSON_BY_SESSION_ID); query.setLong("toolSessionID", toolSessionID); Index: lams_common/src/java/org/lamsfoundation/lams/lesson/service/ILessonService.java =================================================================== diff -u -r9f419a19d1664fcd4a85c03c89e81d0137f60f5d -r6a93b1b03ef0e2e65d7376991ad3ccca9cd6aef4 --- lams_common/src/java/org/lamsfoundation/lams/lesson/service/ILessonService.java (.../ILessonService.java) (revision 9f419a19d1664fcd4a85c03c89e81d0137f60f5d) +++ lams_common/src/java/org/lamsfoundation/lams/lesson/service/ILessonService.java (.../ILessonService.java) (revision 6a93b1b03ef0e2e65d7376991ad3ccca9cd6aef4) @@ -62,35 +62,40 @@ public interface ILessonService { /** Get all the learners who have started the lesson. They may not be currently online. */ - abstract List getActiveLessonLearners(Long lessonId); + List getActiveLessonLearners(Long lessonId); /** * Get all the learners who have started the lesson and are part of a given group. They may not be currently online. */ - abstract List getActiveLessonLearnersByGroup(Long lessonId, Long groupId); + List getActiveLessonLearnersByGroup(Long lessonId, Long groupId); /** * Get the count of all the learners who have started the lesson. They may not be currently online. */ Integer getCountActiveLessonLearners(Long lessonId); /** + * Get the count of all the learners who are a part of the lesson class. + */ + Integer getCountLessonLearners(Long lessonId); + + /** * Get the lesson details for the LAMS client. Suitable for the monitoring client. Contains a count of the total * number of learners in the lesson and the number of active learners. This is a pretty intensive call as it counts * all the learners in the lessons' learner group, and determines the number of active learners. * * @param lessonId * @return lesson details */ - abstract LessonDetailsDTO getLessonDetails(Long lessonId); + LessonDetailsDTO getLessonDetails(Long lessonId); /** * Get the lesson object. * * @param lessonId * @return lesson details */ - abstract Lesson getLesson(Long lessonId); + Lesson getLesson(Long lessonId); /** * Get the lesson details for the LAMS client. Suitable for the learner client. Contains a reduced number of fields @@ -99,7 +104,7 @@ * @param lessonId * @return lesson details */ - abstract LessonDTO getLessonData(Long lessonId); + LessonDTO getLessonData(Long lessonId); /** * If the supplied learner is not already in a group, then perform grouping for the learners who have started the @@ -343,7 +348,7 @@ * @param organisationId * @return list of lessons */ - abstract List getLessonsByGroupAndUser(Integer userId, Integer organisationId); + List getLessonsByGroupAndUser(Integer userId, Integer organisationId); /** * Return list of organisation's non-removed lessons. @@ -373,7 +378,6 @@ * @return learner's progress */ List getUserProgressForLesson(Long lessonId); - /** * Gets list of lessons which are originally based on the given learning design id. Index: lams_common/src/java/org/lamsfoundation/lams/lesson/service/LessonService.java =================================================================== diff -u -r9f419a19d1664fcd4a85c03c89e81d0137f60f5d -r6a93b1b03ef0e2e65d7376991ad3ccca9cd6aef4 --- lams_common/src/java/org/lamsfoundation/lams/lesson/service/LessonService.java (.../LessonService.java) (revision 9f419a19d1664fcd4a85c03c89e81d0137f60f5d) +++ lams_common/src/java/org/lamsfoundation/lams/lesson/service/LessonService.java (.../LessonService.java) (revision 6a93b1b03ef0e2e65d7376991ad3ccca9cd6aef4) @@ -122,6 +122,11 @@ } @Override + public Integer getCountLessonLearners(Long lessonId) { + return lessonDAO.getCountLearnerByLesson(lessonId); + } + + @Override public LessonDetailsDTO getLessonDetails(Long lessonId) { Lesson lesson = lessonDAO.getLesson(lessonId); LessonDetailsDTO dto = null; Index: lams_monitoring/src/java/org/lamsfoundation/lams/monitoring/service/IMonitoringService.java =================================================================== diff -u -r9f419a19d1664fcd4a85c03c89e81d0137f60f5d -r6a93b1b03ef0e2e65d7376991ad3ccca9cd6aef4 --- lams_monitoring/src/java/org/lamsfoundation/lams/monitoring/service/IMonitoringService.java (.../IMonitoringService.java) (revision 9f419a19d1664fcd4a85c03c89e81d0137f60f5d) +++ lams_monitoring/src/java/org/lamsfoundation/lams/monitoring/service/IMonitoringService.java (.../IMonitoringService.java) (revision 6a93b1b03ef0e2e65d7376991ad3ccca9cd6aef4) @@ -35,7 +35,6 @@ import org.lamsfoundation.lams.learningdesign.Group; import org.lamsfoundation.lams.learningdesign.GroupingActivity; import org.lamsfoundation.lams.learningdesign.ScheduleGateActivity; -import org.lamsfoundation.lams.learningdesign.ToolActivity; import org.lamsfoundation.lams.lesson.LearnerProgress; import org.lamsfoundation.lams.lesson.Lesson; import org.lamsfoundation.lams.lesson.service.LessonServiceException; @@ -681,32 +680,30 @@ /** Get the record of the learner's progress for a particular lesson */ LearnerProgress getLearnerProgress(Integer learnerId, Long lessonId); - /** - * Get progress for learners who most recently entered finished the lesson. + * Get learners who most recently entered finished the lesson. */ - List getCompletedLearnerProgressLatest(Long lessonId, Integer limit); - + List getLearnersLatestCompleted(Long lessonId, Integer limit, Integer offset); + /** - * Get progress for learners who most recently entered the activity. + * Get learners who most recently entered the activity. */ - List getLearnerProgressLatest(Long activityId, Integer limit); + List getLearnersLatestByActivity(Long activityId, Integer limit, Integer offset); - /** - * Get progress for learners who are at the given activity at the moment. + * Get learners who are at the given activities at the moment. */ - List getLearnerProgressByActivity(Long activityId, Integer limit, Integer offset); + List getLearnersByActivities(Long[] activityIds, Integer limit, Integer offset); /** * Get number of learners who are at the given activity at the moment. */ - Integer getCountLearnerProgressCurrentActivity(Activity activity); - + Integer getCountLearnersCurrentActivity(Activity activity); + /** * Get number of learners who finished the given lesson. */ - Integer getCountLearnerProgressCompletedLesson(Long lessonId); + Integer getCountLearnersCompletedLesson(Long lessonId); /** * Set a groups name @@ -731,7 +728,7 @@ */ int cloneLessons(String[] lessonIds, Boolean addAllStaff, Boolean addAllLearners, String[] staffIds, String[] learnerIds, Organisation group) throws MonitoringServiceException; - + /** * Get list of users who completed the given lesson. */ Index: lams_monitoring/src/java/org/lamsfoundation/lams/monitoring/service/MonitoringService.java =================================================================== diff -u -r9f419a19d1664fcd4a85c03c89e81d0137f60f5d -r6a93b1b03ef0e2e65d7376991ad3ccca9cd6aef4 --- lams_monitoring/src/java/org/lamsfoundation/lams/monitoring/service/MonitoringService.java (.../MonitoringService.java) (revision 9f419a19d1664fcd4a85c03c89e81d0137f60f5d) +++ lams_monitoring/src/java/org/lamsfoundation/lams/monitoring/service/MonitoringService.java (.../MonitoringService.java) (revision 6a93b1b03ef0e2e65d7376991ad3ccca9cd6aef4) @@ -2360,27 +2360,27 @@ } @Override - public List getLearnerProgressLatest(Long activityId, Integer limit) { - return learnerProgressDAO.getLearnerProgressLatestByActivity(activityId, limit); + public List getLearnersLatestByActivity(Long activityId, Integer limit, Integer offset) { + return learnerProgressDAO.getLearnersLatestByActivity(activityId, limit, offset); } @Override - public List getLearnerProgressByActivity(Long activityId, Integer limit, Integer offset) { - return learnerProgressDAO.getLearnerProgressByActivity(activityId, limit, offset); + public List getLearnersByActivities(Long[] activityIds, Integer limit, Integer offset) { + return learnerProgressDAO.getLearnersByActivities(activityIds, limit, offset); } @Override - public List getCompletedLearnerProgressLatest(Long lessonId, Integer limit) { - return learnerProgressDAO.getCompletedLearnerProgressLatestForLesson(lessonId, limit); + public List getLearnersLatestCompleted(Long lessonId, Integer limit, Integer offset) { + return learnerProgressDAO.getLearnersLatestCompletedForLesson(lessonId, limit, offset); } @Override - public Integer getCountLearnerProgressCurrentActivity(Activity activity) { + public Integer getCountLearnersCurrentActivity(Activity activity) { return learnerProgressDAO.getNumUsersCurrentActivity(activity); } @Override - public Integer getCountLearnerProgressCompletedLesson(Long lessonId) { + public Integer getCountLearnersCompletedLesson(Long lessonId) { return learnerProgressDAO.getNumUsersCompletedLesson(lessonId); } Index: lams_monitoring/src/java/org/lamsfoundation/lams/monitoring/web/MonitoringAction.java =================================================================== diff -u -r9f419a19d1664fcd4a85c03c89e81d0137f60f5d -r6a93b1b03ef0e2e65d7376991ad3ccca9cd6aef4 --- lams_monitoring/src/java/org/lamsfoundation/lams/monitoring/web/MonitoringAction.java (.../MonitoringAction.java) (revision 9f419a19d1664fcd4a85c03c89e81d0137f60f5d) +++ lams_monitoring/src/java/org/lamsfoundation/lams/monitoring/web/MonitoringAction.java (.../MonitoringAction.java) (revision 6a93b1b03ef0e2e65d7376991ad3ccca9cd6aef4) @@ -41,6 +41,7 @@ import java.util.Map; import java.util.Set; import java.util.TreeMap; +import java.util.TreeSet; import javax.servlet.ServletException; import javax.servlet.http.HttpServletRequest; @@ -740,23 +741,23 @@ } else { boolean flaFormat = WebUtil.readBooleanParam(request, "flaFormat", true); Activity activity = getMonitoringService().getActivityById(activityId); - List learnerProgresses = getMonitoringService().getLearnerProgressByActivity(activityId, - null, null); - for (LearnerProgress learnerProgress : learnerProgresses) { - responseJSON.put(WebUtil.userToJSON(learnerProgress.getUser())); - } + Set activities = new TreeSet(); + activities.add(activityId); - // for the Flas format of LD SVGs, children activities are hidden and the parent activity shows all learners + // for the Flash format of LD SVGs, children activities are hidden + // and the parent activity shows all learners if (!flaFormat && (activity.isBranchingActivity() || activity.isOptionsWithSequencesActivity())) { Set descendants = getDescendants((ComplexActivity) activity); for (Activity descendat : descendants) { - learnerProgresses = getMonitoringService().getLearnerProgressByActivity(descendat.getActivityId(), - null, null); - for (LearnerProgress learnerProgress : learnerProgresses) { - responseJSON.put(WebUtil.userToJSON(learnerProgress.getUser())); - } + activities.add(descendat.getActivityId()); } } + + List learners = getMonitoringService().getLearnersByActivities(activities.toArray(new Long[] {}), + null, null); + for (User learner : learners) { + responseJSON.put(WebUtil.userToJSON(learner)); + } } response.setContentType("application/json;charset=utf-8"); @@ -1050,14 +1051,14 @@ JSONObject responseJSON = new JSONObject(); Lesson lesson = getLessonService().getLesson(lessonId); - LessonDetailsDTO lessonDetails = lesson.getLessonDetails(); - String contentFolderId = lessonDetails.getContentFolderID(); + LearningDesign learningDesign = lesson.getLearningDesign(); + String contentFolderId = learningDesign.getContentFolderID(); Locale userLocale = new Locale(user.getLocaleLanguage(), user.getLocaleCountry()); - responseJSON.put(AttributeNames.PARAM_LEARNINGDESIGN_ID, lessonDetails.getLearningDesignID()); - responseJSON.put("numberPossibleLearners", lessonDetails.getNumberPossibleLearners()); - responseJSON.put("lessonStateID", lessonDetails.getLessonStateID()); + responseJSON.put(AttributeNames.PARAM_LEARNINGDESIGN_ID, learningDesign.getLearningDesignId()); + responseJSON.put("numberPossibleLearners", getLessonService().getCountLessonLearners(lessonId)); + responseJSON.put("lessonStateID", lesson.getLessonStateId()); Date startOrScheduleDate = lesson.getStartDateTime() == null ? lesson.getScheduleStartDate() : lesson.getStartDateTime(); @@ -1097,7 +1098,7 @@ LearningDesign learningDesign = lesson.getLearningDesign(); String contentFolderId = learningDesign.getContentFolderID(); - // find out if the LD SVG is in new Flashless (exploded) format + // find out if the LD SVG is in new Flashless (exploded) format JSONObject responseJSON = new JSONObject(); boolean flaFormat = false; for (Activity activity : (Set) learningDesign.getActivities()) { @@ -1211,28 +1212,27 @@ int learnerCount = 0; if (activity.isBranchingActivity() || activity.isOptionsWithSequencesActivity()) { // go through hidden children of complex activities and take them into account - learnerCount += getMonitoringService().getCountLearnerProgressCurrentActivity(activity); + learnerCount += getMonitoringService().getCountLearnersCurrentActivity(activity); Set children = parentToChildren.get(activityId); if (children != null) { for (Activity child : children) { - learnerCount += getMonitoringService().getCountLearnerProgressCurrentActivity(child); + learnerCount += getMonitoringService().getCountLearnersCurrentActivity(child); } } } else { - List latestLearnerProgress = getMonitoringService().getLearnerProgressLatest( - activity.getActivityId(), MonitoringAction.LATEST_LEARNER_PROGRESS_ACTIVITY_DISPLAY_LIMIT); - if (latestLearnerProgress.size() < MonitoringAction.LATEST_LEARNER_PROGRESS_ACTIVITY_DISPLAY_LIMIT) { + List latestLearners = getMonitoringService().getLearnersLatestByActivity(activity.getActivityId(), + MonitoringAction.LATEST_LEARNER_PROGRESS_ACTIVITY_DISPLAY_LIMIT, null); + if (latestLearners.size() < MonitoringAction.LATEST_LEARNER_PROGRESS_ACTIVITY_DISPLAY_LIMIT) { // if there are less learners than the limit, we already know the size - learnerCount = latestLearnerProgress.size(); + learnerCount = latestLearners.size(); } else { - learnerCount = getMonitoringService().getCountLearnerProgressCurrentActivity(activity); + learnerCount = getMonitoringService().getCountLearnersCurrentActivity(activity); } // parse learners into JSON format - if (!latestLearnerProgress.isEmpty()) { + if (!latestLearners.isEmpty()) { JSONArray learnersJSON = new JSONArray(); - for (LearnerProgress learnerProgress : latestLearnerProgress) { - User learner = learnerProgress.getUser(); + for (User learner : latestLearners) { learnersJSON.put(WebUtil.userToJSON(learner)); } @@ -1246,21 +1246,21 @@ responseJSON.put("activities", activitiesJSON); // find learners who completed the lesson - List completedLearners = getMonitoringService().getCompletedLearnerProgressLatest(lessonId, - MonitoringAction.LATEST_LEARNER_PROGRESS_LESSON_DISPLAY_LIMIT); - for (LearnerProgress learner : completedLearners) { - JSONObject learnerJSON = WebUtil.userToJSON(learner.getUser()); + List completedLearners = getMonitoringService().getLearnersLatestCompleted(lessonId, + MonitoringAction.LATEST_LEARNER_PROGRESS_LESSON_DISPLAY_LIMIT, null); + for (User learner : completedLearners) { + JSONObject learnerJSON = WebUtil.userToJSON(learner); // no more details are needed for learners who completed the lesson responseJSON.append("completedLearners", learnerJSON); } Integer completedLearnerCount = null; if (completedLearners.size() < MonitoringAction.LATEST_LEARNER_PROGRESS_LESSON_DISPLAY_LIMIT) { completedLearnerCount = completedLearners.size(); } else { - completedLearnerCount = getMonitoringService().getCountLearnerProgressCompletedLesson(lessonId); + completedLearnerCount = getMonitoringService().getCountLearnersCompletedLesson(lessonId); } responseJSON.put("completedLearnerCount", completedLearnerCount); - responseJSON.put("numberPossibleLearners", lesson.getAllLearners().size()); + responseJSON.put("numberPossibleLearners", getLessonService().getCountLessonLearners(lessonId)); // on first fetch get transitions metadata so Monitoring can set their SVG elems IDs if (WebUtil.readBooleanParam(request, "getTransitions", false)) { @@ -1558,7 +1558,7 @@ } /** - * Gets all children and their childre etc. of the given complex activity. + * Gets all children and their childre etc. of the given complex activity. */ @SuppressWarnings("unchecked") private Set getDescendants(ComplexActivity complexActivity) {