[exo-jcr-commits] exo-jcr SVN: r3677 - 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
Fri Dec 17 06:44:30 EST 2010


Author: tolusha
Date: 2010-12-17 06:44:29 -0500 (Fri, 17 Dec 2010)
New Revision: 3677

Modified:
   jcr/trunk/exo.jcr.component.ext/src/main/java/org/exoplatform/services/jcr/ext/backup/impl/rdbms/RdbmsBackupWorkspaceInitializer.java
   jcr/trunk/exo.jcr.component.ext/src/main/java/org/exoplatform/services/jcr/ext/backup/impl/rdbms/RdbmsWorkspaceInitializer.java
   jcr/trunk/exo.jcr.component.ext/src/test/java/org/exoplatform/services/jcr/ext/backup/TestRdbmsWorkspaceInitializer.java
   jcr/trunk/exo.jcr.component.ext/src/test/java/org/exoplatform/services/jcr/impl/core/TesterRdbmsWorkspaceInitializer.java
Log:
EXOJCR-1078: support rollback changes in case of errors

Modified: jcr/trunk/exo.jcr.component.ext/src/main/java/org/exoplatform/services/jcr/ext/backup/impl/rdbms/RdbmsBackupWorkspaceInitializer.java
===================================================================
--- jcr/trunk/exo.jcr.component.ext/src/main/java/org/exoplatform/services/jcr/ext/backup/impl/rdbms/RdbmsBackupWorkspaceInitializer.java	2010-12-17 10:46:17 UTC (rev 3676)
+++ jcr/trunk/exo.jcr.component.ext/src/main/java/org/exoplatform/services/jcr/ext/backup/impl/rdbms/RdbmsBackupWorkspaceInitializer.java	2010-12-17 11:44:29 UTC (rev 3677)
@@ -16,6 +16,7 @@
  */
 package org.exoplatform.services.jcr.ext.backup.impl.rdbms;
 
+import org.exoplatform.services.jcr.RepositoryService;
 import org.exoplatform.services.jcr.access.AccessManager;
 import org.exoplatform.services.jcr.config.RepositoryConfigurationException;
 import org.exoplatform.services.jcr.config.RepositoryEntry;
@@ -27,9 +28,12 @@
 import org.exoplatform.services.jcr.impl.core.nodetype.NodeTypeManagerImpl;
 import org.exoplatform.services.jcr.impl.core.value.ValueFactoryImpl;
 import org.exoplatform.services.jcr.impl.dataflow.persistent.CacheableWorkspaceDataManager;
+import org.exoplatform.services.jcr.impl.util.jdbc.cleaner.DBCleanerException;
 import org.exoplatform.services.log.ExoLogger;
 import org.exoplatform.services.log.Log;
 
+import java.io.IOException;
+
 import javax.jcr.PathNotFoundException;
 import javax.jcr.RepositoryException;
 
