X-Git-Url: http://www2.svjatoslav.eu/gitweb/?a=blobdiff_plain;f=src%2Fmain%2Fjava%2Feu%2Fsvjatoslav%2Finspector%2Fjava%2Fstructure%2FClassDescriptor.java;h=e1e45af91d0f2fc65d70180a417fd49f981d8f52;hb=ff4200b065c2eb7c8448fa060e7610ab57f6aec1;hp=c8a2773880e14d3ed3c28cb96836b9d586fb3d84;hpb=d717e90f4c46e26f9f54ba5638aade6688527bf4;p=javainspect.git diff --git a/src/main/java/eu/svjatoslav/inspector/java/structure/ClassDescriptor.java b/src/main/java/eu/svjatoslav/inspector/java/structure/ClassDescriptor.java index c8a2773..e1e45af 100644 --- a/src/main/java/eu/svjatoslav/inspector/java/structure/ClassDescriptor.java +++ b/src/main/java/eu/svjatoslav/inspector/java/structure/ClassDescriptor.java @@ -12,9 +12,11 @@ package eu.svjatoslav.inspector.java.structure; 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 @@ -25,9 +27,9 @@ public class ClassDescriptor implements GraphElement { public final String fullyQualifiedName; - Map nameToFieldMap = new HashMap(); + Map nameToFieldMap = new TreeMap(); - public List methods = new ArrayList(); + public SortedSet methods = new TreeSet(); /** * Incoming arrows will have this color. @@ -44,7 +46,9 @@ public class ClassDescriptor implements GraphElement { boolean isArray; - private final ClassGraph dump; + private boolean isShown = true; + + private final ClassGraph classGraph; List interfaces = new ArrayList(); @@ -53,10 +57,17 @@ public class ClassDescriptor implements GraphElement { /** * Amount of field and method references pointing to this class. */ - private int referenceCount = 0; + private int referencesCount = 0; + + // for interface, counts amount of found implementations + private int implementationsCount = 0; - public ClassDescriptor(final Class clazz, final ClassGraph dump) { - this.dump = dump; + // counts amount of times this class is extended + private int extensionsCount = 0; + + public ClassDescriptor(final Class clazz, + final ClassGraph dump) { + classGraph = dump; fullyQualifiedName = clazz.getName(); dump.nameToClassMap.put(fullyQualifiedName, this); @@ -82,14 +93,21 @@ public class ClassDescriptor implements GraphElement { 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.registerImplementation(); + interfaces.add(classDescriptor); + } superClass = dump.addClass(clazz.getSuperclass()); + if (superClass != null) + superClass.registerExtension(); + } public boolean areReferencesShown() { - return referenceCount <= MAX_REFERECNES_COUNT; + return referencesCount <= MAX_REFERECNES_COUNT; } public void enlistFieldReferences(final StringBuffer result) { @@ -185,8 +203,15 @@ public class ClassDescriptor implements GraphElement { result.append(" // class descriptor header\n"); result.append(" " + "" + getPackageName() - + "
" + "" - + getClassName(false) + "" + "\n"); + + "
"); + + final String parentClassesName = getParentClassesName(); + if (parentClassesName.length() > 0) + result.append("" + parentClassesName + + "
\n"); + + result.append("" + getClassName(false) + + "" + "\n"); } public List getAllFields() { @@ -219,10 +244,12 @@ public class ClassDescriptor implements GraphElement { } public String getClassName(final boolean differentiateArray) { + // this is needed for nested classes + final String actualClassName = fullyQualifiedName.replace('$', '.'); - final int i = fullyQualifiedName.lastIndexOf('.'); + final int i = actualClassName.lastIndexOf('.'); - String result = fullyQualifiedName.substring(i + 1); + String result = actualClassName.substring(i + 1); if (isArray) result = result.substring(0, result.length() - 1); @@ -231,6 +258,8 @@ public class ClassDescriptor implements GraphElement { if (isArray) result += " []"; + // this is needed for nested classes + // result = result.replace('$', '.'); return result; } @@ -279,11 +308,24 @@ public class ClassDescriptor implements GraphElement { return null; } + /** + * Returns field with given name (case is ignored). Or null if + * field is not found. + */ + public FieldDescriptor getFieldIgnoreCase(final String fieldToSearch) { + + for (final String fieldName : nameToFieldMap.keySet()) + if (fieldToSearch.equalsIgnoreCase(fieldName)) + return nameToFieldMap.get(fieldName); + + return null; + } + @Override public String getGraphId() { final String result = "class_" + fullyQualifiedName.replace('.', '_').replace(";", "") - .replace("[L", ""); + .replace("[L", "").replace('$', '_'); return result; } @@ -294,14 +336,28 @@ public class ClassDescriptor implements GraphElement { 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 getReadableName() { @@ -318,6 +374,27 @@ public class ClassDescriptor implements GraphElement { // return fullyQualifiedName; // } + public String getPackageName() { + + final int i = fullyQualifiedName.lastIndexOf('.'); + + if (i == -1) + return ""; + + return fullyQualifiedName.substring(0, i).replace("[L", ""); + } + + 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(); @@ -325,13 +402,45 @@ public class ClassDescriptor implements GraphElement { return superClassColor; } + /** + * Checks if class has field with given name (case is ignored). Returns + * true if such field is found. + */ + public boolean hasFieldIgnoreCase(final String fieldToSearch) { + + for (final String fieldName : nameToFieldMap.keySet()) + if (fieldToSearch.equalsIgnoreCase(fieldName)) + return true; + + return false; + } + + public void hide() { + isShown = false; + } + + public void hideClassIfNoReferences() { + if (!isVisible()) + return; + + final int totalReferencesCount = getOutgoingReferencesCount() + + referencesCount + extensionsCount + implementationsCount; + + 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); } } @@ -340,7 +449,7 @@ public class ClassDescriptor implements GraphElement { final Method[] methods = clazz.getMethods(); for (final Method method : methods) - new MethodDescriptor(method, this, dump); + new MethodDescriptor(method, this, classGraph); } @@ -353,11 +462,25 @@ public class ClassDescriptor implements GraphElement { if (Utils.isSystemPackage(fullyQualifiedName)) return false; - return true; + if (!classGraph.getFilter().isClassShown(fullyQualifiedName)) + return false; + + return isShown; + } + + /** + * Register event when another class is extending this one. + */ + public void registerExtension() { + extensionsCount++; + } + + public void registerImplementation() { + implementationsCount++; } public void registerReference() { - referenceCount++; + referencesCount++; } public void setDistinctiveColor(final String distinctiveColor) {