Index: lams_common/conf/hibernate/mappings/org/lamsfoundation/lams/learningdesign/Grouping.hbm.xml =================================================================== diff -u -r4ec6567d23397141210e7c6979f4293c1d99a5d0 -r7e008c96c3f7a56c3c90cff94b5225865b8d99ba --- lams_common/conf/hibernate/mappings/org/lamsfoundation/lams/learningdesign/Grouping.hbm.xml (.../Grouping.hbm.xml) (revision 4ec6567d23397141210e7c6979f4293c1d99a5d0) +++ lams_common/conf/hibernate/mappings/org/lamsfoundation/lams/learningdesign/Grouping.hbm.xml (.../Grouping.hbm.xml) (revision 7e008c96c3f7a56c3c90cff94b5225865b8d99ba) @@ -32,7 +32,7 @@ - + @hibernate.set lazy="true" inverse="true" cascade="none" @hibernate.collection-key column="grouping_id" @hibernate.collection-one-to-many class="org.lamsfoundation.lams.learningdesign.Group" @@ -78,7 +78,7 @@ class="org.lamsfoundation.lams.learningdesign.Group" column="staff_group_id" unique="true" - cascade="none"/> + cascade="all"/> - - - - - - - @@ -78,7 +70,7 @@ class="org.lamsfoundation.lams.lesson.LessonClass" column="class_grouping_id" unique="true" - cascade = "save-update"/> + cascade = "all"/> permanently. * @param lesson the Lesson to remove. */ public void deleteLessonClass(LessonClass lessonClass); + } Index: lams_common/src/java/org/lamsfoundation/lams/lesson/dao/ILessonDAO.java =================================================================== diff -u -rc3b4b51a62bf1841f6d6667a26b47019e607d3c4 -r7e008c96c3f7a56c3c90cff94b5225865b8d99ba --- lams_common/src/java/org/lamsfoundation/lams/lesson/dao/ILessonDAO.java (.../ILessonDAO.java) (revision c3b4b51a62bf1841f6d6667a26b47019e607d3c4) +++ lams_common/src/java/org/lamsfoundation/lams/lesson/dao/ILessonDAO.java (.../ILessonDAO.java) (revision 7e008c96c3f7a56c3c90cff94b5225865b8d99ba) @@ -26,6 +26,9 @@ */ public Lesson getLesson(Long lessonId); + public List getAllLessons(); + + public Lesson getLessonWithEagerlyFetchedProgress(Long lessonId); /** * Gets all lessons that are active for a learner. * @param learner a User that identifies the learner. @@ -53,4 +56,5 @@ */ public LearnerProgress getLearnerProgress(User learner, Lesson lesson); + } Index: lams_common/src/java/org/lamsfoundation/lams/lesson/dao/hibernate/LessonClassDAO.java =================================================================== diff -u -rc3b4b51a62bf1841f6d6667a26b47019e607d3c4 -r7e008c96c3f7a56c3c90cff94b5225865b8d99ba --- lams_common/src/java/org/lamsfoundation/lams/lesson/dao/hibernate/LessonClassDAO.java (.../LessonClassDAO.java) (revision c3b4b51a62bf1841f6d6667a26b47019e607d3c4) +++ lams_common/src/java/org/lamsfoundation/lams/lesson/dao/hibernate/LessonClassDAO.java (.../LessonClassDAO.java) (revision 7e008c96c3f7a56c3c90cff94b5225865b8d99ba) @@ -6,6 +6,7 @@ package org.lamsfoundation.lams.lesson.dao.hibernate; + import org.springframework.orm.hibernate.support.HibernateDaoSupport; import org.lamsfoundation.lams.lesson.LessonClass; @@ -40,5 +41,14 @@ { getHibernateTemplate().delete(lessonClass); } + + /** + * @see org.lamsfoundation.lams.lesson.dao.ILessonClassDAO#updateLessonClass(org.lamsfoundation.lams.lesson.LessonClass) + */ + public void updateLessonClass(LessonClass lessonClass) + { + getHibernateTemplate().update(lessonClass); + + } } Index: lams_common/src/java/org/lamsfoundation/lams/lesson/dao/hibernate/LessonDAO.java =================================================================== diff -u -rc3b4b51a62bf1841f6d6667a26b47019e607d3c4 -r7e008c96c3f7a56c3c90cff94b5225865b8d99ba --- lams_common/src/java/org/lamsfoundation/lams/lesson/dao/hibernate/LessonDAO.java (.../LessonDAO.java) (revision c3b4b51a62bf1841f6d6667a26b47019e607d3c4) +++ lams_common/src/java/org/lamsfoundation/lams/lesson/dao/hibernate/LessonDAO.java (.../LessonDAO.java) (revision 7e008c96c3f7a56c3c90cff94b5225865b8d99ba) @@ -7,14 +7,13 @@ package org.lamsfoundation.lams.lesson.dao.hibernate; import java.util.List; -import java.util.Set; + +import net.sf.hibernate.FetchMode; import net.sf.hibernate.HibernateException; import net.sf.hibernate.Query; import net.sf.hibernate.Session; -import org.springframework.dao.DataAccessException; -import org.springframework.dao.DataRetrievalFailureException; import org.springframework.orm.hibernate.HibernateCallback; import org.springframework.orm.hibernate.HibernateTemplate; import org.springframework.orm.hibernate.support.HibernateDaoSupport; @@ -40,6 +39,28 @@ return (Lesson)getHibernateTemplate().get(Lesson.class, lessonId); } + + public Lesson getLessonWithEagerlyFetchedProgress(Long lessonId) + { + HibernateTemplate hibernateTemplate = new HibernateTemplate(this.getSessionFactory()); + + return (Lesson)hibernateTemplate.execute( + new HibernateCallback() + { + public Object doInHibernate(Session session) throws HibernateException + { + return session.createCriteria(Lesson.class) + .setFetchMode("learnerProgresses",FetchMode.EAGER) + .uniqueResult(); + } + } + ); + } + + public List getAllLessons() + { + return getHibernateTemplate().loadAll(Lesson.class); + } /** * Gets all lessons that are active for a learner. * @param learner a User that identifies the learner. Index: lams_common/test/java/org/lamsfoundation/lams/AbstractLamsCommonTestCase.java =================================================================== diff -u -r6eb1e89c36a16cadbb773f1fbc03cf8e7aad2ee9 -r7e008c96c3f7a56c3c90cff94b5225865b8d99ba --- lams_common/test/java/org/lamsfoundation/lams/AbstractLamsCommonTestCase.java (.../AbstractLamsCommonTestCase.java) (revision 6eb1e89c36a16cadbb773f1fbc03cf8e7aad2ee9) +++ lams_common/test/java/org/lamsfoundation/lams/AbstractLamsCommonTestCase.java (.../AbstractLamsCommonTestCase.java) (revision 7e008c96c3f7a56c3c90cff94b5225865b8d99ba) @@ -11,8 +11,14 @@ import junit.framework.TestCase; +import net.sf.hibernate.Session; +import net.sf.hibernate.SessionFactory; + import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; +import org.springframework.orm.hibernate.SessionFactoryUtils; +import org.springframework.orm.hibernate.SessionHolder; +import org.springframework.transaction.support.TransactionSynchronizationManager; /** @@ -39,6 +45,11 @@ { super.setUp(); ac = new ClassPathXmlApplicationContext(getContextConfigLocation()); + //hold the hibernate session + SessionFactory sessionFactory = (SessionFactory) this.ac.getBean("coreSessionFactory"); + Session s = sessionFactory.openSession(); + TransactionSynchronizationManager.bindResource(sessionFactory, new SessionHolder(s)); + } protected abstract String[] getContextConfigLocation(); @@ -49,5 +60,14 @@ protected void tearDown() throws Exception { super.tearDown(); + //clean the hibernate session + SessionFactory sessionFactory = (SessionFactory)this.ac.getBean("coreSessionFactory"); + SessionHolder holder = (SessionHolder)TransactionSynchronizationManager.getResource(sessionFactory); + if (holder != null) { + Session s = holder.getSession(); + s.flush(); + TransactionSynchronizationManager.unbindResource(sessionFactory); + SessionFactoryUtils.closeSessionIfNecessary(s, sessionFactory); + } } } Index: lams_common/test/java/org/lamsfoundation/lams/lesson/LessonDataAccessTestCase.java =================================================================== diff -u -r4ec6567d23397141210e7c6979f4293c1d99a5d0 -r7e008c96c3f7a56c3c90cff94b5225865b8d99ba --- lams_common/test/java/org/lamsfoundation/lams/lesson/LessonDataAccessTestCase.java (.../LessonDataAccessTestCase.java) (revision 4ec6567d23397141210e7c6979f4293c1d99a5d0) +++ lams_common/test/java/org/lamsfoundation/lams/lesson/LessonDataAccessTestCase.java (.../LessonDataAccessTestCase.java) (revision 7e008c96c3f7a56c3c90cff94b5225865b8d99ba) @@ -21,15 +21,23 @@ import org.lamsfoundation.lams.learningdesign.LearningDesign; import org.lamsfoundation.lams.learningdesign.dao.ILearningDesignDAO; import org.lamsfoundation.lams.learningdesign.dao.hibernate.LearningDesignDAO; +import org.lamsfoundation.lams.lesson.dao.ILessonClassDAO; +import org.lamsfoundation.lams.lesson.dao.ILessonDAO; +import org.lamsfoundation.lams.lesson.dao.hibernate.LessonClassDAO; +import org.lamsfoundation.lams.lesson.dao.hibernate.LessonDAO; import org.lamsfoundation.lams.usermanagement.Organisation; import org.lamsfoundation.lams.usermanagement.User; import org.lamsfoundation.lams.usermanagement.dao.IOrganisationDAO; import org.lamsfoundation.lams.usermanagement.dao.IUserDAO; import org.lamsfoundation.lams.usermanagement.dao.hibernate.OrganisationDAO; import org.lamsfoundation.lams.usermanagement.dao.hibernate.UserDAO; + /** - * + * The super class for lesson related data access test. It defines services, + * such as initialize lesson data and clean up lesson data, for its descendents. + * It also act as a good example of creating and deleting lesson object that + * can be used by client. * @author Jacky Fang 2/02/2005 * */ @@ -42,6 +50,8 @@ protected IUserDAO userDao; protected ILearningDesignDAO learningDesignDao; protected IOrganisationDAO orgDao; + protected ILessonDAO lessonDao; + protected ILessonClassDAO lessonClassDao; //--------------------------------------------------------------------- // Domain Object instances //--------------------------------------------------------------------- @@ -57,8 +67,8 @@ private final Long TEST_LEARNING_DESIGN_ID = new Long(1); private final Integer TEST_ORGANIZATION_ID = new Integer(1); private final int TEST_GROUP_ORDER_ID = 0; - private final Long TEST_CLASS_GROUPING_ID = new Long(1); + //--------------------------------------------------------------------- // Overidden methods //--------------------------------------------------------------------- @@ -76,6 +86,7 @@ protected void setUp() throws Exception { super.setUp(); + userDao = (UserDAO) this.ac.getBean("userDAO"); learningDesignDao = (LearningDesignDAO) this.ac.getBean("learningDesignDAO"); orgDao = (OrganisationDAO) this.ac.getBean("organisationDAO"); @@ -84,6 +95,10 @@ testUser = userDao.getUserById(TEST_USER_ID); testLearningDesign = learningDesignDao.getLearningDesignById(TEST_LEARNING_DESIGN_ID); testOrg = orgDao.getOrganisationById(TEST_ORGANIZATION_ID); + + //get lesson related daos + lessonDao = (LessonDAO)this.ac.getBean("lessonDAO"); + lessonClassDao = (LessonClassDAO)this.ac.getBean("lessonClassDAO"); } /** @@ -106,29 +121,59 @@ //--------------------------------------------------------------------- // Data initialization and finalization methods //--------------------------------------------------------------------- - - protected void initLessonData() + /** + * Initialize the whole lesson object. This also act as an example of + * creating a new lesson for a learning design. + * + * We have to creat lesson class before create group due to the not null + * field(grouping_id) in the group object. + * + */ + protected void initializeTestLesson() { - - testLesson = new Lesson(new Date(System.currentTimeMillis()), - testUser, - Lesson.NOT_STARTED_STATE, - testLearningDesign, - testLessonClass,//lesson class - testOrg, - new HashSet()); - - testLesson.setLessonClass(createTestLessonClass(testLesson)); + this.initLessonClassData(); + lessonClassDao.saveLessonClass(this.testLessonClass); + + this.setUpGroupsForClass(); + lessonClassDao.updateLessonClass(this.testLessonClass); + + this.initLessonData(); + lessonDao.saveLesson(testLesson); } - + + /** + * Remove the target lesson from database. We have to clean up the groups + * first. We are using hibernate transparent persistant mechanism. To make + * the deletion of groups work, we have to setup "all-delete-orphan" for + * groups collection + * @param lesson the lesson needs to be removed. + */ + protected void cleanUpTestLesson(Lesson lesson) + { + lesson.getLessonClass().getGroups().clear(); + lessonDao.deleteLesson(lesson); + } + + /** + * Create a lesson class with empty group information. + */ protected void initLessonClassData() { - testLessonClass = new LessonClass(TEST_CLASS_GROUPING_ID, //grouping id + //make a copy of lazily initialized activities + Set activities = new HashSet(testLearningDesign.getActivities()); + testLessonClass = new LessonClass(null, //grouping id Grouping.CLASS_GROUPING_TYPE, new HashSet(),//groups - testLearningDesign.getActivities(), + activities, null, //staff group testLesson); + } + + /** + * Setup groups(learner group and staff group) fro created lesson class. + */ + protected void setUpGroupsForClass() + { //create a new staff group Set staffs = new HashSet(); staffs.add(testUser); @@ -141,25 +186,63 @@ //create learner class group Set learnergroups = new HashSet(); + //make a copy of lazily initialized users + Set users = new HashSet(testOrg.getUsers()); Group learnerClassGroup = new Group(null,//group id TEST_GROUP_ORDER_ID, testLessonClass, - testOrg.getUsers(), + users, new HashSet());//tool session, should be empty now learnergroups.add(learnerClassGroup); + testLessonClass.setGroups(learnergroups); } + + /** + * Create lesson based on the information we initialized. + */ + protected void initLessonData() + { + testLesson = new Lesson(new Date(System.currentTimeMillis()), + testUser, + Lesson.NOT_STARTED_STATE, + testLearningDesign, + testLessonClass,//lesson class + testOrg, + new HashSet()); + } + + //--------------------------------------------------------------------- // Helper methods //--------------------------------------------------------------------- /** - * Create test lesson class based on the give lesson - * @param lesson the lesson for the class we are going to create - * @return the new Lesson Class transiant hibernate object + * Helper method to validate the created lesson class. This validation + * method can be reused by sub-classes. */ - private LessonClass createTestLessonClass(Lesson lesson) + protected void assertLessonClass() { - - return testLessonClass; + LessonClass createdLessonClass = lessonClassDao.getLessonClass(this.testLessonClass.getGroupingId()); + assertEquals("check up number of activities",1,createdLessonClass.getActivities().size()); + assertEquals("check up staff groups",1,createdLessonClass.getStaffGroup().getUsers().size()); + assertEquals("check up grouping types, should be class grouping",Grouping.CLASS_GROUPING_TYPE,createdLessonClass.getGroupingTypeId()); + assertEquals("check up learner groups",1,createdLessonClass.getGroups().size()); } + /** + * Helper method to validate the created lesson. This validation + * method can be reused by sub-classes. + */ + protected void assertLesson() + { + Lesson createdLesson = lessonDao.getLesson(this.testLesson.getLessonId()); + assertEquals("check up creation time",testLesson.getCreateDateTime().toString(), + createdLesson.getCreateDateTime().toString()); + assertEquals("check up user who created this lesson",testUser.getLogin(),createdLesson.getUser().getLogin()); + assertEquals("check up the lesson state",Lesson.NOT_STARTED_STATE,createdLesson.getLessonStateId()); + assertEquals("check up the learning design that used to create lesson", + testLearningDesign.getTitle(), + createdLesson.getLearningDesign().getTitle()); + assertEquals("check up the organization", testOrg.getName(),createdLesson.getOrganisation().getName()); + + } } \ No newline at end of file Index: lams_common/test/java/org/lamsfoundation/lams/lesson/dao/TestCleanUpLesson.java =================================================================== diff -u --- lams_common/test/java/org/lamsfoundation/lams/lesson/dao/TestCleanUpLesson.java (revision 0) +++ lams_common/test/java/org/lamsfoundation/lams/lesson/dao/TestCleanUpLesson.java (revision 7e008c96c3f7a56c3c90cff94b5225865b8d99ba) @@ -0,0 +1,63 @@ +/* ******************************************************************************** + * Copyright Notice + * ================= + * This file contains propriety information of LAMS Foundation. + * Copying or reproduction with prior written permission is prohibited. + * Copyright (c) 2005 + * Created on 4/02/2005 + ******************************************************************************** */ + +package org.lamsfoundation.lams.lesson.dao; + +import java.util.Iterator; +import java.util.List; + +import org.lamsfoundation.lams.lesson.Lesson; +import org.lamsfoundation.lams.lesson.LessonDataAccessTestCase; + + +/** + * + * @author Jacky Fang 4/02/2005 + * + */ +public class TestCleanUpLesson extends LessonDataAccessTestCase +{ + private static Long TEST_LESSON_ID = new Long(1); + /** + * @param name + */ + public TestCleanUpLesson(String name) + { + super(name); + } + + /* + * @see LessonDataAccessTestCase#setUp() + */ + protected void setUp() throws Exception + { + super.setUp(); + } + + /* + * @see LessonDataAccessTestCase#tearDown() + */ + protected void tearDown() throws Exception + { + super.tearDown(); + } + + public void testCleanUpLesson() + { + List lessons = lessonDao.getAllLessons(); + + for(Iterator i = lessons.iterator();i.hasNext();) + { + Lesson curLesson = (Lesson)i.next(); + super.cleanUpTestLesson(curLesson); + } + List cleanedLessons = lessonDao.getAllLessons(); + assertEquals("There should be a lesson in the db",0,cleanedLessons.size()); + } +} Index: lams_common/test/java/org/lamsfoundation/lams/lesson/dao/TestInitLesson.java =================================================================== diff -u -r4ec6567d23397141210e7c6979f4293c1d99a5d0 -r7e008c96c3f7a56c3c90cff94b5225865b8d99ba --- lams_common/test/java/org/lamsfoundation/lams/lesson/dao/TestInitLesson.java (.../TestInitLesson.java) (revision 4ec6567d23397141210e7c6979f4293c1d99a5d0) +++ lams_common/test/java/org/lamsfoundation/lams/lesson/dao/TestInitLesson.java (.../TestInitLesson.java) (revision 7e008c96c3f7a56c3c90cff94b5225865b8d99ba) @@ -10,8 +10,6 @@ package org.lamsfoundation.lams.lesson.dao; import org.lamsfoundation.lams.lesson.LessonDataAccessTestCase; -import org.lamsfoundation.lams.lesson.dao.hibernate.LessonClassDAO; -import org.lamsfoundation.lams.lesson.dao.hibernate.LessonDAO; /** @@ -22,16 +20,13 @@ public class TestInitLesson extends LessonDataAccessTestCase { - private ILessonDAO lessonDao; - private ILessonClassDAO lessonClassDao; + /* * @see LessonDataAccessTestCase#setUp() */ protected void setUp() throws Exception { super.setUp(); - lessonDao = (LessonDAO)this.ac.getBean("lessonDAO"); - lessonClassDao = (LessonClassDAO)this.ac.getBean("lessonClassDAO"); } /* @@ -53,10 +48,10 @@ public void testInitLesson() { - super.initLessonData(); - super.initLessonClassData(); - lessonClassDao.saveLessonClass(this.testLessonClass); - lessonDao.saveLesson(testLesson); - assertEquals("",1,1); + super.initializeTestLesson(); + //checking initialization result of lesson class + assertLessonClass(); + //checking initialization result of lesson + assertLesson(); } }