[exo-jcr-commits] exo-jcr SVN: r4224 - in jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr: impl/core and 8 other directories.

do-not-reply at jboss.org do-not-reply at jboss.org
Mon Apr 11 06:54:23 EDT 2011


Author: tolusha
Date: 2011-04-11 06:54:23 -0400 (Mon, 11 Apr 2011)
New Revision: 4224

Modified:
   jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/dataflow/ItemDataTraversingVisitor.java
   jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/dataflow/ItemState.java
   jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/SessionDataManager.java
   jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/SessionImpl.java
   jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/dataflow/ItemDataMoveVisitor.java
   jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/dataflow/persistent/LinkedWorkspaceStorageCacheImpl.java
   jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/dataflow/persistent/WorkspacePersistentDataManager.java
   jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/dataflow/persistent/infinispan/ISPNCacheWorkspaceStorageCache.java
   jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/dataflow/persistent/jbosscache/JBossCacheWorkspaceStorageCache.java
   jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/dataflow/serialization/ItemStateReader.java
   jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/dataflow/serialization/ItemStateWriter.java
   jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/dataflow/session/LocalWorkspaceStorageDataManagerProxy.java
   jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/dataflow/session/SessionChangesLog.java
   jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/xml/importing/BaseXmlImporter.java
   jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/storage/WorkspaceDataContainer.java
Log:
EXOJCR-1296: Allow to ignore events for descendents on rename by adding "trigger-events-for-descendents-on-rename" property with "false" value

Modified: jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/dataflow/ItemDataTraversingVisitor.java
===================================================================
--- jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/dataflow/ItemDataTraversingVisitor.java	2011-04-11 09:54:46 UTC (rev 4223)
+++ jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/dataflow/ItemDataTraversingVisitor.java	2011-04-11 10:54:23 UTC (rev 4224)
@@ -37,6 +37,8 @@
     */
    protected final int maxLevel;
 
+   public static final int INFINITE_DEPTH = -1;
+
    /**
     * Current level.
     */
@@ -62,7 +64,7 @@
     */
    public ItemDataTraversingVisitor(ItemDataConsumer dataManager)
    {
-      this.maxLevel = -1;
+      this.maxLevel = INFINITE_DEPTH;
       this.dataManager = dataManager;
    }
 
