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
010    private Objects() {
011    }
012
013    public static boolean equal(Object a, Object b) {
014        return a == b || (a != null && a.equals(b));
015    }
016
017    public static int hashCode(Object o) {
018        return o == null ? 0 : o.hashCode();
019    }
020
021    public static String toString(Object o) {
022        Class<?> clazz = o.getClass();
023        StringBuilder out = new StringBuilder();
024        out.append(clazz.getSimpleName()).append('[');
025        int index = 0;
026        for (Field field : clazz.getDeclaredFields()) {
027            if (isIgnored(field)) {
028                continue;
029            }
030            field.setAccessible(true);
031            try {
032                Object val = field.get(o);
033                if (index++ > 0) {
034                    out.append(',');
035                }
036                out.append(field.getName()).append('=');
037                appendFormattedValue(out, val);
038            } catch (IllegalAccessException e) {
039                throw new AssertionError(e);
040            }
041        }
042        out.append(']');
043        return out.toString();
044    }
045
046    private static boolean isIgnored(Field field) {
047        int mods = field.getModifiers();
048        return (mods & (Modifier.STATIC | Modifier.TRANSIENT)) != 0;
049    }
050
051    private static void appendFormattedValue(StringBuilder sb, Object val) {
052        Class<?> type = val.getClass();
053        if (type.isArray()) {
054            if (type == boolean[].class) sb.append(Arrays.toString((boolean[]) val));
055            else if (type == byte[].class) sb.append(Arrays.toString((byte[]) val));
056            else if (type == char[].class) sb.append(Arrays.toString((char[]) val));
057            else if (type == double[].class) sb.append(Arrays.toString((double[]) val));
058            else if (type == float[].class) sb.append(Arrays.toString((float[]) val));
059            else if (type == int[].class) sb.append(Arrays.toString((int[]) val));
060            else if (type == long[].class) sb.append(Arrays.toString((long[]) val));
061            else if (type == short[].class) sb.append(Arrays.toString((short[]) val));
062            else sb.append(Arrays.toString((Object[]) val));
063        } else if (type == Character.class) {
064            sb.append('\'').append(val).append('\'');
065        } else if (type == String.class) {
066            sb.append('"').append(val).append('"');
067        } else {
068            sb.append(val);
069        }
070    }
071}