public

static boolean isObjectValueEqual(Object sourceObject,

Object destObject) {

 

try {

 

return compare(sourceObject, destObject, true );

}

catch (IllegalArgumentException e) {

e.printStackTrace();

}

catch (IllegalAccessException e) {

e.printStackTrace();

}

 

return false ;

}

 

private

static boolean compare(Object sourceObject, Object destObject,

 

boolean deepCom) throws IllegalArgumentException,

IllegalAccessException {

 

boolean isEquals = false ;

 

if (sourceObject == null && destObject == null ) {

isEquals =

true ;

}

else if ((sourceObject != null && destObject == null )

|| (sourceObject ==

null && destObject != null )) {

isEquals = setIsEquals(

false , sourceObject);

}

else if (sourceObject.getClass() != destObject.getClass()) {

isEquals = setIsEquals(

false , sourceObject);

}

else if (deepCom) {

 

if (sourceObject.equals(destObject)) {

isEquals =

true ;

}

else if (sourceObject instanceof Map) {

Map<Object, Object> obj1 = (Map<Object, Object>) sourceObject;

Map<Object, Object> obj2 = (Map<Object, Object>) destObject;

 

if (obj1.size() != obj2.size()) {

isEquals = setIsEquals(

false , obj1);

}

else {

 

for (Object key : obj1.keySet()) {

 

if (!obj2.keySet().contains(key)) {

isEquals =

false ;

 

break ;

}

isEquals = setIsEquals(

compare(obj1.get(key), obj2.get(key),

true ),

obj1.get(key));

 

if (!isEquals)

 

break ;

}

}

 

}

else if (sourceObject instanceof List) {

List<Object> obj1 = (List<Object>) sourceObject;

List<Object> obj2 = (List<Object>) destObject;

 

if (obj1.size() != obj2.size()) {

isEquals = setIsEquals(

false , obj1);

}

else {

 

for ( int i = 0; i < obj1.size(); i++) {

isEquals = setIsEquals(

compare(obj1.get(i), obj2.get(i),

true ),

obj1.get(i));

 

if (!isEquals)

 

break ;

}

}

}

else if (sourceObject instanceof Queue) {

 

if (((Queue) sourceObject).isEmpty()

&& ((Queue) destObject).isEmpty()) {

isEquals =

true ;

}

else {

Queue<Object> obj1 = (Queue<Object>) sourceObject;

Queue<Object> obj2 = (Queue<Object>) destObject;

 

if (obj1.size() != obj2.size()) {

isEquals = setIsEquals(

false , obj1);

}

else {

 

int size = obj1.size();

 

for ( int i = 0; i < size; i++) {

isEquals = setIsEquals(

compare(obj1.poll(), obj2.poll(),

true ),

obj1);

 

if (!isEquals)

 

break ;

}

}

}

}

else if (sourceObject instanceof Object[]) {

Object[] obj1 = (Object[]) sourceObject;

Object[] obj2 = (Object[]) destObject;

 

if (obj1.length != obj2.length) {

isEquals = setIsEquals(

false , obj1);

}

else {

 

for ( int i = 0; i < obj1.length; i++) {

isEquals = setIsEquals(compare(obj1[i], obj2[i],

true ),

obj1[i]);

 

if (!isEquals)

 

break ;

}

}

}

else {

Class<?

extends Object> clazz = sourceObject.getClass();

Field[] fields = clazz.getDeclaredFields();

 

for (Field field : fields) {

field.setAccessible(

true );

Object obj1 = field.get(sourceObject);

Object obj2 = field.get(destObject);

 

if (obj1 != null

&& obj2 !=

null

&& (obj1

instanceof DataPaging || obj1 instanceof Government

|| obj1

instanceof AbstractGFSSummary

|| obj1

instanceof GFSReferencable

|| obj1

instanceof Map

|| obj1

instanceof List || obj1 instanceof Object[])) {

isEquals = setIsEquals(compare(obj1, obj2,

true ), obj1);

}

else {

isEquals = setIsEquals(compare(obj1, obj2,

false ), obj1);

}

 

if (!isEquals)

 

break ;

}

}

}

else {

isEquals = setIsEquals(sourceObject.equals(destObject),

sourceObject);

}

 

return isEquals;

}

 

 

private static boolean setIsEquals( boolean equals, Object object) {

 

if (!equals) {

 

try {

 

throw new Exception( "The objects are not equal: " + object);

}

catch (Exception e) {

e.printStackTrace();

}

}

 

return equals;

}