From jbosscache-commits at lists.jboss.org Thu Feb 19 07:47:57 2009 Content-Type: multipart/mixed; boundary="===============0044576925880286601==" MIME-Version: 1.0 From: jbosscache-commits at lists.jboss.org To: jbosscache-commits at lists.jboss.org Subject: [jbosscache-commits] JBoss Cache SVN: r7728 - in core/branches/3.0.X/src: test/java/org/jboss/cache/api/mvcc and 1 other directory. Date: Thu, 19 Feb 2009 07:47:56 -0500 Message-ID: --===============0044576925880286601== Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Author: manik.surtani(a)jboss.com Date: 2009-02-19 07:47:56 -0500 (Thu, 19 Feb 2009) New Revision: 7728 Added: core/branches/3.0.X/src/test/java/org/jboss/cache/api/mvcc/GetChildrenNa= mesAfterRemoveTest.java Modified: core/branches/3.0.X/src/main/java/org/jboss/cache/invocation/CacheInvoca= tionDelegate.java Log: JBCACHE-1480 - getChildrenNames retrieves removed children in a transaction Modified: core/branches/3.0.X/src/main/java/org/jboss/cache/invocation/Cach= eInvocationDelegate.java =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D --- core/branches/3.0.X/src/main/java/org/jboss/cache/invocation/CacheInvoc= ationDelegate.java 2009-02-19 12:03:50 UTC (rev 7727) +++ core/branches/3.0.X/src/main/java/org/jboss/cache/invocation/CacheInvoc= ationDelegate.java 2009-02-19 12:47:56 UTC (rev 7728) @@ -64,20 +64,20 @@ import javax.transaction.Transaction; import javax.transaction.TransactionManager; import java.util.Collections; +import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.Set; = /** - * The delegate that users (and ChainedInterceptor authors) interact with = when they create a cache by using a cache factory. - * This wrapper delegates calls down the interceptor chain. + * The delegate that users (and ChainedInterceptor authors) interact with = when they create a cache by using a cache + * factory. This wrapper delegates calls down the interceptor chain. * * @author Manik Surtani (manik = AT jboss DOT org) * @since 2.1.0 */ @NonVolatile -public class CacheInvocationDelegate extends AbstractInvocationDeleg= ate implements CacheSPI -{ +public class CacheInvocationDelegate extends AbstractInvocationDeleg= ate implements CacheSPI { private static final Log log =3D LogFactory.getLog(CacheInvocationDeleg= ate.class); = // this stuff is needed since the SPI has methods to retrieve these. @@ -100,8 +100,7 @@ public void initialize(StateTransferManager stateTransferManager, Cache= LoaderManager cacheLoaderManager, Notifier notifier, TransactionManager transactionManager, BuddyMana= ger buddyManager, TransactionTable transactionTable, RPCManager rpcManager, RegionManager regionManag= er, Marshaller marshaller, - CommandsFactory commandsFactory, DataContainer d= ataContainer, MVCCNodeHelper mvccHelper, BatchContainer batchContainer) - { + CommandsFactory commandsFactory, DataContainer d= ataContainer, MVCCNodeHelper mvccHelper, BatchContainer batchContainer) { this.stateTransferManager =3D stateTransferManager; this.cacheLoaderManager =3D cacheLoaderManager; this.notifier =3D notifier; @@ -118,13 +117,11 @@ } = @Start - void setNodeLockingScheme() - { + void setNodeLockingScheme() { usingMvcc =3D configuration.getNodeLockingScheme() =3D=3D NodeLockin= gScheme.MVCC; } = - private void reset() - { + private void reset() { this.usingMvcc =3D false; this.stateTransferManager =3D null; this.cacheLoaderManager =3D null; @@ -138,156 +135,125 @@ } = @Override - public String toString() - { + public String toString() { return dataContainer =3D=3D null ? super.toString() : dataContainer.= toString(); } = - public Configuration getConfiguration() - { + public Configuration getConfiguration() { return configuration; } = - public NodeSPI getRoot() - { + public NodeSPI getRoot() { return getNode(Fqn.ROOT); } = - public TransactionManager getTransactionManager() - { + public TransactionManager getTransactionManager() { return transactionManager; } = - public void addInterceptor(CommandInterceptor i, int position) - { + public void addInterceptor(CommandInterceptor i, int position) { invoker.addInterceptor(i, position); } = - public void addInterceptor(CommandInterceptor i, Class afterInterceptor) - { + public void addInterceptor(CommandInterceptor i, Class afterInterceptor) { invoker.addAfterInterceptor(i, afterInterceptor); } = - public List getInterceptorChain() - { + public List getInterceptorChain() { return invoker.asList(); } = - public void removeInterceptor(int position) - { + public void removeInterceptor(int position) { invoker.removeInterceptor(position); } = - public void removeInterceptor(Class inter= ceptorType) - { + public void removeInterceptor(Class inter= ceptorType) { invoker.removeInterceptor(interceptorType); } = - public CacheLoaderManager getCacheLoaderManager() - { + public CacheLoaderManager getCacheLoaderManager() { return cacheLoaderManager; } = - public BuddyManager getBuddyManager() - { + public BuddyManager getBuddyManager() { return buddyManager; } = - public TransactionTable getTransactionTable() - { + public TransactionTable getTransactionTable() { return transactionTable; } = - public RPCManager getRPCManager() - { + public RPCManager getRPCManager() { return rpcManager; } = - public StateTransferManager getStateTransferManager() - { + public StateTransferManager getStateTransferManager() { return stateTransferManager; } = - public String getClusterName() - { + public String getClusterName() { return configuration.getClusterName(); } = - public int getNumberOfAttributes() - { + public int getNumberOfAttributes() { return dataContainer.getNumberOfAttributes(); } = - public int getNumberOfNodes() - { + public int getNumberOfNodes() { return dataContainer.getNumberOfNodes(); } = - public RegionManager getRegionManager() - { + public RegionManager getRegionManager() { return regionManager; } = - public GlobalTransaction getCurrentTransaction(Transaction tx, boolean = createIfNotExists) - { + public GlobalTransaction getCurrentTransaction(Transaction tx, boolean = createIfNotExists) { return transactionTable.getCurrentTransaction(tx, createIfNotExists); } = - public GlobalTransaction getCurrentTransaction() - { + public GlobalTransaction getCurrentTransaction() { return transactionTable.getCurrentTransaction(); } = - public Set getInternalFqns() - { + public Set getInternalFqns() { return dataContainer.getInternalFqns(); } = - public int getNumberOfLocksHeld() - { + public int getNumberOfLocksHeld() { return dataContainer.getNumberOfLocksHeld(); } = - public boolean exists(String fqn) - { + public boolean exists(String fqn) { return exists(Fqn.fromString(fqn)); } = - public boolean exists(Fqn fqn) - { - if (usingMvcc) - { + public boolean exists(Fqn fqn) { + if (usingMvcc) { InvocationContext ctx =3D invocationContextContainer.get(); cacheStatusCheck(ctx); ExistsCommand command =3D commandsFactory.buildExistsNodeCommand(= fqn); return (Boolean) invoker.invoke(ctx, command); - } - else - { + } else { return peek(fqn, false) !=3D null; } } = - public Notifier getNotifier() - { + public Notifier getNotifier() { return notifier; } = - public Marshaller getMarshaller() - { + public Marshaller getMarshaller() { return marshaller; } = - public GravitateResult gravitateData(Fqn fqn, boolean searchBuddyBackup= Subtrees, InvocationContext ctx) - { + public GravitateResult gravitateData(Fqn fqn, boolean searchBuddyBackup= Subtrees, InvocationContext ctx) { cacheStatusCheck(ctx); GravitateDataCommand command =3D commandsFactory.buildGravitateDataC= ommand(fqn, searchBuddyBackupSubtrees); return (GravitateResult) invoker.invoke(ctx, command); } = @SuppressWarnings("unchecked") - public NodeSPI peek(Fqn fqn, boolean includeDeletedNodes, boolean= includeInvalidNodes) - { + public NodeSPI peek(Fqn fqn, boolean includeDeletedNodes, boolean= includeInvalidNodes) { // TODO: clean this up somehow! Anyway, this method should NOT be u= sed outside of testing frameworks. return (usingMvcc) ? mvccPeek(fqn) @@ -295,8 +261,7 @@ } = @SuppressWarnings("unchecked") - public NodeSPI peek(Fqn fqn, boolean includeDeletedNodes) - { + public NodeSPI peek(Fqn fqn, boolean includeDeletedNodes) { // TODO: clean this up somehow! Anyway, this method should NOT be u= sed outside of testing frameworks. return (usingMvcc) ? mvccPeek(fqn) @@ -304,124 +269,100 @@ } = @SuppressWarnings("unchecked") - private NodeSPI mvccPeek(Fqn f) - { + private NodeSPI mvccPeek(Fqn f) { NodeSPI n; - try - { + try { n =3D mvccHelper.wrapNodeForReading(getInvocationContext(), f, fa= lse); } - catch (InterruptedException e) - { + catch (InterruptedException e) { throw new CacheException(e); } if (n =3D=3D null || n.isNullNode()) return null; return n; } = - public void addCacheListener(Object listener) - { + public void addCacheListener(Object listener) { notifier.addCacheListener(listener); } = - public void removeCacheListener(Object listener) - { + public void removeCacheListener(Object listener) { notifier.removeCacheListener(listener); } = - public Set getCacheListeners() - { + public Set getCacheListeners() { return notifier.getCacheListeners(); } = - public void create() throws CacheException - { + public void create() throws CacheException { componentRegistry.create(); } = - public void start() throws CacheException - { + public void start() throws CacheException { componentRegistry.start(); } = - public void stop() - { + public void stop() { componentRegistry.stop(); } = - public void destroy() - { + public void destroy() { reset(); componentRegistry.destroy(); } = - public CacheStatus getCacheStatus() - { + public CacheStatus getCacheStatus() { return componentRegistry.getState(); } = - public InvocationContext getInvocationContext() - { + public InvocationContext getInvocationContext() { assertIsConstructed(); return invocationContextContainer.get(); } = - public void setInvocationContext(InvocationContext ctx) - { + public void setInvocationContext(InvocationContext ctx) { assertIsConstructed(); // assume a null ctx is meant to "un-set" the context? - if (ctx =3D=3D null) - { + if (ctx =3D=3D null) { invocationContextContainer.remove(); - } - else - { + } else { invocationContextContainer.set(ctx); } } = - public Address getLocalAddress() - { + public Address getLocalAddress() { if (rpcManager =3D=3D null) return null; return rpcManager.getLocalAddress(); } = - public List
getMembers() - { + public List
getMembers() { if (rpcManager =3D=3D null) return null; return rpcManager.getMembers(); } = - public String getVersion() - { + public String getVersion() { return Version.printVersion(); } = - public void move(Fqn nodeToMove, Fqn newParent) throws NodeNotExistsExc= eption - { + public void move(Fqn nodeToMove, Fqn newParent) throws NodeNotExistsExc= eption { InvocationContext ctx =3D invocationContextContainer.get(); cacheStatusCheck(ctx); MoveCommand command =3D commandsFactory.buildMoveCommand(nodeToMove,= newParent); invoker.invoke(ctx, command); } = - public void move(String nodeToMove, String newParent) throws NodeNotExi= stsException - { + public void move(String nodeToMove, String newParent) throws NodeNotExi= stsException { move(Fqn.fromString(nodeToMove), Fqn.fromString(newParent)); } = - public boolean removeRegion(Fqn fqn) - { + public boolean removeRegion(Fqn fqn) { return regionManager.removeRegion(fqn); } = - public Region getRegion(Fqn fqn, boolean createIfAbsent) - { + public Region getRegion(Fqn fqn, boolean createIfAbsent) { return regionManager.getRegion(fqn, createIfAbsent); } = - public void evict(Fqn fqn, boolean recursive) - { + public void evict(Fqn fqn, boolean recursive) { InvocationContext ctx =3D invocationContextContainer.get(); cacheStatusCheck(ctx); EvictCommand c =3D commandsFactory.buildEvictFqnCommand(fqn); @@ -429,47 +370,38 @@ invoker.invoke(ctx, c); } = - public void evict(Fqn fqn) - { + public void evict(Fqn fqn) { evict(fqn, false); } = @SuppressWarnings("unchecked") - public V get(Fqn fqn, K key) - { + public V get(Fqn fqn, K key) { InvocationContext ctx =3D invocationContextContainer.get(); cacheStatusCheck(ctx); GetKeyValueCommand command =3D commandsFactory.buildGetKeyValueComma= nd(fqn, key, true); return (V) invoker.invoke(ctx, command); } = - public V get(String fqn, K key) - { + public V get(String fqn, K key) { return get(Fqn.fromString(fqn), key); } = - public boolean removeNode(Fqn fqn) - { + public boolean removeNode(Fqn fqn) { // special case if we are removing the root. Remove all children in= stead. - if (fqn.isRoot()) - { + if (fqn.isRoot()) { boolean result =3D true; // we need to preserve options InvocationContext ctx =3D getInvocationContext(); Option o =3D ctx.getOptionOverrides(); Set internalFqns =3D getInternalFqns(); - for (Object childName : peek(fqn, false, false).getChildrenNames(= )) - { - if (!internalFqns.contains(Fqn.fromElements(childName))) - { + for (Object childName : peek(fqn, false, false).getChildrenNames(= )) { + if (!internalFqns.contains(Fqn.fromElements(childName))) { ctx.setOptionOverrides(o); result =3D removeNode(Fqn.fromRelativeElements(fqn, childNa= me)) && result; } } return result; - } - else - { + } else { InvocationContext ctx =3D invocationContextContainer.get(); cacheStatusCheck(ctx); GlobalTransaction tx =3D transactionTable.getCurrentTransaction(); @@ -479,28 +411,24 @@ } } = - public boolean removeNode(String fqn) - { + public boolean removeNode(String fqn) { return removeNode(Fqn.fromString(fqn)); } = @SuppressWarnings("unchecked") - public NodeSPI getNode(Fqn fqn) - { + public NodeSPI getNode(Fqn fqn) { InvocationContext ctx =3D invocationContextContainer.get(); cacheStatusCheck(ctx); GetNodeCommand command =3D commandsFactory.buildGetNodeCommand(fqn); return (NodeSPI) invoker.invoke(ctx, command); } = - public NodeSPI getNode(String fqn) - { + public NodeSPI getNode(String fqn) { return getNode(Fqn.fromString(fqn)); } = @SuppressWarnings("unchecked") - public V remove(Fqn fqn, K key) throws CacheException - { + public V remove(Fqn fqn, K key) throws CacheException { InvocationContext ctx =3D invocationContextContainer.get(); cacheStatusCheck(ctx); GlobalTransaction tx =3D transactionTable.getCurrentTransaction(); @@ -508,45 +436,36 @@ return (V) invoker.invoke(ctx, command); } = - public V remove(String fqn, K key) - { + public V remove(String fqn, K key) { return remove(Fqn.fromString(fqn), key); } = - public void put(Fqn fqn, Map data) - { + public void put(Fqn fqn, Map data) { invokePut(fqn, data, false); } = - public void put(String fqn, Map data) - { + public void put(String fqn, Map data) { put(Fqn.fromString(fqn), data); } = - public void putForExternalRead(Fqn fqn, K key, V value) - { + public void putForExternalRead(Fqn fqn, K key, V value) { InvocationContext ctx =3D invocationContextContainer.get(); cacheStatusCheck(ctx); // if the node exists then this should be a no-op. - if (peek(fqn, false, false) =3D=3D null) - { + if (peek(fqn, false, false) =3D=3D null) { getInvocationContext().getOptionOverrides().setFailSilently(true); getInvocationContext().getOptionOverrides().setForceAsynchronous(= true); PutForExternalReadCommand command =3D commandsFactory.buildPutFor= ExternalReadCommand(null, fqn, key, value); invoker.invoke(ctx, command); - } - else - { - if (log.isDebugEnabled()) - { + } else { + if (log.isDebugEnabled()) { log.debug("putForExternalRead() called with Fqn " + fqn + " an= d this node already exists. This method is hence a no op."); } } } = @SuppressWarnings("unchecked") - public V put(Fqn fqn, K key, V value) - { + public V put(Fqn fqn, K key, V value) { InvocationContext ctx =3D invocationContextContainer.get(); cacheStatusCheck(ctx); GlobalTransaction tx =3D transactionTable.getCurrentTransaction(); @@ -554,29 +473,25 @@ return (V) invoker.invoke(ctx, command); } = - public V put(String fqn, K key, V value) - { + public V put(String fqn, K key, V value) { return put(Fqn.fromString(fqn), key, value); } = = @SuppressWarnings("unchecked") - public Map getData(Fqn fqn) - { + public Map getData(Fqn fqn) { InvocationContext ctx =3D invocationContextContainer.get(); cacheStatusCheck(ctx); GetDataMapCommand command =3D commandsFactory.buildGetDataMapCommand= (fqn); return (Map) invoker.invoke(ctx, command); } = - public Set getKeys(String fqn) - { + public Set getKeys(String fqn) { return getKeys(Fqn.fromString(fqn)); } = @SuppressWarnings("unchecked") - public Set getKeys(Fqn fqn) - { + public Set getKeys(Fqn fqn) { InvocationContext ctx =3D invocationContextContainer.get(); cacheStatusCheck(ctx); GetKeysCommand command =3D commandsFactory.buildGetKeysCommand(fqn); @@ -586,85 +501,79 @@ /** * Removes the keys and properties from a node. */ - public void clearData(String fqn) throws CacheException - { + public void clearData(String fqn) throws CacheException { clearData(Fqn.fromString(fqn)); } = /** * Removes the keys and properties from a named node. */ - public void clearData(Fqn fqn) - { + public void clearData(Fqn fqn) { InvocationContext ctx =3D invocationContextContainer.get(); cacheStatusCheck(ctx); GlobalTransaction tx =3D getCurrentTransaction(); invoker.invoke(ctx, commandsFactory.buildClearDataCommand(tx, fqn)); } = - public void startBatch() - { - if (!configuration.isInvocationBatchingEnabled()) - { + public void startBatch() { + if (!configuration.isInvocationBatchingEnabled()) { throw new ConfigurationException("Invocation batching not enabled= in current configuration! Please use the element."= ); } batchContainer.startBatch(); } = - public void endBatch(boolean successful) - { - if (!configuration.isInvocationBatchingEnabled()) - { + public void endBatch(boolean successful) { + if (!configuration.isInvocationBatchingEnabled()) { throw new ConfigurationException("Invocation batching not enabled= in current configuration! Please use the element."= ); } batchContainer.endBatch(successful); } = @SuppressWarnings("unchecked") - public Set getChildrenNames(Fqn fqn) - { + public Set getChildrenNames(Fqn fqn) { InvocationContext ctx =3D invocationContextContainer.get(); cacheStatusCheck(ctx); GetChildrenNamesCommand command =3D commandsFactory.buildGetChildren= NamesCommand(fqn); Set retval =3D (Set) invoker.invoke(ctx, command); - if (retval !=3D null) - { - retval =3D Immutables.immutableSetWrap(retval); // this is alread= y copied in the command + + // this is needed to work around JBCACHE-1480 + if (retval !=3D null && !retval.isEmpty()) { + for (Iterator i =3D retval.iterator(); i.hasNext();) { + Object child =3D getNode(Fqn.fromRelativeElements(fqn, i.next(= ))); + if (child =3D=3D null) i.remove(); + } } - else - { + + if (retval !=3D null) { + retval =3D Immutables.immutableSetWrap(retval); // this is alread= y copied in the command + } else { retval =3D Collections.emptySet(); } + return retval; } = @SuppressWarnings("unchecked") - public Set getChildrenNames(String fqn) - { + public Set getChildrenNames(String fqn) { return (Set) getChildrenNames(Fqn.fromString(fqn)); } = - public ComponentRegistry getComponentRegistry() - { + public ComponentRegistry getComponentRegistry() { return componentRegistry; } = - public DataContainer getDataContainer() - { + public DataContainer getDataContainer() { return dataContainer; } = - protected void cacheStatusCheck(InvocationContext ctx) - { + protected void cacheStatusCheck(InvocationContext ctx) { assertIsConstructed(); - if (!ctx.getOptionOverrides().isSkipCacheStatusCheck() && !component= Registry.invocationsAllowed(true)) - { + if (!ctx.getOptionOverrides().isSkipCacheStatusCheck() && !component= Registry.invocationsAllowed(true)) { throw new IllegalStateException("Cache not in STARTED state!"); } } = - private void invokePut(Fqn fqn, Map data, boo= lean erase) - { + private void invokePut(Fqn fqn, Map data, boo= lean erase) { InvocationContext ctx =3D invocationContextContainer.get(); cacheStatusCheck(ctx); PutDataMapCommand command =3D commandsFactory.buildPutDataMapCommand= (null, fqn, data); @@ -674,13 +583,11 @@ = = // TODO: Add these to the public interface in 3.1.0. - public void setData(Fqn fqn, Map data) - { + public void setData(Fqn fqn, Map data) { invokePut(fqn, data, true); } = - public void setData(String fqn, Map data) - { + public void setData(String fqn, Map data) { setData(Fqn.fromString(fqn), data); } } Added: core/branches/3.0.X/src/test/java/org/jboss/cache/api/mvcc/GetChildr= enNamesAfterRemoveTest.java =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D --- core/branches/3.0.X/src/test/java/org/jboss/cache/api/mvcc/GetChildrenN= amesAfterRemoveTest.java (rev 0) +++ core/branches/3.0.X/src/test/java/org/jboss/cache/api/mvcc/GetChildrenN= amesAfterRemoveTest.java 2009-02-19 12:47:56 UTC (rev 7728) @@ -0,0 +1,54 @@ +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; + +(a)Test(groups =3D {"functional", "mvcc"}, sequential =3D true, testName = =3D "api.mvcc.GetChildrenNamesAfterRemoveTest") +public class GetChildrenNamesAfterRemoveTest extends AbstractSingleCacheTe= st { + private CacheSPI cache; + + public CacheSPI createCache() { + // start a single cache instance + UnitTestCacheFactory cf =3D new UnitTestCacheFactory= (); + cache =3D (CacheSPI) cf.createCache("configs/local-t= x.xml", false, getClass()); + cache.getConfiguration().setEvictionConfig(null); + cache.start(); + return cache; + } + + public void testRemove() throws Exception { + TransactionManager tm =3D cache.getTransactionManager(); + Fqn testFqn =3D 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 testFqn) { + Set> children =3D cache.getNode(testFqn.getPare= nt()).getChildren(); + assert !children.isEmpty() : "Node " + testFqn + " should not be a l= eaf, but getChildren() returns: " + children; + Set childrenNames =3D cache.getNode(testFqn.getParent()).get= ChildrenNames(); + assert childrenNames.equals(Collections.singleton(testFqn.getLastEle= ment())) : "Retrieving children names on " + testFqn + " should return test= 1 but is: " + childrenNames; + } + + private void assertEmpty(Fqn testFqn) { + Set> children =3D cache.getNode(testFqn.getPare= nt()).getChildren(); + assert children.isEmpty() : "Children should be empty but is " + chi= ldren; + Set childrenNames =3D cache.getNode(testFqn.getParent()).get= ChildrenNames(); + assert childrenNames.isEmpty() : "Children names should be empty but= is " + childrenNames; + } +} --===============0044576925880286601==--