1 /*******************************************************************************
\r
2 * Copyright (c) 2010 Association for Decentralized Information Management in
\r
4 * All rights reserved. This program and the accompanying materials
\r
5 * are made available under the terms of the Eclipse Public License v1.0
\r
6 * which accompanies this distribution, and is available at
\r
7 * http://www.eclipse.org/legal/epl-v10.html
\r
10 * VTT Technical Research Centre of Finland - initial API and implementation
\r
11 *******************************************************************************/
\r
13 package org.simantics.databoard.util;
15 import java.lang.reflect.Array;
\r
16 import java.lang.reflect.Field;
\r
17 import java.util.Arrays;
\r
18 import java.util.Collection;
\r
19 import java.util.HashSet;
\r
20 import java.util.Iterator;
\r
21 import java.util.Set;
\r
26 * @author Toni Kalajainen <toni.kalajainen@vtt.fi>
28 public class ObjectUtils {
31 * Equals test for two optional values.
33 * @param o1 obj1 or null
34 * @param o2 obj2 or null
35 * @return true if equal or both null
37 public static boolean objectEquals(Object o1, Object o2) {
38 if (o1==o2) return true;
39 if (o1==null && o2==null) return true;
40 if (o1==null || o2==null) return false;
44 public static int hashCode(Object obj) {
45 return (obj==null?0:obj.hashCode());
48 public static boolean equals(Collection<?> c1, Collection<?> c2)
50 if (c1.size()!=c2.size()) return false;
51 Iterator<?> i1 = c1.iterator();
52 Iterator<?> i2 = c2.iterator();
55 if (!ObjectUtils.objectEquals(i1.next(), i2.next()))
61 public static String toString(Collection<?> c)
63 if (c.isEmpty()) return "[]";
64 StringBuilder sb = new StringBuilder();
69 if (i++>0) sb.append(", ");
78 public static String printFieldsDeep(Object o)
80 Set<Object> visitedObjects = new HashSet<Object>();
81 StringBuilder sb = new StringBuilder();
82 _printFieldsDeep(sb, o, "", visitedObjects);
86 private static void _printFieldsDeep(StringBuilder sb, Object o, String indent, Set<Object> visitedObjects)
88 Class<?> c = o.getClass();
89 sb.append(c.getSimpleName()+" (id="+System.identityHashCode(o)+")\n");
90 if (!visitedObjects.add(o)) return;
92 while (!c.equals(Object.class)) {
93 for (Field f : ReflectionUtils.getAllFields(c))
95 boolean isStatic = (f.getModifiers() & 8) == 8;
96 boolean isArray = f.getType().isArray();
98 if (isStatic) continue;
99 f.setAccessible(true);
100 sb.append(indent+f.getName()+"=");
102 Object dada = f.get(o);
106 if (dada instanceof double[]) sb.append( Arrays.toString((double[])dada) +"\n");
107 else if (dada instanceof boolean[]) sb.append( Arrays.toString((boolean[])dada) +"\n");
108 else if (dada instanceof byte[]) sb.append( Arrays.toString((byte[])dada) +"\n");
109 else if (dada instanceof char[]) sb.append( Arrays.toString((char[])dada) +"\n");
110 else if (dada instanceof float[]) sb.append( Arrays.toString((float[])dada) +"\n");
111 else if (dada instanceof int[]) sb.append( Arrays.toString((int[])dada) +"\n");
112 else if (dada instanceof long[]) sb.append( Arrays.toString((long[])dada) +"\n");
113 else if (dada instanceof short[]) sb.append( Arrays.toString((short[])dada) +"\n");
115 sb.append(dada.getClass().getComponentType()+"["+Array.getLength(dada)+"]\n");
116 for (int i=0; i<Array.getLength(dada); i++) {
117 Object subDada = Array.get(dada, i);
118 sb.append(indent+" ["+i+"]=");
120 if (subDada.getClass().getCanonicalName().startsWith("java")) {
121 sb.append(subDada.toString());
124 _printFieldsDeep(sb, subDada, indent, visitedObjects);
127 catch (Exception e) {
128 System.out.println("ERROR From ObjectUtils / _printfieldsDeep");
130 System.out.println("Subdada null");
131 System.out.println(sb.toString());
138 if (dada.getClass().getCanonicalName().startsWith("java")) {
139 sb.append(dada.toString());
142 _printFieldsDeep(sb, dada, indent, visitedObjects);
146 } catch (IllegalArgumentException e) {
149 } catch (IllegalAccessException e) {
154 c = c.getSuperclass();
158 public static String printFields(Object o)
160 Class<?> c = o.getClass();
161 StringBuilder sb = new StringBuilder();
163 while (!c.equals(Object.class)) {
164 for (Field f : c.getDeclaredFields())
166 boolean isStatic = (f.getModifiers() & 8) == 8;
167 boolean isArray = f.getType().isArray();
169 if (isStatic) continue;
170 f.setAccessible(true);
171 if (sb.length()>0) sb.append(", ");
172 sb.append(f.getName()+"=");
174 Object dada = f.get(o);
178 sb.append(toString(dada));
181 } catch (IllegalArgumentException e) {
184 } catch (IllegalAccessException e) {
189 c = c.getSuperclass();
192 return sb.toString();
195 public static String toString(Object obj) {
196 if (obj instanceof Object[]) {
197 return Arrays.toString((Object[])obj);
199 if (obj instanceof double[]) return Arrays.toString((double[])obj);
200 if (obj instanceof boolean[]) return Arrays.toString((boolean[])obj);
201 if (obj instanceof byte[]) return Arrays.toString((byte[])obj);
202 if (obj instanceof char[]) return Arrays.toString((char[])obj);
203 if (obj instanceof float[]) return Arrays.toString((float[])obj);
204 if (obj instanceof int[]) return Arrays.toString((int[])obj);
205 if (obj instanceof long[]) return Arrays.toString((long[])obj);
206 if (obj instanceof short[]) return Arrays.toString((short[])obj);
207 return obj.toString();