w = new FileWriter(out);
w.append("\n");
w.append("Module ["+ bundleId + "] " + state + " " + bundleName+"\n");
String prefix="-";
StackTraceElement[] stack = Thread.currentThread().getStackTrace();
InhabitantTracing tracing = TracingThreadLocal.get();
Iterator<Inhabitant> itr = tracing.inOrder();
w.append("\n");
w.append("-----------------------------------\n");
w.append("Inhabitants / stack combination\n");
w.append("-----------------------------------\n");
String currentBundleName = bundleName;
for (int i=0;i<stack.length;i++) {
StackTraceElement element = stack[i];
if (element.getClassName().equals(AbstractInhabitantImpl.class.getName()) &&
element.getMethodName().equals("get")) {
// now let's find out the first non hk2 class asking for this...
int j=i+1;
for (;j<stack.length;j++) {
StackTraceElement caller = stack[j];
if (!caller.getClassName().contains("hk2")) {
break;
}
}
if (itr.hasNext()) {
Inhabitant reason = itr.next();
StackTraceElement caller = stack[j];
Module m = null;
try {
if (reason.isInstantiated()) {
m = registry.find(loader.loadClass(reason.typeName()));
}
} catch (ClassNotFoundException e) {
m = null;
}
if (m!=null && !m.getModuleDefinition().getName().equals(currentBundleName)) {
w.append("Looks like module " + currentBundleName + " was " + state + " because "+
m.getName() + " was " + state + "\nSince " + m.getName() + " contains ");
} else {
w.append("Requested by ");
}
if (m!=null)
currentBundleName = m.getName();
w.append(reason + " called from " + caller.getClassName()
+ "." + caller.getMethodName() + ":" + caller.getLineNumber()+" metadata \n" + reason.metadata()+"\n");
w.append("\n");
}
}
}
w.append("\n");
w.append("-----------------------------------\n");
w.append("Inhabitants initialization stack\n");
w.append("-----------------------------------\n");
itr = tracing.inOrder();
while (itr.hasNext()) {
Inhabitant i = itr.next();
w.append(prefix +"> requested from "+ i+"\n");
prefix=prefix+"-";
}