exo-jcr SVN: r3670 - in kernel/trunk: exo.kernel.commons and 13 other directories.
by do-not-reply@jboss.org
Author: tolusha
Date: 2010-12-16 10:25:25 -0500 (Thu, 16 Dec 2010)
New Revision: 3670
Modified:
kernel/trunk/exo.kernel.commons.test/pom.xml
kernel/trunk/exo.kernel.commons/pom.xml
kernel/trunk/exo.kernel.component.cache/pom.xml
kernel/trunk/exo.kernel.component.command/pom.xml
kernel/trunk/exo.kernel.component.common/pom.xml
kernel/trunk/exo.kernel.component.ext.cache.impl.infinispan.v4/pom.xml
kernel/trunk/exo.kernel.component.ext.cache.impl.jboss.v3/pom.xml
kernel/trunk/exo.kernel.container/pom.xml
kernel/trunk/exo.kernel.mc-integration/exo.kernel.mc-int-demo/pom.xml
kernel/trunk/exo.kernel.mc-integration/exo.kernel.mc-int-tests/pom.xml
kernel/trunk/exo.kernel.mc-integration/exo.kernel.mc-int/pom.xml
kernel/trunk/exo.kernel.mc-integration/exo.kernel.mc-kernel-extras/pom.xml
kernel/trunk/exo.kernel.mc-integration/pom.xml
kernel/trunk/packaging/module/pom.xml
kernel/trunk/pom.xml
Log:
EXOJCR-1080: Restore previously changed kernel trunk version
Modified: kernel/trunk/exo.kernel.commons/pom.xml
===================================================================
--- kernel/trunk/exo.kernel.commons/pom.xml 2010-12-16 15:15:39 UTC (rev 3669)
+++ kernel/trunk/exo.kernel.commons/pom.xml 2010-12-16 15:25:25 UTC (rev 3670)
@@ -16,7 +16,7 @@
<parent>
<groupId>org.exoplatform.kernel</groupId>
<artifactId>kernel-parent</artifactId>
- <version>2.3-IMPR-SNAPSHOT</version>
+ <version>2.3.0-CR1-SNAPSHOT</version>
</parent>
<artifactId>exo.kernel.commons</artifactId>
Modified: kernel/trunk/exo.kernel.commons.test/pom.xml
===================================================================
--- kernel/trunk/exo.kernel.commons.test/pom.xml 2010-12-16 15:15:39 UTC (rev 3669)
+++ kernel/trunk/exo.kernel.commons.test/pom.xml 2010-12-16 15:25:25 UTC (rev 3670)
@@ -16,7 +16,7 @@
<parent>
<groupId>org.exoplatform.kernel</groupId>
<artifactId>kernel-parent</artifactId>
- <version>2.3-IMPR-SNAPSHOT</version>
+ <version>2.3.0-CR1-SNAPSHOT</version>
</parent>
<artifactId>exo.kernel.commons.test</artifactId>
Modified: kernel/trunk/exo.kernel.component.cache/pom.xml
===================================================================
--- kernel/trunk/exo.kernel.component.cache/pom.xml 2010-12-16 15:15:39 UTC (rev 3669)
+++ kernel/trunk/exo.kernel.component.cache/pom.xml 2010-12-16 15:25:25 UTC (rev 3670)
@@ -25,7 +25,7 @@
<parent>
<groupId>org.exoplatform.kernel</groupId>
<artifactId>kernel-parent</artifactId>
- <version>2.3-IMPR-SNAPSHOT</version>
+ <version>2.3.0-CR1-SNAPSHOT</version>
</parent>
<artifactId>exo.kernel.component.cache</artifactId>
Modified: kernel/trunk/exo.kernel.component.command/pom.xml
===================================================================
--- kernel/trunk/exo.kernel.component.command/pom.xml 2010-12-16 15:15:39 UTC (rev 3669)
+++ kernel/trunk/exo.kernel.component.command/pom.xml 2010-12-16 15:25:25 UTC (rev 3670)
@@ -25,7 +25,7 @@
<parent>
<groupId>org.exoplatform.kernel</groupId>
<artifactId>kernel-parent</artifactId>
- <version>2.3-IMPR-SNAPSHOT</version>
+ <version>2.3.0-CR1-SNAPSHOT</version>
</parent>
<artifactId>exo.kernel.component.command</artifactId>
Modified: kernel/trunk/exo.kernel.component.common/pom.xml
===================================================================
--- kernel/trunk/exo.kernel.component.common/pom.xml 2010-12-16 15:15:39 UTC (rev 3669)
+++ kernel/trunk/exo.kernel.component.common/pom.xml 2010-12-16 15:25:25 UTC (rev 3670)
@@ -25,7 +25,7 @@
<parent>
<groupId>org.exoplatform.kernel</groupId>
<artifactId>kernel-parent</artifactId>
- <version>2.3-IMPR-SNAPSHOT</version>
+ <version>2.3.0-CR1-SNAPSHOT</version>
</parent>
<artifactId>exo.kernel.component.common</artifactId>
Modified: kernel/trunk/exo.kernel.component.ext.cache.impl.infinispan.v4/pom.xml
===================================================================
--- kernel/trunk/exo.kernel.component.ext.cache.impl.infinispan.v4/pom.xml 2010-12-16 15:15:39 UTC (rev 3669)
+++ kernel/trunk/exo.kernel.component.ext.cache.impl.infinispan.v4/pom.xml 2010-12-16 15:25:25 UTC (rev 3670)
@@ -19,7 +19,7 @@
<parent>
<groupId>org.exoplatform.kernel</groupId>
<artifactId>kernel-parent</artifactId>
- <version>2.3-IMPR-SNAPSHOT</version>
+ <version>2.3.0-CR1-SNAPSHOT</version>
</parent>
<artifactId>exo.kernel.component.ext.cache.impl.infinispan.v4</artifactId>
<name>eXo Kernel :: Cache Extension :: Infinispan Implementation</name>
Modified: kernel/trunk/exo.kernel.component.ext.cache.impl.jboss.v3/pom.xml
===================================================================
--- kernel/trunk/exo.kernel.component.ext.cache.impl.jboss.v3/pom.xml 2010-12-16 15:15:39 UTC (rev 3669)
+++ kernel/trunk/exo.kernel.component.ext.cache.impl.jboss.v3/pom.xml 2010-12-16 15:25:25 UTC (rev 3670)
@@ -23,7 +23,7 @@
<parent>
<groupId>org.exoplatform.kernel</groupId>
<artifactId>kernel-parent</artifactId>
- <version>2.3-IMPR-SNAPSHOT</version>
+ <version>2.3.0-CR1-SNAPSHOT</version>
</parent>
<artifactId>exo.kernel.component.ext.cache.impl.jboss.v3</artifactId>
<name>eXo Kernel :: Cache Extension :: JBoss Cache Implementation</name>
Modified: kernel/trunk/exo.kernel.container/pom.xml
===================================================================
--- kernel/trunk/exo.kernel.container/pom.xml 2010-12-16 15:15:39 UTC (rev 3669)
+++ kernel/trunk/exo.kernel.container/pom.xml 2010-12-16 15:25:25 UTC (rev 3670)
@@ -12,7 +12,7 @@
<parent>
<groupId>org.exoplatform.kernel</groupId>
<artifactId>kernel-parent</artifactId>
- <version>2.3-IMPR-SNAPSHOT</version>
+ <version>2.3.0-CR1-SNAPSHOT</version>
</parent>
<artifactId>exo.kernel.container</artifactId>
<name>eXo Kernel :: Container</name>
Modified: kernel/trunk/exo.kernel.mc-integration/exo.kernel.mc-int/pom.xml
===================================================================
--- kernel/trunk/exo.kernel.mc-integration/exo.kernel.mc-int/pom.xml 2010-12-16 15:15:39 UTC (rev 3669)
+++ kernel/trunk/exo.kernel.mc-integration/exo.kernel.mc-int/pom.xml 2010-12-16 15:25:25 UTC (rev 3670)
@@ -6,7 +6,7 @@
<parent>
<groupId>org.exoplatform.kernel</groupId>
<artifactId>mc-integration-parent</artifactId>
- <version>2.3-IMPR-SNAPSHOT</version>
+ <version>2.3.0-CR1-SNAPSHOT</version>
</parent>
<artifactId>exo.kernel.mc-int</artifactId>
Modified: kernel/trunk/exo.kernel.mc-integration/exo.kernel.mc-int-demo/pom.xml
===================================================================
--- kernel/trunk/exo.kernel.mc-integration/exo.kernel.mc-int-demo/pom.xml 2010-12-16 15:15:39 UTC (rev 3669)
+++ kernel/trunk/exo.kernel.mc-integration/exo.kernel.mc-int-demo/pom.xml 2010-12-16 15:25:25 UTC (rev 3670)
@@ -5,7 +5,7 @@
<parent>
<groupId>org.exoplatform.kernel</groupId>
<artifactId>mc-integration-parent</artifactId>
- <version>2.3-IMPR-SNAPSHOT</version>
+ <version>2.3.0-CR1-SNAPSHOT</version>
</parent>
<artifactId>exo.kernel.mc-int-demo</artifactId>
Modified: kernel/trunk/exo.kernel.mc-integration/exo.kernel.mc-int-tests/pom.xml
===================================================================
--- kernel/trunk/exo.kernel.mc-integration/exo.kernel.mc-int-tests/pom.xml 2010-12-16 15:15:39 UTC (rev 3669)
+++ kernel/trunk/exo.kernel.mc-integration/exo.kernel.mc-int-tests/pom.xml 2010-12-16 15:25:25 UTC (rev 3670)
@@ -5,7 +5,7 @@
<parent>
<groupId>org.exoplatform.kernel</groupId>
<artifactId>mc-integration-parent</artifactId>
- <version>2.3-IMPR-SNAPSHOT</version>
+ <version>2.3.0-CR1-SNAPSHOT</version>
</parent>
<artifactId>exo.kernel.mc-int-tests</artifactId>
Modified: kernel/trunk/exo.kernel.mc-integration/exo.kernel.mc-kernel-extras/pom.xml
===================================================================
--- kernel/trunk/exo.kernel.mc-integration/exo.kernel.mc-kernel-extras/pom.xml 2010-12-16 15:15:39 UTC (rev 3669)
+++ kernel/trunk/exo.kernel.mc-integration/exo.kernel.mc-kernel-extras/pom.xml 2010-12-16 15:25:25 UTC (rev 3670)
@@ -6,7 +6,7 @@
<parent>
<groupId>org.exoplatform.kernel</groupId>
<artifactId>mc-integration-parent</artifactId>
- <version>2.3-IMPR-SNAPSHOT</version>
+ <version>2.3.0-CR1-SNAPSHOT</version>
</parent>
<artifactId>exo.kernel.mc-kernel-extras</artifactId>
Modified: kernel/trunk/exo.kernel.mc-integration/pom.xml
===================================================================
--- kernel/trunk/exo.kernel.mc-integration/pom.xml 2010-12-16 15:15:39 UTC (rev 3669)
+++ kernel/trunk/exo.kernel.mc-integration/pom.xml 2010-12-16 15:25:25 UTC (rev 3670)
@@ -6,7 +6,7 @@
<parent>
<groupId>org.exoplatform.kernel</groupId>
<artifactId>kernel-parent</artifactId>
- <version>2.3-IMPR-SNAPSHOT</version>
+ <version>2.3.0-CR1-SNAPSHOT</version>
</parent>
<artifactId>mc-integration-parent</artifactId>
Modified: kernel/trunk/packaging/module/pom.xml
===================================================================
--- kernel/trunk/packaging/module/pom.xml 2010-12-16 15:15:39 UTC (rev 3669)
+++ kernel/trunk/packaging/module/pom.xml 2010-12-16 15:25:25 UTC (rev 3670)
@@ -2,7 +2,7 @@
<parent>
<groupId>org.exoplatform.kernel</groupId>
<artifactId>kernel-parent</artifactId>
- <version>2.3-IMPR-SNAPSHOT</version>
+ <version>2.3.0-CR1-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
Modified: kernel/trunk/pom.xml
===================================================================
--- kernel/trunk/pom.xml 2010-12-16 15:15:39 UTC (rev 3669)
+++ kernel/trunk/pom.xml 2010-12-16 15:25:25 UTC (rev 3670)
@@ -30,7 +30,7 @@
<groupId>org.exoplatform.kernel</groupId>
<artifactId>kernel-parent</artifactId>
- <version>2.3-IMPR-SNAPSHOT</version>
+ <version>2.3.0-CR1-SNAPSHOT</version>
<packaging>pom</packaging>
<name>eXo Kernel</name>
13 years, 5 months
exo-jcr SVN: r3669 - kernel/trunk/exo.kernel.commons/src/main/java/org/exoplatform/commons/utils.
by do-not-reply@jboss.org
Author: tolusha
Date: 2010-12-16 10:15:39 -0500 (Thu, 16 Dec 2010)
New Revision: 3669
Modified:
kernel/trunk/exo.kernel.commons/src/main/java/org/exoplatform/commons/utils/PrivilegedFileHelper.java
Log:
EXOJCR-1090: allow to create zipOutputStream in privileged mode
Modified: kernel/trunk/exo.kernel.commons/src/main/java/org/exoplatform/commons/utils/PrivilegedFileHelper.java
===================================================================
--- kernel/trunk/exo.kernel.commons/src/main/java/org/exoplatform/commons/utils/PrivilegedFileHelper.java 2010-12-16 12:45:04 UTC (rev 3668)
+++ kernel/trunk/exo.kernel.commons/src/main/java/org/exoplatform/commons/utils/PrivilegedFileHelper.java 2010-12-16 15:15:39 UTC (rev 3669)
@@ -30,6 +30,7 @@
import java.security.PrivilegedAction;
import java.security.PrivilegedActionException;
import java.security.PrivilegedExceptionAction;
+import java.util.zip.ZipOutputStream;
/**
* @author <a href="anatoliy.bazko(a)exoplatform.org">Anatoliy Bazko</a>
@@ -79,6 +80,44 @@
}
/**
+ * Create ZipOutputStream in privileged mode.
+ *
+ * @param file
+ * @return
+ * @throws FileNotFoundException
+ */
+ public static ZipOutputStream zipOutputStream(final File file) throws FileNotFoundException
+ {
+ PrivilegedExceptionAction<ZipOutputStream> action = new PrivilegedExceptionAction<ZipOutputStream>()
+ {
+ public ZipOutputStream run() throws Exception
+ {
+ return new ZipOutputStream(new FileOutputStream(file));
+ }
+ };
+ try
+ {
+ return AccessController.doPrivileged(action);
+ }
+ catch (PrivilegedActionException pae)
+ {
+ Throwable cause = pae.getCause();
+ if (cause instanceof FileNotFoundException)
+ {
+ throw (FileNotFoundException)cause;
+ }
+ else if (cause instanceof RuntimeException)
+ {
+ throw (RuntimeException)cause;
+ }
+ else
+ {
+ throw new RuntimeException(cause);
+ }
+ }
+ }
+
+ /**
* Create FileOutputStream in privileged mode.
*
* @param name
13 years, 5 months
exo-jcr SVN: r3668 - in jcr/trunk/exo.jcr.component.ext: src/main/java/org/exoplatform/services/jcr/ext/backup/impl/rdbms and 1 other directories.
by do-not-reply@jboss.org
Author: tolusha
Date: 2010-12-16 07:45:04 -0500 (Thu, 16 Dec 2010)
New Revision: 3668
Modified:
jcr/trunk/exo.jcr.component.ext/pom.xml
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/AbstractBackupTestCase.java
jcr/trunk/exo.jcr.component.ext/src/test/java/org/exoplatform/services/jcr/ext/backup/AbstractBackupUseCasesTest.java
Log:
EXOJCR-1101: add test to include list, fix issues
Modified: jcr/trunk/exo.jcr.component.ext/pom.xml
===================================================================
--- jcr/trunk/exo.jcr.component.ext/pom.xml 2010-12-15 10:50:35 UTC (rev 3667)
+++ jcr/trunk/exo.jcr.component.ext/pom.xml 2010-12-16 12:45:04 UTC (rev 3668)
@@ -188,7 +188,6 @@
<include>**/backup/*.java</include>
</includes>
<excludes>
- <exclude>**/backup/TestRDBMSBackupManager.java</exclude>
<exclude>**/BaseStandaloneTest.java</exclude>
<exclude>**/backup/AbstractBackupTestCase.java</exclude>
<exclude>**/backup/BaseRDBMSBackupTest.java</exclude>
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-15 10:50:35 UTC (rev 3667)
+++ jcr/trunk/exo.jcr.component.ext/src/main/java/org/exoplatform/services/jcr/ext/backup/impl/rdbms/RdbmsWorkspaceInitializer.java 2010-12-16 12:45:04 UTC (rev 3668)
@@ -547,7 +547,7 @@
// construct query
int targetColumnCount = sourceColumnCount;
- if (helper.getSkipColumnIndex() != null)
+ if (helper.getDeleteColumnIndex() != null)
{
targetColumnCount--;
}
@@ -613,14 +613,19 @@
}
stream = spoolInputStream(contentReader, len);
}
-
+
if (helper.getSkipColumnIndex() != null && helper.getSkipColumnIndex() == i)
{
+ continue;
+ }
+ else if (helper.getDeleteColumnIndex() != null && helper.getDeleteColumnIndex() == i)
+ {
targetIndex--;
continue;
}
else if (helper.getConvertColumnIndexes().contains(i))
{
+ // convert column value
ByteArrayInputStream ba = (ByteArrayInputStream)stream;
byte[] readBuffer = new byte[ba.available()];
ba.read(readBuffer);
@@ -632,19 +637,34 @@
}
else
{
- if (!helper.isMultiDb && helper.isBackupMutliDb())
+ if (helper.isMultiDb)
{
- StringBuilder builder = new StringBuilder();
- builder.append(workspaceName);
- builder.append(currentValue);
-
- stream = new ByteArrayInputStream(builder.toString().getBytes());
+ if (!helper.isBackupMutliDb())
+ {
+ stream =
+ new ByteArrayInputStream(new String(readBuffer, Constants.DEFAULT_ENCODING).substring(
+ helper.getBackupWorkspaceName().length()).getBytes());
+ }
}
else
{
- stream =
- new ByteArrayInputStream(new String(readBuffer, Constants.DEFAULT_ENCODING).substring(
- helper.getBackupWorkspaceName().length()).getBytes());
+ if (helper.isBackupMutliDb())
+ {
+ StringBuilder builder = new StringBuilder();
+ builder.append(workspaceName);
+ builder.append(currentValue);
+
+ stream = new ByteArrayInputStream(builder.toString().getBytes());
+ }
+ else
+ {
+ StringBuilder builder = new StringBuilder();
+ builder.append(workspaceName);
+ builder.append(new String(readBuffer, Constants.DEFAULT_ENCODING).substring(helper
+ .getBackupWorkspaceName().length()));
+
+ stream = new ByteArrayInputStream(builder.toString().getBytes());
+ }
}
}
@@ -865,6 +885,8 @@
private File contentLenFile;
+ private Integer deleteColumnIndex = null;
+
private Integer skipColumnIndex = null;
private Integer newColumnIndex = null;
@@ -895,7 +917,7 @@
if (!backupInfo.isMultiDb())
{
// CONTAINER_NAME column index
- skipColumnIndex = 4;
+ deleteColumnIndex = 4;
// ID and PARENT_ID column indexes
convertColumnIndex.add(0);
@@ -914,8 +936,14 @@
convertColumnIndex.add(0);
convertColumnIndex.add(1);
}
+ else
+ {
+ // ID and PARENT_ID and CONTAINER_NAME column indexes
+ convertColumnIndex.add(0);
+ convertColumnIndex.add(1);
+ convertColumnIndex.add(4);
+ }
}
-
}
else if (tableType == VALUE_TABLE)
{
@@ -925,7 +953,10 @@
tableName = "JCR_" + (isMultiDb ? "M" : "S") + "VALUE";
- if (isMultiDb != backupInfo.isMultiDb())
+ // auto increment ID column
+ skipColumnIndex = 0;
+
+ if (!isMultiDb || !backupInfo.isMultiDb())
{
// PROPERTY_ID column index
convertColumnIndex.add(3);
@@ -939,7 +970,7 @@
tableName = "JCR_" + (isMultiDb ? "M" : "S") + "REF";
- if (isMultiDb != backupInfo.isMultiDb())
+ if (!isMultiDb || !backupInfo.isMultiDb())
{
// NODE_ID and PROPERTY_ID column indexes
convertColumnIndex.add(0);
@@ -1013,6 +1044,17 @@
}
/**
+ * Returns index of column which should be skipped during restore.
+ *
+ * @return Integer
+ */
+ public Integer getDeleteColumnIndex()
+ {
+ return deleteColumnIndex;
+ }
+
+
+ /**
* Returns index of column which should be added during restore.
*
* @return Integer
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-15 10:50:35 UTC (rev 3667)
+++ jcr/trunk/exo.jcr.component.ext/src/test/java/org/exoplatform/services/jcr/ext/backup/AbstractBackupTestCase.java 2010-12-16 12:45:04 UTC (rev 3668)
@@ -224,7 +224,7 @@
ws1back.setAccessManager(ws1e.getAccessManager());
ws1back.setCache(ws1e.getCache());
- ws1back.setContainer(ws1e.getContainer());
+ // ws1back.setContainer(ws1e.getContainer());
ws1back.setLockManager(ws1e.getLockManager());
ws1back.setInitializer(ws1e.getInitializer());
@@ -233,14 +233,14 @@
// qParams.add(new SimpleParameterEntry("indexDir", "target" + File.separator+ "temp" +
// File.separator +"index" + name));
qParams.add(new SimpleParameterEntry(QueryHandlerParams.PARAM_INDEX_DIR, "target" + File.separator + name
- + System.currentTimeMillis()));
+ + System.currentTimeMillis()));
QueryHandlerEntry qEntry =
new QueryHandlerEntry("org.exoplatform.services.jcr.impl.core.query.lucene.SearchIndex", qParams);
ws1back.setQueryHandler(qEntry); // EXOMAN
ArrayList params = new ArrayList();
- for (Iterator i = ws1back.getContainer().getParameters().iterator(); i.hasNext();)
+ for (Iterator i = ws1e.getContainer().getParameters().iterator(); i.hasNext();)
{
SimpleParameterEntry p = (SimpleParameterEntry) i.next();
SimpleParameterEntry newp = new SimpleParameterEntry(p.getName(), p.getValue());
@@ -253,31 +253,29 @@
params.add(newp);
}
- //Value storage
- ArrayList<ValueStorageEntry> valueStorages = new ArrayList<ValueStorageEntry>();
+ ContainerEntry ce =
+ new ContainerEntry("org.exoplatform.services.jcr.impl.storage.jdbc.JDBCWorkspaceDataContainer", params);
+
+ ArrayList<ValueStorageEntry> list = new ArrayList<ValueStorageEntry>();
+ // value storage
+ ArrayList<ValueStorageFilterEntry> vsparams = new ArrayList<ValueStorageFilterEntry>();
ValueStorageFilterEntry filterEntry = new ValueStorageFilterEntry();
filterEntry.setPropertyType("Binary");
+ vsparams.add(filterEntry);
- ArrayList<ValueStorageFilterEntry> filterEntries = new ArrayList<ValueStorageFilterEntry>();
- filterEntries.add(filterEntry);
-
-
- ValueStorageEntry valueStorageEntry = new ValueStorageEntry();
- valueStorageEntry.setType("org.exoplatform.services.jcr.impl.storage.value.fs.TreeFileValueStorage");
+ ValueStorageEntry valueStorageEntry =
+ new ValueStorageEntry("org.exoplatform.services.jcr.impl.storage.value.fs.TreeFileValueStorage", vsparams);
+ ArrayList<SimpleParameterEntry> spe = new ArrayList<SimpleParameterEntry>();
+ spe.add(new SimpleParameterEntry("path", "target/temp/swap/" + name + "_" + System.currentTimeMillis()));
valueStorageEntry.setId("draft");
- valueStorageEntry.setFilters(filterEntries);
-
- ArrayList<SimpleParameterEntry> parameterEntries = new ArrayList<SimpleParameterEntry>();
- parameterEntries.add(new SimpleParameterEntry("path", "target/temp/values/" + ws1back.getName()));
-
- valueStorageEntry.setParameters(parameterEntries);
+ valueStorageEntry.setParameters(spe);
+ valueStorageEntry.setFilters(vsparams);
- valueStorages.add(valueStorageEntry);
+ // containerEntry.setValueStorages();
+ list.add(valueStorageEntry);
+ ce.setValueStorages(list);
- ContainerEntry ce =
- new ContainerEntry("org.exoplatform.services.jcr.impl.storage.jdbc.JDBCWorkspaceDataContainer", params);
- ce.setValueStorages(valueStorages);
ws1back.setContainer(ce);
@@ -328,7 +326,6 @@
ws1back.setAccessManager(baseWorkspaceEntry.getAccessManager());
ws1back.setCache(baseWorkspaceEntry.getCache());
- ws1back.setContainer(baseWorkspaceEntry.getContainer());
ws1back.setLockManager(baseWorkspaceEntry.getLockManager());
ws1back.setInitializer(baseWorkspaceEntry.getInitializer());
@@ -349,7 +346,7 @@
}
ArrayList params = new ArrayList();
- for (Iterator i = ws1back.getContainer().getParameters().iterator(); i.hasNext();)
+ for (Iterator i = baseWorkspaceEntry.getContainer().getParameters().iterator(); i.hasNext();)
{
SimpleParameterEntry p = (SimpleParameterEntry) i.next();
SimpleParameterEntry newp = new SimpleParameterEntry(p.getName(), p.getValue());
@@ -371,6 +368,28 @@
ContainerEntry ce =
new ContainerEntry("org.exoplatform.services.jcr.impl.storage.jdbc.JDBCWorkspaceDataContainer", params);
+
+ ArrayList list = new ArrayList();
+
+ // value storage
+ ArrayList<ValueStorageFilterEntry> vsparams = new ArrayList<ValueStorageFilterEntry>();
+ ValueStorageFilterEntry filterEntry = new ValueStorageFilterEntry();
+ filterEntry.setPropertyType("Binary");
+ vsparams.add(filterEntry);
+
+ ValueStorageEntry valueStorageEntry =
+ new ValueStorageEntry("org.exoplatform.services.jcr.impl.storage.value.fs.TreeFileValueStorage", vsparams);
+ ArrayList<SimpleParameterEntry> spe = new ArrayList<SimpleParameterEntry>();
+ spe.add(new SimpleParameterEntry("path", "target/temp/swap/" + repoName + "_" + wsName + "_"
+ + System.currentTimeMillis()));
+ valueStorageEntry.setId("draft");
+ valueStorageEntry.setParameters(spe);
+ valueStorageEntry.setFilters(vsparams);
+
+ // containerEntry.setValueStorages();
+ list.add(valueStorageEntry);
+ ce.setValueStorages(list);
+
ws1back.setContainer(ce);
return ws1back;
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-15 10:50:35 UTC (rev 3667)
+++ jcr/trunk/exo.jcr.component.ext/src/test/java/org/exoplatform/services/jcr/ext/backup/AbstractBackupUseCasesTest.java 2010-12-16 12:45:04 UTC (rev 3668)
@@ -47,11 +47,9 @@
extends AbstractBackupTestCase
{
- protected static volatile int uuIndex = 0;
-
- protected static synchronized int getUUIndex()
+ protected static synchronized long getUUIndex()
{
- return uuIndex++;
+ return System.currentTimeMillis();
}
public void testFullBackupRestore() throws Exception
@@ -86,8 +84,7 @@
fail("Can't get fullBackup chain");
// restore
- RepositoryEntry re =
- (RepositoryEntry) ws1Session.getContainer().getComponentInstanceOfType(RepositoryEntry.class);
+ RepositoryEntry re = (RepositoryEntry)ws1Session.getContainer().getComponentInstanceOfType(RepositoryEntry.class);
WorkspaceEntry ws1back = makeWorkspaceEntry(workspaceNameToRestore, dataSourceToWorkspaceRestore);
// BackupChainLog bchLog = new BackupChainLog(backDir, rconfig);
@@ -105,10 +102,10 @@
SessionImpl back1 = null;
try
{
- back1 = (SessionImpl) getReposityToBackup().login(credentials, workspaceNameToRestore);
+ back1 = (SessionImpl)getReposityToBackup().login(credentials, workspaceNameToRestore);
Node ws1backTestRoot = back1.getRootNode().getNode("backupTest");
assertEquals("Restored content should be same", "property-5", ws1backTestRoot.getNode("node_5")
- .getProperty("exo:data").getString());
+ .getProperty("exo:data").getString());
}
catch (Exception e)
{
@@ -165,8 +162,7 @@
fail("Can't get fullBackup chain");
// restore
- RepositoryEntry re =
- (RepositoryEntry) ws1Session.getContainer().getComponentInstanceOfType(RepositoryEntry.class);
+ RepositoryEntry re = (RepositoryEntry)ws1Session.getContainer().getComponentInstanceOfType(RepositoryEntry.class);
WorkspaceEntry ws1back = makeWorkspaceEntry(workspaceNameToRestore, dataSourceToWorkspaceRestore);
File backLog = new File(bch.getLogFilePath());
@@ -183,16 +179,16 @@
SessionImpl back1 = null;
try
{
- back1 = (SessionImpl) getReposityToBackup().login(credentials, workspaceNameToRestore);
+ back1 = (SessionImpl)getReposityToBackup().login(credentials, workspaceNameToRestore);
Node ws1backTestRoot = back1.getRootNode().getNode("backupTest");
assertFalse("Node should be removed", ws1backTestRoot.hasNode("node_3"));
assertFalse("Node should be removed", ws1backTestRoot.hasNode("node_4"));
assertFalse("Node should be removed", ws1backTestRoot.hasNode("node_5"));
assertEquals("Restored content should be same", "property #3", ws1backTestRoot.getNode("node #3")
- .getProperty("exo:data").getString());
+ .getProperty("exo:data").getString());
assertEquals("Restored content should be same", "property #5", ws1backTestRoot.getNode("node #5")
- .getProperty("exo:extraData").getString());
+ .getProperty("exo:extraData").getString());
assertFalse("Proeprty should be removed", ws1backTestRoot.getNode("node #5").hasProperty("exo:data"));
}
@@ -254,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", (InputStream)null); // remove property
ws1TestRoot.getNode("node_3").setProperty("exo:data", new ByteArrayInputStream("aaa".getBytes())); // set
// aaa
// bytes
@@ -265,7 +261,7 @@
ws1TestRoot.save(); // log here via listener
Lock n107lock = ws1TestRoot.getNode("node_5").lock(true, false);
ws1TestRoot.getSession().move(ws1TestRoot.getNode("node #53").getPath(),
- ws1TestRoot.getNode("node_5").getPath() + "/node #53");
+ ws1TestRoot.getNode("node_5").getPath() + "/node #53");
ws1TestRoot.save(); // log here via listener
ws1TestRoot.getNode("node_6").addMixin("mix:referenceable");
@@ -273,8 +269,8 @@
ws1TestRoot.save(); // log here via listener
// before(*), log here via listener
- ws1TestRoot.getSession().getWorkspace().move(ws1TestRoot.getNode("node_6").getPath(),
- ws1TestRoot.getPath() + "/node_4"); // in place of
+ ws1TestRoot.getSession().getWorkspace()
+ .move(ws1TestRoot.getNode("node_6").getPath(), ws1TestRoot.getPath() + "/node_4"); // in place of
// 4 removed
// stop all
@@ -284,8 +280,7 @@
fail("Can't get fullBackup chain");
// restore
- RepositoryEntry re =
- (RepositoryEntry) ws1Session.getContainer().getComponentInstanceOfType(RepositoryEntry.class);
+ RepositoryEntry re = (RepositoryEntry)ws1Session.getContainer().getComponentInstanceOfType(RepositoryEntry.class);
WorkspaceEntry ws1back = makeWorkspaceEntry(workspaceNameToRestore, dataSourceToWorkspaceRestore);
File backLog = new File(bch.getLogFilePath());
@@ -302,12 +297,12 @@
SessionImpl back1 = null;
try
{
- back1 = (SessionImpl) getReposityToBackup().login(credentials, workspaceNameToRestore);
+ back1 = (SessionImpl)getReposityToBackup().login(credentials, workspaceNameToRestore);
Node ws1backTestRoot = back1.getRootNode().getNode("backupTest");
assertTrue("Node should exists", ws1backTestRoot.getNode("node_5").hasNode("node #53"));
assertTrue("Property should exists", ws1backTestRoot.getNode("node_5")
- .hasProperty("node #53/exo:extraData"));
+ .hasProperty("node #53/exo:extraData"));
assertTrue("Node should exists", ws1backTestRoot.hasNode("node_7"));
assertTrue("Property should exists", ws1backTestRoot.hasProperty("node_5/exo:data"));
@@ -315,20 +310,20 @@
assertTrue("Node should exists", ws1backTestRoot.hasNode("node_102"));
compareStream(new FileInputStream(tempf), ws1backTestRoot.getNode("node_5").getProperty("exo:data")
- .getStream());
+ .getStream());
compareStream(new FileInputStream(tempf), ws1backTestRoot.getNode("node_1").getProperty("exo:extraData")
- .getStream());
+ .getStream());
assertFalse("Property should be removed", ws1backTestRoot.getNode("node_2").hasProperty("exo:data"));
- compareStream(new ByteArrayInputStream("aaa".getBytes()), ws1backTestRoot.getNode("node_3").getProperty(
- "exo:data").getStream());
+ compareStream(new ByteArrayInputStream("aaa".getBytes()),
+ ws1backTestRoot.getNode("node_3").getProperty("exo:data").getStream());
assertTrue("Node should be mix:lockable ", ws1backTestRoot.getNode("node_5").isNodeType("mix:lockable"));
assertFalse("Node should be not locked ", ws1backTestRoot.getNode("node_5").isLocked());
- assertEquals("Node should be mix:referenceable and UUID should be " + id6, id6, ws1backTestRoot.getNode(
- "node_4").getUUID());
+ assertEquals("Node should be mix:referenceable and UUID should be " + id6, id6,
+ ws1backTestRoot.getNode("node_4").getUUID());
}
catch (Exception e)
{
@@ -347,9 +342,9 @@
public void testFullBackupRestoreAsync() throws Exception
{
- SessionImpl sessionWS1 = (SessionImpl) getReposityToBackup().login(credentials, workspaceNameToBackup);
- sessionWS1.getRootNode().getNode("backupTest").getNode("node_5").setProperty("exo:data",
- "Restored content should be same");
+ SessionImpl sessionWS1 = (SessionImpl)getReposityToBackup().login(credentials, workspaceNameToBackup);
+ sessionWS1.getRootNode().getNode("backupTest").getNode("node_5")
+ .setProperty("exo:data", "Restored content should be same");
sessionWS1.save();
// backup
@@ -395,24 +390,23 @@
backup.restore(bchLog, repositoryNameToBackup, ws1back, true);
while (backup.getLastRestore(repositoryNameToBackup, workspaceNameToRestore).getStateRestore() != JobWorkspaceRestore.RESTORE_SUCCESSFUL
- && backup.getLastRestore(repositoryNameToBackup, workspaceNameToRestore).getStateRestore() != JobWorkspaceRestore.RESTORE_FAIL)
+ && backup.getLastRestore(repositoryNameToBackup, workspaceNameToRestore).getStateRestore() != JobWorkspaceRestore.RESTORE_FAIL)
{
Thread.sleep(50);
}
if (backup.getLastRestore(repositoryNameToBackup, workspaceNameToRestore).getStateRestore() == JobWorkspaceRestore.RESTORE_FAIL)
- throw (Exception) backup.getLastRestore(repositoryNameToBackup, workspaceNameToRestore)
- .getRestoreException();
+ throw (Exception)backup.getLastRestore(repositoryNameToBackup, workspaceNameToRestore)
+ .getRestoreException();
// check
SessionImpl back1 = null;
try
{
- back1 = (SessionImpl) getReposityToBackup().login(credentials, workspaceNameToRestore);
+ back1 = (SessionImpl)getReposityToBackup().login(credentials, workspaceNameToRestore);
Node ws1backTestRoot = back1.getRootNode().getNode("backupTest");
- assertEquals("Restored content should be same", "Restored content should be same", ws1backTestRoot.getNode(
- "node_5")
- .getProperty("exo:data").getString());
+ assertEquals("Restored content should be same", "Restored content should be same",
+ ws1backTestRoot.getNode("node_5").getProperty("exo:data").getString());
}
catch (Exception e)
{
@@ -444,8 +438,14 @@
BackupChain bch = backup.startBackup(config);
- Thread.sleep(11000);
+ while (!bch.isFinished())
+ {
+ Thread.yield();
+ Thread.sleep(50);
+ }
+ Thread.sleep(5000);
+
for (BackupChain chain : backup.getCurrentBackups())
if (bch.getBackupId().equals(chain.getBackupId()))
fail("The backup with id '" + chain.getBackupId() + "' should not be active");
@@ -467,7 +467,11 @@
BackupChain bch = backup.startBackup(config);
- Thread.sleep(11000);
+ while (bch.getFullBackupState() != BackupJob.FINISHED)
+ {
+ Thread.yield();
+ Thread.sleep(50);
+ }
boolean isFail = true;
@@ -477,6 +481,8 @@
if (isFail)
fail("The backup with id '" + bch.getBackupId() + "' should be active");
+
+ backup.stopBackup(bch);
}
public void testAutoStopBackupIncrRepetion() throws Exception
@@ -495,9 +501,13 @@
final BackupChain bch = backup.startBackup(config);
- Thread.sleep(40000);
+ while (!bch.isFinished())
+ {
+ Thread.yield();
+ Thread.sleep(50);
+ }
- assertTrue(bch.isFinished());
+ Thread.sleep(5000);
for (BackupChain chain : backup.getCurrentBackups())
if (bch.getBackupId().equals(chain.getBackupId()))
@@ -507,10 +517,10 @@
public void testTwoRestores() throws Exception
{
{
- SessionImpl sessionWS1 = (SessionImpl) getReposityToBackup().login(credentials, workspaceNameToBackup);
+ SessionImpl sessionWS1 = (SessionImpl)getReposityToBackup().login(credentials, workspaceNameToBackup);
- 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
@@ -543,12 +553,12 @@
backup.restore(bchLog, repositoryNameToBackup, ws1_restore_1, false);
// check
- SessionImpl back1 = (SessionImpl) getReposityToBackup().login(credentials, workspaceNameToRestore);
+ SessionImpl back1 = (SessionImpl)getReposityToBackup().login(credentials, workspaceNameToRestore);
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
@@ -588,7 +598,7 @@
backup.restore(bchLog, repositoryNameToBackup, ws1_restore_2, false);
// check
- SessionImpl back2 = (SessionImpl) getReposityToBackup().login(credentials, workspaceNameToRestore);
+ SessionImpl back2 = (SessionImpl)getReposityToBackup().login(credentials, workspaceNameToRestore);
assertNotNull(back2.getRootNode().getNode("gdfgrghfhf").getProperty("data"));
}
else
@@ -703,8 +713,7 @@
fail("Can't get fullBackup chain");
// restore
- RepositoryEntry re =
- (RepositoryEntry) ws1Session.getContainer().getComponentInstanceOfType(RepositoryEntry.class);
+ RepositoryEntry re = (RepositoryEntry)ws1Session.getContainer().getComponentInstanceOfType(RepositoryEntry.class);
WorkspaceEntry ws1back = makeWorkspaceEntry(workspaceNameToRestore, dataSourceToWorkspaceRestore + "NOT_EXIST");
File backLog = new File(bch.getLogFilePath());
@@ -730,10 +739,10 @@
SessionImpl back1 = null;
try
{
- back1 = (SessionImpl) getReposityToBackup().login(credentials, workspaceNameToRestore);
+ back1 = (SessionImpl)getReposityToBackup().login(credentials, workspaceNameToRestore);
Node ws1backTestRoot = back1.getRootNode().getNode("backupTest");
assertEquals("Restored content should be same", "property-5", ws1backTestRoot.getNode("node_5")
- .getProperty("exo:data").getString());
+ .getProperty("exo:data").getString());
}
catch (Exception e)
{
@@ -779,8 +788,8 @@
// restore
RepositoryEntry newRepositoryEntry =
- makeRepositoryEntry(repositoryNameToRestore, getReposityToBackup().getConfiguration(),
- dataSourceToRepositoryRestore, null);
+ makeRepositoryEntry(repositoryNameToRestore, getReposityToBackup().getConfiguration(),
+ dataSourceToRepositoryRestore, null);
File backLog = new File(bch.getLogFilePath());
if (backLog.exists())
@@ -791,8 +800,8 @@
assertNotNull(bchLog.getFinishedTime());
backup.restore(bchLog, newRepositoryEntry, false);
- assertEquals(JobWorkspaceRestore.RESTORE_SUCCESSFUL, backup.getLastRepositoryRestore(
- newRepositoryEntry.getName()).getStateRestore());
+ assertEquals(JobWorkspaceRestore.RESTORE_SUCCESSFUL,
+ backup.getLastRepositoryRestore(newRepositoryEntry.getName()).getStateRestore());
// check
ManageableRepository restoredRepository = repositoryService.getRepository(repositoryNameToRestore);
@@ -802,10 +811,10 @@
SessionImpl back1 = null;
try
{
- back1 = (SessionImpl) restoredRepository.login(credentials, wsName);
+ 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());
+ .getProperty("exo:data").getString());
}
catch (Exception e)
{
@@ -853,8 +862,8 @@
// restore
RepositoryEntry newRepositoryEntry =
- makeRepositoryEntry(repositoryNameToRestore, getReposityToBackup().getConfiguration(),
- dataSourceToRepositoryRestore, null);
+ makeRepositoryEntry(repositoryNameToRestore, getReposityToBackup().getConfiguration(),
+ dataSourceToRepositoryRestore, null);
File backLog = new File(bch.getLogFilePath());
if (backLog.exists())
@@ -874,10 +883,10 @@
SessionImpl back1 = null;
try
{
- back1 = (SessionImpl) restoredRepository.login(credentials, wsName);
+ 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());
+ .getProperty("exo:data").getString());
}
catch (Exception e)
{
@@ -924,8 +933,8 @@
// restore
RepositoryEntry newRepositoryEntry =
- makeRepositoryEntry(repositoryNameToRestore, getReposityToBackup().getConfiguration(),
- dataSourceToRepositoryRestore, null);
+ makeRepositoryEntry(repositoryNameToRestore, getReposityToBackup().getConfiguration(),
+ dataSourceToRepositoryRestore, null);
File backLog = new File(bch.getLogFilePath());
if (backLog.exists())
@@ -940,7 +949,7 @@
JobRepositoryRestore job = backup.getLastRepositoryRestore(repositoryNameToRestore);
while (job.getStateRestore() != JobRepositoryRestore.REPOSITORY_RESTORE_SUCCESSFUL
- || job.getStateRestore() == JobRepositoryRestore.REPOSITORY_RESTORE_FAIL)
+ || job.getStateRestore() == JobRepositoryRestore.REPOSITORY_RESTORE_FAIL)
{
Thread.yield();
Thread.sleep(50);
@@ -954,10 +963,10 @@
SessionImpl back1 = null;
try
{
- back1 = (SessionImpl) restoredRepository.login(credentials, wsName);
+ 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());
+ .getProperty("exo:data").getString());
}
catch (Exception e)
{
@@ -1004,8 +1013,8 @@
// restore
RepositoryEntry newRepositoryEntry =
- makeRepositoryEntry(repositoryNameToRestore, getReposityToBackup().getConfiguration(),
- dataSourceToRepositoryRestore, null);
+ makeRepositoryEntry(repositoryNameToRestore, getReposityToBackup().getConfiguration(),
+ dataSourceToRepositoryRestore, null);
// create workspace mappingS
Map<String, String> workspaceMapping = new HashedMap();
@@ -1040,7 +1049,7 @@
JobRepositoryRestore job = backup.getLastRepositoryRestore(repositoryNameToRestore);
while (job.getStateRestore() != JobRepositoryRestore.REPOSITORY_RESTORE_SUCCESSFUL
- || job.getStateRestore() == JobRepositoryRestore.REPOSITORY_RESTORE_FAIL)
+ || job.getStateRestore() == JobRepositoryRestore.REPOSITORY_RESTORE_FAIL)
{
Thread.yield();
Thread.sleep(50);
@@ -1054,10 +1063,10 @@
SessionImpl back1 = null;
try
{
- back1 = (SessionImpl) restoredRepository.login(credentials, workspaceMapping.get(wsName));
+ back1 = (SessionImpl)restoredRepository.login(credentials, workspaceMapping.get(wsName));
Node ws1backTestRoot = back1.getRootNode().getNode("backupTest");
assertEquals("Restored content should be same", "property-5", ws1backTestRoot.getNode("node_5")
- .getProperty("exo:data").getString());
+ .getProperty("exo:data").getString());
}
catch (Exception e)
{
@@ -1090,9 +1099,13 @@
final RepositoryBackupChain bch = backup.startBackup(config);
- Thread.sleep(40000);
+ while (!bch.isFinished())
+ {
+ Thread.yield();
+ Thread.sleep(50);
+ }
- assertTrue(bch.isFinished());
+ Thread.sleep(5000);
for (RepositoryBackupChain chain : backup.getCurrentRepositoryBackups())
if (bch.getBackupId().equals(chain.getBackupId()))
@@ -1101,10 +1114,38 @@
public void testRepositoryRestoreFail() throws Exception
{
+ // backup
+ File backDir = new File("target/backup/" + getUUIndex());
+ backDir.mkdirs();
+
+ RepositoryBackupConfig config = new RepositoryBackupConfig();
+ config.setRepository(repositoryNameToBackup);
+ config.setBackupType(BackupManager.FULL_BACKUP_ONLY);
+
+ config.setBackupDir(backDir);
+
+ backup.startBackup(config);
+
+ RepositoryBackupChain bch = backup.findRepositoryBackup(repositoryNameToBackup);
+
+ // wait till full backup will be stopped
+ while (bch.getState() != RepositoryBackupChain.FINISHED)
+ {
+ Thread.yield();
+ Thread.sleep(50);
+ }
+
+ // stop fullBackup
+ backup.stopBackup(bch);
+
+ Thread.sleep(5000);
+
+ String repoName = repositoryNameToRestore + System.currentTimeMillis();
+
// restore
RepositoryEntry newRepositoryEntry =
- makeRepositoryEntry(repositoryNameToRestore, getReposityToBackup().getConfiguration(),
- dataSourceToRepositoryRestore, null);
+ makeRepositoryEntry(repoName, getReposityToBackup().getConfiguration(),
+ dataSourceToRepositoryRestore, null);
//create broken system workspaceEntry
newRepositoryEntry.getWorkspaceEntries().get(0).getQueryHandler().setType("gg");
@@ -1124,10 +1165,9 @@
}
// check
-
try
{
- ManageableRepository restoredRepository = repositoryService.getRepository(repositoryNameToRestore);
+ ManageableRepository restoredRepository = repositoryService.getRepository(repoName);
fail("The repository " + repositoryNameToRestore + "shoulde not exists.");
}
catch (RepositoryException e)
@@ -1198,7 +1238,7 @@
SessionImpl back1 = null;
try
{
- back1 = (SessionImpl) getReposityToBackup().login(credentials, workspaceNameToRestore);
+ back1 = (SessionImpl)getReposityToBackup().login(credentials, workspaceNameToRestore);
Node node_101 = back1.getRootNode().getNode("node_101");
assertNotNull(node_101);
@@ -1258,8 +1298,7 @@
fail("Can't get fullBackup chain");
// restore
- RepositoryEntry re =
- (RepositoryEntry) ws1Session.getContainer().getComponentInstanceOfType(RepositoryEntry.class);
+ RepositoryEntry re = (RepositoryEntry)ws1Session.getContainer().getComponentInstanceOfType(RepositoryEntry.class);
WorkspaceEntry ws1 = null;
for (WorkspaceEntry we : re.getWorkspaceEntries())
{
@@ -1284,10 +1323,10 @@
SessionImpl back1 = null;
try
{
- back1 = (SessionImpl) getReposityToBackup().login(credentials, "ws1");
+ back1 = (SessionImpl)getReposityToBackup().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());
+ .getProperty("exo:data").getString());
}
catch (Exception e)
{
@@ -1336,8 +1375,7 @@
fail("Can't get fullBackup chain");
// restore
- RepositoryEntry re =
- (RepositoryEntry) ws1Session.getContainer().getComponentInstanceOfType(RepositoryEntry.class);
+ RepositoryEntry re = (RepositoryEntry)ws1Session.getContainer().getComponentInstanceOfType(RepositoryEntry.class);
WorkspaceEntry ws1 = null;
for (WorkspaceEntry we : re.getWorkspaceEntries())
{
@@ -1359,7 +1397,7 @@
backup.restoreExistingWorkspace(bchLog, repositoryNameToBackup, ws1, true);
while (backup.getLastRestore(repositoryNameToBackup, ws1.getName()).getStateRestore() != JobWorkspaceRestore.RESTORE_SUCCESSFUL
- && backup.getLastRestore(repositoryNameToBackup, ws1.getName()).getStateRestore() != JobWorkspaceRestore.RESTORE_FAIL)
+ && backup.getLastRestore(repositoryNameToBackup, ws1.getName()).getStateRestore() != JobWorkspaceRestore.RESTORE_FAIL)
{
Thread.sleep(50);
}
@@ -1368,10 +1406,10 @@
SessionImpl back1 = null;
try
{
- back1 = (SessionImpl) getReposityToBackup().login(credentials, workspaceNameToBackup);
+ back1 = (SessionImpl)getReposityToBackup().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());
+ .getProperty("exo:data").getString());
}
catch (Exception e)
{
@@ -1420,8 +1458,7 @@
fail("Can't get fullBackup chain");
// restore
- RepositoryEntry re =
- (RepositoryEntry) ws1Session.getContainer().getComponentInstanceOfType(RepositoryEntry.class);
+ RepositoryEntry re = (RepositoryEntry)ws1Session.getContainer().getComponentInstanceOfType(RepositoryEntry.class);
WorkspaceEntry ws1 = null;
for (WorkspaceEntry we : re.getWorkspaceEntries())
{
@@ -1443,7 +1480,7 @@
backup.restoreExistingWorkspace(bchLog.getBackupId(), repositoryNameToBackup, ws1, true);
while (backup.getLastRestore(repositoryNameToBackup, ws1.getName()).getStateRestore() != JobWorkspaceRestore.RESTORE_SUCCESSFUL
- && backup.getLastRestore(repositoryNameToBackup, ws1.getName()).getStateRestore() != JobWorkspaceRestore.RESTORE_FAIL)
+ && backup.getLastRestore(repositoryNameToBackup, ws1.getName()).getStateRestore() != JobWorkspaceRestore.RESTORE_FAIL)
{
Thread.sleep(50);
}
@@ -1452,10 +1489,10 @@
SessionImpl back1 = null;
try
{
- back1 = (SessionImpl) getReposityToBackup().login(credentials, workspaceNameToBackup);
+ back1 = (SessionImpl)getReposityToBackup().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());
+ .getProperty("exo:data").getString());
}
catch (Exception e)
{
@@ -1501,7 +1538,7 @@
// restore
RepositoryEntry re =
- makeRepositoryEntry(repositoryNameToBackup, getReposityToBackup().getConfiguration(), null, null);
+ makeRepositoryEntry(repositoryNameToBackup, getReposityToBackup().getConfiguration(), null, null);
File backLog = new File(bch.getLogFilePath());
if (backLog.exists())
@@ -1514,7 +1551,7 @@
backup.restoreExistingRepository(bchLog, re, false);
assertEquals(JobWorkspaceRestore.RESTORE_SUCCESSFUL, backup.getLastRepositoryRestore(repositoryNameToBackup)
- .getStateRestore());
+ .getStateRestore());
// check
ManageableRepository restoredRepository = repositoryService.getRepository(repositoryNameToBackup);
@@ -1524,10 +1561,10 @@
SessionImpl back1 = null;
try
{
- back1 = (SessionImpl) restoredRepository.login(credentials, wsName);
+ 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());
+ .getProperty("exo:data").getString());
}
catch (Exception e)
{
@@ -1547,8 +1584,8 @@
public void testExistedRepositoryRestoreSingelDB() throws Exception
{
- RepositoryImpl repositoryDB7 = (RepositoryImpl) repositoryService.getRepository(repositoryNameToBackupSingleDB);
- SessionImpl sessionWS = (SessionImpl) repositoryDB7.login(credentials, workspaceNameToBackup);
+ RepositoryImpl repositoryDB7 = (RepositoryImpl)repositoryService.getRepository(repositoryNameToBackupSingleDB);
+ SessionImpl sessionWS = (SessionImpl)repositoryDB7.login(credentials, workspaceNameToBackup);
// backup
File backDir = new File("target/backup/" + getUUIndex());
@@ -1577,7 +1614,7 @@
// restore
RepositoryEntry baseRE =
- (RepositoryEntry) sessionWS.getContainer().getComponentInstanceOfType(RepositoryEntry.class);
+ (RepositoryEntry)sessionWS.getContainer().getComponentInstanceOfType(RepositoryEntry.class);
RepositoryEntry re = makeRepositoryEntry(baseRE.getName(), baseRE, null, null);
File backLog = new File(bch.getLogFilePath());
@@ -1591,7 +1628,7 @@
backup.restoreExistingRepository(bchLog, re, false);
assertEquals(JobWorkspaceRestore.RESTORE_SUCCESSFUL, backup.getLastRepositoryRestore(re.getName())
- .getStateRestore());
+ .getStateRestore());
// check
ManageableRepository restoredRepository = repositoryService.getRepository(repositoryNameToBackupSingleDB);
@@ -1601,10 +1638,10 @@
SessionImpl back1 = null;
try
{
- back1 = (SessionImpl) restoredRepository.login(credentials, wsName);
+ 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());
+ .getProperty("exo:data").getString());
}
catch (Exception e)
{
@@ -1651,7 +1688,7 @@
// restore
RepositoryEntry re =
- makeRepositoryEntry(repositoryNameToBackup, getReposityToBackup().getConfiguration(), null, null);
+ makeRepositoryEntry(repositoryNameToBackup, getReposityToBackup().getConfiguration(), null, null);
File backLog = new File(bch.getLogFilePath());
if (backLog.exists())
@@ -1666,14 +1703,13 @@
JobRepositoryRestore job = backup.getLastRepositoryRestore(repositoryNameToBackup);
while (job.getStateRestore() != JobRepositoryRestore.REPOSITORY_RESTORE_SUCCESSFUL
- && job.getStateRestore() != JobRepositoryRestore.REPOSITORY_RESTORE_FAIL)
+ && job.getStateRestore() != JobRepositoryRestore.REPOSITORY_RESTORE_FAIL)
{
Thread.sleep(50);
}
- assertEquals(JobRepositoryRestore.REPOSITORY_RESTORE_SUCCESSFUL, backup.getLastRepositoryRestore(
- repositoryNameToBackup)
- .getStateRestore());
+ assertEquals(JobRepositoryRestore.REPOSITORY_RESTORE_SUCCESSFUL,
+ backup.getLastRepositoryRestore(repositoryNameToBackup).getStateRestore());
// check
ManageableRepository restoredRepository = repositoryService.getRepository(repositoryNameToBackup);
@@ -1683,10 +1719,10 @@
SessionImpl back1 = null;
try
{
- back1 = (SessionImpl) restoredRepository.login(credentials, wsName);
+ 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());
+ .getProperty("exo:data").getString());
}
catch (Exception e)
{
@@ -1733,7 +1769,7 @@
// restore
RepositoryEntry re =
- makeRepositoryEntry(repositoryNameToBackup, getReposityToBackup().getConfiguration(), null, null);
+ makeRepositoryEntry(repositoryNameToBackup, getReposityToBackup().getConfiguration(), null, null);
File backLog = new File(bch.getLogFilePath());
if (backLog.exists())
@@ -1748,13 +1784,13 @@
JobRepositoryRestore job = backup.getLastRepositoryRestore(repositoryNameToBackup);
while (job.getStateRestore() != JobRepositoryRestore.REPOSITORY_RESTORE_SUCCESSFUL
- && job.getStateRestore() != JobRepositoryRestore.REPOSITORY_RESTORE_FAIL)
+ && job.getStateRestore() != JobRepositoryRestore.REPOSITORY_RESTORE_FAIL)
{
Thread.sleep(50);
}
assertEquals(JobWorkspaceRestore.RESTORE_SUCCESSFUL, backup.getLastRepositoryRestore(repositoryNameToBackup)
- .getStateRestore());
+ .getStateRestore());
// check
ManageableRepository restoredRepository = repositoryService.getRepository(repositoryNameToBackup);
@@ -1764,10 +1800,10 @@
SessionImpl back1 = null;
try
{
- back1 = (SessionImpl) restoredRepository.login(credentials, wsName);
+ 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());
+ .getProperty("exo:data").getString());
}
catch (Exception e)
{
@@ -1787,8 +1823,8 @@
public void testExistedWorkspaceRestoreSingelDB() throws Exception
{
- RepositoryImpl repositoryDB7 = (RepositoryImpl) repositoryService.getRepository(repositoryNameToBackupSingleDB);
- SessionImpl sessionWS = (SessionImpl) repositoryDB7.login(credentials, workspaceNameToBackup);
+ RepositoryImpl repositoryDB7 = (RepositoryImpl)repositoryService.getRepository(repositoryNameToBackupSingleDB);
+ SessionImpl sessionWS = (SessionImpl)repositoryDB7.login(credentials, workspaceNameToBackup);
// backup
File backDir = new File("target/backup/" + getUUIndex());
@@ -1820,7 +1856,7 @@
fail("Can't get fullBackup chain");
// restore
- RepositoryEntry re = (RepositoryEntry) sessionWS.getContainer().getComponentInstanceOfType(RepositoryEntry.class);
+ RepositoryEntry re = (RepositoryEntry)sessionWS.getContainer().getComponentInstanceOfType(RepositoryEntry.class);
WorkspaceEntry ws1 = null;
for (WorkspaceEntry we : re.getWorkspaceEntries())
{
@@ -1845,11 +1881,11 @@
SessionImpl back1 = null;
try
{
- repositoryDB7 = (RepositoryImpl) repositoryService.getRepository(repositoryNameToBackupSingleDB);
- back1 = (SessionImpl) repositoryDB7.login(credentials, workspaceNameToBackup);
+ repositoryDB7 = (RepositoryImpl)repositoryService.getRepository(repositoryNameToBackupSingleDB);
+ back1 = (SessionImpl)repositoryDB7.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());
+ .getProperty("exo:data").getString());
}
catch (Exception e)
{
@@ -1912,10 +1948,10 @@
SessionImpl back1 = null;
try
{
- back1 = (SessionImpl) getReposityToBackup().login(credentials, workspaceNameToBackup);
+ back1 = (SessionImpl)getReposityToBackup().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());
+ .getProperty("exo:data").getString());
}
catch (Exception e)
{
@@ -1973,7 +2009,7 @@
backup.restoreExistingRepository(bchLog.getBackupId(), false);
assertEquals(JobWorkspaceRestore.RESTORE_SUCCESSFUL, backup.getLastRepositoryRestore(repositoryNameToBackup)
- .getStateRestore());
+ .getStateRestore());
// check
ManageableRepository restoredRepository = repositoryService.getRepository(repositoryNameToBackup);
@@ -1983,10 +2019,10 @@
SessionImpl back1 = null;
try
{
- back1 = (SessionImpl) restoredRepository.login(credentials, wsName);
+ 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());
+ .getProperty("exo:data").getString());
}
catch (Exception e)
{
@@ -2053,10 +2089,10 @@
SessionImpl back1 = null;
try
{
- back1 = (SessionImpl) getReposityToBackup().login(credentials, "ws1");
+ back1 = (SessionImpl)getReposityToBackup().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());
+ .getProperty("exo:data").getString());
}
catch (Exception e)
{
@@ -2116,7 +2152,7 @@
backup.restoreRepository(bchLog.getBackupId(), false);
assertEquals(JobWorkspaceRestore.RESTORE_SUCCESSFUL, backup.getLastRepositoryRestore(repositoryNameToBackup)
- .getStateRestore());
+ .getStateRestore());
// check
ManageableRepository restoredRepository = repositoryService.getRepository(repositoryNameToBackup);
@@ -2126,10 +2162,10 @@
SessionImpl back1 = null;
try
{
- back1 = (SessionImpl) restoredRepository.login(credentials, wsName);
+ 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());
+ .getProperty("exo:data").getString());
}
catch (Exception e)
{
13 years, 5 months
exo-jcr SVN: r3667 - jcr/trunk/exo.jcr.component.ext/src/main/java/org/exoplatform/services/jcr/ext/backup/impl/rdbms.
by do-not-reply@jboss.org
Author: tolusha
Date: 2010-12-15 05:50:35 -0500 (Wed, 15 Dec 2010)
New Revision: 3667
Added:
jcr/trunk/exo.jcr.component.ext/src/main/java/org/exoplatform/services/jcr/ext/backup/impl/rdbms/RDBMSBackupInfoReader.java
jcr/trunk/exo.jcr.component.ext/src/main/java/org/exoplatform/services/jcr/ext/backup/impl/rdbms/RDBMSBackupInfoWriter.java
Log:
JCR-1097: support restore singleDb->multiDb, mulitDb->SingleDB
Added: jcr/trunk/exo.jcr.component.ext/src/main/java/org/exoplatform/services/jcr/ext/backup/impl/rdbms/RDBMSBackupInfoReader.java
===================================================================
--- jcr/trunk/exo.jcr.component.ext/src/main/java/org/exoplatform/services/jcr/ext/backup/impl/rdbms/RDBMSBackupInfoReader.java (rev 0)
+++ jcr/trunk/exo.jcr.component.ext/src/main/java/org/exoplatform/services/jcr/ext/backup/impl/rdbms/RDBMSBackupInfoReader.java 2010-12-15 10:50:35 UTC (rev 3667)
@@ -0,0 +1,180 @@
+/*
+ * Copyright (C) 2009 eXo Platform SAS.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.exoplatform.services.jcr.ext.backup.impl.rdbms;
+
+import org.exoplatform.commons.utils.PrivilegedFileHelper;
+import org.exoplatform.services.jcr.dataflow.serialization.ObjectReader;
+import org.exoplatform.services.jcr.impl.dataflow.serialization.ObjectReaderImpl;
+
+import java.io.File;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * Contains information about performed backup.
+ *
+ * @author <a href="mailto:anatoliy.bazko@gmail.com">Anatoliy Bazko</a>
+ * @version $Id: RDBMSBackupInfoReader.java 34360 2009-07-22 23:58:59Z tolusha $
+ */
+public class RDBMSBackupInfoReader
+{
+
+ /**
+ * File which contains necessary information about backup.
+ */
+ public static final String BACKUP_INFO = "backup.info";
+
+ /**
+ * Workspace name.
+ */
+ private final String workspaceName;
+
+ /**
+ * Repository name.
+ */
+ private final String repositoryName;
+
+ /**
+ * Is multi-db.
+ */
+ private final boolean isMultiDb;
+
+ /**
+ * Table name for items.
+ */
+ private final String itemTableName;
+
+ /**
+ * Table name for values.
+ */
+ private final String valueTableName;
+
+ /**
+ * Table name for referenceable data.
+ */
+ private final String refTableName;
+
+ /**
+ * Lock table names.
+ */
+ private final List<String> lockTableNames = new ArrayList<String>();
+
+ /**
+ * Constructor RDBMSBackupInfoReader.java.
+ *
+ * @param dir
+ * The directory where file with backup information was stored.
+ */
+ public RDBMSBackupInfoReader(String dir) throws IOException
+ {
+ ObjectReader backupInfoReader =
+ new ObjectReaderImpl(PrivilegedFileHelper.fileInputStream(new File(dir, BACKUP_INFO)));
+
+ try
+ {
+ this.repositoryName = backupInfoReader.readString();
+ this.workspaceName = backupInfoReader.readString();
+ this.isMultiDb = backupInfoReader.readBoolean();
+ this.itemTableName = backupInfoReader.readString();
+ this.valueTableName = backupInfoReader.readString();
+ this.refTableName = backupInfoReader.readString();
+
+ int lockTablesCount = backupInfoReader.readInt();
+ for (int i = 0; i < lockTablesCount; i++)
+ {
+ lockTableNames.add(backupInfoReader.readString());
+ }
+ }
+ finally
+ {
+ backupInfoReader.close();
+ }
+ }
+
+ /**
+ * Returns the original repository name where backup was performed.
+ *
+ * @return repository name
+ */
+ public String getRepositoryName()
+ {
+ return repositoryName;
+ }
+
+ /**
+ * Returns the original workspace name where backup was performed.
+ *
+ * @return workspace name
+ */
+ public String getWorkspaceName()
+ {
+ return workspaceName;
+ }
+
+ /**
+ * Returns the original value of multi-db parameter of workspace from which backup was performed.
+ *
+ * @return multi-db parameter
+ */
+ public boolean isMultiDb()
+ {
+ return isMultiDb;
+ }
+
+ /**
+ * Returns the original table name of items from which backup was performed.
+ *
+ * @return table name
+ */
+ public String getItemTableName()
+ {
+ return itemTableName;
+ }
+
+ /**
+ * Returns the original table name of values from which backup was performed.
+ *
+ * @return table name
+ */
+ public String getValueTableName()
+ {
+ return valueTableName;
+ }
+
+ /**
+ * Returns the original table name of referenceable data from which backup was performed.
+ *
+ * @return table name
+ */
+ public String getRefTableName()
+ {
+ return refTableName;
+ }
+
+ /**
+ * Returns the original table names of lock data from which backup was performed.
+ *
+ * @return list of table names
+ */
+ public List<String> getLockTableNames()
+ {
+ return lockTableNames;
+ }
+}
Added: jcr/trunk/exo.jcr.component.ext/src/main/java/org/exoplatform/services/jcr/ext/backup/impl/rdbms/RDBMSBackupInfoWriter.java
===================================================================
--- jcr/trunk/exo.jcr.component.ext/src/main/java/org/exoplatform/services/jcr/ext/backup/impl/rdbms/RDBMSBackupInfoWriter.java (rev 0)
+++ jcr/trunk/exo.jcr.component.ext/src/main/java/org/exoplatform/services/jcr/ext/backup/impl/rdbms/RDBMSBackupInfoWriter.java 2010-12-15 10:50:35 UTC (rev 3667)
@@ -0,0 +1,192 @@
+/*
+ * Copyright (C) 2009 eXo Platform SAS.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.exoplatform.services.jcr.ext.backup.impl.rdbms;
+
+import org.exoplatform.commons.utils.PrivilegedFileHelper;
+import org.exoplatform.services.jcr.dataflow.serialization.ObjectWriter;
+import org.exoplatform.services.jcr.impl.dataflow.serialization.ObjectWriterImpl;
+
+import java.io.File;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * Contains information about performed backup.
+ *
+ * @author <a href="mailto:anatoliy.bazko@gmail.com">Anatoliy Bazko</a>
+ * @version $Id: RDBMSBackupInfo.java 34360 2009-07-22 23:58:59Z tolusha $
+ */
+public class RDBMSBackupInfoWriter
+{
+
+ /**
+ * Workspace name.
+ */
+ private String workspaceName;
+
+ /**
+ * Repository name.
+ */
+ private String repositoryName;
+
+ /**
+ * Is multi-db.
+ */
+ private boolean isMultiDb;
+
+ /**
+ * Table name for items.
+ */
+ private String itemTableName;
+
+ /**
+ * Table name for values.
+ */
+ private String valueTableName;
+
+ /**
+ * Table name for referenceable data.
+ */
+ private String refTableName;
+
+ /**
+ * Lock table names.
+ */
+ private List<String> lockTableNames = new ArrayList<String>();
+
+ /**
+ * The directory where file with backup information will be stored.
+ */
+ private final String dir;
+
+ /**
+ * Constructor RDBMSBackupInfoWriter.
+ *
+ * @param dir
+ * The directory where file with backup information was stored.
+ */
+ public RDBMSBackupInfoWriter(String dir)
+ {
+ this.dir = dir;
+ }
+
+ /**
+ * Returns the original repository name where backup was performed.
+ *
+ * @return repository name
+ */
+ public void setRepositoryName(String repositoryName)
+ {
+ this.repositoryName = repositoryName;
+ }
+
+ /**
+ * Returns the original workspace name where backup was performed.
+ *
+ * @return workspace name
+ */
+ public void setWorkspaceName(String workspaceName)
+ {
+ this.workspaceName = workspaceName;
+ }
+
+ /**
+ * Returns the original value of multi-db parameter of workspace from which backup was performed.
+ *
+ * @return multi-db parameter
+ */
+ public void setMultiDb(boolean isMultiDb)
+ {
+ this.isMultiDb = isMultiDb;
+ }
+
+ /**
+ * Returns the original table name of items from which backup was performed.
+ *
+ * @return table name
+ */
+ public void setItemTableName(String itemTableName)
+ {
+ this.itemTableName = itemTableName;
+ }
+
+ /**
+ * Returns the original table name of values from which backup was performed.
+ *
+ * @return table name
+ */
+ public void setValueTableName(String valueTableName)
+ {
+ this.valueTableName = valueTableName;
+ }
+
+ /**
+ * Returns the original table name of referenceable data from which backup was performed.
+ *
+ * @return table name
+ */
+ public void setRefTableName(String refTableName)
+ {
+ this.refTableName = refTableName;
+ }
+
+ /**
+ * Returns the original table names of lock data from which backup was performed.
+ *
+ * @return list of table names
+ */
+ public void setLockTableNames(List<String> lockTableNames)
+ {
+ this.lockTableNames.clear();
+ this.lockTableNames.addAll(lockTableNames);
+ }
+
+ /**
+ * Write backup information into file.
+ *
+ * @throws IOException
+ * if any error occurred
+ */
+ public void write() throws IOException
+ {
+ ObjectWriter backupInfoWriter =
+ new ObjectWriterImpl(PrivilegedFileHelper.fileOutputStream(new File(dir, RDBMSBackupInfoReader.BACKUP_INFO)));
+
+ try
+ {
+ backupInfoWriter.writeString(repositoryName);
+ backupInfoWriter.writeString(workspaceName);
+ backupInfoWriter.writeBoolean(isMultiDb);
+ backupInfoWriter.writeString(itemTableName);
+ backupInfoWriter.writeString(valueTableName);
+ backupInfoWriter.writeString(refTableName);
+
+ backupInfoWriter.writeInt(lockTableNames.size());
+ for (int i = 0; i < lockTableNames.size(); i++)
+ {
+ backupInfoWriter.writeString(lockTableNames.get(i));
+ }
+ }
+ finally
+ {
+ backupInfoWriter.close();
+ }
+ }
+}
13 years, 5 months
exo-jcr SVN: r3666 - in jcr/trunk/exo.jcr.component.ext: src/main/java/org/exoplatform/services/jcr/ext/backup/impl and 3 other directories.
by do-not-reply@jboss.org
Author: tolusha
Date: 2010-12-15 05:23:42 -0500 (Wed, 15 Dec 2010)
New Revision: 3666
Added:
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/impl/core/TesterRdbmsWorkspaceInitializer.java
Removed:
jcr/trunk/exo.jcr.component.ext/src/test/java/org/exoplatform/services/jcr/impl/core/RdbmsWorkspaceInitializerWrapper.java
Modified:
jcr/trunk/exo.jcr.component.ext/pom.xml
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/main/java/org/exoplatform/services/jcr/ext/backup/impl/rdbms/FullBackupJob.java
jcr/trunk/exo.jcr.component.ext/src/test/java/org/exoplatform/services/jcr/ext/backup/TestRdbmsFullBackupJob.java
jcr/trunk/exo.jcr.component.ext/src/test/java/org/exoplatform/services/jcr/ext/backup/TestRdbmsWorkspaceInitializer.java
Log:
JCR-1097: support restore singleDb->multiDb, mulitDb->SingleDB
Modified: jcr/trunk/exo.jcr.component.ext/pom.xml
===================================================================
--- jcr/trunk/exo.jcr.component.ext/pom.xml 2010-12-14 11:59:31 UTC (rev 3665)
+++ jcr/trunk/exo.jcr.component.ext/pom.xml 2010-12-15 10:23:42 UTC (rev 3666)
@@ -185,9 +185,10 @@
<include>**/replication/*.java</include>
<include>**/replication/external/*.java</include>
<include>**/replication/async/**/*.java</include>
+ <include>**/backup/*.java</include>
</includes>
<excludes>
- <exclude>**/backup/*.java</exclude>
+ <exclude>**/backup/TestRDBMSBackupManager.java</exclude>
<exclude>**/BaseStandaloneTest.java</exclude>
<exclude>**/backup/AbstractBackupTestCase.java</exclude>
<exclude>**/backup/BaseRDBMSBackupTest.java</exclude>
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-12-14 11:59:31 UTC (rev 3665)
+++ jcr/trunk/exo.jcr.component.ext/src/main/java/org/exoplatform/services/jcr/ext/backup/impl/BackupManagerImpl.java 2010-12-15 10:23:42 UTC (rev 3666)
@@ -54,11 +54,11 @@
import org.exoplatform.services.jcr.ext.backup.RepositoryRestoreExeption;
import org.exoplatform.services.jcr.ext.backup.WorkspaceRestoreException;
import org.exoplatform.services.jcr.ext.backup.impl.fs.FullBackupJob;
+import org.exoplatform.services.jcr.ext.backup.impl.rdbms.RdbmsWorkspaceInitializer;
import org.exoplatform.services.jcr.ext.common.SessionProvider;
import org.exoplatform.services.jcr.ext.registry.RegistryEntry;
import org.exoplatform.services.jcr.ext.registry.RegistryService;
import org.exoplatform.services.jcr.ext.replication.FixupStream;
-import org.exoplatform.services.jcr.impl.core.RdbmsWorkspaceInitializer;
import org.exoplatform.services.jcr.impl.core.RepositoryImpl;
import org.exoplatform.services.jcr.impl.core.SessionImpl;
import org.exoplatform.services.jcr.impl.core.SysViewWorkspaceInitializer;
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-12-14 11:59:31 UTC (rev 3665)
+++ jcr/trunk/exo.jcr.component.ext/src/main/java/org/exoplatform/services/jcr/ext/backup/impl/JobRepositoryRestore.java 2010-12-15 10:23:42 UTC (rev 3666)
@@ -28,7 +28,7 @@
import org.exoplatform.services.jcr.ext.backup.RepositoryBackupChainLog;
import org.exoplatform.services.jcr.ext.backup.RepositoryRestoreExeption;
import org.exoplatform.services.jcr.ext.backup.impl.fs.FullBackupJob;
-import org.exoplatform.services.jcr.impl.core.RdbmsWorkspaceInitializer;
+import org.exoplatform.services.jcr.ext.backup.impl.rdbms.RdbmsWorkspaceInitializer;
import org.exoplatform.services.jcr.impl.core.RepositoryImpl;
import org.exoplatform.services.jcr.impl.core.SessionRegistry;
import org.exoplatform.services.jcr.impl.core.SysViewWorkspaceInitializer;
Modified: jcr/trunk/exo.jcr.component.ext/src/main/java/org/exoplatform/services/jcr/ext/backup/impl/rdbms/FullBackupJob.java
===================================================================
--- jcr/trunk/exo.jcr.component.ext/src/main/java/org/exoplatform/services/jcr/ext/backup/impl/rdbms/FullBackupJob.java 2010-12-14 11:59:31 UTC (rev 3665)
+++ jcr/trunk/exo.jcr.component.ext/src/main/java/org/exoplatform/services/jcr/ext/backup/impl/rdbms/FullBackupJob.java 2010-12-15 10:23:42 UTC (rev 3666)
@@ -20,6 +20,7 @@
import org.exoplatform.commons.utils.PrivilegedFileHelper;
import org.exoplatform.commons.utils.SecurityHelper;
+import org.exoplatform.services.jcr.config.LockManagerEntry;
import org.exoplatform.services.jcr.config.QueryHandlerParams;
import org.exoplatform.services.jcr.config.RepositoryConfigurationException;
import org.exoplatform.services.jcr.config.ValueStorageEntry;
@@ -31,7 +32,6 @@
import org.exoplatform.services.jcr.ext.backup.impl.AbstractFullBackupJob;
import org.exoplatform.services.jcr.ext.backup.impl.FileNameProducer;
import org.exoplatform.services.jcr.impl.Constants;
-import org.exoplatform.services.jcr.impl.core.RdbmsWorkspaceInitializer;
import org.exoplatform.services.jcr.impl.core.lock.cacheable.AbstractCacheableLockManager;
import org.exoplatform.services.jcr.impl.core.query.SystemSearchManager;
import org.exoplatform.services.jcr.impl.dataflow.serialization.ObjectWriterImpl;
@@ -57,6 +57,7 @@
import java.sql.SQLException;
import java.sql.Types;
import java.util.Calendar;
+import java.util.List;
import javax.naming.InitialContext;
import javax.naming.NameNotFoundException;
@@ -69,7 +70,51 @@
*/
public class FullBackupJob extends AbstractFullBackupJob
{
+ /**
+ * Index directory in full backup storage.
+ */
+ public static final String INDEX_DIR = "index";
+ /**
+ * System index directory in full backup storage.
+ */
+ public static final String SYSTEM_INDEX_DIR = INDEX_DIR + "_" + SystemSearchManager.INDEX_DIR_SUFFIX;
+
+ /**
+ * Value storage directory in full backup storage.
+ */
+ public static final String VALUE_STORAGE_DIR = "values";
+
+ /**
+ * Suffix for content file.
+ */
+ public static final String CONTENT_FILE_SUFFIX = ".dump";
+
+ /**
+ * Suffix for content length file.
+ */
+ public static final String CONTENT_LEN_FILE_SUFFIX = ".len";
+
+ /**
+ * Content is absent.
+ */
+ public static final byte NULL_LEN = 0;
+
+ /**
+ * Content length value has byte type.
+ */
+ public static final byte BYTE_LEN = 1;
+
+ /**
+ * Content length value has integer type.
+ */
+ public static final byte INT_LEN = 2;
+
+ /**
+ * Content length value has long type.
+ */
+ public static final byte LONG_LEN = 3;
+
/**
* Logger.
*/
@@ -163,6 +208,7 @@
throw new RepositoryConfigurationException(JDBCWorkspaceDataContainer.MULTIDB
+ " parameter not found in workspace " + workspaceName + " configuration");
}
+ boolean isMultiDb = Boolean.parseBoolean(multiDb);
final DataSource ds = (DataSource)new InitialContext().lookup(dsName);
if (ds == null)
@@ -182,50 +228,63 @@
transactionIsolation = jdbcConn.getTransactionIsolation();
jdbcConn.setTransactionIsolation(Connection.TRANSACTION_SERIALIZABLE);
+ RDBMSBackupInfoWriter backupInfoWriter = new RDBMSBackupInfoWriter(getStorageURL().getFile());
+
+ backupInfoWriter.setRepositoryName(repository.getConfiguration().getName());
+ backupInfoWriter.setWorkspaceName(workspaceName);
+ backupInfoWriter.setMultiDb(isMultiDb);
+
// dump JCR data
String[][] scripts;
- if (Boolean.parseBoolean(multiDb))
+ if (isMultiDb)
{
scripts =
- new String[][]{{"JCR_MVALUE", "select * from JCR_MVALUE"}, {"JCR_MREF", "select * from JCR_MREF"},
- {"JCR_MITEM", "select * from JCR_MITEM where JCR_MITEM.name <> '__root_parent'"}};
+ new String[][]{
+ {"JCR_MITEM", "select * from JCR_MITEM where JCR_MITEM.name <> '" + Constants.ROOT_PARENT_NAME + "'"},
+ {"JCR_MVALUE", "select * from JCR_MVALUE"}, {"JCR_MREF", "select * from JCR_MREF"}};
}
else
{
scripts =
new String[][]{
+ {"JCR_SITEM", "select * from JCR_SITEM where CONTAINER_NAME='" + workspaceName + "'"},
{
"JCR_SVALUE",
- "select from JCR_SVALUE where exists(select * from JCR_SITEM where JCR_SITEM.ID=JCR_SVALUE.PROPERTY_ID and JCR_SITEM.CONTAINER_NAME="
- + workspaceName + ")"},
+ "select * from JCR_SVALUE where exists(select * from JCR_SITEM where JCR_SITEM.ID=JCR_SVALUE.PROPERTY_ID and JCR_SITEM.CONTAINER_NAME='"
+ + workspaceName + "')"},
{
"JCR_SREF",
- "select from JCR_SREF where exists(select * from JCR_SITEM where JCR_SITEM.ID=JCR_SREF.PROPERTY_ID and JCR_SITEM.CONTAINER_NAME="
- + workspaceName + ")"},
- {"JCR_SITEM", "select from JCR_SITEM where CONTAINER_NAME=" + workspaceName}};
+ "select * from JCR_SREF where exists(select * from JCR_SITEM where JCR_SITEM.ID=JCR_SREF.PROPERTY_ID and JCR_SITEM.CONTAINER_NAME='"
+ + workspaceName + "')"}};
}
+ backupInfoWriter.setItemTableName(scripts[0][0]);
+ backupInfoWriter.setValueTableName(scripts[1][0]);
+ backupInfoWriter.setRefTableName(scripts[2][0]);
+
for (String script[] : scripts)
{
dumpTable(jdbcConn, script[0], script[1]);
}
// dump LOCK data
- String lockTableName = AbstractCacheableLockManager.getLockTableName(workspaceEntry.getLockManager());
- if (lockTableName != null)
+ LockManagerEntry lockEntry = workspaceEntry.getLockManager();
+ if (lockEntry != null)
{
- scripts =
- new String[][]{{lockTableName, "select * from " + lockTableName},
- {lockTableName + "_D", "select * from " + lockTableName + "_D"}};
+ List<String> lockTableNames = AbstractCacheableLockManager.getLockTableNames(lockEntry);
+ backupInfoWriter.setLockTableNames(lockTableNames);
- for (String script[] : scripts)
+ for (String tableName : lockTableNames)
{
- dumpTable(jdbcConn, script[0], script[1]);
+ dumpTable(jdbcConn, tableName, AbstractCacheableLockManager.getSelectScript(tableName));
}
}
backupValueStorage(workspaceEntry);
backupIndex(workspaceEntry);
+
+ // write backup information
+ backupInfoWriter.write();
}
catch (RepositoryConfigurationException e)
{
@@ -302,7 +361,7 @@
}
else
{
- File destDir = new File(getStorageURL().getFile(), RdbmsWorkspaceInitializer.INDEX_DIR);
+ File destDir = new File(getStorageURL().getFile(), INDEX_DIR);
copyDirectory(srcDir, destDir);
}
@@ -317,7 +376,7 @@
}
else
{
- File destDir = new File(getStorageURL().getFile(), RdbmsWorkspaceInitializer.SYSTEM_INDEX_DIR);
+ File destDir = new File(getStorageURL().getFile(), SYSTEM_INDEX_DIR);
copyDirectory(srcDir, destDir);
}
}
@@ -347,7 +406,7 @@
}
else
{
- File destValuesDir = new File(getStorageURL().getFile(), RdbmsWorkspaceInitializer.VALUE_STORAGE_DIR);
+ File destValuesDir = new File(getStorageURL().getFile(), VALUE_STORAGE_DIR);
File destDir = new File(destValuesDir, valueStorage.getId());
copyDirectory(srcDir, destDir);
@@ -370,12 +429,10 @@
ResultSet rs = null;
try
{
- File contentFile =
- new File(getStorageURL().getFile(), tableName + RdbmsWorkspaceInitializer.CONTENT_FILE_SUFFIX);
+ File contentFile = new File(getStorageURL().getFile(), tableName + CONTENT_FILE_SUFFIX);
contentWriter = new ObjectWriterImpl(PrivilegedFileHelper.fileOutputStream(contentFile));
- File contentLenFile =
- new File(getStorageURL().getFile(), tableName + RdbmsWorkspaceInitializer.CONTENT_LEN_FILE_SUFFIX);
+ File contentLenFile = new File(getStorageURL().getFile(), tableName + CONTENT_LEN_FILE_SUFFIX);
contentLenWriter = new ObjectWriterImpl(PrivilegedFileHelper.fileOutputStream(contentLenFile));
stmt = jdbcConn.prepareStatement(script);
@@ -418,7 +475,7 @@
if (value == null)
{
- contentLenWriter.writeByte(RdbmsWorkspaceInitializer.NULL_LEN);
+ contentLenWriter.writeByte(NULL_LEN);
}
else
{
@@ -467,17 +524,17 @@
{
if (len < Byte.MAX_VALUE)
{
- out.writeByte(RdbmsWorkspaceInitializer.BYTE_LEN);
+ out.writeByte(BYTE_LEN);
out.writeByte((byte)len);
}
else if (len < Integer.MAX_VALUE)
{
- out.writeByte(RdbmsWorkspaceInitializer.INT_LEN);
+ out.writeByte(INT_LEN);
out.writeInt((int)len);
}
else
{
- out.writeByte(RdbmsWorkspaceInitializer.LONG_LEN);
+ out.writeByte(LONG_LEN);
out.writeLong(len);
}
}
Copied: jcr/trunk/exo.jcr.component.ext/src/main/java/org/exoplatform/services/jcr/ext/backup/impl/rdbms/RdbmsBackupWorkspaceInitializer.java (from rev 3662, jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/RdbmsBackupWorkspaceInitializer.java)
===================================================================
--- jcr/trunk/exo.jcr.component.ext/src/main/java/org/exoplatform/services/jcr/ext/backup/impl/rdbms/RdbmsBackupWorkspaceInitializer.java (rev 0)
+++ jcr/trunk/exo.jcr.component.ext/src/main/java/org/exoplatform/services/jcr/ext/backup/impl/rdbms/RdbmsBackupWorkspaceInitializer.java 2010-12-15 10:23:42 UTC (rev 3666)
@@ -0,0 +1,90 @@
+/*
+ * Copyright (C) 2003-2010 eXo Platform SAS.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Affero General Public License
+ * as published by the Free Software Foundation; either version 3
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, see<http://www.gnu.org/licenses/>.
+ */
+package org.exoplatform.services.jcr.ext.backup.impl.rdbms;
+
+import org.exoplatform.services.jcr.access.AccessManager;
+import org.exoplatform.services.jcr.config.RepositoryConfigurationException;
+import org.exoplatform.services.jcr.config.RepositoryEntry;
+import org.exoplatform.services.jcr.config.WorkspaceEntry;
+import org.exoplatform.services.jcr.datamodel.NodeData;
+import org.exoplatform.services.jcr.impl.Constants;
+import org.exoplatform.services.jcr.impl.core.LocationFactory;
+import org.exoplatform.services.jcr.impl.core.NamespaceRegistryImpl;
+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.log.ExoLogger;
+import org.exoplatform.services.log.Log;
+
+import javax.jcr.PathNotFoundException;
+import javax.jcr.RepositoryException;
+
+/**
+ * Created by The eXo Platform SAS.
+ *
+ * <br/>Date: 2010
+ *
+ * @author <a href="mailto:alex.reshetnyak@exoplatform.com.ua">Alex Reshetnyak</a>
+ * @version $Id$
+ */
+public class RdbmsBackupWorkspaceInitializer extends RdbmsWorkspaceInitializer
+{
+ /**
+ * Logger.
+ */
+ protected static final Log log = ExoLogger.getLogger("exo.jcr.component.core.RdbmsBackupWorkspaceInitializer");
+
+ /**
+ * Constructor RdbmsBackupWorkspaceInitializer.
+ */
+ public RdbmsBackupWorkspaceInitializer(WorkspaceEntry config, RepositoryEntry repConfig,
+ CacheableWorkspaceDataManager dataManager, NamespaceRegistryImpl namespaceRegistry,
+ LocationFactory locationFactory, NodeTypeManagerImpl nodeTypeManager, ValueFactoryImpl valueFactory,
+ AccessManager accessManager) throws RepositoryConfigurationException, PathNotFoundException, RepositoryException
+ {
+ super(config, repConfig, dataManager, namespaceRegistry, locationFactory, nodeTypeManager, valueFactory,
+ accessManager);
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ @Override
+ public NodeData initWorkspace() throws RepositoryException
+ {
+ if (isWorkspaceInitialized())
+ {
+ return (NodeData)dataManager.getItemData(Constants.ROOT_UUID);
+ }
+
+ long start = System.currentTimeMillis();
+
+ // restore from full rdbms backup
+ fullRdbmsRestore();
+
+ // restore from incremental backup
+ incrementalRead();
+
+ final NodeData root = (NodeData)dataManager.getItemData(Constants.ROOT_UUID);
+
+ log.info("Workspace [" + workspaceName + "] restored from storage " + restorePath + " in "
+ + (System.currentTimeMillis() - start) * 1d / 1000 + "sec");
+
+ return root;
+ }
+
+}
Property changes on: jcr/trunk/exo.jcr.component.ext/src/main/java/org/exoplatform/services/jcr/ext/backup/impl/rdbms/RdbmsBackupWorkspaceInitializer.java
___________________________________________________________________
Name: svn:keywords
+ Id
Name: svn:eol-style
+ native
Copied: jcr/trunk/exo.jcr.component.ext/src/main/java/org/exoplatform/services/jcr/ext/backup/impl/rdbms/RdbmsWorkspaceInitializer.java (from rev 3662, jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/RdbmsWorkspaceInitializer.java)
===================================================================
--- jcr/trunk/exo.jcr.component.ext/src/main/java/org/exoplatform/services/jcr/ext/backup/impl/rdbms/RdbmsWorkspaceInitializer.java (rev 0)
+++ jcr/trunk/exo.jcr.component.ext/src/main/java/org/exoplatform/services/jcr/ext/backup/impl/rdbms/RdbmsWorkspaceInitializer.java 2010-12-15 10:23:42 UTC (rev 3666)
@@ -0,0 +1,1065 @@
+/*
+ * Copyright (C) 2009 eXo Platform SAS.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.exoplatform.services.jcr.ext.backup.impl.rdbms;
+
+import org.exoplatform.commons.utils.PrivilegedFileHelper;
+import org.exoplatform.commons.utils.SecurityHelper;
+import org.exoplatform.services.jcr.access.AccessManager;
+import org.exoplatform.services.jcr.config.LockManagerEntry;
+import org.exoplatform.services.jcr.config.QueryHandlerParams;
+import org.exoplatform.services.jcr.config.RepositoryConfigurationException;
+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.dataflow.serialization.ObjectReader;
+import org.exoplatform.services.jcr.datamodel.NodeData;
+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.lock.cacheable.AbstractCacheableLockManager;
+import org.exoplatform.services.jcr.impl.core.nodetype.NodeTypeManagerImpl;
+import org.exoplatform.services.jcr.impl.core.query.SystemSearchManager;
+import org.exoplatform.services.jcr.impl.core.value.ValueFactoryImpl;
+import org.exoplatform.services.jcr.impl.dataflow.persistent.CacheableWorkspaceDataManager;
+import org.exoplatform.services.jcr.impl.dataflow.serialization.ObjectReaderImpl;
+import org.exoplatform.services.jcr.impl.storage.jdbc.DBConstants;
+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.log.ExoLogger;
+import org.exoplatform.services.log.Log;
+
+import java.io.ByteArrayInputStream;
+import java.io.EOFException;
+import java.io.File;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.security.PrivilegedExceptionAction;
+import java.sql.Connection;
+import java.sql.PreparedStatement;
+import java.sql.ResultSet;
+import java.sql.SQLException;
+import java.sql.Statement;
+import java.sql.Types;
+import java.util.ArrayList;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+
+import javax.jcr.PathNotFoundException;
+import javax.jcr.RepositoryException;
+import javax.naming.InitialContext;
+import javax.naming.NameNotFoundException;
+import javax.naming.NamingException;
+import javax.sql.DataSource;
+
+/**
+ * @author <a href="mailto:anatoliy.bazko@gmail.com">Anatoliy Bazko</a>
+ * @version $Id: RdbmsWorkspaceInitializer.java 34360 2009-07-22 23:58:59Z tolusha $
+ */
+public class RdbmsWorkspaceInitializer extends BackupWorkspaceInitializer
+{
+ /**
+ * Logger.
+ */
+ protected static final Log log = ExoLogger.getLogger("exo.jcr.component.core.RdbmsWorkspaceInitializer");
+
+
+ /**
+ * List of temporary files.
+ */
+ protected List<File> spoolFileList = new ArrayList<File>();
+
+ /**
+ * Constructor RdbmsWorkspaceInitializer.
+ */
+ public RdbmsWorkspaceInitializer(WorkspaceEntry config, RepositoryEntry repConfig,
+ CacheableWorkspaceDataManager dataManager, NamespaceRegistryImpl namespaceRegistry,
+ LocationFactory locationFactory, NodeTypeManagerImpl nodeTypeManager, ValueFactoryImpl valueFactory,
+ AccessManager accessManager) throws RepositoryConfigurationException, PathNotFoundException, RepositoryException
+ {
+ super(config, repConfig, dataManager, namespaceRegistry, locationFactory, nodeTypeManager, valueFactory,
+ accessManager);
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ @Override
+ public NodeData initWorkspace() throws RepositoryException
+ {
+ if (isWorkspaceInitialized())
+ {
+ return (NodeData)dataManager.getItemData(Constants.ROOT_UUID);
+ }
+
+ long start = System.currentTimeMillis();
+
+ fullRdbmsRestore();
+
+ final NodeData root = (NodeData)dataManager.getItemData(Constants.ROOT_UUID);
+
+ log.info("Workspace [" + workspaceName + "] restored from storage " + restorePath + " in "
+ + (System.currentTimeMillis() - start) * 1d / 1000 + "sec");
+
+ return root;
+ }
+
+ /**
+ * Restore from full rdbms backup.
+ */
+ protected void fullRdbmsRestore() throws RepositoryException
+ {
+ Connection jdbcConn = null;
+ Integer transactionIsolation = null;
+ Statement st = null;
+ try
+ {
+ String dsName = workspaceEntry.getContainer().getParameterValue(JDBCWorkspaceDataContainer.SOURCE_NAME);
+ if (dsName == null)
+ {
+ throw new RepositoryConfigurationException("Data source name not found in workspace configuration "
+ + workspaceName);
+ }
+
+ String multiDb = workspaceEntry.getContainer().getParameterValue(JDBCWorkspaceDataContainer.MULTIDB);
+ if (multiDb == null)
+ {
+ throw new RepositoryConfigurationException(JDBCWorkspaceDataContainer.MULTIDB
+ + " parameter not found in workspace " + workspaceName + " configuration");
+ }
+ boolean isMultiDb = Boolean.parseBoolean(multiDb);
+
+ final DataSource ds = (DataSource)new InitialContext().lookup(dsName);
+ if (ds == null)
+ {
+ throw new NameNotFoundException("Data source " + dsName + " not found");
+ }
+
+ jdbcConn = SecurityHelper.doPriviledgedSQLExceptionAction(new PrivilegedExceptionAction<Connection>()
+ {
+ public Connection run() throws Exception
+ {
+ return ds.getConnection();
+
+ }
+ });
+
+ transactionIsolation = jdbcConn.getTransactionIsolation();
+ jdbcConn.setTransactionIsolation(Connection.TRANSACTION_SERIALIZABLE);
+
+ jdbcConn.setAutoCommit(false);
+
+ RDBMSBackupInfoReader backupInfo = new RDBMSBackupInfoReader(restorePath);
+
+ // restore JCR data
+ Integer[] tableTypes =
+ new Integer[]{RestoreTableHelper.ITEM_TABLE, RestoreTableHelper.VALUE_TABLE, RestoreTableHelper.REF_TABLE};
+
+ for (Integer tableType : tableTypes)
+ {
+ RestoreTableHelper helper = new RestoreTableHelper(tableType, isMultiDb, backupInfo);
+
+ if (tableType == RestoreTableHelper.ITEM_TABLE)
+ {
+ // resolve constraint name depends on database
+ String constraintName;
+ String dbDialect = DialectDetecter.detect(jdbcConn.getMetaData());
+
+ if (dbDialect.equals(DBConstants.DB_DIALECT_DB2) || dbDialect.equals(DBConstants.DB_DIALECT_DB2V8))
+ {
+ constraintName = "JCR_FK_" + (Boolean.parseBoolean(multiDb) ? "M" : "S") + "ITEM_PAREN";
+ }
+ else
+ {
+ constraintName = "JCR_FK_" + (Boolean.parseBoolean(multiDb) ? "M" : "S") + "ITEM_PARENT";
+ }
+ String constraint =
+ "CONSTRAINT " + constraintName + " FOREIGN KEY(PARENT_ID) REFERENCES " + helper.getTableName()
+ + "(ID)";
+
+ // drop constraint
+ st = jdbcConn.createStatement();
+ st.execute("ALTER TABLE " + helper.getTableName() + " DROP CONSTRAINT " + constraintName);
+ jdbcConn.commit();
+
+ restoreTable(jdbcConn, helper);
+
+ // add constraint
+ st = jdbcConn.createStatement();
+ st.execute("ALTER TABLE " + helper.getTableName() + " ADD " + constraint);
+ jdbcConn.commit();
+ }
+ else
+ {
+ if (PrivilegedFileHelper.exists(helper.getContentFile()))
+ {
+ restoreTable(jdbcConn, helper);
+ }
+ else
+ {
+ throw new IOException("File " + PrivilegedFileHelper.getCanonicalPath(helper.getContentFile())
+ + " not found");
+ }
+ }
+ }
+
+ // restore Lock data
+ LockManagerEntry lockEntry = workspaceEntry.getLockManager();
+ if (lockEntry != null)
+ {
+ List<String> existedLockTablesNames = AbstractCacheableLockManager.getLockTableNames(lockEntry);
+ if (existedLockTablesNames.size() != backupInfo.getLockTableNames().size())
+ {
+ throw new RepositoryException("The amount of existed lock tables differs from backup");
+ }
+
+ for (int i = 0; i < backupInfo.getLockTableNames().size(); i++)
+ {
+ RestoreTableHelper helper = new RestoreTableHelper(RestoreTableHelper.LOCK_TABLE, isMultiDb, backupInfo);
+
+ helper.setContentFile(new File(restorePath, backupInfo.getLockTableNames().get(i)
+ + FullBackupJob.CONTENT_FILE_SUFFIX));
+ helper.setContentLenFile(new File(restorePath, backupInfo.getLockTableNames().get(i)
+ + FullBackupJob.CONTENT_LEN_FILE_SUFFIX));
+ helper.setTableName(existedLockTablesNames.get(i));
+
+ if (PrivilegedFileHelper.exists(helper.contentFile))
+ {
+ restoreTable(jdbcConn, helper);
+ }
+ else
+ {
+ throw new IOException("File " + PrivilegedFileHelper.getCanonicalPath(helper.contentFile)
+ + " not found");
+ }
+ }
+ }
+ else if (backupInfo.getLockTableNames().size() != 0)
+ {
+ throw new RepositoryException("There are no lock tables for new workspace configuration [" + workspaceName
+ + "] but backup lock data exist");
+ }
+
+ // restore value storage and index
+ restoreValueStorage();
+ restoreIndex();
+ }
+ catch (RepositoryConfigurationException e)
+ {
+ throw new RepositoryException(e);
+ }
+ catch (NamingException e)
+ {
+ throw new RepositoryException(e);
+ }
+ catch (IOException e)
+ {
+ throw new RepositoryException(e);
+ }
+ 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)
+ {
+ errorTrace += next.getMessage() + "; ";
+ next = next.getNextException();
+ }
+
+ Throwable cause = e.getCause();
+ String msg = "SQL Exception: " + errorTrace + (cause != null ? " (Cause: " + cause.getMessage() + ")" : "");
+
+ throw new RepositoryException(msg, e);
+ }
+ finally
+ {
+ if (st != null)
+ {
+ try
+ {
+ st.close();
+ }
+ catch (SQLException e)
+ {
+ throw new RepositoryException(e);
+ }
+ }
+
+ if (jdbcConn != null)
+ {
+ try
+ {
+ if (transactionIsolation != null)
+ {
+ jdbcConn.setTransactionIsolation(transactionIsolation);
+ }
+
+ jdbcConn.close();
+ }
+ catch (SQLException e)
+ {
+ throw new RepositoryException(e);
+ }
+ }
+ }
+ }
+
+ /**
+ * Restore index from backup.
+ */
+ protected void restoreIndex() throws RepositoryConfigurationException, IOException
+ {
+ File indexDir = new File(restorePath, FullBackupJob.INDEX_DIR);
+ File systemIndexDir = new File(restorePath, FullBackupJob.SYSTEM_INDEX_DIR);
+
+ if (workspaceEntry.getQueryHandler() != null)
+ {
+ if (!PrivilegedFileHelper.exists(indexDir))
+ {
+ throw new RepositoryConfigurationException("Can't restore index. Directory " + indexDir.getName()
+ + " doesn't exists");
+ }
+ else
+ {
+ File destDir =
+ new File(workspaceEntry.getQueryHandler().getParameterValue(QueryHandlerParams.PARAM_INDEX_DIR));
+ copyDirectory(indexDir, destDir);
+ }
+
+ // try to restore system index
+ if (repositoryEntry.getSystemWorkspaceName().equals(workspaceName))
+ {
+ if (!PrivilegedFileHelper.exists(systemIndexDir))
+ {
+ throw new RepositoryConfigurationException("Can't restore system index. Directory "
+ + systemIndexDir.getName() + " doesn't exists");
+ }
+ else
+ {
+ File destDir =
+ new File(workspaceEntry.getQueryHandler().getParameterValue(QueryHandlerParams.PARAM_INDEX_DIR) + "_"
+ + SystemSearchManager.INDEX_DIR_SUFFIX);
+ copyDirectory(systemIndexDir, destDir);
+ }
+ }
+ else if (PrivilegedFileHelper.exists(systemIndexDir))
+ {
+ throw new RepositoryConfigurationException("Workspace [" + workspaceName
+ + "] is not a system in repository configuration but system index backup files exist");
+ }
+ }
+ else
+ {
+ if (PrivilegedFileHelper.exists(indexDir) || PrivilegedFileHelper.exists(systemIndexDir))
+ {
+ throw new RepositoryConfigurationException("Query handler didn't configure in workspace [" + workspaceName
+ + "] configuration but index backup files exist");
+ }
+ }
+ }
+
+ /**
+ * Rollback changes due to errors.
+ */
+ protected void rollback(Connection jdbcConn)
+ {
+ // TODO
+ }
+
+ /**
+ * Restoring value storage from backup.
+ */
+ protected void restoreValueStorage() throws RepositoryConfigurationException, IOException
+ {
+ File backupValueStorageDir = new File(restorePath, FullBackupJob.VALUE_STORAGE_DIR);
+ if (workspaceEntry.getContainer().getValueStorages() != null)
+ {
+ List<ValueStorageEntry> valueStorages = workspaceEntry.getContainer().getValueStorages();
+ String[] valueStoragesFiles = PrivilegedFileHelper.list(backupValueStorageDir);
+
+ if ((valueStoragesFiles == null && valueStorages.size() != 0)
+ || (valueStoragesFiles != null && valueStoragesFiles.length != valueStorages.size()))
+ {
+ throw new RepositoryConfigurationException("Workspace configuration [" + workspaceName
+ + "] has a different amount of value storages than exist in backup");
+ }
+
+ for (ValueStorageEntry valueStorage : valueStorages)
+ {
+ File srcDir = new File(backupValueStorageDir, valueStorage.getId());
+ if (!PrivilegedFileHelper.exists(srcDir))
+ {
+ throw new RepositoryConfigurationException("Can't restore value storage. Directory " + srcDir.getName()
+ + " doesn't exists");
+ }
+ else
+ {
+ File destDir = new File(valueStorage.getParameterValue(FileValueStorage.PATH));
+
+ copyDirectory(srcDir, destDir);
+ }
+ }
+ }
+ else
+ {
+ if (PrivilegedFileHelper.exists(backupValueStorageDir))
+ {
+ throw new RepositoryConfigurationException("Value storage didn't configure in workspace [" + workspaceName
+ + "] configuration but value storage backup files exist");
+ }
+ }
+ }
+
+ /**
+ * Copy directory.
+ *
+ * @param srcPath
+ * source path
+ * @param dstPath
+ * destination path
+ * @throws IOException
+ * if any exception occurred
+ */
+ private void copyDirectory(File srcPath, File dstPath) throws IOException
+ {
+ if (PrivilegedFileHelper.isDirectory(srcPath))
+ {
+ if (!PrivilegedFileHelper.exists(dstPath))
+ {
+ PrivilegedFileHelper.mkdirs(dstPath);
+ }
+
+ String files[] = PrivilegedFileHelper.list(srcPath);
+ for (int i = 0; i < files.length; i++)
+ {
+ copyDirectory(new File(srcPath, files[i]), new File(dstPath, files[i]));
+ }
+ }
+ else
+ {
+ InputStream in = null;
+ OutputStream out = null;
+
+ try
+ {
+ in = PrivilegedFileHelper.fileInputStream(srcPath);
+ out = PrivilegedFileHelper.fileOutputStream(dstPath);
+
+ // Transfer bytes from in to out
+ byte[] buf = new byte[2048];
+
+ int len;
+
+ while ((len = in.read(buf)) > 0)
+ {
+ out.write(buf, 0, len);
+ }
+ }
+ finally
+ {
+ if (in != null)
+ {
+ in.close();
+ }
+
+ if (out != null)
+ {
+ out.close();
+ }
+ }
+ }
+ }
+
+ /**
+ * Restore table.
+ */
+ protected void restoreTable(Connection jdbcConn, RestoreTableHelper helper)
+ throws IOException, SQLException
+ {
+ String insertNodeQuery = null;
+
+ ObjectReader contentReader = null;
+ ObjectReader contentLenReader = null;
+
+ PreparedStatement insertNode = null;
+ ResultSet tableMetaData = null;
+
+ int dialect = DialectDetecter.detect(jdbcConn.getMetaData()).hashCode();
+
+ try
+ {
+ contentReader = new ObjectReaderImpl(PrivilegedFileHelper.fileInputStream(helper.contentFile));
+ contentLenReader = new ObjectReaderImpl(PrivilegedFileHelper.fileInputStream(helper.contentLenFile));
+
+ // get information about backup table
+ int sourceColumnCount = contentReader.readInt();
+
+ List<Integer> columnType = new ArrayList<Integer>();
+ List<String> columnName = new ArrayList<String>();
+
+ for (int i = 0; i < sourceColumnCount; i++)
+ {
+ columnType.add(contentReader.readInt());
+ columnName.add(contentReader.readString());
+ }
+
+ // collect information about target table
+ List<Integer> newColumnType = new ArrayList<Integer>();
+ List<String> newColumnName = new ArrayList<String>();
+
+ tableMetaData = jdbcConn.getMetaData().getColumns(null, null, helper.tableName, "%");
+ while (tableMetaData.next())
+ {
+ newColumnName.add(tableMetaData.getString("COLUMN_NAME"));
+ newColumnType.add(tableMetaData.getInt("DATA_TYPE"));
+ }
+
+ // construct query
+ int targetColumnCount = sourceColumnCount;
+ if (helper.getSkipColumnIndex() != null)
+ {
+ targetColumnCount--;
+ }
+ else if (helper.getNewColumnIndex() != null)
+ {
+ targetColumnCount++;
+ columnType.add(helper.getNewColumnIndex(), newColumnType.get((helper.getNewColumnIndex())));
+ }
+
+ for (int i = 0; i < targetColumnCount; i++)
+ {
+ if (i == 0)
+ {
+ insertNodeQuery = "INSERT INTO " + helper.getTableName() + " VALUES(?";
+ }
+ else
+ {
+ insertNodeQuery += ",?";
+ }
+
+ if (i == targetColumnCount - 1)
+ {
+ insertNodeQuery += ")";
+ }
+ }
+ insertNode = jdbcConn.prepareStatement(insertNodeQuery);
+
+ // set data
+ outer : while (true)
+ {
+ for (int i = 0, targetIndex = 0; i < columnType.size(); i++, targetIndex++)
+ {
+ InputStream stream;
+ long len;
+
+ if (helper.getNewColumnIndex() != null && helper.getNewColumnIndex() == i)
+ {
+ stream = new ByteArrayInputStream(workspaceName.getBytes(Constants.DEFAULT_ENCODING));
+ len = ((ByteArrayInputStream)stream).available();
+ }
+ else
+ {
+ try
+ {
+ len = readCompressedContentLen(contentLenReader);
+ }
+ catch (EOFException e)
+ {
+ if (i == 0)
+ {
+ // content length file is empty check content file
+ try
+ {
+ contentReader.readByte();
+ }
+ catch (EOFException e1)
+ {
+ break outer;
+ }
+ }
+
+ throw new IOException("Content length file is empty but content still present", e);
+ }
+ stream = spoolInputStream(contentReader, len);
+ }
+
+ if (helper.getSkipColumnIndex() != null && helper.getSkipColumnIndex() == i)
+ {
+ targetIndex--;
+ continue;
+ }
+ else if (helper.getConvertColumnIndexes().contains(i))
+ {
+ ByteArrayInputStream ba = (ByteArrayInputStream)stream;
+ byte[] readBuffer = new byte[ba.available()];
+ ba.read(readBuffer);
+
+ String currentValue = new String(readBuffer, Constants.DEFAULT_ENCODING);
+ if (currentValue.equals(Constants.ROOT_PARENT_UUID))
+ {
+ stream = new ByteArrayInputStream(Constants.ROOT_PARENT_UUID.getBytes());
+ }
+ else
+ {
+ if (!helper.isMultiDb && helper.isBackupMutliDb())
+ {
+ StringBuilder builder = new StringBuilder();
+ builder.append(workspaceName);
+ builder.append(currentValue);
+
+ stream = new ByteArrayInputStream(builder.toString().getBytes());
+ }
+ else
+ {
+ stream =
+ new ByteArrayInputStream(new String(readBuffer, Constants.DEFAULT_ENCODING).substring(
+ helper.getBackupWorkspaceName().length()).getBytes());
+ }
+ }
+
+ len = ((ByteArrayInputStream)stream).available();
+ }
+
+ // set
+ if (len != FullBackupJob.NULL_LEN)
+ {
+ if (columnType.get(i) == Types.INTEGER || columnType.get(i) == Types.BIGINT
+ || columnType.get(i) == Types.SMALLINT || columnType.get(i) == Types.TINYINT)
+ {
+ ByteArrayInputStream ba = (ByteArrayInputStream)stream;
+ byte[] readBuffer = new byte[ba.available()];
+ ba.read(readBuffer);
+
+ String value = new String(readBuffer, Constants.DEFAULT_ENCODING);
+ insertNode.setLong(targetIndex + 1, Integer.parseInt(value));
+ }
+ else if (columnType.get(i) == Types.BIT)
+ {
+ ByteArrayInputStream ba = (ByteArrayInputStream)stream;
+ byte[] readBuffer = new byte[ba.available()];
+ ba.read(readBuffer);
+
+ String value = new String(readBuffer);
+ insertNode.setBoolean(targetIndex + 1, value.equals("t"));
+ }
+ else if (columnType.get(i) == Types.BOOLEAN)
+ {
+ ByteArrayInputStream ba = (ByteArrayInputStream)stream;
+ byte[] readBuffer = new byte[ba.available()];
+ ba.read(readBuffer);
+
+ String value = new String(readBuffer);
+ insertNode.setBoolean(targetIndex + 1, value.equals("true"));
+ }
+ else
+ {
+ if (dialect == FullBackupJob.DB_DIALECT_HSQLDB)
+ {
+ if (columnType.get(i) == Types.VARBINARY)
+ {
+ insertNode.setBinaryStream(targetIndex + 1, stream, (int)len);
+ }
+ else
+ {
+ byte[] readBuffer = new byte[(int)len];
+ stream.read(readBuffer);
+
+ insertNode.setString(targetIndex + 1, new String(readBuffer, Constants.DEFAULT_ENCODING));
+ }
+ }
+ else
+ {
+ insertNode.setBinaryStream(targetIndex + 1, stream, (int)len);
+ }
+ }
+ }
+ else
+ {
+ insertNode.setNull(targetIndex + 1, columnType.get(i));
+ }
+ }
+ insertNode.addBatch();
+ }
+
+ insertNode.executeBatch();
+ jdbcConn.commit();
+ }
+ finally
+ {
+ if (contentReader != null)
+ {
+ contentReader.close();
+ }
+
+ if (contentLenReader != null)
+ {
+ contentLenReader.close();
+ }
+
+ if (insertNode != null)
+ {
+ insertNode.close();
+ }
+
+ // delete all temporary files
+ for (File file : spoolFileList)
+ {
+ if (!PrivilegedFileHelper.delete(file))
+ {
+ fileCleaner.addFile(file);
+ }
+ }
+
+ if (tableMetaData != null)
+ {
+ tableMetaData.close();
+ }
+ }
+ }
+
+ /**
+ * Write content length in output.
+ */
+ private long readCompressedContentLen(ObjectReader in) throws IOException
+ {
+ byte lenType = in.readByte();
+
+ if (lenType == FullBackupJob.NULL_LEN)
+ {
+ return lenType;
+ }
+ else if (lenType == FullBackupJob.BYTE_LEN)
+ {
+ return in.readByte();
+ }
+ else if (lenType == FullBackupJob.INT_LEN)
+ {
+ return in.readInt();
+ }
+ else
+ {
+ throw new RuntimeException("Does not support to restore value more than 2G.");
+ }
+ }
+
+ /**
+ * Spool input stream.
+ */
+ private InputStream spoolInputStream(ObjectReader in, long contentLen) throws IOException
+ {
+ byte[] buffer = new byte[0];
+ byte[] tmpBuff;
+ long readLen = 0;
+ File sf = null;
+ OutputStream sfout = null;
+
+ try
+ {
+ while (true)
+ {
+ int needToRead = contentLen - readLen > 2048 ? 2048 : (int)(contentLen - readLen);
+ tmpBuff = new byte[needToRead];
+
+ if (needToRead == 0)
+ {
+ break;
+ }
+
+ in.readFully(tmpBuff);
+
+ if (sfout != null)
+ {
+ sfout.write(tmpBuff);
+ }
+ else if (readLen + needToRead > maxBufferSize)
+ {
+ sf = PrivilegedFileHelper.createTempFile("jcrvd", null, tempDir);
+ sfout = PrivilegedFileHelper.fileOutputStream(sf);
+
+ sfout.write(buffer);
+ sfout.write(tmpBuff);
+ buffer = null;
+ }
+ else
+ {
+ // reallocate new buffer and spool old buffer contents
+ byte[] newBuffer = new byte[(int)(readLen + needToRead)];
+ System.arraycopy(buffer, 0, newBuffer, 0, (int)readLen);
+ System.arraycopy(tmpBuff, 0, newBuffer, (int)readLen, needToRead);
+ buffer = newBuffer;
+ }
+
+ readLen += needToRead;
+ }
+
+ if (buffer != null)
+ {
+ return new ByteArrayInputStream(buffer);
+ }
+ else
+ {
+ return PrivilegedFileHelper.fileInputStream(sf);
+ }
+ }
+ finally
+ {
+ if (sfout != null)
+ {
+ sfout.close();
+ }
+
+ if (sf != null)
+ {
+ spoolFileList.add(sf);
+ }
+ }
+ }
+
+ /**
+ * Class which helps to restore data.
+ */
+ protected class RestoreTableHelper
+ {
+ public static final int ITEM_TABLE = 0;
+
+ public static final int VALUE_TABLE = 1;
+
+ public static final int REF_TABLE = 2;
+
+ public static final int LOCK_TABLE = 3;
+
+ private String tableName;
+
+ private File contentFile;
+
+ private File contentLenFile;
+
+ private Integer skipColumnIndex = null;
+
+ private Integer newColumnIndex = null;
+
+ private Set<Integer> convertColumnIndex = new HashSet<Integer>();
+
+ private final boolean isMultiDb;
+
+ private final RDBMSBackupInfoReader backupInfo;
+
+ public RestoreTableHelper(int tableType, boolean isMultiDb, RDBMSBackupInfoReader backupInfo)
+ throws IOException
+ {
+ this.backupInfo = backupInfo;
+ this.isMultiDb = isMultiDb;
+
+ if (tableType == ITEM_TABLE)
+ {
+ contentFile = new File(restorePath, backupInfo.getItemTableName() + FullBackupJob.CONTENT_FILE_SUFFIX);
+ contentLenFile =
+ new File(restorePath, backupInfo.getItemTableName() + FullBackupJob.CONTENT_LEN_FILE_SUFFIX);
+
+ tableName = "JCR_" + (isMultiDb ? "M" : "S") + "ITEM";
+
+ if (isMultiDb)
+ {
+ tableName = "JCR_MITEM";
+ if (!backupInfo.isMultiDb())
+ {
+ // CONTAINER_NAME column index
+ skipColumnIndex = 4;
+
+ // ID and PARENT_ID column indexes
+ convertColumnIndex.add(0);
+ convertColumnIndex.add(1);
+ }
+ }
+ else
+ {
+ tableName = "JCR_SITEM";
+ if (backupInfo.isMultiDb())
+ {
+ // CONTAINER_NAME column index
+ newColumnIndex = 4;
+
+ // ID and PARENT_ID column indexes
+ convertColumnIndex.add(0);
+ convertColumnIndex.add(1);
+ }
+ }
+
+ }
+ else if (tableType == VALUE_TABLE)
+ {
+ contentFile = new File(restorePath, backupInfo.getValueTableName() + FullBackupJob.CONTENT_FILE_SUFFIX);
+ contentLenFile =
+ new File(restorePath, backupInfo.getValueTableName() + FullBackupJob.CONTENT_LEN_FILE_SUFFIX);
+
+ tableName = "JCR_" + (isMultiDb ? "M" : "S") + "VALUE";
+
+ if (isMultiDb != backupInfo.isMultiDb())
+ {
+ // PROPERTY_ID column index
+ convertColumnIndex.add(3);
+ }
+ }
+ else if (tableType == REF_TABLE)
+ {
+ contentFile = new File(restorePath, backupInfo.getRefTableName() + FullBackupJob.CONTENT_FILE_SUFFIX);
+ contentLenFile =
+ new File(restorePath, backupInfo.getRefTableName() + FullBackupJob.CONTENT_LEN_FILE_SUFFIX);
+
+ tableName = "JCR_" + (isMultiDb ? "M" : "S") + "REF";
+
+ if (isMultiDb != backupInfo.isMultiDb())
+ {
+ // NODE_ID and PROPERTY_ID column indexes
+ convertColumnIndex.add(0);
+ convertColumnIndex.add(1);
+ }
+ }
+ }
+
+ /**
+ * Returns the table name for restore.
+ *
+ * @return table name
+ */
+ public String getTableName()
+ {
+ return tableName;
+ }
+
+ /**
+ * Returns the content file for restore.
+ *
+ * @return file
+ */
+ public File getContentFile()
+ {
+ return contentFile;
+ }
+
+ /**
+ * Returns the content length file for restore.
+ *
+ * @return file
+ */
+ public File getContentLenFile()
+ {
+ return contentLenFile;
+ }
+
+ /**
+ * Set table name for restore.
+ */
+ public void setTableName(String tableName)
+ {
+ this.tableName = tableName;
+ }
+
+ /**
+ * Set content file for restore.
+ */
+ public void setContentFile(File file)
+ {
+ this.contentFile = file;
+ }
+
+ /**
+ * Set content length file for restore.
+ */
+ public void setContentLenFile(File file)
+ {
+ this.contentLenFile = file;
+ }
+
+ /**
+ * Returns index of column which should be skipped during restore.
+ *
+ * @return Integer
+ */
+ public Integer getSkipColumnIndex()
+ {
+ return skipColumnIndex;
+ }
+
+ /**
+ * Returns index of column which should be added during restore.
+ *
+ * @return Integer
+ */
+ public Integer getNewColumnIndex()
+ {
+ return newColumnIndex;
+ }
+
+ /**
+ * Returns indexes of columns which should be converted during restore.
+ *
+ * @return Integer
+ */
+ public Set<Integer> getConvertColumnIndexes()
+ {
+ return convertColumnIndex;
+ }
+
+ /**
+ * Returns the target workspace name for restore.
+ *
+ * @return workspace name
+ */
+ public boolean isMultiDb()
+ {
+ return isMultiDb;
+ }
+
+ /**
+ * Returns the original workspace name where backup was performed.
+ *
+ * @return workspace name
+ */
+ public String getBackupWorkspaceName()
+ {
+ return backupInfo.getWorkspaceName();
+ }
+
+ /**
+ * Returns the original value of multi-db parameter of workspace from which backup was performed.
+ *
+ * @return multi-db parameter
+ */
+ public boolean isBackupMutliDb()
+ {
+ return backupInfo.isMultiDb();
+ }
+ }
+}
Modified: jcr/trunk/exo.jcr.component.ext/src/test/java/org/exoplatform/services/jcr/ext/backup/TestRdbmsFullBackupJob.java
===================================================================
--- jcr/trunk/exo.jcr.component.ext/src/test/java/org/exoplatform/services/jcr/ext/backup/TestRdbmsFullBackupJob.java 2010-12-14 11:59:31 UTC (rev 3665)
+++ jcr/trunk/exo.jcr.component.ext/src/test/java/org/exoplatform/services/jcr/ext/backup/TestRdbmsFullBackupJob.java 2010-12-15 10:23:42 UTC (rev 3666)
@@ -18,13 +18,12 @@
*/
package org.exoplatform.services.jcr.ext.backup;
+import org.exoplatform.services.jcr.ext.backup.impl.rdbms.FullBackupJob;
+
import java.io.File;
import java.net.URL;
import java.util.Calendar;
-import org.exoplatform.services.jcr.ext.backup.impl.rdbms.FullBackupJob;
-import org.exoplatform.services.jcr.impl.core.RdbmsWorkspaceInitializer;
-
/**
* @author <a href="mailto:anatoliy.bazko@gmail.com">Anatoliy Bazko</a>
* @version $Id: TestFullBackupJob.java 34360 2009-07-22 23:58:59Z tolusha $
@@ -49,27 +48,27 @@
URL url = job.getStorageURL();
assertNotNull(url);
- File valuesDir = new File(url.getFile(), RdbmsWorkspaceInitializer.VALUE_STORAGE_DIR);
+ File valuesDir = new File(url.getFile(), FullBackupJob.VALUE_STORAGE_DIR);
assertTrue(valuesDir.exists());
String values[] = valuesDir.list();
assertEquals(values.length, 1);
assertTrue(new File(valuesDir, values[0]).isDirectory());
- File indexesDir = new File(url.getFile(), RdbmsWorkspaceInitializer.INDEX_DIR);
+ File indexesDir = new File(url.getFile(), FullBackupJob.INDEX_DIR);
assertTrue(indexesDir.exists());
- indexesDir = new File(url.getFile(), RdbmsWorkspaceInitializer.SYSTEM_INDEX_DIR);
+ indexesDir = new File(url.getFile(), FullBackupJob.SYSTEM_INDEX_DIR);
assertTrue(indexesDir.exists());
- assertTrue(new File(url.getFile(), "JCR_MITEM" + RdbmsWorkspaceInitializer.CONTENT_FILE_SUFFIX).exists());
- assertTrue(new File(url.getFile(), "JCR_MITEM" + RdbmsWorkspaceInitializer.CONTENT_LEN_FILE_SUFFIX).exists());
+ assertTrue(new File(url.getFile(), "JCR_MITEM" + FullBackupJob.CONTENT_FILE_SUFFIX).exists());
+ assertTrue(new File(url.getFile(), "JCR_MITEM" + FullBackupJob.CONTENT_LEN_FILE_SUFFIX).exists());
- assertTrue(new File(url.getFile(), "JCR_MVALUE" + RdbmsWorkspaceInitializer.CONTENT_FILE_SUFFIX).exists());
- assertTrue(new File(url.getFile(), "JCR_MVALUE" + RdbmsWorkspaceInitializer.CONTENT_LEN_FILE_SUFFIX).exists());
+ assertTrue(new File(url.getFile(), "JCR_MVALUE" + FullBackupJob.CONTENT_FILE_SUFFIX).exists());
+ assertTrue(new File(url.getFile(), "JCR_MVALUE" + FullBackupJob.CONTENT_LEN_FILE_SUFFIX).exists());
- assertTrue(new File(url.getFile(), "JCR_MREF" + RdbmsWorkspaceInitializer.CONTENT_FILE_SUFFIX).exists());
- assertTrue(new File(url.getFile(), "JCR_MREF" + RdbmsWorkspaceInitializer.CONTENT_LEN_FILE_SUFFIX).exists());
+ assertTrue(new File(url.getFile(), "JCR_MREF" + FullBackupJob.CONTENT_FILE_SUFFIX).exists());
+ assertTrue(new File(url.getFile(), "JCR_MREF" + FullBackupJob.CONTENT_LEN_FILE_SUFFIX).exists());
}
@@ -89,23 +88,23 @@
URL url = job.getStorageURL();
assertNotNull(url);
- File valuesDir = new File(url.getFile(), RdbmsWorkspaceInitializer.VALUE_STORAGE_DIR);
+ File valuesDir = new File(url.getFile(), FullBackupJob.VALUE_STORAGE_DIR);
assertFalse(valuesDir.exists());
- File indexesDir = new File(url.getFile(), RdbmsWorkspaceInitializer.INDEX_DIR);
+ File indexesDir = new File(url.getFile(), FullBackupJob.INDEX_DIR);
assertTrue(indexesDir.exists());
- indexesDir = new File(url.getFile(), RdbmsWorkspaceInitializer.SYSTEM_INDEX_DIR);
+ indexesDir = new File(url.getFile(), FullBackupJob.SYSTEM_INDEX_DIR);
assertFalse(indexesDir.exists());
- assertTrue(new File(url.getFile(), "JCR_MITEM" + RdbmsWorkspaceInitializer.CONTENT_FILE_SUFFIX).exists());
- assertTrue(new File(url.getFile(), "JCR_MITEM" + RdbmsWorkspaceInitializer.CONTENT_LEN_FILE_SUFFIX).exists());
+ assertTrue(new File(url.getFile(), "JCR_MITEM" + FullBackupJob.CONTENT_FILE_SUFFIX).exists());
+ assertTrue(new File(url.getFile(), "JCR_MITEM" + FullBackupJob.CONTENT_LEN_FILE_SUFFIX).exists());
- assertTrue(new File(url.getFile(), "JCR_MVALUE" +RdbmsWorkspaceInitializer.CONTENT_FILE_SUFFIX).exists());
- assertTrue(new File(url.getFile(), "JCR_MVALUE" + RdbmsWorkspaceInitializer.CONTENT_LEN_FILE_SUFFIX).exists());
+ assertTrue(new File(url.getFile(), "JCR_MVALUE" + FullBackupJob.CONTENT_FILE_SUFFIX).exists());
+ assertTrue(new File(url.getFile(), "JCR_MVALUE" + FullBackupJob.CONTENT_LEN_FILE_SUFFIX).exists());
- assertTrue(new File(url.getFile(), "JCR_MREF" + RdbmsWorkspaceInitializer.CONTENT_FILE_SUFFIX).exists());
- assertTrue(new File(url.getFile(), "JCR_MREF" + RdbmsWorkspaceInitializer.CONTENT_LEN_FILE_SUFFIX).exists());
+ assertTrue(new File(url.getFile(), "JCR_MREF" + FullBackupJob.CONTENT_FILE_SUFFIX).exists());
+ assertTrue(new File(url.getFile(), "JCR_MREF" + FullBackupJob.CONTENT_LEN_FILE_SUFFIX).exists());
}
}
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-14 11:59:31 UTC (rev 3665)
+++ jcr/trunk/exo.jcr.component.ext/src/test/java/org/exoplatform/services/jcr/ext/backup/TestRdbmsWorkspaceInitializer.java 2010-12-15 10:23:42 UTC (rev 3666)
@@ -22,9 +22,9 @@
import org.exoplatform.services.jcr.config.WorkspaceEntry;
import org.exoplatform.services.jcr.config.WorkspaceInitializerEntry;
import org.exoplatform.services.jcr.ext.backup.impl.rdbms.FullBackupJob;
-import org.exoplatform.services.jcr.impl.core.RdbmsWorkspaceInitializer;
-import org.exoplatform.services.jcr.impl.core.RdbmsWorkspaceInitializerWrapper;
+import org.exoplatform.services.jcr.ext.backup.impl.rdbms.RdbmsWorkspaceInitializer;
import org.exoplatform.services.jcr.impl.core.SysViewWorkspaceInitializer;
+import org.exoplatform.services.jcr.impl.core.TesterRdbmsWorkspaceInitializer;
import org.exoplatform.services.jcr.impl.core.query.SystemSearchManager;
import org.exoplatform.services.jcr.impl.core.value.ValueFactoryImpl;
import org.exoplatform.services.jcr.util.IdGenerator;
@@ -88,8 +88,8 @@
newEntry.setInitializer(wiEntry);
- RdbmsWorkspaceInitializerWrapper initializer =
- new RdbmsWorkspaceInitializerWrapper(newEntry,
+ TesterRdbmsWorkspaceInitializer initializer =
+ new TesterRdbmsWorkspaceInitializer(newEntry,
repositoryService.getRepository("db1").getConfiguration(), cacheableDataManager, null, null, null,
(ValueFactoryImpl)valueFactory, null);
@@ -143,8 +143,8 @@
newEntry.setInitializer(wiEntry);
- RdbmsWorkspaceInitializerWrapper initializer =
- new RdbmsWorkspaceInitializerWrapper(newEntry,
+ TesterRdbmsWorkspaceInitializer initializer =
+ new TesterRdbmsWorkspaceInitializer(newEntry,
repositoryService.getRepository("db1").getConfiguration(), cacheableDataManager, null, null, null,
(ValueFactoryImpl)valueFactory, null);
@@ -158,7 +158,7 @@
}
}
- public void testRDBMSInitializerRestoreTables() throws Exception
+ public void testRDBMSInitializerRestoreTablesMultiDB() throws Exception
{
FullBackupJob job = new FullBackupJob();
BackupConfig config = new BackupConfig();
@@ -186,9 +186,18 @@
Connection conn = ds.getConnection();
Statement st = conn.createStatement();
- st.execute("CREATE TABLE JCR_MITEM(ID VARCHAR(96) NOT NULL,PARENT_ID VARCHAR(96) NOT NULL,NAME VARCHAR(512) NOT NULL,VERSION INTEGER NOT NULL,I_CLASS INTEGER NOT NULL,I_INDEX INTEGER NOT NULL,N_ORDER_NUM INTEGER,P_TYPE INTEGER,P_MULTIVALUED INTEGER,CONSTRAINT JCR_PK_MITEM PRIMARY KEY(ID))");
+ st.execute("CREATE TABLE JCR_MITEM(ID VARCHAR(96) NOT NULL,PARENT_ID VARCHAR(96) NOT NULL,NAME VARCHAR(512) NOT NULL,VERSION INTEGER NOT NULL,I_CLASS INTEGER NOT NULL,I_INDEX INTEGER NOT NULL,N_ORDER_NUM INTEGER,P_TYPE INTEGER,P_MULTIVALUED BOOLEAN,CONSTRAINT JCR_PK_MITEM PRIMARY KEY(ID))");
conn.commit();
+ st.execute("INSERT INTO JCR_MITEM VALUES(' ',' ','__root_parent',0,0,0,0,NULL,NULL)");
+ conn.commit();
+
+ st.execute("CREATE TABLE JCR_MVALUE(ID BIGINT generated by default as identity (START WITH 2, INCREMENT BY 1) NOT NULL, DATA VARBINARY(65535),ORDER_NUM INTEGER NOT NULL,PROPERTY_ID VARCHAR(96) NOT NULL,STORAGE_DESC VARCHAR(512),CONSTRAINT JCR_PK_MVALUE PRIMARY KEY(ID),CONSTRAINT JCR_FK_MVALUE_PROPERTY FOREIGN KEY(PROPERTY_ID) REFERENCES JCR_MITEM(ID))");
+ conn.commit();
+
+ st.execute("CREATE TABLE JCR_MREF(NODE_ID VARCHAR(96) NOT NULL, PROPERTY_ID VARCHAR(96) NOT NULL, ORDER_NUM INTEGER NOT NULL, CONSTRAINT JCR_PK_MREF PRIMARY KEY(NODE_ID, PROPERTY_ID, ORDER_NUM))");
+ conn.commit();
+
// set the initializer
WorkspaceEntry newEntry =
helper.getNewWs("ws1", true, dsName, newValueStoragePath, newIndexPath, workspaceEntry.getContainer(),
@@ -205,14 +214,182 @@
newEntry.setInitializer(wiEntry);
- RdbmsWorkspaceInitializerWrapper initializer =
- new RdbmsWorkspaceInitializerWrapper(newEntry,
+ TesterRdbmsWorkspaceInitializer initializer =
+ new TesterRdbmsWorkspaceInitializer(newEntry,
repositoryService.getRepository("db1").getConfiguration(), cacheableDataManager, null, null, null,
(ValueFactoryImpl)valueFactory, null);
- initializer.restoreTables(conn, "JCR_MITEM");
+ // restore multi -> multi
+ initializer.restoreTables(conn, 0, true, workspaceEntry.getLockManager(), url.getFile());
+ initializer.restoreTables(conn, 1, true, workspaceEntry.getLockManager(), url.getFile());
+ initializer.restoreTables(conn, 2, true, workspaceEntry.getLockManager(), url.getFile());
+
+ st.execute("ALTER TABLE JCR_MITEM ADD CONSTRAINT JCR_FK_MITEM_PARENT FOREIGN KEY(PARENT_ID) REFERENCES JCR_MITEM(ID)");
+ conn.commit();
+
+ dsName = helper.getNewDataSource("");
+ ds = (DataSource)new InitialContext().lookup(dsName);
+
+ conn = ds.getConnection();
+ st = conn.createStatement();
+ st.execute("CREATE TABLE JCR_SITEM(ID VARCHAR(96) NOT NULL,PARENT_ID VARCHAR(96) NOT NULL,NAME VARCHAR(512) NOT NULL,VERSION INTEGER NOT NULL,CONTAINER_NAME VARCHAR(96) NOT NULL,I_CLASS INTEGER NOT NULL,I_INDEX INTEGER NOT NULL,N_ORDER_NUM INTEGER,P_TYPE INTEGER,P_MULTIVALUED BOOLEAN,CONSTRAINT JCR_PK_SITEM PRIMARY KEY(ID))");
+ conn.commit();
+
+ st.execute("INSERT INTO JCR_SITEM VALUES(' ',' ','__root_parent',0,'__root_parent_container',0,0,0,NULL,NULL)");
+ conn.commit();
+
+ st.execute("CREATE TABLE JCR_SVALUE(ID BIGINT generated by default as identity (START WITH 2, INCREMENT BY 1) NOT NULL, DATA VARBINARY(65535),ORDER_NUM INTEGER NOT NULL,PROPERTY_ID VARCHAR(96) NOT NULL,STORAGE_DESC VARCHAR(512),CONSTRAINT JCR_PK_MVALUE PRIMARY KEY(ID),CONSTRAINT JCR_FK_SVALUE_PROPERTY FOREIGN KEY(PROPERTY_ID) REFERENCES JCR_SITEM(ID))");
+ conn.commit();
+
+ st.execute("CREATE TABLE JCR_SREF(NODE_ID VARCHAR(96) NOT NULL, PROPERTY_ID VARCHAR(96) NOT NULL, ORDER_NUM INTEGER NOT NULL, CONSTRAINT JCR_PK_SREF PRIMARY KEY(NODE_ID, PROPERTY_ID, ORDER_NUM))");
+ conn.commit();
+
+ // set the initializer
+ newEntry =
+ helper.getNewWs("ws1", true, dsName, newValueStoragePath, newIndexPath, workspaceEntry.getContainer(),
+ workspaceEntry.getContainer().getValueStorages());
+
+ wiEntry = new WorkspaceInitializerEntry();
+ wiEntry.setType(RdbmsWorkspaceInitializer.class.getCanonicalName());
+
+ wieParams = new ArrayList<SimpleParameterEntry>();
+ wieParams.add(new SimpleParameterEntry(SysViewWorkspaceInitializer.RESTORE_PATH_PARAMETER, new File(url
+ .getFile()).getParent()));
+
+ wiEntry.setParameters(wieParams);
+
+ newEntry.setInitializer(wiEntry);
+
+ initializer =
+ new TesterRdbmsWorkspaceInitializer(newEntry, repositoryService.getRepository("db1").getConfiguration(),
+ cacheableDataManager, null, null, null, (ValueFactoryImpl)valueFactory, null);
+
+ // restore multi -> single
+ initializer.restoreTables(conn, 0, false, workspaceEntry.getLockManager(), url.getFile());
+ initializer.restoreTables(conn, 1, false, workspaceEntry.getLockManager(), url.getFile());
+ initializer.restoreTables(conn, 2, false, workspaceEntry.getLockManager(), url.getFile());
+
+ st.execute("ALTER TABLE JCR_SITEM ADD CONSTRAINT JCR_FK_SITEM_PARENT FOREIGN KEY(PARENT_ID) REFERENCES JCR_SITEM(ID)");
+ conn.commit();
+
}
}
}
+ public void testRDBMSInitializerRestoreTablesSingleDB() throws Exception
+ {
+ FullBackupJob job = new FullBackupJob();
+ BackupConfig config = new BackupConfig();
+ config.setRepository("db3");
+ config.setWorkspace("ws");
+ config.setBackupDir(new File("target/backup/testJob"));
+
+ Calendar calendar = Calendar.getInstance();
+
+ job.init(repositoryService.getRepository("db3"), "ws", config, calendar);
+ job.run();
+
+ URL url = job.getStorageURL();
+
+ for (WorkspaceEntry workspaceEntry : repositoryService.getRepository("db3").getConfiguration()
+ .getWorkspaceEntries())
+ {
+ if (workspaceEntry.getName().equals("ws"))
+ {
+ String newValueStoragePath = "target/temp/values/" + IdGenerator.generate();
+ String newIndexPath = "target/temp/index/" + IdGenerator.generate();
+
+ String dsName = helper.getNewDataSource("");
+ DataSource ds = (DataSource)new InitialContext().lookup(dsName);
+
+ Connection conn = ds.getConnection();
+ Statement st = conn.createStatement();
+ st.execute("CREATE TABLE JCR_MITEM(ID VARCHAR(96) NOT NULL,PARENT_ID VARCHAR(96) NOT NULL,NAME VARCHAR(512) NOT NULL,VERSION INTEGER NOT NULL,I_CLASS INTEGER NOT NULL,I_INDEX INTEGER NOT NULL,N_ORDER_NUM INTEGER,P_TYPE INTEGER,P_MULTIVALUED BOOLEAN,CONSTRAINT JCR_PK_MITEM PRIMARY KEY(ID))");
+ conn.commit();
+
+ st.execute("INSERT INTO JCR_MITEM VALUES(' ',' ','__root_parent',0,0,0,0,NULL,NULL)");
+ conn.commit();
+
+ st.execute("CREATE TABLE JCR_MVALUE(ID BIGINT generated by default as identity (START WITH 2, INCREMENT BY 1) NOT NULL, DATA VARBINARY(65535),ORDER_NUM INTEGER NOT NULL,PROPERTY_ID VARCHAR(96) NOT NULL,STORAGE_DESC VARCHAR(512),CONSTRAINT JCR_PK_MVALUE PRIMARY KEY(ID),CONSTRAINT JCR_FK_MVALUE_PROPERTY FOREIGN KEY(PROPERTY_ID) REFERENCES JCR_MITEM(ID))");
+ conn.commit();
+
+ st.execute("CREATE TABLE JCR_MREF(NODE_ID VARCHAR(96) NOT NULL, PROPERTY_ID VARCHAR(96) NOT NULL, ORDER_NUM INTEGER NOT NULL, CONSTRAINT JCR_PK_MREF PRIMARY KEY(NODE_ID, PROPERTY_ID, ORDER_NUM))");
+ conn.commit();
+
+ // set the initializer
+ WorkspaceEntry newEntry =
+ helper.getNewWs("ws", true, dsName, newValueStoragePath, newIndexPath, workspaceEntry.getContainer(),
+ workspaceEntry.getContainer().getValueStorages());
+
+ WorkspaceInitializerEntry wiEntry = new WorkspaceInitializerEntry();
+ wiEntry.setType(RdbmsWorkspaceInitializer.class.getCanonicalName());
+
+ List<SimpleParameterEntry> wieParams = new ArrayList<SimpleParameterEntry>();
+ wieParams.add(new SimpleParameterEntry(SysViewWorkspaceInitializer.RESTORE_PATH_PARAMETER, new File(url
+ .getFile()).getParent()));
+
+ wiEntry.setParameters(wieParams);
+
+ newEntry.setInitializer(wiEntry);
+
+ TesterRdbmsWorkspaceInitializer initializer =
+ new TesterRdbmsWorkspaceInitializer(newEntry, repositoryService.getRepository("db3").getConfiguration(),
+ cacheableDataManager, null, null, null, (ValueFactoryImpl)valueFactory, null);
+
+ // restore single -> multi
+ initializer.restoreTables(conn, 0, true, workspaceEntry.getLockManager(), url.getFile());
+ initializer.restoreTables(conn, 1, true, workspaceEntry.getLockManager(), url.getFile());
+ initializer.restoreTables(conn, 2, true, workspaceEntry.getLockManager(), url.getFile());
+
+ st.execute("ALTER TABLE JCR_MITEM ADD CONSTRAINT JCR_FK_MITEM_PARENT FOREIGN KEY(PARENT_ID) REFERENCES JCR_MITEM(ID)");
+ conn.commit();
+
+ dsName = helper.getNewDataSource("");
+ ds = (DataSource)new InitialContext().lookup(dsName);
+
+ conn = ds.getConnection();
+ st = conn.createStatement();
+ st.execute("CREATE TABLE JCR_SITEM(ID VARCHAR(96) NOT NULL,PARENT_ID VARCHAR(96) NOT NULL,NAME VARCHAR(512) NOT NULL,VERSION INTEGER NOT NULL,CONTAINER_NAME VARCHAR(96) NOT NULL,I_CLASS INTEGER NOT NULL,I_INDEX INTEGER NOT NULL,N_ORDER_NUM INTEGER,P_TYPE INTEGER,P_MULTIVALUED BOOLEAN,CONSTRAINT JCR_PK_SITEM PRIMARY KEY(ID))");
+ conn.commit();
+
+ st.execute("INSERT INTO JCR_SITEM VALUES(' ',' ','__root_parent',0,'__root_parent_container',0,0,0,NULL,NULL)");
+ conn.commit();
+
+ st.execute("CREATE TABLE JCR_SVALUE(ID BIGINT generated by default as identity (START WITH 2, INCREMENT BY 1) NOT NULL, DATA VARBINARY(65535),ORDER_NUM INTEGER NOT NULL,PROPERTY_ID VARCHAR(96) NOT NULL,STORAGE_DESC VARCHAR(512),CONSTRAINT JCR_PK_MVALUE PRIMARY KEY(ID),CONSTRAINT JCR_FK_SVALUE_PROPERTY FOREIGN KEY(PROPERTY_ID) REFERENCES JCR_SITEM(ID))");
+ conn.commit();
+
+ st.execute("CREATE TABLE JCR_SREF(NODE_ID VARCHAR(96) NOT NULL, PROPERTY_ID VARCHAR(96) NOT NULL, ORDER_NUM INTEGER NOT NULL, CONSTRAINT JCR_PK_SREF PRIMARY KEY(NODE_ID, PROPERTY_ID, ORDER_NUM))");
+ conn.commit();
+
+ // set the initializer
+ newEntry =
+ helper.getNewWs("ws", true, dsName, newValueStoragePath, newIndexPath, workspaceEntry.getContainer(),
+ workspaceEntry.getContainer().getValueStorages());
+
+ wiEntry = new WorkspaceInitializerEntry();
+ wiEntry.setType(RdbmsWorkspaceInitializer.class.getCanonicalName());
+
+ wieParams = new ArrayList<SimpleParameterEntry>();
+ wieParams.add(new SimpleParameterEntry(SysViewWorkspaceInitializer.RESTORE_PATH_PARAMETER, new File(url
+ .getFile()).getParent()));
+
+ wiEntry.setParameters(wieParams);
+
+ newEntry.setInitializer(wiEntry);
+
+ initializer =
+ new TesterRdbmsWorkspaceInitializer(newEntry, repositoryService.getRepository("db3").getConfiguration(),
+ cacheableDataManager, null, null, null, (ValueFactoryImpl)valueFactory, null);
+
+ // restore single -> single
+ initializer.restoreTables(conn, 0, false, workspaceEntry.getLockManager(), url.getFile());
+ initializer.restoreTables(conn, 1, false, workspaceEntry.getLockManager(), url.getFile());
+ initializer.restoreTables(conn, 2, false, workspaceEntry.getLockManager(), url.getFile());
+
+ st.execute("ALTER TABLE JCR_SITEM ADD CONSTRAINT JCR_FK_SITEM_PARENT FOREIGN KEY(PARENT_ID) REFERENCES JCR_SITEM(ID)");
+ conn.commit();
+
+ }
+ }
+ }
}
Deleted: jcr/trunk/exo.jcr.component.ext/src/test/java/org/exoplatform/services/jcr/impl/core/RdbmsWorkspaceInitializerWrapper.java
===================================================================
--- jcr/trunk/exo.jcr.component.ext/src/test/java/org/exoplatform/services/jcr/impl/core/RdbmsWorkspaceInitializerWrapper.java 2010-12-14 11:59:31 UTC (rev 3665)
+++ jcr/trunk/exo.jcr.component.ext/src/test/java/org/exoplatform/services/jcr/impl/core/RdbmsWorkspaceInitializerWrapper.java 2010-12-15 10:23:42 UTC (rev 3666)
@@ -1,74 +0,0 @@
-/*
- * Copyright (C) 2009 eXo Platform SAS.
- *
- * This is free software; you can redistribute it and/or modify it
- * under the terms of the GNU Lesser General Public License as
- * published by the Free Software Foundation; either version 2.1 of
- * the License, or (at your option) any later version.
- *
- * This software is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this software; if not, write to the Free
- * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
- * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
- */
-package org.exoplatform.services.jcr.impl.core;
-
-import org.exoplatform.services.jcr.access.AccessManager;
-import org.exoplatform.services.jcr.config.RepositoryConfigurationException;
-import org.exoplatform.services.jcr.config.RepositoryEntry;
-import org.exoplatform.services.jcr.config.WorkspaceEntry;
-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 java.io.IOException;
-import java.sql.Connection;
-import java.sql.SQLException;
-
-import javax.jcr.PathNotFoundException;
-import javax.jcr.RepositoryException;
-
-/**
- * Created by The eXo Platform SAS
- *
- * 04.12.2006
- *
- * For testing purpose
- *
- * @author <a href="mailto:peter.nedonosko@exoplatform.com.ua">Peter Nedonosko</a>
- * @version $Id: SessionDataManagerTestWrapper.java 11907 2008-03-13 15:36:21Z ksm $
- */
-public class RdbmsWorkspaceInitializerWrapper extends RdbmsWorkspaceInitializer
-{
-
- public RdbmsWorkspaceInitializerWrapper(WorkspaceEntry config, RepositoryEntry repConfig,
- CacheableWorkspaceDataManager dataManager, NamespaceRegistryImpl namespaceRegistry,
- LocationFactory locationFactory, NodeTypeManagerImpl nodeTypeManager, ValueFactoryImpl valueFactory,
- AccessManager accessManager) throws RepositoryConfigurationException, PathNotFoundException, RepositoryException
- {
- super(config, repConfig, dataManager, namespaceRegistry, locationFactory, nodeTypeManager, valueFactory,
- accessManager);
- }
-
- public void restoreValueFiles() throws RepositoryConfigurationException, IOException
- {
- super.restoreValueStorage();
- }
-
- public void restoreIndexFiles() throws RepositoryConfigurationException, IOException
- {
- super.restoreIndex();
- }
-
- public void restoreTables(Connection jdbcConn, String tableName) throws RepositoryConfigurationException,
- IOException, SQLException
- {
- // super.restoreTable(jdbcConn, new RestoreTableHelper(RestoreTableHelper, arg1));
- }
-
-}
Copied: jcr/trunk/exo.jcr.component.ext/src/test/java/org/exoplatform/services/jcr/impl/core/TesterRdbmsWorkspaceInitializer.java (from rev 3658, jcr/trunk/exo.jcr.component.ext/src/test/java/org/exoplatform/services/jcr/impl/core/RdbmsWorkspaceInitializerWrapper.java)
===================================================================
--- jcr/trunk/exo.jcr.component.ext/src/test/java/org/exoplatform/services/jcr/impl/core/TesterRdbmsWorkspaceInitializer.java (rev 0)
+++ jcr/trunk/exo.jcr.component.ext/src/test/java/org/exoplatform/services/jcr/impl/core/TesterRdbmsWorkspaceInitializer.java 2010-12-15 10:23:42 UTC (rev 3666)
@@ -0,0 +1,80 @@
+/*
+ * Copyright (C) 2009 eXo Platform SAS.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.exoplatform.services.jcr.impl.core;
+
+import org.exoplatform.services.jcr.access.AccessManager;
+import org.exoplatform.services.jcr.config.LockManagerEntry;
+import org.exoplatform.services.jcr.config.RepositoryConfigurationException;
+import org.exoplatform.services.jcr.config.RepositoryEntry;
+import org.exoplatform.services.jcr.config.WorkspaceEntry;
+import org.exoplatform.services.jcr.ext.backup.impl.rdbms.RDBMSBackupInfoReader;
+import org.exoplatform.services.jcr.ext.backup.impl.rdbms.RdbmsWorkspaceInitializer;
+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 java.io.IOException;
+import java.sql.Connection;
+import java.sql.SQLException;
+
+import javax.jcr.PathNotFoundException;
+import javax.jcr.RepositoryException;
+
+/**
+ * Created by The eXo Platform SAS
+ *
+ * 04.12.2006
+ *
+ * For testing purpose
+ *
+ * @author <a href="mailto:peter.nedonosko@exoplatform.com.ua">Peter Nedonosko</a>
+ * @version $Id: SessionDataManagerTestWrapper.java 11907 2008-03-13 15:36:21Z ksm $
+ */
+public class TesterRdbmsWorkspaceInitializer extends RdbmsWorkspaceInitializer
+{
+
+ public TesterRdbmsWorkspaceInitializer(WorkspaceEntry config, RepositoryEntry repConfig,
+ CacheableWorkspaceDataManager dataManager, NamespaceRegistryImpl namespaceRegistry,
+ LocationFactory locationFactory, NodeTypeManagerImpl nodeTypeManager, ValueFactoryImpl valueFactory,
+ AccessManager accessManager) throws RepositoryConfigurationException, PathNotFoundException, RepositoryException
+ {
+ super(config, repConfig, dataManager, namespaceRegistry, locationFactory, nodeTypeManager, valueFactory,
+ accessManager);
+ }
+
+ public void restoreValueFiles() throws RepositoryConfigurationException, IOException
+ {
+ super.restoreValueStorage();
+ }
+
+ public void restoreIndexFiles() throws RepositoryConfigurationException, IOException
+ {
+ super.restoreIndex();
+ }
+
+ public void restoreTables(Connection jdbcConn, int tableType, boolean isMultiDB, LockManagerEntry lockManagerEntry,
+ String storageDir) throws RepositoryConfigurationException, IOException, SQLException
+ {
+ RDBMSBackupInfoReader backupInfo = new RDBMSBackupInfoReader(storageDir);
+ RestoreTableHelper helper = new RestoreTableHelper(tableType, isMultiDB, backupInfo);
+
+ super.restoreTable(jdbcConn, helper);
+ }
+
+}
13 years, 5 months
exo-jcr SVN: r3665 - in jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl: core and 1 other directories.
by do-not-reply@jboss.org
Author: tolusha
Date: 2010-12-14 06:59:31 -0500 (Tue, 14 Dec 2010)
New Revision: 3665
Removed:
jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/RdbmsBackupWorkspaceInitializer.java
jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/RdbmsWorkspaceInitializer.java
Modified:
jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/Constants.java
jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/storage/jdbc/init/StorageDBInitializer.java
Log:
EXOJCR-1078: Move RDBMSWorkspaceInitializer to ext
Modified: jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/Constants.java
===================================================================
--- jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/Constants.java 2010-12-14 11:58:43 UTC (rev 3664)
+++ jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/Constants.java 2010-12-14 11:59:31 UTC (rev 3665)
@@ -491,11 +491,21 @@
public static final String ROOT_URI = "[]:1";
/**
- * Workspace root node vurtual parent node UUID.
+ * Workspace root node virtual parent node UUID.
*/
public static final String ROOT_PARENT_UUID = " ".intern(); // empty
/**
+ * Workspace root node virtual parent node name.
+ */
+ public static final String ROOT_PARENT_NAME = "__root_parent";
+
+ /**
+ * Workspace root node virtual container name.
+ */
+ public static final String ROOT_PARENT_CONAINER_NAME = "__root_parent_container";
+
+ /**
* Workspace root node UUID.
*/
public static final String ROOT_UUID = "00exo0jcr0root0uuid0000000000000";
Deleted: jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/RdbmsBackupWorkspaceInitializer.java
===================================================================
--- jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/RdbmsBackupWorkspaceInitializer.java 2010-12-14 11:58:43 UTC (rev 3664)
+++ jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/RdbmsBackupWorkspaceInitializer.java 2010-12-14 11:59:31 UTC (rev 3665)
@@ -1,88 +0,0 @@
-/*
- * Copyright (C) 2003-2010 eXo Platform SAS.
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Affero General Public License
- * as published by the Free Software Foundation; either version 3
- * of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, see<http://www.gnu.org/licenses/>.
- */
-package org.exoplatform.services.jcr.impl.core;
-
-import org.exoplatform.services.jcr.access.AccessManager;
-import org.exoplatform.services.jcr.config.RepositoryConfigurationException;
-import org.exoplatform.services.jcr.config.RepositoryEntry;
-import org.exoplatform.services.jcr.config.WorkspaceEntry;
-import org.exoplatform.services.jcr.datamodel.NodeData;
-import org.exoplatform.services.jcr.impl.Constants;
-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.log.ExoLogger;
-import org.exoplatform.services.log.Log;
-
-import javax.jcr.PathNotFoundException;
-import javax.jcr.RepositoryException;
-
-/**
- * Created by The eXo Platform SAS.
- *
- * <br/>Date: 2010
- *
- * @author <a href="mailto:alex.reshetnyak@exoplatform.com.ua">Alex Reshetnyak</a>
- * @version $Id$
- */
-public class RdbmsBackupWorkspaceInitializer extends RdbmsWorkspaceInitializer
-{
- /**
- * Logger.
- */
- protected static final Log log = ExoLogger.getLogger("exo.jcr.component.core.RdbmsBackupWorkspaceInitializer");
-
- /**
- * Constructor RdbmsBackupWorkspaceInitializer.
- */
- public RdbmsBackupWorkspaceInitializer(WorkspaceEntry config, RepositoryEntry repConfig,
- CacheableWorkspaceDataManager dataManager, NamespaceRegistryImpl namespaceRegistry,
- LocationFactory locationFactory, NodeTypeManagerImpl nodeTypeManager, ValueFactoryImpl valueFactory,
- AccessManager accessManager) throws RepositoryConfigurationException, PathNotFoundException, RepositoryException
- {
- super(config, repConfig, dataManager, namespaceRegistry, locationFactory, nodeTypeManager, valueFactory,
- accessManager);
- }
-
- /**
- * {@inheritDoc}
- */
- @Override
- public NodeData initWorkspace() throws RepositoryException
- {
- if (isWorkspaceInitialized())
- {
- return (NodeData)dataManager.getItemData(Constants.ROOT_UUID);
- }
-
- long start = System.currentTimeMillis();
-
- // restore from full rdbms backup
- fullRdbmsRestore();
-
- // restore from incremental backup
- incrementalRead();
-
- final NodeData root = (NodeData)dataManager.getItemData(Constants.ROOT_UUID);
-
- log.info("Workspace [" + workspaceName + "] restored from storage " + restorePath + " in "
- + (System.currentTimeMillis() - start) * 1d / 1000 + "sec");
-
- return root;
- }
-
-}
Deleted: jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/RdbmsWorkspaceInitializer.java
===================================================================
--- jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/RdbmsWorkspaceInitializer.java 2010-12-14 11:58:43 UTC (rev 3664)
+++ jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/RdbmsWorkspaceInitializer.java 2010-12-14 11:59:31 UTC (rev 3665)
@@ -1,775 +0,0 @@
-/*
- * Copyright (C) 2009 eXo Platform SAS.
- *
- * This is free software; you can redistribute it and/or modify it
- * under the terms of the GNU Lesser General Public License as
- * published by the Free Software Foundation; either version 2.1 of
- * the License, or (at your option) any later version.
- *
- * This software is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this software; if not, write to the Free
- * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
- * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
- */
-package org.exoplatform.services.jcr.impl.core;
-
-import org.exoplatform.commons.utils.PrivilegedFileHelper;
-import org.exoplatform.commons.utils.SecurityHelper;
-import org.exoplatform.services.jcr.access.AccessManager;
-import org.exoplatform.services.jcr.config.QueryHandlerParams;
-import org.exoplatform.services.jcr.config.RepositoryConfigurationException;
-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.dataflow.serialization.ObjectReader;
-import org.exoplatform.services.jcr.datamodel.NodeData;
-import org.exoplatform.services.jcr.impl.Constants;
-import org.exoplatform.services.jcr.impl.core.nodetype.NodeTypeManagerImpl;
-import org.exoplatform.services.jcr.impl.core.query.SystemSearchManager;
-import org.exoplatform.services.jcr.impl.core.value.ValueFactoryImpl;
-import org.exoplatform.services.jcr.impl.dataflow.persistent.CacheableWorkspaceDataManager;
-import org.exoplatform.services.jcr.impl.dataflow.serialization.ObjectReaderImpl;
-import org.exoplatform.services.jcr.impl.storage.jdbc.DBConstants;
-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.log.ExoLogger;
-import org.exoplatform.services.log.Log;
-
-import java.io.ByteArrayInputStream;
-import java.io.EOFException;
-import java.io.File;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.OutputStream;
-import java.security.PrivilegedExceptionAction;
-import java.sql.Connection;
-import java.sql.PreparedStatement;
-import java.sql.SQLException;
-import java.sql.Statement;
-import java.sql.Types;
-import java.util.ArrayList;
-import java.util.List;
-
-import javax.jcr.PathNotFoundException;
-import javax.jcr.RepositoryException;
-import javax.naming.InitialContext;
-import javax.naming.NameNotFoundException;
-import javax.naming.NamingException;
-import javax.sql.DataSource;
-
-/**
- * @author <a href="mailto:anatoliy.bazko@gmail.com">Anatoliy Bazko</a>
- * @version $Id: RdbmsWorkspaceInitializer.java 34360 2009-07-22 23:58:59Z tolusha $
- */
-public class RdbmsWorkspaceInitializer
- extends BackupWorkspaceInitializer
-{
- /**
- * Logger.
- */
- protected static final Log log = ExoLogger.getLogger("exo.jcr.component.core.RdbmsWorkspaceInitializer");
-
- /**
- * Index directory in full backup storage.
- */
- public static final String INDEX_DIR = "index";
-
- /**
- * System index directory in full backup storage.
- */
- public static final String SYSTEM_INDEX_DIR = INDEX_DIR + "_" + SystemSearchManager.INDEX_DIR_SUFFIX;
-
- /**
- * Value storage directory in full backup storage.
- */
- public static final String VALUE_STORAGE_DIR = "values";
-
- /**
- * Suffix for content file.
- */
- public static final String CONTENT_FILE_SUFFIX = ".dump";
-
- /**
- * Suffix for content length file.
- */
- public static final String CONTENT_LEN_FILE_SUFFIX = ".len";
-
- /**
- * Content is absent.
- */
- public static final byte NULL_LEN = 0;
-
- /**
- * Content length value has byte type.
- */
- public static final byte BYTE_LEN = 1;
-
- /**
- * Content length value has integer type.
- */
- public static final byte INT_LEN = 2;
-
- /**
- * Content length value has long type.
- */
- public static final byte LONG_LEN = 3;
-
- /**
- * Generic dialect.
- */
- public static final int DB_DIALECT_GENERIC = DBConstants.DB_DIALECT_GENERIC.hashCode();
-
- /**
- * HSQLDB dialect.
- */
- public static final int DB_DIALECT_HSQLDB = DBConstants.DB_DIALECT_HSQLDB.hashCode();
- /**
- * List of temporary files.
- */
- protected List<File> spoolFileList = new ArrayList<File>();
-
- /**
- * Constructor RdbmsWorkspaceInitializer.
- */
- public RdbmsWorkspaceInitializer(WorkspaceEntry config, RepositoryEntry repConfig,
- CacheableWorkspaceDataManager dataManager, NamespaceRegistryImpl namespaceRegistry,
- LocationFactory locationFactory, NodeTypeManagerImpl nodeTypeManager, ValueFactoryImpl valueFactory,
- AccessManager accessManager) throws RepositoryConfigurationException, PathNotFoundException, RepositoryException
- {
- super(config, repConfig, dataManager, namespaceRegistry, locationFactory, nodeTypeManager, valueFactory,
- accessManager);
- }
-
- /**
- * {@inheritDoc}
- */
- @Override
- public NodeData initWorkspace() throws RepositoryException
- {
- if (isWorkspaceInitialized())
- {
- return (NodeData)dataManager.getItemData(Constants.ROOT_UUID);
- }
-
- long start = System.currentTimeMillis();
-
- fullRdbmsRestore();
-
- final NodeData root = (NodeData)dataManager.getItemData(Constants.ROOT_UUID);
-
- log.info("Workspace [" + workspaceName + "] restored from storage " + restorePath + " in "
- + (System.currentTimeMillis() - start) * 1d / 1000 + "sec");
-
- return root;
- }
-
- /**
- * Restore from full backup.
- */
- protected void fullRdbmsRestore() throws RepositoryException
- {
- Connection jdbcConn = null;
- Integer transactionIsolation = null;
- Statement st = null;
- try
- {
- String dsName = workspaceEntry.getContainer().getParameterValue(JDBCWorkspaceDataContainer.SOURCE_NAME);
- if (dsName == null)
- {
- throw new RepositoryConfigurationException("Data source name not found in workspace configuration "
- + workspaceName);
- }
-
- String multiDb = workspaceEntry.getContainer().getParameterValue(JDBCWorkspaceDataContainer.MULTIDB);
- if (multiDb == null)
- {
- throw new RepositoryConfigurationException(JDBCWorkspaceDataContainer.MULTIDB
- + " parameter not found in workspace " + workspaceName + " configuration");
- }
-
- final DataSource ds = (DataSource)new InitialContext().lookup(dsName);
- if (ds == null)
- {
- throw new NameNotFoundException("Data source " + dsName + " not found");
- }
-
- jdbcConn = SecurityHelper.doPriviledgedSQLExceptionAction(new PrivilegedExceptionAction<Connection>()
- {
- public Connection run() throws Exception
- {
- return ds.getConnection();
-
- }
- });
-
- String dbDialect = DialectDetecter.detect(jdbcConn.getMetaData());
-
- transactionIsolation = jdbcConn.getTransactionIsolation();
- jdbcConn.setTransactionIsolation(Connection.TRANSACTION_SERIALIZABLE);
-
- jdbcConn.setAutoCommit(false);
-
- // restore JCR data
- String[] tables;
- if (Boolean.parseBoolean(multiDb))
- {
- tables = new String[]{"JCR_MITEM", "JCR_MVALUE", "JCR_MREF"};
- }
- else
- {
- tables = new String[]{"JCR_SITEM", "JCR_SVALUE", "JCR_SREF"};
- }
-
- // resolve constraint name depends on database
- String constraintName;
- if (dbDialect.equals(DBConstants.DB_DIALECT_DB2) || dbDialect.equals(DBConstants.DB_DIALECT_DB2V8))
- {
- constraintName = "JCR_FK_" + (Boolean.parseBoolean(multiDb) ? "M" : "S") + "ITEM_PAREN";
- }
- else
- {
- constraintName = "JCR_FK_" + (Boolean.parseBoolean(multiDb) ? "M" : "S") + "ITEM_PARENT";
- }
- String constraint =
- "CONSTRAINT " + constraintName + " FOREIGN KEY(PARENT_ID) REFERENCES " + tables[0] + "(ID)";
-
- for (String table : tables)
- {
- if (table.equals("JCR_MITEM") || table.equals("JCR_SITEM"))
- {
- st = jdbcConn.createStatement();
- st.execute("ALTER TABLE " + table + " DROP CONSTRAINT " + constraintName);
- jdbcConn.commit();
-
- restoreTable(jdbcConn, table);
-
- st = jdbcConn.createStatement();
- st.execute("ALTER TABLE " + table + " ADD " + constraint);
- jdbcConn.commit();
- }
- else
- {
- restoreTable(jdbcConn, table);
- }
- }
-
- // restore LOCK data
- tables =
- new String[]{"JCR_LOCK_" + workspaceName.toUpperCase(), "JCR_LOCK_" + workspaceName.toUpperCase() + "_D"};
-
- for (String table : tables)
- {
- if (PrivilegedFileHelper.exists(new File(restorePath, table + CONTENT_FILE_SUFFIX)))
- {
- restoreTable(jdbcConn, table);
- }
- }
-
- restoreValueStorage();
- restoreIndex();
- }
- catch (RepositoryConfigurationException e)
- {
- throw new RepositoryException(e);
- }
- catch (NamingException e)
- {
- throw new RepositoryException(e);
- }
- catch (IOException e)
- {
- throw new RepositoryException(e);
- }
- 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)
- {
- errorTrace += next.getMessage() + "; ";
- next = next.getNextException();
- }
-
- Throwable cause = e.getCause();
- String msg = "SQL Exception: " + errorTrace + (cause != null ? " (Cause: " + cause.getMessage() + ")" : "");
-
- throw new RepositoryException(msg, e);
- }
- finally
- {
- if (st != null)
- {
- try
- {
- st.close();
- }
- catch (SQLException e)
- {
- throw new RepositoryException(e);
- }
- }
-
- if (jdbcConn != null)
- {
- try
- {
- if (transactionIsolation != null)
- {
- jdbcConn.setTransactionIsolation(transactionIsolation);
- }
-
- jdbcConn.close();
- }
- catch (SQLException e)
- {
- throw new RepositoryException(e);
- }
- }
- }
- }
-
- /**
- * Restore index from backup.
- */
- protected void restoreIndex() throws RepositoryConfigurationException, IOException
- {
- File indexDir = new File(restorePath, INDEX_DIR);
- File systemIndexDir = new File(restorePath, SYSTEM_INDEX_DIR);
-
- if (workspaceEntry.getQueryHandler() != null)
- {
- if (!PrivilegedFileHelper.exists(indexDir))
- {
- throw new RepositoryConfigurationException("Can't restore index. Directory " + indexDir.getName()
- + " doesn't exists");
- }
- else
- {
- File destDir =
- new File(workspaceEntry.getQueryHandler().getParameterValue(QueryHandlerParams.PARAM_INDEX_DIR));
- copyDirectory(indexDir, destDir);
- }
-
- // try to restore system index
- if (repositoryEntry.getSystemWorkspaceName().equals(workspaceName))
- {
- if (!PrivilegedFileHelper.exists(systemIndexDir))
- {
- throw new RepositoryConfigurationException("Can't restore system index. Directory "
- + systemIndexDir.getName() + " doesn't exists");
- }
- else
- {
- File destDir =
- new File(workspaceEntry.getQueryHandler().getParameterValue(QueryHandlerParams.PARAM_INDEX_DIR) + "_"
- + SystemSearchManager.INDEX_DIR_SUFFIX);
- copyDirectory(systemIndexDir, destDir);
- }
- }
- else if (PrivilegedFileHelper.exists(systemIndexDir))
- {
- throw new RepositoryConfigurationException("Workspace [" + workspaceName
- + "] is not a system in repository configuration but system index backup files exist");
- }
- }
- else
- {
- if (PrivilegedFileHelper.exists(indexDir) || PrivilegedFileHelper.exists(systemIndexDir))
- {
- throw new RepositoryConfigurationException("Query handler didn't configure in workspace [" + workspaceName
- + "] configuration but index backup files exist");
- }
- }
- }
-
- /**
- * Restoring value storage from backup.
- */
- protected void restoreValueStorage() throws RepositoryConfigurationException, IOException
- {
- File backupValueStorageDir = new File(restorePath, VALUE_STORAGE_DIR);
- if (workspaceEntry.getContainer().getValueStorages() != null)
- {
- List<ValueStorageEntry> valueStorages = workspaceEntry.getContainer().getValueStorages();
- String[] valueStoragesFiles = PrivilegedFileHelper.list(backupValueStorageDir);
-
- if ((valueStoragesFiles == null && valueStorages.size() != 0)
- || (valueStoragesFiles != null && valueStoragesFiles.length != valueStorages.size()))
- {
- throw new RepositoryConfigurationException("Workspace configuration [" + workspaceName
- + "] has a different amount of value storages than exist in backup");
- }
-
- for (ValueStorageEntry valueStorage : valueStorages)
- {
- File srcDir = new File(backupValueStorageDir, valueStorage.getId());
- if (!PrivilegedFileHelper.exists(srcDir))
- {
- throw new RepositoryConfigurationException("Can't restore value storage. Directory " + srcDir.getName()
- + " doesn't exists");
- }
- else
- {
- File destDir = new File(valueStorage.getParameterValue(FileValueStorage.PATH));
-
- copyDirectory(srcDir, destDir);
- }
- }
- }
- else
- {
- if (PrivilegedFileHelper.exists(backupValueStorageDir))
- {
- throw new RepositoryConfigurationException("Value storage didn't configure in workspace [" + workspaceName
- + "] configuration but value storage backup files exist");
- }
- }
- }
-
- /**
- * Copy directory.
- *
- * @param srcPath
- * source path
- * @param dstPath
- * destination path
- * @throws IOException
- * if any exception occurred
- */
- private void copyDirectory(File srcPath, File dstPath) throws IOException
- {
- if (PrivilegedFileHelper.isDirectory(srcPath))
- {
- if (!PrivilegedFileHelper.exists(dstPath))
- {
- PrivilegedFileHelper.mkdirs(dstPath);
- }
-
- String files[] = PrivilegedFileHelper.list(srcPath);
- for (int i = 0; i < files.length; i++)
- {
- copyDirectory(new File(srcPath, files[i]), new File(dstPath, files[i]));
- }
- }
- else
- {
- InputStream in = null;
- OutputStream out = null;
-
- try
- {
- in = PrivilegedFileHelper.fileInputStream(srcPath);
- out = PrivilegedFileHelper.fileOutputStream(dstPath);
-
- // Transfer bytes from in to out
- byte[] buf = new byte[2048];
-
- int len;
-
- while ((len = in.read(buf)) > 0)
- {
- out.write(buf, 0, len);
- }
- }
- finally
- {
- if (in != null)
- {
- in.close();
- }
-
- if (out != null)
- {
- out.close();
- }
- }
- }
- }
-
- /**
- * Restore table.
- */
- protected void restoreTable(Connection jdbcConn, String tableName) throws IOException, SQLException
- {
- String insertNodeQuery = null;
-
- ObjectReader contentReader = null;
- ObjectReader contentLenReader = null;
-
- PreparedStatement insertNode = null;
-
- int dialect = DialectDetecter.detect(jdbcConn.getMetaData()).hashCode();
-
- try
- {
- contentReader =
- new ObjectReaderImpl(PrivilegedFileHelper.fileInputStream(new File(restorePath, tableName
- + CONTENT_FILE_SUFFIX)));
-
- contentLenReader =
- new ObjectReaderImpl(PrivilegedFileHelper.fileInputStream(new File(restorePath, tableName
- + CONTENT_LEN_FILE_SUFFIX)));
-
- int columnCount = contentReader.readInt();
- int[] columnType = new int[columnCount];
-
- for (int i = 0; i < columnCount; i++)
- {
- columnType[i] = contentReader.readInt();
- }
-
- for (int i = 0; i < columnCount; i++)
- {
- if (i == 0)
- {
- insertNodeQuery = "INSERT INTO " + tableName + " VALUES(?";
- }
- else
- {
- insertNodeQuery += ",?";
- }
-
- if (i == columnCount - 1)
- {
- insertNodeQuery += ")";
- }
- }
-
- insertNode = jdbcConn.prepareStatement(insertNodeQuery);
- outer : while (true)
- {
- for (int i = 0; i < columnCount; i++)
- {
- long len;
- try
- {
- len = readCompressedContentLen(contentLenReader);
- }
- catch (EOFException e)
- {
- if (i == 0)
- {
- // content length file is empty check content file
- try
- {
- contentReader.readByte();
- }
- catch (EOFException e1)
- {
- break outer;
- }
- }
-
- throw new IOException("Content length file is empty but content still present", e);
- }
-
- if (len != NULL_LEN)
- {
- InputStream stream = spoolInputStream(contentReader, len);
-
- if (columnType[i] == Types.INTEGER || columnType[i] == Types.BIGINT
- || columnType[i] == Types.SMALLINT || columnType[i] == Types.TINYINT)
- {
- ByteArrayInputStream ba = (ByteArrayInputStream)stream;
- byte[] readBuffer = new byte[ba.available()];
- ba.read(readBuffer);
-
- String value = new String(readBuffer, Constants.DEFAULT_ENCODING);
- insertNode.setLong(i + 1, Integer.parseInt(value));
- }
- else if (columnType[i] == Types.BIT)
- {
- ByteArrayInputStream ba = (ByteArrayInputStream) stream;
- byte[] readBuffer = new byte[ba.available()];
- ba.read(readBuffer);
-
- String value = new String(readBuffer);
- insertNode.setBoolean(i + 1, value.equals("t"));
- }
- else if (columnType[i] == Types.BOOLEAN)
- {
- ByteArrayInputStream ba = (ByteArrayInputStream)stream;
- byte[] readBuffer = new byte[ba.available()];
- ba.read(readBuffer);
-
- String value = new String(readBuffer);
- insertNode.setBoolean(i + 1, value.equals("true"));
- }
- else
- {
- if (dialect == DB_DIALECT_HSQLDB)
- {
- if (columnType[i] == Types.VARBINARY)
- {
- insertNode.setBinaryStream(i + 1, stream, (int)len);
- }
- else
- {
- byte[] readBuffer = new byte[(int)len];
- stream.read(readBuffer);
-
- insertNode.setString(i + 1, new String(readBuffer, Constants.DEFAULT_ENCODING));
- }
- }
- else
- {
- insertNode.setBinaryStream(i + 1, stream, (int)len);
- }
- }
- }
- else
- {
- insertNode.setNull(i + 1, columnType[i]);
- }
- }
- insertNode.addBatch();
- }
-
- insertNode.executeBatch();
- jdbcConn.commit();
- }
- finally
- {
- if (contentReader != null)
- {
- contentReader.close();
- }
-
- if (contentLenReader != null)
- {
- contentLenReader.close();
- }
-
- if (insertNode != null)
- {
- insertNode.close();
- }
-
- // delete all temporary files
- for (File file : spoolFileList)
- {
- if (!PrivilegedFileHelper.delete(file))
- {
- fileCleaner.addFile(file);
- }
- }
- }
- }
-
- /**
- * Write content length in output.
- */
- private long readCompressedContentLen(ObjectReader in) throws IOException
- {
- byte lenType = in.readByte();
-
- if (lenType == NULL_LEN)
- {
- return lenType;
- }
- else if (lenType == BYTE_LEN)
- {
- return in.readByte();
- }
- else if (lenType == INT_LEN)
- {
- return in.readInt();
- }
- else
- {
- return in.readLong();
- }
- }
-
- /**
- * Spool input stream.
- */
- private InputStream spoolInputStream(ObjectReader in, long contentLen) throws IOException
- {
- byte[] buffer = new byte[0];
- byte[] tmpBuff;
- long readLen = 0;
- File sf = null;
- OutputStream sfout = null;
-
- try
- {
- while (true)
- {
- int needToRead = contentLen - readLen > 2048 ? 2048 : (int)(contentLen - readLen);
- tmpBuff = new byte[needToRead];
-
- if (needToRead == 0)
- {
- break;
- }
-
- in.readFully(tmpBuff);
-
- if (sfout != null)
- {
- sfout.write(tmpBuff);
- }
- else if (readLen + needToRead > maxBufferSize)
- {
- sf = PrivilegedFileHelper.createTempFile("jcrvd", null, tempDir);
- sfout = PrivilegedFileHelper.fileOutputStream(sf);
-
- sfout.write(buffer);
- sfout.write(tmpBuff);
- buffer = null;
- }
- else
- {
- // reallocate new buffer and spool old buffer contents
- byte[] newBuffer = new byte[(int)(readLen + needToRead)];
- System.arraycopy(buffer, 0, newBuffer, 0, (int)readLen);
- System.arraycopy(tmpBuff, 0, newBuffer, (int)readLen, needToRead);
- buffer = newBuffer;
- }
-
- readLen += needToRead;
- }
-
- if (buffer != null)
- {
- return new ByteArrayInputStream(buffer);
- }
- else
- {
- return PrivilegedFileHelper.fileInputStream(sf);
- }
- }
- finally
- {
- if (sfout != null)
- {
- sfout.close();
- }
-
- if (sf != null)
- {
- spoolFileList.add(sf);
- }
- }
- }
-
-}
Modified: jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/storage/jdbc/init/StorageDBInitializer.java
===================================================================
--- jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/storage/jdbc/init/StorageDBInitializer.java 2010-12-14 11:58:43 UTC (rev 3664)
+++ jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/storage/jdbc/init/StorageDBInitializer.java 2010-12-14 11:59:31 UTC (rev 3665)
@@ -37,7 +37,7 @@
{
protected final boolean multiDb;
-
+
public StorageDBInitializer(String containerName, Connection connection, String scriptPath, boolean multiDb)
throws IOException
{
@@ -48,6 +48,7 @@
/**
* Init root node parent record.
*/
+ @Override
protected void postInit(Connection connection) throws SQLException
{
final String MDB = (multiDb ? "M" : "S");
@@ -60,8 +61,8 @@
String insert =
"insert into JCR_" + MDB + "ITEM(ID, PARENT_ID, NAME, " + (multiDb ? "" : "CONTAINER_NAME, ")
+ "VERSION, I_CLASS, I_INDEX, N_ORDER_NUM)" + " VALUES('" + Constants.ROOT_PARENT_UUID + "', '"
- + Constants.ROOT_PARENT_UUID + "', '__root_parent', " + (multiDb ? "" : "'__root_parent_container', ")
- + "0, 0, 0, 0)";
+ + Constants.ROOT_PARENT_UUID + "', '" + Constants.ROOT_PARENT_NAME + "', "
+ + (multiDb ? "" : "'" + Constants.ROOT_PARENT_CONAINER_NAME + "', ") + "0, 0, 0, 0)";
connection.createStatement().executeUpdate(insert);
}
13 years, 5 months
exo-jcr SVN: r3664 - in jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl: core/lock/infinispan and 2 other directories.
by do-not-reply@jboss.org
Author: tolusha
Date: 2010-12-14 06:58:43 -0500 (Tue, 14 Dec 2010)
New Revision: 3664
Modified:
jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/lock/cacheable/AbstractCacheableLockManager.java
jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/lock/infinispan/ISPNCacheableLockManagerImpl.java
jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/lock/jbosscache/CacheableLockManagerImpl.java
jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/util/jdbc/cleaner/WorkspaceDBCleaner.java
Log:
EXOJCR-939: get LockTableName from workspace configuration
Modified: jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/lock/cacheable/AbstractCacheableLockManager.java
===================================================================
--- jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/lock/cacheable/AbstractCacheableLockManager.java 2010-12-14 09:15:53 UTC (rev 3663)
+++ jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/lock/cacheable/AbstractCacheableLockManager.java 2010-12-14 11:58:43 UTC (rev 3664)
@@ -41,6 +41,8 @@
import org.exoplatform.services.jcr.impl.core.lock.LockRemover;
import org.exoplatform.services.jcr.impl.core.lock.LockRemoverHolder;
import org.exoplatform.services.jcr.impl.core.lock.SessionLockManager;
+import org.exoplatform.services.jcr.impl.core.lock.infinispan.ISPNCacheableLockManagerImpl;
+import org.exoplatform.services.jcr.impl.core.lock.jbosscache.CacheableLockManagerImpl;
import org.exoplatform.services.jcr.impl.dataflow.TransientItemData;
import org.exoplatform.services.jcr.impl.dataflow.TransientPropertyData;
import org.exoplatform.services.jcr.impl.dataflow.persistent.WorkspacePersistentDataManager;
@@ -130,8 +132,6 @@
protected LockActionNonTxAware<List<LockData>, Object> getLockList;
- public static final String JDBC_TABLE_NAME_SUFFIX = "jdbc.table.name";
-
/**
* Constructor.
*
@@ -787,19 +787,36 @@
/**
* Return table name for lock data.
*/
- public static String getLockTableName(LockManagerEntry lockManagerEntry)
+ public static List<String> getLockTableNames(LockManagerEntry lockManagerEntry)
{
+ List<String> tableNames = new ArrayList<String>();
+
if (lockManagerEntry != null)
{
for (SimpleParameterEntry entry : lockManagerEntry.getParameters())
{
- if (entry.getName().contains(AbstractCacheableLockManager.JDBC_TABLE_NAME_SUFFIX))
+ if (entry.getName().equals(CacheableLockManagerImpl.JBOSSCACHE_JDBC_TABLE_NAME))
{
- return entry.getValue();
+ tableNames.add(entry.getValue());
+ tableNames.add(entry.getValue() + "_D");
+
+ return tableNames;
}
+ else if (entry.getName().equals(ISPNCacheableLockManagerImpl.INFINISPAN_JDBC_TABLE_NAME))
+ {
+ throw new RuntimeException("Not supported");
+ }
}
}
- return null;
+ return tableNames;
}
+
+ /**
+ * Return select data script.
+ */
+ public static String getSelectScript(String tableName)
+ {
+ return "select * from " + tableName;
+ }
}
Modified: jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/lock/infinispan/ISPNCacheableLockManagerImpl.java
===================================================================
--- jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/lock/infinispan/ISPNCacheableLockManagerImpl.java 2010-12-14 09:15:53 UTC (rev 3663)
+++ jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/lock/infinispan/ISPNCacheableLockManagerImpl.java 2010-12-14 11:58:43 UTC (rev 3664)
@@ -75,7 +75,7 @@
public static final String INFINISPAN_JDBC_CL_ID_COLUMN = "infinispan-cl-cache.jdbc.id.type";
- public static final String INFINISPAN_JDBC_TABLE_NAME = "infinispan-cl-cache." + JDBC_TABLE_NAME_SUFFIX;
+ public static final String INFINISPAN_JDBC_TABLE_NAME = "infinispan-cl-cache.jdbc.table.name";
public static final String INFINISPAN_JDBC_CL_AUTO = "auto";
Modified: jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/lock/jbosscache/CacheableLockManagerImpl.java
===================================================================
--- jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/lock/jbosscache/CacheableLockManagerImpl.java 2010-12-14 09:15:53 UTC (rev 3663)
+++ jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/lock/jbosscache/CacheableLockManagerImpl.java 2010-12-14 11:58:43 UTC (rev 3664)
@@ -82,7 +82,7 @@
public static final String JBOSSCACHE_JDBC_CL_FQN_COLUMN = "jbosscache-cl-cache.jdbc.fqn.type";
- public static final String JBOSSCACHE_JDBC_TABLE_NAME = "jbosscache-cl-cache." + JDBC_TABLE_NAME_SUFFIX;
+ public static final String JBOSSCACHE_JDBC_TABLE_NAME = "jbosscache-cl-cache.jdbc.table.name";
/**
* Indicate whether the JBoss Cache instance used can be shared with other caches
Modified: jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/util/jdbc/cleaner/WorkspaceDBCleaner.java
===================================================================
--- jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/util/jdbc/cleaner/WorkspaceDBCleaner.java 2010-12-14 09:15:53 UTC (rev 3663)
+++ jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/util/jdbc/cleaner/WorkspaceDBCleaner.java 2010-12-14 11:58:43 UTC (rev 3664)
@@ -17,6 +17,7 @@
package org.exoplatform.services.jcr.impl.util.jdbc.cleaner;
import org.exoplatform.commons.utils.SecurityHelper;
+import org.exoplatform.services.jcr.config.LockManagerEntry;
import org.exoplatform.services.jcr.config.WorkspaceEntry;
import org.exoplatform.services.jcr.core.security.JCRRuntimePermissions;
import org.exoplatform.services.jcr.impl.core.lock.cacheable.AbstractCacheableLockManager;
@@ -81,11 +82,13 @@
this.connection = connection;
this.containerName = wsEntry.getName();
- String lockTableName = AbstractCacheableLockManager.getLockTableName(wsEntry.getLockManager());
- if (lockTableName != null)
+ LockManagerEntry lockEntry = wsEntry.getLockManager();
+ if (lockEntry != null)
{
- commonDBCleanScripts.add(lockTableName);
- commonDBCleanScripts.add(lockTableName + "_D");
+ for (String tableName : AbstractCacheableLockManager.getLockTableNames(lockEntry))
+ {
+ commonDBCleanScripts.add("drop table " + tableName);
+ }
}
}
13 years, 5 months
exo-jcr SVN: r3663 - jcr/trunk/exo.jcr.component.ext.
by do-not-reply@jboss.org
Author: tolusha
Date: 2010-12-14 04:15:53 -0500 (Tue, 14 Dec 2010)
New Revision: 3663
Modified:
jcr/trunk/exo.jcr.component.ext/pom.xml
Log:
EXOJCR-1078: temporary exclude backup tests
Modified: jcr/trunk/exo.jcr.component.ext/pom.xml
===================================================================
--- jcr/trunk/exo.jcr.component.ext/pom.xml 2010-12-13 13:47:39 UTC (rev 3662)
+++ jcr/trunk/exo.jcr.component.ext/pom.xml 2010-12-14 09:15:53 UTC (rev 3663)
@@ -185,12 +185,9 @@
<include>**/replication/*.java</include>
<include>**/replication/external/*.java</include>
<include>**/replication/async/**/*.java</include>
- <include>**/backup/*.java</include>
</includes>
<excludes>
- <exclude>**/backup/TestRDBMSBackupManager.java</exclude>
- <exclude>**/backup/TestBackupManager.java</exclude>
- <exclude>**/backup/TestRdbmsWorkspaceInitializer.java</exclude>
+ <exclude>**/backup/*.java</exclude>
<exclude>**/BaseStandaloneTest.java</exclude>
<exclude>**/backup/AbstractBackupTestCase.java</exclude>
<exclude>**/backup/BaseRDBMSBackupTest.java</exclude>
13 years, 5 months
exo-jcr SVN: r3662 - jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/lock/cacheable.
by do-not-reply@jboss.org
Author: tolusha
Date: 2010-12-13 08:47:39 -0500 (Mon, 13 Dec 2010)
New Revision: 3662
Modified:
jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/lock/cacheable/AbstractCacheableLockManager.java
Log:
EXOJCR-1078: correct dump lock tables, lock table name is taken from configuration
Modified: jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/lock/cacheable/AbstractCacheableLockManager.java
===================================================================
--- jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/lock/cacheable/AbstractCacheableLockManager.java 2010-12-13 10:22:49 UTC (rev 3661)
+++ jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/lock/cacheable/AbstractCacheableLockManager.java 2010-12-13 13:47:39 UTC (rev 3662)
@@ -789,11 +789,14 @@
*/
public static String getLockTableName(LockManagerEntry lockManagerEntry)
{
- for (SimpleParameterEntry entry : lockManagerEntry.getParameters())
+ if (lockManagerEntry != null)
{
- if (entry.getName().contains(AbstractCacheableLockManager.JDBC_TABLE_NAME_SUFFIX))
+ for (SimpleParameterEntry entry : lockManagerEntry.getParameters())
{
- return entry.getValue();
+ if (entry.getName().contains(AbstractCacheableLockManager.JDBC_TABLE_NAME_SUFFIX))
+ {
+ return entry.getValue();
+ }
}
}
13 years, 5 months
exo-jcr SVN: r3661 - jcr/trunk/exo.jcr.component.ext.
by do-not-reply@jboss.org
Author: areshetnyak
Date: 2010-12-13 05:22:49 -0500 (Mon, 13 Dec 2010)
New Revision: 3661
Modified:
jcr/trunk/exo.jcr.component.ext/pom.xml
Log:
EXOJCR-1078 : The test TestBackupManager was excluded.
Modified: jcr/trunk/exo.jcr.component.ext/pom.xml
===================================================================
--- jcr/trunk/exo.jcr.component.ext/pom.xml 2010-12-13 09:20:33 UTC (rev 3660)
+++ jcr/trunk/exo.jcr.component.ext/pom.xml 2010-12-13 10:22:49 UTC (rev 3661)
@@ -189,6 +189,7 @@
</includes>
<excludes>
<exclude>**/backup/TestRDBMSBackupManager.java</exclude>
+ <exclude>**/backup/TestBackupManager.java</exclude>
<exclude>**/backup/TestRdbmsWorkspaceInitializer.java</exclude>
<exclude>**/BaseStandaloneTest.java</exclude>
<exclude>**/backup/AbstractBackupTestCase.java</exclude>
13 years, 5 months