1 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 cr = ""; 34 private static String sp = " "; 35 private static boolean silent = false; 36 37 public static void log(Object 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 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 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 [] classes = getClassHierarchy(a_object); 75 76 String spaces = ""; 77 for (int i = classes.length - 1; i >= 0; i--) { 78 spaces = spaces + sp; 79 80 String 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 fieldName = className + ".getTime"; 90 Object obj = new Long (((Date) a_object).getTime()); 91 log(obj, Long .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 fieldName = className + "." + fields[j].getName(); 100 101 try { 102 Object 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 element = Array.get(obj, k); 110 Class 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 e) { 117 118 } 119 } 120 } 121 } 122 } 123 124 private static void log( 125 Object a_object, 126 Class a_Class, 127 String a_fieldName, 128 int a_depth, 129 int a_arrayElement, 130 Stack a_stack) { 131 if (a_depth > maximumDepth) { 132 return; 133 } 134 String 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 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 a_msg) { 150 if (!silent) { 151 out.println(a_msg + cr); 152 } 153 } 154 155 private static void log(int indent, String a_property, String 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 a_property, String 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 e, Object obj, String msg) { 169 String l_msg; 170 if (e != null) { 171 l_msg = "!!! " + e.getClass().getName(); 172 String 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 [] getClassHierarchy(Object a_object) { 189 Class [] classes = new Class [] { a_object.getClass()}; 190 return getClassHierarchy(classes); 191 } 192 193 private static Class [] getClassHierarchy(Class [] a_classes) { 194 Class clazz = a_classes[a_classes.length - 1].getSuperclass(); 195 if (clazz.equals(Object .class)) { 196 return a_classes; 197 } 198 Class [] classes = new Class [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 normalizeNArray(Object a_object) { 205 if (Array.getLength(a_object) > 0) { 206 Object first = Array.get(a_object, 0); 207 if (first != null && first.getClass().isArray()) { 208 int dim[] = arrayDimensions(a_object); 209 Object all = new Object [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 a_object, 219 Object 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 a_object) { 238 int count = 0; 239 for (Class 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 [] ignore = { Class .class }; 261 262 } 263 | Popular Tags |