<commit_before>package diretorioDiff;

import java.io.File;
import java.util.ArrayList;
import java.util.List;

import algorithms.Diff;
import algorithms.DiffException;
import algorithms.FileGrain;
import algorithms.Grain;
import algorithms.ILCSBean;
import algorithms.IResultDiff;
import diretorioDiff.resultados.Resultado;

/**
 * Realiza diff de diret�rios.
 * 
 * @author Eraldo
 * 
 */
public class DiretorioDiff {

	/**
	 * Diret�rio serializado 1
	 */
	private DiretorioSerializado dirSerializado1 = null;

	/**
	 * Diret�rio serializado 2
	 */
	private DiretorioSerializado dirSerializado2 = null;

	private Resultado resultado;

	private int iteracao;

	//private final ProgressMessager progressMessager;


	public DiretorioDiff(){//ProgressMessager progressMessager) {
		//this.progressMessager = progressMessager;
	}

	/**
	 * Realiza a compara��o entre dois diret�rios. <br>
	 * Segue os seguintes passos: <br>
	 * <ol>
	 * 	<li>Organiza os arquivos contidos nos dois diret�rios como uma lista
	 * 		(incluindo os filhos recursivamente).
	 * 	</li>
	 * 	<li>
	 * 		Gera um c�digo hash MD5 com o conte�do de cada arquivo.</li>
	 * 	<li>
	 * 		Compara os hashs de cada um dos arquivos de cada diret�rio e marca os
	 * 		que s�o identicos com o valor 100 em uma matriz de equival�ncia
	 * 	</li>
	 * 	<li>
	 * 		Monta uma matriz com o percentual de igualdade calculado pelo LCS
	 * 		entre os arquivos que n�o se mostraram id�nticos no passo anterior.
	 * 	</li>
	 * 	<li>
	 * 		Calcula atrav�s do algoritmo H�ngaro quais s�o os matches mais
	 * 		pr�ximos entre os itens da matriz anterior
	 * 	</li>
	 * 	<li>
	 * 		Devolve os valores para a matriz de equival�ncia
	 * 	</li>
	 * 	<li>
	 * 		Analisa a matriz de equival�ncia e de acordo com ela popula a classe Delta
	 * 	</li>
	 * </ol>
	 * 
	 * @param nomeDiretorio1 Nome do diret�rio 1
	 * @param nomeDiretorio2 Nome do diret�tio 2
	 * 
	 * @return Resultado da compara��o.
	 */
	public static Resultado compararDiretorios(String nomeDiretorio1,
			String nomeDiretorio2) {
		//ProgressMessager defaultProgressMessager = new ProgressMessager() {
		//	
		//	@Override
			//public void setMessage(String message) {
		//		System.out.println(message);
			//}
		//};
		
		return compararDiretorios(new File(nomeDiretorio1), new File(nomeDiretorio2));//, defaultProgressMessager);
	}
	
	/**
	 * Realiza a compara��o entre dois diret�rios. <br>
	 * Segue os seguintes passos: <br>
	 * <ol>
	 * 	<li>Organiza os arquivos contidos nos dois diret�rios como uma lista
	 * 		(incluindo os filhos recursivamente).
	 * 	</li>
	 * 	<li>
	 * 		Gera um c�digo hash MD5 com o conte�do de cada arquivo.</li>
	 * 	<li>
	 * 		Compara os hashs de cada um dos arquivos de cada diret�rio e marca os
	 * 		que s�o identicos com o valor 100 em uma matriz de equival�ncia
	 * 	</li>
	 * 	<li>
	 * 		Monta uma matriz com o percentual de igualdade calculado pelo LCS
	 * 		entre os arquivos que n�o se mostraram id�nticos no passo anterior.
	 * 	</li>
	 * 	<li>
	 * 		Calcula atrav�s do algoritmo H�ngaro quais s�o os matches mais
	 * 		pr�ximos entre os itens da matriz anterior
	 * 	</li>
	 * 	<li>
	 * 		Devolve os valores para a matriz de equival�ncia
	 * 	</li>
	 * 	<li>
	 * 		Analisa a matriz de equival�ncia e de acordo com ela popula a classe Delta
	 * 	</li>
	 * </ol>
	 * 
	 * @param diretorio1
	 *            - Diret�rio 1
	 * @param diretorio2
	 *            - Diret�rio 2
	 * @param progressMessager Messager of progress
	 * 
	 * @return Resultado da compara��o.
	 */
	public static Resultado compararDiretorios(File diretorio1, File diretorio2){//, ProgressMessager progressMessager) {
		return new DiretorioDiff().compararDiretoriosInterno(diretorio1, diretorio2);
//       		return new DiretorioDiff(progressMessager).compararDiretoriosInterno(diretorio1, diretorio2);
}
	
