Index: lams_build/lib/lams/lams.jar =================================================================== diff -u -rb01b55c28cf872fabcd146845693907e541fa38d -r23211f44c3c9c17bf1f48b16985cba850fbdbf78 Binary files differ Index: lams_central/src/java/org/lamsfoundation/lams/authoring/ObjectExtractor.java =================================================================== diff -u -rb01b55c28cf872fabcd146845693907e541fa38d -r23211f44c3c9c17bf1f48b16985cba850fbdbf78 --- lams_central/src/java/org/lamsfoundation/lams/authoring/ObjectExtractor.java (.../ObjectExtractor.java) (revision b01b55c28cf872fabcd146845693907e541fa38d) +++ lams_central/src/java/org/lamsfoundation/lams/authoring/ObjectExtractor.java (.../ObjectExtractor.java) (revision 23211f44c3c9c17bf1f48b16985cba850fbdbf78) @@ -23,6 +23,7 @@ /* $$Id$$ */ package org.lamsfoundation.lams.authoring; +import java.util.ArrayList; import java.util.Date; import java.util.HashMap; import java.util.HashSet; @@ -37,12 +38,13 @@ import org.apache.log4j.Logger; import org.lamsfoundation.lams.dao.IBaseDAO; import org.lamsfoundation.lams.learningdesign.Activity; +import org.lamsfoundation.lams.learningdesign.BranchCondition; import org.lamsfoundation.lams.learningdesign.BranchingActivity; import org.lamsfoundation.lams.learningdesign.ChosenGrouping; import org.lamsfoundation.lams.learningdesign.ComplexActivity; import org.lamsfoundation.lams.learningdesign.GateActivity; import org.lamsfoundation.lams.learningdesign.Group; -import org.lamsfoundation.lams.learningdesign.GroupBranchActivityEntry; +import org.lamsfoundation.lams.learningdesign.BranchActivityEntry; import org.lamsfoundation.lams.learningdesign.Grouping; import org.lamsfoundation.lams.learningdesign.GroupingActivity; import org.lamsfoundation.lams.learningdesign.LearningDesign; @@ -59,6 +61,7 @@ import org.lamsfoundation.lams.learningdesign.ToolActivity; import org.lamsfoundation.lams.learningdesign.Transition; import org.lamsfoundation.lams.learningdesign.dao.IActivityDAO; +import org.lamsfoundation.lams.learningdesign.dao.IBranchActivityEntryDAO; import org.lamsfoundation.lams.learningdesign.dao.IGroupDAO; import org.lamsfoundation.lams.learningdesign.dao.IGroupingDAO; import org.lamsfoundation.lams.learningdesign.dao.ILearningDesignDAO; @@ -115,6 +118,7 @@ protected ISystemToolDAO systemToolDAO = null; protected IGroupDAO groupDAO = null; protected IToolSessionDAO toolSessionDAO = null; + protected IBranchActivityEntryDAO branchActivityEntryDAO = null; private Integer mode = null; @@ -132,11 +136,18 @@ * that we are trying to avoid! */ protected HashMap> toolSessionMap = new HashMap>(); // Activity UIID -> ToolSession + /* Used for easy access (rather than going back to the db) and makes it easier to clean them up at the end + * - they can't be deleted easily via the cascades as we don't get a list of deleted entries sent back + * from the client! We would end up with mappings still attached to a sequence activity that shouldn't be there! Not + * done as a map as we sometimes will check via UIID, sometimes by ID + */ + protected List oldbranchActivityEntryList = new ArrayList(); + protected HashMap oldActivityMap = new HashMap(); // Activity UIID -> Activity /* cache of groupings - too hard to get them from the db */ protected HashMap groupings = new HashMap(); protected HashMap groups = new HashMap(); - protected HashMap branchEntries = new HashMap(); + protected HashMap branchEntries = new HashMap(); protected HashMap firstChildToSequenceMap = new HashMap(); /* can't delete as we go as they are linked to other items - keep a list and delete at the end. */ protected Set groupingsToDelete = new HashSet(); @@ -268,6 +279,15 @@ this.baseDAO = baseDAO; } + public IBranchActivityEntryDAO getBranchActivityEntryDAO() { + return branchActivityEntryDAO; + } + + public void setBranchActivityEntryDAO( + IBranchActivityEntryDAO branchActivityEntryDAO) { + this.branchActivityEntryDAO = branchActivityEntryDAO; + } + /* (non-Javadoc) * @see org.lamsfoundation.lams.authoring.IObjectExtractor#extractSaveLearningDesign(java.util.Hashtable) */ @@ -297,6 +317,10 @@ // three objects (learning design -> grouping activity -> grouping) so put both the existing ones and the new ones // here for reference later. initialiseGroupings(); + + // Branch activity mappings are indirectly accessible via sequence activities or groupings. Have a separate list + // to make them easier to delete unwanted ones later. + intialiseBranchActivityMappings(); // get a mapping of all the existing activities and their tool sessions, in case we need to delete some tool sessions later. initialiseToolSessionMap(learningDesign); @@ -448,6 +472,10 @@ groupings.put(grouping.getGroupingUIID(), grouping); } } + + private void intialiseBranchActivityMappings() { + oldbranchActivityEntryList = branchActivityEntryDAO.getEntriesByLearningDesign(learningDesign.getLearningDesignId()); + } /** Initialise the map of tool sessions already in the database. Used to work out what will be deleted * by Hibernate later - useful to clean up any unwanted tool sessions for edit on the fly. @@ -1205,6 +1233,9 @@ * * Must be done after all the other parsing as we need to match up activities * and groups. + * + * Will also delete any old (now unused) mappings + * * @param branchMappingsList * @throws WDDXProcessorConversionException */ @@ -1217,35 +1248,43 @@ Iterator iterator = branchMappingsList.iterator(); while(iterator.hasNext()) { - extractGroupBranchActivityEntry((Hashtable)iterator.next()); + extractBranchActivityEntry((Hashtable)iterator.next()); } } + + // now go through and delete any old branch mappings that are no longer used. + // need to remove them via the sequence activity so that the cascade will work. + Iterator iter = oldbranchActivityEntryList.iterator(); + while (iter.hasNext()) { + BranchActivityEntry oldEntry = (BranchActivityEntry) iter.next(); + SequenceActivity sequenceActivity = oldEntry.getBranchSequenceActivity(); + if ( sequenceActivity != null ) { + sequenceActivity.getBranchEntries().remove(oldEntry); + } + } } @SuppressWarnings("unchecked") - private GroupBranchActivityEntry extractGroupBranchActivityEntry(Hashtable details) throws WDDXProcessorConversionException { + /** Get the BranchActivityEntry details. This may be either for group based branching, or it may be for tool output based branching */ + private BranchActivityEntry extractBranchActivityEntry(Hashtable details) throws WDDXProcessorConversionException { - Long entryId = WDDXProcessor.convertToLong(details, WDDXTAGS.GROUP_BRANCH_ACTIVITY_ENTRY_ID); - Integer entryUIID = WDDXProcessor.convertToInteger(details, WDDXTAGS.GROUP_BRANCH_ACTIVITY_ENTRY_UIID); + Long entryId = WDDXProcessor.convertToLong(details, WDDXTAGS.BRANCH_ACTIVITY_ENTRY_ID); + Integer entryUIID = WDDXProcessor.convertToInteger(details, WDDXTAGS.BRANCH_ACTIVITY_ENTRY_UIID); if ( entryUIID == null ) { throw new WDDXProcessorConversionException("Group based branch mapping entry is missing its UUID. Entry "+details); } - Integer groupUIID = WDDXProcessor.convertToInteger(details, WDDXTAGS.GROUP_UIID); - Integer sequenceActivityUIID=WDDXProcessor.convertToInteger(details,WDDXTAGS.GROUP_BRANCH_SEQUENCE_ACTIVITY_UIID); - Integer branchingActivityUIID=WDDXProcessor.convertToInteger(details,WDDXTAGS.GROUP_BRANCH_ACTIVITY_UIID); + Integer sequenceActivityUIID=WDDXProcessor.convertToInteger(details,WDDXTAGS.BRANCH_SEQUENCE_ACTIVITY_UIID); + Integer branchingActivityUIID=WDDXProcessor.convertToInteger(details,WDDXTAGS.BRANCH_ACTIVITY_UIID); - Group group = groups.get(groupUIID); - if ( group == null ) { - throw new WDDXProcessorConversionException("Group listed in the branch mapping list is missing. Mapping entry UUID "+entryUIID+" groupUIID "+groupUIID); - } - - Activity sequenceActivity = newActivityMap.get(sequenceActivityUIID); - if ( sequenceActivity == null ) { + SequenceActivity sequenceActivity = null; + Activity activity = newActivityMap.get(sequenceActivityUIID); + if ( activity == null ) { throw new WDDXProcessorConversionException("Sequence Activity listed in the branch mapping list is missing. Mapping entry UUID "+entryUIID+" sequenceActivityUIID "+sequenceActivityUIID); - } - if ( ! sequenceActivity.isSequenceActivity() ) { + } else if ( ! sequenceActivity.isSequenceActivity() ) { throw new WDDXProcessorConversionException("Activity listed in the branch mapping list is not a sequence activity. Mapping entry UUID "+entryUIID+" sequenceActivityUIID "+sequenceActivityUIID); + } else { + sequenceActivity = (SequenceActivity) activity; } Activity branchingActivity = newActivityMap.get(branchingActivityUIID); @@ -1256,40 +1295,104 @@ throw new WDDXProcessorConversionException("Activity listed in the branch mapping list is not a branching activity. Mapping entry UUID "+entryUIID+" branchingActivityUIID "+branchingActivityUIID); } - GroupBranchActivityEntry entry = null; - // Does it exist already? If the mapping was created at runtime, there will be an ID but no IU ID field. + // If the mapping was created at runtime, there will be an ID but no IU ID field. // If it was created in authoring, will have a UI ID and may or may not have an ID. // So try to match up on UI ID first, failing that match on ID. Then the worst case, which is the mapping // is created at runtime but then modified in authoring (and has has a new UI ID added) is handled. - if ( group.getBranchActivities() != null && group.getBranchActivities().size() > 0 ) { - GroupBranchActivityEntry uiid_match = null; - GroupBranchActivityEntry id_match = null; - Iterator iter = group.getBranchActivities().iterator(); - while (uiid_match == null && iter.hasNext()) { - GroupBranchActivityEntry possibleEntry = (GroupBranchActivityEntry) iter.next(); - if ( entryUIID.equals(possibleEntry.getEntryUIID()) ) { - uiid_match = possibleEntry; - } - if ( entryId != null && entryId.equals(possibleEntry.getEntryId()) ) { - id_match = possibleEntry; - } + BranchActivityEntry uiid_match = null; + BranchActivityEntry id_match = null; + Iterator iter = sequenceActivity.getBranchEntries().iterator(); + while (uiid_match == null && iter.hasNext()) { + BranchActivityEntry possibleEntry = (BranchActivityEntry) iter.next(); + if ( entryUIID.equals(possibleEntry.getEntryUIID()) ) { + uiid_match = possibleEntry; } - entry = uiid_match != null ? uiid_match : id_match; + if ( entryId != null && entryId.equals(possibleEntry.getEntryId()) ) { + id_match = possibleEntry; + } } - if ( entry == null ) { - group.allocateBranchToGroup(entryId,entryUIID, (SequenceActivity)sequenceActivity, (BranchingActivity)branchingActivity); + BranchActivityEntry entry = uiid_match != null ? uiid_match : id_match; + + // Does it exist already? If it does, remove it from the "old" set (which is used for doing deletions later). + oldbranchActivityEntryList.remove(entry); + + BranchCondition condition = extractCondition((Hashtable)details.get(WDDXTAGS.BRANCH_CONDITION), entry); + + Integer groupUIID = WDDXProcessor.convertToInteger(details, WDDXTAGS.GROUP_UIID); + Group group = null; + if ( groupUIID != null ) { + group = groups.get(groupUIID); + if ( group == null ) { + throw new WDDXProcessorConversionException("Group listed in the branch mapping list is missing. Mapping entry UUID "+entryUIID+" groupUIID "+groupUIID); + } + } + + if ( condition == null && group == null ) { + throw new WDDXProcessorConversionException("Branch mapping has neither a group or a condition. Not a valid mapping. "+details); + } + + if ( entry == null ) { + if ( condition != null ) { + entry = condition.allocateBranchToCondition(entryUIID, sequenceActivity, (BranchingActivity)branchingActivity); + } else { + entry = group.allocateBranchToGroup(entryUIID, sequenceActivity, (BranchingActivity)branchingActivity); + } } else { - entry.setBranchSequenceActivity((SequenceActivity)sequenceActivity); + entry.setEntryUIID(entryUIID); + entry.setBranchSequenceActivity(sequenceActivity); entry.setBranchingActivity((BranchingActivity)branchingActivity); - entry.setGroup(group); } + + entry.setGroup(group); + entry.setCondition(condition); groupingDAO.update(group); return entry; } + /** + * @param details + * @param entry + * @return + * @throws WDDXProcessorConversionException + */ + private BranchCondition extractCondition(Hashtable conditionTable, + BranchActivityEntry entry) throws WDDXProcessorConversionException { + + BranchCondition condition = null; + if ( conditionTable != null && conditionTable.size() > 0 ) { + + Long conditionID=WDDXProcessor.convertToLong(conditionTable,WDDXTAGS.CONDITION_ID); + if ( entry != null ) { + condition = entry.getCondition(); + } + if ( condition != null && conditionID != null && ! condition.getConditionId().equals(conditionID)) { + log.warn("Unexpected behaviour: condition supplied in WDDX packet has a different ID to matching branch activity entry in the database. Dropping old database condition." + +" Old db condition "+condition+" new entry in WDDX "+conditionTable); + condition = null; // Hibernate should dispose of it automatically via the cascade + } + + if ( condition == null ) { + Integer conditionUIID=WDDXProcessor.convertToInteger(conditionTable,WDDXTAGS.CONDITION_UIID); + if ( conditionUIID == null ) { + throw new WDDXProcessorConversionException("Condition is missing its UUID: "+conditionTable); + } + + condition = new BranchCondition(null, conditionUIID, + WDDXProcessor.convertToInteger(conditionTable,WDDXTAGS.ORDER_ID), + WDDXProcessor.convertToString(conditionTable,WDDXTAGS.CONDITION_NAME), + WDDXProcessor.convertToString(conditionTable,WDDXTAGS.CONDITION_TYPE), + WDDXProcessor.convertToString(conditionTable,WDDXTAGS.CONDITION_START_VALUE), + WDDXProcessor.convertToString(conditionTable,WDDXTAGS.CONDITION_END_VALUE), + WDDXProcessor.convertToString(conditionTable,WDDXTAGS.CONDITION_EXACT_MATCH_VALUE) ); + } + } + return condition; + } + + } Index: lams_central/src/java/org/lamsfoundation/lams/authoring/authoringApplicationContext.xml =================================================================== diff -u -r9481bb9c6f8c0e4d6fbed6b230a41c77feda64c6 -r23211f44c3c9c17bf1f48b16985cba850fbdbf78 --- lams_central/src/java/org/lamsfoundation/lams/authoring/authoringApplicationContext.xml (.../authoringApplicationContext.xml) (revision 9481bb9c6f8c0e4d6fbed6b230a41c77feda64c6) +++ lams_central/src/java/org/lamsfoundation/lams/authoring/authoringApplicationContext.xml (.../authoringApplicationContext.xml) (revision 23211f44c3c9c17bf1f48b16985cba850fbdbf78) @@ -33,6 +33,7 @@ + Index: lams_central/src/java/org/lamsfoundation/lams/authoring/service/AuthoringService.java =================================================================== diff -u -rb01b55c28cf872fabcd146845693907e541fa38d -r23211f44c3c9c17bf1f48b16985cba850fbdbf78 --- lams_central/src/java/org/lamsfoundation/lams/authoring/service/AuthoringService.java (.../AuthoringService.java) (revision b01b55c28cf872fabcd146845693907e541fa38d) +++ lams_central/src/java/org/lamsfoundation/lams/authoring/service/AuthoringService.java (.../AuthoringService.java) (revision 23211f44c3c9c17bf1f48b16985cba850fbdbf78) @@ -50,7 +50,7 @@ import org.lamsfoundation.lams.learningdesign.ComplexActivity; import org.lamsfoundation.lams.learningdesign.GateActivity; import org.lamsfoundation.lams.learningdesign.Group; -import org.lamsfoundation.lams.learningdesign.GroupBranchActivityEntry; +import org.lamsfoundation.lams.learningdesign.BranchActivityEntry; import org.lamsfoundation.lams.learningdesign.Grouping; import org.lamsfoundation.lams.learningdesign.GroupingActivity; import org.lamsfoundation.lams.learningdesign.LearningDesign; @@ -807,6 +807,7 @@ } // fix up any old "default activity" in the complex activities and the input activities + // and fix any branch mappings for ( Activity activity : activities) { if ( activity.isComplexActivity() ) { ComplexActivity newComplex = (ComplexActivity) activity; @@ -816,32 +817,31 @@ newComplex.setDefaultActivity(newDefaultActivity); } } - } - - // fix up the input activities - // Now go back and fix any branch mapping entries - they will still be pointing to old activities. - // Need to check if the sets are not null as these are new objects and Hibernate may not have - // backed them with collections yet. - for ( Grouping grouping: newGroupings.values() ) { - if ( grouping.getGroups() !=null && grouping.getGroups().size() > 0 ) { - Iterator iter = grouping.getGroups().iterator(); - while ( iter.hasNext() ) { - Group group = (Group) iter.next(); - if ( group.getBranchActivities() != null && group.getBranchActivities().size() > 0 ) { - Iterator iter2 = group.getBranchActivities().iterator(); - while ( iter2.hasNext() ) { - GroupBranchActivityEntry entry = (GroupBranchActivityEntry) iter2.next(); - SequenceActivity oldSequenceActivity = entry.getBranchSequenceActivity(); - entry.setBranchSequenceActivity((SequenceActivity) newActivities.get(oldSequenceActivity.getActivityUIID())); - BranchingActivity oldBranchingActivity = entry.getBranchingActivity(); - entry.setBranchingActivity((BranchingActivity) newActivities.get(oldBranchingActivity.getActivityUIID())); - } - } - } + if ( activity.isSequenceActivity() ) { + SequenceActivity newSequenceActivity = (SequenceActivity) activity; + // Need to check if the sets are not null as these are new objects and Hibernate may not have backed them with collections yet. + if ( newSequenceActivity.getBranchEntries() != null && newSequenceActivity.getBranchEntries().size() > 0 ) { + Iterator beIter = newSequenceActivity.getBranchEntries().iterator(); + while ( beIter.hasNext() ) { + // sequence activity will be correct but the branching activity and the grouping will be wrong + // the condition was copied by the sequence activity copy + BranchActivityEntry entry = (BranchActivityEntry) beIter.next(); + BranchingActivity oldBranchingActivity = entry.getBranchingActivity(); + entry.setBranchingActivity((BranchingActivity) newActivities.get(oldBranchingActivity.getActivityUIID())); + Group oldGroup = entry.getGroup(); + if ( oldGroup != null ) { + Grouping oldGrouping = oldGroup.getGrouping(); + entry.setGroup(oldGrouping.getGroup(oldGroup.getGroupUIID())); + } + } + } + } } + // fix up the input activities + // The activities collection in the learning design may already exist (as we have already done a save on the design). // If so, we can't just override the existing collection as the cascade causes an error. // newLearningDesign.getActivities() will create a new TreeSet(new ActivityOrderComparator()) if there isn't an existing set Index: lams_common/db/model/lams_11.clay =================================================================== diff -u -r09048f91f2dcbb6b63449f3c1fb9e1a09221a35e -r23211f44c3c9c17bf1f48b16985cba850fbdbf78 --- lams_common/db/model/lams_11.clay (.../lams_11.clay) (revision 09048f91f2dcbb6b63449f3c1fb9e1a09221a35e) +++ lams_common/db/model/lams_11.clay (.../lams_11.clay) (revision 23211f44c3c9c17bf1f48b16985cba850fbdbf78) @@ -139,7 +139,7 @@ - + @@ -1188,7 +1188,7 @@
- + @@ -1273,7 +1273,7 @@
- + @@ -2812,7 +2812,7 @@
- + @@ -3258,7 +3258,7 @@
- + @@ -3533,7 +3533,7 @@
- + @@ -5391,9 +5391,9 @@
- -Maps a group to an activity. Used for allocating groups to a sequence activity, which forms one branch inside a branching activity. - +
+(1) Maps a group to an activity. Used for allocating groups to a sequence activity, which forms one branch inside a branching activity. (2) Maps a condition to an activity. Used for allocating groups to a sequence activity, based on a tool condition. + @@ -5460,8 +5460,21 @@ + + + + + + + + + + + + + - + @@ -5494,6 +5507,13 @@ + + + + + + +
@@ -5504,8 +5524,8 @@ - + @@ -5517,8 +5537,8 @@ - + @@ -5556,6 +5576,106 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Index: lams_common/db/sql/create_lams_11_tables.sql =================================================================== diff -u -r09048f91f2dcbb6b63449f3c1fb9e1a09221a35e -r23211f44c3c9c17bf1f48b16985cba850fbdbf78 --- lams_common/db/sql/create_lams_11_tables.sql (.../create_lams_11_tables.sql) (revision 09048f91f2dcbb6b63449f3c1fb9e1a09221a35e) +++ lams_common/db/sql/create_lams_11_tables.sql (.../create_lams_11_tables.sql) (revision 23211f44c3c9c17bf1f48b16985cba850fbdbf78) @@ -1,4 +1,3 @@ --- CVS ID: $Id$ CREATE TABLE lams_gate_activity_level ( gate_activity_level_id INT(11) NOT NULL DEFAULT 0 @@ -574,12 +573,26 @@ REFERENCES lams_learning_activity (activity_id) )TYPE=InnoDB; -CREATE TABLE lams_group_branch_activity ( +CREATE TABLE lams_branch_condition ( + condition_id BIGINT(20) NOT NULL + , condition_ui_id INT(11) + , order_id INT(11) NOT NULL DEFAULT 0 + , name VARCHAR(255) NOT NULL + , type VARCHAR(255) NOT NULL + , startValue VARCHAR(255) + , endValue VARCHAR(255) + , exactMatch VARCHAR(255) + , entry_id BIGINT(20) NOT NULL + , PRIMARY KEY (condition_id) +)TYPE=InnoDB; + +CREATE TABLE lams_branch_activity_entry ( entry_id BIGINT(20) NOT NULL AUTO_INCREMENT , entry_ui_id INT(11) , group_id BIGINT(20) NOT NULL , sequence_activity_id BIGINT(20) NOT NULL , branch_activity_id BIGINT(20) NOT NULL + , condition_id BIGINT(20) , UNIQUE UQ_lams_group_activity (group_id, branch_activity_id) , PRIMARY KEY (entry_id) , INDEX (group_id) @@ -591,9 +604,13 @@ , INDEX (branch_activity_id) , CONSTRAINT FK_lams_branch_map_branch FOREIGN KEY (branch_activity_id) REFERENCES lams_learning_activity (activity_id) + , INDEX (condition_id) + , CONSTRAINT FK_lams_branch_activity_entry_4 FOREIGN KEY (condition_id) + REFERENCES lams_branch_condition (condition_id) )TYPE=InnoDB; + CREATE TABLE lams_lesson ( lesson_id BIGINT(20) NOT NULL AUTO_INCREMENT , learning_design_id BIGINT(20) NOT NULL Index: lams_common/db/sql/updatescripts/alter_21_branching.sql =================================================================== diff -u -r09048f91f2dcbb6b63449f3c1fb9e1a09221a35e -r23211f44c3c9c17bf1f48b16985cba850fbdbf78 --- lams_common/db/sql/updatescripts/alter_21_branching.sql (.../alter_21_branching.sql) (revision 09048f91f2dcbb6b63449f3c1fb9e1a09221a35e) +++ lams_common/db/sql/updatescripts/alter_21_branching.sql (.../alter_21_branching.sql) (revision 23211f44c3c9c17bf1f48b16985cba850fbdbf78) @@ -1,4 +1,4 @@ --- Script to be run for LAMS 2.1 release, on LAMS 2.0.3 tables. +-- Script to be run for LAMS 2.1 release, on LAMS 2.0.3/2.0.4 tables. -- Adds all the data needed for branching, plus a small change to the tool table needed for tool admin screen. ALTER TABLE lams_group @@ -17,12 +17,26 @@ )TYPE=InnoDB; -CREATE TABLE lams_group_branch_activity ( +CREATE TABLE lams_branch_condition ( + condition_id BIGINT(20) NOT NULL + , condition_ui_id INT(11) + , order_id INT(11) NOT NULL DEFAULT 0 + , name VARCHAR(255) NOT NULL + , type VARCHAR(255) NOT NULL + , startValue VARCHAR(255) + , endValue VARCHAR(255) + , exactMatch VARCHAR(255) + , entry_id BIGINT(20) NOT NULL + , PRIMARY KEY (condition_id) +)TYPE=InnoDB; + +CREATE TABLE lams_branch_activity_entry ( entry_id BIGINT(20) NOT NULL AUTO_INCREMENT , entry_ui_id INT(11) , group_id BIGINT(20) NOT NULL , sequence_activity_id BIGINT(20) NOT NULL , branch_activity_id BIGINT(20) NOT NULL + , condition_id BIGINT(20) , UNIQUE UQ_lams_group_activity (group_id, branch_activity_id) , PRIMARY KEY (entry_id) , INDEX (group_id) @@ -34,6 +48,9 @@ , INDEX (branch_activity_id) , CONSTRAINT FK_lams_branch_map_branch FOREIGN KEY (branch_activity_id) REFERENCES lams_learning_activity (activity_id) + , INDEX (condition_id) + , CONSTRAINT FK_lams_branch_activity_entry_4 FOREIGN KEY (condition_id) + REFERENCES lams_branch_condition (condition_id) )TYPE=InnoDB; ALTER TABLE lams_learning_activity Index: lams_learning/src/java/org/lamsfoundation/lams/learning/service/LearnerService.java =================================================================== diff -u -ra1e003bc69ae62d59e99eba58d95a5ff84becfea -r23211f44c3c9c17bf1f48b16985cba850fbdbf78 --- lams_learning/src/java/org/lamsfoundation/lams/learning/service/LearnerService.java (.../LearnerService.java) (revision a1e003bc69ae62d59e99eba58d95a5ff84becfea) +++ lams_learning/src/java/org/lamsfoundation/lams/learning/service/LearnerService.java (.../LearnerService.java) (revision 23211f44c3c9c17bf1f48b16985cba850fbdbf78) @@ -39,7 +39,7 @@ import org.lamsfoundation.lams.learningdesign.BranchingActivity; import org.lamsfoundation.lams.learningdesign.GateActivity; import org.lamsfoundation.lams.learningdesign.Group; -import org.lamsfoundation.lams.learningdesign.GroupBranchActivityEntry; +import org.lamsfoundation.lams.learningdesign.BranchActivityEntry; import org.lamsfoundation.lams.learningdesign.Grouping; import org.lamsfoundation.lams.learningdesign.GroupingActivity; import org.lamsfoundation.lams.learningdesign.SequenceActivity; @@ -751,7 +751,7 @@ if ( group.getBranchActivities() != null ) { Iterator branchesIterator = group.getBranchActivities().iterator(); while (sequenceActivity==null && branchesIterator.hasNext()) { - GroupBranchActivityEntry branchActivityEntry = (GroupBranchActivityEntry) branchesIterator.next(); + BranchActivityEntry branchActivityEntry = (BranchActivityEntry) branchesIterator.next(); if ( branchActivityEntry.getBranchingActivity().equals(branchingActivity) ) sequenceActivity = branchActivityEntry.getBranchSequenceActivity(); } @@ -830,7 +830,7 @@ // if no groups exist, then create one and assign it to the branch. } else { Group group = lessonService.createGroup(grouping, selectedBranch.getTitle()); - group.allocateBranchToGroup(null,null, selectedBranch, branchingActivity); + group.allocateBranchToGroup(null, selectedBranch, branchingActivity); } groupingDAO.update(grouping); Index: lams_monitoring/src/java/org/lamsfoundation/lams/monitoring/BranchingDTO.java =================================================================== diff -u -r7651b7a24448e75a74e89ed815d8f9f1d7328636 -r23211f44c3c9c17bf1f48b16985cba850fbdbf78 --- lams_monitoring/src/java/org/lamsfoundation/lams/monitoring/BranchingDTO.java (.../BranchingDTO.java) (revision 7651b7a24448e75a74e89ed815d8f9f1d7328636) +++ lams_monitoring/src/java/org/lamsfoundation/lams/monitoring/BranchingDTO.java (.../BranchingDTO.java) (revision 23211f44c3c9c17bf1f48b16985cba850fbdbf78) @@ -10,7 +10,7 @@ import org.apache.commons.lang.builder.ToStringBuilder; import org.lamsfoundation.lams.learningdesign.BranchingActivity; import org.lamsfoundation.lams.learningdesign.Group; -import org.lamsfoundation.lams.learningdesign.GroupBranchActivityEntry; +import org.lamsfoundation.lams.learningdesign.BranchActivityEntry; import org.lamsfoundation.lams.learningdesign.SequenceActivity; /** Represents an overall branching activity. Used by the Teacher Chosen Grouping screen for @@ -30,9 +30,9 @@ Iterator iter = activity.getActivities().iterator(); while (iter.hasNext()) { SequenceActivity branch = (SequenceActivity) iter.next(); - Set mappingEntries = branch.getBranchEntries(); + Set mappingEntries = branch.getBranchEntries(); SortedSet groups = new TreeSet(); - for ( GroupBranchActivityEntry entry : mappingEntries ) { + for ( BranchActivityEntry entry : mappingEntries ) { Group group = entry.getGroup(); groups.add(group); } Index: lams_monitoring/src/java/org/lamsfoundation/lams/monitoring/service/MonitoringService.java =================================================================== diff -u -r560c00149837e66be2b9f4cbcbff95ff23a4dc28 -r23211f44c3c9c17bf1f48b16985cba850fbdbf78 --- lams_monitoring/src/java/org/lamsfoundation/lams/monitoring/service/MonitoringService.java (.../MonitoringService.java) (revision 560c00149837e66be2b9f4cbcbff95ff23a4dc28) +++ lams_monitoring/src/java/org/lamsfoundation/lams/monitoring/service/MonitoringService.java (.../MonitoringService.java) (revision 23211f44c3c9c17bf1f48b16985cba850fbdbf78) @@ -54,7 +54,6 @@ import org.lamsfoundation.lams.learningdesign.ComplexActivity; import org.lamsfoundation.lams.learningdesign.GateActivity; import org.lamsfoundation.lams.learningdesign.Group; -import org.lamsfoundation.lams.learningdesign.GroupBranchActivityEntry; import org.lamsfoundation.lams.learningdesign.Grouping; import org.lamsfoundation.lams.learningdesign.GroupingActivity; import org.lamsfoundation.lams.learningdesign.LearningDesign; @@ -2026,7 +2025,7 @@ grouping = branchingActivity.getGrouping(); group = lessonService.createGroup(grouping, branch.getTitle()); - group.allocateBranchToGroup(null,null, branch, (BranchingActivity)branchingActivity); + group.allocateBranchToGroup(null, branch, (BranchingActivity)branchingActivity); groupingDAO.update(group); } else { Index: lams_monitoring/src/java/org/lamsfoundation/lams/monitoring/web/ChosenBranchingAJAXAction.java =================================================================== diff -u -rccf0c98665da622cc43ff39393de652596752cdf -r23211f44c3c9c17bf1f48b16985cba850fbdbf78 --- lams_monitoring/src/java/org/lamsfoundation/lams/monitoring/web/ChosenBranchingAJAXAction.java (.../ChosenBranchingAJAXAction.java) (revision ccf0c98665da622cc43ff39393de652596752cdf) +++ lams_monitoring/src/java/org/lamsfoundation/lams/monitoring/web/ChosenBranchingAJAXAction.java (.../ChosenBranchingAJAXAction.java) (revision 23211f44c3c9c17bf1f48b16985cba850fbdbf78) @@ -43,7 +43,7 @@ import org.lamsfoundation.lams.learningdesign.ActivityTitleComparator; import org.lamsfoundation.lams.learningdesign.BranchingActivity; import org.lamsfoundation.lams.learningdesign.Group; -import org.lamsfoundation.lams.learningdesign.GroupBranchActivityEntry; +import org.lamsfoundation.lams.learningdesign.BranchActivityEntry; import org.lamsfoundation.lams.learningdesign.SequenceActivity; import org.lamsfoundation.lams.lesson.service.LessonServiceException; import org.lamsfoundation.lams.monitoring.BranchingDTO; @@ -140,8 +140,8 @@ boolean mayMoveUser = true; while (iter.hasNext()) { SequenceActivity branch = (SequenceActivity) iter.next(); - Set mappingEntries = branch.getBranchEntries(); - for ( GroupBranchActivityEntry entry : mappingEntries ) { + Set mappingEntries = branch.getBranchEntries(); + for ( BranchActivityEntry entry : mappingEntries ) { mayMoveUser = mayMoveUser && entry.getGroup().mayBeDeleted(); } }