[exo-jcr-commits] exo-jcr SVN: r3680 - 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
Mon Dec 20 04:24:59 EST 2010


Author: tolusha
Date: 2010-12-20 04:24:58 -0500 (Mon, 20 Dec 2010)
New Revision: 3680

Modified:
   jcr/trunk/exo.jcr.component.ext/src/main/java/org/exoplatform/services/jcr/ext/backup/impl/JobExistedWorkspaceRestore.java
   jcr/trunk/exo.jcr.component.ext/src/test/java/org/exoplatform/services/jcr/ext/backup/AbstractBackupTestCase.java
   jcr/trunk/exo.jcr.component.ext/src/test/java/org/exoplatform/services/jcr/ext/backup/AbstractBackupUseCasesTest.java
   jcr/trunk/exo.jcr.docs/exo.jcr.docs.developer/en/src/main/docbook/en-US/modules/jcr/backup/exojcr-backup-service.xml
Log:
EXOJCR-747: restore single workspace into existed one in case of multi-db is not supported

Modified: jcr/trunk/exo.jcr.component.ext/src/main/java/org/exoplatform/services/jcr/ext/backup/impl/JobExistedWorkspaceRestore.java
===================================================================
--- jcr/trunk/exo.jcr.component.ext/src/main/java/org/exoplatform/services/jcr/ext/backup/impl/JobExistedWorkspaceRestore.java	2010-12-20 09:24:04 UTC (rev 3679)
+++ jcr/trunk/exo.jcr.component.ext/src/main/java/org/exoplatform/services/jcr/ext/backup/impl/JobExistedWorkspaceRestore.java	2010-12-20 09:24:58 UTC (rev 3680)
@@ -25,6 +25,7 @@
 import org.exoplatform.services.jcr.ext.backup.BackupManager;
 import org.exoplatform.services.jcr.ext.backup.WorkspaceRestoreException;
 import org.exoplatform.services.jcr.impl.core.SessionRegistry;
+import org.exoplatform.services.jcr.impl.storage.jdbc.JDBCWorkspaceDataContainer;
 import org.exoplatform.services.jcr.impl.util.jdbc.cleaner.DBCleanerService;
 import org.exoplatform.services.log.ExoLogger;
 import org.exoplatform.services.log.Log;
@@ -100,6 +101,29 @@
                + " did not found in current repository " + repositoryName + " configuration");
          }
 
+         boolean isMultiDb;
+         try
+         {
+            String multiDb = wEntry.getContainer().getParameterValue(JDBCWorkspaceDataContainer.MULTIDB);
+            if (multiDb == null)
+            {
+               throw new RepositoryConfigurationException("Parameter " + JDBCWorkspaceDataContainer.MULTIDB
+                  + " not found in workspace configuration " + wEntry.getName());
+            }
+
+            isMultiDb = Boolean.parseBoolean(multiDb);
+         }
+         catch (RepositoryConfigurationException e)
+         {
+            throw new WorkspaceRestoreException("Can't define " + JDBCWorkspaceDataContainer.MULTIDB + " parameter", e);
+         }
+
+         if (isMultiDb)
+         {
+            throw new WorkspaceRestoreException(
+               "Restore of single workspace into existed one for multi-db is not supported");
+         }
+
          boolean isSystem =
             repositoryService.getRepository(repositoryName).getConfiguration().getSystemWorkspaceName()
                .equals(wEntry.getName());

Modified: jcr/trunk/exo.jcr.component.ext/src/test/java/org/exoplatform/services/jcr/ext/backup/AbstractBackupTestCase.java
===================================================================
--- jcr/trunk/exo.jcr.component.ext/src/test/java/org/exoplatform/services/jcr/ext/backup/AbstractBackupTestCase.java	2010-12-20 09:24:04 UTC (rev 3679)
+++ jcr/trunk/exo.jcr.component.ext/src/test/java/org/exoplatform/services/jcr/ext/backup/AbstractBackupTestCase.java	2010-12-20 09:24:58 UTC (rev 3680)
@@ -36,10 +36,13 @@
 import org.exoplatform.services.jcr.impl.core.RepositoryImpl;
 import org.exoplatform.services.jcr.impl.core.SessionImpl;
 import org.exoplatform.services.jcr.impl.core.SessionRegistry;
+import org.exoplatform.services.jcr.impl.storage.jdbc.JDBCWorkspaceDataContainer;
 import org.exoplatform.services.jcr.impl.util.jdbc.cleaner.DBCleanerService;
 
 import java.io.File;
 import java.io.FileFilter;
