Index: lams_common/src/java/org/lamsfoundation/lams/learningdesign/Activity.java =================================================================== diff -u -r069184ea9ddca4feaca53b82e83cad7eab3a04b6 -racf9436c6118cfab5aa7ee7adb258c5ea7375cd9 --- lams_common/src/java/org/lamsfoundation/lams/learningdesign/Activity.java (.../Activity.java) (revision 069184ea9ddca4feaca53b82e83cad7eab3a04b6) +++ lams_common/src/java/org/lamsfoundation/lams/learningdesign/Activity.java (.../Activity.java) (revision acf9436c6118cfab5aa7ee7adb258c5ea7375cd9) @@ -531,12 +531,17 @@ if (!(other instanceof Activity)) return false; Activity castOther = (Activity) other; - return new EqualsBuilder().append(this.getActivityId(), - castOther.getActivityId()).isEquals(); + return new EqualsBuilder() + .append(this.getActivityId(),castOther.getActivityId()) + .append(this.getActivityUIID(),castOther.getActivityUIID()) + .isEquals(); } public int hashCode() { - return new HashCodeBuilder().append(getActivityId()).toHashCode(); + return new HashCodeBuilder() + .append(getActivityId()) + .append(getActivityUIID()) + .toHashCode(); } /** Index: lams_common/src/java/org/lamsfoundation/lams/learningdesign/ActivityOrderComparator.java =================================================================== diff -u -r08950e1090443c3423a3d1c587416a2fccd8bbdf -racf9436c6118cfab5aa7ee7adb258c5ea7375cd9 --- lams_common/src/java/org/lamsfoundation/lams/learningdesign/ActivityOrderComparator.java (.../ActivityOrderComparator.java) (revision 08950e1090443c3423a3d1c587416a2fccd8bbdf) +++ lams_common/src/java/org/lamsfoundation/lams/learningdesign/ActivityOrderComparator.java (.../ActivityOrderComparator.java) (revision acf9436c6118cfab5aa7ee7adb258c5ea7375cd9) @@ -30,8 +30,14 @@ * the primary comparing criteria as it is unique within a complex activity. * If they are the same, activity id are used for comparison to ensure the * sorted set won't treat two activities with the same order id as the - * same activity. + * same activity. If either of the activity ids are null (activities are not + * yet saved in the database) use the activity ui id. The ui ids will compare + * nulls if required, with null being lower than not null. Two nulls will equal true. * + * Note: this comparator may impose orderings that are inconsistent with equals as it + * compares order id before activity id. But in practise all sensible cases should + * come out with the same ordering. + * * @author dgarth, Jacky Fang */ public class ActivityOrderComparator implements Comparator, Serializable { @@ -45,15 +51,34 @@ Activity activity2 = (Activity)o2; if(activity1.getOrderId()==null||activity2.getOrderId()==null) - return activity1.getActivityId().compareTo(activity2.getActivityId()); + return compareActivityId(activity1, activity2); int orderDiff = activity1.getOrderId().compareTo(activity2.getOrderId()); //return order id compare result if they are not the same if(orderDiff!=0) return orderDiff; //if order id are the same, compare activity id. else - return activity1.getActivityId().compareTo(activity2.getActivityId()); + return compareActivityId(activity1, activity2); } + private int compareActivityId(Activity activity1, Activity activity2) { + if (activity1.getActivityId()==null||activity2.getActivityId()==null) { + return compareActivityUIID(activity1, activity2); + } + return activity1.getActivityId().compareTo(activity2.getActivityId()); + } + + private int compareActivityUIID(Activity activity1, Activity activity2) { + if ( activity1.getActivityUIID() == null && activity2.getActivityUIID()==null ) { + return 0; + } + if ( activity1.getActivityUIID() == null ) { + return -1; + } + if ( activity2.getActivityUIID() == null ) { + return 1; + } + return activity1.getActivityUIID().compareTo(activity2.getActivityUIID()); + } }