package eu.jucy.op;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.concurrent.CopyOnWriteArrayList;
import logger.LoggerFactory;
import org.apache.log4j.Logger;
import eu.jucy.adlsearch.ADLFileListFile;
import eu.jucy.op.CounterFactory.WorkingCounter;
import eu.jucy.op.ui.OpADLFieldEditor;
import uc.DCClient;
import uc.IHub;
import uc.IUser;
import uc.files.filelist.FileList;
import uc.files.filelist.FileListFile;
import uc.files.filelist.IFilelistProcessor;
public class OpADLProcessor implements IFilelistProcessor {
private static final Logger logger = LoggerFactory.make();
private final List<CounterFactory> allCounters = new CopyOnWriteArrayList<CounterFactory>();
private final List<OpADLEntry> entries = new CopyOnWriteArrayList<OpADLEntry>();
public OpADLProcessor() {
refresh();
}
private void refresh() {
allCounters.clear();
allCounters.addAll(OPI.getCounterFactories());
entries.clear();
entries.addAll(OpADLFieldEditor.LoadOPADLFromString(OPI.get(OPI.opADLEntries)));
}
/*
* (non-Javadoc)
* @see UC.files.filelist.IFilelistProcessor#processFilelist(UC.files.filelist.FileList, boolean)
*/
public void processFilelist(final FileList fileList, boolean onDownload) {
if (onDownload) {
IUser usr = fileList.getUsr();
final IHub hub = usr.getHub();
if (hub != null && Activator.getOPPlugin().isInCheck(usr)) {
String check = hub.getFavHub().get(OPI.fh_checkUsers);
if (Boolean.parseBoolean(check)) {
DCClient.execute(new Runnable() {
public void run() {
checkFilelist(fileList, hub);
}
});
}
}
}
}
private void checkFilelist(FileList filelist,IHub hub) {
logger.info("start checking filelist of: "+filelist.getUsr().getNick());
List<WorkingCounter> counters = CounterFactory.getWorkingCounter(allCounters, filelist.getUsr());
Map<String,WorkingCounter> counterByName = new HashMap<String,WorkingCounter>();
for (WorkingCounter c: counters) {
counterByName.put(c.getName(), c);
}
boolean stopchecking = false;
out: for (FileListFile f: filelist.getRoot()) {
if (f.getClass().equals(ADLFileListFile.class)) { //don't check files added by ADLsearch
continue;
}
boolean matched = false;
for (OpADLEntry adl: entries) {
if (adl.matches(f)) {
matched = true;
boolean breakExec = adl.execute(f,counterByName,hub);
if (breakExec) {
stopchecking = true;
break out;
}
}
}
if (matched) { //Check the per file counter if they want to finish checking..
for (WorkingCounter c: counters) {
boolean breakExec = c.fileFinished();
if (breakExec) {
stopchecking = true;
break out;
}
}
}
}
for (OpADLEntry adl: entries) {
adl.finishedSearch();
}
if (!stopchecking) {
for (WorkingCounter c : counters) {
c.evaluate();
}
}
Activator.getOPPlugin().checkedUser(filelist.getUsr());
}
}