[exo-jcr-commits] exo-jcr SVN: r1229 - jcr/branches/1.12.0-OPT/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core.

do-not-reply at jboss.org do-not-reply at jboss.org
Tue Dec 29 06:56:33 EST 2009


Author: tolusha
Date: 2009-12-29 06:56:33 -0500 (Tue, 29 Dec 2009)
New Revision: 1229

Modified:
   jcr/branches/1.12.0-OPT/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/SessionDataManager.java
Log:
EXOJCR-344: SessionDataManager small refactoring merge() methods

Modified: jcr/branches/1.12.0-OPT/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/SessionDataManager.java
===================================================================
--- jcr/branches/1.12.0-OPT/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/SessionDataManager.java	2009-12-29 10:16:00 UTC (rev 1228)
+++ jcr/branches/1.12.0-OPT/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/SessionDataManager.java	2009-12-29 11:56:33 UTC (rev 1229)
@@ -664,7 +664,7 @@
 
       try
       {
-         return (List<NodeData>)merge(parent, transactionableManager, false, MERGE_NODES);
+         return (List<NodeData>)mergeNodes(parent, transactionableManager);
       }
       finally
       {
@@ -704,7 +704,7 @@
 
       try
       {
-         return (List<PropertyData>)merge(parent, transactionableManager, false, MERGE_PROPS);
+         return (List<PropertyData>)mergeProps(parent, transactionableManager);
       }
       finally
       {
@@ -728,7 +728,7 @@
 
       try
       {
-         return (List<PropertyData>)mergeList(parent, transactionableManager, false, MERGE_PROPS);
+         return (List<PropertyData>)mergeProps(parent, transactionableManager);
       }
       finally
       {
@@ -1566,31 +1566,63 @@
    }
 
    /**
-    * merges incoming data with changes stored in this log i.e: 1. incoming data still not modified
+    * Merges incoming node with changes stored in this log i.e: 1. incoming data still not modified
     * if there are no corresponding changes 2. incoming data is refreshed with corresponding changes
     * if any 3. new datas is added from changes 4. if chaged data is marked as "deleted" it removes
     * from outgoing list WARN. THIS METHOD HAS SIBLING - mergeList, see below
     * 
     * @param rootData
-    * @param deep
-    *          if true - traverses
-    * @param action
-    *          : MERGE_NODES | MERGE_PROPS | MERGE_ITEMS
     * @return
     */
-   protected List<? extends ItemData> merge(ItemData rootData, DataManager dataManager, boolean deep, int action)
-      throws RepositoryException
+   protected List<? extends ItemData> mergeNodes(ItemData rootData, DataManager dataManager) throws RepositoryException
    {
       // 1 get all transient descendants
-      List<ItemState> transientDescendants = new ArrayList<ItemState>();
-      traverseTransientDescendants(rootData, false, action, transientDescendants);
+      List<ItemState> transientDescendants = new ArrayList(changesLog.getLastChildrenStates(rootData, true));
 
-      // 2 get ALL persisted descendants
-      Map<String, ItemData> descendants = new LinkedHashMap<String, ItemData>();
-      List<? extends ItemData> result = traverseStoredDescendants(rootData, dataManager, false, action, descendants, false, transientDescendants);
+      if (!transientDescendants.isEmpty())
+      {
+         // 2 get ALL persisted descendants
+         Map<String, ItemData> descendants = new LinkedHashMap<String, ItemData>();
+         traverseStoredDescendants(rootData, dataManager, MERGE_NODES, descendants, false, transientDescendants);
 
-      if (deep || !transientDescendants.isEmpty())
+         // merge data
+         for (ItemState state : transientDescendants)
+         {
+            ItemData data = state.getData();
+            if (!state.isDeleted())
+               descendants.put(data.getIdentifier(), data);
+            else
+               descendants.remove(data.getIdentifier());
+         }
+         Collection<ItemData> desc = descendants.values();
+         return new ArrayList<ItemData>(desc);
+      }
+      else
       {
+         return new ArrayList<ItemData>(dataManager.getChildNodesData((NodeData)rootData));
+      }
+   }
+
+   /**
+    * Merges incoming property data with changes stored in this log i.e: 1. incoming data still not modified
+    * if there are no corresponding changes 2. incoming data is refreshed with corresponding changes
+    * if any 3. new datas is added from changes 4. if chaged data is marked as "deleted" it removes
+    * from outgoing list WARN. THIS METHOD HAS SIBLING - mergeList, see below
+    * 
+    * @param rootData
+    * @return
+    */
+   protected List<? extends ItemData> mergeProps(ItemData rootData, DataManager dataManager) throws RepositoryException
+   {
+      // 1 get all transient descendants
+      List<ItemState> transientDescendants = new ArrayList(changesLog.getLastChildrenStates(rootData, false));
+
+      if (!transientDescendants.isEmpty())
+      {
+         // 2 get ALL persisted descendants
+         Map<String, ItemData> descendants = new LinkedHashMap<String, ItemData>();
+         traverseStoredDescendants(rootData, dataManager, MERGE_PROPS, descendants, false, transientDescendants);
+
          // merge data
          for (ItemState state : transientDescendants)
          {
@@ -1600,29 +1632,12 @@
             else
                descendants.remove(data.getIdentifier());
          }
-         Collection<? extends ItemData> desc = result != null ? result : descendants.values();
-         List<ItemData> retval;
-			if (deep)
-			{
-	         int size = desc.size();
-	         retval = new ArrayList<ItemData>(size < 10 ? 10 : size);
-
-	         for (ItemData itemData : desc)
-	         {
-	            retval.add(itemData);
-	            if (deep)
-	               retval.addAll(merge(itemData, dataManager, true, action));
-	         }		   
-			}
-			else
-			{
-			   retval = new ArrayList<ItemData>(desc);
-			}
-         return retval;         
+         Collection<ItemData> desc = descendants.values();
+         return new ArrayList<ItemData>(desc);
       }
       else
       {
-         return new ArrayList<ItemData>(result);
+         return new ArrayList<ItemData>(dataManager.getChildPropertiesData((NodeData)rootData));
       }
    }
 
@@ -1643,14 +1658,14 @@
 
       // 1 get all transient descendants
       List<ItemState> transientDescendants = new ArrayList<ItemState>();
-      traverseTransientDescendants(rootData, false, action, transientDescendants);
+      traverseTransientDescendants(rootData, action, transientDescendants);
 
-      // 2 get ALL persisted descendants
-      Map<String, ItemData> descendants = new LinkedHashMap<String, ItemData>();
-      List<? extends ItemData> result = traverseStoredDescendants(rootData, dataManager, false, action, descendants, true, transientDescendants);
-
       if (deep || !transientDescendants.isEmpty())
       {
+         // 2 get ALL persisted descendants
+         Map<String, ItemData> descendants = new LinkedHashMap<String, ItemData>();
+         traverseStoredDescendants(rootData, dataManager, action, descendants, true, transientDescendants);
+
          // merge data
          for (ItemState state : transientDescendants)
          {
@@ -1660,7 +1675,7 @@
             else
                descendants.remove(data.getIdentifier());
          }
-         Collection<? extends ItemData> desc = result != null ? result : descendants.values();
+         Collection<ItemData> desc = descendants.values();
          List<ItemData> retval;
          if (deep)
          {
@@ -1678,11 +1693,11 @@
          {
             retval = new ArrayList<ItemData>(desc);
          }
-         return retval;         
+         return retval;
       }
       else
       {
-         return new ArrayList<ItemData>(result);
+         return new ArrayList<ItemData>(getStoredDescendants(rootData, dataManager, action));
       }
    }
 
@@ -1696,78 +1711,83 @@
     * @param ret
     * @throws RepositoryException
     */
-   private List<? extends ItemData> traverseStoredDescendants(ItemData parent, DataManager dataManager, boolean deep, int action,
+   private void traverseStoredDescendants(ItemData parent, DataManager dataManager, int action,
       Map<String, ItemData> ret, boolean listOnly, List<ItemState> transientDescendants) throws RepositoryException
    {
 
       if (parent.isNode())
       {
-         List<ItemData> childItems = null;
          if (action != MERGE_PROPS)
          {
             List<NodeData> childNodes = dataManager.getChildNodesData((NodeData)parent);
-            if (deep || !transientDescendants.isEmpty())
+            for (NodeData childNode : childNodes)
             {
-               for (NodeData childNode : childNodes)
-               {
-                  ret.put(childNode.getIdentifier(), childNode);
+               ret.put(childNode.getIdentifier(), childNode);
 
-                  if (log.isDebugEnabled())
-                     log.debug("Traverse stored (N) " + childNode.getQPath().getAsString());
-
-                  // TODO [PN] Not used
-                  if (deep)
-                     traverseStoredDescendants(childNode, dataManager, deep, action, ret, listOnly, transientDescendants);
-               }               
+               if (log.isDebugEnabled())
+                  log.debug("Traverse stored (N) " + childNode.getQPath().getAsString());
             }
-            else
-            {
-               if (action != MERGE_NODES)
-               {
-                  childItems = new ArrayList<ItemData>(childNodes);
-               }
-               else
-               {
-                  return childNodes;
-               }               
-            }
          }
          if (action != MERGE_NODES)
          {
             List<PropertyData> childProps =
                listOnly ? dataManager.listChildPropertiesData((NodeData)parent) : dataManager
                   .getChildPropertiesData((NodeData)parent);
-            if (deep || !transientDescendants.isEmpty())
+            outer : for (PropertyData childProp : childProps)
             {
-               outer : for (PropertyData childProp : childProps)
+               for (ItemState transientState : transientDescendants)
                {
-                  for (ItemState transientState : transientDescendants)
+                  if (!transientState.isNode() && !transientState.isDeleted()
+                     && transientState.getData().getQPath().getDepth() == childProp.getQPath().getDepth()
+                     && transientState.getData().getQPath().getName().equals(childProp.getQPath().getName()))
                   {
-                     if (!transientState.isNode() && !transientState.isDeleted()
-                        && transientState.getData().getQPath().getDepth() == childProp.getQPath().getDepth()
-                        && transientState.getData().getQPath().getName().equals(childProp.getQPath().getName()))
-                     {
-                        continue outer;
-                     }
+                     continue outer;
                   }
-                  ret.put(childProp.getIdentifier(), childProp);
+               }
+               ret.put(childProp.getIdentifier(), childProp);
 
-                  if (log.isDebugEnabled())
-                     log.debug("Traverse stored (P) " + childProp.getQPath().getAsString());
-               }               
+               if (log.isDebugEnabled())
+                  log.debug("Traverse stored (P) " + childProp.getQPath().getAsString());
             }
-            else
-            {
-               if (action != MERGE_PROPS)
-               {
-                  childItems.addAll(childProps);
-               }
-               else
-               {
-                  return childProps;
-               }               
-            }
          }
+      }
+   }
+
+   /**
+    * Get all stored descendants for the given parent node
+    * 
+    * @param parent
+    * @param dataManager
+    * @param action
+    * @throws RepositoryException
+    */
+   private List<? extends ItemData> getStoredDescendants(ItemData parent, DataManager dataManager, int action)
+      throws RepositoryException
+   {
+      if (parent.isNode())
+      {
+         List<ItemData> childItems = null;
+
+         List<NodeData> childNodes = dataManager.getChildNodesData((NodeData)parent);
+         if (action != MERGE_NODES)
+         {
+            childItems = new ArrayList<ItemData>(childNodes);
+         }
+         else
+         {
+            return childNodes;
+         }
+
+         List<PropertyData> childProps = dataManager.getChildPropertiesData((NodeData)parent);
+         if (action != MERGE_PROPS)
+         {
+            childItems.addAll(childProps);
+         }
+         else
+         {
+            return childProps;
+         }
+
          return childItems;
       }
       return null;
@@ -1782,7 +1802,7 @@
     * @param ret
     * @throws RepositoryException
     */
-   private void traverseTransientDescendants(ItemData parent, boolean deep, int action, List<ItemState> ret)
+   private void traverseTransientDescendants(ItemData parent, int action, List<ItemState> ret)
       throws RepositoryException
    {
 
@@ -1794,9 +1814,6 @@
             for (ItemState childNode : childNodes)
             {
                ret.add(childNode);
-
-               if (deep)
-                  traverseTransientDescendants(childNode.getData(), deep, action, ret);
             }
          }
          if (action != MERGE_NODES)



More information about the exo-jcr-commits mailing list