package org.gridkit.jvmtool.util;
import java.util.Arrays;
/**
* Helper class for dumping trees. Used for diagnostic
* @author Alexey Ragozin (alexey.ragozin@gmail.com)
*/
public class TextTree {
public static TextTree t(String text, TextTree... children) {
return new TextTree(text, children);
}
private String text;
private TextTree[] children;
public TextTree(String text, TextTree... children) {
this.text = text;
this.children = children;
}
public String printAsTree() {
StringBuilder sb = new StringBuilder();
printTreeNode(sb, "", this);
return sb.toString();
}
private static void printTreeNode(StringBuilder sb, String prefix, TextTree node) {
String t = String.valueOf(node.text);
sb.append(t);
if (node.children.length == 0) {
sb.append('\n');
}
else {
String npref = prefix + blank(t.length()) + "| ";
String cpref = prefix + blank(t.length());
if (node.children.length == 1) {
sb.append("--");
npref = cpref + " ";
}
else {
sb.append("+-");
}
printTreeNode(sb, npref , node.children[0]);
for(int i = 1; i < node.children.length; ++i) {
sb.append(cpref);
if (i < node.children.length - 1) {
sb.append("+-");
printTreeNode(sb, npref , node.children[i]);
}
else {
sb.append("\\-");
printTreeNode(sb, cpref + " " , node.children[i]);
}
}
}
}
private static String blank(int n) {
char[] ch = new char[n];
Arrays.fill(ch, ' ');
return new String(ch);
}
@Override
public String toString() {
return text + (children.length == 0 ? "" : Arrays.toString(children));
}
}