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 2023/02/25 10:11:47 UTC

[causeway] branch master updated: CAUSEWAY-3304: promote _Files -> FileUtils to GA

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

ahuber pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/causeway.git


The following commit(s) were added to refs/heads/master by this push:
     new 9f718780b6 CAUSEWAY-3304: promote _Files -> FileUtils to GA
9f718780b6 is described below

commit 9f718780b6ba93bc5be74389fe7252665a4d755b
Author: Andi Huber <ah...@apache.org>
AuthorDate: Sat Feb 25 11:11:42 2023 +0100

    CAUSEWAY-3304: promote _Files -> FileUtils to GA
---
 .../base/_Files.java => io/FileUtils.java}         | 101 ++++++++++++++++++---
 .../tooling/cli/projdoc/ProjectDocModel.java       |   8 +-
 .../tooling/cli/projdoc/ProjectDocWriter.java      |   6 +-
 .../tooling/cli/test/adocfix/ProjectSampler.java   |  16 ++--
 .../tooling/j2adoc/test/ProjectSampler.java        |  16 ++--
 .../tooling/javamodel/AnalyzerConfigFactory.java   |  20 ++--
 .../tooling/javamodel/test/AnalyzerTest.java       |   4 +-
 .../compiler/JavaSourceCompilingClassLoader.java   |   6 +-
 .../demoshowcases/value/ValueTypeGenTemplate.java  |   8 +-
 .../value/ValueTypeGenTemplateTest.java            |  24 ++---
 .../projectmodel/gradle/GradleSettingsFactory.java |   8 +-
 .../projectmodel/maven/SimpleModelResolver.java    |   4 +-
 .../services/TranslationsResolverWicketTest.java   |   4 +-
 13 files changed, 151 insertions(+), 74 deletions(-)

diff --git a/commons/src/main/java/org/apache/causeway/commons/internal/base/_Files.java b/commons/src/main/java/org/apache/causeway/commons/io/FileUtils.java
similarity index 65%
rename from commons/src/main/java/org/apache/causeway/commons/internal/base/_Files.java
rename to commons/src/main/java/org/apache/causeway/commons/io/FileUtils.java
index a67522ee81..77675e0823 100644
--- a/commons/src/main/java/org/apache/causeway/commons/internal/base/_Files.java
+++ b/commons/src/main/java/org/apache/causeway/commons/io/FileUtils.java
@@ -16,12 +16,16 @@
  *  specific language governing permissions and limitations
  *  under the License.
  */
-package org.apache.causeway.commons.internal.base;
+package org.apache.causeway.commons.io;
 
 import java.io.File;
+import java.io.FileInputStream;
 import java.io.IOException;
+import java.io.InputStream;
 import java.nio.file.DirectoryStream;
 import java.nio.file.Files;
+import java.nio.file.NoSuchFileException;
+import java.nio.file.NotDirectoryException;
 import java.nio.file.Path;
 import java.nio.file.StandardCopyOption;
 import java.util.LinkedHashSet;
@@ -33,13 +37,52 @@ import java.util.function.Predicate;
 
 import org.springframework.lang.Nullable;
 
+import org.apache.causeway.commons.functional.Try;
 import org.apache.causeway.commons.internal.exceptions._Exceptions;
 
 import lombok.NonNull;
 import lombok.SneakyThrows;
 import lombok.val;
+import lombok.experimental.UtilityClass;
 
