From 9858091c200d4a7b18a6f60314aff0369b49e4f4 Mon Sep 17 00:00:00 2001 From: hns Date: Tue, 20 Nov 2007 09:37:39 +0000 Subject: [PATCH] * Make sure child objects removed via removeChild() are not accessible anymore from that collection. Fixes bug 551 --- src/helma/objectmodel/db/Node.java | 12 +++++++++--- src/helma/objectmodel/db/NodeManager.java | 4 ++++ src/helma/objectmodel/db/Transactor.java | 8 ++++++++ 3 files changed, 21 insertions(+), 3 deletions(-) diff --git a/src/helma/objectmodel/db/Node.java b/src/helma/objectmodel/db/Node.java index 3c420201..dcbe730f 100644 --- a/src/helma/objectmodel/db/Node.java +++ b/src/helma/objectmodel/db/Node.java @@ -793,7 +793,7 @@ public final class Node implements INode, Serializable { pn2 = (Node) pn2.getNode(pinfo.collectionname); } else if (pn2.equals(this)) { // a special case we want to support: virtualname is actually - // a reference to this node, not a collection containint this node. + // a reference to this node, not a collection containing this node. setParent(pn); name = pinfo.virtualname; anonymous = false; @@ -1376,8 +1376,14 @@ public final class Node implements INode, Serializable { String propname = (localrel == null) ? prel.accessName : localrel.propName; String prop = node.getString(propname); - if ((prop != null) && (getNode(prop) == node)) { - unset(prop); + if (prop != null) { + if (getNode(prop) == node) { + unset(prop); + } + // let the node cache know this key's not for this node anymore. + if (state != TRANSIENT) { + nmgr.evictKey(new SyntheticKey(getKey(), prop)); + } } } // TODO: We should unset constraints to actually remove subnodes here, diff --git a/src/helma/objectmodel/db/NodeManager.java b/src/helma/objectmodel/db/NodeManager.java index ab951637..038053d4 100644 --- a/src/helma/objectmodel/db/NodeManager.java +++ b/src/helma/objectmodel/db/NodeManager.java @@ -407,6 +407,10 @@ public final class NodeManager { */ public void evictKey(Key key) { cache.remove(key); + // also drop key from thread-local transactor cache + if (Thread.currentThread() instanceof Transactor) { + ((Transactor) Thread.currentThread()).dropCleanNode(key); + } } //////////////////////////////////////////////////////////////////////// diff --git a/src/helma/objectmodel/db/Transactor.java b/src/helma/objectmodel/db/Transactor.java index e8b50cea..03d0c641 100644 --- a/src/helma/objectmodel/db/Transactor.java +++ b/src/helma/objectmodel/db/Transactor.java @@ -139,6 +139,14 @@ public class Transactor extends Thread { } } + /** + * Drop a reference to an unmodified Node previously registered with visitCleanNode(). + * @param key the key + */ + public void dropCleanNode(Key key) { + cleanNodes.remove(key); + } + /** * Get a reference to an unmodified Node local to this transaction *