• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2010 Google Inc.
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  * http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 package com.google.doclava;
18 
19 import com.google.clearsilver.jsilver.data.Data;
20 
21 import java.util.HashMap;
22 import java.util.TreeSet;
23 import java.util.Set;
24 
25 public class Hierarchy {
makeHierarchy(Data hdf, ClassInfo[] classes)26   public static void makeHierarchy(Data hdf, ClassInfo[] classes) {
27     HashMap<String, TreeSet<String>> nodes = new HashMap<String, TreeSet<String>>();
28 
29     for (ClassInfo cl : classes) {
30       String name = cl.qualifiedName();
31 
32       TreeSet<String> me = nodes.get(name);
33       if (me == null) {
34         me = new TreeSet<String>();
35         nodes.put(name, me);
36       }
37 
38       ClassInfo superclass = cl.superclass();
39       String sname = superclass != null ? superclass.qualifiedName() : null;
40       if (sname != null) {
41         TreeSet<String> s = nodes.get(sname);
42         if (s == null) {
43           s = new TreeSet<String>();
44           nodes.put(sname, s);
45         }
46         s.add(name);
47       }
48     }
49 
50     /*
51      * Set<String> keys = nodes.keySet(); for (String n: keys) { System.out.println("class: " + n);
52      *
53      * TreeSet<String> values = nodes.get(n); for (String v: values) {
54      * System.out.println("       - " + v); } }
55      */
56 
57     int depth = depth(nodes, "java.lang.Object");
58 
59     hdf.setValue("classes.0", "");
60     hdf.setValue("colspan", "" + depth);
61 
62     recurse(nodes, "java.lang.Object", hdf.getChild("classes.0"), depth, depth);
63 
64     if (false) {
65       Set<String> keys = nodes.keySet();
66       if (keys.size() > 0) {
67         System.err.println("The following classes are hidden but"
68             + " are superclasses of not-hidden classes");
69         for (String n : keys) {
70           System.err.println("  " + n);
71         }
72       }
73     }
74   }
75 
depth(HashMap<String, TreeSet<String>> nodes, String name)76   private static int depth(HashMap<String, TreeSet<String>> nodes, String name) {
77     int d = 0;
78     TreeSet<String> derived = nodes.get(name);
79     if (derived != null && derived.size() > 0) {
80       for (String s : derived) {
81         int n = depth(nodes, s);
82         if (n > d) {
83           d = n;
84         }
85       }
86     }
87     return d + 1;
88   }
89 
exists(ClassInfo cl)90   private static boolean exists(ClassInfo cl) {
91     return cl != null && !cl.isHiddenOrRemoved() && cl.isIncluded();
92   }
93 
recurse(HashMap<String, TreeSet<String>> nodes, String name, Data hdf, int totalDepth, int remainingDepth)94   private static void recurse(HashMap<String, TreeSet<String>> nodes, String name, Data hdf,
95       int totalDepth, int remainingDepth) {
96     int i;
97 
98     hdf.setValue("indent", "" + (totalDepth - remainingDepth - 1));
99     hdf.setValue("colspan", "" + remainingDepth);
100 
101     ClassInfo cl = Converter.obtainClass(name);
102 
103     hdf.setValue("class.label", cl.name());
104     hdf.setValue("class.qualified", cl.qualifiedName());
105     if (cl.checkLevel()) {
106       hdf.setValue("class.link", cl.htmlPage());
107     }
108 
109     if (exists(cl)) {
110       hdf.setValue("exists", "1");
111     }
112 
113     i = 0;
114     for (ClassInfo iface : cl.interfaces()) {
115       hdf.setValue("interfaces." + i + ".class.label", iface.name());
116       hdf.setValue("interfaces." + i + ".class.qualified", iface.qualifiedName());
117       if (iface.checkLevel()) {
118         hdf.setValue("interfaces." + i + ".class.link", iface.htmlPage());
119       }
120       if (exists(cl)) {
121         hdf.setValue("interfaces." + i + ".exists", "1");
122       }
123       i++;
124     }
125 
126     TreeSet<String> derived = nodes.get(name);
127     if (derived != null && derived.size() > 0) {
128       hdf.setValue("derived", "");
129       Data children = hdf.getChild("derived");
130       i = 0;
131       remainingDepth--;
132       for (String s : derived) {
133         String index = "" + i;
134         children.setValue(index, "");
135         recurse(nodes, s, children.getChild(index), totalDepth, remainingDepth);
136         i++;
137       }
138     }
139 
140     nodes.remove(name);
141   }
142 }
143