Index: lams_build/lib/lams/lams.jar =================================================================== diff -u -rd3b9b5d94b98da06dcce673877406d8e580a114e -r39838c382f405d63b2bd93eeb2b4cae36d4a2877 Binary files differ Index: lams_common/conf/language/lams/ApplicationResources.properties =================================================================== diff -u -rd5ff2e0121d67650eea6d972b04954a023cc3d4d -r39838c382f405d63b2bd93eeb2b4cae36d4a2877 --- lams_common/conf/language/lams/ApplicationResources.properties (.../ApplicationResources.properties) (revision d5ff2e0121d67650eea6d972b04954a023cc3d4d) +++ lams_common/conf/language/lams/ApplicationResources.properties (.../ApplicationResources.properties) (revision 39838c382f405d63b2bd93eeb2b4cae36d4a2877) @@ -24,6 +24,8 @@ validation.error.GroupingSelected =Grouping is selected but does not exist validation.error.OptionalActivity =An Optional Activity must have one or more activities validation.error.OptionalActivityOrderId =This Optional Activity has invalid order ids +validation.error.FloatingActivity =If you are planning to have floating activities you need at least one floating activity in the container. +validation.error.FloatingActivity.maximum =A maximum of {0} floating activities is allow. Please remove one or more floating activities. validation.error.illegalScheduleGateOffsetsType1 =A Schedule Gate cannot have equal start and end time offsets. validation.error.illegalScheduleGateOffsetsType2 =A Schedule Gate cannot have the start time offset greater than end time offset theme.service.setTheme.saved =User theme saved. Index: lams_common/src/java/org/lamsfoundation/lams/learningdesign/Activity.java =================================================================== diff -u -rd3b9b5d94b98da06dcce673877406d8e580a114e -r39838c382f405d63b2bd93eeb2b4cae36d4a2877 --- lams_common/src/java/org/lamsfoundation/lams/learningdesign/Activity.java (.../Activity.java) (revision d3b9b5d94b98da06dcce673877406d8e580a114e) +++ lams_common/src/java/org/lamsfoundation/lams/learningdesign/Activity.java (.../Activity.java) (revision 39838c382f405d63b2bd93eeb2b4cae36d4a2877) @@ -896,7 +896,8 @@ || getActivityTypeId().intValue() == Activity.OPTIONS_WITH_SEQUENCES_TYPE || getActivityTypeId().intValue() == Activity.CHOSEN_BRANCHING_ACTIVITY_TYPE || getActivityTypeId().intValue() == Activity.GROUP_BRANCHING_ACTIVITY_TYPE - || getActivityTypeId().intValue() == Activity.TOOL_BRANCHING_ACTIVITY_TYPE; + || getActivityTypeId().intValue() == Activity.TOOL_BRANCHING_ACTIVITY_TYPE + || getActivityTypeId().intValue() == Activity.FLOATING_ACTIVITY_TYPE; } public boolean isSystemToolActivity() { Index: lams_common/src/java/org/lamsfoundation/lams/learningdesign/FloatingActivity.java =================================================================== diff -u -rd3b9b5d94b98da06dcce673877406d8e580a114e -r39838c382f405d63b2bd93eeb2b4cae36d4a2877 --- lams_common/src/java/org/lamsfoundation/lams/learningdesign/FloatingActivity.java (.../FloatingActivity.java) (revision d3b9b5d94b98da06dcce673877406d8e580a114e) +++ lams_common/src/java/org/lamsfoundation/lams/learningdesign/FloatingActivity.java (.../FloatingActivity.java) (revision 39838c382f405d63b2bd93eeb2b4cae36d4a2877) @@ -151,9 +151,9 @@ } /** - * Get the maximum number of options, guaranteed not to return null. If the + * Get the maximum number of activities, guaranteed not to return null. If the * value is null in the database, returns the number of activities - * in this optional activity. + * in this floating activity. */ public Integer getMaxNumberOfActivitiesNotNull() { return maxNumberOfActivities!=null ? maxNumberOfActivities : getActivities().size(); Index: lams_common/src/java/org/lamsfoundation/lams/learningdesign/dto/ValidationErrorDTO.java =================================================================== diff -u -r209087915bc219f430c282ad00e5d1e6462f9b5f -r39838c382f405d63b2bd93eeb2b4cae36d4a2877 --- lams_common/src/java/org/lamsfoundation/lams/learningdesign/dto/ValidationErrorDTO.java (.../ValidationErrorDTO.java) (revision 209087915bc219f430c282ad00e5d1e6462f9b5f) +++ lams_common/src/java/org/lamsfoundation/lams/learningdesign/dto/ValidationErrorDTO.java (.../ValidationErrorDTO.java) (revision 39838c382f405d63b2bd93eeb2b4cae36d4a2877) @@ -42,6 +42,8 @@ public static final String GROUPING_SELECTED_ERROR_KEY = "validation.error.GroupingSelected"; // GS public static final String OPTIONAL_ACTIVITY_ERROR_KEY = "validation.error.OptionalActivity"; // OA public static final String OPTIONAL_ACTIVITY_ORDER_ID_INVALID_ERROR_KEY = "validation.error.OptionalActivityOrderId"; // OAOI + public static final String FLOATING_ACTIVITY_ERROR_KEY = "validation.error.FloatingActivity"; // OA + public static final String FLOATING_ACTIVITY_MAX_ERROR_KEY = "validation.error.FloatingActivity.maximum"; // OA public static final String SCHEDULE_GATE_ERROR_TYPE1_KEY = "validation.error.illegalScheduleGateOffsetsType1"; // SG public static final String SCHEDULE_GATE_ERROR_TYPE2_KEY = "validation.error.illegalScheduleGateOffsetsType2"; public static final String CONDITION_GATE_ACTVITY_CONDITION = "validation.error.conditionGateMustHaveACondition"; // CGC @@ -68,6 +70,8 @@ public static final String GROUPING_SELECTED_ERROR_CODE = "GS"; public static final String OPTIONAL_ACTIVITY_ERROR_CODE = "OA"; public static final String OPTIONAL_ACTIVITY_ORDER_ID_INVALID_ERROR_CODE = "OAOI"; + public static final String FLOATING_ACTIVITY_ERROR_CODE = "FA"; + public static final String FLOATING_ACTIVITY_MAX_ERROR_CODE = "FAMX"; public static final String SCHEDULE_GATE_ERROR_CODE = "SG1"; public static final String CONDITION_GATE_ACTVITY_CONDITION_ERROR_CODE = "CGC"; public static final String CONDITION_GATE_ACTVITY_TOOLINPUT_ERROR_CODE = "CGI"; Index: lams_common/src/java/org/lamsfoundation/lams/learningdesign/service/LearningDesignValidator.java =================================================================== diff -u -rc209be8131f22f6fe37bd8d6c14b56425a78b766 -r39838c382f405d63b2bd93eeb2b4cae36d4a2877 --- lams_common/src/java/org/lamsfoundation/lams/learningdesign/service/LearningDesignValidator.java (.../LearningDesignValidator.java) (revision c209be8131f22f6fe37bd8d6c14b56425a78b766) +++ lams_common/src/java/org/lamsfoundation/lams/learningdesign/service/LearningDesignValidator.java (.../LearningDesignValidator.java) (revision 39838c382f405d63b2bd93eeb2b4cae36d4a2877) @@ -34,6 +34,7 @@ import org.lamsfoundation.lams.learningdesign.GroupingActivity; import org.lamsfoundation.lams.learningdesign.LearningDesign; import org.lamsfoundation.lams.learningdesign.OptionsActivity; +import org.lamsfoundation.lams.learningdesign.FloatingActivity; import org.lamsfoundation.lams.learningdesign.RandomGrouping; import org.lamsfoundation.lams.learningdesign.Transition; import org.lamsfoundation.lams.learningdesign.dto.ValidationErrorDTO; @@ -66,14 +67,15 @@ // check all activities have their necessary transitions. First check the // top level, then we need to check each branch inside a branching activity. - Set topLevelActivities = learningDesign.getParentActivities(); + Set topLevelActivities = extractFloatingActivities(learningDesign.getParentActivities()); validateActivityTransitionRules(topLevelActivities, learningDesign.getTransitions()); for (Activity activity : (Set) learningDesign.getActivities()) { checkIfGroupingRequired(activity); validateGroupingIfGroupingIsApplied(activity); validateOptionalActivity(activity); validateOptionsActivityOrderId(activity); + validateFloatingActivity(activity); validateGroupingActivity(activity); Vector activityErrors = activity.validateActivity(messageService); if (activityErrors != null && !activityErrors.isEmpty()) { @@ -84,6 +86,19 @@ cleanupValidationErrors(); return errors; } + + /** + * Removes all Floating Activity(s) from the top level collection for validation procressing. + * + * @param topLevelActivities Set of Top-level activities. + */ + private Set extractFloatingActivities(Set topLevelActivities) { + for (Activity activity : (Set) topLevelActivities) + if(activity.isFloatingActivity()) + topLevelActivities.remove(activity); + + return topLevelActivities; + } /** * Cleans up multiple and redundant error messages in the list. @@ -157,7 +172,11 @@ ArrayList complexActivitiesToProcess = null; for (Activity activity : activities) { + if(activity.isFloatingActivity()) + break; + checkActivityForTransition(activity, numOfTopLevelActivities); + if (activity.getTransitionFrom() == null) { noOuputTransition.add(activity); } @@ -240,7 +259,7 @@ */ private ArrayList checkActivityForFurtherProcessing(ArrayList complexActivitiesToProcess, Activity activity) { - if (activity.isComplexActivity() && !activity.isParallelActivity()) { + if (activity.isComplexActivity() && !activity.isParallelActivity() && !activity.isFloatingActivity()) { if (complexActivitiesToProcess == null) { complexActivitiesToProcess = new ArrayList(); } @@ -369,7 +388,36 @@ } } + + /** + * If this activity is an FloatingActivity, then it must contain at least one activity and no more than the + * maximum activities value. + * + * @param parentActivity + */ + private void validateFloatingActivity(Activity parentActivity) { + if (parentActivity.isFloatingActivity()) { + //get the child activities and check how many there are. + FloatingActivity floatingActivity = (FloatingActivity) parentActivity; + Set childActivities = floatingActivity.getActivities(); + int numOfChildActivities = childActivities.size(); + // require at least one floating activity + if (numOfChildActivities == 0) { + errors.add(new ValidationErrorDTO(ValidationErrorDTO.FLOATING_ACTIVITY_ERROR_CODE, messageService + .getMessage(ValidationErrorDTO.FLOATING_ACTIVITY_ERROR_KEY), floatingActivity.getActivityUIID())); + } + // collection cannot exceed max limit + if (numOfChildActivities > floatingActivity.getMaxNumberOfActivities()) { + errors.add(new ValidationErrorDTO(ValidationErrorDTO.FLOATING_ACTIVITY_MAX_ERROR_CODE, messageService + .getMessage(ValidationErrorDTO.FLOATING_ACTIVITY_MAX_ERROR_KEY), floatingActivity.getActivityUIID())); + } + + + } + + } + /** * If this activity is an GroupingActivity, the number of groups in the grouping records is greater than 0 and * the grouping has some groups, then the actual number of groups must no exceed the desired number of groups.