Index: lams_build/lib/lams/lams.jar =================================================================== diff -u -r20a2c3a6cd80bcf92989b3fa1e566ab93fa99afa -rb25a6d2d1cebe3c69d4af018aa14198533a0d4c5 Binary files differ Index: lams_common/src/java/org/lamsfoundation/lams/commonContext.xml =================================================================== diff -u -rf204dd4fbdffb05bc8913523b3f19312d47f9a05 -rb25a6d2d1cebe3c69d4af018aa14198533a0d4c5 --- lams_common/src/java/org/lamsfoundation/lams/commonContext.xml (.../commonContext.xml) (revision f204dd4fbdffb05bc8913523b3f19312d47f9a05) +++ lams_common/src/java/org/lamsfoundation/lams/commonContext.xml (.../commonContext.xml) (revision b25a6d2d1cebe3c69d4af018aa14198533a0d4c5) @@ -125,6 +125,7 @@ + Index: lams_common/src/java/org/lamsfoundation/lams/learningdesign/ChosenGrouper.java =================================================================== diff -u -r08950e1090443c3423a3d1c587416a2fccd8bbdf -rb25a6d2d1cebe3c69d4af018aa14198533a0d4c5 --- lams_common/src/java/org/lamsfoundation/lams/learningdesign/ChosenGrouper.java (.../ChosenGrouper.java) (revision 08950e1090443c3423a3d1c587416a2fccd8bbdf) +++ lams_common/src/java/org/lamsfoundation/lams/learningdesign/ChosenGrouper.java (.../ChosenGrouper.java) (revision b25a6d2d1cebe3c69d4af018aa14198533a0d4c5) @@ -58,62 +58,78 @@ List learners = new ArrayList(); learners.add(learner); //delegate to do grouping for a list of learners. - doGrouping(chosenGrouping,groupName, learners); + doGrouping(chosenGrouping,groupName,learners); } /** * @see org.lamsfoundation.lams.learningdesign.Grouper#doGrouping(org.lamsfoundation.lams.learningdesign.Grouping,java.lang.String, java.util.List) */ public void doGrouping(Grouping chosenGrouping,String groupName, List learners) { + Group selectedGroup = null; + String trimmedName = groupName != null ? groupName.trim() : null; if ( trimmedName == null || trimmedName.length() == 0 ) { - String prefix = getPrefix(); - trimmedName = prefix+" "+System.currentTimeMillis(); - log.warn("Chosen grouper for grouping "+chosenGrouping.toString()+" did not get a group name. Selecting default name of "+trimmedName); - } - Iterator iter = chosenGrouping.getGroups().iterator(); - Group selectedGroup = null; - while (iter.hasNext() && selectedGroup==null) { - Group group = (Group) iter.next(); - if ( trimmedName.equals(selectedGroup.getGroupName()) ) { - selectedGroup = group; + trimmedName = generateGroupName(chosenGrouping); + } else { + Iterator iter = chosenGrouping.getGroups().iterator(); + while (iter.hasNext() && selectedGroup==null) { + Group group = (Group) iter.next(); + if ( trimmedName.equals(group.getGroupName()) ) { + selectedGroup = group; + } } - } + } doGrouping(chosenGrouping, selectedGroup, trimmedName, learners); } + /** + * @param chosenGrouping + * @return + */ + private String generateGroupName(Grouping chosenGrouping) { + String trimmedName; + String prefix = getPrefix(); + trimmedName = prefix+" "+System.currentTimeMillis(); + log.info("Chosen grouper for grouping "+chosenGrouping.toString()+" did not get a group name. Selecting default name of "+trimmedName); + return trimmedName; + } + /** * @throws GroupingException * @see org.lamsfoundation.lams.learningdesign.Grouper#doGrouping(org.lamsfoundation.lams.learningdesign.Grouping,java.lang.Long, java.util.List) */ public void doGrouping(Grouping chosenGrouping,Long groupId, List learners) throws GroupingException { - Iterator iter = chosenGrouping.getGroups().iterator(); - Group selectedGroup = null; - while (iter.hasNext() && selectedGroup==null) { - Group group = (Group) iter.next(); - if ( group.getGroupId().equals(groupId) ) { - selectedGroup = group; + if ( groupId != null ) { + Iterator iter = chosenGrouping.getGroups().iterator(); + Group selectedGroup = null; + while (iter.hasNext() && selectedGroup==null) { + Group group = (Group) iter.next(); + if ( group.getGroupId().equals(groupId) ) { + selectedGroup = group; + } } - } - if ( selectedGroup == null ) { - String error = "Tried to add users to group "+groupId+" but group cannot be found."; - log.error(error); - throw new GroupingException(error); + if ( selectedGroup == null ) { + String error = "Tried to add users to group "+groupId+" but group cannot be found."; + log.error(error); + throw new GroupingException(error); + } + doGrouping(chosenGrouping, selectedGroup, null, learners); + } else { + String groupName = generateGroupName(chosenGrouping); + doGrouping(chosenGrouping, null, groupName, learners); } - doGrouping(chosenGrouping, selectedGroup, null, learners); } - /** If the group exists add them to the group, otherwise creates a new group. Group will always - * exist if called from doGrouping(Grouping chosenGrouping,Long groupId, List learners), but it may or - * may not exist if called from doGrouping(Grouping chosenGrouping,String groupName, List learners). - * @param chosenGrouping - * @param group - * @param groupName - * @param learners + /** If the group exists add them to the group, otherwise creates a new group. If group is not supplied, then groupName must + * be supplied. + * @param chosenGrouping (Mandatory) + * @param group (Optional) + * @param groupName (Optional) + * @param learners (Mandatory) */ - public void doGrouping(Grouping chosenGrouping, Group group, String groupName, List learners) + private void doGrouping(Grouping chosenGrouping, Group group, String groupName, List learners) { if ( group != null ) { group.getUsers().addAll(learners); Index: lams_common/src/java/org/lamsfoundation/lams/learningdesign/Grouper.java =================================================================== diff -u -re1683b7e5ac777deb10d15b0bf41182587ca8373 -rb25a6d2d1cebe3c69d4af018aa14198533a0d4c5 --- lams_common/src/java/org/lamsfoundation/lams/learningdesign/Grouper.java (.../Grouper.java) (revision e1683b7e5ac777deb10d15b0bf41182587ca8373) +++ lams_common/src/java/org/lamsfoundation/lams/learningdesign/Grouper.java (.../Grouper.java) (revision b25a6d2d1cebe3c69d4af018aa14198533a0d4c5) @@ -40,7 +40,7 @@ * This is interface that defines the contract for performing grouping * algorithm. * - * It would be nicer to get the message service directly from within the classes, rather than havea setter. + * It would be nicer to get the message service directly from within the classes, rather than have a setter. * But can't think of a way to directly access it when the grouper object doesn't * have any link to the Spring context. (Fiona Malikoff) * @@ -68,25 +68,28 @@ } /** - * Do the grouping for a list of learners that the teacher requested. + * Do the grouping for a list of learners that the teacher requested. If you don't supply a name, you may get a system + * generated name. * @param grouping the grouping that is used to perform groups creation. - * @param name for this group + * @param name for this group (optional) * @param learners the list of learners that the teacher requested. */ public abstract void doGrouping(Grouping grouping, String groupName, List learners) throws GroupingException; /** * Do the grouping for a single learner. Should call setCommonMessageService() before calling this method. + * If you don't supply a name, you may get a system generated name. * @param grouping the grouping that is used to perform groups creation. - * @param name for this group + * @param name for this group (optional) * @param learner the learner teacher want to add. */ public abstract void doGrouping(Grouping grouping, String groupName, User learner) throws GroupingException; /** - * Do the grouping for a list of learners that the teacher requested. + * Do the grouping for a list of learners that the teacher requested. If you don't supply an id, you may get a group with a + * system generated name. * @param grouping the grouping that is used to perform groups creation. - * @param id of the group + * @param id of the group (optional) * @param learner the learner teacher want to add. * @throws GroupingException if the group does not exist. */ Index: lams_common/src/java/org/lamsfoundation/lams/learningdesign/RandomGrouper.java =================================================================== diff -u -r968fb2185fee5e44b7c4b30e5753805ef05e01df -rb25a6d2d1cebe3c69d4af018aa14198533a0d4c5 --- lams_common/src/java/org/lamsfoundation/lams/learningdesign/RandomGrouper.java (.../RandomGrouper.java) (revision 968fb2185fee5e44b7c4b30e5753805ef05e01df) +++ lams_common/src/java/org/lamsfoundation/lams/learningdesign/RandomGrouper.java (.../RandomGrouper.java) (revision b25a6d2d1cebe3c69d4af018aa14198533a0d4c5) @@ -27,7 +27,6 @@ import java.util.HashSet; import java.util.Iterator; import java.util.List; -import java.util.Set; import org.apache.log4j.Logger; import org.lamsfoundation.lams.learningdesign.exception.GroupingException; @@ -36,7 +35,7 @@ /** *

