This is an automated email from the ASF dual-hosted git repository.

ggregory pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/commons-collections.git

commit 2d0b85ac657c3c2058b402d3000579b5877daf65
Author: Peter De Maeyer <peter.de.mae...@gmail.com>
AuthorDate: Sun Oct 20 20:45:48 2024 +0200

    COLLECTIONS-871 Added LinkedHashSetValuedLinkedHashMap
---
 .../multimap/LinkedHashSetValuedLinkedHashMap.java | 144 +++++++++++++++++++++
 .../multimap/HashSetValuedHashMapTest.java         |   4 +-
 ...a => LinkedHashSetValuedLinkedHashMapTest.java} |  33 +++--
 ...uedLinkedHashMap.emptyCollection.version4.5.obj | Bin 0 -> 126 bytes
 ...luedLinkedHashMap.fullCollection.version4.5.obj | Bin 0 -> 20896 bytes
 5 files changed, 165 insertions(+), 16 deletions(-)

diff --git 
a/src/main/java/org/apache/commons/collections4/multimap/LinkedHashSetValuedLinkedHashMap.java
 
b/src/main/java/org/apache/commons/collections4/multimap/LinkedHashSetValuedLinkedHashMap.java
new file mode 100644
index 000000000..b689ed58e
--- /dev/null
+++ 
b/src/main/java/org/apache/commons/collections4/multimap/LinkedHashSetValuedLinkedHashMap.java
@@ -0,0 +1,144 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.commons.collections4.multimap;
+
+import java.io.IOException;
+import java.io.ObjectInputStream;
+import java.io.ObjectOutputStream;
+import java.io.Serializable;
+import java.util.LinkedHashSet;
+import java.util.LinkedHashMap;
+import java.util.Map;
+
+import org.apache.commons.collections4.MultiValuedMap;
+
+/**
+ * Implements a {@code SetValuedMap}, using a {@link LinkedHashMap} to provide 
data
+ * storage and {@link LinkedHashSet}s as value collections. This is the 
standard
+ * implementation of a SetValuedMap.
+ * <p>
+ * <strong>Note that LinkedHashSetValuedLinkedHashMap is not synchronized and 
is not
+ * thread-safe.</strong> If you wish to use this map from multiple threads
+ * concurrently, you must use appropriate synchronization. This class may throw
+ * exceptions when accessed by concurrent threads without synchronization.
+ * </p>
+ *
+ * @param <K> the type of the keys in this map
+ * @param <V> the type of the values in this map
+ * @since 4.5
+ */
+public class LinkedHashSetValuedLinkedHashMap<K, V> extends 
AbstractSetValuedMap<K, V>
+    implements Serializable {
+
+    /** Serialization Version */
+    private static final long serialVersionUID = 20241020L;
+
+    /**
+     * The initial map capacity used when none specified in constructor.
+     */
+    private static final int DEFAULT_INITIAL_MAP_CAPACITY = 16;
+
+    /**
+     * The initial set capacity when using none specified in constructor.
+     */
+    private static final int DEFAULT_INITIAL_SET_CAPACITY = 3;
+
+    /**
+     * The initial list capacity when creating a new value collection.
+     */
+    private final int initialSetCapacity;
+
+    /**
+     * Creates an empty LinkedHashSetValuedHashMap with the default initial
+     * map capacity (16) and the default initial set capacity (3).
+     */
+    public LinkedHashSetValuedLinkedHashMap() {
+        this(DEFAULT_INITIAL_MAP_CAPACITY, DEFAULT_INITIAL_SET_CAPACITY);
+    }
+
+    /**
+     * Creates an empty LinkedHashSetValuedHashMap with the default initial
+     * map capacity (16) and the specified initial set capacity.
+     *
+     * @param initialSetCapacity  the initial capacity used for value 
collections
+     */
+    public LinkedHashSetValuedLinkedHashMap(final int initialSetCapacity) {
+        this(DEFAULT_INITIAL_MAP_CAPACITY, initialSetCapacity);
+    }
+
+    /**
+     * Creates an empty LinkedHashSetValuedHashMap with the specified initial
+     * map and list capacities.
+     *
+     * @param initialMapCapacity  the initial hashmap capacity
+     * @param initialSetCapacity  the initial capacity used for value 
collections
+     */
+    public LinkedHashSetValuedLinkedHashMap(final int initialMapCapacity, 
final int initialSetCapacity) {
+        super(new LinkedHashMap<>(initialMapCapacity));
+        this.initialSetCapacity = initialSetCapacity;
+    }
+
+    /**
+     * Creates an LinkedHashSetValuedHashMap copying all the mappings of the 
given map.
+     *
+     * @param map a {@code Map} to copy into this map
+     */
+    public LinkedHashSetValuedLinkedHashMap(final Map<? extends K, ? extends 
V> map) {
+        this(map.size(), DEFAULT_INITIAL_SET_CAPACITY);
+        super.putAll(map);
+    }
+
+    /**
+     * Creates an LinkedHashSetValuedHashMap copying all the mappings of the 
given map.
+     *
+     * @param map a {@code MultiValuedMap} to copy into this map
+     */
+    public LinkedHashSetValuedLinkedHashMap(final MultiValuedMap<? extends K, 
? extends V> map) {
+        this(map.size(), DEFAULT_INITIAL_SET_CAPACITY);
+        super.putAll(map);
+    }
+
+    @Override
+    protected LinkedHashSet<V> createCollection() {
+        return new LinkedHashSet<>(initialSetCapacity);
+    }
+
+    /**
+     * Deserializes an instance from an ObjectInputStream.
+     *
+     * @param in The source ObjectInputStream.
+     * @throws IOException            Any of the usual Input/Output related 
exceptions.
+     * @throws ClassNotFoundException A class of a serialized object cannot be 
found.
+     */
+    private void readObject(final ObjectInputStream in) throws IOException, 
ClassNotFoundException {
+        in.defaultReadObject();
+        setMap(new LinkedHashMap<>());
+        doReadObject(in);
+    }
+
+    /**
+     * Serializes this object to an ObjectOutputStream.
+     *
+     * @param out the target ObjectOutputStream.
+     * @throws IOException thrown when an I/O errors occur writing to the 
target stream.
+     */
+    private void writeObject(final ObjectOutputStream out) throws IOException {
+        out.defaultWriteObject();
+        doWriteObject(out);
+    }
+
+}
diff --git 
a/src/test/java/org/apache/commons/collections4/multimap/HashSetValuedHashMapTest.java
 
