package hudson.plugins.crap4j.calculation;
import hudson.plugins.crap4j.display.ICrapComparison;
import hudson.plugins.crap4j.model.IMethodCrap;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.Map.Entry;
public class CrapDataComparer implements ICrapComparison {
private final List<IMethodCrap> newMethods;
private final List<IMethodCrap> fixedMethods;
private final List<IMethodCrap> unchangedMethods;
public CrapDataComparer(IMethodCrap[] oldCrapMethods, IMethodCrap[] newCrapMethods) {
super();
this.newMethods = new ArrayList<IMethodCrap>();
this.fixedMethods = new ArrayList<IMethodCrap>();
this.unchangedMethods = new ArrayList<IMethodCrap>();
performComparison(oldCrapMethods, newCrapMethods);
}
private Map<String, IMethodCrap> createCrapMethodMapFor(IMethodCrap... crapMethods) {
Map<String, IMethodCrap> result = new HashMap<String, IMethodCrap>();
for (IMethodCrap methodCrap : crapMethods) {
result.put(getUniqueNameOf(methodCrap), methodCrap);
}
return result;
}
private String getUniqueNameOf(IMethodCrap method) {
StringBuilder result = new StringBuilder();
result.append(method.getPackageName());
result.append(".");
result.append(method.getClassName());
result.append(".");
result.append(method.getMethodName());
result.append(":");
result.append(method.getMethodSignature());
return result.toString();
}
private void performComparison(IMethodCrap[] oldCrapMethods, IMethodCrap[] newCrapMethods) {
Map<String, IMethodCrap> oldCrapMethodMap = createCrapMethodMapFor(oldCrapMethods);
Map<String, IMethodCrap> newCrapMethodMap = createCrapMethodMapFor(newCrapMethods);
Set<Entry<String, IMethodCrap>> entrySet = oldCrapMethodMap.entrySet();
for (Entry<String, IMethodCrap> entry : entrySet) {
if (newCrapMethodMap.containsKey(entry.getKey())) {
this.unchangedMethods.add(entry.getValue());
newCrapMethodMap.remove(entry.getKey());
} else {
this.fixedMethods.add(entry.getValue());
}
}
this.newMethods.addAll(newCrapMethodMap.values());
}
//@Override
public IMethodCrap[] getFixedCrapMethods() {
return getAsArray(this.fixedMethods);
}
private IMethodCrap[] getAsArray(List<IMethodCrap> methodList) {
return methodList.toArray(new IMethodCrap[methodList.size()]);
}
//@Override
public IMethodCrap[] getNewCrapMethods() {
return getAsArray(this.newMethods);
}
//@Override
public IMethodCrap[] getUnchangedCrapMethods() {
return getAsArray(this.unchangedMethods);
}
}