/* SignalChecksumWorker.java created 2007-10-17
*
*/
package org.signalml.app.worker.signal;
import java.util.List;
import javax.swing.SwingWorker;
import org.apache.log4j.Logger;
import org.signalml.app.document.signal.SignalChecksumProgressMonitor;
import org.signalml.app.document.signal.SignalDocument;
import org.signalml.app.view.common.dialogs.PleaseWaitDialog;
import org.signalml.domain.signal.SignalChecksum;
/** SignalChecksumWorker
*
*
* @author Michal Dobaczewski © 2007-2008 CC Otwarte Systemy Komputerowe Sp. z o.o.
*/
public class SignalChecksumWorker extends SwingWorker<SignalChecksum[],Long> implements SignalChecksumProgressMonitor {
protected static final Logger logger = Logger.getLogger(SignalChecksumWorker.class);
private static final int LOWER_PRIORITY = Thread.MIN_PRIORITY;
private SignalDocument signalDocument;
private PleaseWaitDialog pleaseWaitDialog;
private String[] methods;
private boolean lowerPriority = false;
private Thread backgroundThread = null;
private volatile long bytesProcessed = 0;
public SignalChecksumWorker(SignalDocument signalDocument, PleaseWaitDialog pleaseWaitDialog, String[] methods) {
this.signalDocument = signalDocument;
this.pleaseWaitDialog = pleaseWaitDialog;
this.methods = methods;
}
@Override
protected SignalChecksum[] doInBackground() throws Exception {
logger.debug("Checksumming document [" + signalDocument.toString() + "]");
synchronized (this) {
backgroundThread = Thread.currentThread();
if (lowerPriority) {
backgroundThread.setPriority(LOWER_PRIORITY);
logger.debug("Priority lowered for (dIB) [" + signalDocument.toString() + "]");
}
}
SignalChecksum[] checksums = signalDocument.getChecksums(methods, this);
logger.debug("Checksumming document [" + signalDocument.toString() + "] done");
return checksums;
}
public void lowerPriority() {
synchronized (this) {
if (backgroundThread != null) {
backgroundThread.setPriority(LOWER_PRIORITY);
logger.debug("Priority lowered for [" + signalDocument.toString() + "]");
}
lowerPriority = true;
}
}
public void normalPriority() {
synchronized (this) {
if (backgroundThread != null) {
backgroundThread.setPriority(Thread.NORM_PRIORITY);
logger.debug("Priority restored for [" + signalDocument.toString() + "]");
}
lowerPriority = false;
}
}
public boolean isLowerPriority() {
synchronized (this) {
return lowerPriority;
}
}
public long getBytesProcessed() {
return bytesProcessed;
}
public void setBytesProcessed(long bytesProceeded) {
if (this.bytesProcessed != bytesProceeded) {
this.bytesProcessed = bytesProceeded;
publish(bytesProceeded);
}
}
public PleaseWaitDialog getPleaseWaitDialog() {
synchronized (pleaseWaitDialog) {
return pleaseWaitDialog;
}
}
public void setPleaseWaitDialog(PleaseWaitDialog pleaseWaitDialog) {
if (this.pleaseWaitDialog != null) {
synchronized (this.pleaseWaitDialog) {
this.pleaseWaitDialog = pleaseWaitDialog;
}
} else {
this.pleaseWaitDialog = pleaseWaitDialog;
}
logger.debug("Please wait dialog set for [" + signalDocument.toString() + "]");
}
@Override
protected void done() {
if (pleaseWaitDialog != null) {
synchronized (pleaseWaitDialog) {
logger.debug("Releasing please wait dialog set for [" + signalDocument.toString() + "]");
pleaseWaitDialog.releaseIfOwnedBy(this);
}
}
}
@Override
protected void process(List<Long> chunks) {
if (pleaseWaitDialog != null && !chunks.isEmpty()) {
synchronized (pleaseWaitDialog) {
pleaseWaitDialog.setProgress((int)((long) chunks.get(0)));
}
}
}
}