Author: manik.surtani(a)jboss.com
Date: 2009-02-19 07:53:45 -0500 (Thu, 19 Feb 2009)
New Revision: 7730
Added:
core/trunk/src/test/java/org/jboss/cache/api/mvcc/GetChildrenNamesAfterRemoveTest.java
Modified:
core/trunk/src/main/java/org/jboss/cache/invocation/CacheInvocationDelegate.java
Log:
JBCACHE-1480 - getChildrenNames retrieves removed children in a transaction
Modified:
core/trunk/src/main/java/org/jboss/cache/invocation/CacheInvocationDelegate.java
===================================================================
---
core/trunk/src/main/java/org/jboss/cache/invocation/CacheInvocationDelegate.java 2009-02-19
12:48:29 UTC (rev 7729)
+++
core/trunk/src/main/java/org/jboss/cache/invocation/CacheInvocationDelegate.java 2009-02-19
12:53:45 UTC (rev 7730)
@@ -67,6 +67,7 @@
import java.util.List;
import java.util.Map;
import java.util.Set;
+import java.util.Iterator;
/**
* The delegate that users (and ChainedInterceptor authors) interact with when they
create a cache by using a cache factory.
@@ -627,6 +628,17 @@
cacheStatusCheck(ctx);
GetChildrenNamesCommand command =
commandsFactory.buildGetChildrenNamesCommand(fqn);
Set<Object> retval = (Set<Object>) invoker.invoke(ctx, command);
+
+ // this is needed to work around JBCACHE-1480
+ if (retval != null && !retval.isEmpty())
+ {
+ for (Iterator i = retval.iterator(); i.hasNext();)
+ {
+ Object child = getNode(Fqn.fromRelativeElements(fqn, i.next()));
+ if (child == null) i.remove();
+ }
+ }
+
if (retval != null)
{
retval = Immutables.immutableSetWrap(retval); // this is already copied in the
command
@@ -635,6 +647,7 @@
{
retval = Collections.emptySet();
}
+
return retval;
}
Added:
core/trunk/src/test/java/org/jboss/cache/api/mvcc/GetChildrenNamesAfterRemoveTest.java
===================================================================
---
core/trunk/src/test/java/org/jboss/cache/api/mvcc/GetChildrenNamesAfterRemoveTest.java
(rev 0)
+++
core/trunk/src/test/java/org/jboss/cache/api/mvcc/GetChildrenNamesAfterRemoveTest.java 2009-02-19
12:53:45 UTC (rev 7730)
@@ -0,0 +1,59 @@
+package org.jboss.cache.api.mvcc;
+
+import org.jboss.cache.AbstractSingleCacheTest;
+import org.jboss.cache.CacheSPI;
+import org.jboss.cache.Fqn;
+import org.jboss.cache.Node;
+import org.jboss.cache.UnitTestCacheFactory;
+import org.testng.annotations.Test;
+
+import javax.transaction.TransactionManager;
+import java.util.Collections;
+import java.util.Set;
+
+@Test(groups = {"functional", "mvcc"}, sequential = true, testName =
"api.mvcc.GetChildrenNamesAfterRemoveTest")
+public class GetChildrenNamesAfterRemoveTest extends AbstractSingleCacheTest
+{
+ private CacheSPI<String, String> cache;
+
+ public CacheSPI createCache()
+ {
+ // start a single cache instance
+ UnitTestCacheFactory<String, String> cf = new UnitTestCacheFactory<String,
String>();
+ cache = (CacheSPI<String, String>)
cf.createCache("configs/local-tx.xml", false, getClass());
+ cache.getConfiguration().setEvictionConfig(null);
+ cache.start();
+ return cache;
+ }
+
+ public void testRemove() throws Exception
+ {
+ TransactionManager tm = cache.getTransactionManager();
+ Fqn<String> testFqn = Fqn.fromElements("test1");
+
+ tm.begin();
+ assertEmpty(testFqn);
+ cache.put(testFqn, "x", "x");
+ assertNotEmpty(testFqn);
+ cache.removeNode(testFqn);
+ assertEmpty(testFqn);
+ tm.commit();
+ assertEmpty(testFqn);
+ }
+
+ private void assertNotEmpty(Fqn<String> testFqn)
+ {
+ Set<Node<String, String>> children =
cache.getNode(testFqn.getParent()).getChildren();
+ assert !children.isEmpty() : "Node " + testFqn + " should not be a
leaf, but getChildren() returns: " + children;
+ Set<Object> childrenNames =
cache.getNode(testFqn.getParent()).getChildrenNames();
+ assert childrenNames.equals(Collections.singleton(testFqn.getLastElement())) :
"Retrieving children names on " + testFqn + " should return test1 but is:
" + childrenNames;
+ }
+
+ private void assertEmpty(Fqn<String> testFqn)
+ {
+ Set<Node<String, String>> children =
cache.getNode(testFqn.getParent()).getChildren();
+ assert children.isEmpty() : "Children should be empty but is " +
children;
+ Set<Object> childrenNames =
cache.getNode(testFqn.getParent()).getChildrenNames();
+ assert childrenNames.isEmpty() : "Children names should be empty but is "
+ childrenNames;
+ }
+}
Show replies by date