@@ -83,7 +85,7 @@
       try
       {
          entering(node, currentLevel);
-         if (maxLevel == -1 || currentLevel < maxLevel)
+         if (maxLevel == INFINITE_DEPTH || currentLevel < maxLevel)
          {
             currentLevel++;
             for (PropertyData data : dataManager.getChildPropertiesData(node))

Modified: jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/dataflow/ItemState.java
===================================================================
--- jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/dataflow/ItemState.java	2011-04-11 09:54:46 UTC (rev 4223)
+++ jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/dataflow/ItemState.java	2011-04-11 10:54:23 UTC (rev 4224)
@@ -19,8 +19,10 @@
 package org.exoplatform.services.jcr.dataflow;
 
 import org.exoplatform.services.jcr.core.security.JCRRuntimePermissions;
+import org.exoplatform.services.jcr.datamodel.IllegalPathException;
 import org.exoplatform.services.jcr.datamodel.ItemData;
 import org.exoplatform.services.jcr.datamodel.QPath;
+import org.exoplatform.services.jcr.impl.Constants;
 import org.exoplatform.services.log.ExoLogger;
 import org.exoplatform.services.log.Log;
 
@@ -54,6 +56,8 @@
 
    public static final int RENAMED = 32;
 
+   public static final int PATH_CHANGED = 64;
+
    /**
     * underlying item data
     */
@@ -78,6 +82,11 @@
     */
    private transient QPath ancestorToSave;
 
+   /** 
+    * Storing old node path during Session.move() operation 
+    */
+   private QPath oldPath;
+
    /**
     * The constructor
     * 
@@ -110,7 +119,27 @@
       this(data, state, eventFire, ancestorToSave, isInternalCreated, true);
    }
 
+   /**
+    * @param data
+    *          underlying data
+    * @param state
+    * @param eventFire
+    *          - if the state cause some event firing
+    * @param ancestorToSave
+    *          - path of item which should be called in save (usually for session.move())
+    * @param isInternalCreated
+    *          - indicates that item is created internally by system
+    * @param oldPath
+    *          - store to old node path during Session.move() operation           
+    */
    public ItemState(ItemData data, int state, boolean eventFire, QPath ancestorToSave, boolean isInternalCreated,
+      boolean isPersisted, QPath oldPath)
+   {
+      this(data, state, eventFire, ancestorToSave, isInternalCreated, isPersisted);
+      this.oldPath = oldPath;
+   }
+
+   public ItemState(ItemData data, int state, boolean eventFire, QPath ancestorToSave, boolean isInternalCreated,
       boolean isPersisted)
    {
       if (isInternalCreated)
@@ -194,6 +223,11 @@
       return (state == RENAMED);
    }
 
+   public boolean isPathChanged()
+   {
+      return (state == PATH_CHANGED);
+   }
+
    public boolean isEventFire()
    {
       return eventFire;
@@ -219,6 +253,11 @@
       return ancestorToSave;
    }
 
+   public QPath getOldPath()
+   {
+      return oldPath;
+   }
+
    @Override
    public boolean equals(Object obj)
    {
@@ -360,6 +399,8 @@
             return "MIXIN_CHANGED";
          case RENAMED :
             return "RENAMED";
+         case PATH_CHANGED :
+            return "PATH_CHANGED";
          default :
             return "UNDEFINED STATE";
       }
@@ -380,6 +421,18 @@
       out.writeInt(state);
       out.writeBoolean(isPersisted);
       out.writeBoolean(eventFire);
+
+      if (oldPath == null)
+      {
+         out.writeInt(-1);
+      }
+      else
+      {
+         byte[] buf = oldPath.getAsString().getBytes(Constants.DEFAULT_ENCODING);
+         out.writeInt(buf.length);
+         out.write(buf);
+      }
+
       out.writeObject(data);
    }
 
@@ -388,6 +441,27 @@
       state = in.readInt();
       isPersisted = in.readBoolean();
       eventFire = in.readBoolean();
+      
+      int len = in.readInt();
+      if (len == -1)
+      {
+         oldPath = null;
+      }
+      else
+      {
+         byte[] buf = new byte[len];
+         in.readFully(buf);
+
+         try
+         {
+            oldPath = QPath.parse(new String(buf, Constants.DEFAULT_ENCODING));
+         }
+         catch (IllegalPathException e)
+         {
+            throw new IOException("Data currupted.", e);
+         }
+      }
+      
       data = (ItemData)in.readObject();
    }
 

Modified: jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/SessionDataManager.java
===================================================================
--- jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/SessionDataManager.java	2011-04-11 09:54:46 UTC (rev 4223)
+++ jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/SessionDataManager.java	2011-04-11 10:54:23 UTC (rev 4224)
@@ -1851,7 +1851,7 @@
             continue;
          }
 
