Index: lams_admin/src/java/org/lamsfoundation/lams/admin/web/controller/OrganisationController.java =================================================================== diff -u -rf484970651ff478e1d4355cacf6cd285ca386154 -r1ba40605c8e5fff683288c9c72f5ab2a981ba98a --- lams_admin/src/java/org/lamsfoundation/lams/admin/web/controller/OrganisationController.java (.../OrganisationController.java) (revision f484970651ff478e1d4355cacf6cd285ca386154) +++ lams_admin/src/java/org/lamsfoundation/lams/admin/web/controller/OrganisationController.java (.../OrganisationController.java) (revision 1ba40605c8e5fff683288c9c72f5ab2a981ba98a) @@ -34,7 +34,7 @@ import org.apache.commons.beanutils.BeanUtils; import org.apache.log4j.Logger; import org.lamsfoundation.lams.admin.web.form.OrganisationForm; -import org.lamsfoundation.lams.lesson.Lesson; +import org.lamsfoundation.lams.lesson.service.ILessonService; import org.lamsfoundation.lams.monitoring.service.IMonitoringService; import org.lamsfoundation.lams.security.ISecurityService; import org.lamsfoundation.lams.usermanagement.Organisation; @@ -72,6 +72,9 @@ @Autowired @Qualifier("adminMessageService") private MessageService messageService; + @Autowired + @Qualifier("lessonService") + private ILessonService lessonService; private static List status; @@ -192,19 +195,18 @@ Integer limit = WebUtil.readIntParam(request, "limit", true); Integer organisationId = WebUtil.readIntParam(request, "orgId"); Organisation organisation = (Organisation) userManagementService.findById(Organisation.class, organisationId); - for (Lesson lesson : (Set) organisation.getLessons()) { - log.info("Deleting lesson: " + lesson.getLessonId()); - // role is checked in this method - monitoringService.removeLessonPermanently(lesson.getLessonId(), userID); + List lessonIDs = lessonService.getOrganisationLessons(organisationId); + for ( Long lessonId : lessonIDs) { + log.info("Deleting lesson: " + lessonId); + // role is checked in this method. This method requires that the lesson object has not be loaded into the Hibernate cache + monitoringService.removeLessonPermanently(lessonId, userID); if (limit != null) { limit--; if (limit == 0) { break; } } } - - organisation = (Organisation) userManagementService.findById(Organisation.class, organisationId); response.setContentType("application/json;charset=utf-8"); response.getWriter().print(organisation.getLessons().size()); return null; Index: lams_common/src/java/org/lamsfoundation/lams/lesson/dao/ILessonDAO.java =================================================================== diff -u -r62aaf160878735888d077bf28fac3c1989bb8fbd -r1ba40605c8e5fff683288c9c72f5ab2a981ba98a --- lams_common/src/java/org/lamsfoundation/lams/lesson/dao/ILessonDAO.java (.../ILessonDAO.java) (revision 62aaf160878735888d077bf28fac3c1989bb8fbd) +++ lams_common/src/java/org/lamsfoundation/lams/lesson/dao/ILessonDAO.java (.../ILessonDAO.java) (revision 1ba40605c8e5fff683288c9c72f5ab2a981ba98a) @@ -208,4 +208,10 @@ * Finds IDs of preview lessons. */ List getPreviewLessons(Integer limit); + + /** + * Finds IDs of all lessons in an organisation. When calling MonitoringService.removeLessonPermanently() you cannot load the Lessons + * or a Hibernate error occurs. So we need a way to get the ids withouth calling Organisation.getLessons() + */ + List getOrganisationLessons(Integer organisationId) ; } \ No newline at end of file Index: lams_common/src/java/org/lamsfoundation/lams/lesson/dao/hibernate/LessonDAO.java =================================================================== diff -u -r62aaf160878735888d077bf28fac3c1989bb8fbd -r1ba40605c8e5fff683288c9c72f5ab2a981ba98a --- lams_common/src/java/org/lamsfoundation/lams/lesson/dao/hibernate/LessonDAO.java (.../LessonDAO.java) (revision 62aaf160878735888d077bf28fac3c1989bb8fbd) +++ lams_common/src/java/org/lamsfoundation/lams/lesson/dao/hibernate/LessonDAO.java (.../LessonDAO.java) (revision 1ba40605c8e5fff683288c9c72f5ab2a981ba98a) @@ -32,8 +32,8 @@ import org.apache.commons.lang.StringEscapeUtils; import org.apache.commons.lang.StringUtils; import org.hibernate.FetchMode; -import org.hibernate.Query; import org.hibernate.criterion.Restrictions; +import org.hibernate.query.Query; import org.lamsfoundation.lams.dao.hibernate.LAMSBaseDAO; import org.lamsfoundation.lams.learningdesign.Activity; import org.lamsfoundation.lams.learningdesign.LearningDesign; @@ -95,6 +95,9 @@ private final static String FIND_PREVIEW_LESSON_IDS = "SELECT lesson.lessonId FROM " + Lesson.class.getName() + " AS lesson WHERE lesson.learningDesign.copyTypeID = " + LearningDesign.COPY_TYPE_PREVIEW; + private final static String FIND_LESSON_IDS_BY_ORG_ID = "SELECT lesson.lessonId FROM " + Lesson.class.getName() + + " AS lesson WHERE lesson.organisation.organisationId = :organisationId"; + /** * Retrieves the Lesson. Used in instances where it cannot be lazy loaded so it forces an initialize. * @@ -104,7 +107,7 @@ */ @Override public Lesson getLesson(Long lessonId) { - Lesson lesson = (Lesson) getSession().get(Lesson.class, lessonId); + Lesson lesson = getSession().get(Lesson.class, lessonId); return lesson; } @@ -372,7 +375,7 @@ queryTextBuilder.append(" ORDER BY users.first_name ").append(order).append(", users.last_name ").append(order) .append(", users.login ").append(order); - Query query = getSession().createSQLQuery(queryTextBuilder.toString()).addEntity(User.class) + Query query = getSession().createSQLQuery(queryTextBuilder.toString()).addEntity(User.class) .addScalar("participant").setLong("lessonId", lessonId) .setInteger("roleId", role.equals(Role.MONITOR) ? Role.ROLE_MONITOR : Role.ROLE_LEARNER); if (limit != null) { @@ -406,10 +409,18 @@ @Override @SuppressWarnings("unchecked") public List getPreviewLessons(Integer limit) { - Query query = getSession().createQuery(FIND_PREVIEW_LESSON_IDS); + Query query = getSession().createQuery(FIND_PREVIEW_LESSON_IDS); if (limit != null) { query.setMaxResults(limit); } return query.list(); } + + @Override + @SuppressWarnings("unchecked") + public List getOrganisationLessons(Integer organisationId) { + Query query = getSession().createQuery(FIND_LESSON_IDS_BY_ORG_ID).setParameter("organisationId", organisationId); + return query.list(); + } + } \ No newline at end of file Index: lams_common/src/java/org/lamsfoundation/lams/lesson/service/ILessonService.java =================================================================== diff -u -r7475d08afc280b5e2e5ddf04e8bf35e3166aaf80 -r1ba40605c8e5fff683288c9c72f5ab2a981ba98a --- lams_common/src/java/org/lamsfoundation/lams/lesson/service/ILessonService.java (.../ILessonService.java) (revision 7475d08afc280b5e2e5ddf04e8bf35e3166aaf80) +++ lams_common/src/java/org/lamsfoundation/lams/lesson/service/ILessonService.java (.../ILessonService.java) (revision 1ba40605c8e5fff683288c9c72f5ab2a981ba98a) @@ -436,4 +436,10 @@ * Finds IDs of preview lessons. */ List getPreviewLessons(Integer limit); + + /** + * Finds IDs of all lessons in an organisation. When calling MonitoringService.removeLessonPermanently() you cannot load the Lessons + * or a Hibernate error occurs. So we need a way to get the ids withouth calling Organisation.getLessons() + */ + List getOrganisationLessons(Integer organisationId); } \ No newline at end of file Index: lams_common/src/java/org/lamsfoundation/lams/lesson/service/LessonService.java =================================================================== diff -u -r7475d08afc280b5e2e5ddf04e8bf35e3166aaf80 -r1ba40605c8e5fff683288c9c72f5ab2a981ba98a --- lams_common/src/java/org/lamsfoundation/lams/lesson/service/LessonService.java (.../LessonService.java) (revision 7475d08afc280b5e2e5ddf04e8bf35e3166aaf80) +++ lams_common/src/java/org/lamsfoundation/lams/lesson/service/LessonService.java (.../LessonService.java) (revision 1ba40605c8e5fff683288c9c72f5ab2a981ba98a) @@ -690,6 +690,11 @@ } @Override + public List getOrganisationLessons(Integer organisationId) { + return lessonDAO.getOrganisationLessons(organisationId) ; + } + + @Override public boolean checkLessonReleaseConditions(Long lessonId, Integer learnerId) { Lesson lesson = getLesson(lessonId); if (lesson != null) { Index: lams_monitoring/src/java/org/lamsfoundation/lams/monitoring/service/MonitoringService.java =================================================================== diff -u -r16ea556312dac478f654bac234b1aecbebf049f5 -r1ba40605c8e5fff683288c9c72f5ab2a981ba98a --- lams_monitoring/src/java/org/lamsfoundation/lams/monitoring/service/MonitoringService.java (.../MonitoringService.java) (revision 16ea556312dac478f654bac234b1aecbebf049f5) +++ lams_monitoring/src/java/org/lamsfoundation/lams/monitoring/service/MonitoringService.java (.../MonitoringService.java) (revision 1ba40605c8e5fff683288c9c72f5ab2a981ba98a) @@ -1110,6 +1110,11 @@ @SuppressWarnings("unchecked") @Override + // For this method to work, the Lesson must not be loaded into the Hibernate cache. If it is, then the call + // lessonDAO.deleteByProperty(Transition.class...) call will trigger a + // "deleted object would be re-saved by cascade (remove deleted object from associations)" exception + // on the Lesson object. If you only access the lesson id then it will work. You can still load the Organisation, + // but do not load the Lesson collection in the Organisation public void removeLessonPermanently(long lessonId, Integer userId) { securityService.isLessonMonitor(lessonId, userId, "remove lesson permanently", true);