@@ -54,10 +58,11 @@
    public RdbmsBackupWorkspaceInitializer(WorkspaceEntry config, RepositoryEntry repConfig,
       CacheableWorkspaceDataManager dataManager, NamespaceRegistryImpl namespaceRegistry,
       LocationFactory locationFactory, NodeTypeManagerImpl nodeTypeManager, ValueFactoryImpl valueFactory,
-      AccessManager accessManager) throws RepositoryConfigurationException, PathNotFoundException, RepositoryException
+      AccessManager accessManager, RepositoryService repositoryService) throws RepositoryConfigurationException,
+      PathNotFoundException, RepositoryException
    {
       super(config, repConfig, dataManager, namespaceRegistry, locationFactory, nodeTypeManager, valueFactory,
-         accessManager);
+         accessManager, repositoryService);
    }
 
    /**
@@ -73,11 +78,34 @@
 
       long start = System.currentTimeMillis();
 
-      // restore from full rdbms backup
-      fullRdbmsRestore();
+      try
+      {
+         // restore from full rdbms backup
+         fullRdbmsRestore();
 
-      // restore from incremental backup
-      incrementalRead();
+         // restore from incremental backup
+         incrementalRead();
+      }
+      catch (Throwable e)
+      {
+         try
+         {
+            rollback();
+         }
+         catch (RepositoryConfigurationException e1)
+         {
+            throw new RepositoryException("Can't rollback changes", e);
+         }
+         catch (DBCleanerException e1)
+         {
+            throw new RepositoryException("Can't rollback changes", e);
+         }
+         catch (IOException e1)
+         {
+            throw new RepositoryException("Can't rollback changes", e);
+         }
+         throw new RepositoryException(e);
+      }
 
       final NodeData root = (NodeData)dataManager.getItemData(Constants.ROOT_UUID);
 

Modified: jcr/trunk/exo.jcr.component.ext/src/main/java/org/exoplatform/services/jcr/ext/backup/impl/rdbms/RdbmsWorkspaceInitializer.java
===================================================================
--- jcr/trunk/exo.jcr.component.ext/src/main/java/org/exoplatform/services/jcr/ext/backup/impl/rdbms/RdbmsWorkspaceInitializer.java	2010-12-17 10:46:17 UTC (rev 3676)
+++ jcr/trunk/exo.jcr.component.ext/src/main/java/org/exoplatform/services/jcr/ext/backup/impl/rdbms/RdbmsWorkspaceInitializer.java	2010-12-17 11:44:29 UTC (rev 3677)
@@ -20,6 +20,7 @@
 
 import org.exoplatform.commons.utils.PrivilegedFileHelper;
 import org.exoplatform.commons.utils.SecurityHelper;
+import org.exoplatform.services.jcr.RepositoryService;
 import org.exoplatform.services.jcr.access.AccessManager;
 import org.exoplatform.services.jcr.config.LockManagerEntry;
 import org.exoplatform.services.jcr.config.QueryHandlerParams;
@@ -27,12 +28,17 @@
 import org.exoplatform.services.jcr.config.RepositoryEntry;
 import org.exoplatform.services.jcr.config.ValueStorageEntry;
 import org.exoplatform.services.jcr.config.WorkspaceEntry;
+import org.exoplatform.services.jcr.core.ManageableRepository;
+import org.exoplatform.services.jcr.core.WorkspaceContainerFacade;
 import org.exoplatform.services.jcr.dataflow.serialization.ObjectReader;
 import org.exoplatform.services.jcr.datamodel.NodeData;
+import org.exoplatform.services.jcr.ext.backup.impl.IndexCleanHelper;
+import org.exoplatform.services.jcr.ext.backup.impl.ValueStorageCleanHelper;
 import org.exoplatform.services.jcr.impl.Constants;
 import org.exoplatform.services.jcr.impl.core.BackupWorkspaceInitializer;
 import org.exoplatform.services.jcr.impl.core.LocationFactory;
 import org.exoplatform.services.jcr.impl.core.NamespaceRegistryImpl;
+import org.exoplatform.services.jcr.impl.core.SessionRegistry;
 import org.exoplatform.services.jcr.impl.core.lock.cacheable.AbstractCacheableLockManager;
 import org.exoplatform.services.jcr.impl.core.nodetype.NodeTypeManagerImpl;
 import org.exoplatform.services.jcr.impl.core.query.SystemSearchManager;
@@ -43,6 +49,8 @@
 import org.exoplatform.services.jcr.impl.storage.jdbc.DialectDetecter;
 import org.exoplatform.services.jcr.impl.storage.jdbc.JDBCWorkspaceDataContainer;
 import org.exoplatform.services.jcr.impl.storage.value.fs.FileValueStorage;
+import org.exoplatform.services.jcr.impl.util.jdbc.cleaner.DBCleanerException;
+import org.exoplatform.services.jcr.impl.util.jdbc.cleaner.DBCleanerService;
 import org.exoplatform.services.log.ExoLogger;
 import org.exoplatform.services.log.Log;
 
@@ -83,6 +91,10 @@
     */
    protected static final Log log = ExoLogger.getLogger("exo.jcr.component.core.RdbmsWorkspaceInitializer");
 