	private Resultado compararDiretoriosInterno(File diretorio1, File diretorio2) {
		resultado = new Resultado();
		iteracao = 0;
		
		try {
		//	progressMessager.setMessage("Loading directories.");
			
			serializarDiretorios(diretorio1, diretorio2);

			//progressMessager.setMessage("Searching same files.");
			
			buscaArquivosIdenticos();
			
			//progressMessager.setMessage("Searching deleted and added files.");
			
			marcarArquivosInclassificaveis();

			while (canProcurarMatch()) {
				iteracao++;
				iteracaoHungaroILCS();
				break;
			}
		} catch (DiretorioDiffException e) {
			System.out.println("Erro: " + e.getMessage());
		}

		return resultado;
	}

	private void marcarArquivosInclassificaveis() {
		for (Arquivo arquivo : dirSerializado1.getArquivosSemMatch()) {
			if (!arquivo.isArquivo() || !arquivo.isText()) {
				resultado.addDeletado(arquivo);
				arquivo.setMatch(true);
			}
		}
		
		for (Arquivo arquivo : dirSerializado2.getArquivosSemMatch()) {
			if (!arquivo.isArquivo() || !arquivo.isText()) {
				resultado.addAdicionado(arquivo);
				arquivo.setMatch(true);
			}
		}		
	}

