You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@jackrabbit.apache.org by tr...@apache.org on 2006/11/03 11:09:04 UTC
svn commit: r470745 - in
/jackrabbit/trunk/jackrabbit/src/main/java/org/apache/jackrabbit/core:
CachingHierarchyManager.java state/LocalItemStateManager.java
state/NodeStateListener.java state/SessionItemStateManager.java
state/StateChangeDispatcher.java
Author: tripod
Date: Fri Nov 3 02:09:04 2006
New Revision: 470745
URL: http://svn.apache.org/viewvc?view=rev&rev=470745
Log:
JCR-617 CachingHieraarchyManager may serve moved items
Modified:
jackrabbit/trunk/jackrabbit/src/main/java/org/apache/jackrabbit/core/CachingHierarchyManager.java
jackrabbit/trunk/jackrabbit/src/main/java/org/apache/jackrabbit/core/state/LocalItemStateManager.java
jackrabbit/trunk/jackrabbit/src/main/java/org/apache/jackrabbit/core/state/NodeStateListener.java
jackrabbit/trunk/jackrabbit/src/main/java/org/apache/jackrabbit/core/state/SessionItemStateManager.java
jackrabbit/trunk/jackrabbit/src/main/java/org/apache/jackrabbit/core/state/StateChangeDispatcher.java
Modified: jackrabbit/trunk/jackrabbit/src/main/java/org/apache/jackrabbit/core/CachingHierarchyManager.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit/src/main/java/org/apache/jackrabbit/core/CachingHierarchyManager.java?view=diff&rev=470745&r1=470744&r2=470745
==============================================================================
--- jackrabbit/trunk/jackrabbit/src/main/java/org/apache/jackrabbit/core/CachingHierarchyManager.java (original)
+++ jackrabbit/trunk/jackrabbit/src/main/java/org/apache/jackrabbit/core/CachingHierarchyManager.java Fri Nov 3 02:09:04 2006
@@ -284,14 +284,16 @@
*/
public void stateModified(ItemState modified) {
if (modified.isNode()) {
- stateModified((NodeState) modified);
+ nodeModified((NodeState) modified);
}
}
/**
+ * {@inheritDoc}
+ *
* Evict moved or renamed items from the cache.
*/
- private void stateModified(NodeState modified) {
+ public void nodeModified(NodeState modified) {
synchronized (cacheMonitor) {
LRUEntry entry = (LRUEntry) idCache.get(modified.getNodeId());
if (entry == null) {
@@ -601,6 +603,8 @@
*
* @param path child path
* @param id node id
+ *
+ * @throws PathNotFoundException if hte path was not found
*/
private void insert(Path path, ItemId id) throws PathNotFoundException {
synchronized (cacheMonitor) {
@@ -631,6 +635,8 @@
*
* @param path child path
* @param id node id
+ *
+ * @throws PathNotFoundException if the path was not found
*/
private void remove(Path path, ItemId id) throws PathNotFoundException {
synchronized (cacheMonitor) {
@@ -677,6 +683,7 @@
* Create a new instance of this class
*
* @param id node id
+ * @param element the path map element for this entry
*/
public LRUEntry(NodeId id, PathMap.Element element) {
this.id = id;
Modified: jackrabbit/trunk/jackrabbit/src/main/java/org/apache/jackrabbit/core/state/LocalItemStateManager.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit/src/main/java/org/apache/jackrabbit/core/state/LocalItemStateManager.java?view=diff&rev=470745&r1=470744&r2=470745
==============================================================================
--- jackrabbit/trunk/jackrabbit/src/main/java/org/apache/jackrabbit/core/state/LocalItemStateManager.java (original)
+++ jackrabbit/trunk/jackrabbit/src/main/java/org/apache/jackrabbit/core/state/LocalItemStateManager.java Fri Nov 3 02:09:04 2006
@@ -22,9 +22,10 @@
import org.apache.jackrabbit.core.observation.EventStateCollectionFactory;
import org.apache.jackrabbit.name.QName;
-import javax.jcr.ReferentialIntegrityException;
import java.util.Iterator;
+import javax.jcr.ReferentialIntegrityException;
+
/**
* Local <code>ItemStateManager</code> that isolates changes to
* persistent states from other clients.
@@ -402,7 +403,7 @@
* we're listening to.
*/
public void stateModified(ItemState modified) {
- ItemState local = null;
+ ItemState local;
if (modified.getContainer() != this) {
// shared state was modified
local = cache.retrieve(modified.getId());
@@ -416,6 +417,12 @@
}
if (local != null) {
dispatcher.notifyStateModified(local);
+ } else if (modified.isNode()) {
+ // if the state is not ours (and is not cached) it could have been
+ // vanished from the week-ref cache due to a gc. but there could
+ // still be some listeners (e.g. CachingHierarchyManager) that want
+ // to get notified.
+ dispatcher.notifyNodeModified((NodeState) modified);
}
}
@@ -487,6 +494,16 @@
*/
public void nodesReplaced(NodeState state) {
dispatcher.notifyNodesReplaced(state);
+ }
+
+ /**
+ * {@inheritDoc}
+ * <p/>
+ * Optimization: shared state manager we're listening to does not deliver node state changes, therefore the state
+ * concerned must be a local state.
+ */
+ public void nodeModified(NodeState state) {
+ dispatcher.notifyNodeModified(state);
}
/**
Modified: jackrabbit/trunk/jackrabbit/src/main/java/org/apache/jackrabbit/core/state/NodeStateListener.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit/src/main/java/org/apache/jackrabbit/core/state/NodeStateListener.java?view=diff&rev=470745&r1=470744&r2=470745
==============================================================================
--- jackrabbit/trunk/jackrabbit/src/main/java/org/apache/jackrabbit/core/state/NodeStateListener.java (original)
+++ jackrabbit/trunk/jackrabbit/src/main/java/org/apache/jackrabbit/core/state/NodeStateListener.java Fri Nov 3 02:09:04 2006
@@ -37,6 +37,17 @@
QName name, int index, NodeId id);
/**
+ * Called when a node has been modified, typically as a result of removal
+ * or addition of a child node.
+ * <p/>
+ * Please note, that this method is not called if
+ * {@link #stateModified(ItemState)} was called.
+ *
+ * @param state node state that changed
+ */
+ void nodeModified(NodeState state);
+
+ /**
* Called when the children nodes were replaced by other nodes, typically
* as result of a reorder operation.
*
Modified: jackrabbit/trunk/jackrabbit/src/main/java/org/apache/jackrabbit/core/state/SessionItemStateManager.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit/src/main/java/org/apache/jackrabbit/core/state/SessionItemStateManager.java?view=diff&rev=470745&r1=470744&r2=470745
==============================================================================
--- jackrabbit/trunk/jackrabbit/src/main/java/org/apache/jackrabbit/core/state/SessionItemStateManager.java (original)
+++ jackrabbit/trunk/jackrabbit/src/main/java/org/apache/jackrabbit/core/state/SessionItemStateManager.java Fri Nov 3 02:09:04 2006
@@ -21,24 +21,25 @@
import org.apache.jackrabbit.core.HierarchyManager;
import org.apache.jackrabbit.core.ItemId;
import org.apache.jackrabbit.core.NodeId;
-import org.apache.jackrabbit.core.ZombieHierarchyManager;
import org.apache.jackrabbit.core.PropertyId;
+import org.apache.jackrabbit.core.ZombieHierarchyManager;
import org.apache.jackrabbit.core.util.Dumpable;
import org.apache.jackrabbit.name.NamespaceResolver;
import org.apache.jackrabbit.name.QName;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
-import javax.jcr.InvalidItemStateException;
-import javax.jcr.ItemNotFoundException;
-import javax.jcr.ReferentialIntegrityException;
-import javax.jcr.RepositoryException;
import java.io.PrintStream;
import java.util.ArrayList;
+import java.util.Collection;
import java.util.Collections;
import java.util.Iterator;
import java.util.List;
-import java.util.Collection;
+
+import javax.jcr.InvalidItemStateException;
+import javax.jcr.ItemNotFoundException;
+import javax.jcr.ReferentialIntegrityException;
+import javax.jcr.RepositoryException;
/**
* Item state manager that handles both transient and persistent items.
@@ -82,9 +83,9 @@
/**
* Creates a new <code>SessionItemStateManager</code> instance.
*
- * @param rootNodeId
- * @param stateMgr
- * @param nsResolver
+ * @param rootNodeId the root node id
+ * @param stateMgr the local item state manager
+ * @param nsResolver the namespace resolver
*/
public SessionItemStateManager(NodeId rootNodeId,
LocalItemStateManager stateMgr,
@@ -839,6 +840,18 @@
public void nodesReplaced(NodeState state) {
if (state.getContainer() == this || !transientStore.contains(state.getId())) {
dispatcher.notifyNodesReplaced(state);
+ }
+ }
+
+ /**
+ * {@inheritDoc}
+ * <p/>
+ * Pass notification to listeners if a transient state was modified
+ * or if the local state is not overlayed.
+ */
+ public void nodeModified(NodeState state) {
+ if (state.getContainer() == this || !transientStore.contains(state.getId())) {
+ dispatcher.notifyNodeModified(state);
}
}
Modified: jackrabbit/trunk/jackrabbit/src/main/java/org/apache/jackrabbit/core/state/StateChangeDispatcher.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit/src/main/java/org/apache/jackrabbit/core/state/StateChangeDispatcher.java?view=diff&rev=470745&r1=470744&r2=470745
==============================================================================
--- jackrabbit/trunk/jackrabbit/src/main/java/org/apache/jackrabbit/core/state/StateChangeDispatcher.java (original)
+++ jackrabbit/trunk/jackrabbit/src/main/java/org/apache/jackrabbit/core/state/StateChangeDispatcher.java Fri Nov 3 02:09:04 2006
@@ -177,6 +177,25 @@
/**
* Notify listeners about changes to some state.
* @param state node state that changed
+ */
+ public void notifyNodeModified(NodeState state) {
+ // small optimization as there are only a few clients interested in node state modifications
+ if (!nsListeners.isEmpty()) {
+ NodeStateListener[] la;
+ synchronized (nsListeners) {
+ la = (NodeStateListener[]) nsListeners.toArray(new NodeStateListener[nsListeners.size()]);
+ }
+ for (int i = 0; i < la.length; i++) {
+ if (la[i] != null) {
+ la[i].nodeModified(state);
+ }
+ }
+ }
+ }
+
+ /**
+ * Notify listeners about changes to some state.
+ * @param state node state that changed
* @param name name of node that was added
* @param index index of new node
* @param id id of new node