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.logging.Log; import org.apache.commons.logging.LogFactory; import org.argeo.api.NodeConstants; import org.argeo.api.NodeUtils; import org.argeo.jcr.Jcr; 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 static Log log = LogFactory.getLog(LogicalRestore.class); 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 { // import jcr:system first // Session defaultSession = NodeUtils.openDataAdminSession(repository, null); // try (DirectoryStream xmls = Files.newDirectoryStream( // workspaces.resolve(NodeConstants.SYS_WORKSPACE + LogicalBackup.JCR_VERSION_STORAGE_PATH), // "*.xml")) { // for (Path xml : xmls) { // try (InputStream in = Files.newInputStream(xml)) { // defaultSession.getWorkspace().importXML(LogicalBackup.JCR_VERSION_STORAGE_PATH, in, // ImportUUIDBehavior.IMPORT_UUID_COLLISION_REPLACE_EXISTING); // if (log.isDebugEnabled()) // log.debug("Restored " + xml + " to " + defaultSession.getWorkspace().getName() + ":"); // } // } // } finally { // Jcr.logout(defaultSession); // } // non-system content try (DirectoryStream workspaceDirs = Files.newDirectoryStream(workspaces)) { for (Path workspacePath : workspaceDirs) { String workspaceName = workspacePath.getFileName().toString(); Session session = JcrUtils.loginOrCreateWorkspace(repository, workspaceName); try (DirectoryStream xmls = Files.newDirectoryStream(workspacePath, "*.xml")) { xmls: for (Path xml : xmls) { if (xml.getFileName().toString().startsWith("rep:")) continue xmls; try (InputStream in = Files.newInputStream(xml)) { session.getWorkspace().importXML("/", in, ImportUUIDBehavior.IMPORT_UUID_COLLISION_REPLACE_EXISTING); if (log.isDebugEnabled()) log.debug("Restored " + xml + " to workspace " + workspaceName); } } } finally { Jcr.logout(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); } } }