You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@jackrabbit.apache.org by re...@apache.org on 2020/05/04 13:25:14 UTC
svn commit: r1877354 - in /jackrabbit/trunk/jackrabbit-core/src:
main/java/org/apache/jackrabbit/core/persistence/PersistenceCopier.java
test/java/org/apache/jackrabbit/core/RepositoryCopierTest.java
Author: reschke
Date: Mon May 4 13:25:14 2020
New Revision: 1877354
URL: http://svn.apache.org/viewvc?rev=1877354&view=rev
Log:
JCR-4549: backup with RepositoryCopier.copy() fails on second method call (test and initial patch by Filipe Roque)
Modified:
jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/persistence/PersistenceCopier.java
jackrabbit/trunk/jackrabbit-core/src/test/java/org/apache/jackrabbit/core/RepositoryCopierTest.java
Modified: jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/persistence/PersistenceCopier.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/persistence/PersistenceCopier.java?rev=1877354&r1=1877353&r2=1877354&view=diff
==============================================================================
--- jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/persistence/PersistenceCopier.java (original)
+++ jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/persistence/PersistenceCopier.java Mon May 4 13:25:14 2020
@@ -150,17 +150,20 @@ public class PersistenceCopier {
targetState.setType(sourceState.getType());
targetState.setMultiValued(sourceState.isMultiValued());
InternalValue[] values = sourceState.getValues();
+
+ // special case copy of binary values
if (sourceState.getType() == PropertyType.BINARY) {
+ InternalValue[] convertedValues = new InternalValue[values.length];
for (int i = 0; i < values.length; i++) {
- InputStream stream = values[i].getStream();
- try {
- values[i] = InternalValue.create(stream, store);
- } finally {
- stream.close();
+ try (InputStream stream = values[i].getStream()) {
+ convertedValues[i] = InternalValue.create(stream, store);
}
}
+ targetState.setValues(convertedValues);
+ } else {
+ targetState.setValues(values);
}
- targetState.setValues(values);
+
if (target.exists(targetState.getPropertyId())) {
changes.modified(targetState);
} else {
Modified: jackrabbit/trunk/jackrabbit-core/src/test/java/org/apache/jackrabbit/core/RepositoryCopierTest.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-core/src/test/java/org/apache/jackrabbit/core/RepositoryCopierTest.java?rev=1877354&r1=1877353&r2=1877354&view=diff
==============================================================================
--- jackrabbit/trunk/jackrabbit-core/src/test/java/org/apache/jackrabbit/core/RepositoryCopierTest.java (original)
+++ jackrabbit/trunk/jackrabbit-core/src/test/java/org/apache/jackrabbit/core/RepositoryCopierTest.java Mon May 4 13:25:14 2020
@@ -18,6 +18,7 @@ package org.apache.jackrabbit.core;
import java.io.ByteArrayInputStream;
import java.io.File;
+import java.io.IOException;
import java.io.InputStream;
import java.math.BigDecimal;
import java.util.Calendar;
@@ -49,7 +50,8 @@ public class RepositoryCopierTest extend
private static final File SOURCE = new File(BASE, "source");
- private static final File TARGET = new File(BASE, "target");
+ private static final File TARGET1 = new File(BASE, "target1");
+ private static final File TARGET2 = new File(BASE, "target2");
private static final Calendar DATE = Calendar.getInstance();
@@ -61,7 +63,8 @@ public class RepositoryCopierTest extend
private String identifier;
- protected void setUp() {
+ protected void setUp() throws IOException {
+ FileUtils.deleteDirectory(BASE);
BASE.mkdirs();
}
@@ -70,80 +73,90 @@ public class RepositoryCopierTest extend
}
public void testRepositoryCopy() throws Exception {
- createSourceRepository();
- RepositoryCopier.copy(SOURCE, TARGET);
- verifyTargetRepository();
+ RepositoryImpl repository = createSourceRepository();
+ repository.shutdown();
+
+ RepositoryCopier.copy(SOURCE, TARGET1);
+ verifyTargetRepository(TARGET1);
}
- private void createSourceRepository() throws Exception {
- RepositoryImpl repository = RepositoryImpl.create(
- RepositoryConfig.install(SOURCE));
+ public void testRepositoryCopyWithDeleteTarget() throws Exception {
+ RepositoryImpl repository = createSourceRepository();
+
try {
- Session session = repository.login(CREDENTIALS);
+ RepositoryCopier.copy(repository, TARGET1);
+ verifyTargetRepository(TARGET1);
+
+ FileUtils.deleteDirectory(TARGET1);
+
+ RepositoryCopier.copy(repository, TARGET2);
+ verifyTargetRepository(TARGET2);
+ } finally {
+ repository.shutdown();
+ }
+ }
+
+ private RepositoryImpl createSourceRepository() throws Exception {
+ RepositoryImpl repository = RepositoryImpl.create(RepositoryConfig.install(SOURCE));
+
+ Session session = repository.login(CREDENTIALS);
+ try {
+ NamespaceRegistry registry = session.getWorkspace().getNamespaceRegistry();
+ registry.registerNamespace("test", "http://www.example.org/");
+
+ NodeTypeManager manager = session.getWorkspace().getNodeTypeManager();
+ NodeTypeTemplate template = manager.createNodeTypeTemplate();
+ template.setName("test:unstructured");
+ template.setDeclaredSuperTypeNames(new String[] { "nt:unstructured" });
+ manager.registerNodeType(template, false);
+
+ Node root = session.getRootNode();
+
+ Node referenceable = root.addNode("referenceable", "test:unstructured");
+ referenceable.addMixin(NodeType.MIX_REFERENCEABLE);
+ session.save();
+ identifier = referenceable.getIdentifier();
+
+ Node properties = root.addNode("properties", "test:unstructured");
+ properties.setProperty("boolean", true);
+ Binary binary = session.getValueFactory().createBinary(new ByteArrayInputStream(BINARY));
try {
- NamespaceRegistry registry =
- session.getWorkspace().getNamespaceRegistry();
- registry.registerNamespace("test", "http://www.example.org/");
-
- NodeTypeManager manager =
- session.getWorkspace().getNodeTypeManager();
- NodeTypeTemplate template = manager.createNodeTypeTemplate();
- template.setName("test:unstructured");
- template.setDeclaredSuperTypeNames(
- new String[] { "nt:unstructured" });
- manager.registerNodeType(template, false);
-
- Node root = session.getRootNode();
-
- Node referenceable =
- root.addNode("referenceable", "test:unstructured");
- referenceable.addMixin(NodeType.MIX_REFERENCEABLE);
- session.save();
- identifier = referenceable.getIdentifier();
-
- Node properties = root.addNode("properties", "test:unstructured");
- properties.setProperty("boolean", true);
- Binary binary = session.getValueFactory().createBinary(
- new ByteArrayInputStream(BINARY));
- try {
- properties.setProperty("binary", binary);
- } finally {
- binary.dispose();
- }
- properties.setProperty("date", DATE);
- properties.setProperty("decimal", new BigDecimal(123));
- properties.setProperty("double", Math.PI);
- properties.setProperty("long", 9876543210L);
- properties.setProperty("reference", referenceable);
- properties.setProperty("string", "test");
- properties.setProperty("multiple", "a,b,c".split(","));
- session.save();
+ properties.setProperty("binary", binary);
+ } finally {
+ binary.dispose();
+ }
+ properties.setProperty("date", DATE);
+ properties.setProperty("decimal", new BigDecimal(123));
+ properties.setProperty("double", Math.PI);
+ properties.setProperty("long", 9876543210L);
+ properties.setProperty("reference", referenceable);
+ properties.setProperty("string", "test");
+ properties.setProperty("multiple", "a,b,c".split(","));
+ session.save();
- binary = properties.getProperty("binary").getBinary();
+ binary = properties.getProperty("binary").getBinary();
+ try {
+ InputStream stream = binary.getStream();
try {
- InputStream stream = binary.getStream();
- try {
- for (int i = 0; i < BINARY.length; i++) {
- assertEquals(BINARY[i], (byte) stream.read());
- }
- assertEquals(-1, stream.read());
- } finally {
- stream.close();
+ for (int i = 0; i < BINARY.length; i++) {
+ assertEquals(BINARY[i], (byte) stream.read());
}
+ assertEquals(-1, stream.read());
} finally {
- binary.dispose();
+ stream.close();
}
} finally {
- session.logout();
+ binary.dispose();
}
} finally {
- repository.shutdown();
+ session.logout();
}
+ return repository;
}
- private void verifyTargetRepository() throws Exception {
+ private void verifyTargetRepository(File target) throws Exception {
RepositoryImpl repository = RepositoryImpl.create(
- RepositoryConfig.create(TARGET));
+ RepositoryConfig.create(target));
try {
Session session = repository.login(CREDENTIALS);
try {