[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