[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