|| a instanceof State && b == null // || a == null && b instanceof State) { return equalsLoose((State) a, (State) b); } else if (a instanceof List && b instanceof List // || a instanceof List && b == null // @SuppressWarnings("unchecked") List<Serializable> lb = (List<Serializable>) b; return equalsLoose(la, lb); } else if (a instanceof Object[] && b instanceof Object[] // || a instanceof Object[] && b == null // || a == null && b instanceof Object[]) { return equalsLoose((Object[]) a, (Object[]) b); } else if (a instanceof ListDiff && b instanceof ListDiff) { ListDiff lda = (ListDiff) a; ListDiff ldb = (ListDiff) b; return lda.isArray == ldb.isArray && equalsLoose(lda.diff, ldb.diff) && equalsLoose(lda.rpush, ldb.rpush); } else if (isScalar(a) && isScalar(b)) { return a.equals(b); // NOSONAR
/** * Compares two {@link List}s. * <p> * {@code null} values are equivalent to empty lists. */ public static boolean equalsLoose(List<Serializable> a, List<Serializable> b) { if (a != null && a.isEmpty()) { a = null; } if (b != null && b.isEmpty()) { b = null; } if (a == b) { return true; } if (a == null || b == null) { return false; } if (a.size() != b.size()) { return false; } for (Iterator<Serializable> ita = a.iterator(), itb = b.iterator(); ita.hasNext();) { if (!equalsLoose(ita.next(), itb.next())) { return false; } } return true; }
if (!equalsLoose(va, vb)) { return false; if (!equalsLoose(null, vb)) { return false;
/** * Does a diff of two values. * * @return a {@link StateDiff}, a {@link ListDiff}, {@link #NOP}, or an actual value (including {@code null}) */ public static Serializable diff(Object a, Object b) { if (equalsLoose(a, b)) { return NOP; } if (a instanceof Object[] && b instanceof Object[]) { return diff((Object[]) a, (Object[]) b); } if (a instanceof List && b instanceof List) { @SuppressWarnings("unchecked") List<Object> la = (List<Object>) a; @SuppressWarnings("unchecked") List<Object> lb = (List<Object>) b; return (Serializable) diff(la, lb); } if (a instanceof State && b instanceof State) { StateDiff diff = diff((State) a, (State) b); return diff.isEmpty() ? NOP : diff; } return (Serializable) b; }
if (!equalsLoose(null, vb)) {