[
https://issues.apache.org/jira/browse/JCR-2081?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=12711165#action_12711165
]
Frank van Lankvelt commented on JCR-2081:
-----------------------------------------
Can this fix be applied to the 1.5 branch as well?
We're running into merge failures as a result of this issue, so backporting
would be very appreciated :-)
thanks, Frank
> NameSet does not implement equals(Object) and hashCode() methods
> ----------------------------------------------------------------
>
> Key: JCR-2081
> URL: https://issues.apache.org/jira/browse/JCR-2081
> Project: Jackrabbit Content Repository
> Issue Type: Bug
> Components: jackrabbit-core
> Affects Versions: 1.5.4
> Environment:
> org.apache.jackrabbit.core.state.SharedItemStateManager:begin()
> org.apache.jackrabbit.core.state.NameSet:equals(Object)
> org.apache.jackrabbit.core.state.NodeStateMerger:merge(NodeState,MergeContext)
> Reporter: Damon A. Brown
> Priority: Critical
> Fix For: 1.6.0
>
>
> 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())) {
> // the mixins have been modified but by just looking at
> the diff we
> // can't determine where the change happened since the
> diffs of either
> // removing a mixin from the overlayed or adding a mixin
> to the
> // transient state would look identical...
> return false;
> }
> Proposed solution:
> - Implement NameSet.equals(...) method:
> public boolean equals(Object obj) {
> if (obj != null && obj instanceof NameSet) {
> NameSet oo = (NameSet) obj;
> return oo.names.equals(this.names);
> }
> return false;
> }
--
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.