b/src/test/java/org/apache/commons/collections4/multimap/HashSetValuedHashMapTest.java
index b36f4ed01..5ec19ed0c 100644
--- 
a/src/test/java/org/apache/commons/collections4/multimap/HashSetValuedHashMapTest.java
+++ 
b/src/test/java/org/apache/commons/collections4/multimap/HashSetValuedHashMapTest.java
@@ -193,9 +193,9 @@ public class HashSetValuedHashMapTest<K, V> extends 
AbstractMultiValuedMapTest<K
 
 //    public void testCreate() throws Exception {
 //        writeExternalFormToDisk((java.io.Serializable) makeObject(),
-//                
"src/test/resources/data/test/HashSetValuedHashMap.emptyCollection.version4.1.obj");
+//                
"src/test/resources/org/apache/commons/collections4/data/test/HashSetValuedHashMap.emptyCollection.version4.1.obj");
 //        writeExternalFormToDisk((java.io.Serializable) makeFullMap(),
-//                
"src/test/resources/data/test/HashSetValuedHashMap.fullCollection.version4.1.obj");
+//                
"src/test/resources/org/apache/commons/collections4/data/test/HashSetValuedHashMap.fullCollection.version4.1.obj");
 //    }
 
 }
diff --git 
a/src/test/java/org/apache/commons/collections4/multimap/HashSetValuedHashMapTest.java
 
b/src/test/java/org/apache/commons/collections4/multimap/LinkedHashSetValuedLinkedHashMapTest.java
similarity index 82%
copy from 
src/test/java/org/apache/commons/collections4/multimap/HashSetValuedHashMapTest.java
copy to 
src/test/java/org/apache/commons/collections4/multimap/LinkedHashSetValuedLinkedHashMapTest.java
index b36f4ed01..15f1d367f 100644
--- 
a/src/test/java/org/apache/commons/collections4/multimap/HashSetValuedHashMapTest.java
+++ 
b/src/test/java/org/apache/commons/collections4/multimap/LinkedHashSetValuedLinkedHashMapTest.java
@@ -32,12 +32,12 @@ import 
org.apache.commons.collections4.collection.AbstractCollectionTest;
 import org.junit.jupiter.api.Test;
 
 /**
- * Tests {@link HashSetValuedHashMap}.
+ * Tests {@link LinkedHashSetValuedLinkedHashMap}.
  */
