/* (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.writer;
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import org.geoserver.backuprestore.Backup;
import org.geoserver.catalog.ResourceInfo;
import org.geoserver.platform.resource.Files;
import org.geoserver.platform.resource.Paths;
import org.geoserver.platform.resource.Resource;
import org.geoserver.platform.resource.Resources;
import org.geoserver.template.GeoServerTemplateLoader;
/**
* On a {@link CatalogFireWriter} firePostWrite event call, dumps additional
* resources related to the {@link ResourceInfo}, like for instance the "ftl"
* Freemarker Templates definitions.
*
* @author Alessio Fabiani, GeoSolutions
*
*/
public class ResourceInfoAdditionalResourceWriter
implements CatalogAdditionalResourcesWriter<ResourceInfo> {
/*
*
*/
static List<String> templates = new ArrayList<String>();
/*
*
*/
static {
templates.add("header.ftl");
templates.add("footer.ftl");
templates.add("title.ftl");
templates.add("link.ftl");
templates.add("content.ftl");
templates.add("complex_content.ftl");
templates.add("description.ftl");
templates.add("height.ftl");
templates.add("time.ftl");
templates.add("shapezip.ftl");
templates.add("schema.xsd"); // http://docs.geoserver.org/latest/en/user/services/wfs/schemamapping.html
}
@Override
public boolean canHandle(Object item) {
return (item instanceof ResourceInfo);
}
@Override
public void writeAdditionalResources(Backup backupFacade, Resource base, ResourceInfo item)
throws IOException {
final Resource rootDataDir = backupFacade.getGeoServerDataDirectory().getRoot(Paths.BASE);
GeoServerTemplateLoader templateLoader = new GeoServerTemplateLoader(item.getClass(),
backupFacade.getResourceLoader());
templateLoader.setResource(item);
if (templateLoader != null) {
for (String template : templates) {
final Object ftl = templateLoader.findTemplateSource(template);
if (ftl != null && ftl instanceof File) {
Resource templateResource = Files.asResource((File) ftl);
if (Resources.exists(templateResource)) {
final String relative = rootDataDir.dir().toURI()
.relativize(templateResource.file().toURI()).getPath();
Resource targetFtl = Resources.fromPath(relative, base.parent());
if (!targetFtl.parent().dir().exists()) {
targetFtl.parent().dir().mkdirs();
}
Resources.copy(templateResource.file(), targetFtl.parent());
}
}
}
}
}
}