1 // Copyright 2006 all rights reserved; see LICENSE file for BSD-style license
3 package edu.berkeley.sbp.util;
4 import edu.berkeley.sbp.*;
5 import edu.berkeley.sbp.util.*;
8 import java.lang.reflect.*;
10 public abstract class PrintableTree<T extends PrintableTree> implements Iterable<T>, ToJava /*, ToHTML*/, GraphViz.ToGraphViz {
12 protected abstract Object head();
13 protected abstract String headToString();
14 protected abstract String headToJava();
15 protected abstract String left();
16 protected abstract String right();
17 protected abstract boolean ignoreSingleton();
19 private static final int MAXCHARS=40;
21 private boolean basic() { return toString().length() < MAXCHARS; }
22 public String toPrettyString() { return toPrettyString("\n"); }
23 public StringBuffer toPrettyString(StringBuffer sb) { sb.append(toPrettyString()); return sb; }
24 private String toPrettyString(String nl) {
25 String str = toString();
26 if (str.length() < MAXCHARS) return str;
27 String head = headToString();
28 StringBuffer ret = new StringBuffer();
30 Iterator<T> iterator = iterator();
31 if (!iterator.hasNext()) return head==null ? (left()+right()) : head;
32 PrintableTree t0 = iterator.next();
33 if (!iterator.hasNext() && ignoreSingleton())
34 return t0.toPrettyString(nl);
36 ret.append(head==null?(left()+" "):(head+":"+nl));
40 String s = t.basic() ? t.toString() : t.toPrettyString(nl+" ");
42 if (!t.basic()) ret.append(nl);
43 if (s.length()+len>MAXCHARS) { ret.append(nl); len = 0; }
44 else { ret.append(" "); len++; }
50 if (head==null) ret.append(" "+right());
51 return ret.toString();
54 private String cached = null;
55 public String toString() {
56 if (cached!=null) return cached;
57 StringBuffer ret = new StringBuffer();
61 String q = t==null ? "null" : t.toString();
62 if (q.length() > 0) { ret.append(q); ret.append(" "); }
64 if (count==1 && ignoreSingleton()) { return cached = ret.toString().trim(); }
65 String tail = ret.toString().trim();
66 String head = headToString();
67 String h = (head!=null && !head.toString().equals("")) ? (tail.length() > 0 ? head+":" : head+"") : "";
68 if (tail.length() > 0) tail = left() + tail + right();
69 return cached = h + tail;
72 /** append Java code to <tt>sb</tt> which evaluates to this instance */
73 public void toJava(StringBuffer sb) {
74 sb.append("new "+this.getClass().getName()+"(null, ");
75 String head = headToJava();
77 sb.append(", new "+this.getClass().getName()+"[] { ");
80 if (!first) sb.append(",\n ");
81 if (t==null) sb.append("null");
88 // this is here to keep it out of the javadoc for Tree<T>
90 public GraphViz.Node toGraphViz(GraphViz gv) {
91 if (gv.hasNode(this)) return gv.createNode(this);
92 GraphViz.Node n = gv.createNode(this);
93 n.label = head()==null ? "" : head().toString();
94 for(T t : this) n.edge(t, null);
97 public boolean isTransparent() { return false; }
98 public boolean isHidden() { return false; }