	/**
	 * Calcula a similaridade entre todos os arquivos fazendo uso do ILCS em
	 * granularidade <code>LINHA</code>.<br>
	 * Ap�s isso entrega o resultado para o Hung�ro que escolhe o melhor
	 * conjunto de pares.
	 */
	private void iteracaoHungaroILCS() {
		List<Arquivo> arquivosSemMatch1 = dirSerializado1.getArquivosSemMatch();
		List<Arquivo> arquivosSemMatch2 = dirSerializado2.getArquivosSemMatch();

		int tamanhoHungaro = Math.max(arquivosSemMatch1.size(),
				arquivosSemMatch2.size());

		boolean[] adicionados = Util.criarArray(tamanhoHungaro, true);

		int[][] matrizILCS = new int[tamanhoHungaro][tamanhoHungaro];
		Util.atribuir(matrizILCS, 0);

		//progressMessager.setMessage("Find similarity of files.");
		
		for (int i = 0; i < arquivosSemMatch1.size(); i++) {
			Arquivo base = arquivosSemMatch1.get(i);

			boolean baseExcluido = true;

			for (int j = 0; j < arquivosSemMatch2.size(); j++) {
				Arquivo comparado = arquivosSemMatch2.get(j);
				File fileBase = base.getArquivo();
				File fileComparado = comparado.getArquivo();
				
				List<Grain> grainsTo = new ArrayList<Grain>();
				List<Grain> grainsFrom = new ArrayList<Grain>();
				
				Grain baseGrain = new FileGrain();
				Diff diff = new Diff(fileBase, fileComparado);
				try {
					ILCSBean iLCSBean = new ILCSBean(fileBase, fileComparado);
					iLCSBean.setGranularity("LINE");
					IResultDiff compare = diff.compare(baseGrain, iLCSBean);
				
					grainsTo.addAll(compare.getGrainsTo());
					grainsFrom.addAll(compare.getGrainsFrom());
				
					compare.cleanResult();
				} catch (DiffException e) {
				}
				
				int qtdeCharsIguais = 0;
				for (Grain grain : grainsTo) {
					String line = grain.getGrain();
				
					for (int i1 = 0; i1 < line.length(); i1++) {
						if (line.charAt(i1) != ' ') {
							qtdeCharsIguais++;
						}
					}
				}
				
				int similaridade1 = qtdeCharsIguais * 100 / base
				                 .getTamanhoAtual();
				
				if (similaridade1 == 100) {
					similaridade1 = qtdeCharsIguais * 100 / comparado
				                         .getTamanhoAtual();
				}

				//progressMessager.setMessage("Comparing '" + base.getArquivo().getName() + "' and '" + comparado.getArquivo().getName() + "'.");
				
				int similaridade = similaridade1;

				matrizILCS[i][j] = similaridade;

				if (similaridade > 0) {
					adicionados[j] = false;
					baseExcluido = false;
					resultado.add(base, comparado, similaridade, grainsTo, grainsFrom);
				}
			}

			if (baseExcluido) {
				base.setMatch(true);
				resultado.addDeletado(base);
			}
		}

		// Verifica quais arquivos foram adicionados
		if (isPrimeiraIteracao()) {
			for (int i = 0; i < arquivosSemMatch2.size(); i++) {
                                if (adicionados[i]) {<commit_msg>Ajuste em erro no calculo de similaridade<commit_after>package diretorioDiff;

import java.io.File;
import java.util.ArrayList;
import java.util.List;

import algorithms.Diff;
import algorithms.DiffException;
import algorithms.FileGrain;
import algorithms.Grain;
import algorithms.ILCSBean;
import algorithms.IResultDiff;
import diretorioDiff.resultados.Resultado;

/**
 * Realiza diff de diret�rios.
 * 
 * @author Eraldo
 * 
 */
public class DiretorioDiff {

	/**
	 * Diret�rio serializado 1
	 */
	private DiretorioSerializado dirSerializado1 = null;

	/**
	 * Diret�rio serializado 2
	 */
	private DiretorioSerializado dirSerializado2 = null;

	private Resultado resultado;

	private int iteracao;

	//private final ProgressMessager progressMessager;


	public DiretorioDiff(){//ProgressMessager progressMessager) {
		//this.progressMessager = progressMessager;
	}

	/**
	 * Realiza a compara��o entre dois diret�rios. <br>
	 * Segue os seguintes passos: <br>
	 * <ol>
	 * 	<li>Organiza os arquivos contidos nos dois diret�rios como uma lista
	 * 		(incluindo os filhos recursivamente).
	 * 	</li>
	 * 	<li>
	 * 		Gera um c�digo hash MD5 com o conte�do de cada arquivo.</li>
	 * 	<li>
	 * 		Compara os hashs de cada um dos arquivos de cada diret�rio e marca os
	 * 		que s�o identicos com o valor 100 em uma matriz de equival�ncia
	 * 	</li>
	 * 	<li>
	 * 		Monta uma matriz com o percentual de igualdade calculado pelo LCS
	 * 		entre os arquivos que n�o se mostraram id�nticos no passo anterior.
	 * 	</li>
	 * 	<li>
	 * 		Calcula atrav�s do algoritmo H�ngaro quais s�o os matches mais
	 * 		pr�ximos entre os itens da matriz anterior
	 * 	</li>
	 * 	<li>
	 * 		Devolve os valores para a matriz de equival�ncia
	 * 	</li>
	 * 	<li>
	 * 		Analisa a matriz de equival�ncia e de acordo com ela popula a classe Delta
	 * 	</li>
	 * </ol>
	 * 
	 * @param nomeDiretorio1 Nome do diret�rio 1
	 * @param nomeDiretorio2 Nome do diret�tio 2
	 * 
	 * @return Resultado da compara��o.
	 */
	public static Resultado compararDiretorios(String nomeDiretorio1,
			String nomeDiretorio2) {
		//ProgressMessager defaultProgressMessager = new ProgressMessager() {
		//	
		//	@Override
			//public void setMessage(String message) {
		//		System.out.println(message);
			//}
		//};
		
		return compararDiretorios(new File(nomeDiretorio1), new File(nomeDiretorio2));//, defaultProgressMessager);
	}
	
	/**
	 * Realiza a compara��o entre dois diret�rios. <br>
	 * Segue os seguintes passos: <br>
	 * <ol>
	 * 	<li>Organiza os arquivos contidos nos dois diret�rios como uma lista
	 * 		(incluindo os filhos recursivamente).
	 * 	</li>
	 * 	<li>
	 * 		Gera um c�digo hash MD5 com o conte�do de cada arquivo.</li>
	 * 	<li>
	 * 		Compara os hashs de cada um dos arquivos de cada diret�rio e marca os
	 * 		que s�o identicos com o valor 100 em uma matriz de equival�ncia
	 * 	</li>
	 * 	<li>
	 * 		Monta uma matriz com o percentual de igualdade calculado pelo LCS
	 * 		entre os arquivos que n�o se mostraram id�nticos no passo anterior.
	 * 	</li>
	 * 	<li>
	 * 		Calcula atrav�s do algoritmo H�ngaro quais s�o os matches mais
	 * 		pr�ximos entre os itens da matriz anterior
	 * 	</li>
	 * 	<li>
	 * 		Devolve os valores para a matriz de equival�ncia
	 * 	</li>
	 * 	<li>
	 * 		Analisa a matriz de equival�ncia e de acordo com ela popula a classe Delta
	 * 	</li>
	 * </ol>
	 * 
	 * @param diretorio1
	 *            - Diret�rio 1
	 * @param diretorio2
	 *            - Diret�rio 2
	 * @param progressMessager Messager of progress
	 * 
	 * @return Resultado da compara��o.
	 */
	public static Resultado compararDiretorios(File diretorio1, File diretorio2){//, ProgressMessager progressMessager) {
		return new DiretorioDiff().compararDiretoriosInterno(diretorio1, diretorio2);
//       		return new DiretorioDiff(progressMessager).compararDiretoriosInterno(diretorio1, diretorio2);
}
	
	private Resultado compararDiretoriosInterno(File diretorio1, File diretorio2) {
		resultado = new Resultado();
		iteracao = 0;
		
		try {
		//	progressMessager.setMessage("Loading directories.");
			
			serializarDiretorios(diretorio1, diretorio2);

			//progressMessager.setMessage("Searching same files.");
			
			buscaArquivosIdenticos();
			
			//progressMessager.setMessage("Searching deleted and added files.");
			
			marcarArquivosInclassificaveis();

			while (canProcurarMatch()) {
				iteracao++;
				iteracaoHungaroILCS();
				break;
			}
		} catch (DiretorioDiffException e) {
			System.out.println("Erro: " + e.getMessage());
		}

		return resultado;
	}

	private void marcarArquivosInclassificaveis() {
		for (Arquivo arquivo : dirSerializado1.getArquivosSemMatch()) {
			if (!arquivo.isArquivo() || !arquivo.isText()) {
				resultado.addDeletado(arquivo);
				arquivo.setMatch(true);
			}
		}
		
		for (Arquivo arquivo : dirSerializado2.getArquivosSemMatch()) {
			if (!arquivo.isArquivo() || !arquivo.isText()) {
				resultado.addAdicionado(arquivo);
				arquivo.setMatch(true);
			}
		}		
	}

	/**
	 * Calcula a similaridade entre todos os arquivos fazendo uso do ILCS em
	 * granularidade <code>LINHA</code>.<br>
	 * Ap�s isso entrega o resultado para o Hung�ro que escolhe o melhor
	 * conjunto de pares.
	 */
	private void iteracaoHungaroILCS() {
		List<Arquivo> arquivosSemMatch1 = dirSerializado1.getArquivosSemMatch();
		List<Arquivo> arquivosSemMatch2 = dirSerializado2.getArquivosSemMatch();

		int tamanhoHungaro = Math.max(arquivosSemMatch1.size(),
				arquivosSemMatch2.size());

		boolean[] adicionados = Util.criarArray(tamanhoHungaro, true);

		int[][] matrizILCS = new int[tamanhoHungaro][tamanhoHungaro];
		Util.atribuir(matrizILCS, 0);

		//progressMessager.setMessage("Find similarity of files.");
		
		for (int i = 0; i < arquivosSemMatch1.size(); i++) {
			Arquivo base = arquivosSemMatch1.get(i);

			boolean baseExcluido = true;

			for (int j = 0; j < arquivosSemMatch2.size(); j++) {
				Arquivo comparado = arquivosSemMatch2.get(j);
				File fileBase = base.getArquivo();
				File fileComparado = comparado.getArquivo();
				
				List<Grain> grainsTo = new ArrayList<Grain>();
				List<Grain> grainsFrom = new ArrayList<Grain>();
				
				Grain baseGrain = new FileGrain();
				Diff diff = new Diff(fileBase, fileComparado);
				try {
					ILCSBean iLCSBean = new ILCSBean(fileBase, fileComparado);
					iLCSBean.setGranularity("LINE");
					IResultDiff compare = diff.compare(baseGrain, iLCSBean);
				
					grainsTo.addAll(compare.getGrainsTo());
					grainsFrom.addAll(compare.getGrainsFrom());
				
					compare.cleanResult();
				} catch (DiffException e) {
				}
				
				int qtdeCharsIguais = 0;
				for (Grain grain : grainsTo) {
					String line = grain.getGrain();
				
					for (int i1 = 0; i1 < line.length(); i1++) {
						if (line.charAt(i1) != ' ') {
							qtdeCharsIguais++;
						}
					}
				}
				
                                int similaridade = 0;
                                
                                if (base.getTamanhoAtual() > 0) {
                                    similaridade = qtdeCharsIguais * 100 / base.getTamanhoAtual();
				}
                                
				if (similaridade == 100 && comparado.getTamanhoAtual() > 0) {
					similaridade = qtdeCharsIguais * 100 / comparado
				                         .getTamanhoAtual();
				}

				//progressMessager.setMessage("Comparing '" + base.getArquivo().getName() + "' and '" + comparado.getArquivo().getName() + "'.");
				
				matrizILCS[i][j] = similaridade;

				if (similaridade > 0) {
					adicionados[j] = false;
					baseExcluido = false;
					resultado.add(base, comparado, similaridade, grainsTo, grainsFrom);
				}
			}

			if (baseExcluido) {
				base.setMatch(true);
				resultado.addDeletado(base);
			}
		}

		// Verifica quais arquivos foram adicionados
		if (isPrimeiraIteracao()) {
			for (int i = 0; i < arquivosSemMatch2.size(); i++) {
                                if (adicionados[i]) {
{'fraction_non_alphanumeric': 0.11318822023047376, 'fraction_numerical': 0.009154929577464789, 'mean_word_length': 3.0785900783289817, 'pattern_counts': {'":': 0, '<': 101, '<?xml version=': 0, '>': 97, 'https://': 0, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 5, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'dir': 'git-commits-cleaned', 'id': '666997', 'n_tokens_mistral': 6415, 'n_tokens_neox': 5504, 'n_words': 1333}