-         if (rstate.getState() == ItemState.RENAMED)
+         if (rstate.isRenamed())
          {
             // find DELETED
             rstate = changes.findItemState(rstate.getData().getIdentifier(), false, new int[]{ItemState.DELETED});

Modified: jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/SessionImpl.java
===================================================================
--- jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/SessionImpl.java	2011-04-11 09:54:46 UTC (rev 4223)
+++ jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/SessionImpl.java	2011-04-11 10:54:23 UTC (rev 4224)
@@ -50,6 +50,7 @@
 import org.exoplatform.services.jcr.impl.xml.exporting.BaseXmlExporter;
 import org.exoplatform.services.jcr.impl.xml.importing.ContentImporter;
 import org.exoplatform.services.jcr.impl.xml.importing.StreamImporter;
+import org.exoplatform.services.jcr.storage.WorkspaceDataContainer;
 import org.exoplatform.services.jcr.util.IdGenerator;
 import org.exoplatform.services.log.ExoLogger;
 import org.exoplatform.services.log.Log;
@@ -159,6 +160,8 @@
 
    private long lastAccessTime;
 
+   private boolean triggerEventsForDescendentsOnRename;
+
    private final int lazyReadThreshold;
 
    private final SessionRegistry sessionRegistry;
@@ -224,7 +227,9 @@
 
       sessionRegistry.registerSession(this);
       this.lastAccessTime = System.currentTimeMillis();
-
+      this.triggerEventsForDescendentsOnRename =
+         wsConfig.getContainer().getParameterBoolean(WorkspaceDataContainer.TRIGGER_EVENTS_FOR_DESCENDENTS_ON_RENAME,
+            WorkspaceDataContainer.TRIGGER_EVENTS_FOR_DESCENDENTS_ON_RENAME_DEFAULT);
    }
 
    /**
@@ -996,7 +1001,8 @@
 
       ItemDataMoveVisitor initializer =
          new ItemDataMoveVisitor((NodeData)destParentNode.getData(), destNodePath.getName().getInternalName(),
-            nodeTypeManager, getTransientNodesManager(), true);
+            nodeTypeManager, getTransientNodesManager(), true, triggerEventsForDescendentsOnRename
+               || !srcNodePath.makeParentPath().equals(destNodePath.makeParentPath()));
 
       getTransientNodesManager().rename((NodeData)srcNode.getData(), initializer);
    }

Modified: jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/dataflow/ItemDataMoveVisitor.java
===================================================================
--- jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/dataflow/ItemDataMoveVisitor.java	2011-04-11 09:54:46 UTC (rev 4223)
+++ jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/dataflow/ItemDataMoveVisitor.java	2011-04-11 10:54:23 UTC (rev 4224)
@@ -82,6 +82,11 @@
 
    protected QPath ancestorToSave = null;
 
+   /** 
+    * Trigger events for descendents. 
+   */
+   protected boolean triggerEventsForDescendents;
+
    /**
     * Creates an instance of this class.
     * 
@@ -95,20 +100,39 @@
     *          - Source data manager
     * @param keepIdentifiers
     *          - Is it necessity to keep <code>Identifiers</code>
+    * @param triggerEventsForDescendents 
+    *          - Trigger events for descendents.          
     */
-
    public ItemDataMoveVisitor(NodeData parent, InternalQName dstNodeName, NodeTypeDataManager nodeTypeManager,
-      SessionDataManager srcDataManager, boolean keepIdentifiers)
+      SessionDataManager srcDataManager, boolean keepIdentifiers, boolean triggerEventsForDescendents)
    {
-      super(srcDataManager);
+      super(srcDataManager, triggerEventsForDescendents ? INFINITE_DEPTH : 0);
       this.keepIdentifiers = keepIdentifiers;
       this.ntManager = nodeTypeManager;
       this.destNodeName = dstNodeName;
 
       this.parents = new Stack<NodeData>();
       this.parents.add(parent);
+      this.triggerEventsForDescendents = triggerEventsForDescendents;
    }
 
+   /** 
+    * Creates an instance of this class. 
+    * 
+    * @param parent - The parent node 
+    * @param dstNodeName Destination node name 
+    * @param nodeTypeManager - The NodeTypeManager 
+    * @param srcDataManager - Source data manager 
+    * @param keepIdentifiers - Is it necessity to keep <code>Identifiers</code> 
+    * @param skipEventsForDescendents - Don't generate events for the 
+    *          descendants. 
+    */
+   public ItemDataMoveVisitor(NodeData parent, InternalQName dstNodeName, NodeTypeDataManager nodeTypeManager,
+      SessionDataManager srcDataManager, boolean keepIdentifiers)
+   {
+      this(parent, dstNodeName, nodeTypeManager, srcDataManager, keepIdentifiers, false);
+   }
+
    @Override
    protected void entering(NodeData node, int level) throws RepositoryException
    {
@@ -230,6 +254,12 @@
       // if level == 0 set internal createt as false for validating on save
       addStates.add(new ItemState(newNode, ItemState.RENAMED, level == 0, ancestorToSave, false, level == 0));
       deleteStates.add(new ItemState(node, ItemState.DELETED, level == 0, ancestorToSave, false, false));
+
+      if (!triggerEventsForDescendents)
+      {
+         addStates.add(new ItemState(newNode, ItemState.PATH_CHANGED, false, ancestorToSave, false, false, node
+            .getQPath()));
+      }
    }
 
    @Override

Modified: jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/dataflow/persistent/LinkedWorkspaceStorageCacheImpl.java
===================================================================
--- jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/dataflow/persistent/LinkedWorkspaceStorageCacheImpl.java	2011-04-11 09:54:46 UTC (rev 4223)
+++ jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/dataflow/persistent/LinkedWorkspaceStorageCacheImpl.java	2011-04-11 10:54:23 UTC (rev 4224)
@@ -32,6 +32,8 @@
 import org.exoplatform.services.jcr.datamodel.QPath;
 import org.exoplatform.services.jcr.datamodel.QPathEntry;
 import org.exoplatform.services.jcr.impl.Constants;
