[exo-jcr-commits] exo-jcr SVN: r1222 - 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
Mon Dec 28 18:20:59 EST 2009


Author: nfilotto
Date: 2009-12-28 18:20:59 -0500 (Mon, 28 Dec 2009)
New Revision: 1222

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: Removal of the bottlenecks found with JProfiler
Make the method SessionDataManager.traverseStoredDescendants avoid to store the result into Map<String, ItemData> ret when no merge are required: i.e. deep || !transientDescendants.isEmpty()

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-28 16:18:41 UTC (rev 1221)
+++ jcr/branches/1.12.0-OPT/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/SessionDataManager.java	2009-12-28 23:20:59 UTC (rev 1222)
@@ -1587,37 +1587,43 @@
 
       // 2 get ALL persisted descendants
       Map<String, ItemData> descendants = new LinkedHashMap<String, ItemData>();
-      traverseStoredDescendants(rootData, dataManager, false, action, descendants, false, transientDescendants);
+      List<? extends ItemData> result = traverseStoredDescendants(rootData, dataManager, false, action, descendants, false, transientDescendants);
 
-      // merge data
-      for (ItemState state : transientDescendants)
+      if (deep || !transientDescendants.isEmpty())
       {
-         ItemData data = state.getData();
-         if (!state.isDeleted())
-            descendants.put(data.getIdentifier(), data);
-         else
-            descendants.remove(data.getIdentifier());
-      }
-      Collection<ItemData> desc = descendants.values();
-      List<ItemData> retval;
-      if (deep)
-      {
-         int size = desc.size();
-         retval = new ArrayList<ItemData>(size < 10 ? 10 : size);
-
-         for (ItemData itemData : desc)
+         // merge data
+         for (ItemState state : transientDescendants)
          {
-            retval.add(itemData);
-            if (deep)
-               retval.addAll(merge(itemData, dataManager, true, action));
+            ItemData data = state.getData();
+            if (!state.isDeleted())
+               descendants.put(data.getIdentifier(), data);
+            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;         
       }
       else
       {
-         retval = new ArrayList<ItemData>(desc);
+         return new ArrayList<ItemData>(result);
       }
-
-      return retval;
    }
 
    /**
@@ -1641,36 +1647,43 @@
 
       // 2 get ALL persisted descendants
       Map<String, ItemData> descendants = new LinkedHashMap<String, ItemData>();
-      traverseStoredDescendants(rootData, dataManager, false, action, descendants, true, transientDescendants);
+      List<? extends ItemData> result = traverseStoredDescendants(rootData, dataManager, false, action, descendants, true, transientDescendants);
 
-      // merge data
-      for (ItemState state : transientDescendants)
+      if (deep || !transientDescendants.isEmpty())
       {
-         ItemData data = state.getData();
-         if (!state.isDeleted())
-            descendants.put(data.getIdentifier(), data);
+         // merge data
+         for (ItemState state : transientDescendants)
+         {
+            ItemData data = state.getData();
+            if (!state.isDeleted())
+               descendants.put(data.getIdentifier(), data);
+            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(mergeList(itemData, dataManager, true, action));
+            }
+         }
          else
-            descendants.remove(data.getIdentifier());
-      }
-      Collection<ItemData> desc = 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(mergeList(itemData, dataManager, true, action));
+            retval = new ArrayList<ItemData>(desc);
          }
+         return retval;         
       }
       else
       {
-         retval = new ArrayList<ItemData>(desc);
+         return new ArrayList<ItemData>(result);
       }
-      return retval;
    }
 
    /**
@@ -1683,50 +1696,81 @@
     * @param ret
     * @throws RepositoryException
     */
-   private void traverseStoredDescendants(ItemData parent, DataManager dataManager, boolean deep, int action,
+   private List<? extends ItemData> traverseStoredDescendants(ItemData parent, DataManager dataManager, boolean deep, 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);
-            for (NodeData childNode : childNodes)
+            if (deep || !transientDescendants.isEmpty())
             {
-               ret.put(childNode.getIdentifier(), childNode);
+               for (NodeData childNode : childNodes)
+               {
+                  ret.put(childNode.getIdentifier(), childNode);
 
-               if (log.isDebugEnabled())
-                  log.debug("Traverse stored (N) " + childNode.getQPath().getAsString());
+                  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);
+                  // TODO [PN] Not used
+                  if (deep)
+                     traverseStoredDescendants(childNode, dataManager, deep, action, ret, listOnly, transientDescendants);
+               }               
             }
+            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);
-            outer : for (PropertyData childProp : childProps)
+            if (deep || !transientDescendants.isEmpty())
             {
-               for (ItemState transientState : transientDescendants)
+               outer : for (PropertyData childProp : childProps)
                {
-                  if (!transientState.isNode() && !transientState.isDeleted()
-                     && transientState.getData().getQPath().getDepth() == childProp.getQPath().getDepth()
-                     && transientState.getData().getQPath().getName().equals(childProp.getQPath().getName()))
+                  for (ItemState transientState : transientDescendants)
                   {
-                     continue outer;
+                     if (!transientState.isNode() && !transientState.isDeleted()
+                        && transientState.getData().getQPath().getDepth() == childProp.getQPath().getDepth()
+                        && transientState.getData().getQPath().getName().equals(childProp.getQPath().getName()))
+                     {
+                        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;
+               }               
+            }
          }
+         return childItems;
       }
+      return null;
    }
 
    /**



More information about the exo-jcr-commits mailing list