+import java.sql.Connection;
+import java.sql.Statement;
 import java.util.ArrayList;
 import java.util.Calendar;
 import java.util.Date;
@@ -54,6 +57,8 @@
 import javax.jcr.lock.LockException;
 import javax.jcr.nodetype.ConstraintViolationException;
 import javax.jcr.version.VersionException;
+import javax.naming.InitialContext;
+import javax.sql.DataSource;
 
 /**
  * Created by The eXo Platform SAS Author : Peter Nedonosko peter.nedonosko at exoplatform.com.ua
@@ -295,7 +300,8 @@
             newWorkspaceName = workspaceMapping.get(wsEntry.getName());
          }
 
-         WorkspaceEntry newWSEntry = makeWorkspaceEntry(wsEntry, newWorkspaceName, repoName, sourceName);
+         WorkspaceEntry newWSEntry =
+            makeWorkspaceEntry(wsEntry, newWorkspaceName, repoName, sourceName);
 
          wsEntries.add(newWSEntry);
       }
@@ -468,7 +474,7 @@
       // get current workspace configuration
       WorkspaceEntry wEntry = null;;
       for (WorkspaceEntry entry : repositoryService.getRepository(repositoryName).getConfiguration()
-               .getWorkspaceEntries())
+         .getWorkspaceEntries())
       {
          if (entry.getName().equals(workspaceName))
          {
@@ -480,12 +486,12 @@
       if (wEntry == null)
       {
          throw new WorkspaceRestoreException("Workspace " + workspaceName + " did not found in current repository "
-                  + repositoryName + " configuration");
+            + repositoryName + " configuration");
       }
 
       boolean isSystem =
-               repositoryService.getRepository(repositoryName).getConfiguration().getSystemWorkspaceName().equals(
-                        wEntry.getName());
+         repositoryService.getRepository(repositoryName).getConfiguration().getSystemWorkspaceName()
+            .equals(wEntry.getName());
 
       //close all session
       forceCloseSession(repositoryName, wEntry.getName());
@@ -493,6 +499,70 @@
       repositoryService.getRepository(repositoryName).removeWorkspace(wEntry.getName());
 
       //clean database
+      //      dbCleanerService.cleanWorkspaceData(wEntry);
+      DataSource ds =
+         (DataSource)new InitialContext().lookup(wEntry.getContainer().getParameterValue(
+            JDBCWorkspaceDataContainer.SOURCE_NAME));
+      Connection conn = ds.getConnection();
+
+      if (conn.getMetaData().getTables(null, null, "JCR_MITEM", new String[]{"TABLE"}).next())
+      {
+         Statement st = conn.createStatement();
+         st.execute("DROP TABLE JCR_MVALUE");
+         st.execute("DROP TABLE JCR_MREF");
+         st.execute("DROP TABLE JCR_MITEM");
+         conn.commit();
+         st.close();
+         conn.close();
+      }
+      else if (conn.getMetaData().getTables(null, null, "JCR_SITEM", new String[]{"TABLE"}).next())
+      {
+         Statement st = conn.createStatement();
+         st.execute("DROP TABLE JCR_SVALUE");
+         st.execute("DROP TABLE JCR_SREF");
+         st.execute("DROP TABLE JCR_SITEM");
+         conn.commit();
+         st.close();
+         conn.close();
+      }
+
+      //clean index
+      indexCleanHelper.removeWorkspaceIndex(wEntry, isSystem);
+
+      //clean value storage
+      valueStorageCleanHelper.removeWorkspaceValueStorage(wEntry);
+   }
+
+   protected void removeWorkspaceFullySingleDB(String repositoryName, String workspaceName) throws Exception
+   {
+      // get current workspace configuration
+      WorkspaceEntry wEntry = null;;
+      for (WorkspaceEntry entry : repositoryService.getRepository(repositoryName).getConfiguration()
+         .getWorkspaceEntries())
+      {
+         if (entry.getName().equals(workspaceName))
+         {
+            wEntry = entry;
+            break;
+         }
+      }
+
+      if (wEntry == null)
+      {
+         throw new WorkspaceRestoreException("Workspace " + workspaceName + " did not found in current repository "
+            + repositoryName + " configuration");
+      }
+
+      boolean isSystem =
+         repositoryService.getRepository(repositoryName).getConfiguration().getSystemWorkspaceName()
+            .equals(wEntry.getName());
+
+      //close all session
+      forceCloseSession(repositoryName, wEntry.getName());
+
+      repositoryService.getRepository(repositoryName).removeWorkspace(wEntry.getName());
+
+      //clean database
       dbCleanerService.cleanWorkspaceData(wEntry);
 
       //clean index

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	2010-12-20 09:24:04 UTC (rev 3679)
+++ jcr/trunk/exo.jcr.component.ext/src/test/java/org/exoplatform/services/jcr/ext/backup/AbstractBackupUseCasesTest.java	2010-12-20 09:24:58 UTC (rev 3680)
@@ -28,11 +28,11 @@
 import java.io.ByteArrayInputStream;
 import java.io.File;
 import java.io.FileInputStream;
-import java.io.InputStream;
 import java.util.Map;
 
 import javax.jcr.Node;
 import javax.jcr.RepositoryException;
+import javax.jcr.Value;
 import javax.jcr.lock.Lock;
 
 /**
@@ -250,7 +250,7 @@
       ws1TestRoot.addNode("node_102").setProperty("exo:data", new FileInputStream(tempf));
       ws1TestRoot.save(); // log here via listener
 
-      ws1TestRoot.getNode("node_2").setProperty("exo:data", (InputStream)null); // remove property
+      ws1TestRoot.getNode("node_2").setProperty("exo:data", (Value)null); // remove property
       ws1TestRoot.getNode("node_3").setProperty("exo:data", new ByteArrayInputStream("aaa".getBytes())); // set
       // aaa
       // bytes
@@ -905,7 +905,7 @@
    }
 
    public void testRepositoryFullBackupAsynchronusRestore() throws Exception
-   {
+      {
       // backup
       File backDir = new File("target/backup/" + getUUIndex());
       backDir.mkdirs();
@@ -982,7 +982,7 @@
       }
       else
          fail("There are no backup files in " + backDir.getAbsolutePath());
-   }
+      }
 
    public void testRepositoryFullBackupAsynchronusRestoreWorkspaceMapping() throws Exception
    {
@@ -1009,7 +1009,7 @@
 
       // stop fullBackup
 
-      backup.stopBackup(bch);
+         backup.stopBackup(bch);
 
       // restore
       RepositoryEntry newRepositoryEntry =
@@ -1085,7 +1085,7 @@
    }
 
    public void testAutoStopRepositoryBackupIncrRepetion() throws Exception
-   {
+      {
       // backup
       File backDir = new File("target/backup/" + getUUIndex());
       backDir.mkdirs();
@@ -1100,20 +1100,20 @@
       final RepositoryBackupChain bch = backup.startBackup(config);
 
       while (!bch.isFinished())
-      {
+         {
          Thread.yield();
          Thread.sleep(50);
-      }
+         }
 
       Thread.sleep(5000);
 
       for (RepositoryBackupChain chain : backup.getCurrentRepositoryBackups())
          if (bch.getBackupId().equals(chain.getBackupId()))
             fail("The backup with id '" + chain.getBackupId() + "' should not be active");
-   }
+      }
 
    public void testRepositoryRestoreFail() throws Exception
-   {
+      {
       // backup
       File backDir = new File("target/backup/" + getUUIndex());
       backDir.mkdirs();
@@ -1144,8 +1144,7 @@
 
       // restore
       RepositoryEntry newRepositoryEntry =
-         makeRepositoryEntry(repoName, getReposityToBackup().getConfiguration(),
-            dataSourceToRepositoryRestore, null);
+         makeRepositoryEntry(repoName, getReposityToBackup().getConfiguration(), dataSourceToRepositoryRestore, null);
 
       //create broken system workspaceEntry
       newRepositoryEntry.getWorkspaceEntries().get(0).getQueryHandler().setType("gg");
@@ -1165,8 +1164,8 @@
       }
 
       // check
-      try
-      {
+         try
+         {
          ManageableRepository restoredRepository = repositoryService.getRepository(repoName);
          fail("The repository " + repositoryNameToRestore + "shoulde not exists.");
       }
@@ -1203,7 +1202,7 @@
       {
          Thread.yield();
          Thread.sleep(50);
-      }
+         }
 
       // add data
       ws1Session.getRootNode().addNode("node_101").setProperty("exo:data", new FileInputStream(tempf));
@@ -1226,7 +1225,7 @@
 
       File backLog = new File(bch.getLogFilePath());
       if (backLog.exists())
-      {
+         {
          BackupChainLog bchLog = new BackupChainLog(backLog);
 
          assertNotNull(bchLog.getStartedTime());
@@ -1261,12 +1260,12 @@
             if (back1 != null)
                back1.logout();
          }
-      }
+         }
       else
          fail("There are no backup files in " + backDir.getAbsolutePath());
-   }
+      }
 
-   public void testExistedWorkspaceRestore() throws Exception
+   public void _testExistedWorkspaceRestoreMultiDB() throws Exception
    {
       // backup
       File backDir = new File("target/backup/" + getUUIndex());
@@ -1317,13 +1316,80 @@
          assertNotNull(bchLog.getStartedTime());
          assertNotNull(bchLog.getFinishedTime());
 
-         backup.restoreExistingWorkspace(bchLog, repositoryNameToBackup, ws1, false);
+         try
+         {
+            backup.restoreExistingWorkspace(bchLog, repositoryNameToBackup, ws1, false);
+            fail("Exception should be thrown");
+         }
+         catch (WorkspaceRestoreException e)
+         {
 
+         }
+      }
+      else
+         fail("There are no backup files in " + backDir.getAbsolutePath());
+   }
+
+   public void testExistedWorkspaceRestoreSingleDB() throws Exception
+   {
+      SessionImpl ws1Session = (SessionImpl)repositoryService.getRepository("db7").login(credentials, "ws1");
+
+      // backup
+      File backDir = new File("target/backup/" + getUUIndex());
+      backDir.mkdirs();
+
+      BackupConfig config = new BackupConfig();
+      config.setRepository("db7");
+      config.setWorkspace(workspaceNameToBackup);
+      config.setBackupType(BackupManager.FULL_BACKUP_ONLY);
+
+      config.setBackupDir(backDir);
+
+      backup.startBackup(config);
+
+      BackupChain bch = backup.findBackup("db7", workspaceNameToBackup);
+
+      // wait till full backup will be stopped
+      while (bch.getFullBackupState() != BackupJob.FINISHED)
+      {
+         Thread.yield();
+         Thread.sleep(50);
+      }
+
+      // stop fullBackup
+
+      if (bch != null)
+         backup.stopBackup(bch);
+      else
+         fail("Can't get fullBackup chain");
+
+      // restore
+      RepositoryEntry re = (RepositoryEntry)ws1Session.getContainer().getComponentInstanceOfType(RepositoryEntry.class);
+      WorkspaceEntry ws1 = null;
+      for (WorkspaceEntry we : re.getWorkspaceEntries())
+      {
+         if (ws1Session.getWorkspace().getName().equals(we.getName()))
+         {
+            ws1 = we;
+            break;
+         }
+      }
+
+      File backLog = new File(bch.getLogFilePath());
+      if (backLog.exists())
+      {
+         BackupChainLog bchLog = new BackupChainLog(backLog);
+
+         assertNotNull(bchLog.getStartedTime());
+         assertNotNull(bchLog.getFinishedTime());
+
+         backup.restoreExistingWorkspace(bchLog, "db7", ws1, false);
+
          // check
          SessionImpl back1 = null;
          try
          {
-            back1 = (SessionImpl)getReposityToBackup().login(credentials, "ws1");
+            back1 = (SessionImpl)repositoryService.getRepository("db7").login(credentials, "ws1");
             Node ws1backTestRoot = back1.getRootNode().getNode("backupTest");
             assertEquals("Restored content should be same", "property-5", ws1backTestRoot.getNode("node_5")
                .getProperty("exo:data").getString());
@@ -1345,6 +1411,9 @@
 
    public void testExistedWorkspaceRestoreAsync() throws Exception
    {
+      SessionImpl ws1Session = (SessionImpl)repositoryService.getRepository("db7").login(credentials, "ws1");
+      String repositoryNameToBackup = "db7";
+
       // backup
       File backDir = new File("target/backup/" + getUUIndex());
       backDir.mkdirs();
@@ -1406,7 +1475,9 @@
          SessionImpl back1 = null;
          try
          {
-            back1 = (SessionImpl)getReposityToBackup().login(credentials, workspaceNameToBackup);
+            back1 =
+               (SessionImpl)repositoryService.getRepository(repositoryNameToBackup).login(credentials,
+                  workspaceNameToBackup);
             Node ws1backTestRoot = back1.getRootNode().getNode("backupTest");
             assertEquals("Restored content should be same", "property-5", ws1backTestRoot.getNode("node_5")
                .getProperty("exo:data").getString());
@@ -1428,6 +1499,9 @@
 
    public void testExistedWorkspaceRestoreAsync2() throws Exception
    {
+      SessionImpl ws1Session = (SessionImpl)repositoryService.getRepository("db7").login(credentials, "ws1");
+      String repositoryNameToBackup = "db7";
+
       // backup
       File backDir = new File("target/backup/" + getUUIndex());
       backDir.mkdirs();
@@ -1489,7 +1563,9 @@
          SessionImpl back1 = null;
          try
          {
-            back1 = (SessionImpl)getReposityToBackup().login(credentials, workspaceNameToBackup);
+            back1 =
+               (SessionImpl)repositoryService.getRepository(repositoryNameToBackup).login(credentials,
+                  workspaceNameToBackup);
             Node ws1backTestRoot = back1.getRootNode().getNode("backupTest");
             assertEquals("Restored content should be same", "property-5", ws1backTestRoot.getNode("node_5")
                .getProperty("exo:data").getString());
@@ -1904,6 +1980,10 @@
 
    public void testExistedWorkspaceRestoreWithConfig() throws Exception
    {
+      RepositoryImpl repositoryDB7 = (RepositoryImpl)repositoryService.getRepository(repositoryNameToBackupSingleDB);
+      String repositoryNameToBackup = "db7";
+      SessionImpl sessionWS = (SessionImpl)repositoryDB7.login(credentials, workspaceNameToBackup);
+
       // backup
       File backDir = new File("target/backup/" + getUUIndex());
       backDir.mkdirs();
@@ -1948,7 +2028,9 @@
          SessionImpl back1 = null;
          try
          {
-            back1 = (SessionImpl)getReposityToBackup().login(credentials, workspaceNameToBackup);
+            back1 =
+               (SessionImpl)repositoryService.getRepository(repositoryNameToBackup).login(credentials,
+                  workspaceNameToBackup);
             Node ws1backTestRoot = back1.getRootNode().getNode("backupTest");
             assertEquals("Restored content should be same", "property-5", ws1backTestRoot.getNode("node_5")
                .getProperty("exo:data").getString());
@@ -2042,6 +2124,9 @@
 
    public void testWorkspaceRestoreWithConfig() throws Exception
    {
+      RepositoryImpl repositoryDB7 = (RepositoryImpl)repositoryService.getRepository(repositoryNameToBackupSingleDB);
+      String repositoryNameToBackup = "db7";
+
       // backup
       File backDir = new File("target/backup/" + getUUIndex());
       backDir.mkdirs();
@@ -2072,8 +2157,8 @@
          fail("Can't get fullBackup chain");
 
       //TODO
-      super.tearDown();
-      removeWorkspaceFully(repositoryNameToBackup, workspaceNameToBackup);
+      //      super.tearDown();
+      removeWorkspaceFullySingleDB(repositoryNameToBackup, workspaceNameToBackup);
 
       File backLog = new File(bch.getLogFilePath());
       if (backLog.exists())
@@ -2089,7 +2174,7 @@
          SessionImpl back1 = null;
          try
          {
-            back1 = (SessionImpl)getReposityToBackup().login(credentials, "ws1");
+            back1 = (SessionImpl)repositoryService.getRepository(repositoryNameToBackup).login(credentials, "ws1");
             Node ws1backTestRoot = back1.getRootNode().getNode("backupTest");
             assertEquals("Restored content should be same", "property-5", ws1backTestRoot.getNode("node_5")
                .getProperty("exo:data").getString());

Modified: jcr/trunk/exo.jcr.docs/exo.jcr.docs.developer/en/src/main/docbook/en-US/modules/jcr/backup/exojcr-backup-service.xml
===================================================================
--- jcr/trunk/exo.jcr.docs/exo.jcr.docs.developer/en/src/main/docbook/en-US/modules/jcr/backup/exojcr-backup-service.xml	2010-12-20 09:24:04 UTC (rev 3679)
+++ jcr/trunk/exo.jcr.docs/exo.jcr.docs.developer/en/src/main/docbook/en-US/modules/jcr/backup/exojcr-backup-service.xml	2010-12-20 09:24:58 UTC (rev 3680)
@@ -483,6 +483,11 @@
   <section>
     <title>Restore existing workspace or repository</title>
 
+    <note>
+      <para>Restoring single workspace into existed one in case of multi-db is
+      not supported.</para>
+    </note>
+
     <para>The resore of existing workspace or repositry is available.</para>
 
     <para>For restore will be used spacial methods:</para>



More information about the exo-jcr-commits mailing list