You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@jackrabbit.apache.org by ju...@apache.org on 2009/08/04 16:08:09 UTC

svn commit: r800807 - in /jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core: RepositoryCopier.java persistence/PersistenceCopier.java value/InternalValue.java

Author: jukka
Date: Tue Aug  4 14:08:08 2009
New Revision: 800807

URL: http://svn.apache.org/viewvc?rev=800807&view=rev
Log:
JCR-442: Implement a backup tool

Support for binary values and the data store in RepositoryCopier.

Modified:
    jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/RepositoryCopier.java
    jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/persistence/PersistenceCopier.java
    jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/value/InternalValue.java

Modified: jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/RepositoryCopier.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/RepositoryCopier.java?rev=800807&r1=800806&r2=800807&view=diff
==============================================================================
--- jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/RepositoryCopier.java (original)
+++ jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/RepositoryCopier.java Tue Aug  4 14:08:08 2009
@@ -27,11 +27,11 @@
 
 import org.apache.commons.io.FileUtils;
 import org.apache.jackrabbit.core.config.RepositoryConfig;
+import org.apache.jackrabbit.core.data.DataStore;
 import org.apache.jackrabbit.core.nodetype.InvalidNodeTypeDefException;
 import org.apache.jackrabbit.core.nodetype.NodeTypeDef;
 import org.apache.jackrabbit.core.nodetype.NodeTypeRegistry;
 import org.apache.jackrabbit.core.persistence.PersistenceCopier;
-import org.apache.jackrabbit.core.state.ItemStateException;
 import org.apache.jackrabbit.core.version.InternalVersionManagerImpl;
 import org.apache.jackrabbit.spi.Name;
 import org.slf4j.Logger;
@@ -119,12 +119,11 @@
                         target.getNodeTypeRegistry());
                 copyVersionStore(
                         source.getVersionManagerImpl(),
-                        target.getVersionManagerImpl());
+                        target.getVersionManagerImpl(),
+                        target.getDataStore());
                 copyWorkspaces(source, target);
-            } catch (InvalidNodeTypeDefException e) {
-                throw new RepositoryException("Failed to copy node types", e);
-            } catch (ItemStateException e) {
-                throw new RepositoryException("Failed to copy item states", e);
+            } catch (Exception e) {
+                throw new RepositoryException("Failed to copy content", e);
             } finally {
                 target.shutdown();
             }
@@ -176,18 +175,19 @@
     }
 
     private void copyVersionStore(
-            InternalVersionManagerImpl source, InternalVersionManagerImpl target)
-            throws RepositoryException, ItemStateException {
+            InternalVersionManagerImpl source,
+            InternalVersionManagerImpl target, DataStore store)
+            throws Exception {
         logger.info("Copying version histories");
 
         PersistenceCopier copier = new PersistenceCopier(
                 source.getPersistenceManager(),
-                target.getPersistenceManager());
+                target.getPersistenceManager(), store);
         copier.copy(RepositoryImpl.VERSION_STORAGE_NODE_ID);
     }
 
     private void copyWorkspaces(RepositoryImpl source, RepositoryImpl target)
