package com.brightgenerous.commons.delegate; import java.lang.invoke.MethodHandle; import java.lang.invoke.MethodHandles.Lookup; import java.util.Collection; import java.util.logging.Level; import java.util.logging.Logger; import com.brightgenerous.commons.MethodUtils; @Deprecated public class EqualsUtility { private static final Logger log = Logger.getAnonymousLogger(); public static final boolean RESOLVED; private static final EqualsDelegater delegater; static { EqualsDelegater tmp = null; boolean resolved = false; try { tmp = new EqualsDelegaterImpl(); resolved = true; } catch (NoClassDefFoundError | RuntimeException e) { if (log.isLoggable(Level.INFO)) { log.log(Level.INFO, "does not resolve apache commons lang EqualsBuilder"); } if (e instanceof RuntimeException) { Throwable th = e.getCause(); if ((th == null) || !(th instanceof ClassNotFoundException)) { throw e; } } } RESOLVED = resolved; delegater = tmp; } private EqualsUtility() { } private static boolean methodHandle(Lookup lookup, Class<?> clazz, Object lhs, Object rhs) { if (lhs == rhs) { return true; } if ((lhs == null) || (rhs == null)) { return false; } MethodHandle mh = null; if ((lookup != null) && (clazz != null)) { try { mh = MethodUtils.getSuperEquals(lookup, clazz); } catch (NoSuchMethodException | IllegalAccessException e) { if (log.isLoggable(Level.WARNING)) { log.log(Level.WARNING, "does not get method handle", e); } throw new RuntimeException(e); } } return methodHandle(mh, lhs, rhs); } private static boolean methodHandle(MethodHandle mh, Object lhs, Object rhs) { if (lhs == rhs) { return true; } if ((lhs == null) || (rhs == null)) { return false; } if (mh == null) { return lhs == rhs; } try { return ((Boolean) mh.invoke(lhs, rhs)).booleanValue(); } catch (Throwable e) { if (e instanceof RuntimeException) { throw (RuntimeException) e; } throw new RuntimeException(e); } } public static boolean reflectionEquals(Lookup lookup, Class<?> clazz, Object lhs, Object rhs, boolean testTransients) { if (delegater == null) { return methodHandle(lookup, clazz, lhs, rhs); } return delegater.reflectionEquals(lhs, rhs, testTransients); } public static boolean reflectionEquals(Lookup lookup, Class<?> clazz, Object lhs, Object rhs, Collection<String> excludeFields) { if (delegater == null) { return methodHandle(lookup, clazz, lhs, rhs); } return delegater.reflectionEquals(lhs, rhs, excludeFields); } public static boolean reflectionEquals(Lookup lookup, Class<?> clazz, Object lhs, Object rhs, String... excludeFields) { if (delegater == null) { return methodHandle(lookup, clazz, lhs, rhs); } return delegater.reflectionEquals(lhs, rhs, excludeFields); } public static boolean reflectionEquals(Lookup lookup, Class<?> clazz, Object lhs, Object rhs, boolean testTransients, Class<?> reflectUpToClass, String... excludeFields) { if (delegater == null) { return methodHandle(lookup, clazz, lhs, rhs); } return delegater .reflectionEquals(lhs, rhs, testTransients, reflectUpToClass, excludeFields); } public static boolean reflectionEquals(MethodHandle mh, Object lhs, Object rhs, boolean testTransients) { if (delegater == null) { return methodHandle(mh, lhs, rhs); } return delegater.reflectionEquals(lhs, rhs, testTransients); } public static boolean reflectionEquals(MethodHandle mh, Object lhs, Object rhs, Collection<String> excludeFields) { if (delegater == null) { return methodHandle(mh, lhs, rhs); } return delegater.reflectionEquals(lhs, rhs, excludeFields); } public static boolean reflectionEquals(MethodHandle mh, Object lhs, Object rhs, String... excludeFields) { if (delegater == null) { return methodHandle(mh, lhs, rhs); } return delegater.reflectionEquals(lhs, rhs, excludeFields); } public static boolean reflectionEquals(MethodHandle mh, Object lhs, Object rhs, boolean testTransients, Class<?> reflectUpToClass, String... excludeFields) { if (delegater == null) { return methodHandle(mh, lhs, rhs); } return delegater .reflectionEquals(lhs, rhs, testTransients, reflectUpToClass, excludeFields); } }