blob: f665afef8fc3e9b60767545bd4f0bbde6175e6ed [file] [log] [blame]
<%@ package="org.eclipse.emf.refactor.smells" class="ModelSmellFinderClass"
imports="org.eclipse.emf.refactor.smells.generator.core.MetricBasedModelSmellInfo"%>
<%MetricBasedModelSmellInfo info = (MetricBasedModelSmellInfo)argument; %>
package <%=info.getPackage()%>;
import java.util.LinkedList;
import java.util.List;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.refactor.metrics.core.Metric;
import org.eclipse.emf.refactor.metrics.interfaces.IMetricCalculator;
import org.eclipse.emf.refactor.smells.core.MetricBasedModelSmellFinderClass;
public final class <%=info.getClassName()%> extends MetricBasedModelSmellFinderClass {
private String metricId = "<%=info.getMetricID()%>";
private Metric localMetric = Metric.getMetricInstanceFromId(metricId);
@Override
public LinkedList<LinkedList<EObject>> findSmell(EObject root) {
LinkedList<EObject> rootList = new LinkedList<EObject>();
rootList.add(root);
ICalculateClass localCalculateClass = localMetric.getCalculateClass();
double globalLimit = this.getLimit();
return findSmellyObjectGroups(root, globalLimit, localCalculateClass);
}
private LinkedList<LinkedList<EObject>> findSmellyObjectGroups(EObject root, double globalLimit,
ICalculateClass localCalculateClass){
String context = localMetric.getContext();
LinkedList<LinkedList<EObject>> smellyEObjects = new LinkedList<LinkedList<EObject>>();
List<EObject> containedEObjects = root.eContents();
for(EObject object : containedEObjects){
String objectType = object.eClass().getInstanceClass().getSimpleName();
if(objectType.equals(context)){
LinkedList<EObject> rootList = new LinkedList<EObject>();
rootList.add(object);
localCalculateClass.setContext(rootList);
double localValue = localCalculateClass.calculate();
if (limitReached(localValue, globalLimit)) {
LinkedList<EObject> currentObjects = new LinkedList<EObject>();
currentObjects.add(object);
smellyEObjects.add((currentObjects));
}
} else {
smellyEObjects.addAll(findSmellyObjectGroups(object, globalLimit, localCalculateClass));
}
}
return smellyEObjects;
}
private boolean limitReached(double localValue, double globalLimit) {
return (localValue <%=info.getComparator()%> globalLimit);
}
}