The random grouping algorithm implementation. It allocates user into the - * groups according to the attributes acceptted from user interface: + * groups according to the attributes accepted from user interface: * numberOfGroups and learnersPerGroup. If any of * these two attribute has be set, the random grouping will be done * correspondently.

Index: lams_common/src/java/org/lamsfoundation/lams/learningdesign/dao/hibernate/GroupingDAO.java =================================================================== diff -u -r08950e1090443c3423a3d1c587416a2fccd8bbdf -rb25a6d2d1cebe3c69d4af018aa14198533a0d4c5 --- lams_common/src/java/org/lamsfoundation/lams/learningdesign/dao/hibernate/GroupingDAO.java (.../GroupingDAO.java) (revision 08950e1090443c3423a3d1c587416a2fccd8bbdf) +++ lams_common/src/java/org/lamsfoundation/lams/learningdesign/dao/hibernate/GroupingDAO.java (.../GroupingDAO.java) (revision b25a6d2d1cebe3c69d4af018aa14198533a0d4c5) @@ -24,10 +24,12 @@ package org.lamsfoundation.lams.learningdesign.dao.hibernate; import java.util.ArrayList; +import java.util.HashMap; import java.util.Iterator; import java.util.List; import org.lamsfoundation.lams.dao.hibernate.BaseDAO; +import org.lamsfoundation.lams.learningdesign.Activity; import org.lamsfoundation.lams.learningdesign.ChosenGrouping; import org.lamsfoundation.lams.learningdesign.Grouping; import org.lamsfoundation.lams.learningdesign.GroupingActivity; @@ -40,9 +42,14 @@ */ public class GroupingDAO extends BaseDAO implements IGroupingDAO { - private final static String GROUPINGS_FOR_LEARNING_DESIGN = "select grouping from " - + Grouping.class.getName() + " grouping, " + GroupingActivity.class.getName() + " activity " - + " where activity.createGrouping = grouping and activity.learningDesign.id = ?"; + private final static String GROUPINGS_FOR_LEARNING_DESIGN_VIA_CREATE = "select grouping from " + + Grouping.class.getName() + " grouping, " + GroupingActivity.class.getName() + " grouping_activity " + + " where grouping_activity.learningDesign.id = ? " + + " and grouping_activity.createGrouping = grouping"; + private final static String GROUPINGS_FOR_LEARNING_DESIGN_VIA_GROUPING = "select grouping from " + + Grouping.class.getName() + " grouping, " + Activity.class.getName() + " activity " + + " where activity.learningDesign.id = ? " + + " and activity.grouping = grouping"; /** * @see org.lamsfoundation.lams.learningdesign.dao.interfaces.IGroupingDAO#getGroupingById(java.lang.Long) @@ -53,17 +60,26 @@ } /** - * Returns the list of groupings applicable for the given learning design. + * Returns the list of groupings applicable for the given learning design. This is a combination of the groupings defined + * via a GroupingActivity.createGrouping (which may or may not be applied to any other activities in the design) and groupings + * related to branches and which are not attached to a GroupingActivity. */ public List getGroupingsByLearningDesign(Long learningDesignId){ - List groupings = this.getHibernateTemplate().find(GROUPINGS_FOR_LEARNING_DESIGN,learningDesignId); - ArrayList realGroupings = new ArrayList(groupings.size()); - Iterator iter = groupings.iterator(); + List groupingsA = this.getHibernateTemplate().find(GROUPINGS_FOR_LEARNING_DESIGN_VIA_CREATE,learningDesignId); + List groupingsB = this.getHibernateTemplate().find(GROUPINGS_FOR_LEARNING_DESIGN_VIA_GROUPING,learningDesignId); + HashMap realGroupings = new HashMap(); + Iterator iter = groupingsA.iterator(); while (iter.hasNext()) { Grouping element = (Grouping) iter.next(); - realGroupings.add(getNonCGLibGrouping(element)); + realGroupings.put(element.getGroupingId(), getNonCGLibGrouping(element)); } - return realGroupings; + iter = groupingsB.iterator(); + while (iter.hasNext()) { + Grouping element = (Grouping) iter.next(); + if ( ! realGroupings.containsKey(element.getGroupingId()) ) + realGroupings.put(element.getGroupingId(), getNonCGLibGrouping(element)); + } + return new ArrayList(realGroupings.values()); } /** we must return the real grouping, not a Hibernate proxy. So relook Index: lams_common/src/java/org/lamsfoundation/lams/learningdesign/dto/LearningDesignDTO.java =================================================================== diff -u -re846df009c36cdd35fc62eac3de849d9d4d632c8 -rb25a6d2d1cebe3c69d4af018aa14198533a0d4c5 --- lams_common/src/java/org/lamsfoundation/lams/learningdesign/dto/LearningDesignDTO.java (.../LearningDesignDTO.java) (revision e846df009c36cdd35fc62eac3de849d9d4d632c8) +++ lams_common/src/java/org/lamsfoundation/lams/learningdesign/dto/LearningDesignDTO.java (.../LearningDesignDTO.java) (revision b25a6d2d1cebe3c69d4af018aa14198533a0d4c5) @@ -41,6 +41,7 @@ import org.lamsfoundation.lams.learningdesign.SequenceActivity; import org.lamsfoundation.lams.learningdesign.Transition; import org.lamsfoundation.lams.learningdesign.dao.hibernate.ActivityDAO; +import org.lamsfoundation.lams.learningdesign.dao.hibernate.GroupingDAO; import org.lamsfoundation.lams.util.wddx.WDDXTAGS; /** @@ -147,7 +148,7 @@ this.transitions = new ArrayList(); this.branchMappings = new ArrayList(); } - public LearningDesignDTO(LearningDesign learningDesign, ActivityDAO activityDAO){ + public LearningDesignDTO(LearningDesign learningDesign, ActivityDAO activityDAO, GroupingDAO groupingDAO){ this.learningDesignID = learningDesign.getLearningDesignId(); this.learningDesignUIID = learningDesign.getLearningDesignUIID(); this.description = learningDesign.getDescription(); @@ -202,7 +203,7 @@ this.lastModifiedDateTime = learningDesign.getLastModifiedDateTime(); this.branchMappings = new ArrayList(); // data will be set up by populateGroupings - this.groupings = populateGroupings(learningDesign,activityDAO); + this.groupings = populateGroupings(learningDesign,groupingDAO); this.activities = populateActivities(learningDesign); this.transitions = populateTransitions(learningDesign); @@ -390,42 +391,38 @@ } /** - * In order to get the Grouping objects, it will go through the parent - * activities in the learning design and for all grouping activities, it will - * then retrieve the Grouping object which was created by the GroupingActivity. + * Gets all the grouping objects for a learning design. Can't do it via activities as the grouping + * related to a teacher chosen grouping does not have a related grouping activity. * @param design - * @param groupingDAO DAO to reget grouping objects due to the hibernate cglib casting problems. + * @param groupingDAO DAO to directory get the grouping objects (no direct link from learning design possible). * @return ArrayList the array of groupingDTOs */ - public ArrayList populateGroupings(LearningDesign design, ActivityDAO activityDAO) + public ArrayList populateGroupings(LearningDesign design, GroupingDAO groupingDAO) { - // Unfortunately, we can't just go through all the activities via design.getParentActivities() - // as the activities returned won't cast to GroupingActivity, so we would - // have to reget every activity to get the right type. So the easiest way - // is to get them all in a list directly via a HQL call. ArrayList groupingList = new ArrayList(); - List groupingActivities = activityDAO.getGroupingActivitiesByLearningDesignId(design.getLearningDesignId()); - Iterator parentIterator = groupingActivities.iterator(); - while (parentIterator.hasNext()) - { - GroupingActivity groupingActivity = (GroupingActivity) parentIterator.next(); - Grouping grouping = groupingActivity.getCreateGrouping(); - groupingList.add(grouping.getGroupingDTO()); - - if ( grouping.getGroups().size() > 0 ) { - Iterator iter = grouping.getGroups().iterator(); - while ( iter.hasNext() ) { - Group group = (Group) iter.next(); - if ( group.getBranchActivities().size() > 0 ) { - Iterator iter2 = group.getBranchActivities().iterator(); - while ( iter2.hasNext() ) { - GroupBranchActivityEntry gba = (GroupBranchActivityEntry) iter2.next(); - branchMappings.add(gba.getGroupBranchActivityDTO()); - } - } - } - } - + List dbGroupings = groupingDAO.getGroupingsByLearningDesign(design.getLearningDesignId()); + if ( dbGroupings != null ) { + Iterator groupingIter = dbGroupings.iterator(); + while (groupingIter.hasNext()) + { + Grouping grouping = (Grouping) groupingIter.next(); + groupingList.add(grouping.getGroupingDTO()); + + if ( grouping.getGroups().size() > 0 ) { + Iterator iter = grouping.getGroups().iterator(); + while ( iter.hasNext() ) { + Group group = (Group) iter.next(); + if ( group.getBranchActivities().size() > 0 ) { + Iterator iter2 = group.getBranchActivities().iterator(); + while ( iter2.hasNext() ) { + GroupBranchActivityEntry gba = (GroupBranchActivityEntry) iter2.next(); + branchMappings.add(gba.getGroupBranchActivityDTO()); + } + } + } + } + + } } return groupingList; } Index: lams_common/src/java/org/lamsfoundation/lams/learningdesign/service/LearningDesignService.java =================================================================== diff -u -r117b4f3d433dec684bdde042c051f7b2831ad54a -rb25a6d2d1cebe3c69d4af018aa14198533a0d4c5 --- lams_common/src/java/org/lamsfoundation/lams/learningdesign/service/LearningDesignService.java (.../LearningDesignService.java) (revision 117b4f3d433dec684bdde042c051f7b2831ad54a) +++ lams_common/src/java/org/lamsfoundation/lams/learningdesign/service/LearningDesignService.java (.../LearningDesignService.java) (revision b25a6d2d1cebe3c69d4af018aa14198533a0d4c5) @@ -40,6 +40,7 @@ import org.lamsfoundation.lams.learningdesign.OptionsActivity; import org.lamsfoundation.lams.learningdesign.Transition; import org.lamsfoundation.lams.learningdesign.dao.hibernate.ActivityDAO; +import org.lamsfoundation.lams.learningdesign.dao.hibernate.GroupingDAO; import org.lamsfoundation.lams.learningdesign.dao.hibernate.LearningDesignDAO; import org.lamsfoundation.lams.learningdesign.dao.hibernate.LearningLibraryDAO; import org.lamsfoundation.lams.learningdesign.dto.LearningDesignDTO; @@ -71,6 +72,7 @@ protected LearningDesignDAO learningDesignDAO; protected ActivityDAO activityDAO; + protected GroupingDAO groupingDAO; protected LearningLibraryDAO learningLibraryDAO; protected ILoadedMessageSourceService toolActMessageService; @@ -115,6 +117,19 @@ this.learningLibraryDAO = learningLibraryDAO; } + public void setActivityDAO(ActivityDAO activityDAO) { + this.activityDAO = activityDAO; + } + + public void setLearningDesignDAO(LearningDesignDAO learningDesignDAO) { + this.learningDesignDAO = learningDesignDAO; + } + + public void setGroupingDAO(GroupingDAO groupingDAO) { + this.groupingDAO = groupingDAO; + } + + /********************************************** * Service Methods * *******************************************/ @@ -126,7 +141,7 @@ */ public LearningDesignDTO getLearningDesignDTO(Long learningDesignID) { LearningDesign design = learningDesignID!=null ? learningDesignDAO.getLearningDesignById(learningDesignID) : null; - return design != null ? new LearningDesignDTO(design,activityDAO) : null; + return design != null ? new LearningDesignDTO(design,activityDAO,groupingDAO) : null; } /** @@ -457,15 +472,6 @@ } - public void setActivityDAO(ActivityDAO activityDAO) { - this.activityDAO = activityDAO; - } - - public void setLearningDesignDAO(LearningDesignDAO learningDesignDAO) { - this.learningDesignDAO = learningDesignDAO; - } - - public ArrayList getAllLearningLibraryDetails()throws IOException{ //only return valid learning library return getAllLearningLibraryDetails(true); Index: lams_common/src/java/org/lamsfoundation/lams/lesson/service/LessonService.java =================================================================== diff -u -re1683b7e5ac777deb10d15b0bf41182587ca8373 -rb25a6d2d1cebe3c69d4af018aa14198533a0d4c5 --- lams_common/src/java/org/lamsfoundation/lams/lesson/service/LessonService.java (.../LessonService.java) (revision e1683b7e5ac777deb10d15b0bf41182587ca8373) +++ lams_common/src/java/org/lamsfoundation/lams/lesson/service/LessonService.java (.../LessonService.java) (revision b25a6d2d1cebe3c69d4af018aa14198533a0d4c5) @@ -218,7 +218,7 @@ } /** - * Perform the grouping, setting the given list of learners as one group. Used in suitations + * Perform the grouping, setting the given list of learners as one group. Used in situations * where there is a grouping but no grouping activity (e.g. in branching). * @param groupingActivity the activity that has create grouping. (mandatory) * @param groupName (optional) @@ -248,7 +248,8 @@ * Perform the grouping, setting the given list of learners as one group. Currently used for chosen grouping and * teacher chosen branching * @param grouping The grouping that needs to have the grouping performed.. (mandatory) - * @param learners to form one group + * @param the id of the preferred group (optional) + * @param learners to form one group (mandatory) */ public void performGrouping(Grouping grouping, Long groupId, List learners) throws LessonServiceException { if ( grouping != null && grouping.isChosenGrouping() ) { Index: lams_common/test/java/org/lamsfoundation/lams/learningdesign/dao/TestLearningDesignDAO.java =================================================================== diff -u -r08950e1090443c3423a3d1c587416a2fccd8bbdf -rb25a6d2d1cebe3c69d4af018aa14198533a0d4c5 --- lams_common/test/java/org/lamsfoundation/lams/learningdesign/dao/TestLearningDesignDAO.java (.../TestLearningDesignDAO.java) (revision 08950e1090443c3423a3d1c587416a2fccd8bbdf) +++ lams_common/test/java/org/lamsfoundation/lams/learningdesign/dao/TestLearningDesignDAO.java (.../TestLearningDesignDAO.java) (revision b25a6d2d1cebe3c69d4af018aa14198533a0d4c5) @@ -28,6 +28,7 @@ import org.lamsfoundation.lams.learningdesign.Activity; import org.lamsfoundation.lams.learningdesign.LearningDesign; import org.lamsfoundation.lams.learningdesign.dao.hibernate.ActivityDAO; +import org.lamsfoundation.lams.learningdesign.dao.hibernate.GroupingDAO; import org.lamsfoundation.lams.learningdesign.dao.hibernate.LearningDesignDAO; import org.lamsfoundation.lams.learningdesign.dao.hibernate.TransitionDAO; import org.lamsfoundation.lams.learningdesign.dto.LearningDesignDTO; @@ -40,6 +41,7 @@ public class TestLearningDesignDAO extends AbstractCommonTestCase { protected ActivityDAO activityDAO; + protected GroupingDAO groupingDAO; private LearningDesignDAO learningDesignDAO; protected TransitionDAO transitionDAO; private LearningDesign learningDesign; @@ -52,6 +54,7 @@ learningDesignDAO =(LearningDesignDAO)context.getBean("learningDesignDAO"); transitionDAO =(TransitionDAO) context.getBean("transitionDAO"); activityDAO =(ActivityDAO) context.getBean("activityDAO"); + groupingDAO =(GroupingDAO) context.getBean("groupingDAO"); //userDAO = (UserDAO)context.getBean("userDAO"); } public void testCalculateFirstActivity(){ @@ -67,7 +70,7 @@ } public void testGetLearningDesignDTO() throws Exception{ learningDesign = learningDesignDAO.getLearningDesignById(new Long(1)); - LearningDesignDTO learningDesignDTO = new LearningDesignDTO(learningDesign,activityDAO); + LearningDesignDTO learningDesignDTO = new LearningDesignDTO(learningDesign,activityDAO,groupingDAO); String str = WDDXProcessor.serialize(learningDesignDTO); System.out.println(str); }