/* (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.imagemosaic.writer;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.List;
import java.util.Map.Entry;
import java.util.Properties;
import org.apache.commons.io.FilenameUtils;
import org.geoserver.backuprestore.Backup;
import org.geoserver.backuprestore.imagemosaic.ImageMosaicAdditionalResource;
import org.geoserver.backuprestore.utils.BackupUtils;
import org.geoserver.backuprestore.writer.CatalogAdditionalResourcesWriter;
import org.geoserver.catalog.CoverageStoreInfo;
import org.geoserver.catalog.StoreInfo;
import org.geoserver.platform.resource.Files;
import org.geoserver.platform.resource.Resource;
import org.geoserver.platform.resource.Resources;
import org.geoserver.util.Filter;
/**
* @author Alessio Fabiani, GeoSolutions
*
*/
public class ImageMosaicAdditionalResourceWriter extends ImageMosaicAdditionalResource
implements CatalogAdditionalResourcesWriter<StoreInfo> {
@Override
public boolean canHandle(Object item) {
if (item instanceof CoverageStoreInfo
&& ((CoverageStoreInfo) item).getType().equals(COVERAGE_TYPE)) {
return true;
}
return false;
}
@Override
public void writeAdditionalResources(Backup backupFacade, Resource base, StoreInfo item)
throws IOException {
final Resource targetBackupFolder = BackupUtils.dir(base.parent(),
IMAGEMOSAIC_INDEXES_FOLDER);
// Create folder if not exists
Resources.directory(targetBackupFolder, !Resources.exists(targetBackupFolder));
final CoverageStoreInfo mosaicCoverageStore = backupFacade.getCatalog().getResourcePool()
.clone((CoverageStoreInfo) item, true);
final String mosaicName = mosaicCoverageStore.getName();
final String mosaicUrlBase = mosaicCoverageStore.getURL();
final Resource mosaicIndexBase = Resources.fromURL(mosaicUrlBase);
final Resource mosaicBaseFolder = Files.asResource(
(Resources.directory(mosaicIndexBase) != null ? Resources.directory(mosaicIndexBase)
: Resources.directory(mosaicIndexBase.parent())));
// Create the target mosaic folder
Resource targetMosaicBaseFolder = BackupUtils.dir(targetBackupFolder, mosaicBaseFolder.name());
if (Resources.exists(mosaicIndexBase)) {
for (Entry<String, Filter<Resource>> entry : resources.entrySet()) {
List<Resource> mosaicIndexerResources = Resources.list(mosaicIndexBase,
entry.getValue(), true);
for (Resource res : mosaicIndexerResources) {
if (!FilenameUtils.getBaseName(res.name()).equals(mosaicName) &&
!FilenameUtils.getBaseName(res.name()).equals(mosaicBaseFolder.name()) &&
Resources.exists(res) && Resources.canRead(res)) {
final String relative = mosaicIndexBase.parent().dir().toURI()
.relativize(res.file().toURI()).getPath();
Resource targetFtl = Resources.fromPath(relative, targetBackupFolder);
if (!targetFtl.parent().dir().exists()) {
targetFtl.parent().dir().mkdirs();
}
Resources.copy(res.file(), targetFtl.parent());
}
}
}
}
// Populate "Name=<mosaicName>" property into the indexer
final File indexerFile = new File(targetMosaicBaseFolder.dir(), "indexer.properties");
Properties indexerProperties = new Properties();
if (indexerFile.exists() && indexerFile.canRead()) {
indexerProperties.load(new FileInputStream(indexerFile));
}
indexerProperties.setProperty("Name", mosaicName);
indexerProperties.store(new FileOutputStream(indexerFile), null);
}
}