Repository: nifi
Updated Branches:
refs/heads/master ffbff4242 -> 31bb89514
NIFI-5426: Use NIO.2 API for ListFile
Project: http://git-wip-us.apache.org/repos/asf/nifi/repo
Commit: http://git-wip-us.apache.org/repos/asf/nifi/commit/31bb8951
Tree: http://git-wip-us.apache.org/repos/asf/nifi/tree/31bb8951
Diff: http://git-wip-us.apache.org/repos/asf/nifi/diff/31bb8951
Branch: refs/heads/master
Commit: 31bb89514cfa0e5df9db578387d566c7b5117c45
Parents: ffbff42
Author: Marco Gaido
Authored: Fri Jul 13 16:00:02 2018 +0200
Committer: Mark Payne
Committed: Fri Jul 13 13:54:27 2018 -0400
--
.../nifi/processors/standard/ListFile.java | 128 +--
.../standard/util/FileInfoFilter.java | 36 --
2 files changed, 62 insertions(+), 102 deletions(-)
--
http://git-wip-us.apache.org/repos/asf/nifi/blob/31bb8951/nifi-nar-bundles/nifi-standard-bundle/nifi-standard-processors/src/main/java/org/apache/nifi/processors/standard/ListFile.java
--
diff --git
a/nifi-nar-bundles/nifi-standard-bundle/nifi-standard-processors/src/main/java/org/apache/nifi/processors/standard/ListFile.java
b/nifi-nar-bundles/nifi-standard-bundle/nifi-standard-processors/src/main/java/org/apache/nifi/processors/standard/ListFile.java
index d31fe2a..3923350 100644
---
a/nifi-nar-bundles/nifi-standard-bundle/nifi-standard-processors/src/main/java/org/apache/nifi/processors/standard/ListFile.java
+++
b/nifi-nar-bundles/nifi-standard-bundle/nifi-standard-processors/src/main/java/org/apache/nifi/processors/standard/ListFile.java
@@ -39,11 +39,11 @@ import org.apache.nifi.processor.Relationship;
import org.apache.nifi.processor.util.StandardValidators;
import org.apache.nifi.processor.util.list.AbstractListProcessor;
import org.apache.nifi.processors.standard.util.FileInfo;
-import org.apache.nifi.processors.standard.util.FileInfoFilter;
import java.io.File;
import java.io.IOException;
import java.nio.file.FileStore;
+import java.nio.file.FileVisitOption;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
@@ -65,7 +65,10 @@ import java.util.Map;
import java.util.Set;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicReference;
+import java.util.function.BiPredicate;
import java.util.regex.Pattern;
+import java.util.stream.Collectors;
+import java.util.stream.Stream;
@TriggerSerially
@InputRequirement(Requirement.INPUT_FORBIDDEN)
@@ -198,9 +201,9 @@ public class ListFile extends
AbstractListProcessor {
private List properties;
private Set relationships;
-private final AtomicReference fileFilterRef = new
AtomicReference<>();
private volatile boolean includeFileAttributes;
+private final AtomicReference>
fileFilterRef = new AtomicReference>();
public static final String FILE_CREATION_TIME_ATTRIBUTE =
"file.creationTime";
public static final String FILE_LAST_MODIFY_TIME_ATTRIBUTE =
"file.lastModifiedTime";
@@ -328,9 +331,36 @@ public class ListFile extends
AbstractListProcessor {
@Override
protected List performListing(final ProcessContext context,
final Long minTimestamp) throws IOException {
-final File path = new File(getPath(context));
+final Path path = new File(getPath(context)).toPath();
final Boolean recurse = context.getProperty(RECURSE).asBoolean();
-return scanDirectory(path, fileFilterRef.get(), recurse, minTimestamp);
+final Map lastModifiedMap = new HashMap<>();
+
+final BiPredicate fileFilter =
fileFilterRef.get();
+int maxDepth = recurse ? Integer.MAX_VALUE : 1;
+BiPredicate matcher = (p, attributes) -> {
+if (!attributes.isDirectory()
+&& (minTimestamp == null ||
attributes.lastModifiedTime().toMillis() >= minTimestamp)
+&& fileFilter.test(p, attributes)) {
+// We store the attributes for each Path we are returning in
order to avoid to
+// retrieve them again later when creating the FileInfo
+lastModifiedMap.put(p, attributes);
+return true;
+}
+return false;
+};
+Stream inputStream = Files.find(path, maxDepth, matcher,
FileVisitOption.FOLLOW_LINKS);
+Stream listing = inputStream.map(p -> {
+File file = p.toFile();
+BasicFileAttributes attributes = lastModifiedMap.get(p);
+return new FileInfo.Builder()
+.directory(false)
+.filename(file.getName())
+.fullPathFileName(file.getAbsolutePath())
+.lastModifiedTime(attributes.lastModifiedTime().toMillis())
+.size(attributes.size())
+.build();
+});
+