You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@jackrabbit.apache.org by st...@apache.org on 2005/11/15 10:56:19 UTC
svn commit: r344339 - in
/incubator/jackrabbit/trunk/jackrabbit/src/main/java/org/apache/jackrabbit/core:
PathMap.java lock/LockManagerImpl.java observation/EventStateCollection.java
Author: stefan
Date: Tue Nov 15 01:56:14 2005
New Revision: 344339
URL: http://svn.apache.org/viewcvs?rev=344339&view=rev
Log:
JCR-230 persistent locks persist even after removing the locked node
Modified:
incubator/jackrabbit/trunk/jackrabbit/src/main/java/org/apache/jackrabbit/core/PathMap.java
incubator/jackrabbit/trunk/jackrabbit/src/main/java/org/apache/jackrabbit/core/lock/LockManagerImpl.java
incubator/jackrabbit/trunk/jackrabbit/src/main/java/org/apache/jackrabbit/core/observation/EventStateCollection.java
Modified: incubator/jackrabbit/trunk/jackrabbit/src/main/java/org/apache/jackrabbit/core/PathMap.java
URL: http://svn.apache.org/viewcvs/incubator/jackrabbit/trunk/jackrabbit/src/main/java/org/apache/jackrabbit/core/PathMap.java?rev=344339&r1=344338&r2=344339&view=diff
==============================================================================
--- incubator/jackrabbit/trunk/jackrabbit/src/main/java/org/apache/jackrabbit/core/PathMap.java (original)
+++ incubator/jackrabbit/trunk/jackrabbit/src/main/java/org/apache/jackrabbit/core/PathMap.java Tue Nov 15 01:56:14 2005
@@ -193,7 +193,7 @@
for (int i = index; i < list.size(); i++) {
Element element = (Element) list.get(i);
if (element != null) {
- element.index++;
+ element.index = element.getNormalizedIndex() + 1;
}
}
list.add(index, null);
Modified: incubator/jackrabbit/trunk/jackrabbit/src/main/java/org/apache/jackrabbit/core/lock/LockManagerImpl.java
URL: http://svn.apache.org/viewcvs/incubator/jackrabbit/trunk/jackrabbit/src/main/java/org/apache/jackrabbit/core/lock/LockManagerImpl.java?rev=344339&r1=344338&r2=344339&view=diff
==============================================================================
--- incubator/jackrabbit/trunk/jackrabbit/src/main/java/org/apache/jackrabbit/core/lock/LockManagerImpl.java (original)
+++ incubator/jackrabbit/trunk/jackrabbit/src/main/java/org/apache/jackrabbit/core/lock/LockManagerImpl.java Tue Nov 15 01:56:14 2005
@@ -83,7 +83,7 @@
private final Object contentMonitor = new Object();
/**
- * Name space resolver
+ * Namespace resolver
*/
private final NamespaceResolver nsResolver;
@@ -119,13 +119,7 @@
* Close this lock manager. Writes back all changes.
*/
public void close() {
- try {
- save();
- } catch (IOException e) {
- log.warn("I/O error while saving locks to '"
- + locksFile.getPath() + "': " + e.getMessage());
- log.debug("Root cause: ", e);
- }
+ save();
}
/**
@@ -180,7 +174,7 @@
/**
* Write locks to locks file
*/
- private void save() throws IOException {
+ private void save() {
final ArrayList list = new ArrayList();
lockMap.traverse(new PathMap.ElementVisitor() {
@@ -202,6 +196,10 @@
writer.write(info.lockToken.toString());
writer.newLine();
}
+ } catch (IOException e) {
+ log.warn("I/O error while saving locks to '"
+ + locksFile.getPath() + "': " + e.getMessage());
+ log.debug("Root cause: ", e);
} finally {
if (writer != null) {
try {
@@ -257,6 +255,9 @@
session.addLockToken(info.lockToken.toString(), false);
lockMap.put(path, info);
lock = new LockImpl(info, node);
+
+ // persist lockMap
+ save();
}
// add properties to content
@@ -300,6 +301,9 @@
// set live flag to false
info.setLive(false);
+
+ // persist lockMap
+ save();
}
// remove properties in content
@@ -316,7 +320,7 @@
}
- //-----------------------------------------------------------< LockManager >
+ //----------------------------------------------------------< LockManager >
/**
* {@inheritDoc}
Modified: incubator/jackrabbit/trunk/jackrabbit/src/main/java/org/apache/jackrabbit/core/observation/EventStateCollection.java
URL: http://svn.apache.org/viewcvs/incubator/jackrabbit/trunk/jackrabbit/src/main/java/org/apache/jackrabbit/core/observation/EventStateCollection.java?rev=344339&r1=344338&r2=344339&view=diff
==============================================================================
--- incubator/jackrabbit/trunk/jackrabbit/src/main/java/org/apache/jackrabbit/core/observation/EventStateCollection.java (original)
+++ incubator/jackrabbit/trunk/jackrabbit/src/main/java/org/apache/jackrabbit/core/observation/EventStateCollection.java Tue Nov 15 01:56:14 2005
@@ -109,6 +109,17 @@
new ChangeLogBasedHierarchyMgr(rootNodeUUID, provider, changes,
session.getNamespaceResolver());
+ /**
+ * Important:
+ * Do NOT change the sequence of events generated unless there's
+ * a very good reason for it! Some internal SynchronousEventListener
+ * implementations depend on the order of the events fired.
+ * LockManagerImpl for example expects that for any given path a
+ * childNodeRemoved event is fired before a childNodeAdded event.
+ */
+
+ // 1. modified items
+
for (Iterator it = changes.modifiedStates(); it.hasNext();) {
ItemState state = (ItemState) it.next();
if (state.isNode()) {
@@ -289,6 +300,48 @@
session));
}
}
+
+ // 2. removed items
+
+ for (Iterator it = changes.deletedStates(); it.hasNext();) {
+ ItemState state = (ItemState) it.next();
+ if (state.isNode()) {
+ // node deleted
+ NodeState n = (NodeState) state;
+ NodeState parent = (NodeState) provider.getItemState(new NodeId(n.getParentUUID()));
+ NodeTypeImpl nodeType = getNodeType(parent, session);
+ Set mixins = parent.getMixinTypeNames();
+ Path path = getZombiePath(state.getId(), hmgr);
+ events.add(EventState.childNodeRemoved(n.getParentUUID(),
+ getParent(path),
+ n.getUUID(),
+ path.getNameElement(),
+ nodeType,
+ mixins,
+ session));
+ } else {
+ // property removed
+ // only create an event if node still exists
+ try {
+ NodeState n = (NodeState) changes.get(new NodeId(state.getParentUUID()));
+ // node state exists -> only property removed
+ NodeTypeImpl nodeType = getNodeType(n, session);
+ Set mixins = n.getMixinTypeNames();
+ Path path = getZombiePath(state.getId(), hmgr);
+ events.add(EventState.propertyRemoved(state.getParentUUID(),
+ getParent(path),
+ path.getNameElement(),
+ nodeType,
+ mixins,
+ session));
+ } catch (NoSuchItemStateException e) {
+ // node removed as well -> do not create an event
+ }
+ }
+ }
+
+ // 3. added items
+
for (Iterator it = changes.addedStates(); it.hasNext();) {
ItemState state = (ItemState) it.next();
if (state.isNode()) {
@@ -324,42 +377,6 @@
nodeType,
mixins,
session));
- }
- }
- for (Iterator it = changes.deletedStates(); it.hasNext();) {
- ItemState state = (ItemState) it.next();
- if (state.isNode()) {
- // node deleted
- NodeState n = (NodeState) state;
- NodeState parent = (NodeState) provider.getItemState(new NodeId(n.getParentUUID()));
- NodeTypeImpl nodeType = getNodeType(parent, session);
- Set mixins = parent.getMixinTypeNames();
- Path path = getZombiePath(state.getId(), hmgr);
- events.add(EventState.childNodeRemoved(n.getParentUUID(),
- getParent(path),
- n.getUUID(),
- path.getNameElement(),
- nodeType,
- mixins,
- session));
- } else {
- // property removed
- // only create an event if node still exists
- try {
- NodeState n = (NodeState) changes.get(new NodeId(state.getParentUUID()));
- // node state exists -> only property removed
- NodeTypeImpl nodeType = getNodeType(n, session);
- Set mixins = n.getMixinTypeNames();
- Path path = getZombiePath(state.getId(), hmgr);
- events.add(EventState.propertyRemoved(state.getParentUUID(),
- getParent(path),
- path.getNameElement(),
- nodeType,
- mixins,
- session));
- } catch (NoSuchItemStateException e) {
- // node removed as well -> do not create an event
- }
}
}
}