X-Git-Url: https://git.argeo.org/?a=blobdiff_plain;f=org.argeo.maintenance%2Fsrc%2Forg%2Fargeo%2Fmaintenance%2Fbackup%2FLogicalRestore.java;fp=org.argeo.maintenance%2Fsrc%2Forg%2Fargeo%2Fmaintenance%2Fbackup%2FLogicalRestore.java;h=b430af6e1190d82818a6f2a0f6c0e0b8bca40f69;hb=3c7803ca05e2b0276d635e64046d924d3f1884c9;hp=0000000000000000000000000000000000000000;hpb=b97005030b1e0469fcc6dd6a35adb0c134131eaa;p=lgpl%2Fargeo-commons.git diff --git a/org.argeo.maintenance/src/org/argeo/maintenance/backup/LogicalRestore.java b/org.argeo.maintenance/src/org/argeo/maintenance/backup/LogicalRestore.java new file mode 100644 index 000000000..b430af6e1 --- /dev/null +++ b/org.argeo.maintenance/src/org/argeo/maintenance/backup/LogicalRestore.java @@ -0,0 +1,52 @@ +package org.argeo.maintenance.backup; + +import java.io.IOException; +import java.io.InputStream; +import java.nio.file.DirectoryStream; +import java.nio.file.Files; +import java.nio.file.Path; + +import javax.jcr.ImportUUIDBehavior; +import javax.jcr.Repository; +import javax.jcr.RepositoryException; +import javax.jcr.Session; + +import org.apache.commons.io.FilenameUtils; +import org.argeo.jcr.JcrException; +import org.argeo.jcr.JcrUtils; +import org.osgi.framework.BundleContext; + +/** Restores a backup in the format defined by {@link LogicalBackup}. */ +public class LogicalRestore implements Runnable { + private final Repository repository; + private final BundleContext bundleContext; + private final Path basePath; + + public LogicalRestore(BundleContext bundleContext, Repository repository, Path basePath) { + this.repository = repository; + this.basePath = basePath; + this.bundleContext = bundleContext; + } + + @Override + public void run() { + Path workspaces = basePath.resolve(LogicalBackup.WORKSPACES_BASE); + try (DirectoryStream xmls = Files.newDirectoryStream(workspaces, "*.xml")) { + for (Path workspacePath : xmls) { + String workspaceName = FilenameUtils.getBaseName(workspacePath.getFileName().toString()); + Session session = JcrUtils.loginOrCreateWorkspace(repository, workspaceName); + try (InputStream in = Files.newInputStream(workspacePath)) { + session.getWorkspace().importXML("/", in, + ImportUUIDBehavior.IMPORT_UUID_COLLISION_REPLACE_EXISTING); + } finally { + JcrUtils.logoutQuietly(session); + } + } + } catch (IOException e) { + throw new RuntimeException("Cannot restore backup from " + basePath, e); + } catch (RepositoryException e) { + throw new JcrException("Cannot restore backup from " + basePath, e); + } + } + +}