package mj.ocraptor.file_handler;
import java.io.File;
import java.util.concurrent.ThreadFactory;
import mj.ocraptor.MainController;
import mj.ocraptor.MainController.Status;
import mj.ocraptor.configuration.Config;
import mj.ocraptor.configuration.properties.ConfigBool;
import mj.ocraptor.database.DBManager;
import mj.ocraptor.events.EventManager;
import mj.ocraptor.file_handler.events.FileHandler;
public class TextExtractor extends FileHandler {
private DBManager indexDB;
private PausableExecutor executor;
private boolean countFiles;
private long fileCount;
private File currentDir;
/**
*
*/
public TextExtractor(DBManager db, PausableExecutor executor) {
this.indexDB = db;
this.executor = executor;
this.currentDir = new File(Config.inst().getDirectoryToIndex())
.getAbsoluteFile();
}
/**
* @param countFiles
* the countFiles to set
*/
public void setCountFiles(boolean countFiles) {
this.countFiles = countFiles;
}
/**
* @return the fileCount
*/
public long getFileCount() {
return fileCount;
}
/**
*
*
*/
public void countFilesOnly() {
this.countFiles = true;
}
/**
*
*
*/
public void stopCounting() {
this.countFiles = false;
}
/**
* @param dir
*/
@Override
public void handleDir(File dir) {
//
}
/**
*
*/
public class WorkerThreadFactory implements ThreadFactory {
private int counter = 0;
private String prefix = "";
public WorkerThreadFactory(String prefix) {
this.prefix = prefix;
}
public Thread newThread(Runnable r) {
return new Thread(r, prefix + "-" + counter++);
}
}
/**
* @param file
*/
@Override
public void handleFile(File file) {
final MainController controller = MainController.inst();
while (!Thread.currentThread().isInterrupted() && controller.getStatus() == Status.PAUSED) {
try {
Thread.sleep(200);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
if (controller.getStatus() == Status.STOPPED || controller.getStatus() == Status.INDEXING_FINISHED)
return;
if (file != null && file.exists()) {
boolean isHidden = !Config.inst().getProp(
ConfigBool.INDEX_HIDDEN_FILES_AND_FOLDERS);
if (isHidden) {
isHidden = file.isHidden();
if (!isHidden) {
File parent = file.getParentFile();
while (parent != null && !isHidden) {
if (parent.isHidden()) {
isHidden = true;
}
if (parent.getAbsoluteFile().equals(this.currentDir)) {
parent = null;
} else {
parent = parent.getParentFile();
}
}
}
}
if (!isHidden && !file.getParent().startsWith(indexDB.getDatabaseDir())) {
if (countFiles) {
EventManager.instance().countingFiles(++this.fileCount, false);
} else {
try {
Runnable worker = new TextExtractorThread(indexDB, file);
this.executor.execute(worker);
} catch (RuntimeException e) {
// TODO: logging
// e.printStackTrace();
}
}
}
}
}
}