Index: lams_common/src/java/org/lamsfoundation/lams/learningdesign/ScheduleGateActivity.java =================================================================== diff -u -r08950e1090443c3423a3d1c587416a2fccd8bbdf -rf07be6df99f4f8ffb45221f7c4c7ffdf2f24525e --- lams_common/src/java/org/lamsfoundation/lams/learningdesign/ScheduleGateActivity.java (.../ScheduleGateActivity.java) (revision 08950e1090443c3423a3d1c587416a2fccd8bbdf) +++ lams_common/src/java/org/lamsfoundation/lams/learningdesign/ScheduleGateActivity.java (.../ScheduleGateActivity.java) (revision f07be6df99f4f8ffb45221f7c4c7ffdf2f24525e) @@ -339,9 +339,9 @@ Vector listOfValidationErrors = new Vector(); if(isScheduledByTimeOffset()) { if(getGateStartTimeOffset().equals(getGateEndTimeOffset())) - listOfValidationErrors.add(new ValidationErrorDTO(messageService.getMessage(ValidationErrorDTO.SCHEDULE_GATE_ERROR_TYPE1_KEY), this.getActivityUIID())); + listOfValidationErrors.add(new ValidationErrorDTO(ValidationErrorDTO.SCHEDULE_GATE_ERROR_CODE, messageService.getMessage(ValidationErrorDTO.SCHEDULE_GATE_ERROR_TYPE1_KEY), this.getActivityUIID())); else if(getGateStartTimeOffset().compareTo(getGateEndTimeOffset()) > 0) - listOfValidationErrors.add(new ValidationErrorDTO(messageService.getMessage(ValidationErrorDTO.SCHEDULE_GATE_ERROR_TYPE2_KEY), this.getActivityUIID())); + listOfValidationErrors.add(new ValidationErrorDTO(ValidationErrorDTO.SCHEDULE_GATE_ERROR_CODE, messageService.getMessage(ValidationErrorDTO.SCHEDULE_GATE_ERROR_TYPE2_KEY), this.getActivityUIID())); } return listOfValidationErrors; Index: lams_common/src/java/org/lamsfoundation/lams/learningdesign/dto/ValidationErrorDTO.java =================================================================== diff -u -r08950e1090443c3423a3d1c587416a2fccd8bbdf -rf07be6df99f4f8ffb45221f7c4c7ffdf2f24525e --- lams_common/src/java/org/lamsfoundation/lams/learningdesign/dto/ValidationErrorDTO.java (.../ValidationErrorDTO.java) (revision 08950e1090443c3423a3d1c587416a2fccd8bbdf) +++ lams_common/src/java/org/lamsfoundation/lams/learningdesign/dto/ValidationErrorDTO.java (.../ValidationErrorDTO.java) (revision f07be6df99f4f8ffb45221f7c4c7ffdf2f24525e) @@ -30,22 +30,33 @@ public class ValidationErrorDTO { /** Struts Message Resource related variables */ - public static final String CONFIG_PARAM = "org.lamsfoundation.lams.applicationResources"; - public static final String OTHER_ERROR_KEY = "validation.error.other"; - public static final String TRANSITION_ERROR_KEY = "validation.error.transitionNoActivityBeforeOrAfter"; - public static final String ACTIVITY_TRANSITION_ERROR_KEY= "validation.error.activityWithNoTransition"; - public static final String INPUT_TRANSITION_ERROR_TYPE1_KEY = "validation.error.inputTransitionType1"; - public static final String INPUT_TRANSITION_ERROR_TYPE2_KEY = "validation.error.inputTransitionType2"; - public static final String OUTPUT_TRANSITION_ERROR_TYPE1_KEY = "validation.error.outputTransitionType1"; - public static final String OUTPUT_TRANSITION_ERROR_TYPE2_KEY = "validation.error.outputTransitionType2"; - public static final String GROUPING_REQUIRED_ERROR_KEY = "validation.error.GroupingRequired"; - public static final String GROUPING_NOT_REQUIRED_ERROR_KEY = "validation.error.GroupingNotRequired"; - public static final String GROUPING_SELECTED_ERROR_KEY = "validation.error.GroupingSelected"; - public static final String OPTIONAL_ACTIVITY_ERROR_KEY = "validation.error.OptionalActivity"; - public static final String OPTIONAL_ACTIVITY_ORDER_ID_INVALID_ERROR_KEY = "validation.error.OptionalActivityOrderId"; - public static final String SCHEDULE_GATE_ERROR_TYPE1_KEY = "validation.error.illegalScheduleGateOffsetsType1"; - public static final String SCHEDULE_GATE_ERROR_TYPE2_KEY = "validation.error.illegalScheduleGateOffsetsType2"; + public static final String CONFIG_PARAM = "org.lamsfoundation.lams.applicationResources"; // Code: + public static final String OTHER_ERROR_KEY = "validation.error.other"; // O + public static final String TRANSITION_ERROR_KEY = "validation.error.transitionNoActivityBeforeOrAfter"; // T + public static final String ACTIVITY_TRANSITION_ERROR_KEY= "validation.error.activityWithNoTransition"; // AT + public static final String INPUT_TRANSITION_ERROR_TYPE1_KEY = "validation.error.inputTransitionType1"; // IT + public static final String INPUT_TRANSITION_ERROR_TYPE2_KEY = "validation.error.inputTransitionType2"; + public static final String OUTPUT_TRANSITION_ERROR_TYPE1_KEY = "validation.error.outputTransitionType1"; // OT + public static final String OUTPUT_TRANSITION_ERROR_TYPE2_KEY = "validation.error.outputTransitionType2"; + public static final String GROUPING_REQUIRED_ERROR_KEY = "validation.error.GroupingRequired"; // GR + public static final String GROUPING_NOT_REQUIRED_ERROR_KEY = "validation.error.GroupingNotRequired"; // GNR + 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 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 OTHER_ERROR_CODE = "O"; + public static final String TRANSITION_ERROR_CODE = "T"; + public static final String ACTIVITY_TRANSITION_ERROR_CODE = "AT"; + public static final String INPUT_TRANSITION_ERROR_CODE = "IT"; + public static final String OUTPUT_TRANSITION_ERROR_CODE = "OT1"; + public static final String GROUPING_REQUIRED_ERROR_CODE = "GR"; + public static final String GROUPING_NOT_REQUIRED_ERROR_CODE = "GNR"; + 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 SCHEDULE_GATE_ERROR_CODE = "SG1"; private static MessageResources resources = MessageResources.getMessageResources(CONFIG_PARAM); @@ -129,18 +140,20 @@ private Integer UIID; private String message; //the validation message explaining what the problem is + private String code; // unique code representing the validation error message - - public ValidationErrorDTO(String message, Integer UIID) + public ValidationErrorDTO(String code, String message, Integer UIID) { + this.code = code; this.message = message; this.UIID = UIID; } - public ValidationErrorDTO(String message) + public ValidationErrorDTO(String code, String message) { + this.code = code; this.message = message; } @@ -153,7 +166,9 @@ { } - + public String getCode() { + return code; + } public String getMessage() { return message; } Index: lams_common/src/java/org/lamsfoundation/lams/learningdesign/service/LearningDesignService.java =================================================================== diff -u -rcb333c89e9d244ab2204e9bc8cb14d6dd613603e -rf07be6df99f4f8ffb45221f7c4c7ffdf2f24525e --- lams_common/src/java/org/lamsfoundation/lams/learningdesign/service/LearningDesignService.java (.../LearningDesignService.java) (revision cb333c89e9d244ab2204e9bc8cb14d6dd613603e) +++ lams_common/src/java/org/lamsfoundation/lams/learningdesign/service/LearningDesignService.java (.../LearningDesignService.java) (revision f07be6df99f4f8ffb45221f7c4c7ffdf2f24525e) @@ -143,12 +143,53 @@ validateActivityTransitionRules(learningDesign.getParentActivities(), learningDesign.getTransitions(), listOfValidationErrorDTOs); validateGeneral(learningDesign.getActivities(), listOfValidationErrorDTOs); - + cleanupValidationErrors(listOfValidationErrorDTOs); return listOfValidationErrorDTOs; } /** + * Cleans up multiple and redundant error messages in the list. + * @param errors List of errors to cleanup. + */ + private void cleanupValidationErrors(Vector errors) { + ValidationErrorDTO currentError = null; + Iterator it = errors.iterator(); + while(it.hasNext()) { + cleanupTransitionErrors(errors, it); + } + } + + private void cleanupTransitionErrors(Vector errors, Iterator topIt) { + ValidationErrorDTO nextError; + ValidationErrorDTO currentError = (ValidationErrorDTO) topIt.next(); + Iterator it = errors.iterator(); + + while(it.hasNext()) { + nextError = (ValidationErrorDTO) it.next(); + + if(currentError.getCode().equals(ValidationErrorDTO.ACTIVITY_TRANSITION_ERROR_CODE) && + (nextError.getCode().equals(ValidationErrorDTO.INPUT_TRANSITION_ERROR_CODE) || + nextError.getCode().equals(ValidationErrorDTO.OUTPUT_TRANSITION_ERROR_CODE))) + if(currentError.getUIID().equals(nextError.getUIID())) { + topIt.remove(); + return; + } + else if(currentError.getCode().equals(ValidationErrorDTO.INPUT_TRANSITION_ERROR_CODE)) + if(nextError.getCode().equals(ValidationErrorDTO.ACTIVITY_TRANSITION_ERROR_CODE)) + if(currentError.getUIID().equals(nextError.getUIID())) + it.remove(); + else if(currentError.getCode().equals(ValidationErrorDTO.OUTPUT_TRANSITION_ERROR_CODE)) + if(nextError.getCode().equals(ValidationErrorDTO.ACTIVITY_TRANSITION_ERROR_CODE)) + if(currentError.getUIID().equals(nextError.getUIID())) + it.remove(); + + } + + + } + + /** * Perform transition related validations. * * All activities with no input transitions are added to the vector @@ -182,7 +223,7 @@ if (numOfTopLevelActivities > 0) { if (noInputTransition.size() == 0) - listOfValidationErrorDTOs.add(new ValidationErrorDTO(messageService.getMessage(ValidationErrorDTO.INPUT_TRANSITION_ERROR_TYPE2_KEY))); + listOfValidationErrorDTOs.add(new ValidationErrorDTO(ValidationErrorDTO.INPUT_TRANSITION_ERROR_CODE, messageService.getMessage(ValidationErrorDTO.INPUT_TRANSITION_ERROR_TYPE2_KEY))); if (noInputTransition.size() > 1) { @@ -191,20 +232,20 @@ while (noInputTransitionIterator.hasNext()) { Activity a = (Activity)noInputTransitionIterator.next(); - listOfValidationErrorDTOs.add(new ValidationErrorDTO(messageService.getMessage(ValidationErrorDTO.INPUT_TRANSITION_ERROR_TYPE1_KEY), a.getActivityUIID())); + listOfValidationErrorDTOs.add(new ValidationErrorDTO(ValidationErrorDTO.INPUT_TRANSITION_ERROR_CODE, messageService.getMessage(ValidationErrorDTO.INPUT_TRANSITION_ERROR_TYPE1_KEY), a.getActivityUIID())); } } if (noOuputTransition.size() == 0) - listOfValidationErrorDTOs.add(new ValidationErrorDTO(messageService.getMessage(ValidationErrorDTO.OUTPUT_TRANSITION_ERROR_TYPE2_KEY))); + listOfValidationErrorDTOs.add(new ValidationErrorDTO(ValidationErrorDTO.OUTPUT_TRANSITION_ERROR_CODE,messageService.getMessage(ValidationErrorDTO.OUTPUT_TRANSITION_ERROR_TYPE2_KEY))); if (noOuputTransition.size() > 1) { //there is more than one activity with no output transitions Iterator noOutputTransitionIterator = noOuputTransition.iterator(); while (noOutputTransitionIterator.hasNext()) { Activity a = (Activity)noOutputTransitionIterator.next(); - listOfValidationErrorDTOs.add(new ValidationErrorDTO(messageService.getMessage(ValidationErrorDTO.OUTPUT_TRANSITION_ERROR_TYPE1_KEY), a.getActivityUIID())); + listOfValidationErrorDTOs.add(new ValidationErrorDTO(ValidationErrorDTO.OUTPUT_TRANSITION_ERROR_CODE, messageService.getMessage(ValidationErrorDTO.OUTPUT_TRANSITION_ERROR_TYPE1_KEY), a.getActivityUIID())); } } } @@ -228,9 +269,9 @@ Activity fromActivity = transition.getFromActivity(); Activity toActivity = transition.getToActivity(); if (fromActivity == null) - listOfValidationErrorDTOs.add(new ValidationErrorDTO(messageService.getMessage(ValidationErrorDTO.TRANSITION_ERROR_KEY), transition.getTransitionUIID())); + listOfValidationErrorDTOs.add(new ValidationErrorDTO(ValidationErrorDTO.TRANSITION_ERROR_CODE, messageService.getMessage(ValidationErrorDTO.TRANSITION_ERROR_KEY), transition.getTransitionUIID())); else if (toActivity == null) - listOfValidationErrorDTOs.add(new ValidationErrorDTO(messageService.getMessage(ValidationErrorDTO.TRANSITION_ERROR_KEY), transition.getTransitionUIID())); + listOfValidationErrorDTOs.add(new ValidationErrorDTO(ValidationErrorDTO.TRANSITION_ERROR_CODE, messageService.getMessage(ValidationErrorDTO.TRANSITION_ERROR_KEY), transition.getTransitionUIID())); } @@ -254,13 +295,13 @@ if(numOfActivities > 1) { if (inputTransition == null && outputTransition == null) - listOfValidationErrorDTOs.add(new ValidationErrorDTO(messageService.getMessage(ValidationErrorDTO.ACTIVITY_TRANSITION_ERROR_KEY), activity.getActivityUIID())); + listOfValidationErrorDTOs.add(new ValidationErrorDTO(ValidationErrorDTO.ACTIVITY_TRANSITION_ERROR_CODE, messageService.getMessage(ValidationErrorDTO.ACTIVITY_TRANSITION_ERROR_KEY), activity.getActivityUIID())); } if (numOfActivities == 1) { if (inputTransition != null || outputTransition != null) - listOfValidationErrorDTOs.add(new ValidationErrorDTO(messageService.getMessage(ValidationErrorDTO.ACTIVITY_TRANSITION_ERROR_KEY), activity.getActivityUIID())); + listOfValidationErrorDTOs.add(new ValidationErrorDTO(ValidationErrorDTO.ACTIVITY_TRANSITION_ERROR_CODE, messageService.getMessage(ValidationErrorDTO.ACTIVITY_TRANSITION_ERROR_KEY), activity.getActivityUIID())); } @@ -308,15 +349,15 @@ Grouping grouping = activity.getGrouping(); if (grouping == null) { - listOfValidationErrorDTOs.add(new ValidationErrorDTO(messageService.getMessage(ValidationErrorDTO.GROUPING_REQUIRED_ERROR_KEY), activity.getActivityUIID())); + listOfValidationErrorDTOs.add(new ValidationErrorDTO(ValidationErrorDTO.GROUPING_REQUIRED_ERROR_CODE, messageService.getMessage(ValidationErrorDTO.GROUPING_REQUIRED_ERROR_KEY), activity.getActivityUIID())); } } else if(groupingSupportType.intValue() == Grouping.GROUPING_SUPPORT_NONE) { Grouping grouping = activity.getGrouping(); if (grouping != null) { - listOfValidationErrorDTOs.add(new ValidationErrorDTO(messageService.getMessage(ValidationErrorDTO.GROUPING_NOT_REQUIRED_ERROR_KEY), activity.getActivityUIID())); + listOfValidationErrorDTOs.add(new ValidationErrorDTO(ValidationErrorDTO.GROUPING_NOT_REQUIRED_ERROR_CODE, messageService.getMessage(ValidationErrorDTO.GROUPING_NOT_REQUIRED_ERROR_KEY), activity.getActivityUIID())); } } @@ -339,7 +380,7 @@ int numOfChildActivities = childActivities.size(); if(numOfChildActivities == 0) { - listOfValidationErrorDTOs.add(new ValidationErrorDTO(messageService.getMessage(ValidationErrorDTO.OPTIONAL_ACTIVITY_ERROR_KEY), optionsActivity.getActivityUIID())); + listOfValidationErrorDTOs.add(new ValidationErrorDTO(ValidationErrorDTO.OPTIONAL_ACTIVITY_ERROR_CODE, messageService.getMessage(ValidationErrorDTO.OPTIONAL_ACTIVITY_ERROR_KEY), optionsActivity.getActivityUIID())); } @@ -389,7 +430,7 @@ } if (!validOrderId) - listOfValidationErrorDTOs.add(new ValidationErrorDTO(messageService.getMessage(ValidationErrorDTO.OPTIONAL_ACTIVITY_ORDER_ID_INVALID_ERROR_KEY), optionsActivity.getActivityUIID())); + listOfValidationErrorDTOs.add(new ValidationErrorDTO(ValidationErrorDTO.OPTIONAL_ACTIVITY_ORDER_ID_INVALID_ERROR_CODE, messageService.getMessage(ValidationErrorDTO.OPTIONAL_ACTIVITY_ORDER_ID_INVALID_ERROR_KEY), optionsActivity.getActivityUIID())); } } @@ -405,7 +446,7 @@ { if (activity.getGrouping() == null) { - listOfValidationErrorDTOs.add(new ValidationErrorDTO(messageService.getMessage(ValidationErrorDTO.GROUPING_SELECTED_ERROR), activity.getActivityUIID())); + listOfValidationErrorDTOs.add(new ValidationErrorDTO(ValidationErrorDTO.GROUPING_SELECTED_ERROR_CODE, messageService.getMessage(ValidationErrorDTO.GROUPING_SELECTED_ERROR_KEY), activity.getActivityUIID())); } }