[exo-jcr-commits] exo-jcr SVN: r2227 - in jcr/trunk/exo.jcr.component.core/src: test/java/org/exoplatform/services/jcr/api/writing and 1 other directory.

do-not-reply at jboss.org do-not-reply at jboss.org
Thu Apr 8 07:10:26 EDT 2010


Author: sergiykarpenko
Date: 2010-04-08 07:10:25 -0400 (Thu, 08 Apr 2010)
New Revision: 2227

Modified:
   jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/dataflow/persistent/jbosscache/BufferedJBossCache.java
   jcr/trunk/exo.jcr.component.core/src/test/java/org/exoplatform/services/jcr/api/writing/TestOrderBefore.java
Log:
EXOJCR-618: BufferedJBossCache.getObjectFromChangesContainer optimized.

Modified: jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/dataflow/persistent/jbosscache/BufferedJBossCache.java
===================================================================
--- jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/dataflow/persistent/jbosscache/BufferedJBossCache.java	2010-04-08 10:52:32 UTC (rev 2226)
+++ jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/dataflow/persistent/jbosscache/BufferedJBossCache.java	2010-04-08 11:10:25 UTC (rev 2227)
@@ -18,20 +18,8 @@
  */
 package org.exoplatform.services.jcr.impl.dataflow.persistent.jbosscache;
 
-import java.io.Serializable;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-
-import javax.transaction.TransactionManager;
-
-import org.exoplatform.services.jcr.impl.dataflow.persistent.jbosscache.ChangesContainerFactory.AddToListContainer;
 import org.exoplatform.services.jcr.impl.dataflow.persistent.jbosscache.ChangesContainerFactory.ChangesContainer;
 import org.exoplatform.services.jcr.impl.dataflow.persistent.jbosscache.ChangesContainerFactory.PutKeyValueContainer;
-import org.exoplatform.services.jcr.impl.dataflow.persistent.jbosscache.ChangesContainerFactory.PutObjectContainer;
-import org.exoplatform.services.jcr.impl.dataflow.persistent.jbosscache.ChangesContainerFactory.RemoveFromListContainer;
-import org.exoplatform.services.jcr.impl.dataflow.persistent.jbosscache.ChangesContainerFactory.RemoveKeyContainer;
-import org.exoplatform.services.jcr.impl.dataflow.persistent.jbosscache.ChangesContainerFactory.RemoveNodeContainer;
 import org.exoplatform.services.log.ExoLogger;
 import org.exoplatform.services.log.Log;
 import org.jboss.cache.Cache;
@@ -47,6 +35,16 @@
 import org.jboss.cache.interceptors.base.CommandInterceptor;
 import org.jgroups.Address;
 
+import java.io.Serializable;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.Comparator;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
+import javax.transaction.TransactionManager;
+
 /**
  * Decorator over the JBossCache that stores changes in buffer, then sorts and applies to JBossCache.
  * 
@@ -61,11 +59,25 @@
     * Parent cache.
     */
    private final Cache<Serializable, Object> parentCache;
-   
+
    private final ChangesContainerFactory changesContatinerFactory;
 
    private final ThreadLocal<CompressedChangesBuffer> changesList = new ThreadLocal<CompressedChangesBuffer>();
 
+   /**
+    * This comparator sorts CahangesContainer collection in descending mode.
+    */
+   private final Comparator<ChangesContainer> changesComparator = new Comparator<ChangesContainer>()
+   {
+
+      public int compare(ChangesContainer o1, ChangesContainer o2)
+      {
+         int result = o1.getFqn().compareTo(o2.getFqn());
+         return result == 0 ? o2.getHistoricalIndex() - o1.getHistoricalIndex() : result;
+      }
+
+   };
+
    private ThreadLocal<Boolean> local = new ThreadLocal<Boolean>();
 
    protected static final Log LOG =