+import org.exoplatform.services.jcr.impl.dataflow.TransientNodeData;
+import org.exoplatform.services.jcr.impl.dataflow.TransientPropertyData;
 import org.exoplatform.services.log.ExoLogger;
 import org.exoplatform.services.log.Log;
 
@@ -43,10 +45,10 @@
 import java.util.LinkedHashMap;
 import java.util.List;
 import java.util.Map;
+import java.util.Map.Entry;
 import java.util.Timer;
 import java.util.TimerTask;
 import java.util.WeakHashMap;
-import java.util.Map.Entry;
 import java.util.concurrent.Semaphore;
 import java.util.concurrent.locks.ReentrantLock;
 
@@ -1886,6 +1888,68 @@
                // RENAME goes before DELETE
                put(item);
             }
+            else if (state.isPathChanged())
+            {
+               writeLock.lock();
+               try
+               {
+                  for (Entry<CacheKey, CacheValue> cacheEntry : cache.entrySet())
+                  {
+                     CacheKey cacheKey = cacheEntry.getKey();
+                     CacheValue cacheValue = cacheEntry.getValue();
+
+                     ItemData oldItemData = cacheValue.getItem();
+                     if (oldItemData.getQPath().isDescendantOf(state.getOldPath()))
+                     {
+                        int relativeDegree = oldItemData.getQPath().getDepth() - state.getOldPath().getDepth();
+                        QPath newQPath =
+                           QPath.makeChildPath(state.getData().getQPath(),
+                              oldItemData.getQPath().getRelPath(relativeDegree));
+
+                        if (oldItemData.isNode())
+                        {
+                           NodeData nodeData = (NodeData)oldItemData;
+                           TransientNodeData newItemData =
+                              new TransientNodeData(newQPath, nodeData.getIdentifier(), nodeData.getPersistedVersion(),
+                                 nodeData.getPrimaryTypeName(), nodeData.getMixinTypeNames(),
+                                 nodeData.getOrderNumber(), nodeData.getParentIdentifier(), nodeData.getACL());
+                           cache.put(cacheKey, new CacheValue(newItemData, cacheValue.getExpiredTime()));
+
+                           // update in children nodes 
+                           List<NodeData> cachedChildNodes = nodesCache.get(nodeData.getParentIdentifier());
+                           if (cachedChildNodes != null)
+                           {
+                              int index = cachedChildNodes.indexOf(oldItemData);
+                              cachedChildNodes.set(index, newItemData);
+                           }
+                        }
+                        else
+                        {
+                           PropertyData oldPropertyData = (PropertyData)oldItemData;
+                           TransientPropertyData newPropertyData =
+                              new TransientPropertyData(newQPath, oldPropertyData.getIdentifier(),
+                                 oldPropertyData.getPersistedVersion(), oldPropertyData.getType(),
+                                 oldPropertyData.getParentIdentifier(), oldPropertyData.isMultiValued(),
+                                 oldPropertyData.getValues());
+                           cache.put(cacheKey, new CacheValue(newPropertyData, cacheValue.getExpiredTime()));
+
+                           // update in children properties 
+                           List<PropertyData> cachedChildProps =
+                              propertiesCache.get(oldPropertyData.getParentIdentifier());
+                           if (cachedChildProps != null)
+                           {
+                              int index = cachedChildProps.indexOf(oldItemData);
+                              cachedChildProps.set(index, newPropertyData);
+                           }
+                        }
+                     }
+                  }
+               }
+               finally
+               {
+                  writeLock.unlock();
+               }
+            }
             else if (state.isUpdated())
             {
                // UPDATE occurs on reordered (no subtree!) and merged nodes (for each

Modified: jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/dataflow/persistent/WorkspacePersistentDataManager.java
===================================================================
--- jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/dataflow/persistent/WorkspacePersistentDataManager.java	2011-04-11 09:54:46 UTC (rev 4223)
+++ jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/dataflow/persistent/WorkspacePersistentDataManager.java	2011-04-11 10:54:23 UTC (rev 4224)
@@ -355,7 +355,7 @@
 
             ItemState itemState =
                new ItemState(newData, prevState.getState(), prevState.isEventFire(), prevState.getAncestorToSave(),
-                  prevState.isInternallyCreated(), prevState.isPersisted());
+                  prevState.isInternallyCreated(), prevState.isPersisted(), prevState.getOldPath());
 
             newLog.add(itemState);
 

