/* (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;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertTrue;
import java.io.File;
import java.io.IOException;
import org.geoserver.backuprestore.tasklet.CatalogBackupRestoreTasklet;
import org.geoserver.backuprestore.utils.BackupUtils;
import org.geoserver.backuprestore.writer.ResourceInfoAdditionalResourceWriter;
import org.geoserver.backuprestore.writer.StyleInfoAdditionalResourceWriter;
import org.geoserver.catalog.Catalog;
import org.geoserver.catalog.FeatureTypeInfo;
import org.geoserver.catalog.StyleInfo;
import org.geoserver.catalog.WorkspaceInfo;
import org.geoserver.config.GeoServer;
import org.geoserver.config.GeoServerDataDirectory;
import org.geoserver.config.GeoServerInfo;
import org.geoserver.config.LoggingInfo;
import org.geoserver.config.SettingsInfo;
import org.geoserver.config.util.XStreamPersister;
import org.geoserver.config.util.XStreamPersisterFactory;
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.junit.Test;
import com.thoughtworks.xstream.XStream;
/**
*
* @author Alessio Fabiani, GeoSolutions
*
*/
public class ResourceWriterTest extends BackupRestoreTestSupport {
@Test
public void testResourceInfoAdditionalResourceWriter() throws IOException {
Catalog cat = getCatalog();
GeoServerDataDirectory dd = backupFacade.getGeoServerDataDirectory();
GeoServerDataDirectory td = new GeoServerDataDirectory(root);
Resource srcTemplatesDir = BackupUtils.dir(dd.get(Paths.BASE), "templates");
File srcTitleFtl = Resources
.createNewFile(Files.asResource(new File(srcTemplatesDir.dir(), "title.ftl")));
File srcHeaderFtl = Resources.createNewFile(Files.asResource(new File(
Paths.toFile(dd.get(Paths.BASE).dir(), Paths.path("workspaces", "gs", "foo", "t1")),
"header.ftl")));
File srcFakeFtl = Resources.createNewFile(Files.asResource(new File(
Paths.toFile(dd.get(Paths.BASE).dir(), Paths.path("workspaces", "gs", "foo", "t1")),
"fake.ftl")));
assertTrue(Resources.exists(Files.asResource(srcTitleFtl)));
assertTrue(Resources.exists(Files.asResource(srcHeaderFtl)));
assertTrue(Resources.exists(Files.asResource(srcFakeFtl)));
FeatureTypeInfo ft = cat.getFeatureTypeByName("t1");
assertNotNull(ft);
ResourceInfoAdditionalResourceWriter riarw = new ResourceInfoAdditionalResourceWriter();
riarw.writeAdditionalResources(backupFacade, td.get(Paths.BASE), ft);
Resource trgTemplatesDir = BackupUtils.dir(td.get(Paths.BASE), "templates");
assertTrue(Resources.exists(trgTemplatesDir));
Resource trgTitleFtl = Files.asResource(new File(trgTemplatesDir.dir(), "title.ftl"));
Resource trgHeaderFtl = Files.asResource(new File(
Paths.toFile(td.get(Paths.BASE).dir(), Paths.path("workspaces", "gs", "foo", "t1")),
"header.ftl"));
Resource trgFakeFtl = Files.asResource(new File(
Paths.toFile(td.get(Paths.BASE).dir(), Paths.path("workspaces", "gs", "foo", "t1")),
"fake.ftl"));
assertTrue(Resources.exists(trgTitleFtl));
assertTrue(Resources.exists(trgHeaderFtl));
assertTrue(!Resources.exists(trgFakeFtl));
}
@Test
public void testStyleInfoAdditionalResourceWriter() throws IOException {
Catalog cat = getCatalog();
GeoServerDataDirectory dd = backupFacade.getGeoServerDataDirectory();
GeoServerDataDirectory td = new GeoServerDataDirectory(root);
StyleInfo style = cat.getStyleByName(StyleInfo.DEFAULT_POINT);
StyleInfoAdditionalResourceWriter siarw = new StyleInfoAdditionalResourceWriter();
siarw.writeAdditionalResources(backupFacade, td.get(Paths.BASE), style);
Resource srcStylesDir = BackupUtils.dir(dd.get(Paths.BASE), "styles");
Resource trgStylesDir = BackupUtils.dir(td.get(Paths.BASE), "styles");
assertTrue(Resources.exists(srcStylesDir));
assertTrue(Resources.exists(trgStylesDir));
assertTrue(Resources
.exists(Files.asResource(new File(trgStylesDir.dir(), style.getFilename()))));
}
@Test
public void testSidecarFilesWriter() throws Exception {
final XStreamPersisterFactory xStreamPersisterFactory = new XStreamPersisterFactory();
CatalogBackupRestoreTasklet catalogTsklet = new CatalogBackupRestoreTasklet(backupFacade,
xStreamPersisterFactory);
File tmpDd = File.createTempFile("template", "tmp", new File("target"));
tmpDd.delete();
tmpDd.mkdir();
GeoServerDataDirectory dd = new GeoServerDataDirectory(tmpDd);
File tmpTd = File.createTempFile("template", "tmp", new File("target"));
tmpTd.delete();
tmpTd.mkdir();
GeoServerDataDirectory td = new GeoServerDataDirectory(tmpTd);
BackupUtils.extractTo(file("data.zip"), dd.get(Paths.BASE));
// Backup other configuration bits, like images, palettes, user projections and so on...
catalogTsklet.backupRestoreAdditionalResources(dd.getResourceStore(), td.get(Paths.BASE));
assertTrue(Resources
.exists(Files.asResource(new File(td.get(Paths.BASE).dir(), "demo"))));
assertTrue(Resources
.exists(Files.asResource(new File(td.get(Paths.BASE).dir(), "images"))));
assertTrue(Resources
.exists(Files.asResource(new File(td.get(Paths.BASE).dir(), "logs"))));
assertTrue(Resources
.exists(Files.asResource(new File(td.get(Paths.BASE).dir(), "palettes"))));
assertTrue(Resources
.exists(Files.asResource(new File(td.get(Paths.BASE).dir(), "user_projections"))));
assertTrue(Resources
.exists(Files.asResource(new File(td.get(Paths.BASE).dir(), "validation"))));
assertTrue(Resources
.exists(Files.asResource(new File(td.get(Paths.BASE).dir(), "www"))));
}
@Test
public void testGeoServerGlobalSettingsStorage() throws Exception {
Catalog cat = getCatalog();
GeoServer geoserver = getGeoServer();
final XStreamPersisterFactory xStreamPersisterFactory = new XStreamPersisterFactory();
CatalogBackupRestoreTasklet catalogTsklet = new CatalogBackupRestoreTasklet(backupFacade,
xStreamPersisterFactory);
GeoServerDataDirectory td = new GeoServerDataDirectory(root);
catalogTsklet.doWrite(geoserver.getGlobal(), td.get(Paths.BASE), "global.xml");
catalogTsklet.doWrite(geoserver.getSettings(), td.get(Paths.BASE), "settings.xml");
catalogTsklet.doWrite(geoserver.getLogging(), td.get(Paths.BASE), "logging.xml");
assertTrue(Resources
.exists(Files.asResource(new File(td.get(Paths.BASE).dir(), "global.xml"))));
assertTrue(Resources
.exists(Files.asResource(new File(td.get(Paths.BASE).dir(), "settings.xml"))));
assertTrue(Resources
.exists(Files.asResource(new File(td.get(Paths.BASE).dir(), "logging.xml"))));
XStreamPersister xstream = xStreamPersisterFactory.createXMLPersister();
xstream.setCatalog(cat);
xstream.setReferenceByName(true);
xstream.setExcludeIds();
XStream xp = xstream.getXStream();
GeoServerInfo gsGlobal = (GeoServerInfo) xp
.fromXML(new File(td.get(Paths.BASE).dir(), "global.xml"));
assertNotNull(gsGlobal);
SettingsInfo gsSettins = (SettingsInfo) xp
.fromXML(new File(td.get(Paths.BASE).dir(), "settings.xml"));
assertNotNull(gsSettins);
LoggingInfo gsLogging = (LoggingInfo) xp
.fromXML(new File(td.get(Paths.BASE).dir(), "logging.xml"));
assertNotNull(gsLogging);
assertEquals(geoserver.getGlobal(), gsGlobal);
assertEquals(geoserver.getSettings(), gsSettins);
assertEquals(geoserver.getLogging(), gsLogging);
catalogTsklet.doWrite(cat.getDefaultWorkspace(),
BackupUtils.dir(td.get(Paths.BASE), "workspaces"), "default.xml");
assertTrue(Resources.exists(Files.asResource(
new File(BackupUtils.dir(td.get(Paths.BASE), "workspaces").dir(), "default.xml"))));
WorkspaceInfo defaultWorkspace = (WorkspaceInfo) xp.fromXML(
new File(BackupUtils.dir(td.get(Paths.BASE), "workspaces").dir(), "default.xml"));
assertEquals(cat.getDefaultWorkspace().getName(), defaultWorkspace.getName());
}
}