More missing stuff for hashCode/equals of NamedAssociation.
Project: http://git-wip-us.apache.org/repos/asf/zest-qi4j/repo Commit: http://git-wip-us.apache.org/repos/asf/zest-qi4j/commit/71f5da75 Tree: http://git-wip-us.apache.org/repos/asf/zest-qi4j/tree/71f5da75 Diff: http://git-wip-us.apache.org/repos/asf/zest-qi4j/diff/71f5da75 Branch: refs/heads/develop Commit: 71f5da7501ff0c75612c3805557b7c5091d21fc9 Parents: 2a5405c Author: Niclas Hedhman <[email protected]> Authored: Fri Jul 17 10:55:10 2015 +0300 Committer: Niclas Hedhman <[email protected]> Committed: Fri Jul 17 10:55:10 2015 +0300 ---------------------------------------------------------------------- .../association/NamedAssociationInstance.java | 63 ++++++++++++++++++++ 1 file changed, 63 insertions(+) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/zest-qi4j/blob/71f5da75/core/runtime/src/main/java/org/qi4j/runtime/association/NamedAssociationInstance.java ---------------------------------------------------------------------- diff --git a/core/runtime/src/main/java/org/qi4j/runtime/association/NamedAssociationInstance.java b/core/runtime/src/main/java/org/qi4j/runtime/association/NamedAssociationInstance.java index dc73b3c..c38ef1a 100644 --- a/core/runtime/src/main/java/org/qi4j/runtime/association/NamedAssociationInstance.java +++ b/core/runtime/src/main/java/org/qi4j/runtime/association/NamedAssociationInstance.java @@ -22,7 +22,11 @@ import java.lang.reflect.Type; import java.util.HashMap; import java.util.Iterator; import java.util.Map; +import org.qi4j.api.association.AssociationDescriptor; +import org.qi4j.api.association.ManyAssociation; +import org.qi4j.api.association.ManyAssociationWrapper; import org.qi4j.api.association.NamedAssociation; +import org.qi4j.api.association.NamedAssociationWrapper; import org.qi4j.api.entity.EntityReference; import org.qi4j.api.entity.Identity; import org.qi4j.api.util.NullArgumentException; @@ -174,4 +178,63 @@ public class NamedAssociationInstance<T> } }, namedAssociationState ); } + + + @Override + public boolean equals( Object o ) + { + if( this == o ) + { + return true; + } + if( o == null || getClass() != o.getClass() ) + { + return false; + } + NamedAssociation<?> that = (NamedAssociation) o; + // Unwrap if needed + while( that instanceof NamedAssociationWrapper ) + { + that = ( (NamedAssociationWrapper) that ).next(); + } + // Descriptor equality + NamedAssociationInstance<?> thatInstance = (NamedAssociationInstance) that; + AssociationDescriptor thatDescriptor = (AssociationDescriptor) thatInstance.associationInfo(); + if( !associationInfo.equals( thatDescriptor ) ) + { + return false; + } + // State equality + if( namedAssociationState.count() != thatInstance.namedAssociationState.count() ) + { + return false; + } + for( String name : namedAssociationState ) + { + if( !thatInstance.namedAssociationState.containsName( name ) ) + { + return false; + } + EntityReference thisReference = namedAssociationState.get( name ); + EntityReference thatReference = thatInstance.namedAssociationState.get( name ); + if( !thisReference.equals( thatReference ) ) + { + return false; + } + } + return true; + } + + @Override + public int hashCode() + { + int hash = associationInfo.hashCode() * 31; // Descriptor + for( String name : namedAssociationState ) + { + hash += name.hashCode(); + hash += namedAssociationState.get( name ).hashCode() * 7; // State + } + return hash; + } + }
