/**
* Copyright 2014 Alexey Ragozin
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.gridkit.util.formating;
import java.io.IOException;
import java.io.StringWriter;
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() {
try {
StringWriter sw = new StringWriter();
printTreeNode(sw, "", this, false);
return sw.toString();
} catch (IOException e) {
throw new RuntimeException(e);
}
}
public void printAsTree(Appendable stream) throws IOException {
printTreeNode(stream, "", this, false);
}
public void printAsTree(Appendable stream, boolean compact) throws IOException {
printTreeNode(stream, "", this, compact);
}
private static void printTreeNode(Appendable sb, String prefix, TextTree node, boolean compact) throws IOException {
String t = String.valueOf(node.text);
sb.append(t);
if (node.children.length == 0) {
sb.append('\n');
}
else {
String npref = prefix + blank(t.length()) + (!compact ? "| ": "|");
String cpref = prefix + blank(t.length());
if (node.children.length == 1) {
sb.append(!compact ? "--" : "-");
npref = cpref + (!compact ? " " : " ");
}
else {
sb.append(!compact ? "+-" : "+");
}
printTreeNode(sb, npref , node.children[0], compact);
for(int i = 1; i < node.children.length; ++i) {
sb.append(cpref);
if (i < node.children.length - 1) {
sb.append(!compact ? "+-" : "+");
printTreeNode(sb, npref , node.children[i], compact);
}
else {
sb.append(!compact ? "\\-" : "\\");
printTreeNode(sb, cpref + (!compact ? " " : " ") , node.children[i], compact);
}
}
}
}
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));
}
}