blob: c6e88dbeb45aa837f451e96079ad2d9611012d29 [file] [log] [blame]
<%@ jet 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);
IMetricCalculator localCalculateClass = localMetric.getCalculateClass();
double globalLimit = this.getLimit();
return findSmellyObjectGroups(root, globalLimit, localCalculateClass);
}
private LinkedList<LinkedList<EObject>> findSmellyObjectGroups(EObject object, double globalLimit,
IMetricCalculator localCalculateClass) {
String context = localMetric.getContext();
LinkedList<LinkedList<EObject>> smellyEObjects = new LinkedList<LinkedList<EObject>>();
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 {
List<EObject> containedEObjects = object.eContents();
for(EObject containedEObject : containedEObjects) {
smellyEObjects.addAll(findSmellyObjectGroups(containedEObject, globalLimit, localCalculateClass));
}
}
return smellyEObjects;
}
private boolean limitReached(double localValue, double globalLimit) {
return (localValue <%=info.getComparator()%> globalLimit);
}
}