/* (c) 2017 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;
import org.geoserver.backuprestore.tasklet.GenericTaskletHandler;
import org.geoserver.backuprestore.tasklet.GenericTaskletUtils;
import org.geoserver.config.GeoServerDataDirectory;
import org.geoserver.util.IOUtils;
import org.springframework.batch.core.JobExecution;
import org.springframework.batch.core.StepContribution;
import org.springframework.batch.core.StepExecution;
import org.springframework.batch.core.scope.context.ChunkContext;
import org.springframework.batch.repeat.RepeatStatus;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.OutputStream;
/**
* Test generic handler that backup and restore an extra file that is not used by GeoServer.
*/
public final class ExtraFileHandler implements GenericTaskletHandler {
public static final String EXTRA_FILE_NAME = "extra_file.properties";
private final GeoServerDataDirectory dataDirectory;
public ExtraFileHandler(GeoServerDataDirectory dataDirectory) {
this.dataDirectory = dataDirectory;
}
@Override
public void initialize(StepExecution stepExecution, BackupRestoreItem context) {
// nothing to do here
}
@Override
public RepeatStatus handle(StepContribution contribution, ChunkContext chunkContext,
JobExecution jobExecution, BackupRestoreItem context) {
File inputDirectory;
File outputDirectory;
if (GenericTaskletUtils.isBackup(context)) {
// we are doing a backup
inputDirectory = dataDirectory.root();
outputDirectory = GenericTaskletUtils.getOutputDirectory(jobExecution);
} else {
// we are doing a restore
inputDirectory = GenericTaskletUtils.getInputDirectory(jobExecution);
outputDirectory = dataDirectory.root();
}
copyFile(inputDirectory, EXTRA_FILE_NAME, outputDirectory, EXTRA_FILE_NAME);
return RepeatStatus.FINISHED;
}
/**
* Helper method for copying a file from a directory to another.
*/
private void copyFile(File inputDirectory, String inputFileName, File outputDirectory, String outputFileName) {
File inputFile = new File(inputDirectory, inputFileName);
if (!inputFile.exists()) {
// nothing to copy
return;
}
File outputFile = new File(outputDirectory, outputFileName);
try (InputStream input = new FileInputStream(inputFile);
// copy the file to is destination
OutputStream output = new FileOutputStream(outputFile)) {
IOUtils.copy(input, output);
} catch (Exception exception) {
throw new RuntimeException(String.format(
"Error copying file '%s' to file '%s'.",
inputFile, outputFile.getAbsolutePath()), exception);
}
}
}