Skip to content

Commit

Permalink
[JIRA GEOS-9031][Backup & Restore] Add the possibility of filtering a…
Browse files Browse the repository at this point in the history
…gainst Store and Layer
  • Loading branch information
Alessio Fabiani committed Nov 25, 2018
1 parent 9bceb18 commit 74f5e89
Show file tree
Hide file tree
Showing 45 changed files with 2,108 additions and 452 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,8 @@
import java.util.List;
import java.util.concurrent.ConcurrentHashMap;
import org.geoserver.platform.resource.Resource;
import org.geotools.filter.text.cql2.CQLException;
import org.geotools.filter.text.ecql.ECQL;
import org.opengis.filter.Filter;
import org.springframework.batch.core.BatchStatus;
import org.springframework.batch.core.ExitStatus;
Expand Down Expand Up @@ -40,7 +42,11 @@ public abstract class AbstractExecutionAdapter {

private Resource archiveFile;

private Filter filter;
private String wsFilter;

private String siFilter;

private String liFilter;

/**
* Default Constructor
Expand Down Expand Up @@ -250,13 +256,45 @@ public void setArchiveFile(Resource archiveFile) {
this.archiveFile = archiveFile;
}

/** @return the filter */
public Filter getFilter() {
return filter;
/** @return the wsFilter */
public Filter getWsFilter() {
try {
return wsFilter != null ? ECQL.toFilter(wsFilter) : null;
} catch (CQLException e) {
return null;
}
}

/** @param wsFilter the wsFilter to set */
public void setWsFilter(String wsFilter) {
this.wsFilter = wsFilter;
}

/** @return the siFilter */
public Filter getSiFilter() {
try {
return siFilter != null ? ECQL.toFilter(siFilter) : null;
} catch (CQLException e) {
return null;
}
}

/** @param siFilter the siFilter to set */
public void setSiFilter(String siFilter) {
this.siFilter = siFilter;
}

/** @return the liFilter */
public Filter getLiFilter() {
try {
return liFilter != null ? ECQL.toFilter(liFilter) : null;
} catch (CQLException e) {
return null;
}
}

/** @param filter the filter to set */
public void setFilter(Filter filter) {
this.filter = filter;
/** @param liFilter the liFilter to set */
public void setLiFilter(String liFilter) {
this.liFilter = liFilter;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,7 @@
import org.geoserver.platform.GeoServerExtensions;
import org.geoserver.platform.GeoServerResourceLoader;
import org.geoserver.platform.resource.Resource;
import org.geoserver.security.GeoServerSecurityManager;
import org.geotools.filter.text.ecql.ECQL;
import org.geotools.util.factory.Hints;
import org.geotools.util.logging.Logging;
Expand Down Expand Up @@ -53,6 +54,9 @@
import org.springframework.context.ApplicationContextAware;
import org.springframework.context.ApplicationEvent;
import org.springframework.context.ApplicationListener;
import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
import org.springframework.security.core.Authentication;
import org.springframework.security.core.context.SecurityContextHolder;

/**
* Primary controller/facade of the backup and restore subsystem.
Expand Down Expand Up @@ -99,6 +103,8 @@ public class Backup extends JobExecutionListenerSupport

public static final String RESTORE_CATALOG_KEY = "restore.catalog";

private Authentication auth;

/** catalog */
Catalog catalog;

Expand Down Expand Up @@ -185,7 +191,6 @@ public void onApplicationEvent(ApplicationEvent event) {
this.jobOperator = (JobOperator) context.getBean("jobOperator");
this.jobLauncher = (JobLauncher) context.getBean("jobLauncherAsync");
this.jobRepository = (JobRepository) context.getBean("jobRepository");

this.backupJob = (Job) context.getBean(BACKUP_JOB_NAME);
this.restoreJob = (Job) context.getBean(RESTORE_JOB_NAME);
}
Expand Down Expand Up @@ -217,6 +222,16 @@ public Set<Long> getRestoreRunningExecutions() {
}
}

/** @return the auth */
public Authentication getAuth() {
return auth;
}

/** @param auth the auth to set */
public void setAuth(Authentication auth) {
this.auth = auth;
}

public Catalog getCatalog() {
return catalog;
}
Expand Down Expand Up @@ -289,45 +304,79 @@ public void setApplicationContext(ApplicationContext context) throws BeansExcept
}
}

/**
* Authenticate a user
*
* @param username
* @param password
* @return
*/
public Authentication authenticate() {
Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
if (authentication == null && getAuth() != null) {
authentication =
new UsernamePasswordAuthenticationToken(
this.auth.getName(), null, this.auth.getAuthorities());
SecurityContextHolder.getContext().setAuthentication(authentication);
}
return authentication;
}

protected String getItemName(XStreamPersister xp, Class clazz) {
return xp.getClassAliasingMapper().serializedClass(clazz);
}

public BackupExecutionAdapter runBackupAsync(
final Resource archiveFile,
final boolean overwrite,
final Filter filter,
final Filter wsFilter,
final Filter siFilter,
final Filter liFilter,
final Map<String, String> params)
throws IOException {

JobParametersBuilder builder = new JobParametersBuilder();
params.forEach(builder::addString);

return runBackupAsync(archiveFile, overwrite, filter, builder);
return runBackupAsync(archiveFile, overwrite, wsFilter, siFilter, liFilter, builder);
}

public BackupExecutionAdapter runBackupAsync(
final Resource archiveFile,
final boolean overwrite,
final Filter filter,
final Filter wsFilter,
final Filter siFilter,
final Filter liFilter,
final Hints hints)
throws IOException {

JobParametersBuilder builder = new JobParametersBuilder();
parseParams(hints, builder);
return runBackupAsync(archiveFile, overwrite, filter, builder);
return runBackupAsync(archiveFile, overwrite, wsFilter, siFilter, liFilter, builder);
}

/**
* @return
* @throws IOException
*/
public BackupExecutionAdapter runBackupAsync(
private BackupExecutionAdapter runBackupAsync(
final Resource archiveFile,
final boolean overwrite,
final Filter filter,
final Filter wsFilter,
final Filter siFilter,
final Filter liFilter,
final JobParametersBuilder paramsBuilder)
throws IOException {

// Check whether the user is authenticated or not and, in the second case, if it is an
// Administrator or not
Authentication auth = SecurityContextHolder.getContext().getAuthentication();
boolean isAdmin = getSecurityManager().checkAuthenticationForAdminRole(auth);

if (!isAdmin) {
throw new IllegalStateException("Not enough privileges to run a Restore process!");
}

// Check if archiveFile exists
if (archiveFile.file().exists()) {
if (!overwrite && FileUtils.sizeOf(archiveFile.file()) > 0) {
Expand Down Expand Up @@ -357,8 +406,14 @@ public BackupExecutionAdapter runBackupAsync(
// Write flat files into a temporary folder
Resource tmpDir = BackupUtils.geoServerTmpDir(getGeoServerDataDirectory());

if (filter != null) {
paramsBuilder.addString("filter", ECQL.toCQL(filter));
if (wsFilter != null) {
paramsBuilder.addString("wsFilter", ECQL.toCQL(wsFilter));
}
if (siFilter != null) {
paramsBuilder.addString("siFilter", ECQL.toCQL(siFilter));
}
if (liFilter != null) {
paramsBuilder.addString("liFilter", ECQL.toCQL(liFilter));
}

paramsBuilder
Expand All @@ -385,7 +440,9 @@ public BackupExecutionAdapter runBackupAsync(

backupExecution.setArchiveFile(archiveFile);
backupExecution.setOverwrite(overwrite);
backupExecution.setFilter(filter);
backupExecution.setWsFilter(wsFilter != null ? ECQL.toCQL(wsFilter) : null);
backupExecution.setSiFilter(siFilter != null ? ECQL.toCQL(siFilter) : null);
backupExecution.setLiFilter(liFilter != null ? ECQL.toCQL(liFilter) : null);

backupExecution.getOptions().add("OVERWRITE=" + overwrite);
for (Entry jobParam : jobParameters.toProperties().entrySet()) {
Expand Down Expand Up @@ -414,12 +471,16 @@ public BackupExecutionAdapter runBackupAsync(
}

public RestoreExecutionAdapter runRestoreAsync(
final Resource archiveFile, final Filter filter, final Map<String, String> params)
final Resource archiveFile,
final Filter wsFilter,
final Filter siFilter,
final Filter liFilter,
final Map<String, String> params)
throws IOException {

JobParametersBuilder paramsBuilder = new JobParametersBuilder();
params.forEach(paramsBuilder::addString);
return runRestoreAsync(archiveFile, filter, paramsBuilder);
return runRestoreAsync(archiveFile, wsFilter, siFilter, liFilter, paramsBuilder);
}

/**
Expand All @@ -428,25 +489,48 @@ public RestoreExecutionAdapter runRestoreAsync(
* @throws IOException
*/
public RestoreExecutionAdapter runRestoreAsync(
final Resource archiveFile, final Filter filter, final Hints params)
final Resource archiveFile,
final Filter wsFilter,
final Filter siFilter,
final Filter liFilter,
final Hints params)
throws IOException {
// Fill Job Parameters
JobParametersBuilder paramsBuilder = new JobParametersBuilder();
parseParams(params, paramsBuilder);

return runRestoreAsync(archiveFile, filter, paramsBuilder);
return runRestoreAsync(archiveFile, wsFilter, siFilter, liFilter, paramsBuilder);
}

private RestoreExecutionAdapter runRestoreAsync(
Resource archiveFile, Filter filter, JobParametersBuilder paramsBuilder)
Resource archiveFile,
final Filter wsFilter,
final Filter siFilter,
final Filter liFilter,
JobParametersBuilder paramsBuilder)
throws IOException {

// Check whether the user is authenticated or not and, in the second case, if it is an
// Administrator or not
Authentication auth = SecurityContextHolder.getContext().getAuthentication();
boolean isAdmin = getSecurityManager().checkAuthenticationForAdminRole(auth);

if (!isAdmin) {
throw new IllegalStateException("Not enough privileges to run a Restore process!");
}

Resource tmpDir = BackupUtils.geoServerTmpDir(getGeoServerDataDirectory());
BackupUtils.extractTo(archiveFile, tmpDir);
RestoreExecutionAdapter restoreExecution;

if (filter != null) {
paramsBuilder.addString("filter", ECQL.toCQL(filter));
if (wsFilter != null) {
paramsBuilder.addString("wsFilter", ECQL.toCQL(wsFilter));
}
if (siFilter != null) {
paramsBuilder.addString("siFilter", ECQL.toCQL(siFilter));
}
if (liFilter != null) {
paramsBuilder.addString("liFilter", ECQL.toCQL(liFilter));
}

paramsBuilder
Expand All @@ -467,7 +551,9 @@ private RestoreExecutionAdapter runRestoreAsync(
new RestoreExecutionAdapter(jobExecution, totalNumberOfRestoreSteps);
restoreExecutions.put(restoreExecution.getId(), restoreExecution);
restoreExecution.setArchiveFile(archiveFile);
restoreExecution.setFilter(filter);
restoreExecution.setWsFilter(wsFilter != null ? ECQL.toCQL(wsFilter) : null);
restoreExecution.setSiFilter(siFilter != null ? ECQL.toCQL(siFilter) : null);
restoreExecution.setLiFilter(liFilter != null ? ECQL.toCQL(liFilter) : null);

for (Entry jobParam : jobParameters.toProperties().entrySet()) {
if (!PARAM_OUTPUT_FILE_PATH.equals(jobParam.getKey())
Expand Down Expand Up @@ -671,4 +757,9 @@ public XStreamPersister initXStreamPersister(XStreamPersister xp) {

return xp;
}

/** @return */
private GeoServerSecurityManager getSecurityManager() {
return context.getBean(GeoServerSecurityManager.class);
}
}

0 comments on commit 74f5e89

Please sign in to comment.