properly render fields of arrays of primitive types
[javainspect.git] / src / main / java / eu / svjatoslav / inspector / java / structure / MethodDescriptor.java
old mode 100644 (file)
new mode 100755 (executable)
index 35e49d5..cff1f8a
@@ -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;
@@ -15,23 +15,28 @@ import java.lang.reflect.Type;
 import java.util.ArrayList;
 import java.util.List;
 
-public class MethodDescriptor implements GraphElement {
+public class MethodDescriptor implements GraphElement,
+               Comparable<MethodDescriptor> {
 
-       public String name;
+       /**
+        * This class corresponds to single method within a java class.
+        */
+
+       public String methodName;
        public ClassDescriptor returnType;
-       private final ClassDescriptor parent;
+       private final ClassDescriptor parentClass;
 
-       List<ClassDescriptor> typeArguments = new ArrayList<ClassDescriptor>();
+       List<ClassDescriptor> argumentTypes = new ArrayList<ClassDescriptor>();
 
        public MethodDescriptor(final Method method, final ClassDescriptor parent,
                        final ClassGraph dump) {
 
-               this.parent = parent;
+               parentClass = parent;
 
-               name = method.getName();
+               methodName = method.getName();
 
                if (!method.getDeclaringClass().getName()
-                               .equals(parent.fullyQualifiedName))
+                               .equals(parent.classFullyQualifiedName))
                        // do not index inherited methods
                        return;
 
@@ -48,11 +53,20 @@ public class MethodDescriptor implements GraphElement {
                                        final Class cl = (Class) t;
                                        final ClassDescriptor classDescriptor = dump.addClass(cl);
                                        classDescriptor.registerReference();
-                                       typeArguments.add(classDescriptor);
+                                       argumentTypes.add(classDescriptor);
                                }
 
                }
+       }
+
+       @Override
+       public int compareTo(final MethodDescriptor o) {
 
+               final int nameComparisonResult = methodName.compareTo(o.methodName);
+               if (nameComparisonResult != 0)
+                       return nameComparisonResult;
+
+               return toString().compareTo(o.toString());
        }
 
        @Override
@@ -64,11 +78,11 @@ public class MethodDescriptor implements GraphElement {
                final StringBuffer result = new StringBuffer();
 
                // describe associated types
-               for (final ClassDescriptor classDescriptor : typeArguments)
+               for (final ClassDescriptor classDescriptor : argumentTypes)
                        if (classDescriptor.isVisible())
                                if (classDescriptor.areReferencesShown())
                                        result.append("    " + getGraphId() + " -> "
-                                                       + classDescriptor.getGraphId() + "[label=\"" + name
+                                                       + classDescriptor.getGraphId() + "[label=\"" + methodName
                                                        + "\", color=\"" + classDescriptor.getColor()
                                                        + "\", style=\"dotted, bold\"];\n");
 
@@ -78,7 +92,7 @@ public class MethodDescriptor implements GraphElement {
                // main type
                if (returnType.areReferencesShown())
                        result.append("    " + getGraphId() + " -> "
-                                       + returnType.getGraphId() + "[label=\"" + name + "\","
+                                       + returnType.getGraphId() + "[label=\"" + methodName + "\","
                                        + " color=\"" + returnType.getColor()
                                        + "\", style=\"dotted, bold\"];\n");
 
@@ -92,7 +106,7 @@ public class MethodDescriptor implements GraphElement {
 
                final StringBuffer result = new StringBuffer();
 
-               result.append("        // " + name + "\n");
+               result.append("        // " + methodName + "\n");
 
                result.append("        <TR><td ALIGN=\"right\">"
                                + "<FONT POINT-SIZE=\"8.0\">" + returnType.getClassName(true)
@@ -105,36 +119,53 @@ public class MethodDescriptor implements GraphElement {
 
        @Override
        public String getGraphId() {
-               return parent.getGraphId() + ":" + name;
+               return parentClass.getGraphId() + ":" + methodName;
        }
 
        public String getMethodLabel() {
-               return name;
+               return methodName;
+       }
+
+       public int getOutsideVisibleReferencesCount() {
+               int result = 0;
+
+               if (returnType.isVisible())
+                       result++;
+
+               for (final ClassDescriptor classDescriptor : argumentTypes)
+                       if (classDescriptor.isVisible())
+                               result++;
+
+               return result;
        }
 
        @Override
        public boolean isVisible() {
 
-               if (Utils.isSystemMethod(name))
+               // hide common object methods
+               if (Utils.isCommonObjectMethod(methodName))
                        return false;
 
-               if (parent.isEnum && Utils.isEnumMethod(name))
+               // hide common Enumeration methods
+               if (parentClass.isEnum && Utils.isEnumMethod(methodName))
                        return false;
 
-               if (!(name.startsWith("get") || name.startsWith("set")))
-                       return true;
-
-               final String upprCaseName = name.substring(3).toUpperCase();
-
-               for (String parentField : parent.nameToFieldMap.keySet()) {
-                       parentField = parentField.toUpperCase();
-
-                       if (upprCaseName.equals(parentField))
+               // hide get/set methods for the field of the same name
+               if (methodName.startsWith("get") || methodName.startsWith("set"))
+                       if (parentClass.hasFieldIgnoreCase(methodName.substring(3)))
                                return false;
 
+               // hide is methods for the boolean field of the same name
+               if (methodName.startsWith("is")) {
+                       final FieldDescriptor field = parentClass.getFieldIgnoreCase(methodName
+                                       .substring(2));
+                       if (field != null)
+                               if ("boolean".equals(field.getType().classFullyQualifiedName))
+                                       return false;
                }
 
                return true;
+
        }
 
 }