Author: areshetnyak
Date: 2010-09-30 03:40:51 -0400 (Thu, 30 Sep 2010)
New Revision: 3219
Modified:
jcr/trunk/exo.jcr.component.ext/src/main/java/org/exoplatform/services/jcr/ext/backup/impl/ValueStorageCleanerService.java
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/resources/conf/standalone/test-configuration.xml
jcr/trunk/exo.jcr.component.ext/src/test/resources/conf/standalone/test-jcr-ext-config.xml
Log:
EXOJCR-747 : Make backup restore easier implementation.
Modified:
jcr/trunk/exo.jcr.component.ext/src/main/java/org/exoplatform/services/jcr/ext/backup/impl/ValueStorageCleanerService.java
===================================================================
---
jcr/trunk/exo.jcr.component.ext/src/main/java/org/exoplatform/services/jcr/ext/backup/impl/ValueStorageCleanerService.java 2010-09-29
12:40:05 UTC (rev 3218)
+++
jcr/trunk/exo.jcr.component.ext/src/main/java/org/exoplatform/services/jcr/ext/backup/impl/ValueStorageCleanerService.java 2010-09-30
07:40:51 UTC (rev 3219)
@@ -16,8 +16,14 @@
*/
package org.exoplatform.services.jcr.ext.backup.impl;
+import java.io.File;
+import java.io.IOException;
+
+import org.exoplatform.services.jcr.config.ContainerEntry;
+import org.exoplatform.services.jcr.config.RepositoryConfigurationException;
import org.exoplatform.services.jcr.config.ValueStorageEntry;
import org.exoplatform.services.jcr.config.WorkspaceEntry;
+import org.exoplatform.services.jcr.impl.storage.value.fs.FileValueStorage;
/**
* Created by The eXo Platform SAS.
@@ -30,12 +36,45 @@
public class ValueStorageCleanerService
{
- public static void removeWorkspaceValueStorage(WorkspaceEntry wEntry)
+ public static void removeWorkspaceValueStorage(WorkspaceEntry wEntry) throws
RepositoryConfigurationException, IOException
{
- /*for( ValueStorageEntry valueStorageEntry :
wEntry.getContainer().getValueStorages())
- {
-
- }*/
+ ContainerEntry containerEntry = wEntry.getContainer();
+
+ if (containerEntry.getValueStorages() != null)
+ {
+ for (ValueStorageEntry valueStorageEntry : containerEntry.getValueStorages())
+ {
+ String path = valueStorageEntry.getParameterValue(FileValueStorage.PATH);
+
+ removeFolder(new File(path));
+ }
+ }
}
+
+ /**
+ * Remove folder
+ */
+ private static void removeFolder(File dir) throws IOException
+ {
+ if (dir.isDirectory())
+ {
+ for (File subFile : dir.listFiles())
+ {
+ removeFolder(subFile);
+ }
+
+ if (!dir.delete())
+ {
+ throw new IOException("Value storage folder was not deleted : " +
dir.getCanonicalPath());
+ }
+ }
+ else
+ {
+ if (!dir.delete())
+ {
+ throw new IOException("Value storage file was not deleted : " +
dir.getCanonicalPath());
+ }
+ }
+ }
}
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-09-29
12:40:05 UTC (rev 3218)
+++
jcr/trunk/exo.jcr.component.ext/src/test/java/org/exoplatform/services/jcr/ext/backup/TestBackupManager.java 2010-09-30
07:40:51 UTC (rev 3219)
@@ -18,15 +18,6 @@
*/
package org.exoplatform.services.jcr.ext.backup;
-import org.apache.commons.collections.map.HashedMap;
-import org.exoplatform.services.jcr.config.RepositoryEntry;
-import org.exoplatform.services.jcr.config.WorkspaceEntry;
-import org.exoplatform.services.jcr.core.ManageableRepository;
-import org.exoplatform.services.jcr.ext.backup.impl.BackupManagerImpl;
-import org.exoplatform.services.jcr.ext.backup.impl.JobRepositoryRestore;
-import org.exoplatform.services.jcr.ext.backup.impl.JobWorkspaceRestore;
-import org.exoplatform.services.jcr.impl.core.SessionImpl;
-
import java.io.ByteArrayInputStream;
import java.io.File;
import java.io.FileInputStream;
@@ -34,9 +25,20 @@
import java.util.Map;
import javax.jcr.Node;
+import javax.jcr.Repository;
import javax.jcr.RepositoryException;
+import javax.jcr.Session;
import javax.jcr.lock.Lock;
+import org.apache.commons.collections.map.HashedMap;
+import org.exoplatform.services.jcr.config.RepositoryEntry;
+import org.exoplatform.services.jcr.config.WorkspaceEntry;
+import org.exoplatform.services.jcr.core.ManageableRepository;
+import org.exoplatform.services.jcr.ext.backup.impl.JobRepositoryRestore;
+import org.exoplatform.services.jcr.ext.backup.impl.JobWorkspaceRestore;
+import org.exoplatform.services.jcr.impl.core.RepositoryImpl;
+import org.exoplatform.services.jcr.impl.core.SessionImpl;
+
/**
* Created by The eXo Platform SAS.
* Author : Peter Nedonosko peter.nedonosko(a)exoplatform.com.ua
@@ -1544,6 +1546,93 @@
fail("There are no backup files in " + backDir.getAbsolutePath());
}
+ public void testExistedRepositoryRestoreMultiDB() throws Exception
+ {
+ RepositoryImpl repositoryDB7 =
(RepositoryImpl)repositoryService.getRepository("db7");
+
+ for (String wsName : repositoryDB7.getWorkspaceNames())
+ {
+ SessionImpl sessionWS = (SessionImpl)repositoryDB7.login(credentials, wsName);
+
+ Node wsTestRoot = sessionWS.getRootNode().addNode("backupTest");
+ sessionWS.getRootNode().save();
+ addContent(wsTestRoot, 1, 10, 1);
+ sessionWS.getRootNode().save();
+ }
+
+ SessionImpl sessionWS = (SessionImpl)repositoryDB7.login(credentials, WS_NAME);
+
+ // backup
+ File backDir = new File("target/backup");
+ backDir.mkdirs();
+
+ RepositoryBackupConfig config = new RepositoryBackupConfig();
+ config.setRepository(repositoryDB7.getName());
+ config.setBackupType(BackupManager.FULL_BACKUP_ONLY);
+
+ config.setBackupDir(backDir);
+
+ backup.startBackup(config);
+
+ RepositoryBackupChain bch = backup.findRepositoryBackup(repositoryDB7.getName());
+
+ // wait till full backup will be stopped
+ while (bch.getState() != RepositoryBackupChain.FINISHED)
+ {
+ Thread.yield();
+ Thread.sleep(50);
+ }
+
+ // stop fullBackup
+
+ backup.stopBackup(bch);
+
+ // restore
+ RepositoryEntry baseRE =
(RepositoryEntry)sessionWS.getContainer().getComponentInstanceOfType(RepositoryEntry.class);
+ RepositoryEntry re = makeRepositoryEntry(baseRE.getName() , baseRE, null, null);
+
+ File backLog = new File(bch.getLogFilePath());
+ if (backLog.exists())
+ {
+ RepositoryBackupChainLog bchLog = new RepositoryBackupChainLog(backLog);
+
+ assertNotNull(bchLog.getStartedTime());
+ assertNotNull(bchLog.getFinishedTime());
+
+ backup.restoreExistedRepository(bchLog, re, false);
+
+ assertEquals(JobWorkspaceRestore.RESTORE_SUCCESSFUL,
backup.getLastRepositoryRestore(
+ re.getName()).getStateRestore());
+
+ // check
+ ManageableRepository restoredRepository =
repositoryService.getRepository(re.getName());
+
+ for (String wsName : restoredRepository.getWorkspaceNames())
+ {
+ SessionImpl back1 = null;
+ try
+ {
+ back1 = (SessionImpl)restoredRepository.login(credentials, wsName);
+ Node ws1backTestRoot =
back1.getRootNode().getNode("backupTest");
+ assertEquals("Restored content should be same",
"property-5", ws1backTestRoot.getNode("node_5")
+ .getProperty("exo:data").getString());
+ }
+ catch (Exception e)
+ {
+ e.printStackTrace();
+ fail(e.getMessage());
+ }
+ finally
+ {
+ if (back1 != null)
+ back1.logout();
+ }
+ }
+ }
+ else
+ fail("There are no backup files in " + backDir.getAbsolutePath());
+ }
+
public void testExistedRepositoryRestoreAsync() throws Exception
{
// backup
@@ -1869,4 +1958,90 @@
else
fail("There are no backup files in " + backDir.getAbsolutePath());
}
+
+ public void testExistedWorkspaceRestoreMultiDB() throws Exception
+ {
+ RepositoryImpl repositoryDB7 =
(RepositoryImpl)repositoryService.getRepository("db7");
+
+ SessionImpl sessionWS = (SessionImpl) repositoryDB7.login(credentials,
"ws1");
+
+ Node wsTestRoot = sessionWS.getRootNode().addNode("backupTest");
+ sessionWS.getRootNode().save();
+ addContent(wsTestRoot, 1, 10, 1);
+ sessionWS.getRootNode().save();
+
+ // backup
+ File backDir = new File("target/backup/ws1");
+ backDir.mkdirs();
+
+ BackupConfig config = new BackupConfig();
+ config.setRepository(repositoryDB7.getName());
+ config.setWorkspace("ws1");
+ config.setBackupType(BackupManager.FULL_BACKUP_ONLY);
+
+ config.setBackupDir(backDir);
+
+ backup.startBackup(config);
+
+ BackupChain bch = backup.findBackup(repositoryDB7.getName(), "ws1");
+
+ // 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)sessionWS.getContainer().getComponentInstanceOfType(RepositoryEntry.class);
+ WorkspaceEntry ws1 = null;
+ for (WorkspaceEntry we : re.getWorkspaceEntries())
+ {
+ if (sessionWS.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.restoreExistedWorkspace(bchLog, re.getName(), ws1, false);
+
+ // check
+ SessionImpl back1 = null;
+ try
+ {
+ back1 = (SessionImpl)repositoryDB7.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());
+ }
+ catch (Exception e)
+ {
+ e.printStackTrace();
+ fail(e.getMessage());
+ }
+ finally
+ {
+ if (back1 != null)
+ back1.logout();
+ }
+ }
+ else
+ fail("There are no backup files in " + backDir.getAbsolutePath());
+ }
}
Modified:
jcr/trunk/exo.jcr.component.ext/src/test/resources/conf/standalone/test-configuration.xml
===================================================================
---
jcr/trunk/exo.jcr.component.ext/src/test/resources/conf/standalone/test-configuration.xml 2010-09-29
12:40:05 UTC (rev 3218)
+++
jcr/trunk/exo.jcr.component.ext/src/test/resources/conf/standalone/test-configuration.xml 2010-09-30
07:40:51 UTC (rev 3219)
@@ -1881,6 +1881,61 @@
<init-params>
<value-param>
<name>bind-name</name>
+ <value>jdbcjcr26</value>
+ </value-param>
+ <value-param>
+ <name>class-name</name>
+ <value>javax.sql.DataSource</value>
+ </value-param>
+ <value-param>
+ <name>factory</name>
+ <value>org.apache.commons.dbcp.BasicDataSourceFactory</value>
+ </value-param>
+ <properties-param>
+ <name>ref-addresses</name>
+ <description>ref-addresses</description>
+ <property name="driverClassName"
value="org.hsqldb.jdbcDriver" />
+ <property name="url"
value="jdbc:hsqldb:file:target/temp/data/jcr26" />
+ <property name="username" value="sa" />
+ <property name="password" value="" />
+ </properties-param>
+ </init-params>
+ </component-plugin>
+
+ <component-plugin>
+ <name>bind.datasource</name>
+ <set-method>addPlugin</set-method>
+ <type>org.exoplatform.services.naming.BindReferencePlugin</type>
+ <init-params>
+ <value-param>
+ <name>bind-name</name>
+ <value>jdbcjcr27</value>
+ </value-param>
+ <value-param>
+ <name>class-name</name>
+ <value>javax.sql.DataSource</value>
+ </value-param>
+ <value-param>
+ <name>factory</name>
+ <value>org.apache.commons.dbcp.BasicDataSourceFactory</value>
+ </value-param>
+ <properties-param>
+ <name>ref-addresses</name>
+ <description>ref-addresses</description>
+ <property name="driverClassName"
value="org.hsqldb.jdbcDriver" />
+ <property name="url"
value="jdbc:hsqldb:file:target/temp/data/jcr27" />
+ <property name="username" value="sa" />
+ <property name="password" value="" />
+ </properties-param>
+ </init-params>
+ </component-plugin>
+ <component-plugin>
+ <name>bind.datasource</name>
+ <set-method>addPlugin</set-method>
+ <type>org.exoplatform.services.naming.BindReferencePlugin</type>
+ <init-params>
+ <value-param>
+ <name>bind-name</name>
<value>jdbcjcr_to_rest_repo_1</value>
</value-param>
<value-param>
Modified:
jcr/trunk/exo.jcr.component.ext/src/test/resources/conf/standalone/test-jcr-ext-config.xml
===================================================================
---
jcr/trunk/exo.jcr.component.ext/src/test/resources/conf/standalone/test-jcr-ext-config.xml 2010-09-29
12:40:05 UTC (rev 3218)
+++
jcr/trunk/exo.jcr.component.ext/src/test/resources/conf/standalone/test-jcr-ext-config.xml 2010-09-30
07:40:51 UTC (rev 3219)
@@ -36,6 +36,16 @@
<property name="max-buffer-size" value="200k"
/>
<property name="swap-directory"
value="target/temp/swap/ws" />
</properties>
+ <value-storages>
+ <value-storage id="draft"
class="org.exoplatform.services.jcr.impl.storage.value.fs.TreeFileValueStorage">
+ <properties>
+ <property name="path"
value="../temp/values/backup" />
+ </properties>
+ <filters>
+ <filter property-type="Binary" />
+ </filters>
+ </value-storage>
+ </value-storages>
</container>
<cache enabled="true">
<properties>
@@ -338,7 +348,7 @@
</workspace>
</workspaces>
</repository>
- <repository name="db6" system-workspace="ws"
default-workspace="ws">
+ <repository name="db7" system-workspace="ws"
default-workspace="ws">
<security-domain>exo-domain</security-domain>
<access-control>optional</access-control>
<authentication-policy>org.exoplatform.services.jcr.impl.core.access.JAASAuthenticator</authentication-policy>
@@ -347,13 +357,23 @@
<!-- for system storage -->
<container
class="org.exoplatform.services.jcr.impl.storage.jdbc.optimisation.CQJDBCWorkspaceDataContainer">
<properties>
- <property name="source-name"
value="jdbcjcr24" />
+ <property name="source-name"
value="jdbcjcr26" />
<property name="dialect" value="hsqldb"
/>
- <property name="multi-db" value="false"
/>
+ <property name="multi-db" value="true" />
<property name="update-storage" value="true"
/>
<property name="max-buffer-size" value="200k"
/>
- <property name="swap-directory"
value="target/temp/swap/db6_ws" />
+ <property name="swap-directory"
value="target/temp/swap/db7_ws" />
</properties>
+ <value-storages>
+ <value-storage id="draft"
class="org.exoplatform.services.jcr.impl.storage.value.fs.TreeFileValueStorage">
+ <properties>
+ <property name="path"
value="../temp/values/db7_ws" />
+ </properties>
+ <filters>
+ <filter property-type="Binary" />
+ </filters>
+ </value-storage>
+ </value-storages>
</container>
<cache enabled="true">
<properties>
@@ -363,20 +383,30 @@
</cache>
<query-handler
class="org.exoplatform.services.jcr.impl.core.query.lucene.SearchIndex">
<properties>
- <property name="index-dir"
value="target/temp/index/db6_ws" />
+ <property name="index-dir"
value="target/temp/index/db7_ws" />
</properties>
</query-handler>
</workspace>
<workspace name="ws1">
<container
class="org.exoplatform.services.jcr.impl.storage.jdbc.optimisation.CQJDBCWorkspaceDataContainer">
<properties>
- <property name="source-name"
value="jdbcjcr24" />
+ <property name="source-name"
value="jdbcjcr27" />
<property name="dialect" value="hsqldb"
/>
- <property name="multi-db" value="false"
/>
+ <property name="multi-db" value="true" />
<property name="update-storage" value="true"
/>
<property name="max-buffer-size" value="200k"
/>
- <property name="swap-directory"
value="target/temp/swap/db6_ws1" />
+ <property name="swap-directory"
value="target/temp/swap/db7_ws1" />
</properties>
+ <value-storages>
+ <value-storage id="draft"
class="org.exoplatform.services.jcr.impl.storage.value.fs.TreeFileValueStorage">
+ <properties>
+ <property name="path"
value="../temp/values/db7_ws1" />
+ </properties>
+ <filters>
+ <filter property-type="Binary" />
+ </filters>
+ </value-storage>
+ </value-storages>
</container>
<cache enabled="true">
<properties>
@@ -386,33 +416,10 @@
</cache>
<query-handler
class="org.exoplatform.services.jcr.impl.core.query.lucene.SearchIndex">
<properties>
- <property name="index-dir"
value="target/temp/index/db6_ws1" />
+ <property name="index-dir"
value="target/temp/index/db7_ws1" />
</properties>
</query-handler>
</workspace>
- <workspace name="ws2">
- <container
class="org.exoplatform.services.jcr.impl.storage.jdbc.optimisation.CQJDBCWorkspaceDataContainer">
- <properties>
- <property name="source-name"
value="jdbcjcr24" />
- <property name="dialect" value="hsqldb"
/>
- <property name="multi-db" value="false"
/>
- <property name="update-storage" value="true"
/>
- <property name="max-buffer-size" value="200k"
/>
- <property name="swap-directory"
value="target/temp/swap/db6_ws2" />
- </properties>
- </container>
- <cache enabled="true">
- <properties>
- <property name="max-size" value="5k" />
- <property name="live-time" value="1h" />
- </properties>
- </cache>
- <query-handler
class="org.exoplatform.services.jcr.impl.core.query.lucene.SearchIndex">
- <properties>
- <property name="index-dir"
value="target/temp/index/db6_ws2" />
- </properties>
- </query-handler>
- </workspace>
</workspaces>
</repository>
</repositories>