| <%@ 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); |
| } |
| } |