001package gudusoft.gsqlparser.dlineage.util;
002
003import java.lang.reflect.Field;
004import java.lang.reflect.Modifier;
005import java.util.Arrays;
006
007
008public final class Objects {
009    private Objects() {
010    }
011
012    /**
013     * Returns true if two possibly-null objects are equal.
014     */
015    public static boolean equal(Object a, Object b) {
016        return a == b || (a != null && a.equals(b));
017    }
018
019    public static int hashCode(Object o) {
020        return (o == null) ? 0 : o.hashCode();
021    }
022
023    /**
024     * Returns a string reporting the value of each declared field, via reflection.
025     * Static and transient fields are automatically skipped. Produces output like
026     * "SimpleClassName[integer=1234,string="hello",character='c',intArray=[1,2,3]]".
027     */
028    public static String toString(Object o) {
029        Class<?> c = o.getClass();
030        StringBuilder sb = new StringBuilder();
031        sb.append(c.getSimpleName()).append('[');
032        int i = 0;
033        for (Field f : c.getDeclaredFields()) {
034            if ((f.getModifiers() & (Modifier.STATIC | Modifier.TRANSIENT)) != 0) {
035                continue;
036            }
037            f.setAccessible(true);
038            try {
039                Object value = f.get(o);
040                if (i++ > 0) {
041                    sb.append(',');
042                }
043                sb.append(f.getName());
044                sb.append('=');
045                if (value.getClass().isArray()) {
046                    if (value.getClass() == boolean[].class) {
047                        sb.append(Arrays.toString((boolean[]) value));
048                    } else if (value.getClass() == byte[].class) {
049                        sb.append(Arrays.toString((byte[]) value));
050                    } else if (value.getClass() == char[].class) {
051                        sb.append(Arrays.toString((char[]) value));
052                    } else if (value.getClass() == double[].class) {
053                        sb.append(Arrays.toString((double[]) value));
054                    } else if (value.getClass() == float[].class) {
055                        sb.append(Arrays.toString((float[]) value));
056                    } else if (value.getClass() == int[].class) {
057                        sb.append(Arrays.toString((int[]) value));
058                    } else if (value.getClass() == long[].class) {
059                        sb.append(Arrays.toString((long[]) value));
060                    } else if (value.getClass() == short[].class) {
061                        sb.append(Arrays.toString((short[]) value));
062                    } else {
063                        sb.append(Arrays.toString((Object[]) value));
064                    }
065                } else if (value.getClass() == Character.class) {
066                    sb.append('\'').append(value).append('\'');
067                } else if (value.getClass() == String.class) {
068                    sb.append('"').append(value).append('"');
069                } else {
070                    sb.append(value);
071                }
072            } catch (IllegalAccessException unexpected) {
073                throw new AssertionError(unexpected);
074            }
075        }
076        sb.append("]");
077        return sb.toString();
078    }
079}