in geode-core/src/main/java/org/apache/geode/pdx/internal/PdxInstanceImpl.java [326:441]
public boolean equals(Object obj) {
if (obj == this) {
return true;
}
if (obj == null) {
return false;
}
if (!(obj instanceof PdxInstanceImpl)) {
return false;
}
final PdxInstanceImpl other = (PdxInstanceImpl) obj;
PdxReaderImpl ur2 = other.getUnmodifiableReader();
PdxReaderImpl ur1 = getUnmodifiableReader();
if (!ur1.getPdxType().getClassName().equals(ur2.getPdxType().getClassName())) {
return false;
}
SortedSet<PdxField> myFields = ur1.getPdxType().getSortedIdentityFields();
SortedSet<PdxField> otherFields = ur2.getPdxType().getSortedIdentityFields();
if (!myFields.equals(otherFields)) {
if (ur1.getPdxType().getClassName().isEmpty()) {
return false;
}
// It is not ok to modify myFields and otherFields in place so make copies
myFields = new TreeSet<>(myFields);
otherFields = new TreeSet<>(otherFields);
addDefaultFields(myFields, otherFields);
addDefaultFields(otherFields, myFields);
}
Iterator<PdxField> myFieldIterator = myFields.iterator();
Iterator<PdxField> otherFieldIterator = otherFields.iterator();
while (myFieldIterator.hasNext()) {
PdxField myType = myFieldIterator.next();
PdxField otherType = otherFieldIterator.next();
switch (myType.getFieldType()) {
case CHAR:
case BOOLEAN:
case BYTE:
case SHORT:
case INT:
case LONG:
case DATE:
case FLOAT:
case DOUBLE:
case STRING:
case BOOLEAN_ARRAY:
case CHAR_ARRAY:
case BYTE_ARRAY:
case SHORT_ARRAY:
case INT_ARRAY:
case LONG_ARRAY:
case FLOAT_ARRAY:
case DOUBLE_ARRAY:
case STRING_ARRAY:
case ARRAY_OF_BYTE_ARRAYS: {
ByteSource myBuffer = ur1.getRaw(myType);
ByteSource otherBuffer = ur2.getRaw(otherType);
if (!myBuffer.equals(otherBuffer)) {
return false;
}
}
break;
case OBJECT_ARRAY: {
Object[] myArray = ur1.readObjectArray(myType);
Object[] otherArray = ur2.readObjectArray(otherType);
if (!Arrays.deepEquals(myArray, otherArray)) {
return false;
}
}
break;
case OBJECT: {
Object myObject = ur1.readObject(myType);
Object otherObject = ur2.readObject(otherType);
if (myObject != otherObject) {
if (myObject == null) {
return false;
}
if (otherObject == null) {
return false;
}
if (myObject.getClass().isArray()) { // for bug 42976
Class<?> myComponentType = myObject.getClass().getComponentType();
Class<?> otherComponentType = otherObject.getClass().getComponentType();
if (!myComponentType.equals(otherComponentType)) {
return false;
}
if (myComponentType.isPrimitive()) {
ByteSource myBuffer = getRaw(myType);
ByteSource otherBuffer = other.getRaw(otherType);
if (!myBuffer.equals(otherBuffer)) {
return false;
}
} else {
if (!Arrays.deepEquals((Object[]) myObject, (Object[]) otherObject)) {
return false;
}
}
} else if (!myObject.equals(otherObject)) {
return false;
}
}
}
break;
default:
throw new InternalGemFireException("Unhandled field type " + myType.getFieldType());
}
}
return true;
}