added PrintableTree
[sbp.git] / src / edu / berkeley / sbp / util / PrintableTree.java
1 package edu.berkeley.sbp;
2 import edu.berkeley.sbp.*;
3 import edu.berkeley.sbp.*;
4 import edu.berkeley.sbp.util.*;
5 import java.io.*;
6 import java.util.*;
7 import java.lang.reflect.*;
8
9 public abstract class PrintableTree<T extends PrintableTree> implements Iterable<T> {
10
11     protected abstract String headToString();
12     protected abstract String headToJava();    
13
14     public String toString() {
15         StringBuffer ret = new StringBuffer();
16         for(T t : this) {
17             String q = t==null ? "null" : t.toString();
18             if (q.length() > 0) { ret.append(q); ret.append(" "); }
19         }
20         String tail = ret.toString().trim();
21         String head = headToString();
22         String h = (head!=null && !head.toString().equals("")) ? (tail.length() > 0 ? head+":" : head+"") : "";
23         if (tail.length() > 0) tail = "{" + tail + "}";
24         return h + tail;
25     }
26
27     /** append Java code to <tt>sb</tt> which evaluates to this instance */
28     public void toJava(StringBuffer sb) {
29         sb.append("new "+this.getClass().getName()+"(null, ");
30         String head = headToJava();
31         sb.append(head==null ? "null" : "\"" + head + "\"");
32         sb.append(", new "+this.getClass().getName()+"[] { ");
33         boolean first = true;
34         for(T t : this) {
35             if (!first) sb.append(",\n        ");
36             if (t==null)   sb.append("null");
37             else           t.toJava(sb);
38             first = false;
39         }
40         sb.append("})");
41     }
42
43 }