[exo-jcr-commits] exo-jcr SVN: r5868 - in jcr/branches/1.15.x: exo.jcr.component.ext/src/test/java/org/exoplatform/services/jcr/ext/backup and 1 other directory.

do-not-reply at jboss.org do-not-reply at jboss.org
Thu Mar 15 06:48:05 EDT 2012


Author: areshetnyak
Date: 2012-03-15 06:48:05 -0400 (Thu, 15 Mar 2012)
New Revision: 5868

Modified:
   jcr/branches/1.15.x/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/RepositoryContainer.java
   jcr/branches/1.15.x/exo.jcr.component.ext/src/test/java/org/exoplatform/services/jcr/ext/backup/AbstractBackupUseCasesTest.java
Log:
EXOJCR-1786 : The repository container is unregenerate all components and remove this container from parent container on fail on instantiation of repository container.

Modified: jcr/branches/1.15.x/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/RepositoryContainer.java
===================================================================
--- jcr/branches/1.15.x/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/RepositoryContainer.java	2012-03-15 10:16:50 UTC (rev 5867)
+++ jcr/branches/1.15.x/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/RepositoryContainer.java	2012-03-15 10:48:05 UTC (rev 5868)
@@ -72,6 +72,7 @@
 import java.security.PrivilegedAction;
 import java.security.PrivilegedActionException;
 import java.security.PrivilegedExceptionAction;
+import java.util.ArrayList;
 import java.util.List;
 
 import javax.jcr.NamespaceRegistry;
@@ -150,11 +151,21 @@
          public Void run()
          {
             context.setName(parent.getContext().getName() + "-" + name);
-            parent.registerComponentInstance(name, RepositoryContainer.this);
+            try
+            {
+               parent.registerComponentInstance(name, RepositoryContainer.this);
+               registerComponents();
+            }
+            catch (Throwable t)
+            {
+               unregisterAllComponents();
+               parent.unregisterComponent(name);
+               throw new IllegalStateException("Can not register repository container " + name
+                  + " in parent container.", t);
+            }
             return null;
          }
       });