Modified: jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/dataflow/persistent/infinispan/ISPNCacheWorkspaceStorageCache.java
===================================================================
--- jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/dataflow/persistent/infinispan/ISPNCacheWorkspaceStorageCache.java	2011-04-11 09:54:46 UTC (rev 4223)
+++ jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/dataflow/persistent/infinispan/ISPNCacheWorkspaceStorageCache.java	2011-04-11 10:54:23 UTC (rev 4224)
@@ -329,6 +329,10 @@
             {
                putItem(state.getData());
             }
+            else if (state.isPathChanged())
+            {
+               updateTreePath(state.getOldPath(), state.getData().getQPath(), null);
+            }
             else if (state.isMixinChanged())
             {
                if (state.isPersisted())

Modified: jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/dataflow/persistent/jbosscache/JBossCacheWorkspaceStorageCache.java
===================================================================
--- jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/dataflow/persistent/jbosscache/JBossCacheWorkspaceStorageCache.java	2011-04-11 09:54:46 UTC (rev 4223)
+++ jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/dataflow/persistent/jbosscache/JBossCacheWorkspaceStorageCache.java	2011-04-11 10:54:23 UTC (rev 4224)
@@ -554,6 +554,10 @@
             {
                putItem(state.getData());
             }
+            else if (state.isPathChanged())
+            {
+               updateTreePath(state.getOldPath(), state.getData().getQPath(), null);
+            }
             else if (state.isMixinChanged())
             {
                if (state.isPersisted())

Modified: jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/dataflow/serialization/ItemStateReader.java
===================================================================
--- jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/dataflow/serialization/ItemStateReader.java	2011-04-11 09:54:46 UTC (rev 4223)
+++ jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/dataflow/serialization/ItemStateReader.java	2011-04-11 10:54:23 UTC (rev 4224)
@@ -22,6 +22,9 @@
 import org.exoplatform.services.jcr.dataflow.serialization.ObjectReader;
 import org.exoplatform.services.jcr.dataflow.serialization.SerializationConstants;
 import org.exoplatform.services.jcr.dataflow.serialization.UnknownClassIdException;
+import org.exoplatform.services.jcr.datamodel.IllegalPathException;
+import org.exoplatform.services.jcr.datamodel.QPath;
+import org.exoplatform.services.jcr.impl.Constants;
 import org.exoplatform.services.jcr.impl.util.io.FileCleaner;
 
 import java.io.EOFException;
@@ -94,17 +97,26 @@
          boolean isPersisted = in.readBoolean();
          boolean eventFire = in.readBoolean();
 
+         QPath oldPath = null;
+         int len = in.readInt();
+         if (len != -1)
+         {
+            byte[] buf = new byte[len];
+            in.readFully(buf);
+            oldPath = QPath.parse(new String(buf, Constants.DEFAULT_ENCODING));
+         }
+
          boolean isNodeData = in.readBoolean();
 
          if (isNodeData)
          {
             PresistedNodeDataReader rdr = new PresistedNodeDataReader();
-            is = new ItemState(rdr.read(in), state, eventFire, null, false, isPersisted);
+            is = new ItemState(rdr.read(in), state, eventFire, null, false, isPersisted, oldPath);
          }
          else
          {
             PersistedPropertyDataReader rdr = new PersistedPropertyDataReader(fileCleaner, maxBufferSize, holder);
-            is = new ItemState(rdr.read(in), state, eventFire, null, false, isPersisted);
+            is = new ItemState(rdr.read(in), state, eventFire, null, false, isPersisted, oldPath);
          }
          return is;
       }
@@ -112,5 +124,9 @@
       {
          throw new StreamCorruptedException("Unexpected EOF in middle of data block.");
       }
+      catch (IllegalPathException e)
+      {
+         throw new IOException("Data corrupted", e);
+      }
    }
 }

