Skip to content

Commit 7aea76c

Browse files
joaquinjsbartembilan
authored andcommitted
GH-3026: Fix chmod support for DSL
Fixes #3026 **Cherry-pick to `5.1.x`** * Populate proper `FileTransferringMessageHandler` impl from DSL spec implementations. This way we are able to use a provided `chmod` from Java DSL * Added `FileTransferringMessageHandlerSpec` ctor TODO * Update SftpTests * Code cleanup; `@Ignore` `SftpTests.testSftpOutboundFlowWithChmod()` since it doesn't work properly on Windows
1 parent 66c3eff commit 7aea76c

File tree

6 files changed

+77
-7
lines changed

6 files changed

+77
-7
lines changed

spring-integration-file/src/main/java/org/springframework/integration/file/dsl/FileTransferringMessageHandlerSpec.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,7 @@
4141
* @param <S> the target {@link FileTransferringMessageHandlerSpec} implementation type.
4242
*
4343
* @author Artem Bilan
44+
* @author Joaquin Santana
4445
*
4546
* @since 5.0
4647
*/
@@ -52,6 +53,10 @@ public abstract class FileTransferringMessageHandlerSpec<F, S extends FileTransf
5253

5354
private DefaultFileNameGenerator defaultFileNameGenerator;
5455

