/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
package br.uff.ic.oceano.core.tools.metrics.extractors.dependometer;
import br.uff.ic.oceano.core.tools.metrics.extractors.dependometer.util.Adapter;
import br.uff.ic.oceano.core.tools.metrics.extractors.dependometer.util.MetricHelper;
import br.uff.ic.oceano.core.tools.metrics.MetricEnumeration;
import br.uff.ic.oceano.core.tools.metrics.MetricException;
import br.uff.ic.oceano.core.model.Metric;
import br.uff.ic.oceano.core.model.MetricValue;
import br.uff.ic.oceano.core.model.Revision;
import br.uff.ic.oceano.core.tools.metrics.extractors.AbstractMetricExtractor;
import br.uff.ic.oceano.util.NumberUtil;
import com.valtech.source.dependometer.app.core.common.MetricEnum;
import java.util.LinkedHashMap;
import java.util.LinkedList;
import java.util.List;
/**
*
* @author Daniel
*/
public class DependomenterExtractor extends AbstractMetricExtractor {
//stored revisions
private static final byte size = 2;
//store revision add order
private static List<Revision> order = new LinkedList<Revision>();
//buffered processed revisions
private static LinkedHashMap<Revision, Adapter> buffer = new LinkedHashMap<Revision, Adapter>(size);
public DependomenterExtractor() {
}
/**
* Returns average value for hole project revision.
*
* @param revision
* @return
* @throws MetricException
*/
@Override
public MetricValue extractMetric(Revision revision) throws MetricException {
return extractMetricWithMetricService(revision);
}
/**
* Returns value of paths package
*
* @param revision
* @param path
* @return
* @throws MetricException
*/
@Override
public MetricValue extractMetric(Revision revision, String path) throws MetricException {
try {
Adapter service = getService(revision);
Double result;
if (isCalculatedMetric(getMetric())) {
result = calculateMetric(service, getMetric(), path);
} else {
result = service.getMetric(getMetric(), path);
}
return createMetricValue(revision, result);
} catch (Exception ex) {
throw new MetricException("Exception while extracting " + getMetric().getName(), ex);
}
}
private Double calculateMetric(Adapter service, Metric metric, String path) throws MetricException {
try {
if (MetricEnumeration.ANA.same(metric)) {
MetricEnum dependometer = MetricHelper.getDependometerMetric(MetricEnumeration.ANA);
final List<Double> values = service.getTypeValues(dependometer);
return NumberUtil.avg(values);
} else if (MetricEnumeration.NOH.same(metric)) {
MetricEnum dependometer = MetricHelper.getDependometerMetric(MetricEnumeration.NOH);
final List<Double> values = service.getTypeValues(dependometer);
int numHierarchies = 0;
//count classes with DepthOfClassInheritance > 0
for (Double value : values) {
if (value > 0) {
numHierarchies++;
}
}
return new Double(numHierarchies);
}
} catch (Exception ex) {
throw new MetricException(ex);
}
throw new MetricException("Metric not calculated: " + metric);
}
private boolean isCalculatedMetric(Metric metric) throws DependometerException {
return (MetricEnumeration.ANA.same(metric)
|| MetricEnumeration.NOH.same(metric));
}
private synchronized Adapter getService(Revision revision) {
Adapter adapter = buffer.get(revision);
if (adapter == null) {
adapter = new Adapter(revision);
buffer.put(revision, adapter);
order.add(revision);
if (order.size() > size) {
Revision oldest = order.remove(0);
buffer.remove(oldest);
}
}
return adapter;
}
}