package org.lrg.outcode.visitors;
import java.util.HashSet;
import java.util.Set;
import org.lrg.outcode.builder.RelTypes;
import org.lrg.outcode.builder.db.GraphDatasource;
import org.neo4j.graphdb.Direction;
import org.neo4j.graphdb.Node;
import org.neo4j.graphdb.Relationship;
public class IntensiveCoupling {
public void findIntensiveCoupling(Node method) {
Iterable<Relationship> efferentCalls = method.getRelationships(RelTypes.CALLS, Direction.OUTGOING);
Set<Long> calledMethods = new HashSet<Long>();
Set<Long> calledClasses = new HashSet<Long>();
efferentCalls.forEach((r) -> {
Node endNode = r.getEndNode();
Node parentNode = parentNode(endNode);
if (parentNode != null) {
calledMethods.add(endNode.getId());
calledClasses.add(parentNode.getId());
}
} );
// Iterable<Relationship> afferentCalls = method.getRelationships(RelTypes.CALLS, Direction.INCOMING);
// Set<Long> callingMethods = new HashSet<Long>();
// Set<Long> callingClasses = new HashSet<Long>();
// afferentCalls.forEach((r) -> {
// Node startNode = r.getStartNode();
// Node parentNode = parentNode(startNode);
// if (parentNode != null) {
// callingMethods.add(startNode.getId());
// callingClasses.add(parentNode.getId());
// }
// } );
method.setProperty("calledMethods", calledMethods.size());
method.setProperty("calledClasses", calledClasses.size());
// method.setProperty("callingMethods", callingMethods.size());
// method.setProperty("callingClasses", callingClasses.size());
}
private Node parentNode(Node node) {
Node latestNodeForElementID = GraphDatasource.INSTANCE.findLatestVersion(node);
Iterable<Relationship> toParent = latestNodeForElementID.getRelationships(RelTypes.PARENT, Direction.OUTGOING);
if (toParent.iterator().hasNext()) {
Node parent = toParent.iterator().next().getEndNode();
return parent;
}
return null;
}
}