-            throws RepositoryException, ItemStateException {
+            throws Exception {
         Collection<String> existing = Arrays.asList(target.getWorkspaceNames());
         for (String name : source.getWorkspaceNames()) {
             logger.info("Copying workspace {}" , name);
@@ -198,7 +198,8 @@
 
             PersistenceCopier copier = new PersistenceCopier(
                     source.getWorkspaceInfo(name).getPersistenceManager(),
-                    target.getWorkspaceInfo(name).getPersistenceManager());
+                    target.getWorkspaceInfo(name).getPersistenceManager(),
+                    target.getDataStore());
             copier.excludeNode(RepositoryImpl.SYSTEM_ROOT_NODE_ID);
             copier.copy(RepositoryImpl.ROOT_NODE_ID);
         }

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=800807&r1=800806&r2=800807&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 Tue Aug  4 14:08:08 2009
@@ -16,17 +16,21 @@
  */
 package org.apache.jackrabbit.core.persistence;
 
+import java.io.InputStream;
 import java.util.HashSet;
 import java.util.Set;
 
+import javax.jcr.PropertyType;
+
+import org.apache.jackrabbit.core.data.DataStore;
 import org.apache.jackrabbit.core.id.NodeId;
 import org.apache.jackrabbit.core.id.PropertyId;
 import org.apache.jackrabbit.core.state.ChangeLog;
 import org.apache.jackrabbit.core.state.ChildNodeEntry;
-import org.apache.jackrabbit.core.state.ItemStateException;
 import org.apache.jackrabbit.core.state.NodeReferences;
 import org.apache.jackrabbit.core.state.NodeState;
 import org.apache.jackrabbit.core.state.PropertyState;
+import org.apache.jackrabbit.core.value.InternalValue;
 import org.apache.jackrabbit.spi.Name;
 
 /**
@@ -48,6 +52,11 @@
     private final PersistenceManager target;
 
     /**
+     * Target data store, possibly <code>null</code>.
+     */
+    private final DataStore store;
+
+    /**
      * Identifiers of the nodes that have already been copied or that
      * should explicitly not be copied. Used to avoid duplicate copies
      * of shareable nodes and to avoid trying to copy "missing" nodes
@@ -61,11 +70,14 @@
      *
      * @param source source persistence manager
      * @param target target persistence manager
+     * @param store target data store
      */
     public PersistenceCopier(
-            PersistenceManager source, PersistenceManager target) {
+            PersistenceManager source,  PersistenceManager target,
+            DataStore store) {
         this.source = source;
         this.target = target;
+        this.store = store;
     }
 
     /**
@@ -84,9 +96,9 @@
      * are automatically skipped.
      *
      * @param id identifier of the node to be copied
-     * @throws ItemStateException if the copy operation fails
+     * @throws Exception if the copy operation fails
      */
-    public void copy(NodeId id) throws ItemStateException {
+    public void copy(NodeId id) throws Exception {
         if (!exclude.contains(id)) {
             NodeState node = source.load(id);
 
@@ -104,9 +116,9 @@
      * to the target persistence manager.
      *
      * @param sourceNode source node state
-     * @throws ItemStateException if the copy operation fails
+     * @throws Exception if the copy operation fails
      */
-    private void copy(NodeState sourceNode) throws ItemStateException {
+    private void copy(NodeState sourceNode) throws Exception {
         ChangeLog changes = new ChangeLog();
 
         // Copy the node state
@@ -131,8 +143,19 @@
             targetState.setDefinitionId(sourceState.getDefinitionId());
             targetState.setType(sourceState.getType());
             targetState.setMultiValued(sourceState.isMultiValued());
-            // TODO: Copy binaries?
-            targetState.setValues(sourceState.getValues());
+            if (sourceState.getType() != PropertyType.BINARY) {
+                targetState.setValues(sourceState.getValues());
+            } else {
+                InternalValue[] values = sourceState.getValues();
+                for (int i = 0; i < values.length; i++) {
+                    InputStream stream = values[i].getStream();
+                    try {
+                        values[i] = InternalValue.create(stream, store);
+                    } finally {
+                        stream.close();
+                    }
+                }
+            }
             if (target.exists(targetState.getPropertyId())) {
                 changes.modified(targetState);
             } else {

Modified: jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/value/InternalValue.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/value/InternalValue.java?rev=800807&r1=800806&r2=800807&view=diff
==============================================================================
--- jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/value/InternalValue.java (original)
+++ jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/value/InternalValue.java Tue Aug  4 14:08:08 2009
@@ -323,7 +323,7 @@
      * @return the internal value
      * @throws RepositoryException
      */
-    static InternalValue create(InputStream value, DataStore store) throws RepositoryException {
+    public static InternalValue create(InputStream value, DataStore store) throws RepositoryException {
         return new InternalValue(getBLOBFileValue(store, value, false));
     }