Index: lams_common/src/java/org/lamsfoundation/lams/learningdesign/Activity.java =================================================================== RCS file: /usr/local/cvsroot/lams_common/src/java/org/lamsfoundation/lams/learningdesign/Activity.java,v diff -u -r1.55 -r1.56 --- lams_common/src/java/org/lamsfoundation/lams/learningdesign/Activity.java 26 Sep 2006 05:07:32 -0000 1.55 +++ lams_common/src/java/org/lamsfoundation/lams/learningdesign/Activity.java 13 Oct 2006 05:11:34 -0000 1.56 @@ -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 =================================================================== RCS file: /usr/local/cvsroot/lams_common/src/java/org/lamsfoundation/lams/learningdesign/ActivityOrderComparator.java,v diff -u -r1.7 -r1.8 --- lams_common/src/java/org/lamsfoundation/lams/learningdesign/ActivityOrderComparator.java 17 Sep 2006 06:14:16 -0000 1.7 +++ lams_common/src/java/org/lamsfoundation/lams/learningdesign/ActivityOrderComparator.java 13 Oct 2006 05:11:42 -0000 1.8 @@ -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()); + } }