br.edu.utfpr.cm.JGitMinerWeb.services.matrix.CoChangedFileServices.java Source code

Java tutorial

Introduction

Here is the source code for br.edu.utfpr.cm.JGitMinerWeb.services.matrix.CoChangedFileServices.java

Source

/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package br.edu.utfpr.cm.JGitMinerWeb.services.matrix;

import br.edu.utfpr.cm.JGitMinerWeb.dao.GenericDao;
import br.edu.utfpr.cm.JGitMinerWeb.model.matrix.EntityMatrix;
import br.edu.utfpr.cm.JGitMinerWeb.model.matrix.EntityMatrixNode;
import br.edu.utfpr.cm.JGitMinerWeb.model.miner.EntityCommitFile;
import br.edu.utfpr.cm.JGitMinerWeb.model.miner.EntityPullRequest;
import br.edu.utfpr.cm.JGitMinerWeb.model.miner.EntityRepository;
import br.edu.utfpr.cm.JGitMinerWeb.model.miner.EntityRepositoryCommit;
import br.edu.utfpr.cm.JGitMinerWeb.services.matrix.auxiliary.AuxPairOfFiles;
import br.edu.utfpr.cm.JGitMinerWeb.util.OutLog;
import br.edu.utfpr.cm.JGitMinerWeb.util.Util;
import com.google.common.collect.Lists;
import static java.lang.Thread.sleep;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.logging.Level;
import java.util.logging.Logger;
import org.joda.time.DateTime;

/**
 *
 * @author geazzy
 */
public class CoChangedFileServices extends AbstractMatrixServices {

    private Map<Long, List<EntityCommitFile>> changedList;
    private List<AuxPairOfFiles> coChangedList;

    public CoChangedFileServices(GenericDao dao, OutLog out) {

        super(dao, out);
        changedList = new HashMap<>();
        coChangedList = new ArrayList<>();
    }

    public CoChangedFileServices(GenericDao dao, EntityRepository repository, List<EntityMatrix> matricesToSave,
            Map params, OutLog out) {

        super(dao, repository, matricesToSave, params, out);
        changedList = new HashMap<>();
        coChangedList = new ArrayList<>();
    }

    protected Integer getMilestoneNumber() {
        String mileNumber = params.get("milestoneNumber") + "";
        return Util.tratarStringParaInt(mileNumber);
    }

    @Override
    public void run() {

        if (getRepository() == null) {
            throw new IllegalArgumentException("Parmetro Repository no pode ser nulo.");
        } else {

            if (getMilestoneNumber() > 0) {
                getRepositoryCommitsFromPullRequest(getPullRequestByMilestone());
            } else {
                getRepositoryCommitsFromPullRequest(getPullRequestByDate());
            }

            for (Object idPullRequest : changedList.keySet()) {

                setPairOfCoChangedFilesPerPullRequest(changedList.get((Long) idPullRequest), (Long) idPullRequest);
            }

            // addToEntityMatrizNodeList(coChangedList);
            EntityMatrix matrix = new EntityMatrix();
            matrix.setNodes(objectsToNodes(coChangedList));

            try {
                sleep(1l);
            } catch (InterruptedException ex) {
                Logger.getLogger(CoChangedFileServices.class.getName()).log(Level.SEVERE, null, ex);
            }

            saveMatrix(matrix);

            //            Set<AuxPairOfFiles> auxset = new HashSet<>(coChangedList);
            //
            //            System.out.println("cochange size list: " + coChangedList.size());
            //            System.out.println("auxset size set: " + auxset.size());
        }

    }

