package org.sef4j.callstack.stats.helpers;
import java.io.ByteArrayOutputStream;
import java.io.PrintStream;
import java.util.function.Function;
import org.sef4j.callstack.stats.ThreadTimeUtils;
import org.sef4j.callstack.stats.dto.PendingPerfCountDTO;
import org.sef4j.core.helpers.proptree.dto.PropTreeNodeDTO;
public abstract class PropTreeNodeDTOPrinter extends PropTreeNodeDTOVisitor {
protected PrintStream out;
public PropTreeNodeDTOPrinter(PrintStream out) {
this.out = out;
}
@Override
public void onStartVisitNode(PropTreeNodeDTO node) {
printIndent();
out.println(node.getName());
}
protected void printIndent() {
for (int i = 0; i < currDepth; i++) {
out.print(' ');
}
}
// ------------------------------------------------------------------------
public static class SinglePropPropTreeNodeDTOPrinter<T> extends PropTreeNodeDTOPrinter {
private String propName;
private Function<T, String> propToString;
public SinglePropPropTreeNodeDTOPrinter(PrintStream out, String propName, Function<T, String> propToString) {
super(out);
this.propName = propName;
this.propToString = propToString;
}
@SuppressWarnings("unchecked")
@Override
public void visitProp(PropTreeNodeDTO node, String key, Object value) {
if (! key.equals(propName)) return;
printIndent();
out.println(key + ":" + propToString.apply((T) value));
}
}
public static String recursiveDumpPendingCount(PropTreeNodeDTO res) {
ByteArrayOutputStream bout = new ByteArrayOutputStream();
PrintStream out = new PrintStream(bout);
final long timeNow = ThreadTimeUtils.getTime();
// jdk8... toStringUntilNow = x -> x.toStringUntil(timeNow)
Function<PendingPerfCountDTO, String> toStringUntilNow = new Function<PendingPerfCountDTO, String>() {
public String apply(PendingPerfCountDTO x) {
return x.toStringUntil(timeNow);
}
};
SinglePropPropTreeNodeDTOPrinter<PendingPerfCountDTO> printer =
new SinglePropPropTreeNodeDTOPrinter<PendingPerfCountDTO>(out,
"pending", toStringUntilNow);
printer.visitChild(res, -1);
out.flush();
return bout.toString();
}
}