This is an automated email from the ASF dual-hosted git repository. mhubail pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/asterixdb.git
The following commit(s) were added to refs/heads/master by this push: new f630626 [NO ISSUE][OTH] Replace usage of FileUtils.listFiles f630626 is described below commit f6306265ee7edb3b2cb4317216f9dcc9d6b4a7b1 Author: Murtadha Hubail <murtadha.hub...@couchbase.com> AuthorDate: Wed Nov 3 13:04:16 2021 +0300 [NO ISSUE][OTH] Replace usage of FileUtils.listFiles - user model changes: no - storage format changes: no - interface changes: no Details: - Avoid depending on FileUtils.listFiles in production code by replacing it with our own implementation. Change-Id: I1ecb6143d5840fc12b35a641e1bc73c40bba3676 Reviewed-on: https://asterix-gerrit.ics.uci.edu/c/asterixdb/+/13923 Integration-Tests: Jenkins <jenk...@fulliautomatix.ics.uci.edu> Tested-by: Jenkins <jenk...@fulliautomatix.ics.uci.edu> Reviewed-by: Murtadha Hubail <mhub...@apache.org> Reviewed-by: Ali Alsuliman <ali.al.solai...@gmail.com> --- .../PersistentLocalResourceRepository.java | 47 ++++------------------ .../java/org/apache/hyracks/api/util/IoUtil.java | 37 +++++++++++++++++ 2 files changed, 44 insertions(+), 40 deletions(-) diff --git a/asterixdb/asterix-transactions/src/main/java/org/apache/asterix/transaction/management/resource/PersistentLocalResourceRepository.java b/asterixdb/asterix-transactions/src/main/java/org/apache/asterix/transaction/management/resource/PersistentLocalResourceRepository.java index 02f5772..6577367 100644 --- a/asterixdb/asterix-transactions/src/main/java/org/apache/asterix/transaction/management/resource/PersistentLocalResourceRepository.java +++ b/asterixdb/asterix-transactions/src/main/java/org/apache/asterix/transaction/management/resource/PersistentLocalResourceRepository.java @@ -60,7 +60,6 @@ import org.apache.asterix.common.storage.ResourceStorageStats; import org.apache.asterix.common.utils.StorageConstants; import org.apache.asterix.common.utils.StoragePathUtil; import org.apache.commons.io.FileUtils; -import org.apache.commons.io.filefilter.IOFileFilter; import org.apache.hyracks.api.exceptions.HyracksDataException; import org.apache.hyracks.api.io.FileReference; import org.apache.hyracks.api.io.IIOManager; @@ -96,41 +95,10 @@ public class PersistentLocalResourceRepository implements ILocalResourceReposito private static final FilenameFilter MASK_FILES_FILTER = (dir, name) -> name.startsWith(StorageConstants.MASK_FILE_PREFIX); private static final int MAX_CACHED_RESOURCES = 1000; - private static final IOFileFilter METADATA_FILES_FILTER = new IOFileFilter() { - @Override - public boolean accept(File file) { - return file.getName().equals(StorageConstants.METADATA_FILE_NAME); - } - - @Override - public boolean accept(File dir, String name) { - return false; - } - }; - - private static final IOFileFilter METADATA_MASK_FILES_FILTER = new IOFileFilter() { - @Override - public boolean accept(File file) { - return file.getName().equals(METADATA_FILE_MASK_NAME); - } - - @Override - public boolean accept(File dir, String name) { - return false; - } - }; - - private static final IOFileFilter ALL_DIR_FILTER = new IOFileFilter() { - @Override - public boolean accept(File file) { - return true; - } - - @Override - public boolean accept(File dir, String name) { - return true; - } - }; + private static final FilenameFilter METADATA_FILES_FILTER = + (dir, name) -> name.equals(StorageConstants.METADATA_FILE_NAME); + private static final FilenameFilter METADATA_MASK_FILES_FILTER = + (dir, name) -> name.equals(METADATA_FILE_MASK_NAME); // Finals private final IIOManager ioManager; @@ -270,7 +238,7 @@ public class PersistentLocalResourceRepository implements ILocalResourceReposito if (!Files.exists(root) || !Files.isDirectory(root)) { continue; } - final Collection<File> files = FileUtils.listFiles(root.toFile(), METADATA_FILES_FILTER, ALL_DIR_FILTER); + final Collection<File> files = IoUtil.getMatchingFiles(root, METADATA_FILES_FILTER); try { for (File file : files) { final LocalResource localResource = readLocalResource(file); @@ -301,7 +269,7 @@ public class PersistentLocalResourceRepository implements ILocalResourceReposito public synchronized void deleteInvalidIndexes(Predicate<LocalResource> filter) throws HyracksDataException { for (Path root : storageRoots) { - final Collection<File> files = FileUtils.listFiles(root.toFile(), METADATA_FILES_FILTER, ALL_DIR_FILTER); + final Collection<File> files = IoUtil.getMatchingFiles(root, METADATA_FILES_FILTER); try { for (File file : files) { final LocalResource localResource = readLocalResource(file); @@ -519,8 +487,7 @@ public class PersistentLocalResourceRepository implements ILocalResourceReposito public synchronized void deleteCorruptedResources() throws HyracksDataException { for (Path root : storageRoots) { - final Collection<File> metadataMaskFiles = - FileUtils.listFiles(root.toFile(), METADATA_MASK_FILES_FILTER, ALL_DIR_FILTER); + final Collection<File> metadataMaskFiles = IoUtil.getMatchingFiles(root, METADATA_MASK_FILES_FILTER); for (File metadataMaskFile : metadataMaskFiles) { final File resourceFile = new File(metadataMaskFile.getParent(), METADATA_FILE_NAME); if (resourceFile.exists()) { diff --git a/hyracks-fullstack/hyracks/hyracks-api/src/main/java/org/apache/hyracks/api/util/IoUtil.java b/hyracks-fullstack/hyracks/hyracks-api/src/main/java/org/apache/hyracks/api/util/IoUtil.java index 6ad53ab..ae49cb6 100644 --- a/hyracks-fullstack/hyracks/hyracks-api/src/main/java/org/apache/hyracks/api/util/IoUtil.java +++ b/hyracks-fullstack/hyracks/hyracks-api/src/main/java/org/apache/hyracks/api/util/IoUtil.java @@ -19,13 +19,18 @@ package org.apache.hyracks.api.util; import java.io.File; +import java.io.FileFilter; import java.io.FileNotFoundException; +import java.io.FilenameFilter; import java.io.IOException; import java.nio.channels.FileChannel; import java.nio.file.Files; import java.nio.file.NoSuchFileException; import java.nio.file.Path; import java.nio.file.StandardOpenOption; +import java.util.ArrayList; +import java.util.Collection; +import java.util.Objects; import org.apache.commons.io.FileUtils; import org.apache.hyracks.api.exceptions.ErrorCode; @@ -152,4 +157,36 @@ public class IoUtil { } } } + + /** + * Gets a collection of files matching {@code filter} by searching {@code root} directory and + * all of its subdirectories + * + * @param root + * @param filter + * @return a collection of matching files + */ + public static Collection<File> getMatchingFiles(Path root, FilenameFilter filter) { + if (!Files.isDirectory(root)) { + throw new IllegalArgumentException("Parameter 'root' is not a directory: " + root); + } + Objects.requireNonNull(filter); + Collection<File> files = new ArrayList<>(); + FileFilter dirOrMatchingFileFilter = file -> file.isDirectory() || filter.accept(file, file.getName()); + collectDirFiles(root.toFile(), dirOrMatchingFileFilter, files); + return files; + } + + private static void collectDirFiles(File dir, FileFilter filter, Collection<File> files) { + File[] matchingFiles = dir.listFiles(filter); + if (matchingFiles != null) { + for (File file : matchingFiles) { + if (file.isDirectory()) { + collectDirFiles(file, filter, files); + } else { + files.add(file); + } + } + } + } }