X-Git-Url: http://www2.svjatoslav.eu/gitweb/?a=blobdiff_plain;ds=sidebyside;f=src%2Fmain%2Fjava%2Feu%2Fsvjatoslav%2Finspector%2Fjava%2Fstructure%2FClassDescriptor.java;h=c5c6a783bafbdd2df08c61efd553ea7e6e87cb65;hb=cd718904f053ee6901e9b21d76a024ef646bb01c;hp=eae630bd28036b7a708c56eb723d6f7f24bc91b2;hpb=8285a2e198a01177b14e528f8e12de2f7d5273e9;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 old mode 100644 new mode 100755 index eae630b..c5c6a78 --- a/src/main/java/eu/svjatoslav/inspector/java/structure/ClassDescriptor.java +++ b/src/main/java/eu/svjatoslav/inspector/java/structure/ClassDescriptor.java @@ -1,10 +1,10 @@ /* * JavaInspect - Utility to visualize java software - * Copyright (C) 2013, Svjatoslav Agejenko, svjatoslav@svjatoslav.eu - * + * Copyright (C) 2013-2014, Svjatoslav Agejenko, svjatoslav@svjatoslav.eu + * * This program is free software; you can redistribute it and/or - * modify it under the terms of version 2 of the GNU General Public License - * as published by the Free Software Foundation. + * modify it under the terms of version 3 of the GNU Lesser General Public License + * or later as published by the Free Software Foundation. */ package eu.svjatoslav.inspector.java.structure; @@ -25,7 +25,7 @@ public class ClassDescriptor implements GraphElement { private static final int MAX_REFERECNES_COUNT = 10; - public final String fullyQualifiedName; + public final String classFullyQualifiedName; Map nameToFieldMap = new TreeMap(); @@ -57,22 +57,29 @@ public class ClassDescriptor implements GraphElement { /** * Amount of field and method references pointing to this class. */ - private int incomingReferencesCount = 0; + private int referencesCount = 0; + // for interface, counts amount of found implementations + private int implementationsCount = 0; + + // counts amount of times this class is extended private int extensionsCount = 0; + private ClassDescriptor arrayComponent; + public ClassDescriptor(final Class clazz, - final ClassGraph dump) { - classGraph = dump; + final ClassGraph classGraph) { + this.classGraph = classGraph; + + classFullyQualifiedName = clazz.getName(); - fullyQualifiedName = clazz.getName(); - dump.nameToClassMap.put(fullyQualifiedName, this); + classGraph.registerClass(classFullyQualifiedName, this); isArray = clazz.isArray(); if (isArray) { final Class componentType = clazz.getComponentType(); - dump.addClass(componentType); + arrayComponent = classGraph.addClass(componentType); } // System.out.println("class: " + fullyQualifiedName); @@ -90,20 +97,20 @@ public class ClassDescriptor implements GraphElement { indexMethods(clazz); for (final Class interfaceClass : clazz.getInterfaces()) { - final ClassDescriptor classDescriptor = dump + final ClassDescriptor classDescriptor = classGraph .addClass(interfaceClass); - classDescriptor.registerExtension(); + classDescriptor.registerImplementation(); interfaces.add(classDescriptor); } - superClass = dump.addClass(clazz.getSuperclass()); + superClass = classGraph.addClass(clazz.getSuperclass()); if (superClass != null) superClass.registerExtension(); } public boolean areReferencesShown() { - return incomingReferencesCount <= MAX_REFERECNES_COUNT; + return referencesCount <= MAX_REFERECNES_COUNT; } public void enlistFieldReferences(final StringBuffer result) { @@ -136,7 +143,7 @@ public class ClassDescriptor implements GraphElement { result.append("\n"); result.append(" // interfaces implemented by class: " - + fullyQualifiedName + "\n"); + + classFullyQualifiedName + "\n"); for (final ClassDescriptor interfaceDescriptor : interfaces) { if (!interfaceDescriptor.isVisible()) @@ -179,7 +186,8 @@ public class ClassDescriptor implements GraphElement { return; result.append("\n"); - result.append(" // super class for: " + fullyQualifiedName + "\n"); + result.append(" // super class for: " + classFullyQualifiedName + + "\n"); result.append(" " + superClass.getGraphId() + " -> " + getGraphId() + "[style=\"tapered\", color=\"" @@ -189,7 +197,7 @@ public class ClassDescriptor implements GraphElement { public void generateDotHeader(final StringBuffer result) { result.append("\n"); - result.append("// Class: " + fullyQualifiedName + "\n"); + result.append("// Class: " + classFullyQualifiedName + "\n"); result.append(" " + getGraphId() + "[label=<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('$', '_'); + + classFullyQualifiedName.replace('.', '_').replace(";", "") + .replace("[L", "").replace('$', '_'); return result; } @@ -343,16 +371,6 @@ public class ClassDescriptor implements GraphElement { return result; } - public String getPackageName() { - - final int i = fullyQualifiedName.lastIndexOf('.'); - - if (i == -1) - return ""; - - return fullyQualifiedName.substring(0, i).replace("[L", ""); - } - // public String getReadableName() { // // // do not print full class name for well known system classes @@ -367,9 +385,19 @@ public class ClassDescriptor implements GraphElement { // return fullyQualifiedName; // } + public String getPackageName() { + + final int i = classFullyQualifiedName.lastIndexOf('.'); + + if (i == -1) + return ""; + + return classFullyQualifiedName.substring(0, i).replace("[L", ""); + } + public String getParentClassesName() { - int i = fullyQualifiedName.lastIndexOf('.'); - final String fullClassName = fullyQualifiedName.substring(i + 1); + int i = classFullyQualifiedName.lastIndexOf('.'); + final String fullClassName = classFullyQualifiedName.substring(i + 1); i = fullClassName.lastIndexOf('$'); if (i == -1) @@ -385,6 +413,19 @@ 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; } @@ -394,7 +435,7 @@ public class ClassDescriptor implements GraphElement { return; final int totalReferencesCount = getOutgoingReferencesCount() - + incomingReferencesCount + extensionsCount; + + referencesCount + extensionsCount + implementationsCount; if (totalReferencesCount == 0) { hide(); @@ -426,28 +467,40 @@ public class ClassDescriptor implements GraphElement { @Override public boolean isVisible() { - if (Utils.isSystemDataType(fullyQualifiedName)) + if (Utils.isSystemDataType(classFullyQualifiedName)) return false; - if (Utils.isSystemPackage(fullyQualifiedName)) + if (Utils.isSystemPackage(classFullyQualifiedName)) return false; - if (!classGraph.getFilter().isClassShown(fullyQualifiedName)) + if (!classGraph.getFilter().isClassShown(classFullyQualifiedName)) return false; + if (isArray) + if (arrayComponent != null) + if (Utils + .isSystemDataType(arrayComponent.classFullyQualifiedName)) + // Do not show references to primitive data types in arrays. + // That is: there is no point to show reference to byte when + // we have class with byte array field. + return false; + return isShown; } /** - * Register event when another class is extending this one, or is - * implementing interface declared by this class. + * Register event when another class is extending this one. */ public void registerExtension() { extensionsCount++; } + public void registerImplementation() { + implementationsCount++; + } + public void registerReference() { - incomingReferencesCount++; + referencesCount++; } public void setDistinctiveColor(final String distinctiveColor) {