Index: lams_central/src/java/org/lamsfoundation/lams/authoring/ObjectExtractor.java =================================================================== diff -u -r4ca1b4e69d135a796d7db5eab3206e24e9503619 -r83a60b6d3abdd08250edce24a25a78263cd6b984 --- lams_central/src/java/org/lamsfoundation/lams/authoring/ObjectExtractor.java (.../ObjectExtractor.java) (revision 4ca1b4e69d135a796d7db5eab3206e24e9503619) +++ lams_central/src/java/org/lamsfoundation/lams/authoring/ObjectExtractor.java (.../ObjectExtractor.java) (revision 83a60b6d3abdd08250edce24a25a78263cd6b984) @@ -137,6 +137,7 @@ protected HashMap groupings = new HashMap(); protected HashMap groups = 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(); protected LearningDesign learningDesign = null; @@ -403,15 +404,38 @@ parseActivitiesToMatchUpParentActivityByParentUIID((Vector)table.get(WDDXTAGS.ACTIVITIES)); parseTransitions((Vector)table.get(WDDXTAGS.TRANSITIONS)); parseBranchMappings((Vector)table.get(WDDXTAGS.BRANCH_MAPPINGS)); - + progressFirstActivityWithinSequence(); + learningDesign.setFirstActivity(learningDesign.calculateFirstActivity()); learningDesignDAO.insertOrUpdate(learningDesign); deleteUnwantedGroupings(); deleteUnwantedToolSessions(learningDesign); return learningDesign; } - + + /** Link SequenceActivities up with their firstActivity entries + * @throws WDDXProcessorConversionException */ + private void progressFirstActivityWithinSequence() throws WDDXProcessorConversionException { + + if ( firstChildToSequenceMap.size() > 0 ) { + for ( Integer firstChildUIID : firstChildToSequenceMap.keySet() ) { + SequenceActivity sequence = firstChildToSequenceMap.get(firstChildUIID); + Activity childActivity = newActivityMap.get(firstChildUIID); + if ( childActivity == null ) { + String msg = "Unable to find first child activity ("+firstChildUIID + +") for the sequence activity ("+sequence + +") referred to in First Child to Sequence map."; + throw new WDDXProcessorConversionException(msg); + } else { + sequence.setFirstActivity(childActivity); + } + } + + } + } + + /** * Initialise the map of groupings with those in the db from a previous save. * This must be called as soon as the learning design is read from the db and before it is changed. @@ -915,8 +939,12 @@ private void buildParallelActivity(ParallelActivity activity,Hashtable activityDetails) throws WDDXProcessorConversionException{ } private void buildSequenceActivity(SequenceActivity activity,Hashtable activityDetails) throws WDDXProcessorConversionException{ - + Integer firstActivityUIID = WDDXProcessor.convertToInteger(activityDetails, WDDXTAGS.FIRST_ACTIVITY_UIID); + if ( firstActivityUIID != null ) { + firstChildToSequenceMap.put(firstActivityUIID, (SequenceActivity)activity); + } } + private void buildToolActivity(ToolActivity toolActivity,Hashtable activityDetails) throws WDDXProcessorConversionException{ if ( log.isDebugEnabled() ) { log.debug("In tool activity UUID"+activityDetails.get(WDDXTAGS.ACTIVITY_UIID) Index: lams_common/src/java/org/lamsfoundation/lams/learningdesign/strategy/SequenceActivityStrategy.java =================================================================== diff -u -rbcf3c2625a3058000eace393a017cc71bd3442de -r83a60b6d3abdd08250edce24a25a78263cd6b984 --- lams_common/src/java/org/lamsfoundation/lams/learningdesign/strategy/SequenceActivityStrategy.java (.../SequenceActivityStrategy.java) (revision bcf3c2625a3058000eace393a017cc71bd3442de) +++ lams_common/src/java/org/lamsfoundation/lams/learningdesign/strategy/SequenceActivityStrategy.java (.../SequenceActivityStrategy.java) (revision 83a60b6d3abdd08250edce24a25a78263cd6b984) @@ -27,6 +27,7 @@ import java.util.Set; import java.util.TreeSet; +import org.apache.log4j.Logger; import org.lamsfoundation.lams.learningdesign.Activity; import org.lamsfoundation.lams.learningdesign.ActivityOrderComparator; import org.lamsfoundation.lams.learningdesign.ComplexActivity; @@ -40,6 +41,8 @@ */ public class SequenceActivityStrategy extends ComplexActivityStrategy { + protected Logger log = Logger.getLogger(SequenceActivityStrategy.class); + protected SequenceActivity sequenceActivity = null; public SequenceActivityStrategy(SequenceActivity sequenceActivity) { @@ -53,36 +56,49 @@ * via transitions, so we are only interested in child activities that * start a series of linked activities. * - *

This will return the next such activity (ie one that doesn't + *

If the sequence has a firstActivity (according to the firstActivity field) + * then: If the currentChild is the NullActivity then it will return the first + * Activity, otherwise it will return the NullActivity. + * + * If no firstActivity exists then it looks for the child activity that doesn't * have in input transition) with the order id greater the * currentChild. If the currentChild is the NullActivity then - * it will return the first (and normally the only) such child.

+ * it will return the first such child.

* * @see org.lamsfoundation.lams.learningdesign.strategy.ComplexActivityStrategy#getNextActivityByParent(Activity, Activity) */ public Activity getNextActivityByParent(ComplexActivity parent, Activity currentChild) { - Set children = new TreeSet(new ActivityOrderComparator()); - children.addAll(parent.getActivities()); - - Activity inputChild = currentChild; - if ( inputChild != null ) { - if ( inputChild.isNull() ) { - inputChild = null; - } else if ( inputChild.getOrderId() == null ) { - inputChild = null; - } - } - - for(Iterator i=children.iterator();i.hasNext();) - { - Activity curChild = (Activity)i.next(); - if( ( inputChild==null || curChild.getOrderId().longValue() > currentChild.getOrderId().longValue() ) ) { - // we are past the 'currentChild' so look for an activity with no input transition - if ( curChild.getTransitionTo() == null ) - return curChild; - } - } + Activity firstActivity = sequenceActivity.getFirstActivity(); + if ( firstActivity != null ) { + return (currentChild==null || currentChild.isNull() ) ? firstActivity : new NullActivity(); + } + + if ( sequenceActivity.getActivities().size() > 0 ) { + + log.warn("getNextActivityByParent: child activities exist but no firstActivity is set up. Trying to work it out based on transitions. SequenceActivity "+sequenceActivity); + + Activity inputChild = currentChild; + if ( inputChild != null ) { + if ( inputChild.isNull() ) { + inputChild = null; + } else if ( inputChild.getOrderId() == null ) { + inputChild = null; + } + } + + // getActivities is ordered by order id () + for(Iterator i=sequenceActivity.getActivities().iterator();i.hasNext();) + { + Activity curChild = (Activity)i.next(); + if( ( inputChild==null || curChild.getOrderId().longValue() > currentChild.getOrderId().longValue() ) ) { + // we are past the 'currentChild' so look for an activity with no input transition + if ( curChild.getTransitionTo() == null ) + return curChild; + } + } + } + return new NullActivity(); } Index: lams_learning/src/java/org/lamsfoundation/lams/learning/web/action/SequenceActivityAction.java =================================================================== diff -u -rb4c18bb7d876dde2d78f370bdd08a3e53a2d9b51 -r83a60b6d3abdd08250edce24a25a78263cd6b984 --- lams_learning/src/java/org/lamsfoundation/lams/learning/web/action/SequenceActivityAction.java (.../SequenceActivityAction.java) (revision b4c18bb7d876dde2d78f370bdd08a3e53a2d9b51) +++ lams_learning/src/java/org/lamsfoundation/lams/learning/web/action/SequenceActivityAction.java (.../SequenceActivityAction.java) (revision 83a60b6d3abdd08250edce24a25a78263cd6b984) @@ -42,6 +42,7 @@ import org.lamsfoundation.lams.learning.web.form.OptionsActivityForm; import org.lamsfoundation.lams.learningdesign.Activity; +import org.lamsfoundation.lams.learningdesign.NullActivity; import org.lamsfoundation.lams.learningdesign.OptionsActivity; import org.lamsfoundation.lams.learningdesign.SequenceActivity; import org.lamsfoundation.lams.lesson.LearnerProgress; @@ -89,7 +90,7 @@ ActionForward forward = null; SequenceActivity sequenceActivity = (SequenceActivity)activity; - Activity firstActivityInSequence = sequenceActivity.getFirstActivity(); + Activity firstActivityInSequence = sequenceActivity.getNextActivityByParent(new NullActivity()); if ( firstActivityInSequence != null && ! firstActivityInSequence.isNull() ) { // Set the first activity as the current activity and display it