-public class _Files {
+/**
+ * Utilities related to the <i>Java</i> {@link File} type.
+ *
+ * @since 2.0 {@index}
+ */
+@UtilityClass
+public class FileUtils {
+
+    /**
+     * Opens an {@link InputStream} for give {@link File}
+     * and passes it to given {@link Consumer} for consumption,
+     * then finally closes it.
+     * @return either a successful or failed {@link Try} (non-null);
+     *     if the file is null or not readable, the failure may hold a {@link NoSuchFileException} or other i/o related exceptions
+     */
+    public Try<Void> tryRead(final @Nullable File file, final @NonNull Consumer<InputStream> inputStreamConsumer) {
+        return Try.run(()->{
+            try(val inputStream = new FileInputStream(existingFileElseFail(file))){
+                inputStreamConsumer.accept(inputStream);
+            }
+        });
+    }
+
+    /**
+     * Opens an {@link InputStream} for give {@link File}
+     * and passes it to given {@link Function} for applying (mapping),
+     * then finally closes it.
+     * @return either a successful or failed {@link Try} (non-null),
+     *      where in the success case, the Try is holding the returned value from the given {@link Function inputStreamMapper};
+     *      if the file is null or not readable, the failure may hold a {@link NoSuchFileException} or other i/o related exceptions
+     */
+    public <T> Try<T> tryMap(final @Nullable File file, final @NonNull Function<InputStream, T> inputStreamMapper) {
+        return Try.call(()->{
+            try(val inputStream = new FileInputStream(existingFileElseFail(file))){
+                return inputStreamMapper.apply(inputStream);
+            }
+        });
+    }
 
     /**
      * Recursive file search, starting at {@code dir}, going deeper based on predicate
@@ -51,7 +94,7 @@ public class _Files {
      * @return set of matching files
      * @throws IOException
      */
-    public static Set<File> searchFiles(
+    public Set<File> searchFiles(
             final File dir,
             final Predicate<File> dirFilter,
             final Predicate<File> fileFilter) throws IOException {
@@ -70,7 +113,7 @@ public class _Files {
      * @param onFileFound
      * @throws IOException
      */
-    public static void searchFiles(
+    public void searchFiles(
             final File dir,
             final Predicate<File> dirFilter,
             final Predicate<File> fileFilter,
@@ -102,7 +145,7 @@ public class _Files {
      * is not {@code null} and the 'file I/O system' can handle this call without
      * throwing an exception.
      */
-    public static Optional<String> canonicalPath(@Nullable final File file) {
+    public Optional<String> canonicalPath(@Nullable final File file) {
         if(file==null) {
             return Optional.empty();
         }
@@ -120,7 +163,7 @@ public class _Files {
      * @return prefix removed from {@code absolutePath}, if {@code commonPath} appears to be a prefix
      * of {@code absolutePath}, otherwise returns the {@code absolutePath} unmodified.
      */
-    public static String toRelativePath(@NonNull final String commonPath, @NonNull final String absolutePath) {
+    public String toRelativePath(@NonNull final String commonPath, @NonNull final String absolutePath) {
         if(absolutePath.startsWith(commonPath)) {
             return absolutePath.substring(commonPath.length());
         }
@@ -132,7 +175,7 @@ public class _Files {
      * @param file - the file to be deleted (null-able)
      */
     @SneakyThrows
-    public static void deleteFile(@Nullable final File file) {
+    public void deleteFile(@Nullable final File file) {
         if(file==null
                 || !file.exists()
                 || file.isDirectory()) {
@@ -155,7 +198,7 @@ public class _Files {
      * Returns a temp directory with delete-on-exit policy.
      */
     @SneakyThrows
-    public static File tempDir(final String name) {
+    public File tempDir(final String name) {
         val tempDir =  Files.createTempDirectory(name).toFile();
         tempDir.deleteOnExit();
         return tempDir;
@@ -174,7 +217,7 @@ public class _Files {
      * If directory is null acts as a no-op.
      * @throws IllegalArgumentException if any pre-existing file is in conflict
      */
-    public static File makeDir(final @Nullable File directory) {
+    public File makeDir(final @Nullable File directory) {
         if(directory==null) {
             return directory; // no-op
         }
@@ -197,30 +240,64 @@ public class _Files {
     /**
      * Optionally given file, based on whether non-null and exists and is a file (not a directory).
      */
-    public static Optional<File> existingFile(final @Nullable File file) {
+    public Optional<File> existingFile(final @Nullable File file) {
         return file!=null
                 && file.isFile()
                 ? Optional.of(file)
                 : Optional.empty();
     }
 
+    /**
+     * Guard given file against null, non-existence and not representing a file.
+     */
+    @SneakyThrows
+    public File existingFileElseFail(final @Nullable File file) {
+        if(file==null) {
+            throw new NoSuchFileException("<null>");
+        }
+        if(!file.exists()) {
+            throw new NoSuchFileException(file.getAbsolutePath());
+        }
+        if(!file.isFile()) {
+            throw new NoSuchFileException(file.getAbsolutePath());
+        }
+        return file;
+    }
+
     /**
      * Optionally given file, based on whether non-null and exists and is a directory (not a file).
      */
-    public static Optional<File> existingDirectory(final @Nullable File file) {
+    public Optional<File> existingDirectory(final @Nullable File file) {
         return file!=null
                 && file.isDirectory()
                 ? Optional.of(file)
                 : Optional.empty();
     }
 
+    /**
+     * Guard given file against null, non-existence and not representing a directory (not a file).
+     */
+    @SneakyThrows
+    public File existingDirectoryElseFail(final @Nullable File file) {
+        if(file==null) {
+            throw new NoSuchFileException("<null>");
+        }
+        if(!file.exists()) {
+            throw new NoSuchFileException(file.getAbsolutePath());
+        }
+        if(!file.isDirectory()) {
+            throw new NotDirectoryException(file.getAbsolutePath());
+        }
+        return file;
+    }
+
     /**
      * Copy {@code from} file {@code to} file, replacing existing.
      * @param from
      * @param to
      */
     @SneakyThrows
-    public static void copy(final @NonNull File from, final @NonNull File to) {
+    public void copy(final @NonNull File from, final @NonNull File to) {
         Files.copy(from.toPath(), to.toPath(), StandardCopyOption.REPLACE_EXISTING);
     }
 
diff --git a/tooling/cli/src/main/java/org/apache/causeway/tooling/cli/projdoc/ProjectDocModel.java b/tooling/cli/src/main/java/org/apache/causeway/tooling/cli/projdoc/ProjectDocModel.java
index 13895eb709..4aacc010ba 100644
--- a/tooling/cli/src/main/java/org/apache/causeway/tooling/cli/projdoc/ProjectDocModel.java
+++ b/tooling/cli/src/main/java/org/apache/causeway/tooling/cli/projdoc/ProjectDocModel.java
@@ -43,10 +43,10 @@ import org.asciidoctor.ast.Document;
 import org.springframework.lang.Nullable;
 
 import org.apache.causeway.commons.collections.Can;
-import org.apache.causeway.commons.internal.base._Files;
 import org.apache.causeway.commons.internal.base._Strings;
 import org.apache.causeway.commons.internal.exceptions._Exceptions;
 import org.apache.causeway.commons.internal.graph._Graph;
+import org.apache.causeway.commons.io.FileUtils;
 import org.apache.causeway.tooling.c4.C4;
 import org.apache.causeway.tooling.cli.CliConfig;
 import org.apache.causeway.tooling.cli.adocfix.OrphanedIncludeStatementFixer;
@@ -337,7 +337,7 @@ public class ProjectDocModel {
         cell(table, headRow, "Coordinates");
         cell(table, headRow, "Description");
 
-        val projRoot = _Files.canonicalPath(projTree.getProjectDirectory())
+        val projRoot = FileUtils.canonicalPath(projTree.getProjectDirectory())
                 .orElseThrow(()->_Exceptions.unrecoverable("cannot resolve project root"));
 
         sectionModules
@@ -346,11 +346,11 @@ public class ProjectDocModel {
                         gatherAdocFiles(module.getProjectDirectory(), onAdocFile);
                     }
 
-                    val projPath = _Files.canonicalPath(module.getProjectDirectory()).get();
+                    val projPath = FileUtils.canonicalPath(module.getProjectDirectory()).get();
                     val projRelativePath =
                             Optional.ofNullable(
                                     _Strings.emptyToNull(
-                                            _Files.toRelativePath(projRoot, projPath)))
+                                            FileUtils.toRelativePath(projRoot, projPath)))
                                     .orElse("/");
 
                     groupDiagram.collect(module);
diff --git a/tooling/cli/src/main/java/org/apache/causeway/tooling/cli/projdoc/ProjectDocWriter.java b/tooling/cli/src/main/java/org/apache/causeway/tooling/cli/projdoc/ProjectDocWriter.java
index 398ff9aec4..de29427046 100644
--- a/tooling/cli/src/main/java/org/apache/causeway/tooling/cli/projdoc/ProjectDocWriter.java
+++ b/tooling/cli/src/main/java/org/apache/causeway/tooling/cli/projdoc/ProjectDocWriter.java
@@ -23,8 +23,8 @@ import java.util.function.BiConsumer;
 
 import org.asciidoctor.ast.Document;
 
-import org.apache.causeway.commons.internal.base._Files;
 import org.apache.causeway.commons.internal.base._Refs;
+import org.apache.causeway.commons.io.FileUtils;
 import org.apache.causeway.tooling.cli.CliConfig;
 import org.apache.causeway.tooling.j2adoc.J2AdocContext;
 import org.apache.causeway.tooling.j2adoc.J2AdocUnit;
@@ -79,7 +79,7 @@ final class ProjectDocWriter {
             if(mode.includeIndex()) {
 
                 // delete all generated documents in the index
-                _Files.searchFiles(indexRootFolder, dir->true, file-> {
+                FileUtils.searchFiles(indexRootFolder, dir->true, file-> {
                     val fileName = file.getName();
                     val fileAbsolutePath = file.getAbsolutePath();
                     return fileName.endsWith(".adoc") &&
@@ -89,7 +89,7 @@ final class ProjectDocWriter {
                 .stream()
                 .peek(adocFile->log.debug("deleting file: {}", adocFile.getAbsolutePath()))
                 .peek(__->deleteCount.incAndGet())
-                .forEach(_Files::deleteFile);
+                .forEach(FileUtils::deleteFile);
 
                 // write document index
                 for(val unit : j2aContext.getUnitIndex().values()) {
diff --git a/tooling/cli/src/test/java/org/apache/causeway/tooling/cli/test/adocfix/ProjectSampler.java b/tooling/cli/src/test/java/org/apache/causeway/tooling/cli/test/adocfix/ProjectSampler.java
index 0b7cf98be8..00bb43e910 100644
--- a/tooling/cli/src/test/java/org/apache/causeway/tooling/cli/test/adocfix/ProjectSampler.java
+++ b/tooling/cli/src/test/java/org/apache/causeway/tooling/cli/test/adocfix/ProjectSampler.java
@@ -21,8 +21,8 @@ package org.apache.causeway.tooling.cli.test.adocfix;
 import java.io.File;
 import java.util.Set;
 
-import org.apache.causeway.commons.internal.base._Files;
 import org.apache.causeway.commons.internal.functions._Predicates;
+import org.apache.causeway.commons.io.FileUtils;
 
 import lombok.SneakyThrows;
 
@@ -31,21 +31,21 @@ final class ProjectSampler {
     static File local() {
         return new File("./").getAbsoluteFile();
     }
-    
+
     static File apacheCausewayRoot() {
         return new File("./").getAbsoluteFile().getParentFile().getParentFile().getParentFile();
     }
-    
+
     static File apacheCausewayApplib() {
         return new File(apacheCausewayRoot(), "api/applib");
     }
 
     @SneakyThrows
-    public static Set<File> adocFiles(File folder) {
-        return _Files.searchFiles(
-                folder, 
-                _Predicates.alwaysTrue(), 
+    public static Set<File> adocFiles(final File folder) {
+        return FileUtils.searchFiles(
+                folder,
+                _Predicates.alwaysTrue(),
                 file->file.getName().endsWith(".adoc"));
     }
-    
+
 }
diff --git a/tooling/java2adoc/src/test/java/org/apache/causeway/tooling/j2adoc/test/ProjectSampler.java b/tooling/java2adoc/src/test/java/org/apache/causeway/tooling/j2adoc/test/ProjectSampler.java
index c6744f13ff..35e15c30eb 100644
--- a/tooling/java2adoc/src/test/java/org/apache/causeway/tooling/j2adoc/test/ProjectSampler.java
+++ b/tooling/java2adoc/src/test/java/org/apache/causeway/tooling/j2adoc/test/ProjectSampler.java
@@ -21,8 +21,8 @@ package org.apache.causeway.tooling.j2adoc.test;
 import java.io.File;
 import java.util.Set;
 
-import org.apache.causeway.commons.internal.base._Files;
 import org.apache.causeway.commons.internal.functions._Predicates;
+import org.apache.causeway.commons.io.FileUtils;
 
 import lombok.SneakyThrows;
 
@@ -31,21 +31,21 @@ final class ProjectSampler {
     static File local() {
         return new File("./").getAbsoluteFile();
     }
-    
+
     static File apacheCausewayRoot() {
         return new File("./").getAbsoluteFile().getParentFile().getParentFile().getParentFile();
     }
-    
+
     static File apacheCausewayApplib() {
         return new File(apacheCausewayRoot(), "api/applib");
     }
 
     @SneakyThrows
-    public static Set<File> adocFiles(File folder) {
-        return _Files.searchFiles(
-                    folder, 
-                    _Predicates.alwaysTrue(), 
+    public static Set<File> adocFiles(final File folder) {
+        return FileUtils.searchFiles(
+                    folder,
+                    _Predicates.alwaysTrue(),
                     file->file.getName().endsWith(".adoc"));
     }
-    
+
 }
diff --git a/tooling/javamodel/src/main/java/org/apache/causeway/tooling/javamodel/AnalyzerConfigFactory.java b/tooling/javamodel/src/main/java/org/apache/causeway/tooling/javamodel/AnalyzerConfigFactory.java
index 556e11580d..fdf2946113 100644
--- a/tooling/javamodel/src/main/java/org/apache/causeway/tooling/javamodel/AnalyzerConfigFactory.java
+++ b/tooling/javamodel/src/main/java/org/apache/causeway/tooling/javamodel/AnalyzerConfigFactory.java
@@ -22,7 +22,7 @@ import java.io.File;
 import java.util.EnumSet;
 import java.util.List;
 
-import org.apache.causeway.commons.internal.base._Files;
+import org.apache.causeway.commons.io.FileUtils;
 
 import guru.nidi.codeassert.config.AnalyzerConfig;
 import guru.nidi.codeassert.config.Language;
@@ -32,18 +32,18 @@ import lombok.experimental.UtilityClass;
 @UtilityClass
 public class AnalyzerConfigFactory {
 
-    public static Maven maven(File projDir, Language ... languages) {
+    public static Maven maven(final File projDir, final Language ... languages) {
         return new MavenExt(projDir, languages);
     }
 
-    public static Maven mavenTest(File projDir, Language ... languages) {
+    public static Maven mavenTest(final File projDir, final Language ... languages) {
         return new MavenExtTest(projDir, languages);
     }
 
     // -- HELPER
 
     private static class AnalyzerConfigExt extends AnalyzerConfig {
-        public AnalyzerConfigExt(EnumSet<Language> languages, List<Path> sources, List<Path> classes) {
+        public AnalyzerConfigExt(final EnumSet<Language> languages, final List<Path> sources, final List<Path> classes) {
             super(languages, sources, classes);
         }
     }
@@ -52,20 +52,20 @@ public class AnalyzerConfigFactory {
 
         private final File projDir;
 
-        public MavenExt(File projDir, Language ... languages) {
+        public MavenExt(final File projDir, final Language ... languages) {
             super(null, languages);
             this.projDir = projDir;
         }
 
         @Override
-        public AnalyzerConfig main(String... packages) {
+        public AnalyzerConfig main(final String... packages) {
             return new AnalyzerConfigExt(getLanguages(),
                     path(packages, canonicalPath("src/main/$language/")),
                     path(packages, canonicalPath("target/classes/")));
         }
 
-        protected String canonicalPath(String relPath) {
-            return _Files.canonicalPath(new File(projDir, relPath))
+        protected String canonicalPath(final String relPath) {
+            return FileUtils.canonicalPath(new File(projDir, relPath))
                     .orElse(relPath);
         }
 
@@ -73,12 +73,12 @@ public class AnalyzerConfigFactory {
 
     private static class MavenExtTest extends MavenExt {
 
-        public MavenExtTest(File projDir, Language[] languages) {
+        public MavenExtTest(final File projDir, final Language[] languages) {
             super(projDir, languages);
         }
 
         @Override
-        public AnalyzerConfig main(String... packages) {
+        public AnalyzerConfig main(final String... packages) {
             return new AnalyzerConfigExt(getLanguages(),
                     path(packages, canonicalPath("src/test/$language/")),
                     path(packages, canonicalPath("target/test-classes/")));
diff --git a/tooling/javamodel/src/test/java/org/apache/causeway/tooling/javamodel/test/AnalyzerTest.java b/tooling/javamodel/src/test/java/org/apache/causeway/tooling/javamodel/test/AnalyzerTest.java
index f42ae6a38c..95e38c0352 100644
--- a/tooling/javamodel/src/test/java/org/apache/causeway/tooling/javamodel/test/AnalyzerTest.java
+++ b/tooling/javamodel/src/test/java/org/apache/causeway/tooling/javamodel/test/AnalyzerTest.java
@@ -27,7 +27,7 @@ import org.junit.jupiter.api.Test;
 import org.junit.jupiter.api.condition.DisabledIfSystemProperty;
 
 import org.apache.causeway.commons.collections.Can;
-import org.apache.causeway.commons.internal.base._Files;
+import org.apache.causeway.commons.io.FileUtils;
 import org.apache.causeway.tooling.javamodel.AnalyzerConfigFactory;
 import org.apache.causeway.tooling.javamodel.ast.AnyTypeDeclaration;
 import org.apache.causeway.tooling.javamodel.ast.CompilationUnits;
@@ -49,7 +49,7 @@ class AnalyzerTest {
         final Stream<String> sources = analyzerConfig.getSources(JAVA)
                 .stream()
                 .map(File::getAbsolutePath)
-                .map(sourceFile->_Files.toRelativePath(commonPath, sourceFile));
+                .map(sourceFile->FileUtils.toRelativePath(commonPath, sourceFile));
 
         ProjectSamples.assertHasApacheCausewayRuntimeSourceFiles(sources);
     }
diff --git a/tooling/metaprog/src/main/java/org/apache/causeway/tooling/metaprog/compiler/JavaSourceCompilingClassLoader.java b/tooling/metaprog/src/main/java/org/apache/causeway/tooling/metaprog/compiler/JavaSourceCompilingClassLoader.java
index c10a46efdf..13750b46ff 100644
--- a/tooling/metaprog/src/main/java/org/apache/causeway/tooling/metaprog/compiler/JavaSourceCompilingClassLoader.java
+++ b/tooling/metaprog/src/main/java/org/apache/causeway/tooling/metaprog/compiler/JavaSourceCompilingClassLoader.java
@@ -31,7 +31,7 @@ import javax.tools.ToolProvider;
 
 import org.apache.causeway.commons.collections.Can;
 import org.apache.causeway.commons.internal.base._Bytes;
-import org.apache.causeway.commons.internal.base._Files;
+import org.apache.causeway.commons.io.FileUtils;
 import org.apache.causeway.commons.internal.collections._Maps;
 import org.apache.causeway.commons.internal.functions._Functions;
 
@@ -52,12 +52,12 @@ public class JavaSourceCompilingClassLoader extends ClassLoader  {
     @SneakyThrows
     private JavaSourceCompilingClassLoader() {
         // purely for the purpose of communicating with the compiler
-        this.root = _Files.tempDir("causeway-tooling-cl").toPath();
+        this.root = FileUtils.tempDir("causeway-tooling-cl").toPath();
         log.info("tmp dir created in {}", root);
 
         Thread printingHook = new Thread(() -> {
             try {
-                _Files.deleteDirectory(root.toFile());
+                FileUtils.deleteDirectory(root.toFile());
                 log.info("Done, cleaning up temp files.");
             } catch (Exception e) {
                 System.err.printf("%s: Cleaning up temp files FAILED.%n", getClass().getSimpleName());
diff --git a/tooling/metaprog/src/main/java/org/apache/causeway/tooling/metaprog/demoshowcases/value/ValueTypeGenTemplate.java b/tooling/metaprog/src/main/java/org/apache/causeway/tooling/metaprog/demoshowcases/value/ValueTypeGenTemplate.java
index 7ba50d9e99..4534c24250 100644
--- a/tooling/metaprog/src/main/java/org/apache/causeway/tooling/metaprog/demoshowcases/value/ValueTypeGenTemplate.java
+++ b/tooling/metaprog/src/main/java/org/apache/causeway/tooling/metaprog/demoshowcases/value/ValueTypeGenTemplate.java
@@ -29,7 +29,7 @@ import java.util.stream.Stream;
 import org.springframework.util.ClassUtils;
 
 import org.apache.causeway.commons.collections.Can;
-import org.apache.causeway.commons.internal.base._Files;
+import org.apache.causeway.commons.io.FileUtils;
 import org.apache.causeway.commons.internal.base._Refs;
 import org.apache.causeway.commons.internal.base._Strings;
 import org.apache.causeway.commons.internal.base._Text;
@@ -165,11 +165,11 @@ public class ValueTypeGenTemplate {
                     .getAbsoluteFile();
         }
         private final File templateFile(final Config config) {
-            return _Files.existingFile(templateFile(config, config.templateVariant)) // existence is optional
+            return FileUtils.existingFile(templateFile(config, config.templateVariant)) // existence is optional
                     .orElseGet(()->{
                         // existence is mandatory
                         val defaultTemplateFile = templateFile(config, TemplateVariant.DEFAULT);
-                        return _Files.existingFile(defaultTemplateFile)
+                        return FileUtils.existingFile(defaultTemplateFile)
                                 .orElseThrow(()->_Exceptions.noSuchElement("template %s not found", defaultTemplateFile));
                     });
         }
@@ -262,7 +262,7 @@ public class ValueTypeGenTemplate {
             final Map<String, String> templateVars, final File template, final File genTarget) {
         val templateLines = _Text.readLinesFromFile(template, StandardCharsets.UTF_8);
 
-        _Files.makeDir(genTarget.getParentFile());
+        FileUtils.makeDir(genTarget.getParentFile());
 
         _Text.writeLinesToFile(templateLines
                 .map(line->templateProcessor(templateVars, line)),
diff --git a/tooling/metaprog/src/test/java/org/apache/causeway/tooling/metaprog/demoshowcases/value/ValueTypeGenTemplateTest.java b/tooling/metaprog/src/test/java/org/apache/causeway/tooling/metaprog/demoshowcases/value/ValueTypeGenTemplateTest.java
index f5b2f322f8..8753c6c832 100644
--- a/tooling/metaprog/src/test/java/org/apache/causeway/tooling/metaprog/demoshowcases/value/ValueTypeGenTemplateTest.java
+++ b/tooling/metaprog/src/test/java/org/apache/causeway/tooling/metaprog/demoshowcases/value/ValueTypeGenTemplateTest.java
@@ -35,7 +35,7 @@ import static org.junit.jupiter.api.Assertions.assertEquals;
 import static org.junit.jupiter.api.Assertions.fail;
 
 import org.apache.causeway.commons.collections.Can;
-import org.apache.causeway.commons.internal.base._Files;
+import org.apache.causeway.commons.io.FileUtils;
 import org.apache.causeway.commons.internal.base._Text;
 import org.apache.causeway.commons.internal.collections._Sets;
 import org.apache.causeway.commons.internal.functions._Predicates;
@@ -65,7 +65,7 @@ class ValueTypeGenTemplateTest {
         val demoDomainShowCase = new File(demoDomainRoot, config.getJavaPackage().replace('.', '/'));
 
         // list reference source files
-        val refShowcaseFiles = _Files.searchFiles(demoDomainShowCase, _Predicates.alwaysTrue(), file->
+        val refShowcaseFiles = FileUtils.searchFiles(demoDomainShowCase, _Predicates.alwaysTrue(), file->
                   file.getName().endsWith(".java")
                   || file.getName().endsWith(".xml")
                   || file.getName().endsWith(".adoc")
@@ -91,8 +91,8 @@ class ValueTypeGenTemplateTest {
     @BeforeAll
     static void setup() {
         outputRootDir = PERSIST
-                ? _Files.makeDir(new File("D:/tmp/valueTypes"))
-                : _Files.tempDir("casueway-tooling-showcases");
+                ? FileUtils.makeDir(new File("D:/tmp/valueTypes"))
+                : FileUtils.tempDir("casueway-tooling-showcases");
 
         log.info("tmp dir created in {}", outputRootDir);
     }
@@ -106,10 +106,10 @@ class ValueTypeGenTemplateTest {
             final Set<File> setB, final File rootB) {
         assertEquals(
                 Can.ofCollection(setA)
-                .map(_Files.realtiveFileName(rootA))
+                .map(FileUtils.realtiveFileName(rootA))
                 .sorted(Comparator.naturalOrder()),
                 Can.ofCollection(setB)
-                .map(_Files.realtiveFileName(rootB))
+                .map(FileUtils.realtiveFileName(rootB))
                 .sorted(Comparator.naturalOrder()));
     }
 
@@ -117,19 +117,19 @@ class ValueTypeGenTemplateTest {
     @SuppressWarnings("unused")
     private void copyFiles(final Collection<File> generatedFiles, final File sourceRoot, final File destinationRoot) {
         generatedFiles.forEach(src->{
-            val dest = new File(destinationRoot, _Files.realtiveFileName(sourceRoot, src));
-            _Files.makeDir(dest.getParentFile());
-            _Files.copy(src, dest);
+            val dest = new File(destinationRoot, FileUtils.realtiveFileName(sourceRoot, src));
+            FileUtils.makeDir(dest.getParentFile());
+            FileUtils.copy(src, dest);
         });
     }
 
     @SuppressWarnings("unused")
     private void copyMissingFiles(final Collection<File> generatedFiles, final File sourceRoot, final File destinationRoot) {
         generatedFiles.forEach(src->{
-            val dest = new File(destinationRoot, _Files.realtiveFileName(sourceRoot, src));
+            val dest = new File(destinationRoot, FileUtils.realtiveFileName(sourceRoot, src));
             if(!dest.exists()) {
-                _Files.makeDir(dest.getParentFile());
-                _Files.copy(src, dest);
+                FileUtils.makeDir(dest.getParentFile());
+                FileUtils.copy(src, dest);
             }
         });
     }
diff --git a/tooling/projectmodel/src/main/java/org/apache/causeway/tooling/projectmodel/gradle/GradleSettingsFactory.java b/tooling/projectmodel/src/main/java/org/apache/causeway/tooling/projectmodel/gradle/GradleSettingsFactory.java
index c322739e1e..925a58f41a 100644
--- a/tooling/projectmodel/src/main/java/org/apache/causeway/tooling/projectmodel/gradle/GradleSettingsFactory.java
+++ b/tooling/projectmodel/src/main/java/org/apache/causeway/tooling/projectmodel/gradle/GradleSettingsFactory.java
@@ -20,7 +20,7 @@ package org.apache.causeway.tooling.projectmodel.gradle;
 
 import java.io.File;
 
-import org.apache.causeway.commons.internal.base._Files;
+import org.apache.causeway.commons.io.FileUtils;
 import org.apache.causeway.commons.internal.base._Strings;
 import org.apache.causeway.commons.internal.exceptions._Exceptions;
 import org.apache.causeway.tooling.projectmodel.ArtifactCoordinates;
@@ -39,7 +39,7 @@ public class GradleSettingsFactory {
 
     public static GradleSettings generateFromMaven(ProjectNode projTree, String rootProjectName) {
 
-        val rootPath = _Files.canonicalPath(projTree.getProjectDirectory())
+        val rootPath = FileUtils.canonicalPath(projTree.getProjectDirectory())
                 .orElseThrow(()->_Exceptions.unrecoverable("cannot resolve project root"));
 
         val gradleSettings = new GradleSettings(rootProjectName);
@@ -65,10 +65,10 @@ public class GradleSettingsFactory {
     }
 
     private static String toCanonicalRelativePath(ProjectNode projModel, String rootPath) {
-        val canonicalProjDir = _Files.canonicalPath(projModel.getProjectDirectory())
+        val canonicalProjDir = FileUtils.canonicalPath(projModel.getProjectDirectory())
                 .orElseThrow(()->_Exceptions.unrecoverable("cannot resolve relative path"));
 
-        val relativePath = _Files.toRelativePath(rootPath, canonicalProjDir);
+        val relativePath = FileUtils.toRelativePath(rootPath, canonicalProjDir);
         return _Strings.prefix(relativePath.replace('\\', '/'), "/");
     }
 
diff --git a/tooling/projectmodel/src/main/java/org/apache/causeway/tooling/projectmodel/maven/SimpleModelResolver.java b/tooling/projectmodel/src/main/java/org/apache/causeway/tooling/projectmodel/maven/SimpleModelResolver.java
index 01ce60a877..ab0ab71987 100644
--- a/tooling/projectmodel/src/main/java/org/apache/causeway/tooling/projectmodel/maven/SimpleModelResolver.java
+++ b/tooling/projectmodel/src/main/java/org/apache/causeway/tooling/projectmodel/maven/SimpleModelResolver.java
@@ -37,7 +37,7 @@ import org.apache.maven.model.resolution.InvalidRepositoryException;
 import org.apache.maven.model.resolution.ModelResolver;
 import org.apache.maven.model.resolution.UnresolvableModelException;
 
-import org.apache.causeway.commons.internal.base._Files;
+import org.apache.causeway.commons.io.FileUtils;
 
 import lombok.Getter;
 import lombok.SneakyThrows;
@@ -170,7 +170,7 @@ public class SimpleModelResolver implements ModelResolver {
 
         val localRootPath = projectRoot.getCanonicalPath();
 
-        _Files.searchFiles(projectRoot,
+        FileUtils.searchFiles(projectRoot,
                 file->
                     !file.getName().startsWith(".")
                     && !directoriesToIgnore.contains(file.getName()),
diff --git a/viewers/wicket/viewer/src/test/java/org/apache/causeway/viewer/wicket/viewer/services/TranslationsResolverWicketTest.java b/viewers/wicket/viewer/src/test/java/org/apache/causeway/viewer/wicket/viewer/services/TranslationsResolverWicketTest.java
index 2302d00c8d..5910d4a2a4 100644
--- a/viewers/wicket/viewer/src/test/java/org/apache/causeway/viewer/wicket/viewer/services/TranslationsResolverWicketTest.java
+++ b/viewers/wicket/viewer/src/test/java/org/apache/causeway/viewer/wicket/viewer/services/TranslationsResolverWicketTest.java
@@ -26,7 +26,7 @@ import org.junit.jupiter.api.Test;
 import static org.hamcrest.CoreMatchers.is;
 import static org.hamcrest.MatcherAssert.assertThat;
 
-import org.apache.causeway.commons.internal.base._Files;
+import org.apache.causeway.commons.io.FileUtils;
 
 import lombok.val;
 
@@ -36,7 +36,7 @@ class TranslationsResolverWicketTest {
 
     @BeforeEach
     public void setUp() throws Exception {
-        tempDir = _Files.tempDir("foo");
+        tempDir = FileUtils.tempDir("foo");
     }
 
     @Test