[exo-jcr-commits] exo-jcr SVN: r4908 - in jcr/trunk/exo.jcr.component.ext/src: test/java/org/exoplatform/services/jcr/ext/backup and 1 other directories.

do-not-reply at jboss.org do-not-reply at jboss.org
Wed Sep 14 03:05:54 EDT 2011


Author: areshetnyak
Date: 2011-09-14 03:05:54 -0400 (Wed, 14 Sep 2011)
New Revision: 4908

Modified:
   jcr/trunk/exo.jcr.component.ext/src/main/java/org/exoplatform/services/jcr/ext/backup/impl/BackupManagerImpl.java
   jcr/trunk/exo.jcr.component.ext/src/main/java/org/exoplatform/services/jcr/ext/backup/impl/JobExistingWorkspaceSameConfigRestore.java
   jcr/trunk/exo.jcr.component.ext/src/test/java/org/exoplatform/services/jcr/ext/backup/AbstractBackupUseCasesTest.java
   jcr/trunk/exo.jcr.component.ext/src/test/java/org/exoplatform/services/jcr/util/TesterConfigurationHelper.java
Log:
EXOJCR-1487 : Repository was suspended for use case of RDBMS restore workspace if using single-db. Suspending of repository is necessary to avoid inconsistency DB, because in during RDBMS restoring is removing constraints on DB. 

Modified: jcr/trunk/exo.jcr.component.ext/src/main/java/org/exoplatform/services/jcr/ext/backup/impl/BackupManagerImpl.java
===================================================================
--- jcr/trunk/exo.jcr.component.ext/src/main/java/org/exoplatform/services/jcr/ext/backup/impl/BackupManagerImpl.java	2011-09-14 06:03:55 UTC (rev 4907)
+++ jcr/trunk/exo.jcr.component.ext/src/main/java/org/exoplatform/services/jcr/ext/backup/impl/BackupManagerImpl.java	2011-09-14 07:05:54 UTC (rev 4908)
@@ -954,39 +954,68 @@
 
       WorkspaceInitializerEntry wiEntry = new WorkspaceInitializerEntry();
 
-      if ((Class.forName(fBackupType).equals(FullBackupJob.class)))
+      try
       {
-         // set the initializer SysViewWorkspaceInitializer
-         wiEntry.setType(SysViewWorkspaceInitializer.class.getCanonicalName());
+         if ((Class.forName(fBackupType).equals(FullBackupJob.class)))
+         {
+            // set the initializer SysViewWorkspaceInitializer
+            wiEntry.setType(SysViewWorkspaceInitializer.class.getCanonicalName());
 
-         List<SimpleParameterEntry> wieParams = new ArrayList<SimpleParameterEntry>();
-         wieParams.add(new SimpleParameterEntry(SysViewWorkspaceInitializer.RESTORE_PATH_PARAMETER, pathBackupFile));
+            List<SimpleParameterEntry> wieParams = new ArrayList<SimpleParameterEntry>();
+            wieParams.add(new SimpleParameterEntry(SysViewWorkspaceInitializer.RESTORE_PATH_PARAMETER, pathBackupFile));
 
-         wiEntry.setParameters(wieParams);
-      }
-      else if ((Class.forName(fBackupType)
-               .equals(org.exoplatform.services.jcr.ext.backup.impl.rdbms.FullBackupJob.class)))
-      {
-         // set the initializer RdbmsWorkspaceInitializer
-         wiEntry.setType(RdbmsWorkspaceInitializer.class.getCanonicalName());
+            wiEntry.setParameters(wieParams);
+         }
+         else if ((Class.forName(fBackupType)
+                  .equals(org.exoplatform.services.jcr.ext.backup.impl.rdbms.FullBackupJob.class)))
+         {
+            // set state SUSPENDED to other workspaces if singledb
+            if (workspaceEntry.getContainer().getParameterBoolean("multi-db") == false)
+            {
+               defRep.setState(ManageableRepository.SUSPENDED);
+            }
+            // set the initializer RdbmsWorkspaceInitializer
+            wiEntry.setType(RdbmsWorkspaceInitializer.class.getCanonicalName());
 
-         List<SimpleParameterEntry> wieParams = new ArrayList<SimpleParameterEntry>();
-         wieParams.add(new SimpleParameterEntry(RdbmsWorkspaceInitializer.RESTORE_PATH_PARAMETER, new File(
-                  pathBackupFile).getParent()));
+            List<SimpleParameterEntry> wieParams = new ArrayList<SimpleParameterEntry>();
+            wieParams.add(new SimpleParameterEntry(RdbmsWorkspaceInitializer.RESTORE_PATH_PARAMETER, new File(
+                     pathBackupFile).getParent()));
 
-         wiEntry.setParameters(wieParams);
-      }
+            wiEntry.setParameters(wieParams);
+         }
 