56+
// TODO: should be refactored using generics in next release (breaking change), see PR-3080.
57+
protected FileTransferringMessageHandlerSpec() {
58+
}
59+
5560
protected FileTransferringMessageHandlerSpec(SessionFactory<F> sessionFactory) {
5661
this.target = new FileTransferringMessageHandler<>(sessionFactory);
5762
}
@@ -62,6 +67,7 @@ protected FileTransferringMessageHandlerSpec(RemoteFileTemplate<F> remoteFileTem
6267

6368
protected FileTransferringMessageHandlerSpec(RemoteFileTemplate<F> remoteFileTemplate,
6469
FileExistsMode fileExistsMode) {
70+
6571
this.target = new FileTransferringMessageHandler<>(remoteFileTemplate, fileExistsMode);
6672
}
6773

spring-integration-ftp/src/main/java/org/springframework/integration/ftp/dsl/FtpMessageHandlerSpec.java

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -22,25 +22,28 @@
2222
import org.springframework.integration.file.remote.RemoteFileTemplate;
2323
import org.springframework.integration.file.remote.session.SessionFactory;
2424
import org.springframework.integration.file.support.FileExistsMode;
25+
import org.springframework.integration.ftp.outbound.FtpMessageHandler;
2526

2627
/**
2728
* A {@link FileTransferringMessageHandlerSpec} for FTP.
2829
*
2930
* @author Artem Bilan
31+
* @author Joaquin Santana
32+
*
3033
* @since 5.0
3134
*/
3235
public class FtpMessageHandlerSpec extends FileTransferringMessageHandlerSpec<FTPFile, FtpMessageHandlerSpec> {
3336

3437
FtpMessageHandlerSpec(SessionFactory<FTPFile> sessionFactory) {
35-
super(sessionFactory);
38+
this.target = new FtpMessageHandler(sessionFactory);
3639
}
3740

3841
FtpMessageHandlerSpec(RemoteFileTemplate<FTPFile> remoteFileTemplate) {
39-
super(remoteFileTemplate);
42+
this.target = new FtpMessageHandler(remoteFileTemplate.getSessionFactory());
4043
}
4144

4245
FtpMessageHandlerSpec(RemoteFileTemplate<FTPFile> remoteFileTemplate, FileExistsMode fileExistsMode) {
43-
super(remoteFileTemplate, fileExistsMode);
46+
this.target = new FtpMessageHandler(remoteFileTemplate, fileExistsMode);
4447
}
4548

4649
}

spring-integration-ftp/src/test/java/org/springframework/integration/ftp/dsl/FtpTests.java

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -66,6 +66,7 @@
6666
/**
6767
* @author Artem Bilan
6868
* @author Gary Russell
69+
* @author Joaquin Santana
6970
*
7071
* @since 5.0
7172
*/
@@ -192,6 +193,30 @@ public void testFtpOutboundFlow() {
192193
registration.destroy();
193194
}
194195

196+
@Test
197+
public void testFtpOutboundFlowWithChmod() {
198+
IntegrationFlow flow = f -> f
199+
.handle(Ftp.outboundAdapter(sessionFactory(), FileExistsMode.FAIL)
200+
.useTemporaryFileName(false)
201+
.fileNameExpression("headers['" + FileHeaders.FILENAME + "']")
202+
.chmod(0644)
203+
.remoteDirectory("ftpTarget"));
204+
IntegrationFlowRegistration registration = this.flowContext.registration(flow).register();
205+
String fileName = "foo.file";
206+
Message<ByteArrayInputStream> message = MessageBuilder
207+
.withPayload(new ByteArrayInputStream("foo".getBytes(StandardCharsets.UTF_8)))
208+
.setHeader(FileHeaders.FILENAME, fileName)
209+
.build();
210+
registration.getInputChannel().send(message);
211+
RemoteFileTemplate<FTPFile> template = new RemoteFileTemplate<>(sessionFactory());
212+
FTPFile[] files = template.execute(session ->
213+
session.list(getTargetRemoteDirectory().getName() + "/" + fileName));
214+
assertThat(files.length).isEqualTo(1);
215+
assertThat(files[0].getSize()).isEqualTo(3);
216+
217+
registration.destroy();
218+
}
219+
195220
@Test
196221
@SuppressWarnings("unchecked")
197222
public void testFtpMgetFlow() {

spring-integration-sftp/src/main/java/org/springframework/integration/sftp/dsl/SftpMessageHandlerSpec.java

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -20,26 +20,30 @@
2020
import org.springframework.integration.file.remote.RemoteFileTemplate;
2121
import org.springframework.integration.file.remote.session.SessionFactory;
2222
import org.springframework.integration.file.support.FileExistsMode;
23+
import org.springframework.integration.sftp.outbound.SftpMessageHandler;
24+
import org.springframework.integration.sftp.session.SftpRemoteFileTemplate;
2325

2426
import com.jcraft.jsch.ChannelSftp;
2527

2628
/**
2729
* @author Artem Bilan
30+
* @author Joaquin Santana
31+
*
2832
* @since 5.0
2933
*/
3034
public class SftpMessageHandlerSpec
3135
extends FileTransferringMessageHandlerSpec<ChannelSftp.LsEntry, SftpMessageHandlerSpec> {
3236

3337
SftpMessageHandlerSpec(SessionFactory<ChannelSftp.LsEntry> sessionFactory) {
34-
super(sessionFactory);
38+
this.target = new SftpMessageHandler(sessionFactory);
3539
}
3640

3741
SftpMessageHandlerSpec(RemoteFileTemplate<ChannelSftp.LsEntry> remoteFileTemplate) {
38-
super(remoteFileTemplate);
42+
this.target = new SftpMessageHandler(remoteFileTemplate.getSessionFactory());
3943
}
4044

4145
SftpMessageHandlerSpec(RemoteFileTemplate<ChannelSftp.LsEntry> remoteFileTemplate, FileExistsMode fileExistsMode) {
42-
super(remoteFileTemplate, fileExistsMode);
46+
this.target = new SftpMessageHandler(new SftpRemoteFileTemplate(remoteFileTemplate.getSessionFactory()), fileExistsMode);
4347
}
4448

4549
}

spring-integration-sftp/src/test/java/org/springframework/integration/sftp/dsl/SftpTests.java

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@
2323
import java.util.List;
2424
import java.util.regex.Matcher;
2525

26+
import org.junit.Ignore;
2627
import org.junit.Test;
2728
import org.junit.runner.RunWith;
2829

@@ -54,6 +55,7 @@
5455
/**
5556
* @author Artem Bilan
5657
* @author Gary Russell
58+
* @author Joaquin Santana
5759
*
5860
* @since 5.0
5961
*
@@ -146,6 +148,34 @@ public void testSftpOutboundFlow() {
146148
registration.destroy();
147149
}
148150

151+
152+
@Test
153+
@Ignore("Doesn't work as expected on Windows")
154+
public void testSftpOutboundFlowWithChmod() {
155+
IntegrationFlow flow = f -> f.handle(Sftp.outboundAdapter(sessionFactory(), FileExistsMode.FAIL)
156+
.useTemporaryFileName(false)
157+
.fileNameExpression("headers['" + FileHeaders.FILENAME + "']")
158+
.chmod(0644)
159+
.remoteDirectory("sftpTarget"));
160+
IntegrationFlowRegistration registration = this.flowContext.registration(flow).register();
161+
String fileName = "foo.file";
162+
registration.getInputChannel().send(MessageBuilder.withPayload("foo")
163+
.setHeader(FileHeaders.FILENAME, fileName)
164+
.build());
165+
166+
RemoteFileTemplate<ChannelSftp.LsEntry> template = new RemoteFileTemplate<>(sessionFactory());
167+
ChannelSftp.LsEntry[] files = template.execute(session ->
168+
session.list(getTargetRemoteDirectory().getName() + "/" + fileName));
169+
assertThat(files.length).isEqualTo(1);
170+
assertThat(files[0].getAttrs().getSize()).isEqualTo(3);
171+
String[] permissions = files[0].getAttrs().getPermissionsString().substring(1).replaceAll("--", "-").split("-");
172+
assertThat(permissions[0]).isEqualTo("rw");
173+
assertThat(permissions[1]).isEqualTo("r");
174+
assertThat(permissions[2]).isEqualTo("r");
175+
176+
registration.destroy();
177+
}
178+
149179
@Test
150180
@SuppressWarnings("unchecked")
151181
public void testSftpMgetFlow() {

spring-integration-sftp/src/test/java/org/springframework/integration/sftp/inbound/SftpInboundRemoteFileSystemSynchronizerTests.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,7 @@
5959
* @author Gunnar Hillert
6060
* @author Gary Russell
6161
* @author Artem Bilan
62+
* @author Joaquin Santana
6263
*
6364
* @since 2.0
6465
*/
@@ -169,7 +170,8 @@ private void init() {
169170

170171
Calendar calendar = Calendar.getInstance();
171172
calendar.add(Calendar.DATE, 1);
172-
when(lsEntry.getAttrs().getMTime()).thenReturn(new Long(calendar.getTimeInMillis() / 1000).intValue());
173+
when(lsEntry.getAttrs().getMTime())
174+
.thenReturn(Long.valueOf(calendar.getTimeInMillis() / 1000).intValue());
173175
when(lsEntry.getFilename()).thenReturn(fileName);
174176
when(lsEntry.getLongname()).thenReturn(fileName);
175177
sftpEntries.add(lsEntry);

0 commit comments

Comments
 (0)