Author: tolusha
Date: 2010-07-01 09:51:27 -0400 (Thu, 01 Jul 2010)
New Revision: 2737
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/JobRepositoryRestore.java
jcr/trunk/exo.jcr.component.ext/src/test/java/org/exoplatform/services/jcr/ext/backup/TestBackupManager.java
Log:
EXOJCR-819: HTTPBackupAgent can provide information about last successfully restored
repositories if restore was launched in synchronous mode
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 2010-07-01
10:08:10 UTC (rev 2736)
+++
jcr/trunk/exo.jcr.component.ext/src/main/java/org/exoplatform/services/jcr/ext/backup/impl/BackupManagerImpl.java 2010-07-01
13:51:27 UTC (rev 2737)
@@ -162,7 +162,7 @@
private final WorkspaceBackupAutoStopper workspaceBackupStopper;
private final RepositoryBackupAutoStopper repositoryBackupStopper;
-
+
/**
* Temporary directory;
*/
@@ -284,6 +284,7 @@
/**
* {@inheritDoc}
*/
+ @Override
public void run()
{
while (true)
@@ -331,6 +332,7 @@
/**
* {@inheritDoc}
*/
+ @Override
public void run()
{
while (true)
@@ -1364,16 +1366,16 @@
BackupConfigurationException, RepositoryException,
RepositoryConfigurationException
{
// Checking repository exists.
- try
+ try
{
repoService.getRepository(repositoryEntry.getName());
throw new BackupConfigurationException("Repository \"" +
repositoryEntry.getName() + "\" is already exists.");
- }
- catch (RepositoryException e)
+ }
+ catch (RepositoryException e)
{
//OK. Repository with "repositoryEntry.getName" is not exists.
- }
-
+ }
+
Map<String, BackupChainLog> workspacesMapping = new HashedMap();
Map<String, BackupChainLog> backups = new HashedMap();
@@ -1469,9 +1471,9 @@
JobRepositoryRestore jobRepositoryRestore =
new JobRepositoryRestore(repoService, this, repositoryEntry, workspacesMapping,
rblog);
+ restoreRepositoryJobs.add(jobRepositoryRestore);
if (asynchronous)
{
- restoreRepositoryJobs.add(jobRepositoryRestore);
jobRepositoryRestore.start();
}
else
Modified:
jcr/trunk/exo.jcr.component.ext/src/main/java/org/exoplatform/services/jcr/ext/backup/impl/JobRepositoryRestore.java
===================================================================
---
jcr/trunk/exo.jcr.component.ext/src/main/java/org/exoplatform/services/jcr/ext/backup/impl/JobRepositoryRestore.java 2010-07-01
10:08:10 UTC (rev 2736)
+++
jcr/trunk/exo.jcr.component.ext/src/main/java/org/exoplatform/services/jcr/ext/backup/impl/JobRepositoryRestore.java 2010-07-01
13:51:27 UTC (rev 2737)
@@ -119,13 +119,40 @@
}
/**
+ * Restore repository. Provide information about start and finish process.
+ *
+ * @throws RepositoryRestoreExeption
+ * if exception occurred during restore
+ */
+ protected void restore() throws RepositoryRestoreExeption
+ {
+ try
+ {
+ stateRestore = REPOSITORY_RESTORE_STARTED;
+ startTime = Calendar.getInstance();
+
+ restoreRepository();
+
+ stateRestore = REPOSITORY_RESTORE_SUCCESSFUL;
+ endTime = Calendar.getInstance();
+ }
+ catch (Throwable t)
+ {
+ stateRestore = REPOSITORY_RESTORE_FAIL;
+ restoreException = t;
+
+ throw new RepositoryRestoreExeption(t.getMessage(), t);
+ }
+ }
+
+ /**
* Will be restored the workspace.
* @throws RepositoryRestoreExeption
*
* @throws Throwable
* will be generated the Throwable
*/
- protected void restore() throws RepositoryRestoreExeption
+ protected void restoreRepository() throws RepositoryRestoreExeption
{
List<WorkspaceEntry> originalWorkspaceEntrys =
repositoryEntry.getWorkspaceEntries();
@@ -187,28 +214,31 @@
{
currennWorkspaceName = wsEntry.getName();
backupManager.restore(workspacesMapping.get(wsEntry.getName()),
repositoryEntry.getName(), wsEntry,
- false);
+ false);
}
}
}
catch (InvalidItemStateException e)
{
restored = false;
-
- log.error("Can not restore workspace \"" + currennWorkspaceName
+ " in repository \"" + repositoryEntry.getName() + "\".",
e);
-
- throw new RepositoryRestoreExeption("Can not restore workspace
\"" + currennWorkspaceName + " in repository \"" +
repositoryEntry.getName() + "\"."
- + " There was database error.", e);
+ log.error("Can not restore workspace \"" + currennWorkspaceName +
" in repository \""
+ + repositoryEntry.getName() + "\".", e);
+
+ throw new RepositoryRestoreExeption("Can not restore workspace
\"" + currennWorkspaceName
+ + " in repository \"" + repositoryEntry.getName() +
"\"." + " There was database error.", e);
+
}
catch (Throwable t)
{
restored = false;
-
- log.error("Can not restore workspace \"" + currennWorkspaceName
+ " in repository \"" + repositoryEntry.getName() + "\".",
t);
-
- throw new RepositoryRestoreExeption("Can not restore workspace
\"" + currennWorkspaceName + " in repository \"" +
repositoryEntry.getName() + "\".", t);
+ log.error("Can not restore workspace \"" + currennWorkspaceName +
" in repository \""
+ + repositoryEntry.getName() + "\".", t);
+
+ throw new RepositoryRestoreExeption("Can not restore workspace
\"" + currennWorkspaceName
+ + " in repository \"" + repositoryEntry.getName() +
"\".", t);
+
}
finally
{
@@ -236,7 +266,8 @@
}
catch (Throwable thr)
{
- log.error("The partly restored repository \"" +
repositoryEntry.getName() + "\" can not be removed.", thr);
+ log.error("The partly restored repository \"" +
repositoryEntry.getName() + "\" can not be removed.",
+ thr);
}
}
}
@@ -265,15 +296,15 @@
/**
* {@inheritDoc}
*/
+ @Override
public void run()
{
-
try
{
stateRestore = REPOSITORY_RESTORE_STARTED;
startTime = Calendar.getInstance();
- restore();
+ restoreRepository();
stateRestore = REPOSITORY_RESTORE_SUCCESSFUL;
endTime = Calendar.getInstance();
Modified:
jcr/trunk/exo.jcr.component.ext/src/test/java/org/exoplatform/services/jcr/ext/backup/TestBackupManager.java
===================================================================
---
jcr/trunk/exo.jcr.component.ext/src/test/java/org/exoplatform/services/jcr/ext/backup/TestBackupManager.java 2010-07-01
10:08:10 UTC (rev 2736)
+++
jcr/trunk/exo.jcr.component.ext/src/test/java/org/exoplatform/services/jcr/ext/backup/TestBackupManager.java 2010-07-01
13:51:27 UTC (rev 2737)
@@ -502,8 +502,8 @@
{
SessionImpl sessionWS1 = (SessionImpl)repository.login(credentials,
"ws3");
- sessionWS1.getRootNode().addNode("asdasdasda",
"nt:unstructured")
- .setProperty("data", new
FileInputStream(createBLOBTempFile(1024)));
+ sessionWS1.getRootNode().addNode("asdasdasda",
"nt:unstructured").setProperty("data",
+ new FileInputStream(createBLOBTempFile(1024)));
sessionWS1.save();
// 1-st backup
@@ -540,8 +540,8 @@
assertNotNull(back1.getRootNode().getNode("asdasdasda").getProperty("data"));
// add date to restored workspace
- back1.getRootNode().addNode("gdfgrghfhf",
"nt:unstructured")
- .setProperty("data", new
FileInputStream(createBLOBTempFile(1024)));
+ back1.getRootNode().addNode("gdfgrghfhf",
"nt:unstructured").setProperty("data",
+ new FileInputStream(createBLOBTempFile(1024)));
back1.save();
}
else
@@ -739,8 +739,7 @@
else
fail("There are no backup files in " + backDir.getAbsolutePath());
}
-
-
+
public void testRepositoryFullBackupRestore() throws Exception
{
// backup
@@ -767,13 +766,13 @@
// stop fullBackup
backup.stopBackup(bch);
-
// restore
RepositoryEntry re =
(RepositoryEntry)ws1Session.getContainer().getComponentInstanceOfType(RepositoryEntry.class);
-
+
String newRepositoryName = "repo_restored_1";
- RepositoryEntry newRepositoryEntry = makeRepositoryEntry(newRepositoryName, re,
"jdbcjcr_to_repository_restore_1", null);
+ RepositoryEntry newRepositoryEntry =
+ makeRepositoryEntry(newRepositoryName, re,
"jdbcjcr_to_repository_restore_1", null);
File backLog = new File(bch.getLogFilePath());
if (backLog.exists())
@@ -784,6 +783,8 @@
assertNotNull(bchLog.getFinishedTime());
backup.restore(bchLog, newRepositoryEntry, false);
+ assertEquals(JobWorkspaceRestore.RESTORE_SUCCESSFUL,
backup.getLastRepositoryRestore(
+ newRepositoryEntry.getName()).getStateRestore());
// check
ManageableRepository restoredRepository =
repositoryService.getRepository(newRepositoryName);
@@ -813,7 +814,7 @@
else
fail("There are no backup files in " + backDir.getAbsolutePath());
}
-
+
public void testRepositoryFullAndIncrementalBackupRestore() throws Exception
{
// backup
@@ -844,9 +845,10 @@
// restore
RepositoryEntry re =
(RepositoryEntry)ws1Session.getContainer().getComponentInstanceOfType(RepositoryEntry.class);
-
+
String newRepositoryName = "repo_restored_4";
- RepositoryEntry newRepositoryEntry = makeRepositoryEntry(newRepositoryName, re,
"jdbcjcr_to_repository_restore_4", null);
+ RepositoryEntry newRepositoryEntry =
+ makeRepositoryEntry(newRepositoryName, re,
"jdbcjcr_to_repository_restore_4", null);
File backLog = new File(bch.getLogFilePath());
if (backLog.exists())
@@ -886,7 +888,7 @@
else
fail("There are no backup files in " + backDir.getAbsolutePath());
}
-
+
public void testRepositoryFullBackupAsynchronusRestore() throws Exception
{
// backup
@@ -916,9 +918,10 @@
// restore
RepositoryEntry re =
(RepositoryEntry)ws1Session.getContainer().getComponentInstanceOfType(RepositoryEntry.class);
-
+
String newRepositoryName = "repo_restored_2";
- RepositoryEntry newRepositoryEntry = makeRepositoryEntry(newRepositoryName, re,
"jdbcjcr_to_repository_restore_2", null);
+ RepositoryEntry newRepositoryEntry =
+ makeRepositoryEntry(newRepositoryName, re,
"jdbcjcr_to_repository_restore_2", null);
File backLog = new File(bch.getLogFilePath());
if (backLog.exists())
@@ -929,11 +932,11 @@
assertNotNull(bchLog.getFinishedTime());
backup.restore(bchLog, newRepositoryEntry, true);
-
+
JobRepositoryRestore job = backup.getLastRepositoryRestore(newRepositoryName);
-
+
while (job.getStateRestore() !=
JobRepositoryRestore.REPOSITORY_RESTORE_SUCCESSFUL
- || job.getStateRestore() ==
JobRepositoryRestore.REPOSITORY_RESTORE_FAIL)
+ || job.getStateRestore() == JobRepositoryRestore.REPOSITORY_RESTORE_FAIL)
{
Thread.yield();
Thread.sleep(50);
@@ -967,7 +970,7 @@
else
fail("There are no backup files in " + backDir.getAbsolutePath());
}
-
+
public void testRepositoryFullBackupAsynchronusRestoreWorkspaceMapping() throws
Exception
{
// backup
@@ -994,21 +997,21 @@
// stop fullBackup
backup.stopBackup(bch);
-
// restore
RepositoryEntry re =
(RepositoryEntry)ws1Session.getContainer().getComponentInstanceOfType(RepositoryEntry.class);
-
+
String newRepositoryName = "repo_restored_3";
- RepositoryEntry newRepositoryEntry = makeRepositoryEntry(newRepositoryName, re,
"jdbcjcr_to_repository_restore_3", null);
-
+ RepositoryEntry newRepositoryEntry =
+ makeRepositoryEntry(newRepositoryName, re,
"jdbcjcr_to_repository_restore_3", null);
+
// create workspace mappingS
- Map<String, String> workspaceMapping = new HashedMap();
+ Map<String, String> workspaceMapping = new HashedMap();
for (WorkspaceEntry we : newRepositoryEntry.getWorkspaceEntries())
{
workspaceMapping.put(we.getName(), we.getName() + "_mapped");
}
-
+
// Change workspaeNames
for (WorkspaceEntry we : newRepositoryEntry.getWorkspaceEntries())
{
@@ -1017,7 +1020,7 @@
newRepositoryEntry.setSystemWorkspaceName(workspaceMapping.get(we.getName()));
newRepositoryEntry.setDefaultWorkspaceName(workspaceMapping.get(we.getName()));
}
-
+
we.setName(workspaceMapping.get(we.getName()));
we.setUniqueName(we.getUniqueName() + workspaceMapping.get(we.getName()));
}
@@ -1030,12 +1033,12 @@
assertNotNull(bchLog.getStartedTime());
assertNotNull(bchLog.getFinishedTime());
- backup.restore(bchLog, newRepositoryEntry, workspaceMapping,true);
-
+ backup.restore(bchLog, newRepositoryEntry, workspaceMapping, true);
+
JobRepositoryRestore job = backup.getLastRepositoryRestore(newRepositoryName);
-
+
while (job.getStateRestore() !=
JobRepositoryRestore.REPOSITORY_RESTORE_SUCCESSFUL
- || job.getStateRestore() ==
JobRepositoryRestore.REPOSITORY_RESTORE_FAIL)
+ || job.getStateRestore() == JobRepositoryRestore.REPOSITORY_RESTORE_FAIL)
{
Thread.yield();
Thread.sleep(50);
@@ -1093,26 +1096,28 @@
if (bch.getBackupId().equals(chain.getBackupId()))
fail("The backup with id '" + chain.getBackupId() + "'
should not be active");
}
-
+
public void testRepositoryRestoreFail() throws Exception
{
// restore
RepositoryEntry re =
(RepositoryEntry)ws1Session.getContainer().getComponentInstanceOfType(RepositoryEntry.class);
-
+
String newRepositoryName = "repo_restored_5";
- RepositoryEntry newRepositoryEntry = makeRepositoryEntry(newRepositoryName, re,
"jdbcjcr_to_repository_restore_5", null);
-
+ RepositoryEntry newRepositoryEntry =
+ makeRepositoryEntry(newRepositoryName, re,
"jdbcjcr_to_repository_restore_5", null);
+
//create broken system workspaceEntry
newRepositoryEntry.getWorkspaceEntries().get(0).getQueryHandler().setType("gg");
File backLog = new File(backup.getRepositoryBackupsLogs()[0].getLogFilePath());
-
+
RepositoryBackupChainLog bchLog = new RepositoryBackupChainLog(backLog);
- try {
+ try
+ {
backup.restore(bchLog, newRepositoryEntry, false);
- fail("The backup " + backLog.getAbsolutePath() + "shoulde not
restored.");
- }
+ fail("The backup " + backLog.getAbsolutePath() + "shoulde not
restored.");
+ }
catch (RepositoryRestoreExeption e)
{
// ok.
@@ -1130,7 +1135,7 @@
// ok.
}
}
-
+
public void testIncrementalBackupRestoreEXOJCR_737() throws Exception
{
// full backup with BLOBs & incremental with BLOBs
@@ -1159,7 +1164,7 @@
Thread.yield();
Thread.sleep(50);
}
-
+
// add data
ws1Session.getRootNode().addNode("node_101").setProperty("exo:data",
new FileInputStream(tempf));
ws1Session.getRootNode().addNode("node_102").setProperty("exo:extraData",
new FileInputStream(tempf));
@@ -1170,7 +1175,7 @@
backup.stopBackup(bch);
else
fail("Can't get fullBackup chain");
-
+
//remove data
ws1Session.getRootNode().getNode("node_101").remove();
ws1Session.getRootNode().getNode("node_102").remove();
@@ -1200,12 +1205,12 @@
assertNotNull(node_101);
assertEquals(tempf.length(),
node_101.getProperty("exo:data").getStream().available());
compareStream(new FileInputStream(tempf),
node_101.getProperty("exo:data").getStream());
-
+
Node node_102 = back1.getRootNode().getNode("node_102");
assertNotNull(node_102);
assertEquals(tempf.length(),
node_102.getProperty("exo:extraData").getStream().available());
compareStream(new FileInputStream(tempf),
node_102.getProperty("exo:extraData").getStream());
-
+
}
catch (Exception e)
{