+   /**
+    * The repository service.
+    */
+   protected final RepositoryService repositoryService;
 
    /**
     * List of temporary files.
@@ -95,10 +107,13 @@
    public RdbmsWorkspaceInitializer(WorkspaceEntry config, RepositoryEntry repConfig,
       CacheableWorkspaceDataManager dataManager, NamespaceRegistryImpl namespaceRegistry,
       LocationFactory locationFactory, NodeTypeManagerImpl nodeTypeManager, ValueFactoryImpl valueFactory,
-      AccessManager accessManager) throws RepositoryConfigurationException, PathNotFoundException, RepositoryException
+      AccessManager accessManager, RepositoryService repositoryService) throws RepositoryConfigurationException,
+      PathNotFoundException, RepositoryException
    {
       super(config, repConfig, dataManager, namespaceRegistry, locationFactory, nodeTypeManager, valueFactory,
          accessManager);
+
+      this.repositoryService = repositoryService;
    }
 
    /**
@@ -114,7 +129,30 @@
 
       long start = System.currentTimeMillis();
 
-      fullRdbmsRestore();
+      try
+      {
+         fullRdbmsRestore();
+      }
+      catch (Throwable e)
+      {
+         try
+         {
+            rollback();
+         }
+         catch (RepositoryConfigurationException e1)
+         {
+            throw new RepositoryException("Can't rollback changes", e);
+         }
+         catch (DBCleanerException e1)
+         {
+            throw new RepositoryException("Can't rollback changes", e);
+         }
+         catch (IOException e1)
+         {
+            throw new RepositoryException("Can't rollback changes", e);
+         }
+         throw new RepositoryException(e);
+      }
 
       final NodeData root = (NodeData)dataManager.getItemData(Constants.ROOT_UUID);
 
@@ -278,18 +316,6 @@
       }
       catch (SQLException e)
       {
-         if (jdbcConn != null)
-         {
-            try
-            {
-               jdbcConn.rollback();
-            }
-            catch (SQLException e1)
-            {
-               log.error("Rollback error", e1);
-            }
-         }
-
          SQLException next = e.getNextException();
          String errorTrace = "";
          while (next != null)
@@ -392,13 +418,57 @@
 
    /**
     * Rollback changes due to errors.
+    * 
+    * @throws RepositoryConfigurationException 
+    * @throws RepositoryException 
+    * @throws DBCleanerException 
+    * @throws IOException 
     */
-   protected void rollback(Connection jdbcConn)
+   protected void rollback() throws RepositoryException, RepositoryConfigurationException, DBCleanerException,
+      IOException
    {
-      //  TODO
+      boolean isSystem =
+         repositoryService.getRepository(repositoryEntry.getName()).getConfiguration().getSystemWorkspaceName()
+            .equals(workspaceEntry.getName());
+
+      //close all session
+      forceCloseSession(repositoryEntry.getName(), workspaceEntry.getName());
+
+      //clean database
+      new DBCleanerService().cleanWorkspaceData(workspaceEntry);
+
+      //clean index
+      new IndexCleanHelper().removeWorkspaceIndex(workspaceEntry, isSystem);
+
+      //clean value storage
+      new ValueStorageCleanHelper().removeWorkspaceValueStorage(workspaceEntry);
    }
 
    /**
+    * Close sessions on specific workspace.
+    * 
+    * @param repositoryName
+    *          repository name
+    * @param workspaceName
+    *          workspace name
+    * @return int return the how many sessions was closed
+    * @throws RepositoryConfigurationException
+    *           will be generate RepositoryConfigurationException
+    * @throws RepositoryException
+    *           will be generate RepositoryException
+    */
+   private int forceCloseSession(String repositoryName, String workspaceName) throws RepositoryException,
+      RepositoryConfigurationException
+   {
+      ManageableRepository mr = repositoryService.getRepository(repositoryName);
+      WorkspaceContainerFacade wc = mr.getWorkspaceContainer(workspaceName);
+
+      SessionRegistry sessionRegistry = (SessionRegistry)wc.getComponent(SessionRegistry.class);
+
+      return sessionRegistry.closeSessions(workspaceName);
+   }
+
+   /**
     * Restoring value storage from backup.
     */
    protected void restoreValueStorage() throws RepositoryConfigurationException, IOException

Modified: jcr/trunk/exo.jcr.component.ext/src/test/java/org/exoplatform/services/jcr/ext/backup/TestRdbmsWorkspaceInitializer.java
===================================================================
--- jcr/trunk/exo.jcr.component.ext/src/test/java/org/exoplatform/services/jcr/ext/backup/TestRdbmsWorkspaceInitializer.java	2010-12-17 10:46:17 UTC (rev 3676)
+++ jcr/trunk/exo.jcr.component.ext/src/test/java/org/exoplatform/services/jcr/ext/backup/TestRdbmsWorkspaceInitializer.java	2010-12-17 11:44:29 UTC (rev 3677)
@@ -91,7 +91,7 @@
             TesterRdbmsWorkspaceInitializer initializer =
                new TesterRdbmsWorkspaceInitializer(newEntry,
                   repositoryService.getRepository("db1").getConfiguration(), cacheableDataManager, null, null, null,
-                  (ValueFactoryImpl)valueFactory, null);
+ (ValueFactoryImpl)valueFactory, null, repositoryService);
 
             initializer.restoreValueFiles();
             assertTrue(new File(newValueStoragePath).list().length > 0);
