java-callgraph

Details

diff --git a/src/main/java/gr/gousiosg/javacg/dyn/Graph.java b/src/main/java/gr/gousiosg/javacg/dyn/Graph.java
index 32b6d23..45b6f30 100644
--- a/src/main/java/gr/gousiosg/javacg/dyn/Graph.java
+++ b/src/main/java/gr/gousiosg/javacg/dyn/Graph.java
@@ -28,28 +28,48 @@
 
 package gr.gousiosg.javacg.dyn;
 
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.Comparator;
 import java.util.HashMap;
+import java.util.List;
 import java.util.Map;
 import java.util.Stack;
 
 public class Graph {
 
+    private static Stack<String> stack = new Stack<String>();
+    private static Map<Pair<String, String>, Integer> callgraph = new HashMap<Pair<String,String>, Integer>();
+    
     static {
         Runtime.getRuntime().addShutdownHook(new Thread() {
             public void run() {
-                for (String key : callgraph.keySet()) {
+                //Sort by number of calls
+                List<Pair<String, String>> keys = new ArrayList<Pair<String, String>>();
+                keys.addAll(callgraph.keySet());
+                Collections.sort(keys, new Comparator<Object>() {
+                    public int compare(Object o1, Object o2) {
+                        Integer v1 = callgraph.get(o1);
+                        Integer v2 = callgraph.get(o2);
+                        return v1.compareTo(v2);
+                    }
+                });
+                
+                for (Pair<String, String> key : keys) {
                     System.err.println(key + " " + callgraph.get(key));
                 }
             }
         });
     }
 
-    private static Stack<String> stack = new Stack<String>();
-    private static Map<String, String> callgraph = new HashMap<String, String>();
-
     public static void push(String callname) {
-        if (!stack.isEmpty())
-            callgraph.put(stack.peek(), callname);
+        if (!stack.isEmpty()) {
+            Pair<String, String> p = new Pair<String, String>(stack.peek(), callname); 
+            if (callgraph.containsKey(p))
+                callgraph.put(p, callgraph.get(p) + 1);
+            else
+                callgraph.put(p, 1);
+        }
         stack.push(callname);
     }
 
diff --git a/src/main/java/gr/gousiosg/javacg/dyn/Instrumenter.java b/src/main/java/gr/gousiosg/javacg/dyn/Instrumenter.java
index 1db21d5..9e9074b 100644
--- a/src/main/java/gr/gousiosg/javacg/dyn/Instrumenter.java
+++ b/src/main/java/gr/gousiosg/javacg/dyn/Instrumenter.java
@@ -170,6 +170,6 @@ public class Instrumenter implements ClassFileTransformer {
     }
 
     private static void err(String msg) {
-        System.err.println("[JAVACG-DYN] " + msg);
+        //System.err.println("[JAVACG-DYN] " + msg);
     }
 }
\ No newline at end of file
diff --git a/src/main/java/gr/gousiosg/javacg/dyn/Pair.java b/src/main/java/gr/gousiosg/javacg/dyn/Pair.java
new file mode 100644
index 0000000..2328b07
--- /dev/null
+++ b/src/main/java/gr/gousiosg/javacg/dyn/Pair.java
@@ -0,0 +1,42 @@
+package gr.gousiosg.javacg.dyn;
+
+public class Pair<A, B> {
+
+    public A first;
+    public B second;
+    
+    public Pair(A first, B second) {
+        this.first = first;
+        this.second = second;
+    }
+    
+    @Override
+    public String toString() {
+        StringBuffer b = new StringBuffer(first.toString());
+        b.append(" ");
+        b.append(second);
+        return b.toString();
+    }
+    
+    @Override
+    public boolean equals(Object obj) {
+        if (obj == null)
+            return false;
+        if (obj == this)
+            return true;
+        if (obj.getClass() != getClass())
+            return false;
+
+        Pair p = (Pair)obj;
+
+        return first.equals(p.first) && second.equals(p.second);
+    }
+
+    @Override
+    public int hashCode() {
+        int hash = 7;
+        hash = 31 * hash + (null == first ? 0 : first.hashCode());
+        hash = 31 * hash + (null == second ? 0 : second.hashCode());
+        return hash;
+    }
+}