package org.trianacode.http;
import org.thinginitself.streamable.Streamable;
import org.trianacode.taskgraph.tool.Toolbox;
import org.trianacode.taskgraph.tool.ToolboxTree;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
/**
* @author Andrew Harrison
* @version 1.0.0 Jul 20, 2010
*/
public class ToolboxesRenderer implements Renderer {
private List<Toolbox> toolboxes;
private String path;
public void init(List<Toolbox> toolboxes, String path) {
this.toolboxes = toolboxes;
this.path = path;
}
public Streamable render(String type, String mime) {
Map<String, Object> properties = new HashMap<String, Object>();
properties.put("path", path);
ToolboxTree tree = createToolboxTree(toolboxes);
String ss = treesToString(tree, new HtmlListSerializer());
properties.put("toolboxes", ss);
return Output.output(properties, type, mime);
}
protected ToolboxTree createToolboxTree(List<Toolbox> toolboxes) {
ToolboxTree tree = new ToolboxTree();
for (int i = 0; i < toolboxes.size(); i++) {
Toolbox toolbox = toolboxes.get(i);
tree.addToolbox(toolbox);
}
return tree;
}
protected String treesToString(ToolboxTree tree, TreeSerializer ser) {
Iterator<ToolboxTree.TreeNode> it = tree.iterator();
StringBuilder sb = new StringBuilder();
int depth = 0;
ToolboxTree.TreeNode last = null;
sb.append(ser.begin());
while (it.hasNext()) {
ToolboxTree.TreeNode node = it.next();
int newDepth = node.getDepth();
int diff = newDepth - depth;
sb.append(space(newDepth));
if (diff < 0) {
if (last != null && last.isLeaf()) {
sb.append(ser.endLeaf());
sb.append(space(newDepth));
}
for (int i = diff; i < -1; i++) {
sb.append(ser.endBranch(false));
sb.append(space(newDepth - i));
}
sb.append(ser.endBranch(newDepth == 1));
sb.append(space(newDepth));
} else if (diff == 0) {
if (last != null) {
if (!last.isLeaf()) {
sb.append(ser.endBranch(newDepth == 1));
} else {
sb.append(ser.endLeaf());
}
}
}
sb.append(space(newDepth));
if (last == null) {
sb.append(ser.startRoot(node));
} else {
sb.append(ser.startNode(node));
}
depth = newDepth;
last = node;
}
sb.append(ser.endLeaf());
for (int i = depth; i > 2; i--) {
sb.append(space(i));
sb.append(ser.endBranch(false));
}
sb.append(space(1));
sb.append(ser.endBranch(true));
sb.append(ser.endRoot());
sb.append(ser.end());
String ret = sb.toString();
return ret;
}
private String space(int depth) {
StringBuilder sb = new StringBuilder("\n");
for (int i = 0; i < depth; i++) {
sb.append("\t");
}
return sb.toString();
}
}