    private void saveMatrix(EntityMatrix entityMatrix) {
        out.printLog("Iniciando salvamento da rede.");
        List<EntityMatrixNode> matrixNodes = entityMatrix.getNodes();
        entityMatrix.setNodes(new ArrayList<EntityMatrixNode>());
        entityMatrix.getParams().putAll(params);
        entityMatrix.setRepository(getRepository() + "");
        entityMatrix.setClassServicesName(this.getClass().getName());
        entityMatrix.setLog(out.getLog().toString());
        dao.insert(entityMatrix);
        for (Iterator<EntityMatrixNode> it = matrixNodes.iterator(); it.hasNext();) {
            EntityMatrixNode node = it.next();
            node.setMatrix(entityMatrix);
            entityMatrix.getNodes().add(node);
            dao.insert(node);
            it.remove();
        }
        entityMatrix.setStoped(new Date());
        entityMatrix.setComplete(true);
        out.printLog("Concluida gerao da rede.");
        entityMatrix.setLog(out.getLog().toString());
        dao.edit(entityMatrix);
        out.printLog("");
    }

    private void setPairOfCoChangedFilesPerPullRequest(List<EntityCommitFile> files, Long idPullRequest) {

        for (int i = 0; i < files.size(); i++) {

            for (int next = i + 1; next < files.size(); next++) {

                //forma par de arquivo SOMENTE quando eles pertencem ao mesmo commit
                if (files.get(i).getRepositoryCommit().getSha()
                        .equals(files.get(next).getRepositoryCommit().getSha())) {
                    coChangedList.add(new AuxPairOfFiles(idPullRequest, files.get(i).getFilename(),
                            files.get(next).getFilename(), files.get(i).getRepositoryCommit().getSha(),
                            files.get(next).getRepositoryCommit().getSha()));
                }

            }
        }
    }

    private void getRepositoryCommitsFromPullRequest(List<EntityPullRequest> pullRequestListParam) {

        for (EntityPullRequest pullrequest : pullRequestListParam) {

            for (EntityRepositoryCommit repositoryCommit : pullrequest.getRepositoryCommits()) {

                if (repositoryCommit.getFiles().size() > 100) {
                    out.printLog("Commit IGNORADO - muitos arquivos: " + repositoryCommit.getUrl() + " tamanho: "
                            + repositoryCommit.getFiles().size());
                } else {

                    //add -verificando data
                    if (isBetween(repositoryCommit.getCommit().getCommitter().getDateCommitUser(), getBeginDate(),
                            getEndDate())) {
                        addFilesToMap(pullrequest.getIdPullRequest(), repositoryCommit.getFiles());
                    }

                }
            }
        }
    }

    private void addFilesToMap(Long idPullRequest, Set<EntityCommitFile> repositoryCommitFiles) {

        if (changedList.containsKey(idPullRequest)) {

            List<EntityCommitFile> files = changedList.get(idPullRequest);
            files.addAll(repositoryCommitFiles);
            changedList.put(idPullRequest, files);

        } else {
            changedList.put(idPullRequest, Lists.newArrayList(repositoryCommitFiles));
        }

    }

    private List<EntityPullRequest> getPullRequestByMilestone() {

        return dao.getEntityManager().createNamedQuery("PullRequest.findByMilestoneAndRepository")
                .setParameter("repository", getRepository()).setParameter("milestone", getMilestoneNumber())
                .getResultList();
    }

    private List<EntityPullRequest> getPullRequestByDate() {

        return dao.getEntityManager().createNamedQuery("PullRequest.findByDateAndRepository")
                .setParameter("repository", getRepository()).setParameter("dataInicial", getBeginDate())
                .setParameter("dataFinal", getEndDate()).getResultList();
    }

    @Override
    public String getHeadCSV() {
        return "idPullRequest;arquivo1;arquivo2;shaRepoCommit1;shaRepoCommit2;";
    }

    private boolean isBetween(Date dateCommitUser, Date beginDate, Date endDate) {

        DateTime dateCommit = new DateTime(dateCommitUser);
        DateTime begin = new DateTime(beginDate);
        DateTime end = new DateTime(endDate);

        if (dateCommit.isAfter(begin) && dateCommit.isBefore(end)) {
            return true;
        } else {
            return false;
        }
    }

}