/**
*
*/
package tml.storage;
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.TimerTask;
import org.apache.log4j.Logger;
import org.apache.lucene.index.CorruptIndexException;
import org.apache.lucene.store.LockObtainFailedException;
import tml.storage.Repository;
import tml.storage.RepositoryEvent;
import tml.storage.RepositoryListener;
/**
* @author Jorge Villalon
*
*/
public class TmlIndexerTask extends TimerTask {
private static Logger logger = Logger.getLogger(TmlIndexerTask.class);
private Repository repository;
private String uploadFolder;
public String getUploadFolder() {
return uploadFolder;
}
public void setUploadFolder(String uploadFolder) {
this.uploadFolder = uploadFolder;
}
public int getMaxFilesToProcess() {
return maxFilesToProcess;
}
public void setMaxFilesToProcess(int maxFilesToProcess) {
this.maxFilesToProcess = maxFilesToProcess;
}
private int maxFilesToProcess = 1;
/**
*
*/
public TmlIndexerTask(Repository repo) {
this.repository = repo;
}
/* (non-Javadoc)
* @see java.util.TimerTask#run()
*/
@Override
public void run() {
File lock = new File("tml.indexer.lock");
if (lock.exists()) {
logger.debug("Timer still running! Skipping execution.");
}
try {
lock.createNewFile();
} catch (IOException e) {
e.printStackTrace();
logger.error("Couldn't create indexer lock file");
return;
}
List<File> filesToProcess = getFilesToProcess();
if (filesToProcess.size() > 0) {
RepositoryListener listener = new RepositoryListener() {
@Override
public void repositoryAction(RepositoryEvent evt) {
//logger.debug(evt.getAction() + " " + evt.getCurrent() + " of " + evt.getMaximum());
}
};
repository.addRepositoryListener(listener);
for (File processed : filesToProcess) {
File newFile = new File(
this.uploadFolder + "/"
+ processed.getName());
boolean success = processed.renameTo(newFile);
if(!success) {
logger.debug("Couldn't move file " + processed + " to processing foler. Skipping.");
continue;
}
File[] fileList = new File[1];
fileList[0] = newFile;
try {
repository.addDocumentsInList(fileList);
} catch (LockObtainFailedException e) {
e.printStackTrace();
logger.error(e.getMessage());
newFile.renameTo(processed);
continue;
} catch (CorruptIndexException e) {
e.printStackTrace();
logger.error(e.getMessage());
newFile.renameTo(processed);
continue;
} catch (IOException e) {
e.printStackTrace();
logger.error(e.getMessage());
newFile.renameTo(processed);
continue;
}
logger.debug("File " + newFile + " added to the repository!");
processed = new File(
repository.getProcessedPath() + "/"
+ newFile.getName());
success = newFile.renameTo(processed);
int count = 0;
while(!success) {
count++;
try {
logger.debug("Waiting for IO");
Thread.sleep(500);
} catch (InterruptedException e) {
e.printStackTrace();
}
success = newFile.renameTo(processed);
if(count >= 10)
break;
}
if (!success) {
logger.error("Couldn't move " + newFile + " to processed folder! Trying to delete "
+ newFile);
if (!newFile.delete()) {
logger.error("Couldn't DELETE indexed file! " + newFile);
}
}
}
logger.info("Indexer found "
+ filesToProcess.size()
+ " documents that were successfully processed.");
repository.removeRepositoryListener(listener);
} else {
logger.debug("No files to index, back to sleep.");
}
lock.delete();
}
private List<File> getFilesToProcess() {
ArrayList<File> filesToProcess = new ArrayList<File>();
File uploadedFilesFolder = new File(this.uploadFolder);
if(!uploadedFilesFolder.exists()) {
logger.error("Upload folder doesn't exist for TML");
return filesToProcess;
}
for (File upload : uploadedFilesFolder.listFiles()) {
if (upload.isDirectory())
continue;
if (upload.getName().endsWith(".txt")) {
filesToProcess.add(upload);
if(filesToProcess.size() >= this.maxFilesToProcess) {
return filesToProcess;
}
}
}
return filesToProcess;
}
}