1 /*******************************************************************************
2 * Copyright (c) 2010 Association for Decentralized Information Management in
4 * All rights reserved. This program and the accompanying materials
5 * are made available under the terms of the Eclipse Public License v1.0
6 * which accompanies this distribution, and is available at
7 * http://www.eclipse.org/legal/epl-v10.html
10 * VTT Technical Research Centre of Finland - initial API and implementation
11 *******************************************************************************/
13 package org.simantics.databoard.util;
15 import java.lang.reflect.Array;
16 import java.lang.reflect.Field;
17 import java.util.Arrays;
18 import java.util.Collection;
19 import java.util.HashSet;
20 import java.util.Iterator;
21 import java.util.Objects;
27 * @author Toni Kalajainen <toni.kalajainen@vtt.fi>
29 public class ObjectUtils {
32 * Equals test for two optional values.
34 * @param o1 obj1 or null
35 * @param o2 obj2 or null
36 * @return true if equal or both null
38 public static boolean objectEquals(Object o1, Object o2) {
39 if (o1==o2) return true;
40 if (o1==null && o2==null) return true;
41 if (o1==null || o2==null) return false;
42 if (o1.getClass().isArray() && o2.getClass().isArray())
43 return Objects.deepEquals(o1, o2);
47 public static int hashCode(Object obj) {
48 return (obj==null?0:obj.hashCode());
51 public static boolean equals(Collection<?> c1, Collection<?> c2)
53 if (c1.size()!=c2.size()) return false;
54 Iterator<?> i1 = c1.iterator();
55 Iterator<?> i2 = c2.iterator();
58 if (!ObjectUtils.objectEquals(i1.next(), i2.next()))
64 public static String toString(Collection<?> c)
66 if (c.isEmpty()) return "[]";
67 StringBuilder sb = new StringBuilder();
72 if (i++>0) sb.append(", ");
81 public static String printFieldsDeep(Object o)
83 Set<Object> visitedObjects = new HashSet<Object>();
84 StringBuilder sb = new StringBuilder();
85 _printFieldsDeep(sb, o, "", visitedObjects);
89 private static void _printFieldsDeep(StringBuilder sb, Object o, String indent, Set<Object> visitedObjects)
91 Class<?> c = o.getClass();
92 sb.append(c.getSimpleName()+" (id="+System.identityHashCode(o)+")\n");
93 if (!visitedObjects.add(o)) return;
95 while (!c.equals(Object.class)) {
96 for (Field f : ReflectionUtils.getAllFields(c))
98 boolean isStatic = (f.getModifiers() & 8) == 8;
99 boolean isArray = f.getType().isArray();
101 if (isStatic) continue;
102 f.setAccessible(true);
103 sb.append(indent+f.getName()+"=");
105 Object dada = f.get(o);
109 if (dada instanceof double[]) sb.append( Arrays.toString((double[])dada) +"\n");
110 else if (dada instanceof boolean[]) sb.append( Arrays.toString((boolean[])dada) +"\n");
111 else if (dada instanceof byte[]) sb.append( Arrays.toString((byte[])dada) +"\n");
112 else if (dada instanceof char[]) sb.append( Arrays.toString((char[])dada) +"\n");
113 else if (dada instanceof float[]) sb.append( Arrays.toString((float[])dada) +"\n");
114 else if (dada instanceof int[]) sb.append( Arrays.toString((int[])dada) +"\n");
115 else if (dada instanceof long[]) sb.append( Arrays.toString((long[])dada) +"\n");
116 else if (dada instanceof short[]) sb.append( Arrays.toString((short[])dada) +"\n");
118 sb.append(dada.getClass().getComponentType()+"["+Array.getLength(dada)+"]\n");
119 for (int i=0; i<Array.getLength(dada); i++) {
120 Object subDada = Array.get(dada, i);
121 sb.append(indent+" ["+i+"]=");
123 if (subDada.getClass().getCanonicalName().startsWith("java")) {
124 sb.append(subDada.toString());
127 _printFieldsDeep(sb, subDada, indent, visitedObjects);
130 catch (Exception e) {
131 System.out.println("ERROR From ObjectUtils / _printfieldsDeep");
133 System.out.println("Subdada null");
134 System.out.println(sb.toString());
141 if (dada.getClass().getCanonicalName().startsWith("java")) {
142 sb.append(dada.toString());
145 _printFieldsDeep(sb, dada, indent, visitedObjects);
149 } catch (IllegalArgumentException e) {
152 } catch (IllegalAccessException e) {
157 c = c.getSuperclass();
161 public static String printFields(Object o)
163 Class<?> c = o.getClass();
164 StringBuilder sb = new StringBuilder();
166 while (!c.equals(Object.class)) {
167 for (Field f : c.getDeclaredFields())
169 boolean isStatic = (f.getModifiers() & 8) == 8;
170 boolean isArray = f.getType().isArray();
172 if (isStatic) continue;
173 f.setAccessible(true);
174 if (sb.length()>0) sb.append(", ");
175 sb.append(f.getName()+"=");
177 Object dada = f.get(o);
181 sb.append(toString(dada));
184 } catch (IllegalArgumentException e) {
187 } catch (IllegalAccessException e) {
192 c = c.getSuperclass();
195 return sb.toString();
198 public static String toString(Object obj) {
199 if (obj instanceof Object[]) {
200 return Arrays.toString((Object[])obj);
202 if (obj instanceof double[]) return Arrays.toString((double[])obj);
203 if (obj instanceof boolean[]) return Arrays.toString((boolean[])obj);
204 if (obj instanceof byte[]) return Arrays.toString((byte[])obj);
205 if (obj instanceof char[]) return Arrays.toString((char[])obj);
206 if (obj instanceof float[]) return Arrays.toString((float[])obj);
207 if (obj instanceof int[]) return Arrays.toString((int[])obj);
208 if (obj instanceof long[]) return Arrays.toString((long[])obj);
209 if (obj instanceof short[]) return Arrays.toString((short[])obj);
210 return obj.toString();