/*
* Copyright (c) 2001 - 2012 TOPP - www.openplans.org. All rights reserved.
* This code is licensed under the GPL 2.0 license, availible at the root
* application directory.
*/
package org.geoserver.bkprst;
import it.geosolutions.tools.io.file.Collector;
import java.io.File;
import java.io.FileNotFoundException;
import java.util.Date;
import java.util.logging.Logger;
import org.apache.commons.io.FileUtils;
import org.apache.commons.io.filefilter.IOFileFilter;
import org.geotools.util.logging.Logging;
/**
* Class implementing a basic transanction management for BackupTask
*
* @author Luca Morandini lmorandini@ieee.org
*
*/
public class RestoreTransaction extends BrTransaction {
private final static Logger LOGGER = Logging.getLogger(RestoreTransaction.class.toString());
RestoreTransaction(RestoreTask task, File srcMount, File trgMount, IOFileFilter filter) {
super(task, srcMount, trgMount, filter);
}
/**
* Starts the restore
*/
public synchronized void start() throws Exception {
task.setStartTime(new Date());
task.setState(BrTaskState.STARTING);
task.lock();
LOGGER.info("Started restore " + task.id + " to " + task.path + " from "
+ srcMount.getAbsolutePath() + " to" + this.trgMount.getAbsolutePath());
// Puts in topFiles the top-level files of the target directoy using the filter
Collector topColl = new Collector(this.filter, 1);
this.topFiles = topColl.collect(this.trgMount);
// Renames selected top-level files (deletes files with the sane name
// if already present)
for (File file : this.topFiles) {
if (!file.equals(this.trgMount)) {
File renamedFile= new File(file.getAbsolutePath() + BrTask.BACKUPEXT);
try {
FileUtils.forceDelete(renamedFile);
} catch(FileNotFoundException e) {
}
file.renameTo(renamedFile);
}
}
}
/**
* Successfuly complete the restore
*/
public synchronized void commit() {
// Deletes selected top-level files who had their name changed
try {
for (File file : this.topFiles) {
if (!file.equals(this.trgMount)) {
File renamedFile= new File(file.getAbsolutePath() + BrTask.BACKUPEXT);
try {
FileUtils.forceDelete(renamedFile);
} catch(FileNotFoundException e) {
}
}
}
} catch (Exception e) {
LOGGER.severe(e.getMessage());
task.setState(BrTaskState.FAILED);
task.setEndTime(new Date());
LOGGER.info("Restore " + task.getId() + " rolled back");
task.unlock();
return;
}
task.setState(BrTaskState.COMPLETED);
task.setEndTime(new Date());
LOGGER.info("Restore " + task.getId() + " completed");
task.unlock();
}
/**
* Aborts the restore
*/
public synchronized void rollback() {
// Renames selected top-level files back the original name (deletes files with the sane name
// if present)
try {
for (File file : this.topFiles) {
if (!file.equals(this.trgMount)) {
File renamedFile= new File(file.getAbsolutePath() + BrTask.BACKUPEXT);
try {
FileUtils.forceDelete(file);
} catch(FileNotFoundException e) {
}
renamedFile.renameTo(file);
}
}
File xmlFile= new File(this.trgMount.getAbsolutePath() + File.separatorChar + BrTask.INFOFILE);
xmlFile.delete();
} catch (Exception e) {
LOGGER.severe(e.getMessage());
} finally {
task.setState(BrTaskState.FAILED);
task.setEndTime(new Date());
LOGGER.severe("Restore " + task.getId() + " failed");
task.unlock();
}
}
}