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 {