diff --git a/spring-integration-ftp/src/main/java/org/springframework/integration/ftp/dsl/Ftp.java b/spring-integration-ftp/src/main/java/org/springframework/integration/ftp/dsl/Ftp.java index bbf8b5248f9..713fb635127 100644 --- a/spring-integration-ftp/src/main/java/org/springframework/integration/ftp/dsl/Ftp.java +++ b/spring-integration-ftp/src/main/java/org/springframework/integration/ftp/dsl/Ftp.java @@ -34,6 +34,7 @@ * * @author Artem Bilan * @author Gary Russell + * @author Deepak Gunasekaran * * @since 5.0 */ @@ -111,7 +112,9 @@ public static FtpMessageHandlerSpec outboundAdapter(SessionFactory sess * A {@link FtpMessageHandlerSpec} factory for an outbound channel adapter spec. * @param remoteFileTemplate the remote file template. * @return the spec. + * @deprecated in favor of {@link #outboundAdapter(FtpRemoteFileTemplate)} */ + @Deprecated public static FtpMessageHandlerSpec outboundAdapter(RemoteFileTemplate remoteFileTemplate) { return new FtpMessageHandlerSpec(remoteFileTemplate); } @@ -121,13 +124,38 @@ public static FtpMessageHandlerSpec outboundAdapter(RemoteFileTemplate * @param remoteFileTemplate the remote file template. * @param fileExistsMode the file exists mode. * @return the spec. + * @deprecated in favor of {@link #outboundAdapter(FtpRemoteFileTemplate, FileExistsMode)} */ + @Deprecated public static FtpMessageHandlerSpec outboundAdapter(RemoteFileTemplate remoteFileTemplate, FileExistsMode fileExistsMode) { return new FtpMessageHandlerSpec(remoteFileTemplate, fileExistsMode); } + /** + * A {@link FtpMessageHandlerSpec} factory for an outbound channel adapter spec. + * @param ftpRemoteFileTemplate the remote file template. + * @return the spec. + * @since 5.4 + */ + public static FtpMessageHandlerSpec outboundAdapter(FtpRemoteFileTemplate ftpRemoteFileTemplate) { + return new FtpMessageHandlerSpec(ftpRemoteFileTemplate); + } + + /** + * A {@link FtpMessageHandlerSpec} factory for an outbound channel adapter spec. + * @param ftpRemoteFileTemplate the remote file template. + * @param fileExistsMode the file exists mode. + * @return the spec. + * @since 5.4 + */ + public static FtpMessageHandlerSpec outboundAdapter(FtpRemoteFileTemplate ftpRemoteFileTemplate, + FileExistsMode fileExistsMode) { + + return new FtpMessageHandlerSpec(ftpRemoteFileTemplate, fileExistsMode); + } + /** * Produce a {@link FtpOutboundGatewaySpec} based on the {@link SessionFactory}, * {@link AbstractRemoteFileOutboundGateway.Command} and {@code expression} for the diff --git a/spring-integration-ftp/src/main/java/org/springframework/integration/ftp/dsl/FtpMessageHandlerSpec.java b/spring-integration-ftp/src/main/java/org/springframework/integration/ftp/dsl/FtpMessageHandlerSpec.java index cc2d953b1b4..2f7042eafda 100644 --- a/spring-integration-ftp/src/main/java/org/springframework/integration/ftp/dsl/FtpMessageHandlerSpec.java +++ b/spring-integration-ftp/src/main/java/org/springframework/integration/ftp/dsl/FtpMessageHandlerSpec.java @@ -23,12 +23,14 @@ import org.springframework.integration.file.remote.session.SessionFactory; import org.springframework.integration.file.support.FileExistsMode; import org.springframework.integration.ftp.outbound.FtpMessageHandler; +import org.springframework.integration.ftp.session.FtpRemoteFileTemplate; /** * A {@link FileTransferringMessageHandlerSpec} for FTP. * * @author Artem Bilan * @author Joaquin Santana + * @author Deepak Gunasekaran * * @since 5.0 */ @@ -38,12 +40,22 @@ protected FtpMessageHandlerSpec(SessionFactory sessionFactory) { this.target = new FtpMessageHandler(sessionFactory); } + @Deprecated protected FtpMessageHandlerSpec(RemoteFileTemplate remoteFileTemplate) { this.target = new FtpMessageHandler(remoteFileTemplate.getSessionFactory()); } + @Deprecated protected FtpMessageHandlerSpec(RemoteFileTemplate remoteFileTemplate, FileExistsMode fileExistsMode) { this.target = new FtpMessageHandler(remoteFileTemplate, fileExistsMode); } + protected FtpMessageHandlerSpec(FtpRemoteFileTemplate ftpRemoteFileTemplate) { + this.target = new FtpMessageHandler(ftpRemoteFileTemplate); + } + + protected FtpMessageHandlerSpec(FtpRemoteFileTemplate ftpRemoteFileTemplate, FileExistsMode fileExistsMode) { + this.target = new FtpMessageHandler(ftpRemoteFileTemplate, fileExistsMode); + } + } diff --git a/spring-integration-ftp/src/main/java/org/springframework/integration/ftp/outbound/FtpMessageHandler.java b/spring-integration-ftp/src/main/java/org/springframework/integration/ftp/outbound/FtpMessageHandler.java index 69e52a1bb4a..ba0a9fa3ef9 100644 --- a/spring-integration-ftp/src/main/java/org/springframework/integration/ftp/outbound/FtpMessageHandler.java +++ b/spring-integration-ftp/src/main/java/org/springframework/integration/ftp/outbound/FtpMessageHandler.java @@ -30,10 +30,12 @@ import org.springframework.integration.ftp.session.FtpRemoteFileTemplate; /** - * The FTP specific {@link FileTransferringMessageHandler} extension. - * Based on the {@link FtpRemoteFileTemplate}. + * The FTP specific {@link FileTransferringMessageHandler} extension. Based on the + * {@link FtpRemoteFileTemplate}. * * @author Artem Bilan + * @author Deepak Gunasekaran + * * @since 4.1.9 * @see FtpRemoteFileTemplate */ @@ -48,10 +50,28 @@ public FtpMessageHandler(FtpRemoteFileTemplate remoteFileTemplate) { super(remoteFileTemplate); } + /** + * Constructor which sets the RemoteFileTemplate and FileExistsMode. + * @param remoteFileTemplate the remote file template. + * @param mode the file exists mode. + * @deprecated in favor of + * {@link #FtpMessageHandler(FtpRemoteFileTemplate, FileExistsMode)} + */ + @Deprecated public FtpMessageHandler(RemoteFileTemplate remoteFileTemplate, FileExistsMode mode) { super(remoteFileTemplate, mode); } + /** + * Constructor which sets the FtpRemoteFileTemplate and FileExistsMode. + * @param ftpRemoteFileTemplate the remote file template. + * @param mode the file exists mode. + * @since 5.4 + */ + public FtpMessageHandler(FtpRemoteFileTemplate ftpRemoteFileTemplate, FileExistsMode mode) { + super(ftpRemoteFileTemplate, mode); + } + @Override public boolean isChmodCapable() { return true; diff --git a/spring-integration-ftp/src/test/java/org/springframework/integration/ftp/dsl/FtpTests.java b/spring-integration-ftp/src/test/java/org/springframework/integration/ftp/dsl/FtpTests.java index 9f1c80c6bcb..07b66f08cee 100644 --- a/spring-integration-ftp/src/test/java/org/springframework/integration/ftp/dsl/FtpTests.java +++ b/spring-integration-ftp/src/test/java/org/springframework/integration/ftp/dsl/FtpTests.java @@ -70,6 +70,7 @@ * @author Artem Bilan * @author Gary Russell * @author Joaquin Santana + * @author Deepak Gunasekaran * * @since 5.0 */ @@ -203,6 +204,59 @@ public void testFtpOutboundFlow() { registration.destroy(); } + @Test + public void testFtpOutboundFlowWithFtpRemoteTemplate() { + + FtpRemoteFileTemplate ftpTemplate = new FtpRemoteFileTemplate(sessionFactory()); + IntegrationFlow flow = f -> f + .handle(Ftp.outboundAdapter(ftpTemplate) + .useTemporaryFileName(false) + .fileNameExpression("headers['" + FileHeaders.FILENAME + "']") + .remoteDirectory("ftpTarget")); + IntegrationFlowRegistration registration = this.flowContext.registration(flow).register(); + String fileName = "foo.file"; + Message message = MessageBuilder + .withPayload(new ByteArrayInputStream("foo".getBytes(StandardCharsets.UTF_8))) + .setHeader(FileHeaders.FILENAME, fileName) + .build(); + registration.getInputChannel().send(message); + FTPFile[] files = ftpTemplate.execute(session -> + session.list(getTargetRemoteDirectory().getName() + "/" + fileName)); + assertThat(files.length).isEqualTo(1); + assertThat(files[0].getSize()).isEqualTo(3); + + registration.destroy(); + } + + @Test + public void testFtpOutboundFlowWithFtpRemoteTemplateAndMode() { + + FtpRemoteFileTemplate ftpTemplate = new FtpRemoteFileTemplate(sessionFactory()); + IntegrationFlow flow = f -> f + .handle(Ftp.outboundAdapter(ftpTemplate, FileExistsMode.APPEND) + .useTemporaryFileName(false) + .fileNameExpression("headers['" + FileHeaders.FILENAME + "']") + .remoteDirectory("ftpTarget")); + IntegrationFlowRegistration registration = this.flowContext.registration(flow).register(); + String fileName = "foo.file"; + Message message1 = MessageBuilder + .withPayload(new ByteArrayInputStream("foo".getBytes(StandardCharsets.UTF_8))) + .setHeader(FileHeaders.FILENAME, fileName) + .build(); + Message message2 = MessageBuilder + .withPayload(new ByteArrayInputStream("foo".getBytes(StandardCharsets.UTF_8))) + .setHeader(FileHeaders.FILENAME, fileName) + .build(); + registration.getInputChannel().send(message1); + registration.getInputChannel().send(message2); + FTPFile[] files = ftpTemplate.execute(session -> + session.list(getTargetRemoteDirectory().getName() + "/" + fileName)); + assertThat(files.length).isEqualTo(1); + assertThat(files[0].getSize()).isEqualTo(6); + + registration.destroy(); + } + @Test public void testFtpOutboundFlowWithChmod() { IntegrationFlow flow = f -> f diff --git a/spring-integration-sftp/src/main/java/org/springframework/integration/sftp/dsl/Sftp.java b/spring-integration-sftp/src/main/java/org/springframework/integration/sftp/dsl/Sftp.java index 2c966eb8dfa..6d8030ed248 100644 --- a/spring-integration-sftp/src/main/java/org/springframework/integration/sftp/dsl/Sftp.java +++ b/spring-integration-sftp/src/main/java/org/springframework/integration/sftp/dsl/Sftp.java @@ -1,5 +1,5 @@ /* - * Copyright 2014-2019 the original author or authors. + * Copyright 2014-2020 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -35,6 +35,7 @@ * * @author Artem Bilan * @author Gary Russell + * @author Deepak Gunasekaran * * @since 5.0 */ @@ -112,7 +113,9 @@ public static SftpMessageHandlerSpec outboundAdapter(SessionFactory remoteFileTemplate) { return new SftpMessageHandlerSpec(remoteFileTemplate); } @@ -122,13 +125,39 @@ public static SftpMessageHandlerSpec outboundAdapter(RemoteFileTemplate remoteFileTemplate, FileExistsMode fileExistsMode) { return new SftpMessageHandlerSpec(remoteFileTemplate, fileExistsMode); } + /** + * An {@link SftpMessageHandlerSpec} factory for an outbound channel adapter spec. + * @param sftpRemoteFileTemplate the remote file template. + * @return the spec. + * @since 5.4 + */ + public static SftpMessageHandlerSpec outboundAdapter(SftpRemoteFileTemplate sftpRemoteFileTemplate) { + return new SftpMessageHandlerSpec(sftpRemoteFileTemplate); + } + + /** + * An {@link SftpMessageHandlerSpec} factory for an outbound channel adapter spec. + * @param sftpRemoteFileTemplate the remote file template. + * @param fileExistsMode the file exists mode. + * @return the spec. + * @since 5.4 + */ + public static SftpMessageHandlerSpec outboundAdapter(SftpRemoteFileTemplate sftpRemoteFileTemplate, + FileExistsMode fileExistsMode) { + + return new SftpMessageHandlerSpec(sftpRemoteFileTemplate, fileExistsMode); + } + /** * Produce a {@link SftpOutboundGatewaySpec} based on the {@link SessionFactory}, * {@link AbstractRemoteFileOutboundGateway.Command} and {@code expression} for the diff --git a/spring-integration-sftp/src/main/java/org/springframework/integration/sftp/dsl/SftpMessageHandlerSpec.java b/spring-integration-sftp/src/main/java/org/springframework/integration/sftp/dsl/SftpMessageHandlerSpec.java index 715b040b660..bc7c8613623 100644 --- a/spring-integration-sftp/src/main/java/org/springframework/integration/sftp/dsl/SftpMessageHandlerSpec.java +++ b/spring-integration-sftp/src/main/java/org/springframework/integration/sftp/dsl/SftpMessageHandlerSpec.java @@ -28,6 +28,7 @@ /** * @author Artem Bilan * @author Joaquin Santana + * @author Deepak Gunasekaran * * @since 5.0 */ @@ -38,10 +39,12 @@ protected SftpMessageHandlerSpec(SessionFactory sessionFact this.target = new SftpMessageHandler(sessionFactory); } + @Deprecated protected SftpMessageHandlerSpec(RemoteFileTemplate remoteFileTemplate) { this.target = new SftpMessageHandler(remoteFileTemplate.getSessionFactory()); } + @Deprecated protected SftpMessageHandlerSpec(RemoteFileTemplate remoteFileTemplate, FileExistsMode fileExistsMode) { @@ -50,4 +53,13 @@ protected SftpMessageHandlerSpec(RemoteFileTemplate remoteF fileExistsMode); } + protected SftpMessageHandlerSpec(SftpRemoteFileTemplate sftpRemoteFileTemplate) { + this.target = new SftpMessageHandler(sftpRemoteFileTemplate); + } + + protected SftpMessageHandlerSpec(SftpRemoteFileTemplate sftpRemoteFileTemplate, FileExistsMode fileExistsMode) { + + this.target = new SftpMessageHandler(sftpRemoteFileTemplate, fileExistsMode); + } + } diff --git a/spring-integration-sftp/src/test/java/org/springframework/integration/sftp/dsl/SftpTests.java b/spring-integration-sftp/src/test/java/org/springframework/integration/sftp/dsl/SftpTests.java index ba26e4034bb..f7d0fde4f1b 100644 --- a/spring-integration-sftp/src/test/java/org/springframework/integration/sftp/dsl/SftpTests.java +++ b/spring-integration-sftp/src/test/java/org/springframework/integration/sftp/dsl/SftpTests.java @@ -56,9 +56,9 @@ * @author Artem Bilan * @author Gary Russell * @author Joaquin Santana + * @author Deepak Gunasekaran * * @since 5.0 - * */ @SpringJUnitConfig @DirtiesContext @@ -148,6 +148,51 @@ public void testSftpOutboundFlow() { registration.destroy(); } + @Test + public void testSftpOutboundFlowSftpTemplate() { + SftpRemoteFileTemplate sftpTemplate = new SftpRemoteFileTemplate(sessionFactory()); + IntegrationFlow flow = f -> f.handle(Sftp.outboundAdapter(sftpTemplate) + .useTemporaryFileName(false) + .fileNameExpression("headers['" + FileHeaders.FILENAME + "']") + .remoteDirectory("sftpTarget")); + IntegrationFlowRegistration registration = this.flowContext.registration(flow).register(); + String fileName = "foo.file"; + registration.getInputChannel().send(MessageBuilder.withPayload("foo") + .setHeader(FileHeaders.FILENAME, fileName) + .build()); + + ChannelSftp.LsEntry[] files = sftpTemplate.execute(session -> + session.list(getTargetRemoteDirectory().getName() + "/" + fileName)); + assertThat(files.length).isEqualTo(1); + assertThat(files[0].getAttrs().getSize()).isEqualTo(3); + + registration.destroy(); + } + + @Test + public void testSftpOutboundFlowSftpTemplateAndMode() { + SftpRemoteFileTemplate sftpTemplate = new SftpRemoteFileTemplate(sessionFactory()); + IntegrationFlow flow = f -> f.handle(Sftp.outboundAdapter(sftpTemplate, FileExistsMode.APPEND) + .useTemporaryFileName(false) + .fileNameExpression("headers['" + FileHeaders.FILENAME + "']") + .remoteDirectory("sftpTarget")); + IntegrationFlowRegistration registration = this.flowContext.registration(flow).register(); + String fileName = "foo.file"; + registration.getInputChannel().send(MessageBuilder.withPayload("foo") + .setHeader(FileHeaders.FILENAME, fileName) + .build()); + registration.getInputChannel().send(MessageBuilder.withPayload("foo") + .setHeader(FileHeaders.FILENAME, fileName) + .build()); + + ChannelSftp.LsEntry[] files = sftpTemplate.execute(session -> + session.list(getTargetRemoteDirectory().getName() + "/" + fileName)); + assertThat(files.length).isEqualTo(1); + assertThat(files[0].getAttrs().getSize()).isEqualTo(6); + + registration.destroy(); + } + @Test @DisabledOnOs(OS.WINDOWS)