Code refactoring. Simplified API.
[javainspect.git] / src / main / java / eu / svjatoslav / inspector / java / structure / ClassGraph.java
index a2ce8a2..27eff03 100755 (executable)
@@ -21,63 +21,34 @@ import eu.svjatoslav.inspector.java.methods.ProjectScanner;
 
 public class ClassGraph {
 
-       public static void render(final String graphName, final Class... classes) {
-               final ClassGraph classGraph = new ClassGraph(classes);
-
-               classGraph.generateGraph(graphName);
-       }
-
        /**
         * Maps class fully qualified names to class descriptors.
         */
        private final Map<String, ClassDescriptor> fullyQualifiedNameToClassMap = new HashMap<String, ClassDescriptor>();
 
-       private Filter filter = new Filter();
+       private final Filter filter = new Filter();
 
        public ClassGraph() {
        }
 
-       /**
-        * @param classes
-        *            classes that shall be added to graph
-        */
-       public ClassGraph(final Class<? extends Object>... classes) {
-               for (final Class<? extends Object> clazz : classes)
-                       addClass(clazz);
-       }
-
        /**
         * @param objects
         *            objects that shall be added to graph
         */
-       public ClassGraph(final Object... objects) {
-               for (final Object object : objects)
-                       addClass(object.getClass());
-       }
-
-       /**
-        * @param clazz
-        *            class that shall be added to graph
-        */
-       public ClassDescriptor addClass(final Class<? extends Object> clazz) {
-
-               if (clazz == null)
-                       return null;
-
-               final String className = clazz.getName();
+       public ClassGraph add(final Object... objects) {
 
-               if (fullyQualifiedNameToClassMap.containsKey(className))
-                       return fullyQualifiedNameToClassMap.get(className);
+               if (objects != null)
+                       for (final Object object : objects)
+                               addObject(object);
 
-               return new ClassDescriptor(clazz, this);
+               return this;
        }
 
-       /**
-        * @param object
-        *            object that shall be added to graph
-        */
-       public ClassDescriptor addObject(final Object object) {
-               return addClass(object.getClass());
+       private void addObject(final Object object) {
+               if (object instanceof Class)
+                       getOrCreateClassDescriptor((Class) object);
+               else
+                       getOrCreateClassDescriptor(object.getClass());
        }
 
        /**
@@ -91,7 +62,7 @@ public class ClassGraph {
                        try {
                                System.out.println("Class full name: " + clazz.getFullName());
                                final Class c = this.getClass().forName(clazz.getFullName());
-                               addClass(c);
+                               addObject(c);
                        } catch (final Exception exception) {
                                System.out.println("cannot add class: "
                                                + exception.getMessage());
@@ -198,6 +169,31 @@ public class ClassGraph {
                return filter;
        }
 
+       /**
+        * @param clazz
+        *            class that shall be added to graph
+        */
+       protected ClassDescriptor getOrCreateClassDescriptor(final Class clazz) {
+
+               if (clazz == null)
+                       return null;
+
+               final String classFullyQualifiedName = clazz.getName();
+
+               // reuse existing instance if possible
+               if (fullyQualifiedNameToClassMap.containsKey(classFullyQualifiedName))
+                       return fullyQualifiedNameToClassMap.get(classFullyQualifiedName);
+
+               // create new class descriptor
+               final ClassDescriptor newClassDescriptor = new ClassDescriptor(this);
+               fullyQualifiedNameToClassMap.put(classFullyQualifiedName,
+                               newClassDescriptor);
+
+               newClassDescriptor.analyzeClass(clazz);
+
+               return newClassDescriptor;
+       }
+
        /**
         * Hide orphaned class that have no references
         */
@@ -209,14 +205,4 @@ public class ClassGraph {
 
        }
 
-       public void registerClass(final String classFullyQualifiedName,
-                       final ClassDescriptor classDescriptor) {
-               fullyQualifiedNameToClassMap.put(classFullyQualifiedName,
-                               classDescriptor);
-       }
-
-       public void setFilter(final Filter filter) {
-               this.filter = filter;
-       }
-
 }