@@ -146,7 +146,7 @@
             TesterRdbmsWorkspaceInitializer initializer =
                new TesterRdbmsWorkspaceInitializer(newEntry,
                   repositoryService.getRepository("db1").getConfiguration(), cacheableDataManager, null, null, null,
-                  (ValueFactoryImpl)valueFactory, null);
+ (ValueFactoryImpl)valueFactory, null, repositoryService);
 
             initializer.restoreValueFiles();
             assertFalse(new File(newValueStoragePath).exists());
@@ -217,7 +217,7 @@
             TesterRdbmsWorkspaceInitializer initializer =
                new TesterRdbmsWorkspaceInitializer(newEntry,
                   repositoryService.getRepository("db1").getConfiguration(), cacheableDataManager, null, null, null,
-                  (ValueFactoryImpl)valueFactory, null);
+ (ValueFactoryImpl)valueFactory, null, repositoryService);
 
             // restore multi -> multi
             initializer.restoreTables(conn, 0, true, workspaceEntry.getLockManager(), url.getFile());
@@ -262,7 +262,7 @@
 
             initializer =
                new TesterRdbmsWorkspaceInitializer(newEntry, repositoryService.getRepository("db1").getConfiguration(),
-                  cacheableDataManager, null, null, null, (ValueFactoryImpl)valueFactory, null);
+                  cacheableDataManager, null, null, null, (ValueFactoryImpl)valueFactory, null, repositoryService);
 
             // restore multi -> single
             initializer.restoreTables(conn, 0, false, workspaceEntry.getLockManager(), url.getFile());
@@ -334,7 +334,7 @@
 
             TesterRdbmsWorkspaceInitializer initializer =
                new TesterRdbmsWorkspaceInitializer(newEntry, repositoryService.getRepository("db3").getConfiguration(),
-                  cacheableDataManager, null, null, null, (ValueFactoryImpl)valueFactory, null);
+                  cacheableDataManager, null, null, null, (ValueFactoryImpl)valueFactory, null, repositoryService);
 
             // restore single -> multi
             initializer.restoreTables(conn, 0, true, workspaceEntry.getLockManager(), url.getFile());
@@ -379,7 +379,7 @@
 
             initializer =
                new TesterRdbmsWorkspaceInitializer(newEntry, repositoryService.getRepository("db3").getConfiguration(),
-                  cacheableDataManager, null, null, null, (ValueFactoryImpl)valueFactory, null);
+                  cacheableDataManager, null, null, null, (ValueFactoryImpl)valueFactory, null, repositoryService);
 
             // restore single -> single
             initializer.restoreTables(conn, 0, false, workspaceEntry.getLockManager(), url.getFile());

Modified: jcr/trunk/exo.jcr.component.ext/src/test/java/org/exoplatform/services/jcr/impl/core/TesterRdbmsWorkspaceInitializer.java
===================================================================
--- jcr/trunk/exo.jcr.component.ext/src/test/java/org/exoplatform/services/jcr/impl/core/TesterRdbmsWorkspaceInitializer.java	2010-12-17 10:46:17 UTC (rev 3676)
+++ jcr/trunk/exo.jcr.component.ext/src/test/java/org/exoplatform/services/jcr/impl/core/TesterRdbmsWorkspaceInitializer.java	2010-12-17 11:44:29 UTC (rev 3677)
@@ -18,6 +18,7 @@
  */
 package org.exoplatform.services.jcr.impl.core;
 
+import org.exoplatform.services.jcr.RepositoryService;
 import org.exoplatform.services.jcr.access.AccessManager;
 import org.exoplatform.services.jcr.config.LockManagerEntry;
 import org.exoplatform.services.jcr.config.RepositoryConfigurationException;
@@ -52,10 +53,11 @@
    public TesterRdbmsWorkspaceInitializer(WorkspaceEntry config, RepositoryEntry repConfig,
       CacheableWorkspaceDataManager dataManager, NamespaceRegistryImpl namespaceRegistry,
       LocationFactory locationFactory, NodeTypeManagerImpl nodeTypeManager, ValueFactoryImpl valueFactory,
-      AccessManager accessManager) throws RepositoryConfigurationException, PathNotFoundException, RepositoryException
+      AccessManager accessManager, RepositoryService repositoryService) throws RepositoryConfigurationException,
+      PathNotFoundException, RepositoryException
    {
       super(config, repConfig, dataManager, namespaceRegistry, locationFactory, nodeTypeManager, valueFactory,
-         accessManager);
+         accessManager, repositoryService);
    }
 
    public void restoreValueFiles() throws RepositoryConfigurationException, IOException



More information about the exo-jcr-commits mailing list