/* (c) 2016 Open Source Geospatial Foundation - all rights reserved
* This code is licensed under the GPL 2.0 license, available at the root
* application directory.
*/
package org.geoserver.backuprestore.listener;
import java.io.IOException;
import java.util.Arrays;
import java.util.List;
import java.util.Map.Entry;
import java.util.logging.Level;
import java.util.logging.Logger;
import org.geoserver.backuprestore.Backup;
import org.geoserver.backuprestore.BackupExecutionAdapter;
import org.geoserver.backuprestore.utils.BackupUtils;
import org.geoserver.platform.resource.Resource;
import org.geoserver.platform.resource.Resources;
import org.geotools.util.logging.Logging;
import org.opengis.filter.Filter;
import org.springframework.batch.core.BatchStatus;
import org.springframework.batch.core.JobExecution;
import org.springframework.batch.core.JobExecutionListener;
import org.springframework.batch.core.JobParameters;
import org.springframework.batch.core.launch.NoSuchJobExecutionException;
/**
* Implements a Spring Batch {@link JobExecutionListener}.
*
* It's used to perform operations accordingly to the {@link Backup} batch {@link JobExecution} status.
*
* @author Alessio Fabiani, GeoSolutions
*
*/
public class BackupJobExecutionListener implements JobExecutionListener {
/**
* logger
*/
private static final Logger LOGGER = Logging.getLogger(BackupJobExecutionListener.class);
private Backup backupFacade;
private BackupExecutionAdapter backupExecution;
public BackupJobExecutionListener(Backup backupFacade) {
this.backupFacade = backupFacade;
}
@Override
public void beforeJob(JobExecution jobExecution) {
if (backupFacade.getBackupExecutions().get(jobExecution.getId()) != null) {
this.backupExecution = backupFacade.getBackupExecutions().get(jobExecution.getId());
} else {
Long id = null;
BackupExecutionAdapter bkp = null;
for (Entry<Long, BackupExecutionAdapter> entry : backupFacade.getBackupExecutions()
.entrySet()) {
id = entry.getKey();
bkp = entry.getValue();
if (bkp.getJobParameters().getLong(Backup.PARAM_TIME)
.equals(jobExecution.getJobParameters().getLong(Backup.PARAM_TIME))) {
break;
} else {
id = null;
bkp = null;
}
}
if (bkp != null) {
Resource archiveFile = bkp.getArchiveFile();
boolean overwrite = bkp.isOverwrite();
List<String> options = bkp.getOptions();
Filter filter = bkp.getFilter();
this.backupFacade.getBackupExecutions().remove(id);
this.backupExecution = new BackupExecutionAdapter(jobExecution,
backupFacade.getTotalNumberOfBackupSteps());
this.backupExecution.setArchiveFile(archiveFile);
this.backupExecution.setOverwrite(overwrite);
this.backupExecution.setFilter(filter);
this.backupExecution.getOptions().addAll(options);
this.backupFacade.getBackupExecutions().put(jobExecution.getId(),
this.backupExecution);
}
}
}
@SuppressWarnings("unused")
@Override
public void afterJob(JobExecution jobExecution) {
boolean dryRun = Boolean.parseBoolean(
jobExecution.getJobParameters().getString(Backup.PARAM_DRY_RUN_MODE, "false"));
boolean bestEffort = Boolean.parseBoolean(
jobExecution.getJobParameters().getString(Backup.PARAM_BEST_EFFORT_MODE, "false"));
try {
final Long executionId = jobExecution.getId();
LOGGER.fine("Running Executions IDs : " + executionId);
if (jobExecution.getStatus() != BatchStatus.STOPPED) {
LOGGER.fine("Executions Step Summaries : "
+ backupFacade.getJobOperator().getStepExecutionSummaries(executionId));
LOGGER.fine("Executions Parameters : "
+ backupFacade.getJobOperator().getParameters(executionId));
LOGGER.fine("Executions Summary : "
+ backupFacade.getJobOperator().getSummary(executionId));
if (jobExecution.getStatus() == BatchStatus.COMPLETED) {
JobParameters jobParameters = backupExecution.getJobParameters();
Resource sourceFolder = Resources
.fromURL(jobParameters.getString(Backup.PARAM_OUTPUT_FILE_PATH));
BackupUtils.compressTo(sourceFolder, backupExecution.getArchiveFile());
// Cleanup Temporary Resources
String cleanUpTempFolders = jobParameters.getString(Backup.PARAM_CLEANUP_TEMP);
if (cleanUpTempFolders != null && Boolean.parseBoolean(cleanUpTempFolders) && sourceFolder != null) {
if (Resources.exists(sourceFolder)) {
try {
if (!sourceFolder.delete()) {
LOGGER.warning("It was not possible to cleanup Temporary Resources. Please double check that Resources inside the Temp GeoServer Data Directory have been removed.");
}
} catch (Exception e) {
LOGGER.log(Level.WARNING, "It was not possible to cleanup Temporary Resources. Please double check that Resources inside the Temp GeoServer Data Directory have been removed.", e);
}
}
}
}
}
} catch (NoSuchJobExecutionException | IOException e) {
if (!bestEffort) {
this.backupExecution.addFailureExceptions(Arrays.asList(e));
throw new RuntimeException(e);
} else {
this.backupExecution.addWarningExceptions(Arrays.asList(e));
}
}
}
}