/* * Copyright (C) 2003-2010 eXo Platform SAS. * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU Affero General Public License * as published by the Free Software Foundation; either version 3 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, see<http://www.gnu.org/licenses/>. */ package org.exoplatform.services.jcr.ext.backup; import org.exoplatform.commons.utils.PrivilegedFileHelper; import org.exoplatform.commons.utils.PrivilegedSystemHelper; import org.exoplatform.services.jcr.RepositoryService; import org.exoplatform.services.jcr.config.RepositoryEntry; import org.exoplatform.services.jcr.config.SimpleParameterEntry; import org.exoplatform.services.jcr.config.WorkspaceEntry; import org.exoplatform.services.jcr.core.ManageableRepository; import org.exoplatform.services.jcr.ext.backup.impl.JobRepositoryRestore; import org.exoplatform.services.jcr.ext.backup.impl.JobWorkspaceRestore; import org.exoplatform.services.jcr.impl.Constants; import org.exoplatform.services.jcr.impl.core.SessionImpl; import org.exoplatform.services.jcr.impl.storage.jdbc.JDBCDataContainerConfig.DatabaseStructureType; import org.exoplatform.services.jcr.util.IdGenerator; import java.io.File; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.util.HashMap; import java.util.Map; import java.util.concurrent.atomic.AtomicBoolean; import javax.jcr.query.Query; import javax.jcr.query.QueryResult; /** * Created by The eXo Platform SAS. * * <br>Date: 2010 * * @author <a href="mailto:alex.reshetnyak@exoplatform.com.ua">Alex Reshetnyak</a> * @version $Id$ */ public abstract class AbstractBackupUseCasesTest extends AbstractBackupTestCase { public void testFullBackupRestore() throws Exception { // prepare ManageableRepository repository = helper.createRepository(container, DatabaseStructureType.MULTI, null); WorkspaceEntry wsEntry = helper.createWorkspaceEntry(DatabaseStructureType.MULTI, null); helper.addWorkspace(repository, wsEntry); addConent(repository, wsEntry.getName()); // backup File backDir = new File("target/backup/" + IdGenerator.generate()); backDir.mkdirs(); BackupConfig config = new BackupConfig(); config.setRepository(repository.getConfiguration().getName()); config.setWorkspace(wsEntry.getName()); config.setBackupType(BackupManager.FULL_BACKUP_ONLY); config.setBackupDir(backDir); BackupChain bch = backup.startBackup(config); waitEndOfBackup(bch); backup.stopBackup(bch); // restore WorkspaceEntry newWS = helper.createWorkspaceEntry(DatabaseStructureType.MULTI, null); File backLog = new File(bch.getLogFilePath()); assertTrue(backLog.exists()); BackupChainLog bchLog = new BackupChainLog(backLog); assertNotNull(bchLog.getStartedTime()); assertNotNull(bchLog.getFinishedTime()); backup.restore(bchLog, config.getRepository(), newWS, false); checkConent(repository, newWS.getName()); } public void testIncrementalBackupRestore() throws Exception { // prepare ManageableRepository repository = helper.createRepository(container, DatabaseStructureType.MULTI, null); WorkspaceEntry wsEntry = helper.createWorkspaceEntry(DatabaseStructureType.MULTI, null); helper.addWorkspace(repository, wsEntry); addConent(repository, wsEntry.getName()); // backup File backDir = new File("target/backup/" + IdGenerator.generate()); backDir.mkdirs(); BackupConfig config = new BackupConfig(); config.setRepository(repository.getConfiguration().getName()); config.setWorkspace(wsEntry.getName()); config.setBackupType(BackupManager.FULL_AND_INCREMENTAL); config.setBackupDir(backDir); BackupChain bch = backup.startBackup(config); waitEndOfBackup(bch); addIncrementalConent(repository, wsEntry.getName()); backup.stopBackup(bch); // restore WorkspaceEntry newWS = helper.createWorkspaceEntry(DatabaseStructureType.MULTI, null); File backLog = new File(bch.getLogFilePath()); assertTrue(backLog.exists()); BackupChainLog bchLog = new BackupChainLog(backLog); assertNotNull(bchLog.getStartedTime()); assertNotNull(bchLog.getFinishedTime()); backup.restore(bchLog, config.getRepository(), newWS, false); checkConent(repository, newWS.getName()); checkIncrementalConent(repository, newWS.getName()); } public void testFullBackupRestoreAsync() throws Exception { // prepare ManageableRepository repository = helper.createRepository(container, DatabaseStructureType.MULTI, null); WorkspaceEntry wsEntry = helper.createWorkspaceEntry(DatabaseStructureType.MULTI, null); helper.addWorkspace(repository, wsEntry); addConent(repository, wsEntry.getName()); // backup File backDir = new File("target/backup/" + IdGenerator.generate()); backDir.mkdirs(); BackupConfig config = new BackupConfig(); config.setRepository(repository.getConfiguration().getName()); config.setWorkspace(wsEntry.getName()); config.setBackupType(BackupManager.FULL_BACKUP_ONLY); config.setBackupDir(backDir); BackupChain bch = backup.startBackup(config); waitEndOfBackup(bch); backup.stopBackup(bch); // restore WorkspaceEntry newWS = helper.createWorkspaceEntry(DatabaseStructureType.MULTI, null); File backLog = new File(bch.getLogFilePath()); assertTrue(backLog.exists()); BackupChainLog bchLog = new BackupChainLog(backLog); assertNotNull(bchLog.getStartedTime()); assertNotNull(bchLog.getFinishedTime()); backup.restore(bchLog, config.getRepository(), newWS, true); waitEndOfRestore(config.getRepository(), newWS.getName()); assertEquals(backup.getLastRestore(config.getRepository(), newWS.getName()).getStateRestore(), JobWorkspaceRestore.RESTORE_SUCCESSFUL); checkConent(repository, newWS.getName()); } public void testAutoStopBackupFull() throws Exception { // prepare ManageableRepository repository = helper.createRepository(container, DatabaseStructureType.MULTI, null); WorkspaceEntry wsEntry = helper.createWorkspaceEntry(DatabaseStructureType.MULTI, null); helper.addWorkspace(repository, wsEntry); // backup File backDir = new File("target/backup/" + IdGenerator.generate()); backDir.mkdirs(); BackupConfig config = new BackupConfig(); config.setRepository(repository.getConfiguration().getName()); config.setWorkspace(wsEntry.getName()); config.setBackupType(BackupManager.FULL_BACKUP_ONLY); config.setBackupDir(backDir); BackupChain bch = backup.startBackup(config); waitEndOfBackup(bch); Thread.sleep(30000); try { assertEquals(backup.getCurrentBackups().size(), 0); } finally { backup.stopBackup(bch); } } public void testAutoStopBackupIncr() throws Exception { // prepare ManageableRepository repository = helper.createRepository(container, DatabaseStructureType.MULTI, null); WorkspaceEntry wsEntry = helper.createWorkspaceEntry(DatabaseStructureType.MULTI, null); helper.addWorkspace(repository, wsEntry); // backup File backDir = new File("target/backup/" + IdGenerator.generate()); backDir.mkdirs(); BackupConfig config = new BackupConfig(); config.setRepository(repository.getConfiguration().getName()); config.setWorkspace(wsEntry.getName()); config.setBackupType(BackupManager.FULL_AND_INCREMENTAL); config.setIncrementalJobPeriod(3); config.setIncrementalJobNumber(0); config.setBackupDir(backDir); BackupChain bch = backup.startBackup(config); waitEndOfBackup(bch); Thread.sleep(10000); try { assertEquals(backup.getCurrentBackups().size(), 1); } finally { backup.stopBackup(bch); } } public void _testAutoStopBackupIncrRepetion() throws Exception { // prepare ManageableRepository repository = helper.createRepository(container, DatabaseStructureType.MULTI, null); WorkspaceEntry wsEntry = helper.createWorkspaceEntry(DatabaseStructureType.MULTI, null); helper.addWorkspace(repository, wsEntry); // backup File backDir = new File("target/backup/" + IdGenerator.generate()); backDir.mkdirs(); BackupConfig config = new BackupConfig(); config.setRepository(repository.getConfiguration().getName()); config.setWorkspace(wsEntry.getName()); config.setBackupType(BackupManager.FULL_AND_INCREMENTAL); config.setIncrementalJobPeriod(4); config.setIncrementalJobNumber(2); config.setBackupDir(backDir); BackupChain bch = backup.startBackup(config); waitEndOfBackup(bch); Thread.sleep(60000); try { assertEquals(backup.getCurrentBackups().size(), 0); } finally { backup.stopBackup(bch); } } public void testNegativeIncremetalJobPeriod() throws Exception { // backup File backDir = new File("target/backup/" + IdGenerator.generate()); backDir.mkdirs(); BackupConfig config = new BackupConfig(); config.setRepository("fake"); config.setWorkspace("fake"); config.setBackupType(BackupManager.FULL_AND_INCREMENTAL); config.setIncrementalJobPeriod(-1000); config.setBackupDir(backDir); try { backup.startBackup(config); fail("The backup can not be started."); } catch (BackupConfigurationException e) { } } public void testNegativeIncremetalJobNumber() throws Exception { // backup File backDir = new File("target/backup/" + IdGenerator.generate()); backDir.mkdirs(); BackupConfig config = new BackupConfig(); config.setRepository("fake"); config.setWorkspace("fake"); config.setBackupType(BackupManager.FULL_AND_INCREMENTAL); config.setIncrementalJobNumber(-5); config.setBackupDir(backDir); try { backup.startBackup(config); fail("The backup can not be started."); } catch (BackupConfigurationException e) { } } public void testRestoreAfterFailureRestore() throws Exception { // prepare ManageableRepository repository = helper.createRepository(container, DatabaseStructureType.MULTI, null); WorkspaceEntry wsEntry = helper.createWorkspaceEntry(DatabaseStructureType.MULTI, null); helper.addWorkspace(repository, wsEntry); addConent(repository, wsEntry.getName()); // backup File backDir = new File("target/backup/" + IdGenerator.generate()); backDir.mkdirs(); BackupConfig config = new BackupConfig(); config.setRepository(repository.getConfiguration().getName()); config.setWorkspace(wsEntry.getName()); config.setBackupType(BackupManager.FULL_BACKUP_ONLY); config.setBackupDir(backDir); BackupChain bch = backup.startBackup(config); waitEndOfBackup(bch); backup.stopBackup(bch); // restore WorkspaceEntry newWS = helper.createWorkspaceEntry(DatabaseStructureType.MULTI, "NOT_EXISTED_DS"); File backLog = new File(bch.getLogFilePath()); assertTrue(backLog.exists()); BackupChainLog bchLog = new BackupChainLog(backLog); assertNotNull(bchLog.getStartedTime()); assertNotNull(bchLog.getFinishedTime()); try { backup.restore(bchLog, config.getRepository(), newWS, false); fail("Exception should be thrown"); } catch (Exception e) { } newWS = helper.createWorkspaceEntry(DatabaseStructureType.MULTI, null); backup.restore(bchLog, config.getRepository(), newWS, false); checkConent(repository, newWS.getName()); } public void testRepositoryFullBackupRestore() throws Exception { testRepositoryFullBackupRestoreWithSpecifiedDbTypes(DatabaseStructureType.MULTI, DatabaseStructureType.MULTI); } public void testRepositoryFullBackupRestoreSingleToMulti() throws Exception { testRepositoryFullBackupRestoreWithSpecifiedDbTypes(DatabaseStructureType.SINGLE, DatabaseStructureType.MULTI); } public void testRepositoryFullBackupRestoreSingleToIsolated() throws Exception { testRepositoryFullBackupRestoreWithSpecifiedDbTypes(DatabaseStructureType.SINGLE, DatabaseStructureType.ISOLATED); } public void testRepositoryFullBackupRestoreMultiToIsolated() throws Exception { testRepositoryFullBackupRestoreWithSpecifiedDbTypes(DatabaseStructureType.MULTI, DatabaseStructureType.ISOLATED); } public void testRepositoryFullBackupRestoreMultiToSingle() throws Exception { testRepositoryFullBackupRestoreWithSpecifiedDbTypes(DatabaseStructureType.MULTI, DatabaseStructureType.SINGLE); } public void testRepositoryFullBackupRestoreIsolatedToSingle() throws Exception { testRepositoryFullBackupRestoreWithSpecifiedDbTypes(DatabaseStructureType.ISOLATED, DatabaseStructureType.SINGLE); } public void testRepositoryFullBackupRestoreIsolatedToMulti() throws Exception { testRepositoryFullBackupRestoreWithSpecifiedDbTypes(DatabaseStructureType.ISOLATED, DatabaseStructureType.MULTI); } public void testRepositoryFullBackupRestoreBackupSingleToIsolatedOnIsolated() throws Exception { // prepare ManageableRepository repositorySourceBackup = helper.createRepository(container, DatabaseStructureType.SINGLE, null); addConent(repositorySourceBackup, repositorySourceBackup.getConfiguration().getSystemWorkspaceName()); // backup File backDir = new File("target/backup/" + IdGenerator.generate()); backDir.mkdirs(); RepositoryBackupConfig config = new RepositoryBackupConfig(); config.setRepository(repositorySourceBackup.getConfiguration().getName()); config.setBackupType(BackupManager.FULL_BACKUP_ONLY); config.setBackupDir(backDir); RepositoryBackupChain bch = backup.startBackup(config); waitEndOfBackup(bch); backup.stopBackup(bch); RepositoryEntry re = helper.createRepositoryEntry(DatabaseStructureType.ISOLATED, repositorySourceBackup.getWorkspaceNames()[0], null); repositoryService.createRepository(re); ManageableRepository repository = repositoryService.getRepository(re.getName()); addConent(repository, repository.getConfiguration().getSystemWorkspaceName()); // restore RepositoryEntry newRE = helper.copyRepositoryEntry(repository.getConfiguration()); File backLog = new File(bch.getLogFilePath()); assertTrue(backLog.exists()); RepositoryBackupChainLog bchLog = new RepositoryBackupChainLog(backLog); assertNotNull(bchLog.getStartedTime()); assertNotNull(bchLog.getFinishedTime()); backup.restoreExistingRepository(bchLog, newRE, false); checkConent(repositoryService.getRepository(newRE.getName()), newRE.getSystemWorkspaceName()); } private void testRepositoryFullBackupRestoreWithSpecifiedDbTypes(DatabaseStructureType srcDbStructureType, DatabaseStructureType dstDbStructureType) throws Exception { // prepare ManageableRepository repository = helper.createRepository(container, srcDbStructureType, null); addConent(repository, repository.getConfiguration().getSystemWorkspaceName()); // backup File backDir = new File("target/backup/" + IdGenerator.generate()); backDir.mkdirs(); RepositoryBackupConfig config = new RepositoryBackupConfig(); config.setRepository(repository.getConfiguration().getName()); config.setBackupType(BackupManager.FULL_BACKUP_ONLY); config.setBackupDir(backDir); RepositoryBackupChain bch = backup.startBackup(config); waitEndOfBackup(bch); backup.stopBackup(bch); // restore RepositoryEntry newRE = helper.createRepositoryEntry(dstDbStructureType, repository.getConfiguration() .getSystemWorkspaceName(), null); File backLog = new File(bch.getLogFilePath()); assertTrue(backLog.exists()); RepositoryBackupChainLog bchLog = new RepositoryBackupChainLog(backLog); assertNotNull(bchLog.getStartedTime()); assertNotNull(bchLog.getFinishedTime()); backup.restore(bchLog, newRE, false); checkConent(repositoryService.getRepository(newRE.getName()), newRE.getSystemWorkspaceName()); } public void testRepositoryFullAndIncrementalBackupRestore() throws Exception { // prepare ManageableRepository repository = helper.createRepository(container, DatabaseStructureType.MULTI, null); addConent(repository, repository.getConfiguration().getSystemWorkspaceName()); // backup File backDir = new File("target/backup/" + IdGenerator.generate()); backDir.mkdirs(); RepositoryBackupConfig config = new RepositoryBackupConfig(); config.setRepository(repository.getConfiguration().getName()); config.setBackupType(BackupManager.FULL_AND_INCREMENTAL); config.setBackupDir(backDir); RepositoryBackupChain bch = backup.startBackup(config); waitEndOfBackup(bch); addIncrementalConent(repository, repository.getConfiguration().getSystemWorkspaceName()); backup.stopBackup(bch); // restore RepositoryEntry newRE = helper.createRepositoryEntry(DatabaseStructureType.MULTI, repository.getConfiguration().getSystemWorkspaceName(), null); File backLog = new File(bch.getLogFilePath()); assertTrue(backLog.exists()); RepositoryBackupChainLog bchLog = new RepositoryBackupChainLog(backLog); assertNotNull(bchLog.getStartedTime()); assertNotNull(bchLog.getFinishedTime()); backup.restore(bchLog, newRE, false); checkConent(repositoryService.getRepository(newRE.getName()), newRE.getSystemWorkspaceName()); checkIncrementalConent(repositoryService.getRepository(newRE.getName()), newRE.getSystemWorkspaceName()); } public void testRepositoryFullBackupAsynchronusRestore() throws Exception { // prepare ManageableRepository repository = helper.createRepository(container, DatabaseStructureType.MULTI, null); addConent(repository, repository.getConfiguration().getSystemWorkspaceName()); // backup File backDir = new File("target/backup/" + IdGenerator.generate()); backDir.mkdirs(); RepositoryBackupConfig config = new RepositoryBackupConfig(); config.setRepository(repository.getConfiguration().getName()); config.setBackupType(BackupManager.FULL_BACKUP_ONLY); config.setBackupDir(backDir); RepositoryBackupChain bch = backup.startBackup(config); waitEndOfBackup(bch); backup.stopBackup(bch); // restore RepositoryEntry newRE = helper.createRepositoryEntry(DatabaseStructureType.MULTI, repository.getConfiguration().getSystemWorkspaceName(), null); File backLog = new File(bch.getLogFilePath()); assertTrue(backLog.exists()); RepositoryBackupChainLog bchLog = new RepositoryBackupChainLog(backLog); assertNotNull(bchLog.getStartedTime()); assertNotNull(bchLog.getFinishedTime()); backup.restore(bchLog, newRE, true); waitEndOfRestore(newRE.getName()); checkConent(repositoryService.getRepository(newRE.getName()), newRE.getSystemWorkspaceName()); } public void testRepositoryFullBackupAsynchronusRestoreWorkspaceMapping() throws Exception { // prepare ManageableRepository repository = helper.createRepository(container, DatabaseStructureType.MULTI, null); addConent(repository, repository.getConfiguration().getSystemWorkspaceName()); // backup File backDir = new File("target/backup/" + IdGenerator.generate()); backDir.mkdirs(); RepositoryBackupConfig config = new RepositoryBackupConfig(); config.setRepository(repository.getConfiguration().getName()); config.setBackupType(BackupManager.FULL_BACKUP_ONLY); config.setBackupDir(backDir); RepositoryBackupChain bch = backup.startBackup(config); waitEndOfBackup(bch); backup.stopBackup(bch); // restore RepositoryEntry newRE = helper.createRepositoryEntry(DatabaseStructureType.MULTI, null, null); // create workspace mappingS Map<String, String> workspaceMapping = new HashMap<String, String>(); workspaceMapping.put(repository.getConfiguration().getSystemWorkspaceName(), newRE.getSystemWorkspaceName()); File backLog = new File(bch.getLogFilePath()); assertTrue(backLog.exists()); RepositoryBackupChainLog bchLog = new RepositoryBackupChainLog(backLog); assertNotNull(bchLog.getStartedTime()); assertNotNull(bchLog.getFinishedTime()); backup.restore(bchLog, newRE, workspaceMapping, true); waitEndOfRestore(newRE.getName()); checkConent(repositoryService.getRepository(newRE.getName()), newRE.getSystemWorkspaceName()); } public void _testAutoStopRepositoryBackupIncrRepetion() throws Exception { // prepare ManageableRepository repository = helper.createRepository(container, DatabaseStructureType.MULTI, null); addConent(repository, repository.getConfiguration().getSystemWorkspaceName()); // backup File backDir = new File("target/backup/" + IdGenerator.generate()); backDir.mkdirs(); RepositoryBackupConfig config = new RepositoryBackupConfig(); config.setRepository(repository.getConfiguration().getName()); config.setBackupType(BackupManager.FULL_AND_INCREMENTAL); config.setIncrementalJobPeriod(4); config.setIncrementalJobNumber(2); config.setBackupDir(backDir); RepositoryBackupChain bch = backup.startBackup(config); waitEndOfBackup(bch); backup.stopBackup(bch); // restore RepositoryEntry newRE = helper.createRepositoryEntry(DatabaseStructureType.MULTI, null, null); // create workspace mappingS Map<String, String> workspaceMapping = new HashMap<String, String>(); workspaceMapping.put(repository.getConfiguration().getSystemWorkspaceName(), newRE.getSystemWorkspaceName()); File backLog = new File(bch.getLogFilePath()); assertTrue(backLog.exists()); RepositoryBackupChainLog bchLog = new RepositoryBackupChainLog(backLog); assertNotNull(bchLog.getStartedTime()); assertNotNull(bchLog.getFinishedTime()); backup.restore(bchLog, newRE, workspaceMapping, true); waitEndOfRestore(newRE.getName()); Thread.sleep(60000); assertEquals(backup.getCurrentRepositoryBackups().size(), 0); } public void testRepositoryRestoreFail() throws Exception { // prepare ManageableRepository repository = helper.createRepository(container, DatabaseStructureType.MULTI, null); addConent(repository, repository.getConfiguration().getSystemWorkspaceName()); // backup File backDir = new File("target/backup/" + IdGenerator.generate()); backDir.mkdirs(); RepositoryBackupConfig config = new RepositoryBackupConfig(); config.setRepository(repository.getConfiguration().getName()); config.setBackupType(BackupManager.FULL_BACKUP_ONLY); config.setBackupDir(backDir); RepositoryBackupChain bch = backup.startBackup(config); waitEndOfBackup(bch); backup.stopBackup(bch); // restore RepositoryEntry newRE = helper.createRepositoryEntry(DatabaseStructureType.MULTI, null, null); newRE.getWorkspaceEntries().get(0).getQueryHandler().setType("gg"); // create workspace mappingS Map<String, String> workspaceMapping = new HashMap<String, String>(); workspaceMapping.put(repository.getConfiguration().getSystemWorkspaceName(), newRE.getSystemWorkspaceName()); File backLog = new File(bch.getLogFilePath()); assertTrue(backLog.exists()); RepositoryBackupChainLog bchLog = new RepositoryBackupChainLog(backLog); assertNotNull(bchLog.getStartedTime()); assertNotNull(bchLog.getFinishedTime()); try { backup.restore(bchLog, newRE, workspaceMapping, false); fail("Exception should be thrown"); } catch (RepositoryRestoreExeption e) { } } public void testExistedWorkspaceRestoreMultiDB() throws Exception { // prepare ManageableRepository repository = helper.createRepository(container, DatabaseStructureType.MULTI, null); WorkspaceEntry wsEntry = helper.createWorkspaceEntry(DatabaseStructureType.MULTI, null); helper.addWorkspace(repository, wsEntry); addConent(repository, wsEntry.getName()); // backup File backDir = new File("target/backup/" + IdGenerator.generate()); backDir.mkdirs(); BackupConfig config = new BackupConfig(); config.setRepository(repository.getConfiguration().getName()); config.setWorkspace(wsEntry.getName()); config.setBackupType(BackupManager.FULL_BACKUP_ONLY); config.setBackupDir(backDir); BackupChain bch = backup.startBackup(config); waitEndOfBackup(bch); backup.stopBackup(bch); // restore File backLog = new File(bch.getLogFilePath()); assertTrue(backLog.exists()); BackupChainLog bchLog = new BackupChainLog(backLog); assertNotNull(bchLog.getStartedTime()); assertNotNull(bchLog.getFinishedTime()); backup.restoreExistingWorkspace(bchLog, repository.getConfiguration().getName(), repository.getConfiguration() .getWorkspaceEntries().get(1), false); checkConent(repository, repository.getConfiguration().getWorkspaceEntries().get(1).getName()); } public void testExistedWorkspaceRestoreSingleDB() throws Exception { // prepare String dsName = helper.createDatasource(); ManageableRepository repository = helper.createRepository(container, DatabaseStructureType.SINGLE, dsName); WorkspaceEntry wsEntry = helper.createWorkspaceEntry(DatabaseStructureType.SINGLE, dsName); helper.addWorkspace(repository, wsEntry); addConent(repository, wsEntry.getName()); // backup File backDir = new File("target/backup/" + IdGenerator.generate()); backDir.mkdirs(); BackupConfig config = new BackupConfig(); config.setRepository(repository.getConfiguration().getName()); config.setWorkspace(wsEntry.getName()); config.setBackupType(BackupManager.FULL_BACKUP_ONLY); config.setBackupDir(backDir); BackupChain bch = backup.startBackup(config); waitEndOfBackup(bch); backup.stopBackup(bch); // restore File backLog = new File(bch.getLogFilePath()); assertTrue(backLog.exists()); BackupChainLog bchLog = new BackupChainLog(backLog); assertNotNull(bchLog.getStartedTime()); assertNotNull(bchLog.getFinishedTime()); backup.restoreExistingWorkspace(bchLog, repository.getConfiguration().getName(), repository.getConfiguration() .getWorkspaceEntries().get(1), false); checkConent(repository, repository.getConfiguration().getWorkspaceEntries().get(1).getName()); } public void testExistedWorkspaceRestoreAsync() throws Exception { // prepare ManageableRepository repository = helper.createRepository(container, DatabaseStructureType.MULTI, null); WorkspaceEntry wsEntry = helper.createWorkspaceEntry(DatabaseStructureType.MULTI, null); helper.addWorkspace(repository, wsEntry); addConent(repository, wsEntry.getName()); // backup File backDir = new File("target/backup/" + IdGenerator.generate()); backDir.mkdirs(); BackupConfig config = new BackupConfig(); config.setRepository(repository.getConfiguration().getName()); config.setWorkspace(wsEntry.getName()); config.setBackupType(BackupManager.FULL_BACKUP_ONLY); config.setBackupDir(backDir); BackupChain bch = backup.startBackup(config); waitEndOfBackup(bch); backup.stopBackup(bch); // restore File backLog = new File(bch.getLogFilePath()); assertTrue(backLog.exists()); BackupChainLog bchLog = new BackupChainLog(backLog); assertNotNull(bchLog.getStartedTime()); assertNotNull(bchLog.getFinishedTime()); backup.restoreExistingWorkspace(bchLog, repository.getConfiguration().getName(), repository.getConfiguration() .getWorkspaceEntries().get(1), true); waitEndOfRestore(repository.getConfiguration().getName(), repository.getConfiguration().getWorkspaceEntries() .get(1).getName()); assertEquals( backup.getLastRestore(repository.getConfiguration().getName(), repository.getConfiguration().getWorkspaceEntries().get(1).getName()).getStateRestore(), JobWorkspaceRestore.RESTORE_SUCCESSFUL); checkConent(repository, repository.getConfiguration().getWorkspaceEntries().get(1).getName()); } public void testExistedRepositoryRestoreMultiDB() throws Exception { // prepare String dsName = helper.createDatasource(); ManageableRepository repository = helper.createRepository(container, DatabaseStructureType.MULTI, dsName); addConent(repository, repository.getConfiguration().getSystemWorkspaceName()); // backup File backDir = new File("target/backup/" + IdGenerator.generate()); backDir.mkdirs(); RepositoryBackupConfig config = new RepositoryBackupConfig(); config.setRepository(repository.getConfiguration().getName()); config.setBackupType(BackupManager.FULL_BACKUP_ONLY); config.setBackupDir(backDir); RepositoryBackupChain bch = backup.startBackup(config); waitEndOfBackup(bch); backup.stopBackup(bch); File backLog = new File(bch.getLogFilePath()); assertTrue(backLog.exists()); RepositoryBackupChainLog bchLog = new RepositoryBackupChainLog(backLog); assertNotNull(bchLog.getStartedTime()); assertNotNull(bchLog.getFinishedTime()); // restore RepositoryEntry newRE = helper.createRepositoryEntry(DatabaseStructureType.MULTI, repository.getConfiguration().getSystemWorkspaceName(), dsName); newRE.setName(repository.getConfiguration().getName()); backup.restoreExistingRepository(bchLog, newRE, false); checkConent(repositoryService.getRepository(newRE.getName()), newRE.getSystemWorkspaceName()); } public void testExistedRepositoryRestoreSingelDB() throws Exception { // prepare String dsName = helper.createDatasource(); ManageableRepository repository = helper.createRepository(container, DatabaseStructureType.SINGLE, dsName); addConent(repository, repository.getConfiguration().getSystemWorkspaceName()); // backup File backDir = new File("target/backup/" + IdGenerator.generate()); backDir.mkdirs(); RepositoryBackupConfig config = new RepositoryBackupConfig(); config.setRepository(repository.getConfiguration().getName()); config.setBackupType(BackupManager.FULL_BACKUP_ONLY); config.setBackupDir(backDir); RepositoryBackupChain bch = backup.startBackup(config); waitEndOfBackup(bch); backup.stopBackup(bch); File backLog = new File(bch.getLogFilePath()); assertTrue(backLog.exists()); RepositoryBackupChainLog bchLog = new RepositoryBackupChainLog(backLog); assertNotNull(bchLog.getStartedTime()); assertNotNull(bchLog.getFinishedTime()); // restore RepositoryEntry newRE = helper.createRepositoryEntry(DatabaseStructureType.SINGLE, repository.getConfiguration().getSystemWorkspaceName(), dsName); newRE.setName(repository.getConfiguration().getName()); backup.restoreExistingRepository(bchLog, newRE, false); checkConent(repositoryService.getRepository(newRE.getName()), newRE.getSystemWorkspaceName()); } public void testExistedRepositoryRestoreAsync() throws Exception { // prepare String dsName = helper.createDatasource(); ManageableRepository repository = helper.createRepository(container, DatabaseStructureType.SINGLE, dsName); addConent(repository, repository.getConfiguration().getSystemWorkspaceName()); // backup File backDir = new File("target/backup/" + IdGenerator.generate()); backDir.mkdirs(); RepositoryBackupConfig config = new RepositoryBackupConfig(); config.setRepository(repository.getConfiguration().getName()); config.setBackupType(BackupManager.FULL_BACKUP_ONLY); config.setBackupDir(backDir); RepositoryBackupChain bch = backup.startBackup(config); waitEndOfBackup(bch); backup.stopBackup(bch); File backLog = new File(bch.getLogFilePath()); assertTrue(backLog.exists()); RepositoryBackupChainLog bchLog = new RepositoryBackupChainLog(backLog); assertNotNull(bchLog.getStartedTime()); assertNotNull(bchLog.getFinishedTime()); // restore RepositoryEntry newRE = helper.createRepositoryEntry(DatabaseStructureType.SINGLE, repository.getConfiguration().getSystemWorkspaceName(), dsName); newRE.setName(repository.getConfiguration().getName()); backup.restoreExistingRepository(bchLog, newRE, true); waitEndOfRestore(repository.getConfiguration().getName()); assertEquals(JobRepositoryRestore.REPOSITORY_RESTORE_SUCCESSFUL, backup.getLastRepositoryRestore(repository.getConfiguration().getName()).getStateRestore()); checkConent(repositoryService.getRepository(newRE.getName()), newRE.getSystemWorkspaceName()); } public void testExistedWorkspaceRestoreWithConfig() throws Exception { // prepare ManageableRepository repository = helper.createRepository(container, DatabaseStructureType.MULTI, null); WorkspaceEntry wsEntry = helper.createWorkspaceEntry(DatabaseStructureType.MULTI, null); helper.addWorkspace(repository, wsEntry); addConent(repository, wsEntry.getName()); // backup File backDir = new File("target/backup/" + IdGenerator.generate()); backDir.mkdirs(); BackupConfig config = new BackupConfig(); config.setRepository(repository.getConfiguration().getName()); config.setWorkspace(wsEntry.getName()); config.setBackupType(BackupManager.FULL_BACKUP_ONLY); config.setBackupDir(backDir); BackupChain bch = backup.startBackup(config); waitEndOfBackup(bch); backup.stopBackup(bch); // restore File backLog = new File(bch.getLogFilePath()); assertTrue(backLog.exists()); BackupChainLog bchLog = new BackupChainLog(backLog); assertNotNull(bchLog.getStartedTime()); assertNotNull(bchLog.getFinishedTime()); backup.restoreExistingWorkspace(bchLog.getBackupId(), false); checkConent(repository, repository.getConfiguration().getWorkspaceEntries().get(1).getName()); } public void testExistedRepositoryRestoreWithConfig() throws Exception { // prepare String dsName = helper.createDatasource(); ManageableRepository repository = helper.createRepository(container, DatabaseStructureType.MULTI, dsName); addConent(repository, repository.getConfiguration().getSystemWorkspaceName()); // backup File backDir = new File("target/backup/" + IdGenerator.generate()); backDir.mkdirs(); RepositoryBackupConfig config = new RepositoryBackupConfig(); config.setRepository(repository.getConfiguration().getName()); config.setBackupType(BackupManager.FULL_BACKUP_ONLY); config.setBackupDir(backDir); RepositoryBackupChain bch = backup.startBackup(config); waitEndOfBackup(bch); backup.stopBackup(bch); File backLog = new File(bch.getLogFilePath()); assertTrue(backLog.exists()); RepositoryBackupChainLog bchLog = new RepositoryBackupChainLog(backLog); assertNotNull(bchLog.getStartedTime()); assertNotNull(bchLog.getFinishedTime()); // restore RepositoryEntry newRE = helper.createRepositoryEntry(DatabaseStructureType.MULTI, repository.getConfiguration().getSystemWorkspaceName(), dsName); newRE.setName(repository.getConfiguration().getName()); backup.restoreExistingRepository(bchLog.getBackupId(), false); checkConent(repositoryService.getRepository(newRE.getName()), newRE.getSystemWorkspaceName()); } public void testWorkspaceRestoreWithConfig() throws Exception { // prepare ManageableRepository repository = helper.createRepository(container, DatabaseStructureType.MULTI, null); WorkspaceEntry wsEntry = helper.createWorkspaceEntry(DatabaseStructureType.MULTI, null); helper.addWorkspace(repository, wsEntry); addConent(repository, wsEntry.getName()); // backup File backDir = new File("target/backup/" + IdGenerator.generate()); backDir.mkdirs(); BackupConfig config = new BackupConfig(); config.setRepository(repository.getConfiguration().getName()); config.setWorkspace(wsEntry.getName()); config.setBackupType(BackupManager.FULL_BACKUP_ONLY); config.setBackupDir(backDir); BackupChain bch = backup.startBackup(config); waitEndOfBackup(bch); backup.stopBackup(bch); removeWorkspaceFully(repository.getConfiguration().getName(), wsEntry.getName()); // restore File backLog = new File(bch.getLogFilePath()); assertTrue(backLog.exists()); BackupChainLog bchLog = new BackupChainLog(backLog); assertNotNull(bchLog.getStartedTime()); assertNotNull(bchLog.getFinishedTime()); backup.restoreWorkspace(bchLog.getBackupId(), false); checkConent(repository, repository.getConfiguration().getWorkspaceEntries().get(1).getName()); } public void testRepositoryRestoreWithConfig() throws Exception { // prepare ManageableRepository repository = helper.createRepository(container, DatabaseStructureType.MULTI, null); addConent(repository, repository.getConfiguration().getSystemWorkspaceName()); // backup File backDir = new File("target/backup/" + IdGenerator.generate()); backDir.mkdirs(); RepositoryBackupConfig config = new RepositoryBackupConfig(); config.setRepository(repository.getConfiguration().getName()); config.setBackupType(BackupManager.FULL_BACKUP_ONLY); config.setBackupDir(backDir); RepositoryBackupChain bch = backup.startBackup(config); waitEndOfBackup(bch); backup.stopBackup(bch); // restore removeRepositoryFully(repository.getConfiguration().getName()); File backLog = new File(bch.getLogFilePath()); assertTrue(backLog.exists()); RepositoryBackupChainLog bchLog = new RepositoryBackupChainLog(backLog); assertNotNull(bchLog.getStartedTime()); assertNotNull(bchLog.getFinishedTime()); backup.restoreRepository(bchLog.getBackupId(), false); checkConent(repositoryService.getRepository(config.getRepository()), repositoryService.getRepository(config.getRepository()).getConfiguration().getSystemWorkspaceName()); } public void testRepositoryRestoreWithNullConfig() throws Exception { // prepare ManageableRepository repository = helper.createRepository(container, DatabaseStructureType.MULTI, null); addConent(repository, repository.getConfiguration().getSystemWorkspaceName()); // backup File backDir = new File("target/backup/" + IdGenerator.generate()); backDir.mkdirs(); RepositoryBackupConfig config = new RepositoryBackupConfig(); config.setRepository(repository.getConfiguration().getName()); config.setBackupType(BackupManager.FULL_BACKUP_ONLY); config.setBackupDir(backDir); RepositoryBackupChain bch = backup.startBackup(config); waitEndOfBackup(bch); backup.stopBackup(bch); // restore removeRepositoryFully(repository.getConfiguration().getName()); File backLog = new File(bch.getLogFilePath()); assertTrue(backLog.exists()); RepositoryBackupChainLog bchLog = new RepositoryBackupChainLog(backLog); assertNotNull(bchLog.getStartedTime()); assertNotNull(bchLog.getFinishedTime()); backup.restore(bchLog, null, false); checkConent(repositoryService.getRepository(config.getRepository()), repositoryService.getRepository(config.getRepository()).getConfiguration().getSystemWorkspaceName()); } public void testWorkspaceRestoreWithNullConfig() throws Exception { // prepare ManageableRepository repository = helper.createRepository(container, DatabaseStructureType.MULTI, null); WorkspaceEntry wsEntry = helper.createWorkspaceEntry(DatabaseStructureType.MULTI, null); helper.addWorkspace(repository, wsEntry); addConent(repository, wsEntry.getName()); // backup File backDir = new File("target/backup/" + IdGenerator.generate()); backDir.mkdirs(); BackupConfig config = new BackupConfig(); config.setRepository(repository.getConfiguration().getName()); config.setWorkspace(wsEntry.getName()); config.setBackupType(BackupManager.FULL_BACKUP_ONLY); config.setBackupDir(backDir); BackupChain bch = backup.startBackup(config); waitEndOfBackup(bch); backup.stopBackup(bch); removeWorkspaceFully(repository.getConfiguration().getName(), wsEntry.getName()); // restore File backLog = new File(bch.getLogFilePath()); assertTrue(backLog.exists()); BackupChainLog bchLog = new BackupChainLog(backLog); assertNotNull(bchLog.getStartedTime()); assertNotNull(bchLog.getFinishedTime()); try { backup.restore(bchLog, repository.getConfiguration().getName() + "not_exists", null, false); fail("Exception should be thrown"); } catch (Exception e) { } backup.restore(bchLog, repository.getConfiguration().getName(), null, false); checkConent(repository, repository.getConfiguration().getWorkspaceEntries().get(1).getName()); } public void testExistedWorkspaceRestoreWithConfigBackupSetDir() throws Exception { // prepare ManageableRepository repository = helper.createRepository(container, DatabaseStructureType.MULTI, null); WorkspaceEntry wsEntry = helper.createWorkspaceEntry(DatabaseStructureType.MULTI, null); helper.addWorkspace(repository, wsEntry); addConent(repository, wsEntry.getName()); // backup File backDir = new File("target/backup/" + IdGenerator.generate()); backDir.mkdirs(); BackupConfig config = new BackupConfig(); config.setRepository(repository.getConfiguration().getName()); config.setWorkspace(wsEntry.getName()); config.setBackupType(BackupManager.FULL_BACKUP_ONLY); config.setBackupDir(backDir); BackupChain bch = backup.startBackup(config); waitEndOfBackup(bch); backup.stopBackup(bch); // restore File backLog = new File(bch.getLogFilePath()); assertTrue(backLog.exists()); BackupChainLog bchLog = new BackupChainLog(backLog); assertNotNull(bchLog.getStartedTime()); assertNotNull(bchLog.getFinishedTime()); backup.restoreExistingWorkspace(bchLog.getBackupConfig().getBackupDir(), false); checkConent(repository, repository.getConfiguration().getWorkspaceEntries().get(1).getName()); } public void testExistedRepositoryRestoreWithConfigBackupSetDir() throws Exception { // prepare ManageableRepository repository = helper.createRepository(container, DatabaseStructureType.MULTI, null); addConent(repository, repository.getConfiguration().getSystemWorkspaceName()); // backup File backDir = new File("target/backup/" + IdGenerator.generate()); backDir.mkdirs(); RepositoryBackupConfig config = new RepositoryBackupConfig(); config.setRepository(repository.getConfiguration().getName()); config.setBackupType(BackupManager.FULL_BACKUP_ONLY); config.setBackupDir(backDir); RepositoryBackupChain bch = backup.startBackup(config); waitEndOfBackup(bch); backup.stopBackup(bch); File backLog = new File(bch.getLogFilePath()); assertTrue(backLog.exists()); RepositoryBackupChainLog bchLog = new RepositoryBackupChainLog(backLog); assertNotNull(bchLog.getStartedTime()); assertNotNull(bchLog.getFinishedTime()); backup.restoreExistingRepository(bchLog.getBackupConfig().getBackupDir(), false); checkConent(repositoryService.getRepository(config.getRepository()), repositoryService.getRepository(config.getRepository()).getConfiguration().getSystemWorkspaceName()); } public void testWorkspaceRestoreWithConfigBackupSetDir() throws Exception { // prepare ManageableRepository repository = helper.createRepository(container, DatabaseStructureType.MULTI, null); WorkspaceEntry wsEntry = helper.createWorkspaceEntry(DatabaseStructureType.MULTI, null); helper.addWorkspace(repository, wsEntry); addConent(repository, wsEntry.getName()); // backup File backDir = new File("target/backup/" + IdGenerator.generate()); backDir.mkdirs(); BackupConfig config = new BackupConfig(); config.setRepository(repository.getConfiguration().getName()); config.setWorkspace(wsEntry.getName()); config.setBackupType(BackupManager.FULL_BACKUP_ONLY); config.setBackupDir(backDir); BackupChain bch = backup.startBackup(config); waitEndOfBackup(bch); backup.stopBackup(bch); removeWorkspaceFully(repository.getConfiguration().getName(), wsEntry.getName()); // restore File backLog = new File(bch.getLogFilePath()); assertTrue(backLog.exists()); BackupChainLog bchLog = new BackupChainLog(backLog); assertNotNull(bchLog.getStartedTime()); assertNotNull(bchLog.getFinishedTime()); backup.restoreWorkspace(bchLog.getBackupConfig().getBackupDir(), false); checkConent(repository, repository.getConfiguration().getWorkspaceEntries().get(1).getName()); } public void testRepositoryRestoreWithConfigBackupSetDir() throws Exception { // prepare ManageableRepository repository = helper.createRepository(container, DatabaseStructureType.MULTI, null); addConent(repository, repository.getConfiguration().getSystemWorkspaceName()); // backup File backDir = new File("target/backup/" + IdGenerator.generate()); backDir.mkdirs(); RepositoryBackupConfig config = new RepositoryBackupConfig(); config.setRepository(repository.getConfiguration().getName()); config.setBackupType(BackupManager.FULL_BACKUP_ONLY); config.setBackupDir(backDir); RepositoryBackupChain bch = backup.startBackup(config); waitEndOfBackup(bch); backup.stopBackup(bch); // restore removeRepositoryFully(repository.getConfiguration().getName()); File backLog = new File(bch.getLogFilePath()); assertTrue(backLog.exists()); RepositoryBackupChainLog bchLog = new RepositoryBackupChainLog(backLog); assertNotNull(bchLog.getStartedTime()); assertNotNull(bchLog.getFinishedTime()); backup.restoreRepository(bchLog.getBackupConfig().getBackupDir(), false); checkConent(repositoryService.getRepository(config.getRepository()), repositoryService.getRepository(config.getRepository()).getConfiguration().getSystemWorkspaceName()); } public void testEnvironmentVariablesToBackupDir() throws Exception { // prepare stage #1 ManageableRepository repository = helper.createRepository(container, DatabaseStructureType.MULTI, null); addConent(repository, repository.getConfiguration().getSystemWorkspaceName()); String tempDir = PrivilegedSystemHelper.getProperty("java.io.tmpdir"); // backup File backDir = new File(tempDir); RepositoryBackupConfig config = new RepositoryBackupConfig(); config.setRepository(repository.getConfiguration().getName()); config.setBackupType(BackupManager.FULL_BACKUP_ONLY); config.setBackupDir(backDir); RepositoryBackupChain bch = backup.startBackup(config); waitEndOfBackup(bch); backup.stopBackup(bch); // prepare stage #2 String repositoryBackupChainLogPath = bch.getLogFilePath(); String backupDitEnv = backDir.getCanonicalPath(); String relativePath = bch.getBackupConfig().getBackupDir().getCanonicalPath().replace(backupDitEnv, ""); String relativePathForWrite = relativePath; if (File.separator.equals("\\")) { relativePathForWrite = relativePath.replaceAll("\\\\", "\\\\\\\\"); } String newBackupDir = "\\${java.io.tmpdir}" + relativePathForWrite; File dest = new File(repositoryBackupChainLogPath + ".xml"); dest.createNewFile(); RepositoryBackupChainLog newRepositoryBackupChainLog = null; try { String sConfig = setNewBackupDirInRepositoryBackupChainLog(new File(repositoryBackupChainLogPath), dest, newBackupDir); assertTrue(sConfig.contains("${java.io.tmpdir}" + relativePath)); // check newRepositoryBackupChainLog = new RepositoryBackupChainLog(dest); assertEquals(bch.getBackupConfig().getBackupDir().getCanonicalPath(), newRepositoryBackupChainLog.getBackupConfig().getBackupDir().getCanonicalPath()); } finally { newRepositoryBackupChainLog = null; dest.delete(); deleteFolder(bch.getBackupConfig().getBackupDir()); } } public void testRelativeBackupDir() throws Exception { // prepare stage #1 ManageableRepository repository = helper.createRepository(container, DatabaseStructureType.MULTI, null); addConent(repository, repository.getConfiguration().getSystemWorkspaceName()); // backup File backDir = new File("target"); RepositoryBackupConfig config = new RepositoryBackupConfig(); config.setRepository(repository.getConfiguration().getName()); config.setBackupType(BackupManager.FULL_BACKUP_ONLY); config.setBackupDir(backDir); RepositoryBackupChain bch = backup.startBackup(config); waitEndOfBackup(bch); backup.stopBackup(bch); // prepare stage #2 String repositoryBackupChainLogPath = bch.getLogFilePath(); String relativePrefixBackupDir = backDir.getCanonicalFile().getParent() + File.separator; String newBackupDir = bch.getBackupConfig().getBackupDir().getCanonicalPath().replace(relativePrefixBackupDir, ""); String newBackupDirForWrite = newBackupDir; if (File.separator.equals("\\")) { newBackupDirForWrite = newBackupDir.replaceAll("\\\\", "\\\\\\\\"); } File dest = new File(repositoryBackupChainLogPath + ".xml"); dest.createNewFile(); RepositoryBackupChainLog newRepositoryBackupChainLog = null; String sConfig = setNewBackupDirInRepositoryBackupChainLog(new File(repositoryBackupChainLogPath), dest, newBackupDirForWrite); assertTrue(sConfig.contains(newBackupDir)); // check newRepositoryBackupChainLog = new RepositoryBackupChainLog(dest); assertEquals(bch.getBackupConfig().getBackupDir().getCanonicalPath(), newRepositoryBackupChainLog .getBackupConfig().getBackupDir().getCanonicalPath()); } /** * Use JobExistingWorkspaceSameConfigRestore to restore. */ public void testExistedWorkspaceRestoreSingleDBTwoWS() throws Exception { // prepare String dsName1 = helper.createDatasource(); String dsName2 = helper.createDatasource(); ManageableRepository repository = helper.createRepository(container, DatabaseStructureType.SINGLE, dsName1); WorkspaceEntry wsEntry1 = helper.createWorkspaceEntry(DatabaseStructureType.SINGLE, dsName1); helper.addWorkspace(repository, wsEntry1); addConent(repository, wsEntry1.getName()); WorkspaceEntry wsEntry2 = helper.createWorkspaceEntry(DatabaseStructureType.SINGLE, dsName2); helper.addWorkspace(repository, wsEntry2); addConent(repository, wsEntry2.getName()); // backup File backDir = new File("target/backup/" + IdGenerator.generate()); backDir.mkdirs(); BackupConfig config = new BackupConfig(); config.setRepository(repository.getConfiguration().getName()); config.setWorkspace(wsEntry1.getName()); config.setBackupType(BackupManager.FULL_BACKUP_ONLY); config.setBackupDir(backDir); BackupChain bch = backup.startBackup(config); waitEndOfBackup(bch); backup.stopBackup(bch); // restore File backLog = new File(bch.getLogFilePath()); assertTrue(backLog.exists()); BackupChainLog bchLog = new BackupChainLog(backLog); assertNotNull(bchLog.getStartedTime()); assertNotNull(bchLog.getFinishedTime()); backup.restoreExistingWorkspace(bchLog, repository.getConfiguration().getName(), repository.getConfiguration() .getWorkspaceEntries().get(1), false); checkConent(repository, repository.getConfiguration().getWorkspaceEntries().get(1).getName()); checkConent(repository, repository.getConfiguration().getWorkspaceEntries().get(2).getName()); } /** * Use JobExistingWorkspaceRestore to restore. */ public void testExistedWorkspaceRestoreSingleDBTwoWSWithDiffConfig() throws Exception { // prepare String dsName1 = helper.createDatasource(); String dsName2 = helper.createDatasource(); ManageableRepository repository = helper.createRepository(container, DatabaseStructureType.SINGLE, dsName1); WorkspaceEntry wsEntry1 = helper.createWorkspaceEntry(DatabaseStructureType.SINGLE, dsName1); helper.addWorkspace(repository, wsEntry1); addConent(repository, wsEntry1.getName()); WorkspaceEntry wsEntry2 = helper.createWorkspaceEntry(DatabaseStructureType.SINGLE, dsName2); helper.addWorkspace(repository, wsEntry2); addConent(repository, wsEntry2.getName()); // backup File backDir = new File("target/backup/" + IdGenerator.generate()); backDir.mkdirs(); BackupConfig config = new BackupConfig(); config.setRepository(repository.getConfiguration().getName()); config.setWorkspace(wsEntry1.getName()); config.setBackupType(BackupManager.FULL_BACKUP_ONLY); config.setBackupDir(backDir); BackupChain bch = backup.startBackup(config); waitEndOfBackup(bch); backup.stopBackup(bch); // restore File backLog = new File(bch.getLogFilePath()); assertTrue(backLog.exists()); BackupChainLog bchLog = new BackupChainLog(backLog); assertNotNull(bchLog.getStartedTime()); assertNotNull(bchLog.getFinishedTime()); // change cofig WorkspaceEntry wsEntry = helper.copyWorkspaceEntry(repository.getConfiguration().getWorkspaceEntries().get(1)); wsEntry.getContainer().addParameter(new SimpleParameterEntry("max-buffer-size", "307200")); backup.restoreExistingWorkspace(bchLog, repository.getConfiguration().getName(), wsEntry, false); checkConent(repository, repository.getConfiguration().getWorkspaceEntries().get(1).getName()); checkConent(repository, repository.getConfiguration().getWorkspaceEntries().get(2).getName()); } public void testExistedRepositoryRestoreSingelDBSameConfig() throws Exception { // prepare String dsName = helper.createDatasource(); ManageableRepository repository = helper.createRepository(container, DatabaseStructureType.SINGLE, dsName); addConent(repository, repository.getConfiguration().getSystemWorkspaceName()); WorkspaceEntry wsEntry1 = helper.createWorkspaceEntry(DatabaseStructureType.SINGLE, dsName); helper.addWorkspace(repository, wsEntry1); addConent(repository, wsEntry1.getName()); // backup File backDir = new File("target/backup/" + IdGenerator.generate()); backDir.mkdirs(); RepositoryBackupConfig config = new RepositoryBackupConfig(); config.setRepository(repository.getConfiguration().getName()); config.setBackupType(BackupManager.FULL_BACKUP_ONLY); config.setBackupDir(backDir); RepositoryBackupChain bch = backup.startBackup(config); waitEndOfBackup(bch); backup.stopBackup(bch); File backLog = new File(bch.getLogFilePath()); assertTrue(backLog.exists()); RepositoryBackupChainLog bchLog = new RepositoryBackupChainLog(backLog); assertNotNull(bchLog.getStartedTime()); assertNotNull(bchLog.getFinishedTime()); // restore backup.restoreExistingRepository(bchLog, helper.copyRepositoryEntry(repository.getConfiguration()), false); checkConent(repositoryService.getRepository(repository.getConfiguration().getName()), repository .getConfiguration().getSystemWorkspaceName()); } public void testCreateRepositoryAfterFailRestoreOnSystemWS() throws Exception { // create repository RepositoryService service = (RepositoryService)container.getComponentInstanceOfType(RepositoryService.class); String dsName = helper.createDatasource(); RepositoryEntry repoEntry = helper.createRepositoryEntry(DatabaseStructureType.SINGLE, null, dsName); service.createRepository(repoEntry); ManageableRepository repository = service.getRepository(repoEntry.getName()); WorkspaceEntry wsEntry = helper.createWorkspaceEntry(DatabaseStructureType.SINGLE, dsName); helper.addWorkspace(repository, wsEntry); service.getConfig().retain(); addConent(repository, repository.getConfiguration().getSystemWorkspaceName()); // backup File backDir = new File("target/backup/" + IdGenerator.generate()); backDir.mkdirs(); RepositoryBackupConfig config = new RepositoryBackupConfig(); config.setRepository(repository.getConfiguration().getName()); config.setBackupType(BackupManager.FULL_BACKUP_ONLY); config.setBackupDir(backDir); RepositoryBackupChain bch = backup.startBackup(config); waitEndOfBackup(bch); backup.stopBackup(bch); File backLog = new File(bch.getLogFilePath()); assertTrue(backLog.exists()); // copy repository entry and set new ata source RepositoryEntry newRepoEntry = helper.copyRepositoryEntry(repoEntry); String newDSName = helper.createDatasource(); for (WorkspaceEntry ws : newRepoEntry.getWorkspaceEntries()) { ws.getContainer().putParameterValue("source-name", newDSName); } // create repository entry with name of data source name is wrong in system workspace RepositoryEntry wrongRepoEntry = helper.copyRepositoryEntry(repoEntry); for (WorkspaceEntry ws : wrongRepoEntry.getWorkspaceEntries()) { if (repository.getConfiguration().getSystemWorkspaceName().equals(ws.getName())) { ws.getContainer().putParameterValue("source-name", "wrong"); break; } } // remove existed repository removeRepositoryFully(repository.getConfiguration().getName()); // wrong restore try { backup.restore(new RepositoryBackupChainLog(backLog), wrongRepoEntry, false); fail(); } catch (Exception e) { //ok } // restore backup.restore(new RepositoryBackupChainLog(backLog), newRepoEntry, false); checkConent(repositoryService.getRepository(newRepoEntry.getName()), newRepoEntry.getSystemWorkspaceName()); } public void testCreateRepositoryAfterFailRestoreOnNonSystemWS() throws Exception { // create repository RepositoryService service = (RepositoryService)container.getComponentInstanceOfType(RepositoryService.class); String dsName = helper.createDatasource(); RepositoryEntry repoEntry = helper.createRepositoryEntry(DatabaseStructureType.SINGLE, null, dsName); service.createRepository(repoEntry); ManageableRepository repository = service.getRepository(repoEntry.getName()); WorkspaceEntry wsEntry = helper.createWorkspaceEntry(DatabaseStructureType.SINGLE, dsName); helper.addWorkspace(repository, wsEntry); service.getConfig().retain(); addConent(repository, wsEntry.getName()); // backup File backDir = new File("target/backup/" + IdGenerator.generate()); backDir.mkdirs(); RepositoryBackupConfig config = new RepositoryBackupConfig(); config.setRepository(repository.getConfiguration().getName()); config.setBackupType(BackupManager.FULL_BACKUP_ONLY); config.setBackupDir(backDir); RepositoryBackupChain bch = backup.startBackup(config); waitEndOfBackup(bch); backup.stopBackup(bch); File backLog = new File(bch.getLogFilePath()); assertTrue(backLog.exists()); // copy repository entry and set new ata source RepositoryEntry newRepoEntry = helper.copyRepositoryEntry(repoEntry); String newDSName = helper.createDatasource(); for (WorkspaceEntry ws : newRepoEntry.getWorkspaceEntries()) { ws.getContainer().putParameterValue("source-name", newDSName); } // create repository entry with name of data source name is wrong in second workspace RepositoryEntry wrongRepoEntry = helper.copyRepositoryEntry(repoEntry); for (WorkspaceEntry ws : wrongRepoEntry.getWorkspaceEntries()) { if (wsEntry.getName().equals(ws.getName())) { ws.getContainer().putParameterValue("source-name", "wrong"); break; } } // remove existed repository removeRepositoryFully(repository.getConfiguration().getName()); // wrong restore try { backup.restore(new RepositoryBackupChainLog(backLog), wrongRepoEntry, false); fail(); } catch (Exception e) { //ok } // restore backup.restore(new RepositoryBackupChainLog(backLog), newRepoEntry, false); checkConent(repositoryService.getRepository(newRepoEntry.getName()), wsEntry.getName()); } public void testCreateRepositoryAfterFailRestoreWithFailConfiguration() throws Exception { // create repository RepositoryService service = (RepositoryService)container.getComponentInstanceOfType(RepositoryService.class); String dsName = helper.createDatasource(); RepositoryEntry repoEntry = helper.createRepositoryEntry(DatabaseStructureType.SINGLE, null, dsName); service.createRepository(repoEntry); ManageableRepository repository = service.getRepository(repoEntry.getName()); WorkspaceEntry wsEntry = helper.createWorkspaceEntry(DatabaseStructureType.SINGLE, dsName); helper.addWorkspace(repository, wsEntry); service.getConfig().retain(); addConent(repository, wsEntry.getName()); // backup File backDir = new File("target/backup/" + IdGenerator.generate()); backDir.mkdirs(); RepositoryBackupConfig config = new RepositoryBackupConfig(); config.setRepository(repository.getConfiguration().getName()); config.setBackupType(BackupManager.FULL_BACKUP_ONLY); config.setBackupDir(backDir); RepositoryBackupChain bch = backup.startBackup(config); waitEndOfBackup(bch); backup.stopBackup(bch); File backLog = new File(bch.getLogFilePath()); assertTrue(backLog.exists()); // copy repository entry and set new data source RepositoryEntry newRepoEntry = helper.copyRepositoryEntry(repoEntry); String newDSName = helper.createDatasource(); for (WorkspaceEntry ws : newRepoEntry.getWorkspaceEntries()) { ws.getContainer().putParameterValue("source-name", newDSName); } // create repository entry with name of data source name is wrong in second workspace RepositoryEntry wrongRepoEntry = helper.copyRepositoryEntry(repoEntry); for (WorkspaceEntry ws : wrongRepoEntry.getWorkspaceEntries()) { if (wsEntry.getName().equals(ws.getName())) { ws.getContainer().setType("wrong parameter"); } } // remove existed repository removeRepositoryFully(repository.getConfiguration().getName()); // wrong restore try { backup.restore(new RepositoryBackupChainLog(backLog), wrongRepoEntry, false); fail(); } catch (Exception e) { //ok } // restore backup.restore(new RepositoryBackupChainLog(backLog), newRepoEntry, false); checkConent(repositoryService.getRepository(newRepoEntry.getName()), wsEntry.getName()); } public void testRepositoryFullBackupWithQueryInBackgroudOneThread() throws Exception { // prepare ManageableRepository repository = helper.createRepository(container, DatabaseStructureType.MULTI, null); addConent(repository, repository.getConfiguration().getSystemWorkspaceName()); SessionImpl session = (SessionImpl)repository.login(credentials, repository.getConfiguration().getSystemWorkspaceName()); final Query q = session.getWorkspace().getQueryManager().createQuery( "select * from nt:unstructured where jcr:path like '/test/%'", Query.SQL); QueryResult res = q.execute(); assertEquals("Wrong nodes count in result set", 3, res.getNodes().getSize()); ThreadQueryExecuter tQueryExecuter = new ThreadQueryExecuter(q); tQueryExecuter.start(); // backup File backDir = new File("target/backup/" + IdGenerator.generate()); backDir.mkdirs(); RepositoryBackupConfig config = new RepositoryBackupConfig(); config.setRepository(repository.getConfiguration().getName()); config.setBackupType(BackupManager.FULL_BACKUP_ONLY); config.setBackupDir(backDir); RepositoryBackupChain bch = backup.startBackup(config); waitEndOfBackup(bch); backup.stopBackup(bch); tQueryExecuter.close(); assertNull("Can not execute query.", tQueryExecuter.getException()); } class ThreadQueryExecuter extends Thread { private AtomicBoolean closed = new AtomicBoolean(false); private Exception exception; private Query query; public ThreadQueryExecuter(Query q) { setName("QueryExecuter" + getName()); this.query = q; } public Exception getException() { return exception; } public void close() { closed.set(true); } @Override public void run() { while (!closed.get()) { try { QueryResult result = query.execute(); result.getNodes().getSize(); } catch (Exception re) { log.error("Can not execute query.", re); exception = re; } } } } public void testRepositoryRestoreWithRemoveJobOnceOver() throws Exception { // prepare ManageableRepository repository = helper.createRepository(container, DatabaseStructureType.MULTI, null); addConent(repository, repository.getConfiguration().getSystemWorkspaceName()); // backup File backDir = new File("target/backup/" + IdGenerator.generate()); backDir.mkdirs(); RepositoryBackupConfig config = new RepositoryBackupConfig(); config.setRepository(repository.getConfiguration().getName()); config.setBackupType(BackupManager.FULL_BACKUP_ONLY); config.setBackupDir(backDir); RepositoryBackupChain bch = backup.startBackup(config); waitEndOfBackup(bch); backup.stopBackup(bch); // restore RepositoryEntry newRE = helper.createRepositoryEntry(DatabaseStructureType.MULTI, repository.getConfiguration().getSystemWorkspaceName(), null); File backLog = new File(bch.getLogFilePath()); assertTrue(backLog.exists()); RepositoryBackupChainLog bchLog = new RepositoryBackupChainLog(backLog); assertNotNull(bchLog.getStartedTime()); assertNotNull(bchLog.getFinishedTime()); backup.restore(bchLog, newRE, false, true); checkConent(repositoryService.getRepository(newRE.getName()), newRE.getSystemWorkspaceName()); assertNull(backup.getLastRepositoryRestore(newRE.getName())); } /** * Set new backup directory in RepositoryBackupChainLog * * @param src * source file of RepositoryBackupChainLog * @param dest * destination file of RepositoryBackupChainLog * @param newBackupDir * @return String * the content of file destination * @throws IOException */ protected String setNewBackupDirInRepositoryBackupChainLog(File src, File dest, String newBackupDir) throws IOException { InputStream in = PrivilegedFileHelper.fileInputStream(src); OutputStream out = PrivilegedFileHelper.fileOutputStream(dest); byte[] buf = new byte[(int) (PrivilegedFileHelper.length(src))]; in.read(buf); String sConfig = new String(buf, Constants.DEFAULT_ENCODING); sConfig = sConfig.replaceAll("<backup-dir>.+</backup-dir>", "<backup-dir>" + newBackupDir + "</backup-dir>"); out.write(sConfig.getBytes(Constants.DEFAULT_ENCODING)); in.close(); out.close(); return sConfig; } protected void deleteFolder(File f) { if (f.isDirectory()) { for (File file : f.listFiles()) { deleteFolder(file); } f.delete(); } else { f.delete(); } } }