/*
* This file is part of the OSMembrane project.
* More informations under www.osmembrane.de
*
* The project is licensed under the GNU GENERAL PUBLIC LICENSE 3.0.
* for more details about the license see http://www.osmembrane.de/license/
*
* Source: $HeadURL$ ($Revision$)
* Last changed: $Date$
*/
package de.osmembrane.model.persistence;
import java.util.Observable;
import java.util.Observer;
import java.util.concurrent.Semaphore;
import de.osmembrane.Application;
import de.osmembrane.exceptions.ControlledException;
import de.osmembrane.exceptions.ExceptionSeverity;
import de.osmembrane.model.pipeline.AbstractPipeline;
import de.osmembrane.model.pipeline.PipelineObserverObject;
import de.osmembrane.resources.Constants;
import de.osmembrane.tools.I18N;
/**
* Pipeline backup service on a separate background thread;
*
* @author igor_podolskiy, jakob_jarosch
*
*/
public class PipelineBackup implements Observer {
private Semaphore backupAvailable = new Semaphore(0);
private AbstractPipeline pipelineToBackup;
/**
* Internal autosave thread used for backing up the pipeline.
*/
private Thread autosaveThread = new Thread() {
/* anonymous class' constructor */
{
setDaemon(true);
setName("OSMembrane Backup Thread");
}
@Override
public void run() {
while (!isInterrupted()) {
try {
backupAvailable.acquire();
backupAvailable.drainPermits();
pipelineToBackup.backupPipeline();
} catch (InterruptedException e) {
interrupt();
} catch (FileException e) {
/* forward the exception to the view */
Application.handleException(new ControlledException(this,
ExceptionSeverity.WARNING, e, I18N.getInstance()
.getString(
"Exception.AutosavePipelineFailed",
Constants.DEFAULT_BACKUP_FILE)));
}
}
}
};
@Override
public synchronized void update(Observable o, Object arg) {
if (arg instanceof PipelineObserverObject) {
this.pipelineToBackup = ((PipelineObserverObject) arg)
.getPipeline();
this.backupAvailable.release();
}
}
/**
* Starts the background backup handler.
*/
public void start() {
autosaveThread.start();
}
/**
* Stops the background backup handler.
*/
public void stop() {
autosaveThread.interrupt();
}
}