/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
package br.uff.ic.oceano.ostra.service.metric;
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.exception.VCSException;
import br.uff.ic.oceano.core.factory.MetricManagerFactory;
import br.uff.ic.oceano.core.factory.ObjectFactory;
import br.uff.ic.oceano.core.model.*;
import br.uff.ic.oceano.core.service.MetricValueService;
import br.uff.ic.oceano.core.service.ProjectUserService;
import br.uff.ic.oceano.core.service.RevisionService;
import br.uff.ic.oceano.core.service.vcs.VCSService;
import br.uff.ic.oceano.core.tools.metrics.MetricManager;
import br.uff.ic.oceano.core.tools.metrics.service.MeasurementService;
import br.uff.ic.oceano.core.tools.metrics.service.MetricService;
import br.uff.ic.oceano.core.tools.revision.RevisionUtil;
import br.uff.ic.oceano.ostra.service.ItemService;
import br.uff.ic.oceano.ostra.service.LogService;
import br.uff.ic.oceano.ostra.service.VersionedItemMetricValueService;
import br.uff.ic.oceano.ostra.service.VersionedItemService;
import br.uff.ic.oceano.util.DateUtil;
import br.uff.ic.oceano.util.Output;
import br.uff.ic.oceano.util.SystemUtil;
import br.uff.ic.oceano.util.file.FileUtils;
import br.uff.ic.oceano.util.file.PathUtil;
import java.util.*;
/**
*
*/
public class OstraMetricService1 extends MetricService {
protected VCSService vCSService;
protected ProjectUserService projectUserService;
protected RevisionService revisionService;
protected ItemService itemService;
protected LogService logService;
protected MetricValueService metricValueService;
protected VersionedItemService versionedItemService;
protected VersionedItemMetricValueService versionedItemMetricValueService;
protected MeasurementService measurementService;
private OceanoUserDao oceanoUserDao;
public OstraMetricService1() {
super();
measurementService = ObjectFactory.getObjectWithDataBaseDependencies(MeasurementService.class);
vCSService = ObjectFactory.getObjectWithDataBaseDependencies(VCSService.class);
projectUserService = ObjectFactory.getObjectWithDataBaseDependencies(ProjectUserService.class);
revisionService = ObjectFactory.getObjectWithDataBaseDependencies(RevisionService.class);
itemService = ObjectFactory.getObjectWithDataBaseDependencies(ItemService.class);
metricValueService = ObjectFactory.getObjectWithDataBaseDependencies(MetricValueService.class);
versionedItemService = ObjectFactory.getObjectWithDataBaseDependencies(VersionedItemService.class);
versionedItemMetricValueService = ObjectFactory.getObjectWithDataBaseDependencies(VersionedItemMetricValueService.class);
logService = ObjectFactory.getObjectWithDataBaseDependencies(LogService.class);
oceanoUserDao = ObjectFactory.getObjectWithDataBaseDependencies(OceanoUserDaoImpl.class);
}
public void execute(Request request) throws ServiceException {
try {
for (SoftwareProject project : request.getProjects()) {
process(project, request);
}
} catch (Exception ex) {
throw new ServiceException(ex);
}
}
private void process(SoftwareProject project, Request request) throws Exception {
Configuration config = request.getConfiguration();
Set<Revision> revisions = getRevisions(project, request);
if (revisions.size() < config.getRevisionThreshold()) {
Output.println("<<< This Project has less than " + config.getRevisionThreshold() + " revisions. Will be Skipped. >>>");
return;
}
long count = 0;
for (Revision revision : revisions) {
Output.println("Processing " + count++ + "/" + revisions.size() + " at " + DateUtil.format(Calendar.getInstance()));
process(revision, request);
}
}
private Set<Revision> getRevisions(SoftwareProject project, Request request) throws Exception {
OceanoUser oceanoUser = oceanoUserDao.getByLogin(request.getUserLogin());
Output.println("Loading user... ");
ProjectUser projectUser = projectUserService.getByProjectAndOceanoUser(project, oceanoUser);
request.setProjectUser(projectUser);
Output.println("Loaded user: " + projectUser.getLogin() + "");
Output.println("Loading revisions from " + project.getRepositoryUrl());
Set<Revision> revisions = vCSService.getRevisions(project, projectUser);
Output.println("Loaded " + revisions.size() + " revisions");
return revisions;
}
private void process(Revision revision, Request request) throws Exception {
Output.println("Revision " + revision.getNumber());
Output.println("Comitted files: " + (revision.getChangedFiles() != null ? revision.getChangedFiles().size() : 0));
List<MetricManager> metricsToExtract = loadMetrics(revision, request);
if (metricsToExtract.isEmpty()) {
Output.println("No metrics to extract");
return;
}
request.setProjectMetrics(metricsToExtract);
try {
loadRevision(revision, request);
} catch (VCSException ex) {
Output.println("There was a problem getting the code. Skipping to next revision...");
}
if (!RevisionUtil.get().getSourceFilesFromChangedFiles(revision).isEmpty()) {
Output.println("No changes in source files");
return;
}
extractMetrics(revision,request);
unloadRevision(revision, request);
}
private List<MetricManager> loadMetrics(Revision revision, Request request) throws Exception {
List<String> metricsNames = request.getMetrics();
List<MetricManager> metrics = new LinkedList<MetricManager>();
MetricManagerFactory fact = MetricManagerFactory.getInstance();
for (String name : metricsNames) {
MetricManager mng = fact.getMetricByName(name);
if (mng.isLanguageSupported(revision.getProject().getLanguage())) {
continue;
}
if (versionedItemMetricValueService.isMeasured(revision, mng.getMetric())) {
continue;
}
if (metricValueService.isMeasured(revision, mng.getMetric())) {
continue;
}
metrics.add(mng);
}
return metrics;
}
private void loadRevision(Revision revision, Request request) throws Exception {
Revision persistentRevision = revisionService.getByNumberAndProject(revision.getNumber(), revision.getProject());
revision.setId(persistentRevision.getId());
Configuration config = request.getConfiguration();
String path = getPath(revision, request);
revision.setLocalPath(path);
if (config.isUsingUpdateRevision()) {
vCSService.doUpdate(revision, request.getProjectUser(), false);
} else {
if (PathUtil.exists(path)) {
FileUtils.deleteDirectory(path);
}
PathUtil.mkDirs(path);
vCSService.doCheckout(revision, request.getProjectUser(), false);
}
}
private void unloadRevision(Revision revision, Request request) throws Exception {
Configuration config = request.getConfiguration();
if (config.isUsingUpdateRevision()) {
return;
}
//Delete checkout dir
String path = getPath(revision, request);
FileUtils.deleteDirectory(path);
}
private String getPath(Revision revision, Request request) throws Exception {
Configuration config = request.getConfiguration();
String projectName = revision.getProject().getConfigurationItem().getName().replace(" ", "_");
String path = PathUtil.getWellFormedPath(SystemUtil.getTempDirectory(), projectName);
if (!config.isUsingUpdateRevision()) {
path = PathUtil.getWellFormedPath(path, String.valueOf(revision.getNumber()));
}
return path;
}
private void extractMetrics(Revision revision, Request request) {
//create list of elements(files, classes, packages, the project)
//run each metric through all element
//save result
//how to know if project already has the metrics before this point
//not necessary. Check before extract
}
}