1920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson/*
2920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson * Copyright (C) 2010 Google Inc.
3920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson *
4920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson * Licensed under the Apache License, Version 2.0 (the "License");
5920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson * you may not use this file except in compliance with the License.
6920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson * You may obtain a copy of the License at
7920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson *
8920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson * http://www.apache.org/licenses/LICENSE-2.0
9920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson *
10920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson * Unless required by applicable law or agreed to in writing, software
11920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson * distributed under the License is distributed on an "AS IS" BASIS,
12920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson * See the License for the specific language governing permissions and
14920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson * limitations under the License.
15920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson */
16920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson
17920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodsonpackage com.google.doclava;
18920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson
19920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodsonimport com.google.clearsilver.jsilver.data.Data;
20920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson
21920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodsonimport java.util.HashMap;
22920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodsonimport java.util.TreeSet;
23920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodsonimport java.util.Set;
24920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson
25920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodsonpublic class Hierarchy {
26920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson  public static void makeHierarchy(Data hdf, ClassInfo[] classes) {
27920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    HashMap<String, TreeSet<String>> nodes = new HashMap<String, TreeSet<String>>();
28920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson
29920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    for (ClassInfo cl : classes) {
30920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      String name = cl.qualifiedName();
31920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson
32920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      TreeSet<String> me = nodes.get(name);
33920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      if (me == null) {
34920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson        me = new TreeSet<String>();
35920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson        nodes.put(name, me);
36920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      }
37920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson
38920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      ClassInfo superclass = cl.superclass();
39920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      String sname = superclass != null ? superclass.qualifiedName() : null;
40920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      if (sname != null) {
41920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson        TreeSet<String> s = nodes.get(sname);
42920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson        if (s == null) {
43920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson          s = new TreeSet<String>();
44920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson          nodes.put(sname, s);
45920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson        }
46920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson        s.add(name);
47920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      }
48920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    }
49920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson
50920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    /*
51920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson     * Set<String> keys = nodes.keySet(); for (String n: keys) { System.out.println("class: " + n);
52920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson     *
53920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson     * TreeSet<String> values = nodes.get(n); for (String v: values) {
54920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson     * System.out.println("       - " + v); } }
55920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson     */
56920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson
57920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    int depth = depth(nodes, "java.lang.Object");
58920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson
59920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    hdf.setValue("classes.0", "");
60920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    hdf.setValue("colspan", "" + depth);
61920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson
62920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    recurse(nodes, "java.lang.Object", hdf.getChild("classes.0"), depth, depth);
63920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson
64920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    if (false) {
65920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      Set<String> keys = nodes.keySet();
66920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      if (keys.size() > 0) {
67920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson        System.err.println("The following classes are hidden but"
68920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson            + " are superclasses of not-hidden classes");
69920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson        for (String n : keys) {
70920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson          System.err.println("  " + n);
71920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson        }
72920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      }
73920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    }
74920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson  }
75920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson
76920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson  private static int depth(HashMap<String, TreeSet<String>> nodes, String name) {
77920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    int d = 0;
78920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    TreeSet<String> derived = nodes.get(name);
79920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    if (derived != null && derived.size() > 0) {
80920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      for (String s : derived) {
81920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson        int n = depth(nodes, s);
82920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson        if (n > d) {
83920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson          d = n;
84920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson        }
85920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      }
86920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    }
87920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    return d + 1;
88920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson  }
89920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson
90920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson  private static boolean exists(ClassInfo cl) {
915118ffe3bf77ec4efa070f36a7a62fd5d1bf16bfHui Shu    return cl != null && !cl.isHiddenOrRemoved() && cl.isIncluded();
92920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson  }
93920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson
94920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson  private static void recurse(HashMap<String, TreeSet<String>> nodes, String name, Data hdf,
95920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      int totalDepth, int remainingDepth) {
96920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    int i;
97920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson
98920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    hdf.setValue("indent", "" + (totalDepth - remainingDepth - 1));
99920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    hdf.setValue("colspan", "" + remainingDepth);
100920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson
101920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    ClassInfo cl = Converter.obtainClass(name);
102920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson
103920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    hdf.setValue("class.label", cl.name());
104920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    hdf.setValue("class.qualified", cl.qualifiedName());
105920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    if (cl.checkLevel()) {
106920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      hdf.setValue("class.link", cl.htmlPage());
107920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    }
108920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson
109920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    if (exists(cl)) {
110920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      hdf.setValue("exists", "1");
111920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    }
112920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson
113920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    i = 0;
114920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    for (ClassInfo iface : cl.interfaces()) {
115920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      hdf.setValue("interfaces." + i + ".class.label", iface.name());
116920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      hdf.setValue("interfaces." + i + ".class.qualified", iface.qualifiedName());
117920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      if (iface.checkLevel()) {
118920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson        hdf.setValue("interfaces." + i + ".class.link", iface.htmlPage());
119920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      }
120920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      if (exists(cl)) {
121920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson        hdf.setValue("interfaces." + i + ".exists", "1");
122920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      }
123920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      i++;
124920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    }
125920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson
126920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    TreeSet<String> derived = nodes.get(name);
127920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    if (derived != null && derived.size() > 0) {
128920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      hdf.setValue("derived", "");
129920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      Data children = hdf.getChild("derived");
130920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      i = 0;
131920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      remainingDepth--;
132920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      for (String s : derived) {
133920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson        String index = "" + i;
134920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson        children.setValue(index, "");
135920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson        recurse(nodes, s, children.getChild(index), totalDepth, remainingDepth);
136920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson        i++;
137920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      }
138920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    }
139920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson
140920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    nodes.remove(name);
141920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson  }
142920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson}
143