1e32b21f14d52bac429a9c54fe031f9e92c911d64Jesse Wilson/*
2e32b21f14d52bac429a9c54fe031f9e92c911d64Jesse Wilson * Copyright (C) 2010 The Android Open Source Project
3e32b21f14d52bac429a9c54fe031f9e92c911d64Jesse Wilson *
4e32b21f14d52bac429a9c54fe031f9e92c911d64Jesse Wilson * Licensed under the Apache License, Version 2.0 (the "License");
5e32b21f14d52bac429a9c54fe031f9e92c911d64Jesse Wilson * you may not use this file except in compliance with the License.
6e32b21f14d52bac429a9c54fe031f9e92c911d64Jesse Wilson * You may obtain a copy of the License at
7e32b21f14d52bac429a9c54fe031f9e92c911d64Jesse Wilson *
8e32b21f14d52bac429a9c54fe031f9e92c911d64Jesse Wilson *      http://www.apache.org/licenses/LICENSE-2.0
9e32b21f14d52bac429a9c54fe031f9e92c911d64Jesse Wilson *
10e32b21f14d52bac429a9c54fe031f9e92c911d64Jesse Wilson * Unless required by applicable law or agreed to in writing, software
11e32b21f14d52bac429a9c54fe031f9e92c911d64Jesse Wilson * distributed under the License is distributed on an "AS IS" BASIS,
12e32b21f14d52bac429a9c54fe031f9e92c911d64Jesse Wilson * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13e32b21f14d52bac429a9c54fe031f9e92c911d64Jesse Wilson * See the License for the specific language governing permissions and
14e32b21f14d52bac429a9c54fe031f9e92c911d64Jesse Wilson * limitations under the License.
15e32b21f14d52bac429a9c54fe031f9e92c911d64Jesse Wilson */
16e32b21f14d52bac429a9c54fe031f9e92c911d64Jesse Wilson
176186821cb13f4ac7ff50950c813394367e021eaeJesse Wilsonpackage libcore.util;
18e32b21f14d52bac429a9c54fe031f9e92c911d64Jesse Wilson
1966e8297c70daaf001ca199e4e4ad3ba5283396d2Elliott Hughesimport java.lang.reflect.Field;
2066e8297c70daaf001ca199e4e4ad3ba5283396d2Elliott Hughesimport java.lang.reflect.Modifier;
2166e8297c70daaf001ca199e4e4ad3ba5283396d2Elliott Hughesimport java.util.Arrays;
2266e8297c70daaf001ca199e4e4ad3ba5283396d2Elliott Hughes
23e32b21f14d52bac429a9c54fe031f9e92c911d64Jesse Wilsonpublic final class Objects {
24e32b21f14d52bac429a9c54fe031f9e92c911d64Jesse Wilson    private Objects() {}
25e32b21f14d52bac429a9c54fe031f9e92c911d64Jesse Wilson
26e32b21f14d52bac429a9c54fe031f9e92c911d64Jesse Wilson    /**
27e32b21f14d52bac429a9c54fe031f9e92c911d64Jesse Wilson     * Returns true if two possibly-null objects are equal.
28e32b21f14d52bac429a9c54fe031f9e92c911d64Jesse Wilson     */
29e32b21f14d52bac429a9c54fe031f9e92c911d64Jesse Wilson    public static boolean equal(Object a, Object b) {
30e32b21f14d52bac429a9c54fe031f9e92c911d64Jesse Wilson        return a == b || (a != null && a.equals(b));
31e32b21f14d52bac429a9c54fe031f9e92c911d64Jesse Wilson    }
32d7fd1b88b89ca762afe5609d84a8eedfb611cbe1Brian Carlstrom
33d7fd1b88b89ca762afe5609d84a8eedfb611cbe1Brian Carlstrom    public static int hashCode(Object o) {
34d7fd1b88b89ca762afe5609d84a8eedfb611cbe1Brian Carlstrom        return (o == null) ? 0 : o.hashCode();
35d7fd1b88b89ca762afe5609d84a8eedfb611cbe1Brian Carlstrom    }
3666e8297c70daaf001ca199e4e4ad3ba5283396d2Elliott Hughes
3766e8297c70daaf001ca199e4e4ad3ba5283396d2Elliott Hughes    /**
3866e8297c70daaf001ca199e4e4ad3ba5283396d2Elliott Hughes     * Returns a string reporting the value of each declared field, via reflection.
3966e8297c70daaf001ca199e4e4ad3ba5283396d2Elliott Hughes     * Static and transient fields are automatically skipped. Produces output like
4066e8297c70daaf001ca199e4e4ad3ba5283396d2Elliott Hughes     * "SimpleClassName[integer=1234,string="hello",character='c',intArray=[1,2,3]]".
4166e8297c70daaf001ca199e4e4ad3ba5283396d2Elliott Hughes     */
4266e8297c70daaf001ca199e4e4ad3ba5283396d2Elliott Hughes    public static String toString(Object o) {
4366e8297c70daaf001ca199e4e4ad3ba5283396d2Elliott Hughes        Class<?> c = o.getClass();
4466e8297c70daaf001ca199e4e4ad3ba5283396d2Elliott Hughes        StringBuilder sb = new StringBuilder();
4566e8297c70daaf001ca199e4e4ad3ba5283396d2Elliott Hughes        sb.append(c.getSimpleName()).append('[');
4666e8297c70daaf001ca199e4e4ad3ba5283396d2Elliott Hughes        int i = 0;
4766e8297c70daaf001ca199e4e4ad3ba5283396d2Elliott Hughes        for (Field f : c.getDeclaredFields()) {
4866e8297c70daaf001ca199e4e4ad3ba5283396d2Elliott Hughes            if ((f.getModifiers() & (Modifier.STATIC | Modifier.TRANSIENT)) != 0) {
4966e8297c70daaf001ca199e4e4ad3ba5283396d2Elliott Hughes                continue;
5066e8297c70daaf001ca199e4e4ad3ba5283396d2Elliott Hughes            }
5166e8297c70daaf001ca199e4e4ad3ba5283396d2Elliott Hughes            f.setAccessible(true);
5266e8297c70daaf001ca199e4e4ad3ba5283396d2Elliott Hughes            try {
5366e8297c70daaf001ca199e4e4ad3ba5283396d2Elliott Hughes                Object value = f.get(o);
5466e8297c70daaf001ca199e4e4ad3ba5283396d2Elliott Hughes
5566e8297c70daaf001ca199e4e4ad3ba5283396d2Elliott Hughes                if (i++ > 0) {
5666e8297c70daaf001ca199e4e4ad3ba5283396d2Elliott Hughes                    sb.append(',');
5766e8297c70daaf001ca199e4e4ad3ba5283396d2Elliott Hughes                }
5866e8297c70daaf001ca199e4e4ad3ba5283396d2Elliott Hughes
5966e8297c70daaf001ca199e4e4ad3ba5283396d2Elliott Hughes                sb.append(f.getName());
6066e8297c70daaf001ca199e4e4ad3ba5283396d2Elliott Hughes                sb.append('=');
6166e8297c70daaf001ca199e4e4ad3ba5283396d2Elliott Hughes
6266e8297c70daaf001ca199e4e4ad3ba5283396d2Elliott Hughes                if (value.getClass().isArray()) {
6366e8297c70daaf001ca199e4e4ad3ba5283396d2Elliott Hughes                    if (value.getClass() == boolean[].class) {
6466e8297c70daaf001ca199e4e4ad3ba5283396d2Elliott Hughes                        sb.append(Arrays.toString((boolean[]) value));
6566e8297c70daaf001ca199e4e4ad3ba5283396d2Elliott Hughes                    } else if (value.getClass() == byte[].class) {
6666e8297c70daaf001ca199e4e4ad3ba5283396d2Elliott Hughes                        sb.append(Arrays.toString((byte[]) value));
6766e8297c70daaf001ca199e4e4ad3ba5283396d2Elliott Hughes                    } else if (value.getClass() == char[].class) {
6866e8297c70daaf001ca199e4e4ad3ba5283396d2Elliott Hughes                        sb.append(Arrays.toString((char[]) value));
6966e8297c70daaf001ca199e4e4ad3ba5283396d2Elliott Hughes                    } else if (value.getClass() == double[].class) {
7066e8297c70daaf001ca199e4e4ad3ba5283396d2Elliott Hughes                        sb.append(Arrays.toString((double[]) value));
7166e8297c70daaf001ca199e4e4ad3ba5283396d2Elliott Hughes                    } else if (value.getClass() == float[].class) {
7266e8297c70daaf001ca199e4e4ad3ba5283396d2Elliott Hughes                        sb.append(Arrays.toString((float[]) value));
7366e8297c70daaf001ca199e4e4ad3ba5283396d2Elliott Hughes                    } else if (value.getClass() == int[].class) {
7466e8297c70daaf001ca199e4e4ad3ba5283396d2Elliott Hughes                        sb.append(Arrays.toString((int[]) value));
7566e8297c70daaf001ca199e4e4ad3ba5283396d2Elliott Hughes                    } else if (value.getClass() == long[].class) {
7666e8297c70daaf001ca199e4e4ad3ba5283396d2Elliott Hughes                        sb.append(Arrays.toString((long[]) value));
7766e8297c70daaf001ca199e4e4ad3ba5283396d2Elliott Hughes                    } else if (value.getClass() == short[].class) {
7866e8297c70daaf001ca199e4e4ad3ba5283396d2Elliott Hughes                        sb.append(Arrays.toString((short[]) value));
7966e8297c70daaf001ca199e4e4ad3ba5283396d2Elliott Hughes                    } else {
8066e8297c70daaf001ca199e4e4ad3ba5283396d2Elliott Hughes                        sb.append(Arrays.toString((Object[]) value));
8166e8297c70daaf001ca199e4e4ad3ba5283396d2Elliott Hughes                    }
8266e8297c70daaf001ca199e4e4ad3ba5283396d2Elliott Hughes                } else if (value.getClass() == Character.class) {
8366e8297c70daaf001ca199e4e4ad3ba5283396d2Elliott Hughes                    sb.append('\'').append(value).append('\'');
8466e8297c70daaf001ca199e4e4ad3ba5283396d2Elliott Hughes                } else if (value.getClass() == String.class) {
8566e8297c70daaf001ca199e4e4ad3ba5283396d2Elliott Hughes                    sb.append('"').append(value).append('"');
8666e8297c70daaf001ca199e4e4ad3ba5283396d2Elliott Hughes                } else {
8766e8297c70daaf001ca199e4e4ad3ba5283396d2Elliott Hughes                    sb.append(value);
8866e8297c70daaf001ca199e4e4ad3ba5283396d2Elliott Hughes                }
8966e8297c70daaf001ca199e4e4ad3ba5283396d2Elliott Hughes            } catch (IllegalAccessException unexpected) {
9066e8297c70daaf001ca199e4e4ad3ba5283396d2Elliott Hughes                throw new AssertionError(unexpected);
9166e8297c70daaf001ca199e4e4ad3ba5283396d2Elliott Hughes            }
9266e8297c70daaf001ca199e4e4ad3ba5283396d2Elliott Hughes        }
9366e8297c70daaf001ca199e4e4ad3ba5283396d2Elliott Hughes        sb.append("]");
9466e8297c70daaf001ca199e4e4ad3ba5283396d2Elliott Hughes        return sb.toString();
9566e8297c70daaf001ca199e4e4ad3ba5283396d2Elliott Hughes    }
96e32b21f14d52bac429a9c54fe031f9e92c911d64Jesse Wilson}
97