Skip to content

Commit

Permalink
- As per @mbarto review: added br index so that web page can read it…
Browse files Browse the repository at this point in the history
… back; on filtering, limiting the backup folders to the essentials
  • Loading branch information
Alessio Fabiani committed Nov 27, 2018
1 parent 74f5e89 commit dc27849
Show file tree
Hide file tree
Showing 19 changed files with 857 additions and 253 deletions.
Original file line number Original file line Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
*/ */
package org.geoserver.backuprestore.tasklet; package org.geoserver.backuprestore.tasklet;


import java.io.FileWriter;
import java.io.IOException; import java.io.IOException;
import java.io.InputStream; import java.io.InputStream;
import java.io.OutputStream; import java.io.OutputStream;
Expand All @@ -19,6 +20,14 @@
import org.geoserver.backuprestore.Backup; import org.geoserver.backuprestore.Backup;
import org.geoserver.backuprestore.BackupRestoreItem; import org.geoserver.backuprestore.BackupRestoreItem;
import org.geoserver.backuprestore.utils.BackupUtils; import org.geoserver.backuprestore.utils.BackupUtils;
import org.geoserver.catalog.CoverageInfo;
import org.geoserver.catalog.CoverageStoreInfo;
import org.geoserver.catalog.DataStoreInfo;
import org.geoserver.catalog.FeatureTypeInfo;
import org.geoserver.catalog.LayerInfo;
import org.geoserver.catalog.ResourceInfo;
import org.geoserver.catalog.StoreInfo;
import org.geoserver.catalog.WorkspaceInfo;
import org.geoserver.config.ServiceInfo; import org.geoserver.config.ServiceInfo;
import org.geoserver.config.util.XStreamPersisterFactory; import org.geoserver.config.util.XStreamPersisterFactory;
import org.geoserver.config.util.XStreamServiceLoader; import org.geoserver.config.util.XStreamServiceLoader;
Expand All @@ -30,6 +39,10 @@
import org.geoserver.platform.resource.Resources.AnyFilter; import org.geoserver.platform.resource.Resources.AnyFilter;
import org.geoserver.util.Filter; import org.geoserver.util.Filter;
import org.geotools.util.logging.Logging; import org.geotools.util.logging.Logging;
import org.jdom2.Document;
import org.jdom2.Element;
import org.jdom2.output.Format;
import org.jdom2.output.XMLOutputter;
import org.springframework.batch.core.ExitStatus; import org.springframework.batch.core.ExitStatus;
import org.springframework.batch.core.JobExecution; import org.springframework.batch.core.JobExecution;
import org.springframework.batch.core.JobInterruptedException; import org.springframework.batch.core.JobInterruptedException;
Expand Down Expand Up @@ -158,6 +171,8 @@ public boolean accept(Resource res) {


private volatile boolean stopped = false; private volatile boolean stopped = false;


public static final String BR_INDEX_XML = "br_index.xml";

public AbstractCatalogBackupRestoreTasklet( public AbstractCatalogBackupRestoreTasklet(
Backup backupFacade, XStreamPersisterFactory xStreamPersisterFactory) { Backup backupFacade, XStreamPersisterFactory xStreamPersisterFactory) {
super(backupFacade, xStreamPersisterFactory); super(backupFacade, xStreamPersisterFactory);
Expand Down Expand Up @@ -363,6 +378,80 @@ public Object doRead(Resource directory, String fileName) throws Exception {
return item; return item;
} }


/**
* This method dumps the current Backup index: - List of Workspaces - List of Stores - List of
* Layers
*
* @param sourceFolder
* @throws IOException
*/
protected void dumpBackupIndex(Resource sourceFolder) throws IOException {
Element root = new Element("Index");
Document doc = new Document();

for (WorkspaceInfo ws : getCatalog().getWorkspaces()) {
if (!filteredResource(ws, false)) {
Element workspace = new Element("Workspace");
workspace.addContent(new Element("Name").addContent(ws.getName()));
root.addContent(workspace);

for (DataStoreInfo ds :
getCatalog().getStoresByWorkspace(ws.getName(), DataStoreInfo.class)) {
if (!filteredResource(ds, ws, true, StoreInfo.class)) {
Element store = new Element("Store");
store.setAttribute("type", "DataStoreInfo");
store.addContent(new Element("Name").addContent(ds.getName()));
workspace.addContent(store);

for (FeatureTypeInfo ft : getCatalog().getFeatureTypesByDataStore(ds)) {
if (!filteredResource(ft, ws, true, ResourceInfo.class)) {
for (LayerInfo ly : getCatalog().getLayers(ft)) {
if (!filteredResource(ly, ws, true, LayerInfo.class)) {
Element layer = new Element("Layer");
layer.setAttribute("type", "VECTOR");
layer.addContent(
new Element("Name").addContent(ly.getName()));
store.addContent(layer);
}
}
}
}
}
}

for (CoverageStoreInfo cs :
getCatalog().getStoresByWorkspace(ws.getName(), CoverageStoreInfo.class)) {
if (!filteredResource(cs, ws, true, StoreInfo.class)) {
Element store = new Element("Store");
store.setAttribute("type", "CoverageStoreInfo");
store.addContent(new Element("Name").addContent(cs.getName()));
workspace.addContent(store);

for (CoverageInfo ci : getCatalog().getCoveragesByCoverageStore(cs)) {
if (!filteredResource(ci, ws, true, ResourceInfo.class)) {
for (LayerInfo ly : getCatalog().getLayers(ci)) {
if (!filteredResource(ly, ws, true, LayerInfo.class)) {
Element layer = new Element("Layer");
layer.setAttribute("type", "RASTER");
layer.addContent(
new Element("Name").addContent(ly.getName()));
store.addContent(layer);
}
}
}
}
}
}
}
}

doc.setRootElement(root);

XMLOutputter outter = new XMLOutputter();
outter.setFormat(Format.getPrettyFormat());
outter.output(doc, new FileWriter(sourceFolder.get(BR_INDEX_XML).file()));
}

@SuppressWarnings({"unchecked"}) @SuppressWarnings({"unchecked"})
protected XStreamServiceLoader findServiceLoader(ServiceInfo service) { protected XStreamServiceLoader findServiceLoader(ServiceInfo service) {
XStreamServiceLoader loader = null; XStreamServiceLoader loader = null;
Expand Down
Original file line number Original file line Diff line number Diff line change
Expand Up @@ -220,44 +220,51 @@ private void doBackup(
} }
} }


// Backup GeoServer Plugins if (!filterIsValid()) {
final GeoServerResourceLoader targetGeoServerResourceLoader = // Backup additional stuff only when performing a FULL backup
new GeoServerResourceLoader(targetBackupFolder.dir());
for (GeoServerPluginConfigurator pluginConfig :
GeoServerExtensions.extensions(GeoServerPluginConfigurator.class)) {
// On restore invoke 'pluginConfig.loadConfiguration(resourceLoader);' after having
// replaced the config files.
pluginConfig.saveConfiguration(targetGeoServerResourceLoader);
}

for (GeoServerPropertyConfigurer props :
GeoServerExtensions.extensions(GeoServerPropertyConfigurer.class)) {
// On restore invoke 'props.reload();' after having replaced the properties files.
Resource configFile = props.getConfigFile();


if (configFile != null && Resources.exists(configFile)) { // Backup GeoServer Plugins
Resource targetDir = final GeoServerResourceLoader targetGeoServerResourceLoader =
Files.asResource( new GeoServerResourceLoader(targetBackupFolder.dir());
targetGeoServerResourceLoader.findOrCreateDirectory( for (GeoServerPluginConfigurator pluginConfig :
Paths.convert( GeoServerExtensions.extensions(GeoServerPluginConfigurator.class)) {
dd.getResourceLoader().getBaseDirectory(), // On restore invoke 'pluginConfig.loadConfiguration(resourceLoader);' after
configFile.parent().dir()))); // having
// replaced the config files.
pluginConfig.saveConfiguration(targetGeoServerResourceLoader);
}


Resources.copy(configFile.file(), targetDir); for (GeoServerPropertyConfigurer props :
GeoServerExtensions.extensions(GeoServerPropertyConfigurer.class)) {
// On restore invoke 'props.reload();' after having replaced the properties
// files.
Resource configFile = props.getConfigFile();

if (configFile != null && Resources.exists(configFile)) {
Resource targetDir =
Files.asResource(
targetGeoServerResourceLoader.findOrCreateDirectory(
Paths.convert(
dd.getResourceLoader().getBaseDirectory(),
configFile.parent().dir())));

Resources.copy(configFile.file(), targetDir);
}
} }
}


// Backup other configuration bits, like images, palettes, user projections and so on... // Backup other configuration bits, like images, palettes, user projections and so
backupRestoreAdditionalResources(resourceStore, targetBackupFolder); // on...
backupRestoreAdditionalResources(resourceStore, targetBackupFolder);


// Backup GWC Configuration bits // Backup GWC Configuration bits
if (!skipGWC) { if (!skipGWC) {
try { try {
if (GeoServerExtensions.bean("gwcGeoServervConfigPersister") != null) { if (GeoServerExtensions.bean("gwcGeoServervConfigPersister") != null) {
backupGWCSettings(targetBackupFolder); backupGWCSettings(targetBackupFolder);
}
} catch (NoSuchBeanDefinitionException e) {
LOGGER.log(Level.WARNING, "Skipped GWC GeoServer Config Persister: ", e);
} }
} catch (NoSuchBeanDefinitionException e) {
LOGGER.log(Level.WARNING, "Skipped GWC GeoServer Config Persister: ", e);
} }
} }
} catch (Exception e) { } catch (Exception e) {
Expand Down
Original file line number Original file line Diff line number Diff line change
Expand Up @@ -49,6 +49,9 @@ RepeatStatus doExecute(
JobParameters jobParameters = backupExecution.getJobParameters(); JobParameters jobParameters = backupExecution.getJobParameters();
Resource sourceFolder = Resource sourceFolder =
Resources.fromURL(jobParameters.getString(Backup.PARAM_OUTPUT_FILE_PATH)); Resources.fromURL(jobParameters.getString(Backup.PARAM_OUTPUT_FILE_PATH));

dumpBackupIndex(sourceFolder);

BackupUtils.compressTo(sourceFolder, backupExecution.getArchiveFile()); BackupUtils.compressTo(sourceFolder, backupExecution.getArchiveFile());
} catch (IOException e) { } catch (IOException e) {
LOGGER.severe("Backup failed while creating final "); LOGGER.severe("Backup failed while creating final ");
Expand Down
Original file line number Original file line Diff line number Diff line change
Expand Up @@ -26,10 +26,8 @@


<div> <div>
<fieldset> <fieldset>
<legend><span><wicket:message key="newBackupResource">Archive File</wicket:message></span></legend> <legend><span><wicket:message key="backupResource">Archive File</wicket:message></span></legend>
<div wicket:id="newBackupRestorePanel"> <div wicket:id="backupResource"></div>
<div wicket:id="backupResource"></div>
</div>
<label for="workspace"><wicket:message key="workspace">Workspace</wicket:message></label> <label for="workspace"><wicket:message key="workspace">Workspace</wicket:message></label>
<select id="workspace" wicket:id="workspace"></select> <select id="workspace" wicket:id="workspace"></select>
<span wicket:id="workspaceNameContainer"><input type="text" class="text" wicket:id="workspaceName" style="width:10em;"></input></span> <span wicket:id="workspaceNameContainer"><input type="text" class="text" wicket:id="workspaceName" style="width:10em;"></input></span>
Expand Down

0 comments on commit dc27849

Please sign in to comment.