You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@causeway.apache.org by ah...@apache.org on 2026/09/01 10:04:06 UTC
(causeway) branch main updated: CAUSEWAY-4052: provides proper equality for MultiMap implementations
This is an automated email from the ASF dual-hosted git repository.
andi-huber pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/causeway.git
The following commit(s) were added to refs/heads/main by this push:
new f2adf5bd386 CAUSEWAY-4052: provides proper equality for MultiMap implementations
f2adf5bd386 is described below
commit f2adf5bd38658b7f027d0ad0596571083801b619
Author: andi-huber <ah...@apache.org>
AuthorDate: Tue Sep 1 12:03:56 2026 +0200
CAUSEWAY-4052: provides proper equality for MultiMap implementations
---
.../commons/internal/collections/_Multimaps.java | 44 +++++++++++++++++++---
1 file changed, 39 insertions(+), 5 deletions(-)
diff --git a/commons/src/main/java/org/apache/causeway/commons/internal/collections/_Multimaps.java b/commons/src/main/java/org/apache/causeway/commons/internal/collections/_Multimaps.java
index 56d6ab0a9f9..d50593c82f7 100644
--- a/commons/src/main/java/org/apache/causeway/commons/internal/collections/_Multimaps.java
+++ b/commons/src/main/java/org/apache/causeway/commons/internal/collections/_Multimaps.java
@@ -156,6 +156,19 @@ public Optional<NavigableMap<K, List<V>>> asNavigableMap() {
public ListMultimap<K, V> asUnmodifiable() {
return new ListMultimapWrapper<>(Collections.unmodifiableMap(delegate), elementCollectionFactory);
}
+ @Override
+ public final boolean equals(final Object obj) {
+ return obj == this
+ || delegate.equals(obj);
+ }
+ @Override
+ public final int hashCode() {
+ return delegate.hashCode();
+ }
+ @Override
+ public final String toString() {
+ return "ListMultimapWrapper[delegate=%s]".formatted(delegate);
+ }
}
/**
@@ -219,17 +232,28 @@ private record SetMultimapWrapper<K, V>(
public void putElement(final K key, final V value) {
getOrElseNew(key).add(value);
}
-
@Override
public Set<V> getOrElseNew(final K key) {
var collection = delegate.computeIfAbsent(key, __->elementCollectionFactory.get());
return collection;
}
-
@Override
public SetMultimap<K, V> asUnmodifiable() {
return new SetMultimapWrapper<>(Collections.unmodifiableMap(delegate), elementCollectionFactory);
}
+ @Override
+ public final boolean equals(final Object obj) {
+ return obj == this
+ || delegate.equals(obj);
+ }
+ @Override
+ public final int hashCode() {
+ return delegate.hashCode();
+ }
+ @Override
+ public final String toString() {
+ return "SetMultimapWrapper[delegate=%s]".formatted(delegate);
+ }
}
/**
@@ -324,19 +348,29 @@ public static <K1, K2, V> MapMultimap<K1, K2, V> newMapMultimap(
public void putElement(final K1 key, final K2 subkey, final V value) {
getOrElseNew(key).put(subkey, value);
}
-
@Override
public V getElement(final K1 key, final K2 subkey) {
final Map<K2, V> elementMap = delegate.get(key);
return elementMap!=null ? elementMap.get(subkey) : null;
}
-
@Override
public Map<K2, V> getOrElseNew(final K1 key) {
var elementMap = delegate.computeIfAbsent(key, __->elementMapFactory.get());
return elementMap;
}
-
+ @Override
+ public final boolean equals(final Object obj) {
+ return obj == this
+ || delegate.equals(obj);
+ }
+ @Override
+ public final int hashCode() {
+ return delegate.hashCode();
+ }
+ @Override
+ public final String toString() {
+ return "MapMultimap[delegate=%s]".formatted(delegate);
+ }
};
}