package delegate;
import java.util.concurrent.ExecutionException;
import model.PasswordCracker;
import org.apache.log4j.Logger;
public class BruteforceWorker extends CrackingTask {
private final ProgressDisplay display;
private final String key3Path;
private final PasswordCracker[] cracker = new PasswordCracker[PasswordCracker.MAX_WORDLENGTH];
private final Thread[] threads = new Thread[PasswordCracker.MAX_WORDLENGTH];
private String result;
private final static Logger logger = Logger
.getLogger(BruteforceWorker.class);
public BruteforceWorker(ProgressDisplay display, String key3Path) {
this.display = display;
this.key3Path = key3Path;
}
@Override
protected String doInBackground() throws Exception {
for (int i = 1; i <= PasswordCracker.MAX_WORDLENGTH; i++) {
final int index = i - 1;
threads[index] = new Thread() {
@Override
public void run() {
cracker[index] = new PasswordCracker(key3Path, display);
String pass = cracker[index]
.recoverByBruteforcing(index + 1);
if (pass != null) {
BruteforceWorker.this.result = pass;
BruteforceWorker.this.stop();
}
}
};
threads[index].start();
}
for (int i = 0; i < PasswordCracker.MAX_WORDLENGTH; i++) {
threads[i].join();
logger.info("thread " + i + " joined");
}
return result;
}
@Override
protected void done() {
try {
display.setResult(get());
} catch (InterruptedException | ExecutionException e) {
logger.warn(e.getMessage());
}
}
@Override
public void stop() {
for (int i = 0; i < PasswordCracker.MAX_WORDLENGTH; i++) {
cracker[i].setRunning(false);
}
}
}