-      workspaceEntry.setInitializer(wiEntry);
+         workspaceEntry.setInitializer(wiEntry);
 
-      //restore
-      defRep.configWorkspace(workspaceEntry);
-      defRep.createWorkspace(workspaceEntry.getName());
+         //restore
+         defRep.configWorkspace(workspaceEntry);
+         defRep.createWorkspace(workspaceEntry.getName());
 
-      //set original workspace initializer
-      WorkspaceContainerFacade wcf = defRep.getWorkspaceContainer(workspaceEntry.getName());
-      WorkspaceEntry createdWorkspaceEntry = (WorkspaceEntry)wcf.getComponent(WorkspaceEntry.class);
-      createdWorkspaceEntry.setInitializer(wieOriginal);
+         //set original workspace initializer
+         WorkspaceContainerFacade wcf = defRep.getWorkspaceContainer(workspaceEntry.getName());
+         WorkspaceEntry createdWorkspaceEntry = (WorkspaceEntry) wcf.getComponent(WorkspaceEntry.class);
+         createdWorkspaceEntry.setInitializer(wieOriginal);
+      }
+      finally
+      {
+         try
+         {
+            if (workspaceEntry.getContainer().getParameterBoolean("multi-db") == false)
+            {
+               if (defRep.getState() != ManageableRepository.ONLINE)
+               {
+                  defRep.setState(ManageableRepository.ONLINE);
+               }
+            }
+         }
+         catch (RepositoryException e)
+         {
+            log.error("Con not set ONLYNE state for repository +\"" + defRep.getName() + "\"", e);
+         }
+         catch (RepositoryConfigurationException e)
+         {
+            log.error("Con not set ONLYNE state for repository +\"" + defRep.getName() + "\"", e);
+         }
+      }
    }
 
    private void incrementalRestore(String pathBackupFile, String repositoryName, String workspaceName)

Modified: jcr/trunk/exo.jcr.component.ext/src/main/java/org/exoplatform/services/jcr/ext/backup/impl/JobExistingWorkspaceSameConfigRestore.java
===================================================================
--- jcr/trunk/exo.jcr.component.ext/src/main/java/org/exoplatform/services/jcr/ext/backup/impl/JobExistingWorkspaceSameConfigRestore.java	2011-09-14 06:03:55 UTC (rev 4907)
+++ jcr/trunk/exo.jcr.component.ext/src/main/java/org/exoplatform/services/jcr/ext/backup/impl/JobExistingWorkspaceSameConfigRestore.java	2011-09-14 07:05:54 UTC (rev 4908)
@@ -74,12 +74,21 @@
 
       try
       {
-         repositoryService.getRepository(repositoryName).getWorkspaceContainer(wEntry.getName())
-            .setState(ManageableRepository.SUSPENDED);
+         ManageableRepository repository = repositoryService.getRepository(repositoryName);
 
+         if (wEntry.getContainer().getParameterBoolean("multi-db") == false)
+         {
+            repository.setState(ManageableRepository.SUSPENDED);
+         }
+         else
+         {
+            repository.getWorkspaceContainer(wEntry.getName()).setState(
+                     ManageableRepository.SUSPENDED);
+         }
+
          // get all restorers
          List<Backupable> backupable =
-            repositoryService.getRepository(repositoryName).getWorkspaceContainer(wEntry.getName())
+                  repository.getWorkspaceContainer(wEntry.getName())
                .getComponentInstancesOfType(Backupable.class);
 
          File storageDir = backupChainLog.getBackupConfig().getBackupDir();
@@ -105,16 +114,23 @@
             restorer.commit();
          }
 
-         repositoryService.getRepository(repositoryName).getWorkspaceContainer(wEntry.getName())
-            .setState(ManageableRepository.ONLINE);
+         if (wEntry.getContainer().getParameterBoolean("multi-db") == false)
+         {
+            repository.setState(ManageableRepository.ONLINE);
+         }
+         else
+         {
+            repository.getWorkspaceContainer(wEntry.getName()).setState(
+                     ManageableRepository.ONLINE);
+         }
 
          // incremental restore
          DataManager dataManager =
