import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.util.ArrayList;
-import java.util.HashMap;
import java.util.List;
import java.util.Map;
+import java.util.SortedSet;
+import java.util.TreeMap;
+import java.util.TreeSet;
/**
* Describes single class instance
public final String fullyQualifiedName;
- Map<String, FieldDescriptor> nameToFieldMap = new HashMap<String, FieldDescriptor>();
+ Map<String, FieldDescriptor> nameToFieldMap = new TreeMap<String, FieldDescriptor>();
- public List<MethodDescriptor> methods = new ArrayList<MethodDescriptor>();
+ public SortedSet<MethodDescriptor> methods = new TreeSet<MethodDescriptor>();
/**
* Incoming arrows will have this color.
private boolean isShown = true;
- private final ClassGraph dump;
+ private final ClassGraph classGraph;
List<ClassDescriptor> interfaces = new ArrayList<ClassDescriptor>();
/**
* Amount of field and method references pointing to this class.
*/
- private int referenceCount = 0;
+ private int incomingReferencesCount = 0;
+
+ private int extensionsCount = 0;
public ClassDescriptor(final Class<? extends Object> clazz,
final ClassGraph dump) {
- this.dump = dump;
+ classGraph = dump;
fullyQualifiedName = clazz.getName();
dump.nameToClassMap.put(fullyQualifiedName, this);
indexMethods(clazz);
- for (final Class interfaceClass : clazz.getInterfaces())
- interfaces.add(dump.addClass(interfaceClass));
+ for (final Class interfaceClass : clazz.getInterfaces()) {
+ final ClassDescriptor classDescriptor = dump
+ .addClass(interfaceClass);
+ classDescriptor.registerExtension();
+ interfaces.add(classDescriptor);
+ }
superClass = dump.addClass(clazz.getSuperclass());
+ if (superClass != null)
+ superClass.registerExtension();
+
}
public boolean areReferencesShown() {
- return referenceCount <= MAX_REFERECNES_COUNT;
+ return incomingReferencesCount <= MAX_REFERECNES_COUNT;
}
public void enlistFieldReferences(final StringBuffer result) {
return interfaceColor;
}
- public String getPackageName() {
+ private int getOutgoingReferencesCount() {
+ int result = 0;
- final int i = fullyQualifiedName.lastIndexOf('.');
+ // count method references
+ for (final MethodDescriptor methodDescriptor : methods)
+ result += methodDescriptor.getOutsideVisibleReferencesCount();
- if (i == -1)
- return "";
+ // count field references
+ for (final FieldDescriptor fieldDescriptor : nameToFieldMap.values())
+ result += fieldDescriptor.getOutsideVisibleReferencesCount();
- return fullyQualifiedName.substring(0, i).replace("[L", "");
+ // count implemented interfaces
+ for (final ClassDescriptor classDescriptor : interfaces)
+ if (classDescriptor.isVisible())
+ result++;
+
+ // count superclass
+ if (superClass != null)
+ if (superClass.isVisible())
+ result++;
+
+ return result;
}
- public String getParentClassesName() {
- int i = fullyQualifiedName.lastIndexOf('.');
- final String fullClassName = fullyQualifiedName.substring(i + 1);
+ public String getPackageName() {
+
+ final int i = fullyQualifiedName.lastIndexOf('.');
- i = fullClassName.lastIndexOf('$');
if (i == -1)
return "";
- final String parentClassesName = fullClassName.substring(0, i);
- return parentClassesName.replace('$', '.');
+
+ return fullyQualifiedName.substring(0, i).replace("[L", "");
}
// public String getReadableName() {
// return fullyQualifiedName;
// }
+ public String getParentClassesName() {
+ int i = fullyQualifiedName.lastIndexOf('.');
+ final String fullClassName = fullyQualifiedName.substring(i + 1);
+
+ i = fullClassName.lastIndexOf('$');
+ if (i == -1)
+ return "";
+ final String parentClassesName = fullClassName.substring(0, i);
+ return parentClassesName.replace('$', '.');
+ }
+
public String getSuperClassColor() {
if (superClassColor == null)
superClassColor = Utils.getNextLightColor();
isShown = false;
}
+ public void hideClassIfNoReferences() {
+ if (!isVisible())
+ return;
+
+ final int totalReferencesCount = getOutgoingReferencesCount()
+ + incomingReferencesCount + extensionsCount;
+
+ if (totalReferencesCount == 0) {
+ hide();
+ return;
+ }
+
+ return;
+ }
+
public void indexFields(final Field[] fields) {
for (final Field field : fields) {
if (nameToFieldMap.containsKey(field.getName()))
continue;
final FieldDescriptor fieldDescriptor = new FieldDescriptor(field,
- this, dump);
+ this, classGraph);
}
}
final Method[] methods = clazz.getMethods();
for (final Method method : methods)
- new MethodDescriptor(method, this, dump);
+ new MethodDescriptor(method, this, classGraph);
}
if (Utils.isSystemPackage(fullyQualifiedName))
return false;
+ if (!classGraph.getFilter().isClassShown(fullyQualifiedName))
+ return false;
+
return isShown;
}
+ /**
+ * Register event when another class is extending this one, or is
+ * implementing interface declared by this class.
+ */
+ public void registerExtension() {
+ extensionsCount++;
+ }
+
public void registerReference() {
- referenceCount++;
+ incomingReferencesCount++;
}
public void setDistinctiveColor(final String distinctiveColor) {