You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@solr.apache.org by kr...@apache.org on 2023/03/29 18:38:55 UTC

[solr] 02/02: SOLR-16724: Remove unneeded commons-collections4 dependency (#1500)

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

krisden pushed a commit to branch branch_9x
in repository https://gitbox.apache.org/repos/asf/solr.git

commit d3ae0e12e4c4aeb81751fc2f0f5bd46c578549ea
Author: Kevin Risden <ri...@users.noreply.github.com>
AuthorDate: Wed Mar 29 14:27:56 2023 -0400

    SOLR-16724: Remove unneeded commons-collections4 dependency (#1500)
    
    Co-authored-by: Jan Høydahl <ja...@users.noreply.github.com>
---
 .../org.apache.commons.collections4.all.txt        |  2 ++
 solr/core/build.gradle                             |  1 -
 .../src/java/org/apache/solr/core/PluginBag.java   |  3 +--
 .../org/apache/solr/handler/CollectionsAPI.java    |  3 +--
 .../solr/handler/admin/api/AddReplicaAPI.java      |  8 ++-----
 .../solr/handler/admin/api/CreateShardAPI.java     |  5 +---
 .../solr/handler/admin/api/MergeIndexesAPI.java    |  9 ++++----
 .../handler/admin/api/RenameCollectionAPI.java     |  9 +++++---
 .../solr/handler/admin/api/SplitCoreAPI.java       |  9 ++++----
 .../solr/handler/admin/api/SplitShardAPI.java      |  5 +---
 .../handler/configsets/CreateConfigSetAPI.java     |  3 +--
 .../apache/solr/packagemanager/PackageManager.java | 25 +++++++++-----------
 .../src/java/org/apache/solr/search/Grouping.java  |  3 +--
 .../apache/solr/search/SolrDocumentFetcher.java    |  3 +--
 .../GroupedEndResultTransformer.java               |  3 +--
 .../org/apache/solr/cloud/RollingRestartTest.java  |  9 ++------
 .../solr/util/tracing/TestHttpServletCarrier.java  | 27 +++++++++++-----------
 17 files changed, 52 insertions(+), 75 deletions(-)

diff --git a/gradle/validation/forbidden-apis/org.apache.commons.collections4.all.txt b/gradle/validation/forbidden-apis/org.apache.commons.collections4.all.txt
new file mode 100644
index 00000000000..309784079cf
--- /dev/null
+++ b/gradle/validation/forbidden-apis/org.apache.commons.collections4.all.txt
@@ -0,0 +1,2 @@
+@defaultMessage Use Java Collection methods or Java Streams instead
+org.apache.commons.collections4.**
diff --git a/solr/core/build.gradle b/solr/core/build.gradle
index fba7122dd34..9d8d164a00e 100644
--- a/solr/core/build.gradle
+++ b/solr/core/build.gradle
@@ -107,7 +107,6 @@ dependencies {
   implementation 'org.apache.commons:commons-math3'
   implementation 'commons-io:commons-io'
   implementation 'com.carrotsearch:hppc'
-  implementation 'org.apache.commons:commons-collections4'
 
   implementation('com.github.ben-manes.caffeine:caffeine') { transitive = false }
 
diff --git a/solr/core/src/java/org/apache/solr/core/PluginBag.java b/solr/core/src/java/org/apache/solr/core/PluginBag.java
index 7e06449ca5a..f583fc03bd2 100644
--- a/solr/core/src/java/org/apache/solr/core/PluginBag.java
+++ b/solr/core/src/java/org/apache/solr/core/PluginBag.java
@@ -32,7 +32,6 @@ import java.util.Set;
 import java.util.concurrent.ConcurrentHashMap;
 import java.util.function.Supplier;
 import java.util.stream.Collectors;
-import org.apache.commons.collections4.CollectionUtils;
 import org.apache.lucene.util.ResourceLoader;
 import org.apache.lucene.util.ResourceLoaderAware;
 import org.apache.solr.api.Api;
@@ -256,7 +255,7 @@ public class PluginBag<T> implements AutoCloseable {
             //  resource registers under?
             Collection<Class<? extends JerseyResource>> jerseyApis =
                 apiSupport.getJerseyResources();
-            if (!CollectionUtils.isEmpty(jerseyApis)) {
+            if (jerseyApis != null) {
               for (Class<? extends JerseyResource> jerseyClazz : jerseyApis) {
                 if (log.isDebugEnabled()) {
                   log.debug("Registering jersey resource class: {}", jerseyClazz.getName());
diff --git a/solr/core/src/java/org/apache/solr/handler/CollectionsAPI.java b/solr/core/src/java/org/apache/solr/handler/CollectionsAPI.java
index 79af6a65d31..a07ef69ca9f 100644
--- a/solr/core/src/java/org/apache/solr/handler/CollectionsAPI.java
+++ b/solr/core/src/java/org/apache/solr/handler/CollectionsAPI.java
@@ -32,7 +32,6 @@ import java.util.List;
 import java.util.Map;
 import java.util.Set;
 import java.util.stream.Collectors;
-import org.apache.commons.collections4.CollectionUtils;
 import org.apache.solr.api.Command;
 import org.apache.solr.api.EndPoint;
 import org.apache.solr.api.PayloadObj;
@@ -101,7 +100,7 @@ public class CollectionsAPI {
       final Map<String, Object> v1Params = v2Body.toMap(new HashMap<>());
 
       v1Params.put(ACTION, CollectionAction.CREATEALIAS.toLower());
-      if (!CollectionUtils.isEmpty(v2Body.collections)) {
+      if (v2Body.collections != null && !v2Body.collections.isEmpty()) {
         final String collectionsStr = String.join(",", v2Body.collections);
         v1Params.remove(V2ApiConstants.COLLECTIONS);
         v1Params.put(V2ApiConstants.COLLECTIONS, collectionsStr);
diff --git a/solr/core/src/java/org/apache/solr/handler/admin/api/AddReplicaAPI.java b/solr/core/src/java/org/apache/solr/handler/admin/api/AddReplicaAPI.java
index 99b08200c13..caf545f029e 100644
--- a/solr/core/src/java/org/apache/solr/handler/admin/api/AddReplicaAPI.java
+++ b/solr/core/src/java/org/apache/solr/handler/admin/api/AddReplicaAPI.java
@@ -28,8 +28,6 @@ import static org.apache.solr.security.PermissionNameProvider.Name.COLL_EDIT_PER
 
 import java.util.HashMap;
 import java.util.Map;
-import org.apache.commons.collections4.CollectionUtils;
-import org.apache.commons.collections4.MapUtils;
 import org.apache.solr.api.Command;
 import org.apache.solr.api.EndPoint;
 import org.apache.solr.api.PayloadObj;
@@ -65,10 +63,8 @@ public class AddReplicaAPI {
     v1Params.put(ACTION, CollectionParams.CollectionAction.ADDREPLICA.toLower());
     v1Params.put(COLLECTION, obj.getRequest().getPathTemplateValues().get(COLLECTION));
 
-    if (MapUtils.isNotEmpty(v2Body.coreProperties)) {
-      flattenMapWithPrefix(v2Body.coreProperties, v1Params, PROPERTY_PREFIX);
-    }
-    if (CollectionUtils.isNotEmpty(v2Body.createNodeSet)) {
+    flattenMapWithPrefix(v2Body.coreProperties, v1Params, PROPERTY_PREFIX);
+    if (v2Body.createNodeSet != null && !v2Body.createNodeSet.isEmpty()) {
       v1Params.replace(CREATE_NODE_SET_PARAM, String.join(",", v2Body.createNodeSet));
     }
     collectionsHandler.handleRequestBody(wrapParams(obj.getRequest(), v1Params), obj.getResponse());
diff --git a/solr/core/src/java/org/apache/solr/handler/admin/api/CreateShardAPI.java b/solr/core/src/java/org/apache/solr/handler/admin/api/CreateShardAPI.java
index b7f3ddaba81..080068c4d69 100644
--- a/solr/core/src/java/org/apache/solr/handler/admin/api/CreateShardAPI.java
+++ b/solr/core/src/java/org/apache/solr/handler/admin/api/CreateShardAPI.java
@@ -29,7 +29,6 @@ import static org.apache.solr.security.PermissionNameProvider.Name.COLL_EDIT_PER
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
-import org.apache.commons.collections4.MapUtils;
 import org.apache.solr.api.Command;
 import org.apache.solr.api.EndPoint;
 import org.apache.solr.api.PayloadObj;
@@ -69,9 +68,7 @@ public class CreateShardAPI {
       v1Params.put(CREATE_NODE_SET_PARAM, buildV1CreateNodeSetValue(v2Body.nodeSet));
     }
 
-    if (MapUtils.isNotEmpty(v2Body.coreProperties)) {
-      flattenMapWithPrefix(v2Body.coreProperties, v1Params, PROPERTY_PREFIX);
-    }
+    flattenMapWithPrefix(v2Body.coreProperties, v1Params, PROPERTY_PREFIX);
     collectionsHandler.handleRequestBody(wrapParams(obj.getRequest(), v1Params), obj.getResponse());
   }
 
diff --git a/solr/core/src/java/org/apache/solr/handler/admin/api/MergeIndexesAPI.java b/solr/core/src/java/org/apache/solr/handler/admin/api/MergeIndexesAPI.java
index b41cfa49fb0..b99141a9047 100644
--- a/solr/core/src/java/org/apache/solr/handler/admin/api/MergeIndexesAPI.java
+++ b/solr/core/src/java/org/apache/solr/handler/admin/api/MergeIndexesAPI.java
@@ -25,7 +25,6 @@ import java.util.HashMap;
 import java.util.List;
 import java.util.Locale;
 import java.util.Map;
-import org.apache.commons.collections4.CollectionUtils;
 import org.apache.solr.api.Command;
 import org.apache.solr.api.EndPoint;
 import org.apache.solr.api.PayloadObj;
@@ -63,11 +62,11 @@ public class MergeIndexesAPI {
         CoreAdminParams.CoreAdminAction.MERGEINDEXES.name().toLowerCase(Locale.ROOT));
     v1Params.put(
         CoreAdminParams.CORE, obj.getRequest().getPathTemplateValues().get(CoreAdminParams.CORE));
-    if (!CollectionUtils.isEmpty(v2Body.indexDir)) {
-      v1Params.put("indexDir", v2Body.indexDir.toArray(new String[v2Body.indexDir.size()]));
+    if (v2Body.indexDir != null && !v2Body.indexDir.isEmpty()) {
+      v1Params.put("indexDir", v2Body.indexDir.toArray(new String[0]));
     }
-    if (!CollectionUtils.isEmpty(v2Body.srcCore)) {
-      v1Params.put("srcCore", v2Body.srcCore.toArray(new String[v2Body.srcCore.size()]));
+    if (v2Body.srcCore != null && !v2Body.srcCore.isEmpty()) {
+      v1Params.put("srcCore", v2Body.srcCore.toArray(new String[0]));
     }
     // V1 API uses 'update.chain' instead of 'updateChain'.
     if (v2Body.updateChain != null) {
diff --git a/solr/core/src/java/org/apache/solr/handler/admin/api/RenameCollectionAPI.java b/solr/core/src/java/org/apache/solr/handler/admin/api/RenameCollectionAPI.java
index 7f92593ff79..de6e0106701 100644
--- a/solr/core/src/java/org/apache/solr/handler/admin/api/RenameCollectionAPI.java
+++ b/solr/core/src/java/org/apache/solr/handler/admin/api/RenameCollectionAPI.java
@@ -30,7 +30,6 @@ import com.fasterxml.jackson.databind.MapperFeature;
 import com.fasterxml.jackson.databind.ObjectMapper;
 import java.io.IOException;
 import java.util.Locale;
-import org.apache.commons.collections4.IterableUtils;
 import org.apache.solr.api.EndPoint;
 import org.apache.solr.client.solrj.request.beans.RenameCollectionPayload;
 import org.apache.solr.common.params.CollectionAdminParams;
@@ -86,14 +85,18 @@ public class RenameCollectionAPI {
   //  something that's already somewhat built-in when this eventually moves to JAX-RS
   private RenameCollectionPayload parseRenameParamsFromRequestBody(
       SolrQueryRequest solrQueryRequest) throws IOException {
-    if (IterableUtils.isEmpty(solrQueryRequest.getContentStreams())) {
+    Iterable<ContentStream> contentStreams = solrQueryRequest.getContentStreams();
+    ContentStream cs = null;
+    if (contentStreams != null) {
+      cs = contentStreams.iterator().next();
+    }
+    if (cs == null) {
       // An empty request-body is invalid (the 'to' field is required at a minimum), but we'll lean
       // on the input-validation in CollectionsHandler to
       // catch this, rather than duplicating the check for that here
       return new RenameCollectionPayload();
     }
 
-    final ContentStream cs = solrQueryRequest.getContentStreams().iterator().next();
     return REQUEST_BODY_PARSER.readValue(cs.getStream(), RenameCollectionPayload.class);
   }
 }
diff --git a/solr/core/src/java/org/apache/solr/handler/admin/api/SplitCoreAPI.java b/solr/core/src/java/org/apache/solr/handler/admin/api/SplitCoreAPI.java
index 0cb8e1e75d4..d846caea34b 100644
--- a/solr/core/src/java/org/apache/solr/handler/admin/api/SplitCoreAPI.java
+++ b/solr/core/src/java/org/apache/solr/handler/admin/api/SplitCoreAPI.java
@@ -28,7 +28,6 @@ import java.util.HashMap;
 import java.util.List;
 import java.util.Locale;
 import java.util.Map;
-import org.apache.commons.collections4.CollectionUtils;
 import org.apache.solr.api.Command;
 import org.apache.solr.api.EndPoint;
 import org.apache.solr.api.PayloadObj;
@@ -66,11 +65,11 @@ public class SplitCoreAPI {
     v1Params.put(
         CoreAdminParams.CORE, obj.getRequest().getPathTemplateValues().get(CoreAdminParams.CORE));
 
-    if (!CollectionUtils.isEmpty(v2Body.path)) {
-      v1Params.put(PATH, v2Body.path.toArray(new String[v2Body.path.size()]));
+    if (v2Body.path != null && !v2Body.path.isEmpty()) {
+      v1Params.put(PATH, v2Body.path.toArray(new String[0]));
     }
-    if (!CollectionUtils.isEmpty(v2Body.targetCore)) {
-      v1Params.put(TARGET_CORE, v2Body.targetCore.toArray(new String[v2Body.targetCore.size()]));
+    if (v2Body.targetCore != null && !v2Body.targetCore.isEmpty()) {
+      v1Params.put(TARGET_CORE, v2Body.targetCore.toArray(new String[0]));
     }
 
     if (v2Body.splitKey != null) {
diff --git a/solr/core/src/java/org/apache/solr/handler/admin/api/SplitShardAPI.java b/solr/core/src/java/org/apache/solr/handler/admin/api/SplitShardAPI.java
index b161b76c35c..0a3a8c3520f 100644
--- a/solr/core/src/java/org/apache/solr/handler/admin/api/SplitShardAPI.java
+++ b/solr/core/src/java/org/apache/solr/handler/admin/api/SplitShardAPI.java
@@ -27,7 +27,6 @@ import static org.apache.solr.security.PermissionNameProvider.Name.COLL_EDIT_PER
 
 import java.util.HashMap;
 import java.util.Map;
-import org.apache.commons.collections4.MapUtils;
 import org.apache.commons.lang3.StringUtils;
 import org.apache.solr.api.Command;
 import org.apache.solr.api.EndPoint;
@@ -68,9 +67,7 @@ public class SplitShardAPI {
     if (StringUtils.isNotEmpty(v2Body.splitKey)) {
       v1Params.put(CommonAdminParams.SPLIT_KEY, v2Body.splitKey);
     }
-    if (MapUtils.isNotEmpty(v2Body.coreProperties)) {
-      flattenMapWithPrefix(v2Body.coreProperties, v1Params, PROPERTY_PREFIX);
-    }
+    flattenMapWithPrefix(v2Body.coreProperties, v1Params, PROPERTY_PREFIX);
     collectionsHandler.handleRequestBody(wrapParams(obj.getRequest(), v1Params), obj.getResponse());
   }
 }
diff --git a/solr/core/src/java/org/apache/solr/handler/configsets/CreateConfigSetAPI.java b/solr/core/src/java/org/apache/solr/handler/configsets/CreateConfigSetAPI.java
index 7f52a06a525..78144edd247 100644
--- a/solr/core/src/java/org/apache/solr/handler/configsets/CreateConfigSetAPI.java
+++ b/solr/core/src/java/org/apache/solr/handler/configsets/CreateConfigSetAPI.java
@@ -24,7 +24,6 @@ import static org.apache.solr.security.PermissionNameProvider.Name.CONFIG_EDIT_P
 
 import java.util.HashMap;
 import java.util.Map;
-import org.apache.commons.collections4.MapUtils;
 import org.apache.solr.api.Command;
 import org.apache.solr.api.EndPoint;
 import org.apache.solr.api.PayloadObj;
@@ -75,7 +74,7 @@ public class CreateConfigSetAPI extends ConfigSetAPIBase {
     final Map<String, Object> configsetCommandMsg = new HashMap<>();
     configsetCommandMsg.put(NAME, createConfigPayload.name);
     configsetCommandMsg.put(ConfigSetCmds.BASE_CONFIGSET, createConfigPayload.baseConfigSet);
-    if (!MapUtils.isEmpty(createConfigPayload.properties)) {
+    if (createConfigPayload.properties != null) {
       for (Map.Entry<String, Object> e : createConfigPayload.properties.entrySet()) {
         configsetCommandMsg.put(
             ConfigSetCmds.CONFIG_SET_PROPERTY_PREFIX + e.getKey(), e.getValue());
diff --git a/solr/core/src/java/org/apache/solr/packagemanager/PackageManager.java b/solr/core/src/java/org/apache/solr/packagemanager/PackageManager.java
index 66af682f621..4f0561abd29 100644
--- a/solr/core/src/java/org/apache/solr/packagemanager/PackageManager.java
+++ b/solr/core/src/java/org/apache/solr/packagemanager/PackageManager.java
@@ -36,8 +36,6 @@ import java.util.Scanner;
 import java.util.Set;
 import java.util.concurrent.TimeUnit;
 import java.util.stream.Collectors;
-import org.apache.commons.collections4.MultiValuedMap;
-import org.apache.commons.collections4.multimap.HashSetValuedHashMap;
 import org.apache.http.client.methods.HttpDelete;
 import org.apache.solr.client.solrj.SolrRequest;
 import org.apache.solr.client.solrj.SolrServerException;
@@ -270,7 +268,7 @@ public class PackageManager implements Closeable {
   public Map<String, SolrPackageInstance> getPackagesDeployedAsClusterLevelPlugins() {
     Map<String, String> packageVersions = new HashMap<>();
     // map of package name to multiple values of pluginMeta(Map<String, String>)
-    MultiValuedMap<String, PluginMeta> packagePlugins = new HashSetValuedHashMap<>();
+    Map<String, Set<PluginMeta>> packagePlugins = new HashMap<>();
     Map<String, Object> result;
     try {
       result =
@@ -291,13 +289,11 @@ public class PackageManager implements Closeable {
     Map<String, Object> clusterPlugins =
         (Map<String, Object>)
             result.getOrDefault(ContainerPluginsApi.PLUGIN, Collections.emptyMap());
-    for (String key : clusterPlugins.keySet()) {
-      // Map<String, String> pluginMeta = (Map<String, String>) clusterPlugins.get(key);
+    for (Map.Entry<String, Object> entry : clusterPlugins.entrySet()) {
       PluginMeta pluginMeta;
       try {
         pluginMeta =
-            PackageUtils.getMapper()
-                .readValue(Utils.toJSON(clusterPlugins.get(key)), PluginMeta.class);
+            PackageUtils.getMapper().readValue(Utils.toJSON(entry.getValue()), PluginMeta.class);
       } catch (IOException e) {
         throw new SolrException(
             ErrorCode.SERVER_ERROR,
@@ -307,16 +303,17 @@ public class PackageManager implements Closeable {
       if (pluginMeta.klass.contains(":")) {
         String packageName = pluginMeta.klass.substring(0, pluginMeta.klass.indexOf(':'));
         packageVersions.put(packageName, pluginMeta.version);
-        packagePlugins.put(packageName, pluginMeta);
+        packagePlugins.computeIfAbsent(packageName, k -> new HashSet<>()).add(pluginMeta);
       }
     }
     Map<String, SolrPackageInstance> ret = new HashMap<>();
-    for (String packageName : packageVersions.keySet()) {
-      if (StrUtils.isNullOrEmpty(packageName) == false
-          && // There can be an empty key, storing the version here
-          packageVersions.get(packageName)
-              != null) { // null means the package was undeployed from this package before
-        ret.put(packageName, getPackageInstance(packageName, packageVersions.get(packageName)));
+    for (Map.Entry<String, String> entry : packageVersions.entrySet()) {
+      String packageName = entry.getKey();
+      String packageVersion = entry.getValue();
+      // There can be an empty key, storing the version here
+      // null means the package was undeployed from this package before
+      if (!StrUtils.isNullOrEmpty(packageName) && packageVersion != null) {
+        ret.put(packageName, getPackageInstance(packageName, packageVersion));
         ret.get(packageName).setCustomData(packagePlugins.get(packageName));
       }
     }
diff --git a/solr/core/src/java/org/apache/solr/search/Grouping.java b/solr/core/src/java/org/apache/solr/search/Grouping.java
index 0d28b7d4c6f..25714630cab 100644
--- a/solr/core/src/java/org/apache/solr/search/Grouping.java
+++ b/solr/core/src/java/org/apache/solr/search/Grouping.java
@@ -26,7 +26,6 @@ import java.util.List;
 import java.util.Locale;
 import java.util.Map;
 import java.util.Set;
-import org.apache.commons.collections4.CollectionUtils;
 import org.apache.commons.lang3.ArrayUtils;
 import org.apache.lucene.index.ExitableDirectoryReader;
 import org.apache.lucene.index.IndexableField;
@@ -849,7 +848,7 @@ public class Grouping {
           // TODO: currently, this path is called only for string field, so
           // should we just use fieldType.toObject(schemaField, group.groupValue) here?
           List<IndexableField> fields = schemaField.createFields(group.groupValue.utf8ToString());
-          if (CollectionUtils.isNotEmpty(fields)) {
+          if (fields != null && !fields.isEmpty()) {
             nl.add("groupValue", fieldType.toObject(fields.get(0)));
           } else {
             throw new SolrException(
diff --git a/solr/core/src/java/org/apache/solr/search/SolrDocumentFetcher.java b/solr/core/src/java/org/apache/solr/search/SolrDocumentFetcher.java
index ca231379cb8..d93c6acebfc 100644
--- a/solr/core/src/java/org/apache/solr/search/SolrDocumentFetcher.java
+++ b/solr/core/src/java/org/apache/solr/search/SolrDocumentFetcher.java
@@ -32,7 +32,6 @@ import java.util.Objects;
 import java.util.Set;
 import java.util.function.Predicate;
 import java.util.function.Supplier;
-import org.apache.commons.collections4.CollectionUtils;
 import org.apache.lucene.analysis.Analyzer;
 import org.apache.lucene.analysis.TokenStream;
 import org.apache.lucene.document.Document;
@@ -762,7 +761,7 @@ public class SolrDocumentFetcher {
     }
 
     private boolean returnDVFields() {
-      return CollectionUtils.isNotEmpty(dvFields);
+      return !dvFields.isEmpty();
     }
 
     private Set<String> getStoredFields() {
diff --git a/solr/core/src/java/org/apache/solr/search/grouping/endresulttransformer/GroupedEndResultTransformer.java b/solr/core/src/java/org/apache/solr/search/grouping/endresulttransformer/GroupedEndResultTransformer.java
index 8006673034f..78244263855 100644
--- a/solr/core/src/java/org/apache/solr/search/grouping/endresulttransformer/GroupedEndResultTransformer.java
+++ b/solr/core/src/java/org/apache/solr/search/grouping/endresulttransformer/GroupedEndResultTransformer.java
@@ -19,7 +19,6 @@ package org.apache.solr.search.grouping.endresulttransformer;
 import java.util.ArrayList;
 import java.util.List;
 import java.util.Map;
-import org.apache.commons.collections4.CollectionUtils;
 import org.apache.lucene.index.IndexableField;
 import org.apache.lucene.search.ScoreDoc;
 import org.apache.lucene.search.TopDocs;
@@ -77,7 +76,7 @@ public class GroupedEndResultTransformer implements EndResultTransformer {
           if (group.groupValue != null) {
             // use createFields so that fields having doc values are also supported
             List<IndexableField> fields = groupField.createFields(group.groupValue.utf8ToString());
-            if (CollectionUtils.isNotEmpty(fields)) {
+            if (fields != null && !fields.isEmpty()) {
               groupResult.add("groupValue", groupFieldType.toObject(fields.get(0)));
             } else {
               throw new SolrException(
diff --git a/solr/core/src/test/org/apache/solr/cloud/RollingRestartTest.java b/solr/core/src/test/org/apache/solr/cloud/RollingRestartTest.java
index 44757908cee..aa08e871722 100644
--- a/solr/core/src/test/org/apache/solr/cloud/RollingRestartTest.java
+++ b/solr/core/src/test/org/apache/solr/cloud/RollingRestartTest.java
@@ -20,7 +20,6 @@ import java.lang.invoke.MethodHandles;
 import java.util.ArrayList;
 import java.util.List;
 import java.util.concurrent.TimeUnit;
-import org.apache.commons.collections4.CollectionUtils;
 import org.apache.solr.client.solrj.request.CollectionAdminRequest;
 import org.apache.solr.common.cloud.SolrZkClient;
 import org.apache.solr.common.cloud.ZkStateReader;
@@ -95,9 +94,7 @@ public class RollingRestartTest extends AbstractFullDistribZkTestBase {
         chaosMonkey.stopJetty(cloudJetty);
         zkStateReader.updateLiveNodes();
         boolean liveDesignates =
-            CollectionUtils.intersection(zkStateReader.getClusterState().getLiveNodes(), designates)
-                    .size()
-                > 0;
+            zkStateReader.getClusterState().getLiveNodes().stream().anyMatch(designates::contains);
         if (liveDesignates) {
           boolean success =
               waitUntilOverseerDesignateIsLeader(zkStateReader.getZkClient(), designates);
@@ -127,9 +124,7 @@ public class RollingRestartTest extends AbstractFullDistribZkTestBase {
 
         zkStateReader.updateLiveNodes();
         sawLiveDesignate =
-            CollectionUtils.intersection(zkStateReader.getClusterState().getLiveNodes(), designates)
-                    .size()
-                > 0;
+            zkStateReader.getClusterState().getLiveNodes().stream().anyMatch(designates::contains);
       }
     }
 
diff --git a/solr/core/src/test/org/apache/solr/util/tracing/TestHttpServletCarrier.java b/solr/core/src/test/org/apache/solr/util/tracing/TestHttpServletCarrier.java
index bd19112208e..4001af36b1c 100644
--- a/solr/core/src/test/org/apache/solr/util/tracing/TestHttpServletCarrier.java
+++ b/solr/core/src/test/org/apache/solr/util/tracing/TestHttpServletCarrier.java
@@ -21,13 +21,14 @@ import static org.mockito.ArgumentMatchers.anyString;
 import static org.mockito.Mockito.mock;
 import static org.mockito.Mockito.when;
 
+import java.util.Collections;
 import java.util.Enumeration;
+import java.util.HashMap;
+import java.util.HashSet;
 import java.util.Iterator;
 import java.util.Map;
+import java.util.Set;
 import javax.servlet.http.HttpServletRequest;
-import org.apache.commons.collections4.IteratorUtils;
-import org.apache.commons.collections4.MultiValuedMap;
-import org.apache.commons.collections4.multimap.HashSetValuedHashMap;
 import org.apache.solr.SolrTestCaseJ4;
 import org.junit.Test;
 import org.mockito.stubbing.Answer;
@@ -38,29 +39,27 @@ public class TestHttpServletCarrier extends SolrTestCaseJ4 {
   public void test() {
     SolrTestCaseJ4.assumeWorkingMockito();
     HttpServletRequest req = mock(HttpServletRequest.class);
-    MultiValuedMap<String, String> headers = new HashSetValuedHashMap<>();
-    headers.put("a", "a");
-    headers.put("a", "b");
-    headers.put("a", "c");
-    headers.put("b", "a");
-    headers.put("b", "b");
-    headers.put("c", "a");
+    Map<String, Set<String>> headers =
+        Map.of(
+            "a", Set.of("a", "b", "c"),
+            "b", Set.of("a", "b"),
+            "c", Set.of("a"));
 
-    when(req.getHeaderNames()).thenReturn(IteratorUtils.asEnumeration(headers.keySet().iterator()));
+    when(req.getHeaderNames()).thenReturn(Collections.enumeration(headers.keySet()));
     when(req.getHeaders(anyString()))
         .thenAnswer(
             (Answer<Enumeration<String>>)
                 inv -> {
                   String key = inv.getArgument(0);
-                  return IteratorUtils.asEnumeration(headers.get(key).iterator());
+                  return Collections.enumeration(headers.get(key));
                 });
 
     HttpServletCarrier servletCarrier = new HttpServletCarrier(req);
     Iterator<Map.Entry<String, String>> it = servletCarrier.iterator();
-    MultiValuedMap<String, String> resultBack = new HashSetValuedHashMap<>();
+    Map<String, Set<String>> resultBack = new HashMap<>();
     while (it.hasNext()) {
       Map.Entry<String, String> entry = it.next();
-      resultBack.put(entry.getKey(), entry.getValue());
+      resultBack.computeIfAbsent(entry.getKey(), k -> new HashSet<>()).add(entry.getValue());
     }
     assertEquals(headers, resultBack);
   }