From 60700155ba94db18ce4a454958a0d9e5dbcb583f Mon Sep 17 00:00:00 2001 From: Paul Grey Date: Wed, 8 Jun 2022 15:39:09 -0400 Subject: [PATCH] NIFI-9996 - ListFile does not list root directory when Recurse Subdirectories is active and Path Filter is specified --- .../nifi/processors/standard/ListFile.java | 15 +++----- .../processors/standard/TestListFile.java | 34 +++++++++++++++++++ 2 files changed, 39 insertions(+), 10 deletions(-) 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 9cae320a70ec..28a46949119a 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 @@ -692,21 +692,16 @@ private BiPredicate createFileFilter(final ProcessCon return false; } - final Path relativePath = basePath.relativize(path).getParent(); - final String relativeDir = relativePath == null ? "" : relativePath.toString(); + final Path relativePath = basePath.relativize(path); + final Path relativePathParent = relativePath.getParent(); + final String relativeDir = relativePathParent == null ? "" : relativePathParent.toString(); final String filename = path.getFileName().toString(); final TimingInfo timingInfo = performanceTracker.getTimingInfo(relativeDir, filename); final File file = path.toFile(); - if (pathPattern != null) { - if (relativePath == null || relativePath.toString().isEmpty()) { - return false; - } - - if (!pathPattern.matcher(relativePath.toString()).matches()) { - return false; - } + if ((pathPattern != null) && (!pathPattern.matcher(relativeDir).matches())) { + return false; } final boolean matchesFilter = filePattern.matcher(filename).matches(); diff --git a/nifi-nar-bundles/nifi-standard-bundle/nifi-standard-processors/src/test/java/org/apache/nifi/processors/standard/TestListFile.java b/nifi-nar-bundles/nifi-standard-bundle/nifi-standard-processors/src/test/java/org/apache/nifi/processors/standard/TestListFile.java index 88a7189bdb96..e10d23cd2cfe 100644 --- a/nifi-nar-bundles/nifi-standard-bundle/nifi-standard-processors/src/test/java/org/apache/nifi/processors/standard/TestListFile.java +++ b/nifi-nar-bundles/nifi-standard-bundle/nifi-standard-processors/src/test/java/org/apache/nifi/processors/standard/TestListFile.java @@ -694,6 +694,40 @@ public void testFilterPathPattern() throws Exception { assertEquals(1, successFiles3.size()); } + @Test + public void testFilterPathPatternNegative() throws Exception { + final long now = getTestModifiedTime(); + + final File subdirA = new File(TESTDIR + "/AAA"); + assertTrue(subdirA.mkdirs()); + + final File subdirL = new File(TESTDIR + "/LOG"); + assertTrue(subdirL.mkdirs()); + + final File file1 = new File(TESTDIR + "/file1.txt"); + assertTrue(file1.createNewFile()); + assertTrue(file1.setLastModified(now)); + + final File file2 = new File(TESTDIR + "/AAA/file2.txt"); + assertTrue(file2.createNewFile()); + assertTrue(file2.setLastModified(now)); + + final File file3 = new File(TESTDIR + "/LOG/file3.txt"); + assertTrue(file3.createNewFile()); + assertTrue(file3.setLastModified(now)); + + runner.setProperty(ListFile.DIRECTORY, testDir.getAbsolutePath()); + runner.setProperty(ListFile.FILE_FILTER, ListFile.FILE_FILTER.getDefaultValue()); + runner.setProperty(ListFile.PATH_FILTER, "^((?!LOG).)*$"); + runner.setProperty(ListFile.RECURSE, "true"); + assertVerificationOutcome(Outcome.SUCCESSFUL, "Successfully listed .* Found 3 objects. Of those, 2 match the filter."); + runNext(); + + runner.assertAllFlowFilesTransferred(ListFile.REL_SUCCESS); + final List successFiles1 = runner.getFlowFilesForRelationship(ListFile.REL_SUCCESS); + assertEquals(2, successFiles1.size()); + } + @Test public void testRecurse() throws Exception { final long now = getTestModifiedTime();