[ 
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.

Reply via email to