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