This is an automated email from the ASF dual-hosted git repository.
exceptionfactory pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/nifi.git
The following commit(s) were added to refs/heads/main by this push:
new 45e8226f89 NIFI-11672 Adjusted ListSFTP to handle incomplete File Types
45e8226f89 is described below
commit 45e8226f89be9b954f870ce00807eab80dfb6a0d
Author: Paul Grey <[email protected]>
AuthorDate: Fri Jun 9 15:57:49 2023 -0400
NIFI-11672 Adjusted ListSFTP to handle incomplete File Types
- Modified file handling to include both REGULAR and UNKNOWN File Types
returned from an SFTP server
This closes #7365
Signed-off-by: David Handermann <[email protected]>
---
.../processors/standard/util/SFTPTransfer.java | 2 +-
.../processors/standard/util/TestSFTPTransfer.java | 48 ++++++++++++++++++++++
2 files changed, 49 insertions(+), 1 deletion(-)
diff --git
a/nifi-nar-bundles/nifi-standard-bundle/nifi-standard-processors/src/main/java/org/apache/nifi/processors/standard/util/SFTPTransfer.java
b/nifi-nar-bundles/nifi-standard-bundle/nifi-standard-processors/src/main/java/org/apache/nifi/processors/standard/util/SFTPTransfer.java
index 85eb806f61..2a06be5845 100644
---
a/nifi-nar-bundles/nifi-standard-bundle/nifi-standard-processors/src/main/java/org/apache/nifi/processors/standard/util/SFTPTransfer.java
+++
b/nifi-nar-bundles/nifi-standard-bundle/nifi-standard-processors/src/main/java/org/apache/nifi/processors/standard/util/SFTPTransfer.java
@@ -385,7 +385,7 @@ public class SFTPTransfer implements FileTransfer {
* @return Included file status
*/
private boolean isIncludedFile(final RemoteResourceInfo
remoteResourceInfo, final boolean symlinksEnabled) {
- return remoteResourceInfo.isRegularFile() || (symlinksEnabled &&
isSymlink(remoteResourceInfo));
+ return remoteResourceInfo.isRegularFile() ||
(remoteResourceInfo.getAttributes().getMode().getType() ==
FileMode.Type.UNKNOWN) || (symlinksEnabled && isSymlink(remoteResourceInfo));
}
/**
diff --git
a/nifi-nar-bundles/nifi-standard-bundle/nifi-standard-processors/src/test/java/org/apache/nifi/processors/standard/util/TestSFTPTransfer.java
b/nifi-nar-bundles/nifi-standard-bundle/nifi-standard-processors/src/test/java/org/apache/nifi/processors/standard/util/TestSFTPTransfer.java
index da8723df0b..40f223714f 100644
---
a/nifi-nar-bundles/nifi-standard-bundle/nifi-standard-processors/src/test/java/org/apache/nifi/processors/standard/util/TestSFTPTransfer.java
+++
b/nifi-nar-bundles/nifi-standard-bundle/nifi-standard-processors/src/test/java/org/apache/nifi/processors/standard/util/TestSFTPTransfer.java
@@ -16,9 +16,15 @@
*/
package org.apache.nifi.processors.standard.util;
+import net.schmizz.sshj.sftp.FileAttributes;
+import net.schmizz.sshj.sftp.FileMode;
+import net.schmizz.sshj.sftp.PathComponents;
+import net.schmizz.sshj.sftp.RemoteResourceFilter;
+import net.schmizz.sshj.sftp.RemoteResourceInfo;
import net.schmizz.sshj.sftp.Response;
import net.schmizz.sshj.sftp.SFTPClient;
import net.schmizz.sshj.sftp.SFTPException;
+import org.apache.nifi.components.PropertyValue;
import org.apache.nifi.flowfile.FlowFile;
import org.apache.nifi.logging.ComponentLog;
import org.apache.nifi.processor.ProcessContext;
@@ -28,10 +34,15 @@ import org.junit.jupiter.api.Test;
import java.io.File;
import java.io.IOException;
+import java.util.ArrayList;
+import java.util.LinkedHashMap;
+import java.util.List;
+import java.util.Map;
import java.util.concurrent.atomic.AtomicInteger;
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertThrows;
+import static org.mockito.ArgumentMatchers.any;
import static org.mockito.ArgumentMatchers.eq;
import static org.mockito.Mockito.doAnswer;
import static org.mockito.Mockito.doThrow;
@@ -41,6 +52,11 @@ import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
public class TestSFTPTransfer {
+ private static final int FILE_MASK_UNKNOWN_777 =
Integer.parseInt("000777", 8);
+ private static final int FILE_MASK_REGULAR_777 =
Integer.parseInt("100777", 8);
+
+ private static final PropertyValue BOOLEAN_FALSE_PROPERTY_VALUE = new
MockPropertyValue(Boolean.FALSE.toString());
+ private static final PropertyValue BOOLEAN_TRUE_PROPERTY_VALUE = new
MockPropertyValue(Boolean.TRUE.toString());
private SFTPTransfer createSftpTransfer(ProcessContext processContext,
SFTPClient sftpClient) {
final ComponentLog componentLog = mock(ComponentLog.class);
@@ -231,4 +247,36 @@ public class TestSFTPTransfer {
verify(sftpClient, times(0)).stat(eq("/dir1/dir2/dir3"));
verify(sftpClient).mkdir(eq("/dir1/dir2/dir3")); // dir3 was created
blindly.
}
+
+ @Test
+ public void testFileTypeUnknown() throws IOException {
+ final ProcessContext processContext = mock(ProcessContext.class);
+
when(processContext.getProperty(eq(FileTransfer.REMOTE_PATH))).thenReturn(new
MockPropertyValue("."));
+
when(processContext.getProperty(eq(FileTransfer.IGNORE_DOTTED_FILES))).thenReturn(BOOLEAN_TRUE_PROPERTY_VALUE);
+
when(processContext.getProperty(eq(FileTransfer.RECURSIVE_SEARCH))).thenReturn(BOOLEAN_FALSE_PROPERTY_VALUE);
+
when(processContext.getProperty(eq(FileTransfer.FOLLOW_SYMLINK))).thenReturn(BOOLEAN_FALSE_PROPERTY_VALUE);
+
when(processContext.getProperty(eq(FileTransfer.FILE_FILTER_REGEX))).thenReturn(new
MockPropertyValue(".*"));
+
when(processContext.getProperty(eq(FileTransfer.PATH_FILTER_REGEX))).thenReturn(new
MockPropertyValue(".*"));
+
when(processContext.getProperty(eq(FileTransfer.REMOTE_PATH))).thenReturn(new
MockPropertyValue("."));
+
+ try (SFTPClient sftpClient = mock(SFTPClient.class)) {
+ when(sftpClient.ls(any(), any())).then(invocation -> {
+ final Map<String, String> extended = new LinkedHashMap<>();
+ final List<RemoteResourceInfo> list = new ArrayList<>();
+ list.add(new RemoteResourceInfo(
+ new PathComponents("./", "unknown.txt", "/"),
+ new FileAttributes(FileAttributes.Flag.MODE.get(), 0,
0, 0, new FileMode(FILE_MASK_UNKNOWN_777), 0, 0, extended)));
+ list.add(new RemoteResourceInfo(
+ new PathComponents("./", "regular.txt", "/"),
+ new FileAttributes(FileAttributes.Flag.MODE.get(), 0,
0, 0, new FileMode(FILE_MASK_REGULAR_777), 0, 0, extended)));
+ final RemoteResourceFilter filter = invocation.getArgument(1,
RemoteResourceFilter.class);
+ list.forEach(filter::accept);
+ return list;
+ });
+
+ final SFTPTransfer sftpTransfer =
createSftpTransfer(processContext, sftpClient);
+ final List<FileInfo> listing = sftpTransfer.getListing(false);
+ assertEquals(2, listing.size());
+ }
+ }
}