KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > com > db4o > test > lib > TLogger


1 /* Copyright (C) 2004 - 2006 db4objects Inc. http://www.db4o.com
2
3 This file is part of the db4o open source object database.
4
5 db4o is free software; you can redistribute it and/or modify it under
6 the terms of version 2 of the GNU General Public License as published
7 by the Free Software Foundation and as clarified by db4objects' GPL
8 interpretation policy, available at
9 http://www.db4o.com/about/company/legalpolicies/gplinterpretation/
10 Alternatively you can write to db4objects, Inc., 1900 S Norfolk Street,
11 Suite 350, San Mateo, CA 94403, USA.
12
13 db4o is distributed in the hope that it will be useful, but WITHOUT ANY
14 WARRANTY; without even the implied warranty of MERCHANTABILITY or
15 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
16 for more details.
17
18 You should have received a copy of the GNU General Public License along
19 with this program; if not, write to the Free Software Foundation, Inc.,
20 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */

21 package com.db4o.test.lib;
22
23 import java.io.*;
24 import java.lang.reflect.*;
25 import java.util.*;
26
27 import com.db4o.*;
28 import com.db4o.test.legacy.soda.*;
29
30 public class TLogger {
31     private static int maximumDepth = Integer.MAX_VALUE;
32     private static PrintStream out = System.out;
33     private static String JavaDoc cr = "";
34     private static String JavaDoc sp = " ";
35     private static boolean silent = false;
36
37     public static void log(Object JavaDoc a_object) {
38         if (a_object == null) {
39             log("[NULL]");
40         } else {
41             log(a_object.getClass().getName());
42             log(a_object, 0, new Stack());
43         }
44     }
45
46     public static void setOut(PrintStream ps) {
47         out = ps;
48     }
49
50     public static void setMaximumDepth(int depth) {
51         maximumDepth = depth;
52     }
53
54     public static void setSilent(boolean flag) {
55         silent = flag;
56     }
57
58     private static void log(Object JavaDoc a_object, int a_depth, Stack a_stack) {
59         if (a_object instanceof SodaTest) {
60             return;
61         }
62         if (a_stack.contains(a_object) || a_depth > maximumDepth) {
63             return;
64         }
65         Class JavaDoc clazz = a_object.getClass();
66         for (int i = 0; i < ignore.length; i++) {
67             if (clazz.isAssignableFrom(ignore[i])) {
68                 return;
69             }
70         }
71
72         a_stack.push(a_object);
73
74         Class JavaDoc[] classes = getClassHierarchy(a_object);
75
76         String JavaDoc spaces = "";
77         for (int i = classes.length - 1; i >= 0; i--) {
78             spaces = spaces + sp;
79
80             String JavaDoc className = spaces;
81             int pos = classes[i].getName().lastIndexOf(".");
82             if (pos > 0) {
83                 className += classes[i].getName().substring(pos);
84             } else {
85                 className += classes[i].getName();
86             }
87
88             if (classes[i] == Date.class) {
89                 String JavaDoc fieldName = className + ".getTime";
90                 Object JavaDoc obj = new Long JavaDoc(((Date) a_object).getTime());
91                 log(obj, Long JavaDoc.class, fieldName, a_depth + 1, -1, a_stack);
92
93             } else {
94                 Field[] fields = classes[i].getDeclaredFields();
95                 for (int j = 0; j < fields.length; j++) {
96                     
97                     Platform4.setAccessible(fields[j]);
98
99                     String JavaDoc fieldName = className + "." + fields[j].getName();
100
101                     try {
102                         Object JavaDoc obj = fields[j].get(a_object);
103
104                         if (obj.getClass().isArray()) {
105                             obj = normalizeNArray(obj);
106
107                             int len = Array.getLength(obj);
108                             for (int k = 0; k < len; k++) {
109                                 Object JavaDoc element = Array.get(obj, k);
110                                 Class JavaDoc arrClass = element == null ? null : element.getClass();
111                                 log(element, arrClass, fieldName, a_depth + 1, k, a_stack);
112                             }
113                         } else {
114                             log(obj, fields[j].getType(), fieldName, a_depth + 1, -1, a_stack);
115                         }
116                     } catch (Exception JavaDoc e) {
117
118                     }
119                 }
120             }
121         }
122     }
123
124     private static void log(
125         Object JavaDoc a_object,
126         Class JavaDoc a_Class,
127         String JavaDoc a_fieldName,
128         int a_depth,
129         int a_arrayElement,
130         Stack a_stack) {
131         if (a_depth > maximumDepth) {
132             return;
133         }
134         String JavaDoc fieldName =
135             (a_arrayElement > -1) ? a_fieldName + sp + sp + a_arrayElement : a_fieldName;
136         if (a_object != null) {
137             log(a_depth, fieldName, "");
138             Class JavaDoc clazz = a_object.getClass();
139             if (Platform4.isSimple(clazz)) {
140                 log(a_depth + 1, a_object.getClass().getName(), a_object.toString());
141             } else {
142                 log(a_object, a_depth, a_stack);
143             }
144         } else {
145             log(a_depth, fieldName, "[NULL]");
146         }
147     }
148
149     private static void log(String JavaDoc a_msg) {
150         if (!silent) {
151             out.println(a_msg + cr);
152         }
153     }
154
155     private static void log(int indent, String JavaDoc a_property, String JavaDoc a_value) {
156         for (int i = 0; i < indent; i++) {
157             a_property = sp + sp + a_property;
158         }
159         log(a_property, a_value);
160     }
161
162     private static void log(String JavaDoc a_property, String JavaDoc a_value) {
163         if (a_value == null)
164             a_value = "[NULL]";
165         log(a_property + ": " + a_value);
166     }
167
168     private static void log(Exception JavaDoc e, Object JavaDoc obj, String JavaDoc msg) {
169         String JavaDoc l_msg;
170         if (e != null) {
171             l_msg = "!!! " + e.getClass().getName();
172             String JavaDoc l_exMsg = e.getMessage();
173             if (l_exMsg != null) {
174                 l_msg += sp + l_exMsg;
175             }
176         } else {
177             l_msg = "!!!Exception log";
178         }
179         if (obj != null) {
180             l_msg += " in " + obj.getClass().getName();
181         }
182         if (msg != null) {
183             l_msg += sp + msg;
184         }
185         log(l_msg);
186     }
187
188     private static Class JavaDoc[] getClassHierarchy(Object JavaDoc a_object) {
189         Class JavaDoc[] classes = new Class JavaDoc[] { a_object.getClass()};
190         return getClassHierarchy(classes);
191     }
192
193     private static Class JavaDoc[] getClassHierarchy(Class JavaDoc[] a_classes) {
194         Class JavaDoc clazz = a_classes[a_classes.length - 1].getSuperclass();
195         if (clazz.equals(Object JavaDoc.class)) {
196             return a_classes;
197         }
198         Class JavaDoc[] classes = new Class JavaDoc[a_classes.length + 1];
199         System.arraycopy(a_classes, 0, classes, 0, a_classes.length);
200         classes[a_classes.length] = clazz;
201         return getClassHierarchy(classes);
202     }
203
204     static Object JavaDoc normalizeNArray(Object JavaDoc a_object) {
205         if (Array.getLength(a_object) > 0) {
206             Object JavaDoc first = Array.get(a_object, 0);
207             if (first != null && first.getClass().isArray()) {
208                 int dim[] = arrayDimensions(a_object);
209                 Object JavaDoc all = new Object JavaDoc[arrayElementCount(dim)];
210                 normalizeNArray1(a_object, all, 0, dim, 0);
211                 return all;
212             }
213         }
214         return a_object;
215     }
216
217     static int normalizeNArray1(
218         Object JavaDoc a_object,
219         Object JavaDoc a_all,
220         int a_next,
221         int a_dim[],
222         int a_index) {
223         if (a_index == a_dim.length - 1) {
224             for (int i = 0; i < a_dim[a_index]; i++) {
225                 Array.set(a_all, a_next++, Array.get(a_object, i));
226             }
227         } else {
228             for (int i = 0; i < a_dim[a_index]; i++) {
229                 a_next =
230                     normalizeNArray1(Array.get(a_object, i), a_all, a_next, a_dim, a_index + 1);
231             }
232
233         }
234         return a_next;
235     }
236
237     static int[] arrayDimensions(Object JavaDoc a_object) {
238         int count = 0;
239         for (Class JavaDoc clazz = a_object.getClass();
240             clazz.isArray();
241             clazz = clazz.getComponentType()) {
242             count++;
243         }
244         int dim[] = new int[count];
245         for (int i = 0; i < count; i++) {
246             dim[i] = Array.getLength(a_object);
247             a_object = Array.get(a_object, 0);
248         }
249         return dim;
250     }
251
252     static int arrayElementCount(int a_dim[]) {
253         int elements = a_dim[0];
254         for (int i = 1; i < a_dim.length; i++) {
255             elements *= a_dim[i];
256         }
257         return elements;
258     }
259
260     private static final Class JavaDoc[] ignore = { Class JavaDoc.class };
261
262 }
263
Popular Tags