|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
*/ |
|
|
|
|
|
/* |
|
* The Original Code is HAT. The Initial Developer of the |
|
* Original Code is Bill Foote, with contributions from others |
|
* at JavaSoft/Sun. |
|
*/ |
|
|
|
package com.sun.tools.hat.internal.server; |
|
|
|
import com.sun.tools.hat.internal.model.*; |
|
import java.util.*; |
|
|
|
|
|
|
|
|
|
*/ |
|
public class RefsByTypeQuery extends QueryHandler { |
|
public void run() { |
|
JavaClass clazz = snapshot.findClass(query); |
|
if (clazz == null) { |
|
error("class not found: " + query); |
|
} else { |
|
Map<JavaClass, Long> referrersStat = new HashMap<JavaClass, Long>(); |
|
final Map<JavaClass, Long> refereesStat = new HashMap<JavaClass, Long>(); |
|
Enumeration instances = clazz.getInstances(false); |
|
while (instances.hasMoreElements()) { |
|
JavaHeapObject instance = (JavaHeapObject) instances.nextElement(); |
|
if (instance.getId() == -1) { |
|
continue; |
|
} |
|
Enumeration e = instance.getReferers(); |
|
while (e.hasMoreElements()) { |
|
JavaHeapObject ref = (JavaHeapObject) e.nextElement(); |
|
JavaClass cl = ref.getClazz(); |
|
if (cl == null) { |
|
System.out.println("null class for " + ref); |
|
continue; |
|
} |
|
Long count = referrersStat.get(cl); |
|
if (count == null) { |
|
count = new Long(1); |
|
} else { |
|
count = new Long(count.longValue() + 1); |
|
} |
|
referrersStat.put(cl, count); |
|
} |
|
instance.visitReferencedObjects( |
|
new AbstractJavaHeapObjectVisitor() { |
|
public void visit(JavaHeapObject obj) { |
|
JavaClass cl = obj.getClazz(); |
|
Long count = refereesStat.get(cl); |
|
if (count == null) { |
|
count = new Long(1); |
|
} else { |
|
count = new Long(count.longValue() + 1); |
|
} |
|
refereesStat.put(cl, count); |
|
} |
|
} |
|
); |
|
} // for each instance |
|
|
|
startHtml("References by Type"); |
|
out.println("<p align='center'>"); |
|
printClass(clazz); |
|
if (clazz.getId() != -1) { |
|
println("[" + clazz.getIdString() + "]"); |
|
} |
|
out.println("</p>"); |
|
|
|
if (referrersStat.size() != 0) { |
|
out.println("<h3 align='center'>Referrers by Type</h3>"); |
|
print(referrersStat); |
|
} |
|
|
|
if (refereesStat.size() != 0) { |
|
out.println("<h3 align='center'>Referees by Type</h3>"); |
|
print(refereesStat); |
|
} |
|
|
|
endHtml(); |
|
} // clazz != null |
|
} // run |
|
|
|
private void print(final Map<JavaClass, Long> map) { |
|
out.println("<table border='1' align='center'>"); |
|
Set<JavaClass> keys = map.keySet(); |
|
JavaClass[] classes = new JavaClass[keys.size()]; |
|
keys.toArray(classes); |
|
Arrays.sort(classes, new Comparator<JavaClass>() { |
|
public int compare(JavaClass first, JavaClass second) { |
|
Long count1 = map.get(first); |
|
Long count2 = map.get(second); |
|
return count2.compareTo(count1); |
|
} |
|
}); |
|
|
|
out.println("<tr><th>Class</th><th>Count</th></tr>"); |
|
for (int i = 0; i < classes.length; i++) { |
|
JavaClass clazz = classes[i]; |
|
out.println("<tr><td>"); |
|
out.print("<a href='/refsByType/"); |
|
print(clazz.getIdString()); |
|
out.print("'>"); |
|
print(clazz.getName()); |
|
out.println("</a>"); |
|
out.println("</td><td>"); |
|
out.println(map.get(clazz)); |
|
out.println("</td></tr>"); |
|
} |
|
out.println("</table>"); |
|
} |
|
} |