package application;
import java.io.File;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.List;
import persistense.FileHandler;
import view.ProgressWindow;
public class Renamer {
private File sourceFile;
private File destinationFile;
private RenameType type;
private ProgressWindow progressWindow;
private boolean frame;
private boolean debug;
/**
* Construtor padr�o com tr�s par�metros da classe Renamer
* @param sourceFile
* @param destinationFile
* @param type
*/
public Renamer(File sourceFile, File destinationFile, RenameType type, boolean frame, boolean debug) {
super();
this.sourceFile = sourceFile;
this.destinationFile = destinationFile;
this.type = type;
this.frame = frame;
this.debug = debug;
if(debug){
System.out.println("Objeto Renamer instanciado. Debug ligado.");
}
FileHandler.setDebug(debug);
}
/**
* M�todo para iniciar o processo de renomeamento em batch
* @return verdadeiro caso n�o tenha acontecido erro algum durante o processo
*/
public boolean batch(){
if(debug){
System.out.println("Iniciando o processamento. Mostrar janela de progresso = "+frame);
}
boolean sourceIsDirectory = sourceFile.isDirectory();
if(debug){
System.out.println("Destino � diret�rio: "+sourceIsDirectory);
}
//Lista de arquivos que devem passar pelo processo de renomea��o
List<File> fileList = new ArrayList<File>();
if(sourceIsDirectory){
fileList = FileHandler.getFileListInDirectory(sourceFile);
}else{
fileList.add(sourceFile);
}
if(frame){
progressWindow = new ProgressWindow(fileList.size(), type);
}
if(debug){
System.out.println("Tamanho da lista de arquivos a serem renomeados: "+fileList.size());
System.out.println("Listagem de arquivos: ");
for(File file : fileList){
System.out.println(file.getAbsolutePath());
}
}
boolean renamingSucess = true;
int renamedImages = 0;
for(File file : fileList){
FileHandler.copyFileTo(file, destinationFile);
String newFileName = rename(file, type);
boolean renamed = FileHandler.renameTo(newFileName, file, destinationFile);
renamedImages++;
renamingSucess = renamingSucess && renamed;
if(debug){
System.out.println("Renomenando o arquivo para "+newFileName+" (N� "+renamedImages+". Sucesso = "+renamed);
}
if(frame){
if(progressWindow != null){
progressWindow.updateValues(renamedImages);
}
}
}
return renamingSucess;
}
/**
* Retorna o nome modificado do arquivo, em formato String, de acordo com o tipo de renomea��o passado
*
* @param file
* @param type
* @return retorna o nome modificado do arquivo, em formato String, de acordo com o tipo de renomea��o passado
*/
public String rename(File file, RenameType type){
switch(type){
case HASH:
return hashRename(file);
case NameHASH:
return nameHashRename(file);
case NameAndTimestamp:
return nameAndTimestampRename(file);
case ImageBoarder:
return imageBoarderRename(file);
}
return "";
}
/**
* Gera o hash code do objeto file passado e o retorna no formato de String.
*
* @param file
* @return hashCode do objeto em formato String
*/
public String hashRename(File file){
int hashCode = file.hashCode();
return String.valueOf(hashCode);
}
/**
* Gera o hash code do nome do objeto file passado e o retorna no formato de String.
*
* @param file
* @return hashCode do nome do objeto em formato String
*/
public String nameHashRename(File file){
int hashCode = file.getName().hashCode();
return String.valueOf(hashCode);
}
/**
* Retorna o nome do objeto mais o current time in milis.
*
* @param file
* @return nome do objeto mais o current time in milis
*/
public String nameAndTimestampRename(File file){
String newName = file.getName()+"_"+Calendar.getInstance().getTimeInMillis();
return newName;
}
/**
* Procedimento para obter nomes similares aos de arquivos compartilhados em imageBoarders
*
* 1- Buscar o m�dulo do hashcode do nome do arquivo.
* 2- Pegar o tempo atual em milissegundos e buscar os tr�s �ltimos d�gitos
* 3- Concatenar os dois passos anteriores colocando um 1 na frente
*
* @param file
* @return 1 + modulo(Hashcode) + (3 ultimos d�gitos do tempo atual em milissegundos)
*/
public String imageBoarderRename(File file){
int hashCode = file.getName().hashCode();
hashCode = Math.abs(hashCode);
hashCode = (int) hashCode / Integer.parseInt(String.valueOf(String.valueOf(hashCode).charAt(0)));
String timeInMillis = String.valueOf(Calendar.getInstance().getTimeInMillis());
String lastThreeDigits = timeInMillis.substring(timeInMillis.length()-4);
return "1"+String.valueOf(hashCode)+lastThreeDigits;
}
}