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 9cae320a70..28a4694911 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 @@ public class ListFile extends AbstractListProcessor { 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 88a7189bdb..e10d23cd2c 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 class TestListFile { 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();