package org.lrg.outcode.visitors;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import org.lrg.outcode.IHindsight;
import org.lrg.outcode.builder.RelTypes;
import org.neo4j.graphdb.Direction;
import org.neo4j.graphdb.Label;
import org.neo4j.graphdb.Node;
import org.neo4j.graphdb.Relationship;
public class GodClass {
private class Pair {
private Node right;
private Node left;
public Pair(Node left, Node right) {
this.left = left;
this.right = right;
}
@Override
public String toString() {
// return "[" + left.getProperty(IHindsight.NAME) + " " + left.getId() + " ,
// " + right.getProperty(IHindsight.NAME) + " "+right.getId() + "]";
if (left.getId() < right.getId())
return left.getId() + " " + right.getId();
else
return right.getId() + " " + left.getId();
}
}
private HashMap<String, Pair> uniquePairs = new HashMap<String, Pair>();
public void findGodClasses(Node clazz) {
System.out.println("" + clazz.getProperty(IHindsight.NAME));
Iterable<Relationship> contains = clazz.getRelationships(RelTypes.CONTAINS, Direction.OUTGOING);
Iterator<Relationship> iterator = contains.iterator();
HashMap<Long, Node> members = new HashMap<Long, Node>();
while (iterator.hasNext()) {
Relationship next = iterator.next();
Node member = next.getEndNode();
members.put(member.getId(), member);
}
System.out.println("\t members: " + members.size());
uniquePairs.clear();
double n = 0;
int atfd = 0;
int wmc = 0;
for (Node node : members.values()) {
if (node.hasLabel(Label.label("Field"))) { // if it's a field
// we compute
// TCC
List<Long> afferentAccessorMethods = new ArrayList<Long>();
Iterable<Relationship> relationships = node.getRelationships(RelTypes.ACCESSES, Direction.INCOMING);
for (Relationship relationship : relationships) {
Node startNode = relationship.getStartNode();
if (members.get(startNode.getId()) != null) {
if (!afferentAccessorMethods.contains(startNode.getId()))
afferentAccessorMethods.add(startNode.getId());
}
}
for (int i = 0; i < afferentAccessorMethods.size() - 1; i++) {
for (int j = i + 1; j < afferentAccessorMethods.size(); j++) {
Pair pair = new Pair(members.get(afferentAccessorMethods.get(i)), members.get(afferentAccessorMethods.get(j)));
if (uniquePairs.get(pair.toString()) == null)
uniquePairs.put(pair.toString(), pair);
}
}
}
if (node.hasLabel(Label.label("Method"))) {
n += 1;
if (node.hasProperty("foreignAccesses")) {
Object foreignAccesses = node.getProperty("foreignAccesses");
atfd += (Integer) foreignAccesses;
} else
System.out.println("node withID " + node.getProperty(IHindsight.ID) + " does not have foreingAccess set");
if (node.hasProperty("cyclomaticComplexity")) {
Object cyclomaticComplexity = node.getProperty("cyclomaticComplexity");
wmc += (Integer) cyclomaticComplexity;
} else
System.out.println("node withID " + node.getProperty(IHindsight.ID) + " does not have cyclomaticComplexity set");
}
}
double tcc = 1;
if (n > 1) {
tcc = (uniquePairs.size()) / ((n * (n - 1)) / 2);
if (tcc > 1) {
System.out.println("\t n=" + n + " (n * (n - 1)) / 2 = " + ((n * (n - 1)) / 2));
// for (Node node : members.values()) {
// System.out.println("\t member " + node.getProperty(IHindsight.NAME));
// }
System.out.println("\t uniquePairs= " + uniquePairs.size());
for (Pair pair : uniquePairs.values()) {
System.out.println("\t pair " + pair);
}
}
}
System.out.println("TCC = " + tcc);
clazz.setProperty("TCC", tcc);
System.out.println("ATFD = " + atfd);
System.out.println("WMC = " + wmc);
clazz.setProperty("ATFD", atfd);
clazz.setProperty("WMC", wmc);
}
}