package org.jboss.arquillian.core.impl;
import java.util.Stack;
import org.jboss.arquillian.core.spi.ObserverMethod;
public class RuntimeLogger {
private static final String ARQUILLIAN_DEBUG_PROPERTY = "arquillian.debug";
static Boolean DEBUG = Boolean.valueOf(SecurityActions.getProperty(ARQUILLIAN_DEBUG_PROPERTY));
private ThreadLocal<Stack<Object>> eventStack;
void clear() {
if (eventStack != null) {
eventStack.remove();
}
}
void debug(ObserverMethod method, boolean interceptor) {
if (DEBUG) {
System.out.println(indent()
+ "("
+ (interceptor ? "I" : "O")
+ ") "
+ method.getMethod().getDeclaringClass().getSimpleName()
+ "."
+ method.getMethod().getName());
}
}
void debugExtension(Class<?> extension) {
if (DEBUG) {
System.out.println(indent() + "(X) " + extension.getName());
}
}
void debug(Object event, boolean push) {
if (DEBUG) {
if (push) {
System.out.println(indent() + "(E) " + getEventName(event));
eventStack.get().push(event);
} else {
if (!eventStack.get().isEmpty()) {
eventStack.get().pop();
}
}
}
}
private String getEventName(Object object) {
Class<?> eventClass = object.getClass();
// Print the Interface name of Anonymous classes to show the defined interface, not creation point.
if (eventClass.isAnonymousClass()
&& eventClass.getInterfaces().length == 1
&& !eventClass.getInterfaces()[0].getName().startsWith("java")) {
return eventClass.getInterfaces()[0].getSimpleName();
}
return eventClass.getSimpleName();
}
private String indent() {
if (eventStack == null) {
eventStack = new ThreadLocal<Stack<Object>>() {
@Override
protected Stack<Object> initialValue() {
return new Stack<Object>();
}
};
}
final int size = eventStack.get().size();
StringBuilder sb = new StringBuilder(size * 2);
for (int i = 0; i < size; i++) {
sb.append("\t");
}
return sb.toString();
}
}