You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cxf.apache.org by co...@apache.org on 2026/10/19 08:48:39 UTC

(cxf) branch coheigea/CXF-8142 created (now 850ef84d2e6)

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

coheigea pushed a change to branch coheigea/CXF-8142
in repository https://gitbox.apache.org/repos/asf/cxf.git


      at 850ef84d2e6 CXF-8142 - Fix WSDLManager.removeDefinition leaving stale entries

This branch includes the following new commits:

     new 850ef84d2e6 CXF-8142 - Fix WSDLManager.removeDefinition leaving stale entries

The 1 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails.  The revisions
listed as "add" were already present in the repository and have only
been added to this reference.



(cxf) 01/01: CXF-8142 - Fix WSDLManager.removeDefinition leaving stale entries

Posted by co...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

coheigea pushed a commit to branch coheigea/CXF-8142
in repository https://gitbox.apache.org/repos/asf/cxf.git

commit 850ef84d2e68f8cf21f0f4960776a1ce2c9f4d61
Author: Colm O hEigeartaigh <co...@apache.org>
AuthorDate: Mon Oct 19 09:48:10 2026 +0100

    CXF-8142 - Fix WSDLManager.removeDefinition leaving stale entries
---
 .../java/org/apache/cxf/common/util/CacheMap.java  | 11 ++++++++---
 .../cxf/common/util/WeakIdentityHashMap.java       |  4 +++-
 .../org/apache/cxf/common/util/CacheMapTest.java   | 22 ++++++++++++++++++++++
 3 files changed, 33 insertions(+), 4 deletions(-)

diff --git a/core/src/main/java/org/apache/cxf/common/util/CacheMap.java b/core/src/main/java/org/apache/cxf/common/util/CacheMap.java
index 17aeb8004f0..08fe765980b 100644
--- a/core/src/main/java/org/apache/cxf/common/util/CacheMap.java
+++ b/core/src/main/java/org/apache/cxf/common/util/CacheMap.java
@@ -18,9 +18,11 @@
  */
 package org.apache.cxf.common.util;
 
+import java.util.ArrayList;
 import java.util.Collection;
-import java.util.HashSet;
+import java.util.List;
 import java.util.Map;
+import java.util.Objects;
 import java.util.Set;
 import java.util.WeakHashMap;
 
@@ -120,10 +122,13 @@ public class CacheMap<K, V> implements Map<K, V> {
 
     public V remove(Object key) {
         V v = mainDataMap.remove(key);
-        Set<K> keys = new HashSet<>(extraKeyMap.keySet());
+        // Must not use a HashSet here: extraKeyMap may hold several distinct key
+        // instances that are equal to each other (e.g. different String instances
+        // of the same URL), and all of them need to be removed.
+        List<K> keys = new ArrayList<>(extraKeyMap.keySet());
         V v2 = extraKeyMap.remove(key);
         for (K nk : keys) {
-            if ((key != null && key.equals(nk)) || (key == null && nk == null)) {
+            if (Objects.equals(key, nk)) {
                 V v3 = extraKeyMap.remove(nk);
                 if (v2 == null) {
                     v2 = v3;
diff --git a/core/src/main/java/org/apache/cxf/common/util/WeakIdentityHashMap.java b/core/src/main/java/org/apache/cxf/common/util/WeakIdentityHashMap.java
index 53ce7f035de..43e4bb2e09c 100644
--- a/core/src/main/java/org/apache/cxf/common/util/WeakIdentityHashMap.java
+++ b/core/src/main/java/org/apache/cxf/common/util/WeakIdentityHashMap.java
@@ -25,6 +25,7 @@ import java.util.Collection;
 import java.util.Collections;
 import java.util.HashMap;
 import java.util.HashSet;
+import java.util.IdentityHashMap;
 import java.util.Map;
 import java.util.Set;
 
@@ -95,7 +96,8 @@ public class WeakIdentityHashMap<K, V> implements Map<K, V> {
     }
     public Set<K> keySet() {
         reap();
-        Set<K> ret = new HashSet<>();
+        // keys are compared by identity, so equal but distinct keys must not be merged
+        Set<K> ret = Collections.newSetFromMap(new IdentityHashMap<>());
         for (IdentityWeakReference ref : backingStore.keySet()) {
             K key = ref.get();
             if (key != null) {
diff --git a/core/src/test/java/org/apache/cxf/common/util/CacheMapTest.java b/core/src/test/java/org/apache/cxf/common/util/CacheMapTest.java
index a28576cf918..6bf5aa83968 100644
--- a/core/src/test/java/org/apache/cxf/common/util/CacheMapTest.java
+++ b/core/src/test/java/org/apache/cxf/common/util/CacheMapTest.java
@@ -50,4 +50,26 @@ public class CacheMapTest {
         Assert.assertNull(definitions.remove(null));
     }
 
+    @Test
+    public void testRemoveWithMultipleEqualKeys() {
+        Map<Object, Object> definitions = new CacheMap<>();
+        Object value = new Object();
+
+        String putKey = new String("http://localhost/service?wsdl");
+        definitions.put(putKey, value);
+        // lookups with distinct but equal key instances are recorded in the extra key map
+        String lookupKey1 = new String("http://localhost/service?wsdl");
+        String lookupKey2 = new String("http://localhost/service?wsdl");
+        Assert.assertSame(value, definitions.get(lookupKey1));
+        Assert.assertSame(value, definitions.get(lookupKey2));
+
+        Assert.assertSame(value, definitions.remove(new String("http://localhost/service?wsdl")));
+
+        Assert.assertTrue(definitions.isEmpty());
+        Assert.assertFalse(definitions.containsKey(putKey));
+        Assert.assertNull(definitions.get(lookupKey1));
+        Assert.assertNull(definitions.get(lookupKey2));
+        Assert.assertEquals(0, definitions.size());
+    }
+
 }