Modified: jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/dataflow/serialization/ItemStateWriter.java
===================================================================
--- jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/dataflow/serialization/ItemStateWriter.java	2011-04-11 09:54:46 UTC (rev 4223)
+++ jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/dataflow/serialization/ItemStateWriter.java	2011-04-11 10:54:23 UTC (rev 4224)
@@ -24,6 +24,7 @@
 import org.exoplatform.services.jcr.dataflow.serialization.ObjectWriter;
 import org.exoplatform.services.jcr.dataflow.serialization.SerializationConstants;
 import org.exoplatform.services.jcr.datamodel.ItemData;
+import org.exoplatform.services.jcr.impl.Constants;
 
 import java.io.IOException;
 
@@ -58,6 +59,17 @@
       out.writeBoolean(itemState.isPersisted());
       out.writeBoolean(itemState.isEventFire());
 
+      if (itemState.getOldPath() == null)
+      {
+         out.writeInt(-1);
+      }
+      else
+      {
+         byte[] buf = itemState.getOldPath().getAsString().getBytes(Constants.DEFAULT_ENCODING);
+         out.writeInt(buf.length);
+         out.write(buf);
+      }
+
       // write flag isNodeData and ItemData
       ItemData data = itemState.getData();
 

Modified: jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/dataflow/session/LocalWorkspaceStorageDataManagerProxy.java
===================================================================
--- jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/dataflow/session/LocalWorkspaceStorageDataManagerProxy.java	2011-04-11 09:54:46 UTC (rev 4223)
+++ jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/dataflow/session/LocalWorkspaceStorageDataManagerProxy.java	2011-04-11 10:54:23 UTC (rev 4224)
@@ -91,7 +91,7 @@
          for (ItemState change : changes.getAllStates())
          {
             states.add(new ItemState(copyItemData(change.getData()), change.getState(), change.isEventFire(), change
-               .getAncestorToSave(), change.isInternallyCreated(), change.isPersisted()));
+               .getAncestorToSave(), change.isInternallyCreated(), change.isPersisted(), change.getOldPath()));
          }
 
          newLog.addLog(new PlainChangesLogImpl(states, changes.getSessionId(), changes.getEventType()));

Modified: jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/dataflow/session/SessionChangesLog.java
===================================================================
--- jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/dataflow/session/SessionChangesLog.java	2011-04-11 09:54:46 UTC (rev 4223)
+++ jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/dataflow/session/SessionChangesLog.java	2011-04-11 10:54:23 UTC (rev 4224)
@@ -487,6 +487,7 @@
     *         if renaming is not detected.
     * @throws IllegalPathException
     */
+   @Deprecated
    public ItemState[] findRenamed(QPath deletedPath) throws IllegalPathException
    {
       List<ItemState> allStates = getAllStates();

Modified: jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/xml/importing/BaseXmlImporter.java
===================================================================
--- jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/xml/importing/BaseXmlImporter.java	2011-04-11 09:54:46 UTC (rev 4223)
+++ jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/xml/importing/BaseXmlImporter.java	2011-04-11 10:54:23 UTC (rev 4224)
@@ -175,7 +175,7 @@
          for (ItemState itemState : changesLog.getAllStates())
          {
             newChangesLog.add(new ItemState(itemState.getData(), itemState.getState(), itemState.isEventFire(),
-               ancestorToSave, itemState.isInternallyCreated(), itemState.isPersisted()));
+               ancestorToSave, itemState.isInternallyCreated(), itemState.isPersisted(), itemState.getOldPath()));
          }
          changesLog.clear();
          changesLog.addAll(newChangesLog.getAllStates());

Modified: jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/storage/WorkspaceDataContainer.java
===================================================================
--- jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/storage/WorkspaceDataContainer.java	2011-04-11 09:54:46 UTC (rev 4223)
+++ jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/storage/WorkspaceDataContainer.java	2011-04-11 10:54:23 UTC (rev 4224)
@@ -38,7 +38,10 @@
 {
 
    // configuration params
+   public static final String TRIGGER_EVENTS_FOR_DESCENDENTS_ON_RENAME = "trigger-events-for-descendents-on-rename";
 
+   public static final boolean TRIGGER_EVENTS_FOR_DESCENDENTS_ON_RENAME_DEFAULT = true;
+
    public final static String CONTAINER_NAME = "containerName";
 
    public final static String MAXBUFFERSIZE_PROP = "max-buffer-size";



More information about the exo-jcr-commits mailing list