1 package org.kuali.common.util.tree;
2
3 import static com.google.common.collect.Lists.newArrayList;
4
5 import java.util.List;
6
7 import org.apache.commons.lang3.StringUtils;
8
9 import com.google.common.base.Function;
10 import com.google.common.collect.ImmutableList;
11 import com.google.common.collect.Lists;
12
13 public class Trees {
14
15 public static <T> List<Node<T>> getLeaves(List<Node<T>> nodes) {
16 List<Node<T>> leaves = newArrayList();
17 for (Node<T> node : nodes) {
18 leaves.addAll(getLeaves(node));
19 }
20 return leaves;
21 }
22
23 public static <T> List<Node<T>> getLeaves(Node<T> root) {
24 List<Node<T>> leaves = newArrayList();
25 List<Node<T>> nodes = breadthFirst(root);
26 for (Node<T> node : nodes) {
27 if (node.isLeaf()) {
28 leaves.add(node);
29 }
30 }
31 return leaves;
32 }
33
34 public static <T> List<T> breadthFirstElements(Node<T> node) {
35 return Lists.transform(breadthFirst(node), new NodeElementFunction<T>());
36 }
37
38 public static <T> List<Node<T>> breadthFirst(List<Node<T>> nodes) {
39 List<Node<T>> list = newArrayList();
40 for (Node<T> node : nodes) {
41 list.addAll(breadthFirst(node));
42 }
43 return list;
44 }
45
46 public static <T> List<Node<T>> breadthFirst(Node<T> node) {
47 NodeTraverser<T> nt = NodeTraverser.create();
48 Iterable<Node<T>> itr = nt.breadthFirstTraversal(node);
49 return newArrayList(itr);
50 }
51
52 public static <T> List<Node<T>> postOrder(Node<T> node) {
53 NodeTraverser<T> nt = NodeTraverser.create();
54 Iterable<Node<T>> itr = nt.postOrderTraversal(node);
55 return newArrayList(itr);
56 }
57
58 public static <T> List<Node<T>> preOrder(Node<T> node) {
59 NodeTraverser<T> nt = NodeTraverser.create();
60 Iterable<Node<T>> itr = nt.preOrderTraversal(node);
61 return newArrayList(itr);
62 }
63
64 public static <T> String html(String title, Node<T> node) {
65 Function<Node<T>, String> converter = NodeStringFunction.create();
66 return html(title, ImmutableList.of(node), converter);
67 }
68
69 public static <T> String html(String title, Node<T> node, Function<Node<T>, String> converter) {
70 return html(title, ImmutableList.of(node), converter);
71 }
72
73 public static <T> String html(String title, List<Node<T>> nodes) {
74 Function<Node<T>, String> converter = NodeStringFunction.create();
75 return html(title, nodes, converter);
76 }
77
78 public static <T> String html(String title, List<Node<T>> nodes, Function<Node<T>, String> converter) {
79 StringBuilder sb = new StringBuilder();
80 sb.append("<table border=\"1\">\n");
81 sb.append(" <th>" + title + "</th>\n");
82 sb.append(" <tr>\n");
83 sb.append(" <td>\n");
84 for (Node<T> node : nodes) {
85 sb.append(html(node, 3, converter));
86 }
87 sb.append(" </td>\n");
88 sb.append(" </tr>\n");
89 sb.append("</table>\n");
90 return sb.toString();
91 }
92
93 public static <T> String html(Node<T> node) {
94 Function<Node<T>, String> converter = NodeStringFunction.create();
95 return html(node, 0, converter);
96 }
97
98 public static <T> String html(Node<T> node, Function<Node<T>, String> converter) {
99 return html(node, 0, converter);
100 }
101
102 public static <T> String html(Node<T> node, int indent, Function<Node<T>, String> converter) {
103 StringBuilder sb = new StringBuilder();
104 String prefix = StringUtils.repeat(" ", indent);
105 sb.append(prefix + "<table border=\"1\">\n");
106 sb.append(prefix + " <tr>\n");
107 sb.append(prefix + " <td>" + converter.apply(node) + "</td>\n");
108 List<Node<T>> children = node.getChildren();
109 if (!children.isEmpty()) {
110 sb.append(prefix + " <td>\n");
111 for (Node<T> child : children) {
112 sb.append(html(child, indent + 3, converter));
113 }
114 sb.append(prefix + " </td>\n");
115 }
116 sb.append(prefix + " </tr>\n");
117 sb.append(prefix + "</table>\n");
118 return sb.toString();
119 }
120
121 }