package org.jboss.windup.util.file;
import java.io.File;
import java.io.IOException;
import java.nio.file.FileVisitResult;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.SimpleFileVisitor;
import java.nio.file.attribute.BasicFileAttributes;
import java.util.ArrayList;
import java.util.List;
import org.jboss.forge.furnace.util.Predicate;
import org.jboss.forge.furnace.util.Visitor;
import org.jboss.windup.util.exception.WindupException;
/**
* Utility for visiting files matching a specific filename suffix pattern.
*
* @author <a href="mailto:lincolnbaxter@gmail.com">Lincoln Baxter, III</a>
*/
public class FileVisit
{
/**
* Visit all files with the given suffix pattern (regex) from the provided {@link File} directory tree.
*/
public static void visit(File directory, Predicate<File> predicate, Visitor<File> visitor)
{
if (directory.exists())
{
List<File> files = visit(directory, predicate);
for (File file : files)
{
visitor.visit(file);
}
}
}
private static List<File> visit(final File directory, final Predicate<File> predicate)
{
try
{
final List<File> result = new ArrayList<>();
if (directory != null && directory.isDirectory())
{
Files.walkFileTree(directory.toPath(), new SimpleFileVisitor<Path>()
{
@Override
public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException
{
if (predicate.accept(file.toFile()))
result.add(file.toFile());
return FileVisitResult.CONTINUE;
}
});
}
return result;
}
catch (Exception e)
{
throw new WindupException("Failed to visit directory filesystem at [" + directory + "]", e);
}
}
}