@@ -457,8 +469,8 @@
    public void put(Fqn fqn, Map<? extends Serializable, ? extends Object> data)
    {
       CompressedChangesBuffer changesContainer = getChangesBufferSafe();
-      changesContainer.add(changesContatinerFactory.createPutObjectContainer(fqn, data, parentCache, changesContainer.getHistoryIndex(), local
-               .get()));
+      changesContainer.add(changesContatinerFactory.createPutObjectContainer(fqn, data, parentCache, changesContainer
+         .getHistoryIndex(), local.get()));
    }
 
    /* (non-Javadoc)
@@ -467,8 +479,8 @@
    public Object put(Fqn fqn, Serializable key, Object value)
    {
       CompressedChangesBuffer changesContainer = getChangesBufferSafe();
-      changesContainer.add(changesContatinerFactory.createPutKeyValueContainer(fqn, key, value, parentCache, changesContainer.getHistoryIndex(),
-               local.get()));
+      changesContainer.add(changesContatinerFactory.createPutKeyValueContainer(fqn, key, value, parentCache,
+         changesContainer.getHistoryIndex(), local.get()));
 
       return parentCache.get(fqn, key);
    }
@@ -480,8 +492,8 @@
       // take Object from buffer for first 
       Object prevObject = getObjectFromChangesContainer(changesContainer, fqn, key);
 
-      changesContainer.add(changesContatinerFactory.createPutKeyValueContainer(fqn, key, value, parentCache, changesContainer.getHistoryIndex(),
-         local.get()));
+      changesContainer.add(changesContatinerFactory.createPutKeyValueContainer(fqn, key, value, parentCache,
+         changesContainer.getHistoryIndex(), local.get()));
 
       if (prevObject != null)
       {
@@ -495,16 +507,50 @@
 
    private Object getObjectFromChangesContainer(CompressedChangesBuffer changesContainer, Fqn fqn, Serializable key)
    {
-      List<ChangesContainer> changes = changesContainer.getSortedList();
+      //      List<ChangesContainer> changes = changesContainer.getSortedList();
+      //      Object object = null;
+      //      for (ChangesContainer change : changes)
+      //      {
+      //         if (change.getChangesType().equals(ChangesType.PUT_KEY) && change.getFqn().equals(fqn))
+      //         {
+      //            PutKeyValueContainer cont = ((PutKeyValueContainer)change);
+      //            if (cont.getKey().equals(key))
+      //            {
+      //               object = ((PutKeyValueContainer)change).getValue();
+      //            }
+      //         }
+      //      }
+      //
+      //      return object;
+
+      List<ChangesContainer> changesContainers = new ArrayList<ChangesContainer>();
+      String parentCacheNode = (String)fqn.get(0);
+      if (JBossCacheWorkspaceStorageCache.CHILD_NODES.equals(parentCacheNode) && fqn.size() > 1)
+      {
+         changesContainers.addAll(changesContainer.childNodesMap.get(fqn.get(1)));
+      }
+      else if (JBossCacheWorkspaceStorageCache.CHILD_PROPS.equals(parentCacheNode) && fqn.size() > 1)
+      {
+         changesContainers.addAll(changesContainer.childPropertyMap.get(fqn.get(1)));
+      }
+      else
+      {
+         changesContainers.addAll(changesContainer.changes);
+      }
+
+      // sort changes in descending mode 
+      Collections.sort(changesContainers, changesComparator);
+
       Object object = null;
-      for (ChangesContainer change : changes)
+      for (ChangesContainer change : changesContainers)
       {
          if (change.getChangesType().equals(ChangesType.PUT_KEY) && change.getFqn().equals(fqn))
          {
             PutKeyValueContainer cont = ((PutKeyValueContainer)change);
-            if (cont.getKey().equals(key))
+            if (cont.key.equals(key))
             {
-               object = ((PutKeyValueContainer)change).getValue();
+               object = ((PutKeyValueContainer)change).value;
+               break;
             }
          }
       }
@@ -543,8 +589,8 @@
    public Object remove(Fqn fqn, Serializable key)
    {
       CompressedChangesBuffer changesContainer = getChangesBufferSafe();
-      changesContainer.add(changesContatinerFactory.createRemoveKeyContainer(fqn, key, parentCache, changesContainer.getHistoryIndex(), local
-         .get()));
+      changesContainer.add(changesContatinerFactory.createRemoveKeyContainer(fqn, key, parentCache, changesContainer
+         .getHistoryIndex(), local.get()));
       return parentCache.get(fqn, key);
    }
 
@@ -586,7 +632,8 @@
    public boolean removeNode(Fqn fqn)
    {
       CompressedChangesBuffer changesContainer = getChangesBufferSafe();
-      changesContainer.add(changesContatinerFactory.createRemoveNodeContainer(fqn, parentCache, changesContainer.getHistoryIndex(), local.get()));
+      changesContainer.add(changesContatinerFactory.createRemoveNodeContainer(fqn, parentCache, changesContainer
+         .getHistoryIndex(), local.get()));
       return true;
    }
 
@@ -654,8 +701,8 @@
    public void addToList(Fqn fqn, String key, Object value)
    {
       CompressedChangesBuffer changesContainer = getChangesBufferSafe();
-      changesContainer.add(changesContatinerFactory.createAddToListContainer(fqn, key, value, parentCache, changesContainer.getHistoryIndex(),
-         local.get()));
+      changesContainer.add(changesContatinerFactory.createAddToListContainer(fqn, key, value, parentCache,
+         changesContainer.getHistoryIndex(), local.get()));
    }
 
    /**

Modified: jcr/trunk/exo.jcr.component.core/src/test/java/org/exoplatform/services/jcr/api/writing/TestOrderBefore.java
===================================================================
--- jcr/trunk/exo.jcr.component.core/src/test/java/org/exoplatform/services/jcr/api/writing/TestOrderBefore.java	2010-04-08 10:52:32 UTC (rev 2226)
+++ jcr/trunk/exo.jcr.component.core/src/test/java/org/exoplatform/services/jcr/api/writing/TestOrderBefore.java	2010-04-08 11:10:25 UTC (rev 2227)
@@ -19,6 +19,7 @@
 package org.exoplatform.services.jcr.api.writing;
 
 import org.exoplatform.services.jcr.JcrAPIBaseTest;
+import org.exoplatform.services.jcr.impl.core.NodeImpl;
 import org.exoplatform.services.jcr.impl.util.EntityCollection;
 
 import java.util.ArrayList;
@@ -975,10 +976,14 @@
 
       session = repository.login(credentials, "ws");
       Node a = session.getRootNode().getNode("a"); // We suppose it already exist
-      a.addNode("n");
-      a.addNode("n");
-      a.addNode("n");
-      a.addNode("n");
+      NodeImpl n1 = (NodeImpl)a.addNode("n");
+      NodeImpl n2 = (NodeImpl)a.addNode("n");
+      NodeImpl n3 = (NodeImpl)a.addNode("n");
+      NodeImpl n4 = (NodeImpl)a.addNode("n");
+      NodeImpl n5 = (NodeImpl)a.addNode("n");
+      NodeImpl n6 = (NodeImpl)a.addNode("n");
+      NodeImpl n7 = (NodeImpl)a.addNode("n");
+
       session.save();
       session.logout();
 
@@ -988,14 +993,30 @@
       i.nextNode().remove();
       i.nextNode().remove();
       i.nextNode().remove();
+      i.nextNode().remove();
+      i.nextNode().remove();
+      i.nextNode().remove();
       session.save();
       session.logout();
 
       session = repository.login(credentials, "ws");
+
+      NodeImpl n = (NodeImpl)a.getNode("n");
+      assertEquals(n7.getData().getIdentifier(), n.getData().getIdentifier());
+
+      n = (NodeImpl)a.getNode("n[1]");
+      assertEquals(n7.getData().getIdentifier(), n.getData().getIdentifier());
+
       a = session.getRootNode().getNode("a");
-      a.addNode("n");
+      NodeImpl nOrd = (NodeImpl)a.addNode("n");
       a.orderBefore("n", null); // NPE happens here
       session.save();
+
+      n = (NodeImpl)a.getNode("n[1]");
+      assertEquals(n7.getData().getIdentifier(), n.getData().getIdentifier());
+
+      n = (NodeImpl)a.getNode("n[2]");
+      assertEquals(nOrd.getData().getIdentifier(), n.getData().getIdentifier());
    }
 
    public void testDeleteOrderBefore_SNS() throws Exception



More information about the exo-jcr-commits mailing list