-public class HashSetValuedHashMapTest<K, V> extends 
AbstractMultiValuedMapTest<K, V> {
+public class LinkedHashSetValuedLinkedHashMapTest<K, V> extends 
AbstractMultiValuedMapTest<K, V> {
 
-    public HashSetValuedHashMapTest() {
-        super(HashSetValuedHashMapTest.class.getSimpleName());
+    public LinkedHashSetValuedLinkedHashMapTest() {
+        super(LinkedHashSetValuedLinkedHashMapTest.class.getSimpleName());
     }
 
     @Override
@@ -52,16 +52,21 @@ public class HashSetValuedHashMapTest<K, V> extends 
AbstractMultiValuedMapTest<K
 
     @Override
     public MultiValuedMap<K, V> makeConfirmedMap() {
-        return new HashSetValuedHashMap<>();
+        return new LinkedHashSetValuedLinkedHashMap<>();
     }
 
     @Override
     public SetValuedMap<K, V> makeObject() {
-        return new HashSetValuedHashMap<>();
+        return new LinkedHashSetValuedLinkedHashMap<>();
+    }
+
+    @Override
+    public String getCompatibilityVersion() {
+        return "4.5"; // LinkedHashSetValuedLinkedHashMap was added in version 
4.5
     }
 
     @Test
-    public void testHashSetValuedHashMap_2() {
+    public void testLinkedHashSetValuedLinkedHashMap_2() {
         final Map<K, V> map = new HashMap<>();
         final SetValuedMap<K, V> map1;
         final SetValuedMap<K, V> map2;
@@ -69,19 +74,19 @@ public class HashSetValuedHashMapTest<K, V> extends 
AbstractMultiValuedMapTest<K
         map.put((K) "A", (V) "W");
         map.put((K) "B", (V) "X");
         map.put((K) "C", (V) "F");
-        map1 = new HashSetValuedHashMap<>(map);
+        map1 = new LinkedHashSetValuedLinkedHashMap<>(map);
         assertEquals(1, map1.get((K) "A").size());
 
         map.remove("A");
         map.remove("B");
         map.remove("C");
-        map2 = new HashSetValuedHashMap<>(map);
+        map2 = new LinkedHashSetValuedLinkedHashMap<>(map);
         assertEquals("{}", map2.toString());
     }
 
     @Test
     public void testHashSetValueHashMap() {
-        final SetValuedMap<K, V> setMap = new HashSetValuedHashMap<>(4);
+        final SetValuedMap<K, V> setMap = new 
LinkedHashSetValuedLinkedHashMap<>(4);
         assertEquals(0, setMap.get((K) "whatever").size());
 
         final Set<V> set = setMap.get((K) "A");
@@ -101,7 +106,7 @@ public class HashSetValuedHashMapTest<K, V> extends 
AbstractMultiValuedMapTest<K
         map.put((K) "A", (V) "W");
         map.put((K) "A", (V) "X");
         map.put((K) "A", (V) "F");
-        map1 = new HashSetValuedHashMap<>(map);
+        map1 = new LinkedHashSetValuedLinkedHashMap<>(map);
         assertEquals(3, map1.get((K) "A").size());
         map2.put((K) "A", (V) "X");
         map2.put((K) "A", (V) "F");
@@ -110,7 +115,7 @@ public class HashSetValuedHashMapTest<K, V> extends 
AbstractMultiValuedMapTest<K
         assertEquals(map1.hashCode(), map2.hashCode());
 
         map.remove("A");
-        map3 = new HashSetValuedHashMap<>(map);
+        map3 = new LinkedHashSetValuedLinkedHashMap<>(map);
         assertEquals("{}", map3.toString());
     }
 
@@ -193,9 +198,9 @@ public class HashSetValuedHashMapTest<K, V> extends 
AbstractMultiValuedMapTest<K
 
 //    public void testCreate() throws Exception {
 //        writeExternalFormToDisk((java.io.Serializable) makeObject(),
-//                
"src/test/resources/data/test/HashSetValuedHashMap.emptyCollection.version4.1.obj");
+//                
"src/test/resources/org/apache/commons/collections4/data/test/LinkedHashSetValuedLinkedHashMap.emptyCollection.version4.5.obj");
 //        writeExternalFormToDisk((java.io.Serializable) makeFullMap(),
-//                
"src/test/resources/data/test/HashSetValuedHashMap.fullCollection.version4.1.obj");
+//                
"src/test/resources/org/apache/commons/collections4/data/test/LinkedHashSetValuedLinkedHashMap.fullCollection.version4.5.obj");
 //    }
 
 }
diff --git 
a/src/test/resources/org/apache/commons/collections4/data/test/LinkedHashSetValuedLinkedHashMap.emptyCollection.version4.5.obj
 
b/src/test/resources/org/apache/commons/collections4/data/test/LinkedHashSetValuedLinkedHashMap.emptyCollection.version4.5.obj
new file mode 100644
index 000000000..4f3c57195
Binary files /dev/null and 
b/src/test/resources/org/apache/commons/collections4/data/test/LinkedHashSetValuedLinkedHashMap.emptyCollection.version4.5.obj
 differ
diff --git 
a/src/test/resources/org/apache/commons/collections4/data/test/LinkedHashSetValuedLinkedHashMap.fullCollection.version4.5.obj
 
b/src/test/resources/org/apache/commons/collections4/data/test/LinkedHashSetValuedLinkedHashMap.fullCollection.version4.5.obj
new file mode 100644
index 000000000..c4b9fb801
Binary files /dev/null and 
b/src/test/resources/org/apache/commons/collections4/data/test/LinkedHashSetValuedLinkedHashMap.fullCollection.version4.5.obj
 differ

Reply via email to