package br.uff.ic.oceano.experiments.ostra;
import br.uff.ic.oceano.CppProjectsHelper;
import br.uff.ic.oceano.core.control.ApplicationConstants;
import br.uff.ic.oceano.core.dao.OceanoUserDao;
import br.uff.ic.oceano.core.dao.impl.OceanoUserDaoImpl;
import br.uff.ic.oceano.core.exception.ObjetoNaoEncontradoException;
import br.uff.ic.oceano.core.exception.ServiceException;
import br.uff.ic.oceano.core.factory.MetricManagerFactory;
import br.uff.ic.oceano.core.factory.ObjectFactory;
import br.uff.ic.oceano.core.model.Metric;
import br.uff.ic.oceano.core.model.OceanoUser;
import br.uff.ic.oceano.core.model.SoftwareProject;
import br.uff.ic.oceano.core.model.transiente.Language;
import br.uff.ic.oceano.core.tools.metrics.MetricManager;
import br.uff.ic.oceano.util.file.FileUtils;
import br.uff.ic.oceano.util.SystemUtil;
import br.uff.ic.oceano.ostra.controle.Constantes;
import br.uff.ic.oceano.ostra.discretizer.DayOfWeekDiscretizer;
import br.uff.ic.oceano.ostra.discretizer.Discretizer;
import br.uff.ic.oceano.ostra.discretizer.DiscretizerFactory;
import br.uff.ic.oceano.ostra.discretizer.HourOfDayDiscretizer;
import br.uff.ic.oceano.ostra.discretizer.NegativePositiveDiscretizer;
import br.uff.ic.oceano.ostra.discretizer.NumberOfFilesDiscretizer;
import br.uff.ic.oceano.ostra.discretizer.RoundOfDayDiscretizer;
import br.uff.ic.oceano.ostra.service.DeltaMetricsRevisionDataBaseService;
import br.uff.ic.oceano.ostra.service.OstraMetricService;
import br.uff.ic.oceano.ostra.service.OstraQualityAtributesWithout_HardCoded_Service;
import br.uff.ic.oceano.util.CargaDefaultWeb;
import br.uff.ic.oceano.util.test.AbstractNGTest;
import java.io.File;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import static org.testng.Assert.*;
import org.testng.annotations.BeforeClass;
import org.testng.annotations.Test;
/**
*
*/
public class ExtractMetricsFromNeoPZ extends AbstractNGTest {
private OstraQualityAtributesWithout_HardCoded_Service ostraQualityAtributesService;
private DeltaMetricsRevisionDataBaseService deltaMetricsRevisionDataBaseService;
private List<SoftwareProject> projects = new ArrayList<SoftwareProject>();
private List<MetricManager> metricManagers = new ArrayList<MetricManager>();
private OceanoUser userDanielOceano;
private OstraMetricService ostraMetricService;
@BeforeClass
public void setUpClass() throws Exception {
Constantes.SHOW_OUTPUT_CLI = false;
Constantes.SHOW_OUTPUT_COMPILATION = false;
ApplicationConstants.DIR_BASE_CHECKOUTS = SystemUtil.getTempDirectory() + "\\revisions\\";
if (ApplicationConstants.CLEAN_CHECKOUT_DIRECTORY) {
File file = new File(ApplicationConstants.DIR_BASE_CHECKOUTS);
FileUtils.deleteDirectory(file);
System.out.println(">>>> Cleaning checkout directory... " + !file.exists());
}
this.ostraMetricService = ObjectFactory.getObjectWithDataBaseDependencies(OstraMetricService.class);
this.ostraMetricService.setUsingUpdateRevision(true);
this.ostraMetricService.setRevisionThreshold(0);
this.ostraQualityAtributesService = ObjectFactory.getObjectWithDataBaseDependencies(OstraQualityAtributesWithout_HardCoded_Service.class);
this.deltaMetricsRevisionDataBaseService = ObjectFactory.getObjectWithDataBaseDependencies(DeltaMetricsRevisionDataBaseService.class);
if (!CargaDefaultWeb.isDefaultDataInserted()) {
CargaDefaultWeb.insertDefaultData();
}
MetricManagerFactory.getInstance();
OceanoUserDao oceanoUserDao = ObjectFactory.getObjectWithDataBaseDependencies(OceanoUserDaoImpl.class);
this.userDanielOceano = oceanoUserDao.getByLogin("dheraclio");
initializeProjectList();
initializeMetricsList();
}
@Test
public void executaExperimentos() throws Throwable {
final boolean EXTRAI_METRICAS = true;
if (EXTRAI_METRICAS) {
extractMetrics();
}
final boolean CALCULA_METRIC_VALUES = true;
if (CALCULA_METRIC_VALUES) {
calculateRevisionMetricValues();
}
final boolean CALCULA_ATRIBUTOS_DE_QUALIDADE = true;
if (CALCULA_ATRIBUTOS_DE_QUALIDADE) {
extractQualityAttributes();
}
final boolean calculateDeltas = false;
if (calculateDeltas) {
calculateDeltas();
}
}
private List<Discretizer> getDiscretizers() throws ServiceException {
final List<Discretizer> discretizers = DeltaMetricsRevisionDataBaseService.getDefaultDiscretizers();
for (Metric metric : getMetrics(metricManagers)) {
discretizers.add(DiscretizerFactory.getDiscretizer(Constantes.PREFIX_DELTA_METRIC_AVARAGE + metric.getName(), NegativePositiveDiscretizer.class));
discretizers.add(DiscretizerFactory.getDiscretizer(Constantes.PREFIX_DELTA_METRIC_STANDARD_DEVIATON + metric.getName(), NegativePositiveDiscretizer.class));
}
return discretizers;
}
private void initializeProjectList() throws ServiceException {
try {
SoftwareProject neopzLocal = CppProjectsHelper.getDBNeoPZProject();
assertNotNull(neopzLocal);
this.projects.add(neopzLocal);
} catch (ObjetoNaoEncontradoException ex) {
fail(ex.getMessage());
}
}
private void extractMetrics() throws Throwable {
for (SoftwareProject project : projects) {
try {
println("======================================================");
println("EXTRACTING METRICS FROM PROJECT " + project);
ostraMetricService.extractAndSaveMetricsFromAllFilesInProjectRevisions(project, userDanielOceano, metricManagers);
println("======================================================\n");
} catch (Throwable t) {
println(t.getMessage());
}
}
}
private void calculateRevisionMetricValues() throws Throwable {
// measure projects
for (SoftwareProject project : projects) {
try {
println("======================================================");
println("CALCULATING REVISION METRIC VALUES FROM PROJECT " + project);
ostraMetricService.calculateRevisionMetricValuesFromVersionedItemMetricValues(project, getMetrics(metricManagers));
println("======================================================\n");
} catch (Throwable t) {
println(t.getMessage());
}
}
}
private void extractQualityAttributes() throws Throwable {
// measure projects
for (SoftwareProject project : projects) {
try {
println("======================================================");
println("CALCULATING QUALITY ATTRIBUTES FOR PROJECT " + project);
ostraQualityAtributesService.calculateQualityAttributes(project);
println("======================================================\n");
} catch (Throwable t) {
println(t.getMessage());
}
}
}
private void initializeMetricsList() throws ServiceException {
MetricManagerFactory fact = MetricManagerFactory.getInstance();
Collection<MetricManager> metricManagrs = fact.getMetricManagers();
for (MetricManager mng : metricManagrs) {
if (!mng.isLanguageSupported(Language.CPP)) {
continue;
}
metricManagers.add(mng);
}
println("Metrics to consider = " + metricManagers);
}
private List<Metric> getMetrics(List<MetricManager> metricManagers) {
final List<Metric> metrics = new ArrayList(metricManagers.size());
for (MetricManager metricManager : metricManagers) {
metrics.add(metricManager.getMetric());
}
return metrics;
}
private void calculateDeltas() throws ServiceException {
//deltas
final List<Discretizer> discretizers = getDiscretizers();
final List<Metric> metrics = getMetrics(metricManagers);
deltaMetricsRevisionDataBaseService.buildDeltaMetricsDataBase(projects, discretizers, true, false, metrics, true);
}
}