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/27 13:56:49 UTC

[solr] branch main updated: SOLR-16716: Replace commons-io usages with pure Java (#1491)

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

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


The following commit(s) were added to refs/heads/main by this push:
     new c621cc7d5d6 SOLR-16716: Replace commons-io usages with pure Java (#1491)
c621cc7d5d6 is described below

commit c621cc7d5d69f1c300ede7449f2652f69f18e262
Author: Kevin Risden <ri...@users.noreply.github.com>
AuthorDate: Mon Mar 27 09:54:59 2023 -0400

    SOLR-16716: Replace commons-io usages with pure Java (#1491)
---
 .../forbidden-apis/com.google.guava.guava.all.txt  |  9 +++++-
 .../forbidden-apis/commons-io.commons-io.all.txt   | 11 +++++++
 .../cloud/api/collections/TimeRoutedAlias.java     | 26 ++++++++++-------
 .../solr/handler/component/HighlightComponent.java |  4 +--
 .../solr/packagemanager/RepositoryManager.java     |  4 +--
 .../src/java/org/apache/solr/util/SolrCLI.java     | 34 +++++++++++++---------
 .../org/apache/solr/cloud/TestConfigSetsAPI.java   | 30 +++++++++----------
 .../solr/cloud/TestConfigSetsAPIZkFailure.java     | 18 ++++++------
 .../src/test/org/apache/solr/cloud/ZkCLITest.java  | 32 ++++++++++++--------
 .../apache/solr/core/TestConfigSetImmutable.java   | 17 ++++++-----
 .../org/apache/solr/core/TestCoreDiscovery.java    |  5 ++--
 .../test/org/apache/solr/core/TestLazyCores.java   | 22 ++++++--------
 .../apache/solr/schema/ChangedSchemaMergeTest.java | 24 +++++++--------
 .../apache/solr/servlet/SolrRequestParserTest.java | 10 +++----
 .../test/org/apache/solr/s3/S3IndexInputTest.java  |  4 +--
 15 files changed, 142 insertions(+), 108 deletions(-)

diff --git a/gradle/validation/forbidden-apis/com.google.guava.guava.all.txt b/gradle/validation/forbidden-apis/com.google.guava.guava.all.txt
index 7ded09d9789..c7029da3885 100644
--- a/gradle/validation/forbidden-apis/com.google.guava.guava.all.txt
+++ b/gradle/validation/forbidden-apis/com.google.guava.guava.all.txt
@@ -40,4 +40,11 @@ com.google.common.base.Strings
 @defaultMessage Use Caffeine cache instead
 com.google.common.cache.**
 
-# TODO com.google.common.base.MoreObjects
+@defaultMessage Use StringBuilder
+com.google.common.base.MoreObjects#toStringHelper(**)
+
+@defaultMessage Use Objects.requireNonNullElse instead
+com.google.common.base.MoreObjects#firstNonNull(**)
+
+@defaultMessage use Objects methods
+com.google.common.base.MoreObjects
diff --git a/gradle/validation/forbidden-apis/commons-io.commons-io.all.txt b/gradle/validation/forbidden-apis/commons-io.commons-io.all.txt
index 8ca8403272b..7f4694fb8b7 100644
--- a/gradle/validation/forbidden-apis/commons-io.commons-io.all.txt
+++ b/gradle/validation/forbidden-apis/commons-io.commons-io.all.txt
@@ -11,6 +11,17 @@ org.apache.commons.io.FileUtils#deleteDirectory(java.io.File)
 @defaultMessage Use Files.readString instead
 org.apache.commons.io.FileUtils#readFileToString(**)
 
+@defaultMessage Use Files.readAllBytes instead
+org.apache.commons.io.FileUtils#readFileToByteArray(**)
+
+@defaultMessage Use Files.readAllLines instead
+org.apache.commons.io.FileUtils#readLines(**)
+
+@defaultMessage Use Files.writeString instead
+org.apache.commons.io.FileUtils#write(**)
+org.apache.commons.io.FileUtils#writeLines(**)
+org.apache.commons.io.FileUtils#writeStringToFile(**)
+
 @defaultMessage Use OutputStream.nullOutputStream() instead
 org.apache.commons.io.output.NullPrintStream
 
diff --git a/solr/core/src/java/org/apache/solr/cloud/api/collections/TimeRoutedAlias.java b/solr/core/src/java/org/apache/solr/cloud/api/collections/TimeRoutedAlias.java
index 987cb3cd4ca..846ba8d67d7 100644
--- a/solr/core/src/java/org/apache/solr/cloud/api/collections/TimeRoutedAlias.java
+++ b/solr/core/src/java/org/apache/solr/cloud/api/collections/TimeRoutedAlias.java
@@ -25,7 +25,6 @@ import static org.apache.solr.common.SolrException.ErrorCode.BAD_REQUEST;
 import static org.apache.solr.common.params.CollectionAdminParams.ROUTER_PREFIX;
 import static org.apache.solr.common.params.CommonParams.TZ;
 
-import com.google.common.base.MoreObjects;
 import java.lang.invoke.MethodHandles;
 import java.text.ParseException;
 import java.time.Instant;
@@ -324,15 +323,22 @@ public class TimeRoutedAlias extends RoutedAlias {
 
   @Override
   public String toString() {
-    return MoreObjects.toStringHelper(this)
-        .add("aliasName", aliasName)
-        .add("routeField", routeField)
-        .add("intervalMath", intervalMath)
-        .add("maxFutureMs", maxFutureMs)
-        .add("preemptiveCreateMath", preemptiveCreateMath)
-        .add("autoDeleteAgeMath", autoDeleteAgeMath)
-        .add("timeZone", timeZone)
-        .toString();
+    return "TimeRoutedAlias=("
+        + "aliasName="
+        + aliasName
+        + ",routeField="
+        + routeField
+        + ",intervalMath="
+        + intervalMath
+        + ",maxFutureMs="
+        + maxFutureMs
+        + ",preemptiveCreateMath="
+        + preemptiveCreateMath
+        + ",autoDeleteAgeMath="
+        + autoDeleteAgeMath
+        + ",timeZone="
+        + timeZone
+        + ')';
   }
 
   /**
diff --git a/solr/core/src/java/org/apache/solr/handler/component/HighlightComponent.java b/solr/core/src/java/org/apache/solr/handler/component/HighlightComponent.java
index 3a1684cd45d..220ff1aca74 100644
--- a/solr/core/src/java/org/apache/solr/handler/component/HighlightComponent.java
+++ b/solr/core/src/java/org/apache/solr/handler/component/HighlightComponent.java
@@ -16,11 +16,11 @@
  */
 package org.apache.solr.handler.component;
 
-import com.google.common.base.MoreObjects;
 import java.io.IOException;
 import java.lang.reflect.Array;
 import java.util.List;
 import java.util.Map;
+import java.util.Objects;
 import java.util.function.Function;
 import java.util.stream.Collectors;
 import java.util.stream.Stream;
@@ -98,7 +98,7 @@ public class HighlightComponent extends SearchComponent
       rb.setNeedDocList(true);
       String hlq = params.get(HighlightParams.Q);
       String hlparser =
-          MoreObjects.firstNonNull(
+          Objects.requireNonNullElse(
               params.get(HighlightParams.QPARSER),
               params.get(QueryParsing.DEFTYPE, QParserPlugin.DEFAULT_QTYPE));
       if (hlq != null) {
diff --git a/solr/core/src/java/org/apache/solr/packagemanager/RepositoryManager.java b/solr/core/src/java/org/apache/solr/packagemanager/RepositoryManager.java
index 45d821f5cd5..303c7ccd30a 100644
--- a/solr/core/src/java/org/apache/solr/packagemanager/RepositoryManager.java
+++ b/solr/core/src/java/org/apache/solr/packagemanager/RepositoryManager.java
@@ -25,6 +25,7 @@ import java.io.UnsupportedEncodingException;
 import java.lang.invoke.MethodHandles;
 import java.net.URL;
 import java.nio.ByteBuffer;
+import java.nio.file.Files;
 import java.nio.file.Path;
 import java.nio.file.Paths;
 import java.util.ArrayList;
@@ -35,7 +36,6 @@ import java.util.List;
 import java.util.Locale;
 import java.util.Map;
 import java.util.stream.Collectors;
-import org.apache.commons.io.FileUtils;
 import org.apache.solr.client.solrj.SolrRequest;
 import org.apache.solr.client.solrj.SolrServerException;
 import org.apache.solr.client.solrj.impl.HttpSolrClient;
@@ -201,7 +201,7 @@ public class RepositoryManager {
       for (int i = 0; i < release.artifacts.size(); i++) {
         PackageUtils.postFile(
             solrClient,
-            ByteBuffer.wrap(FileUtils.readFileToByteArray(downloaded.get(i).toFile())),
+            ByteBuffer.wrap(Files.readAllBytes(downloaded.get(i))),
             String.format(
                 Locale.ROOT,
                 "/package/%s/%s/%s",
diff --git a/solr/core/src/java/org/apache/solr/util/SolrCLI.java b/solr/core/src/java/org/apache/solr/util/SolrCLI.java
index 0f11ed44147..dd392e0a184 100755
--- a/solr/core/src/java/org/apache/solr/util/SolrCLI.java
+++ b/solr/core/src/java/org/apache/solr/util/SolrCLI.java
@@ -56,6 +56,7 @@ import java.util.Set;
 import java.util.TreeSet;
 import java.util.concurrent.TimeUnit;
 import java.util.concurrent.TimeoutException;
+import java.util.stream.Collectors;
 import java.util.zip.ZipEntry;
 import java.util.zip.ZipInputStream;
 import javax.net.ssl.SSLPeerUnverifiedException;
@@ -4334,7 +4335,7 @@ public class SolrCLI implements CLIO {
           }
 
           // update the solr.in.sh file to contain the necessary authentication lines
-          updateIncludeFileEnableAuth(includeFile, null, config, cli);
+          updateIncludeFileEnableAuth(includeFile.toPath(), null, config, cli);
           echo(
               "Successfully enabled Kerberos authentication; please restart any running Solr nodes.");
           return 0;
@@ -4369,7 +4370,7 @@ public class SolrCLI implements CLIO {
           }
 
           // update the solr.in.sh file to comment out the necessary authentication lines
-          updateIncludeFileDisableAuth(includeFile, cli);
+          updateIncludeFileDisableAuth(includeFile.toPath(), cli);
           return 0;
 
         default:
@@ -4529,13 +4530,14 @@ public class SolrCLI implements CLIO {
             System.exit(0);
           }
 
-          FileUtils.writeStringToFile(
-              basicAuthConfFile,
+          Files.writeString(
+              basicAuthConfFile.toPath(),
               "httpBasicAuthUser=" + username + "\nhttpBasicAuthPassword=" + password,
               StandardCharsets.UTF_8);
 
           // update the solr.in.sh file to contain the necessary authentication lines
-          updateIncludeFileEnableAuth(includeFile, basicAuthConfFile.getAbsolutePath(), null, cli);
+          updateIncludeFileEnableAuth(
+              includeFile.toPath(), basicAuthConfFile.getAbsolutePath(), null, cli);
           final String successMessage =
               String.format(
                   Locale.ROOT,
@@ -4575,7 +4577,7 @@ public class SolrCLI implements CLIO {
           }
 
           // update the solr.in.sh file to comment out the necessary authentication lines
-          updateIncludeFileDisableAuth(includeFile, cli);
+          updateIncludeFileDisableAuth(includeFile.toPath(), cli);
           return 0;
 
         default:
@@ -4644,11 +4646,11 @@ public class SolrCLI implements CLIO {
      *     null.
      */
     private void updateIncludeFileEnableAuth(
-        File includeFile, String basicAuthConfFile, String kerberosConfig, CommandLine cli)
+        Path includeFile, String basicAuthConfFile, String kerberosConfig, CommandLine cli)
         throws IOException {
       assert !(basicAuthConfFile != null
           && kerberosConfig != null); // only one of the two needs to be populated
-      List<String> includeFileLines = FileUtils.readLines(includeFile, StandardCharsets.UTF_8);
+      List<String> includeFileLines = Files.readAllLines(includeFile, StandardCharsets.UTF_8);
       for (int i = 0; i < includeFileLines.size(); i++) {
         String line = includeFileLines.get(i);
         if (authenticationVariables.contains(line.trim().split("=")[0].trim())) { // Non-Windows
@@ -4690,17 +4692,19 @@ public class SolrCLI implements CLIO {
           includeFileLines.add("SOLR_AUTHENTICATION_OPTS=\"" + kerberosConfig + "\"");
         }
       }
-      FileUtils.writeLines(includeFile, StandardCharsets.UTF_8.name(), includeFileLines);
+
+      String lines = includeFileLines.stream().collect(Collectors.joining(System.lineSeparator()));
+      Files.writeString(includeFile, lines, StandardCharsets.UTF_8);
 
       if (basicAuthConfFile != null) {
         echoIfVerbose("Written out credentials file: " + basicAuthConfFile, cli);
       }
-      echoIfVerbose("Updated Solr include file: " + includeFile.getAbsolutePath(), cli);
+      echoIfVerbose("Updated Solr include file: " + includeFile.toAbsolutePath(), cli);
     }
 
-    private void updateIncludeFileDisableAuth(File includeFile, CommandLine cli)
+    private void updateIncludeFileDisableAuth(Path includeFile, CommandLine cli)
         throws IOException {
-      List<String> includeFileLines = FileUtils.readLines(includeFile, StandardCharsets.UTF_8);
+      List<String> includeFileLines = Files.readAllLines(includeFile, StandardCharsets.UTF_8);
       boolean hasChanged = false;
       for (int i = 0; i < includeFileLines.size(); i++) {
         String line = includeFileLines.get(i);
@@ -4716,8 +4720,10 @@ public class SolrCLI implements CLIO {
         }
       }
       if (hasChanged) {
-        FileUtils.writeLines(includeFile, StandardCharsets.UTF_8.name(), includeFileLines);
-        echoIfVerbose("Commented out necessary lines from " + includeFile.getAbsolutePath(), cli);
+        String lines =
+            includeFileLines.stream().collect(Collectors.joining(System.lineSeparator()));
+        Files.writeString(includeFile, lines, StandardCharsets.UTF_8);
+        echoIfVerbose("Commented out necessary lines from " + includeFile.toAbsolutePath(), cli);
       }
     }
 
diff --git a/solr/core/src/test/org/apache/solr/cloud/TestConfigSetsAPI.java b/solr/core/src/test/org/apache/solr/cloud/TestConfigSetsAPI.java
index efc92fec914..1da60d85ff9 100644
--- a/solr/core/src/test/org/apache/solr/cloud/TestConfigSetsAPI.java
+++ b/solr/core/src/test/org/apache/solr/cloud/TestConfigSetsAPI.java
@@ -55,7 +55,7 @@ import javax.servlet.FilterChain;
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletRequestWrapper;
 import javax.servlet.http.HttpServletResponse;
-import org.apache.commons.io.FileUtils;
+import org.apache.commons.io.file.PathUtils;
 import org.apache.http.HttpEntity;
 import org.apache.http.auth.BasicUserPrincipal;
 import org.apache.http.client.methods.HttpEntityEnclosingRequestBase;
@@ -288,17 +288,17 @@ public class TestConfigSetsAPI extends SolrCloudTestCase {
 
   private void setupBaseConfigSet(String baseConfigSetName, Map<String, String> oldProps)
       throws Exception {
-    final File configDir = getFile("solr").toPath().resolve("configsets/configset-2/conf").toFile();
-    final File tmpConfigDir = createTempDir().toFile();
-    tmpConfigDir.deleteOnExit();
-    FileUtils.copyDirectory(configDir, tmpConfigDir);
+    final Path configDir = getFile("solr").toPath().resolve("configsets/configset-2/conf");
+    final Path tmpConfigDir = createTempDir();
+    tmpConfigDir.toFile().deleteOnExit();
+    PathUtils.copyDirectory(configDir, tmpConfigDir);
     if (oldProps != null) {
-      FileUtils.write(
-          new File(tmpConfigDir, ConfigSetProperties.DEFAULT_FILENAME),
+      Files.writeString(
+          tmpConfigDir.resolve(ConfigSetProperties.DEFAULT_FILENAME),
           getConfigSetProps(oldProps),
           UTF_8);
     }
-    getConfigSetService().uploadConfig(baseConfigSetName, tmpConfigDir.toPath());
+    getConfigSetService().uploadConfig(baseConfigSetName, tmpConfigDir);
   }
 
   private void verifyCreate(
@@ -1871,16 +1871,16 @@ public class TestConfigSetsAPI extends SolrCloudTestCase {
   public void testDeleteErrors() throws Exception {
     final String baseUrl = cluster.getJettySolrRunners().get(0).getBaseUrl().toString();
     final SolrClient solrClient = getHttpSolrClient(baseUrl);
-    final File configDir = getFile("solr").toPath().resolve("configsets/configset-2/conf").toFile();
-    final File tmpConfigDir = createTempDir().toFile();
-    tmpConfigDir.deleteOnExit();
+    final Path configDir = getFile("solr").toPath().resolve("configsets/configset-2/conf");
+    final Path tmpConfigDir = createTempDir();
+    tmpConfigDir.toFile().deleteOnExit();
     // Ensure ConfigSet is immutable
-    FileUtils.copyDirectory(configDir, tmpConfigDir);
-    FileUtils.write(
-        new File(tmpConfigDir, "configsetprops.json"),
+    PathUtils.copyDirectory(configDir, tmpConfigDir);
+    Files.writeString(
+        tmpConfigDir.resolve("configsetprops.json"),
         getConfigSetProps(Map.of("immutable", "true")),
         UTF_8);
-    getConfigSetService().uploadConfig("configSet", tmpConfigDir.toPath());
+    getConfigSetService().uploadConfig("configSet", tmpConfigDir);
 
     // no ConfigSet name
     DeleteNoErrorChecking delete = new DeleteNoErrorChecking();
diff --git a/solr/core/src/test/org/apache/solr/cloud/TestConfigSetsAPIZkFailure.java b/solr/core/src/test/org/apache/solr/cloud/TestConfigSetsAPIZkFailure.java
index f5043df7abb..f5728f09387 100644
--- a/solr/core/src/test/org/apache/solr/cloud/TestConfigSetsAPIZkFailure.java
+++ b/solr/core/src/test/org/apache/solr/cloud/TestConfigSetsAPIZkFailure.java
@@ -18,10 +18,10 @@ package org.apache.solr.cloud;
 
 import static org.apache.solr.cloud.ZkConfigSetService.CONFIGS_ZKNODE;
 
-import java.io.File;
 import java.io.IOException;
 import java.io.PrintWriter;
 import java.nio.charset.StandardCharsets;
+import java.nio.file.Files;
 import java.nio.file.Path;
 import java.util.Collection;
 import java.util.List;
@@ -30,7 +30,7 @@ import java.util.Set;
 import java.util.concurrent.ConcurrentHashMap;
 import java.util.concurrent.TimeUnit;
 import java.util.concurrent.locks.ReentrantReadWriteLock;
-import org.apache.commons.io.FileUtils;
+import org.apache.commons.io.file.PathUtils;
 import org.apache.jute.InputArchive;
 import org.apache.jute.OutputArchive;
 import org.apache.jute.Record;
@@ -141,17 +141,17 @@ public class TestConfigSetsAPIZkFailure extends SolrTestCaseJ4 {
 
   private void setupBaseConfigSet(String baseConfigSetName, Map<String, String> oldProps)
       throws Exception {
-    final File configDir = getFile("solr").toPath().resolve("configsets/configset-2/conf").toFile();
-    final File tmpConfigDir = createTempDir().toFile();
-    tmpConfigDir.deleteOnExit();
-    FileUtils.copyDirectory(configDir, tmpConfigDir);
+    final Path configDir = getFile("solr").toPath().resolve("configsets/configset-2/conf");
+    final Path tmpConfigDir = createTempDir();
+    tmpConfigDir.toFile().deleteOnExit();
+    PathUtils.copyDirectory(configDir, tmpConfigDir);
     if (oldProps != null) {
-      FileUtils.write(
-          new File(tmpConfigDir, ConfigSetProperties.DEFAULT_FILENAME),
+      Files.writeString(
+          tmpConfigDir.resolve(ConfigSetProperties.DEFAULT_FILENAME),
           getConfigSetProps(oldProps),
           StandardCharsets.UTF_8);
     }
-    solrCluster.uploadConfigSet(tmpConfigDir.toPath(), baseConfigSetName);
+    solrCluster.uploadConfigSet(tmpConfigDir, baseConfigSetName);
     solrCluster
         .getZkClient()
         .setData(
diff --git a/solr/core/src/test/org/apache/solr/cloud/ZkCLITest.java b/solr/core/src/test/org/apache/solr/cloud/ZkCLITest.java
index 3a84f483ff7..20f0a8a2006 100644
--- a/solr/core/src/test/org/apache/solr/cloud/ZkCLITest.java
+++ b/solr/core/src/test/org/apache/solr/cloud/ZkCLITest.java
@@ -454,43 +454,51 @@ public class ZkCLITest extends SolrTestCaseJ4 {
 
   @Test
   public void testGetFile() throws Exception {
-    File tmpDir = createTempDir().toFile();
+    Path tmpDir = createTempDir();
 
     String getNode = "/getFileNode";
     byte[] data = "getFileNode-data".getBytes(StandardCharsets.UTF_8);
     this.zkClient.create(getNode, data, CreateMode.PERSISTENT, true);
 
-    File file =
-        new File(tmpDir, "solrtest-getfile-" + this.getClass().getName() + "-" + System.nanoTime());
+    Path file =
+        tmpDir.resolve("solrtest-getfile-" + this.getClass().getName() + "-" + System.nanoTime());
     String[] args =
         new String[] {
-          "-zkhost", zkServer.getZkAddress(), "-cmd", "getfile", getNode, file.getAbsolutePath()
+          "-zkhost",
+          zkServer.getZkAddress(),
+          "-cmd",
+          "getfile",
+          getNode,
+          file.toAbsolutePath().toString()
         };
     ZkCLI.main(args);
 
-    byte[] readData = FileUtils.readFileToByteArray(file);
-    assertArrayEquals(data, readData);
+    assertArrayEquals(data, Files.readAllBytes(file));
   }
 
   @Test
   public void testGetFileCompressed() throws Exception {
-    File tmpDir = createTempDir().toFile();
+    Path tmpDir = createTempDir();
 
     String getNode = "/getFileNode";
     byte[] data = "getFileNode-data".getBytes(StandardCharsets.UTF_8);
     ZLibCompressor zLibCompressor = new ZLibCompressor();
     this.zkClient.create(getNode, zLibCompressor.compressBytes(data), CreateMode.PERSISTENT, true);
 
-    File file =
-        new File(tmpDir, "solrtest-getfile-" + this.getClass().getName() + "-" + System.nanoTime());
+    Path file =
+        tmpDir.resolve("solrtest-getfile-" + this.getClass().getName() + "-" + System.nanoTime());
     String[] args =
         new String[] {
-          "-zkhost", zkServer.getZkAddress(), "-cmd", "getfile", getNode, file.getAbsolutePath()
+          "-zkhost",
+          zkServer.getZkAddress(),
+          "-cmd",
+          "getfile",
+          getNode,
+          file.toAbsolutePath().toString()
         };
     ZkCLI.main(args);
 
-    byte[] readData = FileUtils.readFileToByteArray(file);
-    assertArrayEquals(data, readData);
+    assertArrayEquals(data, Files.readAllBytes(file));
   }
 
   @Test
diff --git a/solr/core/src/test/org/apache/solr/core/TestConfigSetImmutable.java b/solr/core/src/test/org/apache/solr/core/TestConfigSetImmutable.java
index 14e17706c6f..682469f85f3 100644
--- a/solr/core/src/test/org/apache/solr/core/TestConfigSetImmutable.java
+++ b/solr/core/src/test/org/apache/solr/core/TestConfigSetImmutable.java
@@ -16,11 +16,12 @@
  */
 package org.apache.solr.core;
 
-import java.io.File;
 import java.io.StringReader;
 import java.nio.charset.StandardCharsets;
+import java.nio.file.Files;
+import java.nio.file.Path;
 import java.util.Map;
-import org.apache.commons.io.FileUtils;
+import org.apache.commons.io.file.PathUtils;
 import org.apache.solr.SolrTestCaseJ4;
 import org.apache.solr.client.solrj.impl.XMLResponseParser;
 import org.apache.solr.common.util.NamedList;
@@ -43,19 +44,19 @@ public class TestConfigSetImmutable extends RestTestBase {
 
   @Before
   public void before() throws Exception {
-    File tmpSolrHome = createTempDir().toFile();
-    File tmpConfDir = new File(tmpSolrHome, confDir);
-    FileUtils.copyDirectory(new File(TEST_HOME()), tmpSolrHome.getAbsoluteFile());
+    Path tmpSolrHome = createTempDir();
+    Path tmpConfDir = tmpSolrHome.resolve(confDir);
+    PathUtils.copyDirectory(Path.of(TEST_HOME()), tmpSolrHome);
     // make the ConfigSet immutable
-    FileUtils.write(
-        new File(tmpConfDir, "configsetprops.json"),
+    Files.writeString(
+        tmpConfDir.resolve("configsetprops.json"),
         new StringBuilder("{\"immutable\":\"true\"}"),
         StandardCharsets.UTF_8);
 
     System.setProperty("managed.schema.mutable", "true");
 
     createJettyAndHarness(
-        tmpSolrHome.getAbsolutePath(),
+        tmpSolrHome.toAbsolutePath().toString(),
         "solrconfig-schemaless.xml",
         "schema-rest.xml",
         "/solr",
diff --git a/solr/core/src/test/org/apache/solr/core/TestCoreDiscovery.java b/solr/core/src/test/org/apache/solr/core/TestCoreDiscovery.java
index 0bc3e0bbdf7..bdf4c1849fb 100644
--- a/solr/core/src/test/org/apache/solr/core/TestCoreDiscovery.java
+++ b/solr/core/src/test/org/apache/solr/core/TestCoreDiscovery.java
@@ -35,7 +35,6 @@ import java.util.List;
 import java.util.Map;
 import java.util.Properties;
 import java.util.concurrent.TimeUnit;
-import org.apache.commons.io.FileUtils;
 import org.apache.lucene.util.IOUtils;
 import org.apache.solr.SolrTestCaseJ4;
 import org.apache.solr.common.SolrException;
@@ -64,8 +63,8 @@ public class TestCoreDiscovery extends SolrTestCaseJ4 {
           xmlStr.replace(
               "<solr>", "<solr> <str name=\"coreRootDirectory\">" + alternateCoreDir + "</str> ");
     }
-    File tmpFile = new File(solrHomeDirectory.toFile(), SolrXmlConfig.SOLR_XML_FILE);
-    FileUtils.write(tmpFile, xmlStr, IOUtils.UTF_8);
+    Path tmpFile = solrHomeDirectory.resolve(SolrXmlConfig.SOLR_XML_FILE);
+    Files.writeString(tmpFile, xmlStr, StandardCharsets.UTF_8);
   }
 
   private void setMeUp() throws Exception {
diff --git a/solr/core/src/test/org/apache/solr/core/TestLazyCores.java b/solr/core/src/test/org/apache/solr/core/TestLazyCores.java
index 62e4fcc363e..fbb2f5ecf57 100644
--- a/solr/core/src/test/org/apache/solr/core/TestLazyCores.java
+++ b/solr/core/src/test/org/apache/solr/core/TestLazyCores.java
@@ -30,7 +30,6 @@ import java.util.List;
 import java.util.Map;
 import java.util.concurrent.CountDownLatch;
 import java.util.regex.Pattern;
-import org.apache.commons.io.FileUtils;
 import org.apache.solr.SolrTestCaseJ4;
 import org.apache.solr.client.solrj.SolrServerException;
 import org.apache.solr.client.solrj.StreamingResponseCallback;
@@ -678,14 +677,12 @@ public class TestLazyCores extends SolrTestCaseJ4 {
   private void writeCustomConfig(String coreName, String config, String schema, String rand_snip)
       throws IOException {
 
-    File coreRoot = new File(solrHomeDirectory, coreName);
-    File subHome = new File(coreRoot, "conf");
-    if (!coreRoot.exists()) {
-      assertTrue("Failed to make subdirectory ", coreRoot.mkdirs());
-    }
+    Path coreRoot = solrHomeDirectory.toPath().resolve(coreName);
+    Path subHome = coreRoot.resolve("conf");
+    Files.createDirectories(subHome);
     // Write the file for core discovery
-    FileUtils.writeStringToFile(
-        new File(coreRoot, "core.properties"),
+    Files.writeString(
+        coreRoot.resolve("core.properties"),
         "name="
             + coreName
             + System.getProperty("line.separator")
@@ -694,15 +691,14 @@ public class TestLazyCores extends SolrTestCaseJ4 {
             + "loadOnStartup=true",
         StandardCharsets.UTF_8);
 
-    FileUtils.writeStringToFile(
-        new File(subHome, "solrconfig.snippet.randomindexconfig.xml"),
+    Files.writeString(
+        subHome.resolve("solrconfig.snippet.randomindexconfig.xml"),
         rand_snip,
         StandardCharsets.UTF_8);
 
-    FileUtils.writeStringToFile(
-        new File(subHome, "solrconfig.xml"), config, StandardCharsets.UTF_8);
+    Files.writeString(subHome.resolve("solrconfig.xml"), config, StandardCharsets.UTF_8);
 
-    FileUtils.writeStringToFile(new File(subHome, "schema.xml"), schema, StandardCharsets.UTF_8);
+    Files.writeString(subHome.resolve("schema.xml"), schema, StandardCharsets.UTF_8);
   }
 
   // Write out the cores' config files, both bad schema files, bad config files and some good
diff --git a/solr/core/src/test/org/apache/solr/schema/ChangedSchemaMergeTest.java b/solr/core/src/test/org/apache/solr/schema/ChangedSchemaMergeTest.java
index 6dbc2b2111e..cd74da819a6 100644
--- a/solr/core/src/test/org/apache/solr/schema/ChangedSchemaMergeTest.java
+++ b/solr/core/src/test/org/apache/solr/schema/ChangedSchemaMergeTest.java
@@ -16,12 +16,12 @@
  */
 package org.apache.solr.schema;
 
-import java.io.File;
 import java.io.IOException;
 import java.lang.invoke.MethodHandles;
 import java.nio.charset.StandardCharsets;
+import java.nio.file.Files;
+import java.nio.file.Path;
 import java.util.Properties;
-import org.apache.commons.io.FileUtils;
 import org.apache.solr.SolrTestCaseJ4;
 import org.apache.solr.common.params.ModifiableSolrParams;
 import org.apache.solr.common.util.NamedList;
@@ -72,8 +72,8 @@ public class ChangedSchemaMergeTest extends SolrTestCaseJ4 {
     initCore();
   }
 
-  private final File solrHomeDirectory = createTempDir().toFile();
-  private File schemaFile = null;
+  private final Path solrHomeDirectory = createTempDir();
+  private Path schemaFile = null;
 
   private void addDoc(SolrCore core, String... fieldValues) throws IOException {
     UpdateHandler updater = core.getUpdateHandler();
@@ -83,17 +83,17 @@ public class ChangedSchemaMergeTest extends SolrTestCaseJ4 {
   }
 
   private CoreContainer init() throws Exception {
-    File changed = new File(solrHomeDirectory, "changed");
-    copyMinConf(changed, "name=changed");
+    Path changed = solrHomeDirectory.resolve("changed");
+    copyMinConf(changed.toFile(), "name=changed");
     // Overlay with my local schema
-    schemaFile = new File(new File(changed, "conf"), "schema.xml");
-    FileUtils.writeStringToFile(schemaFile, withWhich, StandardCharsets.UTF_8);
+    schemaFile = changed.resolve("conf").resolve("schema.xml");
+    Files.writeString(schemaFile, withWhich, StandardCharsets.UTF_8);
 
     String discoveryXml = "<solr></solr>";
-    File solrXml = new File(solrHomeDirectory, "solr.xml");
-    FileUtils.write(solrXml, discoveryXml, StandardCharsets.UTF_8);
+    Path solrXml = solrHomeDirectory.resolve("solr.xml");
+    Files.writeString(solrXml, discoveryXml, StandardCharsets.UTF_8);
 
-    final CoreContainer cores = new CoreContainer(solrHomeDirectory.toPath(), new Properties());
+    final CoreContainer cores = new CoreContainer(solrHomeDirectory, new Properties());
     cores.load();
     return cores;
   }
@@ -125,7 +125,7 @@ public class ChangedSchemaMergeTest extends SolrTestCaseJ4 {
       changed.getUpdateHandler().commit(new CommitUpdateCommand(req, false));
 
       // write the new schema out and make it current
-      FileUtils.writeStringToFile(schemaFile, withoutWhich, StandardCharsets.UTF_8);
+      Files.writeString(schemaFile, withoutWhich, StandardCharsets.UTF_8);
 
       IndexSchema iSchema =
           IndexSchemaFactory.buildIndexSchema("schema.xml", changed.getSolrConfig());
diff --git a/solr/core/src/test/org/apache/solr/servlet/SolrRequestParserTest.java b/solr/core/src/test/org/apache/solr/servlet/SolrRequestParserTest.java
index 5b0d0d1c285..48fb2e9a532 100644
--- a/solr/core/src/test/org/apache/solr/servlet/SolrRequestParserTest.java
+++ b/solr/core/src/test/org/apache/solr/servlet/SolrRequestParserTest.java
@@ -22,12 +22,13 @@ import static org.mockito.Mockito.when;
 
 import java.io.BufferedInputStream;
 import java.io.ByteArrayInputStream;
-import java.io.File;
 import java.io.IOException;
 import java.io.InputStream;
 import java.lang.invoke.MethodHandles;
 import java.net.URL;
 import java.nio.charset.StandardCharsets;
+import java.nio.file.Files;
+import java.nio.file.Path;
 import java.util.ArrayList;
 import java.util.Collections;
 import java.util.HashMap;
@@ -37,7 +38,6 @@ import java.util.Vector;
 import javax.servlet.ReadListener;
 import javax.servlet.ServletInputStream;
 import javax.servlet.http.HttpServletRequest;
-import org.apache.commons.io.FileUtils;
 import org.apache.commons.io.IOUtils;
 import org.apache.solr.SolrTestCaseJ4;
 import org.apache.solr.common.SolrException;
@@ -153,14 +153,14 @@ public class SolrRequestParserTest extends SolrTestCaseJ4 {
   @Test
   @SuppressWarnings({"try"})
   public void testStreamFile() throws Exception {
-    File file = getFile("README");
+    Path file = getFile("README").toPath();
 
-    byte[] bytes = FileUtils.readFileToByteArray(file);
+    byte[] bytes = Files.readAllBytes(file);
 
     SolrCore core = h.getCore();
 
     Map<String, String[]> args = new HashMap<>();
-    args.put(CommonParams.STREAM_FILE, new String[] {file.getAbsolutePath()});
+    args.put(CommonParams.STREAM_FILE, new String[] {file.toAbsolutePath().toString()});
 
     // Make sure it got a single stream in and out ok
     List<ContentStream> streams = new ArrayList<>();
diff --git a/solr/modules/s3-repository/src/test/org/apache/solr/s3/S3IndexInputTest.java b/solr/modules/s3-repository/src/test/org/apache/solr/s3/S3IndexInputTest.java
index 0068035aca7..0f9e906b296 100644
--- a/solr/modules/s3-repository/src/test/org/apache/solr/s3/S3IndexInputTest.java
+++ b/solr/modules/s3-repository/src/test/org/apache/solr/s3/S3IndexInputTest.java
@@ -23,7 +23,7 @@ import java.io.InputStream;
 import java.nio.ByteBuffer;
 import java.nio.charset.Charset;
 import java.nio.charset.StandardCharsets;
-import org.apache.commons.io.FileUtils;
+import java.nio.file.Files;
 import org.apache.commons.lang3.RandomStringUtils;
 import org.apache.solr.SolrTestCaseJ4;
 import org.junit.Rule;
@@ -65,7 +65,7 @@ public class S3IndexInputTest extends SolrTestCaseJ4 {
 
     File tmp = temporaryFolder.newFolder();
     File file = new File(tmp, "content");
-    FileUtils.write(file, content, StandardCharsets.UTF_8);
+    Files.writeString(file.toPath(), content, StandardCharsets.UTF_8);
 
     try (SliceInputStream slicedStream = new SliceInputStream(new FileInputStream(file), slice);
         S3IndexInput input = new S3IndexInput(slicedStream, "path", file.length())) {