-      registerComponents();
    }
 
    /**
@@ -172,26 +183,7 @@
    public RepositoryContainer(final ExoContainer parent, RepositoryEntry config) throws RepositoryException,
       RepositoryConfigurationException
    {
-
-      super(new MX4JComponentAdapterFactory(), parent);
-
-      // Defaults:
-      if (config.getAccessControl() == null)
-         config.setAccessControl(AccessControlPolicy.OPTIONAL);
-
-      this.config = config;
-      this.name = config.getName();
-      SecurityHelper.doPrivilegedAction(new PrivilegedAction<Void>()
-      {
-         public Void run()
-         {
-            context.setName(parent.getContext().getName() + "-" + name);
-            parent.registerComponentInstance(name, RepositoryContainer.this);
-            return null;
-         }
-      });
-
-      registerComponents();
+      this(parent, config, new ArrayList<ComponentPlugin>());
    }
 
    public LocationFactory getLocationFactory()

Modified: jcr/branches/1.15.x/exo.jcr.component.ext/src/test/java/org/exoplatform/services/jcr/ext/backup/AbstractBackupUseCasesTest.java
===================================================================
--- jcr/branches/1.15.x/exo.jcr.component.ext/src/test/java/org/exoplatform/services/jcr/ext/backup/AbstractBackupUseCasesTest.java	2012-03-15 10:16:50 UTC (rev 5867)
+++ jcr/branches/1.15.x/exo.jcr.component.ext/src/test/java/org/exoplatform/services/jcr/ext/backup/AbstractBackupUseCasesTest.java	2012-03-15 10:48:05 UTC (rev 5868)
@@ -19,6 +19,7 @@
 import org.apache.commons.collections.map.HashedMap;
 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;
@@ -1457,7 +1458,269 @@
       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(false, null, dsName);
+      service.createRepository(repoEntry);
 
+      ManageableRepository repository = service.getRepository(repoEntry.getName());
+
+      WorkspaceEntry wsEntry = helper.createWorkspaceEntry(false, 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())
+      {
+         for (int i = 0; i < ws.getContainer().getParameters().size(); i++)
+         {
+            SimpleParameterEntry spe = ws.getContainer().getParameters().get(i);
+
+            if (spe.getName().equals("source-name"))
+            {
+               ws.getContainer().getParameters().set(i, new SimpleParameterEntry(spe.getName(), newDSName));
+               break;
+            }
+         }
+      }
+
+      // 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()))
+         {
+            for (int i = 0; i < ws.getContainer().getParameters().size(); i++)
+            {
+               SimpleParameterEntry spe = ws.getContainer().getParameters().get(i);
+
+               if (spe.getName().equals("source-name"))
+               {
+                  ws.getContainer().getParameters().set(i,
+                     new SimpleParameterEntry(spe.getName(), spe.getValue() + "_wrong"));
+                  break;
+               }
+            }
+            break;
+         }
+      }
+
+      // remove existed repository
+      removeRepositoryFully(repository.getConfiguration().getName());
+
+      // wrong restore
+      try
+      {
+         backup.restore(new RepositoryBackupChainLog(backLog), wrongRepoEntry, false);
+         fail();
+      }
+      catch (Exception e)
+      {
+         //ok
+      }
+
+      // restore
+      long timeOfRestore = System.currentTimeMillis();
+      backup.restore(new RepositoryBackupChainLog(backLog), newRepoEntry, false);
+      log.info("Total time of restore the repository = " + ((System.currentTimeMillis() - timeOfRestore)) + "ms.");
+      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(false, null, dsName);
+      service.createRepository(repoEntry);
+
+      ManageableRepository repository = service.getRepository(repoEntry.getName());
+
+      WorkspaceEntry wsEntry = helper.createWorkspaceEntry(false, 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())
+      {
+         for (int i = 0; i < ws.getContainer().getParameters().size(); i++)
+         {
+            SimpleParameterEntry spe = ws.getContainer().getParameters().get(i);
+
+            if (spe.getName().equals("source-name"))
+            {
+               ws.getContainer().getParameters().set(i, new SimpleParameterEntry(spe.getName(), newDSName));
+               break;
+            }
+         }
+      }
+
+      // 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()))
+         {
+            for (int i = 0; i < ws.getContainer().getParameters().size(); i++)
+            {
+               SimpleParameterEntry spe = ws.getContainer().getParameters().get(i);
+
+               if (spe.getName().equals("source-name"))
+               {
+                  ws.getContainer().getParameters().set(i,
+                     new SimpleParameterEntry(spe.getName(), spe.getValue() + "_wrong"));
+                  break;
+               }
+            }
+            break;
+         }
+      }
+
+      // remove existed repository
+      removeRepositoryFully(repository.getConfiguration().getName());
+
+      // wrong restore
+      try
+      {
+         backup.restore(new RepositoryBackupChainLog(backLog), wrongRepoEntry, false);
+         fail();
+      }
+      catch (Exception e)
+      {
+         //ok
+      }
+
+      // restore
+      long timeOfRestore = System.currentTimeMillis();
+      backup.restore(new RepositoryBackupChainLog(backLog), newRepoEntry, false);
+      log.info("Total time of restore the repository = " + ((System.currentTimeMillis() - timeOfRestore)) + "ms.");
+      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(false, null, dsName);
+      service.createRepository(repoEntry);
+
+      ManageableRepository repository = service.getRepository(repoEntry.getName());
+
+      WorkspaceEntry wsEntry = helper.createWorkspaceEntry(false, 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())
+      {
+         for (int i = 0; i < ws.getContainer().getParameters().size(); i++)
+         {
+            SimpleParameterEntry spe = ws.getContainer().getParameters().get(i);
+
+            if (spe.getName().equals("source-name"))
+            {
+               ws.getContainer().getParameters().set(i, new SimpleParameterEntry(spe.getName(), newDSName));
+               break;
+            }
+         }
+      }
+
+      // 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
+      long timeOfRestore = System.currentTimeMillis();
+      backup.restore(new RepositoryBackupChainLog(backLog), newRepoEntry, false);
+      log.info("Total time of restore the repository = " + ((System.currentTimeMillis() - timeOfRestore)) + "ms.");
+      checkConent(repositoryService.getRepository(newRepoEntry.getName()), wsEntry.getName());
+   }
+
    /**
     * Set new backup directory in RepositoryBackupChainLog
     * 



More information about the exo-jcr-commits mailing list