Package org.codemap.callhierarchy

Source Code of org.codemap.callhierarchy.GraphConversionVisitor

package org.codemap.callhierarchy;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;

import org.codemap.Location;
import org.codemap.util.Resources;
import org.eclipse.jdt.core.ICompilationUnit;

import edu.stanford.hci.flowmap.structure.Graph;
import edu.stanford.hci.flowmap.structure.Node;

public class GraphConversionVisitor {
   
    private Map<String, Location> locations;
    private ArrayList<Graph> graphs = new ArrayList<Graph>();

    public GraphConversionVisitor(Map<String, Location> locations) {
        this.locations = locations;
    }

    public void visit(MethodCallNode methodCallNode) {
       String rootPath = getPath(methodCallNode);
       // no paht for binary members etc.
       if (rootPath == null) return;
      
       ArrayList<MethodCallNode> children = methodCallNode.getChildren();
       if (children.isEmpty()) return;        
      
       Map<Location, Integer> locationWeights = new HashMap<Location, Integer>();
       for (MethodCallNode each : children) {
           String childPath = getPath(each);
           // child might not have been resolved
           if (childPath == null) continue;
          
           // do not add an edge from the node to itself because
           // - the clustering algorithm does not like it
           // - it won't appear on the map anyway as the edge would have a length of 0
           if (childPath.equals(rootPath)) continue;
          
           Location location = locations.get(childPath);
           if (location == null) continue;
          
           Integer weight = locationWeights.get(location);
           if (weight == null) {
               weight = 0;
           }
           weight += 1;
           locationWeights.put(location, weight);
       }
      
       Graph graph = new Graph();
       Location rootLocation = locations.get(rootPath);
       if (rootLocation == null) return;
       Node rootNode = new Node(rootLocation.px, rootLocation.py, 1, rootLocation.getDocument());
       graph.addNode(rootNode);
       graph.setRootNode(rootNode);
      
       for (Location each: locationWeights.keySet()) {
           Integer weight = locationWeights.get(each);
           Node node = new Node(each.px, each.py, weight, each.getDocument());
           graph.addNode(node);
       }
       graphs.add(graph);
    }

    private String getPath(MethodCallNode methodCallNode) {
        ICompilationUnit compilationUnit = methodCallNode.getSourceMethod().getMember().getCompilationUnit();
        if (compilationUnit == null) return null;
        String path = Resources.asPath(compilationUnit);
        return path;
    }

    public ArrayList<Graph> getGraphs() {
        return graphs;
    }
}
TOP

Related Classes of org.codemap.callhierarchy.GraphConversionVisitor

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.