package com.rcpcompany.utils.logging.internal;
import java.util.ArrayList;
import java.util.List;
import com.rcpcompany.utils.logging.ITimedTask;
import com.rcpcompany.utils.logging.LogUtils;
public class TimedTask implements ITimedTask {
private final Object[] myName;
private final long myStartTime;
private List<TimedTask> myChildren = null;
public TimedTask(Object... name) {
this.myName = name;
myStartTime = System.nanoTime();
}
public String getName() {
if (myName.length == 1) {
final Object n = myName[0];
if (n == null)
return "<null>";
return n.toString();
}
final StringBuilder sb = new StringBuilder(200);
for (final Object n : myName) {
sb.append(n);
}
return sb.toString();
}
@Override
public ITimedTask subTask(Object... name) {
final TimedTask child = new TimedTask(name);
if (myChildren == null) {
myChildren = new ArrayList<TimedTask>();
}
myChildren.add(child);
return child;
}
@Override
public void end() {
final long endTime = System.nanoTime();
final StringBuilder sb = new StringBuilder(500);
sb.append('\n');
sb.append(">> ").append(getName()).append(": 0 ns").append('\n');
appendChildren(sb, " ");
sb.append(">> ").append(getName()).append(": +").append(endTime - myStartTime).append(" ns");
LogUtils.debug(this, sb.toString());
}
private void appendChildren(StringBuilder sb, String prefix) {
if (myChildren == null)
return;
long prevTime = myStartTime;
for (final TimedTask c : myChildren) {
sb.append(prefix).append(">> ").append(c.getName()).append(": +").append(c.myStartTime - myStartTime)
.append('/').append(c.myStartTime - prevTime).append(" ns\n");
prevTime = c.myStartTime;
c.appendChildren(sb, prefix + " ");
}
}
/**
* Simple Null implementation used when timed tasks are disabled.
*/
public static final ITimedTask NULL_TASK = new ITimedTask() {
@Override
public ITimedTask subTask(Object... name) {
return this;
}
@Override
public void end() {
}
};
}