-            (WorkspacePersistentDataManager)repositoryService.getRepository(repositoryName)
-               .getWorkspaceContainer(wEntry.getName()).getComponent(WorkspacePersistentDataManager.class);
+                  (WorkspacePersistentDataManager) repository.getWorkspaceContainer(wEntry.getName()).getComponent(
+                           WorkspacePersistentDataManager.class);
 
          FileCleanerHolder fileCleanHolder =
-            (FileCleanerHolder)repositoryService.getRepository(repositoryName).getWorkspaceContainer(wEntry.getName())
+                  (FileCleanerHolder) repository.getWorkspaceContainer(wEntry.getName())
                .getComponent(FileCleanerHolder.class);
 
          JCRRestore restorer = new JCRRestore(dataManager, fileCleanHolder.getFileCleaner());
@@ -157,8 +173,22 @@
 
          try
          {
-            repositoryService.getRepository(repositoryName).getWorkspaceContainer(wEntry.getName())
-               .setState(ManageableRepository.ONLINE);
+            ManageableRepository repository = repositoryService.getRepository(repositoryName);
+
+            if (wEntry.getContainer().getParameterBoolean("multi-db") == false)
+            {
+               if (repository.getState() != ManageableRepository.ONLINE)
+               {
+                  repository.setState(ManageableRepository.ONLINE);
+               }
+            }
+            else
+            {
+               if (repository.getWorkspaceContainer(wEntry.getName()).getState() != ManageableRepository.ONLINE)
+               {
+                  repository.getWorkspaceContainer(wEntry.getName()).setState(ManageableRepository.ONLINE);
+               }
+            }
          }
          catch (RepositoryException e)
          {

Modified: jcr/trunk/exo.jcr.component.ext/src/test/java/org/exoplatform/services/jcr/ext/backup/AbstractBackupUseCasesTest.java
===================================================================
--- jcr/trunk/exo.jcr.component.ext/src/test/java/org/exoplatform/services/jcr/ext/backup/AbstractBackupUseCasesTest.java	2011-09-14 06:03:55 UTC (rev 4907)
+++ jcr/trunk/exo.jcr.component.ext/src/test/java/org/exoplatform/services/jcr/ext/backup/AbstractBackupUseCasesTest.java	2011-09-14 07:05:54 UTC (rev 4908)
@@ -20,6 +20,7 @@
 import org.exoplatform.commons.utils.PrivilegedFileHelper;
 import org.exoplatform.commons.utils.PrivilegedSystemHelper;
 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;
@@ -31,6 +32,7 @@
 import java.io.IOException;
 import java.io.InputStream;
 import java.io.OutputStream;
+import java.util.List;
 import java.util.Map;
 
 /**
@@ -1306,6 +1308,107 @@
    }
 
    /**
+    * Use JobExistingWorkspaceSameConfigRestore to restore.
+    */
+   public void testExistedWorkspaceRestoreSingleDBTwoWS() throws Exception
+   {
+      // prepare
+      String dsName1 = helper.createDatasource();
+      String dsName2 = helper.createDatasource();
+
+      ManageableRepository repository = helper.createRepository(container, false, dsName1);
+      WorkspaceEntry wsEntry1 = helper.createWorkspaceEntry(false, dsName1);
+      helper.addWorkspace(repository, wsEntry1);
+      addConent(repository, wsEntry1.getName());
+
+      WorkspaceEntry wsEntry2 = helper.createWorkspaceEntry(false, 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, false, dsName1);
+      WorkspaceEntry wsEntry1 = helper.createWorkspaceEntry(false, dsName1);
+      helper.addWorkspace(repository, wsEntry1);
+      addConent(repository, wsEntry1.getName());
+
+      WorkspaceEntry wsEntry2 = helper.createWorkspaceEntry(false, 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));
+
+      List<SimpleParameterEntry> params = wsEntry.getContainer().getParameters();
+      params.set(2, new SimpleParameterEntry("max-buffer-size", "307200"));
+
+      wsEntry.getContainer().setParameters(params);
+
+      backup.restoreExistingWorkspace(bchLog, repository.getConfiguration().getName(), wsEntry, false);
+      checkConent(repository, repository.getConfiguration().getWorkspaceEntries().get(1).getName());
+      checkConent(repository, repository.getConfiguration().getWorkspaceEntries().get(2).getName());
+   }
+
+   /**
     * Set new backup directory in RepositoryBackupChainLog
     * 
     * @param src

Modified: jcr/trunk/exo.jcr.component.ext/src/test/java/org/exoplatform/services/jcr/util/TesterConfigurationHelper.java
===================================================================
--- jcr/trunk/exo.jcr.component.ext/src/test/java/org/exoplatform/services/jcr/util/TesterConfigurationHelper.java	2011-09-14 06:03:55 UTC (rev 4907)
+++ jcr/trunk/exo.jcr.component.ext/src/test/java/org/exoplatform/services/jcr/util/TesterConfigurationHelper.java	2011-09-14 07:05:54 UTC (rev 4908)
@@ -129,8 +129,91 @@
 
       return repository;
    }
+   
+   /**
+   * Create copy of workspace entry. 
+   */
+   public WorkspaceEntry copyWorkspaceEntry(WorkspaceEntry baseWorkspaceEntry) throws Exception
+   {
+      // container entry
+      ArrayList<SimpleParameterEntry> params = new ArrayList<SimpleParameterEntry>();
+      params.addAll(copyList(baseWorkspaceEntry.getContainer().getParameters()));
+      ContainerEntry containerEntry =
+               new ContainerEntry(baseWorkspaceEntry.getContainer().getType(), params);
+      containerEntry.setParameters(params);
 
+      // value storage
+      ArrayList<ValueStorageEntry> list = new ArrayList<ValueStorageEntry>();
+
+      
+      for (ValueStorageEntry baseValueStorageEntry : baseWorkspaceEntry.getContainer().getValueStorages())
+      {
+         ArrayList<ValueStorageFilterEntry> vsparams = new ArrayList<ValueStorageFilterEntry>();
+
+         for (ValueStorageFilterEntry baseValueStorageFilterEntry : baseValueStorageEntry.getFilters())
+         {
+            ValueStorageFilterEntry filterEntry = new ValueStorageFilterEntry();
+            filterEntry.setPropertyType(baseValueStorageFilterEntry.getPropertyType());
+            filterEntry.setPropertyName(baseValueStorageFilterEntry.getPropertyName());
+            filterEntry.setAncestorPath(baseValueStorageFilterEntry.getAncestorPath());
+            filterEntry.setMinValueSize(baseValueStorageFilterEntry.getMinValueSize());
+
+            vsparams.add(filterEntry);
+         }
+
+         ValueStorageEntry valueStorageEntry =
+                  new ValueStorageEntry(baseValueStorageEntry.getType(),vsparams);
+         ArrayList<SimpleParameterEntry> spe = new ArrayList<SimpleParameterEntry>();
+         spe.addAll(copyList(baseValueStorageEntry.getParameters()));
+         valueStorageEntry.setId(baseValueStorageEntry.getId());
+         valueStorageEntry.setParameters(spe);
+         valueStorageEntry.setFilters(vsparams);
+
+         // containerEntry.setValueStorages();
+         list.add(valueStorageEntry);
+      }
+
+      containerEntry.setValueStorages(list);
+
+      // Indexer
+      params = new ArrayList<SimpleParameterEntry>();
+      params.addAll(copyList(baseWorkspaceEntry.getQueryHandler().getParameters()));
+      QueryHandlerEntry qEntry =
+               new QueryHandlerEntry(baseWorkspaceEntry.getQueryHandler().getType(), params);
+
+      // Cache
+      params = new ArrayList<SimpleParameterEntry>();
+      params.addAll(copyList(baseWorkspaceEntry.getCache().getParameters()));
+      CacheEntry cacheEntry = new CacheEntry(params);
+      cacheEntry.setType(baseWorkspaceEntry.getCache().getType());
+
+      WorkspaceEntry workspaceEntry = new WorkspaceEntry();
+      workspaceEntry.setContainer(containerEntry);
+      workspaceEntry.setCache(cacheEntry);
+      workspaceEntry.setQueryHandler(qEntry);
+      workspaceEntry.setName(baseWorkspaceEntry.getName());
+      workspaceEntry.setUniqueName(baseWorkspaceEntry.getUniqueName());
+
+      return workspaceEntry;
+
+   }
+
    /**
+    * Create copy of list with SimpleParameterEntry-s
+    */
+   private List<SimpleParameterEntry> copyList(List<SimpleParameterEntry> baseArrayList)
+   {
+      ArrayList<SimpleParameterEntry> arrayList = new ArrayList<SimpleParameterEntry>();
+
+      for (SimpleParameterEntry baseParameter : baseArrayList)
+      {
+         arrayList.add(new SimpleParameterEntry(baseParameter.getName(), baseParameter.getValue()));
+      }
+
+      return arrayList;
+   }
+
+   /**
     * Create workspace entry. 
     */
    public WorkspaceEntry createWorkspaceEntry(boolean isMultiDb, String dsName) throws Exception



More information about the exo-jcr-commits mailing list