Details
-
Bug
-
Status: Closed
-
Critical
-
Resolution: Fixed
-
1.5.4
-
None
-
org.apache.jackrabbit.core.state.SharedItemStateManager:begin()
org.apache.jackrabbit.core.state.NameSet:equals(Object)
org.apache.jackrabbit.core.state.NodeStateMerger:merge(NodeState,MergeContext)
Description
The merge context uses the NameSet.equals(NameSet) method to compare two sets; however, the NameSet class does not override the default Object.equals(Object) method, and does not inherit from AbstractSet<E>. Therefore, the merge check fails, even though the mixin sets are the same. Object instance equivalence is being performed as opposed to set equivalence. Behavior is observed when more than one thread is checking the ISM at a given time. Demonstration code available upon request.
From NodeStateMerger, line 83:
// mixin types
if (!state.getMixinTypeNames().equals(overlayedState.getMixinTypeNames()))
Proposed solution:
- Implement NameSet.equals(...) method:
public boolean equals(Object obj)Unknown macro: { if (obj != null && obj instanceof NameSet) { NameSet oo = (NameSet) obj; return oo.names.equals(this.names); } return false; }