+ // Returns true iff. a and b contain equal items in the same order
+ public static boolean listsAreEqual(List<?> a, List<?> b)
+ {
+ if ((null == a) || (null == b)) {
+ return (a == b);
+ }
+
+ if (0 == a.size()) {
+ return (0 == b.size());
+ }
+
+ if (a.size() != b.size()) {
+ return false;
+ }
+
+ Iterator<?> iterA = a.iterator();
+ Iterator<?> iterB = b.iterator();
+
+ while (iterA.hasNext()) {
+ Object elemA = iterA.next();
+ Object elemB = iterB.next();
+
+ if (! objsAreEqual(elemA, elemB)) {
+ return false;
+ }
+ }
+
+ return true;
+ }
+
+ // Test for equality, while taking care to avoid
+ // dereferencing a null pointer.
+ // Note that two null pointers are considered equal.
+ public static boolean objsAreEqual(Object a, Object b)
+ {
+ if ((null == a) || (null == b)) {
+ return (a == b);
+ }
+
+ if ((a instanceof Number) && (b instanceof Number)) {
+ Number aNum = (Number)a;
+ Number bNum = (Number)b;
+
+ return ( (aNum.longValue() == bNum.longValue())
+ || (aNum.doubleValue() == bNum.doubleValue()) );
+ }
+
+ return a.equals(b);
+ }
+
+ // Return 1 if obj is null, or obj.hashCode() otherwise
+ public static int objHashCode(Object obj)
+ {
+ if (null == obj) {
+ return 1;
+ }
+ return obj.hashCode();
+ }
+
+ // Convert a Throwable to the string representation
+ // that is generated by printStackTrace().
+ public static String stringify(Throwable thr)
+ {